2012年6月

C++读取配置文件

配置文件格式

 # nimei
host = 127.0.0.1
 port = 80

	key
	=123
mask = 255.255.255.0
# comment

C++代码

/**
 * @author xiaozi<245565986@qq.com>
 */
#include 
#include 
#include 
#include 

using namespace std;

string trim(const string& str);

int main(int agrc, char* argv[]) {
	const char* filename = "parse.conf";
	ifstream ifs(filename);

	string line = "";
	string key = "";
	string value = "";
	string::size_type pos = string::npos;

	map options;

	while(! ifs.eof()) {
		getline(ifs, line);

		line = trim(line);
		// 空行 和 注释行 和 不存在等号的行,跳过
		if(line.empty() || line.at(0) == '#') {
			continue;
		}

		if((pos = line.find('=')) == string::npos) {
			// cout << "语法错误" << endl;
			continue;
		}

		key = trim(line.substr(0, pos));
		value = trim(line.substr(pos + 1, line.size() - pos - 1));

		// key不为空的时候,留下该行数据
		if(! key.empty()) {
			options[key] = value;
		}
	}

	ifs.close();

	// 输出得到的数据
	map::iterator it;
	for(it = options.begin(); it != options.end(); it++) {
		cout << (*it).first << " => " << (*it).second << endl;
	}

	return 0;
}

string trim(const string& str) {
	if(str.empty()) {
		return str;
	}
	string::size_type pos = str.find_first_not_of(" \t\n\r\0\x0B");
	if(pos == string::npos) {
		return str;
	}
	string::size_type pos2 = str.find_last_not_of(" \t\n\r\0\x0B");
	return str.substr(pos, pos2 - pos + 1);
}

Centos硬盘读写速度测试

老看到網上有在前面加time的,而且還用兩個數字除一下,於是我就覺得蛋疼,你說明明顯示出了結果,爲什麼還要自己再算一邊呢?後來才知道是linux4下是不會有速度結果出來的,於是你知道的,”轉載就轉載了,尼瑪動過腦子沒?還把有結果的貼在文章裏面,自己甩自己嘴巴啊。“

PS:最近喜歡上繁體字了,木有辦法啊!

# 測試寫文件的速度:
sync;dd if=/dev/zero of=/tmp/1GB.file bs=1024 count=1000000
# 測試讀文件的速度:
sync;dd if=/tmp/1GB.file of=/dev/null bs=1024 count=1000000


# 測試10次寫文件的速度(有無執行sync的區別比較大):
for i in {1..10}
do
sync
dd if=/dev/zero of=/tmp/1GB.file bs=1024 count=1000000
done

# 測試10次讀文件的速度(有無執行sync沒多大的區別):
for i in {1..10}
do
sync
dd if=/tmp/1GB.file of=/dev/null bs=1024 count=1000000
done


# 由於dd命令結果是顯示在錯誤輸出的上的,若需要進一步處理數據,則需要將結果重定向:
sync;dd if=/dev/zero of=/tmp/1GB.file bs=1024 count=1000000 2>&1 | grep "copied"
sync;dd if=/tmp/1GB.file of=/dev/null bs=1024 count=1000000 2>&1 | grep "copied"

C++中嵌入python

#include 
#include 

using namespace std;

int main(int argc, char* argv[]) {
	PyObject *pModule, *pDict, *pFunc;
	PyObject *pArgs, *pArg, *pResult;
	
	Py_Initialize();
	// ...
	PyRun_SimpleString("import sys");
	PyRun_SimpleString("sys.path.append('./')");
	
	// ...
	pModule = PyImport_ImportModule("callback");

	if(pModule != NULL) {
		pDict = PyModule_GetDict(pModule);
		pFunc = PyDict_GetItemString(pDict, "hello");

		if(pFunc && PyCallable_Check(pFunc)) {
			pResult = PyObject_CallObject(pFunc, NULL);
			if(pResult != NULL) {
				cout << PyString_AsString(pResult) << endl;

				Py_DECREF(pResult);
			}
			
		}
		Py_XDECREF(pFunc);
		Py_DECREF(pDict);
		Py_DECREF(pModule);
	}

	// Py_DECREF(pArgs);
	// Py_DECREF(pArg);
	
	Py_Finalize();
	
	return 0;
}

內容粗略,僅是記錄一下,有待更新。

bash杂记2

不显示终端的输入(stty)

echo "Please enter your password:"
stty -echo
read PASSWORD
stty echo
# 输出刚才输入的内容
echo $PASSWORD

交互式选择(select)

# 江山和美人,你更喜欢那个?
echo "Which do you prefer?"
select result in "beauty" "land"
do
	break
done
echo $result

得到当前脚本的绝对路径

echo $(cd "$(dirname "$0")"; pwd)

mysql储存时间选择怎样的字段类型

储存时间,常用的有三个选择datetimetimestampint。昨夜同事问到了,于是今天就总结一下自己的理解。

  1. 插入效率:datetime > timestamp > int
  2. 读取效率:int > timestamp > datetime
  3. 储存空间:datetime > timestamp = int
具体上面的实验数据可以看这篇文章
建立索引的体积,和索引的速度,你懂的。

让我们来看一个应用场景:
QQ截图20120601102859.png
看下这张图,第一我们需要设置系统的默认时区,第二我们也需要提供不同时区时间显示的需要。于是,我们分别使用datetimetimestampint字段类型来看下:

使用datetime

直接显示时间,这是个不错的选择,但是如果考虑到时区,很明显计算上的麻烦。

使用timestamp

OK,这个很好,可以根据系统的时区来自动输出时间,但是单个用户要定制自己的时区呢?再者你不怕麻烦,在程序里面实现了这个计算,服务器若是换个地方,改了下时区,你程序里面计算单个用户当地时间的代码怎么办(timestamp出来的时间会根据时区的变化而变化,在某些情况下是不错的选择,但在某些情况下,真的很鸡肋)。

使用int

从上面两个类型的缺点看来,貌似这个类型可以解决以上的问题,其实我们只要存格林时间的unix timestamp就好了,时区时间的计算上也很方便,读取的效率也不错。我觉得用这个储存的缺点呢,就是直接select的时候时间不能直观的显示出来。

看看其他开源程序是怎么做的

discuz, typecho, emlog等等等等,他们都选用int了,这一定有他们的道理,我想也没什么可以多说的了。