Friday, March 23, 2007

syntaxhighlighter

Update: 官方版本已解決 Blogger 的問題,請參考這篇

最近在 google code 上看到 google code prettify,基本上這個工具做的事和 SyntaxHighlighter 是相同的,不過相對來說,SyntaxHighlighter 是比 google code prettify 來得小而功能比較好,也比較模組化(把每個語言分開,不過這也代表安裝設定較為麻煩)。其實如果只是要讓 po 出來的程式碼比較好看的話,用那個都可以,但看在 google 的面子上,用 google code prettify 可能還是比較好的選擇,而且我應該也不會用到 SyntaxHighlighter 其他的功能,所以就來改用 google code prettify 好了。

要在 blogger 上用 SyntaxHighlighter 有個大問題,SyntaxHighlighter 預設要把程式碼放在 textarea 中再用 class 來標記,但在 blogger 上預設情況下會為 textarea 中每行的結尾加上<br /> ,如果直接把 SyntaxHighlighter 用在 blogger 上就會在每一行後看到 <br /> 了。有人改了 SyntaxHighlighter 來避這個問題,但其實不用去修改 SyntaxHighlighter 本身的程式,只要在把程式丟給 SyntaxHighlighter 前先把 <br /> 濾掉,像這樣:
for(var i=0,elements=document.getElementsByName('code');i<elements.length;++i) {
  var element = elements[i];
  element['innerHTML'] = element['innerHTML'].replace(/<br\s*\/?>/gi,'\n');
}
dp.SyntaxHighlighter.HighlightAll('code',false,false);

Google Personal Page themes

真是可愛到不行 :) (倒數第二張是 Easter egg 哦)

Tea house 6am
Tea house 8am
Tea house 10am
Tea house noon
Tea house 2pm
Tea house 4pm
Tea house 6pm
Tea house 8pm
Tea house 10pm
Tea house midnight
Tea house 2am
Tea house 3.14am
Tea house 4am

17th Jolt Award

http://www.joltawards.com/2007/

又是新一年的 Jolt Award。去年前年的書都說要看,可好像一本也都沒看完,那今年呢~~。

至於工具方面像 Conflunence 雖然很紅,而且很多 open source project 也用,不過我一直覺得不太習慣。IDE 今年輪到 NetBeans 了,說到這,今年 NetBeans 蠻出頭的,eclipse 反而完全都沒出現。

希望明年在寫 Jolt Award 的時候不要又是什麼書都沒看了。

Thursday, March 22, 2007

Struts 2

好久沒用 Java 來寫東西了。

最近為了個特殊的理由要寫個 AP site,本來把核心寫一寫,view 的部分就只有用 JSP 亂寫亂連,但到後來覺得實在難看了點,頁面彼此之前也連得混亂,雖然應該是個只有幾個頁面的小程式,但還是想說用 Struts 來做會比較有條理一點。最後一次寫 Java web-AP 時,正是 Struts 和 WebWork 放話要合作,而眾多 framework 正是戰得火熱的時候,而現在來看,Struts 2 出現了,而似乎也沒看到新的 framework 出現,不知是不是 Java 社群的開發熱度不再了?

Struts 2 其實應該叫 WebWork 3 才名符其實,當時說要合作,其實是 Struts 要整個放掉手上的爛架構,而把名字寫在別人頭上,不過放棄到是個正確的決定,否則在和眾多更好用的 framework 競爭下,Struts 舊架構一定會被新學的人給放棄的。因為之前也算有學過 WebWork,所以現在起 Struts 2 也不費力,而且現在的 framework 真是越做越好了,當初要把 Struts 架起來就花了好久的時候,而且還是在文件充足的情況(連中文書都出來了),那時覺得 Struts 雖然把大部分該做的事規畫好,但實在是難用。而現在試用 Struts 2 居然可以在少少文件的情況下就讓我把想要的功能都弄出來,不光只是架構的差別而己,一些工具的細節和易用度也是得到了很多前人的經驗吧。

Wednesday, March 21, 2007

misalgnment

記錄一下最近遇到的問題。 在 WinCE 寫一段讀取 BMP 的程式時,發現在讀取 BMP 檔頭時出現下面的 Exception :

0x80000002: Datatype misalignment.

同樣的程式在 x86 上不會有這個的問題(但會對效率有影響)。這個 Exception 在這篇有更多的說明,所謂的記憶體對齊的問題,似乎除了 x86 以外的 CPU 都有這樣的限制,就是在存取記憶體時會依要存取的大小而必需要對齊適當的起點,例如要存取 DWORD 的變數,一定要依 4 倍數的記憶體起點對齊,而 WORD 要對齊 2 的變數,而如果是 BYTE 的話就不會有這樣的問題。正常情況下 Compiler 不會弄出違反這個規則的 code ,但如果是自己對 pointer 強制轉型就要小心這樣的問題,像下面的程式就會出問題:

int a ;
char *p = (char*)&a ;
int *pp = (int*)(p+1) ;
int b = *pp ;

回到 BMP 檔頭的問題,BMP 檔案是像下面的格式: bmp header 基本上讀取的程式是類似這樣:

PBITMAPFILEHEADER pbmfh = (PBITMAPFILEHEADER)(bmpfile.GetFileContent());
PBITMAPINFO pih = (PBITMAPINFO)(pbmfh+1);
int b = (pih->bmiHeader).biSize ;

結果問題就出在 BITMAPFILEHEADER 的大小是 14 ,非 4 的倍數,就會造成讀取其下 BITMAPINFO 時造成不對齊的情況。這個問題治本的解法是在定 struct 就要小心,不要弄出這種容易造成問題的結構。而治標的方法有使用 __unaligned 來避免這個問題,不過我覺得直接把他 co 一份出來用比較方便。

BITMAPINFO bmi ;
memcpy(&bmi, (BITMAPINFO*)(pbmfh + 1), sizeof(bmi));

至於 co 的時候為什麼不會造成 misalignment 呢?因為 memcpy 時是 byte-wise copy,而 byte 不會有 misalignment 的問題了。

Saturday, March 3, 2007

Anti-Anti-Virus

Choosing Anti-Anti-Virus Software

人總不知道自己失去了什麼,一直開著防毒,失去了多少效能卻全然不知。

見過太多人重灌電腦時第一個安裝的就是防毒軟體了,就算是在一台己經很慢的電腦也裝。上面這篇文中列出一些防毒軟體對效能的危害,居然可以慢到二十幾倍的也真是奇觀,慢個幾倍算好的了。其實這個也不用別人來提醒,自己把防毒軟體關掉就可以感覺得到了(尤其是大量 IO 的情況)。真不知道為什麼大家要這麼怕病毒,尤其是在公司裡用來編程的電腦,還規定一定要開著防毒軟體不淮關,自己 compile 又不會平白無故編出病毒來,要編一個超大的 project 還一定得開著防毒讓他慢,真不知道那些 MIS 到底在想什麼。

其實只要保持 Window update 更新,不去執行來路不明的程式,大概就 99% 不會中病毒了,除非是以前像 "疾風" 這種利用漏洞不請自來的病毒,但這種超強的病毒剛出來防毒也沒用就是了。與其說這麼害怕病毒,備份還是比較重要的事情,我從來沒有因為病毒的關係失去資料,但因沒有備份而失去資料倒是不少次了。

reSizer and kbSizer

前不久發現在這個工具: reSizer。其實還有一個目地相同但是功能比較弱的工具叫 kbSizer,大概世界上只有作者有在用吧 :)

當初還把 Linux 當桌面時就用這種方式來用操控 window,因為當初用 fvwm 有蠻方便的方式指定 hot key 來操控 window ,所以我就習慣用 keyboard 來控操 window 的大小和位置,當時我看周圍的人似乎沒人這麼用的。而後來又回到 Windows 上時,一直找不到類似的工具(至少我那時沒看到 reSizer),所以後來就自己寫了 kbSizer 這個小工具。

之前當當主要功能寫完後我一直想不出來能加上什麼功能,現在看來,reSizer 有很多不錯的點子,像是用 numpad 來快速放置到角落,還有 always on top 等,不過他的視窗移動移不出螢幕我覺得有種不夠爽快的感覺,能移出螢幕應該會比較好用吧。而另一個不同點是 reSizer 是以 Win key 為主,而 kbSizer 是用 Ctrl+Alt 為主,會這樣設定是當初用 Linux 時沒把 Win key 弄出來,所以就指定到 Ctrl+Alt,其實用 Win key 是比較順的,應該把改起來。

其實 Windows 也可以用得很快速很順手,並非得一直拿著滑鼠點來點去的,像 Win-R 就是好物,設定一些 shortcut 就可以做到很多原本要點很多下的動作。所以就以操控面來說,不管任何平台都可以練習到讓旁人看不清你動作的程度 :) ,端看你是否熟練了。