2006年7月20日星期四

银行感言(一)

Chapter One

  越来越多的银行用上了排队叫号系统。这应该是一种进步。在它面前,国人那乱插队的劣根性会稍稍地收敛一点。
  然而,也常常有人不知道如何用它,因此,一名称职的保安或大堂经理是必须的。否则如果取号机和业务柜台离得比较远,那柜员就得费上一番口舌了。
  我在想,在取号机的号码单上印上广告,应该是比较有效果的。百无聊赖地等待叫号的顾客,在坐在座位上呆呆地无事可做的时候,翻看手中那张小纸条是很正常的事情。进而地,在顾客位置的对面贴上广告,应该也是不错的选择。
  退一步讲,在号码单上印上公益广告、名言警句,甚至一则小笑话,应该都会对客户关系起到很不错的效果。可惜,似乎没有人这样去想啊。
  我想到了,可是我无意去落实。还是交给有心有力的人去完成吧。

Chapter Two

  写叁,却不小心写成了参,被退回,好生脸红。
  写圆,却被告知不必大写,元即可,别园就好。

Chapter Three

  去中国银行打印存折,发现有两笔0.30的很奇怪的支出。想了半天,突然想起那杀千刀的“跨行查询手续费”。
  细细想来,果然是它。我还以为是四大银行的ATM上查别人的卡会被收,没想到它们的卡拿到别人的机器上也会被收。是被抵制了吧?
  我也要开始抵制了。仗着自己垄断胡作非为,多行不义必自毙。决定了以后不到万不得已不去办四大银行的卡了。

2006年7月19日星期三

RedHat Linux 7.3下编译libxml2 2.6.24遇到的问题和解决方法

  单位的测试服务器是很早以前装的RedHat Linux 7.3。说是“测试服务器”,但由于种种原因,在上面已经跑了很多应用,再也离不开了,所以也没有办法把操作系统更新成比较新的版本。
  大概是昨天或今天早上的某个时候,这台机器被人重启了(或者是自己重启了),然后就死在了启动过程中。下午有人找我报告,才发现这个情况。再次重启之后,机器是没有问题了,但是又再一次体验了那满屏幕的问号。——老毛病了,每次自动启动的时候Apache+PHP的应用访问Oracle得到的多字节字符编码总是不对,重启一次Apache就好了。一直不知道是什么原因。
  心念一动,正好趁这个机会把这台服务器上的Apache+PHP+MySQL,以及周边的那些,如OpenSSL、libpng、libiconv等等,给重新整理一遍,应用上最新(或者说可用的最新)版本。
  OpenSSL、libiconv+gettext、libjpeg、libpng……,都很顺利。原本以为这些版本很新的东西会在不完全符合ANSI C++规范的2.96版GCC编译器上出问题,没想到居然一路绿灯。不过,好景不长,在libxml2-2.6.24上卡住了。
  错误信息包含下面几句:
……
xmlIO.c: In function `xmlCheckFilename':
xmlIO.c:619: syntax error before `struct'
xmlIO.c:621: `stat_buffer' undeclared (first use in this function)
……
  这种语法错误,不像是编译器版本的问题。我先试着跳过这一步,继续下面的安装。不过在编译PHP 5.1.4的时候,configure报告说需要libxml2的2.6.11以上版本,而我这台机器上以前的libxml2的版本只是2.6.7。显然,这个问题是无法回避了。
  拿错误信息去查,只有FreeBSD的技术支持站点上有一条bug报告的记录。不过可喜的是,报告中也附上了修正方法。经测试,该方法对于我的RedHat Linux 7.3也同样有效。
  以下转自该文:
Fix:
*** xmlIO.c.DIST Sat Apr 29 09:44:16 2006
--- xmlIO.c Sat Apr 29 09:44:35 2006
***************
*** 616,621 ****
--- 616,622 ----
}
#else
#ifdef HAVE_STAT
+ {
struct stat stat_buffer;
if (stat(path, &stat_buffer) == -1)
***************
*** 625,630 ****
--- 626,632 ----
if (S_ISDIR(stat_buffer.st_mode))
return 2;
#endif /* S_ISDIR */
+ }
#endif /* HAVE_STAT */
#endif /* WIN32 */
  想要修复这个错误的朋友,若看不懂上面的意思,就注意那两行标了加号的地方。原来的xmlIO.c,是没有这两行的,找到它们的位置后把它们补上,就可以通过编译了。行号人家也标出来了,在原xmlIO.c文件的616~621行附近。
  若看到这里还不明白,那就只好委屈了……

2006年7月14日星期五

单字符链接在某些手机上的问题

  关于WAP浏览器的由来已久的一个问题,出现在Nokia6260上。
  我做了一个WAP网站,其中有些页面是类似这个样子:

标题1
标题2
标题3

1 2 3
返回上一页
返回首页

  在公司的那台破"测试机"N6260的WAP浏览器上,这下面的1、2、3这些翻页的链接,常常无法把输入焦点移到它们上面。屏幕在卷动,焦点就是不动。在我的QD上却不会这个样子。

  测试了多种情况,最后发现是因为这些链接的字数太少的缘故。只有一个字符的时候,就有时候会出现这个怪毛病,特别是当这些单字符链接出现在接近滚屏的位置上时。我把链接的<a></a>标签中的内容加了一个&#x20;,即一个空格,就不会有上述问题发生了。

  写在这里,作为一个疑难杂症的处理笔记。

2006年7月5日星期三

关于表格内文字换行的再研究


  通常,搞Web开发的都会遇到这个问题,就是苦心设计的表格被讨厌的一连串英文字符给撑破了。最常见的是自己开发的论坛或留言板,如果有一个情绪激动的家伙打了百来个英文的感叹号,那往往就会出现内容在这些感叹号上不换行,结果让表格撑破,页面变得乱七八糟。
  解决这个问题的办法,相信很多朋友都知道了。通过CSS中指定几个样式,可以比较满意地解决这个问题。一个是word-break:break-all,一个是word-wrap:break-word,表格中的文字则还有一个是table标签的table-layout:fixed样式。这三个样式给定之后,就不会再遇到表格被文字顶破的问题了。
  稍稍解释一下上面三个样式。word-break:break-all是让英文单词中部的换行成为可能,比如
beau
tiful

  word-break样式还有另外两个取值。一个是normal,就是通常默认的,对中文断字而对英文单词不断的情况。另一个是keep-all,是对中文,准确地说是亚洲文字也不断字。然而,和字面上的理解意思不同,keep-all并不能让一个英文句子不被换行。要做到这一点的方法,稍后我会谈到。
  word-wrap:break-word是让连续的符号(如!号)之间进行断字成为可能。这是解决那种一大串感叹号造成的问题的一个关键。没有这个样式的话,对连续符号的断字不会发生。
  另一个关键是table-layout:fixed。它指明说表格不要去试图自己计算宽度,就按照HTML中定义的宽度来显示就好。只有当table-layout:fixed和word-wrap:break-word同时指定时,针对连续符号的断字才会正确发生。缺少table-layout:fixed,断字不会发生,表格仍被撑大。缺少word-wrap:break-word,则表格不会被撑大,但断字不会发生,超过显示区域的内容将被hide。

  好了,知道了如何让所有内容都断字换行之后,另一个问题来了:如何让所有内容都不断字换行?
  我们知道,即使指定word-break:keep-all样式,也无法阻止一个英文句子在空格处不被换行。而且汉字中的某些标点符号,浏览器也会很“智能”地把它给换行掉(起码IE会,这就足够了)。然而,一个好消息是,虽然要求不断字的情况远比要求断字要少见,但它的实现方法却相当简单。你只要把内容用<nobr></nobr>标签对括起来就行。被<nobr></nobr>标签对括起来的内容,浏览器绝对不会对它进行换行。只要记住这一点就很好办了。
  不过,想让内容不换行的同时,通常并不希望表格宽度因此而变得不确定。因此,常常也需要指定一个table-layout:fixed的样式。这样,就可以让表格宽度维持设计时的大小不变,或者通过指定相对宽度来维持一个固定的比率,而并不受单元格中内容的任何影响。在设计自适应屏幕宽度的标题列表表格时,这个技术也许会有些用处。