• 又是新的一年

    【神仙】 2007-12-31 11:56

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

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

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

       

  • php扩展开发学习笔记 2

    【神仙】 2007-12-29 21:30

    函数返回值

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

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

     

  • 叽歪未公开api

    【神仙】 2007-12-27 13:27

      叽歪提供了一套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>
    <script type="text/javascript" src='http://api.jiwai.de/statuses/user_timeline/用户名.json?count=1& callback=jiwai_de_callback'></script>

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

  • php扩展开发学习笔记 1

    【神仙】 2007-12-25 21:27

      开发环境设置见《用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生成的代码中的注释所说,是函数入口表的结束标志。

     

     

  • berkery db果然是很快的

    【神仙】 2007-12-17 17:23

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

  • 用vc 2008编译php扩展

    【神仙】 2007-12-16 15:59

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

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

    之后用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 <stdio.h>  搬到

    #ifdef ZEND_WIN32
    # include "zend_config.w32.h"
    # define ZEND_PATHS_SEPARATOR        ';'
    #elif defined(NETWARE)
    # include <zend_config.h>
    # define ZEND_PATHS_SEPARATOR        ';'
    #elif defined(__riscos__)
    # include <zend_config.h>
    # define ZEND_PATHS_SEPARATOR        ';'
    #else
    # include <zend_config.h>
    # define ZEND_PATHS_SEPARATOR        ':'
    #endif

    后面去。

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

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

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

     

     

  • 集市or博物馆

    【神仙】 2007-12-12 22:23

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

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

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

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

     

     

  • 晨曲@乌镇

    【神仙】 2007-12-12 10:33

      第二天一早走出青年旅舍的时候,整个乌镇笼罩在早晨柔和而温暖的阳光里。早晨果然是拍照的好时候。

  • 乌镇的星星

    【神仙】 2007-12-10 21:01

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

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

     

     

  • fsutil

    【神仙】 2007-12-01 20:47

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

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

日历

个人资料

【神仙】

世人都晓神仙好~~~~