2007年11月14日 星期三

Cog, Python-based 的程式碼產生器

Cog 是一個 python-based 的程式碼產生器,http://nedbatchelder.com/code/cog/,讓使用者可以把 python 混在 C++ 的程式碼裡面來自動產生 C++ 程式碼,舉個例子,這是一個 C++ 原始檔,'Actions.cpp':
/*[[[cog
import cog
fnames = ['DoSomething', 'DoAnotherThing', 'DoLastThing']
for fn in fnames:
cog.outl("void %s();" % fn)
]]]*/
//[[[end]]]

你可以看到,python 的程式碼,實際上是寫在 C++ 的註解裡面,在我們用命令列執行過 cog 以後:
python cog.py -r Actions.cpp

他就變成這樣:
/*[[[cog
import cog
fnames = ['DoSomething', 'DoAnotherThing', 'DoLastThing']
for fn in fnames:
cog.outl("void %s();" % fn)
]]]*/
void DoSomething();
void DoAnotherThing();
void DoLastThing();
//[[[end]]]

黃色的部份是被產生出來的 C++ 程式碼。最後一行的 //[[[end]]] 是讓 cog 可以辨識出哪些是自動產生的程式碼,這樣使用者就可以在同一個檔案重複來生成原始碼,而不是去使用兩個檔案,一個來源檔跟一個目的檔。這是一個不錯的方法來自動產生 Java 或是 C++ 的 setter/getter 成員函式。對於大部分的類別而言,我們常常需要一大票的 setter/getter 方法。舉個 Java 的例子好了:
class Color {
int red ;
int green ;
int blue ;
void setRed (int r) { red = r; }
void setGreen (int g) { green = r; }
void setBlue (int b) { blue = r; }
int getRed () { return red ; }
int getGreen () { return green ; }
int getBlue () { return blue ; }
}

使用 cog 的話,我們可以這樣寫:
class Color {
/*[[[cog
import cog
data = ['red', 'green', 'blue']
for d in data:
cog.outl("int %s;" % d)
cog.outl("void set%s%s(int v){%s=v;}" % (d[0].upper(), d[1:], d) )
cog.outl("int get%s%s(){return %s;}" % (d[0].upper(), d[1:], d) )
]]]*/
//[[[end]]]
}

重新模組化一下,這樣寫也不錯
/*[[[cog
import cog
def data_member(d) :
cog.outl("int %s;" % d)
cog.outl("void set%s%s(int v){%s=v;}" % (d[0].upper(), d[1:], d) )
cog.outl("int get%s%s(){return %s;}" % (d[0].upper(), d[1:], d) )
]]]*/
//[[[end]]]

class Color {
/*[[[cog
map ( data_member, ['red', 'green', 'blue'] )
]]]*/
//[[[end]]]
}

這樣當你還有別的類別,你就可以直接使用 data_member 這個函數了。
甚至呢,我們可以維護一個自己常用的 python 模組,像是 'mycog.py':
import cog
import MySQLdb

# create data member with setter/getter
def data_member(d) :
cog.outl("int %s;" % d)
cog.outl("void set%s%s(int v){%s=v;}" % (d[0].upper(), d[1:], d) )
cog.outl("int get%s%s(){return %s;}" % (d[0].upper(), d[1:], d) )

# create a class according to a table in database
def create_table_class(table_name) :
c = MySQLdb.connect(...).cursor()
res = c.query('describe ' + table_name).fetchall()
cog.outl('class %s%s {' % (table_name[0].upper(), table_name[1:]))
for field = res :
cog.outl(...)
cog.outl('};')

這樣,你就可以像這樣複用這個模組:
class Color {
/*[[[cog
import mycog
map ( mycog.data_member, ['red', 'green', 'blue'] )
]]]*/
//[[[end]]]
}

/*[[[cog
mycog.create_table_class(student)
]]]*/
//[[[end]]]

你大概會得到(根據你資料庫表格欄位而定):
class Color {
/*[[[cog
import mycog
ap ( mycog.data_member, ['red', 'green', 'blue'] )
]]]*/
int red;
void setRed(int v){red=v;}
int getRed(){return red;}
int green;
void setGreen(int v){green=v;}
int getGreen(){return green;}
int blue;
void setBlue(int v){blue=v;}
int getBlue(){return blue;}
//[[[end]]]
}

/*[[[cog
mycog.create_table_class(Student)
]]]*/
class Student {
String name ;
Date dayOfBirth ;
String gender ;
String Department ;
...
} ;
//[[[end]]]

2007年10月16日 星期二

勇者大人

Oliver 在家後面的工地撿來一隻新的小喵。


禮拜四撿來的樣子,男生,一個半月大,不太健康,醫生說有感冒,而且可能也有寄生蟲。是很漂亮的虎斑,腹部的毛色偏白,形成很漂亮的黑白虎斑,另外腳底的肉墊也是很很可愛的粉紅色。

完全不怕人,很親人,喜歡窩著人睡覺,也蠻喜歡哭哭哩的,所以常常會去靠近哭哭哩,唯一的問題是哭哭哩很害怕他,可能是因為沒有看過別的貓咪吧,看到一隻花斑斑的東西就覺得很害怕,每次看到他或是聽到他的叫聲,哭哭哩就是全身緊張起來,然後一直發出嗚嗚的叫聲,呈現警備狀態,但是顯然是害怕大過敵意的,當兩個人太接近的時候,哭哭哩甚至還會出手攻擊。

名字一開始 Oliver 說要叫「小虎」,但是醫生阿姨跟小魚兒互看一眼以後,決定忽略這個提議,Oliver 不放棄,再提「那小豹好了」,當然還是不會有人要理他,然後名字就這樣懸宕了沒決定。我在跟小朋友講到家裏有貓咪的時候,小朋友說:「名字叫做『勇者大人』!」哈!真是天才!明明就是這麼明顯的名字我竟然沒有想到!的確沒有比勇者大人更適合的名字啦!就這樣,勇者大人就叫做勇者大人了。

話說可憐的哭哭哩真的很可憐,勇者大人只要一靠近他就緊張兮兮,沒辦法,只好多安慰她,多抓來摸摸,講話,抱抱,然後抱抱睡覺,一直摸一直摸,哭哭哩就會比較安靜,然後在懷裡乖乖睡覺了。醫生說哭哭哩大概要一兩個禮拜才會適應,希望那天快快來到。也許已經很快嚕,因為阿,禮拜天晚上我要走的時候,他們兩個就已經可以一起睡覺了呢,發現哭哭哩想睡覺的時候,警戒就會降低,這個時候把勇者大人抓過去,或是勇者大人自己靠過去,咕咪都不會怎麼樣,兩個還可以抱在一起睡覺喔,真的好可愛 ^^

話說勇者大人跑的還蠻快的,而且跑的時候真的超可愛的說,小手小腳頭大大,他跟哭哭哩不一樣,就是腳很粗壯(看起來很粗壯,小朋說這是因為不同品種,我是不太懂),不像咕咪很纖細,他毛也比較長,所以看起來總是一球一球的感覺,跑起來的時候阿,小手小腳,感覺就只有一個毛茸茸的身體頂著一顆毛茸茸的頭,然後他腳真的是那種兩手一起,兩腳一起的跑法,就好像是卡通裡面那樣,超級可愛的 >"< 心裡有一種想法,希望勇者大人永遠不要長大,這樣就可以一直保持小時候很可愛的樣子了。可是不長大好像也很可惜喔?這樣就沒辦法看到他長大的樣子了。

喔,對了,家裏買了 Wii,回家玩了網球很開心,手好像受傷了 O_O"

2007年10月11日 星期四

如何把 IronPython 整合到 Visual Studio

這篇文章,翻譯來自於 Aaron Marten 的 blog,文章標題是 A bit more on IronPython。我在徵求了 Aaron 的同意以後,翻譯成中文,並依對於 Aaron 的承諾,附上原始出處。

要怎麼把 IronPython 整合到 Visual Studio 2005?

首先,你要去下載這個最新的 Visual Studio SDK(Version 4.0),這邊要注意的是,這個 IronPythonIntegration 的範例,只能用在 Visual Studio 2005 (或是更新的版本)如果你的機器裝的是 .Net 1.1 跟 Visual Studio 2003 的話,那就沒辦法用啦。

我要用什麼版本的 Visual Studio?我可以把他用在 Express 版本上嗎?

很遺憾,不可以。 Visual Studio Express 不支援擴充能力,這是 Express 版本的限制,不是這個範例的問題。你需要標準版或是更高階的版本才能使用這個範例。

另外,你也需要安裝 Visual C++ 來編譯這個範例(所以如果你的 Visual Studio 只有裝 VB 的話,那一樣沒辦法安裝這個範例)。目前所有的 Visual Studio 擴充專案都有這個限制,因為我們需要 C++ 的 preprocessor 去編譯這些範例裡面的 CTC 檔案。(CTC是用來描寫整合到 Visual Studio 時 menu 的結構)

好啦,我已經下載好那些東西啦,那我現在要怎麼讓 IronPython 在我的 Visual Studio 裡面可以動?

打開你的 Visual Studio 2005 (而且你的 SDK 以已經裝在預設的位置),開啟下面這個方案(solution)"C:\Program Files\Visual Studio 2005 SDK\2007.02\VisualStudioIntegration\Samples\IronPythonIntegration"。接著很簡單,你只要按下 Ctrl+F5 去建置你的專案就可以了。建置完成以後,他會自動以「實驗蜂槽模式(Experimental hive)」開啟一個 Visual Studio,裡面就有已經整合好的 IronPython 擴充功能。(另外一種開啟實驗模式的方法是以命令列執行"devenv /rootsuffix Exp")

這邊注意一下阿,如果你直接按 F5(而不是Ctrl+F5)執行的話,你的電腦可能會給你一些 exception 或是 MDA(managed debugging assistant) 錯誤訊息,不過那都不重要,你可以不用管他。

恩,我覺得我已經成功的建制並且執行了,阿現在勒?

那你現在可以用「建立新專案」功能,建立一個新的 IronPython 專案,就像是你建立一個新的 C#/VB/J#/C++ 專案一樣。我建議你一開始應該先開一個 console 專案玩一玩。如果你開一個新檔案,是用 .py 當作副檔名結尾的話,你會發現 Visual Studio 很聰明的會幫你加上 syntax coloring。

另外這個範例有一個很酷的小東西,就是一個叫做 IronPython Console Window 的小工具視窗,你可以從「檢視-其他視窗」來開啟他。這個小工具視窗的功能就是一個互動式的 IroonPython 環境,讓你可以快速的測試你的語法。

關於這個小視窗,還有一件事情要附註一下,就是裡面有個變數叫做 dte,有這個 dte 你可以透過 Macros IDE 自動化操作 Visual Studio(automate Visual Studio),也就是說:你可以用 IronPython 來寫 VS 的 mini-macros,而不必再用 VB 啦!

為什麼我可以編譯?我以前根本就不能編譯任何的 IronPython 程式碼阿?

在過去幾個月裡面,IronPython 團隊加了一些編譯器介面到 IronPython.dll 裡面,所以透過這個 .dll 我們可以編譯 IronPython 程式碼。有一個必須的認知是:這個編譯器編譯出來的程式碼,必須要仰賴這個 IronPython runtime 才能夠執行,也就是說你需要有這個 IronPython.dll 檔案才可以。畢竟這是一個動態的語言,所以當你執行你的 IronPython 程式的話,每一行程式碼都需要被重新檢查型態跟評估其值。

這代表著,你在 IronPython 寫的程式碼,所產生的 MSIL 不會像是你在 C#/VB 所寫的那樣。事實上,你應該沒辦法在其他語言完整的使用以 IronPython 開發出來的功能。

還有什麼特色阿?

一個「範例」就是一個「範例」,也就是說,這只是一個用來示範怎麼把 IronPython 整合到 Visual Studio 2005 的「範例」,所以呢,很多功能並沒有被實做出來,或是即使實做出來了,也不太穩定。雖然如此,這個範例還是很有限度的支援了以下個功能:
  • MSBuild
  • Windows Forms Designer(可以讓你建立視窗程式)
  • WebSite Projects
  • Web Application Projects
  • Intellisense(程式碼自動完成的功能)
  • Demonstrates use of MPF feature

我有好幾個 module(.py檔案) 要彼此互動,那我要怎麼作?

很簡單,把你的檔案都放在一起就好了。比方說,我有一個主程式檔叫做 program.py,然後我有要用到 myModule.py,那我就把 myModule.py 放到跟 program.py 同一個目錄下,然後在我的 program.py 加入一行:
import myModule

這個範例裡面包的是什麼版本的 IronPython?

Visual Studio 2005 SDK 裡面放的是 IronPython1.1 的 pre-beta 版本。

有沒有不用下載 Visual Studio2005 DSK 就可以用 Visual Studio 跑 IronPython 的方法阿?

到目前為止,我們唯一釋出這個 IronPython 整合範例的方法就是透過 VSSDK。

但是呢,IronPython 團隊已經釋出了一個 IronPython for ASP.NET CTP 的東西,包含了這個範例的部份功能。不一樣的是,這個 ASP.NET CTP 只以 binary 的形式釋出,然後他不需要 Visual Studio SDK。

恩,我覺得我發現了 bug 耶……

如果你有任何困難,問題,或是建議,拜託請回報給我們

2007年10月10日 星期三

言多必失

下面那篇,就是本人亂說話不小心誤會別人的實證啦,自己警惕一下。
也要對自己多點信心,很多人都會關心我的,乖。
不知道要多久才會復原,我想我永遠都很難有信心吧。

2007年10月8日 星期一

眼睛有問題

禮拜五,中午吃飯的時候,眼睛紅了,不知道為什麼,就紅的,被詩芳注意到的,小朋友也看到了,說我眼睛怎麼了,說很紅,我說不知道,內心想說應該是就手髒髒揉眼睛弄的,覺得這是小事,因為以前也有過幾次,但是詩芳跟小朋好像覺得這很嚴重,一直要叫我去看醫生。

推託了一下,因為我真的覺得這是小事,想說去看醫生,醫生大概也是說這沒什麼,就多休息,不要揉眼睛,大概就這樣,所以不想去浪費時間浪費錢,但是小朋跟詩芳就很堅持要我去看醫生,凹了一天,凹不過去,答應了。

但是接著兩天就是颱風天,沒辦法,被關在學校,結果連續被念兩天。明明是關心我的,卻老是要用兇的,我想,她們應該是關心我的吧,應該是吧。小朋跟詩芳都是好孩子,內心都充滿愛,跟我不一樣呢。中午吃完飯以後,趁著下午還沒開會之前,查了一下附近的眼科,學校對面往NOVA方向就有一家,就過去了。

沒什麼人,護士一個人在櫃台裡面,掛號以後就進去,不用排隊,醫生看了一下說是過敏,對灰塵,塵蟎之類的東西比較敏感,所以眼睛會這樣,給了兩罐水,一天四次,三天。就這樣。

回來,下午小朋跟我講的第一句話就是眼睛看了沒,我知道詩芳是對我很好,但是小朋應該是因為要我幫詩芳,所以才管我這麼多。我想到她最近對我的口氣,她跟我說過兩次「你快去幫詩芳把她東西弄好!」,聽了其實不開心,因為感覺口氣像是命令的。我幫詩芳是因為我喜歡詩芳,我看到她那樣做事的態度讓我很喜歡,我發自內心的想要幫她,跟小朋友你沒有關係,我要不要幫詩芳是我的自由,妳沒有資格跟我說「快去幫詩芳把她東西弄好!」我喜歡她,所以我會幫她,妳關心她,不過妳沒有權力要求我那樣作。
講是這樣講,其實小朋也看不到這個 blog,只有我自己在看,所以發發牢騷,就這樣。


如果說有什麼東西叫做言多必失,那上面這段就是啦 = =||||||
結果給小朋友知道了,她還來跟我澄清,害我亂不好意思的。其實我只是覺得自己很糟糕,不值得人家關心,所以每次被關心,都會自己胡思亂想別的原因。
是哪個人看到了跑去講的阿,自己招來,害我尷尬死了 XD

2007年10月2日 星期二

沒做事跟沒能力

最近真的是沒做事又沒能力。

小朋友這幾天一直為了論文的事情一直在想東西,我倒是都沒有進度,其實到目前為止,論文在理論上的進步,都是小朋友突破的,我什麼也沒作,不過小朋友總是覺得我很厲害,覺得我已經做了很多,我真的覺得很愧疚,因為我真的什麼也沒作,這樣投出去的 paper,要是我在上面有掛名字,我會覺得很不好意思。每次小朋友跟我講東西時候,我都聽不懂,都要讓她重新講兩三次,我才會慢慢進入狀況,然後只能提出一點點點點想法,雖然她總是說我有給她很多幫助,但是我真的不覺得。對於那些理論的東西,我真的是不學無術,都沒有什麼在進步。

我都只能憑過去的經驗,快速的 coding 來幫助別人,可是對於理論,我就沒什麼想法,詩芳好像覺得我很厲害,不過其實再過一陣子,她就可以恨快追上我了,小朋友也是。而我在理論還是原地踏步,到現在,我對我的論文題目都還沒有確定呢,怎麼辦才好呢?

恩,剛剛跟小朋友下班以後,想說偷偷想要來幫詩芳的忙,但是到的時候,她已經在收東西了,然後一直逼問我幹嘛要來,真是糟糕,我被抓包了,本來是想要回來幫忙的,結果「ㄅ一ㄚˋㄎㄤ」了,真是笨蛋,我只好一直說我是來玩的,我是來玩的,我不想睡覺 = =

2007年9月27日 星期四

中壢 = 咕咪 + Wii

中秋節要回家的說。

回家,結果家裏沒有人,等到很晚還是沒有人,我也沒看到哭哭哩,找上找下都沒看到,難過,想說是不是跟前一隻一樣不小心跑出去,結果就沒有回來了。等到好晚,沒有人,我只好自己打電腦,然後大概十點多聽到喵咪聲,從上面傳來的,我就走過去,我咪,她咪,我咪,她咪,恩,果然在上面耶,大概是我進門的時候,他剛好被關在辦公室吧,然後辦公室的門被風吹關起來,她就被關在上面。開了門,他就跑出來,哇~長大了,好開心,好久沒看到咕咪了,嗚嗚,要是早知道你在上面,我就早點去找你玩了,不用一個人很可憐在樓下打電腦,咕咪給人抱,很乖,還會自己跳到我腳上,越來越喜歡她啦。

沒有一分鐘,媽咪也回來了,還真是剛好喔。媽咪說小蘿蔔頭在阿罵家,明天才會回來。

晚上一邊看電影,一般寫程式,一邊玩貓咪,然後鶔眼睛覺得眼睛很不舒服,想說去洗澡,咕咪竟然跟來,那就一起抓去洗。咕咪很乖,洗澡也不太跑,大致上算是乖乖給我洗。真的很可愛,抱在手上可以乖乖給摸還會睡覺睡得翻掉,喜歡。程式用 Ultimate++ 寫了華容道,但是有 bug,一直到我離開中壢,bug 都沒找到,生氣!

第二天早上六點才睡覺喔,因為寫程式累了,房間因為被小魚兒弄的髒髒臭臭,所以去客廳睡了,很舒服。早上媽咪醒過來,幫我開了電風扇,也有跟我說話,但是已經忘記說什麼了,然後就繼續睡了,喔,對了,媽咪好像說是要去打牌吧。然後睡到下午了,聽到電鈴聲,小鬼回來了,帶了 Wii。

然後就開始一直打 Wii,玩到吃晚餐,八點就騎車回家。騎車的路上撿到一隻手機,打了裡面通訊錄的電話,找到主人的弟弟,昨天他們來把電話拿回去了。