Zhang Jiuan’ Notes

奇异的字符串(php)

在php内部字符串可以使用单引号引起来,也可以使用双引号引起来。(当
然还有第三种方式在此不做说明了)
它们的作用和效率是不同的,对于双引号的字符串,其内部的变量会被
变量对应的值代替,但单引号就不同了。
例:
$var = ‘hello’;
$greeting = “$var world”;
echo $greeting;
那么会得到hello world
如果$greeting的值改成:’$var world’,那么执行结果会变成如下了:
$var world
由此我们可以看出,有时候我们必须使用双引号,才能达到我们的一个
预期目的。
但是,从效率上讲,双引号的字符串是会带来额外的消耗的,其原因我
想就不用解释了吧。
下面再给大家讲一个小的诡异的点吧。
printf(’hello %s\n’, ‘world’);
printf(”hello %s\n”, ‘world’);
printf(’hello %s\n’, “world”);
printf(”hello %s\n”, “world”);
有什么不同,读者自已思考一下吧:)
多谢
张久安
If you enjoyed this post, make sure you subscribe to my RSS feed!

接口设计规则一:让你的接口会说话

在面试过程中,我时常会问一道简单的题目:
请找出如下程序不妥之处:
void s_c(const char *s, const char *p)
{
while (*s) {
*p = *s;
}
}
首先,这道简单的题目考察的是找错能力,比如结束符和const的应用。
其次,考察的是接口设计能力,这也是重点。
没有返回值,因此对于一些异常现象不好对外表现,const是否应用正确,
函数名使用是否见其名知其意,函数参数是否见其名知其意,有没有对接
口的简述,指针,引用,就量传递使用是否正确等等。
比如改成如下:
/**
* brief: 拷贝字符串,从源串到目的串
* param[in]: src 源串地址
* param[out]: dest 目的串地址
* return: 成功 0
* 失败 错误码
[...]

error_reporting:控制你的php程序报错等级

    一次偶然的机会,发现发一段程序感觉诡异,于是详细查了一把文档。
原程序如下:
class os_cart {
    public function pay() {
        //do something
    }
    ….
}
os_cart::pay();
即然成员函数声明的不是static的,为什么可以使用静态模式来调用呢?这样
为什么不会报错呢?查了一下文档,原来和error_reporting函数相关。如果
error_reporting的设置包含了E_STRICT的话,那么程序会进行严格的检查,
对于非静态函数进行静态方式调用,就会报错。如果将E_STRICT错误过滤掉
的话,就不会报错了。
error_reporting的设置方式:
    1 在php.ini配置文件中进行配置,相关值如下列表:

value
constant

1
E_ERROR

2
E_WARNING

4
E_PARSE

8
E_NOTICE

16
E_CORE_ERROR

32
E_CORE_WARNING

64
E_COMPILE_ERROR

128
E_COMPILE_WARNING

256
E_USER_ERROR

512
E_USER_WARNING

1024
E_USER_NOTICE

2047
E_ALL

2048
E_STRICT

    2 在程序中进行设置,在程序入口处使用error_reporting函数进行设置
如 error_reporting(E_ALL | E_STRICT);这里需要说明的是,E_ALL并
不包含E_STRICT。
 
多谢
张久安
If you enjoyed this post, make sure you subscribe to my RSS feed!

2010年3月编程语言排行榜:Objective-C上升势头最猛

TIOBE网站发布了最新的三月份编程语言排名,本月排名情况和上月相比并无显著变化。
比较有意思的是,Objective-C是上升势头最明显的编程语言,而Google推出的Go则经历了诞生后的首次略微下滑。此外,Fortran取代Lisp/Scheme挺进前20;Matlab则上升6位,接近成为主流编程语言。
Matlab是矩阵实验室(Matrix Laboratory)的简称,是美国MathWorks公司出品的商业数学软件,广泛用于科学计算,也可以用于算法开发、数据可视化、数据分析,是一种高级技术计算语言和交互式环境的组合,主要包括Matlab和Simulink两大部分。
与之前的排名相比,20到30名的名次变化较多,显示这些语言总体上都在伯仲之间。

按TIOBE自己的说明,TIOBE编程语言社区排行榜是编程语言流行趋势的一个指标。每月更新。这份排行榜排名基于互联网上有经验的程序员、课程和第三方厂商的数量。排名使用著名的搜索引擎(诸如Google、 MSN 、雅虎)以及Wikipedia和YouTube进行计算。请注意这个排行榜只是反映某个编程语言的热门程度,并不能说明一门编程语言好不好,或者一门语言所编写的代码数量多少。
这个排行榜可以用来考查你的编程技能是否与时俱进,也可以在开始开发新系统时选择语言时用来进行策略性的决策。排行榜的详细定义可以参考这里。
需要特别注意的是,这个排名并不反映国内编程语言的现状,相对国内,它往往显得比较超前,但它代表的趋势很有参考意义。
If you enjoyed this post, make sure you subscribe to my RSS feed!

PHP magic_quotes_gpc的详细使用方法

我们今天要向大家介绍的是PHP magic_quotes_gpc的具体使用方法。大家都知道在PHP中一个特殊的函数魔术函数,它在引用的过程中只有在传递$_GET,$_POST,$_COOKIE时才会发生作用。
1.
条件: PHP magic_quotes_gpc=off
写入数据库的字符串未经过任何过滤处理。从数据库读出的字符串也未作任何处理。
 
数据:  $data=”snow”’’sun” ; (snow和sun之间是四个连续的单引号).
操作: 将字符串:”snow”’’sun” 写入数据库,
结果: 出现sql语句错误,mysql不能顺利完成sql语句,写入数据库失败。
数据库保存格式:无数据。
输出数据格式:无数据。
说明: 对于未经处理的单引号在写入数据库时会使sql语句发生错误。
2.
条件: PHP magic_quotes_gpc=off
写入数据库的字符串经过函数addlashes()处理。从数据库读出的字符串未作任何处理。
数据:  $data=”snow”’’sun” ; (snow和sun之间是四个连续的单引号).
操作: 将字符串:”snow”’’sun” 写入数据库,
结果: sql语句顺利执行,数据成功写入数据库
数据库保存格式:snow”’’sun (和输入一样)
输出数据格式:snow”’’sun (和输入一样)
说明: addslashes()函数将单引号转换为\’的转义字符使sql语句成功执行,
但\’并未作为数据存入数据库,数据库保存的是snow”’’sun 而并不是我们想象的snow\’\’\’\’sun
3.
条件: PHP magic_quotes_gpc=on
写入数据库的字符串未经过任何处理。从数据库读出的字符串未作任何处理。
数据:  $data=”snow”’’sun” ; (snow和sun之间是四个连续的单引号).
操作: 将字符串:”snow”’’sun” 写入数据库,
结果: sql语句顺利执行,数据成功写入数据库
数据库保存格式:snow”’’sun (和输入一样)
输出数据格式:snow”’’sun (和输入一样)
说明: PHP magic_quotes_gpc=on 将单引号转换为\’的转义字符使sql语句成功执行,
但\’并未作为数据入数据库,数据库保存的是snow”’’sun而并不是我们想象的snow\’\’\’\’sun。
4.
条件: PHP magic_quotes_gpc=on
写入数据库的字符串经过函数addlashes()处理。从数据库读出的字符串未作任何处理。
数据:  $data=”snow”’’sun” ; (snow和sun之间是四个连续的单引号).
操作: 将字符串:”snow”’’sun” 写入数据库,
结果: sql语句顺利执行,数据成功写入数据库
数据库保存格式:snow\’\’\’\’sun (添加了转义字符)
输出数据格式:snow\’\’\’\’sun (添加了转义字符)
说明: PHP magic_quotes_gpc=on 将单引号转换为\’的转义字符使sql语句成功执行,
addslashes又将即将写入数据库的单引号转换为\’,后者的转换被作为数据写入
数据库,数据库保存的是snow\’\’\’\’sun
总结如下:
1. 对于PHP magic_quotes_gpc=on的情况,
我们可以不对输入和输出数据库的字符串数据作
addslashes()和stripslashes()的操作,数据也会正常显示。
如果此时你对输入的数据作了addslashes()处理,
那么在输出的时候就必须使用stripslashes()去掉多余的反斜杠。
2. 对于PHP magic_quotes_gpc=off 的情况
必须使用addslashes()对输入数据进行处理,但并不需要使用stripslashes()格式化输出
因为addslashes()并未将反斜杠一起写入数据库,只是帮助mysql完成了sql语句的执行。
补充:
PHP magic_quotes_gpc作用范围是:WEB客户服务端;作用时间:请求开始时,例如当脚本运行时.
magic_quotes_runtime [...]

服务器从lighttpd+apache迁到nginx

     apache对资源要求总是很高,尽管前面挂了一个lighttpd,可以对静态资源做一些处理,
但涉及到动态处理的程序,必须还得使用apache。(当然,lighttpd可以处理所有工作,但
似乎存在一些bug,在此不多赘述)下面讲一下迁移过程吧。
    上午还是被折腾了挺久,在apache上配置多个vhost挺熟了,但nginx还没试过。网上
search了一把,其实还很简单。但是迁我的wordpress的时候,出问题了,访问所有的页面
都是404,有些不解了。又注意到url为/2009/06/07/XXX,恍然大悟,原来处理前做了
分发。查了下lighttpd,apache的rewite规则,没有任何对wordpress的分发。实际不解了,
只好再baidu一把,原来.htaccess做了这个工作,但nginx不支持.htaccess功能。了解了这
些就简单了,把.htaccess重写一遍就可以了。
重写如下:
wordpress.conf
location / {
    index index.html index.php;
    if (-f $request_filename/index.html){
        rewrite (.*) $1/index.html break;
    }
    if (-f $request_filename/index.php){
        rewrite (.*) $1/index.php;
    }
    if (!-f $request_filename){
        rewrite (.*) /index.php;
    }
}
然后在nginx.conf需要的地方include wordpress.conf就可以了。
 
多谢
张久安
If you enjoyed this post, make sure you subscribe to my RSS feed!

Linux与Windows系统下Cronolog安装配置

实这时最好用日志轮询,之前这个WEB服务器没有做这个配置,本应该配置WEB服务器时就应该做的。现在配置下也不晚。
 
1.首先得要软件http://cronolog.org/download/index.html
 
Version 1.6.2 released 2002-01-24 (gzip’ed tar file)
Version 1.6.1 released 1999-12-20 (gzip’ed tar file)
Win 32 version (ZIP file)
Version 1.6 released 1999-12-16 (gzip’ed tar file)
Version 1.5b9 released on 4 June 1998 (gzip’ed tar file)
Version 1.4 released 20 December 1996 (gzip’ed tar file)
如果有Windows的要下Win_32_version(ZIP file) Linux习惯用哪种包就用哪种.
 
2. 在Linux 下安装cronolog
tar zxvf cronolog-1.6.2.tar.gz
cd cronolog-1.6.2
./configure (注意:默认是安装在/usr/local下 cronolog的命令在/usr/local/sbin下,这个要清楚)
make ; make install
 
3.在Windows下安装cronolog
在Windows下很简单,直接把cronolog.exe解压Copy到apache目录下的bin目录中.
 
4.配置都是一样的格式,不过要注意Linux和Windows下斜杠的方向.
 
Linux下
 
例:cronolog命令在/usr/local/sbin 下 日志文件在 /usr/local/apache2/logs/下
在FormatLog附近加入两句:
CustomLog [...]

shell的sort命令的-k参数

有时候经常使用sort来排序,需要预处理把需要排序的field语言在最前面。实际上这是
完全没有必要的,利用-k参数就足够了。
比如sort all
1 4
2 3
3 2
4 1
5 0
如果sort -k 2的话,那么执行结果就是
5 0
4 1
3 2
2 3
1 4
它按照第二个域进行排序。
如下为man sort:
Usage: sort [OPTION]… [FILE]…
Write sorted concatenation of all FILE(s) to standard output.
Ordering options:
Mandatory arguments to long options are mandatory for short options too.
  -b, –ignore-leading-blanks ignore leading blanks
  -d, –dictionary-order      consider only blanks and alphanumeric characters
  -f, –ignore-case           fold lower case [...]

正则转义符汇总

字符匹配语法:
\d   匹配数字(0~9) ‘\d’匹配8,不匹配12;
\D   匹配非数字 ‘\D’匹配c,不匹配3;
\w   匹配任意单字符 ‘\w\w’ 匹配A3,不匹配@3;
\W   匹配非单字符 ‘\W’匹配@,不匹配c;
\s   匹配空白字符 ‘\d\s\d’匹配3 d,不匹配abc;
\S   匹配非空字符 ‘\S\S\S’匹配A#4,不匹配3 d;
.     匹配任意字符 ‘….’匹配A$ 5,不匹配换行;
[…] 匹配括号中任意字符 [b-d]匹配b、c、d, 不匹配e;
[^…] 匹配非括号字符 [^b-z]匹配a,不匹配b-z的字符;
重复匹配语法:
{n} 匹配n次字符 \d{3}匹配\d\d\d,不匹配\d\d或\d\d\d\d
{n,} 匹配n次和n次以上 \w{2}匹配\w\w和\w\w\w以上,不匹配\w
{n,m} 匹配n次上m次下 \s{1,3}匹配\s,\s\s,\s\s\s,不匹配\s\s\s\s
? 匹配0或1次 5?匹配5或0,不匹配非5和0
+ 匹配一次或多次 \S+匹配一个以上\S,不匹配非一个以上\S
* 匹配0次以上 \W*匹配0以上\W,不匹配非N*\W
字符定位语法:
^ 定位后面模式开始位置  
$ 前面模式位于字符串末端  
\A 前面模式开始位置  
\z 前面模式结束位置  
\Z 前面模式结束位置(换行前)  
\b 匹配一个单词边界  
\B 匹配一个非单词边界  
转义匹配语法:
“\”+实际字符 \ . * + ? | ( ) { }^ $ 例如:\\匹配字符“\”
\n [...]

,

返回顶部