<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>jjgod / blog</title>
	<atom:link href="http://blog.jjgod.org/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.jjgod.org</link>
	<description>Random notes &#38; thoughts by Jiang Jiang.</description>
	<lastBuildDate>Mon, 12 Mar 2012 08:32:15 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>基于 Mac 的媒体中心</title>
		<link>http://blog.jjgod.org/2012/03/12/mac-based-media-center/</link>
		<comments>http://blog.jjgod.org/2012/03/12/mac-based-media-center/#comments</comments>
		<pubDate>Sun, 11 Mar 2012 20:08:06 +0000</pubDate>
		<dc:creator>jjgod</dc:creator>
				<category><![CDATA[Asides]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Mac]]></category>

		<guid isPermaLink="false">http://blog.jjgod.org/?p=929</guid>
		<description><![CDATA[iOS 4.3 新增的一个重要的功能是对 home sharing 的支持，这样你可以在一台安装了 iTunes 的机器上共享任何视频和音频而不需要同步到对应的 iDevice 中。这给打造基于 Mac 的家庭媒体中心带来了很大的便利。先前介绍过用 XBMC 构建媒体库的方法，安装了 XBMC 的 Mac mini 是我目前主要使用的视频播放设备，自从 Mac OS X 开放了视频硬件解码支持 之后，用低配置的 Mac mini 播放高码率的 1080p 视频也完全不是问题了。而且对于 iPad 2 和 iPhone 4S 以后的设备，因为已经支持到 H.264 的 High Profile 4.1，所以正常情况下，网上所有能下载到的 MKV 封装的视频，都只需要重新封装一下就可以无损地播放了。这里介绍一下我的配置。 从网上下载到的 mkv 视频，一般先用 MP4tools demux 再封装为 mp4，这是我目前找到的最方便工具。如图所示： 因为前面提到的原因，视频部分可以不转换，所以选择直接 Pass Thru，但音频部分一般是 AC3 或者 DTS [...]]]></description>
			<content:encoded><![CDATA[<p>iOS 4.3 新增的一个重要的功能是对 <a href="http://support.apple.com/kb/HT4557">home sharing</a> 的支持，这样你可以在一台安装了 iTunes 的机器上共享任何视频和音频而不需要同步到对应的 <a href="http://en.wikipedia.org/wiki/IDevice">iDevice</a> 中。这给打造基于 Mac 的家庭媒体中心带来了很大的便利。先前介绍过用 <a href="http://xbmc.org">XBMC</a> 构建媒体库的方法，安装了 XBMC 的 Mac mini 是我目前主要使用的视频播放设备，自从 Mac OS X 开放了<a href="https://developer.apple.com/library/mac/#technotes/tn2267/">视频硬件解码支持</a> 之后，用低配置的 Mac mini 播放高码率的 1080p 视频也完全不是问题了。而且对于 iPad 2 和 iPhone 4S 以后的设备，因为已经支持到 H.264 的 <a href="http://www.apple.com/ipad/ipad-2/specs.html">High Profile 4.1</a>，所以正常情况下，网上所有能下载到的 MKV 封装的视频，都只需要重新封装一下就可以无损地播放了。这里介绍一下我的配置。
<span id="more-929"></span>
从网上下载到的 mkv 视频，一般先用 <a href="http://www.emmgunn.com/mp4tools/mp4toolshome.html">MP4tools</a> demux 再封装为 mp4，这是我目前找到的最方便工具。如图所示：</p>

<p><a href="http://blog.jjgod.org/wp-content/uploads/2012/03/mp4tools.png"><img src="http://blog.jjgod.org/wp-content/uploads/2012/03/mp4tools.png" alt="" title="mp4tools" width="600" class="aligncenter size-full wp-image-931 noline" /></a></p>

<p>因为前面提到的原因，视频部分可以不转换，所以选择直接 Pass Thru，但音频部分一般是 AC3 或者 DTS 各式的，需要转换为 AAC 才可以给 iDevice 们播放，这里可以任选码率，大部分情况下 192 kbps 绰绰有余。</p>

<p><strong>更新：</strong> <a href="http://twitter.com/RioJot">@RioJot</a> 提醒我有个开源的 <a href="http://code.google.com/p/subler">Subler</a> 工具也可以完成这个操作，它的界面比 MP4tools 更好一些，支持选择音频 downmix 的类型 (Dolby Pro Logic 2, Dolby Pro Logic, Stereo, Mono)，还可以自动抓取元数据和 Artwork。另外它的队列管理也比 MP4tools 好一些。唯一需要注意的是必须安装了 <a href="http://perian.org">Perian</a> 之后才可以进行音频的 downmix。</p>

<p>转换完之后的 mp4 已经可以直接加入 iTunes 中播放，但比较理想的还是添加一下文件的元数据，比如电影的标题、年份、电视剧的系列名和海报等等。这个工作可以用 <a href="http://www.bitfield.se/isubtitle/">iSubtitle</a> 自动完成。只要用 iSubtitle 打开 mp4 文件，它就会根据该文件的名称在网上的对应数据库中匹配获得相关元数据 (比如电影从 <a href="http://www.themoviedb.org/">themoviedb.org</a> 中搜索)。iSubtitle 还支持的一个重要功能是给 mp4 文件添加软字幕，只需要把 srt/ssa 格式的字幕文件下载下来，取相同前缀，放在 mp4 文件所在的目录下即可。比如 Spartacus.S02E02.720p.HDTV.X264-DIMENSION.mkv 文件转换得到 Spartacus.S02E02.720p.HDTV.X264-DIMENSION.mp4，字幕文件可能是 Spartacus.S02E02.720p.HDTV.X264-DIMENSION.chs.srt。它的界面如图所示：</p>

<p><a href="http://blog.jjgod.org/wp-content/uploads/2012/03/iSubtitle.png"><img src="http://blog.jjgod.org/wp-content/uploads/2012/03/iSubtitle.png" alt="" title="iSubtitle" width="600" class="aligncenter size-full wp-image-936 noline" /></a></p>

<p>iSubtitle 执行的只是元数据操作，所以可以在 mp4 上直接保存。然后就可以加入 iTunes 中。iTunes 会根据元数据信息分类存放，比如下面这样：</p>

<p><a href="http://blog.jjgod.org/wp-content/uploads/2012/03/iTunes.png"><img src="http://blog.jjgod.org/wp-content/uploads/2012/03/iTunes.png" alt="" title="iTunes" width="600" class="aligncenter size-full wp-image-937 noline" /></a></p>

<p><strong>更新：</strong>Subler 也可以完成添加字幕的操作，这样你可以把两步操作合并到一步完成，可是 Subler 必须手工选择字幕文件，而且字幕文件也必须已经转换为 UTF-8 编码才可以添加。</p>

<p>然后，在 iTunes 和 iDevice 中<a href="http://support.apple.com/kb/HT4557?viewlocale=zh_CN">启用家庭共享</a> 就可以在设备的 Video app 上看到这些视频了。根据我的经验，至少 720p 的视频在 wifi 下播放是非常流畅的，也几乎不需要任何缓存时间，如果出现播放缓慢、经常停滞的情况，就应该检查网络或者设备配置问题了。如图：</p>

<p><a href="http://blog.jjgod.org/wp-content/uploads/2012/03/Video.png"><img src="http://blog.jjgod.org/wp-content/uploads/2012/03/Video.png" alt="" title="Video" width="600" class="aligncenter size-full wp-image-940 noline" /></a></p>

<p>于此同时，因为 iTunes 已经将文件组织好了，我们还可以将 iTunes 的媒体文件所在目录直接添加到 XBMC 中，这样就可以自由选择是在电视的大屏幕观看还是在 iPad 上观看了 (当然也可以直接用 iTunes 观看，选用 XBMC 主要是习惯和方便用遥控器操作)。对于电视剧文件，因为文件名仅仅是标题，XBMC 无法直接搜索，所以可以在安装了 <a href="http://code.google.com/p/mp4v2/">mp4v2</a> 之后 (<code>brew install --using-llvm mp4v2</code>)，使用如下 Python 脚本生成符合 XBMC 需要的符号链接：</p>

<pre><code>#!/usr/bin/python

import sys, os, commands

def linkfile(src):
    output = commands.getoutput("mp4info '%s'" % src)
    season = 0
    episode = 0
    for line in output.splitlines():
        sl = line.strip()
        if sl.startswith("TV Season"):
            season = int(sl.split(":")[1].strip())
        elif sl.startswith("TV Episode"):
            episode = int(sl.split(":")[1].strip())

    if season and episode:
        ext = os.path.splitext(src)[1]
        dst = "%s/%dx%02x%s" % (os.path.dirname(src), season, episode, ext)
        print src, "-&gt;", dst
        if not os.path.islink(dst):
            os.symlink(src, dst)

for root, dirs, files in os.walk(sys.argv[1]):
    for name in files:
        linkfile(os.path.join(root, name))
</code></pre>

<p>这样在 XBMC 上看到的效果如图：</p>

<p><a href="http://blog.jjgod.org/wp-content/uploads/2012/03/xbmc.png"><img src="http://blog.jjgod.org/wp-content/uploads/2012/03/xbmc.png" alt="" title="xbmc" width="600" class="aligncenter size-full wp-image-944" /></a></p>

<p>顺带一说，在即将发布的 <a href="http://xbmc.org/natethomas/2012/03/02/xbmc-11-0-rc2/">XBMC 11 &#8220;Eden&#8221;</a> 中，还支持将 XBMC 作为 <a href="http://en.wikipedia.org/wiki/AirPlay">AirPlay</a> <a href="http://wiki.xbmc.org/index.php?title=AirPlay">接收端</a>，这样 iDevice 上保存的图片、音乐和视频也可以直接用 wifi 发送到 Mac 上观看了。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.jjgod.org/2012/03/12/mac-based-media-center/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>奥斯陆买房记</title>
		<link>http://blog.jjgod.org/2012/03/03/owning-an-apartment-in-oslo/</link>
		<comments>http://blog.jjgod.org/2012/03/03/owning-an-apartment-in-oslo/#comments</comments>
		<pubDate>Fri, 02 Mar 2012 21:28:30 +0000</pubDate>
		<dc:creator>jjgod</dc:creator>
				<category><![CDATA[Asides]]></category>
		<category><![CDATA[Culture]]></category>

		<guid isPermaLink="false">http://blog.jjgod.org/?p=913</guid>
		<description><![CDATA[这周把买房和贷款的合同签完，买房这件事情算是告一段落，也可以来写点总结了。从真正决定买房到拍下房子，总共花了将近两个月的时间，对于我这样消费不怎么犹豫的人来说已经是出奇的长了。其实去年找租房的时候就有同事推荐买房，这几年搬家至少每年一次，每次租房实在有诸多不便，而且奥斯陆房价也在世界前列，增长的速度丝毫不见放缓，最近的数据是奥斯陆的房价自 2005 年来增长了 62%，年增长率大概是 10%。房价变化虽然不能和国内相比，但基数已经太高，奥斯陆的平均房价在 4.5 万/平米左右，所以增长一点都让工薪阶层更吃不消。何况买房还可以退税，所以在向同事打听清楚之后，今年年初就开始策划买房的事宜。 在挪威买房的第一步是选择一个贷款的银行，不同的银行允许贷款的额度和利率都不同，但大体策略是类似的：面向 35 岁以下的头一次购房者优惠最多，如果拥有别的房产或者年纪更大的人就享受不了那么多优惠了。以往头一次购房者可以 100% 贷款，虽然去年底开始挪威也收紧了房贷限制，要求至少首付必须占房价的 15%，但大部分人靠存款、父母支持或者卖房的收入还是可以付得起这部分的。此外国家的银行可以提供更优的房贷，但对于有稳定工作的人来说申请到的可能性不大。 选择银行一般是通过电话或者网站向银行约谈，我的办公室楼下就是 Sparebank1 的办公室，也是我平时使用的银行，所以就先找他们谈。基本上谈话内容就是了解我的年收入、债务等经济情况，打算买的房子的大致价格范围，用来计算我还款的压力，然后给出一个包含贷款额度和利率的具体 offer。如果我觉得可以考虑，就可以把我打算用作首付的钱放在这个银行的一个存款账户内，他们就可以做正式的贷款担保，有了这个担保就可以进入下个环节。一开始 Sparebank1 答应给我贷款 210 万，但利息不算最优，只能给 3.9%，而大多数银行可以给 3.6% ~ 3.7%。所以后来又联系了 DnBNor 和 Nordea 这两家。不过最后选择的还是 Sparebank1，一来是考虑操作的便利，二来是它在我的要求下最后答应给我 3.65% 的利率。 第二步，也是耗时最长的一步，是网上选房和实地看房，在挪威卖房不需要自己去找中介，因为所有的房源都在 finn.no 这个网站上列出了，有详细的房屋介绍和照片，包括房屋的建造年份、每月的公摊费用、维护情况、以前维护欠下的贷款等等。这些广告会附上一般两次的实地看房时间，叫做 visning。visning 一般安排在平时晚上下班后或者周末，每次一小时。大体也就是看看房屋的使用状况，和中介谈谈周边环境和房子的细节问题。如果看完以后感兴趣，就可以留下名字和联系方式，准备进入竞标买房的环节。在挪威选房子和国内区别，主要是这里更看中房子的西向，因为这样可以在下午到晚上获得尽可能长时间的阳光，这在阳光稀缺的国度尤其重要。如果房子朝西，有个大阳台，又是不受遮挡的顶楼，那肯定能卖出好价格。 两次看房结束后的一天内，中介就会组织竞标，竞标一般是早上开始，尽可能在中午 12 点之前结束，开始的出价一般会比房主的要价稍低，然后随着是否热门层层上升，最多时我见过比要价高出 50 余万成交的。竞标的过程都是由中介组织远程完成，第一次出价必须填写一个书面的表格并签字写明过期时间，后续出价就可以直接通过电话口头作出。我参加了三次这样的竞标过程，头一次没有其他人竞争，不过我觉得房主要价 260 万稍贵，就想压到 250 万内成交，可是房主坚持不肯，后来就放弃了这套房子，房主也只能重新组织下一轮的看房和竞标了。第二次的房子竞争者把价格炒到了 280 万以上，超过了我可以接受的最高限度，只好放弃，估计这套房子的成交价在 285 万左右。最后一套房子大家出价都很谨慎，要价 239 万，出价从 220 万开始，两万三万地增加，最后我出到 250 [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.jjgod.org/wp-content/uploads/2012/03/2012-01-15-20.09.42.jpg"><img src="http://blog.jjgod.org/wp-content/uploads/2012/03/2012-01-15-20.09.42.jpg" alt="" title="Prospekt" width="600" height="278" class="centered size-full wp-image-927 online" /></a></p>

<p>这周把买房和贷款的合同签完，买房这件事情算是告一段落，也可以来写点总结了。从真正决定买房到拍下房子，总共花了将近两个月的时间，对于我这样消费不怎么犹豫的人来说已经是出奇的长了。其实去年找租房的时候就有同事推荐买房，这几年搬家至少每年一次，每次租房实在有诸多不便，而且奥斯陆房价也在世界前列，增长的速度丝毫不见放缓，<a href="http://www.newsinenglish.no/2012/01/03/housing-prices-rise-most-in-stavanger/">最近的数据</a>是奥斯陆的房价自 2005 年来增长了 62%，年增长率大概是 10%。房价变化虽然不能和国内相比，但基数已经太高，奥斯陆的平均房价在 4.5 万/平米左右，所以增长一点都让工薪阶层更吃不消。何况买房还可以退税，所以在向同事打听清楚之后，今年年初就开始策划买房的事宜。</p>

<p>在挪威买房的第一步是选择一个贷款的银行，不同的银行允许贷款的额度和利率都不同，但大体策略是类似的：面向 35 岁以下的头一次购房者优惠最多，如果拥有别的房产或者年纪更大的人就享受不了那么多优惠了。以往头一次购房者可以 100% 贷款，虽然去年底开始挪威也收紧了房贷限制，要求至少首付必须占房价的 15%，但大部分人靠存款、父母支持或者卖房的收入还是可以付得起这部分的。此外国家的银行可以提供更优的房贷，但对于有稳定工作的人来说申请到的可能性不大。</p>

<p>选择银行一般是通过电话或者网站向银行约谈，我的办公室楼下就是 Sparebank1 的办公室，也是我平时使用的银行，所以就先找他们谈。基本上谈话内容就是了解我的年收入、债务等经济情况，打算买的房子的大致价格范围，用来计算我还款的压力，然后给出一个包含贷款额度和利率的具体 offer。如果我觉得可以考虑，就可以把我打算用作首付的钱放在这个银行的一个存款账户内，他们就可以做正式的贷款担保，有了这个担保就可以进入下个环节。一开始 Sparebank1 答应给我贷款 210 万，但利息不算最优，只能给 3.9%，而大多数银行可以给 3.6% ~ 3.7%。所以后来又联系了 DnBNor 和 Nordea 这两家。不过最后选择的还是 Sparebank1，一来是考虑操作的便利，二来是它在我的要求下最后答应给我 3.65% 的利率。</p>

<p>第二步，也是耗时最长的一步，是网上选房和实地看房，在挪威卖房不需要自己去找中介，因为所有的房源都在 <a href="http://www.finn.no/finn/realestate/homes/browse1">finn.no</a> 这个网站上列出了，有详细的房屋介绍和照片，包括房屋的建造年份、每月的公摊费用、维护情况、以前维护欠下的贷款等等。这些广告会附上一般两次的实地看房时间，叫做 visning。visning 一般安排在平时晚上下班后或者周末，每次一小时。大体也就是看看房屋的使用状况，和中介谈谈周边环境和房子的细节问题。如果看完以后感兴趣，就可以留下名字和联系方式，准备进入竞标买房的环节。在挪威选房子和国内区别，主要是这里更看中房子的西向，因为这样可以在下午到晚上获得尽可能长时间的阳光，这在阳光稀缺的国度尤其重要。如果房子朝西，有个大阳台，又是不受遮挡的顶楼，那肯定能卖出好价格。</p>

<p>两次看房结束后的一天内，中介就会组织竞标，竞标一般是早上开始，尽可能在中午 12 点之前结束，开始的出价一般会比房主的要价稍低，然后随着是否热门层层上升，最多时我见过比要价高出 50 余万成交的。竞标的过程都是由中介组织远程完成，第一次出价必须填写一个书面的表格并签字写明过期时间，后续出价就可以直接通过电话口头作出。我参加了三次这样的竞标过程，头一次没有其他人竞争，不过我觉得房主要价 260 万稍贵，就想压到 250 万内成交，可是房主坚持不肯，后来就放弃了这套房子，房主也只能重新组织下一轮的看房和竞标了。第二次的房子竞争者把价格炒到了 280 万以上，超过了我可以接受的最高限度，只好放弃，估计这套房子的成交价在 285 万左右。最后一套房子大家出价都很谨慎，要价 239 万，出价从 220 万开始，两万三万地增加，最后我出到 250 万没有人再加价，可是房主还试图要我出到 255 万，并许诺如果是这个价格就立即卖出，在我拒绝了以后他只好接受了我 250 万的出价。</p>

<p>之后的过程就很简单了，中介发来合同，签字，和银行签好贷款合同，最后这个月底正式过户，完成整个买房的全过程。在一开始同事跟我说买房注定是个非常痛苦的过程，其实觉得倒也还好，中间是会有选择与放弃的痛苦，尤其在喜欢的房子没买到的时候，所以我觉得最有用的一句话是“don&#8217;t get too emotionally attached to the one you didn&#8217;t get.”就算是喜欢的，放弃了也不应该再想，因为好的房子总是会出现的。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.jjgod.org/2012/03/03/owning-an-apartment-in-oslo/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Tools for a typography hacker</title>
		<link>http://blog.jjgod.org/2012/01/16/tools-for-a-typography-hacker/</link>
		<comments>http://blog.jjgod.org/2012/01/16/tools-for-a-typography-hacker/#comments</comments>
		<pubDate>Mon, 16 Jan 2012 11:08:59 +0000</pubDate>
		<dc:creator>jjgod</dc:creator>
				<category><![CDATA[Mac]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[Typography]]></category>

		<guid isPermaLink="false">http://blog.jjgod.org/?p=890</guid>
		<description><![CDATA[一直想写篇 blog 介绍一下常用的、跟字体技术相关的开发调试工具，我一般用 Mac OS X 或者 Linux 开发，所以工具也集中在这两个平台下，也有的是跨平台的。这里只说我自己常用的，欢迎补充。 UnicodeChecker Mac OS X 下完美的 Unicode 字符查看工具，可以根据 UTF-16 编码 (10 进制、10 进制)、UTF-8 编码来查找，或者直接复制粘贴字符进去，可以选择不同的字体查看该字符对应的字形，包含完整的 Unicode 字符属性数据库，可以自动下载安装 Unihan 数据库。几乎是每次开发和调试问题的必备。Linux 下有 gucharmap 实现类似的功能，但要弱很多。 ttx 将 TrueType/OpenType 文件按照指定的表 dump 成 XML 格式，或者反过来，所以既可以查看也可以修改。非常方便分析 OpenType 的 GPOS/GSUB 特性查找表。这是一个命令行工具。更简单一点的 TTF/OTF 分析命令行工具还有 lcdftypetools 里的 otfinfo，可以直接列出字体的特性，但没有细节显示。 FontForge 大部分 TTX 的功能也都可以用 FontForge 实现，虽然界面是基于 Xlib 的相对老旧，但它的功能实在是强大，不过我一般也就用来编辑字体的 name [...]]]></description>
			<content:encoded><![CDATA[<p>一直想写篇 blog 介绍一下常用的、跟字体技术相关的开发调试工具，我一般用 Mac OS X 或者 Linux 开发，所以工具也集中在这两个平台下，也有的是跨平台的。这里只说我自己常用的，欢迎补充。</p>

<ul>
<li><p><a href="http://earthlingsoft.net/UnicodeChecker/">UnicodeChecker</a></p>

<p><a href="http://blog.jjgod.org/wp-content/uploads/2012/01/UnicodeChecker.png"><img src="http://blog.jjgod.org/wp-content/uploads/2012/01/UnicodeChecker.png" alt="" title="UnicodeChecker" width="400" class="aligncenter size-full wp-image-892 noline" /></a></p>

<p>Mac OS X 下完美的 Unicode 字符查看工具，可以根据 UTF-16 编码 (10 进制、10 进制)、UTF-8 编码来查找，或者直接复制粘贴字符进去，可以选择不同的字体查看该字符对应的字形，包含完整的 Unicode 字符属性数据库，可以自动下载安装 Unihan 数据库。几乎是每次开发和调试问题的必备。Linux 下有 <a href="http://live.gnome.org/Gucharmap">gucharmap</a> 实现类似的功能，但要弱很多。</p></li>
<li><p><a href="http://www.letterror.com/code/ttx/">ttx</a></p>

<p>将 TrueType/OpenType 文件按照指定的表 dump 成 XML 格式，或者反过来，所以既可以查看也可以修改。非常方便分析 OpenType 的 GPOS/GSUB 特性查找表。这是一个命令行工具。更简单一点的 TTF/OTF 分析命令行工具还有 <a href="http://www.lcdf.org/type/">lcdftypetools</a> 里的 <a href="http://www.lcdf.org/type/otfinfo.1.html">otfinfo</a>，可以直接列出字体的特性，但没有细节显示。</p></li>
<li><p><a href="http://fontforge.sourceforge.net/">FontForge</a></p>

<p><a href="http://blog.jjgod.org/wp-content/uploads/2012/01/fontforge.png"><img src="http://blog.jjgod.org/wp-content/uploads/2012/01/fontforge.png" alt="" title="fontforge" width="400" class="aligncenter size-full wp-image-900 noline" /></a></p>

<p>大部分 TTX 的功能也都可以用 FontForge 实现，虽然界面是基于 Xlib 的相对老旧，但它的功能实在是强大，不过我一般也就用来编辑字体的 name table 和 OpenType feature。</p></li>
<li><p><a href="http://cgit.freedesktop.org/harfbuzz/tree/util">hb-view</a></p>

<p><a href="http://freedesktop.org/wiki/Software/HarfBuzz">harfbuzz-ng</a> 提供的工具，可以用指定的字体、指定的 OpenType 特性，将 HarfBuzz 排版好的内容以 FreeType 渲染出来，方便对比测试特性字符串的布局正确性。当然，通常我还会用常见的浏览器、文本编辑器等来比较，尤其现在 Firefox 和 IE10 TestDrive 支持 OpenType 特性指定了，测试起来就更方便。</p></li>
<li><p><a href="http://ftp.x.org/pub/X11R7.0/doc/html/fc-list.1.html">fc-list</a>, <a href="http://linux.die.net/man/1/fc-match">fc-match</a></p>

<p><a href="http://www.freedesktop.org/wiki/Software/fontconfig">fontconfig</a> 提供的工具，主要用来分析 Linux 下的字体匹配，在阅读它的<a href="http://www.freedesktop.org/software/fontconfig/fontconfig-user.html">用户文档</a>之后，善用 <code>-v</code> 和 <code>-a</code> 参数，可以直接获得不少字体的信息。</p></li>
<li><p>Pixie</p>

<p><a href="http://blog.jjgod.org/wp-content/uploads/2012/01/Pixie.png"><img src="http://blog.jjgod.org/wp-content/uploads/2012/01/Pixie.png" alt="" title="Pixie" width="414" height="436" class="aligncenter size-full wp-image-905 noline" /></a></p>

<p>Xcode 自带的屏幕放大镜，用来分析 subpixel antialiasing 非常给力。别的平台下当然也有类似的工具，比如我在 Linux 下用 KDE 的 <a href="http://www.kde.org/applications/utilities/kmag/">kmag</a>。</p></li>
<li><p><a href="http://fontgameapp.com/">The Font Game</a>, <a href="http://type.method.ac/">Kerning Game</a> 和 <a href="http://shape.method.ac/">letter shaping game</a></p>

<p>三个制作非常精良的字体相关小游戏，第一个是 iOS 上的字体辨识，后两个则是体验对间距形状把握的 HTML5 在线游戏，适合在开发之余放松一下大脑 <img src='http://blog.jjgod.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.jjgod.org/2012/01/16/tools-for-a-typography-hacker/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Qt 的文本渲染技术</title>
		<link>http://blog.jjgod.org/2012/01/02/text-rendering-with-qt/</link>
		<comments>http://blog.jjgod.org/2012/01/02/text-rendering-with-qt/#comments</comments>
		<pubDate>Mon, 02 Jan 2012 09:30:58 +0000</pubDate>
		<dc:creator>jjgod</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Typography]]></category>

		<guid isPermaLink="false">http://blog.jjgod.org/?p=884</guid>
		<description><![CDATA[去年 12 月中在北京的 Qt 开发者大会上，我做了一个关于 Qt 的文本渲染技术的讲座，兼谈及了一些文本渲染的基本概念和过程，和四年前在清华 thossclub 讲的《文本渲染技术的一次短途旅行》相似但又有些新的内容，有兴趣的朋友可以看 slides，等有录像视频时我也会加上链接。]]></description>
			<content:encoded><![CDATA[<p><a href="http://jjgod.org/docs/slides/TextRenderingWithQt.pdf"><img src="http://blog.jjgod.org/wp-content/uploads/2012/01/QtText.png" alt="Qt 的文本渲染技术" title="Qt 的文本渲染技术" width="531" height="338" class="aligncenter size-full wp-image-887" /></a></p>

<p>去年 12 月中在北京的 Qt 开发者大会上，我做了一个关于 Qt 的文本渲染技术的讲座，兼谈及了一些文本渲染的基本概念和过程，和四年前在清华 thossclub 讲的《<a href="http://blog.jjgod.org/2007/12/04/text-rendering-tech/">文本渲染技术的一次短途旅行</a>》相似但又有些新的内容，有兴趣的朋友可以看 <a href="http://jjgod.org/docs/slides/TextRenderingWithQt.pdf">slides</a>，等有录像视频时我也会加上链接。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.jjgod.org/2012/01/02/text-rendering-with-qt/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>这个夏天</title>
		<link>http://blog.jjgod.org/2011/09/04/this-summer/</link>
		<comments>http://blog.jjgod.org/2011/09/04/this-summer/#comments</comments>
		<pubDate>Sat, 03 Sep 2011 20:35:32 +0000</pubDate>
		<dc:creator>jjgod</dc:creator>
				<category><![CDATA[Asides]]></category>

		<guid isPermaLink="false">http://blog.jjgod.org/?p=849</guid>
		<description><![CDATA[改好 DictUnifier 的 Lion 支持已经将近九点，在奥斯陆的公寓窗外望去，天色已经深沉，地上依旧湿漉漉的，想是小雨还间或下着。这个时节的奥斯陆，气温已经在十度上下徘徊，虽然周围的树叶草坪还绿，冷风已经带上些寒意了。一看上次更新 blog 还是七月下旬，转眼一个多月过去，夏天已经结束了。 去年夏天我结束了三年的研究生学业，一个人跑到远隔万里的奥斯陆来工作，对于生活确实是个极大的变化，但诸般变化总还在计划里，慢慢也就适应了。然而今年夏天对于我生活的影响也许比去年还要大，既然如此，不妨暂且放下这个 blog 向来只更新技术内容的习惯，多记上一笔。 在这个夏天里，我邀请父母来奥斯陆，在我自己布置的公寓住了一个多月，一起游览了挪威的海边小镇 Ålesund、乘船到 Geiranger 峡湾、爬上 Preikestolen；还逛过了巴黎和布拉格，自己则两次到柏林出差，虽然匆忙，也算走过了许多地方，最适合旅游的暑假没有浪费，当然更重要的是在自己安排下带父母出门，这还是平生头一次，其中也有遗憾，但总算走下来了。 这个夏天里我还遇上了自己喜欢的人，认真地开始一段感情，长时间一个人的生活，到现在这种时常牵挂另一个人的心境，其实还颇有一点不大适应，但总归要慢慢学习和成长。 如果要说最大的遗憾，应该是没有花更多时间陪父母，尤其是花在旅程上的时间上多了，计划得略显匆忙，交流其实反而少了。二是因为工作繁杂，生活变化也大，很多原来坚持做的开源项目都没有更新，随着 Lion 的推出都应该陆续完成的，目前已经完成了 TextEdit 和 DictUnifier 的更新，希望接下来继续。 套用《甲方乙方》里那句话，这个夏天过去了，我很怀念它。]]></description>
			<content:encoded><![CDATA[<p>改好 <a href="http://code.google.com/p/mac-dictionary-kit/">DictUnifier</a> 的 <a href="http://www.apple.com/macosx/">Lion</a> 支持已经将近九点，在奥斯陆的公寓窗外望去，天色已经深沉，地上依旧湿漉漉的，想是小雨还间或下着。这个时节的奥斯陆，气温已经在十度上下徘徊，虽然周围的树叶草坪还绿，冷风已经带上些寒意了。一看上次更新 blog 还是七月下旬，转眼一个多月过去，夏天已经结束了。</p>

<p>去年夏天我结束了三年的研究生学业，一个人跑到远隔万里的奥斯陆来工作，对于生活确实是个极大的变化，但诸般变化总还在计划里，慢慢也就适应了。然而今年夏天对于我生活的影响也许比去年还要大，既然如此，不妨暂且放下这个 blog 向来只更新技术内容的习惯，多记上一笔。</p>

<p>在这个夏天里，我邀请父母来奥斯陆，在我自己布置的公寓住了一个多月，一起游览了挪威的海边小镇 <a href="http://www.flickr.com/photos/jjgod/tags/ålesund/">Ålesund</a>、乘船到 <a href="http://www.flickr.com/photos/jjgod/tags/geiranger/">Geiranger</a> 峡湾、爬上 <a href="http://www.flickr.com/photos/jjgod/tags/stavanger/">Preikestolen</a>；还逛过了<a href="http://www.flickr.com/photos/jjgod/tags/paris/">巴黎</a>和<a href="http://www.flickr.com/photos/jjgod/tags/prague/">布拉格</a>，自己则两次到<a href="http://www.flickr.com/photos/jjgod/tags/berlin/">柏林</a>出差，虽然匆忙，也算走过了许多地方，最适合旅游的暑假没有浪费，当然更重要的是在自己安排下带父母出门，这还是平生头一次，其中也有遗憾，但总算走下来了。</p>

<p>这个夏天里我还遇上了自己喜欢的人，认真地开始一段感情，长时间一个人的生活，到现在这种时常牵挂另一个人的心境，其实还颇有一点不大适应，但总归要慢慢学习和成长。</p>

<p>如果要说最大的遗憾，应该是没有花更多时间陪父母，尤其是花在旅程上的时间上多了，计划得略显匆忙，交流其实反而少了。二是因为工作繁杂，生活变化也大，很多原来坚持做的开源项目都没有更新，随着 Lion 的推出都应该陆续完成的，目前已经完成了 TextEdit 和 DictUnifier 的更新，希望接下来继续。</p>

<p>套用《甲方乙方》里那句话，这个夏天过去了，我很怀念它。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.jjgod.org/2011/09/04/this-summer/feed/</wfw:commentRss>
		<slash:comments>25</slash:comments>
		</item>
		<item>
		<title>To all my friends</title>
		<link>http://blog.jjgod.org/2011/07/23/to-all-my-friends/</link>
		<comments>http://blog.jjgod.org/2011/07/23/to-all-my-friends/#comments</comments>
		<pubDate>Sat, 23 Jul 2011 05:43:23 +0000</pubDate>
		<dc:creator>jjgod</dc:creator>
				<category><![CDATA[Miscs]]></category>

		<guid isPermaLink="false">http://blog.jjgod.org/?p=845</guid>
		<description><![CDATA[昨天下午，奥斯陆市中心发生了大型爆炸事件，我经常经过的一条路两侧一片狼藉；随后在 Utøya 的青年夏令营发生了持枪屠杀事件。已有 87 人遇难。 我与家人目前都还安好，也在积极关注事态的发展，谢谢各位的关心。 可以想见的是，无论这两件史无前例的事件最终调查结果如何，都必然会对挪威造成非常深远的影响。作为旅居的华人，我也会在 blog 和 twitter 上继续介绍我了解到的情况。]]></description>
			<content:encoded><![CDATA[<p>昨天下午，奥斯陆市中心发生了大型爆炸事件，我经常经过的一条路两侧一片狼藉；随后在 Utøya 的青年夏令营发生了持枪屠杀事件。已有 87 人遇难。</p>

<p>我与家人目前都还安好，也在积极关注事态的发展，谢谢各位的关心。</p>

<p>可以想见的是，无论这两件史无前例的事件最终调查结果如何，都必然会对挪威造成非常深远的影响。作为旅居的华人，我也会在 blog 和 twitter 上继续介绍我了解到的情况。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.jjgod.org/2011/07/23/to-all-my-friends/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Is Cocoa a legacy framework?</title>
		<link>http://blog.jjgod.org/2011/07/01/is-cocoa-a-legacy-framework/</link>
		<comments>http://blog.jjgod.org/2011/07/01/is-cocoa-a-legacy-framework/#comments</comments>
		<pubDate>Fri, 01 Jul 2011 10:56:02 +0000</pubDate>
		<dc:creator>jjgod</dc:creator>
				<category><![CDATA[Mac]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[cocoa]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[uikit]]></category>

		<guid isPermaLink="false">http://blog.jjgod.org/?p=821</guid>
		<description><![CDATA[Kyle Neath wrote an excellent piece about the design process of GitHub for Mac. What&#8217;s more interesting is his concern about the Mac OS X/Cocoa framework as a whole, it&#8217;s the best criticize of Cocoa that I&#8217;ve seen for a while, I sincerely recommend any developer interested in Cocoa to read. According to Kyle, a [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://warpspire.com/">Kyle Neath</a> wrote an <a href="http://warpspire.com/posts/designing-github-mac/">excellent piece</a> about the design process of <a href="http://mac.github.com/">GitHub for Mac</a>. What&#8217;s more interesting is his concern about the Mac OS X/Cocoa framework as a whole, it&#8217;s the best criticize of Cocoa that I&#8217;ve seen for a while, I sincerely recommend any developer interested in Cocoa to read.</p>

<p>According to Kyle, a first-time Mac OS X designer/developer, <strong>Cocoa is dying for a framework</strong>. This argument feels a bit ironic since I came from the age when a bunch of Cocoa fanboys were labeled as the “<em><a href="http://en.wikipedia.org/wiki/Delicious_Generation">Delicious Generation</a></em>” who only wrote fancy good looking apps with no actual functionalities, while the good &#8216;ol Carbon guys looked so damn unattractive. Has it now come to the downfall of us Cocoa developers?<sup id="fnref:1"><a href="#fn:1" rel="footnote">1</a></sup></p>

<p>Kyle&#8217;s main reasons for not liking Cocoa are as follows:</p>

<ol>
<li>Drawing in code is slow and painful. Images are easier to work with and result in more performant code.</li>
<li>There is no layout engine for Cocoa. If you want two elements to rest side to side, you’ll need to calculate the pixel size of the text, padding, borders, margins — then manually position the next element.</li>
<li>There is no styling engine in Cocoa. (To change the background color of a button for instance will require significant changes)</li>
<li>Learning the differences between layer-backed views, layer-hosted views — understanding that you have to subclass <em>everything</em> — balancing delegates, weak connections, strong connections, KVC, view controllers, and notifications — understanding little intricacies like how AppKit flips <code>.xib</code>s when it load them up or how hard it is to make one word in a sentence bold.</li>
</ol>

<p>I will try to share some of my opinions about them, one by one.</p>

<h4>Is draw in code slow and painful?</h4>

<p>Being a low level graphics developer for so long, I know my opinion must be biased. But still, I&#8217;ve never felt drawing in Cocoa (or Cocoa Touch) to be slow, working with Core Graphics, Cocoa Drawing API and APIs like Core Text is quite pleasant actually. Drawing operations are always blazingly fast. I honestly couldn&#8217;t see a better way to solve these problems without resorting to low level. Yes, they are imperative APIs rather than declarative, yes, you have to do your <code>-drawRect:</code> code cautiously. But low level drawing itself has never been a bottleneck for my programs. The <em>real</em> problems are <strong>scheduling what to draw</strong> and <strong>finding out when stuff is drawn</strong>.</p>

<p>So in my opinion, it&#8217;s not the drawing itself that&#8217;s slow and painful, but you need to have a <strong>thorough understanding of the graphics stack</strong> to be able to write efficient low level imperative drawing code. That&#8217;s a damn steep learning curve. That&#8217;s why very few people can write efficient yet complex drawing code even veterans like Loren Brichter recommend to “<a href="http://blog.atebits.com/2008/12/fast-scrolling-in-tweetie-with-uitableview/">do your own drawing</a>”.</p>

<p>However, there is no silver bullet. Cocoa Touch makes life a little bit easier by simplifying the view hierarchy and build with Core Animation from ground up. But to have butter smooth scrolling, you still need to do your own drawing cautiously. Apple did provide layer-based and layer-hosted views in Cocoa, but they are too conservative to re-architect the entire Cocoa view stack with Core Animation, that&#8217;s a pity but luckily you can always roll your own (as we always did).</p>

<p>Anyway, the best framework I can imagine is the one using a declarative API to construct most of the UI and leverage the full power of GPU, with flexibility to do custom drawing with an imperative API.</p>

<h4>No layout engine for Cocoa?</h4>

<p>Apparently, Apple is solving this with <a href="http://www.scribd.com/doc/50426060/Mac-OS-X-v10-7-Lion">Cocoa Autolayout</a>. Can&#8217;t say much about this (it&#8217;s in NDA) but it does look promising.</p>

<h4>No styling engine in Cocoa?</h4>

<p>Well well, this is controversial. On one hand people are complaining that UI in Mac OS X apps are not consistent anymore, on the other hand people detest <a href="http://en.wikipedia.org/wiki/Aqua_(user_interface)">Aqua</a> and dream for change from the bottom of their heart. I can understand Kyle since he is more of a designer than a developer. With no doubt I think that&#8217;s a fair judgement, but it&#8217;s hard to justify whether the styling difficulty contributes to <a href="http://developer.apple.com/library/mac/#documentation/UserExperience/Conceptual/AppleHIGuidelines/XHIGIntro/XHIGIntro.html">HIG</a> consistency or drives people to the opposite side of it. As a user of Mac OS X I felt that UIs should be “semi-consistent”, or as <a href="http://daringfireball.net">John Gruber</a> <a href="http://daringfireball.net/2011/01/uniformity_vs_individuality_in_mac_ui_design">puts</a> it eloquently: <a href="http://vimeo.com/21742166">uniformity has been replaced by conformity</a>.</p>

<p>Apple is acting slow and they can definitely improve on this. The solution doesn&#8217;t have to be very innovative, adding styling flexibilities here and there is no groundbreaking change. Cocoa Touch is not far superior either, there is still a lot of work to do if you don&#8217;t like the standard controls from UIKit. In contrast, my biased opinion would say that <a href="http://qt.nokia.com/qtquick/">QML/Qt Quick</a> appears to be a much more flexible solution, it&#8217;s <a href="http://en.wikipedia.org/wiki/XUL">XUL</a>/<a href="http://www.adobe.com/products/air/">Air</a>/<a href="http://javafx.com/">JavaFX</a>/<a href="http://en.wikipedia.org/wiki/Windows_Presentation_Foundation">WPF</a> <strong>done right</strong>. Though I am biased, who knows me well should know that I&#8217;m hard to convince as a low level graphics engineer.</p>

<h4>Cocoa has complicated intricacies?</h4>

<p>Yes, any framework survived more than 20 years will have some intricacies, that&#8217;s inevitable. Actually I&#8217;m surprised by the fact that so many of the <a href="http://en.wikipedia.org/wiki/NeXTSTEP">NeXTSTEP</a> APIs are still in good use. Come on, it&#8217;s a fast changing industry and you really need to be a genius to predict the trend in more than 10 years.</p>

<p>However, most of Kyle&#8217;s concerns came from his expectations: he expects to fit UIKit model <strong>as is</strong> into Cocoa but it didn&#8217;t work. It probably never will, as I said previously, Apple is conservative in that sense, for stable platform like Mac OS X, they tend to provide <em>new options</em> other than forcing everyone to <em>adapt to</em> the new model. That inherently complicates the framework, of course. Changes that us Cocoa developers applauded for can be seen as too cautious by iOS developers.</p>

<p>Anyway, I think it&#8217;s fair to say that Cocoa isn&#8217;t the best API for modern, dynamic UI, alternatives like <a href="https://github.com/BigZaphod/Chameleon">Chameleon</a> may eventually surpass it. Nevertheless, there is no easy path between both worlds, you either port the code to the new model (UIKit like) or adapt to the hybrid model (Cocoa like). For iOS developers, the former is definitely easier, but for us the latter seems to be a better option.</p>

<p>That&#8217;s it. I&#8217;m surprised that you can read my ramblings to this far <img src='http://blog.jjgod.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>

<div class="footnotes">
<hr />
<ol>

<li id="fn:1">
<p>I&#8217;ve never labeled myself as part of the &#8220;Delicious Generation&#8221;, I will rather do something useful if it can&#8217;t be good looking at the same time. But still, it&#8217;s sad.&#160;<a href="#fnref:1" rev="footnote">&#8617;</a></p>
</li>

</ol>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.jjgod.org/2011/07/01/is-cocoa-a-legacy-framework/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>X100 与 GF2</title>
		<link>http://blog.jjgod.org/2011/05/22/x100-and-gf2/</link>
		<comments>http://blog.jjgod.org/2011/05/22/x100-and-gf2/#comments</comments>
		<pubDate>Sun, 22 May 2011 08:23:28 +0000</pubDate>
		<dc:creator>jjgod</dc:creator>
				<category><![CDATA[Photography]]></category>
		<category><![CDATA[gf2]]></category>
		<category><![CDATA[x100]]></category>

		<guid isPermaLink="false">http://blog.jjgod.org/?p=812</guid>
		<description><![CDATA[自从上个相机 (Nikon D90) 丢在马德里之后，就一直在寻找比较轻巧的替代，D90 的画质虽然不错，但平时几乎不愿意带出门去，其间关注了 Olympus E-P 系列、Panasonic Lumix GF 系列和 Fujifilm 的 FinePix X100，今年复活节假期之前还没等到 X100 就先买了台 GF2 (14mm f/2.8) 尝试，上周刚刚拿到 X100，可以说说对这两台相机的印象了。 之所以先选择 Panasonic GF2，主要是因为另外两个选择：Olympus E-PL2 和 Sony NEX-5 带的镜头都不令人满意，E-PL2 在我这里只有变焦套机卖而 NEX-5 的 16mm f/2.8 定焦画质收到很多批评，而 GF2 的 14mm f/2.8 正好非常适合旅游的风景照和到此一游照，后来事实证明效果确实也不错。 我对于 GF2 的印象是： 体积非常小，搭配 14mm/2.8 镜头，一只手就可以很方便的握持和操控，适合拍一些角度比较低的照片。 对焦奇快，习惯了单反的对焦速度，改用 GF2 基本不会有任何效率的损失，当然据说这也和镜头搭配有关，Panasonic 14mm f/2.8 镜头应该是目前最快的。 GF2 的高感光度画质是软肋，但因为我主要是拍旅游风景照，基本上没拍什么夜景，所以把 [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_815" class="wp-caption aligncenter" style="width: 610px"><a href="http://blog.jjgod.org/wp-content/uploads/2011/05/IMG_0332.jpg"><img src="http://blog.jjgod.org/wp-content/uploads/2011/05/IMG_0332.jpg" alt="Fujifilm FinePix X100" title="Fujifilm FinePix X100" width="600" height="448" class="size-full wp-image-815" /></a><p class="wp-caption-text">Fujifilm FinePix X100</p></div>

<p>自从上个相机 (Nikon D90) 丢在马德里之后，就一直在寻找比较轻巧的替代，D90 的画质虽然不错，但平时几乎不愿意带出门去，其间关注了 Olympus E-P 系列、Panasonic Lumix GF 系列和 Fujifilm 的 FinePix X100，今年复活节假期之前还没等到 X100 就先买了台 GF2 (14mm f/2.8) 尝试，上周刚刚拿到 X100，可以说说对这两台相机的印象了。</p>

<p>之所以先选择 Panasonic GF2，主要是因为另外两个选择：Olympus E-PL2 和 Sony NEX-5 带的镜头都不令人满意，E-PL2 在我这里只有变焦套机卖而 NEX-5 的 16mm f/2.8 定焦画质收到很多批评，而 GF2 的 14mm f/2.8 正好非常适合旅游的风景照和到此一游照，后来<a href="http://www.flickr.com/photos/jjgod/tags/eastertrip/">事实证明</a>效果确实也不错。</p>

<p>我对于 GF2 的印象是：</p>

<ul>
<li>体积非常小，搭配 14mm/2.8 镜头，一只手就可以很方便的握持和操控，适合拍一些角度比较低的照片。</li>
<li>对焦奇快，习惯了单反的对焦速度，改用 GF2 基本不会有任何效率的损失，当然据说这也和镜头搭配有关，Panasonic 14mm f/2.8 镜头应该是目前最快的。</li>
<li>GF2 的高感光度画质是软肋，但因为我主要是拍旅游风景照，基本上没拍什么夜景，所以把 ISO 控制在 800 以下时，画质还是很出色的，至少看不出比 APS 幅面的相机逊色。</li>
<li>操控比较简单，但因为去掉了大部分的拨盘，基本改用触摸加按钮操控，所以偶尔还是不够方便，尤其像切换对焦点、更改快门、增加曝光补偿之类的常用操作，我还不太习惯。</li>
<li>一个教训是如果让别人帮忙拍到此一游照，一定要把对焦模式改成面部识别。</li>
</ul>

<p>这个相机总的说来还是很满意的，喜欢轻巧搭配的可以加上 Panasonic 20mm f/1.7 镜头，不管是风景还是人像都很方便。不过我因为还想等等看 X100，就先把 GF2 给退了。</p>

<p>X100 的评测其实目前已经很多了，论详尽可以看 <a href="http://dpreview.com/reviews/FujifilmX100/">DPreview</a> 的，尤其是想解毒的可以专门看 <a href="http://dpreview.com/reviews/FujifilmX100/page25.asp">Conclusion</a> 里的 Cons 部分，还是非常中肯的；如果想看看实际拍摄的照片，<a href="http://www.stevehuffphoto.com/2011/05/03/the-fuji-x100-digital-camera-real-world-review-by-steve-huff/">Steve Huff 的评测</a>还不错，当然像 flickr 上搜索 &#8220;x100&#8243; 也能找到很多照片。</p>

<p>从去年 9 月公布的时候我就开始关注 X100，到今年 4 月发售却一直没有货，直到上周才刚刚拿到，总的印象还是没有令我失望 (目前拍的照片放在<a href="http://www.flickr.com/photos/jjgod/tags/x100/">这里</a>)，虽然前面使用 Panasonic GF2 的经验多少提高了期待程度。虽然优缺点网上也都说得很多了，我主要想重复一下我体会最多的几点：</p>

<ul>
<li>体积比 GF2 稍大一点，毕竟加上了取景器，顶部拨盘也比较多，但还是一只手可以抓稳的。</li>
<li>画质一流，镜头在全开光圈时锐度也很高。最强大的是高 ISO 效果，1600 以下基本上不用担心任何明显的噪点，对比起来完全不逊色于 Nikon 这一代的单反。</li>
<li>“微距 (Macro) 模式”其实应该称作“近摄 (Close up) 模式”，因为基本上一米以内的对象不用这个模式就很难合焦了，而到 10cm 以内则所谓的微距模式也不管用了，所以实际上是不可以和单反的微距镜头相比的。</li>
<li>手动对焦 (MF) 模式的对焦环不大好拧，但可以用 AF/AE Lock 按钮来预先自动合焦，然后再用对焦环细调，所以还算方便。</li>
<li>其他情况下对焦速度还是不错的，比 GF2 肯定是慢了半拍，抓拍运动的对象不那么方便，但还不算太困难，尤其是 OVF 提高了取景的效率。</li>
<li>背后的拨盘和按钮设置不太科学，像更改对焦点之类的操作不如 D90 方便。</li>
<li>OVF 的视差要在两米以外才基本可以忽略，而且用 OVF 对近处的对象相比 EVF 也更难合焦，当然因为混合取景器的设计，切换起来并不困难。</li>
<li>内置的中灰滤镜 (ND Filter) 很管用，适合在阳光下拍摄。</li>
</ul>

<p>总结起来 Fujifilm FinePix X100 不失为扫街 (street photography) 利器，至于是否值现在这个价格就见仁见智了，比如花 4000 就能买到的 GF1 套机在焦段上接近 (40mm vs. 35mm 等效)、画质也不差太多，但选择 X100 的多半是因为它复古的造型和操控方式，如果在以后的固件升级里能提高一下对焦效率，尤其是微距模式的对焦，就堪称完美了。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.jjgod.org/2011/05/22/x100-and-gf2/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>浏览器如何渲染文本</title>
		<link>http://blog.jjgod.org/2011/04/09/how-do-browsers-render-text/</link>
		<comments>http://blog.jjgod.org/2011/04/09/how-do-browsers-render-text/#comments</comments>
		<pubDate>Sat, 09 Apr 2011 11:39:54 +0000</pubDate>
		<dc:creator>jjgod</dc:creator>
				<category><![CDATA[Browsers]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Typography]]></category>
		<category><![CDATA[gecko]]></category>
		<category><![CDATA[harfbuzz]]></category>
		<category><![CDATA[icu]]></category>
		<category><![CDATA[webkit]]></category>

		<guid isPermaLink="false">http://blog.jjgod.org/?p=763</guid>
		<description><![CDATA[浏览器是我们最常用的软件之一，文本又是网页中最主要的元素，在浏览器显示文本的过程中有许多有趣的细节，值得展开来讲讲，或许能减少一些误解。这是一个比较粗略的，概括性的介绍，尽可能不涉及过多的技术细节和具体实现，而立足于给 Web 开发者和设计师提供一些正确的概念。 下面的介绍主要根据我对 WebKit 和 Gecko (Firefox) 的印象来谈，其他的浏览器也大致相同，如有阙漏之处欢迎指出。 解码 当浏览器收到来自 Web 服务器的网页数据之后，第一步是要把它解码成可以阅读的文本，因为历史原因，不同区域和语言的网页可能会使用不同的编码方式，而浏览器判断编码主要是依据以下方法： Web 服务器返回的 HTTP 头中的 Content-Type: text/html; charset= 信息，这一般有最高的优先级； 网页本身 meta header 中的 Content-Type 信息的 charset 部分，对于 HTTP 头未指定编码或者本地文件，一般是这么判断； 假如前两条都没有找到，浏览器菜单里一般允许用户强制指定编码； 部分浏览器 (比如 Firefox) 可以选择编码自动检测功能，使用基于统计的方法判断未定编码。 分段 编码确定后，网页就被解码成了 Unicode 字符流，可以进行进一步的处理，比如 HTML 解析了，不过我们这里跳过 HTML/XML 解析的细节，单讲得到了解析后的文本元素之后该怎么处理。 因为我们得到的文本可能是很多种语言混杂的，里面可能有中文、有英文，它们可能要用不同的字体显示；也可能有阿拉伯文、希伯来文这种从右到左书写的文字；也有可能涉及印度系文字这样涉及复杂布局规则的文字；另外，还可能有网页内自己指定的文本语言，比如 &#60;span lang="jp"&#62;日本语&#60;/span&#62; 这样的标记，使得日文汉字可以使用日文字体显示 (因为 Han Unification 导致这些汉字和中文里的汉字使用同样的代码点，尽管很多写法不同)，"lang" 属性也可以在 HTTP 头、&#60;meta&#62; [...]]]></description>
			<content:encoded><![CDATA[<p>浏览器是我们最常用的软件之一，文本又是网页中最主要的元素，在浏览器显示文本的过程中有许多有趣的细节，值得展开来讲讲，或许能减少一些误解。这是一个比较粗略的，概括性的介绍，尽可能不涉及过多的技术细节和具体实现，而立足于给 Web 开发者和设计师提供一些正确的概念。</p>

<p>下面的介绍主要根据我对 WebKit 和 Gecko (Firefox) 的印象来谈，其他的浏览器也大致相同，如有阙漏之处欢迎指出。</p>

<h4>解码</h4>

<p>当浏览器收到来自 Web 服务器的网页数据之后，第一步是要把它解码成可以阅读的文本，因为历史原因，不同区域和语言的网页可能会使用不同的编码方式，而浏览器判断编码主要是依据以下方法：</p>

<ol>
<li>Web 服务器返回的 HTTP 头中的 <a href="http://www.w3.org/International/O-HTTP-charset"><code>Content-Type: text/html; charset=</code></a> 信息，这一般有最高的优先级；</li>
<li>网页本身 <code>meta</code> header 中的 <a href="http://www.w3.org/International/questions/qa-html-encoding-declarations#html5charset">Content-Type</a> 信息的 <code>charset</code> 部分，对于 HTTP 头未指定编码或者本地文件，一般是这么判断；</li>
<li>假如前两条都没有找到，浏览器菜单里一般允许用户强制指定编码；</li>
<li>部分浏览器 (比如 Firefox) 可以选择编码自动检测功能，使用<a href="http://www.mozilla.org/projects/intl/UniversalCharsetDetection.html">基于统计的方法</a>判断未定编码。</li>
</ol>

<h4>分段</h4>

<p>编码确定后，网页就被解码成了 Unicode 字符流，可以进行进一步的处理，比如 HTML 解析了，不过我们这里跳过 HTML/XML 解析的细节，单讲得到了解析后的<a href="https://developer.mozilla.org/en/DOM/Text">文本元素</a>之后该怎么处理。</p>

<p>因为我们得到的文本可能是很多种语言混杂的，里面可能有中文、有英文，它们可能要用不同的字体显示；也可能有阿拉伯文、希伯来文这种从右到左书写的文字；也有可能涉及<a href="http://en.wikipedia.org/wiki/Indic_scripts">印度系文字</a>这样涉及复杂布局规则的文字；另外，还可能有网页内自己指定的文本语言，比如 <code>&lt;span lang="jp"&gt;日本语&lt;/span&gt;</code> 这样的标记，使得日文汉字可以使用日文字体显示 (因为 <a href="http://en.wikipedia.org/wiki/Han_unification">Han Unification</a> 导致这些汉字和中文里的汉字使用同样的代码点，尽管很多写法不同)，<code>"lang"</code> 属性也可以在 HTTP 头、<code>&lt;meta&gt;</code> 或者 <code>&lt;html&gt;</code> 出现，用于标记整个文档的<a href="http://www.w3.org/International/tutorials/language-decl/#Slide0090">全局语言</a>，通常这是一种好的习惯，方便浏览器进行字体匹配。</p>

<p>为了统一处理所有这些复杂的情况，我们要将文本分为由不同语言组成的小段，在有的文本布局引擎里，这个步骤称为“itemize”，分解后的文本段常被称作“text run”，但是具体划分的规则可能根据不同的引擎有所区别，比如 <a href="http://www.freedesktop.org/wiki/Software/HarfBuzz">HarfBuzz</a> 和 <a href="http://site.icu-project.org/">ICU</a> 一般是根据要使用的不同排版类来划分 (常称作“shaper”)，比如英语和法语可能使用同一个 shaper 排版，那么相邻的英语和法语文本就会划分到同一个 run 里，而希伯来文需要另一个 shaper，就划分到它自己的 run 里，以 HarfBuzz 为例，它有这样一些 shaper：</p>

<ul>
<li>通用的 (适用于中文、英文等等大多数布局规则简单的语言)</li>
<li><a href="http://en.wikipedia.org/wiki/Arabic_language">阿拉伯文</a></li>
<li><a href="http://en.wikipedia.org/wiki/Hebrew_language">希伯来文</a></li>
<li><a href="http://en.wikipedia.org/wiki/Indic_scripts">印度系文字</a></li>
<li><a href="http://en.wikipedia.org/wiki/Khmer_language">高棉文</a></li>
<li><a href="http://en.wikipedia.org/wiki/Burma#Language">缅文</a></li>
<li><a href="http://zh.wikipedia.org/zh-cn/諺文">谚文</a></li>
</ul>

<p>不少浏览器还会在这个划分下面，在确定具体使用的字体之后，根据使用字体的不同划分更细的 run，这种 run 可能称作“SimpleTextRun”，每个都会使用和相邻不同的字体，最后把它们逐一交给 shaper 进行排版得到要绘制的字形，这样一来，shaper 的工作就被简化为<strong>在确定的语言、确定的字体下排版确定的文本，生成对应的字形和它们应该放置的位置、占用的空间</strong>。下面先详细说说确定字体的步骤。</p>

<h4>字体</h4>

<p>说到字体，首先必须提到的就是 CSS 里的 <a href="http://www.w3.org/TR/css3-fonts/"><code>font</code></a> 和 <code>font-family</code> 等规则。比如这样的规则：</p>

<pre><code>p { font-family: Helvetica, Arial, sans-serif; }
strong { font-weight: bold; }
</code></pre>

<p>如果对于这样一段文本：</p>

<pre><code>&lt;p&gt;A quick brown fox &lt;strong&gt;jumps&lt;/strong&gt; over the lazy dog.&lt;/p&gt;
</code></pre>

<p>表示这个段落里优先使用 Helvetica 这个 family 的字体，如果找不到，就找 Arial，如果还是找不到，就用浏览器设置的默认非衬线字体 (有的浏览器，比如 Safari 只给你一个设置，有的像 Firefox 则允许根据不同语言设置，这时可以根据前面分析得到的文本 run 语言信息来判断该用哪个)，这个过程非常简单，大家都很好理解。稍微复杂一点的是“jumps”，它应该继承父元素的 <code>font-family</code>，也用 Helvetica，但不用默认的 Regular，而用 Bold 版本，假如找不到 Helvetica Bold，就找 Arial Bold，否则就找浏览器设置的那个字体的 Bold 版本，假如都没有呢？就要考虑用人工伪造的方式来显示粗体了，这个且按下不谈，先看对于中文常见的情况：CSS 指定的字体没有覆盖我们需要的文本时，该怎么做。比如还是上面的 CSS 规则，但对这样的文本：</p>

<pre><code>&lt;p&gt;一只敏捷的狐狸...&lt;/p&gt;
</code></pre>

<p>这里的“一只敏捷的狐狸”该用什么字体呢？假设 CSS 里具体指定了中文字体，比如 <code>Helvetica, STHeiti, sans-serif</code>，那很简单，按照英文字体一样的规则来判断：逐个字符尝试当前的字体是否提供了针对该字符的字形，如果没有则尝试下一个，要是到了最后都没找到匹配的字体呢？CSS 规范里只简单的说执行“system font fallback”，但这个过程在不同的浏览器下可能很不一样，比如 WebKit 会使用 <code>font-family</code> 列表里的<strong>第一个</strong>字体和这段文本所属的语言来寻找 fallback 字体，像 Times 这样的 serif 字体对应的中文 fallback 字体，在 Mac OS X 下是华文宋体 (STSong)；而 Firefox 则会根据 <code>sans-serif</code> 这样的通用 font family 和对应的语言匹配到设置中针对对应语言的默认字体，比如在 Mac OS X 默认的中文非衬线字体是华文黑体 (STHeiti)。Linux 下一般通过 <a href="http://fontconfig.org">fontconfig</a> 去根据语言、风格等参数来选择 fallback，但不同浏览器的实现还可能有区别；Windows 下则一般会使用系统的 Font Linking 机制，根据注册表内的 <a href="http://technet.microsoft.com/en-us/library/cc757457(v=ws.10).aspx">FontSubstitutes</a> 信息来寻找。因为在这里不同的浏览器可能有不同的行为，所以建议<strong>在 CSS 中写明对应平台该用的字体</strong>。</p>

<p>具体的字体选择还有一些不太容易注意的细节，也是各个浏览器差异比较大的一点，可能会出现这样一些问题：</p>

<ul>
<li>是否支持用字体的 PostScript name 选择：如 STHeiti 的 Light 版本又称作 <code>STXihei</code>，或者是否能用 full name 选择：有的浏览器不能正确地将 CSS 里对字体的 <code>font-weight</code> 或者 <code>font-style</code> 等要求映射到特定的字体上，尤其是在字体使用了非标准的 style 命名的情况下，考虑到很多厂商有自己的字体命名规则，这其实很容易出现，像 Helvetica Neue 的 UltraLight, Light, Regular, Medium, Bold 这些不同的 weight，是怎么对应到 CSS <a href="http://www.w3.org/TR/css3-fonts/#descdef-font-weight"><code>font-weight</code></a> 的 100 到 900 数值上的？这就是特别容易出现 bug 的地方。 </li>
<li>是否支持按 localized name 选择：比如能不能用 <code>"宋体"</code> 来代表 <code>"SimSun"</code>。以 Mac OS X 下的浏览器为例，Firefox 支持这样的写法，但基于 WebKit 的浏览器一般不支持，这样的问题 CSS 规范没有限定，所以无论哪种情况都是允许的。</li>
</ul>

<p>总的说来，如果要保证最大限度的兼容性，在 CSS 书写的时候应该<strong>尽可能选择明确、不容易出错的写法，尽量少隐式地让浏览器自己确定</strong> (be explict instead of implict)，虽然隐式写法通常比较简洁，但除非你 100% 确定想支持的浏览器在你想支持的平台下都能支持这个写法，否则还是不应该轻易用。</p>

<p>CSS3 新增的 <code>@font-face</code> 规则则是对于现有规则的扩展，提供了 web fonts 功能，但字体匹配算法的逻辑并没有改变，详细的算法可以看 <a href="http://www.w3.org/TR/css3-fonts/#font-matching-algorithm">CSS 规范里的说明</a>。</p>

<h4>渲染</h4>

<p>当确定了字体以后，就可以将文本、字体等等参数一起交给具体的排版引擎，生成字形和位置，然后根据不同的平台调用不同的字体 rasterizer 将字形转换成最后显示在屏幕上的图案，一般浏览器都会选择平台原生的 rasterizer，比如 Mac OS X 下用 Core Graphics，Linux/X11 下用 FreeType，Windows 下用 GDI/DirectWrite 等等。关于这个步骤，typekit 的这篇 <a href="http://blog.typekit.com/2010/10/15/type-rendering-operating-systems/">blog</a> 可以作为参考。各个浏览器的差异主要来自使用的排版引擎可能对不同的语言支持有差异，调用 rasterizer 使用的参数可能有差异 (比如是否启用 subpixel rendering、使用的 hinting 级别等等)，但在同一个操作系统下的效果差别不会很大。</p>

<h4>建议</h4>

<p>基于以上的介绍，可以尝试提出一个在现有浏览器下，针对中文用户的，书写 CSS 字体选择规则的建议，如下：</p>

<ol>
<li>首先确定要选择字体的元素应该使用的字体风格，比如是衬线字体、非衬线字体还是 cursive、fantasy 之类的；</li>
<li>确定了风格之后，先选择西文字体，优先把平台独特的、在该平台下效果更好的字体写上，比如 Mac OS X 下有 Helvetica 也有 Arial，但 Helvetica (可能) 效果更好，Windows 下则一般只有 Arial，那么写 <code>Helvetica, Arial</code> 就比 <code>Arial, Helvetica</code> 或者只有 <code>Arial</code> 更好；</li>
<li>然后列出中文字体，原则相同，多个平台共有的字体应该尽量放在后边，独有的字体放在前面，还需要照顾到 Mac OS X/Linux 下一般用户习惯用(细)黑体作为默认字体，Windows 下习惯以宋体作为默认字体的情况，比如 <code>STXihei, SimSun</code> 这样的写法比较常见，如果写作 <code>SimSun, STXihei</code>，但 Mac OS X 上装了 SimSun 效果就不会太好看。</li>
<li>最后还是应该放上对应的 generic family，比如 <code>sans-serif</code> 或者 <code>serif</code>。</li>
<li>尽量用字体的基本名称 (比如 English locale 下显示的)，而不要用本地化过的名称。除非特殊情况 (Windows 下“某些”浏览器在特定编码下只能支持本地化的字体名称)。Mac OS X 下字体名称可以用 Font Book 查到 (菜单 Preview -> Show Font Info)，Windows 下字体信息在微软的<a href="http://www.microsoft.com/typography/fonts/product.aspx">网站</a>可以得到，Linux/X11 下可以使用 <code>fc-list</code> 命令查到。</li>
<li>字体名称中包含空格时记住用引号扩起，比如 <code>"American Typewritter"</code> 和 <code>"Myriad Pro"</code>。</li>
<li>文档开头最好指明语言，比如 <code>&lt;html lang="zh-CN"&gt;</code>，可以使用的语言标记参见 <a href="http://www.w3.org/International/articles/language-tags/">W3C 的说明</a>。</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://blog.jjgod.org/2011/04/09/how-do-browsers-render-text/feed/</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
		<item>
		<title>2010 年终总结</title>
		<link>http://blog.jjgod.org/2011/01/01/summary-of-2010/</link>
		<comments>http://blog.jjgod.org/2011/01/01/summary-of-2010/#comments</comments>
		<pubDate>Fri, 31 Dec 2010 17:02:37 +0000</pubDate>
		<dc:creator>jjgod</dc:creator>
				<category><![CDATA[Miscs]]></category>

		<guid isPermaLink="false">http://blog.jjgod.org/?p=753</guid>
		<description><![CDATA[今年是我的生活变化较大的一年：结束了三年的研究生学业，离开长待了六年之久的北京，到奥斯陆开始我的第一份工作。所以数起来从头到尾都过得很充实：一二月份是面试、确定工作，三四月份忙学位论文，五六月忙答辩和毕业的琐事，七月份搬家、开始工作，八月到十一月都在适应新的环境，学习新的体育运动 (骑车、攀岩、滑雪等)，十二月底则花了一周去西班牙旅行。感觉这一年过得飞快，但偶尔又觉得很漫长。下面还是按照去年的格式，对今年作一简要小结。 最喜欢的电影：Inception 最喜欢的读物：Out of Mao&#8217;s Shadow 用得最多的电子产品：Apple iPhone 4 参与最多的软件项目：Qt 花时间最多的翻译作品：Cocoa 编程开发者手册 (未完成) 总的说来，今年写 blog 少了，写 twitter 多了；花在游戏上的时间少了，出门运动的时间多了；浏览网页泡论坛 BBS 的时间少了，看书的时间多了；做自己个人项目的时间少了，花在工作上的时间多了；这些趋势并不所有都是好的，但至少多读书、多运动，有时间多走走看，正是我对明年的期望。]]></description>
			<content:encoded><![CDATA[<p>今年是我的生活变化较大的一年：结束了三年的研究生学业，离开长待了六年之久的北京，到奥斯陆开始我的第一份工作。所以数起来从头到尾都过得很充实：一二月份是面试、确定工作，三四月份忙学位论文，五六月忙答辩和毕业的琐事，七月份搬家、开始工作，八月到十一月都在适应新的环境，学习新的体育运动 (骑车、攀岩、滑雪等)，十二月底则花了一周去西班牙旅行。感觉这一年过得飞快，但偶尔又觉得很漫长。下面还是按照<a href="http://blog.jjgod.org/2010/01/01/summary-of-2009/">去年的格式</a>，对今年作一简要小结。</p>

<ul>
<li>最喜欢的电影：<a href="http://www.imdb.com/title/tt1375666/">Inception</a></li>
<li>最喜欢的读物：<a href="http://www.outofmaosshadow.com/">Out of Mao&#8217;s Shadow</a></li>
<li>用得最多的电子产品：<a href="http://www.apple.com/iphone/">Apple iPhone 4</a></li>
<li>参与最多的软件项目：<a href="http://qt.nokia.com">Qt</a></li>
<li>花时间最多的翻译作品：<a href="http://www.amazon.com/Cocoa-Programming-Developers-Handbook-Chisnall/dp/0321639634">Cocoa 编程开发者手册</a> (未完成)</li>
</ul>

<p>总的说来，今年写 blog 少了，写 <a href="http://twitter.com/jjgod">twitter</a> 多了；花在游戏上的时间少了，出门运动的时间多了；浏览网页泡论坛 BBS 的时间少了，看书的时间多了；做自己个人项目的时间少了，花在工作上的时间多了；这些趋势并不所有都是好的，但至少多读书、多运动，有时间多走走看，正是我对明年的期望。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.jjgod.org/2011/01/01/summary-of-2010/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

