2010年五月

PM(01)_What is project management

What is project management? Why need PM? Importance of PM?

  • Better control
  • Higher quality
  • Lower cost
  • Shorter time

Job function of project manager?

  • Define scope
  • Identify stakeholders and risk
  • Detail down job list
  • Estimate time/resource/budget
  • Develop structure/milestone
  • Change control
  • Report status

Who should be involved in stakeholders?

  • Sponsor
  • Project manager
  • Project team
  • Support staff (HR, Marketing, etc.)
  • Customer
  • Supplier
  • Opponents

Triple constrains:

  • Time
  • Cost
  • Scope


PHP:md5的返回值转化为两个int64的方法


背景:


在正常应用时,通常我们是直接使用md5对一个string类型的变量进行
加密,返回长度为32的十六进制表示的字符串,然后将其存储到mysql中。
现在如果在这个md5字符串建立索引,检索速度就不是很理想,现在需要改进的是将md5字符
串转化为两个int64的整数,然后在这个上面建立索引,检索速度会提高很多。
更多 >



快速开发一个PHP扩展[转载]

最近一直在学习php的扩展,一直实验不成功,直到看到这篇文章才算搞定demo.转载之

作者:heiyeluren
时间:2008-12-5
博客:
http://blog.csdn.net/heiyeshuwu
本文通过非常快速的方式讲解了如何制作一个PHP 5.2 环境的扩展(PHP Extension),希望能够在图文的方式下让想快速学习的朋友了解一下制作过程。
需求:比如开发一个叫做 heiyeluren  的扩展,扩展里就一个函数 heiyeluren_test(),输入一个字符串,函数返回:Your input string: xxxxx。
要求:了 解C/C++编程,熟悉PHP编程
环境:下载一份php对应版本的源码,我这里是 php-5.2.6,先正常安装php,假设我们的php安装在 /usr/local/php 目录,源码在 /root/soft/php/php-5.2.6/,现在开始! 更多 >



Cheezburgers and testing advice

My lead suggests us to read this article, the advices are so applied for my testing job. In the past, I always refused to coding, especially coding in testing, I don’t like to be a SDET. I think coding for SDET is uncreative, and the work is too dull. After reading the 16th tip, I get to realize coding in testing can be intresting.

I reprint it here for remember and wish the lucky you who run into this can learn a lot.

Following is the article:

I started to make a list of 10 tips I’d give to junior software testers.  But then I saw a talk by Ben Huh, of lolcats/icanhascheezburger fame.  Ben made the point that, with the internet, content is free, but the organization, editing, and presentation all require skill.

Inspired by Ben and the cheezburger franchise,  I asked 60 successful testers to each provide 3 tips they’d give to a junior tester.   I received tips back from more than 40 of the testers, and ended up with a list of more than 100 tips.

To respect their privacy, I won’t provide the verbatim tips here, but I did find it interesting that there was a lot of commonality and the tips were collectively much better than what I came up with.

I grouped the collected testing tips into these 19 themes.

1. Focus on the customer  Keep the customer in mind when testing.  Develop empathy for their needs.  Talk to customers and observe them using your software.

2. Read bugs  If you work with a group of testers, read all the bugs they log each day, especially any logged in the area you’re testing.  You can learn a lot from how other testers approach bug finding.

更多 >



Bug bash and ZBB

(一) Bug bash

Bug bash 即进行到每个阶段(MileStone)末期,集中精力,组织所有可能人员对项目中存在的bug全力搜寻一次。

这样做的好处是:

  1. 全民动员,集思广益,包括Dev,PM都可以参加;
  2. 鼓励各部门参加,新思路和新视角有助于发现新bug;

(二)ZBB-Zero Bug Bounce (零错误反弹)-软件稳定指示器

如果Dev在夜以继日的努力工作,bug数量应该是不断减少的趋势,为什么还会突然增多呢?

错误收敛:错误收敛是指整个项目组在控制活跃的bug数目方面取得了巨大成就,Dev解决的bug数目在某一个时刻超过了发现的bug数目,活跃bug数目呈现下降趋势。

Zero Bug Build: 是一个解决了所有已知bug的一个build。

在Zero bug build之后,会有一段时间bug数量惊人的上升时期,(由于现在的项目还没有到达这一时期,所以我猜想,应该是在零bug build 之后,做了bug bash,所以发现了大量的bug)



CVS update文件的提示信息说明

cvs updatecheckout 在执行中,会为每个文件打印一行提示信息,文件的状态通过前面的单个字符指明:

U filename
文件按要求从仓库得到更新。用在那些仓库里面有但你的工作目录没有的文件,以及工作目录里面没有修改 过,但旧于仓库的文件。
P filename
类似 `U‘, 但是 cvs 服务器发送的是补丁而不是整个文件。完成与 `U‘ 同样的工作,但降低带宽的使用。
A filename
添加到你的私人副本中,当你使用 commit 后会加到仓库。这可以提醒你需要提交文件。
R file
从你的私人副本中删除,当你执行 commit 命令后会从仓库清除。这可以提醒你文件需要提交。
M filename
在你的工作目录中,文件已经修改。 `M‘ 可以标明你工作的文件的两种状态: 同样的文件仓库里面没有修改,你的文件仍保持原样; 或者仓库里面的文件也有修改,但在工作目录里成功合并,没有冲突发生。如果合并,cvs 将打印一些信息,并建立工作文件的备份(与 update 执行前相同)。update 运行时会打印相应的名字。注意CVS只是将修改合并到你正在处理的拷贝中;仓库和其它的开发者目录没有受到影响。这时你应该测试合并后的文本, 并且确认它是有效的。这些修改还不能被别的开发者看到,需要你将其提交。

C filename
合并 你与仓库中修改到 file 时检测到冲突。file (你工作目录里面的副本) 是合并两个修订版的结果; 工作目录里面还有未修改文件的副本,名为 .#file.revision, 其中 revision 是你修改的文件所基于的修订版。冲突是必须要解决的。 (在有些系统里面,如果一段日子没有访问 .# 起头的文件,系统会自动清除。如果你需要保留这些原始的文件副本,最好将其改名)。
? filename
file 处于工作目录,但是仓库里面没有对应的文件,它们也不是 cvs 忽略的文件

本文地址:http://www.yaronspace.cn/blog/index.php/archives/616



Diskpart 命令行实用工具介绍

简单的东西还是自己学会比较好,免得每次都要求别人帮忙. 只适用于WinXP.

摘要

Diskpart 与许多命令行实用工具不同,原因是它不以单行模式操作。相反,当您启动该实用工具后,命令是从标准输入/输出 (I/O) 读取的。您可以将这些命令定向到任何磁盘、分区或卷。

与磁盘管理的比较

Diskpart 启用“磁盘管理”管理单元所支持的操作的超集。“磁盘管理”管理单元禁止您无意中执行可能会导致数据丢失的操作。建议您应谨慎使用 Diskpart 实用工具,因为 Diskpart 支持显式控制分区和卷。 可以使用 Diskpart 将基本磁盘转换为动态磁盘。基本磁盘可以为空,也可以包含主分区或逻辑驱动器。基本磁盘可以是数据磁盘、系统驱动器或启动驱动器。基本磁盘不能包含容错磁盘驱动程序 (FtDisk) 集,如带区或镜像等。要转换包含有 FtDisk 驱动程序集的基本磁盘,请使用 Windows 2000 上的“磁盘管理”,或者在升级到 Windows XP 之前转换磁盘。 可以使用 Diskpart 将动态磁盘转换为基本磁盘。进行转换前,必须删除所有动态卷。除非遇到紧急情况,否则不建议您删除动态磁盘上的分区。建议您删除驱动器上的所有卷,然后再将磁盘转换为基本磁盘。必须删除所有动态数据分区。另外,切勿混淆同一驱动器上的基本主分区和动态分区。否则,计算机可能无法重新启动。 您可以使用 Diskpart 以显式磁盘偏移量创建一个分区。“磁盘管理”管理单元将此分区放在任何占用区域的末端,或放在第一个足够大的区域上。在主启动记录 (MBR) 磁盘上,分区偏移量和大小都经过四舍五入,以保持必要的柱面对齐。偏移量四舍五入为最靠近的有效值,大小则始终四舍五入为下一个有效值。Diskpart 不为最近创建的分区分配驱动器号。使用 assign 命令可分配装入点或驱动器号。 Diskpart 遵循与管理单元同样的策略。只能在固定磁盘上创建动态磁盘。不能将可移动磁盘(如 1394 或通用串行总线 (USB) 驱动器)转换为动态磁盘。 Diskpart 允许执行管理单元禁止的某些分区删除操作。例如,您可以使用 Diskpart 删除 MBR OEM 分区。但是,这些分区中往往含有平台操作所必需的文件。Diskpart 禁止删除当前系统、启动或分页卷和分区。此外,Diskpart 还禁止删除作为动态磁盘基础的分区。 不能使用 Diskpart 在可移动媒体上创建分区。Windows 支持可移动媒体上至多有一个 MBR 分区。如果媒体在出厂时已带有一个 MBR,此 MBR 是不能修改的;但是,即使配置了多个分区或逻辑驱动器,仍然遵循此 MBR。如果媒体在出厂时不带 MBR,此媒体被视为“超级软盘”并且其中未写入分区结构。 可移动驱动器的驱动器号与驱动器关联,但不与媒体关联。您可以使用 Diskpart 更改此驱动器号。 Diskpart 导致产生了磁盘签名、GUID 分区表 (GPT) 磁盘全局唯一标识符 (GUID) 和 GPT 分区 GUID。不能使用 Diskpart 来显式设置这些项。 同管理单元一样,Diskpart 实用工具包括对新 Itanium 磁盘分区方案的支持,该方案称为 GPT。GPT 磁盘不能用于任何基于 x86 的 Windows XP 计算机或 Windows 2000 计算机。Diskpart 仅对空磁盘支持 GPT 分区向 MBR 分区的转换。 您可以使用 Diskpart 删除缺失的动态磁盘。动态磁盘包含共享数据库,一台计算机上的所有动态磁盘都识别此计算机上的所有其他动态磁盘。移动动态磁盘时,原始计算机将这些磁盘视为“缺失的”。 使用 Diskpart 时,驱动器号不能自动分配。要确保给定的分区或卷有驱动器号,必须显式地分配一个驱动器号。您可以分配此驱动器号,也可以允许分配下一个可用驱动器号。 更多 >



我心目中的编程高手[转载]

Bill Joy

Bill Joy, 前任Sun的首席科学家,当年在Berkeley时主持开发了最早版本的BSD。他还是vi和csh的作者。当然,Csh Programming Considered Harmful 是另一个话题乐。据说他想看看自己能不能写个操作系统,就在三天里写了个自己的Unix, 也就是BSD的前身。当然是传说了,但足见他的功力。另一个传说是,1980年初的时候,DARPA让BBN在Berkley Unix里加上BBN开发的TCP/IP代码。但当时还是研究生的B伯伯怒了,拒绝把BBNTCP/IP加入BSD,因为他觉得BBN的TCP/IP写得 不好。于是B伯伯出手了,端的是一箭封喉,很快就写出了高性能的伯克利版TCP/IP。当时BBN和DARPA签了巨额合同开发TCP/IPStack, 谁知他们的代码还不如一个研究生的好。于是他们开会。只见当时B伯伯穿个T-shirt出现在会议室(当时穿T-shirt不象现在,还是相当散漫的 哈)。只见BBN问:你怎么写出来的?而B伯伯答:简单,你读协议,然后编程就行了。最令偶晕倒的是,B伯伯硕士毕业后决定到工业界发展,于是就到了当时 只有一间办公室的Sun, 然后他就把Sparc设计出来乐。。。象这种软硬通吃的牛人,想不佩服都不行的说。据Bill Joy的同事说,一般开会的时候B伯伯总是拿一堆杂志漫不经心地读。但往往在关键之处,B伯伯发言,直切要害,提出漂亮的构想,让同事们彻底崩溃。对了, 他还是Java Spec和JINI的主要作者之一。

John Carmack

John Carmack,id Software的founder和Lead Programmer。上个月和一个搞图形的师兄聊天,他竟然不知道John Carmack, 也让偶大大地晕了一把。不过也许搞研究的和搞实战的多少有些隔吧。想必喜欢第一人称射击游戏的都知道J哥哥。90年代初只要能在PC上搞个小动画都能让人 惊叹一番的时候,J哥哥就推出了石破天惊的Castle Wolfstein, 然后再接再励,doom, doomII, Quake…每次都把3-D技术推到极致。J哥哥的简历上说自己的专长是”Exhaust 3-D technology”,真是牛人之言不我欺的说。做J哥哥这样的人是很幸福的,因为各大图形卡厂家一有了新产品就要向他“进贡” ,不然如果他的游戏不支持哪种卡,哪种卡基本就会夭折乐。当初MS的Direct3D也得听取他的意见,修改了不少API。当然,J哥哥在结婚前十数年如 一日地每天编程14小时以上,也是偶们凡人望尘莫及的。对了,J哥哥高中肆业(?),可以说是自学成才。不过呢,谁要用这个例子来为自己学习不好辩护,就 大错特错了。那 Leonardo Da Vinci还是自学成才呢(人是私生子,不能上学)。普通人和天才还是有区别的。对了,其实偶们叫“达分奇”是相当不对的,因为Vinci是地名,而Da Vinci就是从Vinci来的人的意思。换句话说,Leonardo Da Vinci就是“从Vinci来的Leonardo”的意思。叫别人“Da Vinci”就不知所谓乐。嗯,扯远了,打住。 More about Carmack Here

David Cutler

David Cutler,VMS和Windows NT的首席设计师,去微软前号称硅谷最牛的kernel开发员。当初他和他的手下在微软一周内把一个具备基本功能的bootable kernel写出来,然后说:“who can’t write an OS in a week?”,也是牛气冲天的说。顺便说一句,D爷爷到NT3.5时,管理1500名开发员,自己还兼做设计和编程,不改coder本色啊。D爷爷天生脾 气火爆,和人争论时喜欢双手猛击桌子以壮声势。:-) 日常交谈F-word不离口。他面试秘书时必问:”what do you think of the word ‘****’?” ,让无数美女刹羽而归。终于有一天,一个同样火爆的女面对这个问题脱口而出:”That’s my favorite word”。于是她被录取乐,为D爷爷工作到NT3.5发布。 更多 >



PHP中的Hash算法[转载]

Hash Table是PHP的核心,这话一点都不过分.

PHP的数组,关联数组,对象属性,函数表,符号表,等等都是用HashTable来做为容器的.

PHP的HashTable采用的拉链法来解决冲突, 这个自不用多说, 我今天主要关注的就是PHP的Hash算法, 和这个算法本身透露出来的一些思想.

PHP的Hash采用的是目前最为普遍的DJBX33A (Daniel J. Bernstein, Times 33 with Addition), 这个算法被广泛运用与多个软件项目,Apache, Perl和Berkeley DB等. 对于字符串而言这是目前所知道的最好的哈希算法,原因在于该算法的速度非常快,而且分类非常好(冲突小,分布均匀).

算法的核心思想就是: 更多 >



php中empty is_null isset 三者的区别

Comparisons of $x with PHP functions
Expression gettype() empty() is_null() isset() boolean : if($x)
$x = “”; string TRUE FALSE TRUE FALSE
$x = null NULL TRUE TRUE FALSE FALSE
var $x; NULL TRUE TRUE FALSE FALSE
$x is undefined NULL TRUE TRUE FALSE FALSE
$x = array(); array TRUE FALSE TRUE FALSE
$x = false; boolean TRUE FALSE TRUE FALSE
$x = true; boolean FALSE FALSE TRUE TRUE
$x = 1; integer FALSE FALSE TRUE TRUE
$x = 42; integer FALSE FALSE TRUE TRUE
$x = 0; integer TRUE FALSE TRUE FALSE
$x = -1; integer FALSE FALSE TRUE TRUE
$x = “1″; string FALSE FALSE TRUE TRUE
$x = “0″; string TRUE FALSE TRUE FALSE
$x = “-1″; string FALSE FALSE TRUE TRUE
$x = “php”; string FALSE FALSE TRUE TRUE
$x = “true”; string FALSE FALSE TRUE TRUE
$x = “false”; string FALSE FALSE TRUE TRUE

本文地址:http://www.yaronspace.cn/blog/index.php/archives/602