以下適用的環為:
MS Windows (XP) + MinGW + wxWidgets
大部分新接觸wxWidgets的人應該都會感到不知如何進行build的步驟,因為makefile實在是太複雜了,而開發者又得非常清楚wx的include files & libraries路徑,就我個人而言只能將wx app寄放在wxWidgets安裝路徑下然後借用wx samples的makefile(eg. minimal的makefile)稍作修改後進行編譯,但是這樣子實在不是很方便。在因緣際會下發現我們可以使用Bakefiles很容易地產生wx app的makefile。
以下是我google過後的心得筆記兼備忘錄。
Bakefiles是wxWidgets的某個作者設計用來產生Makefile用的工具程式,在安裝wxWidgets的同時也會將產生wxWidgets應用程式所需要的bakefile template(.bkl)一併安裝到電腦中(eg. C:\wxWidgets-2.8.7\build\bakefiles)。
從Bakefile網頁可取得安裝檔,安裝完畢之後可以在安裝目錄中找到使用說明(eg. C:\Program Files\Bakefile\doc\html\index.html)。
wxWidgets所附的範例(minimal.bkl)如下:
如果要在wxWidgets以外的目錄開發wx應用程式一樣可以使用wxWidgets所附的bakefile script,只需要做些小修改即可,如下(HelloWorldApp.bkl):
這裡我只將最上面兩行的xml標籤移除,並且將minimal改為HelloWorldApp,路徑也不存在於wxWigets的安裝路徑中,如此一樣可以成功build出使用wxWigets開發的GUI HelloWorldApp。
除了要bakefile script之外還需要一些簡單的步驟:
1. 建立ConfigureMinGW.bat(其中MinGW與wxWidgets的路徑請自行更改成正確的值)
與MinGW.bat(其中MinGW與wxWidgets的路徑請自行更改成正確的值)
使用MinGW.bat開啟console並用這個console作為編譯wx app的環境(當然要cd至工作目錄中!)。
2. 將wxWidgets附的bakefile template ("C:\wxWidgets-2.8.7\build\bakefiles\wxpresets\presets" 整個目錄,如圖所示)複製到wx app的根目錄中。
只要完成以上的準備步驟便可以利用以下指令輕鬆編譯自行開發的wx app:
> bakefile -f mingw HelloWorldApp.bkl
> mingw32-make -f makefile.gcc
因為wxWidgets預設採用static link的方式進行編譯並且為DEBUG build,因此產出的執行檔體積相當大(27411KB),所以最後我們還需要利用strip替我們的執行檔減肥:
> strip --strip-unneeded HelloWorldApp.exe
這時候HelloWorldApp.exe的體積為2409KB,如果想要再精簡一點可以將comment section也移除:
> strip --remove-section=.comment HelloWorldApp.exe
最後HelloWorldApp.exe的體積為2386KB。
Search Google
Friday, April 18, 2008
Generate Makefile with Bakefiles (wxWidgets)
Friday, April 11, 2008
Thursday, April 10, 2008
Google Analytics秀豆了
請注意以下兩張圖奇怪的地方:
明明有54個visits,但是卻沒有半個visitors!
股價跌38%之後連bug也跟著多起來了嗎?
Monday, April 07, 2008
Subversion (SVN) Apache server (httpd)架設注意事項
設定Apache的部分很簡單,只要跟著subversion的document做就可以,真正需要注意的是目錄的使用權限。
記得在建立新的repository之後更改群組(chgrp grpAAA someFolder -R),再讓群組有修改目錄的權限(chmod 775 someFolder -R),千萬要記得加上"-R"參數,否則子目錄的狀態不會被更改,今天卡在權限問題卡了將近兩個小時才發現問題所在。
Saturday, April 05, 2008
嚐鮮--Firefox3
目前尚未正式發表,但是我們已經可以下載3.0b5版的prepackaged binary安裝。
雖然下面的連結內容是寫給ubuntu 7.10,但是應該只要是ubuntu都可以不用修改任何東西直接套用(至少在我的7.04機器上是這麼回事)。
http://www.ubuntugeek.com/howto-install-firefox-3-beta-2-in-ubuntu-710-gutsy-gibbon.html
至於效能如何,就等測試一段時間之後才知道了。
gmail (bulk mail) <--> 雙面刃
這兩天因為某種緣故而自己架了mail server,等到架完確認成功之後才發現當今的mail server為了防堵垃圾郵件早就把浮動IP都列入黑名單中,因此我的mail server成了只能收信而不能寄信的跛腳server。為了讓我的mail server能夠發揮他應有的功效,我決定採用第三方的smtp服務(我選用gmail),如此一來卻讓所有從我mail server寄出去的信都成為由我的gmail帳號所寄出,信先從我的mail server的smtp送到gmail主機上,等gmail主機接受並承認我的認證之後才把信透過他的smtp寄送給收件者,等收件者收到信得時候他會在"From"欄位看到我的gmail帳號,而非我自己mail server上的帳號。雖然在我的mail server上更改過設定之後收件者的回信會回傳到我的mail server,但是沒辦法改變"From"欄位實在是不小的缺憾,待我稍稍研究之後發現原來gmail settings中內建指定"From"與"Reply-To"欄位功能,因此這下只需要在gmail settings中稍加設定即可。
接下來想要試試看寫個script讓多個帳號將"From"與"Reply-To"設定為同樣的值,如此一來便可以達到與從自己mail server寄送大量郵件一樣的效果。
再下一步就是利用script自動申請gmail帳號。。。困難度應該頗高的@@
要這麼做的原因是gmail單一帳號每24小時最多只能傳送500封,而且一旦傳送500封之後將被停權24小時。
為什麼標題說gmail是雙面刃呢?
如果真如我上面所說,整個流程都透過script自動化之後gmail將成為最大的spammer!
此時腦中浮現出"水可載舟亦可覆舟"八個字。
Friday, April 04, 2008
Mail server
今天終於自己裝了個mail server!
先後裝了:
postfix, smtp, dovecot-imap, 與 squirrelmail。
只不過真的要對外發信還是需要借用某固定IP的smtp,因為幾乎所有浮動IP都被加入各大網站的黑名單中了。
經歷今天設定mail server的過程讓我對email header有更多的了解,嘿嘿,看來收假後又可以玩有趣的東西了 :-D
參考網頁:
https://help.ubuntu.com/community/Postfix
http://adomas.org/2006/08/postfix-dovecot/
http://imamba.com/werd/?page_id=102
http://souptonuts.sourceforge.net/postfix_tutorial.html
Thursday, March 27, 2008
wx.BoxSizer使用須知
使用wx.FlexGridSizer的時候通常不會在將widget加入sizer時設定proportion,例如:
bgSizer.Add(button, 0, wx.EXPAND)
如果將這個壞習慣使用於wx.BoxSizer的話就會形成很醜的畫面,例如將BoxSizer的方向設定為wx.VERTICAL,則在resize視窗時widget只會做橫向的resize,縱向將不會改變,要避免這種狀況就必須記得在將widget加入sizer時設定proportion,如下:
bgSizer.Add(button, 1, wx.EXPAND)
Tuesday, March 25, 2008
Monday, March 24, 2008
wxPython設定視窗最小顯示尺寸
最直覺會想到使用wx.Window的SetMinSize(wx.Size(x, y)),但是需要不斷的try & error而顯得不太實際。
接著想到將wx.Window的GetBestSize()或GetEffectiveMinSize()直接傳入SetMinSize(),但是GetBestSize()與GetEffectiveMinSize()所回傳的(x, y)值總比實際需要的大小稍微少一點,就缺這麼臨門一腳。
最後終於找到wx.Window的GetSize(),直接在SetMinSize()中套入GetSize()即可設定視窗的最小尺寸。
範例:
self.SetMinSize(self.GetSize())
self.SetMaxSize(self.GetSize())
self為wx.Frame的custom class