Geotagging
April 2, 2008 5:19 pm UTC | In Life, Tech | 7 Comments | hideGeotagging,一般指给数字化的内容打上地理信息标签,常见的一种形式就是给数码相片加经纬度信息(JPEG 的 GPS tag 属于 EXIF 标准的一部分,不过 GPS tag 在数据结构上和 EXIF 头是并列的关系,嗯……不深究无聊的细节问题了)。现在比较高级的相机都带 GPS 或者 GPS 接口了,对于没有 GPS 功能的相机,一张一张加 geotag 是不可能的,所以一般的做法是随身另带一个 GPS 记录位置/时间(GPS tracklog),然后回家之后把 GPS tracklog 和相片自动同步(两者都带有时间信息)打上 geotag。相机的时间需要预先对准,不过后期也可以用软件调,有些人的做法是对着 GPS 接收器拍一张照片用作后期处理时计算相机和 GPS 的时间差。
前几天出去玩带的是一个 WAAS-enabled GPS,最好的地方显示 5.5 feet(1.7 米)的精度,不过回来把 GPS tracklog 放到卫星图上看貌似有 4 米左右的误差,不知道是卫星图定位有问题还是我这个 GPS 说大话了……后期软件是土鳖的免费的 EasyGPS 和 PhotoMapper,同类软件貌似还有很多。把 GPS tracklog 和同步后的照片缩略图放进 Google Earth 的效果图见上。听说还有人在 GPS tag 里加入照相机朝向的信息(有些 GPS 带电子罗盘,所以这也可以自动同步),真是 geek 到家了。不过给照片加上这么精确的位置信息有什么用呢?似乎也没有什么大用,对我来说就是因为实在太容易搞,所以不搞白不搞。Geotag 的概念倒是不错,有名的旅游景点在 Google Earth 里都有很多网友上传照片,所以无聊的时候可以在里面环游世界(我的虚拟阳光宅男形象呈现出来了……)。
康神代码赏析
March 24, 2008 6:41 pm UTC | In Tech | 14 Comments | hide#!/bin/bash
OLDCONTENT=`find -type f -exec md5sum {} \; | md5sum`
svn up &> /dev/null
NEWCONTENT=`find -type f -exec md5sum {} \; | md5sum`
if [ "$NEWCONTENT" != "$OLDCONTENT" ]; then
# reload updated configuration
fi
以上是康神写的一个脚本的摘要。值得说的有两点:1、svn up 前后康神对整个目录的文件名和文件内容 md5 消化,这是确认目录是否有变化(包括文件改名)的一个好办法;2、康神用了 &> /dev/null 重定向 stdout 和 stderr,一般土鳖都写成 >/dev/null 2>&1,康神伟大!
批评一下 PHP
March 23, 2008 10:43 pm UTC | In Tech | 3 Comments | hidePHP 里函数多如牛毛,加进去又没什么统一规划,搞得现在成了命名法大杂烩,比如:
- obj_verb 型的:array_slice() http_inflate()
- verb_obj 型的:create_function() parse_str()
- verbobj 不加下划线:setcookie() addslashes()
- 直接把 POSIX 传统函数拿来用的:opendir() fopen()
- 这种算什么呢:error_reporting() htmlspecialchars() 特别是这个 htmlspecialchars 命名毫无章法
- 新老 DOM 类函数不一样:一个叫 getAttribute(),另一个叫 get_attribute()
- 你可能会说,那同类函数可能命名法就一致了吧?也不全是,日历函数:
- verb_obj:cal_days_in_month()
- 大写首字母不加下划线:JDDayOfWeek()
- 突然又全小写了:jdtounix()
(其实 PHP 函数名不分大小写,最后这俩只是文档故意添乱) 晕死。有人说,你真弱,用多了就全熟了。好吧,我是比较弱,可是我知道有人在知名大公司天天写 PHP 还是和我一样晕……PHP 函数命名为什么这么乱?给俩链接:
- 20 possible reasons why PHP function names and parameters are weird
- Do You PHP? 里第二部分:The Ugly Duckling of Programming Languages
换个话题,最近 PHP 的 substr 函数被人改坏了。
There was a small inconsistency between PHP 5.2.1 and 5.2.2. In PHP 5.2.1, substr($str, $start) returns the full $str if ($start < 0 && abs($start) > strlen($str)). But starting from PHP 5.2.2, FALSE would be returned. Before 5.2.2, this behavior was conveniently used to extract at most N last characters of a string, e.g. $str = substr($str, 30); limits $str to at most 30 characters and truncate from the beginning if necessary. However, this no longer works! See also: diff-5.2.1-5.2.2, bug 41375. This is likely to change back in PHP 5.3, given what’s recently been done on PHP_5_3 branch.
PHP Doc 有正方呼吁:This is a small inconsistency, one of those things that makes the life of a PHP programmer like hell. Bugzilla 上反方辩护:The fact that it worked up until 5.2.1 doesn’t mean that you should have used it. 这个问题其实最开始只是因为别的原因无意间改错的,但是 PHP 内部却有人坚持错误,有人报告这个问题也被归类为 Bogus(意思就是说,RTFM,回家好好读文档去)。其实文档也不明确,现在基于各种原因,PHP 5.3 分支上又改回去了,真是搬起石头砸自己的脚。
说个微软搬石头砸自己脚的故事。IE 最开始搞出 {client,offset,scroll}{Top,Width,Height,Left} 十二个很有意义的 HTML 属性用来方便的设置/获取对象大小/位置等信息,实在是一个很好很强大的发明,基本也铁定进 HTML5 了。不过 IE 里面的制造标准不明确,各类元素定义略有不同,反倒别的浏览器抄得更和谐。搞到现在的局面是,微软自己发明的东西,反倒被 QuirksMode 说成 IE 里 incorrect/buggy,不如别的浏览器“正确”,真是衰啊。
夏令时是邪恶的
March 9, 2008 2:28 pm UTC | In Life, Tech | 4 Comments | hide换夏令时啦!丢了一个小时。每年都要调两次时间,每次调时间,都会出点事。
(标题引自 chen3feng 留言)最早认识到夏令时的邪恶是多年前改夏令时那天我刚好赶早班飞机,人还在外地完全没想起来要调时间,幸好我临睡前突然想起来,需要再提早一个小时出发,后来到机场的时候只剩 20 分钟就起飞了,真是后怕……
早期不知道是 samba 还是 windows 有问题,总之调时间以后两边看共享目录的时间会差一小时。有一次我几 TB 的数据被自动重新同步了一次,真衰。
有人在 crontab 里放了两点半执行的命令,结果调夏令时那天事务流程完全乱掉…… crontab man page 专门在 BUGS 一节指出:
If you are in one of the 70-odd countries that observe Daylight Savings Time, jobs scheduled during the rollback or advance will be affected. In general, it is not a good idea to schedule jobs during this period.
因为有了一些教训,有同事写程序开始用 UTC 时间,这样就不会受到本地时间调整的影响。去年不知道哪个土鳖提出来把调夏令时的日子提前一个月,各类操作系统都需要更新过才能正确调整夏令时。有位同学没更新操作系统,看时间不对就直接把电脑时钟拨快了一个小时,结果反而那些先进的用 UTC 时间的程序出错了(因为没有调整时区,所以电脑的 UTC 时间就错了)……
sigh,到底是用本地时间,还是 UTC 时间写程序?
为什么要执行夏令时??不是说夏令时不省能源反而费吗???
德国人的形式主义
March 7, 2008 8:35 pm UTC | In Life, Tech | 6 Comments | hide下面这个材料转载自 Guide to LaTeX(第四版 146 页 7.5.1 节)。如果你直接看第三列,可能会觉得有点别扭,但又不一定说的上来哪里别扭;事实上,别扭的是有些符号之间的水平间距不理想。而第二列则是微调过水平间距的,看起来比第三列好看一些。熟悉 LaTeX 的可以仔细看第一列里相应的水平间距微调命令(这材料很有名,很多 LaTeX 书里都有,如果你看见过不要说我 TOOOOOLD!)。举例来说,第一行根号 2 和后面那个 x 之间需要稍微有点空隙;如果不留空隙(如第三列所示) ,看起来就比较难看。

如果你没觉得第二列比第三列好看,甚至没看出来两列有什么不一样,这很正常,不要觉得自己有问题!即便是每年成千上万屁挨着地用 LaTeX 生产出来的博士论文里,也只有极少数专门美化了这个水平间距问题,而这里面德国人占了大多数。为什么德国人这么注重形式?我也不知道,可能和他们民族严谨的作风有关。事实上,上面那本葵花宝典 Guide to LaTeX 的作者 Helmut Kopka 和 Patrick W. Daly 就是俩德国人。
说起德国人的严谨,我倒也认识一位严谨的德国物理学家。他光是让别人设计个 FPGA,就要专门写一个 RFC。这可不是拿 RFC 做个标题而已,而是严格按照标准 RFC 格式和风格书写,并且写完了那个 XHTML Strict 文档他还专门去 W3C 通过了验证。他把这个 RFC 发给同事们,结果半个月过去还没有人理他。于是他召集开会,说我老早就 request for comments,你们怎么一点 comments 都没有?你想啊,这么一群笨蛋物理学家,有谁会知道他电子邮件标题里的缩写 RFC 就是要 comments 的意思啊。
该德国仁兄给实验组建了一个内部 wiki,服务器装的是 Debian。在那个 wiki 的某个小角落里,他写了一大段使用 Debian 的理由,其中的废话包括:我最爱 Debian;Debian stable 很 stable;我装的,当然我选!等等……是因为有人和他争论哪个 Linux 发行版好的无聊问题么?不,事实上,整个实验组只有他一个人懂 Linux……
是严谨?还是形式主义呢?
IE6 和 PNG 透明色
March 4, 2008 10:36 pm UTC | In Tech | 5 Comments | hide


今天又碰到有人说 IE6 不支持 PNG 透明色,真是无语……所以干脆跑上来拜一下康神好了。上面三张图分别是 PNG-8,PNG-24 和 GIF。IE6 不支持的只是 PNG 的 alpha 通道(256 级可调半透明色),PNG-8 索引色里的完全透明色还是支持的。正常浏览器能看到三尊金色背景的康神;IE6 里中间那尊 PNG-24 康神则没有金色背景。
P.S. IE6 可以用 filter 弄 alpha 通道。
小牛犊 APNG 力挫老古董 MNG
March 3, 2008 11:27 am UTC | In Tech | 12 Comments | hideGIF 是一个变态的格式,不但当年有专利方面的问题,而且只能支持 256 色,还没有 full alpha 通道,只不过现在还没有别的通用格式可以替代其动画功能,所以 GIF 还是一个相当流行的格式。PNG 1996 年发布的时候就希望打倒 GIF,但是 PNG 的软件支持发展比较慢,特别是 PNG 不支持动画,导致 GIF 一直到现在还没有被打倒。(GIF、JPEG 和 PNG 的比较)
PNG 小组的保守派一直强调,祖先定下规矩,PNG 只能存储一张图片。于是,他们在 1996 年就开始琢磨另一种全新的动画格式,叫做 MNG,但是十多年过去了,MNG 却已经销声匿迹。MNG 错在哪里?MNG 的结构太复杂了。PNG 当初作为一种全新的格式,就经过了好几年才开始普及;而 MNG 除了多一个动画功能,也没有太多的好处。Mozilla 浏览器曾经支持过 MNG,但是 2003 年夏天很诡异的把 MNG 支持去掉了。You can support, and then unsupport?这不禁让我想到盖茨在 Bill Gates’ Last Day at Microsoft 中所说的“you can retire, and then unretire?”
Mozilla 去掉 MNG 支持的事情曾在 Bugzilla 上引起轩然大波(Bug 18574 195280)。去掉 MNG 的主要原因是 Mozilla 里维护 MNG 库的 tor 力不从心不想干了。MNG 复杂的结构导致其解码库比 Mozilla 里别的所有图片格式的解码库总和还要大,虽说这 200 kB 的解码库即使在当时 2003 年也根本不算什么,但这是 tor 列举的移除 MNG 支持的第一个理由,因此也常被人误读为 Mozilla 去掉 MNG 的根本原因。MNG 创始人之一 Gerard Juyn 曾写道:
Mozilla 1.4 still supports MNG, but current builds have it removed. The decision was made to save space…
FireFox is the lean and mean descendant of Mozilla…
这之后 MNG 的日子越来越不好过,目前主流浏览器里只有 Konqueror 原生支持 MNG,别的都要装插件(Konqueror 算主流浏览器么?)。libpng 目前的维护者 Glenn Randers-Pehrson 在 2007 年承认:
After 6 years or so since MNG-1.0 was approved, it seems clear that it is not really going anywhere, mostly due to claims that it is too complex.
互联网发展了这么多年,通用动画格式仍旧只有存在各类问题的 GIF 一种。 2004 年,Mozilla 有两个人痛定思痛,发明了一种基于 PNG 的动画格式,叫 APNG。APNG 比 MNG 好在什么地方?APNG 是对 PNG 格式的一个极小扩展,而非完全从头打造一个全新格式。首先,它和老 PNG 标准完全兼容,不认识 APNG 格式的浏览器可以正确显示 APNG 动画里的第一帧图片;其次,由于它只是对 PNG 格式的一个小扩展,所以支持 APNG 非常简单,PNG 库也只会增加大概 5% 的大小。不过比较搞笑的是,2004 年 APNG 提出之后那两个猪头一直没空实现它,一直到 2006 年有一个机会他们在 Google Summer of Code 找了个小弟 Andrew Smith 实现了 APNG 解码,现在最新的 Firefox 3 beta 和 Opera 9.50 beta 都已经支持 APNG。
APNG 的出现,自然是给渐渐死亡的 MNG 重重一击。PNG 邮件列表上争吵声此起彼伏。2004 年,PNG 创始人之一 Thomas Boutell 在《MNG 已死,有事烧纸》一文中回顾到:
PNG is moderately successful, but it never did replace GIF. That’s mainly because Netscape sprang animated GIF on the world when the PNG specification was nearly final, without saying a word or once suggesting that we include animation.
When animated GIF appeared, I lobbied the PNG group for simple, GIF-style animation support in PNG, … I lost out to those who made eloquent arguments for a more complete animation format (So much for dictatorship. At least I was benevolent.). MNG, the all-singing, all-dancing, all-merciless animation format, took a long time to standardize and was rejected by both major web browser vendors …
Very recently, two young turks decided to invent a simple new animated-PNG format (apng) … It is kicking up a shitstorm on the long-dormant PNG mailing list. The old-timers and the young turks are trying to hash out an agreement. I agree for the most part with the young turks and their design choices.
I could not be more pleased with this development.
Andrew Smith 在 libpng 的 apng 补丁发布网站提到一句 MNG:
MNG already existed at that time but was too big/fancy for most people to accept as an image format (this is the first and last time I mentioned this flamy topic).
这样的争吵持续了很久,2007 年 4 月 PNG 小组投票决定是否允许 APNG 进入官方 PNG 标准,投票以 10:8 否决这个建议,PNG 小组里的顽固分子仍旧相当排斥直接在 PNG 格式上动手动脚支持动画。
标准的诞生,基本上是一个先有鸡还是先有蛋的问题。世上本没有使用 PNG 的人,也没有支持 PNG 的浏览器,更没有制作 PNG 的软件;然而几年过去,三者相互影响并都稳步上升。MNG 一开始面对的也是同样的境地,但却没有流行起来。APNG 其概念本身并不优美,是对 PNG 标准的粗暴践踏,但是因为有的放矢,射中要害,却得到了两个主流浏览器的认可。标准的诞生就是一场恶战,不一定最好的技术就会胜利,TCP/IP 就是一个例子。新标准和新公司一样,只有好的想法和技术并不能成功,市场团队同样重要。市场做好了,烂东西也能变成好东西。
有人对开源软件盲目崇拜,认为软件开了源就是万事大吉,其实缺少了经济利益驱动的开源软件往往官僚更严重,即便在开源团队内部,权威照样存在,更不用说在用户层面上的反馈了。开源不等于开放,开源也不等于民主。AA 软件的 XX 功能能不能改改?你丫不会自己改啊?AA 软件为什么没有 YY 功能?你大爷的你爱用不用。AA 软件的 ZZ 功能是不是有 bug?放屁,这叫 feature!Bugzilla 上这么多反对的声音,Mozilla 的 MNG 支持照样被去掉了。群众力推 APNG,无论其多么的符合实际需求,照样能被 PNG 小组里的老东西打倒。
最后,有人问过我,是否看好 APNG。我想我也预测不了世界范围的图片格式流行趋势,不过如果 IE 不支持 APNG 的话,APNG 还是只能局限在应用程序界面上使用,很难成为网页上的通用图片格式。
(以上所有引文中的下划线都是我加的)APNG 的几个网站:
Tags: animation, apng, browser, bug, firefox, gif, mng, mozilla, opera, png, web
GIF、JPEG 和 PNG 的比较
March 1, 2008 3:00 pm UTC | In Tech | 3 Comments | hideGIF、JPEG 和 PNG 是三种最常见的图片格式。
- GIF:1987 年诞生,常用于网页动画,使用无损压缩,支持 256 种颜色(一般叫 8 bit 彩色),支持单一透明色;
- JPEG:1992 年出世,照片一般都用这个格式,有损压缩,24 bit 真彩色(224 = 17 万种颜色),不支持动画,不支持透明色;
- PNG:1996 年问世,无损压缩,最常见的使用格式是 256 索引色(PNG-8)和 24 bit 真彩色(PNG-24)(当然 PNG 支持的颜色格式远不止此),支持 full alpha 通道(256 级可调半透明色),不支持动画。
简单比较:
- JPEG v.s. PNG:JPEG 在照片压缩方面拥有巨大的优势,这方面无可替代,但是 JPEG 是有损压缩,图片质量会有损失。另外,一般屏幕截屏用 PNG 格式不但比 JPEG 质量高而且文件大小还更小(维基有图)。
- GIF v.s. PNG:GIF 只在简单动画领域有优势(其实,GIF 256 色限制以及无损压缩机制导致高质量的动画的发布一般都使用 Flash 等格式),只要没有动画,PNG 完全可以取代 GIF。
- 防锯齿:下面是 GIF 和 PNG 防锯齿处理的对比,六张小图片是分别放到浅黄和深绿背景下的情景,三张大图是深绿背景情形的放大。由于 GIF 没有半透明一说,所以防锯齿处理时只能假设背景是白色,这样的 GIF 放在深色背景下还不如不防锯齿。而 PNG 图片可以轻松应付各种背景颜色,特别适合用来做网页和应用程序里的通用防锯齿图标适应不同皮肤,没有 full alpha 通道的 JPEG 和 GIF 都做不到这一点。

可以看到,除了照片和动画,PNG 是最好的格式,但是 PNG 为什么到最近几年才流行起来?有很多原因:
- PNG 诞生的时候互联网已经初具规模,当时 GIF 和 JPEG 已经是很流行的格式了,换格式的迁移成本是很大的,有时候惯性是一个很可怕的东西。
- 浏览器的 PNG 支持比较落后,比如 IE 就是到 IE4 才开始支持 PNG。
- PNG 当初标准里把 alpha 通道写成了 optional 的,土鳖的 IE 一直到 IE7 才开始支持 full alpha 通道。而一般网页图标 256 色足够,所以为了支持 IE6,PNG 相对于 GIF 毫无优势可言,更何况 GIF 还支持动画。
- 尽管从原理上说,同样质量的 PNG 图片文件一般要比 GIF 要小,但是早期很多图片编辑器不支持 PNG,甚至支持的也没有完全利用 PNG 压缩算法里最精妙的部分(最典型的例子就是早期的 Photoshop),保存出来的 PNG 往往巨大无比。现在的软件已经没有这些问题了,但是这个偏见还广泛存在。
This weblog is licensed under a Creative Commons License.
Powered by WordPress. Theme based on Pool by Borja Fernandez.








