2009年5月31日 星期日

謝師宴

好快。

這不是第一場謝師宴,但這場謝師宴,卻是第一次以「自己帶領的班級」這樣的身份,去參加謝師宴。

當年的導師,可能是我教學經歷中,最重要的老師,在她身上,我的教學觀念出現了一百八十度的轉變,我從一個「被尊敬的老師」,變成一個「尊敬、可信任、瞭解學生」的老師,從一個「讓學生聽話」的老師,轉變成為每次離開,都讓學生落淚的老師。

可惜因為學校制度,當年,只有一年級有安排副導師。

下一次,希望可以是,全程帶完的班級。

2009年5月22日 星期五

CUDA 初體驗

聽說其實不算太小的小馬,現在常常花納稅人的錢跑長庚上課兼把妹,姑且不論他把妹的技巧火侯,其實他主要的目的,就是學習一個 nVIDIA 大魔王玩的新(其實也不太新)的賺錢把戲,名喚做 CUDA。

簡單地說,這東西就是可以將資料丟給將運算能力變態的 GPU 運算,大幅降低 CPU 的負荷,而且 GPU 本身就是 3D 運算起家,算算小學數學大概沒什麼感覺,但是丟給它平行運算與一堆有的沒有的高等數學,情況可就不一樣了。

這天馬公推薦我玩它的 SDK,要我把玩把玩。這東西在 Linux 之上使毫無意外是採用 gcc 編譯的,在 Win32 環境也毫無意外是採用 VC++ 編譯的,於是就有了一個想法:Win32 下頭能不能用 gcc 玩 CUDA SDK 呢?

我按照官方說明安裝了 Tool Kit  與 SDK,然後開啟 Visual C++ 的命令列視窗(有設定編譯路徑,跟系統附設的 CMD 環境不太一樣)順利使用 nvcc + VC++ 來編譯,好,確定可以跑了,而且我發現 nvcc 不單如官方手冊所說,吃 c 程式碼,C++ 程式碼也很 ok,至少我用 cout 與 cin 還沒出包。:)

然後繼續打開 MSYS 與 MinGW(Cygwin 個人很不適應,太機車了),開始設定奮戰,結果終於讓它開始編譯了,這一編才明白,CUDA SDK 底層其實使用了大量 VC++ 的巨集與定義,要讓 gcc 順利移過來,應該是系統級的工程了,或許該考慮拿 Linux 上頭的 Source Code 過來,看能不能在 Cygwin 或 MSYS 上頭順利編過去,不詳,也沒力氣了。

官方手冊就特別交待 win32 版本 gcc 不支援了,硬是要幹。

如果不介意跟路徑奮戰的話,Eclipse 與 Netbeans 確實可以設定編譯器為 CL.exe,理論上應該也是可以取代 Visual Studio 來編譯 CUDA 程式。

好費事。

那麼,CUDA 能不能進 Visual Studio 2008?官方說是可以的,我按照官方的作法,開啟 SDK 中的 template 專案,刪除程式碼作為骨架,確實是可行的。不過我這個人習慣得寸進尺,下一步就是,能不能直接產生 CUDA 的專案?

有關於專案這部份,網路上多數的資料都是 for Visual Studio 2005,2008 的說明不多,幾番奮戰下來,總算是設定成功,編過第一支 Hello Cuda。不過,網路上有幾位大德,很熱心開發了 Simple VS Project Wizard for CUDA,熬了半天夜,人家有現成又完整的,當然要抓來玩,2.0 版本直接支援 Visual Studio 2008,挺不錯,可以編出 .cu 檔案,也可以編出 .dll ,還有四種編譯設定,算是相當完整的環境。

不過這玩意裝下去還是要修改一下的,首先是編譯器的 WP64 要關閉,不然 CL.exe 與 nvcc 會發出一堆警告,雖不礙事,但挺礙眼。第二是關鍵字著色,CUDA SDK 中有附上 Usertype.dat 可供 VS 2005 之前版本使用,2008?不好意思,欠。第三是有關於 SDK 中 cutil.dll 的設定,有些人會用到,有些人不會,如果會用到的就沒事,Wizard 已經設定好了,SDK  中多數範例也都有用到,但用不到的人可能會覺得很機車,寫個程式還要多帶一個沒用的 cutil.dll 到處跑,不帶還不給跑,實在礙事,所以如果真的不需要它,記得要將專案設定中的 cutil 設定取消。

關於顏色,所以我是將 .cu 檔案設定參照 C++ 關鍵字,再怎麼不濟,也比沒有好。

這樣一個開發環境大約算是成功了,不過對於 CUDA 只能用 C/C++ 開發這件事情,我始終耿耿於懷,Wizard 上有 DLL 專案的選項,難不成……哈!果然可以,我試圖使用 C# 呼叫外部 DLL ,這回成功了,這代表 CUDA 雖然得用 C/C++ 來撰寫,起碼可以被外部呼叫了,如果使用的開發語言可以支援 DLL,如 C# 或 VB,那麼 CUDA 的資源應該也可以被順利納入。

Java 我不很熟,不過聽說有個東西叫做 JNI,或許可以透過它呼叫 DLL來使用 CUDA 的功能。

2009年5月7日 星期四

老港仔情歌:戀愛預告

林姍姍,是誰?

跟香港不熟的人可能不太清楚她是誰,不過談到《開心鬼》中的「顏如玉」小妹妹可能就很多人有印象了,《開心鬼》系列電影扶起了不少後來很有名的女演員,最大咖的就是張曼玉。而第一集中三位少女主角,林姍姍可能是後來發展最有氣勢的,與鄭丹瑞、何嘉麗組成的廣播《三個小神仙》紅極一時,稱他們為20年前的Twins也不過份。

先來看一下,當年她唱的《戀愛預告》,作者陳百強,在香港,幾乎成為經典情歌:

 

電影場面其實常看,來看一下林姍姍本人的演唱。這段影片我非常喜愛,因為我對於早期陳百強所寫的歌曲, 相當著迷,會讓我有靈魂在月光中飛翔的感受:

 

說這首是港仔經典情歌並不過份,鋼琴版本可好聽了:

 

陳百強本人很可惜已經過世了,港仔們說他跟張國榮同期是個錯誤,一時瑜亮,兩人現在也都走了,真是令人惋惜。陳百強本人演唱這首〈戀愛預告〉又是另一種風味,跟林姍姍的小女人幸福感完全不同,但感覺又是那麼地搭,雖然網路上我找不太到陳百強版本的 mv,實在強烈推薦不聽可惜。肯定狐狸那邊有……不說了,只好打個折扣,聽聽陳百強與林姍姍的現場對唱,影片中嬌小的林姍姍,真是可愛到過份的地步:


戀愛預告
詞﹕鄭國江 / 曲﹕陳百強


愛神也有苦惱,問他可知道,
看看我的心似是醉了櫻桃,人如熟了櫻桃,

愛情常向窗邊低訢,恨他不知道,
但願今夕在情人夢裏,寫下痴心記號,

窗外天空每朵白雲,滿寫醉人曲譜,
夜空星星向月兒說,甜蜜是這戀愛預告。

愛情常向窗邊低訢,恨他不知道,
但願今夕在情人夢裏,寫下痴心記號,
窗外天空每朵白雲,滿寫醉人曲譜,
夜空星星向月兒說,甜蜜是這戀愛預告。


窗外天空每朵白雲,滿寫醉人曲譜,
夜空星星向月兒說,甜蜜是這戀愛預告。

 

 

wiki:林姍姍

wiki:陳百強

老港仔俠骨

港仔武俠片,經歷過那個年代的人就知道,主題曲首推羅文系列,影響之巨大,在很多港片中都可以看到,從此以後就跟日本假面騎士主題曲發展類似,從此定型,一定就是這個風格。港仔武俠片最轟動的時候,約莫是我小鬼時代,小學中年級以前的茫茫無知年代,但畢竟出身於電視兒童世家,沒事就是泡在電視前,感謝現在網路的發達,很多兒時記憶有機會被我慢慢挖出來一條條正名:

先來一首雄壯威武的,這旋律常看布袋戲的應該會很熟,頻率應該僅次於《荒野大鏢客》跟《虎豹小霸王》。我一直以為這是另一部講戚繼光的古裝劇《虎威》主題曲,而且唱的是女聲,那句「情如絲,作繭自縛;愛如海,回頭是岸」在我心中洄盪了二十幾年,終於發現那是個美麗的錯誤:

《倚天屠龍記》:

 

鄭少秋-倚天屠龍記主題曲原裝MV (1978)
作曲: 顧嘉輝
填詞: 黃霑
情義繞心中有幾多重
仇恨又卻是誰所種
情仇兩不分 愛中偏有恨 恩怨同重
忘情棄愛世上有真英雄
常人只許讓愛恨纏心中
難忘你恩深 我偏偏有恨 相思難共
情如天 萬里廣闊
仇如海 百般洶湧
要共對亦難 分也不可 愛恨填胸
迷迷惘惘苦痛有幾千重
愁愁怨怨待那日才可終
屠龍刀倚天劍斬不斷心中迷夢

香帥瀟灑帥勁風範可不是後來的小馬哥四大天王等人可比擬的, 現實生活中香帥老婆也是滿令人驚訝的……

然後是這部,《小李飛刀》,熟悉程度應該不下《倚天屠龍記》,我找了好久,終於找到這個當年在臺灣播放版本相同的畫面,連刀劍聲出現的點都跟我記憶符合:

 

小李飛刀 1978
曲: 顧家輝
詞: 盧國沾
難得一身好本領 情關始終闖不過
闖不過 柔情蜜意 亂揮刀劍無結果
流水滔滔斬不斷 情絲百結衝不破
刀鋒冷 熱情未冷 心底更是難過
無情刀 永不知錯
無緣份 祇嘆奈何
面對死不會驚怕 離別心悽楚
人生幾許失意 何必偏偏選中我
揮刀劍 斷盟約 相識註定成大錯

過癮嗎?再來,是同一個時代,另一位唱武俠片有名的人物,就是關正傑,《天蠶變》這首〈再與天比高〉絕對也是經典名曲,華視後來改拍為連續劇,用的也是這首國語版本:

 

電視劇《天蠶變》主題曲
作曲:黎小田
作詞:盧國沾
主唱: 關正傑
獨自在山坡 高處未算高
命運在冷笑 暗示前無路
浮雲遊身 發出警告 我高視闊步
須知此山頭 猛虎滿佈
膽小非英雄 決不願停步
冷對血路 寂寞是命途
明月映山崗 倍覺孤高
拋開愛慕 飽遭煎傲 早知代價高
絲方吐盡 繭中天蠶 必須破籠牢
一生稱英雄 永不信命數
經得起波濤 更感自傲
抹去了眼淚 背上了憤怒
讓我攀險峰 再與天比高

還有嗎?當然還有,再來一首好了,不然文章就要臭長了,壓軸了,香帥再度登場,這次搭配超級美人蘇蓉蓉(趙雅芝),當年讓臺灣萬人空巷、寧可看電視不擺夜市的超級作品,《楚留香》:

 

作曲:顧嘉輝 作詞:黃霑 演唱:鄭少秋
湖海洗我胸襟   河山飄我影蹤
雲彩揮去卻不去   贏得一身清風
塵沾不上心間   情牽不到此心中
來得安去也寫意   人生休說苦痛
聚散匆匆莫牽掛   未記風波中英雄勇
就讓浮名   輕拋劍外
千山我獨行不必相送
啊...獨行  不必相送

真令人感傷,年紀大了之後,對那句「獨行,不必相送」,感觸更深了。

2009年5月5日 星期二

Ruby GUI 安裝奮戰記

寫 Ruby 有種麻醉的效果,所以最近常玩得醉醺醺地。

不過Win32 下頭的 Ruby安裝不知道該說是友善還是不友善,Ruby官網一抓就下來了,安裝也很直觀愉快,就是放在 C:\Ruby 下頭,打開命令列之後,下達以下指令:

cd\

cd\ruby

cd bin

ruby –v

就可以看見 Ruby 向你招手了。不過,紅寶石如果只有這樣,那就不好玩了,當我們上銀樓買寶石時,最費工的往往不是裸鑽,而是戒臺跟旁邊二二六六的,不過我是個沒耐性的人,很討厭各種奇怪的安裝或修正方式,特別是網路上一堆 ruby 版本頗舊,安裝起來修改不少,加上從以前苦命時代就留下來的同功能軟體不重複原則,所以我測試過許多的安裝方式,包括:

1.Ruby 官版 + Eclipse:RDT 對於命令提示確實如網路所寫,有些低能……

2.Ruby官版+Netbeans for WinXP SP3:還不錯,只是 rake 一直出現問題,錯誤訊息頗擾人,加上還內建強姦版 JRuby,懶得解決。而且要怎麼在 IDE 中加入 GTK 呢……?

3.Ruby 官版 + Netbeans for Ubuntu:安裝很順利完成。只是我不瞭,Ubuntu 為了安裝策略而沒有將 Ruby 打包,所以得手動安裝,這真是見鬼了。

4.Ruby 官版 + Netbeans for OSX:安裝很方便,照說只要 XCode 就可以了,怎麼搞的,非要包個 Cocoa 上去……為了相容專案,所以只好又裝個 Netbeans 上去。

5.Ruby官版 + Cygwin:別開玩笑了。再說一次,我很

6.Ruby官版 + EmEDIT:要這樣的話,那何必呢!

不過經過我這個懶人的到處亂找,還是找到不錯的工具了,現在列出安裝順序:

首先,先下載  Ruby in Steel。這是一套超級懶人包,會將所有的 Ruby on Rails 環境都幫你設定好。最妙的是,裡頭還包了一套 Visual Studio 2008 版本的 shell,因為我本來就使用 VS2008 寫 C# ,因此就選擇不裝了,讓它自己去設定就好。

如果你打算用其它環境,可以用懶人包王者 Ruby One Click 版本。其實上段講到的 Ruby in Steel,裡頭包的也是這個版本,因此,合理地,預設路徑就是:

C:\ruby

打開 Visual Studio 2008,第一個 Logo 就出現了紅寶石,開啟新專案,就可以看到了許多微妙的變化,包括下拉式選單有了 ruby 項目、多了一個 cmd 顯示視窗、工具也都設定好了。

其實這時候的 Ruby 已經可以使用了。再來是 GTK2,直接殺到 GTK2 官網去抓取,我很懶,所以直接使用推薦的 ruby-gnome2-0.16.0-1-i386-mswin32.exe, 然後將直譯器路徑設定好了之後,下達網頁建議的測試指令:

C:\ruby\>ruby -v

C:\ruby\>ruby -e "require 'gtk2'"

C:\ruby\>ruby -rgtk2 -e "Gtk::Window.new.show;Gtk.main"

wow,so nice,真是適合我這個懶人。然後是 Visual Studio的測試,先開一個 Ruby 專案檔,然後開始 key 程式碼:

require 'gtk2'

   window = Gtk::Window.new()

   button = Gtk::Button.new('Hello World')

                 window.add button

         button.show

         window.show

Gtk.main

GTK 視窗也很嗯哈哈地出現了。鬆一口氣。聽說 GTK2 帶的 Glade 可以使用 \ruby\bin\ 的 ruby-glade-create-template.bat 來轉換,等等來試試。

Glade 這玩意畫起來很不方便,如果用習慣 VS 或大部份的 GUI 工具的程設師可能一開始會搞不清楚狀況,其實我覺得設計的概念比較像以前 HTML 設計網頁時代的定位技巧,沒有 CSS 方便使用、加上瀏覽器各家胡搞的狀態,為了方便畫面元素定位就先畫表格,然後開始在表格中塞元素……

經過 ruby-glade-create-template 轉換的 .rb 檔案,大概會像下面這樣:

#!C:\ruby\bin

require 'gtk2'
require 'libglade2'

class F123Glade
      include GetText

  attr :glade
  def initialize(path_or_data, root = nil, domain = nil, localedir = nil, flag = GladeXML::FILE)
    bindtextdomain(domain, localedir, nil, "UTF-8")
    @glade = GladeXML.new(path_or_data, root, domain, localedir, flag) {|handler| method(handler)}
  end
  def on_open1_activate(widget)
    puts "on_open1_activate() is not implemented yet."
  end
  def on_paste1_activate(widget)
    puts "on_paste1_activate() is not implemented yet."
  end
  def on_save_as1_activate(widget)
    puts "on_save_as1_activate() is not implemented yet."
  end
  def on_about1_activate(widget)
    puts "on_about1_activate() is not implemented yet."
  end
  def on_copy1_activate(widget)
    puts "on_copy1_activate() is not implemented yet."
  end
  def on_new1_activate(widget)
    puts "on_new1_activate() is not implemented yet."
  end
  def on_delete1_activate(widget)
    puts "on_delete1_activate() is not implemented yet."
  end
  def on_cut1_activate(widget)
    puts "on_cut1_activate() is not implemented yet."
  end
  def on_save1_activate(widget)
    puts "on_save1_activate() is not implemented yet."
  end
  def on_quit1_activate(widget)
    puts "on_quit1_activate() is not implemented yet."
  end
end

# Main program
if __FILE__ == $0
  # Set values as your own application.
  PROG_PATH = "123.glade"
  PROG_NAME = "YOUR_APPLICATION_NAME"
  F123Glade.new(PROG_PATH, nil, PROG_NAME)
  Gtk.main
end

程式碼不難懂,紅色的部份是我自己修改的。要注意的是,ruby 對於變數名稱命名規則有些規定,而 ruby-glade-create-template 轉換時的 class 名稱是由檔名決定的,我很白目地取了一個 123.glade,結果就轉出一個 123Glade Class,當然下場就是,直譯出包。

感覺很高興。Visual Studio 中看到 GTK 感覺真的很奇妙,一定要用一句話來描述我的心情的話,我只想說:

GTK,你長得真醜。

2009年5月1日 星期五

被麥當勞幹掉的城市光廊

那天在高雄中華路吃火鍋,三五好友聊起了高雄這幾年的發展,不能否認,入夜之後的高雄確實比以前美麗了,但是隨著聊到城市光廊可能收攤的新聞,每個人似乎都有些感慨。

記得光廊最輝煌的那一年聖誕,他們在市中心放了一個巨大華麗的雪人寶寶,成為那個平安夜高雄最耀眼的市中心,而當繁華落盡,卻沒人知道雪人到了哪裡。三個月後,我在燕巢鄉的路邊看到了一家小吃店,旁邊放著失去光彩的雪人寶寶。

SNOWMAN_02

光廊,也走向了雪人之路嗎?它曾經讓高雄市民抬頭挺胸、也曾經讓外縣市的民眾感到羨慕,更是讓好幾任市長沾沾自喜的焦點,但是現在面臨經營不善的窘境,即使在超豪華中央公園捷運站通車、中央公園改建完工後,仍然沒有起色,為什麼?

我們吃完火鍋,帶著滿滿的飽足感與疑惑走出火鍋店,走到中央公園,走進豪華的中央公園捷運站,站在捷運站為了省電而掛上的「電扶梯暫停使用」看牌前,望著稀落的人潮,有點理解了,連捷運自己都有經營問題了,遑論期待它能為光廊帶來什麼週邊效應。

DSC00461

中央公園還是高雄市重要的公車轉運點,不過,作為消費主力的學生,坐公車,白天的遠多於晚上的,趕路的遠多於逛街的,往新崛江走的又遠多於往城市光廊走的。

本來設定的消費族群就不是高中生、而是大學生吧?我們想。

那麼,大統262關門大吉會是原因嗎?不會吧?平時,262還要沾光廊與捷運的光環經營耶!奇怪的經營策略加上漢神與三多商圈的夾殺,262能活下來才是奇蹟。

「捷運沒通車之前,光廊反而更熱鬧耶!」一個朋友說。

「別說了,我站得腳好酸。那我們找個地方點飲料坐下聊天?別在這裡餵蚊子了。」另一個朋友說。

「麥當勞如何?」

一群人都沉默了下來。

有點理解了,其實,城市光廊是被麥當勞幹掉的。

在台灣,麥當勞跟 7-11一樣,有種不可思議的市場現象:只要他們在某處開了分店,只要默默地做好他們自己的本分,根本不需要攻擊其他對手,商圈附近的同性質店家就會默默地閉嘴收攤、自爆垮台。

只要本質不差,品牌的威力就可以很恐怖。

走進麥當勞,幾個人繼續剛才的話題,對於高雄市民而言,要吃晚餐、要喝飲料、要打屁聊天、要吹冷氣、要打發時間、要認真讀書,麥當勞絕對都是平價首選,東西的滋味雖然不算頂級,最起碼不會難吃。

反之,隔壁的光廊白天不好看、晚上有蚊子、東西不好吃、飲料又太貴,更別說戶外廣場太熱沒冷氣,平時唱歌跳舞的跟唱野台戲的水準也差不多,稱不上質感,唱卡啦 OK 跳土風舞人可能還多一點。

但是麥當勞不漂亮啊!

姑且不論麥當勞的品牌魅力,光廊的漂亮,當初確實令人驚豔,這確實是光廊獨有的品牌特殊性。

但,隨著高雄開始大量複製光廊經驗,每個地方都裝上經過設計的燈飾、重要道路每塊路牌都走向所謂的光廊設計感,一個不經意,你會在某個角落看到一塊牌子寫著「○○光廊」,這個角落可能是市府的、也可能是某個企圖凸顯質感的店家。城市光廊的魅力被大量複製,逐漸被廉價化了、平淡了,不是變醜了,而是其他地方變得都是光廊特色了,當特色普及了,特色就不再是特色了,取而代之的是大量廉價仿冒的俗氣。

每一個自以為高尚的高雄景點,文化中心、美術館區、西子灣、旗津、壽山、蓮池潭、愛河、還有一大堆取了怪名字的公園、碼頭,處處都可以看到抄襲光廊的粗糙痕跡,說是良好效應也成、說是提昇了高雄市民的生活品質也可,但也看得出來,反覆拷貝城市光廊,只顯得市政府大氣不細心、只求一時表面浮華卻不講究長遠維護細節品質的心態。

沒有特色的城市光廊,在大立精品的照耀下,只是市中心的一條普通人行道而已。

還沒論及背後中央公園黑暗角落、遙遠的廁所與蚊子大軍。這是女性消費者非常忌憚的。

光廊的水電開銷,都是由商家擔負的,市政府對於光廊的維護費用其實相當低廉,這樣的都市經營模式,市政府也認為這是良好的商業模式,還引以為傲了好一陣子,但隨著光廊的走下坡,商家漸漸也無法支持這些開銷,市政府會願意分攤多少,沒人知道。於是市民應該可以注意到,光廊的盛況不再,連水池、燈管都在管制開啟,甚至,空氣中的況味也開始有些俗不可耐。

如果責怪經濟不景氣、消費力降低,對面的麥當勞可是人潮絡繹不絕。

市府要不要考慮一下,讓麥當勞經營城市光廊?