Zhang Jiuan’ Notes

自动化测试中Python与C/C++的混合使用

背景
项目的 自动化测试中已经使用了基于Python 脚本的框架,自动化过程中最关键的问题就是如何实现桩模块。运用 Python 强大的功能,实现任何桩模块都是可能的,但是是否必须完全使用 Python 实现模块逻辑,成本是一个决定性因素。在桩模块逻辑简单的情况下,使用 Python 模拟模块逻辑不但使自动化测试的结构清晰,也具有更好的灵活性,但是如果桩模块逻辑复杂,实现起来可能要耗费很大的成本,也容易由于桩模块逻辑与实际不符导致测试结果不可信。在这种情况下,如果能够借用 RD 开发的某些代码段 / 库,将会对测试自动化带来很多效益。
另外,在Python 中调用 C/C++ 代码的方法也可能应用于 C/C++ 库的测试中,这种测试方法的可行性还有待研究。
以下总结出几种在Python 中调用 C/C++ 代码的方法
使用ctypes 模块调用 C 动态库
从Python2.5 开始, Python 开始提供 ctypes 模块来提供对 C 语言编译的动态库文件的调用。注意, 这里特指C 的动态库 ,用C++ 编译的动态库 ctypes 虽然能够加载,但调用时的函数名已经由于 C++ 的重载特性被加以修改,难以调用。 使用 ctypes 调用 C 动态库的好处在于不用进行额外的开发,可以直接使用编译好的动态库。 ctypes 提供了完整的 C 类型封装,也支持自定义类型,大大减少在调用过程中的工作量。 ctypes 的使用很简单,只需熟悉 python 封装与 C [...]

Linux Kernel < 2.6.19 udp_sendmsg Local Root Exploit

/***********************************************************
* hoagie_udp_sendmsg.c
* LOCAL LINUX KERNEL ROOT EXPLOIT (< 2.6.19) - CVE-2009-2698
*
* udp_sendmsg bug exploit via (*output) callback function
* used in dst_entry / rtable
*
* Bug reported by Tavis Ormandy and Julien Tinnes
* of the Google Security Team
*
* Tested with Debian Etch (r0)
*
* $ cat [...]

Linux 账号与身份管理

账号管理:
管理员的工作中,相当重要的一环就是『管理账号』啦!因为整个系统都是你在管理的,并且所有的一般用户的申请,都必须要透过你的协助才行!所以你就必须要了解一下如何管理好一个网站的账号管理啦!在管理 Linux 主机的账号时,我们必须先来了解一下 Linux 到底是如何辨别每一个使用者的!
使用者的 ID 与群组的 ID :
其实 Linux 并不会直接认识你的『账号名称』,他认识的其实是你的『账号 ID 』才是!如果你曾经以 tarball 安装过软件的话,那么应该不难发现,在解压缩之后的档案,嘿?档案拥有者竟然是『不明的数字』?奇怪吧?这没什么好奇怪的,因为 Linux 说实在话,他真的只认识代表你身份的号码而已!而对应的号码与账号,则是记录在 /etc/passwd 当中!
怎样登入 Linux 主机呀?
好了,那么我们再来谈一谈,到底我们是怎样登入 Linux 主机的呢?其实也不难啦!当我们在主机前面或者是以 telnet 或者 ssh 登入主机时,系统会出现一个 login 的画面让你输入账号,这个时候当你输入账号与密码之后, Linux 会:
 
先找寻 /etc/passwd 里面是否有这个账号?如果没有则跳出,如果有的话则将该账号对应的 UID ( User ID )与 GID ( Group ID )读出来,另外,该账号的家目录与 shell 设定也一并读出;
再来则是核对密码表啦!这时 Linux 会进入 /etc/shadow 里面找出对应的账号与 UID,然后核对一下你刚刚输入的密码与里头的密码是否相符?
如果一切都 OK 的话,就进入 Shell 控管的阶段啰!
大致上的情况就像这样,所以呢,当你要登入你的 Linux [...]

谷歌又发疯了

所谓“发疯”是指做事情出于常情之外。为什么说,谷歌又发疯了?
3 月 10 日,谷歌 CEO Eric Schmidt 在阿联酋首府阿布扎比( Abu Dhabi )参加酋长国首次媒体峰会时对记者说:“谷歌与中国之间的争端,很快( soon )就要解决”。但是,具体怎么解决,他不说。
3 月 11 日,谷歌副总裁、副总法律顾问 Nicole Wong 在华盛顿公然表示,“我们在中国停止审查搜索结果的决定是坚定不移的( firm )”,如果北京的响应是命令谷歌关闭 google.cn 网站,“ We are prepared to do that” ,谷歌这次是把话說绝了。
谷歌高层官员在此时放出这种空气,硬逼着中国政府再次表态,毫无道理。我国政府的态度早已表明,好样的谷歌你坐下来谈呀!直接对话或是提交文字报告呀,你只会在中国境外瞎嚷嚷,管什么用?中国政府凭什么要先下命令关闭 google.cn 网站?但是,你谷歌胆敢首先停止对搜索结果的审查,中国政府绝对会下令关闭 [...]

奇异的字符串(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!

再谈php的include和include_once(require和require_once)

为了说明问题,我们看如下三个php文件:
//file: functions.php
require_once(’my_once.php’);
require_once(’my_once.php’);
function test()
{
require_once(’my_unonce.php’);
//require(’my_unonce.php’);
}
test();
test();
//file:my_once.php
printf(”%s\n”, ‘my_once’);
//file: my_unonce.php
printf(”%s\n”, ‘my_unonce’);
好,现在我们做一下测试:
php functions.php
输出结果如下:
my_once
my_unonce
这与我们期望的结果是不一致的,因为我们期望调用两次test函数,
即让test做两遍事情,但事实上只做了一次。
我们对functions.php改一下,require_once改成require(函数内部)
//file: functions.php
require_once(’my_once.php’);
require_once(’my_once.php’);
function test()
{
//require_once(’my_unonce.php’);
require(’my_unonce.php’);
}
test();
test();
再试一下,输出结果如下:
my_once
my_unonce
my_unonce
正是我们期望的结果。
时常听人说,即然有了require_once就不要再使require了,实不正
确的,各有各的用处点吧。
另外需要说明的是,实际效率也是不同的,require要比require_once快
好多。
多谢
张久安
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!

利用QQ游戏破解QQ密码

大家知道,当我们登录QQ后,可以直接在QQ上启动QQ游戏,这时候QQ游戏会启动,并以当前QQ用户进行登录,而不需要输入QQ号及密码。
 
我这个人应该算是比较善于思考的了(-^_^-),我想QQ肯定是通过某种方式把QQ号及密码信息传递给QQ游戏了。
 
我们来看一下QQ游戏的命令行(有的任务管理器可以直接看到):
 
打开命令提示符窗口
输入wmic 回车 (如果是第一次使用wmic,会提示正在安装,稍等几秒钟就行了)
然后输入process 回车
 
此时会显示所有的进程,找到QQ游戏(QQGame.exe),会发现其命令行有这样一段:
/START QQUIN:xxx PWDHASH:xxx
(也可以直接在命令行下输入wmic process where “Name=’QQGame.exe’” Get CommandLine)
 
此时其实已经可以算是破解成功了,因为你已经可以在命令行下输入以下内容进行登录了:
 
QQ.exe全路径 /START QQUIN:xxx PWDHASH:xxx
 
由于QQ2009之后已经不支持命令行登录了,所以需要使用QQ2008或更早版本(注意:这里只要求破解者使用QQ2008 ,被破解者则无要求,所以对破解而言是没有任何障碍的,你完全可以趁某人离开位置而没有关QQ时,用其QQ打开QQ游戏(当然,如果已经打开了,就不需要了),然后用上面的方法获得命令行,保存起来(例如保存到邮箱),然后回家慢慢破,呵呵(-@_@-)
 
现在我来解释一下:
QQUIN后面的相信你已经看出来了,其实就是QQ号,而PWDHASH是什么呢,它其实是密码通过MD5加密后,再经Base64转换而得的,C#代码如下:
 
string GetPWDHASH(string password)
{
    byte[] passwordBytes = Encoding.ASCII.GetBytes(password);
    byte[] md5Bytes = new System.Security.Cryptography.MD5CryptoServiceProvider().ComputeHash(passwordBytes);
    string base64 = Convert.ToBase64String(md5Bytes);
    return base64;
}
 
知道了加密原理,解密就不难了,但是由于MD5算法是哈希算法,不可逆的,所以我们只能获得其MD5值,没有十分有效的方法获得原始密码,获得MD5值的C#代码如下:
 
string GetMD5FromPWDHASH(string PWDHASH)
{
    byte[] md5Bytes = Convert.FromBase64String(PWDHASH);
    string md5 = BitConverter.ToString(md5Bytes).Replace(“-”, “”);
    return md5;
}
 
前面说到,MD5是不可逆的,但是也不是说完全不可破解,如果密码比较简单,可以采用暴力破解,不过我推荐使用在线MD5查询网站来破,比如http://www.cmd5.com。
 
当然,其实大可不必知道其真正的密码,因为你只需要知道其PWDHASH,你就已经可以使用该QQ进行登录了。
 
另外,现在有的网吧安全性比较差,可以直接使用WMI进行远程操作(WMI不在本文的讨论范畴,我只给一条命令,不作解释:/node:ip /user:administrator /password: “” process),这样就更爽了,只需要在网吧转一圈,观察哪些人在玩QQ游戏,然后就可以下手了,呵呵。
If you enjoyed this post, make sure [...]

返回顶部