小松鼠嚇了一跳,有了魔法眼鏡後,這世界看起來完全不一樣了

2008年4月26日 星期六

python shell-like pipe

像是 python generator tricks 一樣,其實不少人希望能在 python 裡面做 shell-like pipe。很明顯的,用 | operator 可以辦到這件事情,像是 ASPN Recipe: Shell-like data processing 就是一個例子。但缺點是要用一個 terminator 放在最後。此外,每個指令也都必須要加括號。所以,即使是簡單的 ls,也要變成 ls()|printlines 。而且,你要自己幫每個指令自己加上 __ror__。

PipeCmd

所以,我用三個方式來解決這些問題。最後的 __ror__,現在可以用 decorator 來處理了。terminator,我改用 __repr__ 來取代,這樣,在 python interactive shell 下,可以直接看到想要的回應。也因為如此,所有的資料都會被轉成 PipeOuput class (其實只是 iterator 加上 | 和 repr)。至於第一個問題,我用類似 partial function 的 class PiprCmd 來處理,有一個特別的 argument 稱為 stdin,用來代表 pipe input。

這樣,我們就可以
from pipeutils import *
ls|wc
ls|tail(n=5)|sort
cat/"*.py"|grep("def")
grep("pipe")/"*.py"/"/usr/include/*.h"
grep("^a","aaa\nbbb\nccc\nabc".splitlines(), open("text","rb"))
裡面的 / 是吃檔案名稱的,cat("text") 等於是 cat/"text",但是 cat/"text*" 等於 cat("text1", "text_something", ...)
更好的是,也可以和一般吃 iterator 的函數互相作用,也可以用一般 iterator 作用 (pmap 是把普通的的函數變成吃 iterator 的函數)
ls|(lambda g: (l.upper() for l in g))
"abcdefg"|pmap(mul,range(7))
import math
range(0,90,15)|pmap(lambda x:x*math.pi/180)|pmap(math.sin)
我的方法不算是最好的,應該只要用一個 class 就行。不過,這樣的解法很直覺。
其實用 ruby 會比 python 更像 shell,因為 ruby 函數呼叫可以不用括號。
另外把所有物件變成 file stream like 可能會更像 shell pipe的行為。
其實還挺多人想要把 python, ruby, perl 的強大功能跟 bash 這類 shell 混和。有一個 perl 的 project 就是把 unix 工具用 pure perl 實現。 python 也有很多,比方 shython 等等,python 本身也有 shutil, diff, 而 ipython 也有 shell-like 功能。
**Update: 20080426
改成只用一個 class pipecmd, 邏輯上比較簡潔一點。同時也做了一些處理,讓 cat(range(10))|sum 也可以跑。
**Update: 20080427
基本上一樣原理的 minipipe.py 只有 60行

2008年4月25日 星期五

Python 的 Generator Tricks

我們都知道 python 的 iterator很有趣,比方下面這個generator 能生成所有質數(根本就只是把質數的定義講一遍而已):

(n for n in itertools.count() if n>1 and not any(n%k==0 for k in range(2,n)))
比較複雜一點的費波納契數列 callable iterator
iter((lambda x:x.append(sum(x)) or x.pop(0)).__get__([1,1]),None)

我們也知道新的 send/yield 能夠玩出不少把戲,不過這篇簡報簡直把 generator 玩得爐火純青 Generator Tricks for System Programming

generator 根本就能夠當成 pipeline 來玩。

比方你有一組 log,最後一個欄位不是數字就是 ' -'(當成 0),你想算這些欄位的總和,原來你可能會寫成

wwwlog = open("access-log")
total = 0
for line in wwwlog:
bytestr = line.rsplit(None,1)[1]
if bytestr != '-':
total += int(bytestr)
print "Total",total
但用 generaotr 來思考
wwwlog = open("access-log")
bytecolumn = (line.rsplit(None,1)[1] for line in wwwlog)
bytes = (int(x) for x in bytecolumn if x != '-')
print "Total", sum(bytes)

優雅多了,而且從 pipeline 來看,反而更容易理解。

配合另外一個也很神的 generator_tools ,就能玩出更多把戲。

2008年4月19日 星期六

鹿男與美麗的奈良

這部片是Mr. Monkey推薦, 因為劇中主角玉木宏與綾瀨遙分別因此片獲得當季日劇的最佳男主角及最佳女配角獎。玉木宏飾演的小川孝信一位常在重要關頭失敗的倒楣人士, 例如小學時的武術比賽偏偏在比賽前受傷、考大學因為湊熱鬧掉到水池而沒法準時到考、出社會到公司報到那天公司宣佈倒閉, 最後只好回到原來的大學研究室, 但卻因與實驗室同儕相處不融洽被老師建議去奈良女子學院擔任臨時代課老師、臨走之前才發覺自己女朋友要跟實驗室的死對頭結婚了, 原因是覺得玉木宏太神經敏感了。儘管如此, 在抵達奈良的路途中還是發生大大小小的災難, 最後終於到達學校幫忙準備的宿舍, 與劇中其他兩位學校歷史老師藤原道子(綾瀨遙)、美術老師福原重久(佐佐木藏之介)開始新生活。

奈良是個具歷史意義的古城, 我也曾於1991年第一次的日本旅遊曾造訪過奈良東大寺, 對於寺中的漫走鹿群還有印象, 此劇即以鹿作為主題, 引伸出拯救日本免於富士山噴發災難神話故事。劇中的奈良女子學院有兩所姊妹校分別位於大阪、京都, 三所女子學院皆設在當地古城旁邊, 因此分別以該古城的守護動物鹿(奈良)、老鼠(大阪)、狐狸(京都)作為校徽,鹿、老鼠、狐狸為神話中大明神的手下, 傳說中大明神腳下踩著一隻大鯰魚, 大鯰魚每隔六十年就會蠢蠢欲動, 造成火山噴發及地震, 因此鹿、老鼠、狐狸輪流傳遞一個名為”三角”或”目”的神器來封印鯰魚的活動, 劇中設計的背景即為接近六十年轉換週期的日本, 時常發生地震, 富士山也被偵測到有再度噴發的危險, 為狐狸要將封印轉移給鹿的一年, 小川為鹿所選出來的人類, 有著要從狐狸手上拿回”三角”封印的傳遞手使命。

劇中會講話的鹿、被鹿做記號會從鏡中看到自己鹿臉 "憔悴並神經衰弱”的小川老師, 為此劇特別的地方。此外, 為接待新老師小川的歷史老師藤原, 於出遊時不斷介紹各古蹟名勝的歷史, 除了突顯藤原對歷史事務的熱愛外, 亦使此劇別富歷史教育意義。

2008年4月17日 星期四

今夜,我們瘋狂跳舞

又到了大水蟻兵團大軍壓境的季節了...

今天,夜晚是我們的

不在乎旁人鄙夷嫌惡,我們恣意狂歡,盡情飛舞

這一刻的燦爛與幸福,值得一生蟄伏與屈辱

曾經,在黑暗中匍匐,只有渴求的痛楚

今晚,我們拋開束縛,生命自己作主

黑暗中飛向光明的渴求,純如天使

燈光下意慾蔓延的身軀,輕若無骨

兩小時愛恨纏綿,三億年輪迴癡苦

在春雨中顫抖,羽翼如櫻花飄走

在星空下狂舞,直到粉身碎骨

從不奢想要活多久

只求能陪妳到日出,將光明好好看個清楚

然後,一夜濃情蜜意入夢,伴隨朝露化為春土

明日,我將死去

但今夜,我們瘋狂跳舞

2008年4月16日 星期三

不用擔心誰吃狗

前陣子看完 Neil Gaiman 的美國眾神後,又接著看了他的「煙與鏡」。可能是由於翻譯的緣故,感覺沒有美國眾神那麼有趣。但裡面還是有不少有趣的故事。
最近的韓國狗肉事件,各種意見都有。用極端化法則來思考,你總是可以用能吃牛肉的理由來吃狗肉,用不能吃人肉的理由來反對吃狗肉。所以,太過一般的論述是無效的。
不過,我舉韓國狗肉事件的原因不是要講道理,只是要說煙與鏡裡面的一個故事。我現在手上沒書,不過故事基本上是這樣:
十年前的一天早上,所有動物都消失了。
人們開始恐慌。
愛因斯坦說:沒有蜜蜂,人類只能活四年。
更何況是所有動物都不見了呢。
沒關係,我們還有嬰兒。
嬰兒不說話也不太動。
他們沒有智慧和靈魂,和動物植物一樣。
嬰兒的肉又嫩又好吃,沒有人懷念動物。
嬰兒皮有彈性有保暖,做成的衣服真舒適。
愛因斯坦錯了,只要有嬰兒,人類活多久都不是問題。
不過問題是,今天早上,所有嬰兒都消失了。
怎麼辦?我們要吃什麼?穿什麼?
不用擔心,我們一定會想到辦法。
因為人類很聰明,跟動物和嬰兒不一樣。
煙與鏡中的另外一個故事,一個老旅館服務生說,過去是有神的時代,電影明星就像是神一樣,有獨特的氣質,你一看就會知道。但電視發明後,就沒有神了,只有電視裡面的小人。他也看到很多電視裡面的小人跑來著旅館,但和過去的明星完全不一樣。
我懷疑這是否就是美國眾神的靈感來源之一。有點像是 Video killed the radio star 的感覺。
美國眾神說的就是新世界沒有神。有一些老的神,但是因為不再受到人們的崇拜與信賴,逐漸凋零。有一些新的神崛起(網路、電視),但這些新的神只不過是將來的舊神(鐵路、電報)。美國這個地方,不適合神居住。
當有人喊著自己是新世界的神,或者新世界不需要神,我想到的是日劇生徒諸君裡面的 3DT 和「我們不需要老師」。生徒諸君裡面的二年三班學生,在被原本崇拜與信賴老師出賣背叛後,產生對老師以及大人徹底的仇恨與恐懼。所以其中的三人組成 3DT 這個團體,接受同學的委託,保護同學。「也只有我們能夠保護大家了」3DT 常常對彼此這樣說。即使在一年後,完全不一樣的熱血老師來了,他們也還是完全不信任。他們不斷重複:「我們不需要老師」。
在舊神不再受到信賴的新時代,新的神將自己的身份隱藏在人群中。
因為他們分不出來神與偽神的差別,只好自己當起神。但是如果你連神與偽神都分不出來,你又怎麼能夠當一個好的神?這就是問題所在。
人是無法變成神的,就像美國眾神的設定一樣,人與神是兩種不同的生物。
但是當人比當神要好。神要靠其他人的崇拜才能生存,而人不用。主角 Shadow 這樣說。
到了生徒諸君最後,他們還是說「我們不需要老師」。但意義已經完全不同了。之前他們因為認為所有的老師都是壞的,所以乾脆通通都不要。最後他們已經因為好老師而成長了,所以不再需要老師了。
所以結論是:

為何人類不吃狗?只因人是神的狗。
為何人類不吃狗?擔心神吃祂的狗。
雖然說是寵物狗,難保主人換胃口。
希望大家都變狗,不需要神他們吼。
倘若大家都是狗,不用擔心誰吃狗。
頂多就是狗咬狗,不要人牽自己走。

2008年4月7日 星期一

Cyril 的 Believe

圖片來源: Wikipedia
昨天去看了 Cyril 的 Believe 魔術秀。
座位
雖然本來不是特別想去看,不過既然決定要去看,依照慣例,就要選好一點的位置。因此,我買的是 $4500 的票。事實證明,果然是不錯的選擇。因為 Cyril 的魔術大多是近距離的,距離太遠,只能盯著螢幕,失去臨場感。既然要看,就要選好一點的位置,不然倒不如回家看電視。不過呢,即使是第一排的觀眾,許多地方,仍然只能看螢幕,所以第一排反而不好,因為要抬頭看。我坐第七排,位置適中。
Cyril 為了彌補近距離需要螢幕的缺憾,常常下來走動,所以坐在前面還是有好處的。
如果坐在前面,主秀魚缸魔術是可以不需要攝影機就能看到的。
不過整體來說, Cyril 的街頭魔術風格的魔術不適合在這種場合表演。因此,這場演出中,Cyril 穿插了不少舞台和 Party 魔術。
翻譯
翻譯水準普通,跟平常一樣爛。很多地方翻錯。比方說,有一段是 Tony's bar, 這個程序分成兩階段。第一個階段, Cyril 表演猜出觀眾選的牌。為了襯托第二段的神奇, Cyril 基本上只是用職業的水準簡單的執行這個魔術。表演完第一階段後,Cyril 說「剛才的這個魔術其實很難,但是因為現在魔術資訊太發達,觀眾的胃口變大,所以觀眾不會特別欣賞這個魔術。」但是翻譯在 Cyril 說完第一句之後,翻譯翻成「等下(第二階段)的這個魔術會更加困難神奇」。可想而知,接下來的翻譯只好混過去。
另外在主秀水族箱魔術,Cyril 講了一個笑話,說他畫在魚缸上面的魚的名字叫做大白鯊( Jaws)。這個沒有被翻出來,所以只看到 Cyril 做出誇張的肢體和表情,而現場沒有反應。
而在一個情色雙關語風格的魔術裡面,Cyril 拿著繩子問男性觀眾一個問題,翻譯翻的是「請問你喜歡繩子(rope)嗎?」不過我聽起來像是「你想歡角色扮演(role play)嗎?」我不很確定我聽到的是對的,但配合後面兩個洋妞的動作,以及後面的劇情,假如 Cyril 說的不是角色扮演,那他應該說角色扮演(用 BDSM 就太過頭了點)。
當然這樣也有個好處,從翻譯的流暢度可以當成線索,判斷哪些是事先設計好的橋段。
不過撇開翻譯的正確或者錯誤,翻譯的主持能力和臨場反應倒是不錯。
優點
應該說是,我喜歡的部份。
我喜歡那個鞋子清洗器的程序。他請了一位小朋友上台幫忙,而且充分發揮了小朋友的功能。隱藏魔術機關的劇情(將動作合理化),我很喜歡。
主秀魚缸程序,我也很喜歡。主要的優點是情境設計,以及與請上來的觀眾之間的互動。除此之外,還與前面表演的跳帕做了連接。
最後最後的雪花表演,雖然不新鮮,但是我覺得他做得很漂亮。舞台魔術中香煙和錢的部份也不錯,我喜歡他的舞台肢體風格。
謝幕的變人效果也很好。
缺點
第一個缺點是近距離的魔術不適合在這麼大的場合表演。偶而穿插可以,已魔術師為觀眾的場合可以,但是不適合當成以一般觀眾為對象表演裡面的主軸。所以, Cyril 盡量穿插了其他類型的魔術,像是大道具類型的。但這些魔術沒有什麼新奇之處,也沒有展現 Cyril 的魅力。
第二個缺點是,失手。在我看的這場表演中, 在表演舞台魔術時,Cyril 失手了。而這個失手是連外行人都看得出來的。因此,他的表演被迫中斷,他被迫比出手勢,要音控停止音樂(更尷尬的是,他手勢比了很久,我比音控師還早五六秒鐘看懂他的手勢)。事實上,他在更早一點的時候就已經有失誤了,只是這個失誤外行人應該看不出來。而稍後,他表演撲克牌魔術時,手法很不熟練,我懷疑他是因為之前的失誤而臨時補上的。
第三個缺點,是與觀眾的互動。我覺得他有點過度利用觀眾。比方說,請女觀眾上台來之後,先是親了女觀眾臉頰一下,然後坐手勢要女觀眾回親。就在女觀眾要親下的時候,他故意轉頭,讓女觀眾親到嘴巴。親臉頰那些都 OK。但是後來轉頭那個動作,一方面破壞了觀眾與魔術師之間的信任,另外一方面,讓上來幫忙的觀眾尷尬。雖然他有確認過那位女觀眾旁邊坐的不是她男朋友,但我仍然認為這樣是犧牲觀眾來換取效果。而這不是單一事件。他常常利用發聲權不對等的狀況來製造效果。雖然這個手法很常見,但是我覺得他利用得有點過頭,會造成被利用的觀眾有點尷尬。雖然這只是我的看法,不過至少對我來說,已經破壞了他街頭魔術那種比較親和的形象。
結論
不是非看不可,但也不算太差。我認為坐最好區, $2500 是合理的價錢。