<?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"
	>

<channel>
	<title>知易行难</title>
	<atom:link href="http://blog.ashchan.com/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.ashchan.com</link>
	<description>freelance ruby/rails developer from Hangzhou China</description>
	<pubDate>Sun, 23 Nov 2008 05:24:31 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6.3</generator>
	<language>en</language>
			<item>
		<title>LG 电视画中画的缺点</title>
		<link>http://blog.ashchan.com/archive/2008/11/23/lg-pip/</link>
		<comments>http://blog.ashchan.com/archive/2008/11/23/lg-pip/#comments</comments>
		<pubDate>Sun, 23 Nov 2008 05:24:06 +0000</pubDate>
		<dc:creator>ashchan</dc:creator>
		
		<category><![CDATA[talk]]></category>

		<category><![CDATA[htpc]]></category>

		<guid isPermaLink="false">http://blog.ashchan.com/archive/2008/11/23/lg-pip/</guid>
		<description><![CDATA[家里用的 42 吋 LG 液晶电视的画中画功能比较弱，主要问题有两个:

1.小画面的位置不能设置，只能固定在右下角。看 NBA 的时候问题就出来了，比分和时间被挡住了，有图为证：



2.如果主画面和小画面的输入都是电视信号，则两个画面只能播放同一个频道！这真是太 BT 了，画中画使用最频繁的场景是看一个电视台频道的时候浏览其他频道的节目。这对于讨厌广告（有谁不讨厌呢）的人说很实用的功能，却完全被 LG 忽视了。Life is good, but not good enough.

不过除了 NBA，看电视也不多。现在的电视实在是被广告垃圾得一蹋糊涂。
]]></description>
			<content:encoded><![CDATA[<p>家里用的 42 吋 LG 液晶电视的画中画功能比较弱，主要问题有两个:</p>

<p>1.小画面的位置不能设置，只能固定在右下角。看 NBA 的时候问题就出来了，比分和时间被挡住了，有图为证：</p>

<p><img src="http://assets.ashchan.com/blog/2008/11/lg-pip.jpg" alt="LG HTPC Picture in Picture" /></p>

<p>2.如果主画面和小画面的输入都是电视信号，则两个画面只能播放同一个频道！这真是太 BT 了，画中画使用最频繁的场景是看一个电视台频道的时候浏览其他频道的节目。这对于讨厌广告（有谁不讨厌呢）的人说很实用的功能，却完全被 LG 忽视了。Life is good, but not good enough.</p>

<p>不过除了 NBA，看电视也不多。现在的电视实在是被广告垃圾得一蹋糊涂。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ashchan.com/archive/2008/11/23/lg-pip/feed/</wfw:commentRss>
		</item>
		<item>
		<title>服务器时间不准确引起backup_fu备份失败</title>
		<link>http://blog.ashchan.com/archive/2008/11/22/backup_fu-failed/</link>
		<comments>http://blog.ashchan.com/archive/2008/11/22/backup_fu-failed/#comments</comments>
		<pubDate>Sat, 22 Nov 2008 07:35:00 +0000</pubDate>
		<dc:creator>ashchan</dc:creator>
		
		<category><![CDATA[Ruby &amp; Rails]]></category>

		<category><![CDATA[backup_fu]]></category>

		<category><![CDATA[rails]]></category>

		<category><![CDATA[s3]]></category>

		<guid isPermaLink="false">http://blog.ashchan.com/archive/2008/11/22/backup_fu-failed/</guid>
		<description><![CDATA[升级一个站点为 Rails 2.2.2 后，使用 backup&#95;fu 往 s3 备份数据，出现以下错误:

The difference between the request time and the current time is too large.


服务器的时钟一向走得有些慢，看了一下，比实际时间晚了近 20 分钟！估计是这个原因引起的。改准时间试一下:

sudo date -s "22 Nov 2008 15:29:00"


再次备份，OK了。
]]></description>
			<content:encoded><![CDATA[<p>升级一个站点为 <a href="http://weblog.rubyonrails.org/2008/11/21/rails-2-2-i18n-http-validators-thread-safety-jruby-1-9-compatibility-docs">Rails 2.2.2</a> 后，使用 <a href="http://github.com/gravelpup/backup_fu/tree/master">backup&#95;fu</a> 往 s3 备份数据，出现以下错误:</p>

<pre><code>The difference between the request time and the current time is too large.
</code></pre>

<p>服务器的时钟一向走得有些慢，看了一下，比实际时间晚了近 20 分钟！估计是这个原因引起的。改准时间试一下:</p>

<pre><code>sudo date -s "22 Nov 2008 15:29:00"
</code></pre>

<p>再次备份，OK了。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ashchan.com/archive/2008/11/22/backup_fu-failed/feed/</wfw:commentRss>
		</item>
		<item>
		<title>人靠衣装，Gmail有靓装</title>
		<link>http://blog.ashchan.com/archive/2008/11/21/gmail-now-supports-themes/</link>
		<comments>http://blog.ashchan.com/archive/2008/11/21/gmail-now-supports-themes/#comments</comments>
		<pubDate>Thu, 20 Nov 2008 23:22:48 +0000</pubDate>
		<dc:creator>ashchan</dc:creator>
		
		<category><![CDATA[talk]]></category>

		<category><![CDATA[gmail]]></category>

		<category><![CDATA[google]]></category>

		<guid isPermaLink="false">http://blog.ashchan.com/archive/2008/11/21/gmail-now-supports-themes/</guid>
		<description><![CDATA[Gmail 支持 Themes 了。瞧我选的这个，还挺漂亮吧？



默认的是一款蓝色 Theme，要选择其他的，直接进入 Settings - Themes 设置即可。
]]></description>
			<content:encoded><![CDATA[<p>Gmail 支持 Themes 了。瞧我选的这个，还挺漂亮吧？</p>

<p><img src="http://assets.ashchan.com/blog/2008/11/gmail-themes.jpg" alt="gmail themes" /></p>

<p>默认的是一款蓝色 Theme，要选择其他的，直接进入 Settings - Themes 设置即可。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ashchan.com/archive/2008/11/21/gmail-now-supports-themes/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Rails 难以部署?</title>
		<link>http://blog.ashchan.com/archive/2008/11/15/rails-hard-to-deploy/</link>
		<comments>http://blog.ashchan.com/archive/2008/11/15/rails-hard-to-deploy/#comments</comments>
		<pubDate>Sat, 15 Nov 2008 03:38:04 +0000</pubDate>
		<dc:creator>ashchan</dc:creator>
		
		<category><![CDATA[Ruby &amp; Rails]]></category>

		<category><![CDATA[apache]]></category>

		<category><![CDATA[Capistrano]]></category>

		<category><![CDATA[mongrel]]></category>

		<category><![CDATA[passenger]]></category>

		<category><![CDATA[rails]]></category>

		<guid isPermaLink="false">http://blog.ashchan.com/archive/2008/11/15/rails-hard-to-deploy/</guid>
		<description><![CDATA[David Heinemeier Hansson 最近开始写系列文章The Rails Myths，主要是对一些关于 Rails 的不实传言进行批驳。第一篇 Myth #1: Rails is hard to deploy，讲的是所有 Rails 开发者都非常关心的部署问题。

Rails 应用很难部署吗？我个人两年多的经验得出的结论是，可能会有些麻烦，但一点都不难。当然，我参与的一些项目都不大，日 PV 也没有几十万那种规模（不过那好象应该是扩展和伸缩的话题），但两年多的部署变化历程，现在看来其实非常简单：

起初，使用 Nginx + Mongrel Cluster，算是很经典的组合。这种方式结合 Capistrano 还是挺方便的。唯一稍嫌麻烦的是，如果服务器意外重启了，mongrel 实例遗留的 pid 文件会造成新实例无法启动。很糟糕，但可以忍受。

今年 Passenger (mod&#95;rails) 横空出世。Passenger 吸引我的有三个地方:


DHH 说:This could become very popular, very fast!
作者 Hongli Lai 的华人面孔和姓名
发布 Rails 应用可以用简单的 FTP 上传 + tmp/restart.txt 文件来实现


可惜的是，Passenger 必须跟 Apache 一起用（Hongli Lai 他们自己用 [...]]]></description>
			<content:encoded><![CDATA[<p>David Heinemeier Hansson 最近开始写系列文章<a href="http://www.loudthinking.com/posts/29-the-rails-myths">The Rails Myths</a>，主要是对一些关于 Rails 的不实传言进行批驳。第一篇 <a href="http://www.loudthinking.com/posts/30-myth-1-rails-is-hard-to-deploy">Myth #1: Rails is hard to deploy</a>，讲的是所有 Rails 开发者都非常关心的部署问题。</p>

<p>Rails 应用很难部署吗？我个人两年多的经验得出的结论是，可能会有些麻烦，但一点都不难。当然，我参与的一些项目都不大，日 PV 也没有几十万那种规模（不过那好象应该是扩展和伸缩的话题），但两年多的部署变化历程，现在看来其实非常简单：</p>

<p>起初，使用 Nginx + Mongrel Cluster，算是很经典的组合。这种方式结合 Capistrano 还是挺方便的。唯一稍嫌麻烦的是，如果服务器意外重启了，mongrel 实例遗留的 pid 文件会造成新实例无法启动。很糟糕，但可以忍受。</p>

<p>今年 <a href="http://www.modrails.com/">Passenger</a> (mod&#95;rails) 横空出世。Passenger 吸引我的有三个地方:</p>

<ol>
<li><p>DHH 说:This could become very popular, very fast!</p></li>
<li><p>作者 Hongli Lai 的华人面孔和姓名</p></li>
<li><p>发布 Rails 应用可以用简单的 FTP 上传 + tmp/restart.txt 文件来实现</p></li>
</ol>

<p>可惜的是，Passenger 必须跟 Apache 一起用（Hongli Lai 他们自己用 Nginx 作前端来均衡到不同的 Apache，不过那是另外一回事）。考虑到它的方便性，用 Apache 就用吧。</p>

<p>目前，手上的服务器和项目，都已经迁移到 Apache + Passenger 方案。效果相当不错，Capistrano 部署脚本也简单了不少。</p>

<p>我依然记得在<a href="http://www.wl.cn">蔚蓝</a>时我们部署 asp.net 2 应用的方式：我们用自己编写的 MSBuild 脚本自动编译要发布的新版，然后上传生成的新版本至服务器 (Win2K3)，手工覆盖原来的版本。如果应用 Capistrano 的一些办法进去，这个过程可以更自动化更方便一些，但整个蔚蓝网站编译就需要好几分钟（其实这速度已经不赖了）这个事实就让整个发布显得很慢。</p>

<p>部署 Rails 一点都不难，当然前提是你掌握了基本的知识和技能。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ashchan.com/archive/2008/11/15/rails-hard-to-deploy/feed/</wfw:commentRss>
		</item>
		<item>
		<title>HTPC Reloaded with Ubuntu 8.10</title>
		<link>http://blog.ashchan.com/archive/2008/11/02/htpc-reloaded-with-ubuntu-810/</link>
		<comments>http://blog.ashchan.com/archive/2008/11/02/htpc-reloaded-with-ubuntu-810/#comments</comments>
		<pubDate>Sun, 02 Nov 2008 03:06:31 +0000</pubDate>
		<dc:creator>ashchan</dc:creator>
		
		<category><![CDATA[talk]]></category>

		<category><![CDATA[hdmi]]></category>

		<category><![CDATA[htpc]]></category>

		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://blog.ashchan.com/archive/2008/11/02/htpc-reloaded-with-ubuntu-810/</guid>
		<description><![CDATA[We have four computers in use at home currently:


My Macbook Pro, on Leopard 10.5.5;
My wife&#8217;s Thinkpad X40 laptop, on Windows XP sp2;
My father&#8217;s PC, on Windows XP sp2, rarely used;
Our HTPC in the living room, on Windows XP sp2;


The Thinkpad X40 was almost 4 years old. I used install Ubuntu 5.04 on it together with [...]]]></description>
			<content:encoded><![CDATA[<p>We have four computers in use at home currently:</p>

<ul>
<li>My Macbook Pro, on Leopard 10.5.5;</li>
<li>My wife&#8217;s Thinkpad X40 laptop, on Windows XP sp2;</li>
<li>My father&#8217;s PC, on Windows XP sp2, rarely used;</li>
<li>Our <a href="http://blog.ashchan.com/archive/2008/07/31/rapoo-wireless-keyboard-and-mouse/">HTPC</a> in the living room, on Windows XP sp2;</li>
</ul>

<p>The Thinkpad X40 was almost 4 years old. I used install Ubuntu 5.04 on it together with XP three years ago, when Ubuntu wasn&#8217;t so easy to use as today. My wife is not a big fan of Linux, so she still uses XP.</p>

<p>I&#8217;ve been planning to setup the HTPC with Ubuntu for a while, but I&#8217;ve heard Ubuntu&#8217;s not very happy with the HDMI audio output (I have a Gigabyte GA-MA78GPM-DS2H MB). Finally I decided to give it a try when 8.10 came.</p>

<p>Installing Ubuntu Desktop has never be easier. I had to plug another keyboard as the wireless one couldn&#8217;t be used BEFORE the installation. Yes, by before I mean as soon as the installing process began I was able to select language and input username with the wireless mouse &amp; keyboard.</p>

<p>I had a fresh new Ubuntu system less than 20 minutes later. The first thing I did was to change the DPI from 96 to 192 so I could read 3m away from the TV. The cool thing is the external wireless adapter was recognized right after the first login! Under XP I had to install some crazy drivers manually.</p>

<p>All things seemed right. The LG 42&#8243; TV displayed 1920*1080. Now the most important part: audio over HDMI.</p>

<p>No sound! That&#8217;s expected as so many people had this issue.</p>

<p>aplay -l said the ATI HDMI card was there. So the system recognized it, this was also confirmed by the Volume Control, where I could select HDA ATI HDMI in the Device list. I&#8217;ve also turned on the IEC958 (I don&#8217;t know what that means), but first I needed to make it show by going to the Preferences below the Device list.</p>

<p>Then I went to System > Preferences > Sound, chose HDA ATI HDMI ATI HDMI (ALSA) in the Sound playback list for Sound Events, hit Test. Still silence only.</p>

<p>Googled, read a lot of forum &amp; blog posts, which I&#8217;ve read already before.</p>

<p>Two hours passed, I was tired but not willing to give up. I had the same amount of difficulty to make the HDMI audio work under XP several months ago. This was not rocket science, and I had another half of the weekend to spare.</p>

<p>Then I noticed one thing. I had chosen to activate the ATI/AMD proprietary FGLRX graphics driver, but the progress bar stopped at 0% for a long time and then the window disappeared. I guessed Ubuntu was installing it in the background. Another thing I noticed was there&#8217;s a new item called ATI Catalyst Control Center under Applications > Accessories, which I believed was installed by the graphics driver. But when I clicked that, it told me there&#8217;s some error in the config.</p>

<p>Rebooted. Logged in. (Wow, the windows effect looked a little different. Thanks to the proprietary driver!) I Opened the Volume Controller, the IEC958 was turned off. I turned it on. Some guy suggested in his blog running the following command to make this change permanent (I don&#8217;t remember the post url though, because I couldn&#8217;t open it directly and at last I viewed the content via an online proxy):</p>

<pre><code>sudo alsactl store 1
</code></pre>

<p>My HDMI sound card was listed as card 1 by aplay -l. I guessed the last &#8220;1&#8243; in the command was related to this.</p>

<p>Went to System > Preferences > Sound and test the sound again. It&#8217;s working!</p>

<p>Putting in a CD, I played several songs for my coming baby. It had been very patient in its mother while I put hard disks, keyboards and other DIY stuffs all around on the floor and made noise and sigh from time to time.</p>

<p>Installed ssh, enabled Remote Desktop. Installed Apache2 &amp; Passenger, MySQL &#8230;</p>

<p>Now the HTPC is not only an HTPC, but a media server, local git server, rails test server, download machine. Very cool!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ashchan.com/archive/2008/11/02/htpc-reloaded-with-ubuntu-810/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Gmail Notifr Changelog</title>
		<link>http://blog.ashchan.com/archive/2008/10/29/gmail-notifr-changelog/</link>
		<comments>http://blog.ashchan.com/archive/2008/10/29/gmail-notifr-changelog/#comments</comments>
		<pubDate>Wed, 29 Oct 2008 06:32:07 +0000</pubDate>
		<dc:creator>ashchan</dc:creator>
		
		<category><![CDATA[Mac &amp; Apple]]></category>

		<category><![CDATA[Ruby &amp; Rails]]></category>

		<category><![CDATA[cocoa]]></category>

		<category><![CDATA[GmailNotifr]]></category>

		<category><![CDATA[ruby]]></category>

		<category><![CDATA[rubycocoa]]></category>

		<guid isPermaLink="false">http://blog.ashchan.com/archive/2008/10/29/gmail-notifr-changelog/</guid>
		<description><![CDATA[Gmail Notifr is an Open Source RubyCocoa Gmail Notifier for Mac OS X.

View project detail here.

You can fetch the source from:


github: http://github.com/ashchan/gmail-notifr/tree/master


Feedbacks are welcome! Leave a message in the comments area below.

CHANGELOG

0.2.7 (Nov 20, 2008)


Bugfix: Exit sometimes due to onClick error of the grwol notification
Handle Gmail feed connect timeout error


0.2.6 (Nov 14, 2008)


Bugfix: Crash when [...]]]></description>
			<content:encoded><![CDATA[<p>Gmail Notifr is an Open Source RubyCocoa Gmail Notifier for Mac OS X.</p>

<p>View project detail <a href="http://ashchan.com/projects/gmail-notifr">here</a>.</p>

<p>You can fetch the source from:</p>

<ul>
<li>github: <a href="http://github.com/ashchan/gmail-notifr/tree/master">http://github.com/ashchan/gmail-notifr/tree/master</a></li>
</ul>

<p>Feedbacks are welcome! <a href="http://blog.ashchan.com/archive/2008/10/29/gmail-notifr-changelog/#respond">Leave a message</a> in the comments area below.</p>

<h2>CHANGELOG</h2>

<h3>0.2.7 (Nov 20, 2008)</h3>

<ul>
<li>Bugfix: Exit sometimes due to onClick error of the grwol notification</li>
<li>Handle Gmail feed connect timeout error</li>
</ul>

<h3>0.2.6 (Nov 14, 2008)</h3>

<ul>
<li>Bugfix: Crash when set launch at login</li>
<li>Bugfix: Crash on launch</li>
<li>Do not show count number if there is no new message</li>
</ul>

<h3>0.2.5 (Nov 12, 2008)</h3>

<ul>
<li>Play the sound when selected in Preferences window</li>
</ul>

<h3>0.2.4 (Nov 7, 2008)</h3>

<ul>
<li>Added growl and sound notification settings to Preferences</li>
<li>Got rid of the ssl warning in system log:  &#8220;peer certificate won&#8217;t be verified in this SSL session&#8221;</li>
</ul>

<h3>0.2.2 (Nov 3, 2008)</h3>

<ul>
<li>Goto inbox when click on the growl notification</li>
<li>Show sender names and subjects of the first three messages</li>
</ul>

<h3>0.2.1 (Oct 31, 2008)</h3>

<ul>
<li>Bugfix: Crash when registering defaults.</li>
</ul>

<h3>0.2.0 (Oct 30, 2008)</h3>

<ul>
<li>Added Growl support.</li>
<li>Play the &#8220;Blow&#8221; sound when there&#8217;re new messages.</li>
</ul>

<h3>0.1.3 (Oct 29, 2008)</h3>

<ul>
<li>&#8220;Open Inbox&#8221; goes to the proper url instead of the normal gmail url if hosted domains account is used.</li>
</ul>

<h3>0.1.2 (Oct 4, 2008)</h3>

<ul>
<li>initial release.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.ashchan.com/archive/2008/10/29/gmail-notifr-changelog/feed/</wfw:commentRss>
		</item>
		<item>
		<title>创建特定版本的Rails应用</title>
		<link>http://blog.ashchan.com/archive/2008/10/27/create-a-rails-app-with-version/</link>
		<comments>http://blog.ashchan.com/archive/2008/10/27/create-a-rails-app-with-version/#comments</comments>
		<pubDate>Mon, 27 Oct 2008 00:03:58 +0000</pubDate>
		<dc:creator>ashchan</dc:creator>
		
		<category><![CDATA[Ruby &amp; Rails]]></category>

		<category><![CDATA[rails]]></category>

		<guid isPermaLink="false">http://blog.ashchan.com/archive/2008/10/27/create-a-rails-app-with-version/</guid>
		<description><![CDATA[Rails 2.2 马上就要登场。这部高速列车真是飞速驰进。先看看我都装了哪些版本的 Rails 了:

phantom:~  james$ gem list rails

*** LOCAL GEMS ***

rails (2.2.0, 2.1.2, 2.1.1, 2.1.0, 2.0.2, 1.2.6)


不多不少呀。用 rails 命令创建一个新应用的时候，默认使用最新的版本。很多情况下要创建特定版本的应用，这时可以使用一个额外的参数来达到这个目的:

rails _[version number]_ appname


如以下命令将创建一个 2.0.2 版本的应用:

rails _2.0.2_ test_app

]]></description>
			<content:encoded><![CDATA[<p>Rails 2.2 马上就要登场。这部高速列车真是飞速驰进。先看看我都装了哪些版本的 Rails 了:</p>

<pre><code>phantom:~  james$ gem list rails

*** LOCAL GEMS ***

rails (2.2.0, 2.1.2, 2.1.1, 2.1.0, 2.0.2, 1.2.6)
</code></pre>

<p>不多不少呀。用 rails 命令创建一个新应用的时候，默认使用最新的版本。很多情况下要创建特定版本的应用，这时可以使用一个额外的参数来达到这个目的:</p>

<pre><code>rails _[version number]_ appname
</code></pre>

<p>如以下命令将创建一个 2.0.2 版本的应用:</p>

<pre><code>rails _2.0.2_ test_app
</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.ashchan.com/archive/2008/10/27/create-a-rails-app-with-version/feed/</wfw:commentRss>
		</item>
		<item>
		<title>袖珍蛋</title>
		<link>http://blog.ashchan.com/archive/2008/10/26/%e8%a2%96%e7%8f%8d%e8%9b%8b/</link>
		<comments>http://blog.ashchan.com/archive/2008/10/26/%e8%a2%96%e7%8f%8d%e8%9b%8b/#comments</comments>
		<pubDate>Sat, 25 Oct 2008 20:01:40 +0000</pubDate>
		<dc:creator>ashchan</dc:creator>
		
		<guid isPermaLink="false">http://blog.ashchan.com/archive/2008/10/26/%e8%a2%96%e7%8f%8d%e8%9b%8b/</guid>
		<description><![CDATA[姑妈家的母鸡开始下蛋了。  &#8212; Post From My iPhone
]]></description>
			<content:encoded><![CDATA[<p>姑妈家的母鸡开始下蛋了。<br /><br /><center><a href='http://blogpress.w18.net/photos/08/10/26/52.jpg'><img src='http://blogpress.w18.net/photos/08/10/26/s_52.jpg' border='0'></a></center><br />  &#8212; Post From My iPhone<br /></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ashchan.com/archive/2008/10/26/%e8%a2%96%e7%8f%8d%e8%9b%8b/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Write RubyCocoa Application that Launches at User Login</title>
		<link>http://blog.ashchan.com/archive/2008/10/23/make-rubycocoa-application-launch-at-user-login/</link>
		<comments>http://blog.ashchan.com/archive/2008/10/23/make-rubycocoa-application-launch-at-user-login/#comments</comments>
		<pubDate>Thu, 23 Oct 2008 12:34:41 +0000</pubDate>
		<dc:creator>ashchan</dc:creator>
		
		<category><![CDATA[Mac &amp; Apple]]></category>

		<category><![CDATA[Ruby &amp; Rails]]></category>

		<category><![CDATA[cocoa]]></category>

		<category><![CDATA[GmailNotifr]]></category>

		<category><![CDATA[ruby]]></category>

		<category><![CDATA[rubycocoa]]></category>

		<guid isPermaLink="false">http://blog.ashchan.com/archive/2008/10/23/make-rubycocoa-application-launch-at-user-login/</guid>
		<description><![CDATA[I wanted Gmail Notifr to run automatically when I log in, so I added a preference item called &#8220;Launch at login&#8221;. In this article I&#8217;ll show how to implement this feature in RubyCocoa.



Let&#8217;s assume the Gmail Notifr&#8217;s path is &#8220;/Applications/Gmail Notifr.app&#8221; for now, this will be used to identify our application in login items:

notifr_app = [...]]]></description>
			<content:encoded><![CDATA[<p>I wanted <a href="http://ashchan.com/projects/gmail-notifr">Gmail Notifr</a> to run automatically when I log in, so I added a preference item called &#8220;Launch at login&#8221;. In this article I&#8217;ll show how to implement this feature in RubyCocoa.</p>

<p><img src="http://assets.ashchan.com/blog/2008/10/gmail-notifr-preferences.png" alt="Gmail Notifr Preferences" /></p>

<p>Let&#8217;s assume the Gmail Notifr&#8217;s path is &#8220;/Applications/Gmail Notifr.app&#8221; for now, this will be used to identify our application in login items:</p>

<pre><code>notifr_app = "/Applications/Gmail Notifr.app"
</code></pre>

<p>Use CFPreferencesCopyValue to fetch preference value for login items:</p>

<pre><code>cf = OSX::CFPreferencesCopyValue(
  "AutoLaunchedApplicationDictionary",
  "loginwindow",
  OSX::KCFPreferencesCurrentUser, 
  OSX::KCFPreferencesAnyHost
)
</code></pre>

<p>The first two parameters specify that we need to fetch value for auto launched applications (login items), and the third parameter specifies that we want the value for the current user.</p>

<p>Now cf holds information about all login items, it&#8217;s easy to check if our application has already been sitting there:</p>

<pre><code>auto_launch_enabled = cf.any? { |app| app.valueForKey("Path") == notifr_app }
</code></pre>

<p>Note: each item has a key named &#8220;Path&#8221; storing the application path.</p>

<p>To change the preference (set our application as login item or remove it from login items), we need a mutable copy of cf:</p>

<pre><code>mcf = cf.mutableCopy
</code></pre>

<p>Then, to remove the application if it&#8217;s already there:</p>

<pre><code>mcf.each do |app|
    mcf.removeObject(app) and break if app.valueForKey("Path") == notifr_app
end
</code></pre>

<p>Or to add it as a new login item:</p>

<pre><code>item = OSX::NSDictionary.dictionaryWithObject_forKey(notifr_app, "Path")
mcf.addObject(item)
</code></pre>

<p>At last, we have to write the new value back:</p>

<pre><code>OSX::CFPreferencesSetValue(
  "AutoLaunchedApplicationDictionary",
  mcf,
  "loginwindow",
  OSX::KCFPreferencesCurrentUser,
  OSX::KCFPreferencesAnyHost
)
OSX::CFPreferencesSynchronize(
  "loginwindow",
  OSX::KCFPreferencesCurrentUser,
  OSX::KCFPreferencesAnyHost
)
</code></pre>

<p>In the world of reality, user of Gmail Notifr would install it anywhere he/she likes, so it&#8217;s better we get the application path in a more flexible way:</p>

<pre><code>notifr_app = NSBundle.mainBundle.bundlePath
</code></pre>

<p>Pretty easy right? Now see what we&#8217;ve done:</p>

<p><img src="http://assets.ashchan.com/blog/2008/10/login-items.png" alt="Login Items" /></p>

<p>Note: in RubyCocoa it&#8217;s unnecessary to call methods exactly as in Objective-C, for example, instead of writing</p>

<pre><code>app.valueForKey("Path")
</code></pre>

<p>we can get the value for key &#8220;Path&#8221; in ruby&#8217;s usual way</p>

<pre><code>app["Path"]
</code></pre>

<p>I keep the code more like Objective-C so it&#8217;s easier to reference Objective-C Cocoa APIs.</p>

<p>PS: example code here were extracted from the <a href="http://github.com/ashchan/gmail-notifr/tree">source code</a> of Gmail Notifr hosted on <a href="http://github.com">GitHub</a>.</p>

<p>Want to learn RubyCocoa?  Read this book:</p>

<iframe src="http://rcm.amazon.com/e/cm?t=2dushu-20&#038;o=1&#038;p=8&#038;l=as1&#038;asins=1934356190&#038;fc1=000000&#038;IS2=1&#038;lt1=_blank&#038;m=amazon&#038;lc1=0000FF&#038;bc1=FFFFFF&#038;bg1=FFFFFF&#038;f=ifr&#038;npa=1" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
]]></content:encoded>
			<wfw:commentRss>http://blog.ashchan.com/archive/2008/10/23/make-rubycocoa-application-launch-at-user-login/feed/</wfw:commentRss>
		</item>
		<item>
		<title>晒历史</title>
		<link>http://blog.ashchan.com/archive/2008/10/20/shell-history/</link>
		<comments>http://blog.ashchan.com/archive/2008/10/20/shell-history/#comments</comments>
		<pubDate>Mon, 20 Oct 2008 10:35:11 +0000</pubDate>
		<dc:creator>ashchan</dc:creator>
		
		<category><![CDATA[talk]]></category>

		<guid isPermaLink="false">http://blog.ashchan.com/archive/2008/10/20/%e6%99%92%e5%8e%86%e5%8f%b2/</guid>
		<description><![CDATA[大家都在晒，俺也来：

phantom:~  james$ history &#124; awk {'print $2'} &#124; sort &#124; uniq -c &#124; sort -k1 -rn &#124; head
 173 git
  58 rake
  51 cd
  26 exit
  17 ssh
  16 cap
  14 script/console
  14 irb
  12 touch
  11 ls


最近一次更新系统而重启的时间：

phantom:~  james$ uptime
 8:58  up 12 [...]]]></description>
			<content:encoded><![CDATA[<p>大家都在晒，俺也来：</p>

<pre><code>phantom:~  james$ history | awk {'print $2'} | sort | uniq -c | sort -k1 -rn | head
 173 git
  58 rake
  51 cd
  26 exit
  17 ssh
  16 cap
  14 script/console
  14 irb
  12 touch
  11 ls
</code></pre>

<p>最近一次更新系统而重启的时间：</p>

<pre><code>phantom:~  james$ uptime
 8:58  up 12 days, 18:39, 2 users, load averages: 0.56 0.36 0.25
</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.ashchan.com/archive/2008/10/20/shell-history/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Subscribe Railscasts screencasts, from China</title>
		<link>http://blog.ashchan.com/archive/2008/10/19/subscribe-railscasts-screencasts-from-china/</link>
		<comments>http://blog.ashchan.com/archive/2008/10/19/subscribe-railscasts-screencasts-from-china/#comments</comments>
		<pubDate>Sun, 19 Oct 2008 00:28:06 +0000</pubDate>
		<dc:creator>ashchan</dc:creator>
		
		<category><![CDATA[Mac &amp; Apple]]></category>

		<category><![CDATA[Ruby &amp; Rails]]></category>

		<category><![CDATA[itunes]]></category>

		<category><![CDATA[pipes]]></category>

		<category><![CDATA[rails]]></category>

		<guid isPermaLink="false">http://blog.ashchan.com/archive/2008/10/19/subscribe-railscasts-screencasts-from-china/</guid>
		<description><![CDATA[If you are living in China as I am, and you ever tried to subscribe Railscasts on iTunes, you would never be able to watch the screencasts. That&#8217;s because the Railscasts iTunes feed is provided by feedburner, which is unfortunately blocked by SOMETHING.

As a Rails developer, I really can&#8217;t live without the awesome railscasts, but [...]]]></description>
			<content:encoded><![CDATA[<p>If you are living in China as I am, and you ever tried to subscribe <a href="http://railscasts.com">Railscasts</a> on iTunes, you would never be able to watch the screencasts. That&#8217;s because the Railscasts iTunes feed is provided by feedburner, which is unfortunately blocked by SOMETHING.</p>

<p>As a Rails developer, I really can&#8217;t live without the awesome railscasts, but I don&#8217;t want to download each screencast manually.</p>

<p>Yahoo Pipes come to rescue. Follow these simple steps:</p>

<ul>
<li>Go to Pipes[http://pipes.yahoo.com/pipes] and create a new pipe.</li>
<li>Add a Fetch Feed source, in the URL field of that source, input &#8220;http://feeds.feedburner.com/railscasts&#8221;. </li>
<li>Draw a line between the Fetch Feed source and the Pipe Output. Save the pipe. <img src="http://assets.ashchan.com/blog/2008/10/pipes.png" alt="pipes feed" /></li>
<li>Run the new created pipe, get the RSS feed for it. (you can see the RSS url by clicking the Add to Google Reader button)</li>
<li>Now in iTunes, subscribe to the RSS feed. (Advanced - Subscribe to Podcast)</li>
<li>Learn &amp; Enjoy those wonderful screencasts.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.ashchan.com/archive/2008/10/19/subscribe-railscasts-screencasts-from-china/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Reduce CPU usage of RubyCocoa app</title>
		<link>http://blog.ashchan.com/archive/2008/10/07/reduce-cpu-usage-of-rubycocoa-app/</link>
		<comments>http://blog.ashchan.com/archive/2008/10/07/reduce-cpu-usage-of-rubycocoa-app/#comments</comments>
		<pubDate>Tue, 07 Oct 2008 12:39:56 +0000</pubDate>
		<dc:creator>ashchan</dc:creator>
		
		<category><![CDATA[Mac &amp; Apple]]></category>

		<category><![CDATA[Ruby &amp; Rails]]></category>

		<category><![CDATA[apple]]></category>

		<category><![CDATA[cocoa]]></category>

		<category><![CDATA[GmailNotifr]]></category>

		<category><![CDATA[ruby]]></category>

		<category><![CDATA[rubycocoa]]></category>

		<category><![CDATA[xcode]]></category>

		<guid isPermaLink="false">http://blog.ashchan.com/archive/2008/10/07/reduce-cpu-usage-of-rubycocoa-app/</guid>
		<description><![CDATA[I found Gmail Notifr consumed 2% of CPU usage, even when it&#8217;s idle (Gmail Notifr checks new mails at an interval that could be configured by user). It was really odd as the app doesn&#8217;t do much job other than visiting the gmail feed and fetching the new mails count.

So I ran several Xcode RubyCocoa [...]]]></description>
			<content:encoded><![CDATA[<p>I found <a href="http://ashchan.com/projects/gmail-notifr">Gmail Notifr</a> consumed 2% of CPU usage, even when it&#8217;s idle (Gmail Notifr checks new mails at an interval that could be configured by user). It was really odd as the app doesn&#8217;t do much job other than visiting the gmail feed and fetching the new mails count.</p>

<p>So I ran several Xcode RubyCocoa example apps provided by Apple. They seemed to act like that also.</p>

<p>A quick google search brought me to this discussion: <a href="http://lists.sourceforge.jp/mailman/archives/rubycocoa-devel/2007-March/000820.html">CPU Usage</a>. Not knowing what kind of problem they had, I tried adding the OSX.ruby&#95;thread&#95;switcher_stop to the application controller and test it. Wow, the cpu usage became low as 0%.</p>

<p><img src="http://assets.ashchan.com/blog/2008/10/rubycocoa-cpu-usage1.png" alt="Rubycocoa cpu Usage" /></p>

<p>For now I have no idea if this would cause any problem to the app, I&#8217;ll just keep the code and see if Gmail Notifr runs normally.</p>

<p>Want to learn RubyCocoa?  Read this book:</p>

<iframe src="http://rcm.amazon.com/e/cm?t=2dushu-20&#038;o=1&#038;p=8&#038;l=as1&#038;asins=1934356190&#038;fc1=000000&#038;IS2=1&#038;lt1=_blank&#038;m=amazon&#038;lc1=0000FF&#038;bc1=FFFFFF&#038;bg1=FFFFFF&#038;f=ifr&#038;npa=1" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
]]></content:encoded>
			<wfw:commentRss>http://blog.ashchan.com/archive/2008/10/07/reduce-cpu-usage-of-rubycocoa-app/feed/</wfw:commentRss>
		</item>
		<item>
		<title>RubyCocoa: Store User Password in Keychain</title>
		<link>http://blog.ashchan.com/archive/2008/10/06/rubycocoa-store-user-password-in-keychain/</link>
		<comments>http://blog.ashchan.com/archive/2008/10/06/rubycocoa-store-user-password-in-keychain/#comments</comments>
		<pubDate>Mon, 06 Oct 2008 07:37:23 +0000</pubDate>
		<dc:creator>ashchan</dc:creator>
		
		<category><![CDATA[Mac &amp; Apple]]></category>

		<category><![CDATA[Ruby &amp; Rails]]></category>

		<category><![CDATA[cocoa]]></category>

		<category><![CDATA[GmailNotifr]]></category>

		<category><![CDATA[keychain]]></category>

		<category><![CDATA[mac]]></category>

		<category><![CDATA[ruby]]></category>

		<category><![CDATA[rubycocoa]]></category>

		<category><![CDATA[xcode]]></category>

		<guid isPermaLink="false">http://blog.ashchan.com/archive/2008/10/06/rubycocoa-store-user-password-in-keychain/</guid>
		<description><![CDATA[When writing Cocoa software for Mac, it&#8217;s a better idea to store user password in Keychain because I don&#8217;t believe my own code could do such an important job well. So I did this for Gmail Notifr.

There&#8217;re few documents I can find on RubyCocoa Keychain coding. The best one for me is this post: RubyCocoa [...]]]></description>
			<content:encoded><![CDATA[<p>When writing <a href="http://developer.apple.com/cocoa/">Cocoa</a> software for Mac, it&#8217;s a better idea to store user password in Keychain because I don&#8217;t believe my own code could do such an important job well. So I did this for <a href="http://ashchan.com/projects/gmail-notifr">Gmail Notifr</a>.</p>

<p>There&#8217;re few documents I can find on RubyCocoa Keychain coding. The best one for me is this post: <a href="http://be-genius.net/post/31305332/rubycocoa-and-keychain-access-u">RubyCocoa and Keychain access</a>。</p>

<p>Before start, generate metadata for the Security Framework:</p>

<pre><code>mkdir ~/Library/BridgeSupport
gen_bridge_metadata -f Security -o ~/Library/BridgeSupport/Security.bridgesupport
</code></pre>

<p>The above post suggests that put the bridgesupport file in /Library/BridgeSupport, but ~/Library/BridgeSupport will also work.</p>

<p>So we need the Security.bridgesupport file to write RubyCocoa code with Keychain, how do we deploy the software? I guess we can do one of the following:</p>

<ul>
<li>Ask the users to generate the metadata, which is kinda rude and silly;</li>
<li>Copy the file to the proper location when users install the app;</li>
<li>Embed the file in app bundle.</li>
</ul>

<p>The last one is my favorite option and I&#8217;ve found it not very hard to implement. Here&#8217;s the code to load the Security Framework and the bridge file:</p>

<pre><code>require 'osx/cocoa'
OSX.require_framework 'Security'
OSX.load_bridge_support_file(NSBundle.mainBundle.pathForResource_ofType("Security", "bridgesupport"))
</code></pre>

<p>Don&#8217;t forget to add the Security.bridgesupport file to Xcode project.</p>

<p>Basically, we only need Keychain to store and retrieve password. To do so, we just need to learn three Cocoa methods:</p>

<ul>
<li>SecKeychainAddGenericPassword</li>
<li>SecKeychainFindGenericPassword</li>
<li>SecKeychainItemModifyContent</li>
</ul>

<p>Use the first one to add a password to Keychain:</p>

<pre><code>SERVICE = "MyKeychainApp"
...

error = SecKeychainAddGenericPassword(
    nil,
    SERVICE.length,
    SERVICE,
    username.length,
    username,
    password.length,
    password,
    nil)
</code></pre>

<p>The first nil parameter specifies that we&#8217;re going to use the default Keychain (why not?). SERVICE is a const string I use to represent the application. The last nil parameter tells the method that I don&#8217;t need it to return a SecKeychainItemRef object.</p>

<p>Chances are your users might want to change the password later. Calling the method again with a different password, the password stored in the Keychain will not be updated! (password can be showed in the Keychain Access application)</p>

<p>This is because when a Keychain item already exists for a username (Keychain item is identified by service name and username), the method call will fail. The sweet method returns errSecDuplicateItem in such case, then we can use the second method to update password:</p>

<pre><code>error = SecKeychainAddGenericPassword(
    nil,
    SERVICE.length,
    SERVICE,
    username.length,
    username,
    password.length,
    password,
    nil)

if error == OSX::ErrSecDuplicateItem
    status, *data = SecKeychainFindGenericPassword(
        nil,
        SERVICE.length,
        SERVICE,
        username.length,
        username)
    password_length = data.shift
    password_date = data.shift #password data
    item = data.shift #SecKeychainItemRef
    SecKeychainItemModifyContent(item, nil, password.length, password)
end
</code></pre>

<p>SecKeychainFindGenericPassword returns a status code and an array of data, which contains the password length, password data, and a pointer to the object of the password.</p>

<p>Pass this pointer and the new password to the SecKeychainItemModifyContent  method to update the password. The nil parameter tells the method we don&#8217;t have any attribute to set for the item.</p>

<p>When we use SecKeychainFindGenericPassword to get the password, it returns the password length and the password data (which is an ObjcPtr). Get the string value of the password is easy now:</p>

<pre><code>password = password_data.bytestr(password_length)
</code></pre>

<p>Happy RubyCocoa programming!</p>

<p>Want to learn RubyCocoa?  Read this book:</p>

<iframe src="http://rcm.amazon.com/e/cm?t=2dushu-20&#038;o=1&#038;p=8&#038;l=as1&#038;asins=1934356190&#038;fc1=000000&#038;IS2=1&#038;lt1=_blank&#038;m=amazon&#038;lc1=0000FF&#038;bc1=FFFFFF&#038;bg1=FFFFFF&#038;f=ifr&#038;npa=1" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
]]></content:encoded>
			<wfw:commentRss>http://blog.ashchan.com/archive/2008/10/06/rubycocoa-store-user-password-in-keychain/feed/</wfw:commentRss>
		</item>
		<item>
		<title>在干什么呢</title>
		<link>http://blog.ashchan.com/archive/2008/09/26/%e5%9c%a8%e5%b9%b2%e4%bb%80%e4%b9%88%e5%91%a2/</link>
		<comments>http://blog.ashchan.com/archive/2008/09/26/%e5%9c%a8%e5%b9%b2%e4%bb%80%e4%b9%88%e5%91%a2/#comments</comments>
		<pubDate>Fri, 26 Sep 2008 12:41:15 +0000</pubDate>
		<dc:creator>ashchan</dc:creator>
		
		<category><![CDATA[Mac &amp; Apple]]></category>

		<category><![CDATA[Ruby &amp; Rails]]></category>

		<category><![CDATA[talk]]></category>

		<category><![CDATA[cocoa]]></category>

		<category><![CDATA[mac]]></category>

		<category><![CDATA[macbook]]></category>

		<category><![CDATA[ruby]]></category>

		<category><![CDATA[rubycocoa]]></category>

		<guid isPermaLink="false">http://blog.ashchan.com/archive/2008/09/26/%e5%9c%a8%e5%b9%b2%e4%bb%80%e4%b9%88%e5%91%a2/</guid>
		<description><![CDATA[老少爷们都要放大假了。我天天放假，所以国庆对我来说没什么特殊性。每天还是得干几小时活，攒点进口奶粉钱。

Macbook Pro的保修期马上就过了。嘿嘿，软磨硬磨不怕麻烦，有志者事竞成。你猜怎么着？愣是给我换回来一部新光驱和一块新电池。

话说我原来那部光驱也没用几回，就刻不了盘了。维修中心很干脆，看刻不了就给弄了个新了。

电池就比较麻烦了，我充放220次了，剩余容量出了问题，有时仅有50%的容量。到了他们那边检测说没问题，可用容量在70-80%。我猜维修中心应该是这么测的：开着机，放MP3，过两小时还有电，得出结论：瞧，续航能力有两个小时以上，没问题。

那看我平时是怎么用的：console开几个窗口，TextMate开几个工程，iTunes全天候放歌或podcast，Safari、WebKit和FF各开一个，虚拟机开一个，屏幕打到最亮，无线开着，每天还要给iPhone充充电。要不插插头，这破电池真的撑不了多久。

我说肯定有问题，不可能没有问题，这电池真的不正常。人家说：是的，快到保修期的都这么说。哈。

最终还是给我换了，谢谢啊。

MBP上比较容易升级的配件就是内存了──这个最好拆，三个小箩丝就弄下来了（当然这几个小箩丝够小，一般的起子不管用）──就自己加了点内存。现在一条DDR 2 677 2G内存也就200出头，很值。

Update: 找着了国庆期间工作之余可以干的事：学习 Cocoa 桌面编程。有很长一阵子没摆弄桌面编程了，这回把 OS X下的Cocoa (Objective-C &#38; Ruby)吸收一下。
]]></description>
			<content:encoded><![CDATA[<p>老少爷们都要放大假了。我天天放假，所以国庆对我来说没什么特殊性。每天还是得干几小时活，攒点进口奶粉钱。</p>

<p>Macbook Pro的保修期马上就过了。嘿嘿，软磨硬磨不怕麻烦，有志者事竞成。你猜怎么着？愣是给我换回来一部新光驱和一块新电池。</p>

<p>话说我原来那部光驱也没用几回，就刻不了盘了。维修中心很干脆，看刻不了就给弄了个新了。</p>

<p>电池就比较麻烦了，我充放220次了，剩余容量出了问题，有时仅有50%的容量。到了他们那边检测说没问题，可用容量在70-80%。我猜维修中心应该是这么测的：开着机，放MP3，过两小时还有电，得出结论：瞧，续航能力有两个小时以上，没问题。</p>

<p>那看我平时是怎么用的：console开几个窗口，TextMate开几个工程，iTunes全天候放歌或podcast，Safari、WebKit和FF各开一个，虚拟机开一个，屏幕打到最亮，无线开着，每天还要给iPhone充充电。要不插插头，这破电池真的撑不了多久。</p>

<p>我说肯定有问题，不可能没有问题，这电池真的不正常。人家说：是的，快到保修期的都这么说。哈。</p>

<p>最终还是给我换了，谢谢啊。</p>

<p>MBP上比较容易升级的配件就是内存了──这个最好拆，三个小箩丝就弄下来了（当然这几个小箩丝够小，一般的起子不管用）──就自己加了点内存。现在一条DDR 2 677 2G内存也就200出头，很值。</p>

<p>Update: 找着了国庆期间工作之余可以干的事：学习 Cocoa 桌面编程。有很长一阵子没摆弄桌面编程了，这回把 OS X下的Cocoa (Objective-C &amp; Ruby)吸收一下。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ashchan.com/archive/2008/09/26/%e5%9c%a8%e5%b9%b2%e4%bb%80%e4%b9%88%e5%91%a2/feed/</wfw:commentRss>
		</item>
		<item>
		<title>BlogPress测试</title>
		<link>http://blog.ashchan.com/archive/2008/09/14/blog-press%e6%b5%8b%e8%af%95/</link>
		<comments>http://blog.ashchan.com/archive/2008/09/14/blog-press%e6%b5%8b%e8%af%95/#comments</comments>
		<pubDate>Sat, 13 Sep 2008 18:45:38 +0000</pubDate>
		<dc:creator>ashchan</dc:creator>
		
		<category><![CDATA[talk]]></category>

		<category><![CDATA[iphone]]></category>

		<guid isPermaLink="false">http://blog.ashchan.com/archive/2008/09/14/blog-press%e6%b5%8b%e8%af%95/</guid>
		<description><![CDATA[Test only.   &#8212; Post From My iPhone

BlogPress

冯华君：BlogPress 是怎么被 App Store 接纳的（随帖赠送 20 份拷贝，先到先得）
]]></description>
			<content:encoded><![CDATA[<p>Test only. <br /><br /><center><a href='http://blogpress.w18.net/photos/08/09/14/10.jpg'><img src='http://blogpress.w18.net/photos/08/09/14/s_10.jpg' border='0'></a></center><br />  &#8212; Post From My iPhone<br /></p>

<p><a href="http://BlogPress.coollittlethings.com/">BlogPress</a></p>

<p><a href="http://apple4.us/2008/09/blogpress-and-appstore-20freecopies.html">冯华君：BlogPress 是怎么被 App Store 接纳的（随帖赠送 20 份拷贝，先到先得）</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ashchan.com/archive/2008/09/14/blog-press%e6%b5%8b%e8%af%95/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
