折腾O2 Joggler

  由于我的WD My Book World Edition在内存升级过程中遇难,好友给我介绍了一个新玩具:O2 Joggler电子相框,它是一个OpenPeak给O2 OEM的产品。

  记得曾经某人在拿到作为T公司20周年纪念品的电子相框后,在第一时间把它大卸八块,然后失望的把它合起来——一个基于VCD芯片做的相框实在没有什么好折腾的。相比之下,O2 Joggler的硬件配置就很有折腾的余地:Intel Atom Z520 1.33 CPU, 512 RAM, 1G Flash, GMA500, 7寸800*480电容触摸屏, RT8169 1000M网卡, RA2870 802.11N无线网卡, 1 USB 2.0。而曾经在HiPDA论坛上的团购价格已经低至450元。

相机不在手头,就从网上找个图吧
相机不在手头,就从网上找个图吧

  虽然配置不错,不过很快就会发现它做什么东西都有软肋:做下载机要外接硬盘,做平板电脑用的话它没有电池,做车载多媒体设备的话它没有GPS和3G模块,做高清播放盒吧它没有视频输出接口。我的目的还是用它做下载机,所以直接用硬盘底座外挂3.5寸硬盘,按着当年折腾My Book的方法折腾它。

  操作系统选择:理论上任何可以通过EFI引导的x86操作系统都可以。出于驱动的原因,目前比较完善的还是基于Ubuntu的GNU/Linux发行版,尤其是适合于Netbook的REMIX或者Mint,Android 2.2的工作还在进行中。我还是选择了我最熟悉的Debian,虽然这也许不是个最好的选择。编译Linux Kernel需要的Patch在这里有个列表。Joggler自己有一个原生的定制过的GNU Linux操作系统,也可以用于实现各种应用,但各种前端应用都需要基于Flash来做。

  操作系统安装:网上有不少已经装好的镜象,可以直接用。对于我来说,则是用debootstrap装一个干净的Debian才会比较合我口味,大部分的工作可以参考JogglerWiki上的这篇文章来完成。目前,标准安装一个Debian + XFCE的桌面,基本上可以把大小控制在1G以内,这样就可以把操作系统放到Joggler内置的Flash中。当然,在实验各种系统时,还是先放在U盘上外置引导会比较让人放心,因为这样完全不会动到原来的系统,就不致于把Joggler变成砖头。

  应用软件:反正是个标准的x86的GNU Linux,其它应用软件您该怎么装怎么装吧……从这个角度来说,Joggler太像一台真正的电脑了,所以反而也没有太多可以折腾的地方。

  目前Joggler相关的资料比较完整的地方是JogglerWiki,我在这里索引一下比较有用的一些信息。

  1. 拆机视频:拆机可以把USB无线网卡拨掉换成个大U盘内置,可以接出更多USB口,可以换CPU散热片(目前相框的支架就是CPU的散热装置,最好别把它拆了),加装ZIF接口的PATA硬盘

  2. Joggler的有线网卡没有MAC地址,必须用软件设置

  3. 内置Flash跟外置的U盘一样可以引导系统,你可以用fdisk对它重新分区合并使用。但必须保持第一个分区是FAT的EFI的引导分区。这里有些资料可以参考。Joggler不是很容易变砖的,实在你很不幸的把它变砖以后,还可以通过热插拔EFI芯片解决。

  4. 内置喇叭在闲置时可能会会轻微爆音,MS是由于CPU节能引起,解决方法有若干种,但好像不是每个人都说有效。

  5. 在我这里外置USB硬盘有时会出现异常断开的问题,这个问题对于下载机来说会非常致命,尤其如果系统是装在USB设备上的话,会直接导致系统死掉。目前的线索是一个Ubuntu的一个BUG报告,不过我还没有试成功,而最近几天这个问题却似乎没再出现。

  6. 很多人报告Joggler发热量太大,70度以上后自动降频后慢到无法使用。但我这里没有出现过,温度一般在35-41度左右,长期开Flash应用(比如豆瓣电台)会升到51度。如果屏幕长期打开会更热一些。

  7. 在我的系统中,Google Chrome常常会导致系统完全死锁,不知道是不是跟这个有关,总之我直接换用Firefox绕过了这个问题。

  8. Joggler还有一个很不起眼的设备,那就是它顶上的一个光线传感器,加载i2c的模块后,可以用程序读它的数据,通常可以用来调整屏幕亮度用。相关代码在这里

  9. 理论上Joggler的硬件配置播放1080p的高清视频是没有问题的,当然你需要自己编译一个VAAPI的mplayer。不过我这里实测结果是720p的视频播放基本问题不大,但1080p还是基本没戏,我对此表示无鸭梨,难道我真的需要在这么小的屏幕上放这么高清的视频么?

  目前我的Joggler在我这里是勤勤恳恳的运行rtorrent和amule-daemon做下载机,用cronjob打开豆瓣电台做闹钟。更多的应用就慢慢再开发了。

关注2011维也纳新年音乐会

  继续维持传统,第七次写名为关注xxxx维也纳新年音乐会的Blog。前几篇在:2005 2006 2007 2008 2009 2010

  这几天360和QQ闹得天翻地覆,这两个软件我都用得不多,所以就只是看看热闹。不用QQ的主要原因还是在于它没有一个可靠的Linux客户端,而带来的主要损失就是无法从QQ群中获得一些最新的信息,幸亏有好友通过别的渠道给我传递一些消息,所以才得以在第一时间获得有关2011年维也纳新年音乐会的消息。

  01 Johann Strauss II - Reiter-Marsch; op. 428 - 骑兵进行曲 - 1995

  02 Johann Strauss II - Donauweibchen; Walzer; op. 427 - 多瑙河女妖圆舞曲 - 1990,1999

  03 Johann Strauss II - Amazonen Polka; op. 9 - 亚马逊女战士波尔卡

  04 Johann Strauss II - Debut Quadrille; op. 2 - 首次登场四对舞

  05 Josef Lanner - Die Schonbrunner; Walzer; op. 200 - 美丽的布尔诺人(美泉宫的人们)圆舞曲 - 1994,2001

  06 Johann Strauss II - Muthig Voran!; Polka schnell; op.432 - 勇往直前快速波尔卡

  07 Johann Strauss II - Csárdás aus 'Ritter Pasman'; op. 441-1 - 查尔达什舞曲,选自《骑士帕斯曼》- 1967,1989,2000

  08 Johann Strauss II - Abschieds Rufe; Walzer; op. 179 - 告别之声圆舞曲

  09 Johann Strauss I - Furioso-Galopp; op. 114 - 激情加洛普 - 1999,2007

  10 Franz Liszt - Mephisto Walzer No.1 - 梅菲斯托圆舞曲第一号

  11 Josef Strauss - Aus der Ferne; Polka Mazur; op. 270 - 自远方玛祖卡波尔卡 - 1983,1994

  12 Johann Strauss II - Spanischer Marsch; op. 433 - 西班牙人进行曲 - 2006

  13 Joseph Hellmesberger jun. - Zigeunerin Tanz aus Ballet; Die Perle von Iberien - 吉普赛舞曲

  14 Johann Strauss I - Chachucha-Galopp; op. 97 - 卡楚恰加洛普 - 2004

  15 Josef Strauss - Mein Lebenslauf ist Lieb' und Lust; Walzer; op. 263 - 我的生平经历是爱与希望圆舞曲 - 1995

  16 Eduard Strauss - Ohne Aufenthalt; Polka-schnell; op. 112 - 永不休止快速波尔卡 *

  17 Johann Strauss II - An der schönen blauen Donau; Walzer; op. 314 - 蓝色多瑙河圆舞曲

  18 Johann Strauss I - Radetzky-Marsch; op. 228 - 拉德茨基进行曲

  担任2011年维也纳新年音乐会指挥的是奥地利本土指挥家弗朗兹·威尔瑟-莫斯特(Franz Welser-Möst),这将是他首次登上维也纳新年音乐会的指挥台。莫斯特现在是克利夫兰管弦乐团的首席指挥,并在不久前刚刚出任维也纳国立歌剧院艺术总监。虽然以前不是太了解这位指挥家,也没有欣赏过他的作品,但仍然非常期待他在新年音乐会上的首次亮相,因为在这个指挥台上,每一次出现新的面孔都能为这场传统的音乐盛宴带来新的气息。

  今年的曲目单中有7首从未在新年音乐会上演奏过的新曲子,这在最近几年来看算是最多的一次。新曲子中既有欢快的波尔卡和四对舞曲,也有温文尔雅的圆舞曲,尤其值得一提的是今年还将演出一首李斯特的圆舞曲作品,2011年是李斯特诞辰200周年。每年这些纪念音乐家而加入新年音乐会的非施特劳斯家族的作品都会带来不一样的味道。虽然李斯特的作品是第一次入选新年音乐会,但实际上,1999年和2007年并将在2011年再次出现的老约翰的《激情加洛普》的旋律就是跟据李斯特的《钟》的旋律所创作的,不过《钟》其实也是李斯特跟据帕格尼尼的同名小提琴曲改编而成的钢琴曲。

  其它的曲子中,也没有包括太多的“陈词滥调”,很多都是仅仅在新年音乐会上出现过一次的优秀作品,比如约瑟夫的两首玛祖卡和圆舞曲,旋律都非常优美,值得期待。约瑟夫·赫尔梅斯伯格和约瑟夫·兰纳的作品算得上是新年音乐会的常客了,他们的作品风格与施特劳斯家族比较相近,所以也常常入选新年音乐会。今年的赫尔梅斯伯格的新曲吉普赛舞曲应该会给人们带来耳目一新的感觉。

  音乐会以进行曲开场的传统没有变,但下半场的开场却没有像往常一样选择一首序曲,而是选择了查尔达什舞曲,总得来说这个曲子也还是挺有序曲的气质的,个人觉得放在下半场的开场还算是个不错的选择。

  时隔一年,传奇式导演布莱恩·拉奇再次回到新年音乐会的导演位置上,这位导演过18届维也纳新年音乐会的神奇人物每年都以他传统的方式,用镜头细腻的为全世界的观众诠释音乐之美。据说他导演音乐会都是直接用的是指挥的总谱,他对演出的每一个曲目都做到烂熟于心,确保跟据乐曲的旋律和配器,在最合适的时候把镜头切换到相应的角度,让画面与音乐同步展现出乐曲最核心的意境。

  维也纳的金色大厅、指挥家和维也纳爱乐乐团、维也纳国家歌剧院芭蕾舞团的艺术家、意大利阳光之城圣雷莫的美丽鲜花,还有ORF的电视转播工作者们,在每一个新年的第一天到来之时,为全世界的人们带来艺术的享受,让我们一同期待。

calibre使用技巧与常见问题

  最近因为开发盛大锦书Bambook的SNB格式的calibre插件,更多的使用了calibre和研究了它的实现,也在论坛上看很多对calibre使用上的问题。干脆在这里写上一贴,把常见问题(尤其是中文相关的问题)做一总结。本文会不定期更新。

  1. 什么是calibre?

  calibre是一个一站式的电子书籍管理软件,提供电子书籍管理、元信息整理、格式转换、阅读设备书籍同步、新闻下载等功能。可以近似把它类比为电子书界的iTunes。它使用Python开发,是一个跨平台的自由软件。

  calibre不是一个电子书下载软件,它只能从网上下载书籍的信息,但不能下载书籍本身。calibre不是电子书制作工具,虽然它提供格式转换功能,且在转换过程中提供一些定制功能,但这些功能非常有限,并不能用于精细控制和从头制作电子书。

  2. calibre的优缺点

  优点是功能全,可定制化程度高,可以折腾。缺点是体积庞大、速度慢、BUG较多(不过修得很快)。

  3. 中文TXT文件转换成别的格式后全部变为乱码

  因为Windows上大部分中文TXT文件是用System Codepage编码的,而calibre默认用UTF-8编码解析。解决方法是:可以把文件转成UTF-8编码后再放入calibre转换格式;也可以在calibre的转换对话框中左边选择“外观”,然后在右侧的“输入字符编码”中填入“gbk”或“gb18030”,calibre就可以正常转换格式了。

  4. 自动生成的封面图片中的中文字符变成问号

  calibre自带并硬编码了一些字体文件,这些字体中不包含中文字符,渲染出来的图片就只能显示成问号了。解决方案是用中文字体替换掉英文字体:在calibre安装目录下找到resources\fonts\liberation目录,用中文字体(比如文泉驿微米黑)替换掉里面的LiberationMono-Regular.ttf和LiberationSerif-Bold.ttf即可(删除原来的字体文件,把中文字体文件放进去并改名成这两个名字)。

  5. “保存到磁盘”和“发送到设备”后中文文件名变为拼音

  为了保证在各个平台各种文件系统下文件都可以正常的保存,calibre的作者采用了把非英语字符转为英语字符的方式来解决多语言文件名,中文就变成拼音了。对于“保存到磁盘”,可以去掉“首选项”->“保存图书到磁盘”->“将非英语字符转换为对应英语字符”的选项来强制calibre以原始字符保存文件名。不过这个功能有Bug,对于有些字符,保存后会乱码。对于“发送到设备”,目前没有解决方案。有关这个问题,目前正在与calibre作者积极沟通中,寻找最佳的解决方案。不过总的来说,只有极少数阅读器设备(如iRiver Story)的书架是用文件名而不是用图书元信息来显示的,所以对大部分阅读器而言即使用拼音文件名也不会带来太多的不便。

  6. 什么叫“作者排序”?

  老外的名字常常是名在前,姓在后,而称呼他们的时候又常常要用姓。比如Bill Gates,我们通常称呼他为Gates,这样如果直接用Bill Gates来排序所有的作者,就会不太好找。为了解决这个问题,常常就把“作者”字段设为“Bill Gates”,把“作者排序”字段设为“Gates, Bill”,这样就又好看又好找了。对于中文书籍的作者字段来说,其实是基本不存在这个问题的,直接把两个字段设成相同的就可以了。所以“作者排序”的实际含义是“用于排序的作者名字表示方式”,只不过这个词实在不知道有什么好的翻译方式,就只好用了这个生硬而难以理解的直译。

  如果您有任何有关calibre的问题,可以下面留言提出,我会尽量解答并挑选有代表性的放入正文。我也会不定期更新本文,添加更多常见的问题和calibre的使用技巧。

盛大Bambook锦书首发体验

  虽然有段时间不太看好E Ink了,但上个月还是莫名其妙脑子发热预定了一个盛大的Bambook锦书。最近E Ink产品价格有很大松动,不过至少在一个月前,6寸屏的E Ink卖999的价格还是比较厚道的。

  盛大对内测用户的不公对待和9月28日这样尴尬的发布日期(考虑到长假和物流速度)引发争议和失望无数,还好最后还是争了一口气(也要多亏那常常不争气的宅急送也争了口气),让一小半的预定用户在28日当天收到了Bambook,剩下的应该也有一大半可以在长假前收到。

  谈谈到货后的第一体验。在快递员面前当面打开包装验机:包装没得说,内外两层都不错。Bambook自身的设计也算漂亮,做工精致,比某个号称做礼品级电纸书的厂商的产品要精美的多。开机速度则很让等着我验货快递员GG觉得不爽:大约需要90秒的时间,还好电子书很少需要关机。打开包装开机前屏幕上没有任何显示,其实如果像Kindle一样默认可以显示一个简单的使用说明也许会是个不错的设计。开机后有一个新用户向导,马马虎虎。

盛大Bambook锦书
盛大Bambook锦书

  Bambook使用的是16级灰度的E Ink屏幕,指标上来看是不错的,不过如果只是看小说,也没有什么用处。我不看漫画,只能放张照片进去看看,确实比以前用的汉王N510的显示效果要好上很多。不过总体感觉上屏幕的底色比较重,“纸”不白,不知道是不是因为外壳太白的原因。

  最值得一提的是翻页的速度,默认的情况下,翻页的速度已经非常快。比我见过的翰林V3、汉王N510和Kindle 2都要快上一大截。如果在设置中打开了“速度优先”模式,则翻页的速度更上一个台阶,几乎看不到翻页的闪屏过程了。不过这种模式下翻久了“纸”的底色会变得更加发灰。

  Wi-Fi的功能基本可用,除非你的Wi-Fi配置用了证书之类的比较麻烦的东东。通过Wi-Fi使用“云中书城”的体验也还不错,尤其是同步RSS的功能,还是很方便的,只可惜现在还不支持自定义的RSS,只能同步官方提供的一些源。听书功能的TTS合成语音比想象中的要强,不过对于我来说,这个功能好像没什么用。

  Bambook对于我来说的最大软肋就是不支持自有书的直接阅读,任何格式(包括TXT)都需要用盛大的“云梯”软件(Windows-Only)转换成盛大的私有格式SNB才能放入Bambook阅读。那个转换软件的能力实在是不能让人恭维。目前我的做法是先用calibre把文件都转成EPUB,然后再用盛大的软件转成SNB,勉强可用。PDF就算了,在不能横屏显示的6寸屏上,也不用对它指望什么了。

  其它的缺点要列也是可以列出一大堆,鉴于目前国内电子书产品的整体现状,懒得写了,总之Bambook要做为一个盛大旗下的文学网站的专用阅读器,现在看起来是基本合格的。如果主要想用它看看别的自有书籍(尤其是非文学),还是要慎重。

  最后说说可折腾性。Bambook的硬件配置总体来看还算不错,但如果想要把OpenInkpot这样的开源固件移植到Bambook上,目前来看还缺少太多的信息。虽然Bambook用了Android系统,目前也似乎还没有流传出任何有关如何折腾的信息。我试了一下,Bambook无论是用USB还是Wi-Fi,连接后都以是网络的形式与外界交换数据。默认情况下,USB连接电脑后,会以RNDIS/Ethernet Gadget的形式出现(Windows/Linux中都可以),默认配置了静态IP 192.168.250.2。如果用Wi-Fi,则是以DHCP的形式获取IP地址。用nmap工具扫描这两个地址,都只能看到它开放了一个5000号的TCP端口,设备与盛大“云梯”软件的数据交换都通过这个端口进行。所以目前唯一Hack出来的一点点东西就是可以通过修改“云梯”安装目录下的config.ini文件,把里面的IP地址由192.168.250.2改成Wi-Fi分配给Bambook的地址后,可以实现“云梯”与Bambook的无线互连。也有人在研究SNB的文件格式,目前来前只能算是有初步的进展。如果把它分析透了,也许以后可以给calibre写个插件直接生成SNB格式。

一个极客

  响应一下由南京地铁、豆瓣地铁族网站主办的“南京,我想你!中秋寄语地铁大巡游”活动,设计此海报,不知道是否有幸可以贴到地铁列车上巡游南京。

  最初的设想比现在的样子要更Geek,原来是想画一副ASCII艺术画,并且这个画的内容可以做为一个程序编译运行。这个程序运行起来会是一列运动的地铁列车,程序原型可以参考Linux中的sl命令。后来因为实现难度太大,而且做为海报而言并不会有很好的效果,所以仅保留了南京地铁列车的ASCII画,而且这个画也不能做为程序编译运行了。

  画面上半部分的类“凡客体”词句中,借鉴了某TX的Blog中的内容,非常具有Bash.org上的Geek笑话风格。

  有好友指出这个作品有很多设计缺陷,我只改了很小的一部分,留下了几个大的缺陷,这也许是我在日常工作中所学到的“妥协”的一部分。谢谢他的建议,这些建议也许对以后的工作会有指导意义。

  自得其乐。

电子书籍管理软件 – calibre

  calibre是一个免费的跨平台电子书籍管理软件,可以完成对各种格式的电子书籍的管理和格式转换。尤其对于拥有手机/iPad等电子阅读器或E Ink设备的同学来说,这个软件尤其具有价值。如果把电子书想象成MP3音乐的话,calibre的功能可以类比于iTunes。它还可以把网络上的新闻或RSS下载转换成电子书格式,同步到相关的阅读设备中,这是一个非常实用的功能。

  calibre可以从Google Books或Amazon等网站下载书籍的元数据,包括书籍的名称、作者、出版社、封面或者读者评价等信息。对中文图书而言,豆瓣上的数据应该是一个不错的书籍元数据来源,所以我就给它加上了这个功能。

  今天发布的0.7.7版本中正式具有了从豆瓣下载书籍元数据的功能,可以从“首选项”->“插件”->“元数据下载插件”中启用它。由于考虑到这个功能只对中国用户比较有价值,所以这个插件默认是被禁用的。

  本来还实现了从豆瓣下载书籍封面的功能,但calibre的作者不喜欢我的实现方法,所以还在进一步讨论合适的实现方法。需要尝鲜的朋友,可以参考我在Launchpad上的calibre-experimental代码树中的版本号为5550-5553的代码改动。

  对这个插件有任何建议或功能改进需求,可以在此留言或去calibre的Trac上提交一个Ticket。

尊重他人的劳动

  刚才看自己的Google Analytics,发现之前发布的那个用于绘制火车运行图的开源项目train-graph在19日那天有几次集中来自forums.sun.com论坛的访问。

  Google帮我找到了那个访问来源所在的贴子,在上面,我看到sabre150在抱怨说train-graph项目抄袭了他的代码。

  看了贴子,我才想起来,曾经为了解决程序在读入带有BOM头的UTF-8文本文件出错的问题,我随便搜到了一个叫BOMStripperInputStream的类用了进去,用于在读文件时自动过滤掉没用的BOM头。这个类是sabre150在forums.sun.com上回复别人提出的类似的问题的时发布的,由于发布的代码中没有包含版权和许可证信息,我也就忘记了在文件中加上这个类的来源和出处。

  知错就改,马上在代码中加上了作者和出处的信息,算是亡羊补牢。

  经历这个事件,以后要吸取教训,就像自己的作品不希望被他人滥用一样,也要更懂得去尊重他人的劳动成果。这种尊重不应当仅仅是法律层面的遵守版权相关法律和相应许可证,即使对于Public Domain中的成果,也同样应该对原作者给予相应的尊重。

  我的Blog上的内容一直以来是以CC协议发布,含义是“署名-相同方式共享”,也就是说可以自由的使用、发布、再加工这里的内容,但必须加上原作者的署名并以相似的协议来发布,除非得到原作者的特别允许。曾经发现过北方的某某小报和南京某某晚报违反CC协议使用过这里的内容,专业平面媒体对版权和许可证都是如此的漠视,可算是小小的悲哀。

提前体验南京地铁二号线

  今天有幸提前体验了南京地铁二号线,记录一下体会。

  先发一下便民消息:最新消息说,南京地铁一号线南延线将于5月28日上午6时准时投入试运营,“高铁南京南”站暂不开通运营。地铁二号线将于5月28日上午开通仪式结束后投入试运营,大约是十点左右。一号线共线区段发车间隔约4分42秒,支线区段发车间隔约9分25秒,全天不区分高峰平峰,运营时间06:00-23:00。二号线发车间隔9分钟左右,初期运营时间06:00-22:00。

  前一周,被地铁的标识色换色事件搞得纠结无比。简单的说,就是南京地铁二号线在临近开通运营前15天左右的时候,临时决定把一、二号线路标志色由明黄色和蓝色改成蓝色和红色。这样的改动,可能会带来对已经完工的车站装修、书法大字壁、出入口和正在更换/安装中的导向标识、线路图的全面改动。而这一决定的前提是根本没有太多科学依据的“根据列车车身颜色来划分线路标识色”。从今天体验的结果来看,改色的结果比想象中的要稍好一些,所以就慢慢接受这一点吧。有关改色事件,可以参考这里这里

  早上的官方组织的体验活动从新街口站开始,直达二号线东延线终点站经天路站并折返回新街口,中途停站不开门、不上下客,所以有点坐囚车的感觉。于是在返回新街口后又再次坐上西去的列车,相对细致的重新体验一部分的车站。

  标识色改色的问题还是比较的严重,目前一号线和二号线各个站线路图和导向标识颜色还是处于一片混乱中。不过相信在较快的时间内能改造完毕,标识色的改造会涉及线路图、线路板、导向标识。目前来看大字壁、出入口没有要改动的迹像(当然要改这些也实在不现实)。导向标识的改色目前大都是用不干胶贴纸,所以在灯箱上不能透光,比较影响视觉效果。所以做为乘客,换乘时认准线路编号是短期内最靠谱的做法,近期内导向标识的颜色应该也很快会到位。

  二号线列车与一号线既有列车同为南京浦镇车辆厂生产,采用阿尔斯通技术的A型车。除了颜色不同,车内主要加装了电子线路指示图和电视上的到站提示,可以更有效的提供乘车信息。与一号线一样,二号线001/002号列车也是“人文地铁”品牌列车,列车内的装饰以书法作为主。

  二号线大部分车站装修比较简洁明亮,尤其东延线部分高架站装修比较简陋。比较有亮点的车站是苜蓿园(七夕节主题,装修很漂亮也很有文化气息)、莫愁湖(通透式地下站台、端午节主题)和明故宫(中国红色装修风格)。二号线所有的车站都安装有安全门。

  

苜蓿园站
苜蓿园站(Photo by galaxy)

  

明故宫站
明故宫站(Photo by galaxy)

  新街口的一、二号线换乘比想象中的要更便利。二号线换乘一号线直接从站台上下两层台阶就可以了。一号线换乘二号线需要走一个C字型的通道,新闻报道中把这个描述的过于清楚细致,所以反而让人觉得过程很复杂,实际上只要沿着导向标识走换乘通道,并没有太长的路。元通站的二号线到一号线的换乘需要看清所要换乘列车的终点站方向,沿着相应导向标识走通乘通道就可以到达,同样也非常方便。元通的换乘通道装修很好看。

  车站的导向标识足够多,多到有点太多,层层叠叠的让你眼花,不过只要你不偷赖,一定不会在车站迷失方向。车站外500左右的范围内设立车站导向标识,导向标识中不带有列车线路信息,只会直接指向最近的地铁出入口。

  二号线车站的自动售票机似乎不再接受1元的纸币,只接受1元硬币、5元或10元的纸币。售票机缩小了取票和找零的窗口,可以更方便的拿到车票和找零。地铁票价4元封顶。

  目前车站和列车的装修气味还相当重。

  长期以来,南京地铁一号线在很多的细节中都做得非常完善,值得称赞。但在这次体验二号线的过程中,感觉到新线在很多细节上距离理想中的完美还有相当的距离,比如,一些装修和导向标识制作比较粗糙;早就被网友指出错误的部分线路名称和标识的翻译仍然没有更正;一号线中一些出色的细节设计没有得到良好的继承等等。如果硬要把它当成一件城市中的艺术品,它还有很多的不足之处。但如果把它当成日常的交通工具,它已经做得相当不错,可以打个80分。随着新的地铁线路的不断建设,运营和管理难度也是越来越大,希望南京地铁能一直保持它的优良传统,打造一个出色的地铁品牌。

  经历了4年的等待,期待南京地铁一号线南延线、二号线、二号线东延线在2010年5月28日的华丽登场。

标准的Firefox

  某个我常去的论坛上,时不时会出现贴子布局混乱的问题,如下图(因为原贴太长,所以PS过以减小图片面积):

  

混乱的网页布局
混乱的网页布局

  很明显的,左上角出现的“-->”很好的暗示了我们,HTML中有点乱套了。而且这也常常是网站系统可能存在XSS漏洞的最初现象之一,我不邪恶,不过担心别人会邪恶,所以打算把问题原因找出来,告诉网站管理员。

  长期的实践中,我曾对这个问题总结过一个规律:这个问题只在Firefox中出现,并且会乱掉的贴子多半是因为某一个特定ID的人参与了讨论,开始混乱的位置常常是在那个ID的人的签名档往上一点的位置。

  今天为了分析解决这个问题,你会怎么推理?我的推理是:由于签名档允许部分HTML,一些不规范的HTML标签导致了页面混乱。

  于是去查看HTML源文件,原始文件太长,所以这里就示意一下:

   <div class="content">
  <!-- Blah blah blah <br />
        -------------- <br />
        Foo bar Foo bar
    -->
        Blah blah blah <br />
        -------------- <br />
        Foo bar Foo bar
    <div>
    <div class="signatures" style="maxHeightIE: 160px;">
       My signautre. My signautre. My signautre. My signautre. My signautre.
    </div>

  是的,推理错了。显而易见的,签名档中并没有问题,而且HTML代码似乎也没有什么异常的地方。把这段HTML放到一个新的空白网页中,显示也一切正常,没有发生混乱。

  也许是网页中有一些不可见的字符,而且复制粘贴后就没有了?Emacs帮我证明了不可见字符这一点,这个网页在我的Linux平台上是以LF字符做为换行的,但那个贴子内容中的换行符却是Windows中的CR LF。于是我把CR字符都删掉,问题依旧。难道还有更神秘的不可见字符在搞鬼?用二进制文件编辑器查看这个文件,一切正常。

  再分析一下,在网页上出现混乱的起始点是-->符号,那看来是在那段注释中就已经出现问题了。用Firefox自带的查看源代码的功能,可以看到,它只把注释的前两行识别成为注释,标记成绿色,从Foo bar那行开始,就变成正常的HTML标签的颜色了。

  为什么Firefox会错误的识别HTML注释标签的结尾?难道因为这个文件编码有问题(原始文件中是有中文的,例子中只写了英文字符)?(大家还记得Windows记事本对待联通和移动的不同态度吧) 把网页由GBK编码重存为UTF-8编码,问题依然。

  没招了,借助神奇的Google,换了好几次关键词之后,终于用“Firefox comment bug”这个关键词找到了有用的信息(需阅读者请翻墙)。

  简单的说,HTML4规范中,注释的起始标签是<!,注释的起始和结束符号是--,注释的结束标签是>。当然,这是一个很严格的形式化的定义,但这跟我们通常想象中的注释由<!--开始,以-->结束是不一样的。因为HTML4规定,结束符号--和结束标签>间可以有空格隔开,也就是说,并不要求--和>连在一起写才表示注释结束。规范建议在注释中不要出现两个或以上“-”出现的情况。

  规范中没有说结束符号--和结束标签>之间除了空格以外可不可以有别的字符出现,Firefox很激进把它定义为允许出现,所以就带来了我们所看到的问题。

  事情还没完,那为什么把这段代码单独贴成一个HTML文件测试就没有问题呢?因为没有指定DOCTYPE时,Firefox不会按HTML4的规范去解析。如果你在测试文件开头加上HTML4的DOCTYPE就可以重现这个问题了:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
     "http://www.w3.org/TR/html4/strict.dtd">

  还没完,那为什么这个问问往往出现在某个特定ID参与过的贴子上呢?因为那个人不喜欢用论坛的“引用”功能,他喜欢复制前一个人说过的话,用---------隔开,下面写回复。或者就是用---------来分隔他的贴子正文的几段内容。

  为什么那个BBS系统中要把贴子的内容输出两遍,其中一遍是在注释中呢?不知道。有一种可能性是开发者还不熟悉网页后台系统的开发,他总是习惯用HTML中的注释语法去注释后台他不想要的代码。这种做法基本上是错误的,但犯这样错误的人绝不在少数。

  继续,虽然Firefox这样做没有违背规范,但多少有点违背常识,为什么它不修复这个问题呢?这是因为它要兼顾SGML的解析——在那里“--”有着很重要功能。不过由于HTML5中对注释的语法做了更严密的规定,Mozilla说,他们准备在后续的版本中修复这个问题。

  最后,Firefox这个问题会不会带来原本可能不存在的XSS攻击?应该说可能性是有的,但主要问题还是会出在网站开发者的身上。比如你在后台调试时,输出了未转意的用户输入内容,并用HTML的注释注释掉了,你以为是安全的,但由于这个问题的存在,带来了XSS攻击的可能性。

  这个故事还告诉我们一些道理,不写了。因为我已经把分析/走弯路的过程写得很详细了,那些道理都是简单易见好理解的,只是常常我们做得不太好。