Search Google

Tuesday, April 29, 2008

py2exe script example


以下是更完整的sample:


另外,我們可以使用UPX幫所有的binary減肥:

upx.exe --best *.*

最後再包成安裝檔。

使用py2exe與其他工具(如UPX, NSIS等)的幫忙我們可以使用Python輕鬆的製作GUI程式,而使用者也不需要安裝Python引擎便可以執行,有如用C/C++編寫native executable一般,只是體積仍舊稍嫌大了點(wxPython的lib體積實在太大了,UPX也無能為力),如果是一般的console app或許還可以瘦身到1MB以下(pytho25.dll經過UPX的壓縮後由2.XMB減少為859KB)。

Updated @ 2008/04/30
script中的windows表示產生出來的執行檔為gui程式,如果要產生文字模式的程式執行檔可以將windows改為console。

Monday, April 28, 2008

More about putting icon into caption

前幾天說明如何在wxWidgets寫gui並且把icon放入caption的位置。
今天再來介紹一下如何在wxPython將icon置入caption,但是實在太懶得打字,因此決定採用此篇blog的教學,他介紹了三個方式,我一直試到第三個方法才成功。
特此節錄一下第三個方法的內容:
import wx
app = wx.PySimpleApp()
frame = wx.Frame(None,-1,"Set Icon",size=(300,100))
ib = wx.IconBundle()
ib.AddIconFromFile("app.ico",wx.BITMAP_TYPE_ANY)
frame.SetIcons(ib)
frame.Show()
app.MainLoop()

Friday, April 25, 2008

Check ram type in Linux

我們在Linux中雖然可以透過dmesg以及/proc獲取許多主機的硬體資訊,例如CPU,記憶體容量等資訊,但是卻無法得知主機採用何種記憶體,這對於想要替主機擴增記憶體的管理者來說頗不方便,因此"dmidecode"指令便在此時派上用場。
使用"dmidecode"指令就可以在console下得知主機記憶體的類別(SDRAM,DDR,DDR2等),以下為執行"dmidecode"所取得的部分訊息,其說明主機上使用的是兩條256MB的SDRAM:

Handle 0x0006, DMI type 6, 12 bytes
Memory Module Information
Socket Designation: DIMM 1
Bank Connections: 0 1
Current Speed: Unknown
Type: DIMM SDRAM
Installed Size: 256 MB (Double-bank Connection)
Enabled Size: 256 MB (Double-bank Connection)

Error Status: OK

Handle 0x0007, DMI type 6, 12 bytes
Memory Module Information
Socket Designation: DIMM 2
Bank Connections: 2 3
Current Speed: Unknown
Type: DIMM SDRAM
Installed Size: 256 MB (Double-bank Connection)
Enabled Size: 256 MB (Double-bank Connection)

Error Status: OK

Wednesday, April 23, 2008

wxWidgets + Bakefile 環境設定

+前幾天利用簡單的sample bakefile (.bkl)介紹如何開始開發自己的wxWidgets project,利用前幾天介紹的方法雖然可以很快的build出自己的wxWidgets GUI (.exe),但是總覺得missing something,例如:漂亮的button (詳請參照),桌面icon,或caption icon等。問題就出在我們少include了一些resource file (.rc),以下是wx-user mailing list上好心人士Vadim Zeitlin給我的建議:

One uses the manifest and hence has the native XP look, the other one does not. If you use a recent wx version, manifest should be automatically included provided you include wx/msw/wx.rc in your resource file. If you don't know about the resource files and such, looking at the minimal sample
make/project files should help.

於是我決定參考wxWidgets所附sample中的bakefile來打造屬於自己的獨立工作環境。
首先將[WX]\build\bakefiles,[WX]\include,與[WX]\lib這三個目錄複製到存放工作目錄的目錄中([WX]為wxWidgets的安裝目錄,例如:"C:\wxWidgets-2.8.7\"),如下圖:
圖中的kkbox為工作目錄

接下來將sample中minimal的bakefile (minimal.bkl)複製到我的工作目錄中並且改名為[your_bakefile].bkl,將裡面的exec id與sources替換成自己的設定,並將include files的路徑指到剛剛複製過來bakefile下的common_samples.bkl,把creatorid改成自己想設的字串,最後加上設定project resource file的部分[your_resource_file].rc,[your_bakefile].bkl看起來應該像下面所顯示的內容:









kkbox_buster.cpp
core
base
kkbox_buster.rc
kkfox_01




這時候如果我們直接執行bakefile -f mingw [your_bakefile].bkl便會看到一些錯誤訊息,因為bakefile目錄中wxwin.py裡面使用相對路徑include file,於是我們要將wxwin.py第100行的VERSION_FILE = '../../include/wx/version.h'改為VERSION_FILE = '../include/wx/version.h',接下來就可以執行bakefile -f mingw [your_bakefile].bkl取得makefile.gcc。
還不要高興得太早,這個makefile.gcc還沒有辦法用,因為library的路徑不對,於是我們需要將makefile.gcc中的LIBDIRNAME由原先的.\lib\gcc_$(LIBTYPE_SUFFIX)$(CFG)改為..\lib\gcc_$(LIBTYPE_SUFFIX)$(CFG),接下來將makefile.gcc存檔之後便可以進行build程序(mingw32-make -f makefile.gcc),如果程式碼沒有什麼問題的話稍待一會便可以得到wxWidgets的gui執行檔(.exe)。

以上為昨天晚上花一點時間研究的快速ugly hack!
至於乾淨的build from scrach。。。再看看吧@@

最後順帶一提resource file (.rc)的內容其實就是project會用到的一些icon圖示,wx.rc則是wxWidgets預設的一些效果(如漂亮的button效果等):

KKFOX ICON "KKBOX.exe_I0080_0404.ico"
#include "wx/msw/wx.rc"


Update @ 2008/04/28
而C++ src code裡面的寫法為在wxFrame的constructor中加入:
SetIcon(wxICON(KKFOX));

Tuesday, April 22, 2008

Button does not show up correctly...



I created the buttons in wxWidgets and wxPython with the following lines.
The codes are virtually identical, but the look and feel differs somehow.

wxWidgets:


cancelButton = new wxButton(panel, (wxWindowID)ID_CANCEL_BUTTON, wxT("Cancel"), wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT);


wxPython:

ctrlButton = wx.Button(parent=self, id=-1, label=label.decode('utf-8'), style=wx.BU_EXACTFIT)

Friday, April 18, 2008

Generate Makefile with Bakefiles (wxWidgets)

以下適用的環為:
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的根目錄中。

wxWidgets提供的template

複製到工作目錄中



只要完成以上的準備步驟便可以利用以下指令輕鬆編譯自行開發的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。

Friday, April 11, 2008

國防部的wiki為什麼用簡體?


這是我們中華民國國防部的wiki,為什麼使用預設編碼的時候會出現簡體字?難道是對面的人幫我們寫的嗎!
(哪個政戰官/士來反應一下吧,這應該有算業績吧)

Thursday, April 10, 2008

Google Analytics秀豆了

請注意以下兩張圖奇怪的地方:

0 Visitors

54 Visits

明明有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中稍加設定即可。

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