<?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.</description>
	<lastBuildDate>Thu, 31 Jan 2013 16:59:02 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>Mac 连接环绕立体声系统</title>
		<link>http://blog.jjgod.org/2013/01/31/surround-sound-system-and-mac/</link>
		<comments>http://blog.jjgod.org/2013/01/31/surround-sound-system-and-mac/#comments</comments>
		<pubDate>Wed, 30 Jan 2013 23:26:33 +0000</pubDate>
		<dc:creator>jjgod</dc:creator>
				<category><![CDATA[Asides]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[Miscs]]></category>

		<guid isPermaLink="false">http://blog.jjgod.org/?p=1054</guid>
		<description><![CDATA[在家看电影这么久，老早就在琢磨要不要换一个更强大一点的 5.1 环绕立体声系统，因为空间有限，专业的音响系统用不上也听不出差别，最近 XBMC 出了一个模拟立体声的 bug，让我又开始想要不要换到用数字输出才不浪费大部分 BluRay rip 里的 DTS 5.1 音频了。 Mac 的数字音频输出有两种方式，通过集成的数字/模拟音频输出 3.5mm 口用 TOSLINK 线，或者通过 HDMI。因为我用来放电影的 Mac mini 还是 2009 年的型号，所以用 TOSLINK 是唯一的解法。注意 TOSLINK 相比 HDMI 的限制是由于带宽所限无法直接输出 DTS HDMA 或者 Dolby TrueHD 的音频，但考虑到 OS X 的限制即使是用 HDMI 也无法直接输出这两种格式的，所以也就没啥好说的了。 硬件选择上，一开始考虑选择低端的数字音频解码器，比如 Yamaha RX-V473 或者 Pioneer VSX-527-S，价位相近，2000 ~ 3000 kr。优点是这两款低端的解码器对于我的需求来说都绰绰有余了，而且都支持 7.1 的 HD 音频，日后升级也有余地。缺点也很明显，单有解码器只解决一半问题，至少还得买一套 5.1 [...]]]></description>
				<content:encoded><![CDATA[<p>在家看电影这么久，老早就在琢磨要不要换一个更强大一点的 5.1 环绕立体声系统，因为空间有限，专业的音响系统用不上也听不出差别，最近 <a href="http://xbmc.org">XBMC</a> 出了一个模拟立体声的 bug，让我又开始想要不要换到用数字输出才不浪费大部分 BluRay rip 里的 DTS 5.1 音频了。</p>

<div id="attachment_1058" class="wp-caption aligncenter" style="width: 585px"><a href="http://blog.jjgod.org/wp-content/uploads/2013/01/Z906.png"><img src="http://blog.jjgod.org/wp-content/uploads/2013/01/Z906.png" alt="Logitech Z906" width="575" height="350" class="size-full wp-image-1058 noline" /></a><p class="wp-caption-text">Logitech Z906</p></div>

<p>Mac 的数字音频输出有两种方式，通过集成的数字/模拟音频输出 3.5mm 口用 <a href="http://en.wikipedia.org/wiki/TOSLINK">TOSLINK</a> 线，或者通过 HDMI。因为我用来放电影的 Mac mini 还是 <a href="http://support.apple.com/kb/SP505">2009 年的型号</a>，所以用 TOSLINK 是唯一的解法。注意 TOSLINK 相比 HDMI 的限制是由于带宽所限无法直接输出 <a href="http://en.wikipedia.org/wiki/DTS-HD_Master_Audio">DTS HDMA</a> 或者 <a href="http://en.wikipedia.org/wiki/Dolby_TrueHD">Dolby TrueHD</a> 的音频，但考虑到 OS X 的限制即使是用 HDMI 也<a href="http://wiki.xbmc.org/index.php?title=XBMC_v12_(Frodo)_FAQ#Does_XBMC_for_Mac_OS_X.2C_iOS.2C_or_Apple_TV_2_have_HD_audio_passthrough.3F">无法直接输出这两种格式</a>的，所以也就没啥好说的了。</p>

<p>硬件选择上，一开始考虑选择低端的数字音频解码器，比如 <a href="http://usa.yamaha.com/products/audio-visual/av-receivers-amps/rx/rx-v473_black_u/">Yamaha RX-V473</a> 或者 <a href="http://www.pioneer.eu/uk/products/42/98/405/VSX-527-S/specs.html">Pioneer VSX-527-S</a>，价位相近，2000 ~ 3000 kr。优点是这两款低端的解码器对于我的需求来说都绰绰有余了，而且都支持 7.1 的 HD 音频，日后升级也有余地。缺点也很明显，单有解码器只解决一半问题，至少还得买一套 5.1 的音箱系统来替换我原来用的 <a href="http://www.logitech.com/en-us/product/speaker-system-z523">Logitech Z523</a> 2.1 系统。</p>

<p>所以再仔细一看 Logitech 现在的产品，替换原来的 <a href="http://www.amazon.com/Logitech-THX-Certified-Digital-Surround-Speaker/dp/B0002WPSBC">Z5500</a> 的这套 <a href="http://www.logitech.com/en-us/product/speaker-system-Z906">Z906</a> 倒是个很好的选择：自带 DTS 和 Dolby 5.1 解码，有数字和模拟音频输入，省掉了解码器的费用，而且本身也正好是一套不错的 5.1 音箱。看看到处评价都不错，就买来试试了，一同买的还有一根 TOSLINK &#8211; 3.5mm 线，其中 3.5mm 头接 Mac mini，当然也可以买 TOSLINK &#8211; TOSLINK 线然后加一个 <a href="http://www.amazon.com/Recoton-Fiber-Optic-Toslink-Adapter/dp/B0002MQGRM">TOSLINK &#8211; 3.5mm 转接头</a>。</p>

<p>今天收到货，接上之后 OS X 直接就识别出了数字输出 (副作用是这样就<a href="http://hints.macworld.com/article.php?story=20090111110741237">锁定了音量</a>，必须通过解码终端来控制音量)，在 XBMC 中也切换为数字输出 5.1 DTS/AC3 音频很顺利的就在 Z906 中正确解码了，唯一需要注意的是 Z906 的“Input”选择必须切换为数字输入对应的端口 (有 3 或者 4 两个 TOSLINK 输入，我用的是 3)。相比原来的音箱，感觉音效果然提升不少。</p>

<p>除了 XBMC 以外，<a href="http://mplayerx.org">MPlayer X</a> 和 <a href="http://www.videolan.org/vlc/index.html">VLC</a> 都应该支持 5.1 DTS/AC3 输出，但其他的应用比如 Mac 下的游戏我还没尝试。另外可以考虑再找条 TOSLINK 线试试用 <a href="http://en.wikipedia.org/wiki/PlayStation_3">PS3</a> 玩游戏的效果。</p>

<p>不过 Logitech Z906 的缺点也很明显，不支持 DTS HDMA/Dolby TrueHD 解码，也没有 HDMI 输入输出，相信下一代产品会有改进吧。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.jjgod.org/2013/01/31/surround-sound-system-and-mac/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>opf-cc: epub 和 mobi 的自动简繁转换工具</title>
		<link>http://blog.jjgod.org/2013/01/31/opf-cc/</link>
		<comments>http://blog.jjgod.org/2013/01/31/opf-cc/#comments</comments>
		<pubDate>Wed, 30 Jan 2013 22:47:38 +0000</pubDate>
		<dc:creator>jjgod</dc:creator>
				<category><![CDATA[Miscs]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Tools]]></category>

		<guid isPermaLink="false">http://blog.jjgod.org/?p=1049</guid>
		<description><![CDATA[写一个自动转换 epub 或者 mobi 格式文件的中文简繁体的工具是我一直想做的事情，因为有不少格式内容精美的书籍资源都只有繁体中文版本，而我又不习惯长篇阅读繁体，所以常常要手工转换再用 calibre 封装，不胜其烦，相信其他人也有类似需求。 上周末有空，就用 Python 写了 opf-cc 这个项目，是 Open Packaging Format Chinese Conversion 的缩写，因为 epub 和 Amazon 采用的 mobi 都只是封装方式，具体的文件布局都是按照 OPF 规范的。这里说说实现的思路。 简繁转换这个问题相对好解决，有现成的 OpenCC 在处理多繁一简或者多简一繁的问题上已经很完善了，所以就稍微修改了一下 OpenCC 的代码直接拿来用了，修改都作为 pull request 已经提交到上游了。 解包 epub 比较简单，因为 epub 实际上就是 zip 压缩包，所以用 Python 的 zipfile 模块直接就可以解压。mobi 的解包稍微麻烦一些，如果不用 calibre 那一套庞大的库，mobiunpack 就是最好的选择。 解包后需要找到应该转换的文件，比较麻烦的地方是有的目录中 href 到的文件名本身就是繁体，如果直接整个目录文件一起转换，就得把文件也对应改名，比较麻烦，这里我尝试用 lxml 来解析目录文件，挑出文本来调用 OpenCC [...]]]></description>
				<content:encoded><![CDATA[<p>写一个自动转换 <a href="http://en.wikipedia.org/wiki/EPUB">epub</a> 或者 <a href="http://en.wikipedia.org/wiki/Mobipocket">mobi</a> 格式文件的中文简繁体的工具是我一直想做的事情，因为有不少格式内容精美的<a href="http://book.zi5.me">书籍</a><a href="http://ikandou.com">资源</a>都只有繁体中文版本，而我又不习惯长篇阅读繁体，所以常常要手工转换再用 <a href="http://calibre-ebook.com">calibre</a> 封装，不胜其烦，相信其他人也有类似需求。</p>

<p>上周末有空，就用 Python 写了 <a href="https://github.com/jjgod/opf-cc">opf-cc</a> 这个项目，是 <a href="http://en.wikipedia.org/wiki/OPF_(file_format)#Open_Packaging_Format_2.0">Open Packaging Format</a> Chinese Conversion 的缩写，因为 epub 和 Amazon 采用的 mobi 都只是封装方式，具体的文件布局都是按照 OPF 规范的。这里说说实现的思路。</p>

<p>简繁转换这个问题相对好解决，有现成的 OpenCC 在处理多繁一简或者多简一繁的问题上已经很完善了，所以就稍微修改了一下 OpenCC 的代码直接拿来用了，修改都作为 <a href="https://github.com/BYVoid/OpenCC/pull/12">pull</a> <a href="https://github.com/BYVoid/OpenCC/pull/14">request</a> 已经提交到上游了。</p>

<p>解包 epub 比较简单，因为 epub 实际上就是 zip 压缩包，所以用 Python 的 <a href="http://docs.python.org/2/library/zipfile">zipfile</a> 模块直接就可以解压。mobi 的解包稍微麻烦一些，如果不用 calibre 那一套庞大的库，<a href="http://www.mobileread.com/forums/showthread.php?t=61986">mobiunpack</a> 就是最好的选择。</p>

<p>解包后需要找到应该转换的文件，比较麻烦的地方是有的目录中 href 到的文件名本身就是繁体，如果直接整个目录文件一起转换，就得把文件也对应改名，比较麻烦，这里我尝试用 <a href="http://lxml.de">lxml</a> 来解析目录文件，挑出文本来调用 OpenCC 的 Python 模块进行转换，对于 href 属性的内容则不转换。</p>

<p>重新打包 epub 也简单，<del datetime="2013-01-31T16:58:50+00:00">用 OS X 的 zip 工具一压就可以了</del> (更新: <a href="http://wang.yuxuan.org">fishy</a> 提供了不依赖单独 zip 工具而是直接用 Python 的 zipfile 的实现)，但 mobi 的打包比较麻烦，要么用 calibre 要么用 Amazon 提供的 <a href="http://www.amazon.com/gp/feature.html?ie=UTF8&amp;docId=1000765211">KindleGen</a>，好处是下载安装一个二进制程序就可以了，<del datetime="2013-01-31T09:20:23+00:00">坏处是生成的文件大小要比原来的文件大一倍有余，calibre 就没这个问题</del> (更新: 经 byelims 推荐使用 <a href="http://www.mobileread.com/forums/showthread.php?t=96903">kindlestrip</a> 来处理 KindleGen 生成的文件，可以去掉冗余的数据)。</p>

<p>总的说来这个项目还有不少可以改进的地方，除了上述两点以外，还有可以加入简体转繁体的功能，也就是给 OpenCC 传一个不同的参数的事而已。不过我设想该有的功能都已经有了，具体应用的时候遇到什么问题再拿来改进。</p>

<p>另外有兴趣的朋友可以提供更方便的封装，比如用 <a href="http://support.apple.com/kb/HT2488?viewlocale=en_US&amp;locale=en_US">Automator</a> 或者 <a href="http://wafflesoftware.net/thisservice/">ThisService</a> 做成 OS X 的 <a href="http://en.wikipedia.org/wiki/Services_menu">Service</a>，就可以直接在 Finder 里选中文件右键点击转换了。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.jjgod.org/2013/01/31/opf-cc/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>My new job</title>
		<link>http://blog.jjgod.org/2012/11/25/my-new-job/</link>
		<comments>http://blog.jjgod.org/2012/11/25/my-new-job/#comments</comments>
		<pubDate>Sat, 24 Nov 2012 22:30:36 +0000</pubDate>
		<dc:creator>jjgod</dc:creator>
				<category><![CDATA[Mac]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Typography]]></category>

		<guid isPermaLink="false">http://blog.jjgod.org/?p=1033</guid>
		<description><![CDATA[In my previous post I talked about leaving Nokia and the Qt community. So what am I joining? Turned out I&#8217;m staying in Oslo for Opera Software. Why? There are a few reasons. When I applied for a job at Nokia, Qt Development Frameworks, I also sent my resume to Opera. But their response came [...]]]></description>
				<content:encoded><![CDATA[<p><a href="http://opera.com"><img src="http://blog.jjgod.org/wp-content/uploads/2012/11/Opera-logo-PNG.png" alt="" title="Opera" width="300" class="alignright size-full noline wp-image-1037" /></a></p>

<p>In my <a href="/2012/10/07/no-longer-a-troll/">previous post</a> I talked about leaving Nokia and the Qt community. So what am I joining? Turned out I&#8217;m staying in Oslo for <a href="http://www.opera.com">Opera Software</a>. Why? There are a few reasons.</p>

<ul>
<li>When I applied for a job at Nokia, Qt Development Frameworks, I also sent my resume to Opera. But their response came too late (I got a “Your background looks very interesting&#8230;” letter after 4 months), by the time I received it, I have finished my interviews at Nokia and almost decided to join them. So I joined the trolls for 2 years. But I have always been thinking what would be like to work on Opera instead. Now I got the chance.</li>
<li>I joined the trolls expecting to be a Mac developer, but as it turned out I actually focused on the other interest: typography. It&#8217;s wonderful to be one of the few typography engineers in the world, but I still want to sharpen my Cocoa skills from time to time. So now I&#8217;m actually working full time as a Mac developer for Opera.</li>
<li>Working on typography is my dream job since I was a child. But I had the fear that I was too familiar with internals of Qt thus afraid of change and learning new things. Now I got the exposure of a whole new area and have to quickly learn a lot of new things &#8212; exactly I wanted.</li>
<li>Doing framework job is a great learning experience, the code has to be so solid and stable and I get to work with many great engineers. But from time to time I wanted to work on some products that are closer to the end user, like a browser. Something that you can go to the party and tell rest of the people what you are working on. (Explaining Qt to non-tech people is not exactly my strength.)</li>
</ul>

<p>I have worked in the <a href="http://my.opera.com/chooseopera/blog/2012/09/07/office-space">new Opera office</a> for more than a month and so far it has been a really great experience. The work is fast pace, challenging and my colleagues are friendly. The best thing so far is we have free beers on every Friday <img src='http://blog.jjgod.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  I will probably write again about my job after a few months and tell you more.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.jjgod.org/2012/11/25/my-new-job/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>&lt; /troll &gt;</title>
		<link>http://blog.jjgod.org/2012/10/07/no-longer-a-troll/</link>
		<comments>http://blog.jjgod.org/2012/10/07/no-longer-a-troll/#comments</comments>
		<pubDate>Sat, 06 Oct 2012 16:04:13 +0000</pubDate>
		<dc:creator>jjgod</dc:creator>
				<category><![CDATA[Asides]]></category>
		<category><![CDATA[Culture]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://blog.jjgod.org/?p=1009</guid>
		<description><![CDATA[Two years ago, I started my first job at Nokia, Qt Development Frameworks. Originally planned to become a Mac developer, I ended up working on the text layout and font rendering part of Qt. Not exactly carried out what I wanted to do, it is still a fantastic job with many good memories. Some of [...]]]></description>
				<content:encoded><![CDATA[<p><a href="http://blog.jjgod.org/2010/08/07/becoming-a-troll/">Two years ago</a>, I started my first job at <a href="http://qt.digia.com">Nokia, Qt Development Frameworks</a>. Originally planned to become a Mac developer, I ended up working on the <a href="http://jjgod.org/docs/slides/TextRenderingWithQt.pdf">text layout and font rendering</a> part of Qt. Not exactly carried out what I wanted to do, it is still a fantastic job with many good memories. Some of my favorite parts of this job are:</p>

<ul>
<li>Passionate co-workers with the amount of dedication I have never seen before. I really enjoyed working with the fellows in graphics team. Many of them have spent more than ten or even twenty years on graphics programming. It is truly a team I&#8217;m honored to work with and I learnt a lot from them.</li>
<li>Really high quality code base with decent workflow (git and gerrit are the best tools and JIRA for bug tracking worked well for me).</li>
<li>Nice office layout with separated rooms.</li>
<li>Social activities such as climbing, skiing and movie nights, we also helped each other on moving and hang out together in house warming parties &#8211; time spent with friendly and helpful trolls is one of my best memories.</li>
<li>Free drinks and snacks (I enjoyed the apple juice, <a href="http://www.tine.no/produkter/melk/smaksatt-melk/tine-sjokomelk">chocolate milk</a> and cookies).</li>
<li>Ice creams for the whole summer, and donuts on the first Friday of every month.</li>
<li>Lønningspils &#8211; a Norwegian tradition: monthly beer drinking on paycheck weekends.</li>
<li>Table tennis &#8211; I guess I let a lot of people down as a Chinese yet played just so so in this sport.</li>
<li>The 8-core Mac Pro I used as the main development machine.</li>
</ul>

<p>Things that didn&#8217;t work that well includes:</p>

<ul>
<li>Pressure from Nokia to do some of the stuff I didn&#8217;t enjoy that much and ended up not shipping anything, I surely learnt a lot from it, but still felt that is a waste of time.</li>
<li>Canteen &#8211; It was quite good when I joined, but got much worse from the end of last year when the previous chef left. Terrible soup choices and warm food usually tasted awful.</li>
</ul>

<p>Anyway, after these wonderful two years, I think it&#8217;s time to move on. I want to work on something else now. So I didn&#8217;t join most of my colleagues <a href="http://www.digia.com/en/Home/Company/News/Digia-to-acquire-Qt-from-Nokia/">transferring to Digia</a>, but I sincerely think that they have a very good chance of succeed and making &#8220;Qt Everywhere&#8221; more true than it is. It has been a great ride and if anyone is looking for a job and Digia is hiring, I can recommend it without any hesitation.</p>

<p>I will try to cover what&#8217;s next for me in the next post, stay tuned <img src='http://blog.jjgod.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.jjgod.org/2012/10/07/no-longer-a-troll/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Thoughts on Learnable Programming</title>
		<link>http://blog.jjgod.org/2012/09/29/thoughts-on-learnable-programming/</link>
		<comments>http://blog.jjgod.org/2012/09/29/thoughts-on-learnable-programming/#comments</comments>
		<pubDate>Fri, 28 Sep 2012 16:33:55 +0000</pubDate>
		<dc:creator>jjgod</dc:creator>
				<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://blog.jjgod.org/?p=967</guid>
		<description><![CDATA[After reading Bret Victor&#8217;s new essay Learnable Programming and some of the responses, the idea keep lingering in my head. While his famous lecture Inventing on Principle tackled the idea of making new principles, people are mostly interested in applying that visualization method on IDEs and such. Although most of these efforts are largely experimental, [...]]]></description>
				<content:encoded><![CDATA[<p>After reading Bret Victor&#8217;s new essay <a href="http://worrydream.com/LearnableProgramming/">Learnable Programming</a> and <a href="http://nothings.org/computer/victory.html">some</a> <a href="http://aleffert.livejournal.com/132353.html">of</a> the <a href="http://news.ycombinator.com/item?id=4577133">responses</a>, the idea keep lingering in my head.</p>

<p>While his famous lecture <a href="https://vimeo.com/36579366">Inventing on Principle</a> tackled the idea of making new principles, people are mostly interested in applying that visualization method on <a href="http://www.chris-granger.com/2012/04/12/light-table---a-new-ide-concept/">IDEs</a> and <a href="http://www.khanacademy.org/cs">such</a>. Although most of these efforts are largely experimental, I still find it harsh to dismiss them and consider them as a failure. Live coding is not the point of Victor&#8217;s lecture or essay, but it is still <em>immensely better</em> than a dumb editor and cold console that I used to use to learn programming.</p>

<p>(My girlfriend, who majored in landscape design, learned most JavaScript concepts with the rudimentary web editor from <a href="http://www.codecademy.com/">Codecademy</a>. She found it engaging and helpful. I doubt she will find it that way if she was given a Unix console and gcc, checking <code>a.out</code> output every time a change was made.)</p>

<p>In the area of learning a new way of thinking, things as simple as live coding can be useful.</p>

<p>What&#8217;s more important is how do we progress after grasping basic concepts like iteration and function? While most people think learning programming as a one time effort, I have programmed for more than 10 years and I&#8217;m still <em>constantly learning</em>.</p>

<p>Malcolm Gladwell&#8217;s <a href="http://en.wikipedia.org/wiki/Outliers_(book)">Outliers</a> brought us the concept of 10,000 hours of practice. He told us that Bill Joy became a master after practicing programming for 10,000 hours. But what exactly has Bill Joy done in his practice is unknown to us. We all knew that Bill has coded the vi editor and some of the BSD network stack. Did he start practicing from writing a smaller subset of vi or BSD?</p>

<p>The essential question here is how do we learn higher levels of abstraction and design systems more complicated.</p>

<p>First, I personally believe that <strong>we need to understand the details to do higher level designs</strong>. You won&#8217;t be able to design an efficient system <em>without</em> knowing the <strong>implementation costs</strong> and <strong>performance impact</strong> of critical code paths. That&#8217;s why I usually choose to dive to the bottom and solve/evaluate a few critical issues before looking at the big picture.</p>

<p>However, human mind is not a precise machine that can assemble low level details into high level constructs. After mastering the details sometimes we need to take it away, clear our minds to see a bigger picture, otherwise our heads will be occupied by low level details and have no time to abstract. Contradicted as it is, <em>visualization</em> becomes a really useful tool to <em>hide</em> the details for us.</p>

<p>With visualization as simple as a pie chart, we will suddenly able to free our minds, stand on our previous results and reach higher fruits. That, I think, is the real value of Bret Victor&#8217;s idea. What I disagree with him is that his idea doesn&#8217;t have to be a groundbreaking rule to revolutionize our ways of programming, the existing tools and IDEs can still equip that as a weapon, to help us tackle even more complex problems.</p>

<p>Imagine code visualization as an <strong>amplifier</strong>. Without that it is possible to work on certain issues, but with that you are suddenly able to work on harder issues in a more efficient manner.</p>

<p>How to make that really work? Let&#8217;s start from small. Take your favorite IDE for example, Xcode can have built-in visualizer for native Cocoa classes such as <code>NSString</code>, <code>NSArray</code>, <code>NSColor</code> and <code>NSFont</code>. The code to show them is already there, just need to find a way to present. Qt Creator can have visualizer for <code>QString</code>, <code>QTransform</code>, <code>QColor</code> and <code>QFont</code>, etc.</p>

<p>For visualizing the states of a program, it works just like our existing debugger with variable watching feature. Except that is presented in a <em>structural</em> way, specific presentation can be given by the programmer himself, just like writing a test case. We can have a drag-and-drop layout interface to do that.</p>

<p>Some of Bret Victor&#8217;s ideas (like parameter tagging) can already be achieved with a static analyzer such as clang. Others can only be done in execution. How to speed up execution to avoid setting up a lot of states is the most interesting problem. I think we can try to reduce the amount of input and take an independent block of code (functions without side effects) for examination in an <em>isolated</em> sandbox environment, supplying the required parameters in a simpler way just like preparing for test data sets.</p>

<p>In summary, I still expect that this visualization tool as a <em>programming assistant</em>. An assistant that can take a piece of code, walk through its execution and explain it to me how it works. Even if can only tell how does <em>one</em> variable transits in a loop, it will still be much better than me evaluating it by hand with paper and pencil. In short, hand the repeating tasks over to your machine and focus on something more <strong>creative</strong>, that&#8217;s what we humans are good at.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.jjgod.org/2012/09/29/thoughts-on-learnable-programming/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>我了解到的挪威</title>
		<link>http://blog.jjgod.org/2012/09/04/norway-in-my-eyes/</link>
		<comments>http://blog.jjgod.org/2012/09/04/norway-in-my-eyes/#comments</comments>
		<pubDate>Tue, 04 Sep 2012 10:16:08 +0000</pubDate>
		<dc:creator>jjgod</dc:creator>
				<category><![CDATA[Asides]]></category>
		<category><![CDATA[Culture]]></category>
		<category><![CDATA[Miscs]]></category>
		<category><![CDATA[norway]]></category>

		<guid isPermaLink="false">http://blog.jjgod.org/?p=954</guid>
		<description><![CDATA[相比熟知的中西欧国家，北欧对于国内的朋友较为陌生，比如我有的朋友从来记不住我去的是挪威，分不清瑞典与瑞士的也大有人在。不独国人，据一位美国同事说，他的同乡一直以为他去的是南卡罗来纳周的 Norway。近期见诸媒体的有一些关于北欧的报道，比如南方周末的这篇《高物价高税负，丹麦为何走得比美国好》和纽约时报的《Investors Seek Out Safer Shores》也算是管中窥豹。来挪威已经两年，别的北欧国家不敢说，至少对于挪威可以略谈谈我自己了解到，而国内甚少报导的部分，权作参考。 常说挪威是个“社会主义国家”，从我们中学学到的定义“国家控制经济命脉”来说，确实如此，挪威的核心产业基本上都是国家控制或者大力扶持，个人独资的企业极少，比如石油是国家石油公司 (Statoil) 占了绝大多数的份额、铁路是 NSB、航空业老牌的北欧航空 (SAS) 虽然受到很多挑战，但仍占最大份额。 相比其他北欧国家，挪威对于农产品有非常大的贸易保护，传统的渔业不说，乳业是由国内的巨头 Tine 控制的，去年因为 Tine 对雨季后产奶量的错误判断造成了整个国家的“黄油危机”，整个圣诞季全国的商店都没有足够的黄油，只能用人造黄油替代，而进口黄油很难进入挪威市场，Tine 不仅是最大的乳业销售商，同时它还占有行业规范制定者的地位，类似“裁判下场打球”，所以国内对此有很多批评。禽业则来自 Prior 占据了超市绝大部分的鸡蛋货架。 与工农业的贸易保护同时的，是零售业的封闭，整个挪威的贫富差距虽然较小，但是最富有的人往往是国内的零售业巨头，如 Rimi 等。有观点认为，高物价其实很大部分来自零售业的贪婪，同样的产品，如果在中东超市销售，价格就比常见的联锁超市链的售价要低很多。 从中国到挪威，最不习惯的也许是巨大的人力成本差异，从网上购物的邮费或者快递费动辄数百不说，技术工人的收费更是令人咂舌，电工和水管工一小时的收费可以轻易上千，房屋、汽车的维修费用也极高，例如安装汽车尾部的拖车装置就要花费上万。在国内这是很难想象的。 虽然整个挪威地广人稀，但首都奥斯陆的人口密度却比北京更高，高人口密度很大程度上来自移民滥用了福利制度。如最近的报导认为短期来挪威工作的人对社会的贡献要比长期的移民多得多，因为短期的工程师等往往有较高工资，纳税但基本上享受不到福利就回去了，而长期移民却有许多长期享受失业和生育福利但从来不工作的。 同时这也带来了很多不稳定的因素，来挪威两年，遇到过三次在公交车上偷窃的行为，据办公室的同事说，这在十来年前的挪威是很难想象的，当时的城市用“路不拾遗”形容也毫不夸张。再比如奥斯陆警察以巡逻不必佩枪自豪，但最近大部分的警察也开始佩枪了，当然治安的不稳定因素也不只是移民造成的。 挪威的 IT 产业相比美国和许多其他欧洲国家都更陈旧和封闭，相比邻国瑞典对创业的扶持都远远不及，整个产业最多的是 Java、.NET 的企业咨询，应用新技术的创业公司极少，招聘国外的员工也很少。最近见到的负面新闻有整个国家的银行登录系统 BankID 坚持使用 Java applet、投入巨资开发，处理整个国家人口与税务数据的 Altinn 系统闹了大笑话 等等。 北欧的医疗保障体系广受赞誉，但身在挪威的人反映这个体制的主要问题是医疗处理的缓慢，造成许多人不夸张病情就无法就医，情况要比在中国糟糕得多。同时也有人利用体系的漏洞，比如威胁转到私立医院来加快就医的速度，或者不得不支付高昂的私人保险来减少排队时间。从某种程度上说，这个体制对于大病是很好的防护网，但对于小病和急诊的待遇其实不如中国的情况。 以上看起来写的都是负面的情况，但都是我自己亲身了解到的，中国国内的报导甚少触及，可以给对北欧有兴趣的人作为参考。]]></description>
				<content:encoded><![CDATA[<p>相比熟知的中西欧国家，北欧对于国内的朋友较为陌生，比如我有的朋友从来记不住我去的是挪威，分不清瑞典与瑞士的也大有人在。不独国人，据一位美国同事说，他的同乡一直以为他去的是南卡罗来纳周的 Norway。近期见诸媒体的有一些关于北欧的报道，比如南方周末的这篇《<a href="http://www.infzm.com/content/79787">高物价高税负，丹麦为何走得比美国好</a>》和纽约时报的《<a href="http://www.nytimes.com/2012/08/07/business/investors-face-tough-search-for-financial-safe-havens.html?pagewanted=all">Investors Seek Out Safer Shores</a>》也算是管中窥豹。来挪威已经两年，别的北欧国家不敢说，至少对于挪威可以略谈谈我自己了解到，而国内甚少报导的部分，权作参考。</p>

<ul>
<li>常说挪威是个“社会主义国家”，从我们中学学到的定义“国家控制经济命脉”来说，确实如此，挪威的核心产业基本上都是国家控制或者大力扶持，个人独资的企业极少，比如石油是国家石油公司 (<a href="http://www.statoil.com/en/Pages/default.aspx">Statoil</a>) 占了绝大多数的份额、铁路是 <a href="http://www.nsb.no/?lang=en_US">NSB</a>、航空业老牌的北欧航空 (<a href="http://www.sas.no">SAS</a>) 虽然受到很多挑战，但仍占最大份额。</li>
<li>相比其他北欧国家，挪威对于农产品有非常大的贸易保护，传统的渔业不说，乳业是由国内的巨头 <a href="http://www.tine.no">Tine</a> 控制的，去年因为 Tine 对雨季后产奶量的错误判断造成了整个国家的“黄油危机”，整个圣诞季全国的商店都没有足够的黄油，只能用人造黄油替代，而进口黄油很难进入挪威市场，Tine 不仅是最大的乳业销售商，同时它还占有行业规范制定者的地位，类似“裁判下场打球”，所以国内对此有<a href="http://www.newsinenglish.no/2012/08/31/consumers-punish-dairy-regulator/">很多批评</a>。禽业则来自 <a href="http://www.prior.no">Prior</a> 占据了超市绝大部分的鸡蛋货架。</li>
<li>与工农业的贸易保护同时的，是零售业的封闭，整个挪威的贫富差距虽然较小，但是最富有的人往往是国内的零售业巨头，如 <a href="http://rimi.no">Rimi</a> 等。<a href="http://paulamdeangelis.blogspot.no/2012/08/buying-it-on-amazon.html">有观点认为</a>，高物价其实很大部分来自零售业的贪婪，同样的产品，如果在中东超市销售，价格就比常见的联锁超市链的售价要低很多。</li>
<li>从中国到挪威，最不习惯的也许是巨大的人力成本差异，从网上购物的邮费或者快递费动辄数百不说，技术工人的收费更是令人咂舌，电工和水管工一小时的收费可以轻易上千，房屋、汽车的维修费用也极高，例如安装汽车尾部的拖车装置就要花费上万。在国内这是很难想象的。</li>
<li>虽然整个挪威地广人稀，但首都奥斯陆的人口密度却比北京更高，高人口密度很大程度上来自移民滥用了福利制度。如<a href="http://www.newsinenglish.no/2012/08/28/guest-workers-pay-off-in-norway/">最近的报导</a>认为短期来挪威工作的人对社会的贡献要比长期的移民多得多，因为短期的工程师等往往有较高工资，纳税但基本上享受不到福利就回去了，而长期移民却有许多长期享受失业和生育福利但从来不工作的。</li>
<li>同时这也带来了很多不稳定的因素，来挪威两年，遇到过三次在公交车上偷窃的行为，据办公室的同事说，这在十来年前的挪威是很难想象的，当时的城市用“路不拾遗”形容也毫不夸张。再比如奥斯陆警察以巡逻不必佩枪自豪，但最近大部分的警察也开始佩枪了，当然治安的不稳定因素也不只是移民造成的。</li>
<li>挪威的 IT 产业相比美国和许多其他欧洲国家都更陈旧和封闭，相比邻国瑞典对创业的扶持都远远不及，整个产业最多的是 Java、.NET 的企业咨询，应用新技术的创业公司极少，招聘国外的员工也很少。最近见到的负面新闻有整个国家的银行登录系统 BankID <a href="http://translate.google.com/translate?sl=auto&amp;tl=en&amp;js=n&amp;prev=_t&amp;hl=en&amp;ie=UTF-8&amp;layout=2&amp;eotf=1&amp;u=http%3A%2F%2Fwww.digi.no%2F901593%2Fbankid-vil-beholde-java">坚持使用 Java applet</a>、投入巨资开发，处理整个国家人口与税务数据的 Altinn 系统<a href="http://www.reuters.com/article/2012/03/22/us-norway-tax-idUSBRE82L10X20120322">闹了大笑话</a> 等等。</li>
<li>北欧的医疗保障体系广受赞誉，但身在挪威的人反映这个体制的主要问题是医疗处理的缓慢，造成许多人不夸张病情就无法就医，情况要比在中国糟糕得多。同时也有人利用体系的漏洞，比如<a href="http://www.newsinenglish.no/2012/03/05/37858/">威胁转到私立医院</a>来加快就医的速度，或者不得不支付高昂的私人保险来减少排队时间。从某种程度上说，这个体制对于大病是很好的防护网，但对于小病和急诊的待遇其实不如中国的情况。</li>
</ul>

<p>以上看起来写的都是负面的情况，但都是我自己亲身了解到的，中国国内的报导甚少触及，可以给对北欧有兴趣的人作为参考。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.jjgod.org/2012/09/04/norway-in-my-eyes/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<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>14</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>
	</channel>
</rss>
