2009-04
21

谢谢fcicq指出书中的一些错误。也请其他读者在发现错误后告诉我,如果这本书有幸重印,我会在重印时改正这些错误的。给大家阅读带来不便,真是对不起。

P3,倒数第2段第3行:
用户想把音量调低,但我却没有把它设置到一个较高的音量,以便用户能通过软件来控制它。
修改为:
音箱的音量太小了,我根本没想到应该把音量调大些,这样用户才能通过软件来控制音量。

P5,最后两行:
以及如何进行高可用性的开发。
修改为:
以及如何开始符合高可用性的开发。

P37,“试一试”的第一行:
什么沟通障碍可能会阻碍项目创建高可用性?
修改为:
什么样的沟通障碍可能会阻碍项目创建高可用性?

P57,第2段第4行
请习惯这个思维。
修改为:
拥有这种想法很重要。


2009-03
28

工作中写商务文书是必不可少的,如报告、文档、请求、邮件等等。 而搞技术出身的人,写作能力一般都很差,写出来的东西别人看不懂。 这篇文章 提出了写好商务文书的九个要点,也许能给广大搞技术的人作为参考吧。

写好文章当然不是要求你写出人人都说好的文章,那需要相当深厚的文字功底, 咱搞技术的也没那么多时间。所以降低一点标准,至少要写出没人说不好的文章来。 那么要点是什么呢?

  1. 写明观点
  2. 写明理由
  3. 按照结构化层次来书写
  4. 概要和详细内容分开写
  5. 一句话说明
  6. 不要抽象,要具体
  7. 不要随意省略
  8. 事实和意见分开写
  9. 明确论点

具体内容请点开看。

阅读全文 »

2009-02
26

最近想用VC写一个抓图程序。好久没用VC了,绝大部分知识都忘得一干二净了。 经过查阅无数资料之后终于得出一个差不多像样的程序来。 在这里说说基本思路吧。代码就不上了。

阅读全文 »

2009-02
14

很多人都不知道需求分析应该怎么做,我也不知道。 而《代码大全2》上这个checklist能帮助你判断需求分析是不是做好了。

来源:代码大全2,电子工业出版社,P42。

阅读全文 »

2008-12
28

这两天不知从何时起,第一次打开IE访问网站,就会弹出一个广告窗口,指向 //www.97tl.cn 的。(前面省略了http) 今天终于忍无可忍下决心将它清除。用HijackThis扫描了一遍,发现了这个东西:

hijackthis.png

从属性中发现它指向C:\Windows\system32\NaviHelper.dll111,显然是个广告软件:

navihelper.png

用HijackThis修复之后就好了。



2008-10
28

在处理多语言编码、使用UTF-8时,偶尔会遇到这个我称之为“c3c2问题”的问题。花了一天时间好不容易找到了原因所在,写在这里希望对遇到的人有所帮助。基于Perl语言写的,可能是Perl的专有问题,不过其他的语言若遇到类似的现象也可作为参考。

现象

进行编码转换时出现乱码。转换后的结果类似于下面的样子:

c3 a3 c2 81 c2 82 ...

看起来就像是正确的字符序列中加入了许多\xc3、\xc2的字符。

原因

对非utf-8字符序列进行 utf8::encode 或者 Encode::from_to($str, 'utf8', '...') 等,就会出现 c3 a3 c2 81... 一样的字符。 也就是说,把不是utf8编码的东西当作utf8编码来使用,就出现这个现象。

例如下面的例子。

#!/usr/bin/perl

use Encode;

$str1 = "あああ";
utf8::decode($str1);
$str1 .= "あああ";
utf8::encode($str1);
print $str1;

print "----";

$str2 = "あああ";
Encode::from_to($str2, "UTF-8", "Shift_JIS");
utf8::encode($str2);
print $str2;

执行结果如下:

$ perl mojibake.pl  | xxd
0000000: e381 82e3 8182 e381 82c3 a3c2 81c2 82c3  ................
0000010: a3c2 81c2 82c3 a3c2 81c2 822d 2d2d 2dc2  ...........----.
0000020: 82c2 a0c2 82c2 a0c2 82c2 a0              ...........

这里$str1是utf8字符流和字节流的混合体(实际上这是不对的),$str2是将shift-jis的字节流进行encode。其结果都会产生大量的\xc3和\xc2。

可能的原因:

  1. 将decode过的字符串和未decode的字符串连接在一起使用
  2. 对字符串连续进行两次 utf8 -> 其他编码的转换


2008-10
15

这个题目似乎有些不太合适,因为这并不是我们常说的引用传递和值传递。但是我想提醒大家这一点,否则很容易犯错误。

问题:map语句的代码段中使用的 $_,是列表中的值本身,还是将列表中的值复制到 $_ 中?

例如,下面这段程序的运行结果是什么呢?

#!/usr/bin/perl

$,=',', $\="\n";

$a = [1,2,3];
print map { ++$_; } @$a;     # (A)
print @$a;                   # (B)

C程序员们通常会认为map会将@$a中的每个值复制到 $_ 中,加一后返回(这里我特地用了 ++$_ 使得它返回加一之后的值), 因此(A)行输出 2,3,4 ,而(B)行输出 1,2,3 。实则不然。运行结果为

2,3,4
2,3,4

可见,并非@$a中的元素复制到$_中,而是$_本身就是@$a中的元素。而map的目的就是要改变操作数的值。 下面这个例子可以很清楚地看到这一点。

map { ++$_ } (1,2,3);    # 运行时出错,++$_ 不能改变常量

类似地,grep的结果也是数组本身,返回值就是由操作数中的符合条件的元素本身组成的列表。如上例:

map { ++$_; } grep { $_ > 1 } @$a;  # 运行后 $a 为 [1,3,4]

如果实在不想让map改变操作数的值,可以将操作数转成引用之后再强制转成数组:

map { ++$_; } @{[ @$a ]};    # 运行后 $a 为 [1,2,3]

当然,上面例子中 ++ 操作符很明显会改变操作数的值,因此意识到上面的问题并不困难。 不过如果是 s/// 运算符,可能就不那么明显了。

类似的情况还有函数调用时的 @_ ,它代表调用函数时的实际参数本身,而不是实际参数的拷贝。 对@_进行修改,会直接影响到实参(就像C语言里面的传指针一样)。

一般我们在定义函数时都这么写:

sub foo {
  my $arg1 = shift;
}

参数多时可能会这么写:

sub foo {
  my ($arg1, $arg2, $arg3) = @_;
}

这样写之后,@_的值就被赋给了$arg1、$arg2等变量,以后对$arg1、$arg2的修改不会影响到实际参数。 但如果想修改实际参数,就要这样做:

my $arg1 = \$_[0];
$$arg1 = 'Hello!';        # 调用函数时的第一个实参会变成 Hello!


2008-08
19

Perl对YAML的支持很好,著名的Plagger就是用YAML作为配置文件的。

在Perl中读取YAML文件也很简单。常用的模块就是YAML,这是个纯Perl的实现,速度慢,但可以跨平台运行。 如果追求运行速度而不在乎平台问题,可以使用YAML::Syck和YAML::XS,两者都是C语言的实现。 YAML::Syck的C语言部分基于libsyck,而YAML::XS的C语言部分基于libyaml。 两者相比,YAML::XS稍稍快一点,而且它精确地实现了YAML标准1.1版的内容。

阅读全文 »

2008-07
27

这年头BlackBerry 7230的激活已经是老掉牙的话题了。其实原理相当简单, 无非是让BB做个到MDS服务器的连接,连上MDS之后BB就认为自己激活了, 然后就能使用cnwap正常上网了。maxpda上也有高人贴出了 自建MDS服务器进行激活的办法。

简单来说,BlackBerry 7230激活的过程如下:

  1. 导入ServiceBook,其中IPPP的IP地址需要指向MDS服务器。
  2. 在Options->Service Book中恢复删除所有内容。
  3. 设置Options->TCP的APN为空。
  4. 以上的设置是保证BlackBerry 7230能使用ServiceBook中设置的MDS服务器进行连接。
  5. 然后启动任意一款能不通过WAP建立网络连接的程序。QQ3可以,自带的浏览器似乎不行。
  6. 使用该程序建立直接的网络连接(不能走WAP)。
  7. 待BlackBerry 7230连接到MDS服务器之后,激活成功。
  8. 此时在Service Book中删除IPPP,并设置TCP的APN为cmwap,就可以用WAP上网了。
阅读全文 »

2008-07
20
PHP+MySQL八大动态Web应用实战

豆瓣上的介绍, 购买此书: 当当, 卓越, ChinaPub, 蔚蓝

这本书是今年二月份翻译的,两个人合作,用了一个半月的时间翻译+校对,虽然进度安排比较紧,但总算是按时交了稿,翻译的质量也还说得过去。

上周接到博文视点的消息,说这本书已经出版了,样书已经寄出来了。不过我还没收到,估计下周就能收到样书了吧。到网上查了查,发现各大书店已经开始卖了。

这本书的内容主要是面向PHP初学者的,但正如作者在前言中所述,这本书不会教你PHP和MySQL的基础知识,而是通过实际的项目进行讲解,在项目进展的过程中逐步地讲授需要的知识。个人认为这种方法要比教科书的好得多。我们在实际工作中学习也与之类似,不会有人去一步步手把手地教你怎样学习,都是直接将新人投入到项目中,在项目中磨砺。

书中介绍了八个实际可用的项目,除了基本的PHP和MySQL之外,还有较为新颖的Ajax、较高深的PEAR等内容。初学者通过这些项目可以切实地体会到PHP的方便性,而稍有基础的人则可以将书中的例子直接拿来,简单修改后即可直接放在网站上使用。当然,如果你已经是PHP高手,那么能从此书中学到的内容就有限了。

当然,本书自身也有一些不足之处,或许是因为作者精于技术但不善表达的缘故,书中一些概念的解释不太容易理解。加之我们英文水平有限,许多原文中的俗语都无法精确翻译出来,也影响了原文意思的表达。还望读者在阅读的过程中,借助Google、百度等搜索引擎,主动去查找那些难以理解的概念。另外,我们尽最大的努力保持翻译结果符合原意,但难免有疏漏之处,希望读者能够指出。