印度出差所看完的電影

這次去印度,瘋狂地看完了以下電影:

  • Scary movie 4 (IMDB, Wikipedia),台譯:驚聲尖笑4。這集比較不好笑…
  • Below (IMDB, Wikipedia),台譯:鬼潛艇。有點毛毛的,主要還是在利用人的心理在營造恐怖氣氛…
  • Over the Hedge (IMDB, Wikipedia),台譯:森林保衛戰。寓教於樂的故事
  • Danny the dog/Unleashed (IMDB, Wikipedia),台譯:鬥犬。普普通通
  • Inside man (IMDB, Wikipedia),台譯:臥底。我覺得還不錯,如果你夠細心的話,從一開始,你就可以推敲出這不是一件搶案。
  • V for Vendetta (IMDB, Wikipedia),台譯:V怪客。小悶的一部片,誠如廣告所打的 slogan,全片的目的就是要追求自由。
  • Ice Age: The Meltdown (IMDB, Wikipedia),台譯:冰原歷險記2。,卡通片,個人覺得不如第一集好看。
  • She is the man (IMDB, Wikipedia),台譯:足球尤物。Amanda show 的主持人領銜主演,之前在美國看電視的時候,就有注意到她,她真的是異常地活潑。
  • 情義知我心,接續上次沒看完的部份,想不到最後的結局竟是以悲劇收場,蠻感人的故事。
  • Wedding Crashers (IMDB, Wikipedia),台譯:婚禮破壞者。還可以的一部片,挺有趣的。
  • Ultraviolet (IMDB, Wikipedia),台譯:紫光任務。全片一路打到底,喜歡動作片的一定喜歡。

VFPWiki升級之路(1) – VMWare server on Fedora Core 5

因為太久沒更新wiki版本,又為了避免站主過於操煩,所以我決定架設一個跟他環境一樣的 server,來先行實驗升級看看。
首先,到VMWare官方網站下載官方提供的 rpm,並且索取 serial-number。
接著就是安裝:

#rpm -ivh VMware-server-1.0.0-28343.i386.rpm

畢竟以前也裝過幾次,接著就是設定 VMWare

#vmware-config.pl

這部份應該沒問題,依照問題回答即可,大部分都只要按下 Enter 選擇預設值即可。
這個問題是比較詭異的,他說 gcc-4.1.1 可能會有問題;不過我不管他,還是輸入了 yes,等有問題的時候再說吧。

Your kernel was built with “gcc” version “4.1.0”, while you are trying to use
“/usr/bin/gcc” version “4.1.1”. This configuration is not recommended and
VMware Server may crash if you’ll continue. Please try to use exactly same
compiler as one used for building your kernel. Do you want to go with compiler
“/usr/bin/gcc” version “4.1.1” anyway? [no] yes

安裝完成以後,可以在Gnome環境下的 應用程式>系統工具 下找到 VMWare server console,執行他。
這可以幫助我們建立一個virtual machine。
下載 debian 的網路安裝光碟映像檔:debian-31r2-i386-netinst.iso,大約只有一百多MB,算是很小。
之後我們將利用 apt-get 直接從網路下載並安裝。
所以就直接把 virtual macine 的光碟機對應到這個映像檔上,進行 Power On,接下來就跟安裝 Debian Linux 一樣啦(不知道怎麼作的話,去買書吧)。
安裝完成之後,記得先暫時關閉 virtual machine,將光碟機對應到實體磁碟機上,免得又要再安裝一次。
開機之後,Debian 會很貼心的進行首次使用前的設定,也是照步驟進行即可。
這樣就大功告成啦,下次來安裝 apache + mysql + php。

印度的交通

印度的交通,前兩天去真是非常驚訝,不過,後來也就習慣了。

如果不能看的話,點選這裡

How to branch/tag in TortoiseSVN

Subversion手冊裡面詳細的介紹了關於 trunk / branches,實際上所謂的 branches,其實也就是把 trunk 搬到 branches 目錄下並換個名稱而已。
TortoiseSVN建 branch/tag 的方法相當簡單。

  • 首先在 checkout 出來的目錄上,按下滑鼠右鍵,選擇 TortoiseSVN > branch/tags
  • 指定 url,改成 http://xxxxx/branches/your_branch_name,填上說明,左下角打勾,這樣 branches 完之後,TortoiseSVN會幫你把整個目錄切換到指定的 branch
  • 大功告成

ok, 那麼要怎麼切換回 trunk (主要開發分支) 呢?

  • 首先在 checkout 出來的目錄上,按下滑鼠右鍵,選擇 TortoiseSVN > Switch
  • url 改為 https://xxxxx/trunk
  • 大功告成

7/13 Hyderabad 的第一天

今天是來到印度的第一天,早餐以後約九點多,與 A 到 P 公司去,路上真是充滿驚奇!
印度與日本一樣,車子都是靠左駕駛,駕駛座則是在右邊。路上到處都是竄走的機車、汽車與人,有人說台北的交通很恐怖,現在在我眼裡看來,台北的交通算是非常有秩序的了。過了不久,我更發現一件驚人的事情,那就是沒有紅綠燈!所有的車子都是靠喇叭在開車,所以你不時會聽到喇叭的聲音在催促前面的車子或者是亂過馬路的人,很難以想像這樣的交通居然還頗為順暢。
到了晚上八點多,A 與我打道回 Hotel,路上還是很多車子跟人在走來走去,基本上情況跟早上九點多差不了多少,這真是令人吃驚..

Hyderabad, India

經過幾天的心情轉換之後,總算是覺得好些了。~_~
即將要前往 India,目的地是海得拉巴,看起來真是一個好地方。
中文的介紹或許還不夠,但英文的可就很清楚了…
Hyderabad 是印度第五大城,很多資訊公司都在此建立基地,以爭取印度的軟體人才,像是微軟、Portal Player…等等。所以看起來應該是沒什麼問題,希望是不會像背包客棧自助旅行論壇所說的那麼嚇人就好,我可是老實人,很容易上當的。
這次去大約九到十天,假日兩天,印度的夏天非常炎熱,據說都超過 40 度,所以白天還是盡可能不要出外活動的好,而晚上又太過危險,不太想出來亂跑。
結論是,盡情享受咖哩與飯店設施吧…
=_=”

IronPython(4) – 類別、繼承、模組化

基本上還是跟上次的一樣,只是我們要重新寫過,直接繼承 Form 類別,然後模組化。
Python 定義類別的方法相當簡單:

class classname( parentclass ):
  def __init__( self ):
    # initialize
  def doSomething( self ):
    # do something

他是以左邊的縮排來決定範圍,所以同樣縮排就表示是同一區塊。
self 則是表示自己,也就類似 c# 的 this。
所以我們把昨天的程式碼重新寫過:

import clr
clr.AddReferenceByPartialName(“System.Windows.Forms”)
clr.AddReferenceByPartialName(“System.Drawing”)
from System.Windows.Forms import *
from System.Drawing import *
class OptionForm( Form ):
  def __init__(self):
    self.InitializeComponent()
  def InitializeComponent(self):
    self.Text = “RSSMSN – customize your msn personal message”
    # Initialize Label
    lblHello = Label(Text=”Hello world!” )
    lblHello.Visible=True
    lblHello.Location=Point( 10, 10 )
    lblHello.AutoSize=True
    self.Controls.Add( lblHello )
    # Initialize NotifyIcon
    notifyIcon1 = NotifyIcon( Visible=True, Text=”RSSMSN”, Icon=Icon(“Matrix.ico”) )
    # Initialize Form
    self.StartPosition=FormStartPosition.CenterScreen

大致上就會是這樣子,我們將這個檔案命名為 fmOption.py。
主程式則另外放到 main.py:

import clr
clr.AddReferenceByPartialName(“System.Windows.Forms”)
clr.AddReferenceByPartialName(“System.Drawing”)
from System.Windows.Forms import *
from System.Drawing import *
from fmOption import *
f = OptionForm()
Application.Run(f)

你可以看到主程式變得簡單許多。這邊只需要將剛剛寫好的 fmOption.py 引用進來,再將 OptionForm 實體化,請 Application 類別去把窗開出來就好了。
Python 引用其他檔案的方法,統一都是 from your_module import classname。
這個 your_module 可以是 assembly name 也可以是 module name。
大致上就是這樣子了。
下次的目標是加上 destructor 以確保 System Tray 的 Icon 會在程式結束時消失。
參考資料:

IronPython(3) – 第一個窗

基本上參考 tutorial/wfdemo.py 就可以很快的寫出來第一個窗。

import clr
clr.AddReferenceByPartialName(“System.Windows.Forms”)
clr.AddReferenceByPartialName(“System.Drawing”)
from System.Windows.Forms import *
from System.Drawing import *
f = Form()
f.Text = “RSSMSN – customize your msn personal message”
# Initialize Label
lblHello = Label(Text=”Hello world!” )
lblHello.Visible=True
lblHello.Location=Point( 10, 10 )
lblHello.AutoSize=True
f.Controls.Add( lblHello )
# Initialize NotifyIcon
notifyIcon1 = NotifyIcon( Visible=True, Text=”RSSMSN”, Icon=Icon(“Matrix.ico”) )
# Initialize Form
f.StartPosition=FormStartPosition.CenterScreen
Application.Run(f)

他是直接產生 Form 與 Label 的實體,然後丟給 Application,就可以很順利的產生第一個窗。
這裡有個有趣的用法:

lblHello = Label( Text=”Hello world!” )

所以產生實體的時候,可以直接以 PropertyName=value 來指定 Property 的初始值。
但是這樣的寫法,在後期大概會寫到暈倒。
所以還是要搞清楚如何撰寫類別並且繼承才會是比較好的解法。
下次的目標:撰寫類別與繼承。

IronPython(2) – 使用 rsstoolkit

世界上總是有許多人願意提供他們的心血,我們只需要站在他們的肩膀上,就可以快速的發展出我們自己的東西來。
ASP.NET RSS Toolkit 是一個存取 RSS 的 library,其他相關的 Library 還有 RSS.Net,但是目前RSS.Net還沒有釋出 for .Net 2.0 的版本,所以我們選用 ASP.NET RSS Toolkit
首先下載並解開作者所提供的壓縮檔案,將 bin 目錄下的 RssToolKit.dll 複製到 IronPython 目錄下的 lib,以方便 IronPython 取用。
執行 IronPython,要在 IronPython 使用別人寫好的 library(Assembly),有兩個步驟,首先要載入 library,然後再 import 裡面的類別。

import clr
clr.AddReferenceToFile(“RssToolkit.dll”)
from RssToolkit import *

話說回來 ASP.NET RSS Toolkit的說明文件真的是可以用 Poor 來形容,裡面附的一份 Word 文件,就僅描述如何在 Visual Studio 2005 下使用而已,完全沒提及ASP.NET RSS Toolkit裡面有什麼類別,類別又有什麼屬性… Orz…
還好ASP.NET RSS Toolkit有附原始碼,Trace 一下就能瞭解一二。
所以接下來先 initialize 變數。
Python處理變數也蠻像 BASIC 的,隨寫即用:

r = RssDataSource()

連 new 都不用寫。
RSS 的構造主要是以 Channel 為主,所以 r.Channel 就表示 Channel,r.Channel.Items 就表示 Channel 裡面的各個項目。
有了這些資訊,就可以寫出取 RSS 資訊的程式了。
可是Python的迴圈該怎麼寫呢?因為我們要取出 Items 裡的每個項目。
for…next 的寫法

for i in range(5):
print i

foreach 的寫法

for item in r.Channel.Items:
print item[“title”]

總結這些,我們就可以寫出一個取出 RSS 內各項目的程式了:

import clr
clr.AddReferenceToFile( “RssToolkit.dll” )
from RssToolkit import *
r = RssDataSource()
r.Url = “http://tw.news.yahoo.com/rss/realtime”
print r.Channel[“title”]
for item in r.Channel.Items:
print item[“title”]
print item[“link”]

下次的目標,一個簡單的視窗 + 縮小到 System tray。
參考資料:

NAnt(3) – 各個擊破

一個 solution (方案)裡面可能不只一個 project,可能會有許多個。
以前,我會寫在同一個 build 檔案裡面,可是這樣會讓 build 變得很大而且難以維護。
NAnt可以讓你在 build 檔案裡面再去呼叫另外一個 build 檔案,如此一來,我們就可以讓各 build 檔案負責自己的事情,避免都放到同一個 build 檔案裡面了。
語法很簡單,利用 nant 這個 task 就可以達成:

<nant>
  <buildfiles>
    <include name="subdir/default.build" />
  </buildfiles>
</nant>

或者是偷懶一點,讓NAnt找到目前所在目錄下所有子目錄下的 build 檔案,然後進行 build

<nant>
  <buildfiles>
    <include name="**/default.build" />
  </buildfiles>
</nant>

如果,要執行的並不是 build 這個預設 target 的話,該怎麼辦呢?
你可以為 nant task 加上 target 這個 attribute,就行了。

<nant target=”clean”>….</nant>

最後,我們達到各個擊破的目的。