又是新的一年

  最近网上流传的2007经典语录的头条就是“人生的最大遗憾莫过于错误地坚持了不该坚持的,轻易地放弃了不该放弃的”。不过很多时候,在遗憾之前,因为受到情绪的左右,或者是信息的制约,是很难知道到底该不该坚持,该不该放弃。而往往事过之后回过头去,又会发现一切又都是必然的。新的一年又来了,但愿将来我不会后悔现在的坚持。

  前两年的新年愿望还是没实现,但是我自己也没为之做过多少努力,也算是活该。现在也没多少想法了,也不着急了。

  莫名其妙写了些让别人莫名其妙的东西,姑且算是新年之际的小小的记录吧。

   

php扩展开发学习笔记 2

函数返回值

  php的api里定义了很多宏来实现扩展里函数的返回值。RETURN_BOOL、RETURN_LONG、RETURN_DOUBLE这3个宏分别用于返回对应的值。只在参数里填入需要返回的值即可。如RETURN_LONG(1024);。对于string,则有RETURN_STRING和RETURN_STRINGL。其中后者可以指定字符串的长度,前者只是以作为结束标志。第二个参数表示是否复制字符串的值。如果char数组是在栈空间内分配的(如作为局部变量的字符串常量)就需要指定为1。

  实际上,php的扩展中,函数的返回值是通过一个return_value的变量来传递的。如果煮一下PHP_FUNCTION所展开的内容的话,会发现return_value实际上是这个函数的一个参数。前面那几个宏所作的事情就是,对return_value赋值然后return。对return_value赋值则还有一组RETVAL_开头的宏。如RETVAL_BOOL等。

 

叽歪未公开api

叽歪提供了一套API接口供其他网站使用。不过他公布的API里的json接口 只有直接输出的。因为javascript的跨越问题,就只能通过代理来读取。不过既然叽歪给blog的javascript能读取,那一定还是有途径 的。看了下它输出的代码,就找到了一个未公开的参数:callback。这样就可以在js端动态获取最新的叽歪了。

代码:

<script type=”text/javascript”>
<!–
function jiwai_de_callback(status){
var text=status[0].text;
var m = text.match(/^(.+)\[[^]]+\]\s*$/);
if(m){
text = m[1];
}
alert(text);
}
//–>
</script>
http://api.jiwai.de/statuses/user_timeline/用户名.json?count=1&%20callback=jiwai_de_callback

把用户名替换成你的用户名或id即可。

php扩展开发学习笔记 1

  开发环境设置见《用vc 2008编译php扩展》。

  写一个扩展最基本的就是编写函数。我这里是用skel生成了一个algorithm的扩展的骨架。

  php扩展中的函数用PHP_FUNCTION宏定义。首先在.h文件中写一个定义,如skel生成的代码为例:PHP_FUNCTION(confirm_algorithm_compiled);
然后在.c文件中写函数的实现。
PHP_FUNCTION(confirm_algorithm_compiled)
{
    //…
}
  这和传统的C编程很像。括号内就是函数的名字。这里没有参数列表,函数的参数是通过其他途径获取的。然后,还需要在扩展的函数入口表里添加一条:PHP_FE(confirm_algorithm_compiled, NULL)。这样在php里才能找到这个函数。这里FE应该就是function entry的缩写。

zend_function_entry algorithm_functions[] = {
    PHP_FE(confirm_algorithm_compiled, NULL)
    {NULL, NULL, NULL} /* Must be the last line in algorithm_functions[] */
};

  这里的{NULL, NULL, NULL}的作用如skel生成的代码中的注释所说,是函数入口表的结束标志。

 

 

berkeley db果然是很快的

据说 berkeley db 在存储key-value形式的数据时速度很快,就实验了一下,拿bdb和mysql myisam比较了一下。

测试代码:

$max = 100000;
ini_set(‘display_errors’, 1);
error_reporting(E_ALL);

$conn = mysql_connect(‘localhost’, ‘test’, ‘…..’);
mysql_select_db(‘test’, $conn);
mysql_query(‘truncate table test_kv’, $conn);

$t = microtime(true);
for($i = 0; $i < $max; $i++){
    $key = ‘key’ . $i;
    mysql_query(“insert into test_kv(`key`,`value`) values(‘$key’,’$i’)”, $conn);
}
echo microtime(true) – $t, “n”;

$t = microtime(true);
for($i = 0; $i < $max; $i++){
    $key = ‘key’ . $i;
    $rs = mysql_query(“select `value` from test_kv where `key`=’$key'”);
    $row = mysql_fetch_row($rs);
}
echo microtime(true) – $t, “n”;

dl(‘dba.so’);
//print_r(dba_handlers(i));
$db = dba_open(‘test.db’, ‘n’, ‘db4’);

$t = microtime(true);
for($i = 0; $i < $max; $i++){
    $key = ‘key’ . $i;
    dba_insert($key, $i, $db);
}
echo microtime(true) – $t, “n”;

$t = microtime(true);
for($i = 0; $i < $max; $i++){
    $key = ‘key’ . $i;
    dba_fetch($key, $db);
}
echo microtime(true) – $t, “n”;

结果

12.7905659676
58.7637891769
1.14525485039
0.541149139404

前面两行是mysql的结果,后面两行是berkeley db 4的结果,分别是插入100000条和读取100000条记录消耗的时间。 如果是存取key-value的数据,又不需要在服务器间共享的话可以考虑使用berkeley db。

用vc 2008编译php扩展

今天又想试试写php扩展,先从编译sample开始。

首先用ext_skel_win32.php生成骨架代码。这个需要cygwin。如果cygwin不在c:cygwin,那么需要修改这个文件,指定cygwin的位置。比如:$cygwin_path = ‘d:cygwinbin’;

之后用vc2008打开生成的dsp工程文件,升级工程文件以后,把工程选项里的C/C++ -> Code Generation里的Runtime Library改成Multi-threaded DLL (/MD);C/C++ -> Advanced里的Compile As设成Compile as C Code (/TC)。

然后就编译,居然就没通过有几个语法错误…… 搜索了一下,发现还要改两个地方:

 Zend/Zend.h:

把#include   搬到

#ifdef ZEND_WIN32
# include “zend_config.w32.h”
# define ZEND_PATHS_SEPARATOR        ‘;’
#elif defined(NETWARE)
# include
# define ZEND_PATHS_SEPARATOR        ‘;’
#elif defined(__riscos__)
# include
# define ZEND_PATHS_SEPARATOR        ‘;’
#else
# include
# define ZEND_PATHS_SEPARATOR        ‘:’
#endif

后面去。

还要修改zend_config.w32.h,把#define vsnprintf _vsnprintf这行注释掉。

之后总算可以编译通过了。加载进来运行一下,终于看到了那句Congratulations。

以后再想想写个什么扩展好,然后进一步研究下。

 

 

集市or博物馆

  在去乌镇之前,还去过朱家角和西塘这两个水乡古镇。而这两个地方给我的感觉是人多,拥挤,满大街到处都是卖小吃和纪念品的店。拍照的时候,要避开那些住宿、餐饮之类煞风景的广告也不是件容易的事情。后来看到乌镇西栅的boss景行枯文章,了解到西栅和这些地方的不同经营理念后,对乌镇有了一些期许。希望我看到的这个江南水乡不再是一个闹哄哄的集市,可以静静地在古镇的街道上走,慢慢地品味古镇的风味。

  乌镇西栅也确实没有辜负我的期望。这是一个很安静的古镇,游客也没有那么多。但是走在西栅的街上,却有另一种异样的感觉。这里的多数房子都已经改造成了供游客居住的民宿,没有了原住居民。在西栅街上,能看到的人除了游客就只有这里的工作人员了。在这里穿行,仿佛是在一个博物馆里,一切都已经被小心地封存起来,每一处细节虽然有着岁月的痕迹,但都依然如当年般细致完整。但是,却如同博物馆里的展品一般,似乎少了一点生气。

  西塘号称是流动着的生活画卷,当地的居民依然住在水乡古镇,但是他们为了经济利益,却让古镇变得太商业化,像是一个大集市,变得不那么有味道了。而西栅为了更好地保护古镇,迁出了当地居民。这样却又使古镇像是一个博物馆。这实在是很矛盾的。但是如果要我在这两者之间选择一个的话,我还是愿意选择后者,因为我是一个喜欢安静的人,不喜欢吵吵嚷嚷的环境。不过,会不会有更好的选择呢?

  据说西栅要请回一些居民了。这样能够使古镇显得更有人气,不那么像博物馆。因为之前西栅已经将产权收归国有,相信会更容易管理,应该不再会出现过于商业化的情况了吧。这次由于主要是为了五周年的庆典,并没有多少时间游览。以后有机会,还可以再来一次。到那时,西栅应该会更有味道吧。

 

 

乌镇的星星

  我是晚上到乌镇的。然后就开始和其它同事一起准备明天的庆典活动。等当天的事结束后,已经很晚了。走出通庵的时候,街上已经只有路灯亮着。正在为错过了乌镇的夜景而感到遗憾的时候,走上一座桥,突然发现夜幕上闪烁着点点繁星。这是真正的繁星满天。在黑色的天空的映衬下,那点点星光显得如此炫目。在我的记忆里,似乎从来没有见过天上有这么多星星。在上海,晚上就算再晴朗,也只能看到稀稀疏疏的几颗星星。其余的星光,都淹没在都市的灯光和浑浊的空气里。时间长了,也习以为常。看到一些绘画、CG上灿烂的繁星的时候,甚至怀疑这些是否真实,还是艺术的夸张。然而这一刻,我真的为这星空所震撼。回到住宿的青年旅舍后,赶紧拿出脚架,架上相机试图记录下来。但是当我浏览这些相片的时候,却发现,虽然照片上同样有一颗颗明亮的星星,但是却看不出那样的感觉。也是,小小的相片如何能和笼盖大地的天穹相比呢?

  第二天晚上是阴天,第三天,我们就开始回到上海了。不知道在什么时候,在什么地方,还能看到这般灿烂的星空呢?

 

 

fsutil

  之前我写过一篇在Windows上创建硬链接,那时候并不知道Windows自己已经提供了这样的命令,所以自己写了一个。后来知道,原来还是有这样的命令的,就是fsutil(似乎是从xp开始有的)。从名字看,就是文件系统实用工具。 这个工具除了可以创建硬链接外还可以做不少其他事情,可以直接输入fsutil查看有那些命令,用fsuitl 功能,fsuitl 功能 命令 查看使用方法。

  创建硬链接用 fsutil hardlink create 即可。不过win上的命令很多都有这么个缺点,不方便串起来用。但是有总比没有好。