推薦《An Introduction to Programming in Go》這本書...

書的資料:

An Introduction to Programming in Go.
Copyright © 2012 by Caleb Doxsey
ISBN: 978-1478355823

以及網站:「An Introduction to Programming in Go」。有平裝實體書版本,也有電子 Kindle 版,網站上有 PDF 可以下載,或是直接 HTML 觀看。我是看完 HTML 版後買了一本 Kindle 版來翻...

這是一本講程式語言 Go 的入門書。看完後,我覺得這不是寫給第一次接觸程式語言而需要自己學習的人。這本書的編排,以及 Go 程式語言的特性,是寫給想要用 C++ 解決 C 問題卻弄的滿頭包的人另外一個方案。語言的特性很明顯可以感覺到 Go 想要找出更自然 (以及「優雅」) 的方式解決問題。

第三章講資料型態提到內建了 uint8uint16uint32uint64int8int16int32 以及 int64,以及 byte == uint8rune == int32。以前需要透過 autotools 的類的程式處理,現在是程式語言直接定義好。

然後支援 float32float64,以及 complex64complex128 直接避免 sqrt(-1) 的問題!內建 boolean (truefalse),把以前的壞習慣 (直接拿數字型態判斷) 處理掉...

第六章講內建 Arrays、Slices、Maps,這時候就可以發現 fmt.Println 可以直接輸出 (以前 C 就沒辦法用 printf 大絕直接對 array 輸出!) !然後很嚴格的不讓你在整數與小數之間亂轉...

而內建 Maps 這件事情超重要,已經是現在程式語言的基本資料型態 XD

第七章描述 Functions,把以前只能傳單變數的問題解決,並且介紹 Closure,然後介紹 Defer!是 Defer 啊!(該死的 fd leak...)

第十章 Concurrency 把以前用 POSIX threading library 的痛給解掉,多個 thread 要怎麼有效的互相傳資料一直都是痛 (超痛),引入 channel 的觀念內建進 Go...

很推薦購買的一本書,天瓏如果有進的話應該會再去拿一本實體...

在 Mutt 上看 html 信件...

花了一些時間設定 mutt,本來在 terminal 上面沒打算看 html 信件,不過後來還是決定設起來,至少可以看到 html 的文字部分再決定要不要轉到 gmail 上面看...

~/.muttrc 裡面加上:

auto_view text/html

另外在 ~/.mailcap 裡面指定用 w3m

text/html;/usr/local/bin/w3m -I %{charset} -T text/html -dump %s; copiousoutput

window 的 hashchange (onhashchange) 事件

hashchange 是 HTML5 event,紀錄一下目前支援的情況:

目前 IE6/IE7 常見的模擬方式是透過 hidden iframe 做類似的效果...

另外在偵測瀏覽器是否有支援 hashchange 可以利用「Detecting event support without browser sniffing」這篇說明的方式偵測是否有支援特定的 event,可以避免使用 browser sniffing。

Markapl:Markup as Perl

Markaplgugod 寫的 Perl module,這是在 miyagawa (宮川達彦) 的 Sunaba 模組上看到的... 以 Perl 的語法建立 HTML。

目前 CPAN 上面 Markapl 的不是最新版 (0.11),在 GitHub 上的 Markapl 比較新... (據說是作者忘記在 release 0.11 後有 commit 了,在寫這篇文章的時候已經 release 新版,等下應該就會看到了...)

至於範例... 直接參考 Sunaba 的 View.pm 會比較快。(我故意連到特定版本,避免之後改動架構這個檔案被搬走。目前版本的 View.pm 請點這個連結)

用 Markapl 除了可以用 Perl 語法外,另外一個「好處」是強迫自己將 css 與 javascript 搬到 template 外面,因為 template 內實在是不好寫... (用「q/.../」?用「<<CSS;」然後「CSS」結尾?gosh XD)

另外補充一點,範例上都沒有 DOCTYPE,請用「outs_raw('<doctype html>');」加在 html 前即可。

Perl 的 Object::Destroyer

使用 HTML::Tree 時因為有 circular reference,會要求你要使用 ->delete() 告知 object 打斷 reference 以避免 memory leak。於是就得很小心寫,要注意每個步驟以免某些狀況下忘記 ->delete() 而造成 leak:

my $html = HTML::TreeBuilder->new_from_content($body);
foreach my $element ($html->look_down('a', qr{某個 RE 條件})) {
    if (符合某個條件) {
        # 做某些事情...

        $element->delete;
        $html->delete;
        return;
    }

    # 做某些事情...
    $element->delete;
}
$html->delete;

後來找到了 Object::Destroyer,利用另外一個 object 的存活幫忙回收,於是就可以簡化成:

my $html = HTML::TreeBuilder->new_from_content($body);
my $htmlD = Object::Destroyer->new($html, 'delete');
foreach my $element ($html->look_down('a', qr{某個 RE 條件})) {
    my $elementD = Object::Destroyer->new($element, 'delete');
    if (符合某個條件) {
        return;
    }
    # 做某些事情...
}

這樣就不會 leak 了...

測試 wkhtmltoimage 的效果

在「FreeBSD 上使用 wkhtmltopdf 做網頁擷取」看到有人在 FreeBSD 上用 Linux emulator 跑 wkhtmltopdf 成功,那麼 Linux 上當然更沒問題啦...

同一個計畫裡有 wkhtmltoimage,可以直接輸出成 PNG 格式,不過輸出的 PNG 沒有壓縮過 (應該吧,下面這張測試的原始輸出是 ~10MB,處理後是 ~500KB),要用 pngcrush 處理後才會比較小。

不過 PIXNET 的網頁都會 segmentation fault 是怎樣 XD

Update:在「Segmentation fault while generating http://www.pixnet.net/」這邊回報後,trunk 版修正了。

wkhtmltoimage 輸出結果在這,點下去會出現原圖:

之前透過 Firefox 的方法的輸出結果,點下去會出現原圖:

可以看出來字體的部份有差... 不過處理的速度與方便度比 Firefox 好太多了。

在 Linux 上架設 Screenshot Service (2010 年了?)

在 2008 年的時候 xdite 寫過一篇「在 Linux 上架設 Screenshot Service」,不過現在是 2010 年了,不少當初有問題的地方都已經改善了,現在要架比之前方便不少...

測試的平台同樣是在 Linode (referral code 是 fdbacc96dbddafce9ba444dd678357416d0323d5) 上跑 Debian lenny (也就是 5.0 版),為了避免 Adobe Flash PlayerLinux amd64 上會出問題,我在 Linode 上用 32bits 版。

Linode 把預設的 Debian 裝完後,先把整個系統升級到 Debian squeeze 並且重開,然後先裝「locales」這個套件,再用 dpkg-reconfigure locales 把 en_US.UTF-8 以及你自己會用到的 locale 勾起來。

接著開始裝必要的套件:

  • flashplugin-nonfree
  • iceweasel
  • ttf-arphic-bkai00mp
  • ttf-arphic-bsmi00lp
  • ttf-arphic-gbsn00lp
  • ttf-arphic-gkai00mp
  • ttf-arphic-ukai
  • ttf-arphic-uming
  • ttf-wqy-zenhei
  • xvfb

Iceweasel 其實就是 Firefox,因為商標問題而在 Debian 上有不同的名字。在英文版維基百科的「Mozilla Corporation software rebranded by the Debian project」這篇文章裡把前因後果講得很清楚,這邊就不提了...

除了必要的套件外,接下來裝 TightVNC server,準備透過 VNC 設定 Iceweasel。設完後可以移除掉或是留下來,我自己是留下來 (反正檔案不大),有時候可能要進去 about:config 調整參數...

TightVNC server 用 tightvncserver :0 跑起來,然後遠端連進去把 Iceweasel 跑起來測試看看有沒有問題 (可以透過 PuTTY 的 tunnel 將傳輸過程加密),沒有問題的話就裝「torisugari: Command Line Print」這個套件,裝好後再把 Xvfb 跑起來,用這個指令抓圖:

DISPLAY=:2.0 iceweasel -print http://zh.wikipedia.org/ -printmode png -printfile ~/zh.wikipedia.org.png -printdelay 10

抓出來的 screenshot 就會像這樣:(點這裡看原大小圖片)

Flash 也沒問題:(點這裡看原大小圖片)

比起之前的方法,現在的方案有兩個好處:首先是 plugin 是照正規方法裝進去,而不是直接丟 xpi,可以避免遇到奇怪的靈異現象時懷疑是不是安裝時硬塞造成的。再來是 Iceweasel 會在抓完就 shutdown,所以在網路速度夠快的時候可以提前結束,而網路不夠快時也不用擔心抓到未完成圖...

當然剩下有很多細節要處理啦,不過那是另外一回事了...