笔记20060413-20060721
时间:2006-05-12 来源:gudai
php源码研究-explode函数追踪2006-07-21 17:30:10 bailing
我要把explode函数的功能分离出来
ext/string.c里有函数PHPAPI void php_explode(zval *delim, zval *str, zval *return_value, int limit)
PHPAPI是什么?这个以后找到了再说
zval是什么?在/Zend/zend.h这个文件里,定义了zval的struct
struct _zval_struct {
继续看explode这个函数
char *p1, *p2, *endp;
endp = Z_STRVAL_P(str) + Z_STRLEN_P(str);
查找Z_STRVAL_P,在/Zend/zend_operators.h这个文件里
#define Z_STRVAL(zval) (zval).value.str.val
#define Z_LVAL_P(zval_p) Z_LVAL(*zval_p)
ok,找到了。
继续看explode这个函数
p2 = php_memnstr(Z_STRVAL_P(str), Z_STRVAL_P(delim), Z_STRLEN_P(delim), endp);
查找php_memnstr,在/Zend/zend_operators.h这个文件里
137行
static inline char *
zend_memnstr(char *haystack, char *needle, int needle_len, char *end)
zend_memnstr这个函数比较查找字串的方法十分巧妙,简洁而有力。
找到位置后
p2 = php_memnstr(Z_STRVAL_P(str), Z_STRVAL_P(delim), Z_STRLEN_P(delim), endp);
add_next_index_stringl(return_value, p1, Z_STRLEN_P(str), 1);
用add_next_index_stringl这个函数把结果存入return_value , return_value 也是个zval类型的变量。
它或者是个全局的变量,因为我没有在PHP_FUNCTION(explode)这个函数里发现它初始化的地方。
add_next_index_stringl这个函数在/Zend/zend_API.c里1144行。
麻烦了,在这个函数里又碰到了几个函数,我靠
ZEND_API int add_next_index_stringl(zval *arg, char *str, uint length, int duplicate)
{
zval *tmp;
MAKE_STD_ZVAL(tmp);
ZVAL_STRINGL(tmp, str, length, duplicate);
return zend_hash_next_index_insert(Z_ARRVAL_P(arg), &tmp, sizeof(zval *), NULL);
}
zend_hash_next_index_insert在/Zend/zend_hash.h里定义
116行
#define zend_hash_next_index_insert(ht, pData, nDataSize, pDest) \
_zend_hash_index_update_or_next_insert(ht, 0, pData, nDataSize, pDest, HASH_NEXT_INSERT ZEND_FILE_LINE_CC)
打开/Zend/zend_hash.c
终于找到了一个复杂的函数,看起来对我们来说应该也是终结的函数了。
342行
ZEND_API int _zend_hash_index_update_or_next_insert(HashTable *ht, ulong h, void *pData, uint nDataSize, void
zval有个属性就是HashTable的。
HashTable在zend_hash.h里定义
60行
未完待续
conflicting types的原因2006-07-19 15:14:16 bailing
错误:
test.c:22: error: conflicting types for 'urlencode'
test.c:18: error: previous implicit declaration of 'urlencode' was here
原来是因为没有先做函数声明,而函数位于main()之后。
在main函数前声明了函数原型后,一切ok.
EBCDICbailing
看php的源码,在url.c的php_url_encode里看到了这个单词
#ifndef CHARSET_EBCDIC
查google
BCD (Binary Coded Decimal) 是一種以二進制數字代表十進制數字的方法。
它將每個十進制數目字 (0 1 2 3 4 5 6 7 8 9) 以一個二進制數字來代表,通常用 4 個位元來代表一個十進制數目字。
例如 6 是 0110,7 是 0111,所以 1024 就以 0001 0000 0010 0100 來表示。
http://www.webopedia.com/TERM/E/EBCDIC.html 的解释
Abbreviation of Extended Binary-Coded Decimal Interchange Code. Pronounced eb-sih-dik,
EBCDIC is an IBM code for representing characters as numbers. Although it is widely used on large IBM computers,
most other computers, including PCs and Macintoshes, use ASCII codes.
http://www-900.ibm.com/cn/support/viewdoc/detail?DocId=2222001000000
定制EBCDIC和GBK/GB2312的转换码表
安装squid笔记2006-07-14 13:41:19 bailing
参考文章(资料比较多)
http://www.chinalinuxpub.com/read.php?wid=912
去www.squid-cache.org下载。
解压后,./configure,make,make install.
ok
十分的顺利。
配置squid.conf.,位于 安装目录/etc/下。
内容如下。
debug_options ALL,1
http_port 61777
acl all src 0.0.0.0/0.0.0.0
acl allowdst dst 211.136.91.98
acl allowdst2 dst www.google.com
cache_mem 8 MB
maximum_object_size 4096 KB
cache_dir ufs /usr/local/squid/var/cache 100 16 256
access_log /usr/local/squid/var/logs/access.log
http_access allow allowdst
http_access allow allowdst2
http_access allow all
cache_effective_user web wheel
启动
启动脚本在 安装目录/sbin下。
./squid
重启脚本,放到安装目录/sbin下就可以了
注意,修改
#!/bin/sh
killproc()
{
prog=`ps -ax | grep -w squid | grep -v grep`
if [ "$prog" != "" ] ; then
read pid a b c
shell点滴2006-07-12 14:06:54 bailing 0
造成大量未知输出的shell语句 , grep
ps -ax | grep ^.*smcCu$
grep的参数
-v或--revert-match 反转查找 ,意思是所有不符合表达式的行。
-w或--word-regexp 只显示全字符合的列 ,意思是
grep -w smc 可以匹配行 fdfds fds ./smc 但是不匹配 fdsdfd fdsf ./smcD
在shell里启动一c程序后 , shell里的所有 >>语句全部失效。我靠。
原来是因为里面执行了一条cd命令,导致目录切换,所以输出位置错误,所以看起来是语句失效。
= 和 空格=空格 的不同
xx=xx, xx = xx;
前者不能正确判断
if空格[空格左值空格!=空格右值空格]空格;then
靠,太严格了。
-------------变量在管道中消失了?
i=1
cat cfg.ini | `grep -v "^\#.*"` | while read r d ds dd
do
i=`expr $i + 1`
done
这里echo $i,你会发现$i依然等于1。
while read r d ds dd
do
i=`expr $i + 1`
done
笔记本键盘的数字键忽然部分失效了?2006-07-12 13:39:55 bailing
http://zhidao.baidu.com/question/197650.html
主键盘区第一行的 数字键忽然失效了,昨天用的时候还是可以的,现在第一行的14个键,除了可以输出
、5、6、% 、^、 —— 、+ 之外 其它都不能输出,数字只能通过小键盘输出,并且以前用page up、 page down
可以选则翻页的,现在也失效了,刚才清理了一下键盘,发现键盘去掉键盘改后,数字键还是无效,之前也没有怎
么设置,怎么会出现这样的情况?该如何处理?求教
问题补充:补充:根据同学提议,将键盘移到其他电脑上使用,一切正常;然后拿回我的电脑,还是数字键失效,
重新更新了键盘的驱动,重起后,1234都有效了。但是其他.......
急救 叹号
现在也分不清到底是我的键盘问题,还是我的电脑设置问题了~会是中毒了么?
再次补充:电脑换上其他键盘后可以正常使用数字键。
???难道键盘还存在不兼容问题?但是之前键盘并没有换啊`只是最近几天用的不多而已,
怎么回忽然就出现这样的情况呢?
我是重装系统就好了,因为我发现虚拟启动磁盘dos下可以正常输入。
所以我重装了系统。我的朋友是重启了机器就好了。
就是最近才出现的问题。怀疑是网络病毒数据包造成的。我是xp的系统 , 打了sp2。
secure crt和winscp维持连接的设置2006-07-06 13:12:53 bailing
securecrt , 点连接-〉会话
选中一个连接
-〉属性-〉终端-〉反空闲-〉发送协议no-op (打勾)
winscp
new-session ->选中一个session , load ,
connection -> keepalives -> sending of null ssh packets
转贴-程序运行总是提示 segmentation fault (core dumped)是什么错啊? 2006-07-05 09:18:45 bailing
程序运行总是提示 segmentation fault (core dumped)是什么错啊?
05/14/05 10:26 AM Edit Reply Quote
duckybsd
Site Admin
http://linux.computersci.net/forum/showflat.php?Cat=&Board=UBB24&Number=3013&page=4&view=collapsed&sb=7&o=
是一些细节错误:
指针没有赋值,
变量赋值类型有错误。
错误类型并不难判断,不过地方是难找了些。
你可以在你的代码里加入一些测试点,比如在某一行插入:
printf("XXXXXX\n");
如果说在Segmetation Fault 前有你要打印的这些内容,那就是说错误在测试点后面。再继续查找。
segmantation fault :最主要的错误就是 声明了指针,但是没有初始化 ,结果再后来的时候进行间接引用 ,
就出现问题了。
比如
char *p ;
char test[] = "hello";
strcpy(p,test);
肯定会segmantation fault 了。
所以编程的时候,养成习惯:
比如
char *p = NULL;
FILE *ftp = NULL ;
还有:
char test_str[100];
memset(test_str,'\0',sizeof(test_str) ; 把字符串全部清空!
另外,利用malloc()函数分配内存空间的时候,也要检查,是否为空。 这都是c程序员需要自己完成的,
不能偷懒 ,否则 将来有什么发疯掉。
还有在程序多加一些assert()比较好,尤其是关键的地方,
比如一个指针 p 不能为空,可以这样断言: assert(p !=NULL) ,如果将来某一天程序出错了,p为空了,
那程序会马上中止,并打出了程序所在的行 ,便于查错!
强制页面显示的编码为gb23122006-06-21 13:49:16 bailing
浏览utf8编码的页面后,再打开gb2312编码的页面有时会乱码。
如下脚本可以解决问题,注意复制时
if(document.charset!='gb2312' ){
document.charset='gb2312';
}
fopen在bsd系统上打开文件失败2006-06-21 13:21:09 bailing
原来是因为文件名中带了 - ,
改为下划线 _ , ok.
windows下没有这个问题。
问题代码
$fp = fopen("forms/access-forbidden.txt","a+");
fwrite($fp,implode( ":" , $array)."\r\n" );
fclose($fp);
winscp keep-alive的设置2006-06-20 10:22:51 bailing
今天在辉辉的提醒下。
new session
[10:10] 打开一个对话框, advanced mode
[10:10] connection
[10:10] -keep alives
然而,无效。
frontpage的正则表达式2006-06-12 08:56:27 bailing
frontpage用{}而不是通常的()来匹配pattern 并获取这一匹配。
所获取的匹配在frontpage里就是\1 \2等
所以
替换所有以abc开头的字符串为def开头,那么这么写
查找: abc{.*}
替换为: def\1
php_network_getaddresses: getaddrinfo failed错误2006-05-26 13:25:06 bailing
Warning: file_get_contents(): php_network_getaddresses: getaddrinfo failed: Temporary failure in name resolution in /var/www/mambog_corp/modules/tools/weather_getinfo.php on line 121
原来是因为服务器换IP后没有重新启动机器。
linux下sh脚本注意 - 换行必须是\n不能有回车符2006-05-24 14:25:30 bailing
换行必须是\n不能有回车符, 否则在执行编译程序等命令时,会不能通过。
mysql错误字 Warnings: 25042006-05-24 10:33:40 bailing
load data infile"F:/web/ah_radio/ah_cm.txt" into table area;
由于ah_cm.txt是gb编码的,而数据表是utf8码的。
所以另存为ah_cm_utf8.txt后,ok.
load data infile"F:/web/ah_radio/ah_cm_utf8.txt" into table area;
c语言函数手册的缺陷2006-05-23 09:18:34 bailing
缺少atoi函数
目录里的节点名称多了汉字头罗嗦。
css加载图片速度慢2006-05-18 14:38:27 bailing
150多个菜单,头用css定义,则明显任务栏多了一个加载的.........
window下mysql日志配置2006-05-16 10:28:11 bailing
修改my.ini
在[mysqld]下增加两行
log="F:/www/mysql5/s.log"
log-update="F:/www/mysql5/s_u.log"
xp下IE的注册表相关设置2006-05-15 10:30:07 bailing
HKCU\Software\Microsoft\windows\CurrentVersion\Internet Settings
HKCU\software\Microsoft\Windows\CurrentVersion\Explorer\Advanced
HKCU\Software\Microsoft\Internet Explorer
操作父frame里的html2006-05-11 16:24:44 bailing
var pDoc = parent.document ;
var switchWinObj = pDoc.getElementById('switchwin');
//alert( switchWinObj.cols );
oldWinCols = switchWinObj.cols ;
frame,从此frame修改彼frame里的内容,DHTML的parentElement 和 parentNode 的区别2006-05-08 09:58:29 bailing
parentElement 获取对象层次中的父对象。
parentNode 获取文档层次中的父对象。
parentElement在firefox中由th到tr时无法执行(经过测试),或者其他情况下也不执行(没有测试)。
parentNode则IE,firefox均可以执行。
dhtml从此frame修改彼frame里的内容
var f = parent.frames["topFrame"];
var t = f.document.getElementById('xxx');
t.innerHTML=msg;
修改父框架的内容。
var pDoc = parent.document ;
var switchWinObj = pDoc.getElementById('switchwin');
//alert( switchWinObj.cols );
oldWinCols = switchWinObj.cols ;
//动态修改高度
var realHeight = document.body.scrollHeight;
var moframe = parent.document.getElementById('LkMo');
moframe.height=realHeight;
default-character-set=utf8而不是default-character-set=utf-82006-05-09 16:59:08 bailing
真是搞死了。
取消软驱盘符,subst 无效参数A2006-05-08 15:27:56 bailing 1
设备管理器中禁止floppy disk driver
subst a: g:\a
subst 无效参数 - A 怎么解决
解决了。不用进入cmos
可以在设备管理器中禁止floppy disk driver
然后就可以用subst了。2000连重新启动都不用!
如果是xp还用重启动
呵呵
发分了
office不正常2006-05-08 14:01:02 bailing
文件夹选项-〉文件类型-〉doc-〉高级-〉打开
"C:\Program Files\Microsoft Office\OFFICE11\WINWORD.EXE" /n /dde
"C:\Program Files\Microsoft Office\OFFICE11\WINWORD.EXE" %1
C:\Documents and Settings\Administrator\Application Data无法访问
弹出对话系统警告
"您无权查看或编辑目前C:\Documents and Settings\Administrator\Application Data的权限设置; 但是,您可以取得所有权或更改审核设置."
已经去掉"简单共享",可在查看该文件夹的安全标签时,系统警告"您无权查看或编辑目前My videos的权限设置; 但是,您可以取得所有权或更改审核设置." 顺便说,这个"我的文档"无法删除就是因为这个My videos文件夹的权限问题.
Flanker
2004-12-12, 18:00
问题已解决,我的办法是在它的上层文件夹,就是把"我的文档"所有权由一个未知帐户(就是我以前的那个帐户,不过设成专用后系统删掉的不完全,变成未知的了)改成Administrator,就可以完全删除了.累! 谢谢steelsnarl 和mooncake 的大力支持
下载安装微软提供的Windows Installer CleanUp Utility 1.0,它的主要功能是清除程序的Windows Installer配置信息。启动该工具,它会列出目前系统中所有Windows Installer使用安装的软件,选中出问题的软件,然后点“Remove”按钮即可。
为什么启动软件时总会出现Windows Installer
未解决。。。。
editplus实用技巧-持续更新中2006-04-29 11:24:36 bailing
非常好用的命令
1.菜单-〉帮助-〉快捷键列表,建议经常翻翻。
2.剪辑,快捷键F2.
3.配置自己的工具菜单。
给select下拉框增加option发现的问题,以及js怎么设置中断2006-04-28 14:02:49 bailing
1.js中断,我没发现有函数可以,然而,你让js执行一个并不存在的函数,那么它会异常抛出。ok。需要中断的地方就这样好了。
2.option增加的问题。
for(i=0;i
fsockopen post表单2006-04-27 14:42:05 bailing
需要注意:
1.form的数据必须用rawurlencode编码联起来。
2.必须提交content-length长度
3.post表单的数据必须跟在\r\n\r\n后面。
$data["channel"]=$moRow['serviceCode'];
$data["mobile"]=$moRow['mobile'];
$data["gateway"]=$moRow['gateway'];
$data["isp"]=$moRow['isp'];
$data["linkid"]=$moRow['linkid'];
$data["msg"]=$content;
while (list($k,$v) = each($data)) {
$post .= rawurlencode($k)."=".rawurlencode($v)."&";
}
$post = substr( $post , 0 , -1 );
$len = strlen($post);
//发送
$host = "localhost";
$file = "/mtApp/send.php";
$fp = @fsockopen( $host , 80, $errno, $errstr, 30);
if (!$fp) {
echo "$errstr ($errno)\n";
} else {
$receive = '';
$out = "POST $file HTTP/1.1\r\n";
$out .= "Host: $host\r\n";
$out .= "Content-type: application/x-www-form-urlencoded\r\n";
$out .= "Connection: Close\r\n";
$out .= "Content-Length: $len\r\n";
$out .="\r\n";
$out .= $post."\r\n";
echot($out);
fwrite($fp, $out);
while (!feof($fp)) {
$receive .= fgets($fp, 128);
}
fclose($fp);
}
echo $receive;
移动通讯协议学习2006-04-13 18:09:08 bailing
长短链接的端口号
7890 长连接(SP 与网关间)
7900 短连接(SP 与网关间)
7930 长连接(网关之间)
9168 短连接(短信网关与汇接网关之间)
8.1 基本数据类型
Unsigned Integer 无符号整数
Integer 整数,可为正整数、负整数或零
Octet String 定长字符串,位数不足时,如果左补0 则补ASCII 表示的
零以填充,如果右补0 则补二进制的零以表示字符串的结 束符
消息头格式(Message Header)
字段名字节数 类型 描述
Total_Length 4 Unsigned Integer 消息总长度(含消息头及消息体)
Command_Id 4 Unsigned Integer 命令或响应类型
Sequence_Id 4 Unsigned Integer 消息流水号,顺序累加,步长为1,循环使用
(一对请求和应答消息的流水号必须相同)
8.4 业务提供商(SP)与互联网短信网关(ISMG)间的消息定义
查杀病毒servehost.exe和searchNet.exe2006-04-14 09:56:40 bailing
在C:\WINDOWS\System32还有servehost.exe文件,并添加自身到系统服务为Remote Log。
用IceSword发现SearchNet.exe 和ServeHost.exe进程(IceSword自动 ...
Searchnet.exe程序名称:中搜地址
用IceSword能发现SearchNet文件夹
资源管理器下没有发现其驱动文件
IceSord1.12不能删除中搜的木马。
目前好像除了重装系统没有别的办法
用IceSword发现三个驱动文件: FAD.sys Anfad.sys hProcess.sys 甚至用IceSword都无法删除!
单系统用户可以使用unlocker强制删除,他的是一个系统,第1个方法不可取,第2个我试了,重起电脑仍然出现,突
然间想到,windows权限依赖性,我晕,我同学的是FAT分区格式,给他转为NTFS,方法是convert c :/fs:ntfs,这样
把C盘换为NTFS格式了,然后把C:\Program Files\searchnet 文件夹的权限全部禁用,首先打开我的电脑,点击:工具
—文件夹选项-查看,把“使用简单文件共享”前面的钩去掉,这样文件的安全选项就出现了,
以下这位同学的说法因为无法看到文件夹,所以无法执行。
最后发现删除还是成功了。我是先用ICEsord终结了进程,然后删除searchnet文件夹的。
然而删除几个.sys文件却失败了。
右击searchnet 文件夹点属性,找到安全,把里面的权限全部去掉,
---------------
http://dudu.cnblogs.com/archive/2006/01/16/318403.aspx
# re: 清除SearchNet.exe 2006-03-05 07:53 吕云峰
如果是FAT32格式的好办,用启动盘启动到DOS命令行,进入PROGRAME FILES\SEARCHNET目录,用ATTRIB命令解除该目录下所有文件的只读属性,然后删除
第二 进入WINDOWS\SYSTEM32\DRIVERS目录,同样用ATTRIB命令解除该目录下FAD.SYS ANFAD.SYS的只读属性,然后删除,重启就OK啦.哈哈
-------------------
Anfad.sys FAD.sys unlocker失败(提示下次启动时删除)
BDguard.sys BDguard.dat 百度搜霸 unlocker 成功?(放入回收站,反复操作数次,然而我还是看见了它,没动静阿,2006-05-10换版本为1.8.3的unlocker,删除百度成功,然而还是无法删除AnFad.sys和fad.sys)
klif.sys kl1.sys 卡巴司机 不操作
d347bus.sys daemon虚拟光驱 不操作
下次启动时也没有删除,都在,一个不少。
unlocker地址
http://ccollomb.free.fr/unlocker/
冰刃作者的blog.
http://www.blogcn.com/user17/pjf/blog/31532835.html
----------------------
超级兔子7.5A版中的专用卸载可以卸载这个东西,多卸载几次。
命令行安装pear类库2006-04-13 17:05:05 bailing
双击php所在目录的go-pear.bat,它调用/PEAR目录下的php文件来处理一些东西。
一路enter,ok.现在可以在命令行安装包了。
cmd进入此目录
>pear.bat install db
效果是安装了db库。
××××××××××××××××××××××××××××
F:\www\php5>pear.bat install db
downloading DB-1.7.6.tgz ...
Starting to download DB-1.7.6.tgz (124,807 bytes)
............................done: 124,807 bytes
install ok: channel://pear.php.net/DB-1.7.6
××××××××××××××××××××××××××××
pdf转换工具试用2006-04-13 15:49:22 bailing
一个绿色工具包包含11个pdf工具
其中pdfhtm我是感兴趣的。
操作文件:中国移动通信互联网短信网关接口协议(V3.0.0).pdf
试用了下,发现
它产生的目录结构
\中国移动通信互联网短信网关接口协议(V3.0.0).htm
\css css文件以及所有的htm页面
\img 图片文件
htm页面都像word生成的htm一样充满了垃圾代码。
所有的行都像这样。即使是pdf中存在表格的地方都是这样。看来是按行解释而生成的。
ABC Amber PDF Converter program3.03
未注册版可以免费试用30天,转换pdf文件的前5页。结果由于测试的pdf文档没有bookmarks,所以
转换出来的html文件是这样的
Bookmarks
No bookmarks found.
靠
PDFfactory这么烂你还在用啊?不如用这个!
软件名 运行速度 功能 评价
文电通 相当快 比较齐 很好,可惜没有注册码。
ACRBAT专业版 比较快 最强大 很好,可惜软件太大。
PDFfactory 相当慢 一般 垃圾
ACRBAT 7.0专业版中的Distiller 7.0组件就是可以从各文档创建PDF的组件,可惜一直没有分离版,要使用它,就必须安装100多M的ACRBAT 软件,好的是,本人找到了Distiller 5.0 的单独版本:
http://www.tyc.com.cn/Acrobat%20Distiller%205.0.rar
由于文电通破解版在创建PDF文件时有水印,将文电通破解版(安装时不要选择打印机组件)和Distiller 5.0结合使用,真的绝配。
25.6M阿,PDFfactory才多大啊
修改editplus为默认php文件的打开方式中出现问题2006-04-13 13:55:20 bailing
用右键-》打开方式-》浏览其他程序,设定为默认打开方式
没有用,editplus没有出现在程序列表里。通常情况下这样会在列表中加一个这程序。然而失败。
怀疑原因和安装了的editplus和我用的版本不一致有关。果然,卸载了editplus,
重新复制我的editplus,ok.
于是regedit,找到phpfiles的open项command为editplus路径,依然不能双击打开文件。
终于醒悟了,因为没有加%1参数。
改为
D:\p\EditPlus\editplus.exe %1
天下太平。
每一种文件类型的"打开方式"列表中的程序都是相对独立的。要删除列表中的项目,先打开注册表键
:HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.extension\OpenWithList
在新公司上班了。第一天。
相关阅读 更多 +