2016年10月24日 星期一

Apache Traffic Server & Varnish Cache 之我見. (Part 2)

上一篇忘了講,大部分的人弄 proxy,架構應該都是像下面這樣弄的:




















流量由 l4 load balancer 導入,可能用 round robin 或者是一般的 hash 將流量散到各台去,這樣會有幾個問題可能發生:

  1. 如果是 round robin,任意一個 url 都可能導到任意一台,假設我有 100 台 storage,如果很不幸的每次都是導到沒有 cache 的某台 storage,這樣對 Origin Server 就是一百次的 request,並沒有真的解決問題。
  2. 如果是用一般的 hash,全部的機器都健康的時候,hash 都維持得很好,cache hit 也可能都會不低,但是一但某台機器掛點,會重新 re hash,原本養的 cache 全都報銷了。
再講回 Apache Traffic Server,其實它源自 Inktomi 的 proxy server,設計精良,當年被 yahoo 併購之後,yahoo 只看到 inktomi 的搜尋部分業務,其他的東西都被冷凍起來,後來有人挖寶之後,發現了 inktomi proxy server,一用之後驚為天人,轉身變成 Yahoo Traffic Server,並且大量部署在 yahoo cdn 上。

不過後來可能因為政策改變,yahoo 內部自行研發了 uff 這套原本想要取代 yts 的 proxy server,所以將 Yahoo Traffic Server 在 2009 年捐給 Apache Project,原本一些在內部做 yts 研發的人員,大部分也同時成為 apache committer 來改善 Apache Traffic Server。

後來的後來,由於 uff 最主要的開發者離職,Apache Traffic Server 在 open source 社群中大量被改善效能,原本只能跑在 32bits 的環境,也改成對 64bits 相容。所以後來 Yahoo 又將 cdn 相關的 solution 改回來 Apache Traffic Server。


剛才講到 Apache Traffic Server 設計精良,內部對於 thread/event/network 都有各自的 processor,像是 carp 做 health check 的部分,就是丟給 event processor,然後會去呼叫 thread/network 相關的 processor 做更低階的處理,最後再透過 callback 之類的將最終狀態丟回原本的 caller。


讓我整個卡住的部分,其實就是在這邊,怎麼樣看,他都應該幫我開一個 tcp connection 出去,但是程式判斷的地方,他會先判斷 thread event type,如果不是他要的,就直接不處理,等到 event timeout 之後,就會去 callback 原本的 caller 來做後續的處理。可是我找不到任何的地方去決定 thread event type 呀!!!

因為我的 c++ skill 實在太差,在卡住三四天之後,覺得這樣下去不行,雖然手上有最終解決方案,就是 Apache Traffic Server cluster,但是終究是要 deprecated 的東西。所以我就開始找尋下一個替代方案,nginx 不行,因為 proxy mode 比較厲害的東西都被放在 nginx plus 裡面。那 varnish 呢?以前稍微試用過的經驗並不好。不過市面上可以用的 proxy 幾乎沒有了,每一套宣稱自己多厲害多厲害的 proxy,終究就只是很單純的 proxy,很多連自己對 client request/response, origin server request/response 都沒辦法額外處理。更不要講 performance 了。

在抱著試試看以及捧個人場的心情下,試用了一下 varnish cache,為什麼說捧個人場?因為 varnish 是 phk@freebsd.org 最近這十年來的力作,他幾乎都沒有再碰 kernel development,全心全力的做 varnish cache 的開發。

varnish cache 有下列幾個我覺得很棒的地方:
  1. bsd-2 clauses license,去他媽的 gpl。
  2. 沒有設定檔,一些參數都用 cli 方式傳進去,然後如果不會寫 vcl 也沒關係,backend server 相關資訊一樣可以用 cli 傳進去。
  3. vcl 很簡單,會寫簡單 perl 的人都會。
  4. vcl 不是直譯式處理,而是在 start-up 的時候,直接轉譯成 c code,馬上 compile 成 .so,varnishd load .so 起來處理,只要專心做好自己想要判斷的事情就好,memory leak/performance issue 等相關的事情完全不要理會。
  5. builtin vcl function 不夠用的話,可以自己寫 vmod 來擴充 function。
  6. log 什麼鬼的,varnish 全部都扔到 shared memory 去,另外有一隻 varnishlog 會從 shared memory 讀資料之後寫黨,所以什麼 log rotate 之類的事情,不用 kill -HUP varnishd,服務完全不會中斷。
  7. reload vcl 之類的也是可以 online 做,一樣服務不會中斷。
  8. 相關的 utility 做得非常好,varnishadm/varnishstat 之類的,幾乎都是商業等級的水準。
  9. 內建 health check,可以做到失敗幾次才會算真的失敗這類的情境。
  10. 支援各種 director,可以簡單應付各種場景。
    • fallback
    • hash
    • round robin
    • random
    • shard
不過 varnish 現在對我而言有一個瑕不掩瑜的缺點,雖然這個也可以用另外的程式做掉,但還是會覺得有點不舒服,那就是,他不支援 ssl,https 之類的要自己處理,這對於之後的 ios 可能會是個問題。

總之,varnish 算是簡單就達到我想要的功能,理論上會直接拿來使用。而 Apache Traffic Server 也不是完全沒有優點的,只是不會寫他的 plugin 的話,出廠預設的功能,其實是很難滿足需求。

2016年10月23日 星期日

Apache Traffic Server & Varnish Cache 之我見. (Part 1)

最近因為任務需要,需要自己弄一套 proxy/cache 的系統。

至於為什麼要自己弄?

  1. 當地國際頻寬貴,如果能在當地弄一份 static replica,可以省下很多錢。
  2. 但是在偏遠的地方自己弄 storage,光想營運成本就很高,尤其每樣都要做 HA 的時候,成本跟硬碟幾乎都是一路 * 2 * 3 上去。
  3. 既然不能搞 storage,那弄一份 cdn 總可以吧,基本上解決 20% 的 content,就省掉了 80% 的 cost。
  4. cdnetwork 之類的,幾乎都沒有在當地有 edge server。
  5. 所以即使用了 cdnetwork,還是要走國際頻寬出去,一樣貴。
原本想像中的架構如下:
  1. 最前面擋台 l4 load balancer,將流量 round robin 散到下面的 l7 load balancer 上。
  2. l7 load balancer 理論上會用 Apache Traffic Server 加上自己寫的 plugin,將前面進來的 request,透過 consistent hash 算過之後,平均導到後面的 storage 上面。
  3. consistent hash 只是個說法,重點是每台 l7 load balancer 自己要維護一份後面的 storage 的健康狀況表。
  4. storage 相對起來簡單,但是要能根據後面 Origin Server 的不同產生不同的 header 之類的,例如如果 Origin Server 是 S3,要能自動生出 s3 request header。
  5. 這樣做的好處在於,如果其中一台 l7 load balancer 壞掉,起碼有一台可以撐住。而後端的 storage,也會因為 l7 load balancer 已經用 consistent hash 算過,固定的 url 會送往固定某台,cache hit rate 會拉高,Origin Server 假設是 300T 好了,每台 storage 基本上可以只是部分就好,一旦任意一台 storage 壞掉,起碼可以先將 request 由隔壁來分擔,而不是全部養好的 cache 就全部掛光。





























剛才講到會用 Apache Traffic Server 來實做這些東西,為什麼呢?

  1. 畢竟我也是 ex-yahoo 呀。
  2. 畢竟我也摸了好一陣子的 yts & uff 呀。
  3. 畢竟我也是受到業界知名的嫩哥的薰陶。
Consistent Hash 就用 google 提出的 Jump Consistent Hash,而後端機器健康程度,要就是 plugin 自己開個 thread 定期去維護,不然就是透過 lmdb or mmap file 之類的,讓另外一支程式來幫你維護。

plugin 寫了一半,看到其實 Apache Traffic Server 有 cluster 的功能,看起來大方向其實跟我想做的雷同,只是方法不同。
ats cluster 的做法是,根本不分 l7 load balancer 還是 storage,全部都是 storage,只是一個 request 近來,會先查查自己肚子裡面有沒有 hit,沒有就發 udp multicast 出去問隔壁的有沒有人有 hit,有就直接抓來往 client 送。

諮詢嫩哥對於 ats cluster 的看法之後,他說 "cluster? 快要 deprecated 了呀" "現在你要用 carp 啦!"

carp 是什麼呢? 是 yahoo 針對這類的需求開發出來的一個 ats plugin,並且已經有送 pull request 給 ats 了,目標是在下一個版本的 ats 會包含這個 plugin。
想嚐鮮的可以先到 https://github.com/ericcarlschwartz/trafficserver/tree/TS-4723/plugins/experimental/carp 去查看。

既然 yahoo 都這麼有心,放出了方案給大家用,似乎不去試試看,好像還頗對不起 MM 的。

carp 光看設計,其實頗不錯的,health check 幫你做,也做 consistent hash,基本上我想要的他都做到了。很棒,立馬抓來 compile,load 進 ats 來試試看。

嗯嗯, 問題不大,最大的問題頂多是不會動而已!

對,他不會動,仔細查了一下相關的 code,寫法都是對的,但是他就是不會動!

好吧,一路追下去好了,TSContCreate,TSContSchedule,TSNetConnect 看起來每一樣都對呀!

不對,為什麼 TSNetConnect 裡面只要是 carp 要做 health check 的 connection,他就是直接不處理,然後最後等到 timeout?

喔,原來是 thread type 不對他就不處理呀!可是從頭到尾都沒有一個地方可以讓我自己決定要用哪種 thread 呀!

這個部分大概就卡了我三四天!!!

2016年3月23日 星期三

[Elixir] 安裝 erlang + elixir + phoenix framework

elixir 是架構在 erlang vm 上的語言,所以在開發程式之前,第一件事就是把 erlang 裝起。



  • Linux
    • 由於個人使用習慣,平常我個人都用 FreeBSD,linux 我大概只用 rhel/centos。
    • rpm 可以在 Erlang Solutions 下載,不過這個版本會順便將 wxGtk 也裝起來,個人並不喜歡。
    • 可以使用 rabbitmq 做好的 zero dependencies rpm
  • FreeBSD
    • 透過 ports,直接到 lang/erlang 下面 make install 就好了。
裝好了 erlang,下一步就是把 elixir 也裝好。
  • Linux
    • 我不確定有哪一個 distribution已經內建 elixir,但是同樣的  Erlang Solutions 有 package,但是只有給 debian/ubuntu 的而已。
    • 所以直接到 elixir 的 github 下載,解開之後打個 make install 就裝好了。
  • FreeBSD
    • 一樣很簡單,到 lang/elixir 下面 make install 就裝好了。
裝好 elixir 之後,基本上會有兩個東西會不停地在開發過程被用到:
  • mix - project management tool,任何你在開發過程會用到的工具或者流程,都會透過 mix 這一個 command 來執行,另外也可以自行編寫 mix task 擴充功能。
  • iex - interactive elixir shell,就是一個 elixir shell,一些簡單的想法可以直接在 iex 裡面實現及驗證。
再來就是安裝 phoenix framework,這東西有點像是蛋跟雞一樣,你要有 phoenix 的 mix task,才能夠建立一個 phoenix project,但是你也要先有相關的 package 安裝好了,才能有 phoenix mix task 能夠被使用。不過沒問題,elixir & phoenix team 都幫你想好了,透過 mix archive.install 就可以把 phoenix 裝好。

 mix archive.install https://github.com/phoenixframework/archives/raw/master/phoenix_new.ez  

裝好 phoenix 之後,打 mix -h 就可以發現多了一個 mix phoenix.new 的 task 可以用。
也可以打一下 'mix phoenix.new -h' 來看看相關參數。

2016年3月10日 星期四

[Elxir] 為什麼要用 elixir 呢?

開始的開始,其實我是先知道 erlang 這個語言的。

大約在 2007/2008 左右,那時候應該還是在 erlang 13.x 的版本,我忘記我從哪邊知道這個語言,一直想好好學好它,也買了書來看。

但是大概是 perl/php 這類語言的餘毒,讓我在學習 functional language 的路上沒能好好走完。
雖然一直都沒學好,不過我都還是持續在關心著 erlang,尤其這中間很多公司,都用了 erlang 做一堆神經病等級的產品,例如 whatsapp,例如 cowboy 等等。

而 elixir 這個架構在 erlang vm 上的語言,我大概是兩三年前在 erlang 的社群略有耳聞,但是由於之前對於 erlang 一直學不好的心理因素,就一直忽視他。

那到底是什麼樣的機緣,又讓我再度擁抱 erlang 甚至開始學習 elixir 呢?應該是因為工作需要吧!因為一些先天上的限制,軟體的 dependencies 其實是困擾的所有的開發人員,尤其是開發電信機房裡面的服務。

一開始我們選擇的 golang,寫起來簡單,相關的 unit test 都具備了,但是又似乎少了點什麼,如果程式因為任意原因死掉了,你必須自己監控,必須自己想辦法。即使 golang 有了 static link 這個降低 dependencies 的好處,但那還是不夠呀。

所以大約在去年七月,經過一些評估之後,我重回了 erlang/elixir 的懷抱:

  • ecosystem 完善
    • 有 hex.pm 這一個 package management site,任何人寫的東西都可經由這個網站發布,也可以輕易的跟 project 結合。
    • elixir 內建了 mix 這一個 project management tool,任何開發期需要的東西,都可以透過這個工具去呼叫,也可以自己寫 mix task 來把複雜的事情變簡單。
  • otp
    • Open Telecomm Platform
    • erlang 內建 otp,因為 erlang 就是為了交換機而被發明的語言,所以他很多特性,都是為了電信業而產生。
    • 而 otp 本身就有很多先進的設計,就是為了確保服務儘可能地沒有 downtime,例如 supervisor 可以檢控 process,當他掛掉會自動重新叫起來。例如 code hot swap 可以讓 daemon 持續服務,但是瞬間將版本升級。
  • async
    • 在 erlang 裡面,每一個 app 都是獨立的一個 erlang process,彼此用 message passing 溝通,所以要寄信,直接將相關資料扔給寄信的 process 即可,前端的 web 可以繼續服務。
  • no side effect
    • 也由於資料並沒有 lock 這類的問題,所以儘可能地降低 side effect。
  • 接近人類思考模式
    • erlang 說真的我還是沒認真寫過,但是 elixir 幾乎已經接近人類思考模式了,人並不會做一件事情,只有一個 function 然後裡面一堆 if/else,而是在最開始,就已經把很多事情直接分開。這樣的好處是,每個 function 就只做自己的事情。
  • phoenix framework
    • 如果只有 elixir + mix 這樣的工具,其實還沒辦法好好做事,畢竟什麼東西都還是要有個漂亮的介面。
    • phoenix framework 是用 elixir 寫的 web framework,再加上 ecto 之後,資料庫什麼鬼的都抽象化了。
    • 簡單的說,elixir 就像是 ruby,phoenix 就像是 ror,而依賴著 erlang 天生的高效能,可以快速地生出很棒的服務出來。
  • exrm + rpm
    • exrm 是一個 release tool,經過 exrm 的 task 處理過後,可以生出一個 .tar.gz 檔。
    • 將這個檔案直接 copy 到機器上,解開就可以直接跑起服務。
    • 像是 erlang vm 什麼的,都會在這個 .tar.gz 裡面。根本不需要預先安裝甚麼軟體。
    • 但是只有 exrm 對很多人來說可能還是不夠,所以有人又替 exrm 衍生出 exrm_rpm。
    • exrm_rpm 在 exrm 的基礎上,可以在 task 的最後,把 .tar.gz 轉成一個 .rpm。
    • 這個 rpm 裡面連 init.d 的 script 都有了,直接 yum install xxx.rpm,重新開機就所有服務一次到位。
評估完,就開始將原本用 php 寫的 web tool 改用 elixir 寫,整個工作從去年八月開始,中間加入了一些 linter,code analyst tools,並在今年二月左右,將整個 unit test/integration test 都做完,最後的 code coverage 約 85%。

本篇為起手式,之後會開始從怎樣弄一個 elixir project 講起,到我中間有用過的工具,然後最後以包出一個 rpm 為結束。

(不保證什麼時候會做好。)

2014年2月6日 星期四

go + clang

自從 freebsd 10.0 之後, 系統內預設的 compiler 就是 clang 了,

所以用 go + cgo 寫出來的東西, 跑 go build 的時候, 會出現

'exec gcc: No such file or directory'

這樣的訊息,

是因為 cgo 裡面直接假設大家的 compiler 都是 gcc, 所以他 hardcode 'gcc' 進去.

那有解法嗎?

有的.

用 -ldflags 把參數傳進去.



go build -ldflags '-extld clang'

這樣 go 就會用 clang 去做 link 的動作了.

2013年7月25日 星期四

Facebook 的 hiphop-php (aka hhvm)

什麼是 hiphop-php 呢?


  1. 基本上就是 facebook 自己實作的 php runtime,再加上很多特異功能。
  2. 第一代叫做 HPHPc,這是一個將 php transform 成 c++ 的版本,由於因為對開發者不友善,加上每次只要 php code 有變動,就得整個重新編譯,而編譯一次得花上好幾個鐘頭,所以 facebook 在 2013/02 放棄使用這個版本。(第一代其實還包括 HPHPi,HPHPd 等衍生的特殊版本)
  3. 第二代叫做 HHVM,將原本的編譯改成 vm 模式,加上 JIT 支援,讓 php 執行起來就跟在飛一樣快。
  4. wiki

那 hhvm 有什麼特異功能呢?

  1. 基本上他就是一個 base on libevent 的 http server,加上 php runtime。
  2. 但是你想得到的一些基本 http server 該有的他都有,例如 virtual host, gzip, keepalive, rewrite, acl 等等。
  3. 此外,還可以扮演 proxy/rpc/static 。
  4. 再來它可以開一個 admin server,bind 在特定的 port 上,提供一些 server status,以及一些管理上的相關 api。
  5. 非常快,在我的 i7-3770k + 32G ram 的機器上,跑一隻簡單的 php,出現了接近 10000 reqs/sec 的數據,當然這會跟著你的 php 程式複雜程度而減少。
  6. 容易 deploy,如果 hhvm 是 static link 的話,deploy 只需要將 binary scp 到所有機器上就完成了,根本不需要管相關的 dependencies library。hhvm 在跑起來的時候,其實需要額外的 php data file,但是他用了一個很變態的方法存放這些 php data file,把它藏在 hhvm binary file 的 .text section 裡面。
  7. fb 自己實作了不少特殊功能的 function,例如用 non-blocking 的方式連接 mysql。
  8. 還很多,我目前還在看當中。


那目前有什麼做不到的?

  1. 由於還在緊密開發,所以他官方宣稱只支援到 php 5.3,並且不是所有的 php extension,都可以在 hhvm 裡面使用。
  2. 例如資料庫的部分,目前僅支援 mysql/sql,有些人想要 mongodb driver,目前還在殷切盼望中。
  3. 文件缺乏,雖然 source code 是你最要好的朋友,但是不是所有人都能看 c/c++ 去瞭解整個系統的。
  4. i386/powerpc/sparc/ia64/arm 等平台都不支援,目前只支援 amd64(x86_64),arm 的話,據說不支援啦,但是某些地方有看到這個 keyword,這讓我想到之前聽到的 facebook 考慮用 arm 來當 web 的八卦。
理論上只要你用 mysql 當 database,沒用奇怪的 extension,那麼 hhvm 應該是可以直接拿來用,連 nginx/apache 等 web server 都可以不用安裝了。但是如果有用到額外的 php extension,那要就是等別人寫出對應的 hhvm extension,不然就不建議使用。(當然也可以自己下去寫看看)

2013年7月7日 星期日

我也來點勵志的好了.

很多的同事,一起工作久了,就會問‘你哪個大學畢業的?研究所呢?’,其實,我根本沒讀大學呀,最高學歷只有高中,還讀了三家,從省立高職日校,到省立高職夜校,最後只好認命地在私立高職的補校讀了三年,再多考一次資格考,才把高中同等學歷補齊。現在大家一直在講証照,一直講技職體系出了問題,我的經歷應該可以給技職體系的學生們一些激勵吧。那憑什麼給大家激勵?高職畢業,一張證照也沒有,在外商工作過,每天準時上下班,日子也過得舒服,這些應該當理由就夠了吧。

為什麼只讀高職,為什麼不讀高中,然後大學一路讀上去?這大概得從國中時代講起,國中的時候,幾乎都沒在認真讀書,大概上輩子有燒好香,所幸成績都還不錯。我們班算是前段班,同學們幾乎都是腦袋聰明,很會玩,就是不願意認真讀書。因為這原因,所以國三的時候,我就在想,是一定要讀高中嗎?不能走不一樣的路嗎?因此決定不參加高中聯考,只參加高職及五專聯考。最後上了省立永靖高工製圖科,讀了兩三個月就沒去上課,自動退學。隔年因為朋友的原因,報名了省立北斗家商的夜校廣告科,一樣讀了兩三個月自動退學。最後是某朋友勸我,就算怎樣不喜歡讀書,起碼得把高中同等學歷補齊,以後才不會後悔。因為這個理由,所以報名了彰化的私立正德工商夜校的資訊科 [1]。為什麼會是資訊科?班上男生的說法都一樣,大家都以為資訊科女生多,結果女生就被蜂擁而至的男生們排擠掉了,反而資料處理科的女生才多。:(

資訊科並沒有教太多資訊相關的東西,真的要講的話 ,隱約記得就是大易輸入法跟 8051 組合語言。輸入法對於寫程式來講,沒有太大意義,學校教輸入法,我猜大概是要大家多一樣才藝,然後比賽誰速度快。8051 組合語言,教的時候大部份的人都聽不懂,考試的時候好像也沒考,真的要實做,只要有一兩個會寫,互相 cover 就通過測驗了。

講完了學歷,再來講電腦相關的經歷。最開始接觸電腦,是在國中畢業之後,白天讀永靖高工,晚上我自己跑去一家電腦公司當工讀生,在那邊認識了電腦上的啓蒙師傅。也因為他,所以開始學著架設 dial-up BBS [2]。當時的作業系統都是 MS-DOS,沒有多工, 一台 pc 同時間只能讓一個用戶撥接上來用。那時對於所謂的作業系統,我一點概念都沒有,頂多就是玩耍著 QEMM,讓可用記憶體增加一點,玩耍著 pctools,修改遊戲存檔,讓玩遊戲練功的時間縮短,不過也因此學習到什麼是 16 進位。

當作業系統是 MS-DOS 的電腦,進入了 BBS 模式,就是等著讓別人撥接進來用,自己只能在旁邊乾瞪眼,因此問了師傅,有沒有什麼方法,可以讓很多人同時使用一台電腦?他說有種系統叫做 unix,但是他並沒真的用過,也不熟。而他自己架設的 BBS 上,是透過一個叫 desqview/X [3] 的程式,讓一台電腦,做到簡單的多工,來達到架設多線 dial-up BBS 的目的。

用 desqview/X 沒多久,OS 世代進入了 windows95,據說不需要 desqview/X 這類的程式,也可以做到多工。我突然想起 unix 這個 keyword,很想知道那到底是什麼樣的系統。當時台灣有些先進在推廣 linux,因此買了書,使用光碟安裝起自己的第一個 linux 系統,那時比較有名也比較友善的,應該是 Slackware 吧,RedHat 還沒出現在市場上。

由於對於 linux 系統不熟,所以遇到了一些小問題的解決辦法,就是重新安裝整個系統。也因為這樣的反覆安裝,開始對於整個環境比較熟悉。既然系統比較熟悉一點了,那就學一下寫程式吧!PHP 的前身 php/fi 剛出現,因為語法跟別的語言比較起來相對簡單,就花了一些時間好好地學了一下 php/fi,然後忘了什麼原因,同時間也學著寫 perl

linux 用了一年多,多數時間都在摸索,剛好交大的 jdli 在推廣 FreeBSD,想說反正都一樣是 unix like 的系統,多學一點也無所謂,就順勢換到了 FreeBSD,沒想到一用成主顧,自此在自己的機器上,就很少安裝 linux 了(測試或者案例需要不算)。

FreeBSD 當時的社群,非常壯大,每個人都可以直接參與,可以送自己想改的東西回去。由於年紀還輕,熱血過剩,所以想了很多想做的東西,例如 FreeBSD 在中文使用上的修正什麼的,但是 submit 幾次 patch 都沒有人理會,就自作主張的用英文寫了封信,給 jkh@ [4],問他有沒有方法,可以讓中文相關的事情有人來關注?他就問我有沒有興趣接下這個任務?我回答說‘可是我並不是那麼懂 c 呀’,他回我說‘沒問題的’,因此,在 1997 年的 11 月,正式變成了 FreeBSD.org 的一員。[5]

成為 FreeBSD 的成員之後,除了持續在 BBS 上的 tw.bbs.386bsd 回答問題之外,偶爾也會寫一些跟中文相關的文章。有討論自然少不了吵架,也因為吵架,催生了 FreeBSD FAQ 繁體中文版。當時號召了好幾個 bsd 板上認識的網友,大家在空閒時間裡,將 FreeBSD FAQ 翻譯成繁體中文。因為我是 committer,也就順理成章的將這些成果變成官方的 FAQ 繁體中文版,並且直接在 FreeBSD 官方網站上就可以看到。[6]

1999 年當兵,2000 年底退伍,退伍之後工作。這時,社群的一些人,開始改用 IRC 作為聊天以及交換資訊的途徑。最早大家用 BitchX 這個 client,同時有另外一個叫做 irssi 的 client 好像也很不錯。經過測試之後,發現 irssi 無法正確的刪除中文字。某天晚上,熬夜研究了一下這部分的 code,並參考了 clive@ 當時對於 bitchx 的一些修正,終於將這問題解決。在 irc 讓大家測試沒問題之後,寫信通知 irssi 的作者,他馬上就發佈了一個包含這個修正的版本。[7]


[未完, 下次再講工作做過哪些好玩的事情吧!]

Ref:
  1. 正德工商已經改名為正德高中,是一所綜合高中,據說升學率不算低,算是彰化不錯的私立學校了。不過真實狀況到底是怎樣,我並不清楚。
  2. 不是 ptt 那種 internet bbs,而是透過 modem 撥接的 bbs,當時比較代表性的,有superbbs/ra/rbbs/powerboard 等。
  3. 後來才知道 X 代表的就是 XWindow,在 DOS 上實作出 X server 真的是很厲害。
  4. FreeBSD 的 founder,後來去蘋果當 unix 部門的主管,最近轉職到 iXSystem 當 CTO。
  5. 那時候好像還在正德讀第三年。
  6. 後來 FAQ 格式改版過很多次,由於大家工作的工作,上大學的上大學,加上我個人當兵的原因,沒有餘力跟上最新的變化。
  7. irssi 後續的中文修正,是由 mhsin 接手,他同時也是修正 windows 上常用的終端程式 putty 中文相關問題的長輩。