星期二, 九月 08, 2009

C#開發Windows PocketPC 2003程式

大約在六月中到八月左右,小弟有緣用C#寫了一個跑在PocketPC上的程式,由於火候不佳整體結果差強人意,還好最後有完成要求!但程式架構超醜的…

在編程的過程中,深刻體認到某位前輩所說的「與一般的C#同中有異」,也真正感覺到有一些灰色地帶,所幸山窮水盡疑無路,柳暗花明又一村,一些大大小小的難關都過去了。所以略為筆記一下這一段日子習得的東西。

整合環境
ppc的視窗很小,我用的機器螢幕甚至不是標準型,要完整呈現豐富的UI略有困難。整合環境下發生過最難以理解的"feature"就是,如果將一個控制項移到某一個Panel的上空,則控制項新 parent 就會變成該Panel。這在使用Panel管理UI的顯/隱形時,不止一次製造了困難與笑料。

雖然是十分合理的設計,但我常常忘記這個效應是存在的。

視窗按鈕
關於這個 issue 請參見下面 MSDN 文章要小心使用者被卡在奇怪的無間地獄裡!

這篇文章裡也提到了原生GDI API的速度是多麼的快啊…

'using'
在using這個敘述句開始時配置的資源之生存範圍僅限其後的Block,超過後系統會回收資源。這有兩個重要用處,其一是運用GDI resources時,建議gc回收這些寶貴的GDI Objects。

另一個是 用在File IO,File被視為unmanaged resources,故讀寫時應該將整組I/O的程式碼都包在一個using敘述裡。在我的經驗裡,沒有使用using述句的程式碼總是會碰到奇怪的File locking問題,包進using敘述句中自動解決。

使用gif/jpeg圖檔
這是一個經常碰到的問題,原始的 .Net CF Framework僅支援使用點陣圖,沒辦法處理GIF與JPEG格式的檔案。解決之道是使用SHLoadImage()這個API函數,它支援從檔案系統中讀.gif/*.jpg的檔案。再透過Image類別的FromHbitmap()方法就可以將圖檔內容塞到Image物件裡。Image.FromHbitmap()是.Net CF 2.0後才多出來的功能,小弟有幸是在.Net CF 2.0上開發,假如是.Net CF 1.x就必需自己撰寫額外的程式碼處理了。

從一些VS.Net裡頭的標頭檔看起來,如果採用C語言開發,預設需引入的標頭檔裡似乎就有這個函數;然而我一開始照著標頭檔裡的呼叫慣例編寫成C#的版本卻是失敗的,後來拜Google拜了一晚才找到一個大神分享的版本,原來EntryPoint改成"#75"就會動了…看起來,這個問題似乎只有觀察aygshell.dll是如何export裡頭的函數才能得到解答了。

不同平台上採用的aygshell.dll實際上是不同的檔案,(雖然它們都會叫同一個名字)拜一下Google應該有辦法找到一包壓了眾多不同版本的aygshell.dll的壓縮檔。小弟開發時的實機是HP iPAQ系列,也許不同的實機,要求的EntryPoint設定也不一樣。

下面野人獻曝一下,是一個簡單的API Wrapper Class,有任何值得改進之處,還請不吝指教。
 class SHLoadImageFileWrapper
{
[DllImport("aygshell.dll", EntryPoint = "#75", SetLastError = true)]
public static extern IntPtr SHLoadImageFile(string szFileName);

[DllImport("coredll.dll")]
static extern bool DeleteObject(IntPtr hObject);

public static Image LoadImage(string fname)
{
FileInfo fil = new FileInfo(fname);
Image img = null;
if (fil.Exists)
{
IntPtr handle = SHLoadImageFile(fil.FullName);
img = Image.FromHbitmap(handle);
DeleteObject(handle);
}
else
{
throw new FileNotFoundException("In SHLoadImageFileWrapper.LoadImage: FileNotfound");
}
return img;
}
}

星期二, 五月 19, 2009

蔬食一月記

在吃素之前就有想過,應該來好好整理自己素食的日子都在吃些什麼店。

實際上我覺得我運氣蠻好的,在我吃素的一個月裡頭發現有很多素食店都掛上了「維根素食新生活」的橫幅廣告,可能算是一種標誌吧,除了剛開始的一兩天之外,幾乎沒有找不到東西吃的時候,某方面而言己經是一種福份。

列一下我去過的店,(其實真的很少),不過我只記得大概位置,實在沒有記地址。

第一家是寶善齋,位在博愛校區後門旁邊,是一間70元隨便吃到飽的素食自助餐。這個價錢到底是貴還是不貴就見仁見智,反正吃素就心安就好,別計較這麼多。我其實蠻早就知道這間店,是chwong開團帶我們去的。基本上菜色很固定,我特別喜歡他的豆腐辣湯。

第二家是香積廚,這間就在博愛校區後門的對面,是一間便宜又大碗的小店。其實我非常喜歡這間店,結束吃素後有一次還特別跑去吃。博愛校區附近還有一間菜根香,不過我從未進去吃過。

第三家是在龍山社區裡的修緣素食,地點很難形容,老闆娘應該是慈濟人,可以常常在店裡找到慈濟相關的書報。我去都吃麵類,這是基於個人口味問題。

新竹還有兩、三間百菇素食,可能是連鎖店,我去吃的時候覺得東西小貴,但知道是天然的。有時候會覺得很有趣啊,我居然要一直到吃素一陣子才能理解到以前家裡在做菜的方法跟外面開館子是不一樣的,家裡才有家裡的味道。

我在光華商場附近有看到一間有趣的素食麵店,不過忘記名字了。

此外就幾乎是吃學校餐廰了,交大一餐開了一間新的素食店,讓交大素食者又多了一種選擇,其實也蠻好的。另外,由於上述的店假日幾乎都不開,我假日經常就是煮麵度日。早餐就是麵包解決,回憶起那段日子裡,是真的覺得有東西吃就很幸福,有人願意煮東西給自己吃是很幸福的。

beamer與verbatim環境混用

今天首次嘗試用Beamer套件做投影片,看網路上的Quickstart總是很簡單,實際上做做看就會知道厲害。終究還是在貼code的時候碰上了quickstart沒講的事,花了不少時間在解。

當在beamer環境裡要使用verbatim(通常是用在貼code)時,就必需要{frame}後面加上[containsverbatim]。在survey時也有看到LyX-Code這個環境,不過暫時沒有空深究。

不過平心而論,這是我幾次使用latex製作文件以來,第一次寫內文跟寫latex code時間大約一比一的,過去多半會用比較多的時間在查找latex的資料上,足見beamer套件確實還蠻容易上手的。

\begin{frame}[containsverbatim]
\frametitle{Hello World}
\begin{verbatim}
int main()
{
printf("Hello World!");
return 0;
}
\end{verbatim}
\end{\frame}

星期一, 三月 02, 2009

以後要是當程式助教,應該找一個機會展示Emacs?

更新:我應該要先講一下,這是一篇討論「假設與可能性的」的文章,這並不代表我真的很會用Emacs啊…

看來以後嘴炮不能亂打啊...我欺騙大家的感情 ...

這一年來都在準備研究所考試,blog寫作幾乎中斷,有comment也幾乎沒有去回,感覺很不禮貌。

本日是感冒休息日,在休息日時我又想起這件老掉牙的事情來。

我有一陣子很迷Emacs,那時因為用vim寫java寫到火大了,所以鬧起了脾氣,想要換個editor。後來我覺得這並不是vim的錯,java語言天生就適合用IDE來寫,沒有人能完整記得那層層疊疊的物件庫的,要用vim寫java可以說是秀才遇到兵,有理也寫不清。

但在那短短的時間裡,能夠接觸到另一個世界的文化(Emacs users' World)是很新奇的。可能是所處社群習慣的關係,不知道怎麼搞的,要能碰上使用Emacs的人好像真的很困難,花費了很多時間仍然沒有辦法妥善調整出我想要的環境,最後就放棄了向Emacs發展的道路。

在那一段時間裡,我看到了一篇mailing list archive文章讓我感觸良多,作者是位國外唸CS的畢業生,他說當他們大一的時候,助教們會同時present vim跟Emacs給他們看,教導他們使用的基本技巧,然後再讓他們擇一選擇。未來若有幸可以參與大一程式設計的助教工作,是不是也該如法炮製一番呢?Emacs擁有很棒的功能性,不會落後時下流行的IDE,或許缺乏的只是引領入門的動作。

應該要「展現所有的可能性」,不壓抑任何一種選擇的可能,系上總是「統一指定以某某IDE作為上機考試用軟體」我覺得非常不可取,即便自己都有習慣的環境,也不應該強加於其它人身上。

星期六, 二月 07, 2009

讀杜甫兵車行有感

唸預官考試要讀中國文學史,讀到杜甫時,有著作「兵車行」。這首詩可說是寫實到不行了。下頭這段更是傳神:

信知生男惡,反是生女好;
生女猶得嫁比鄰,生男埋沒隨百草。
君不見青海頭,古來白骨無人收?
新鬼煩冤舊鬼哭,天陰雨濕聲啾啾。

我記得小時候剛開始理解「死」的意義,想到死亡都是很可怕的;對年幼的孩子而言,至親好友的死去是種災難,而自我的死去是無法想像的黑暗。要到了長大一點的時候,才慢慢可以理解「捨命」「赴死」這種無奈但逼自己堅強的情緒是什麼,慢慢可以理解人類為什麼要做這種事。

然後又想到,以前玩文明帝國時,戲劇是一種需要研究的科技。人類可以分辨真實事件帶來的情感與戲劇創造的情感之不同,也是一樣了不起的發明。

星期六, 十二月 13, 2008

彩虹顏色分析

Your rainbow is shaded violet.


What is says about you: You are a creative person. You appreciate beauty and craftsmanship. You are patient and will keep trying to understand something until you've mastered it.

Find the colors of your rainbow at spacefem.com.

星期六, 八月 23, 2008

OpenSolaris的vim沒顏色?

到今天才知道原來terminal info entry就算是同名的,在不同的curses實作上也可能是有差異的

這裡是某個bug report,表示OpenSolaris的vim預設夾帶的vim顏色顯示有點問題,$TERM=xterm時只有亮白跟普通白色,要$TERM=xtermc才會有正常顏色

後來就有牛人出來說話了,因為OpenSolaris的vim是link curses而不是ncurses,才會造成這個情況,
在ncurses裡xterm通常有8種基本顏色,但在curses中xterm只有黑跟白,所以vim就不會顯示顏色了.

星期日, 八月 10, 2008

imap in mutt (simple)

在Mutt介面裡按c,選擇開啟"一個imap信箱"即可
ex: c -> imaps://qlife@imap.cs.nctu.edu.tw:993/INBOX
即時測試imap的狀況可用