Jan
22
RewriteEngine On
RewriteBase /t
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^~@].*)$ user.php?id=$1 [QSA,L]
RewriteRule ^(@.*)$ search.php?q=$1 [QSA,L]
RewriteRule ^~(.*)$ search.php?q=$1 [QSA,L]
RewriteBase /t
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^~@].*)$ user.php?id=$1 [QSA,L]
RewriteRule ^(@.*)$ search.php?q=$1 [QSA,L]
RewriteRule ^~(.*)$ search.php?q=$1 [QSA,L]
Jan
20
世界上最贵的网站出现在中国,而不是欧美等国家,充分体现了中国特色社会主义的优越性。
传送门:http://www.mof.gov.cn/mof/xinxi/zhongyangbiaoxun/zhongbiaogonggao/200912/t20091215_246271.html
为防止一小撮别有用心的人消灭社会主义的建设成果,特此存截图留念。
p.s. 还有一个670w造价的网站,传送门:
http://www.mof.gov.cn/mof/xinxi/zhongyangbiaoxun/zhongbiaogonggao/200912/t20091230_254406.html
相比之下一个150w造价的3间厕所,实在上不了台面啊!
@ 20100121 p.s.
rtmeme: RT @yuanxinting RT @xiaomi2020: 国家汉办3520万元建立网络孔子学院。中标公司是五洲汉风网络科技(北京)有限公司。该公司法人代表是胡志平。其另一职务是国家汉办副主任。也就是国家汉办开出了标书,是国家汉办创建了企业
@ 20100122 p.s.
此新闻已经开始被和谐,详见:Google搜索 中国工会网扩建项目 网易
传送门:http://www.mof.gov.cn/mof/xinxi/zhongyangbiaoxun/zhongbiaogonggao/200912/t20091215_246271.html
为防止一小撮别有用心的人消灭社会主义的建设成果,特此存截图留念。
p.s. 还有一个670w造价的网站,传送门:
http://www.mof.gov.cn/mof/xinxi/zhongyangbiaoxun/zhongbiaogonggao/200912/t20091230_254406.html
相比之下一个150w造价的3间厕所,实在上不了台面啊!
@ 20100121 p.s.
rtmeme: RT @yuanxinting RT @xiaomi2020: 国家汉办3520万元建立网络孔子学院。中标公司是五洲汉风网络科技(北京)有限公司。该公司法人代表是胡志平。其另一职务是国家汉办副主任。也就是国家汉办开出了标书,是国家汉办创建了企业
@ 20100122 p.s.
此新闻已经开始被和谐,详见:Google搜索 中国工会网扩建项目 网易
Jan
20
折腾了好久才弄出来,sigh,不熟这东西
引用
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} /(index\.php)?
RewriteRule ^.*$ - [L]
RewriteCond %{HTTP_HOST} 19880711\.com
RewriteRule ^(.*)$ http://www.felix021.com/$1 [QSA,L]
RewriteCond %{REQUEST_FILENAME} /(index\.php)?
RewriteRule ^.*$ - [L]
RewriteCond %{HTTP_HOST} 19880711\.com
RewriteRule ^(.*)$ http://www.felix021.com/$1 [QSA,L]
Jan
19
给Windows 7设置环境变量的时候,在用于分隔各个路径的分号前后,不要为了容易分辨而加上空格,否则你会死的很难看。
这就是经过十五分钟后我才发现的,让我吐血的教训。
这就是经过十五分钟后我才发现的,让我吐血的教训。
Jan
18
今天windy在群里提出一个问题: 为什么下面这段代码输出了why?
因为已经有结果了,反推过去,很容易就会想到,php把字符串当作数组来用了。再通过
由于此结论仅为猜测,想进一步证实,但是对php代码不熟悉,翻了zend_hash.c等文件都没找到北,因此请教了雪候鸟大人,得知真正的处理代码位于
@ php-5.2.8/Zend/zend_execute.c +1026
具体实现的代码是
简单写了一点注释,只能大致看懂逻辑,其他边边角角的,暂时就没时间看了:'(
$arr = 'windy';
if (isset($arr['why'])) {
echo 'why';
}
if (isset($arr['why'])) {
echo 'why';
}
因为已经有结果了,反推过去,很容易就会想到,php把字符串当作数组来用了。再通过
echo $arr['why'];
验证一下,发现输出的是w, 也就是$arr{0}的值,可以大致得出一个结论:当把字符串当作数组使用的时候,会自动把索引转换成整形,然后再当作字符串的偏移量读取返回。由于此结论仅为猜测,想进一步证实,但是对php代码不熟悉,翻了zend_hash.c等文件都没找到北,因此请教了雪候鸟大人,得知真正的处理代码位于
@ php-5.2.8/Zend/zend_execute.c +1026
static void zend_fetch_dimension_address(temp_variable *result, zval **container_ptr, zval *dim, int dim_is_tmp_var, int type TSRMLS_DC)
这个函数的作用是:将container_ptr所指向的container这个容器中,索引为dim的值取出放在result所指定的内存中去。具体实现的代码是
1063 switch (Z_TYPE_P(container)) {
1064 zval **retval;
....
1099 case IS_STRING: { //如果这个容器是string
1100 zval tmp;
1101
1102 if (dim == NULL) {
1103 zend_error_noreturn(E_ERROR, "[] operator not supported for strings");
1104 }
1105
1106 if (Z_TYPE_P(dim) != IS_LONG) { //如果偏移量的类型不是LONG
1107 switch(Z_TYPE_P(dim)) {
1108 /* case IS_LONG: */
1109 case IS_STRING:
1110 case IS_DOUBLE:
1111 case IS_NULL:
1112 case IS_BOOL:
1113 /* do nothing */ //允许STRING, DOUBLE, NULL, BOOL四种类型
1114 break;
1115 default: //其他类型都报错
1116 zend_error(E_WARNING, "Illegal offset type");
1117 break;
1118 }
1119
1120 tmp = *dim;
1121 zval_copy_ctor(&tmp);
1122 convert_to_long(&tmp);
1123 dim = &tmp; //将原来的dim转换成LONG
1124 }
1125 switch (type) {
1126 case BP_VAR_R:
1127 case BP_VAR_IS:
1128 case BP_VAR_UNSET:
1129 /* do nothing... */
1130 break;
1131 default:
1132 SEPARATE_ZVAL_IF_NOT_REF(container_ptr);
1133 break;
1134 }
1135 if (result) { //存放结果
1136 container = *container_ptr;
1137 result->str_offset.str = container;
1138 PZVAL_LOCK(container);
1139 result->str_offset.offset = Z_LVAL_P(dim);
1140 result->var.ptr_ptr = NULL;
1141 if (type == BP_VAR_R || type == BP_VAR_IS) {
1142 AI_USE_PTR(result->var);
1143 }
1144 }
1145 return;
1146 }
1147 break;
1064 zval **retval;
....
1099 case IS_STRING: { //如果这个容器是string
1100 zval tmp;
1101
1102 if (dim == NULL) {
1103 zend_error_noreturn(E_ERROR, "[] operator not supported for strings");
1104 }
1105
1106 if (Z_TYPE_P(dim) != IS_LONG) { //如果偏移量的类型不是LONG
1107 switch(Z_TYPE_P(dim)) {
1108 /* case IS_LONG: */
1109 case IS_STRING:
1110 case IS_DOUBLE:
1111 case IS_NULL:
1112 case IS_BOOL:
1113 /* do nothing */ //允许STRING, DOUBLE, NULL, BOOL四种类型
1114 break;
1115 default: //其他类型都报错
1116 zend_error(E_WARNING, "Illegal offset type");
1117 break;
1118 }
1119
1120 tmp = *dim;
1121 zval_copy_ctor(&tmp);
1122 convert_to_long(&tmp);
1123 dim = &tmp; //将原来的dim转换成LONG
1124 }
1125 switch (type) {
1126 case BP_VAR_R:
1127 case BP_VAR_IS:
1128 case BP_VAR_UNSET:
1129 /* do nothing... */
1130 break;
1131 default:
1132 SEPARATE_ZVAL_IF_NOT_REF(container_ptr);
1133 break;
1134 }
1135 if (result) { //存放结果
1136 container = *container_ptr;
1137 result->str_offset.str = container;
1138 PZVAL_LOCK(container);
1139 result->str_offset.offset = Z_LVAL_P(dim);
1140 result->var.ptr_ptr = NULL;
1141 if (type == BP_VAR_R || type == BP_VAR_IS) {
1142 AI_USE_PTR(result->var);
1143 }
1144 }
1145 return;
1146 }
1147 break;
简单写了一点注释,只能大致看懂逻辑,其他边边角角的,暂时就没时间看了:'(
Jan
18
@ php-5.2.8/Zend/zend_builtin_functions.c
1120 #ifdef ZEND_TEST_EXCEPTIONS
1121 ZEND_FUNCTION(crash)
1122 {
1123 char *nowhere=NULL;
1124
1125 memcpy(nowhere, "something", sizeof("something"));
1126 }
1127 #endif
1121 ZEND_FUNCTION(crash)
1122 {
1123 char *nowhere=NULL;
1124
1125 memcpy(nowhere, "something", sizeof("something"));
1126 }
1127 #endif
Jan
17
p.s. @ 20100119 这是前几天写的,本来打算给godaddy加一个sockets扩展,但是失败了,还是发出来,记录一下。
godaddy的虚拟主机给的权限真是宽,允许自定义php.ini。
自定义的php.ini默认放在$HOME/html/php.ini,这个是针对php4的,我选择的是php5,所以应该是php5.ini。
//以下在虚拟主机上操作
$ cd ~/html
$ cp /web/conf/php5.ini .
$ vi php5.ini
然后修改max post size之类的参数吧~过一小段时间,再看phpinfo(),就出效果了。
编译php扩展的步骤
$ wget http://museum.php.net/php5/php-5.2.8.tar.bz2 //godaddy上面的是5.2.8, i386
$ tar jxf php-5.2.8.tar.bz2
$ cd php-5.2.8/ext/sockets
$ phpize //注意,需要安装php5-dev (apt-get install php5-dev)
$ ./configure --with-php-config=/usr/bin/php-config (最好$ whereis php-config 看一下路径)
$ make
拷贝到godday去
$ scp modules/sockets.so yourname@yourdomain:~/
然后修改php5.ini,增加
extension=sockets.so
发现无法正常加载,失望=。=
godaddy的虚拟主机给的权限真是宽,允许自定义php.ini。
自定义的php.ini默认放在$HOME/html/php.ini,这个是针对php4的,我选择的是php5,所以应该是php5.ini。
//以下在虚拟主机上操作
$ cd ~/html
$ cp /web/conf/php5.ini .
$ vi php5.ini
然后修改max post size之类的参数吧~过一小段时间,再看phpinfo(),就出效果了。
编译php扩展的步骤
$ wget http://museum.php.net/php5/php-5.2.8.tar.bz2 //godaddy上面的是5.2.8, i386
$ tar jxf php-5.2.8.tar.bz2
$ cd php-5.2.8/ext/sockets
$ phpize //注意,需要安装php5-dev (apt-get install php5-dev)
$ ./configure --with-php-config=/usr/bin/php-config (最好$ whereis php-config 看一下路径)
$ make
拷贝到godday去
$ scp modules/sockets.so yourname@yourdomain:~/
然后修改php5.ini,增加
extension=sockets.so
发现无法正常加载,失望=。=
Jan
15
从标题就可以看出来,这篇的内容是大杂烩,主要是这几天玩的东西,一并说一下
总共5个东西
1. 交换分区
第三篇说的重新分区太危险了,万一SmartQ升级固件的程序不认,那就挂了。所以决定把那128MB拿来做交换分区。具体做法如下
建立一个100MB的文件
# dd if=/dev/zero of=/media/ndda2/swapfile bs=1MB count=100
格式化成swap所需的格式
# mkswap /media/ndda2/swapfile
# swapon /media/ndda2/swapfile
如果不需要了,可以这样
# swapoff /media/ndda2/swapfile
可以把这个写入rc.local.
2. 键位映射
其实主要是xmodmap和xev这2个东西
先讲xev吧:
$ xev | grep keycode
然后按现有的几个键,可以看到,屏幕左边的三个分别是(112)Prior, (117)Next, (64)Alt,上面的三个(从左到右)分别是(124)XF86PowerOff(关机), (9)Esc, (36)Return(回车)。所以实际上可以用ALT+ESC来切换程序。
$ xmodmap -pke
可以看到现在的keycode被映射成什么东西
$ xmodmap -e 'keycode 112 = Up'
$ xmodmap -e 'keycode 117 = Down'
这样就可以把那两个按键变成上下,而不是翻页了。
$ xmodmap -e 'keycode 112 = Prior'
$ xmodmap -e 'keycode 117 = Next'
这样还原。
3. 快捷键
主要是修改 /home/user/.config/openbox/lxde-rc.xml
找到Keybinding这一节,按照格式修改即可。
比如默认的A-XF86PowerOff(Alt+Power组合键)是运行ts_calibrate,就是校正屏幕的,但是其实这个基本用不到,所以可以改成其他的,比如改成vlc,或者fbreader;默认的XF86PowerOff是打开那个系统设置(coman)程序,很容易被误按,我也改掉了。这样就多了2个可以自定义的快捷键,很爽。有兴趣的话还可以研究一下怎么增加其他组合按键,比如Alt+Enter :)
p.s. 需要运行一次首选项->窗口设置 才可以生效。
4. 虚拟键盘
系统自带的虚拟键盘是matchbox-keyboard, Nokia的N770什么的也在用。键盘的布局文件是存放在/usr/share/matchbox-keyboard这个目录下的,标准键盘用的就是keyboard.xml这个文件了。可以修改这个文件来实现自己想要的键位布局。昨天整了一个接近标准PC键盘的键位布局,效果见图:
5. 一个脚本,我存放在/usr/bin/run_app,然后XF86PowerOff映射为运行这个脚本,效果就是,按一下启动vlc,再按一下结束vlc。
总共5个东西
1. 交换分区
第三篇说的重新分区太危险了,万一SmartQ升级固件的程序不认,那就挂了。所以决定把那128MB拿来做交换分区。具体做法如下
建立一个100MB的文件
# dd if=/dev/zero of=/media/ndda2/swapfile bs=1MB count=100
格式化成swap所需的格式
# mkswap /media/ndda2/swapfile
# swapon /media/ndda2/swapfile
如果不需要了,可以这样
# swapoff /media/ndda2/swapfile
可以把这个写入rc.local.
2. 键位映射
其实主要是xmodmap和xev这2个东西
先讲xev吧:
$ xev | grep keycode
然后按现有的几个键,可以看到,屏幕左边的三个分别是(112)Prior, (117)Next, (64)Alt,上面的三个(从左到右)分别是(124)XF86PowerOff(关机), (9)Esc, (36)Return(回车)。所以实际上可以用ALT+ESC来切换程序。
$ xmodmap -pke
可以看到现在的keycode被映射成什么东西
$ xmodmap -e 'keycode 112 = Up'
$ xmodmap -e 'keycode 117 = Down'
这样就可以把那两个按键变成上下,而不是翻页了。
$ xmodmap -e 'keycode 112 = Prior'
$ xmodmap -e 'keycode 117 = Next'
这样还原。
3. 快捷键
主要是修改 /home/user/.config/openbox/lxde-rc.xml
找到Keybinding这一节,按照格式修改即可。
比如默认的A-XF86PowerOff(Alt+Power组合键)是运行ts_calibrate,就是校正屏幕的,但是其实这个基本用不到,所以可以改成其他的,比如改成vlc,或者fbreader;默认的XF86PowerOff是打开那个系统设置(coman)程序,很容易被误按,我也改掉了。这样就多了2个可以自定义的快捷键,很爽。有兴趣的话还可以研究一下怎么增加其他组合按键,比如Alt+Enter :)
p.s. 需要运行一次首选项->窗口设置 才可以生效。
4. 虚拟键盘
系统自带的虚拟键盘是matchbox-keyboard, Nokia的N770什么的也在用。键盘的布局文件是存放在/usr/share/matchbox-keyboard这个目录下的,标准键盘用的就是keyboard.xml这个文件了。可以修改这个文件来实现自己想要的键位布局。昨天整了一个接近标准PC键盘的键位布局,效果见图:
下载文件 (已下载 1604 次)
5. 一个脚本,我存放在/usr/bin/run_app,然后XF86PowerOff映射为运行这个脚本,效果就是,按一下启动vlc,再按一下结束vlc。
#!/bin/bash
dir=$HOME/tmp
tmp=$dir/run_app.pid
if [ ! -d $dir ]; then
mkdir -p $dir
fi
if [ -f $tmp ]; then
kill `cat $tmp`
rm $tmp -rf
else
setsid vlc &
echo $! > $tmp
fi
dir=$HOME/tmp
tmp=$dir/run_app.pid
if [ ! -d $dir ]; then
mkdir -p $dir
fi
if [ -f $tmp ]; then
kill `cat $tmp`
rm $tmp -rf
else
setsid vlc &
echo $! > $tmp
fi