Zhang Jiuan’ Notes

asmlinkage, linux源代码

asmlinkage long sys_nice(int increment)
“asmlinkage” 是在 i386 system call 实作中相当重要的一个 gcc 标签(tag)。
当 system call handler 要呼叫相对应的 system call routine 时,便将一般用途暂存器的值 push 到 stack 里,因此 system call routine 就要由 stack 来读取 system call handler 传递的参数。这就是 asmlinkage 标签的用意。
system call handler 是 assembly code,system call routine(例如:sys_nice)是 C code,当 assembly code 呼叫 C function,并且是以 stack 方式传参数(parameter)时,在 C [...]

自动化测试中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 [...]

再贴一道老掉牙的智力测验题

题目目:
5个药瓶药粒数一样,其中一瓶药坏了,每粒药轻了1克,
原来是每粒药10克,怎样一次用天枰称出来是哪一瓶坏了
答案:
从第一瓶,第二瓶…第五瓶分别取1,2,3,4,5放在天枰一边,
另一边则放1+2+3+4+5=15颗放在另一边,一次便可得到
答案。详细就不用多讲了吧。
多谢
张久安
If you enjoyed this post, make sure you subscribe to my RSS feed!

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

为了即将忘却的纪念

雨水淋过的泥土味道总是很浓厚的。在这样的氛围下,放一部老电影是最适合不过的了。2010年3月10日,有些事终于可以有个了结了,虽然结局对团队是不公平的,但,这也算是一种解放吧。
2007年5月15日百度电子商务项目正式启动,不到10个人的团队,大家踌躇满志的集结在一起,为了一个远大的目标和愿景,愿意为提高中国网民生活水平而努力做一些事情。那时的电子商务,正处于一个混沌时代,没有人关注用户,也没有人关注商户,电子商务市场的用户数增长远远落后于产业规模的增长。
2007年9月,电子商务事业部正式成立,自最开始7个人的产品团队开始,在最初三个月里就完成了早期20人的产品+技术的核心开发团队组建,而就是这样一支团队,完成了几乎是百度有史以来规模最大、最复杂的产品设计和总体设计,什么概念呢?就是技术委员会评价有啊和百付宝系统后,认为其复杂程度相当于10倍的贴吧和知道。
百度电子商务平台,看上去植根于百度大公司,但可以说是白手起家:凭着当时的核心团队,完成了后续80多人的大团队,再到后来,就有上百人的规模。而这其中,公司转入不到20%,自主招聘超过80%。20个RD、10个PM、10个QA、7个前端、4个UE,一半的应届生和实习生,80%的人加入百度不足1年,6个月时间,编码带测试,6×12的强制工作强度,这些人做到了别人认为“不可能完成的任务”。
从2008年中旬开始,我们开始了全国的巡讲。就像普罗米修斯一样,我们将电子商务希望的火种带到全国各个地方。凡所到之处,场面之火爆、反响之热烈实属始料未及。几乎所有的商户,把我们当成了电子商务的救星,但很遗憾,我们才刚刚起步。
2008年中秋节,我们依旧在加班,产品即将上线,我们说:“keep walking”:一个小小的酿酒师Johnnie Walker用150年的执着专注,证明轩尼诗和芝华士和许许多多曾经风靡品牌的一统天下,不代表制酒业就容不下一个新的巨头,150年里的起起落落,坚持到底、不断进步才是胜利。第一瓶酒不论酿的是好还是坏,至少这是迈出了第一步。
同年9月25日,我们发布了商品和商店系统公测,当晚,数万商户几乎是同时涌进有啊测试平台。那天晚上,中国神舟七号发射成功,中国第一次载人航空飞行升天。
10月底,经过36小时的上线后,凭借心中的那一线光亮,持续了6个月的高强度研发,我们正式发布了有啊商城、检索系统和百付宝交易平台,零事故上线。我们在有啊的一个商户上订的蛋糕,被商户忠实的记录了下来。一年半不知疲倦的奋斗和努力,在那一晚上的泪水和笑声中,你就知道,什么都值了。
上线后的第二天,记忆非常恍惚,高烧中。
一个月后的11月,商品突破1000万件。有啊从0增长到10万商户、1000万商品,百度有啊只用了不到20天,发展速度是业内平均水平的500多倍。
2009年1月年会,电子商务事业部荣获百度2008年度最高容易:总裁特别奖。
市场是以结果为导向的,这是残酷的体现。业绩不行,必须有人负责,却无人为我们说话。事实的真相永远是被掌握话语权和媒体的人们/所谓的专家所掩盖,团队和个人的尊严不见去除。越是到困难的时候、越需要有人帮你挺一把的时候,越能让人清楚的看到谁是朋友、谁心怀不轨。当我们面临每月仅数千元市场推广费的无米之催时,当我们发现互联网上淘宝以外的商品网页资源越来越少的时候,当我们发现公司又想马儿跑、又不给马儿吃草后,一切都变了。但负责人的说,这样一支团队,这样群有梦想的人,却是比我看到过、听到过的那些为了市场业绩不择手段的所谓职业人要更加伟大、更加骄傲。如果当一个公司和内部的机制不能为这样的团队的成功而铺平道路,或者说这样一个团队不能发挥其应有的价值和作用,那么一定不是这个团队的问题。
历数一下我们对电子商务市场的贡献和创新吧,趁还能看到:
首创了实物交易与虚拟交易分离的信用机制(已被所有的C2C交易平台所采用);
大胆取消了折磨商户很久的“满意率”指标,首创了满意度打分的信用评价机制,并结合商户的认证资质证明等组成综合的信用认证体系;
首创了电子商务标准库交易模式,先后上线了手机产品库、化妆品产品库,改变了传统的C2C购物流程,攻克了若干技术难度(现已被竞争对手学习);
首创了智能订单聚合模式,能根据用户行为智能合并订单,并首次在C2C交易平台上以购物车+订单的模式提供给消费者(现已被竞争对手学习);
首创了电子商务会员订阅中心的商户营销平台(现已被竞争对手学习);
首创了搜索的按卖家聚合和新的搜索和筛选展现(现已被竞争对手学习)。
……
俞敏洪曾说:如果将人生一分为二, 前半段人生哲学是「不犹豫」,后半段人生哲学是「不后悔」。我想,在未来某个时候或者某个场合,哪怕这些忘却的记忆被人们提起,哪怕做过的事情对其他的人有那么一点帮助,拿这段记忆一定会在我们大家心中占有一个不会磨灭的记忆。最后,以明远对团队曾经的一段话作为结尾吧:
“走过的路是为经历,其实过去的成败与否,对自己的价值其实是一样的,这个价值在于你是否真正的注意到了你之前所走过的路、每一次坎坷和上下坡时谁是值得信赖的旅伴,哪里该快步通过,哪里该停留沉思。人走路,不是驴拉磨,低头拉磨固然也是keep walking,但驴创造的价值永远只是磨磨豆腐,吃豆腐的人不会感激驴,而唯有让走过的路有价值,用心、用腿、知行合一、全身配合着走,才少摔跟头、少走错路,走过的路和最后的所到之处才算得上有价值、值得走。从这个角度,自信、专注、科学、坚持必须兼顾而不是独专,稳稳的走下去。”
面北而望,泪已沾襟,不知所言。
《别董大》
(唐)高适
千里黄云白日曛,
北风吹雁雪纷纷。
莫愁前路无知己,
天下谁人不识君?
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!

返回顶部