尊重他人的劳动

  刚才看自己的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攻击的可能性。

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

Linux Club dabr 服务

dabr是一个基于PHP实现的Twitter的Web界面,适用于各种终端,尤其适合在手机等移动终端上使用。

访问地址:http://t.intscan.org

本服务限制了Twitter登录帐号,如果需要使用本服务,需要把自己的帐号添加到允许登录的列表中。

添加方法:SSH登陆intscan.org,修改/srv/userlist.php,把需要登陆的Twitter帐号加到这个列表中。修改文件时请注意保持PHP文件语法正确,以免影响他人使用。

Linux Club 内容聚合

目前Club的主页已经处于正常工作状态,新的活动通知与服务提供都会在这里发布。
大家可以订阅http://www.intscan.org/?feed=rss2这个feed时刻获取最新的消息。

同时,我们也会把各位会员自己的Blog一起聚合到Club的主页上,如果各位有自己的Blog,请把地址通知regster@intscan.org,我们会把它们聚合到主页上。俱乐部的服务器会每天一次去抓取各位RSS上新的输出,如果有特别的需要要让服务器立即去抓取,请在intscan.org上运行以下命令:
$ blogsync

目前已经有以下会员的Blog得到聚合:
* Keep Learning (Chen Wang)
* Welcome To Enoch’s Home (Enoch Huangfu)
* Zou Fei’s Blog (Fei Zou)
* 李凡希的Blog (Byron Li)

Linux Club gitweb使用方法

我们已经在服务器上安装了CVS, Subversion, GIT和Mercurial等多种版本控制系统,欢迎大家使用。欢迎各位把自己发起的项目或平时写着玩的实验代码都放到上面来。

目前我们主推的版本控制系统是GIT,所以为GIT提供了Web界面,可以在http://git.intscan.org上访问到。对于其它的版本控制软件,目前没有开放Web和相应的服务,如果需要使用,可以用SSH的方式。如果确有开放其它服务或Web的需要,请向register@intscan.org提出。

GIT的使用方法:

创建一个源代码库
如果要创建一个名叫test.git的源代码库,可以用命令:
$ cd /home/UserID
$ mkdir test.git
$ cd test.git
$ git init –bare
这时在当前目录下生成一个test.git的空仓库,在各位的HOME目录下,这个目录权限默认是UserID:club 755,也就是说,对所有人都可见,但只有你自己可以修改。如果要允许其它Club的成员也参与你的代码开发,可以把它的权限放宽成775。

在gitweb上发布这个源代码库:
目前我们的gitweb的根目录是/srv/git,如果要在里面发布你的源代码库,只需做一个链接就可以了:
$ ln -s /home/UserID/test.git /srv/git
这样,这个源代码库就会在http://git.intscan.org上出现了。

获取一份代码副本,开始工作:
仍然推荐使用SSH的方式,方便安全:
$ git clone ssh://UserID@intscan.org/home/UserID/test.git
如果已经在/srv/git下做了链接,也可以
$ git clone ssh://UserID@intscan.org/srv/git/test.git

把代码推回代码库:
$ git push ssh://UserID@intscan.org/srv/git/test.git master

有关gitweb系统,有任何的问题,可以在Club的Ask平台上提出。

Linux Club PPTP服务使用方法

根据目前服务器的使用情况,决定测试提供基于PPTP的VPN服务,使用方法如下:

1. 在你的HOME目录中创建一个名为.vpnpass的文件,里面写上你的想使用的密码(不能包含#,引号,问号和空格等特殊字符)。
$ vi ~/.vpnpass
2. 把它的权限设为0600,以免被他人看见。(此方法不能防止被root看到,所以请为你的VPN设置一个专用的密码)
$ chmod 0600 ~/.vpnpass
3. 等待下一个整点,服务器的cronjob会把你设定的密码写入配置文件并使它生效

在操作系统(WM,iPhone等智能手机上也可以)中直接新建一个PPTP类型的VPN连接(Linux中如果使用NetworkManager,需要选中MPPE)。
服务器名:intscan.org
用户名:你在intscan.org上的帐号名
密码:你在~/.vpnpass中设定的密码

然后就可以连接到服务器的VPN上了。连接成功后,你会得到一个192.168.94.*的IP地址,DNS服务器会设成Google的DNS。

注意事项:
1. 本服务仅建议在个人业余时间使用,请勿在公司使用,以保证公司IT环境的安全。
2. 目前本服务只是测试运行,如果遇到任何问题,可以在ask.intscan.org上提问。同时,俱乐部会根据服务器资源使用的情况,可能随时决定中止本服务,如果中止服务,会另行通知。
3. 连接到VPN后,机器上所有的流量都会从VPN走,所以网速肯定会下降,而且如果你正在用BT或eMule下载的话,这些流量也会经过VPN。俱乐部服务器的月流量和网络带宽都很有限,所以请只在必要的时候连接俱乐部提供的VPN服务。
4. 服务器的 cronjob会在每个小时整点的时候检查所有人的.vpnpass文件,如果有更新,就会写入pptpd的配置文件并重启pptpd使之生效。在重启pptpd时,其它人已经建立的VPN连接会被断开,需要重新连接后才可以继续使用。
5. 如果始终无法登法,请自行检查密码中是否有特殊字符。可以临时把密码改成比较简单的字母数字组合测试,以确定是密码的问题还是连接设置的问题。

在Debian Squeeze下安装Dropbox

  听说Dropbox这个在线存储服务商很久了,不过一直没有去用过,因为我一直认为在线文件存储在ADSL小水管上是一个不靠谱的服务——上传速度太慢了。

  这几天我订阅的若干个RSS上都不约而同的出现一些有关Dropbox的文章,有使用技巧的、有商业模式分析的、还有创业经历的等等。病毒式、口碑式的营销是Dropbox取得当前成功的一个重要因素。好吧,我承认我被这个“病毒”传染了,现在正在继续放毒,文章开头的Dropbox的链接是我的推荐注册链接,如果你通过它注册,你我都可以获得250M的额外存储空间。

  Dropbox能迅速感染我的主要原因还是在于它的体验做的还是不错的,整个产品与操作系统的集成做得不错,使用起来非常自然,性能也远比想像中的要好。不过如果要在Debian Testing (Squeeze)上获得这样的体验,还是需要花一点功夫,因为Dropbox提供的Linux deb安装包只有给Ubuntu提供的版本,在Debian上安装会遇到依赖关系的问题:

  nautilus-dropbox depends on libnautilus-extension1 (>= 1:2.22.2); however:
    Version of libnautilus-extension1 on system is 2.30.1-1.

  看上去只是版本号上的一点点小问题,可以直接强制安装:

  sudo dpkg -i --ignore-depends=libnautilus-extension1 nautilus-dropbox_0.6.2_i386.deb 

  后果就是aptitude或者Synaptic都会发现存在broken的依赖关系,然后系统的包管理就不能正常工作了:不能安装别的包、不能升级……

  搜索后找到了一个简单的解决方案,适合解决类似的deb依赖关系的问题(Debian/Ubuntu都适用):编辑/var/lib/dpkg/status文件,在里面找到存在依赖关系问题的包所在的位置,编辑它的Depends后面的项,改成一个可以被满足的版本号或干脆把无法满足的依赖项删除。在本例中,可以把“libnautilus-extension1 (>= 1:2.22.2),”改成“libnautilus-extension1 (>= 2.22.2),”或者干脆删除它。

  这个方法很有效也很暴力,请确认知道自己在做什么并仅在必要、合理的时候使用这个方法。在大部分的情况下,也许自己重新编译生成一个适合自己的安装包是更正确安全的做法。

  最后分享一下非常重要的几个小技巧:

  1. Dropbox的Public文件夹文件外链的功能在国内不能正常使用,解决方案很简单:把生成的外链URL中协议由http改成https就可以了。

  2. 在Linux下,可以用软链接把不属于Dropbox文件夹内的文件同步到Dropbox,但注意尽量只使用文件夹的软链接而不要对文件做链接,因为Dropbox在把文件同步回来的时候可能会把软链接变成普通文件,导致实际的文件不同步。

  3. 在Windows的NTFS分区下,可以用Junction或mklink(Windows 7)把文件夹做链接,实现任意文件的同步,但要记得与Linux不同的是:只能把Dropbox文件夹内的文件夹建链接到外面,而不能把外面的文件夹链到Dropbox文件夹内,不然同步只会做一次,以后文件再变化就不会再同步了。

  更多技巧可以参考:Dropbox免费网盘高级使用技巧