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

<channel>
	<title>林光生活兩光過 &#187; BSD</title>
	<atom:link href="http://blog.yzlin.org/category/%e9%9b%bb%e8%85%a6%e6%8a%80%e8%a1%93/bsd/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.yzlin.org</link>
	<description>人生就該悠閒地過，忠實地記錄下人生的軌跡</description>
	<lastBuildDate>Thu, 21 Jan 2010 15:46:26 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=3.0-alpha</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Punish Day</title>
		<link>http://blog.yzlin.org/2009/07/21/88/</link>
		<comments>http://blog.yzlin.org/2009/07/21/88/#comments</comments>
		<pubDate>Tue, 21 Jul 2009 14:02:14 +0000</pubDate>
		<dc:creator>yzlin</dc:creator>
				<category><![CDATA[BSD]]></category>
		<category><![CDATA[兩光生活]]></category>
		<category><![CDATA[電腦技術]]></category>

		<guid isPermaLink="false">http://blog.yzlin.org/?p=88</guid>
		<description><![CDATA[接觸 FreeBSD 也算有蠻長的一段時間了，不過以前的我對 FreeBSD 沒有很深入的了解，上研究所前的暑假到 Y! 實習，也開始慢慢地熟悉 FreeBSD，那時候遇到了很多長輩，rafan 也是那時候進 Y! 的，不過第一年和 rafan 沒有太多交集，只知道他是 Ports Committer 之一，那時候就覺得：「哇！真厲害！」。
後來上了研究所，也進了 NCTU CSCC 當助教，在這裡接觸到了很多強者，還記得 liuyh 要 BSD team 多看 Porter&#8217;s Handbook，剛好另一位 Ports Committer &#8211; lwhsu 也在系計中，那時候我就覺得自己好弱，應該趕快練實力，希望自己有一天也能成為 Ports Committer，lwhsu 要我先練習 send-pr(1) 和 Tinderbox；我也常拿 csports 來練習 XD，DK 大神也幫我收了不少爛攤子。就在那時候送了第一個 PR，不只重複送，Maintainer 還寫錯 orz。
研一的暑假又回到 Y! 當實習生，這個暑假因為實習內容的關係，和 rafan 變得比較熟了，也慢慢從他那邊知道 Ports 的架構和其他有趣的事，還記得 rafan 跟我講：「想當 Ports Committer，先 send [...]]]></description>
			<content:encoded><![CDATA[<p>接觸 FreeBSD 也算有蠻長的一段時間了，不過以前的我對 FreeBSD 沒有很深入的了解，上研究所前的暑假到 Y! 實習，也開始慢慢地熟悉 FreeBSD，那時候遇到了很多長輩，<a href="http://www.rafan.org/">rafan</a> 也是那時候進 Y! 的，不過第一年和 rafan 沒有太多交集，只知道他是 Ports Committer 之一，那時候就覺得：「哇！真厲害！」。</p>
<p>後來上了研究所，也進了 NCTU CSCC 當助教，在這裡接觸到了很多強者，還記得 liuyh 要 BSD team 多看 Porter&#8217;s Handbook，剛好另一位 Ports Committer &#8211; <a href="http://lwhsu.org/">lwhsu</a> 也在系計中，那時候我就覺得自己好弱，應該趕快練實力，希望自己有一天也能成為 Ports Committer，lwhsu 要我先練習 send-pr(1) 和 Tinderbox；我也常拿 csports 來練習 XD，<a href="http://blog.gslin.org/">DK 大神</a>也幫我收了不少爛攤子。就在那時候送了<a href="http://www.freebsd.org/cgi/query-pr.cgi?pr=ports/124129">第一個 PR</a>，不只重複送，Maintainer 還寫錯 orz。</p>
<p>研一的暑假又回到 Y! 當實習生，這個暑假因為實習內容的關係，和 rafan 變得比較熟了，也慢慢從他那邊知道 Ports 的架構和其他有趣的事，還記得 rafan 跟我講：「想當 Ports Committer，先 send 100 個 PR 來再說！」，所以程式寫到很煩的時候就會開 portscout.org 看有沒有什麼 ports 要更新的，PR 數也是這時候不斷地增加，不過 PR 的品質也很差 XD。</p>
<p>研二上算是 PR 送得最勤的時候，那時候常常有事沒事就送，不清楚的就問 lwhsu，不管是更新還是有錯，反正 PR 不用錢嘛！XD 隨著數目增加，也慢慢知道要注意哪些東西，不會送出一些好笑的 PR 了 (還曾經被 pav@ reject XD)。後來，就<a href="http://www.freebsd.org/news/newsflash.html#event20090720:01">被懲罰</a>了。</p>
<p>最要感謝的是我的 mentor &#8211; lwhsu，雖然我 on board 第一天就出包 XD，不過總算是踏出第一步了，接下來還請許多前輩們多多照顧小弟了。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.yzlin.org/2009/07/21/88/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Screen + Unicode 補完計畫 (UAO)</title>
		<link>http://blog.yzlin.org/2008/11/11/66/</link>
		<comments>http://blog.yzlin.org/2008/11/11/66/#comments</comments>
		<pubDate>Tue, 11 Nov 2008 00:14:06 +0000</pubDate>
		<dc:creator>yzlin</dc:creator>
				<category><![CDATA[BSD]]></category>
		<category><![CDATA[工具]]></category>
		<category><![CDATA[電腦技術]]></category>
		<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[screen]]></category>

		<guid isPermaLink="false">http://blog.yzlin.org/?p=66</guid>
		<description><![CDATA[這篇其實很早就有草稿了，只是拖到最近才把它完成。
之前有談過如何設定 Gnu Screen 的方法，如果你常掛在 server 上，那應該對 Screen 這個好用的工具並不陌生。這篇主要是談怎麼 patch 它，來讓它支援 Unicode 補完計畫 (UAO)。
Unicode 補完計畫 (UAO) 對廣大的鄉民來說，可以說是再親切不過的了，BBS 電子佈告欄在台灣相當地盛行，但它底層僅僅支援 Big5，對於鄉民來說，看日文是件再正常不過的事了，但 Big5 畢竟是個急就章推出的編碼 (事實上，它也沒有一個既定的標準，唯一勉強可以稱得上標準的是 Big5-2003)，在當初的設計中並沒有加入日文假名等使用需求。所幸 Big5 有所謂的&#8221;使用者造字區&#8221;，提供給使用者自行定義新字，也有了後來的&#8221;倚天擴充字集&#8221;加入了包括日文假名等使用者特殊需求字。
然而，Windows 對於這塊由倚天自行定義的區域，在轉換成 Unicode 時也對應到了使用者造字區，而非它們各自對應到實際在 Unicode 的字，於是造成了 mapping 上的錯誤。UAO 便是為了解決這個問題而產生的，它做的事情只是將這段使用者造字區對應到 Unicode 正確的字。
上面說到的，是針對 Big5 &#60;-&#62; Unicode 的轉換發生在 Windows 的情況，可以利用安裝 UAO 來解決；但因為我的環境是 UTF-8，已經習慣用 Screen 提供的 Encoding Translation 功能來上 BBS 瀏覽文章了，但 Screen 預設提供的 Mapping Table 並沒有處理 [...]]]></description>
			<content:encoded><![CDATA[<p>這篇其實很早就有草稿了，只是拖到最近才把它完成。</p>
<p>之前有談過如何設定 Gnu Screen 的方法，如果你常掛在 server 上，那應該對 Screen 這個好用的工具並不陌生。這篇主要是談怎麼 patch 它，來讓它支援 Unicode 補完計畫 (UAO)。</p>
<p>Unicode 補完計畫 (UAO) 對廣大的鄉民來說，可以說是再親切不過的了，BBS 電子佈告欄在台灣相當地盛行，但它底層僅僅支援 Big5，對於鄉民來說，看日文是件再正常不過的事了，但 Big5 畢竟是個急就章推出的編碼 (事實上，它也沒有一個既定的標準，唯一勉強可以稱得上標準的是 Big5-2003)，在當初的設計中並沒有加入日文假名等使用需求。所幸 Big5 有所謂的&#8221;使用者造字區&#8221;，提供給使用者自行定義新字，也有了後來的&#8221;倚天擴充字集&#8221;加入了包括日文假名等使用者特殊需求字。</p>
<p>然而，Windows 對於這塊由倚天自行定義的區域，在轉換成 Unicode 時也對應到了使用者造字區，而非它們各自對應到實際在 Unicode 的字，於是造成了 mapping 上的錯誤。UAO 便是為了解決這個問題而產生的，它做的事情只是將這段使用者造字區對應到 Unicode 正確的字。</p>
<p>上面說到的，是針對 Big5 &lt;-&gt; Unicode 的轉換發生在 Windows 的情況，可以利用安裝 UAO 來解決；但因為我的環境是 UTF-8，已經習慣用 Screen 提供的 Encoding Translation 功能來上 BBS 瀏覽文章了，但 Screen 預設提供的 Mapping Table 並沒有處理 UAO，因此這種轉換是在 Screen 內部的情況便無法靠安裝 UAO 來解決，所以必須 patch。</p>
<p>其實許多前輩們已經針對這個部份提供了 Screen 的 <a href="http://tib.tw/tBoard/index.py?m=pl&amp;f=25&amp;t=564">UAO patch</a> 以及修正過的 Mapping Table，但他們提供的 Mapping Table 是以 UAO 2.42 所產生的 Binary 檔，這意味著我不清楚它是支援到 UAO 2.42 哪個程度，即使完整支援了 (這反而不好)，Binary 檔也代表它難以再編修和進 Version Control System。</p>
<p>所以我從 Firefox 3 的版本取出了內建的 Mapping Table 文字檔來做處理，Firefox 在 2 的版本已經內建單向處理 UAO 的功能了，所以可以取其 Big5 -&gt; Unicode 單向的 Mapping Table 來做修改。修改後再利用<a href="http://www.csie.ntu.edu.tw/~r92030/project/big5/">轉換程式</a>編成 Binary 檔便可替代原本 Screen 當中的 &#8220;18&#8243; 檔 (也就是 Big5 &lt;-&gt; Unicode Mapping Table)。</p>
<p>利用修正過後的 Screen 便可看到在日文假名以及某些特殊字框的顯示正常很多了；但是實際使用後會發現一個問題，就是對於某些 Double Mapping 的字會優先轉換到 0&#215;8140-0xA0FE 這段擴充區 (這裡所謂的 Double Mapping 是指多個 Big5 的字對應到同一個 Unicode 的字，例如 0xB86D 和 0&#215;82AA 都是對應到 0&#215;7F6E，一個是正常區的，另一個是擴充區的)，而在當初的 Mapping Table 文字檔便是依造 Big5 的字碼來排序，很不巧的 0&#215;8140-0xA0FE 這段擴充區會放置在最前面；而又剛好 Screen 的 Mapping Table 是同時做雙向轉換的，針對這種 Double Mapping 的情況，它會以第一個找到的為優先，這便造成了某些不需 UAO 便可閱讀的字，變成需要 UAO 才能閱讀了，而這篇文章是你打的。解決方式便是將這段擴充區移到 Mapping Table 的最後面，讓正常區的字優先權較高。於是最後的 <a href="http://file.yzlin.org/uao_big5uni.txt">Mapping Table 表</a>便誕生了，我在每行最後都有加上 UTF-8 所對應到的字。</p>
<p>最後的比較圖如下：<br />
<a title="Screen_with_different_mapping_table by Yi-Jheng, Lin (Alex), on Flickr" href="http://www.flickr.com/photos/yzlin1985/3019998111/"><img src="http://farm4.static.flickr.com/3212/3019998111_6d8c6c8b50.jpg" alt="Screen_with_different_mapping_table" width="500" height="370" /></a></p>
<p>參考資料：</p>
<ul>
<li>http://moztw.org/docs/big5/</li>
<li><a href="http://uao.cpatch.org">Unicode 補完計畫</a></li>
</ul>
<p>P.S. 其實 UAO 在本意上是良好的，但是作法我不太推崇，畢竟它不是一個標準，只是為了配合 BBS 所產生的過渡產物，所以讓 Screen 支援 UAO 僅是為了讓瀏覽 BBS 文章更方便而已，在其他環境下，我還是建議以 Unicode 為主，畢竟它是一個標準，支援度又高，Big5 就讓它慢慢走向歷史吧！</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.yzlin.org/2008/11/11/66/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>The Tips of Setting Workstation Environment</title>
		<link>http://blog.yzlin.org/2008/11/11/68/</link>
		<comments>http://blog.yzlin.org/2008/11/11/68/#comments</comments>
		<pubDate>Mon, 10 Nov 2008 18:16:10 +0000</pubDate>
		<dc:creator>yzlin</dc:creator>
				<category><![CDATA[BSD]]></category>
		<category><![CDATA[NCTUCS]]></category>
		<category><![CDATA[工作記錄]]></category>
		<category><![CDATA[工具]]></category>
		<category><![CDATA[電腦技術]]></category>
		<category><![CDATA[Finch]]></category>
		<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[Mutt]]></category>
		<category><![CDATA[screen]]></category>
		<category><![CDATA[vim]]></category>

		<guid isPermaLink="false">http://blog.yzlin.org/?p=68</guid>
		<description><![CDATA[這份投影片是之前在系計中內部分享的，整理了一下 share 出來，裡面有些嘴砲請自動略過 XD。有錯也請指正  
]]></description>
			<content:encoded><![CDATA[<p>這份投影片是之前在系計中內部分享的，整理了一下 <a href="http://file.yzlin.org/the_tips_of_setting_workstation_environment.pdf">share 出來</a>，裡面有些嘴砲請自動略過 XD。有錯也請指正 <img src='http://blog.yzlin.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.yzlin.org/2008/11/11/68/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Colorize A 256-Color Mutt</title>
		<link>http://blog.yzlin.org/2008/09/13/60/</link>
		<comments>http://blog.yzlin.org/2008/09/13/60/#comments</comments>
		<pubDate>Sat, 13 Sep 2008 08:56:02 +0000</pubDate>
		<dc:creator>yzlin</dc:creator>
				<category><![CDATA[BSD]]></category>
		<category><![CDATA[工具]]></category>
		<category><![CDATA[電腦技術]]></category>
		<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[Mutt]]></category>

		<guid isPermaLink="false">http://blog.yzlin.org/?p=60</guid>
		<description><![CDATA[Mutt 是一個我很愛用的 Mail Client，除了平常在用的 GMail 外，其他幾乎都是由它包辦，其實之前就知道 Mutt 支援 256-Color，只是一直沒有時間好好調校，昨天趁著颱風天的下午，在 FreeBSD 上把 Mutt 的 256-Color 設定好了。
在預設的 Mutt color setting 中，單純使用常用的 16-Color 就是用 black, green, red, blue, &#8230;, etc 這類的顏色詞來設定；但是在 256-Color 的環境下，必須使用 color0, color1, &#8230;, color254, color255 來做設定，關於顏色的對照表，可以參考這邊。
這邊提供一下我的設定 (看是要放到 $HOME/.muttrc 或是另放一個檔案，再從 $HOME/.muttrc include 進去)：

color normal            default [...]]]></description>
			<content:encoded><![CDATA[<p>Mutt 是一個我很愛用的 Mail Client，除了平常在用的 GMail 外，其他幾乎都是由它包辦，其實之前就知道 Mutt 支援 256-Color，只是一直沒有時間好好調校，昨天趁著颱風天的下午，在 FreeBSD 上把 Mutt 的 256-Color 設定好了。</p>
<p>在預設的 Mutt color setting 中，單純使用常用的 16-Color 就是用 black, green, red, blue, &#8230;, etc 這類的顏色詞來設定；但是在 256-Color 的環境下，必須使用 color0, color1, &#8230;, color254, color255 來做設定，關於顏色的對照表，可以參考<a href="http://vip.cs.nctu.edu.tw/~yzlin/256Color/256-xterm-24bit-rgb-color-chart.html" target="_blank">這邊</a>。</p>
<p>這邊提供一下我的設定 (看是要放到 $HOME/.muttrc 或是另放一個檔案，再從 $HOME/.muttrc include 進去)：</p>
<blockquote>
<pre>color normal            default         default         # normal text
color indicator         color214        color237        # actual message
color tree              color99         default         # thread arrows
color status            color118        color237        # status line
color error             color196        default         # errors
color message           color196        default         # info messages
color signature         brightblack     default         # signature
color attachment        brightblack     default         # MIME attachments
color search            brightyellow    red             # search matches
color tilde             brightmagenta   default         # ~ at bottom of msg
color markers           red             default         # + at beginning of wrapped lines

color hdrdefault        color33         default         # default header lines
color bold              red             default         # hiliting bold patterns in body
color underline         green           default         # hiliting underlined patterns in body

color quoted            color107        default         # quoted text
color quoted1           color66         default
color quoted2           color32         default
color quoted3           color30         default
color quoted4           color99         default
color quoted5           color36         default
color quoted6           color114        default
color quoted7           color109        default
color quoted8           color41         default
color quoted9           color138        default
# header
color header            color205        default         "^(From|Subject|To|Cc|Bcc):"

# body
color body              color214        default         "(http|https|ftp|news|telnet|finger)://[^ ]+"
color body              color81         default         "[-a-z_0-9.+]+@[-a-z_0-9.]+"
color body              red             default         "(^| )\\*[-a-z0-9*]+\\*[,.?]?[ \n]"
color body              green           default         "(^| )_[-a-z0-9_]+_[,.?]?[ \n]"

# index
uncolor index *         # unset all color index entries
color index             brightgreen     default         ~F      # Flagged
color index             color74         default         ~N      # New
color index             color169        default         ~T      # Tagged
color index             brightblack     default         ~D      # Deleted</pre>
</blockquote>
<p>這樣設定完成後，如果你跟我一樣使用 $TERM=xterm，沒意外的話會噴出這樣子的訊息：</p>
<blockquote>
<pre>Error in /home/yzlin/.mutt/color/color256, line 9: 214: color not supported by term
Error in /home/yzlin/.mutt/color/color256, line 10: 99: color not supported by term
Error in /home/yzlin/.mutt/color/color256, line 11: 118: color not supported by term
Error in /home/yzlin/.mutt/color/color256, line 12: 196: color not supported by term
Error in /home/yzlin/.mutt/color/color256, line 13: 196: color not supported by term
Error in /home/yzlin/.mutt/color/color256, line 20: 33: color not supported by term
Error in /home/yzlin/.mutt/color/color256, line 24: 107: color not supported by term
...</pre>
</blockquote>
<p>會出現這樣的問題，是因為 Mutt 使用到 ncurses，會判斷 termcap 中，你所使用的 TERM (在此是 xterm) 是否支援 256-Color，如果不支援那麼高，就會噴出這樣子的訊息，這時候有人就會把 TERM 設成 xterm-256color，如此一來，就會成功！？很遺憾的，照樣噴 XD，在 Linux 下，可以單純只設成 xterm-256color，但是在 FreeBSD 下，卻不行！</p>
<p>為何會有如此的差異？其實這個問題帶有一點點歷史的包袱，FreeBSD 預設使用的是 termcap，而 Linux 多半使用的是 terminfo，也因為如此，FreeBSD termcap 會受限於單一 entry 字元數必須小於 1024 個的限制，如此一來，沒辦法將全部的 feature 都包含進去，xterm-256color 就是一個例子，在 /usr/share/misc/termcap 中有一段說明：</p>
<blockquote>
<pre># These aliases are for compatibility with the terminfo; termcap cannot provide
# the extra features, but termcap applications still want the names.
xterm-16color|xterm alias 1:tc=xterm-xfree86:
xterm-88color|xterm alias 2:tc=xterm-256color:
xterm-256color|xterm alias 3:tc=xterm-xfree86:</pre>
</blockquote>
<p>從說明可以看到 xterm-256color 其實引入的是 xterm-xfree86，再詳細去看，xterm-xfree86 當中並沒有 Co 的設定 (Co 指的是 &#8220;Maximum number of colors on screen&#8221;，相當於 terminfo 中的 colors)，而是引入 xterm-basic 的設定，當中只支援 Co#8，這也是為什麼 xterm-256color 在 FreeBSD 中並不是真的支援 256 色。</p>
<p>若要知道目前使用的 TERM 所支援的 colors，可以使用：</p>
<blockquote>
<pre>tput Co</pre>
</blockquote>
<p>注意不是 co 而是 Co，co 是 columns 的意思。</p>
<p>既然無法針對 termcap 下手，那究竟該如何設定使用 Co#256 呢？好在我們可以自行設定一個環境變數 TERMCAP，來強制指定，在 $HOME/.cshrc 設定：</p>
<blockquote>
<pre>setenv TERMCAP 'xterm|xterm-color:Co#256:AB=\E[48;5;%dm:AF=\E[38;5;%dm:tc=xterm-xfree86:'</pre>
</blockquote>
<p>由上面的設定，可以看到我們覆寫了 Co、AB、AF，這樣的設定跟 .screenrc 當中的設定很像，AF 指的是 foreground color 的表示方式；AB 則是 backgound color 的表示方式。設定完成如果要確定是否成功，可以利用 tput 去檢查 Co，出現 256 便是表示成功了，接著在這樣的環境下執行 Mutt，沒意外會看到這樣子的畫面：<br />
<a title="mutt-256color by Yi-Jheng, Lin (Alex), on Flickr" href="http://www.flickr.com/photos/yzlin1985/2852995886/"><img src="http://farm4.static.flickr.com/3127/2852995886_c67150a32b.jpg" alt="mutt-256color" width="500" height="357" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.yzlin.org/2008/09/13/60/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>讓 pure-ftpd 支援 smbfs</title>
		<link>http://blog.yzlin.org/2008/07/14/51/</link>
		<comments>http://blog.yzlin.org/2008/07/14/51/#comments</comments>
		<pubDate>Mon, 14 Jul 2008 15:39:57 +0000</pubDate>
		<dc:creator>yzlin</dc:creator>
				<category><![CDATA[BSD]]></category>
		<category><![CDATA[電腦技術]]></category>
		<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[PureFTPD]]></category>
		<category><![CDATA[Samba]]></category>

		<guid isPermaLink="false">http://blog.yzlin.org/?p=51</guid>
		<description><![CDATA[pure-ftpd 要能支援 smbfs 這些比較特殊的 File System，必須在 configure 的時候加入 &#8220;&#8211;without-sendfile&#8221; 這個參數，讓它不使用 sendfile 這個 System Call，在 FreeBSD ports 裡，只需要將預設的 Option &#8220;SENDFILE       Support for the sendfile syscall&#8221; 取消即可。下面是官方的說明：

--without-sendfile: on Linux, Solaris, HPUX and FreeBSD kernels, Pure-FTPd
tries to reduce the CPU/memory usage by using a special system call (sendfile)
. It works very well with most filesystems. However, this optimization [...]]]></description>
			<content:encoded><![CDATA[<p>pure-ftpd 要能支援 smbfs 這些比較特殊的 File System，必須在 configure 的時候加入 &#8220;&#8211;without-sendfile&#8221; 這個參數，讓它不使用 sendfile 這個 System Call，在 FreeBSD ports 裡，只需要將預設的 Option &#8220;SENDFILE       Support for the sendfile syscall&#8221; 取消即可。下面是官方的說明：</p>
<blockquote>
<pre>--without-sendfile: on Linux, Solaris, HPUX and FreeBSD kernels, Pure-FTPd
tries to reduce the CPU/memory usage by using a special system call (sendfile)
. It works very well with most filesystems. However, this optimization is not
implemented for all filesystems in current kernels. Users reported that
downloading files with Pure-FTPd failed with SMBFS (Samba) on FreeBSD and
TmpFS and NTFS on Linux (the error reported by the server is "broken pipe" or
"Error during write to data connection") . If you are planning to serve files
from these filesystems, you have to use the --without-sendfile switch to
enable a workaround. It was also reported that PA-Risc Linux systems need this
flag.</pre>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://blog.yzlin.org/2008/07/14/51/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>portconf new feature &#8220;.undef&#8221; 進 ports 了</title>
		<link>http://blog.yzlin.org/2008/07/11/47/</link>
		<comments>http://blog.yzlin.org/2008/07/11/47/#comments</comments>
		<pubDate>Fri, 11 Jul 2008 12:55:56 +0000</pubDate>
		<dc:creator>yzlin</dc:creator>
				<category><![CDATA[BSD]]></category>
		<category><![CDATA[電腦技術]]></category>
		<category><![CDATA[FreeBSD]]></category>

		<guid isPermaLink="false">http://blog.yzlin.org/?p=47</guid>
		<description><![CDATA[之前 po 的那篇幫 portconf 加新功能的，後來聽了 gslin 的建議送了 PR 給作者，剛剛收到 reply mail 通知已經 commit 了。
題外話，最近陸續送了好幾個 PR，也慢慢學習到 ports 的正確包法，對 FreeBSD 的 ports 機制也更了解了，能對 FreeBSD 做出貢獻真的很棒！
Update: 看了一下作者最後的作法，改成了只動到 portconf.sh，主要在下面這行：

echo ${_line#*:} &#124; sed -E 's/([A-Z0-9_]+)(=([^&#124;]+))?/\1=\3/g;s/!([A-Z0-9_]+)=([^&#124;]+)?/.undef \1/g;s/ *\&#124; */&#124;/g;s/ /%/g'

果然高明多了。
]]></description>
			<content:encoded><![CDATA[<p>之前 po 的<a href="http://blog.yzlin.org/2008/07/04/44/" target="_blank">那篇</a>幫 portconf 加新功能的，後來聽了 gslin 的建議送了 <a href="http://www.freebsd.org/cgi/query-pr.cgi?pr=125273" target="_blank">PR</a> 給作者，剛剛收到 reply mail 通知已經 commit 了。</p>
<p>題外話，最近陸續送了好幾個 PR，也慢慢學習到 ports 的正確包法，對 FreeBSD 的 ports 機制也更了解了，能對 FreeBSD 做出貢獻真的很棒！</p>
<p><strong>Update:</strong> 看了一下作者最後的作法，改成了只動到 portconf.sh，主要在下面這行：</p>
<blockquote>
<pre>echo ${_line#*:} | sed -E 's/([A-Z0-9_]+)(=([^|]+))?/\1=\3/g;s/!([A-Z0-9_]+)=([^|]+)?/.undef \1/g;s/ *\| */|/g;s/ /%/g'</pre>
</blockquote>
<p>果然高明多了。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.yzlin.org/2008/07/11/47/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>portconf 中的 .undef 功能</title>
		<link>http://blog.yzlin.org/2008/07/04/44/</link>
		<comments>http://blog.yzlin.org/2008/07/04/44/#comments</comments>
		<pubDate>Fri, 04 Jul 2008 08:23:47 +0000</pubDate>
		<dc:creator>yzlin</dc:creator>
				<category><![CDATA[BSD]]></category>
		<category><![CDATA[電腦技術]]></category>
		<category><![CDATA[FreeBSD]]></category>

		<guid isPermaLink="false">http://blog.yzlin.org/?p=44</guid>
		<description><![CDATA[ports-mgmt/portconf 是個很棒的工具，它的用法就不多說了，google 一下都可以找到很多篇教學，這篇主要是幫 portconf 加入 .undef 的功能。
在 ports 中常常用到一個作法，就是利用 .ifdef 來判斷 WITHOUT_XXX 是否已定義，如果定義了，便加入 XXX 的設定，一個最常見的便是 WITHOUT_X11，對於那些不想裝 XWindow 的機器來說很有用，只需要在 ports.conf 加入：

*: WITHOUT_X11=yes    # WITHOUT_X11 也可

如此一來，所有的 ports 預設便會設定 WITHOUT_X11；但是對於某些套件來說，則必須去掉這個變數才能用到一些 library，最近遇到的例子是，我需要用到 textproc/wv，它 depend on x11-toolkits/gtk20，而 x11-toolkits/gtk20 depend on graphics/cairo，如果 cairo 設定 WITHOUT_X11 來編的話，gtk20 便會編不過出現：

gdkdrawable-x11.c:32:24: cairo-xlib.h: No such file or directory

所以 cairo 必須去掉 WITHOUT_X11 來重編。為了這些特定的套件的需要，我把 /usr/local/libexec/portconf [...]]]></description>
			<content:encoded><![CDATA[<p>ports-mgmt/portconf 是個很棒的工具，它的用法就不多說了，google 一下都可以找到很多篇教學，這篇主要是幫 portconf 加入 .undef 的功能。</p>
<p>在 ports 中常常用到一個作法，就是利用 .ifdef 來判斷 WITHOUT_XXX 是否已定義，如果定義了，便加入 XXX 的設定，一個最常見的便是 WITHOUT_X11，對於那些不想裝 XWindow 的機器來說很有用，只需要在 ports.conf 加入：</p>
<blockquote>
<pre>*: WITHOUT_X11=yes    # WITHOUT_X11 也可</pre>
</blockquote>
<p>如此一來，所有的 ports 預設便會設定 WITHOUT_X11；但是對於某些套件來說，則必須去掉這個變數才能用到一些 library，最近遇到的例子是，我需要用到 textproc/wv，它 depend on x11-toolkits/gtk20，而 x11-toolkits/gtk20 depend on graphics/cairo，如果 cairo 設定 WITHOUT_X11 來編的話，gtk20 便會編不過出現：</p>
<blockquote>
<pre>gdkdrawable-x11.c:32:24: cairo-xlib.h: No such file or directory</pre>
</blockquote>
<p>所以 cairo 必須去掉 WITHOUT_X11 來重編。為了這些特定的套件的需要，我把 /usr/local/libexec/portconf 改成：</p>
<blockquote>
<pre>_conf=/usr/local/etc/ports.conf
if [ ! -r "${_conf}" ]; then
    exit
fi
_pwd=`pwd`
sed '/^#/d;/^[[:space:]]*$/d' "${_conf}" | while read _line; do
    for _port in ${_line%%:*}; do
        if [ "${_pwd%%${_port}}" != "${_pwd}" ]; then
            echo ${_line#*:} | sed -E 's/(!?)([A-Z0-9_]+)((\?)?=([^|]+))?/\1\2\4=\5/g;s/ *\| */|/g;s/ /%/g'
        fi
    done
done</pre>
</blockquote>
<p>至於 /etc/make.conf 裡 portconf 的設定改成(我的 /etc/make.conf 已經是<a href="http://blog.yzlin.org/2008/05/25/36/" target="_blank">改過的</a>了)：</p>
<blockquote>
<pre># Begin portconf settings
# Do not touch these lines
_PORTSDIR!=/bin/realpath /usr/ports
_MATCHDIR!=echo `echo ${.CURDIR} | /usr/bin/grep ^${_PORTSDIR}`
.if !empty(_MATCHDIR) &amp;&amp; exists(/usr/local/libexec/portconf)
_PORTCONF!=/usr/local/libexec/portconf
.for i in ${_PORTCONF:S/|/ /g}
${i:C/!([A-Z0-9_]+)(=([^ ]+)?)?/.undef \1/g}    # 主要是這行
${i:S/%/ /g}
.endfor
.endif
# End portconf settings</pre>
</blockquote>
<p>如此一來，我可以在 ports.conf 設定：</p>
<blockquote>
<pre>*: WITHOUT_X11=yes
graphics/cairo: !WITHOUT_X11</pre>
</blockquote>
<p>任何變數前面加上 &#8216;!&#8217; 都會自動 .undef，以上面為例：</p>
<blockquote>
<pre>$ make -V _PORTCONF
WITHOUT_X11=yes !WITHOUT_X11=</pre>
</blockquote>
<p>最後會變成：</p>
<blockquote>
<pre>WITHOUT_X11=yes
.undef WITHOUT_X11</pre>
</blockquote>
<p>如此一來，便可針對某些套件設定相對於 Global 的設定了。<br />
但要注意，不能寫成下面這樣：</p>
<blockquote>
<pre>graphics/cairo: !WITHOUT_X11
*: WITHOUT_X11=yes</pre>
</blockquote>
<p>否則會變成：</p>
<blockquote>
<pre>.undef WITHOUT_X11
WITHOUT_X11=yes</pre>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://blog.yzlin.org/2008/07/04/44/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>portconf 處理 soft link 的問題</title>
		<link>http://blog.yzlin.org/2008/05/25/36/</link>
		<comments>http://blog.yzlin.org/2008/05/25/36/#comments</comments>
		<pubDate>Sun, 25 May 2008 07:52:06 +0000</pubDate>
		<dc:creator>yzlin</dc:creator>
				<category><![CDATA[BSD]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[工具]]></category>
		<category><![CDATA[電腦技術]]></category>
		<category><![CDATA[FreeBSD]]></category>

		<guid isPermaLink="false">http://blog.yzlin.org/?p=36</guid>
		<description><![CDATA[ports-mgmt/portconf 是一個很好用的工具，可以設定一個 port.conf，內容大致上的形式是這樣：

editor/vim*: WITH_CSCOPE=yes &#124; WITH_EXUBERANT_CTAGS=yes

如此一來，portconf 便會在 /etc/make.conf 自動去 parse port.conf，然後將對應的參數加入，以上面的例子，如果我安裝 editor/vim or editor/vim-lite 都會自動加入 &#8220;WITH_CSCOPE=yes WITH_EXUBERANT_CTAGS=yes&#8221;，這樣我們便可以更方便地管理各種不同 ports 的安裝參數。
但是，原本的 portconf 只是單純地判斷是否在 /usr/ports 下執行 make 的，如果 /usr/ports 是使用 soft link 的方式，其 real path 卻是在其它地方，那麼 portconf 便不會運作，它判斷的程式碼是加在 /etc/make.conf：

.if !empty(.CURDIR:M/usr/ports*) &#38;&#38; exists(/usr/local/libexec/portconf)
_PORTCONF!=/usr/local/libexec/portconf
.for i in ${_PORTCONF:S/&#124;/ /g}
${i:S/%/ /g}
.endfor
.endif

從上面可以看到，它是利用 make 的 modifier 去比對，但是 modifier 其後接的 pattern 是不接受變數展開的，也就是說我們不能這樣寫：

_PORTDIR!=/bin/realpath /usr/ports
.if !empty(.CURDIR:M${_PORTDIR}*) &#38;&#38; [...]]]></description>
			<content:encoded><![CDATA[<p>ports-mgmt/portconf 是一個很好用的工具，可以設定一個 port.conf，內容大致上的形式是這樣：</p>
<blockquote>
<pre>editor/vim*: WITH_CSCOPE=yes | WITH_EXUBERANT_CTAGS=yes</pre>
</blockquote>
<p>如此一來，portconf 便會在 /etc/make.conf 自動去 parse port.conf，然後將對應的參數加入，以上面的例子，如果我安裝 editor/vim or editor/vim-lite 都會自動加入 &#8220;WITH_CSCOPE=yes WITH_EXUBERANT_CTAGS=yes&#8221;，這樣我們便可以更方便地管理各種不同 ports 的安裝參數。</p>
<p>但是，原本的 portconf 只是單純地判斷是否在 /usr/ports 下執行 make 的，如果 /usr/ports 是使用 soft link 的方式，其 real path 卻是在其它地方，那麼 portconf 便不會運作，它判斷的程式碼是加在 /etc/make.conf：</p>
<blockquote>
<pre>.if !empty(.CURDIR:M/usr/ports*) &amp;&amp; exists(/usr/local/libexec/portconf)
_PORTCONF!=/usr/local/libexec/portconf
.for i in ${_PORTCONF:S/|/ /g}
${i:S/%/ /g}
.endfor
.endif</pre>
</blockquote>
<p>從上面可以看到，它是利用 make 的 modifier 去比對，但是 modifier 其後接的 pattern 是不接受變數展開的，也就是說我們不能這樣寫：</p>
<blockquote>
<pre>_PORTDIR!=/bin/realpath /usr/ports
.if !empty(.CURDIR:M${_PORTDIR}*) &amp;&amp; exists(/usr/local/libexec/portconf)
_PORTCONF!=/usr/local/libexec/portconf
.for i in ${_PORTCONF:S/|/ /g}
${i:S/%/ /g}
.endfor
.endif</pre>
</blockquote>
<p>這是 make 本身的限制，rafan 後來<a href="http://www.freebsd.org/cgi/query-pr.cgi?pr=ports/104838" target="_blank">送了個 patch</a>，讓 portconf 可以在安裝的時候自動將 make.conf 裡 /usr/ports 換成它的 real path，但是只保證安裝時候判斷，如果 real path 換地方了，便得手動修改或是乾脆重裝 portconf，其實 /usr/ports 的 real path 多半很少換，只要記得換了要修改或重裝就好，所以也還可以，但是我在想有什麼方式可以達到真正的動態判斷 real path，後來我改出了兩個版本：</p>
<h3>Version 1</h3>
<p>第一個版本想法是既然直接在 make.conf 做判斷有困難，那不如都改到 portconf 那隻 shell script 去判斷吧！</p>
<h4>/etc/make.conf</h4>
<blockquote>
<pre>.if exists(/usr/local/libexec/portconf)
_PORTCONF!=/usr/local/libexec/portconf
.for i in ${_PORTCONF:S/|/ /g}
${i:S/%/ /g}
.endfor
.endif</pre>
</blockquote>
<h4>/usr/local/libexec/portconf 前面加入</h4>
<blockquote>
<pre>_portdir=`/bin/realpath /usr/ports`
_curdir=`pwd`
if [ "${_curdir##${_portdir}*}" != "" ]; then
    exit
fi</pre>
</blockquote>
<h3>Version 2</h3>
<p>第二個版本是直接在 make.conf 利用外部工具做判斷，只需要修改 make.conf，不用動到 portconf 那隻 shell script。</p>
<h4>/etc/make.conf</h4>
<blockquote>
<pre>_PORTSDIR!=/bin/realpath /usr/ports
_MATCHDIR!=echo `echo ${.CURDIR} | /usr/bin/grep ^${_PORTSDIR}`
.if !empty(_MATCHDIR) &amp;&amp; exists(/usr/local/libexec/portconf)
_PORTCONF!=/usr/local/libexec/portconf
.for i in ${_PORTCONF:S/|/ /g}
${i:S/%/ /g}
.endfor
.endif</pre>
</blockquote>
<p>上面兩個版本都可以達到動態判斷 real path，但是有一利必有一弊&#8230;原本 portconf 利用 make 本身的 modifier 便是為了減少每次呼叫 make 多花費在判斷的時間，這對於一般的 ports 安裝來說，不會有多大的影響，但是對於 make buildworld 來說，便有可能造成很大的影響，所以我做個了測試，看看上面兩種修改在 make buildworld 增加多少時間，我的測試環境是：</p>
<ul>
<li>CPU：Intel(R) Core(TM)2 Duo CPU E6550 @ 2.33GHz (2333.35-MHz K8-class CPU)</li>
<li>OS：FreeBSD 7.0R amd64</li>
</ul>
<p>測試出來的結果：</p>
<ul>
<li>Original：60m57.49s</li>
<li>Version 1：62m6.19s</li>
<li>Version 2：61m29.74s</li>
</ul>
<p>這樣的結果我還算可以接受，所以我選擇了 Version 2 的版本 (雖然它做法挺髒的 XD)。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.yzlin.org/2008/05/25/36/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Make UTF-8 Environment Comfortable</title>
		<link>http://blog.yzlin.org/2008/05/14/22/</link>
		<comments>http://blog.yzlin.org/2008/05/14/22/#comments</comments>
		<pubDate>Wed, 14 May 2008 11:13:51 +0000</pubDate>
		<dc:creator>yzlin</dc:creator>
				<category><![CDATA[BSD]]></category>
		<category><![CDATA[工具]]></category>
		<category><![CDATA[電腦技術]]></category>
		<category><![CDATA[FreeBSD]]></category>

		<guid isPermaLink="false">http://blog.yzlin.org/?p=22</guid>
		<description><![CDATA[這篇是我對於 UTF-8 環境的設定心得，其實自己從 FreeBSD 4 就開始嘗試用 UTF-8 的環境了，但是我記得 FreeBSD 4對於 UTF-8 的支援度很差，那時候遇到蠻多問題的，後來還是臣服於 Big5。  到了 FreeBSD 6 支援度已經很好了，便著手建造一個好用的 UTF-8 環境，進展最大的應該算是進 CSCC 之後，和 chenpc &#38; LY 討論了蠻多東西的，最後有這個我自己打 80 分的環境，所以有了這篇 Note。  這篇 Note 重點在於 UTF-8、256 Color &#38; 一些我常用的工具設定，我使用的環境是 FreeBSD 6.3 &#38; 7.0 with tcsh。
Putty Setting
主要是在 Window -&#62; Translation 的設定： 
Encoding 選擇 &#8220;UTF-8&#8243;，不要勾選 &#8220;Treat CJK ambiguous characters [...]]]></description>
			<content:encoded><![CDATA[<p>這篇是我對於 UTF-8 環境的設定心得，其實自己從 FreeBSD 4 就開始嘗試用 UTF-8 的環境了，但是我記得 FreeBSD 4對於 UTF-8 的支援度很差，那時候遇到蠻多問題的，後來還是臣服於 Big5。  到了 FreeBSD 6 支援度已經很好了，便著手建造一個好用的 UTF-8 環境，進展最大的應該算是進 CSCC 之後，和 chenpc &amp; LY 討論了蠻多東西的，最後有這個我自己打 80 分的環境，所以有了這篇 Note。  這篇 Note 重點在於 UTF-8、256 Color &amp; 一些我常用的工具設定，我使用的環境是 FreeBSD 6.3 &amp; 7.0 with tcsh。</p>
<h3>Putty Setting</h3>
<p>主要是在 Window -&gt; Translation 的設定： <a title="Putty Encoding Setting by Yi-Jheng, Lin (Alex), on Flickr" href="http://www.flickr.com/photos/yzlin1985/2455536783/"><img src="http://farm4.static.flickr.com/3061/2455536783_a07a45f591_o.jpg" alt="Putty Encoding Setting" width="455" height="433" /></a><br />
Encoding 選擇 &#8220;UTF-8&#8243;，不要勾選 &#8220;Treat CJK ambiguous characters as wide&#8221; (原因容後說明)。</p>
<h3>Locale Setting</h3>
<p>主要針對 LC_ALL &amp; LANG 做設定，$HOME/.cshrc 加入：</p>
<blockquote>
<pre>setenv LC_ALL en_US.UTF-8
setenv LANG en_US.UTF-8</pre>
</blockquote>
<p>LANG 我沒有設定 &#8220;zh_TW.UTF-8&#8243; 的原因主要是避免某些 tool 會看 LANG 開啟一些設定，例如 screen 會看 LANG 開啟 cjkwidth；mutt 也會看 LANG 選擇 charset。但我覺得這些設定可以很明確地在設定檔內指定，讓程式自動偵測反而容易讓人混淆，所以一律用 &#8220;en_US.UTF-8&#8243;，其它原因容後說明。  LC_ALL 基本上指定了很多東西，像是 LC_MESSAGES 等，這些細部設定可以參考 Handbook 修改。</p>
<h3>Screen</h3>
<p>Screen 經過許多人的努力，對於 UTF-8 和 Big5 之間的轉換已經很好了，唯一要注意的是，因為 Putty 有支援 256 色，Screen 也加入了 256 色的支援，所以在安裝的時候記得勾選 &#8220;XTERM_256&#8243;，為什麼要用 256 色？因為我覺得 coding 的時候一定要有一個好用的 Text Editor，尤其是我這種大部份工作都依賴 Console 的 programmer。我用的 Text Editor 是 vim，很剛好地，它支援 256 色，這代表我可以將 Syntax Highlighting 弄得更花俏，Coding 起來也舒適多了不是？<br />
<a title="screen options by Yi-Jheng, Lin (Alex), on Flickr" href="http://www.flickr.com/photos/yzlin1985/2461240772/"><img src="http://farm4.static.flickr.com/3036/2461240772_9edd4f7b51_o.jpg" alt="screen options" width="600" height="467" /></a></p>
<p>至於另一個選項 &#8220;CJK &#8211; Treat CJK ambiguous characters as full width&#8221;，可以在 Screen 使用 &#8220;cjkwidth on&#8221; 來修正某些字的字寬，上 BBS 很有用，但是這必須和 Putty &#8221;Treat CJK ambiguous characters as wide&#8221; 這個選項互相搭配才可以作用；但在經過各項測試後，發現在 mutt 中常收到一些廣告信，或是 Title 編碼不一樣的情形，雖然 mutt 也有自動轉換的功能，但是並非所有信件都能處理，尤其是廣告信，如果開啟了 Putty &#8220;Treat CJK ambiguous characters as wide&#8221; 反而亂得更嚴重，這個問題目前也沒什麼好解法，所以選擇不開啟這個選項；還有另一個原因是 dialog 也會因為邊線字寬的問題亂掉，雖然有 rafan 的 poorman box drawing patch 可以解決，但並沒有進 Screen ports，要自己手動 patch，麻煩了點，不過這並不是主要原因啦！主要還是因為 mutt 的問題沒辦法有個好的解法，所以權宜之下，選擇犧牲掉某些特殊字的字寬 (只是字看起來窄了點)。</p>
<p>Screen 的設定主要如下：</p>
<blockquote>
<pre># $HOME/.screenrc
defutf8 on
defc1 off
defencoding utf8

bind b encoding big5 utf8 # Ctrl-a b 轉 Big5
bind u encoding utf8 utf8 # Ctrl-a u 轉 UTF-8

# 256 Color Support
term xterm
termcapinfo xterm "Co#256:AB=\E[48;5;%dm:AF=\E[38;5;%dm"

# allow bold colors - necessary for some reason
attrcolor b ".I"
attrcolor i "+b"

# erase background with current bg color
defbce on</pre>
</blockquote>
<p>其實設定和網路上可以找到的差不多，不過要特別說明的是設定中的 term &amp; termcapinfo 名稱要跟環境變數中的 TERM 一樣，這樣才會對應到。在這裡我選擇使用 &#8220;xterm&#8221; 而不像網路上說的 &#8220;xterm-color&#8221; 或是 &#8220;xterm-256color&#8221;，主要是因為在 finch 一個奇怪的問題，如果設了 &#8220;xterm-color&#8221; 或是 &#8220;xterm-256color&#8221;，finch 當中的 Alt-C 和 Alt-M 搭配 Up、Down、Right、Left 不能正常運作，所以我後來決定使用 &#8220;xterm&#8221;，可是實際去看 /usr/local/misc/termcap 後發現其實都對應到同一組設定，這讓我覺得很奇怪，還要再找看看問題出在哪。</p>
<p>成功的話會看到這樣的畫面：<br />
<a title="screen - 256 Color by Yi-Jheng, Lin (Alex), on Flickr" href="http://www.flickr.com/photos/yzlin1985/2461240814/"><img src="http://farm3.static.flickr.com/2355/2461240814_295053c23c_o.jpg" alt="screen - 256 Color" width="635" height="261" /></a></p>
<h3>IRC Client &#8211; irssi</h3>
<p>我常用的 IRC Client 就是 irssi，在新的版本中已經預設加入了 Recode 的支援，也就是說可以針對各個不同的 Channel 或是 Message Window 設定編碼，它有點類似翻譯器，舉個例來說，當我設定了某 Channel 的 Recode 為 Big5，但我預設系統使用的是 UTF-8，那麼 irssi 接收時會將 Channel 中的對話當作 Big5 來轉換成 UTF-8，再輸出到畫面上；反之，你送出到這個 Channel 的訊息也會自動轉換成 Big5 後輸出，這個功能相當重要，尤其是每個 Channel 的編碼是使用者認定的，事實上 IRC Protocol 內部是沒有 Encoding 的設計的，所以決定要使用哪種編碼是由該 Channel 的使用者認定的，因此 IRC Server 上萬&#8221;碼&#8221;奔騰，所以 Recode 的功能有其必要性。</p>
<p>基本上要實現 irssi 的 UTF-8，網路上已經有相當多的教學文了，需要較詳細的設定可以參考 <a href="http://www.jeffhung.net/blog/articles/jeffhung/742/" target="_blank">JeffHung 這篇</a>。我這裡僅針對 UTF-8 的設定說明。進入 irssi 後，可以利用它內建的指令來直接修改設定，好處是不用看較複雜的 config 檔($HOME/.irssi/config)，如下設定：</p>
<blockquote>
<pre>/SET term_charset UTF-8
/SET recode_transliterate ON
/SET recode_fallback UTF-8
/SET recode_out_default_charset UTF-8</pre>
</blockquote>
<p>當設定完成後，必須將它儲存到 config 內：</p>
<blockquote>
<pre>/SAVE</pre>
</blockquote>
<p>然後針對各別的 Channel 或 Message Window 設定編碼，舉例來說：</p>
<blockquote>
<pre>/RECODE ADD #nctucs Big5
/RECODE ADD #bsdchat UTF-8
/RECODE ADD liuyh Big5</pre>
</blockquote>
<p>有加上 &#8216;#&#8217; 代表針對 Channel，沒有的則是 Message Window。同樣地，設定完也要下指令儲存到 config 內。</p>
<h3>Vim</h3>
<p>Vim 對於 UTF-8 的支援度已經相當地完整了，安裝前記得先把 libiconv 先裝起來，然後再裝 vim-lite 即可有自動轉碼的功能，簡單來說就是以 Big5 格式儲存的文件，打開會自動幫你轉換到 UTF-8 顯示，當然這還要加上一點設定 ($HOME/.vimrc)：</p>
<blockquote>
<pre>" 啟動後是使用 utf-8 編碼
set encoding=utf-8

" 新開的檔案預設是 utf-8 編碼
set fileencoding=utf-8

" 所有可能的檔案編碼
set fileencodings=utf-8,big5,euc-jp,gbk,euc-kr,utf-bom,iso8859-1

" 設定輸出到 terminal 的編碼
set termencoding=utf-8

" 將 unicode 中不確定的字符表示成雙字符，在 unicode 下才有用
set ambiwidth=double</pre>
</blockquote>
<p>有關 encoding, fileencoding, termencoding，我之前有<a href="http://blog.yzlin.org/2007/12/12/3/" target="_blank">寫過一篇文章</a>來解釋，大家可以參考一下。</p>
<p>上面有提到 Vim 支援 256 色，要顯示出 256 色需要兩個東西配合，一個是設定 Color Level，在 $HOME/.vimrc 加上：</p>
<blockquote>
<pre>set t_Co=256</pre>
</blockquote>
<p>如此可以啟動 256 色，接著要使用 256 色的 Color Scheme，上網 google 一下應該可以找到蠻多的，我自己<a href="http://vip.cs.nctu.edu.tw/~yzlin/256Color/yzlin256.vim">改了一份自己的</a>，將它放在 $HOME/.vim/colors/ 下，接著在 $HOME/.vimrc 加上：</p>
<blockquote>
<pre>colorscheme yzlin256</pre>
</blockquote>
<p>這樣便可以了。</p>
<h3>Mutt</h3>
<p>Mutt 只需要在 $HOME/.muttrc 下設定：</p>
<blockquote>
<pre>charset-hook ^us-ascii$ utf-8
charset-hook x-unknown utf-8
set allow_ansi
set ascii_chars=yes
set charset="UTF-8"
set locale="UTF-8"
set assumed_charset="utf-8:big5:gb2312"
set send_charset="utf-8:big5:gb2312:us-ascii:iso-8859-1:x-unknown"</pre>
</blockquote>
<p>這樣應該會正常許多。比較特別要注意的是，如果 Locale 設定 &#8220;zh_TW.UTF-8&#8243;，然後 Screen 打開 &#8220;cjkwidth on&#8221;，Putty 也勾選 &#8220;Treat CJK ambiguous characters as wide&#8221;，Mutt 會在字寬上判斷錯誤，造成畫面亂掉，尤其是許多 Spam Mail 的 Title 會很明顯讓整個字寬判斷錯誤；其實這不該完全歸疚於 Mutt，原罪還是 Mail 的編碼字寬很難去判斷和做適當的轉換。這也是為什麼我偏愛 Locale 設定 &#8220;en_US.UTF-8&#8243;，不要 CJKWidth 和 Putty 的字寬修正的原因，和 chenpc 經過幾番測試的結果，認為這是目前最好的解法。</p>
<h3>Misc</h3>
<h4>Finch</h4>
<p>Finch 本身已經是 Unicode 了，所以不用做額外設定。</p>
<h4>rtorrent</h4>
<p>rtorrent 在 $HOME/.rtorrent.rc 加上：</p>
<blockquote>
<pre>encoding_list = UTF-8</pre>
</blockquote>
<p>這樣檔案目錄和 File List 的顯示會正常很多，我有測試過 rtorrent (0.7.9) 和 rtorrent-devel (0.8.2)，rtorrent File List 較正常，只是選取到的名稱每個字會出現兩次；rtorrent-devel File List 則整個亂碼，這個部份可能要等以後的更新了。</p>
<h4>lftp</h4>
<p>lftp 是我在 Unix-like 系統下常用的 FTP Client Tool，它對檔名的轉碼很好用，只需在 $HOME/.lftp/rc 設定，下面是我常用的設定：</p>
<blockquote>
<pre>set ftp:charset UTF-8
set file:charset UTF-8
alias big5 set ftp:charset Big5; set file:charset UTF-8
alias utf8 set ftp:charset UTF-8; set file:charset UTF-8</pre>
</blockquote>
<h4>less</h4>
<p>在 $HOME/.cshrc 設定環境變數，用 less 看某些 Big5 編碼的東西會正常很多。CS 工作站上的 help 很需要：</p>
<blockquote>
<pre>setenv LESSCHARDEF "8bcccbcc18b95.."</pre>
</blockquote>
<p>這樣的 UTF-8 環境已經能應付我 90% 的需求了，如果有錯誤或其他更好的設定方式，也歡迎大家給我意見。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.yzlin.org/2008/05/14/22/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>SSH Agent Forwarding on Putty &amp; Screen</title>
		<link>http://blog.yzlin.org/2008/03/14/19/</link>
		<comments>http://blog.yzlin.org/2008/03/14/19/#comments</comments>
		<pubDate>Fri, 14 Mar 2008 12:25:57 +0000</pubDate>
		<dc:creator>yzlin</dc:creator>
				<category><![CDATA[BSD]]></category>
		<category><![CDATA[工具]]></category>
		<category><![CDATA[玩物誌]]></category>
		<category><![CDATA[電腦技術]]></category>

		<guid isPermaLink="false">http://blog.yzlin.org/?p=19</guid>
		<description><![CDATA[大家在登入工作站或是伺服器的時候，最常使用到的應該是 Putty (Pietty, PuttyTray, &#8230;etc) 這類提供 SSH 協定的終端機，最傳統也最麻煩的方式就是每次登入的時候都輸入密碼，比較好的方式就是使用 Key Authentication，創造一組 Public Key 和 Private Key，當登入的時候比對，如果 Match 便直接允許登入，不再需要輸入密碼。
但是，在其他的狀況下，這樣的方式也許不是相當適合。以我來說，我常常登入到一台主要的機器，然後再透過這台機器連到其他機器，而在工作當中，也可能在這些機器之間互連，這代表我必須將同一組 Public/Private Key 都放一份到這些機器中，或是建很多組 Public/Private Key 來做這件事，但對於安全性而言，這已經等同於把 Private Key 放到上面給人用了。幸好，SSH 提供了 Agent Forwarding 的功能，能夠讓我只需將 Private Key 放在自己的 Notebook 上，然後便可在這些機器之間暢行無阻了。有關 SSH Key Authentication 及 Agent Forwarding 相關的運作流程及知識，可以參考這裡，這篇只是教大家如何設定。
1. Basic SSH Key Authentication
要做到基本的 SSH Key Authentication，首先便是要產生一組獨一無二的 Key Pair (Public/Private Key)，在 Windows 上我使用 [...]]]></description>
			<content:encoded><![CDATA[<p>大家在登入工作站或是伺服器的時候，最常使用到的應該是 Putty (Pietty, PuttyTray, &#8230;etc) 這類提供 SSH 協定的終端機，最傳統也最麻煩的方式就是每次登入的時候都輸入密碼，比較好的方式就是使用 Key Authentication，創造一組 Public Key 和 Private Key，當登入的時候比對，如果 Match 便直接允許登入，不再需要輸入密碼。</p>
<p>但是，在其他的狀況下，這樣的方式也許不是相當適合。以我來說，我常常登入到一台主要的機器，然後再透過這台機器連到其他機器，而在工作當中，也可能在這些機器之間互連，這代表我必須將同一組 Public/Private Key 都放一份到這些機器中，或是建很多組 Public/Private Key 來做這件事，但對於安全性而言，這已經等同於把 Private Key 放到上面給人用了。幸好，SSH 提供了 Agent Forwarding 的功能，能夠讓我只需將 Private Key 放在自己的 Notebook 上，然後便可在這些機器之間暢行無阻了。有關 SSH Key Authentication 及 Agent Forwarding 相關的運作流程及知識，可以參考<a href="http://www.unixwiz.net/techtips/ssh-agent-forwarding.html" target="_blank">這裡</a>，這篇只是教大家如何設定。</p>
<h4>1. Basic SSH Key Authentication</h4>
<p>要做到基本的 SSH Key Authentication，首先便是要產生一組獨一無二的 Key Pair (Public/Private Key)，在 Windows 上我使用 puttygen。執行 puttygen 可以看到下面的畫面：<br />
<a title="puttygen 1 by Yi-Jheng, Lin (Alex), on Flickr" href="http://www.flickr.com/photos/yzlin1985/2332910792/"><img src="http://farm4.static.flickr.com/3246/2332910792_999ce41d38_o.jpg" alt="puttygen 1" width="483" height="462" /></a></p>
<p>按下 &#8220;Generate&#8221; 產生一組 Key Pair，在產生的過程當中，它會要求你隨意移動滑鼠遊標，然後透過移動來亂數產生這組 Key Pair：<br />
<a title="puttygen 2 by Yi-Jheng, Lin (Alex), on Flickr" href="http://www.flickr.com/photos/yzlin1985/2332910804/"><img src="http://farm3.static.flickr.com/2313/2332910804_e1ff140cc9_o.jpg" alt="puttygen 2" width="480" height="460" /></a></p>
<p>結束後便會有一組獨一無二的 Key Pair 了：<br />
<a title="puttygen 3 by Yi-Jheng, Lin (Alex), on Flickr" href="http://www.flickr.com/photos/yzlin1985/2332910826/"><img src="http://farm3.static.flickr.com/2134/2332910826_a17b334151_o.jpg" alt="puttygen 3" width="468" height="327" /></a></p>
<p>我們將產生的 Public Key 複製貼到：</p>
<blockquote><p>$HOME/.ssh/authorized_keys</p></blockquote>
<p>然後，再按下 &#8220;Save private key&#8221; 將其對應的 Private Key 存起來供 SSH Agent 使用。在中間可以看到 &#8220;Key passphrase&#8221;，它可以用來保護你的 Private Key，在進行 Key Authentication 的時候，會要求你輸入設定的 Key Passphrase，如果不符合，即使拿到了 Private Key 也是無法成功通過認證。</p>
<p>接著我們要利用 SSH Agent 來幫我們管理這些 Key Pair，在 Windows 中，我使用 pageant；執行 pageant，會在右下角看到它的 icon 出現，點選右鍵可以看到它的功能：<br />
<a title="pageant 1 by Yi-Jheng, Lin (Alex), on Flickr" href="http://www.flickr.com/photos/yzlin1985/2332084531/"><img src="http://farm3.static.flickr.com/2066/2332084531_c999f8c76f_o.jpg" alt="pageant 1" width="134" height="154" /></a></p>
<p>&#8220;View Keys&#8221; 可以檢視現在加入的 Private Key 有哪些，&#8221;Add Key&#8221; 顧名思義就是加入一個 Private Key，我們現在就是要將剛剛產生的 Private Key 加入到 pageant，在加入的時候，如果你剛剛有設定 Key passphrase，便要要求你輸入，這樣 pageant 在幫你進行認證的時候便不需要再手動輸入 Key passphrase 了：<br />
<a title="pageant 2 by Yi-Jheng, Lin (Alex), on Flickr" href="http://www.flickr.com/photos/yzlin1985/2332084561/"><img src="http://farm4.static.flickr.com/3109/2332084561_741a5985ed_o.jpg" alt="pageant 2" width="489" height="294" /></a></p>
<p>加入 Private Key 後，便可以看到我們加入的 Key 已經記錄下來了：<br />
<a title="pageant 3 by Yi-Jheng, Lin (Alex), on Flickr" href="http://www.flickr.com/photos/yzlin1985/2332084593/"><img src="http://farm4.static.flickr.com/3184/2332084593_e5bbc28933_o.jpg" alt="pageant 3" width="488" height="291" /></a></p>
<p>然後透過 pageant 來執行我們在 Putty 當中設定的 Session，便會自動幫你進行認證，認證成功便會看到這樣的訊息：<br />
<a title="putty 2 by Yi-Jheng, Lin (Alex), on Flickr" href="http://www.flickr.com/photos/yzlin1985/2332910742/"><img src="http://farm3.static.flickr.com/2356/2332910742_c5087bf9bb_o.jpg" alt="putty 2" width="494" height="146" /></a></p>
<p>要特別注意的是，很多人常常會問，雖然不必再輸入密碼了，但是為什麼還是要輸入帳號，其實只需要在 Putty 當中設定好預設登入的帳號名稱即可：<br />
<a title="putty 1 by Yi-Jheng, Lin (Alex), on Flickr" href="http://www.flickr.com/photos/yzlin1985/2332910710/"><img src="http://farm4.static.flickr.com/3231/2332910710_f9e9b21f50_o.jpg" alt="putty 1" width="454" height="432" /></a></p>
<h4>2. SSH Agent Forwarding</h4>
<p>要達到 SSH Agent Forwarding，我們必須在 Putty 的設定中動點手腳：<br />
<a title="putty 3 by Yi-Jheng, Lin (Alex), on Flickr" href="http://www.flickr.com/photos/yzlin1985/2332910766/"><img src="http://farm4.static.flickr.com/3289/2332910766_093404bf1b_o.jpg" alt="putty 3" width="453" height="432" /></a></p>
<p>將 &#8220;Allow agent forwarding&#8221; 選取就可以了。然後只需要將同一份 Public Key 放到其他會透過第一部機器連出的機器上，在第一部機器使用 SSH 的時候下：</p>
<blockquote><p>ssh -A &lt;SERVER_HOST&gt;</p></blockquote>
<p>便可以將第一台機器的 agent forward 出去。如此一來，只需要同一份 Public/Private Key 便可以在各台機器中暢行無阻，而且不用擔心 Private Key 需要放出去的風險了。</p>
<h4>3. SSH Agent Forwarding on Screen</h4>
<p>在試的過程中，如果有使用 Screen 這個好用工具的人，一定會發現，一旦進入到 Screen 當中，SSH Agent Forwading 似手就失效了，但是離開 Screen 一切又正常，為何會這樣？</p>
<p>主要是因為使用 SSH Agent Forwarding 會參考一個環境變數 &#8220;SSH_AUTH_SOCK&#8221;，這個在 Screen 當中並不會被帶入，因此會失效。所以如果要讓 SSH Agent Forwarding 能夠在 Screen 下正常運作，便必須要做一些手腳，在網路上其實有蠻多方法可以用，大部份是將 ssh 和 screen 都做一個 wrapper，主要的想法都是在進入 screen 後自動建立環境變數 (對 .screenrc 下手)，但這樣的想法只能確保 screen 自動建立以及已存在的視窗，對於新建立的視窗可能就沒辦法做到，所以我自己寫了個 shell script &#8220;setScreenSshAgent&#8221;：</p>
<blockquote>
<pre>#! /bin/sh
MKDIR=`which mkdir`
LN=`which ln`
if [ -n "$SSH_AUTH_SOCK" ]; then
    if [ ! -d "$HOME/.screen" ]; then
        ${MKDIR} -p "$HOME/.screen"
    fi

    if [ -z "$WINDOW" ]; then
        ${LN} -fs "$SSH_AUTH_SOCK" "$HOME/.screen/ssh-agent-screen-$HOST"
    fi
fi</pre>
</blockquote>
<p>這支程式主要是將當時的 SSH_AUTH_SOCK link 到 &#8220;$HOME/.screen/ssh-agent-screen-$HOST&#8221; 下，然後在 .cshrc 下加入：</p>
<blockquote>
<pre>$HOME/bin/setScreenSshAgent
if ($?WINDOW) then
    setenv SSH_AUTH_SOCK "$HOME/.screen/ssh-agent-screen-$HOST"
endif</pre>
</blockquote>
<p>這樣子就能在登入時更新最新的 SSH_AUTH_SOCK 到 &#8220;$HOME/.screen/ssh-agent-screen-$HOST&#8221; 中，然後在 Screen 建立新的視窗也會自動將 SSH_AUTH_SOCK 設定到此 link，如此一來，SSH Agent Forwarding 便能正常運作。</p>
<p><strong>Update: </strong>把一些設定改一下，原本的 .cshrc 裡的設定會讓在非家目錄下執行 Shell 出現找不到的問題，所以改成絕對路徑。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.yzlin.org/2008/03/14/19/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
