• My Fontconfig

    ~/.config/fontconfig/fonts.conf:

    < ?xml version='1.0'?>
    < !DOCTYPE fontconfig SYSTEM 'fonts.dtd'>
    <fontconfig>
     <dir>~/.fonts</dir>
     <alias>
      <family>serif</family>
      <prefer>
       <family>Bitstream Vera Serif</family>
       <family>DejaVu Serif</family>
       <family>FreeSerif</family>
       <family>Liberation Serif</family>
       <family>WenQuanYi Micro Hei</family>
      </prefer>
     </alias>
     <alias>
      <family>sans-serif</family>
      <prefer>
       <family>Bitstream Vera Sans</family>
       <family>DejaVu Sans</family>
       <family>FreeSans</family>
       <family>Liberation Sans</family>
       <family>WenQuanYi Micro Hei</family>
      </prefer>
     </alias>
     <alias>
      <family>monospace</family>
      <prefer>
       <family>Bitstream Vera Sans Mono</family>
       <family>DejaVu Sans Mono</family>
       <family>FreeMono</family>
       <family>Liberation Mono</family>
       <family>WenQuanYi Micro Hei Mono</family>
      </prefer>
     </alias>
     <!-- general configurations -->
     <match target="font">
      <edit mode="assign" name="rgba">
       <const>rgb</const>
      </edit>
      <edit mode="assign" name="lcdfilter">
       <const>lcdlegacy</const>
      </edit>
      <edit mode="assign" name="antialias">
       <bool>true</bool>
      </edit>
      <edit mode="assign" name="hinting">
       <bool>false</bool>
      </edit>
      <edit mode="assign" name="hintstyle">
       <const>hintnone</const>
      </edit>
      <edit mode="assign" name="autohint">
       <bool>false</bool>
      </edit>
     </match>
     <!-- For not Chinese fonts -->
     <match target="font">
      <test compare="not_contains" name="lang">
       <string>zh</string>
      </test>
      <edit mode="assign" name="rgba">
       <const>rgb</const>
      </edit>
      <edit mode="assign" name="lcdfilter">
       <const>lcdlight</const>
      </edit>
      <edit mode="assign" name="hinting">
       <bool>true</bool>
      </edit>
      <edit mode="assign" name="hintstyle">
       <const>hintslight</const>
      </edit>
      <edit mode="assign" name="autohint">
       <bool>false</bool>
      </edit>
     </match>
     <!-- WenQuanYi Micro Hei -->
     <match target="font">
      <test compare="eq" name="family">
       <string>WenQuanYi Micro Hei</string>
      </test>
      <edit mode="assign" name="rgba">
       <const>rgb</const>
      </edit>
      <edit mode="assign" name="lcdfilter">
       <const>lcdnone</const>
      </edit>
      <edit mode="assign" name="hinting">
       <bool>true</bool>
      </edit>
      <edit mode="assign" name="hintstyle">
       <const>hintslight</const>
      </edit>
      <edit mode="assign" name="autohint">
       <bool>false</bool>
      </edit>
     </match>
     <match target="font">
      <test compare="eq" name="family">
       <string>WenQuanYi Micro Hei Mono</string>
      </test>
      <edit mode="assign" name="rgba">
       <const>rgb</const>
      </edit>
      <edit mode="assign" name="lcdfilter">
       <const>lcdnone</const>
      </edit>
      <edit mode="assign" name="hinting">
       <bool>true</bool>
      </edit>
      <edit mode="assign" name="hintstyle">
       <const>hintslight</const>
      </edit>
      <edit mode="assign" name="autohint">
       <bool>false</bool>
      </edit>
     </match>
     <!--換掉文泉驛的英文部份,subpixel rendering 比較好看-->
     <match target="pattern">
      <test compare="eq" name="family">
       <string>WenQuanYi Micro Hei</string>
      </test>
      <edit binding="strong" mode="prepend" name="family">
       <string>Bitstream Vera Sans</string>
      </edit>
     </match>
     <match target="pattern">
      <test compare="eq" name="family">
       <string>WenQuanYi Micro Hei Mono</string>
      </test>
      <edit binding="strong" mode="prepend" name="family">
       <string>Bitstream Vera Sans Mono</string>
      </edit>
     </match>
     <!-- specific config -->
     <!-- bold fonts -->
     <match target="font">
      <test target="pattern" compare="more_eq" name="weight">
       <!--<test compare="more_eq" name="weight">-->
       <!--<int>180-->
       <const>semibold</const>
      </test>
      <edit mode="assign" name="rgba">
       <const>rgb</const>
      </edit>
      <edit mode="assign" name="lcdfilter">
       <const>lcddefault</const>
      </edit>
      <edit mode="assign" name="antialias">
       <bool>true</bool>
      </edit>
      <edit mode="assign" name="hinting">
       <bool>true</bool>
      </edit>
      <edit mode="assign" name="hintstyle">
       <const>hintmedium</const>
      </edit>
      <edit mode="assign" name="autohint">
       <bool>false</bool>
      </edit>
     </match>
     <!-- very small fonts -->
     <match target="font">
      <test compare="less_eq" name="pixelsize">
       <double>12</double>
      </test>
      <!--設定字型最小尺寸-->
      <!--<edit mode="assign" name="pixelsize">-->
      <!--<double>12-->
      <!--</edit>-->
      <edit mode="assign" name="rgba">
       <const>rgb</const>
      </edit>
     </match>
    </fontconfig>

    這應該是我能調整的最終型態了,能讓 KDE (Qt) 與 GNOME (Gtk+) 底下的程式都有接近的、清晰的筆畫顯示品質,同時考慮到中、英文字型的 rendering 差異、大字小字、普通與粗體等。

  • 筆記:編出給 arm-linux-androideabi 用的 libchewing

    先記下目前暫時有點進展的作法,日後還是要盡可能自動處理…。

    從 Android NDK 建立 toolchain:

    1. cd $HOME
    2. ~/Applications/android-ndk/build/tools/make-standalone-toolchain.sh --toolchain=arm-linux-androideabi-clang3.2 --system=linux-x86_64 --install-dir=toolchain

    編出 libchewing:

    1. cd libchewing/
    2. vim src/tools/Makefile.am 把 CC 改為指定使用電腦上的 gcc (感謝 +Wen Chun Lin 提點)
    3. sh ./autogen.sh
    4. CC=~/toolchain/arm-linux-androideabi-4.6/bin/arm-linux-androideabi-gcc ac_cv_func_malloc_0_nonnull=yes ./configure --host=arm-linux-androideabi --prefix="$HOME/workspace/AndroidChewingIME/jni"
    5. make
    6. file ./src/.libs/libchewing.so.3.0.1 確認是 ELF 32-bit LSB  shared object, ARM, EABI5 version 1 (SYSV),以免跟昨晚早先之前一樣空歡喜一場。
    7. make install
  • 換用 SSD

    從 GRUB 選單決定開機選項後,一秒鐘閃過即進到 KDM 登入畫面,真的很爽快。

    IMG_20130130_151142_0

    由於我的 USB 外接盒兩光兩光,所以還特別再去買了一組 ThinkPad 用的 Serial Ultrabay Enhanced SATA 擴充匣來用。

    大概的流程是:

    1. kdesu gparted 對 SSD 做規劃,使用傳統 msdos/MBR 式分割表。
    2. 將規劃好的分割區分別 mount 起來。
    3. rsync,注意要排除 (exclude) /proc, /sys, /tmp 以及 SSD 掛載點本身。
    4. /dev, /proc 分別以 bind 方式 (mount -o bind) 掛載到 SSD 掛載點底下後,再 chroot。
    5. 將之前排除掉的 /sys, /tmp 手工建回來。
    6. 修改 /etc/default/grub 的 resume 分割區 (= swap) UUID。
    7. 修改 /etc/fstab 的分割區 UUID,以及加上 noatime,discard 選項。
    8. grub-mkconfig 重建 /boot/grub/grub.cfg
    9. modprobe dm-mod && grub-install --target=i386-pc --recheck --debug /dev/sdX 安裝 GRUB。
    10. mkinitcpio -p linux
    11. 停用 hdapsd
    12. 按照 [Solid State Drives – ArchWiki] 文件建議,調整 I/O scheduler 以及 swap 調用策略。
  • RubyGems.org 遭入侵

    這幾天的大新聞。依照 [RubyGems 1/30/13 Incident Status] 的說明,建議各位至少先看 Notes/Important Links 段落,找到檢查自己 local 端 gems 的程式(例如:https://gist.github.com/4678189),做基本的 checksum 掃描。

    另外,[Let’s figure out a way to start signing RubyGems] 這篇則倡議要對 Ruby Gems 做簽章驗證,讓我想起了之前 Arch Linux 也是過了許久才想對 packages 做全面簽章驗證…。

  • 讓 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