星期四, 12月 17, 2009

vim plugin: autocomplpop (acp)

vim 內建的 omni c complete function 其實算是堪用,但不方便的就是每次都要自己按 ^P, ^N 或是 ^X^O 等組合才會跳出來讓你選。這兩天在 Vim taiwan 的 mailing list 看到 acp 這個 plugin,試用了以後愛不釋手,安裝方法跟其他vim plugin 沒兩樣:
到這邊下載最新版的 autocomplpop: http://www.vim.org/scripts/script.php?script_id=1879
然後解壓縮在 ~/.vim 就可以了:
unzip -d ~/.vim vim-autocomplpop.zip
這樣就算是安裝好了,開 vim 也會自動執行。
autocomplpop 簡單的說就是你每輸入一個超過長度的word(預設2個字元) 他就開始用 keyword/omni 找可能的補全單字然後顯示在pmenu,多說無益,試過才知道!

不過剛裝好的時候有點不習慣,因為他預設的搜尋範圍不包括 include 近來的檔案,所以以前慣用的 ^N, ^P (或是 ^X^i) 就只能用 ^X^I 呼叫出來,要讓 acp 也搜尋include 的檔案的話只要在 ~/.vimrc 加入下面的設定:(vim 預設 .,w,b,u,t,i ; acp 預設 .,w,b,k)
let g:acp_completeOption = '.,w,b,u,t,i,k'
每個選項的功用可以參考 :help complete
這樣邊打字就也會邊出現 api 的 auto complete popup,挺實用的!
------------------
另外這個也是在 mailing list 上看到的(其實是包含在acp 的help file裡,只是大家沒注意到):
acp 也提供 snipMate 一個接口,讓 snipMate 的補全也變成 menu 的樣式讓你選,啟動的方法只要在 ~/.vim/plugin/snipMate.vim 加入

  fun! GetSnipsInCurrentScope()
    let snips = {}
    for scope in [bufnr('%')] + split(&ft, '\.') + ['_']
      call extend(snips, get(s:snippets, scope, {}), 'keep')
      call extend(snips, get(s:multi_snips, scope, {}), 'keep')
    endfor
    return snips
  endf
然後在 ~/.vimrc:
let g:acp_behaviorSnipmateLength=1
這樣輸入大寫字母的時候他就會去找 snipMate 的 template 看有沒有符合的項目並整理到menu 顯示,有興趣的人可以試看看。

星期三, 12月 16, 2009

load balance in difference internet interfaces

如果你有兩張網卡都是連上外部網路的話,可以透過 ip route 來做 load balance,方法很簡單,基本上就是把 default route 改成 multipath route。當然在這之前需要先把 ip route 設好讓一個 IP (TCP/UDP)連線只經由該連線存在的 interface 送出。

當然這只是很簡單的提供 load balance 的機制.. 有時候並不是那麼有用,不過將就點用吧 XD

其實設定上也很簡單,network split 的部份我就不再重複紀錄了,跟我之前寫過的這篇 差不多。
balance 的部份就是把default route 分成兩個 channel 依照 weight 決定連線走哪一條。步驟大概是這樣:

ip route del default #把目前 defualt route 刪掉
ip route add default scope global nexthop via [gw1] dev [if1] weight [weight1] \
nexthop via [gw2] dev [if2] weight [weight2]
假如我要從兩個 ISP 出去, 一個ip 是 A 另一個 B,分別透過 eth0 跟 eth1 連線,而 A 的連線速度比較快,可能是 B 的兩倍,那麼我可以這樣設定:(gateway 可以用 route -n 看)
ip route del default
ip route add default scope global nexthop via gw1 dev eth0 weight 2 \
nexthop via gw2 dev eth1 weight 1

這樣就設定好了,如果看 ip route 的話會看到下面這樣的結果

default
    nexthop via gw1  dev eth0 weight 2
    nexthop via gw2  dev eth0 weight 1
觀察流量的話也可以大略用 iptraf 看一下各個network interface 上面的流量。

星期日, 12月 06, 2009

Monaco font (pixelsize <= 14) & hinting

一直覺得很奇怪,我的Debian 上面的monospace 字體跟 Ubuntu 上面的一樣都用 Monaco 但是當看到 terminal 中 bold (高亮)的字體時,Debian 上有些英文字就會縮水:




但是 Ubuntu 上的不會,今天研究了一下發現原來不是字體的問題,是font hinting 的問題,把小字的hinting 關掉的話就不會這樣了(Ubuntu 上預設就有把字體較小的自行的font hinting, antialias 關掉)。怎麼關呢?還蠻簡單的,如果你有root 權限可以直接在 /etc/fonts/conf.avail 加入新的 font config file,如果沒有,也可以編輯 ~/.fonts.conf (不存在就自創)。
目標是要把字型size 較小時,font hinting 的功能關掉,只要在...裡面加入下面這個設定就可以了:
<match target="pattern">
<test compare="less_eq" name="pixelsize" qual="any">
<int>14</int>
</test>
<edit mode="assign" name="hinting">
<bool>false</bool>
</edit>
</match>

應該還蠻容易懂的,就是找到 pixelsize <= 14 的設定,然後把hinting 設成false。換了以後效果應該馬上會看到(重新開一個terminal) 如果沒有的話重新登入應該也就可以了。附上一張關掉hinting 後正常的:



順便看一下在字體大一點的時候,hinting 有無的差別:
pixelsize=15, with hinting:




pixelsize=15, without hinting:



我想hinting 主要是要讓字看得清晰一點(尖銳化之類的),從上面這兩張就可以看出差蠻多的,但是我個人這樣看起來好像也沒有特別喜歡哪一種,看個人吧!總而言之,字體小的時候還是需要關掉hinting 才比較正常。