星期五, 5月 17, 2013

installing Paragon NTFS & HFS driver

Recently, I bought a portable HD, which came NTFS-formatted. At first I considered formatting it to XFS or ext4 but it occurred to me that I might have to mount it with windows from time to time (although I don't have many windows PCs and will not have more than one unless necessary.)

Rather than trying to fix/install anything on the stupid Windows to support xfs/ext4, I prefer messing up with my linux which, in some way, is more intuitive for me than dealing with those mysterious bugs in windows.

There's a ntfs driver called ntfs-3g. It is fine, but somehow too slow. I don't know why it has been staying on FUSE all these years, or if staying on FUSE is the reason that makes it so slow. There's a couple of commercial alternatives that come into play: Tuxera(which I suspect is the reason that ntfs-3g being so slow) and Paragon but only the later one offers a free driver for linux, so I gave it a try and it works pretty well so far.

Here's how I do it:

星期二, 3月 19, 2013

cross-compile node.js (0.10.0) for mipsel (Asus RT-N16 with tomatousb)

最近入手了一台 RT-N16, 馬上是刷了 tomatousb, 還算蠻滿意的, 看了那精美的記憶體, 開完機還剩下 100+ MB, 家裡的裝置也很少使用 p2p, 這些記憶體不用好像有點浪費,於是便想把一些本來跑在桌電的 node server 來跑在 rt-n16 上。
記錄一下 cross-compile 的步驟:
先從 tomatousb 抓他們的 toolchain:

$ git clone git://repo.or.cz/tomato.git tomato
$ cd tomato
$ git checkout tomatousb-K26-1.28.9054 
$ sudo ln -s tools/brcm /opt/brcm
這邊用的是 linux 2.6 的版本, 其他版本可以參考 git tag。
然後再抓 node.js 的 source: 我這邊用的是最新的 node-v0.10.0
$ mkdir $HOME/node-src && cd $HOME/node-src
$ wget http://nodejs.org/dist/v0.10.0/node-v0.10.0.tar.gz
$ tar xf node-v0.10.0.tar.gz
$ cd node-v0.10.0
設定的部分,因為是 cross-compiling, 所以把 snapshot 關掉, 因為 compile 出來的 mksnapshot 也沒辦法在 host 上跑:

$ ./configure --prefix=/opt --dest-cpu=mipsel --dest-os=linux --without-snapshot
編譯過程中會有些錯,主要是 linux 版本的問題跟 pthread 有些函數(pthread_barrier_init|destroy|wait)在 uclibc 不支援,所以我做了個 patch, 這會讓有用到 ub_barrier_init|destroy|wait 的 module 無把編譯但 node 本身似乎是沒有用到這些函數,所以暫時可以這樣做:
$ wget -O - http://moon.cse.yzu.edu.tw/~s961449/node-mipsel.patch | patch -p0
$ PREFIX=/opt/brcm/K26/hndtools-mipsel-uclibc-4.2.4/bin/mipsel-linux-
$ export CC=${PREFIX}gcc
$ export CXX=${PREFIX}g++
$ export AR=${PREFIX}ar
$ export RANLIB=${PREFIX}ranlib
$ export LINK=$CXX
$ make -j4 #4 cores
基本上這樣就可以編出能在 tomato 上跑的 node 了, 編完以後 binary 會在 out/Release/node,但是不知道為什麼 tomato 的 firmware 並沒有把一些必要的 library 包進去,所以還要再附上 librt, libstdc++ 才行(optware 用來編譯的 toolchain 不同,所以也無法使用他們的 librt), 並設定 LD_LIBRARY_PATH 才能跑: node.sh:
#!/bin/sh
LD_LIBRARY_PATH="/lib:/usr/lib:/opt/node/lib" /opt/node/bin/node $@
把檔案傳到 ap 上, 我這邊是用 optware 裝了 sftp, 所以直接用 sftp 上傳:
sftp root@your.ap.address
$ cd /opt
$ mkdir node
$ mkdir node/bin
$ mkdir node/lib
$ put out/Release/node node/bin/
$ put node.sh bin/node
$ put /opt/brcm/K26/hndtools-mipsel-uclibc-4.2.4/lib/librt.so node/lib
$ put /opt/brcm/K26/hndtools-mipsel-uclibc-4.2.4/lib/libstdc++.so node/lib/libstdc++.so.6
或是你要打包好在上傳也可以, 各人喜好啦,(因為當初是先上傳了才發現缺 lib)。 這樣應該就可以在 tomato 上跑 node 了! 但是馬上會用掉 30+% 的記憶體,也許可以再 tune 一下,但可以跑已經大喜大賀了, haha.

星期三, 2月 13, 2013

ibus override xmodmap, use xkb options instead

之前寫過一篇關於把 caps lock 重新 map 到 control 的方法,但昨天更新了 ibus 以後突然發現我的 xmodmap 只要切換輸入法引擎的時候就會被覆寫過去,google 了一下,大家似乎是推薦用 xkb 的設定選項來作調整:

Debian 來講的話,就是修改 /etc/default/keyboard
把 XKBOPTIONS 這行加入 ctrl:nocaps (有其他選項的話以逗號分隔)
XKBOPTIONS="ctrl:nocaps"
重新開 X 以後就可以囉!似乎是比 xmodmap 乾淨一些,但缺點就是這樣改到的是整個系統的設定,如果使用者要改就沒辦法了。 若沒有 root 的權限可以改 /etc/default/keyboard, 也可以在 ~/.xsession 加上:
setxkbmap -option "ctrl:nocaps" &
其他的選項可以參考 man xkeyboard-config, /etc/default/keyboard 相關的資訊: man keyboard

星期六, 2月 09, 2013

pathogen, manage your vim plugins in a clean way

vim 用久了, 裝很多 plugin 很正常, 但有時候只是想試看看某些 plugin 用完要移除的時候卻發現很麻煩, 要自己把檔案刪掉。好加在 vim 發展到現在也有許多人做了套件的工具/套件: pathogenVimana 算是我比較常聽到的管理套件。但 Vimana 需要透過 perl,如果在 windows 下要使用還頗不方便的(雖然我很久沒用windows寫程式了..)。 Pathogen 的運作方式是透過增加 runtime path 的方式,把 plugin 獨自存放在各自,vim 開啟的時候會搜尋所有的 runtime path,把這些設定都讀進來,所以要刪除時只要把該套件的資料夾刪除就可以了。 安裝的方式也很簡單,pathogen 本身就是一個 vim plugin:
$mkdir -p ~/.vim/autoload ~/.vim/bundle; \
$curl -Sso ~/.vim/autoload/pathogen.vim \
    https://raw.github.com/tpope/vim-pathogen/master/autoload/pathogen.vim
基本上就是把 pathogen.vim 下載下來放到 ~/.vim/autoload/,再把套件預設存放的資料夾 ~/.vim/bundle 建立起來。 最後再將
execute pathogen#infect()
加入 vimrc 就可以了,這邊就完成 pathogen 的安裝。 裝好 pathogen 以後,開 vim 時他就會去 ~/.vim/bundle 把下面的資料夾路徑都加入 runtime path,所以安裝套件時只需要在底下開一個資料夾東西丟進去就可以正常使用了,比如說安裝 ctrlp.vim 可以直接 git clone 到 ~/.vim/bundle 下即可:
$ cd ~/.vim/bundle && git clone git://github.com/kien/ctrlp.vim.git
個人還蠻喜歡這個方式的,很乾淨。

星期四, 1月 17, 2013

xfs repair in root fs

用 xfs 好一陣子了,都沒有發生過什麼問題,但今天在做系統 update 的時候居然發現有硬碟有資料毀損的情況,而且還是 root fs... 頓時背脊都涼了一半,才發現 xfs 居然都沒有自己 repair(但說實在其實那些會自己修復的 fsck 有時候也蠻恐怖的)。

xfs 在開機 fsck 的時候並不會做任何動作,所以有問題的話要自己用 xfs_check 及 xfs_repair 做檢查及修復。

但 xfs_check 時需要 fs 在 read-only 的狀況下,xfs_repair 需要 fs 不被 mount 的狀況下才能動作,但這次是 root filesystem... umount 了就不能執行 xfs_repair 了阿!
首先想到的是用 ubcd 或其他 livecd 來做但有點麻煩,翻了一下 man 看到 xfs_repair 的 -d 選項:
Repair dangerously. Allow xfs_repair to repair an XFS filesystem mounted read only. This is typically done on a root fileystem from single user mode, immediately followed by a reboot.
有多 dangerous 我是不知道,但 google 了一下好像也沒發現過有什麼災情,反正 /home 還在,大部分的 config 都在這裡了,大不了重灌嘛!
於是就豁達的重開機到 recovery mode:(/dev/sda1 是我的 root device)
$ mount -oremount,ro /
$ xfs_check /dev/sda1
$ xfs_repair -n /dev/sda1 #測試, 看到好長的一串要修復蠻抖的...
$ xfs_repair /dev/sda1 #但指令還是拍了下去
然後重開機就正常了(汗...(至少看起來沒什麼問題,雖然 /lost+found 有 93 個檔案,但大部分好像都是每刪除乾淨的而已)

星期三, 1月 16, 2013

vim command/search history

用 vim 用了快十年了吧,對於這個一直會不小心跳出來的功能總是覺得有點煩。今天終於是受不了了,查了一下發現是 command/search history 的功能,觸發的方式是 q: 及 q/, 前者跟 :q 太接近了難怪常常莫名其妙的跑出來。本來是要找到把這個功能關掉的方法但突然覺得好像還有點用處,於是乎就研究了一下。

他作用的法式就跟很多 plugin 一樣,會開啓一個 split window 來瀏覽過去的記錄,這個 window 裡面可以搜尋,找到要重複的 cmd/search 按下 enter 就可以了。

比較有趣的地方是,vim 的 cmdline mode 提供的移動指令實在不是很符合 vim 的精神,但用 cmdline window 就可以做到這件事:假如我在打一串很長很複雜的指令,打到一半發現中間有錯,這時候可以按 C-f 打開 cmdline window,剛剛輸入的指令會在最下面,這邊就可以用 vim 的其他移動方法來做修改,修改完再按 enter 就會送出了,同時,在這個 window 裡也可以用 <tab> 來 auto-complete command (多選的話會有 menu)。

更多詳情可以參考 :help cmdline-history