<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:thr='http://purl.org/syndication/thread/1.0' version='2.0'><channel><atom:id>tag:blogger.com,1999:blog-20394991</atom:id><lastBuildDate>Tue, 04 May 2010 09:17:30 +0000</lastBuildDate><title>懒惰的程序员</title><description>把开源进行到底！</description><link>http://www.wanglianghome.org/blog/</link><managingEditor>noreply@blogger.com (netcasper)</managingEditor><generator>Blogger</generator><openSearch:totalResults>288</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-20394991.post-4911988010201550360</guid><pubDate>Mon, 26 Apr 2010 04:06:00 +0000</pubDate><atom:updated>2010-04-26T12:14:07.658+08:00</atom:updated><title>The end</title><description>&lt;p&gt;&lt;a href="http://www.blogger.com/"&gt;blogger.com&lt;/a&gt;从5月1日起停止FTP发布支持，本blog也同时被终止。&lt;/p&gt;&lt;p&gt;&lt;a href="http://feeds2.feedburner.com/casper"&gt;http://feeds2.feedburner.com/casper&lt;/a&gt;继续使用，目前正在试用wordpress，决定之后这个feed将导向新的blog发布。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20394991-4911988010201550360?l=www.wanglianghome.org%2Fblog' alt='' /&gt;&lt;/div&gt;</description><link>http://www.wanglianghome.org/blog/2010/04/end.html</link><author>noreply@blogger.com (netcasper)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-20394991.post-7447990875738712974</guid><pubDate>Fri, 02 Apr 2010 07:22:00 +0000</pubDate><atom:updated>2010-04-02T15:33:07.170+08:00</atom:updated><title>Use iswitchb for orgmode completion</title><description>&lt;p&gt;很简单,就是&lt;code&gt;(setq org-completion-use-iswitchb t)&lt;/code&gt;。也可以用&lt;code&gt;ido&lt;/code&gt;，即&lt;code&gt;（setq org-completion-use-ido t)&lt;/code&gt;。&lt;/p&gt;&lt;p&gt;即便如此，遇到中文仍然很麻烦，宁可用&lt;kbd&gt;C-s&lt;/kbd&gt;和&lt;kbd&gt;C-s&lt;/kbd&gt;遍历，也不想切换输入法。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20394991-7447990875738712974?l=www.wanglianghome.org%2Fblog' alt='' /&gt;&lt;/div&gt;</description><link>http://www.wanglianghome.org/blog/2010/04/use-iswitchb-for-orgmode-completion.html</link><author>noreply@blogger.com (netcasper)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-20394991.post-3655973312988190394</guid><pubDate>Thu, 25 Feb 2010 05:35:00 +0000</pubDate><atom:updated>2010-02-25T13:51:56.782+08:00</atom:updated><title>Weave sync</title><description>&lt;p&gt;最近又从chrome切换回firefox，只因&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/10868"&gt;Weave Sync&lt;/a&gt;。&lt;/p&gt;&lt;p&gt;Weave Sync可以同步五种东西：书签、密码、选项、历史和标签，我只选择了后面两个。没有同步书签，是因为我根本就不保存书签，全部保存到&lt;a href="http://delicious.com/"&gt;delicious.com&lt;/a&gt;；没有同步密码，是因为我还有点不放心，虽然号称所有东西都是加密之后才上传到mozilla的服务器上，但是对于版本号1.0.1的东西，我还是想谨慎点，万一有点bug就死定了；我没有什么特别的选项设置，所以也就没有同步。&lt;/p&gt;&lt;p&gt;值得称道的是，Firefox和Weave Sync在诺基亚的Internet tablet，如N800和N810，以及新一代智能手机N900上都可以使用，使用同步密码功能，可以省去在移动设备上输入密码的烦恼。同步历史和标签，可以让你迅速延续在另一台设备上的阅读。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20394991-3655973312988190394?l=www.wanglianghome.org%2Fblog' alt='' /&gt;&lt;/div&gt;</description><link>http://www.wanglianghome.org/blog/2010/02/weave-sync.html</link><author>noreply@blogger.com (netcasper)</author><thr:total>2</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-20394991.post-6991949174346877872</guid><pubDate>Fri, 05 Feb 2010 05:42:00 +0000</pubDate><atom:updated>2010-02-05T13:51:50.273+08:00</atom:updated><title>Free but secure login mechanism</title><description>&lt;p&gt;&lt;a href="http://www.blogger.com/"&gt;blogger.com&lt;/a&gt;即将停止支持FTP方式发布blog，而我就是那不幸的0.5%。安装一个blog平台不是特别难，问题是如果我不想自己的密码以明文方式在这个恐怖的网络空间里飞舞，那么就需要SSL，对于dreamhost来说，还要额外为unique IP付费。&lt;/p&gt;&lt;p&gt;不想付。&lt;/p&gt;&lt;p&gt;Google上搜索了一阵，终于找到一个不错的解决方案——使用openid登录。&lt;a href="http://openid.net/get-an-openid/"&gt;Google啊Yahoo啊&lt;/a&gt;都可以。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20394991-6991949174346877872?l=www.wanglianghome.org%2Fblog' alt='' /&gt;&lt;/div&gt;</description><link>http://www.wanglianghome.org/blog/2010/02/free-but-secure-login-mechanism.html</link><author>noreply@blogger.com (netcasper)</author><thr:total>1</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-20394991.post-1818249032928985485</guid><pubDate>Wed, 03 Feb 2010 04:28:00 +0000</pubDate><atom:updated>2010-02-03T12:44:18.684+08:00</atom:updated><title>Download podcast with miro and privoxy</title><description>&lt;p&gt;喜欢使用&lt;a href="http://www.getmiro.com/"&gt;Miro&lt;/a&gt;下载、播放podcast，甚至video，然而尴尬的是，有些feed无法正常访问，虽然Miro支持http代理，然而走代理，尤其是通过tor下载会很慢，只好使用Google reader订阅。在线收听的缺点是不适合很长的内容，就像stackoverflow的podcast那样，动辄一个小时以上。&lt;/p&gt;&lt;p&gt;终于被我发现并学会了&lt;a href="http://www.privoxy.org/"&gt;privoxy&lt;/a&gt;。&lt;/p&gt;&lt;p&gt;privoxy是一个http代理，它具有firefox插件&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/2464"&gt;foxyproxy&lt;/a&gt;类似的功能，即有能力为不同的网址选择使用不同的代理，包括不使用代理。privoxy在Ubuntu 9.10上的配置文件位于&lt;code&gt;/etc/privoxy/config&lt;/code&gt;，只需添加一行代码，就可以使Miro在抓取feedburner的feed时走tor代理，而下载文件时不使用任何代理。&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;forward-socks5 feeds.feedburner.com 127.0.0.1:9050 .
&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;注意最后有一个点。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20394991-1818249032928985485?l=www.wanglianghome.org%2Fblog' alt='' /&gt;&lt;/div&gt;</description><link>http://www.wanglianghome.org/blog/2010/02/download-podcast-with-miro-and-privoxy.html</link><author>noreply@blogger.com (netcasper)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-20394991.post-3808841185538106031</guid><pubDate>Thu, 28 Jan 2010 02:54:00 +0000</pubDate><atom:updated>2010-01-28T11:02:16.206+08:00</atom:updated><title>Skip svn branch for git svn clone</title><description>&lt;p&gt;通常情况下，&lt;code&gt;git svn clone&lt;/code&gt;可以很好的完成任务。比如转换Google v8&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;git svn clone -s http://v8.googlecode.com/svn/ v8&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;但是最近&lt;code&gt;experimental&lt;/code&gt; branch发生了变化，&lt;code&gt;git svn fetch&lt;/code&gt;无法继续。其实我们完全可以忽略这个branch，方法是枚举所有想要fetch的branch，原来的配置如下：&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;[svn-remote "svn"]
        url = http://v8.googlecode.com/svn
        fetch = trunk:refs/remotes/trunk
        branches = branches/*:refs/remotes/*
        tags = tags/*:refs/remotes/tags/*&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;修改后如下：&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;[svn-remote "svn"]
        url = http://v8.googlecode.com/svn
        fetch = trunk:refs/remotes/trunk
        fetch = branches/bleeding_edge:refs/remotes/bleeding_edge
        tags = tags/*:refs/remotes/tags/*&lt;/pre&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20394991-3808841185538106031?l=www.wanglianghome.org%2Fblog' alt='' /&gt;&lt;/div&gt;</description><link>http://www.wanglianghome.org/blog/2010/01/skip-svn-branch-for-git-svn-clone.html</link><author>noreply@blogger.com (netcasper)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-20394991.post-8801589540297090369</guid><pubDate>Thu, 14 Jan 2010 07:24:00 +0000</pubDate><atom:updated>2010-01-14T15:29:29.767+08:00</atom:updated><title>Dropbox</title><description>&lt;p&gt;开始使用&lt;a href="http://www.dropbox.com/"&gt;dropbox&lt;/a&gt;，目前主要用来同步我的&lt;a href="http://www.dropbox.com/gallery/4017762/1/%E8%A3%85%E4%BF%AE%E8%BF%9B%E5%BA%A6?h=802bb1"&gt;装修进度照片&lt;/a&gt;和&lt;a href="http://www.dropbox.com/gallery/4017762/1/%E6%B0%B4%E7%94%B5%E9%AA%8C%E6%94%B6?h=d29e55"&gt;水电验收照片&lt;/a&gt;。&lt;/p&gt;&lt;p&gt;我的邀请链接是&lt;a href="https://www.dropbox.com/referrals/NTQwMTc3NjI5"&gt;https://www.dropbox.com/referrals/NTQwMTc3NjI5&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20394991-8801589540297090369?l=www.wanglianghome.org%2Fblog' alt='' /&gt;&lt;/div&gt;</description><link>http://www.wanglianghome.org/blog/2010/01/dropbox.html</link><author>noreply@blogger.com (netcasper)</author><thr:total>5</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-20394991.post-4874770820593721367</guid><pubDate>Tue, 29 Dec 2009 08:39:00 +0000</pubDate><atom:updated>2009-12-29T16:48:20.857+08:00</atom:updated><title>Ignore whitespace</title><description>&lt;p&gt;第一次收到&lt;a href="http://www.wanglianghome.org/cgi-bin/gitweb.cgi?p=test/.git;a=commit;h=338c2b90728fd5b344e51ab1a0b3d493ce3908e9"&gt;patch&lt;/a&gt;，看了一遍，感觉没问题，于是&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;patch -p1 -i fix-test-in-nested-expression.patch&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;打第一段补丁很顺利，打第二段时却失败了。百思不得其解，看了半天，忽然觉得可能是缩进的问题，于是增加了忽略空格不同的选项，如下&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;patch -p1 -l -i fix-test-in-nested-expression.patch&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;完美解决！&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20394991-4874770820593721367?l=www.wanglianghome.org%2Fblog' alt='' /&gt;&lt;/div&gt;</description><link>http://www.wanglianghome.org/blog/2009/12/ignore-whitespace.html</link><author>noreply@blogger.com (netcasper)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-20394991.post-8815081754709779652</guid><pubDate>Mon, 16 Nov 2009 04:54:00 +0000</pubDate><atom:updated>2009-11-16T12:58:22.783+08:00</atom:updated><title>Git mirror of all GCC SVN branches and tags</title><description>&lt;p&gt;终于找到使用http方式做&lt;code&gt;git clone&lt;/code&gt; GCC源代码的方法了。GCC gitweb的链接是&lt;/p&gt;&lt;blockquote&gt;&lt;a href="http://gcc.gnu.org/git/?p=gcc.git;a=summary"&gt;http://gcc.gnu.org/git/?p=gcc.git;a=summary&lt;/a&gt;&lt;/blockquote&gt;&lt;p&gt;上面有三种clone方式的链接。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20394991-8815081754709779652?l=www.wanglianghome.org%2Fblog' alt='' /&gt;&lt;/div&gt;</description><link>http://www.wanglianghome.org/blog/2009/11/git-mirror-of-all-gcc-svn-branches-and.html</link><author>noreply@blogger.com (netcasper)</author><thr:total>3</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-20394991.post-5309037680108297887</guid><pubDate>Mon, 02 Nov 2009 08:42:00 +0000</pubDate><atom:updated>2009-11-02T16:52:20.714+08:00</atom:updated><title>orgmode for mail</title><description>&lt;p&gt;使用&lt;a href="http://orgmode.org/"&gt;orgmode&lt;/a&gt;越来越顺手，于是用它替换markdown作为写HTML邮件的首选。配置如下：&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;(defun wl-message-goto-body-end ()
  "Go to the end of message body.  Before attachment part."
  (or (save-excursion
        (when (re-search-forward
               "^&lt;#part .+ filename=.+ disposition=attachment&gt;$"
               nil
               t)
          (forward-line -1)
          (end-of-line)
          (point)))
      (point-max)))

(defun wl-org-export-region-as-html-string (beg end)
  (interactive "r")
  (save-excursion
    (org-export-region-as-html beg end t 'string)))

(defun wl-mail-org2html-region (beg end)
  (interactive "r")
  (save-excursion
    (let ((html-txt (wl-org-export-region-as-html-string beg end)))
      (goto-char end)
      (message "%s" end)
      (insert "&amp;lt;#part type=text/html&amp;gt;\n&amp;lt;html&amp;gt;\n&amp;lt;head&amp;gt;\n&amp;lt;title&amp;gt;HTML version of email&amp;lt;/title&amp;gt;\n&amp;lt;/head&amp;gt;\n&amp;lt;body&amp;gt;")
      (insert html-txt)
      (insert "\n&amp;lt;/body&amp;gt;\n&amp;lt;/html&amp;gt;\n&amp;lt;#/multipart&amp;gt;\n")
      (goto-char beg)
      (insert "&amp;lt;#multipart type=alternative&amp;gt;\n"))))

(defun wl-mail-org2html-message-body ()
  (interactive)
  (save-excursion
    (message-goto-body)
    (wl-mail-org2html-region (point) (wl-message-goto-body-end))))

(add-hook 'message-send-hook 'wl-mail-org2html-message-body)
&lt;/pre&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20394991-5309037680108297887?l=www.wanglianghome.org%2Fblog' alt='' /&gt;&lt;/div&gt;</description><link>http://www.wanglianghome.org/blog/2009/11/orgmode-for-mail.html</link><author>noreply@blogger.com (netcasper)</author><thr:total>1</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-20394991.post-5315912506634101811</guid><pubDate>Fri, 23 Oct 2009 07:45:00 +0000</pubDate><atom:updated>2009-10-23T15:54:37.613+08:00</atom:updated><title>org-protocol</title><description>&lt;p&gt;&lt;a href="http://orgmode.org/worg/org-contrib/org-protocol.php"&gt;org-protocol&lt;/a&gt;是一个外部程序调用emacsclient的协议，目前提供的三个应用全部为浏览器设计，实现了与正在浏览的网页的URL相关的一些功能。其中的&lt;code&gt;org-protocol-remember&lt;/code&gt;实现了部分&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/8381"&gt;Evernote Web Clipper&lt;/a&gt;的功能，只不过只能保存文字，无法保存图片。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20394991-5315912506634101811?l=www.wanglianghome.org%2Fblog' alt='' /&gt;&lt;/div&gt;</description><link>http://www.wanglianghome.org/blog/2009/10/org-protocol.html</link><author>noreply@blogger.com (netcasper)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-20394991.post-1920418900570134857</guid><pubDate>Tue, 20 Oct 2009 05:14:00 +0000</pubDate><atom:updated>2009-10-20T13:23:38.741+08:00</atom:updated><title>Mirror GCC repository friendly</title><description>&lt;p&gt;&lt;a href="http://gcc.gnu.org/"&gt;GCC&lt;/a&gt;使用Subversion管理源代码，如果想做一个镜像的话，&lt;code&gt;git svn&lt;/code&gt;是一个方法。然而GCC这么古老的项目，svn版本号已经是15万级别，做一次完整的镜像可能对服务器的负载造成一定影响，友善一点的方法就是一次只拿一小部分版本信息，然后等待一段时间，再继续下去。还有就是只取trunk的代码，忽略branch和tag。下面的bash脚本每次取5000个版本，然后休息50分钟。克隆完成之后别忘了再rebase一下，因为workspace里面的内容只是第一次fetch的结果。&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;#!/bin/bash

set -o verbose

SVN_HEAD_REV=$1
if [ $SVN_HEAD_REV -le 5000 ]
then
    echo "svn revision number must be at lease 5001."
    exit 1
fi

git svn init http://gcc.gnu.org/svn/gcc -T trunk

for ((i=5000; i &amp;lt; $SVN_HEAD_REV; i+=5000))
do
    echo "git svn fetch -r $(( $i-4999 )):$i"
    git svn fetch -r $(( $i-4999 )):$i || exit 2
    sleep 50m
done

if [ $(( $i-4999 )) -lt $SVN_HEAD_REV ]
then
    echo "git svn fetch -r $(( $i-4999 )):$SVN_HEAD_REV"
    git svn fetch -r $(( $i-4999 )):$SVN_HEAD_REV
fi&lt;/pre&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20394991-1920418900570134857?l=www.wanglianghome.org%2Fblog' alt='' /&gt;&lt;/div&gt;</description><link>http://www.wanglianghome.org/blog/2009/10/mirror-gcc-repository-friendly.html</link><author>noreply@blogger.com (netcasper)</author><thr:total>5</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-20394991.post-6921001610645703234</guid><pubDate>Fri, 16 Oct 2009 08:12:00 +0000</pubDate><atom:updated>2009-10-16T16:28:14.220+08:00</atom:updated><title>Read source code effectively</title><description>&lt;p&gt;第一次阅读&lt;a href="http://code.google.com/p/v8/"&gt;v8&lt;/a&gt;的代码，由于文档缺乏，读起来很累，快速浏览了几个文件，仍然没有什么概念。后来更改了阅读习惯，很快就对垃圾收集一块有了初步的了解。&lt;/p&gt;&lt;p&gt;首先学习了相应的理论，庆幸自己多年前买了《&lt;a href="http://www.douban.com/subject/1157908/"&gt;垃圾收集&lt;/a&gt;》一书，并一直压箱底，这回终于派上用场，认真学习了mark compacting和&lt;a href="http://en.wikipedia.org/wiki/Cheney%27s_algorithm"&gt;Cheney's algorithm&lt;/a&gt;（切尼算法——经典节点复制算法），没有这一块的学习，想光凭阅读代码来理解实现对我来说几乎是不可能的。&lt;/p&gt;&lt;p&gt;然后就是改变阅读代码习惯。以前就是逐行扫描过来；现在则记录下不懂的地方，然后在告一段落之后再去学习。在Emacs的帮助下，这一行为容易到极点，只需创建一个orgmode任务并链接到相应代码行即可，整个过程只需要几秒钟。在解决了三四个这样的任务之后，开始对v8的垃圾收集实现有了一点概念。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20394991-6921001610645703234?l=www.wanglianghome.org%2Fblog' alt='' /&gt;&lt;/div&gt;</description><link>http://www.wanglianghome.org/blog/2009/10/read-source-code-effectively.html</link><author>noreply@blogger.com (netcasper)</author><thr:total>3</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-20394991.post-3570689607291936527</guid><pubDate>Wed, 30 Sep 2009 12:26:00 +0000</pubDate><atom:updated>2009-09-30T20:37:39.679+08:00</atom:updated><title>Think about backup again</title><description>&lt;p&gt;最近发生的两件事情让我再次思考如何备份自己的数据，一个是同事的IBM T42相继报废，另外就是访问国外网站越来越困难了。目前我的备份方式很原始，手工备份，外加几个使用rsync的脚本，自动化程度较低。公司里的数据肯定不能备份到外网，自己也有电子书、片子和音乐什么的，不方便放出来，所以需要一个可以自己搭建的备份方案。&lt;/p&gt;&lt;p&gt;我的私人网络数据备份做得不错，基本都有备份，除了Google Docs里的文档。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20394991-3570689607291936527?l=www.wanglianghome.org%2Fblog' alt='' /&gt;&lt;/div&gt;</description><link>http://www.wanglianghome.org/blog/2009/09/think-about-backup-again.html</link><author>noreply@blogger.com (netcasper)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-20394991.post-805877796185292704</guid><pubDate>Mon, 21 Sep 2009 02:59:00 +0000</pubDate><atom:updated>2009-09-21T11:07:54.437+08:00</atom:updated><title>Git remote pushurl</title><description>&lt;p&gt;从git 1.6.4起，有了一个新的控制选项——&lt;code&gt;remote.$name.pushurl&lt;/code&gt;，官方解释如下：&lt;/p&gt;&lt;blockquote&gt;"git push $name" honors remote.$name.pushurl if present before using remote.$name.url.  In other words, the URL used for fetching and pushing can be different.&lt;/blockquote&gt;&lt;p&gt;也就是说，你可以有一个url用来取，一个url用来提交，下面是一个配置的例子&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;[remote "gitweb"]
        pushurl = ssh://me@example.com/gitrepo/mypj.git
        url = git://example.com/mypj.git
        fetch = +refs/heads/*:refs/remotes/gitweb/*&lt;/pre&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20394991-805877796185292704?l=www.wanglianghome.org%2Fblog' alt='' /&gt;&lt;/div&gt;</description><link>http://www.wanglianghome.org/blog/2009/09/git-remote-pushurl.html</link><author>noreply@blogger.com (netcasper)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-20394991.post-8670980925597582676</guid><pubDate>Mon, 14 Sep 2009 05:17:00 +0000</pubDate><atom:updated>2009-09-14T13:27:40.277+08:00</atom:updated><title>Photo helps remember</title><description>&lt;p&gt;曾经读过一个人讲述自己使用&lt;a href="http://www.evernote.com/"&gt;evernote&lt;/a&gt;的方式，他在停好车之后拍一张照片，然后上传到evernote上，以免忘记自己停车的位置。当时觉得有点小题大做，这种临时的事情就不用上传了吧。&lt;/p&gt;&lt;p&gt;最近突然想不起自己的房租转账收据放到哪里去了，顿时一头汗啊。决定以后对于重要的物品或者长时间不用的物品，把存放位置拍下来，存到evernote，分门别类。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20394991-8670980925597582676?l=www.wanglianghome.org%2Fblog' alt='' /&gt;&lt;/div&gt;</description><link>http://www.wanglianghome.org/blog/2009/09/photo-helps-remember.html</link><author>noreply@blogger.com (netcasper)</author><thr:total>1</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-20394991.post-254456653849497859</guid><pubDate>Fri, 11 Sep 2009 07:31:00 +0000</pubDate><atom:updated>2009-09-11T15:37:58.118+08:00</atom:updated><title>Wrap git log output</title><description>&lt;p&gt;缺省情况下，&lt;code&gt;git log&lt;/code&gt;的输出并不会把长字符串换行，如果有人写提交信息的时候没有换行，那么超出终端宽度的部分就无法看到，解决方法是把&lt;code&gt;core.pager&lt;/code&gt;设置为&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;less -+$LESS -FRX&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;详细解释参见&lt;code&gt;git config&lt;/code&gt;手册中关于&lt;code&gt;core.pager&lt;/code&gt;的部分。&lt;/p&gt;&lt;p&gt;这也是我在&lt;a href="http://identi.ca/"&gt;identi.ca&lt;/a&gt;上发的&lt;a href="http://identi.ca/notice/9819602"&gt;第一个消息&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20394991-254456653849497859?l=www.wanglianghome.org%2Fblog' alt='' /&gt;&lt;/div&gt;</description><link>http://www.wanglianghome.org/blog/2009/09/wrap-git-log-output.html</link><author>noreply@blogger.com (netcasper)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-20394991.post-3276327523346899052</guid><pubDate>Mon, 07 Sep 2009 05:06:00 +0000</pubDate><atom:updated>2009-09-07T13:18:19.044+08:00</atom:updated><title>Turn on c++-mode for h files</title><description>&lt;p&gt;&lt;code&gt;C/C++&lt;/code&gt;都使用&lt;code&gt;h&lt;/code&gt;作为头文件后缀名，使得无法简单地在Emacs里面指定major-mode。使用&lt;code&gt;magic-mode-alist&lt;/code&gt;可以减轻一点烦恼。以&lt;a href="http://code.google.com/p/v8/"&gt;v8&lt;/a&gt;项目为例：&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;(add-to-list 'magic-mode-alist
             '("// .* the v8 project" . c++-mode))&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;Emacs在打开文件时如果匹配到相应的正则表达式，就会使用&lt;code&gt;c++-mode&lt;/code&gt;。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20394991-3276327523346899052?l=www.wanglianghome.org%2Fblog' alt='' /&gt;&lt;/div&gt;</description><link>http://www.wanglianghome.org/blog/2009/09/turn-on-c-mode-for-h-files.html</link><author>noreply@blogger.com (netcasper)</author><thr:total>2</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-20394991.post-5520268339385110911</guid><pubDate>Wed, 02 Sep 2009 04:40:00 +0000</pubDate><atom:updated>2009-09-02T15:43:56.268+08:00</atom:updated><title>Send org status change to identica</title><description>&lt;p&gt;microblog的一个功能算告诉世界What are you doing?以下一段代码把正在计时的任务和刚刚完成的任务记录在&lt;a href="http://identi.ca/"&gt;identi.ca&lt;/a&gt;或者任何自己建立的&lt;a href="http://laconi.ca/"&gt;laconi.ca&lt;/a&gt;上。&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;(defun wl-org-clock-in-update ()
  (let ((current-heading (org-get-heading t))
        (tags (org-get-tags-at)))
    (when (member "@office" tags)
      (with-current-buffer identica-buffer
        (identica-update-status-if-not-blank "statuses" "update"
                                             current-heading)))))

(add-hook 'org-clock-in-hook 'wl-org-clock-in-update)

(defun wl-org-todo-state-change-update ()
  (let ((current-heading (org-get-heading t))
        (tags (org-get-tags-at)))
    (when (and (member "@office" tags)
               (string-match "^\(DONE\|CANCELED\|GOT\) " current-heading))
      (with-current-buffer identica-buffer
        (identica-update-status-if-not-blank "statuses" "update"
                                             (concat "#" current-heading))))))

(add-hook 'org-after-todo-state-change-hook 'wl-org-todo-state-change-update)&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;我在公司的机器上装了laconica，所以只在上面记录跟工作相关的内容，其中&lt;code&gt;(member "@office" tags)&lt;/code&gt;保证只发送含有@office标签的任务。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20394991-5520268339385110911?l=www.wanglianghome.org%2Fblog' alt='' /&gt;&lt;/div&gt;</description><link>http://www.wanglianghome.org/blog/2009/09/send-org-status-change-to-identica.html</link><author>noreply@blogger.com (netcasper)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-20394991.post-950169349895169659</guid><pubDate>Thu, 20 Aug 2009 04:18:00 +0000</pubDate><atom:updated>2009-08-20T12:34:12.637+08:00</atom:updated><title>microblogging</title><description>&lt;p&gt;在公司机器上装了&lt;a href="http://laconi.ca/"&gt;laconi.ca&lt;/a&gt;，可惜只有我自己在用，很是无聊，于是考虑是否在&lt;a href="http://identi.ca/"&gt;identi.ca&lt;/a&gt;上创建帐号。然而，最终还是在自由与潮流之间选择了后者，于是便有了如下的&lt;a href="http://www.emacswiki.org/emacs/TwitteringMode"&gt;twittering-mode&lt;/a&gt;的配置。&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;(add-to-list 'load-path "~/elisp/3rd-party-lib/twittering-mode/")
(require 'twittering-mode)
(setq twittering-username "&lt;a href="http://twitter.com/wlcasper"&gt;wlcasper&lt;/a&gt;")
(setq twittering-timer-interval 900)
(setq twittering-proxy-use t)
(setq twittering-proxy-server "127.0.0.1")
(setq twittering-proxy-port "8118")&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;netcasper不知道被谁注册了，只好使用备用id。代理使用的是privoxy+tor的方式，privoxy的设置参见&lt;a href="http://www.opensourcehowto.org/how-to/privoxy/setup-tor--privoxy-for-anonymous-searching.html"&gt;Setup Tor &amp; Privoxy for anonymous searching&lt;/a&gt;。其实很简单，就是在&lt;code&gt;/etc/privoxy/config&lt;/code&gt;文件里添加一行：&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;forward-socks4a / localhost:9050 .&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;注意最后有一个点，千万不要漏掉。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20394991-950169349895169659?l=www.wanglianghome.org%2Fblog' alt='' /&gt;&lt;/div&gt;</description><link>http://www.wanglianghome.org/blog/2009/08/microblogging.html</link><author>noreply@blogger.com (netcasper)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-20394991.post-6452129941218999406</guid><pubDate>Thu, 13 Aug 2009 04:51:00 +0000</pubDate><atom:updated>2009-08-13T13:02:55.558+08:00</atom:updated><title>Changing life style</title><description>&lt;p&gt;自从把儿子接到上海，生活习惯彻底改变了。&lt;/p&gt;&lt;ul&gt;&lt;li&gt;晚上9点一过就上床睡觉，儿子一般在7点到8点之间睡。为什么睡这么早呢？因为&lt;/li&gt;&lt;li&gt;刚来的时候，儿子早上3点就醒了。通过十几天的努力，现在基本在5点半醒；而且&lt;/li&gt;&lt;li&gt;后半夜一点多，还要起来喂奶。宝宝睡着的时候居然也能够吃奶。&lt;/li&gt;&lt;li&gt;其实夜里起来的次数不止一次，通常会有一段时间，儿子睡不踏实，翻来覆去的，有时还哭两声。这时候需要抱起来哄一哄。&lt;/li&gt;&lt;li&gt;家里的电脑很少开。&lt;/li&gt;&lt;li&gt;早饭吃得特别多，比如今天早上，一杯豆浆、一根油条、一碗小米粥、一个菜包，外加一个煮鸡蛋。
&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;刚开始的时候，白天那叫一个困啊，上班时坐在椅子上，一下子就能睡着，现在锻炼出来了，不会感到困，最多在精力无法集中的时候小睡一下。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20394991-6452129941218999406?l=www.wanglianghome.org%2Fblog' alt='' /&gt;&lt;/div&gt;</description><link>http://www.wanglianghome.org/blog/2009/08/changing-life-style.html</link><author>noreply@blogger.com (netcasper)</author><thr:total>3</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-20394991.post-8933590364107404989</guid><pubDate>Tue, 11 Aug 2009 04:22:00 +0000</pubDate><atom:updated>2009-08-11T12:39:15.945+08:00</atom:updated><title>Advantage of clocking</title><description>&lt;p&gt;&lt;code&gt;org-mode&lt;/code&gt;提供了计时（clocking）功能，使用方法是：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;为某项任务开始计时，使用&lt;kbd&gt;C-c C-x C-i&lt;/kbd&gt;，或者在&lt;code&gt;*Org Agenda*&lt;/code&gt;下使用&lt;kbd&gt;I&lt;/kbd&gt;。&lt;/li&gt;&lt;li&gt;结束计时使用&lt;kbd&gt;C-c C-x C-o&lt;/kbd&gt;，或者在&lt;code&gt;*Org Agenda*&lt;/code&gt;下使用&lt;kbd&gt;O&lt;/kbd&gt;。&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;对一项任务可以多次计时。&lt;/p&gt;&lt;p&gt;计时工作本身比较枯燥，然而利用计时的结果，我们可以做很多深入的分析，&lt;code&gt;org-mode&lt;/code&gt;提供两种方式展示分析结果。&lt;/p&gt;&lt;ul&gt;&lt;li&gt;在&lt;code&gt;*Org Agenda*&lt;/code&gt;下使用&lt;kbd&gt;R&lt;/kbd&gt;，会在buffer底部生成一个表格，统计出当前&lt;code&gt;*Org Agenda*&lt;/code&gt;周期内的任务消耗时间。&lt;/li&gt;&lt;li&gt;在&lt;code&gt;*Org Agenda*&lt;/code&gt;下使用&lt;kbd&gt;l&lt;/kbd&gt;，会显示出在某个时间段内的工作内容。&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;有了这两个数据，我们可以分析出到底每天花了多少时间用在真真正正做事情上，有多少时间片段没有任何实际内容。&lt;/p&gt;&lt;p&gt;《&lt;a href="http://www.cnread.net/cnread1/wgwx/g/gelalin/qtdy/index.html"&gt;奇特的一生&lt;/a&gt;》里介绍柳比歇夫一生都在严格地计时，然后手工做总结、统计。有了&lt;code&gt;org-mode&lt;/code&gt;的自动化功能，我们可以让这一过程更有趣。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20394991-8933590364107404989?l=www.wanglianghome.org%2Fblog' alt='' /&gt;&lt;/div&gt;</description><link>http://www.wanglianghome.org/blog/2009/08/advantage-of-clocking.html</link><author>noreply@blogger.com (netcasper)</author><thr:total>3</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-20394991.post-2859315215390209785</guid><pubDate>Wed, 05 Aug 2009 04:15:00 +0000</pubDate><atom:updated>2009-08-05T12:33:54.216+08:00</atom:updated><title>Big Chinese Small ASCII</title><description>&lt;p&gt;GNU Emacs有一个假设，即一个汉字字符的宽度是一个ASCII的两倍。如果这个假设不满足，就会有些功能看起来不正常，比如&lt;code&gt;auto-fill-mode&lt;/code&gt;、&lt;code&gt;org-mode table&lt;/code&gt;。很遗憾，缺省情况下，这个假设并不成立。&lt;/p&gt;&lt;p&gt;查看字体使用&lt;kbd&gt;C-u C-x =&lt;/kbd&gt;，注意其中&lt;code&gt;xft&lt;/code&gt;的值，通常来说，ASCII和中文的字体大小是一样的。以下是我的缺省字体设置：&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;(custom-set-faces
  ;; custom-set-faces was added by Custom.
  ;; If you edit it by hand, you could mess it up, so be careful.
  ;; Your init file should contain only one such instance.
  ;; If there is more than one, they won't work right.
 '(default ((t (:inherit nil :stipple nil :background "#ffffff"
                :foreground "#000000" :inverse-video nil :box nil 
                :strike-through nil :overline nil :underline nil 
                :slant normal :weight normal :height 170 
                :width normal :foundry "Ascender Corp." 
                :family "Liberation Mono")))))&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;使用如下方法可以将汉字宽度设置为ASCII的两倍，具体数值需要参考相应的缺省配置。&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;(set-fontset-font "fontset-default" 'chinese-gbk "AR PL UKai CN 20")&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;如果是Emacs daemon，则需要写成：&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;(if (and (fboundp 'daemonp) (daemonp))
    (add-hook 'after-make-frame-functions
              (lambda (frame)
                (with-selected-frame frame
                  (set-fontset-font "fontset-default"
                                    'chinese-gbk "AR PL UKai CN 20"))))
  (set-fontset-font "fontset-default" 'chinese-gbk "AR PL UKai CN 20"))&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;这种方法的缺点是汉字很大、英文较小。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20394991-2859315215390209785?l=www.wanglianghome.org%2Fblog' alt='' /&gt;&lt;/div&gt;</description><link>http://www.wanglianghome.org/blog/2009/08/big-chinese-small-ascii.html</link><author>noreply@blogger.com (netcasper)</author><thr:total>3</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-20394991.post-830105204137829785</guid><pubDate>Fri, 31 Jul 2009 05:09:00 +0000</pubDate><atom:updated>2009-07-31T13:28:22.687+08:00</atom:updated><title>Emacs 23.1 released</title><description>&lt;p&gt;Emacs 23.1已经发布，并提供&lt;a href="http://ftp.gnu.org/gnu/emacs/emacs-23.1.tar.bz2"&gt;下载&lt;/a&gt;。其中最吸引我的是字体和daemon，这也是我此前一直使用CVS Emacs的原因。&lt;/p&gt;&lt;p&gt;然而使用daemon可能会有一点点小麻烦，如果你觉得自己的daemon不正常，可以尝试执行&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;emacs -Q --daemon&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;code&gt;-Q&lt;/code&gt;阻止emacs在启动的时候读取用户的定制文件——&lt;code&gt;.emacs&lt;/code&gt;。如果这时一切正常了，那么说明你的配置和daemon有些冲突。不幸的是究竟怎样配置才能正常启动daemon目前还不是很清楚，我的两个帖子可以用来参考。&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.wanglianghome.org/blog/2009/01/customization-tips-for-emacs-daemon.html"&gt;Customization tips for emacs daemon&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.wanglianghome.org/org/programming/emacsbook/emacs.html"&gt;Emacs定制与扩展&lt;/a&gt;的3.1节。注：此文较长，部分内容有些过时，请阅读时仔细甄别。&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20394991-830105204137829785?l=www.wanglianghome.org%2Fblog' alt='' /&gt;&lt;/div&gt;</description><link>http://www.wanglianghome.org/blog/2009/07/emacs-231-released.html</link><author>noreply@blogger.com (netcasper)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-20394991.post-3626039142657647709</guid><pubDate>Tue, 28 Jul 2009 04:58:00 +0000</pubDate><atom:updated>2009-07-28T13:06:21.933+08:00</atom:updated><title>Export org table as HTML</title><description>&lt;p&gt;使用如下函数，可以将光标所在位置的&lt;code&gt;org table&lt;/code&gt;转换为&lt;code&gt;HTML table&lt;/code&gt;。&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;
(defun wl-org-export-table-as-html ()
  (interactive)
  (unless (org-at-table-p)
    (error "No table at point"))
  (let* ((beg (org-table-begin))
         (end (org-table-end))
         (buffer
          (org-export-region-as-html beg end t "*Org Table HTML Export*")))
    (switch-to-buffer-other-window buffer)))&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;在&lt;code&gt;org-mode&lt;/code&gt;里面创建table实在太容易、太方便了，而markdown又没有table支持，只能用HTML，上面这个函数，可以帮我完成快速格式转换。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20394991-3626039142657647709?l=www.wanglianghome.org%2Fblog' alt='' /&gt;&lt;/div&gt;</description><link>http://www.wanglianghome.org/blog/2009/07/export-org-table-as-html.html</link><author>noreply@blogger.com (netcasper)</author><thr:total>0</thr:total></item></channel></rss>