Aug 30
引用
Warning:  Unable to initialize module
Module compiled with module API=20050922, debug=0, thread-safety=1
PHP compiled with module API=20020429, debug=0, thread-safety=1
These options need to match

由于在编译的时候API版本信息(API version)会被嵌入到.so文件中,而PHP在载入扩展时会检查扩展中的API Version与当前版本的API Version是否相同。如果不相同,则拒绝载入。

如果出现类似的WARNING,可能的情况有2:
1. 这个 .so 扩展文件是你自己从php源码编译的
2. 这个 .so 扩展文件是从其他地方下载下来的

但是比较囧的是,比如,在Ubuntu上面,安装了php5,php5-dev,默认的 phpize + configure + make 生成的扩展的API Version是与ubuntu源中的php版本相同;如果需要编译另一个版本的PHP扩展(比如godaddy上的5.2.8),就不能这么直接了,解决办法是:

1. 到php.net去下载对应版本的php代码,比如php5.2.8.tar.bz2,解压到 xxx/php

2. 编译php
$ cd xxx/php && ./configure && make

3. 使该版本的phpize、php-config可用
$ cd xxx/php/scripts; chmod +x phpize php-config

4. 编译扩展
$ cd 扩展源代码路径
$ xxx/php/scripts/phpize
$ ./configure --with-php-config=xxx/php/scripts/php-config  #注意这个with-php-config参数
$ make

编译好后的.so文件就在 modules 目录下面了
 
Aug 30

把快播(QVOD)卸载干净 不指定

felix021 @ 2010-8-30 01:16 [IT » 软件] 评论(1) , 引用(0) , 阅读(8514) | Via 本站原创
暑假在家的时候被表哥安了个QVOD。虽说不像以前那么流氓,有专门的卸载工具了,但是就像当初的3721,不给你卸载干净,留下一个DLL,方便以后做坏事。具体的表现就是,右键单击RMVB等文件时,总有一个”添加到 快播 列表“。

解决办法还很难搜到,还好还算简单:

1. 打开命令提示符(或者在[开始菜单->运行]里面),运行: regsvr32 /u "C:\Program Files\QvodPlayer\QvodBand.dll"
2. 安装unlocker这个强力删文件工具,然后打开C:\Program Files\QvodPlayer\,右击QvodBand.dll,选择Unlocker,在弹出窗口的下拉菜单中选择”删除“,然后点击全部解锁。

清爽了。
Aug 29

i贴吧rss订阅 不指定

felix021 @ 2010-8-29 21:24 [IT » 网络] 评论(0) , 引用(0) , 阅读(4010) | Via 本站原创
百度的i贴吧没有官方的rss实现,挺郁闷的。花了点时间用PHP写了这个。

测试过,GoogleReader可以正常订阅;HTTP/HTTPS兼容。代码挺难看的。

要求:支持curl库的PHP空间。如果不支持curl,可以自己用fsockopen简单模拟一下。
下载文件 (已下载 1258 次)
Aug 29
【参考】 http://onlamp.com/pub/a/onlamp/2008/03/04/step-by-step-configuring-ssl-under-apache.html
p.s. 删减部分内容,并修正原文的一些小错误

1. 生成ssl证书:
1) 如果没有安装openssl,sudo apt-get install openssl装一个
2) 生成自签名证书
引用
$ openssl req -new -x509 -days 365 -sha1 -newkey rsa:1024 -nodes -keyout server.key -out server.crt -subj '/O=Company/OU=Department/CN=HOSTNAME'
将HOSTNAME替换成需要的域名;更详细说明(各参数/CA签名方法)参见原文。这一步执行完后会有server.crt和server.key两个文件,server.crt是公钥,需要让运行apache的用户可读的;server.key是私钥应当chmod为600。
3). 将server.cst和server.key拷贝到/etc/apache2/ssl/下。这个路径可以更改,但相应的配置文件中的路径也需要更改。

2. 配置apache
1) 启用mod_ssl:  $ sudo a2enmod ssl
2) cd到/etc/apache2/sites-available,新建一个配置文件"ssl",内容如下:
引用
<IfModule mod_ssl.c>
    #注意,下面这四行应当放在VirtualHost标签之外(原文的apache1.3可能支持放在里头,但2.2不行)
    SSLRandomSeed startup file:/dev/urandom 1024
    SSLRandomSeed connect file:/dev/urandom 1024

    SSLSessionCache shm:/usr/local/apache2/logs/ssl_cache_shm
    SSLSessionCacheTimeout 600   

<VirtualHost *:443>
  ServerAdmin webmaster@localhost
  DocumentRoot /var/www
  <Directory />
        SSLRequireSSL
    Options FollowSymLinks
    AllowOverride None
  </Directory>

  <Directory /var/www>
    Options Indexes FollowSymLinks MultiViews
    AllowOverride All
    Order allow,deny
    allow from all
  </Directory>

    SSLProtocol -all +TLSv1 +SSLv3
    SSLCipherSuite HIGH:MEDIUM:!aNULL:+SHA1:+MD5:+HIGH:+MEDIUM

    #注意.crt和.key文件的路径必须一致
    SSLCertificateFile /etc/apache2/ssl/server.crt
    SSLCertificateKeyFile /etc/apache2/ssl/server.key

    SSLVerifyClient none
    SSLProxyEngine off

    <IfModule mime.c>
        AddType application/x-x509-ca-cert      .crt
        AddType application/x-pkcs7-crl        .crl
    </IfModule>

  BrowserMatch "MSIE [2-6]" \
    nokeepalive ssl-unclean-shutdown \
    downgrade-1.0 force-response-1.0
  # MSIE 7 and newer should be able to use keepalive
  BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown

  ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
  <Directory "/usr/lib/cgi-bin">
    AllowOverride None
    Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
    Order allow,deny
    Allow from all
  </Directory>

  ErrorLog /var/log/apache2/error.log

  # Possible values include: debug, info, notice, warn, error, crit,
  # alert, emerg.
  LogLevel warn

  CustomLog /var/log/apache2/ssl_access.log combined

  Alias /doc/ "/usr/share/doc/"
  <Directory "/usr/share/doc/">
    Options Indexes MultiViews FollowSymLinks
    AllowOverride None
    Order deny,allow
    Deny from all
    Allow from 127.0.0.0/255.0.0.0 ::1/128
  </Directory>

</VirtualHost>
</IfModule>
3). 创建链接:
$ cd /etc/apache2/sites-enabled
$ sudo ln -s ../sites-available/ssl
4). 重启apache2
$ sudo /etc/init.d/apache2 restart

3. 访问网站 https://HOSTNAME
Aug 26
上一次的方法虽然达到了基本要求,但是还是有很多不爽的地方,尤其是

1. 当需要直接操作该虚拟机,或者修改运行时参数(比如增加共享文件夹、修改网卡的模式、分配光驱)时,需要将虚拟机关闭或者休眠,然后再重新用vbox打开,很麻烦,更重要的是当前ssh会话环境全都要关闭,再次建立很麻烦。

2. 由于虚拟机是后台运行的,在关机的时候可能会被忽略,影响数据的安全性,甚至会导致虚拟机挂掉——我遇到的情况是apt包管理器的缓存文件出错,无法安装或卸载现有程序。于是干脆重装了下(把alternate版换成了server版)。

于是上网搜了一下,找到一款很不错的绿色软件——RBTray,可以强制将软件放入托盘(Systray)中,隐藏它在任务栏占用的位置。

这款软件可以在这里下载:http://rbtray.sourceforge.net/

把它下载,解压,运行,然后右键单击窗口的最小化图标,绝大部分窗口就会最小化到托盘中去。

然后在桌面上额外创建两个bat文件:
start.bat
VBOX安装路径\VBoxManage startvm Ubuntu

stop.bat
VBOX安装路径\VBoxManage controlvm Ubuntu savestate


完美:D
Aug 22
一个简单的程序:
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>

int main(int argc, char *argv[])
{
    int fd = open(argv[1], O_CREAT | O_WRONLY);
    if (fd < 0)
    {
        printf("err open");
        return 1;
    }
    u_int64_t sz = lseek64(fd, (1ull << 40) - 1, SEEK_SET);
    if (sz < 0)
    {
        printf("err lseek64");
        return 2;
    }
    int nWrite = write(fd, &fd, 1);
    printf("nWrite = %d\n", nWrite);
    close(fd);
    return 0;
}


编译运行:
引用
$ gcc -o hole hole.c -D_FILE_OFFSET_BITS=64
$ ./hole disk
$ ls -lh disk
-rwxr-S--- 1 felix021 felix021 1.0T 2010-08-20 14:36 disk


搞怪:
引用
felix021@ubuntu-vbox:~/code$ mkdir mnt
felix021@ubuntu-vbox:~/code$ sudo mkfs.vfat disk
mkfs.vfat 3.0.7 (24 Dec 2009)
felix021@ubuntu-vbox:~/code$ sudo mount -oloop disk mnt
felix021@ubuntu-vbox:~/code$ df -lh
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda3            5.2G  1.5G  3.5G  30% /
...
/dev/sda1            2.3G  957M  1.3G  43% /home
/dev/loop0            1.0T  16K  1.0T  1% /home/felix021/code/mnt
Aug 21

程序员的浪漫 不指定

felix021 @ 2010-8-21 18:11 [IT » 程序设计] 评论(1) , 引用(0) , 阅读(6398) | Via 本站原创
dim arr(3)
arr(1)=-12590
arr(2)=-20306
arr(3)=-15133
str = ""
for i = 1 to 3
    str = str & chr(arr(i))
next
CreateObject("SAPI.SpVoice").Speak str
Aug 21

sdbm hash for PHP 不指定

felix021 @ 2010-8-21 01:59 [IT » 程序设计] 评论(0) , 引用(0) , 阅读(4610) | Via 本站原创
上一篇提到了,使用sdbmhash来生成64bit摘要。这个算法,是需要用在PHP里头的,但是PHP在设计的时候有点囧,用于表示任意变量的 zval 这个struct里头,有一个union是用于存放不同数据类型的,而该union中用于表示整型的变量,就只有一个long。于是很杯具地:

1. 32bit OS下面的php只支持32bit整数
2. 不支持无符号整型

那个抑郁啊,于是只好用php的bcmath这个大整数库来实现上一篇的sdbmhash算法:
function sdbmhash($str)
{
    $mul = "65599"; // (1 << 6) + (1 << 16) - 1
    $mod = "18446744073709551616"; // 1 << 64

    $hash = "0";
    for ($i = 0; $i < strlen($str); ++$i)
    {
        $hash = bcmod(bcmul($hash, $mul), $mod);
        $hash = bcmod(bcadd($hash, ord($str{$i})), $mod);
    }
    return $hash;
}

大整数库是用字符串来模拟的,没有对位移的直接支持。于是刚开始的时候用 bcmul($hash, 1<<6) 之类来替代C实现中的位移;然后果断发现自己SB了,直接乘65599更合适。

当然了,由于是用字符串来模拟的,可以想象这段代码效率是很低的。但是有多低呢?在我的Ubuntu虚拟机上测试了一下,1w次对18个字符的hash需要大约2.4s,也就是说一次调用大约需要0.2~0.3ms。宿主机是windows(AMD M320, 2.1GHz),php的效率更低,大约花了3~4s。在同样的时间里,纯C实现,可以进行相同的运算10,000,000+次,效率比大约是PHP:C = 1:1000。

由于0.2~0.3ms这个数量级比较大了,于是决定把它写成一个PHP扩展。参照百度文库的这篇教程 http://wenku.baidu.com/view/044da6f8941ea76e58fa04b1.html 比较快就上手了。

最终实现的效率比是大约1:100。看来PHP的扩展开销还是很大啊。

记得前年曾经和@Sandy讨论过ASP、PHP、JSP的效率,他认为ASP和PHP在同一个数量级,和JSP差距很大(而我当初则认为PHP和JSP差距不大)。这个数据很好地证明了这一点。

最后,附上这个PHP扩展。
下载文件 (已下载 1134 次)
分页: 1/2 第一页 1 2 下页 最后页 [ 显示模式: 摘要 | 列表 ]