<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;DE8ESHc_cCp7ImA9WhRaFE8.&quot;"><id>tag:blogger.com,1999:blog-31807993</id><updated>2012-02-17T05:13:29.948+08:00</updated><category term="media" /><category term="rxvt" /><category term="grub" /><category term="xsub" /><category term="gun" /><category term="3d" /><category term="encoding" /><category term="perl" /><category term="scim" /><category term="gnu" /><category term="3G" /><category term="mplayer" /><category term="library" /><category term="firefox" /><category term="ppp" /><category term="git" /><category term="haskell" /><category term="computer" /><category term="debian" /><category term="vim" /><category term="gcin" /><category term="cedega game sound" /><category term="pulseaudio" /><category term="linux" /><category term="emacs" /><category term="threads" /><category term="mysql" /><category term="tool" /><category term="fluxbox" /><category term="awesome" /><category term="programming" /><category term="utilties" /><category term="mysql discuz" /><category term="xwindow" /><category term="diff" /><category term="route" /><category term="readline" /><category term="font" /><category term="blog" /><category term="xorg" /><category term="bluetooth" /><category term="editor" /><category term="vimperator" /><category term="terminal" /><category term="software" /><category term="yahoo 字典" /><category term="server" /><category term="network" /><category term="ubuntu" /><category term="gmail" /><title>Freehaha's notes</title><subtitle type="html">We learn and do, and when we do, we learn.</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://freehaha.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://freehaha.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/31807993/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>freehaha</name><uri>http://www.blogger.com/profile/02332220379558446612</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>165</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/blogspot/ejXR" /><feedburner:info uri="blogspot/ejxr" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;D08MRn0zfyp7ImA9WhZUGEU.&quot;"><id>tag:blogger.com,1999:blog-31807993.post-7631686710130358142</id><published>2011-06-12T21:37:00.001+08:00</published><updated>2011-06-12T21:38:07.387+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-12T21:38:07.387+08:00</app:edited><title>jumper</title><content type="html">今天答應要幫媽媽的朋友在喪禮上放 ppt，有好幾份會需要跳來跳去，電腦又只有一個輸出沒辦法用雙螢幕來切，只好手動切但 Alt + Tab 只有兩個視窗的時候還好，超過三個以後有時候還是需要按幾次，在大螢幕上效果不佳，於是就寫了這個小程式...&lt;br /&gt;
&lt;br /&gt;
基本上就是列出一些看得到的視窗然後讓使用者指定 1-9 的位置 (輸入 &lt;b&gt;&lt;span style="background-color: #444444; color: #fce5cd;"&gt;q&lt;/span&gt;&lt;/b&gt; 結束選取)，設好以後直接用 &lt;b&gt;&lt;span style="background-color: #444444; color: #fff2cc;"&gt;Win + 1~9&lt;/span&gt;&lt;/b&gt; 就可以把視窗拉到前面來，&lt;b style="background-color: #444444;"&gt;&lt;span style="color: #ffe599;"&gt;ALT + CTRL + Q&lt;/span&gt; &lt;/b&gt;關閉程式，&lt;b&gt; &lt;span style="background-color: #444444; color: #fce5cd;"&gt;ALT + CTRL + R&lt;/span&gt;&lt;/b&gt; 可以重新設定。今天自己試用的效果不賴，丟出來讓大家看一看，有興趣的可以拿去改的更好，只是我昨天也稍微 google 了一下居然沒找到類似的軟體，難道大家都這麼喜歡浪費時間一個一個&amp;nbsp; Alt+tab 找嗎 @@"&lt;br /&gt;
&lt;br /&gt;
程式 &amp;amp; source : &lt;a href="http://moon.cse.yzu.edu.tw/%7Es961449/jumper.zip"&gt;http://moon.cse.yzu.edu.tw/~s961449/jumper.zip&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31807993-7631686710130358142?l=freehaha.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/wWsSu7y4gUs49APgeWJYF8WVb-A/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/wWsSu7y4gUs49APgeWJYF8WVb-A/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/wWsSu7y4gUs49APgeWJYF8WVb-A/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/wWsSu7y4gUs49APgeWJYF8WVb-A/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/ejXR/~4/Nmx4Z6v4rOc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://freehaha.blogspot.com/feeds/7631686710130358142/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=31807993&amp;postID=7631686710130358142" title="6 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/31807993/posts/default/7631686710130358142?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/31807993/posts/default/7631686710130358142?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/ejXR/~3/Nmx4Z6v4rOc/jumper.html" title="jumper" /><author><name>Freehaha</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>6</thr:total><feedburner:origLink>http://freehaha.blogspot.com/2011/06/jumper.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0cBRXw9fCp7ImA9WhZRGEk.&quot;"><id>tag:blogger.com,1999:blog-31807993.post-3225137447531507012</id><published>2011-04-15T12:17:00.000+08:00</published><updated>2011-04-15T12:17:34.264+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-15T12:17:34.264+08:00</app:edited><title>~/.xsession 突然不被執行了..</title><content type="html">最近更新了以後發現 ~/.xsession 在開機不會被執行 (因為很少重開所以現在才發現....), 看了一下 /etc/X11/Xsession.d/50x11-common_determine-startup&amp;nbsp; 裡面的判斷, 才發現現在如果 ~/.xsession, ~/.Xsession 不能被執行就會被跳過, 採用系統預設的 startup command. 所以只要將他設定為 executable 就行囉!&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;chmod +x ~/.xsession &lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31807993-3225137447531507012?l=freehaha.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/EEwbiYgLAXV20av22w7jaAYT6Q0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/EEwbiYgLAXV20av22w7jaAYT6Q0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/EEwbiYgLAXV20av22w7jaAYT6Q0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/EEwbiYgLAXV20av22w7jaAYT6Q0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/ejXR/~4/2lBFFvNMEnc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://freehaha.blogspot.com/feeds/3225137447531507012/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=31807993&amp;postID=3225137447531507012" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/31807993/posts/default/3225137447531507012?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/31807993/posts/default/3225137447531507012?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/ejXR/~3/2lBFFvNMEnc/xsession.html" title="~/.xsession 突然不被執行了.." /><author><name>Freehaha</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://freehaha.blogspot.com/2011/04/xsession.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DU8ERHY-eSp7ImA9WhdaFkQ.&quot;"><id>tag:blogger.com,1999:blog-31807993.post-999042456710295164</id><published>2011-01-30T02:54:00.001+08:00</published><updated>2011-10-27T14:43:25.851+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-27T14:43:25.851+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="awesome" /><category scheme="http://www.blogger.com/atom/ns#" term="gmail" /><category scheme="http://www.blogger.com/atom/ns#" term="xorg" /><title>awesome wm gmail widget (vicious)</title><content type="html">&lt;span class="fullpost"&gt;最近用 awesome 的 vicious library 寫了 gmail 的 widget. 不多說, 可以在 &lt;a href="https://github.com/freehaha/awesome-gmail"&gt;我的 github&lt;/a&gt; 找到&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="fullpost"&gt;有什麼可以改進的歡迎指教&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="fullpost"&gt;----- Update: Oct 27 ----- &lt;/span&gt;&lt;br /&gt;
&lt;span class="fullpost"&gt;放在網路上很久終於有人用然後跟我回報錯誤了..XDD&lt;/span&gt;&lt;br /&gt;
&lt;span class="fullpost"&gt;原本產生的 widget 是包在回傳的 gmailwidget 裡面所以放在 wibox 時要用 gmailwidget.widget 才對，可是我 README 上是直接寫用 gmailwidget 這樣會造成 layout 錯誤，現在更新過了應該可以直接把 gmailwidget 放入 wibox 了！&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31807993-999042456710295164?l=freehaha.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/1aN6u3FVqK1LGKU7Pq5tW7N4MGQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/1aN6u3FVqK1LGKU7Pq5tW7N4MGQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/1aN6u3FVqK1LGKU7Pq5tW7N4MGQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/1aN6u3FVqK1LGKU7Pq5tW7N4MGQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/ejXR/~4/BFh7d0Q2x5c" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://freehaha.blogspot.com/feeds/999042456710295164/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=31807993&amp;postID=999042456710295164" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/31807993/posts/default/999042456710295164?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/31807993/posts/default/999042456710295164?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/ejXR/~3/BFh7d0Q2x5c/awesome-wm-battery-widget-vicious.html" title="awesome wm gmail widget (vicious)" /><author><name>Freehaha</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://freehaha.blogspot.com/2011/01/awesome-wm-battery-widget-vicious.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEYBRHs6fyp7ImA9Wx9WFkw.&quot;"><id>tag:blogger.com,1999:blog-31807993.post-9092928732291901667</id><published>2011-01-21T20:15:00.001+08:00</published><updated>2011-01-21T20:15:55.517+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-01-21T20:15:55.517+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="mysql" /><title>mysql: utf8? utf-8?</title><content type="html">今天在搬 db 折騰了好久，一直覺得這種東西是 piece of cake，不就 dump 以後再 source 就好了嗎? 是沒錯.. 但是當編碼扯進來就很機車了.. &lt;br /&gt;
&lt;br /&gt;
今天弄半天，dump 出來的 sql 是 utf-8 編碼的沒錯，但是 source 以後讀出來卻是亂碼，找半天才發現我的 cakephp 裡面設定編碼是 'utf-8'，有什麼不對嗎?! 原來 mysql 用的是 'utf8'，認不出 'utf-8'，OMG OMG OMG OMG...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31807993-9092928732291901667?l=freehaha.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/7jVO8H_TUcCfaxRU2YaFFddPLMY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/7jVO8H_TUcCfaxRU2YaFFddPLMY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/7jVO8H_TUcCfaxRU2YaFFddPLMY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/7jVO8H_TUcCfaxRU2YaFFddPLMY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/ejXR/~4/k-ug4_19YSc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://freehaha.blogspot.com/feeds/9092928732291901667/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=31807993&amp;postID=9092928732291901667" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/31807993/posts/default/9092928732291901667?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/31807993/posts/default/9092928732291901667?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/ejXR/~3/k-ug4_19YSc/mysql-utf8-utf-8.html" title="mysql: utf8? utf-8?" /><author><name>Freehaha</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://freehaha.blogspot.com/2011/01/mysql-utf8-utf-8.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEIGSXs7eCp7ImA9Wx9WFEg.&quot;"><id>tag:blogger.com,1999:blog-31807993.post-5862835145937277518</id><published>2011-01-19T23:47:00.001+08:00</published><updated>2011-01-19T23:55:28.500+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-01-19T23:55:28.500+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="vim" /><title>vim annoying search highlight</title><content type="html">&lt;span class="fullpost"&gt;有好一陣子我把 vim 的 highlight search 關掉，因為有時候搜完會出現一堆 highlight 看久了很不舒服，是有試過用 mapping 的方法來開關 hls (:set hls!...) 可是實在不方便。&lt;/span&gt;&lt;br /&gt;
&lt;span class="fullpost"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="fullpost"&gt;今天突然在網路上看到&lt;a href="http://stackoverflow.com/questions/99161/how-do-you-make-vim-unhighlight-what-you-searched-for"&gt;這個方法&lt;/a&gt;我想說「奇怪，以前怎麼沒找到這個方法」，事實上好用多多多了...&lt;/span&gt;&lt;br /&gt;
&lt;span class="fullpost"&gt; &lt;/span&gt;&lt;br /&gt;
&lt;span class="fullpost"&gt;紀錄:&lt;/span&gt;&lt;br /&gt;
&lt;span class="fullpost"&gt;map C-L -&amp;gt; :nohl&lt;/span&gt;&lt;br /&gt;
&lt;span class="fullpost"&gt;vimrc:&lt;/span&gt;&lt;br /&gt;
&lt;blockquote&gt;nnoremap &amp;lt;silent&amp;gt;&amp;lt;c-l&amp;gt; :nohl&amp;lt;cr&amp;gt;&amp;lt;c-l&amp;gt;&lt;/blockquote&gt;&lt;br /&gt;
Ctrl + L 還蠻直覺的，平常就用來重畫 terminal，另外也有看到其他人用 &amp;lt;esc&amp;gt;, &amp;lt;cr&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;nnoremap &amp;lt;silent&amp;gt;&amp;lt;esc&amp;gt; :nohl&amp;lt;cr&amp;gt;&amp;lt;esc&amp;gt;&lt;/blockquote&gt;or&lt;br /&gt;
&lt;blockquote&gt;nnoremap &amp;lt;silent&amp;gt;&amp;lt;cr&amp;gt; :nohl&amp;lt;cr&amp;gt;&amp;lt;cr&amp;gt;                                                                   &lt;br /&gt;
&lt;/blockquote&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31807993-5862835145937277518?l=freehaha.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/eamUu64fO1xB33nEsX6baR7pU8w/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/eamUu64fO1xB33nEsX6baR7pU8w/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/eamUu64fO1xB33nEsX6baR7pU8w/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/eamUu64fO1xB33nEsX6baR7pU8w/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/ejXR/~4/LssFhdUsR9c" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://freehaha.blogspot.com/feeds/5862835145937277518/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=31807993&amp;postID=5862835145937277518" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/31807993/posts/default/5862835145937277518?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/31807993/posts/default/5862835145937277518?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/ejXR/~3/LssFhdUsR9c/vim-annoying-search-highlight.html" title="vim annoying search highlight" /><author><name>Freehaha</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://freehaha.blogspot.com/2011/01/vim-annoying-search-highlight.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEENQHY5eyp7ImA9Wx9QE0U.&quot;"><id>tag:blogger.com,1999:blog-31807993.post-2102684746315354987</id><published>2010-12-27T00:57:00.001+08:00</published><updated>2010-12-27T00:58:11.823+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-12-27T00:58:11.823+08:00</app:edited><title>firefox loading icon when using ajax</title><content type="html">今天在試著用 plurk 的 realtime api (comet)&amp;nbsp; 來接收 new plurk/response，但在用 jquery 的 ajax 時發現 fx tab 的 icon 部份會變成 loading 的動畫，但去看 plurk 的頁面並不會有這種情形，才發現如果直接在 $() 裡面做 ajax 的話，就會一直在讀取的狀態；解決的方法是在 $() 裡面用 setTimeout 再呼叫另一個 function 來起始 ajax 的更新：&lt;br /&gt;
&lt;blockquote&gt;$(function() {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; setTimeout(function (){startUpdate();}, 1); &lt;br /&gt;
} &lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31807993-2102684746315354987?l=freehaha.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/zz_zr_ILYHKXStZF7VJd50YsyhU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/zz_zr_ILYHKXStZF7VJd50YsyhU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/zz_zr_ILYHKXStZF7VJd50YsyhU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/zz_zr_ILYHKXStZF7VJd50YsyhU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/ejXR/~4/OI3S-D5DIn0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://freehaha.blogspot.com/feeds/2102684746315354987/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=31807993&amp;postID=2102684746315354987" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/31807993/posts/default/2102684746315354987?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/31807993/posts/default/2102684746315354987?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/ejXR/~3/OI3S-D5DIn0/firefox-loading-icon-when-using-ajax.html" title="firefox loading icon when using ajax" /><author><name>Freehaha</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://freehaha.blogspot.com/2010/12/firefox-loading-icon-when-using-ajax.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0QAQn4-fSp7ImA9Wx9TFE8.&quot;"><id>tag:blogger.com,1999:blog-31807993.post-1382447029372199010</id><published>2010-11-22T18:22:00.000+08:00</published><updated>2010-11-22T18:22:23.055+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-11-22T18:22:23.055+08:00</app:edited><title>awesome 變成 reparenting WM 了</title><content type="html">半年前嘗試將 awesome 變成 compositing WM, 搞了很久也才能正確畫出各個視窗. 最近重新 pick up 這個計畫, 結果一 git pull 打算開始做的時候才發現 awesome 變成 reparenting wm 了。&lt;br /&gt;
&lt;br /&gt;
所謂的 reparenting 就是在每個 top-level client(window) 的外面加一個 frame window 當作它的 parent, 這個 frame window 則用來畫 border, title bar 等由 wm 控制的元件。原本 awesome 是直接更改 client 的 border 屬性讓&amp;nbsp; X 自己畫 border, 現在就是變成兩層, 直接設定 frame window 的 border.&lt;br /&gt;
&lt;br /&gt;
這樣一改讓很多原本需要直接做在 client 上的事情現在需要改在 frame window 上.... 看來又要花點時間研究了.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31807993-1382447029372199010?l=freehaha.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/bXYDT2Ma1pD2BgQwtfWcCBBDCHI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/bXYDT2Ma1pD2BgQwtfWcCBBDCHI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/bXYDT2Ma1pD2BgQwtfWcCBBDCHI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/bXYDT2Ma1pD2BgQwtfWcCBBDCHI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/ejXR/~4/JEWH5jYwQuk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://freehaha.blogspot.com/feeds/1382447029372199010/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=31807993&amp;postID=1382447029372199010" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/31807993/posts/default/1382447029372199010?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/31807993/posts/default/1382447029372199010?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/ejXR/~3/JEWH5jYwQuk/awesome-reparenting-wm.html" title="awesome 變成 reparenting WM 了" /><author><name>Freehaha</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://freehaha.blogspot.com/2010/11/awesome-reparenting-wm.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEEERng7fip7ImA9Wx5aGEw.&quot;"><id>tag:blogger.com,1999:blog-31807993.post-9067130063560115892</id><published>2010-11-15T17:15:00.003+08:00</published><updated>2010-11-15T17:16:47.606+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-11-15T17:16:47.606+08:00</app:edited><title>awesome wm &amp; naughty &amp; rounded corner</title><content type="html">&lt;span class="fullpost"&gt;awesome 的 naughty 接收了 dbus desktop notification 然後作成一個個 wibox 顯示在螢幕上, naughty 有預設的設定可以讓使用者在 rc.lua 裡面直接改變顏色的變數。不過最近我看到 awful.wibox 裡面有個 function: awful.wibox.rounded_corners 可以讓 wibox 有圓角，試了一下，可以讓 naughty 顯示的 notification 不再是方方正正：&lt;/span&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/__BhX7ZouNiI/TOD2lnpOwhI/AAAAAAAABxc/GKl_ghZLWSI/s1600/naughty-rounded.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/__BhX7ZouNiI/TOD2lnpOwhI/AAAAAAAABxc/GKl_ghZLWSI/s1600/naughty-rounded.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span class="fullpost"&gt;這張是 radius = 10 的圓角, 比較明顯, 通常這種大小的視窗用 5~8 應該比較適合.&lt;/span&gt;&lt;br /&gt;
&lt;span class="fullpost"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="fullpost"&gt;改過的 naughty.lua 在&lt;a href="http://moon.cse.yzu.edu.tw/%7Es961449/naughty.lua"&gt;這裡&lt;/a&gt;可以下載, 在 rc.lua 裡面可以加上這個設定來控制圓角的弧度:&lt;/span&gt;&lt;br /&gt;
&lt;blockquote&gt;&lt;br /&gt;
&lt;span class="fullpost"&gt;naughty.config.presets.normal.rounded_corners = 5&lt;/span&gt;&lt;/blockquote&gt;&lt;span class="fullpost"&gt;或是在使用 naughty.notify 時指定:&lt;/span&gt;&lt;br /&gt;
&lt;blockquote&gt;&lt;span class="fullpost"&gt;naughty.notify({title = "awesome is", text = "AWESOME!!", &lt;span style="color: yellow;"&gt;rounded_corners = 5&lt;/span&gt;})&lt;/span&gt;&lt;/blockquote&gt;不過還是要說... &lt;span style="color: red;"&gt;USE AT YOUR OWN RISK&lt;/span&gt;&lt;br /&gt;
&lt;span class="fullpost"&gt;&lt;span id="goog_602781139"&gt;&lt;/span&gt;&lt;span id="goog_602781140"&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31807993-9067130063560115892?l=freehaha.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/gDALQ8Ns0Ja_dydqlfI2GOJUt3E/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/gDALQ8Ns0Ja_dydqlfI2GOJUt3E/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/gDALQ8Ns0Ja_dydqlfI2GOJUt3E/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/gDALQ8Ns0Ja_dydqlfI2GOJUt3E/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/ejXR/~4/xurZdgF8WXE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://freehaha.blogspot.com/feeds/9067130063560115892/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=31807993&amp;postID=9067130063560115892" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/31807993/posts/default/9067130063560115892?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/31807993/posts/default/9067130063560115892?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/ejXR/~3/xurZdgF8WXE/awesome-wm-naughty-rounded-corner.html" title="awesome wm &amp; naughty &amp; rounded corner" /><author><name>Freehaha</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/__BhX7ZouNiI/TOD2lnpOwhI/AAAAAAAABxc/GKl_ghZLWSI/s72-c/naughty-rounded.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://freehaha.blogspot.com/2010/11/awesome-wm-naughty-rounded-corner.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkMEQH0_cCp7ImA9Wx5aFkk.&quot;"><id>tag:blogger.com,1999:blog-31807993.post-8592470690693558209</id><published>2010-11-13T19:40:00.000+08:00</published><updated>2010-11-13T19:40:01.348+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-11-13T19:40:01.348+08:00</app:edited><title>Awesome WM &amp; irssi</title><content type="html">&lt;span class="fullpost"&gt;換用 awesome 一段時間了, naughty 真的還不錯, 整合了&lt;a href="http://www.galago-project.org/specs/notification/0.9/index.html"&gt;desktop notification&lt;/a&gt; (基本上就是從 DBus 把訊息 handler 接過來)，今天把之前寫的 irssi pingnote script 改寫了一下, 用 naughty 來顯示。&lt;/span&gt;&lt;br /&gt;
&lt;span class="fullpost"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="fullpost"&gt;因為用了 awesome-client, 所以 rc.lua 裡面要有 require("awful.naughty")&lt;/span&gt;&lt;br /&gt;
&lt;span class="fullpost"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="fullpost"&gt;irssi plugin:&lt;/span&gt;&lt;br /&gt;
&lt;span class="fullpost"&gt;https://gist.github.com/675259&lt;/span&gt;&lt;br /&gt;
&lt;span class="fullpost"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="fullpost"&gt;存成 pingnote.pl 以後, 放在 ~/.irssi/scripts 或是 ~/.irssi/scripts/autorun&lt;/span&gt;&lt;br /&gt;
&lt;span class="fullpost"&gt;以後有人 ping 你看起來會像這樣 (右上角) :&lt;/span&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/__BhX7ZouNiI/TN54y1KtmXI/AAAAAAAABxY/M9Nspkg4kwE/s1600/pingnote.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="129" src="http://4.bp.blogspot.com/__BhX7ZouNiI/TN54y1KtmXI/AAAAAAAABxY/M9Nspkg4kwE/s640/pingnote.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="fullpost"&gt;還蠻融入 awesome 本身的 theme, 看起來蠻統一還不錯 (自賣自誇..XD)&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31807993-8592470690693558209?l=freehaha.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/UA_0wHi4plZ88uI7p7z94nhLe9E/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/UA_0wHi4plZ88uI7p7z94nhLe9E/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/UA_0wHi4plZ88uI7p7z94nhLe9E/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/UA_0wHi4plZ88uI7p7z94nhLe9E/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/ejXR/~4/SoCx6ObtL8M" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://freehaha.blogspot.com/feeds/8592470690693558209/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=31807993&amp;postID=8592470690693558209" title="1 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/31807993/posts/default/8592470690693558209?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/31807993/posts/default/8592470690693558209?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/ejXR/~3/SoCx6ObtL8M/awesome-wm-irssi.html" title="Awesome WM &amp; irssi" /><author><name>Freehaha</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/__BhX7ZouNiI/TN54y1KtmXI/AAAAAAAABxY/M9Nspkg4kwE/s72-c/pingnote.jpg" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://freehaha.blogspot.com/2010/11/awesome-wm-irssi.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ck8BQnoycSp7ImA9WxFUFk8.&quot;"><id>tag:blogger.com,1999:blog-31807993.post-3903614869685168182</id><published>2010-05-30T23:39:00.006+08:00</published><updated>2010-06-27T14:40:53.499+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-06-27T14:40:53.499+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="yahoo 字典" /><category scheme="http://www.blogger.com/atom/ns#" term="perl" /><title>新版 ydict !</title><content type="html">最近 yahoo 的字典改版了, 害 4$ 改寫的 ydict 不能用了, 只好重新寫 parser ... &lt;br /&gt;
這邊是我重寫的 ydict, 配色和版面都參考之前的 ydict, 但是 parser 整個重新寫了, 以 MIT licence 釋出:&lt;br /&gt;
&lt;a href="http://moon.cse.yzu.edu.tw/%7Es961449/ydict"&gt;http://moon.cse.yzu.edu.tw/~s961449/ydict&lt;/a&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/__BhX7ZouNiI/TAKG8HxJxEI/AAAAAAAABwA/YeEkBIMdsho/s1600/ydict.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/__BhX7ZouNiI/TAKG8HxJxEI/AAAAAAAABwA/YeEkBIMdsho/s320/ydict.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
歡迎自由抓取修改, 但是使用後果自行負責!&lt;br /&gt;
-------------------------------&lt;br /&gt;
6/23 更新:&lt;br /&gt;
yahoo 字典的音標位置有點變, 造成音標抓不到, 改過來了&lt;br /&gt;
-------------------------------&lt;br /&gt;
6/27 更新:&lt;br /&gt;
改了一下切割英/中 example 的 regexp, 稍微改善一點排版&lt;br /&gt;
&lt;br /&gt;
由於新版的 yahoo 字典的例句中英沒有明顯的分隔, 目前我只能由找到的第一個非英文字來分割中英文，還是有點瑕疵不過還算堪用啦 XD&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31807993-3903614869685168182?l=freehaha.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/9iooiflCPj_a-lqDmeN7TzHdr2s/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/9iooiflCPj_a-lqDmeN7TzHdr2s/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/9iooiflCPj_a-lqDmeN7TzHdr2s/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/9iooiflCPj_a-lqDmeN7TzHdr2s/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/ejXR/~4/9Ec8VRBtsA8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://freehaha.blogspot.com/feeds/3903614869685168182/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=31807993&amp;postID=3903614869685168182" title="3 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/31807993/posts/default/3903614869685168182?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/31807993/posts/default/3903614869685168182?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/ejXR/~3/9Ec8VRBtsA8/new-ydict.html" title="新版 ydict !" /><author><name>Freehaha</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/__BhX7ZouNiI/TAKG8HxJxEI/AAAAAAAABwA/YeEkBIMdsho/s72-c/ydict.png" height="72" width="72" /><thr:total>3</thr:total><feedburner:origLink>http://freehaha.blogspot.com/2010/05/new-ydict.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEAEQXg7eCp7ImA9WxFRF00.&quot;"><id>tag:blogger.com,1999:blog-31807993.post-3940989641529550486</id><published>2010-05-01T16:30:00.001+08:00</published><updated>2010-05-01T16:31:40.600+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-05-01T16:31:40.600+08:00</app:edited><title>perl 的 'exists' in array, hash references</title><content type="html">&lt;span class="fullpost"&gt;今天在寫 perl 發現奇怪的 bug，Glib::Timeout 收到 unhandled exception 就停掉了，看了 error log，這我明明就處裡的好好的阿！&lt;/span&gt;&lt;br /&gt;
&lt;span class="fullpost"&gt;簡化過的問題如下：&lt;/span&gt;&lt;br /&gt;
&lt;blockquote&gt;&lt;span class="fullpost"&gt;#!/usr/bin/perl&lt;br /&gt;
use strict;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
sub retundef {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; #something wrong&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; return undef;&lt;br /&gt;
}&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
my $ret = &amp;amp;retundef();&lt;br /&gt;
if(exists $ret-&amp;gt;{dummy}) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; print "gasp!?\n";&lt;br /&gt;
}&amp;nbsp;&amp;nbsp; &lt;br /&gt;
exit 1 unless $ret;&lt;br /&gt;
if(@{$ret-&amp;gt;{list}}) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; local $, = ", ";&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; print @{$ret-&amp;gt;{list}};&lt;/span&gt;&lt;br /&gt;
} &lt;br /&gt;
exit 0;&lt;/blockquote&gt;看起來很簡單的 code 卻暗藏玄機，居然 return 0; why??? 我左看右看，才想到可能是 exists 的問題。perldoc 的 exists 是這樣寫的：&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;Although the mostly deeply nested array or hash will not spring into existence just because its existence was tested, any intervening ones  will. .... This happens anywhere the arrow operator is used...&lt;/blockquote&gt;原來在 $ret-&amp;gt;{dummy} 以後, $ret 就自動變成 hash reference 了，雖然 $ret-&amp;gt;{dummy} 還是不存在，但是卻改變了 $ret。&lt;br /&gt;
------------&lt;br /&gt;
不得不說，喜歡 C 不是沒有原因的... perl 寫起來方便(光是 hash table 就大勝) 但是對於一些 reference，包括 GC 的處理上的確不太透明；看來我要學得東西還很多...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31807993-3940989641529550486?l=freehaha.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/YluL75WXrVEfPsxPRgSyFXoSSWg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/YluL75WXrVEfPsxPRgSyFXoSSWg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/YluL75WXrVEfPsxPRgSyFXoSSWg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/YluL75WXrVEfPsxPRgSyFXoSSWg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/ejXR/~4/fsKvsGj6RR4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://freehaha.blogspot.com/feeds/3940989641529550486/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=31807993&amp;postID=3940989641529550486" title="4 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/31807993/posts/default/3940989641529550486?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/31807993/posts/default/3940989641529550486?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/ejXR/~3/fsKvsGj6RR4/perl-exists-in-array-hash-references.html" title="perl 的 'exists' in array, hash references" /><author><name>Freehaha</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>4</thr:total><feedburner:origLink>http://freehaha.blogspot.com/2010/05/perl-exists-in-array-hash-references.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkQHRHkzfip7ImA9WxFRFUo.&quot;"><id>tag:blogger.com,1999:blog-31807993.post-4192848553215335245</id><published>2010-04-30T04:52:00.000+08:00</published><updated>2010-04-30T04:52:15.786+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-04-30T04:52:15.786+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="encoding" /><category scheme="http://www.blogger.com/atom/ns#" term="threads" /><category scheme="http://www.blogger.com/atom/ns#" term="perl" /><title>perl threads encoding</title><content type="html">&lt;a href="http://freehaha.blogspot.com/2010/04/perl-utf-8-sqlite-issue.html"&gt;上一篇&lt;/a&gt; 講到了讓 DBI::SQLite 自動為 string 加上 utf-8 flag，其實是因為我最近在寫 gtk 的時候需要用到額外的 thread，但是 encoding (perl 內建的 package) 不是 thread-safe 而且只要一用，threading 就一定以 segmentation fault 收場。&lt;br /&gt;
我目前是沒有找到什麼解法，但是如果是使用不同編碼來寫 perl 那可能只能暫時用 package Encode 的 decode 或 encode 來把每個字串包起來吧 Orz. 天阿，好險我都用 utf-8&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31807993-4192848553215335245?l=freehaha.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/KIEsUR1-AIu6Hl4Vg7mP4MAR0k8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/KIEsUR1-AIu6Hl4Vg7mP4MAR0k8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/KIEsUR1-AIu6Hl4Vg7mP4MAR0k8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/KIEsUR1-AIu6Hl4Vg7mP4MAR0k8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/ejXR/~4/VM02_wiaGTY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://freehaha.blogspot.com/feeds/4192848553215335245/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=31807993&amp;postID=4192848553215335245" title="1 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/31807993/posts/default/4192848553215335245?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/31807993/posts/default/4192848553215335245?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/ejXR/~3/VM02_wiaGTY/perl-threads-encoding.html" title="perl threads encoding" /><author><name>Freehaha</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total><feedburner:origLink>http://freehaha.blogspot.com/2010/04/perl-threads-encoding.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CU8BQXc5eCp7ImA9WxFRFUo.&quot;"><id>tag:blogger.com,1999:blog-31807993.post-8599514891519689717</id><published>2010-04-30T04:44:00.000+08:00</published><updated>2010-04-30T04:44:10.920+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-04-30T04:44:10.920+08:00</app:edited><title>perl &amp; utf-8 (SQLite issue)</title><content type="html">&lt;span class="fullpost"&gt;事實上自從 perl 5.8.0 以後好像已經全面使用 unicode 了，根據我的了解 perl-gtk2 內部也都使用 utf-8，但是說也奇怪我的 gtk label 就是顯示不了中文，使用者輸入的中文卻又沒問題，找了許久才發現，perl 在 string 上會有一個 utf-8 flag，用來判斷這個 string 是不是使用 utf-8，不是的話 gtk2 的 module 會再做一次轉換，由於 db 讀出來的 string 都沒有設定，中文就爛掉了。&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="fullpost"&gt;但是為什麼我 db 裡面明明存 utf-8 讀出來卻不是呢? DBI::SQLite 說道..&lt;/span&gt;&lt;br /&gt;
&lt;blockquote&gt;If the attribute &lt;code&gt;$dbh-&amp;gt;{sqlite_unicode}&lt;/code&gt; is set, strings  coming from the database and passed to the collation function will be  properly tagged with the &lt;span highlight="Search"&gt;utf8&lt;/span&gt; flag; but  this only works if the &lt;code&gt;sqlite_unicode&lt;/code&gt; attribute is set &lt;b&gt;before&lt;/b&gt;  the first call to a perl collation sequence . The recommended way to  activate unicode is to set the parameter at connection time :&lt;/blockquote&gt;所以只要確定 db 裡面是存著 utf-8 的資料，只要再連線時設定好 sqlite_unicode，sqlite 的 DBI 會幫你把 utf-8 flag turn on：&lt;br /&gt;
&lt;blockquote&gt;&lt;pre&gt;my $dbh = DBI-&amp;gt;connect(
      "dbi:SQLite:dbname=foo", "", "",
      {
          RaiseError     =&amp;gt; 1,
          sqlite_unicode =&amp;gt; 1,
      }
  );&lt;/pre&gt;&lt;/blockquote&gt;當然，總是有一些比較&lt;strike&gt;髒&lt;/strike&gt;不一樣的方法，用 Encode::_utf8_on 可以直接把 flag turn on，可以在有用到中文的地方設定，但這樣不但瑣碎可能忘記，而且 gtk module 還會嘗試將其他不是 utf-8 的 string 再轉換一次，所以還是建議讓 DBI 把全部的 string set utf-8 flag。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31807993-8599514891519689717?l=freehaha.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/RhdyuO15tFgNbL_nS6ugs1lYVGw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/RhdyuO15tFgNbL_nS6ugs1lYVGw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/RhdyuO15tFgNbL_nS6ugs1lYVGw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/RhdyuO15tFgNbL_nS6ugs1lYVGw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/ejXR/~4/pZ2tceqe7sA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://freehaha.blogspot.com/feeds/8599514891519689717/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=31807993&amp;postID=8599514891519689717" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/31807993/posts/default/8599514891519689717?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/31807993/posts/default/8599514891519689717?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/ejXR/~3/pZ2tceqe7sA/perl-utf-8-sqlite-issue.html" title="perl &amp; utf-8 (SQLite issue)" /><author><name>Freehaha</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://freehaha.blogspot.com/2010/04/perl-utf-8-sqlite-issue.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0MDQng4eSp7ImA9WxBaGUw.&quot;"><id>tag:blogger.com,1999:blog-31807993.post-3163914250198743582</id><published>2010-03-29T22:45:00.003+08:00</published><updated>2010-03-30T10:17:53.631+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-30T10:17:53.631+08:00</app:edited><title>latex 半自動 WYSIWYM</title><content type="html">之前寫過的 &lt;a href="http://freehaha.blogspot.com/2010/03/inotify-kernel.html"&gt;iwatch&lt;/a&gt; 可以讓我寫 latex 的時候不用一直手動 make，然後只要編譯完用 foxit 顯示文件就可以了，但是這樣的效果差強人意，因為 foxit 沒辦法自動 reload，我只好每次 make 完就 kill 然後重開一個 foxit，心血來潮之下找到了 xpdf，他可以開一個 remote xpdf 像是一個 server ，然後 xpdf -remote preview -reload 就可以讓這個remote server 重新讀取 pdf!!&lt;br /&gt;
這樣的組合真是太完美了，搭配 iwatch，可以用我寫的 script:&lt;br /&gt;
&lt;blockquote&gt;#!/bin/bash&lt;br /&gt;
REMOTE=preview&lt;br /&gt;
TEX=sample.tex&lt;br /&gt;
PDF=$(basename $TEX .tex).pdf&lt;br /&gt;
xpdf -remote $REMOTE $PDF &amp;amp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
id=$!&lt;br /&gt;
while ./iwatch -e modify $TEX&lt;br /&gt;
do&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; make&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; xpdf -remote $REMOTE -reload &amp;amp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; id=$!&lt;br /&gt;
done&lt;/blockquote&gt;&lt;br /&gt;
這樣每次儲存以後，會自動編譯，然後在現有 xpdf 更新畫面！在我的桌面上執行起來像這樣：下面是 vim 上面是 xpdf，因為用 xmonad 剛好可以分成上下來顯示。 &lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/__BhX7ZouNiI/S7DNnTpUPPI/AAAAAAAABug/GHZS_O5Em7Y/s1600/scrshot.jpg" imageanchor="1"&gt;&lt;img border="0" height="256" src="http://4.bp.blogspot.com/__BhX7ZouNiI/S7DNnTpUPPI/AAAAAAAABug/GHZS_O5Em7Y/s320/scrshot.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31807993-3163914250198743582?l=freehaha.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/uRwd-r1H1CpgO_TWNTKb2a4NCkg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/uRwd-r1H1CpgO_TWNTKb2a4NCkg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/uRwd-r1H1CpgO_TWNTKb2a4NCkg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/uRwd-r1H1CpgO_TWNTKb2a4NCkg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/ejXR/~4/XdmszM-990g" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://freehaha.blogspot.com/feeds/3163914250198743582/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=31807993&amp;postID=3163914250198743582" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/31807993/posts/default/3163914250198743582?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/31807993/posts/default/3163914250198743582?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/ejXR/~3/XdmszM-990g/latex-wysiwim.html" title="latex 半自動 WYSIWYM" /><author><name>Freehaha</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/__BhX7ZouNiI/S7DNnTpUPPI/AAAAAAAABug/GHZS_O5Em7Y/s72-c/scrshot.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://freehaha.blogspot.com/2010/03/latex-wysiwim.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkEHRXYzeSp7ImA9WxBaGEs.&quot;"><id>tag:blogger.com,1999:blog-31807993.post-8991421855267170834</id><published>2010-03-23T22:51:00.003+08:00</published><updated>2010-03-29T21:17:14.881+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-29T21:17:14.881+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="git" /><category scheme="http://www.blogger.com/atom/ns#" term="diff" /><title>git diff 自訂 hunk header (function line, function name...)</title><content type="html">GNU diff 有一個參數是 -F RE,&amp;nbsp; --show-function-line=RE 可以在 diff 的時候用來顯示內容屬於哪個區塊，提供除了檔案行數以外的位置辨認。&lt;br /&gt;
對於 C,&amp;nbsp; C++, HTML, java.... 一些常見的語言有內建的辨識語法來抓出 function name，但如果是自訂格式的檔案的話就比需要自己寫，詳情可以參考 man gitattribues，這邊大概紀錄一下作法..&lt;br /&gt;
&lt;br /&gt;
先設定指定的類別用的語法, ~/.gitconfig :&lt;br /&gt;
&lt;blockquote&gt;[diff "are"]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; xfuncname = "^#[0-9]+$"&lt;/blockquote&gt;然後在 project 的根目錄或是有放那些檔案的目錄下加一個 .gitattributes (跟 .gitignore 一樣, 有與上層繼承的關係)，裡面寫:&lt;br /&gt;
&lt;blockquote&gt;*.are diff=are&lt;/blockquote&gt;這樣就可以了, git diff 的一個區段結果會長這樣：&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;@@ -6,4 +6,4 @@ &lt;span style="background-color: red;"&gt;#103&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;3&lt;br /&gt;
&amp;nbsp;4&lt;br /&gt;
&amp;nbsp;5&lt;br /&gt;
-6&lt;br /&gt;
+7&lt;/blockquote&gt;會找出最近一個符合的字串放在行數後面，這樣如果只看 diff 的話也會比較清楚這個 patch 到底做了什麼。不過要記得，如果 match 到的字串有在 diff 的上下文(context)出現，就不會顯示在 header，所以 header 上的提示不一定是正確的（當然 context number 可以用 -U 設定，不過如果 &amp;gt; 0 就是有可能有這種情況）。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31807993-8991421855267170834?l=freehaha.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ONPI3UdmaM3m6k32DJxxkv62tIU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ONPI3UdmaM3m6k32DJxxkv62tIU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ONPI3UdmaM3m6k32DJxxkv62tIU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ONPI3UdmaM3m6k32DJxxkv62tIU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/ejXR/~4/gMB8Kuw-uK4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://freehaha.blogspot.com/feeds/8991421855267170834/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=31807993&amp;postID=8991421855267170834" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/31807993/posts/default/8991421855267170834?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/31807993/posts/default/8991421855267170834?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/ejXR/~3/gMB8Kuw-uK4/git-diff-hunk-header-function-line.html" title="git diff 自訂 hunk header (function line, function name...)" /><author><name>Freehaha</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://freehaha.blogspot.com/2010/03/git-diff-hunk-header-function-line.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A08NQXg_eSp7ImA9WxBbFEU.&quot;"><id>tag:blogger.com,1999:blog-31807993.post-4481312006799870936</id><published>2010-03-13T22:18:00.000+08:00</published><updated>2010-03-13T22:18:10.641+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-13T22:18:10.641+08:00</app:edited><title>inotify - 讓 kernel 幫你監控檔案</title><content type="html">自從 Linux Kernel 2.6.13，linux 就提供了 inotify 的 API 讓使用者以 event 的方式監控檔案。這顯然比傳統 busy checking 的方式有效率多了，除了用的是 kernel space 的 memory 以外幾乎沒有理由不用這麼好用的機制了吧！&lt;br /&gt;
inotify 提供監控的事件可以在 manual 裡找到 (man inotify) 在這邊就不贅述。使用上其實也很簡單，首先呼叫 inotify_init() 取得一個 file descriptor，將來只要讀這個 fd (block/non-block) 就可以取得 event，可以視為一個 event queue，然後把想要監控的檔案、訊息透過 inotify_add_watch 就可以加入監控的列表。接下來只要讀取剛剛取得的 fd 就可以了。需要注意的地方是，如果監控的目標是 directory，那 read 用的 buffer 以及 size 必須包含檔案名稱的大小然後一起 read，不然會有 EINVAL 的錯誤。&lt;br /&gt;
&lt;br /&gt;
以前就聽過看過這東西，這次會翻出來是因為我正在用 latex 寫一篇文章但每次都要 compile/make 實在很麻煩（雖然說 vim 可以設 key binding 來直接 make 可是還是懶了點）於是就寫了一個等某個 inotify event 的小程式，有一個叫做 inotify-tools 的工具包裡面有 inotifywait 但是他只能針對某個存在的 file 進行監控，而 vim 在寫檔時會移動/刪除原本的檔案，造成監控中斷，所以我只好另外寫了這個 tool 對於目前的 WD 內特定的 filename 的某些特定 event 做等待。也就是說我監控的對象是這個 directory 但是我只 care 某個特定檔案發生的某些 event。&lt;br /&gt;
&lt;br /&gt;
以下是我寫的 iwatch, 以 MIT License 釋出。&lt;br /&gt;
&lt;a href="http://moon.cse.yzu.edu.tw/%7Es961449/iwatch.c"&gt;http://moon.cse.yzu.edu.tw/~s961449/iwatch.c&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
應用在我上面提到的自動編譯 latex, 可以用這個&amp;nbsp; bash script:&lt;br /&gt;
&lt;blockquote&gt;#!/bin/bash&lt;br /&gt;
id=0&lt;br /&gt;
while iwatch -e modify proposal.tex&lt;br /&gt;
do&lt;br /&gt;
kill -KILL $id&lt;br /&gt;
make&lt;br /&gt;
acroread proposal.pdf &amp;amp;&lt;br /&gt;
id=$!&lt;br /&gt;
done &lt;/blockquote&gt;執行這個 script 會監控目標 .tex 發現更變以後自動重新 make, 然後打開 pdf viewer，這邊是用 acroread，也可以用 foxit (比較快)。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31807993-4481312006799870936?l=freehaha.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/JABYeI5O0Ip5zzsWkotUv1F_erA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/JABYeI5O0Ip5zzsWkotUv1F_erA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/JABYeI5O0Ip5zzsWkotUv1F_erA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/JABYeI5O0Ip5zzsWkotUv1F_erA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/ejXR/~4/jCTIECwnyqc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://freehaha.blogspot.com/feeds/4481312006799870936/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=31807993&amp;postID=4481312006799870936" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/31807993/posts/default/4481312006799870936?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/31807993/posts/default/4481312006799870936?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/ejXR/~3/jCTIECwnyqc/inotify-kernel.html" title="inotify - 讓 kernel 幫你監控檔案" /><author><name>Freehaha</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://freehaha.blogspot.com/2010/03/inotify-kernel.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0QMSXwycSp7ImA9WxBSEEs.&quot;"><id>tag:blogger.com,1999:blog-31807993.post-8615036882390130402</id><published>2009-12-17T18:42:00.002+08:00</published><updated>2009-12-17T22:49:48.299+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-17T22:49:48.299+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="vim" /><title>vim plugin: autocomplpop (acp)</title><content type="html">vim 內建的 omni c complete function 其實算是堪用，但不方便的就是每次都要自己按 ^P, ^N 或是 ^X^O 等組合才會跳出來讓你選。這兩天在 &lt;a href="http://groups.google.com/group/vim-taiwan"&gt;Vim taiwan&lt;/a&gt; 的 mailing list 看到 acp 這個 plugin，試用了以後愛不釋手，安裝方法跟其他vim plugin 沒兩樣：&lt;br /&gt;
到這邊下載最新版的 autocomplpop: &lt;a href="http://www.vim.org/scripts/script.php?script_id=1879"&gt;http://www.vim.org/scripts/script.php?script_id=1879&lt;/a&gt;&lt;br /&gt;
然後解壓縮在 ~/.vim 就可以了：&lt;br /&gt;
&lt;blockquote&gt;unzip -d ~/.vim vim-autocomplpop.zip&lt;br /&gt;
&lt;/blockquote&gt;這樣就算是安裝好了，開 vim 也會自動執行。&lt;br /&gt;
autocomplpop 簡單的說就是你每輸入一個超過長度的word(預設2個字元) 他就開始用 keyword/omni 找可能的補全單字然後顯示在pmenu，多說無益，試過才知道！&lt;br /&gt;
&lt;br /&gt;
不過剛裝好的時候有點不習慣，因為他預設的搜尋範圍不包括 include 近來的檔案，所以以前慣用的 ^N, ^P (或是 ^X^i) 就只能用 ^X^I 呼叫出來，要讓 acp 也搜尋include 的檔案的話只要在 ~/.vimrc 加入下面的設定：(vim 預設 &lt;span style="color: #b6d7a8;"&gt;.,w,b,u,t,i&lt;/span&gt; ; acp 預設 &lt;span style="color: #d9ead3;"&gt;.,w,b,k&lt;/span&gt;)&lt;br /&gt;
&lt;blockquote&gt;let g:acp_completeOption = '.,w,b,u,t,i,k'&lt;br /&gt;
&lt;/blockquote&gt;每個選項的功用可以參考 :help complete&lt;br /&gt;
這樣邊打字就也會邊出現 api 的 auto complete popup，挺實用的！&lt;br /&gt;
------------------&lt;br /&gt;
另外這個也是在 mailing list 上看到的(其實是包含在acp 的help file裡，只是大家沒注意到)：&lt;br /&gt;
acp 也提供 snipMate 一個接口，讓 snipMate 的補全也變成 menu 的樣式讓你選，啟動的方法只要在 ~/.vim/plugin/snipMate.vim 加入&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;&amp;nbsp; fun! GetSnipsInCurrentScope()&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; let snips = {}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; for scope in [bufnr('%')] + split(&amp;amp;ft, '\.') + ['_']&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; call extend(snips, get(s:snippets, scope, {}), 'keep')&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; call extend(snips, get(s:multi_snips, scope, {}), 'keep')&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; endfor&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; return snips&lt;br /&gt;
&amp;nbsp; endf&lt;br /&gt;
&lt;/blockquote&gt;然後在 ~/.vimrc： &lt;br /&gt;
&lt;blockquote&gt;let g:acp_behaviorSnipmateLength=1&lt;br /&gt;
&lt;/blockquote&gt;這樣輸入大寫字母的時候他就會去找 snipMate 的 template 看有沒有符合的項目並整理到menu 顯示，有興趣的人可以試看看。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31807993-8615036882390130402?l=freehaha.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ANRU9NkpkQxV3THl7Ty7MnhJ__I/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ANRU9NkpkQxV3THl7Ty7MnhJ__I/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ANRU9NkpkQxV3THl7Ty7MnhJ__I/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ANRU9NkpkQxV3THl7Ty7MnhJ__I/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/ejXR/~4/cFe9USELfbI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://freehaha.blogspot.com/feeds/8615036882390130402/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=31807993&amp;postID=8615036882390130402" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/31807993/posts/default/8615036882390130402?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/31807993/posts/default/8615036882390130402?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/ejXR/~3/cFe9USELfbI/vim-plugin-autocomplpop-acp.html" title="vim plugin: autocomplpop (acp)" /><author><name>Freehaha</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://freehaha.blogspot.com/2009/12/vim-plugin-autocomplpop-acp.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUIBRnY8eCp7ImA9WxBTGUo.&quot;"><id>tag:blogger.com,1999:blog-31807993.post-3361803421418644485</id><published>2009-12-16T22:32:00.001+08:00</published><updated>2009-12-16T23:32:37.870+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-16T23:32:37.870+08:00</app:edited><title>load balance in difference internet interfaces</title><content type="html">如果你有兩張網卡都是連上外部網路的話，可以透過 ip route 來做 load balance，方法很簡單，基本上就是把 default route 改成 multipath route。當然在這之前需要先把 ip route 設好讓一個 IP (TCP/UDP)連線只經由該連線存在的 interface 送出。&lt;br /&gt;
&lt;br /&gt;
當然這只是很簡單的提供 load balance 的機制.. 有時候並不是那麼有用，不過將就點用吧 XD &lt;br /&gt;
&lt;br /&gt;
其實設定上也很簡單，network split 的部份我就不再重複紀錄了，跟我之前寫過的&lt;a href="http://freehaha.blogspot.com/2009/09/ubuntu-c270-setup.html"&gt;這篇&lt;/a&gt; 差不多。&lt;br /&gt;
balance 的部份就是把default route 分成兩個 channel 依照 weight 決定連線走哪一條。步驟大概是這樣：&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;ip route del default #把目前 defualt route 刪掉&lt;br /&gt;
ip route add default scope global nexthop via [gw1] dev [if1] weight [weight1] \&lt;br /&gt;
nexthop via [gw2] dev [if2] weight [weight2]&lt;br /&gt;
&lt;/blockquote&gt;假如我要從兩個 ISP 出去, 一個ip 是 A 另一個 B，分別透過 eth0 跟 eth1 連線，而 A 的連線速度比較快，可能是 B 的兩倍，那麼我可以這樣設定：(gateway 可以用 route -n 看)&lt;br /&gt;
&lt;blockquote&gt;ip route del default&lt;br /&gt;
ip route add default scope global nexthop via gw1 dev eth0 weight 2 \&lt;br /&gt;
nexthop via gw2 dev eth1 weight 1&lt;br /&gt;
&lt;/blockquote&gt;&lt;br /&gt;
這樣就設定好了，如果看 ip route 的話會看到下面這樣的結果&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;default &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; nexthop via gw1&amp;nbsp; dev eth0 weight 2&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; nexthop via gw2&amp;nbsp; dev eth0 weight 1&lt;br /&gt;
&lt;/blockquote&gt;觀察流量的話也可以大略用 iptraf 看一下各個network interface 上面的流量。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31807993-3361803421418644485?l=freehaha.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/d79CKUPMhJq8VGiJJmhDA8knoic/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/d79CKUPMhJq8VGiJJmhDA8knoic/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/d79CKUPMhJq8VGiJJmhDA8knoic/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/d79CKUPMhJq8VGiJJmhDA8knoic/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/ejXR/~4/PKoI-BoNjkg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://freehaha.blogspot.com/feeds/3361803421418644485/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=31807993&amp;postID=3361803421418644485" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/31807993/posts/default/3361803421418644485?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/31807993/posts/default/3361803421418644485?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/ejXR/~3/PKoI-BoNjkg/load-balance-in-difference-internet.html" title="load balance in difference internet interfaces" /><author><name>Freehaha</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://freehaha.blogspot.com/2009/12/load-balance-in-difference-internet.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0IFRn4_cCp7ImA9WxBTEU0.&quot;"><id>tag:blogger.com,1999:blog-31807993.post-214513991469365423</id><published>2009-12-06T17:19:00.001+08:00</published><updated>2009-12-06T21:18:37.048+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-06T21:18:37.048+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="font" /><category scheme="http://www.blogger.com/atom/ns#" term="xorg" /><title>Monaco font (pixelsize &lt;= 14) &amp; hinting</title><content type="html">一直覺得很奇怪，我的Debian 上面的monospace 字體跟 Ubuntu 上面的一樣都用 Monaco 但是當看到 terminal 中 bold （高亮）的字體時，Debian 上有些英文字就會縮水：&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/__BhX7ZouNiI/SxtzoY__b_I/AAAAAAAABq8/-ZqwNdoM_9w/s1600-h/with-hint-13.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1px; margin-right: 1px;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/__BhX7ZouNiI/SxtzoY__b_I/AAAAAAAABq8/-ZqwNdoM_9w/s320/with-hint-13.png" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
但是 Ubuntu 上的不會，今天研究了一下發現原來不是字體的問題，是font hinting 的問題，把小字的hinting 關掉的話就不會這樣了（Ubuntu 上預設就有把字體較小的自行的font hinting, antialias 關掉）。怎麼關呢？還蠻簡單的，如果你有root 權限可以直接在 /etc/fonts/conf.avail 加入新的 font config file，如果沒有，也可以編輯 ~/.fonts.conf （不存在就自創）。&lt;br /&gt;
目標是要把字型size 較小時，font hinting 的功能關掉，只要在&lt;fontconfig&gt;...&lt;/fontconfig&gt;裡面加入下面這個設定就可以了：&lt;br /&gt;
&lt;blockquote&gt;&amp;lt;match target="pattern"&amp;gt;&lt;br /&gt;
&amp;lt;test compare="less_eq" name="pixelsize" qual="any"&amp;gt;&lt;br /&gt;
&amp;lt;int&amp;gt;14&amp;lt;/int&amp;gt;&lt;br /&gt;
&amp;lt;/test&amp;gt;&lt;br /&gt;
&amp;lt;edit mode="assign" name="hinting"&amp;gt;&lt;br /&gt;
&amp;lt;bool&amp;gt;false&amp;lt;/bool&amp;gt;&lt;br /&gt;
&amp;lt;/edit&amp;gt;&lt;br /&gt;
&amp;lt;/match&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/blockquote&gt;應該還蠻容易懂的，就是找到 pixelsize &amp;lt;= 14 的設定，然後把hinting 設成false。換了以後效果應該馬上會看到(重新開一個terminal) 如果沒有的話重新登入應該也就可以了。附上一張關掉hinting 後正常的：&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/__BhX7ZouNiI/Sxt2L_SvKDI/AAAAAAAABrE/WftAhr2egg8/s1600-h/without-hint-13.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1px; margin-right: 1px;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/__BhX7ZouNiI/Sxt2L_SvKDI/AAAAAAAABrE/WftAhr2egg8/s320/without-hint-13.png" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
順便看一下在字體大一點的時候，hinting 有無的差別：&lt;br /&gt;
pixelsize=15, with hinting:&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/__BhX7ZouNiI/Sxt2RPfSu9I/AAAAAAAABrM/GqxPEP1r4Dk/s1600-h/with-hint-15.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1px; margin-right: 1px;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/__BhX7ZouNiI/Sxt2RPfSu9I/AAAAAAAABrM/GqxPEP1r4Dk/s320/with-hint-15.png" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
pixelsize=15, without hinting:&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/__BhX7ZouNiI/Sxt2TKQ78TI/AAAAAAAABrU/OZg4yAVYq2k/s1600-h/without-hint-15.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1px; margin-right: 1px;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/__BhX7ZouNiI/Sxt2TKQ78TI/AAAAAAAABrU/OZg4yAVYq2k/s320/without-hint-15.png" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
我想hinting 主要是要讓字看得清晰一點（尖銳化之類的），從上面這兩張就可以看出差蠻多的，但是我個人這樣看起來好像也沒有特別喜歡哪一種，看個人吧！總而言之，字體小的時候還是需要關掉hinting 才比較正常。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31807993-214513991469365423?l=freehaha.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/nF_GGkH78qkwda_56aD_7D1eY-c/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/nF_GGkH78qkwda_56aD_7D1eY-c/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/nF_GGkH78qkwda_56aD_7D1eY-c/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/nF_GGkH78qkwda_56aD_7D1eY-c/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/ejXR/~4/M5z6BdmddNA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://freehaha.blogspot.com/feeds/214513991469365423/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=31807993&amp;postID=214513991469365423" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/31807993/posts/default/214513991469365423?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/31807993/posts/default/214513991469365423?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/ejXR/~3/M5z6BdmddNA/monaco-font-pixelsize-14-hinting.html" title="Monaco font (pixelsize &lt;= 14) &amp; hinting" /><author><name>Freehaha</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/__BhX7ZouNiI/SxtzoY__b_I/AAAAAAAABq8/-ZqwNdoM_9w/s72-c/with-hint-13.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://freehaha.blogspot.com/2009/12/monaco-font-pixelsize-14-hinting.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkYGQHk-eCp7ImA9WxNaFUk.&quot;"><id>tag:blogger.com,1999:blog-31807993.post-7167750851713687242</id><published>2009-11-30T09:22:00.000+08:00</published><updated>2009-11-30T09:22:01.750+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-30T09:22:01.750+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="grub" /><category scheme="http://www.blogger.com/atom/ns#" term="debian" /><title>踩到grub 地雷</title><content type="html">前幾天在更新debian (sid) 的時候有看到grub 的更新，每次看到這個就心有餘悸，好像更新grub 都沒什麼好事會發生，但我還是把 /boot remount 為 rw 給他更新下去了。&lt;br /&gt;
昨天重開機才發現這果然是bad idea，grub 整個壞掉，出現的訊息是：&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;Error: the symbol 'grub_gettext' not found&lt;br /&gt;
&lt;/blockquote&gt;好險我都還有留安裝用的 usb flash，啟動 rescue mode 以後到他要你選擇 root partition 時，切到tty2 (Alt+F2)，把系統mount 起來並chroot 進去：&lt;br /&gt;
&lt;blockquote&gt;mkdir /tmp/mnt&lt;br /&gt;
mount /dev/sda2 /tmp/mnt&lt;br /&gt;
mount --bind /dev /tmp/mnt&lt;br /&gt;
chroot /tmp/mnt&lt;br /&gt;
&lt;/blockquote&gt;接下來就相當於用原本的系統開機了。重新安裝 grub ：&lt;br /&gt;
&lt;blockquote&gt;/usr/sbin/grub-install /dev/sda&lt;br /&gt;
&lt;/blockquote&gt;&amp;nbsp;這樣grub 應該就裝好了。 但是我 reboot 後發現還是不行，他會說 "you need to load kernel first" 也就是沒有找到 kernel image 的意思。問題在於我的 /boot 是分開一個 ext3 的 partition，所以 grub 自動安裝的時候，root 會選錯。這裡只要把 /boot/grub/grub.cfg 裡面的&lt;br /&gt;
/boot/initrd.img-2.6.xxxx &lt;br /&gt;
和&lt;br /&gt;
/boot/vmlinuz-2.6.xxxx&lt;br /&gt;
&lt;br /&gt;
改為&lt;br /&gt;
&lt;blockquote&gt;/initrd.img-2.6.xxx&lt;br /&gt;
/vmlinuz-2.6.xx&lt;br /&gt;
&lt;/blockquote&gt;就可以用正確的路徑 boot 了, hooray!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31807993-7167750851713687242?l=freehaha.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ZTiTozhOi9FNCI9Xr51YnYea_8U/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ZTiTozhOi9FNCI9Xr51YnYea_8U/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ZTiTozhOi9FNCI9Xr51YnYea_8U/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ZTiTozhOi9FNCI9Xr51YnYea_8U/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/ejXR/~4/z-S_cRQ5V9A" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://freehaha.blogspot.com/feeds/7167750851713687242/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=31807993&amp;postID=7167750851713687242" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/31807993/posts/default/7167750851713687242?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/31807993/posts/default/7167750851713687242?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/ejXR/~3/z-S_cRQ5V9A/grub.html" title="踩到grub 地雷" /><author><name>Freehaha</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://freehaha.blogspot.com/2009/11/grub.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ck4GSHo8fCp7ImA9WxNaFE0.&quot;"><id>tag:blogger.com,1999:blog-31807993.post-4351598947525687170</id><published>2009-11-28T17:35:00.000+08:00</published><updated>2009-11-28T17:35:29.474+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-28T17:35:29.474+08:00</app:edited><title>userChrome.css of firefox</title><content type="html">我相信喜歡用 Firefox 的人大都是因為 fx 的擴充性很高，雖然說速度來說（在我的電腦） google chrome （or chromium) 的確跑的比較快，但是fx 帶來的彈性遠高於 chrome （至少目前是，不過 chrome 也才剛開始幾年，以後難說）。&lt;br /&gt;
&lt;br /&gt;
目前 firefox 是建立在 xulrunner 上的，而 xulrunner 把 fx 的介面用類似網頁的方法 render 出來，也就是說，我們可以把 fx 本身看成一個可以瀏覽網頁的網頁?! （甚至用 DOM inspector 也可以看到 UI 的 properties），也因為類似這種機制，用來做網頁排版的 css&amp;nbsp; 也可以套用在 fx 的 UI 上面，這也是 fx theme 的作法（一堆css）。&lt;br /&gt;
&lt;br /&gt;
fx 提供了 userChrome.css 讓每個 user 可以自己設定一些簡單的 UI 排版，比如說我我前一陣子想在 tab 上加上編號，這樣比較方便看自己要跳到哪個 tab，這個功能用 userChrome.css 就可以達到： &lt;br /&gt;
&lt;a href="http://www.blogger.com/%20http://gist.github.com/244455"&gt;http://gist.github.com/244455&lt;/a&gt;&lt;br /&gt;
把這個加入到你的 userChrome.css 裡面就可以了 ( ~/.mozilla/firefox/xxxx.default/userChrome.css ) &lt;br /&gt;
這個方法本來是在 &lt;a href="http://v1.boxofchocolates.ca/"&gt;Box of Chocolates&lt;/a&gt; 找到的可是現在找無了，好險當初有留下來。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
這只是一個小範例，今天在找相關資料時還找到這個把 fx 外觀改成像chrome 一樣的：&lt;br /&gt;
&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/10091"&gt;https://addons.mozilla.org/en-US/firefox/addon/10091&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
這讓我聯想到遊戲公司 Blizzard Entertainment 當年成功的 Starcraft 跟現在還是很紅的 Warcraft3，開放一些空間讓玩家自己產生地圖、設計遊戲內容，甚至可以加入自制的3D model，讓遊戲有無限的發展空間。我想這也是為什麼我喜歡 fx, 而且也是為什麼我喜歡 Linux。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31807993-4351598947525687170?l=freehaha.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/taGAGhghCeF8MWDuIeOOcYOgMXE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/taGAGhghCeF8MWDuIeOOcYOgMXE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/taGAGhghCeF8MWDuIeOOcYOgMXE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/taGAGhghCeF8MWDuIeOOcYOgMXE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/ejXR/~4/9L_j5MKvhpE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://freehaha.blogspot.com/feeds/4351598947525687170/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=31807993&amp;postID=4351598947525687170" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/31807993/posts/default/4351598947525687170?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/31807993/posts/default/4351598947525687170?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/ejXR/~3/9L_j5MKvhpE/userchromecss-of-firefox.html" title="userChrome.css of firefox" /><author><name>Freehaha</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://freehaha.blogspot.com/2009/11/userchromecss-of-firefox.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0IBSHY4eCp7ImA9WxBUGU4.&quot;"><id>tag:blogger.com,1999:blog-31807993.post-6179372143403481009</id><published>2009-10-31T23:38:00.002+08:00</published><updated>2010-03-07T11:12:39.830+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-07T11:12:39.830+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="xorg" /><title>xmonad in Debian Sid</title><content type="html">最近更新了筆電上的 xmonad 結果重開發現開不了, 原來是套件相依的一些問題(畢竟是 sid 阿阿阿~) ，後來決定不用套件庫裡面的 xmonad，用 &lt;a href="http://www.haskell.org/cabal/"&gt;Cabal&lt;/a&gt; 裝。&lt;br /&gt;
&lt;br /&gt;
Cabal 是專門用來裝 haskell 的套件的軟體 (有點像 cpan) ，好處是可以把 haskell package 裝在 user 自己的 home dir 下面，這樣系統也比較乾淨。&lt;br /&gt;
&lt;br /&gt;
參考這篇文章&lt;a href="http://blog.kelsin.net/2009/02/23/install-xmonad-on-debian-lenny/"&gt;Install Xmonad on Debian Lenny&lt;/a&gt;，照著做就可以了，不過要把 .xsession 或 .xinitrc 裡面 xmonad 路徑改成 /home/&lt;user&gt;/.cabal/bin/xmonad 才能啟動，以下紀錄一下過程。&lt;/user&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;sudo apt-get install ghc libghc6-network-dev libghc6-mtl-dev zlib1g-dev&lt;br /&gt;
wget http://hackage.haskell.org/packages/archive/cabal-install/0.6.2/cabal-install-0.6.2.tar.gz&lt;br /&gt;
tar -xzvf cabal-install-0.6.2.tar.gz&lt;br /&gt;
cd cabal-install-0.6.2&lt;br /&gt;
./bootstrap.sh&lt;br /&gt;
export PATH="$HOME/.cabal/bin:$PATH"&lt;br /&gt;
sudo aptitude install libx11-dev libxft-dev&lt;br /&gt;
&lt;br /&gt;
cabal update&lt;br /&gt;
cabal install xmonad&lt;br /&gt;
cabal install xmonad-contrib&lt;br /&gt;
&lt;br /&gt;
&lt;/blockquote&gt;也是可以寫成 script 啦.. 可是好像很久才會用一次，所以暫時沒動力.. XD&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31807993-6179372143403481009?l=freehaha.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/E8zGgr6E6dVi67xZ_NusFgCpG88/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/E8zGgr6E6dVi67xZ_NusFgCpG88/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/E8zGgr6E6dVi67xZ_NusFgCpG88/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/E8zGgr6E6dVi67xZ_NusFgCpG88/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/ejXR/~4/-zbuykdf4xU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://freehaha.blogspot.com/feeds/6179372143403481009/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=31807993&amp;postID=6179372143403481009" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/31807993/posts/default/6179372143403481009?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/31807993/posts/default/6179372143403481009?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/ejXR/~3/-zbuykdf4xU/xmoand-in-debian-sid.html" title="xmonad in Debian Sid" /><author><name>Freehaha</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://freehaha.blogspot.com/2009/10/xmoand-in-debian-sid.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0cCRX8zcSp7ImA9WxNWGUk.&quot;"><id>tag:blogger.com,1999:blog-31807993.post-2862341094108972187</id><published>2009-10-19T18:44:00.000+08:00</published><updated>2009-10-19T18:44:24.189+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-19T18:44:24.189+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="firefox" /><category scheme="http://www.blogger.com/atom/ns#" term="vimperator" /><category scheme="http://www.blogger.com/atom/ns#" term="scim" /><category scheme="http://www.blogger.com/atom/ns#" term="gcin" /><title>gcin &amp; vimperator</title><content type="html">Vimperator 用了一段時間覺得很不錯，不過總覺得怪怪的， hint 的 timeout 怎麼改都沒用，要是 hint number 是三位數我就要非常非常快地輸入才行。後來在我的筆電上發現沒有這個問題，怎麼找我看vimperator 都是 clean install 沒有什麼差別，firefox 的版本也一樣，後來才發現是gcin 的問題。&lt;br /&gt;
&lt;br /&gt;
因為IM frame 有點複雜我不是很熟悉，所以暫時只好先改用 scim 。（gcin 哭哭）&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31807993-2862341094108972187?l=freehaha.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/I9J3aGtmwiDEG84nXMMbOKmdm8U/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/I9J3aGtmwiDEG84nXMMbOKmdm8U/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/I9J3aGtmwiDEG84nXMMbOKmdm8U/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/I9J3aGtmwiDEG84nXMMbOKmdm8U/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/ejXR/~4/bq77cUdRtEM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://freehaha.blogspot.com/feeds/2862341094108972187/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=31807993&amp;postID=2862341094108972187" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/31807993/posts/default/2862341094108972187?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/31807993/posts/default/2862341094108972187?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/ejXR/~3/bq77cUdRtEM/gcin-vimperator.html" title="gcin &amp; vimperator" /><author><name>Freehaha</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://freehaha.blogspot.com/2009/10/gcin-vimperator.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0QMQnczeCp7ImA9WxNRFUk.&quot;"><id>tag:blogger.com,1999:blog-31807993.post-9160589994697949610</id><published>2009-09-09T11:10:00.003+08:00</published><updated>2009-09-10T08:09:43.980+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-10T08:09:43.980+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="route" /><category scheme="http://www.blogger.com/atom/ns#" term="ppp" /><category scheme="http://www.blogger.com/atom/ns#" term="network" /><category scheme="http://www.blogger.com/atom/ns#" term="linux" /><category scheme="http://www.blogger.com/atom/ns#" term="3G" /><title>Ubuntu C270 setup (續)</title><content type="html">昨天晚上試了一下，把ip route 的部分寫成 pppd post-up script，也就是pppd up 以後會執行的script。由於pppd 的up script 是共用的，所以我用 ipparam 來指定是否需要執行ip routing 的設定。&lt;br /&gt;這個設定是基於&lt;a href="http://freehaha.blogspot.com/2009/09/ubuntu-c270-setup.html"&gt;上一篇&lt;/a&gt;  的下半部，所以如果需要可能要看一下。&lt;br /&gt;首先先在 /etc/ppp/ip-up.d/ 加入下面這個檔案 (以下以 root 身份執行)&lt;br /&gt;iproute:&lt;br /&gt;&lt;blockquote&gt;#!/bin/bash&lt;br /&gt;&lt;br /&gt;if [ ${6} == "AUTOROUTE" ]&lt;br /&gt;then&lt;br /&gt;   IP_ADDR=${4}&lt;br /&gt;   IP_GW=${5}&lt;br /&gt;   ip route add default via ${IP_GW} table c270&lt;br /&gt;   ip rule add from ${IP_ADDR} table c270&lt;br /&gt;fi&lt;/blockquote&gt;並設定為可執行&lt;br /&gt;&lt;blockquote&gt;chmod +x /etc/ppp/ip-up.d/iproute&lt;/blockquote&gt;同樣在 /etc/ppp/ip-down.d/ 加入以下檔案&lt;br /&gt;iproute&lt;br /&gt;&lt;blockquote&gt;#!/bin/bash&lt;br /&gt;&lt;br /&gt;if [ ${6} == "AUTOROUTE" ]&lt;br /&gt;then&lt;br /&gt;   IP_ADDR=${4}&lt;br /&gt;   ip rule del from ${IP_ADDR}&lt;br /&gt;fi&lt;/blockquote&gt;&lt;br /&gt;同樣設定為可執行&lt;br /&gt;&lt;blockquote&gt;chmod +x /etc/ppp/ip-down.d/iproute&lt;/blockquote&gt;然後在 wvdial 的地方，加上 ipparam 的參數，在pppd up 以後會傳給script 的。&lt;br /&gt;/etc/ppp/peers/wvdial:&lt;br /&gt;加上&lt;br /&gt;&lt;blockquote&gt;ipparam AUTOROUTE&lt;/blockquote&gt;這樣就會在連線建立完以後自動加上ip rule, route table，連線完也會自己刪除&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31807993-9160589994697949610?l=freehaha.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/EhTEdkEncPRpbB-I6IVpyCYaCEM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/EhTEdkEncPRpbB-I6IVpyCYaCEM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/EhTEdkEncPRpbB-I6IVpyCYaCEM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/EhTEdkEncPRpbB-I6IVpyCYaCEM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/ejXR/~4/0e3SpGY3CBU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://freehaha.blogspot.com/feeds/9160589994697949610/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=31807993&amp;postID=9160589994697949610" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/31807993/posts/default/9160589994697949610?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/31807993/posts/default/9160589994697949610?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/ejXR/~3/0e3SpGY3CBU/ubuntu-c270-setup_09.html" title="Ubuntu C270 setup (續)" /><author><name>Freehaha</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://freehaha.blogspot.com/2009/09/ubuntu-c270-setup_09.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0AERno-eCp7ImA9WxNRFE8.&quot;"><id>tag:blogger.com,1999:blog-31807993.post-4321237324113924833</id><published>2009-09-08T19:37:00.006+08:00</published><updated>2009-09-09T00:01:47.450+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-09T00:01:47.450+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="route" /><category scheme="http://www.blogger.com/atom/ns#" term="network" /><category scheme="http://www.blogger.com/atom/ns#" term="linux" /><category scheme="http://www.blogger.com/atom/ns#" term="3G" /><title>Ubuntu C270 setup</title><content type="html">最近手養跟同學借了 3(.5)G 的無限網卡 Bandluxe C270, 然後去申請了Hinet 3G, 3天的. 主要是因為我宿舍這邊網路是用NAT，外面根本連不進來，網管大概也是外面請來的我也沒辦法要求什麼。所以想說如果辦了3G 平常出去可以上網，到學校的時候有無限網路，網卡就可以插在家裡PC 透過3G 連進來。&lt;br /&gt;&lt;br /&gt;總而言之，去申請了3天250的方案(好貴)試看看。第一部分先是網卡&amp;amp;播號...&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;sudo eject /dev/sr1 #原本的光碟機是 sr0, 網卡的是 sr1)&lt;br /&gt;#下完指令成功以後要等一下 等device 切換模式&lt;br /&gt;sudo modprobe usbserial vendor=0x1a8d product=0x1009 #(可以用 lsusb 看)&lt;/blockquote&gt;&lt;br /&gt;成功的話在這邊看 dmesg|tail  應該可以看到ttyUSB0, 1, 2 被產生出來(可能需要等個幾秒)，然後使用 wvdial:&lt;br /&gt;如果懶的自己設定, 可以用 wvdialconf, 他會自動偵測然後寫入/etc/wvdial.conf, 不過我想大部分的設定並不會差到哪裡去，用寫好的就可以了，這邊是我的設定:&lt;br /&gt;&lt;blockquote&gt;[Dialer pin]&lt;br /&gt;Init1 = AT+CPIN=0000&lt;br /&gt;Baud = 9600&lt;br /&gt;Modem = /dev/ttyUSB0&lt;br /&gt;&lt;br /&gt;[Dialer Defaults]&lt;br /&gt;Init3 = ATQ0 V1 E1 +FCLASS=0&lt;br /&gt;Init4 = AT+CGDCONT=1,"IP","internet"&lt;br /&gt;Modem Type = Analog Modem&lt;br /&gt;Phone = *99#&lt;br /&gt;ISDN = 0&lt;br /&gt;Username = "123"&lt;br /&gt;Init2 =&lt;br /&gt;ATZ                                                                                                                                                 &lt;br /&gt;Password = "456"&lt;br /&gt;Modem = /dev/ttyUSB0&lt;br /&gt;Baud = 9600&lt;br /&gt;New PPPD = 1&lt;br /&gt;Auto DNS = off&lt;br /&gt;Auto Reconnect = on&lt;/blockquote&gt;&lt;br /&gt;因為每一次接上電腦都需要先輸入pin code，可是又不是每次都需要，所以分成兩個：剛接上以後，eject 了，就用 wvdial pin 來播號，之後直接 wvdial 就可以了。&lt;br /&gt;播號了以後會產生另一個 pppd，在我的電腦以 ppp0 的裝置顯示，同時如果看 route -n 會看到類似這樣的結果&lt;br /&gt;10.64.64.64     0.0.0.0         255.255.255.255 UH    0      0        0 ppp0&lt;br /&gt;這邊10.64.64.64 就是要用ppp0 連出去時的 gateway。&lt;br /&gt;由於我的宿舍是用NAT，本身電腦就接著NAT，開機時自動設的gateway 也是經由宿舍出去，這樣別人就算想要由3G device 進來建立連線時，出去的封包還是會經由NAT，甚至被濾掉，這不是我想要的，於是我問了朋友該怎麼辦，他跟我講的解法是用ip route:&lt;br /&gt;我要讓從 ppp0 連進來的連線中傳送出去的封包也透過 ppp0 而不是 default gateway (eth0)，這相當於"source 是 ppp0 的封包要由 ppp0 送出，而不是 eth0 (接NAT)"，這樣的規則透過 ip route 可以解決。&lt;br /&gt;首先建立一個 ip route table (root):&lt;br /&gt;在 /etc/iproute2/rt_tables 增加一個 ip route table&lt;br /&gt;&lt;blockquote&gt;1 c270&lt;br /&gt;&lt;/blockquote&gt;然後在裡面設定 default gateway:&lt;br /&gt;&lt;blockquote&gt;ip route add default via 10.64.64.64 dev ppp0 table c270&lt;br /&gt;&lt;/blockquote&gt;再來只要把 source 是 ppp0 的封包都套用 c270 就可以了:&lt;br /&gt;&lt;blockquote&gt;ip rule add from [addr] table rt1&lt;/blockquote&gt;其中addr 是你撥接後對外的 ip，這個用 ifconfig ppp0 | perl -ne 'print "$1\n" if /inet addr:([\d\.]*)/' 可以取得，這樣就可以由外面連進來了。&lt;br /&gt;不過因為過程中需要知道撥接取得的ip，所以要在撥接後設定才有用，而且pppd 結束了以後route table 會被清掉(找不到ppp0)，ip rule 的設定卻會殘留(沒用的設定)，如果能寫成 pppd 的 post-up script, post-down script 應該會很方便... 有時間來寫..&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31807993-4321237324113924833?l=freehaha.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/0SsT7csKZMz_lDdZaeE1pAeW__M/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/0SsT7csKZMz_lDdZaeE1pAeW__M/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/0SsT7csKZMz_lDdZaeE1pAeW__M/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/0SsT7csKZMz_lDdZaeE1pAeW__M/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/ejXR/~4/2Bg7L0OROVg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://freehaha.blogspot.com/feeds/4321237324113924833/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=31807993&amp;postID=4321237324113924833" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/31807993/posts/default/4321237324113924833?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/31807993/posts/default/4321237324113924833?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/ejXR/~3/2Bg7L0OROVg/ubuntu-c270-setup.html" title="Ubuntu C270 setup" /><author><name>Freehaha</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://freehaha.blogspot.com/2009/09/ubuntu-c270-setup.html</feedburner:origLink></entry></feed>

