Archive for the ‘Hack’ tag
Emesene & SQL Optimization
最近都是用 emesene 上 MSN,不過他的啟動速度實在是非常慢,啟動的時候硬碟燈狂閃,判斷應該是在讀取聯絡人的資料快取。先用 python profiler 跑過一次,結果果然是 Logger.py 裡面從 sqlite 撈資料的函式在慢。
大小約 17MB 的 db,每個 query 竟然都要一秒以上,難怪 emesene 啟動要這麼久了。就來幫 emesene 最佳化一下 sql 吧。
以底下這個 query 為例:
select e.stamp, ue.data
from event e, user_event ue, user u
where e.id = ue.id_event and
u.id = ue.id_user and
e.name = "status-changed" and
u.account = "%s"
order by e.stamp desc
limit 1
結果是
1221129396.22343|NLN CPU Time: user 1.173822 sys 0.023997
用 explain query plan 看看
0|1|TABLE user_event AS ue
1|0|TABLE event AS e USING PRIMARY KEY
2|2|TABLE user AS u USING PRIMARY KEY
應該是先把 user_event 與 event, user 三個 table join 在一起,最後再檢查 e.name 與 u.account。
來看看三個 table 的大小
- user_event: 180801 row
- event: 192968 row
- user: 196 row
這樣 join 起來是多大的 table 呀
先試試改寫 from clause 裡的順序
select e.stamp, ue.data
from user u, event e, user_event ue
where e.id = ue.id_event and
u.id = ue.id_user and
e.name = "status-changed" and
u.account = "%s"
order by e.stamp desc
limit 1
結果是
1221129396.22343|NLN
CPU Time: user 0.485926 sys 0.008998
很好,時間少了一半,explain query plan 顯示
0|2|TABLE user_event AS ue
1|0|TABLE user AS u USING PRIMARY KEY
2|1|TABLE event AS e USING PRIMARY KEY
如果幫 user_event 建個 index 呢?
create index ueiduser on user_event(id_user);
再 query 一次
1221129396.22343|NLN
CPU Time: user 0.017997 sys 0.004999
快了非常多吧!explain query plan 顯示:
0|0|TABLE user AS u
1|1|TABLE user_event AS ue WITH INDEX ueiduser
2|2|TABLE event AS e USING PRIMARY KEY
這是因為 sqlite 會以 from clause 的第一個當作 outer loop,所以我把數量最小的 user 移到前面,再適當的建立 index,使得 query 的速度快了 100 倍…
參考
Patch 在此
Emesene svn trunk 已經收錄最新 patch
ConTeXt 學習筆記, Using MkIV

以下是在 CTeX 論壇看到的對 ConTeXt 的評論,我覺得描述的十分貼切
我的理解,ConTeXt 秉承 Plain TeX 的思路和语法,是用于专门的“排版”的软件;而 LaTeX 则比较复杂,其结构化有时往往是加了许多限制,用于“写文档”的软件。 也就是说,期刊理应用 LaTeX 而不是 ConTeXt,因为前者的标准、结构性特征。而如果是排版书籍或个人化的东西,或许 ConTeXt 更适合。 CTeX — milksea
一年前(時間過的好快!)稍稍研究了 ConTeXt 與 LuaTeX 的搭配,如今 ConTeXt MkIV 已經比當時更加的成熟,要使用多國語言簡單得多了。Li Yanrui 整理了一份 ConTeXt 的學習筆記,裡面包括了 TeX 與 ConTeXt 的簡介、ConTeXt MkIV 的安裝、ConTeXt 的文檔架構與基本命令,想要一窺究竟 ConTeXt 是在做甚麼,可以參考看看。
以下檔案是使用 2008/9/10 的 ConTeXt Minimals 加上一點小修改後編譯,使用的字型是 cwTeX 明體、cwTeX 粗黑體、cwTeX 楷書。
若要嘗試編譯此檔案者需注意
- ConTeXt 需修改以符合台灣地區標點符號擺放特性,詳細的 patch 整理之後會提交上去。
- LuaTeX 目前還是 beta,編譯時可能會遇到各種困難,尤其是容易發生記憶體不足的情況,建議記憶體有 1G 以上才可嘗試。
- md5: c2fa8602dbcd6821870e5df374d67361 繁體 ctxnotes
- md5: ccfd8de4964778e82cf83bf31d382869 繁體 ctxnotes 原始檔
原始文件為 Li Yanrui 整理,我只是轉譯為繁體版本。原始版本可以在 http://code.google.com/p/ctxnotes/ 取得。
PS.
不知為什麼這個版本編出來的 pdf 檔案大小特大… 足足有 3 MiB 多
ConTeXt + LuaTeX + Chinese
最近這幾天玩了一下 ConTeXt,搭配最近開始 beta 的 LuaTeX,想辦法設定中文,有了小小的成果……
因為急著要跟大家分享,所以可能寫的不是很清楚或有所遺漏,還請不吝指教
持續測試、改版中。
PS. 文中不能複製貼上的部份放在下面
$ export TEXMFCNF=/usr/share/texmf/web2c
$ export TEXMF='{/usr/share/texmf,/usr/share/texmf-texlive,/home/kanru/texmf}'
$ export TEXMFCACHE=/tmp
$ export OSFONTDIR='{/usr/share/fonts/truetype,/home/kanru/.fonts}'
\enableregime[utf]
\usemodule[chi-00]
\directlua0{
function wrap(str)
rt = ''
for u in string.utfvalues(str) do
up = math.ceil(u / 0x100)
low = u - math.ceil(u / 0x100) * 0x100
if u < 127 then % need to be replace by cjk range
rt = rt .. unicode.utf8.char(u)
else
rt = rt .. '\lookaheaduchar{' .. up ..'}{' .. low ..'}'
end
end
return rt
end
callback.register('process_input_buffer', wrap)
}
\beginLUATEX\insertunicodeglyph
\unexpanded\def\insertunicodeglyph
{\doinsertunicodeglyph\unicodeone\unicodetwo}
\unexpanded\def\doinsertunicodeglyph#1#2%
{\char\numexpr(#2+(#1*256))\relax}
\endLUATEX
\def\en#1{%
\hskip\chinesesurroundskip
\hskip\chineseinterglyphskip\relax
#1%
\hskip\chineseinterglyphskip\relax
\hskip\chinesesurroundskip
\hskip\chinesesurroundskip
\hskip\chinesesurroundskip
\hskip\chinesesurroundskip
\hskip\chinesesurroundskip
\hskip\chinesesurroundskip
\hskip\chinesesurroundskip
\ignorespaces
}
\starttypescript [sans] [cwheib] [name]
\definefontsynonym [Sans] [cwheib]
\definefontsynonym [SansItalic] [cwheib]
\definefontsynonym [SansSlanted] [cwheib]
\definefontsynonym [SansBold] [cwheib]
\definefontsynonym [SansBoldSlanted] [cwheib]
\definefontsynonym [SansBoldItalic] [cwheib]
\stoptypescript
\starttypescript [my] [cwheib]
\definetypeface [cwheib][ss][sans][cwheib][default]
\stoptypescript
\usetypescript[my][cwheib]
\setupbodyfont[cwheib,ss,10pt]
有圖的水銀
根據 yungyuc 的有圖的水銀這篇,裝了 ActiveTCL 之後,終於把 hgk 在 Windows 上給跑了起來,不過我一直很好奇的是,Windows 版的 Python installer 預設會安裝 tcl/tk 的 module Tkinter 跟相關的 dll,難道不能用這個來跑 hgk 嗎?
原本是想把 hgk 一行一行搬到 python,不過這樣太慢了,後來發現有 Tkinter.Tk.eval 可以用
剛剛做了一下實驗,證明以下 code 可以執行:
run-hgk.py
import sys import Tkinter
read hgk file
hgk = ''.join(open('hgk', 'r').readlines()) tk = Tkinter.Tk() tk.eval('set argv [list ' + ' '.join(sys.argv[1:]) + ']') tk.eval('set env(HG) "hg"') try: tk.eval(hgk) tk.mainloop() except Tkinter.TclError, e: print e
不過要真的可以用,還要改一下路徑的處理跟環境變數的取得
接下來,想要真的把 hgk port 到 python,現在的 hgk 幾乎是 copynpaste gitk,連 help menu 裡面都沒改過,程式裡面還參考到 GIT_DIR 環境變數… Orz
org.freedesktop.Notifications
這東西可有趣了,freedesktop 定義了這個 dbus 介面,只要有支援的程式都可以透過它來顯示 notifywindow,比如說,我可以簡單的幫 xchat 加上有人跟我說話時自動提醒的 plugin。
下載這隻 plugin 後只需要把它放在 $HOME/.xchat2/ 底下,這樣每次開啟 xchat 時就會自動讀取了。它目前還很簡單,如果要設定圖示或是顯示樣式或秒數等等,自己看 code 改應該很快
其中 class Notification 是從這裡抄來的。
Fancy Conversation Layout of Gaim
從以前就覺得 gaim 的 conversaiton 的視窗做的像 irc 的樣子很奇怪,因為有時候對方會發送多行訊息,這時候在 gaim 的視窗中就會斷的很奇怪,或是有人同時發送多個訊息時,視窗一大部分都被 nick 佔滿了。
所以才會出現底下這個 hack,把 gaim 的文字多做了一層縮排,單獨顯示,每個人每次的發言會串連在一起,而不是每次顯示一行。
BTW, gaim 的 faq 提到不要使用 SVN 版,不過我改了 code,所以應該可以用吧?wahaha
Update:
補上 patch 的連結
這個 patch 只能用在 svn trunk 的 gaim 喔,不會用的,最好先看一下上面那個 faq XD
Tomboy Plugin - CJKDisableSpell
平常已經習慣使用 Tomboy 來記東西,介面還算好用,隨時都可以開新 Note 或是搜尋舊的 Note。用到現在唯一不滿意的地方是 tomboy 會對文章做 spelling check,無論內容是什麼,結果就是中文的 Note 會變成滿江紅。
花了一點時間寫了這個 plugin,可以針對 CJK 的部份取消 spelling check,效果還滿不錯
使用前:
使用後:
使用方法,下載 CJKDisableSpellPlugin.cs 後自己編譯:
mcs -t:library CJKDisableSpellPlugin.cs -r:/usr/lib/tomboy/Tomboy.exe -pkg:gtk-sharp-2.0
或是直接下載編譯好的 CJKDisableSpellPlugin.dll
將 dll 放置在 ~/.tomboy/Plugins/ 後,重新啟動 Tomboy 即可。
2008-12-08 Update:
tomboy 從 0.7 版以後改用 mono addin 架構,更新的程式在
http://github.com/kanru/tomboy-cjk-disable-spellcheck/
也可以直接下載 CJKDisableSpellAddin.dll
不過我沒有仔細測試過,使用時可能會遇到問題。
壓榨你的電腦
感謝 Optical-dlz 提供的這個網址 Linux-PHC,這個計畫提供了可以在 runtime 改變 speedstep 各個階段的電壓的 patch..
之前使用從 -mm kernel 裡面拿出來的 patch 只包含了 intel spec 中提供的保證工作電壓,是安全數值而比真正最低電壓還高一點,Linux-PHC 這個 patch 也預設了這個值,只是還可以在 runtime 手動調整為更低的數值。
經過不斷的測試,終於找出一組我的電腦可以接受的最低電壓.. 結果還不錯,在 600 MHz 還有 800 MHz 的時候都可以用最低電壓 700 mV 來跑… 15000 MHz 的時候也只有 940 mV,比原本 600 MHz 用的 988 mV 還低。比這組數值再低一點雖然還可以正常開機,但是在某些情況下會出現奇怪的 error 像是 kernel oops 或是 gcc internal error .. 所以後來挑選了一組比較高的,用 compile scim 來測試,目前還滿穩定的
經過這翻調整,目前使用電池在一般工作環境下,可以持續使用 4.5 小時.. 算是非常不錯的成果
Cairo Clock without composite manager
The cairo-clock from MackSlow is indeed has very good look and feel. But it’s transparent background is depend on cairo’s alpha channel and Xorg’s composite extension. I did not enable this extension defautly because gnome doesn’t have it’s own composite manager and rely on xcompmgr. But xcompmgr always cause gnome-panel to be overlayed by other window. Then I think, “this clock almost won’t move after it was lauched, why not make a fake transparent background for it?” So that’s it, the screenshot:
Google Summer of Code 2006
Google Summer of Code 又來了,獎金可觀的 Google Summer of Code 今年也有舉辦,這是個由 google 贊助的學生 open source 計畫,去年的計畫有許多成功的案例,今年,各個組織也紛紛開始丟出題目。
jserv 提供了兩個網址,分別是 GCJ 的和 GNU Classpath 的。
有興趣的學生可以趕快報名參加!




