Saturday, February 28, 2009

琐事乱记

昨天的消息,猛哥国防科大373,基本没问题了
正好之前说好了请他们吃饭,于是一下就成了小庆祝了
去取东西,赶时间,结果,路上摔了一跤,左手掌破了:s

今天早上踢球,两个小时,诡异地撑了下来,居然还有个助攻
只是回来的时候,小腿酸疼,难受

中午带着一帮lit的小孩,去吃饭,还有这边的几个老人,又烧了不少rmb
晚上瞎折腾了会儿网卡,于是无线又出问题了
系统估摸着得重装了 :x


然后得出了一个结论。。。。。貌似rp的流失量和bg烧掉的rmb是成正比了

有人问是不是今天做啥坏事了。。。。。想想。。。。5分钟把学校某个站搞了。。。烂xp。。。没劲

。。。。。

万网真**

改个NS都不让,我只是想用zoneedit解析自己的域名而已
那么复杂的系统,一点都不好用

无奈新网没有.name域名支持

Friday, February 27, 2009

把MySQL升级了

5.1.30 icc -> 5.1.31 non-icc
测试看看吧
希望那个索引的问题不会再出现
真麻烦

php走向了5.2.9

居然没收到php.net的邮件xD
经历了三个rc吧,然后终于把5.2.9 release了
也许这算是5.2系列的终结,但也说不好就会来个 5.2.10
还在期待 5.3的ga

于是乎,sqlite3在php 5.2和5.3里不一样

php手册里,sqlite3的函数是纯OO的东西,所以之前windows下开发的时候,sqlite3按手册走没问题
然后 sqlite3这个扩展默认没有编译进php5.2, pecl的东西没有尝试过编译,不知道效果(稍后再说)
但是昨天在Ubuntu下,apt-get了个 php5-sqlite3
本想按老套路走,结果写完代码一试,居然说sqlite3这个类不存在

get_declared_classes()也没有这个
然后 get_extension_funcs('sqlite3')看了看
Array
(
[0] => sqlite3_libversion
[1] => sqlite3_open
[2] => sqlite3_close
[3] => sqlite3_error
[4] => sqlite3_exec
[5] => sqlite3_query
[6] => sqlite3_changes
[7] => sqlite3_bind_int
[8] => sqlite3_bind_double
[9] => sqlite3_bind_text
[10] => sqlite3_bind_blob
[11] => sqlite3_bind_null
[12] => sqlite3_query_exec
[13] => sqlite3_fetch
[14] => sqlite3_fetch_array
[15] => sqlite3_column_count
[16] => sqlite3_column_name
[17] => sqlite3_column_type
[18] => sqlite3_query_close
[19] => sqlite3_last_insert_rowid
[20] => sqlite3_create_function
)


居然全。。。
只能慢慢改了

然后找空自己windows下编译一下pecl的sqlite3,不过貌似已经挪到php默认扩展里了

Wednesday, February 25, 2009

[不和谐]居然这个站被搞过了 :x

http://www.d***.gov.ph/
很无趣地 site:gov.ph filetype:php inurl:?id
然后找到的
很方便地检测出了注入,而且mysql版本是5
于是暴字段
出了点小问题,页面报错了,不过直接看不到,得看源码,于是在构造特征串的时候出了点麻烦
http://www.d***.gov.ph/faqdetails.php?id=41%20and%201=2%20union%20select%201,version(),user(),4,5,6--%20;
mysql 是 5.0.45, 非root连接
估计outfile没戏,而且magic quotes gpc是开着的,也不方便outfile

测试了几个文件,根目录下,test.php 不存在,但是 info.php存在,而且拿到了物理路径
直接load_file(),用之前的脚本转义字符串,很容易拿到了当前页面的源码,然后数据库的用户密码
管理目录在 _admin下,是因为mysql的连接文件扔进去的,于是看到了目录
既便如此,看到css里_script这样的目录名,也能猜到大概的命名规则

_admin目录下,默认文件不是index.php,于是直接查看表单,却发现,登陆文件是一个php rename 成了.htm
因为里边的php代码没解析
代码是很明显的php4风格,但是phpinfo的却是5.1的

直接暴hash,结果admin的没法用,benz的可以
而不幸的是
google benz的hash的时候,却发现,这个站已经被搞过了
https://forum.antichat.net/showthread.php?p=808554
:x

不好玩,一点都不好玩
不拿shell了

换目标去。。。

Tuesday, February 24, 2009

于是开始进入了rp逆向爆发期?

下午,莫名其妙的,门卡丢了,还有一张余额110+的公交卡
直到下班走人才发现。。

于是,很是担心,rp即将逆向爆发

即便收了那么多卡,当了那么多次好人,攒了那么多rp
只是,现实告诉我,rp是不能兑换的


下一个,遗失的,会是什么?

肉鸡丢了,代理没了,肉鸡丢了,代理没了,。。。。。。

GMail很和谐地,挂了

不知道 与 ** 有没有关系
只是,现在上不去了

和谐啊和谐

只是,连tunnel都上不去了

莫非google自己在和谐?

原来freebsd的鼠标还是有用的

shell下鼠标选中的文字,可以用shift+insert来粘贴
瞎试出来的
不知道用啥keywords搜,所以很长时间都没有找到用法的说明 :x

Monday, February 23, 2009

我只是觉得 miibeian 很2

网站主办者自行备案,告诉我们,只有IE6才能备案

然后首页就有的注入,真的很和谐啊

Saturday, February 21, 2009

前一篇写的真2

If you compare an integer with a string, the string is converted to a number. If you compare two numerical strings, they are compared as integers. These rules also apply to the switch statement.

/language.operators.comparison.html

== ?

一段代码
$a = 0; 

if ($a=='offline') {
echo 'OK';
} else {
echo 'noOK';
}


结果居然是 OK


试过了
offline -> offx
' -> "
$a == 'offline' -> 'offline' == $a
依旧

很诡异的 ==
翻源码

估摸着是强制转换的问题,因为 $a 初始化是个 0,也可以当成boolean false, 而off这个开头的字符串在强制转换成boolean / integer 的时候,估计被当成了 false / 0

待考证

...


[edit]
在php的源码中,对==这个operator的定义是 T_IS_EQUAL
/Zend/zend_language_parser.(ch) 中,只是 T_IS_EQUAL = 283
/Zend/zend_language_parser.y 中,
[code]Line=596
expr T_IS_EQUAL expr { zend_do_binary_op(ZEND_IS_EQUAL, &$$, &$1, &$3 TSRMLS_CC); }
[/code]
但是 对zend engine 不熟悉

不过,在php的/ext/filter/logical_filters.c中

void php_filter_boolean(PHP_INPUT_FILTER_PARAM_DECL) /* {{{ */
{
char *str = Z_STRVAL_P(value);
int len = Z_STRLEN_P(value);
int ret;

PHP_FILTER_TRIM_DEFAULT(str, len);

/* returns true for "1", "true", "on" and "yes"
* returns false for "0", "false", "off", "no", and ""
* null otherwise. */
switch (len) {
case 1:
if (*str == '1') {
ret = 1;
} else if (*str == '0') {
ret = 0;
} else {
ret = -1;
}
break;
case 2:
if (strncasecmp(str, "on", 2) == 0) {
ret = 1;
} else if (strncasecmp(str, "no", 2) == 0) {
ret = 0;
} else {
ret = -1;
}
break;
case 3:
if (strncasecmp(str, "yes", 3) == 0) {
ret = 1;
} else if (strncasecmp(str, "off", 3) == 0) {
ret = 0;
} else {
ret = -1;
}
break;
case 4:
if (strncasecmp(str, "true", 4) == 0) {
ret = 1;
} else {
ret = -1;
}
break;
case 5:
if (strncasecmp(str, "false", 5) == 0) {
ret = 0;
} else {
ret = -1;
}
break;
default:
ret = -1;
}

if (ret == -1) {
RETURN_VALIDATION_FAILED
} else {
zval_dtor(value);
ZVAL_BOOL(value, ret);
}
}
/* }}} */



还是不能说明问题




。。。。。。。

再说吧,找空再看


==============================================================

再次更新:
$a = 0; 

$t = 'offline';
#if ("xxxx" == $a)
if ($t == $a) {
echo 'OK';
} else {
echo 'noOK';
}

这样的代码,不管注释哪个if,都是返回OK

而,查看 php的源码 : /Zend/zend_operators.c里
	if (op1->type == IS_STRING && op2->type == IS_STRING) {

zendi_smart_strcmp(result, op1, op2);
COMPARE_RETURN_AND_FREE(SUCCESS);
}

if (Z_TYPE_P(op1) == IS_BOOL Z_TYPE_P(op2) == IS_BOOL
Z_TYPE_P(op1) == IS_NULL Z_TYPE_P(op2) == IS_NULL) {
zendi_convert_to_boolean(op1, op1_copy, result);
zendi_convert_to_boolean(op2, op2_copy, result);
ZVAL_LONG(result, ZEND_NORMALIZE_BOOL(Z_LVAL_P(op1) - Z_LVAL_P(op2)));
COMPARE_RETURN_AND_FREE(SUCCESS);
}

字符串的比较,要求两个变量都是字符串型
而下边的判断却是只需要任何一个为boolean或null即进行
而$a=0应该是符合这个条件的
于是,两个都被转换成了boolean
但是诡异的是,理论上说,'asdf'这样的,boolean应该为true啊
如果这里不符合的话,继续往后看

	/* If both are objects sharing the same comparision handler then use is */

if (eq_comp) {
if (Z_OBJ_HANDLE_P(op1) == Z_OBJ_HANDLE_P(op2)) {
/* object handles are identical, apprently this is the same object */
ZVAL_LONG(result, 0);
COMPARE_RETURN_AND_FREE(SUCCESS);
}
ZVAL_LONG(result, Z_OBJ_HT_P(op1)->compare_objects(op1, op2 TSRMLS_CC));
COMPARE_RETURN_AND_FREE(SUCCESS);
}

zendi_convert_scalar_to_number(op1, op1_copy, result);
zendi_convert_scalar_to_number(op2, op2_copy, result);

if (Z_TYPE_P(op1) == IS_LONG && Z_TYPE_P(op2) == IS_LONG) {
ZVAL_LONG(result, Z_LVAL_P(op1)>Z_LVAL_P(op2)?1:(Z_LVAL_P(op1) COMPARE_RETURN_AND_FREE(SUCCESS);
}
if ((Z_TYPE_P(op1) == IS_DOUBLE || Z_TYPE_P(op1) == IS_LONG)
&& (Z_TYPE_P(op2) == IS_DOUBLE || Z_TYPE_P(op2) == IS_LONG)) {
Z_DVAL_P(result) = (Z_TYPE_P(op1) == IS_LONG ? (double) Z_LVAL_P(op1) : Z_DVAL_P(op1)) - (Z_TYPE_P(op2) == IS_LONG ? (double) Z_LVAL_P(op2) : Z_DVAL_P(op2));
ZVAL_LONG(result, ZEND_NORMALIZE_BOOL(Z_DVAL_P(result)));
COMPARE_RETURN_AND_FREE(SUCCESS);
}


第一块儿的的判断,肯定不是了,对象的比较
再往后,就是一个强制转换为数字
如果这样的话,一个字符串,只要不是以数字开头的,转成数字,那就是0了
测试一下php的代码
$a = 0; 

$t = '0offline';
//$t = '1offline';
if ($t == $a) {
echo 'OK';
} else {
echo 'noOK';
}

结果很明显,况且php手册上也详细说了这个字符串->数字的转换原则
也就是说,这个原因发生在这里


==========================================
回过头再想,php手册里,按照字符串转数字的原则,就应该很容易判断出这个if的条件
而错误就发生在我们没考虑到这里的自动转换的过程


END




==========================================

最后,感谢 冰雪峰谷 提供的php代码测试,之前从没遇到过这种字符串转换、判断问题


然后补充感谢:叫兽同学中午的烤翅bg

Thursday, February 19, 2009

如此和谐

在***搜索上,搜了一下自己的ID,结果找到了一个一两年前的shell
一台windows主机
赶紧上去把shell rename了,然后把最后修改时间也改掉了

风起扬雪如沙

rt

我是搬运工

刚才闲着,把live spaces里的最近一年里能够拿出来的日志都给copy & paste过来了,不和谐的,还是乖乖的呆在live spaces里

[搬移]密码强度计算

http://sskaje.spaces.live.com/blog/cns!CD0E835D6C568521!909.entry
February 20, 2008


上网查了好几种算法,都不满意

最后根据几种算法,再加上最早就已经确定的加权的思想,把代码写成了

但是毕竟复杂度aaa111和a1a1a1是不一样的,可是目前的实力没法计算,只能用一些简单的count了

基本算法流程如下:

输入数据(密码字符串,用户名可选)=>

检查长度,小于4则出发错误;否则=>

检查用户名,如果case insensitive条件下和密码相同,直接报弱密码;否则=>

权值为密码长度*4=>

分别计算数字、特殊符号、大写字母、小写字母的个数=>

权值+= 数字个数 /6 * 4=>

权值+= 特殊符号个数 *4 =>

权值+=小写字母个数=>

权值+=大写字母个数*2=>

如果大小写都存在,则权值+=5 =>

如果数字加符号混合,权值+=15 =>

如果数字和字母混合,权值+=10 =>

如果字母和符号混合,权值+=15 =>

如果纯字母,权值-=10 =>

如果纯数字,权值-=15 =>

划定范围



现在这个权值的确定还是不合适,估计得花时间测试;而且范围的确定也不太好

基本确定了5级:weak, medium, good, strong, insane

目前的密码除了********算是weak,其他至少都是medium,insane的不少



第一次写了个ajax

用了prototype

比较了下prototype和jQuery的例子,发现前者比较适合自己的编程风格

(jQuery最早是soff告诉我的,而且联盟用的就是,还在关注...)

发现用了框架,开发真的很简单

继续Recoding...

[搬移]汉化了一个软件

http://sskaje.spaces.live.com/blog/cns!CD0E835D6C568521!905.entry
February 16, 2008


TrayIt!

一个使用Hook将窗体最小化到系统托盘的工具

很不错的

但是默认没有汉语的语言配置,索性就自己翻译了一个,虽然很多词实在想不出来用什么汉语表示

一直都是只可意会的

总之,汉化完了

虽然英文版对我而已没有任何障碍

另外,作者的typo实在太多了

[搬移]UnrealIRCd 密码生成

http://sskaje.spaces.live.com/blog/cns!CD0E835D6C568521!910.entry
February 21, 2008

密码块支持的格式可以为 password {[AUTH-TYPE;]};
默认都是明文的,所以可选的[]内容为空,如Oper block的password "31343540";
但是为安全考虑,必须对密码进行加密
unrealircd支持的格式有crypt, md5, and sha1, ripemd-160
最开始以为用函数直接生成就行了,但是系统始终报Incorrect password
查了查文档,没找到;翻了翻论坛,看到一个/mkpasswd,参数格式是 /mkpasswd AUTHTYPE PASSWORD
执行需要有Oper的权限
目前已经把IRCd的NetAdmin密码加密了,还有restart和die的,只是这两个的权限都没分配

OVER

[搬移]the comparision of scrambled words ...

http://sskaje.spaces.live.com/blog/cns!CD0E835D6C568521!911.entry
February 21, 2008


for HTS prog mission 1, find unscrambled words from a wordlist

three ways available:

a) compare the checksum

b) compare the string after been sorted

c) split to array and then use array_diff



for a) : 1278 lines of wordlist, but less than 800 different checksums, this way is somewhat fast but not very accurate.

for b) : i coded a sort function to sort a string, then loop comparing it with sorted strings from the wordlist line by line, this takes about 1.02s.

for c) : a function like this:

function diff($string1, $string2)
{
return array_diff(str_split($string1, 1), str_split($string2, 1));
}

the main part of the two php scripts are almost the same, but in this way it only takes about 0.23s to find unscrambled words from the 1278-line-txt-wordlist file.

[搬移]诡异地把php-gtk编译好了

http://sskaje.spaces.live.com/blog/cns!CD0E835D6C568521!937.entry
March 06, 2008

命名按照当时在3.3上配的环境,但是每次编译都error

而且代码还调用了一个php脚本生成文件

差一点准备手工改那个.c和dsp了

刚才特意注意了下编译的错误信息,居然发现是环境变量的目录的问题,因为从网上下的zip包的lib和include的gtk都太老了,所以又把新的那部分给覆盖了过去,而且还把cairo也放到了include下



目前扩展只编译成功了php_gtk2.dll和php_gtk_extra2.dll,其他的估计得等相关的win32版本出来才行

等待吧...

[搬移]Enable Http Proxy for pear/pecl command on M$ windows

http://sskaje.spaces.live.com/blog/cns!CD0E835D6C568521!966.entry
March 30, 2008

set http_proxy=http://user:pass@10.1.8.9:38080


然后就可以

pear download DB

[搬移]清除CCProxy日志

http://sskaje.spaces.live.com/blog/cns!CD0E835D6C568521!1006.entry
May 10, 2008

唉,代理丢了。。。

只能用ad上国际了



10.1.8.10的ad,暂时还是用ccproxy开代理做限制的

然后,按帐户,记录日志



不想留下记录



    $dir = 'D:/CCProxy/Log'; //定义日志目录 

$files = glob($dir.'/log*.txt');//日志文件
foreach($files as $value)//循环
{
$mtime = filemtime($value);//获取修改时间
$contents = file_get_contents($value);//获取文件内容
$contents = preg_replace('/\[\d{4}\-\d{2}\-\d{2} \d{2}:\d{2}:\d{2}\] \d+\.\d+\.\d+\.\d+ sskaje.*\n/', '', $contents);//替换为空
file_put_contents($value, $contents);//写入
$file = file($value);//重新获取
$file[0] = (count($file)-1) . "\r\n";//计算行数
file_put_contents($value, implode('', $file));//重新写入
touch($value, $mtime, $mtime);//恢复修改时间
}
?>

[搬移]Build PHP's Extensions with VS 2005

http://sskaje.spaces.live.com/blog/cns!CD0E835D6C568521!1030.entry
June 16, 2008


习惯了编译ImageMagick的PHP API,经常遇到编译错误
不过这些错误也就只有在VC6下才会有
而且,VC6,实在太老了
索性,迁移吧

看了看php官方文档,确认用vs05编译可行
然后,03的虚拟机花了3个小时装了VS05,打了sp1
再装了Intel C++ Compiler
接下来,先编译ImageMagick,没问题,一切正常,编译比较顺利
不过想用Intel C++ Compiler编译的时候,发现错误实在太多了
应该是intel的东西对语法要求比较严格吧

嗯,把php的编译环境搭好,先编译resolv.lib,很轻松,dsw直接转sln就可以编译了
然后,配好win32build,加好环境变量
又把扩展的相关文件拷过去了
基本还是vc6下的一套东西

编译,不行,出错
C:\Program Files\Microsoft Visual Studio 8\VC\INCLUDE\sys/stat.inl(49) : error C
2466: cannot allocate an array of constant size 0
C:\Program Files\Microsoft Visual Studio 8\VC\INCLUDE\sys/utime.inl(39) : error
C2466: cannot allocate an array of constant size 0
这种错误
无语
没见过
上网查,baidu甭想了
google,没有明确的东西
但是看到了php 的bug report里有个 http://bugs.php.net/bug.php?id=39130
定位到了main/config.w32.h

/* vs.net 2005 has a 64-bit time_t. This will likely break
* 3rdParty libs that were built with older compilers; switch
* back to 32-bit */
#define _USE_32BIT_TIME_T 1
#define HAVE_STDLIB_H 1

看到了块注释的部分,嗯,把这个第一行注释掉就行了

然后,imagick,magickwand顺利编译
eaccelerator的,还得在svn里吧fnmatch的.c和.h都拷过来才能编译

[搬移]双重路由 ?

http://sskaje.spaces.live.com/blog/cns!CD0E835D6C568521!1044.entry
July 20, 2008

为了让自己的emule运行在highid下,没辙了,配路由映射吧

首先,IP段换了,从10.1.8.0/23变成了 10.1.16.0/23,三个屋
结果吧,我想大家都在一个教研室/实验室,出问题了很容易查到人,索性就把ARP的规则去了吧
好吧,那就去了
结果,早上才发现,还是有台机器中毒了,而那台机器很和谐地ARP,而QQ/MSN又很和谐的用IE的核走HTTP传数据
然后就很和谐地中毒了
XD

okay
然后,新的VPN/代理也从 10.1.8.10 -> 10.1.16.10
首先,VPN拨号进去,分配的是一个静态的地址,这个VPN是在windows 2003上用路由和远程访问配置的,主要作用是做NAT,只是我觉得无非多点几个checkbox而已,还不至于麻烦到懒得配VPN,索性VPN也就上去了
okay,电驴用的是6251端口,随机的,也就定下来了
由于NAT已经配好了,现在开始设置
“IP路由选择”里边选“NAT/基本防火墙”,在右边的主窗口选择公网的网卡,右击,属性
在“服务和端口”标签页里,“添加”,“服务描述”随便填,因为前一个窗口的IP池没配置,所以这里第一个radio只有一个可用选项
协议,TCP
“传入端口”填6251,“专用地址”填172.16.0.123
这个是VPN静态设置的IP
“传出端口”也填6251

确定
这一块就搞定了

然后,路由器
Dlink的DI-704P
之前尝试特殊应用程序,而没有选择虚拟服务器
因为前者实在弄不懂是干嘛的,而后者就是标准的路由端口映射
结果发现填的数据不是自己想要的
所以选择了虚拟服务器
添加项目即可

然后
http://www.emule.org.cn/porttest/?tcpport=6251&submit=%B2%E2%A1%A1%CA%D4
测试
嗯,成功

两次连接的日志
2008-7-20 1:52:56: 正在连接到 no1.eserver.emule.org.cn (no1.eserver.emule.org.cn:8080 - 正在使用模糊协议)...
2008-7-20 1:52:56: 连接到no1.eserver.emule.org.cn(no1.eserver.emule.org.cn:8080),发送登陆请求
2008-7-20 1:53:07: 警告 no1.eserver.emule.org.cn (no1.eserver.emule.org.cn:8080) - You have a lowid. Please review your network config and/or your settings.
2008-7-20 1:53:07: 模糊连接已经建立在: no1.eserver.emule.org.cn (no1.eserver.emule.org.cn:8080)
2008-7-20 1:53:07: 新的客户ID为 2546274

2008-7-20 1:55:32: 正在连接到 no1.eserver.emule.org.cn (no1.eserver.emule.org.cn:8080 - 正在使用模糊协议)...
2008-7-20 1:55:32: 连接到no1.eserver.emule.org.cn(no1.eserver.emule.org.cn:8080),发送登陆请求
2008-7-20 1:55:32: 模糊连接已经建立在: no1.eserver.emule.org.cn (no1.eserver.emule.org.cn:8080)
2008-7-20 1:55:32: 新的客户ID为 1329300446

[搬移]编译 curl with openssl && zlib

http://sskaje.spaces.live.com/blog/cns!CD0E835D6C568521!1047.entry
July 23, 2008


编译 curl with openssl && zlib
首先下载源码文件
zlib-1.2.3
openssl-0.9.8h
curl-curl-7.18.2
解压之后,形成如下目录树:
build -
curl -
curl-7.18.2
openssl
-
openssl-0.9.8h
zlib
-
zlib-1.2.3

zlib:
用MSVS2005 的command prompt启动
进入zlib的源码目录,执行
nmake -f win32/Makefile.msc
执行完成不必做多余操作

openssl:
首先得安装Perl并添加到path变量中
接下来
perl Configure VC-WIN32 --prefix=E:/build/openssl/openssl
为编译curl的openssl支持,得静态编译
所以
nmake -f ms\nt.mak
nmake -f ms\nt.mak install

curl:
cd进入目录,这里我们首先得编译libcurl
进入lib目录
修改Makefile.vc8
!IFNDEF ZLIB_PATH
ZLIB_PATH = ../../../zlib/zlib-1.2.3
!ENDIF
!IFNDEF OPENSSL_PATH
OPENSSL_PATH = ../../../openssl/openssl-0.9.8h
!ENDIF
然后执行
nmake /f makefile.vc8 CFG=release-ssl-zlib
进行release版的静态编译
完毕之后当前目录会有个 libcurl.lib
这里很诡异的事情,如果直接用vc6的dsw文件生成的文件在release\curllib.lib
而用makefile.vc6/8则是libcurl.lib,不知道写makefile的人咋想的
然后回到 curl-7.18.2/src
继续
nmake -f Makefile.vc8 cfg=release-ssl-zlib
完毕,当前目录就有个curl.exe,就是静态编译后的版本

[搬移]关于PHP的标签闭合

http://sskaje.spaces.live.com/blog/cns!CD0E835D6C568521!1321.entry
November 26, 2008

犯错了才会明白

原来不闭合的一大好处是,防止出现无谓的空字符

在OB启用的情况下,页面没有太大差别

但是如果是其他类型的mimetype -> header,例如图片。。。

所以,现在没事,不再闭合标签

[搬移] PHP 5.3 新 Namespace 初探

http://sskaje.spaces.live.com/blog/cns!CD0E835D6C568521!1337.entry
December 06, 2008


白天的时候,收到邮件,PHP5.2.7正式发布了,经历了5个RC。同时,早几分钟,PHP5.3的Alpha3也正式发布了。诡异的是居然把Alpha4放在RC的栏目里。

从官网新闻的说明,最重要的更新,第一项就是namespace,而且按官网所说,相关文档已经更新。
翻了翻相关的文档部分,一个最大的区别,操作符的变化。毕竟以前只是简单地拿文档的用例做过测试,并没有尝试在自己的代码里加入相关内容,所以对细节的东西了解还是不多,但是操作符号的变化,最直观。

前一个版本的文档中,namespace的操作符也是所谓的 Scopes Resolution Operator, 即 ::;但是新的版本中,已经换成了反斜杠 \
于是,子空间的用法类似 namespace NameSpace\SubNameSpace,namespace中全局函数的标准调用方法 \strlen($string)

脚本文件中,namespace语句的启用,必须保证前面没有declare之外的使用,多个namespace的时候只要处理第一个。
顺道一句,ticks按计划,在5.3中已经被deprecated了,而在6中将移除。
但是同时这里又多了一个项目,encoding,形如 declare(encoding='UTF-8');

然后,部分调用的用法,如use,暂时还没测试。


EDIT: 并非所有的global函数都得用\来调用,事实是,某些根本不能这样用,不确定是不是namespace的机制还没写好,测试了,require_once, isset之类的“函数”是没法这样的,必须直接调用,否则就有个T_STRING的错误。毕竟这些不是真正的函数。http://www.php.net/manual/en/reserved.php

[搬移]test for get_called_class();

http://sskaje.spaces.live.com/blog/cns!CD0E835D6C568521!1345.entry
December 25, 2008

class ap {
public function ap_call() {
echo "\t", get_called_class(), "\n";
}

public function ap_sub_call_p() {
$p = new p;

$p->p_call();
}

public function ap_sub_call_c() {
$c = new c;

$c->c_call();
}
}

class p extends ap{
public function p_call() {
echo "\t", get_called_class(), "\n";
}

public function p_parent_call_ap() {
$ap = new ap;

$ap->ap_call();
}

public function p_sub_call_c() {
$c = new c;

$c->c_call();
}
}

class c extends p {
public function c_call() {
echo "\t", get_called_class(), "\n";
}

public function c_parent_call_p() {
$p = new p;

$p->p_call();
}

public function c_parent_call_ap() {
$ap = new ap;

$ap->ap_call();
}
}

$ap = new ap;
$p = new p;
$c = new c;

echo "These are called in/from ap:\n";
$ap->ap_call();
$ap->ap_sub_call_p();
$ap->ap_sub_call_c();

echo "\n\nThese are called in/from p:\n";
$p->p_call();
$p->p_parent_call_ap();
$p->p_sub_call_c();
echo "These are inherit from ap:\n";
$p->ap_call();
$p->ap_sub_call_p();
$p->ap_sub_call_c();

echo "\n\nhese are called in/from c:\n";
$c->c_call();
$c->c_parent_call_ap();
$c->c_parent_call_p();

echo "These are inherit from p:\n";
$c->p_call();
$c->p_parent_call_ap();
$c->p_sub_call_c();

echo "These are inherit from ap:\n";
$c->ap_call();
$c->ap_sub_call_p();
$c->ap_sub_call_c();

/*
result:

These are called in/from ap:
ap
p
c


These are called in/from p:
p
ap
c
These are inherit from ap:
p
p
c


hese are called in/from c:
c
ap
p
These are inherit from p:
c
ap
c
These are inherit from ap:
c
p
c
*/

[搬移]Smarty Error: Fatal error: Call to undefined function _smarty_tplfunc_*********()

http://sskaje.spaces.live.com/blog/cns!CD0E835D6C568521!1347.entry
January 01, 2009


Fatal error: Call to undefined function _smarty_tplfunc_d7b98222edd24b4c42c830151342bfe2_0() in G:\wwwroot\vhosts\Newborn\include\class\externals\smarty\libs\Smarty.class.php on line 1828


出错在缓存开启的时候
只要把编译的模板和缓存都清掉就行了

[搬移]mysql error 121 when creating tables

http://sskaje.spaces.live.com/blog/cns!CD0E835D6C568521!1346.entry
December 26, 2008



一个原因是外键名重复,改个名就行了

[搬移]很2的开socks代理方式 :X

http://sskaje.spaces.live.com/blog/cns!CD0E835D6C568521!1348.entry
January 03, 2009



ssh localhost -f -N -D0.0.0.0:31080 -g

然后输密码

虽然会有错误提示,但是可以正常用 :X

netstat -anp | more 看看就知道了

省去了开客户端的麻烦

[搬移] mysql error when using symlink to share databases

搬移自 http://sskaje.spaces.live.com/blog/cns!CD0E835D6C568521!1349.entry
January 07, 2009


working under ubuntu.
just wanna make mysql databases created under m$win can be used.
1st, fstab, just to mount the partition automatically
2nd, symlink, #/var/lib/mysql, do 'ln -s /media/App/Server/MySQL/MySQL\ Server\ 5.1/data/forum forum'
3rd, restart mysql.
vbb reports a fatal error; when using mysql client, show tables would report an error like '
mysql> show tables;
ERROR 1018 (HY000): Can't read dir of './forum/' (errno: 13)
'

why ?

iv already chown mysql\: to that directory.

er...

apparmor...

check the /etc/apparmor.d/usr.sbin.mysqld, add some lines to make that directory readable/writable to mysqld.

差点要人命

刚才手抖,tar之前,shift delete了刚写好的模板功能的代码 :X

幸好及时恢复

唉。。。。

差点要人命了

Wednesday, February 18, 2009

移动 “e100欢乐嘉年华” 。。。

代码没有任何技术含量,费事的主要是在分析页面的代码上边。

大概是2008.11.06,周四晚上,联盟上第一次看到帖子,只是尝试着按帖子的说明找了找,速度不快,但是发现页面的代码都很类似,而且固定发往一个页面,只是提交参数不同而已。于是直接尝试构造post,但是当时记得如果不构造referer,就没法成功,于是是一个页面一个页面地找,找着了,记录url和post的url参数。完成之后,写了个curl,然后一个循环,post了。因为当时自己一个一个测试的,拿到了,便找同学的手机号来测试,效果还不错。
基本流程,是提交cookies,然后构造post包。因为验证码的原因,虽然那个验证码按说也不难过,只是ocr一直没写完,索性就走最省事的路子了。
一开始,写了个cli版,然后扔联盟,提供下载,结果回帖的最多的却是在问怎么配php环境。然后赶着出了个web版,便开始收好人卡。。
第二次,12月初,然后代码没动,有人先试了,结果成功了,于是赶着抢,代码也没怎么动,只是有人催着说弄个神州行的,于是继续收好人卡。
第三次,本来改规则了,但是,却在元旦的时候提前放出了个没改规则的版本,紧接着1.4的时候,说之前的那个没改规则的无效。新的一期继续有效,不过好消息是有人打了移动的专家线,得到的答复是会继续发。
然后刚才,第四次。。。。。

一二次中间,还有个答题的活动,还有个passport的,好多好多

这么一算来,目前总共估计拿到了200的花费了,至少也有180吧,如果再算上即将来的这个30+10,哇咔咔


然后,代码稍后编辑
再然后,准备无聊的讨论,关于所谓的抽奖算法 :X

Tuesday, February 17, 2009

下雪了

等了一年多,终于有见到了雪花,飘着,很漂亮,很舒服
just let it snow coz i love snow.

Friday, February 13, 2009

我的榴莲啊。。。。

我只是想放两天催熟的。。。。
我都用塑料袋扎得严严实实的了。。。。。
我都。。。。。
结果晚上一看,起毛了。。。。。。
:s

我突然想。。。。。。

我突然想,要是把seer给的那个xls的所有关键字都放上来会怎样。。。。。。。。。。XD

Thursday, February 12, 2009

久旱逢甘霖

据说北京已经白日无雨了,更不用想雪了。天气干得让人难受,无法忍受,再加上闹肚子这茬刚过去,现在又有点上火,百事不顺,事事不顺。。。
应该是人工降雨吧,因为从前几天的天气来看,没有明显的下雨迹象,再加上有人说很多地方都在人工降雨,估摸着,北京这次也是。

早起,天阴阴的。昨晚9:40左右就上床了,然后睡到12:40左右,醒了,上网,然后水了会儿,又torrent了524,看了,挺无聊的,于是两个小时过去了,继续睡觉,再次醒来已经是8:27了。
磨磨蹭蹭地弄到9点,才肯出门,有想法走到公司,但是走着走着,放弃了。诡异的是,正要下东门的天桥的时候,发现前面一人居然是力力,好假,好假。于是又26到中关村西,无聊了一天,等到下午快下班的时候,包子的电话,叫吃饭,然后天放也要来送书,但是电话始终打不通。半个小时的时间,全在用来召唤吃饭,但是cs去fb来了,谢导还在火车上,只能选择走人。此时刚过下班时间。

下了电梯,走到门外,突然发现,雨还不小。虽然在南方这点雨不算什么,但是这里毕竟是北京。
本想去等106,但是突然一个年头,转身往西,冒雨往回走。
眼镜的坏处再次充分的暴露出来,路上几乎一大半的时候,都是把眼镜拿在手上的,虽然眼前看不清,但是比戴着看不见好。车多,人多,积水多,整个世界都是黑色的。半个多小时,很慢地速度,走回了学校,上身差点湿透了,头发就跟洗过似的,全是水,电脑包的上面一块儿,也都湿了,突然想着为啥没买那种有防雨罩的,唉。

Tuesday, February 10, 2009

unset $_COOKIE会导致session id没法获取

自定义的Session Handler, 用MySQL的一个Memory表,用session_id()获取session id;
又写了个类接管gpc的变量获取,然后中间先过滤一道,为保证数据安全,就在构造的时候

private function __construct()
{
$this->_get = & $_GET;
$this->_post = & $_POST;
$this->_request = & $_REQUEST;
$this->_cookie = & $_COOKIE;
$this->_files = & $_FILES;

unset($_GET, $_POST, $_REQUEST, $_COOKIE, $_FILES);
}

结果导致页面查询从2个变成了3个,把sql log下来一看,在read的时候每次都新插入一个新的session行。

由于gpc的这个类相对比较底层,于是调用初始化的优先级比较高,先于 session handler 的初始化,结果导致 session id 没法正常获取


解决方案:把变量的unset单独出一个 public function,然后初始化session后,调用

Monday, February 9, 2009

#不?欢乐过元宵#

肚子难受了两天,今天稍微好了些
下午去了趟公司
然后

http://kiss.bitunion.org/thread-10116847-1-1.html

Saturday, February 7, 2009

返校了。。。

昨天。
早上9点多起来,玩了会儿,就上街去买了点路上吃的东西,不算多,但是已然做好吃不完的打算。完事之后,去了趟外婆家,前一天晚上小猪猪打电话,还说想我,受不了了:X
上街的时候,发现广场那儿貌似在做活动,没心思看,便速速买东西,速速回来。
中午吃饭前半个多小时,看到五金厂那儿有游龙的,便把小猪猪带着去看,而据说广场上午的活动是几个乡下的龙比赛还是怎么回事。
中午吃完饭回家,收拾了东西,继续玩,等到3:50,电话来了,坐车出发,目的地瑞昌,然后倒晚上火车。
不幸的是,据说出门前20分钟,广场那儿,菜市场门口,撞死人了,两条人命。。。。。
坐车经过那儿的时候,地上还看到有两滩血,旁边好像有火葬场的车 :x
很惨,很不和谐。。。。。

然后去瑞昌,倒是很和谐,没什么事情发送,只是,路上发现,彭泽的建设,真是烂,跟湖口的差距已经不是一点半点了。唉。
两个小时左右,到了瑞昌。去粮食局。老爸一个系统的同事埋单。吃完,他们去KTV,唱歌,我实在忍受不了他们的那种*****,于是和老妈出去逛了一大圈,逛到柳湖,走湖中间的路,经过湖心的一个小岛,然后绕到另外一侧。
瑞昌很大,很大,只是城区人口密度看着不高,也不知道是不是过年的原因,反正觉得整个城区很空。
逛得很快,不到一个小时,此时晚8点,还有两个半小时车才到,他们说晚上10点才出发。在包房里听那帮人的不着调的k歌,完全崩溃了:x

晚上火车,人不少,跟回来那次,车厢号差了一,座位号也是差了一
人多啊,睡不着。又是一个小时,一个小时,半睡着,半醒着。
15个多小时,折磨啊。
而且又闹肚子了。。。
难受。。。。
一直在忍着。。。

zomg

还是好困。。。

Thursday, February 5, 2009

移动三期发钱了 :D

又一条短信,30块钱
哇咔咔

昨天帮LY试,结果估计晚点了,然后“没抽中”,无奈了

等第四期咯

Wednesday, February 4, 2009

MySQL Stored Procedures And Functions for Subnet Check

写了几个mysql 的sp和func,检测IP段
好久没写过sp了,上次写的时候,还是两年前了
远程进了学校,上服务器拿了库里的sp代码,看了看,便开始写了
function是第一次写,是写完sp之后,改写的,只是有个sp实在没辙,两个返回值,没找到合适的手段用function实现,只能用sp了


版本1 - sp: ====================================================
DELIMITER $$
-- ip_parser: split ip/cidr with /
-- param: IN ip_with_cidr VARCHAR(18) 输入的IP/CIDR数据
-- param: OUT ip VARCHAR(15) 输出的IP
-- param: OUT cidr VARCHAR(2) 输出的cidr
DROP PROCEDURE IF EXISTS ip_parser;
CREATE PROCEDURE ip_parser(IN ip_with_cidr VARCHAR(18), OUT ip VARCHAR(15), OUT cidr VARCHAR(2))
BEGIN
-- 正则匹配有cidr的数据
IF (SELECT ip_with_cidr REGEXP '^([0-9]{1,3}\.){3}[0-9]{1,3}\/[0-9]{1,2}$')
THEN
SELECT substring_index(ip_with_cidr, '/', 1) INTO ip;
SELECT substring_index(ip_with_cidr, '/', -1) INTO cidr;
-- 如果没有cidr则直接赋值32
ELSEIF (SELECT ip_with_cidr REGEXP '^([0-9]{1,3}\.){3}[0-9]{1,3}$')
THEN
SELECT ip_with_cidr INTO ip;
SELECT '32' INTO cidr;
-- 否则全部置0即允许全部
ELSE
SELECT 0 INTO ip;
SELECT 0 INTO cidr;
END IF;
END; $$


-- 判断提交的IP是否属于提交的ip段
-- param: IN ip VARCHAR(15) 目标IP
-- param: IN ip_with_cidr VARCHAR(18) 目标IP段
-- param: OUT ret TINYINT(1) 返回值
DROP PROCEDURE IF EXISTS in_subnet;
CREATE PROCEDURE in_subnet(IN ip VARCHAR(15), IN ip_with_cidr VARCHAR(18), OUT ret TINYINT(1))
BEGIN
CALL ip_parser(ip_with_cidr, @t_ip, @t_cidr);

CALL get_subnet(@t_ip, @t_cidr, @subnet);
CALL get_subnet(ip, @t_cidr, @test_subnet);
-- 分别计算两个子网号,然后比较
SELECT @subnet = @test_subnet INTO ret;
END; $$

-- 根据提交的IP和CIDR返回子网号
-- param: IN ip VARCHAR(15) 目标IP
-- param: IN cidr VARCHAR(2) 目标CIDR
-- param: OUT subnet_addr VARCHAR(15) 返回的子网号
DROP PROCEDURE IF EXISTS get_subnet;
CREATE PROCEDURE get_subnet(IN ip VARCHAR(15), IN cidr VARCHAR(2), OUT subnet_addr VARCHAR(15))
BEGIN
-- 将cidr转换成子网掩码
CALL cidr2mask(cidr, @mask);

CALL ip2long(ip, @ip_ints);
CALL ip2long(@mask, @mask_int);
-- 用IP和子网掩码按位与,生成子网号
CALL long2ip(@ip_ints & @mask_int, subnet_addr);
END; $$

-- 将cidr转换成mask,懒得用字符串处理,就直接case when了,看着还清楚些
-- param: IN cidr VARCHAR(2) 输入的cidr
-- param: OUT mask_addr VARCHAR(15) 输出的子网掩码
DROP PROCEDURE IF EXISTS cidr2mask;
CREATE PROCEDURE cidr2mask(IN cidr VARCHAR(2), OUT mask_addr VARCHAR(15))
BEGIN
CASE cidr
WHEN '0' THEN SELECT '0.0.0.0' INTO mask_addr;
WHEN '1' THEN SELECT '128.0.0.0' INTO mask_addr;
WHEN '2' THEN SELECT '192.0.0.0' INTO mask_addr;
WHEN '3' THEN SELECT '224.0.0.0' INTO mask_addr;
WHEN '4' THEN SELECT '240.0.0.0' INTO mask_addr;
WHEN '5' THEN SELECT '248.0.0.0' INTO mask_addr;
WHEN '6' THEN SELECT '252.0.0.0' INTO mask_addr;
WHEN '7' THEN SELECT '254.0.0.0' INTO mask_addr;
WHEN '8' THEN SELECT '255.0.0.0' INTO mask_addr;
WHEN '9' THEN SELECT '255.128.0.0' INTO mask_addr;
WHEN '10' THEN SELECT '255.192.0.0' INTO mask_addr;
WHEN '11' THEN SELECT '255.224.0.0' INTO mask_addr;
WHEN '12' THEN SELECT '255.240.0.0' INTO mask_addr;
WHEN '13' THEN SELECT '255.248.0.0' INTO mask_addr;
WHEN '14' THEN SELECT '255.252.0.0' INTO mask_addr;
WHEN '15' THEN SELECT '255.254.0.0' INTO mask_addr;
WHEN '16' THEN SELECT '255.255.0.0' INTO mask_addr;
WHEN '17' THEN SELECT '255.255.128.0' INTO mask_addr;
WHEN '18' THEN SELECT '255.255.192.0' INTO mask_addr;
WHEN '19' THEN SELECT '255.255.224.0' INTO mask_addr;
WHEN '20' THEN SELECT '255.255.240.0' INTO mask_addr;
WHEN '21' THEN SELECT '255.255.248.0' INTO mask_addr;
WHEN '22' THEN SELECT '255.255.252.0' INTO mask_addr;
WHEN '23' THEN SELECT '255.255.254.0' INTO mask_addr;
WHEN '24' THEN SELECT '255.255.255.0' INTO mask_addr;
WHEN '25' THEN SELECT '255.255.255.128' INTO mask_addr;
WHEN '26' THEN SELECT '255.255.255.192' INTO mask_addr;
WHEN '27' THEN SELECT '255.255.255.224' INTO mask_addr;
WHEN '28' THEN SELECT '255.255.255.240' INTO mask_addr;
WHEN '29' THEN SELECT '255.255.255.248' INTO mask_addr;
WHEN '30' THEN SELECT '255.255.255.252' INTO mask_addr;
WHEN '31' THEN SELECT '255.255.255.254' INTO mask_addr;
WHEN '32' THEN SELECT '255.255.255.255' INTO mask_addr;
-- 不合法的全都用 255.255.255.255
ELSE SELECT '255.255.255.255' INTO mask_addr;
END CASE;
END; $$

-- 将IP转换为long int
-- param: IN ip VARCHAR(15) 输入IP
-- param: OUT ip_int INTEGER(12) UNSIGNED 输出整数
DROP PROCEDURE IF EXISTS ip2long;
CREATE PROCEDURE ip2long(IN ip VARCHAR(15), OUT ip_int INTEGER(12) UNSIGNED)
BEGIN
-- 定位点分的位置
SET @int_pos_dot_1 = LOCATE('.', ip, 1);
SET @int_pos_dot_2 = LOCATE('.', ip, @int_pos_dot_1+1);
SET @int_pos_dot_3 = LOCATE('.', ip, @int_pos_dot_2+1);
-- 切割
SET @part_1 = SUBSTRING(ip, 0+1, @int_pos_dot_1-1);
SET @part_2 = SUBSTRING(ip, @int_pos_dot_1+1, @int_pos_dot_2-@int_pos_dot_1-1);
SET @part_3 = SUBSTRING(ip, @int_pos_dot_2+1, @int_pos_dot_3-@int_pos_dot_2-1);
SET @part_4 = SUBSTRING(ip, @int_pos_dot_3+1);
-- 计算
SELECT @part_1 * 16777216 + @part_2 * 65536 + @part_3 * 256 + @part_4 INTO ip_int;
END; $$

-- 将long int转换为点分IP格式
-- param: IN ip_int INTEGER(12) UNSIGNED 输入整数
-- param: OUT ip VARCHAR(15) 输出IP
DROP PROCEDURE IF EXISTS long2ip;
CREATE PROCEDURE long2ip(IN ip_int INT(12) UNSIGNED, OUT ip VARCHAR(15))
BEGIN
-- 计算
SET @part_1 = ip_int DIV 16777216;
SET @modulo = ip_int % 16777216;
SET @part_2 = @modulo DIV 65536;
SET @modulo = @modulo % 65536;
SET @part_3 = @modulo DIV 256;
SET @part_4 = @modulo % 256;
-- 合并
SELECT CONCAT_WS('.', @part_1, @part_2, @part_3, @part_4) INTO ip;
END; $$

DELIMITER ;


=====================================================================



版本 2 - func: ip_parser还是sp的版本,因为返回值的原因===============================


-- ip_parser: split ip/cidr with /
-- param: IN ip_with_cidr VARCHAR(18) 输入的IP/CIDR数据
-- param: OUT ip VARCHAR(15) 输出的IP
-- param: OUT cidr VARCHAR(2) 输出的cidr
DROP PROCEDURE IF EXISTS ip_parser;
CREATE PROCEDURE ip_parser(IN ip_with_cidr VARCHAR(18), OUT ip VARCHAR(15), OUT cidr VARCHAR(2))
BEGIN
-- 正则匹配有cidr的数据
IF (SELECT ip_with_cidr REGEXP '^([0-9]{1,3}\.){3}[0-9]{1,3}\/[0-9]{1,2}$')
THEN
SELECT substring_index(ip_with_cidr, '/', 1) INTO ip;
SELECT substring_index(ip_with_cidr, '/', -1) INTO cidr;
-- 如果没有cidr则直接赋值32
ELSEIF (SELECT ip_with_cidr REGEXP '^([0-9]{1,3}\.){3}[0-9]{1,3}$')
THEN
SELECT ip_with_cidr INTO ip;
SELECT '32' INTO cidr;
-- 否则全部置0即允许全部
ELSE
SELECT 0 INTO ip;
SELECT 0 INTO cidr;
END IF;
END; $$

-- 判断提交的IP是否属于提交的ip段
-- param: ip VARCHAR(15) 目标IP
-- param: ip_with_cidr VARCHAR(18) 目标IP段
-- return: TINYINT(1) 返回值
DROP FUNCTION IF EXISTS in_subnet;
CREATE FUNCTION in_subnet(ip VARCHAR(15), ip_with_cidr VARCHAR(18))
RETURNS TINYINT(1) DETERMINISTIC
BEGIN
CALL ip_parser(ip_with_cidr, @t_ip, @t_cidr);
-- 分别计算两个子网号,然后比较
RETURN get_subnet(@t_ip, @t_cidr) = get_subnet(ip, @t_cidr);
END; $$

-- 根据提交的IP和CIDR返回子网号
-- param: ip VARCHAR(15) 目标IP
-- param: cidr VARCHAR(2) 目标CIDR
-- return: subnet_addr VARCHAR(15) 返回的子网号
DROP FUNCTION IF EXISTS get_subnet;
CREATE FUNCTION get_subnet(ip VARCHAR(15), cidr VARCHAR(2))
RETURNS VARCHAR(15) DETERMINISTIC
BEGIN
-- 用IP和子网掩码按位与,生成子网号
RETURN long2ip(ip2long(ip) & ip2long(cidr2mask(cidr)));
END; $$

-- 将cidr转换成mask,懒得用字符串处理,就直接case when了,看着还清楚些
-- param: cidr VARCHAR(2) 输入的cidr
-- return: mask_addr VARCHAR(15) 输出的子网掩码
DROP FUNCTION IF EXISTS cidr2mask;
CREATE FUNCTION cidr2mask(cidr VARCHAR(2))
RETURNS VARCHAR(15) DETERMINISTIC
BEGIN
CASE cidr
WHEN '0' THEN RETURN '0.0.0.0';
WHEN '1' THEN RETURN '128.0.0.0';
WHEN '2' THEN RETURN '192.0.0.0';
WHEN '3' THEN RETURN '224.0.0.0';
WHEN '4' THEN RETURN '240.0.0.0';
WHEN '5' THEN RETURN '248.0.0.0';
WHEN '6' THEN RETURN '252.0.0.0';
WHEN '7' THEN RETURN '254.0.0.0';
WHEN '8' THEN RETURN '255.0.0.0';
WHEN '9' THEN RETURN '255.128.0.0';
WHEN '10' THEN RETURN '255.192.0.0';
WHEN '11' THEN RETURN '255.224.0.0';
WHEN '12' THEN RETURN '255.240.0.0';
WHEN '13' THEN RETURN '255.248.0.0';
WHEN '14' THEN RETURN '255.252.0.0';
WHEN '15' THEN RETURN '255.254.0.0';
WHEN '16' THEN RETURN '255.255.0.0';
WHEN '17' THEN RETURN '255.255.128.0';
WHEN '18' THEN RETURN '255.255.192.0';
WHEN '19' THEN RETURN '255.255.224.0';
WHEN '20' THEN RETURN '255.255.240.0';
WHEN '21' THEN RETURN '255.255.248.0';
WHEN '22' THEN RETURN '255.255.252.0';
WHEN '23' THEN RETURN '255.255.254.0';
WHEN '24' THEN RETURN '255.255.255.0';
WHEN '25' THEN RETURN '255.255.255.128';
WHEN '26' THEN RETURN '255.255.255.192';
WHEN '27' THEN RETURN '255.255.255.224';
WHEN '28' THEN RETURN '255.255.255.240';
WHEN '29' THEN RETURN '255.255.255.248';
WHEN '30' THEN RETURN '255.255.255.252';
WHEN '31' THEN RETURN '255.255.255.254';
WHEN '32' THEN RETURN '255.255.255.255';
-- 不合法的全都用 255.255.255.255
ELSE RETURN '255.255.255.255';
END CASE;
END; $$

-- 将long int转换为点分IP格式
-- param: ip_int INTEGER(12) UNSIGNED 输入整数
-- return: ip VARCHAR(15) 输出IP
DROP FUNCTION IF EXISTS long2ip;
CREATE FUNCTION long2ip(ip_int INT(12) UNSIGNED)
RETURNS VARCHAR(15) DETERMINISTIC
BEGIN
-- 计算
SET @part_1 = ip_int DIV 16777216;
SET @modulo = ip_int % 16777216;
SET @part_2 = @modulo DIV 65536;
SET @modulo = @modulo % 65536;
SET @part_3 = @modulo DIV 256;
SET @part_4 = @modulo % 256;
-- 合并
RETURN CONCAT_WS('.', @part_1, @part_2, @part_3, @part_4);
END; $$

-- 将IP转换为long int
-- param: ip VARCHAR(15) 输入IP
-- return: ip_int INTEGER(12) UNSIGNED 输出整数
DROP FUNCTION IF EXISTS ip2long;
CREATE FUNCTION ip2long(ip VARCHAR(15))
RETURNS INTEGER(12) UNSIGNED DETERMINISTIC
BEGIN
-- 定位点分的位置
SET @int_pos_dot_1 = LOCATE('.', ip, 1);
SET @int_pos_dot_2 = LOCATE('.', ip, @int_pos_dot_1+1);
SET @int_pos_dot_3 = LOCATE('.', ip, @int_pos_dot_2+1);
-- 切割
SET @part_1 = SUBSTRING(ip, 0+1, @int_pos_dot_1-1);
SET @part_2 = SUBSTRING(ip, @int_pos_dot_1+1, @int_pos_dot_2-@int_pos_dot_1-1);
SET @part_3 = SUBSTRING(ip, @int_pos_dot_2+1, @int_pos_dot_3-@int_pos_dot_2-1);
SET @part_4 = SUBSTRING(ip, @int_pos_dot_3+1);
-- 计算
RETURN @part_1 * 16777216 + @part_2 * 65536 + @part_3 * 256 + @part_4;
END; $$

Monday, February 2, 2009

++$不和谐;

@see: http://sskaje.spaces.live.com/blog/cns!CD0E835D6C568521!1350.entry

刚update了手机。。

本来打算改code,然后按网上教程把手机系统版本刷一下,但是突然发现,nsu报了3.46的系统,索性就直接这样刷了
一开始,提心吊胆的,看着下载速度,差不多100多k吧,然后想想,强制关了,开wireshark,重来,虽然嗅到了文件,但是大小和nsu报的大小差了一半,这时候nsu自己也有点问题,索性重启

重启之后,按nsu的wizard,就这样,很方便的update完了

但是,接下来的,是重装一堆乱七八糟的手机软件,不过至少我知道了,之前fring装不上的原因是版本不对(下的是9.2的fring,但是手机是symbian 9.3),然后fring装上了也用不了,天知道它的注册机制怎么回事,反正fring那么慢,放弃得了;然后OggPlay效果不错,flac也能放,基本常用的格式都能吃之,coreplayer啥时候考虑卸掉;然后,gtalk,skype的东西,以后再找个客户端吧,现在不管了

继续把那个文件下下来,看看到底怎么回事