作者: Hui-Hong YOU

  • 讓 Drupal 產生適合餵給 AJAX 的精簡版 HTML 文件

    Drupal 預設會盡力生出能通過 HTML validator 檢驗的文件,並且會盡力為各個 tag 添加各種 attributes 如 id, class, alt, title 等。在 Drupal 7 裡頭,搭配 Zen 5 的版型引擎,甚至能直接生出 HTML5 & Responsive Design Friendly 的文件。

    相對來說,如果要用 Drupal 生出的網頁來餵給 AJAX 函式庫如 jQuery 處理,這樣鉅細靡遺的文件反而是個效能上的負擔。為此,我們可以透過簡單的幾行程式,讓 Drupal 生出比較不那麼囉唆的 HTML 文件。

    首先就是實作 hook_preprocess_page(),比如這樣:

    function my_module_preprocess_page(&$variables) {
      if ( isset($_GET['ajax']) && $_GET['ajax'] == 1 ) {
        $variables['theme_hook_suggestions'][] = 'page__ajax';
      }
    }

    透過自訂新增 theme_hook_suggestions,我們可以告訴 Drupal 系統:「如果我後頭指定 ajax 變數為 1,請優先採用 page--ajax.tpl.php 這個模板來輸出資料」。

    再來我們實作 hook_preprocess_html():

    function my_module_preprocess_html(&$variables) {
      if ( isset($_GET['ajax']) && $_GET['ajax'] == 1 ) {
        $variables['theme_hook_suggestions'][] = 'html__ajax';
      }
    }

    舉一反三,當 ajax=1 時,我們要系統優先採用 html--ajax.tpl.php 這個模板來輸出資料。

    至於 page--ajax.tpl.php 長什麼模樣呢?在我們啟用的版型 (theme) 裡的 templates 子目錄裡(例如:sites/default/themes/mytheme/templates/),我們可以加進一個內容只要一行打死的 page--ajax.tpl.php 如下:

    <?php print render($page['content']); ?>

    意思就是說:我的頁面部份只要把主要內容 (content) 印出來就好,其餘什麼側欄啦頁首啦頁尾啦導覽工具列啦我全~部都不要。

    然後接著就是同樣一行打死的 html--ajax.tpl.php 如下:

    <?php print $page; ?>

    類推,我們不需要輸出 <html>, <head>, <body> 等我們在做 AJAX 呼叫時用不到的資料,請給我重點部份就好。

    這就是大概的施作方法,只要 URL 後頭補個參數 ajax=1(在 jQuery 裡可以放在 data 裡自動餵食)就會赤裸裸地展露該 resource 的重點部位。(怎麼寫得有點 A 的感覺…?)

  • 自己打包的 Kaffeine Arch Linux PKGBUILD 原始檔

    我把先前自己修過,但是 upstream 至今還是沒採納的 Kaffeine 修正,再打包為 Arch Linux 的 PKGBUILD,放在這裡給大家一個方便,敬請笑納:kaffeine-git-1.2.2-2.src.tar.gz

  • RubyConf.TW 2012 雜記

    まつもとゆきひろさん(プログラミング言語Rubyの父)と私。
    まつもとゆきひろさん(プログラミング言語Rubyの父)と私。
    • 不同於去年幾近是 RailsConf.TW,今年的議程,實在是誠意滿點、太營養了。而且請到包括 Ruby 的阿爹 matz,與 YARV 的阿爹 ko1 等日本 Ruby 圈的高人,起初在 Twitter 上知道這個消息後,我就非常驚喜,暗忖今年非得搶到票才行!
    • 有幸在 Day 0 的伯朗咖啡館見面會聽到 matz & ko1 與大家談 Ruby,還跟 matz 合照,非常開心。
    • 辦在新光三越天母店的伯朗咖啡館見面會,由於抓不準時間,所以我決定提前一小時離開辦公室,結果成了最早到的本地人,與幾位香港朋友和 Matthew Rudy 等小聊了一下,但是自己的英語口語能力實在太糟,最後形成了我鴨子聽雷的窘態,只能默默聽他們聊,下定決心,接下來在英語聽說這方面一定要再加強才行。
    • 倒是由於「強迫自己只看 NHK」的訓練,讓我雖然日語口說還是不 OK,但是多少還能在此次的日語翻譯 @sho0416 翻譯 ko1 的話前,先對一些笑點做反應。語言真的要勤於使用,沒有立竿見影的捷徑可走。
    • 香港朋友跟去年的講者之一 Chen Jack S Y 給我的感覺一樣,就是技術扎實,表達能力也很好,跨國人才當如是。現今的台灣正在爭論高階人力被挖空、年輕人想塊陶(←網路用語的刻意諧音錯字)的現象與意義,但是如果沒有足夠的溝通表達能力,要往哪陶?這點我的確該好好反省。
    • 此次場地農訓協會沃田旅店天母會議中心除了無線網路出包以外,我全然無從挑剔,太滿意了。交通也不是如自己早先擔憂的那樣不便,兩天都因為很早就到芝山站,沒有搭乘大會提供的接駁計程車,搭公車也很好等、很快就到會場了。
    • 兩天午餐因為這個緣故,眾人都叫好。
    • 對此次大會網站的設計者四點設計留下了深刻印象
    • 贊助商場次 David Tian 講的是實務經驗分享,而不是在老王賣瓜、自吹自擂打廣告,很棒。
    • Matz 的 keynote 很激勵人。
    • Jserv 的場次介紹 mruby 應用,讓我很想拿 mruby 來玩某種用途,不過東西沒做出來之前,還是保守一點好。
    • 這次不少講者都在不約而同鼓吹與會者即刻試用 Ruby 2.0 & Rails 4。
    • Sebastian Burkhard 當場將 RubyJS open source 出來,熱血!
    • Ko1 講 Ruby 2.0 的 VM 設計,很有趣。他在此場次當中介紹了 Ruby 2.0 提供的幾樣似乎還沒有人提過的程式碼分析功能。
    • Hiroshi SHIBATA 的場次,讓我想起了很久很久以前,我曾經幫 tDiary 提供中文語系翻譯,不過後來由於服兵役、架設環境不足等緣故,我就沒有繼續使用 tDiary 寫 blog 了。
    • 繼 COSCUP 2007 上聽過古哥分享,這次是第二次,古哥落落大方、幽默風趣的風格仍舊沒變,講 RubyMotion 也讓我覺得很有趣。
    • 龍哥分享他從讀 Ruby 的 C source code 來學 Ruby 的經驗,揭示了一些平常純用 Ruby 的人罕知的 Ruby 語法,讓我既感佩又汗顏,自己相形之下極度懶惰、不用功。

    真的很感謝主辦團隊,以及諸位講者,給了我充實的兩天。也期許自己來年(後年)在 Ruby 相關主題的投入,有可以說嘴的餘裕,且有相對充足的口語表達能力,能夠確實表達自己的想法與實作。

  • 修正 Kaffeine 的台灣地區頻道與節目表亂碼

    嘗試把我改裝 Ubuntu 的 Mac mini 充當數位電視盒用,但是幾個程式都兩光兩光的,其中 Kaffeine 還算正常,惟仍有台灣地區頻道與節目表亂碼問題,於是自己修復了一下,重新打包一個正常的。

    • apt-get source kaffeine
    • sudo apt-get build-dep kaffeine
    • sudo apt-get install devscripts
    • cd ~/kaffeine-1.2.2
    • 照著我改好的 patch 所示,修好相關檔案
    • dpkg-source --commit
    • debuild -us -uc
  • 把 Arch Linux 轉用 Systemd

    老實說,我覺得把原本可以用 /etc/rc.conf 一檔解決諸多設定,改為要分散到好幾個設定檔,有點被打 KISS principle 的巴掌,特別是我在不久前的 COSCUP BoF 還大吹大擂。不過,既然官方「鼓勵」快點轉移,我也就一點一滴地照著 Wiki 說明轉換。

    轉用 Systemd 也不盡然這麼讓我為難與厭惡,至少帶來的加速開機效果是很顯著的,這是因為 Systemd 採用並列式(同時跑多個)、條件式(需要時才跑)啟用各項系統服務的關係。

    也因此,以往有些東西在 Sysvinit 一項接一項前後相依輪流跑的方式下,是保證可以正常執行的,而改用 Systemd 之後就不一定了,像是我會為 ThinkPad 的 TrackPoint 調整一些自訂參數,寫在 /etc/rc.local 裡跑,就未如預期在 Systemd 底下跑,所以改用 udev 寫 rules 來控制:

    KERNEL=="serio2", SUBSYSTEM=="serio", DRIVERS=="psmouse", WAIT_FOR="/sys/devices/platform/i8042/serio1/serio2/sensitivity", ATTR{sensitivity}="170", ATTR{speed}="185", ATTR{press_to_select}="1", ATTR{thresh}="6"

    一不做二不休,把一樣寫在 /etc/rc.local 的 ThinkPad SMAPI 電池充電閾值設定改用 udev,至此,我的 /etc/rc.local 就可以清空了:

    SUBSYSTEM=="platform", DRIVERS=="smapi", RUN+="/bin/sh -c 'echo 30 > /sys/devices/platform/smapi/BAT0/start_charge_thresh'"
    SUBSYSTEM=="platform", DRIVERS=="smapi", RUN+="/bin/sh -c 'echo 85 > /sys/devices/platform/smapi/BAT0/stop_charge_thresh'"

    還有,我有使用 Miredo 來取得 IPv6 address,在 Systemd 環境下也會因為 NetworkManager 太晚建立有效網路組態而啟動失敗,為此,我必須對 /usr/lib/systemd/system/miredo.service 做個小小修改(放在 /etc/systemd/system/ 底下間接覆寫),加上 Restart 與 RestartSec,讓這項 service 能夠自動重試啟動:

    [Unit]
    Description=Teredo IPv6 Tunneling Daemon
    After=network.target
    
    [Service]
    ExecStartPre=/usr/sbin/miredo-checkconf /etc/miredo/miredo.conf
    ExecStart=/usr/sbin/miredo -f
    ExecReload=/bin/kill -HUP $MAINPID
    Restart=on-failure
    RestartSec=16
    
    [Install]
    WantedBy=multi-user.target

    照著  Wiki 做,直到 /usr/bin/journalctl (Systemd 底下類比 dmesg 的程式)的 log 裡看不到明顯的紅字錯誤,大概就差不多搞定了。

  • 把 Mac mini 1,1 (early 2006) 改裝 Linux OS

    原本這台機器買來是打算用來玩 iOS 開發,只是過程挫折重重。

    原機主已經把 CPU 升級為 Core 2 Duo,照 Apple 官方對系統要求的說法,我應該可以安裝 OS 10.7 Lion,實則不然,因為 Apple 是認機器型號資訊來判斷給不給裝,如果不在符合的機器列表裡,就直接在線上商店拒絕購買 Lion。

    「知情」的人看到這邊可能會急忙喊:可以啊!你只要對安裝檔做一點修改,就可以裝進去了。

    是啊,我都寫出來了,我怎麼會不知道?問題在於爽度。明明硬體條件符合、明明我是想要用正版,卻搞得自己又像少年時代一樣偷偷摸摸的做些 cracking 的勾當,買官方機器卻又像在用 hackintosh,啊是怎樣?何必那麼作賤自己?我沒尊嚴嗎?

    停在 10.6 Snow Leopard,代表沒得免費取得新版的 XCode 開發工具,所以呢?請付年費取得開發者資格。

    現在問題又來了,根據 Apple 的潛規則,在次二版 OS X (10.8) 推出後,10.6 就會像孤兒一樣,不保證有安全更新。於是這台裝不了新版 OS 的機器等同也成了被放棄的孤兒,除非比照柏克萊的準則,機器不上網、不跑那些要緊的應用、不放那些重要的資料。

    若比照其它一些 desktop OSes 的支援年限,我不覺得 Apple 有何過份之處,只是 Microsoft 的 Windows 2000 直到 2010 才宣布停止提供安全更新,讓我覺得 M 社能搏得許多企業信任,不是沒有道理。

    最後我決定把這台 mini 改裝 Ubuntu 12.04 LTS,讓它繼續安全運轉下去,不要成為潛在的安全隱憂;需要用 Mac OS 的場合時,用另一台 Air 頂著就好。只是我想那台 2,1 版的 Air 好景也沒剩多久…。

    Mac mini 1,1 的 EFI 是 32-bit (i386) 的,雖然 Core 2 Duo 可跑 64-bit (amd64) Linux,但是因為這個限制,所以就算安裝 64-bit 版 Ubuntu,實際上還是走 BIOS 相容模式途徑來啟動,不過根據文件指出,這樣反而簡單。

    安裝前,我先在 OS X 裡安裝 rEFInd,且指定要安裝在 EFI 的分割區 (ESP) 裡,因為我不打算保留 OS X。

    然後我從這裡取得 ubuntu-12.04.1-desktop-amd64+mac.iso 製作安裝光碟,開始安裝 Ubuntu 12.04。

    規劃檔案系統時,務必切記保留 EFI 分割區以便使用 rEFInd 選單,不然日後開機只能按 Option 鍵選擇開機磁碟,有些麻煩;且記得開機程式要裝在 /boot 所在的分割區 /dev/sdaX,不要照預設值直接寫到 /dev/sda。大概只要注意這兩點,改裝 Ubuntu 甚至是其它 Linux OS 其實沒什麼困難。