My Heart can wait

1. 看到俱乐部新的招新照片,音乐正好放到《那些花儿》。
2. 深圳的天气很好,每天穿短袖,睡觉盖大被子。
3. Leader是很有内涵的人,Mentor是技术大牛。
4. 有时候人会迷失方向,有时候人会不知道接下来怎么做,一局棋下到中局,再往前想10步都很艰难。
5. 将要完成实习生课题,保持进度,周四结题报告。
6. 然后过国庆节,请个假回学校一趟。
7. 看看爸爸妈妈。
8. 没有什么不可以。
9. My Heart can wait.

发表在 许愿墙 | 留下评论

Windows 捕获磁盘IO量与磁盘活动时间(util)

windows下的底层开发相对Linux比较不方便,这里对主题做一些讨论,和贴一些自己写的代码。
磁盘IO可以由NtQuerySystemInformation获得(2号操作符),这个方法比较轻松,之前的获取CPU使用率也是这样。
但是磁盘的活动时间无法由NtQuerySystemInformation函数查询,因为他并没有提供有关磁盘时间的信息,或者队列情况。(也可能是有,我没有在网上找到资料。)
此外有两种方法获得磁盘详细信息,一种是PDH方法,一种是更底层的DeviceIoControl方法。
第二种方法实现起来比较复杂,不做研究,这里展示PDH方法。

#include 
#include 
#include 
#include 
#include 

#pragma comment(lib, "pdh.lib")

CONST ULONG SAMPLE_INTERVAL_MS    = 1000;

PDH_STATUS Status;
HQUERY Query = NULL;
HCOUNTER Counter;
PDH_FMT_COUNTERVALUE DisplayValue;
DWORD CounterType;

void init()
{

	char CounterPathBuffer[] = "\\PhysicalDisk(*)\\% Idle Time";

	//
	// Create a query.
	//

	Status = PdhOpenQuery(NULL, NULL, &Query);
	if (Status != ERROR_SUCCESS) 
	{
		wprintf(L"\nPdhOpenQuery failed with status 0x%x.", Status);
		goto Cleanup;
	}


	//ZeroMemory(&CounterPathBuffer, sizeof(CounterPathBuffer));

	//
	// Add the selected counter to the query.
	//

	Status = PdhAddCounter(Query, CounterPathBuffer, 0, &Counter);
	if (Status != ERROR_SUCCESS) 
	{
		wprintf(L"\nPdhAddCounter failed with status 0x%x.", Status);
		goto Cleanup;
	}

	Status = PdhCollectQueryData(Query);
	if (Status != ERROR_SUCCESS) 
	{
		wprintf(L"\nPdhCollectQueryData failed with 0x%x.\n", Status);
		goto Cleanup;
	}

	//
	// Print counter values until a key is pressed.
	//
	return;
Cleanup:
	if (Query) 
	{
		PdhCloseQuery(Query);
	}

}

void wmain(void)
{
	init();

	while (!_kbhit()) 
	{
		Sleep(SAMPLE_INTERVAL_MS);

		Status = PdhCollectQueryData(Query);
		if (Status != ERROR_SUCCESS) 
		{
			wprintf(L"\nPdhCollectQueryData failed with status 0x%x.", Status);
		}


		Status = PdhGetFormattedCounterValue(Counter,
			PDH_FMT_DOUBLE,
			&CounterType,
			&DisplayValue);
		if (Status != ERROR_SUCCESS) 
		{
			wprintf(L"\nPdhGetFormattedCounterValue failed with status 0x%x.", Status);
			goto Cleanup;
		}

		double DBIOUseTime = DisplayValue.doubleValue;

		if (DBIOUseTime > 100) DBIOUseTime = 100;

		DBIOUseTime = 100 - DBIOUseTime;

		wprintf(L"%0.2f%%\n", DBIOUseTime);
	}

Cleanup:

	//
	// Close the query.
	//

	if (Query) 
	{
		PdhCloseQuery(Query);
	}
}

需要注意的是,PDH方法采集的磁盘活动时间信息,是即时演算的,如果程序本身的活动时间和负载较大,会出现自身干扰。
出现这种情况,可以考虑Sleep 一段时间后再试。

发表在 C++, Windows, 系统, 编程 | 标签为 , , | 一条评论

Windows 服务程序配置

目标:
1. 实现配置后台服务,使其自动启动。
2. 当程序down后,会自动启动。


/*主要流程*/

1. 判断是否已经是服务在运行(argv)
2. 如果是第一次执行,初始化服务:
	SC_HANDLE sc_handle=OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
	if(sc_handle==NULL)
	{
		printf("OpenSCManager 安装失败\n");
		return -1;
	}
	char filename[1024]={0};
	//获取当前的绝对路径:
	::GetModuleFileName(NULL,filename,1024);
	cout<<"GetModuleFileName:"<
							
发表在 C++, Windows, 系统, 编程 | 标签为 , , , | 留下评论

Windows 下获取多核CPU使用率

工作时候写的Dome, 可以参考:

MSDN
讲解如何利用NT Native API获取NT系统的CPU使用率(支持多核)
Win32 SDK 获得多核心处理器使用率。
阅读更多查看代码

继续阅读

发表在 C, C++, Windows, 系统, 编程 | 3条评论

[APUE] dup 的小测试

#include 
#include 
#include 
#include 

int main()
{
    char a[10] = "std in\n";
    char b[10] = "std out\n";
    char c[10] = "std error\n";

    write(0, a, sizeof(a));
    write(1, b, sizeof(b));
    write(2, c, sizeof(c));
    return 0;
}

mattchen@ooxx:~/code/dup$ ./a.out 
std in
std out
std error
mattchen@ooxx:~/code/dup$ ./a.out 2>&1
std in
std out
std error
mattchen@ooxx:~/code/dup$ ./a.out 2>&1 >tmpfile
std in
std error
mattchen@ooxx:~/code/dup$ ./a.out >tmpfile 2>&1 
std in
发表在 C, Linux, 系统, 编程 | 标签为 , , | 留下评论

SHELL 编程代码阅读

1. $# 表示传入参数个数,例如 ./a.sh input_file 这里 $# == 1

2. $1 表示第一个传入的参数

3. [ -f "somefile" ] 判断是否是一个文件, 猜猜 [ ! -f "somefile" ] 是?

	PS:
	[ -x "/bin/ls" ] 判断/bin/ls是否存在并有可执行权限
	[ -n "$var" ]    判断$var变量是否有值
	[ "$a" = "$b" ]  判断$a和$b是否相等

4. cat $file | grep -v '^$' > $file.1 去掉空行

   grep -v '^$' 表示获得除空行以外的行 $file.1 表示临时文件

5. $? 上个命令的返回

	if [ $? -ne 0 ]; then  如果上个命令返回值不为0
	fi

6. if [ -z "'echo $LINE | grep -v ^$'" ]; then
  	continue
   -z表示字符串为空,这里的含义是检查空行或者全部由空格,制表符组成的行

7. TMP=$(echo $LINE|awk '{print $1}' 去LINE字符串中空格分割后的第一个值

8. SHELL 中可以定义函数,例如:

	Get_ans()
	{
	...
	}

	使用$1获得调用时后面传入的参数

9. expect ooxx.exp $IP $PORT $USER $PASSWD 
 
 使用expect脚本远程交互

参考链接:
shell编程简介(zz)
linux grep命令

发表在 Linux, 系统, 编程 | 留下评论

Python 解析 HTML

今天突然想去下点评书放到手机里听,找到个网站,放眼望去116个链接,平均一个要点五次鼠标,实在懒得去点,折腾下写一个python吧。

具体代码:

import sys, urllib, re
from BeautifulSoup import BeautifulSoup

local_type = sys.getfilesystemencoding()

for i in range(1, 2):
    url = 'http://www1.5ips.net/down_45_' + str(i) + '.htm'
    wp = urllib.urlopen(url)
    content = wp.read()
    soup = BeautifulSoup(''.join(content))
    outstr = soup.findAll('a', href=re.compile("^http://p186"))[1]
    print str(outstr).decode("UTF-8").encode(local_type)

遇到一些问题,例如Python在windows命令行里会有乱码,例如BeautifulSoup太飘逸一下适应不了等等,不过细心上网查查,试一试就好了,这个代码会提取出下载页面中的链接,接下来就是保存到文件了。需要下载116个链接的话把i的范围修改下就好。

参考链接:

Beautiful Soup 中文文档

基本的 HTML 标签

Python中文乱码
发表在 Python, 编程, 网络 | 标签为 , | 2条评论

密码保护:许多事情的合辑

这是一篇受密码保护的文章,您需要提供访问密码:

发表在 无法分类 | 标签为 | 要查看留言请输入您的密码。

[转载]怀疑精神&考据精神 —— 宇宙的心弦

       今天早晨起床后,便看到人人网上满屏幕都是转发的这样一条状态:“35,一个神奇的数字。动车相撞35人死亡,河南平顶山矿难35人死亡;鄂湘暴雨造成35人死亡。知道为什么死亡人数控制在36人以内吗?超过36人,市委书记这个级别的要撤职,所以一开始发生,就注定了死亡人数不会超过36。”相信常上人人网和微博的同学都看到了这样一条状态。当时我就很震惊,很义愤填膺。可是仔细一想我就开始怀疑这条状态的真实性,于是我并没有转发这条状态,而是发了条状态求证此事的真伪。这条状态没发出多久,就看到辟谣贴逐渐出来了。其实要想验证这条状态的真伪很简单,只要Google一下“河南平顶山矿难”,就可以看到2010年的来自网易和新浪的新闻写道,河南平顶山矿难47人遇难;鄂湘暴雨这种两个省份的自然灾害,跟市委书记有什么关系。基于这两条信息,就可以基本判断这条状态属于自己捏造的。而后来的事实证明(来自18点左右的搜狐新闻),现在动车组追尾事故的死亡人数已经达到38人。而这38人毫无疑问仍然还是有所隐瞒的,在这之后应当人数还会继续上升。这篇日志的目的,其实并不是在对这条状态辟谣,因为这个谣言假的有点太明显。我只是想把这个作为一个引子来表达一下我的观点。

继续阅读

发表在 网摘 | 标签为 , , | 留下评论

樱华月

[audio:http://www.seenthewind.com/./wp-content/uploads/2011/07/yinhuayue.mp3]

多听歌。
暂时的更新,什么时候有空重新写篇正紧的文章。

发表在 唠叨 | 标签为 | 一条评论