電影流水帳(2010/4/21~2010/4/28)

聽說這部片子真的是很不錯,很溫馨又很感人~

  • The Blind Side (IMDB, Wikipedia),中譯:攻其不備。可能是有先看過這篇影評:攻其不備:得獎靠運氣的關係,所以覺得這部片子並不是那麼的好看。這是描述一個家庭如何去幫助一個可憐黑人孩子從默默無聞到一個各大橄欖球隊爭相搶奪的明星球員的故事,我相信在真實世界裡,這個家庭必然經歷了許多衝突,但在電影裡,你真的就只能看到很順理成章地、或輕描淡寫地帶過,讓人覺得就是少了些什麼。
  • Daybreakers (IMDB, Wikipedia),中譯:血世紀。這個故事相當的有意思,故事描述大家都變成了吸血鬼,只剩下少數的人類,吸血鬼都需要血,可是人類的數量又那麼的少,所以基本上只能汲取眷養人類的血液。男主角是個對人類懷有慈悲心的研發替代血液專家,在研究上始終無法突破,某一天他遇到了女主角,於是認識了另外一個由吸血鬼回復成人類的人,開始幫他找出還原成人的原因,後來他找到了,可是自己跟這些倖存的人類也陷入了追殺。最後,是意外發現原來從吸血鬼回復成人類以後,血液也變成了解藥,因此,人類因為被吸血而成為吸血鬼,吸血鬼又無法克制自己吸血,吸了這些人的血以後就又恢復成人,變成解藥,有種巧妙的諷刺感。電影除了這個主梗以外,還有埋下其他有梗的副線劇情,像是兄弟情深、父女衝突等等,算是還不錯看的電影。
  • 聽說 (IMDB, Wikipedia)。這部電影真的是不錯看的愛情小品,天闊與秧秧因為送便當而認識,卻又互以為對方是聽障,就這樣開始了愛情,最後當然是皆大歡喜。不過這個故事如果少了陪襯的林美秀跟羅北安,大概會少了很多樂趣。值得看看的電影。

Python PIL 貼圖

如果我沒找到這篇PIL Tutorial: How to Create a Button Generator的話,我不知道還要走多少冤枉路~總之要貼出透明的效果,要在 paste() 時把要貼的那張圖當作第3個參數傳進去,這樣出來的效果就是對的!

# 從指定目錄拿三張圖片出來做小圖,第1張傾斜10度,第3章傾斜-10度,然後在貼到一起,做出類似撲克牌或紙疊在一起的效果。
import glob
import Image
def createThumbnail( filename ):
im = Image.open( filename )
im.thumbnail((96,96), Image.ANTIALIAS )
newImage = Image.new( "RGBA", (144,144) )
newImage.paste( im, (16,16) )
return newImage
for dir in sys.argv[1:]:
files = glob.glob( os.path.join( dir, "*.jpg" ) )
im0 = createThumbnail( files[0] ).rotate( 10 ).crop( ( 0, 0, 128, 128 ) )
im1 = createThumbnail( files[1] ).crop( ( 0, 0, 128, 128 ) )
im2 = createThumbnail( files[2] ).rotate( -10 ).crop( (0, 0, 128, 128 ) )
im0.paste( im1, ( 10, 0 ), im1 )  # 關鍵!!
im0.paste( im2, ( 20, 10 ), im2 )# 關鍵!!
im0.save( "out.png")

Trace WebView.loadUrl

為了想知道 Android 到底使用哪個 proxy 設定,所以只能往下追了。
WebView.loadUrl( String url ) 送 message (LOAD_URL) 給 WebViewCore
WebViewCore.transfermessages() 收到以後呼叫 loadUrl( String url )
loadUrl() 呼叫 BrowserFrame.loadUrl()
BrowserFrame.loadUrl( String url ) 如果 url 是 javascript: 開頭的,丟給 javascript engine,一般情況則是呼叫 nativeLoadUrl( url )
nativeLoadUrl() 位於 WebCoreFrameBridge.cpp 裡,根據 JNI 函數對照表,對應到的是 loadUrl()。loadUrl() 則先依照 url 建立 ResourceRequest 物件,再傳入 pFrame->loader()->load() 裡。
pFrame 真正的身份是 external/webkit/WebCore/page 下的 Frame,裏面的 loader() 真實身份則是 external/webkit/WebCore/loader/FrameLoader。
接下來可以參考 http://trac.webkit.org/wiki/CodePaths 最後一項: Get data from network。
稍稍不一樣的是,Android 使用 external/webkit/WebCore/platform/network/android 下的 ResourceRequest、ResourceHandleAndroid…等類別,而非一般的 soup 或是 curl。
我幾乎可以確定應該是 ResourceHandleAndroid 類別負責真正的下載工作,但我卻看不懂裏面是怎麼呼叫的,裏面使用了相當迂迴的方法來呼叫。
以 network/curl/ResourceHandleCurl 來說,裏面就很清楚的用到 curl library,network/qt/ResourceHandleQt、network/soup/ResourceHandleSoup 也是如此。
今天就先看到這裡吧。

xargs

以前就看過 xargs 這指令了,不過那時只有看人家的範例,沒有理解為什麼要這樣用。等到想試著用的時候,才發現原來是這樣子。
因為我之前完全誤解了。
舉例來說,這樣的命令:

ls | xargs echo

假設我目前目錄有 file0, file1, file2 這3個檔案,我以為 xargs 會根據 stdin,執行 echo 三次,這當然是錯誤的。
xargs 會讀取 stdin 的內容,然後轉成以空白分格的字串,再將結果作為指定命令的參數。所以上面最後會執行的指令其實是:

echo file0 file1 file2

電影流水帳(2010/4/12~2010/4/20)

想去看特攻聯盟,又想看鋼鐵人2…

  • Brothers(IMDB, Wikipedia),中譯:窒愛。恩愛的夫妻有個問題弟弟,丈夫因為打仗的關係,去阿富汗出差,結果遇到襲擊,因為找不到屍體,所以通知家人說已經死了。家裡因故愁雲慘霧了好久,弟弟為了讓大嫂能開心,也算是為了轉換家裡的氣氛,開始以不同的態度與大嫂跟姪子生活。可是,大哥並沒有死,回來了,由於在戰地遭遇了不尋常的事情,導致他的心裡產生了變化。單看預告的話,你會覺得是弟弟可能愛上了大嫂,發生了感情上的糾紛,但看了之後,我認為片子其實是想討論戰爭對軍人所帶來的影響並非想像中的單純,所以片子的最後,丈夫對太太坦白了一切,說他殺死了同袍,我想,之後應該會比較好過了吧~如果不坦白,埋在心裡,恐怕離婚是避不了的,更糟的情況都有可能發生。
  • Alvin and the chipmunks: The Squeakquel(IMDB, Wikipedia),中譯:鼠來寶2。歡樂的校園青春片。三兄弟因為經紀人受傷了沒辦法照顧他們,所以就讓他們去上學,展開歡樂的校園生活。之前的經紀人遇到了另外3個花栗鼠姊妹,決定展開復仇。最後是三姊妹認清了這個經紀人的醜惡,向三兄弟求救,最後當然是皆大歡喜,不但救出三姊妹,也代表學校參加比賽,取得了優勝。不是很專心在看,不過這種片應該也不太需要花精神看吧~

電影流水帳(2010/4/3~2010/4/11)

陰晴不定的4月,讓人討厭的天氣。

  • From Paris with Love(IMDB, Wikipedia),中譯:諜戰巴黎。不算難看的動作片,只是諜戰的成份不是很重。男主角是某個部長的助理,而他的秘密身份其實是美國的間諜。為了要出任務與升官,他必須支援他的伙伴 Charlie。出任務的過程中,他充份的認識了 Charlie 這個人,也發現他的未婚妻其實是個間諜,於是最後忍痛斃了她。坦白說,是有點莫名其妙,不過還蠻緊湊的,所以說不算難看。
  • Legion(IMDB, Wikipedia),中譯:暗黑天使。這部片其實蠻莫名其妙的,因為上帝對人失去信心,所以派天使大軍去殺所有的小孩。有個天使 Michael 認為不該這樣做,所以就下來保護。一個未婚媽媽在朋友Jeep沒自信老爸開的酒吧上班,Jeep深深愛著她。這個天使就是因為Jeep,認為人類還有救。然後就開始有刺客襲擊這個未婚媽媽啦~接著就是一連串的槍戰場面跟酒吧客人間的彼此坦白,最後就是 Jeep 跟未婚媽媽 Charlie 逃出去,最終刺客,也就是 Michael 的兄弟 Gabriel 被 Michael 打敗,電影就這樣收尾。我在想,這如果不是在為續集鋪梗,那就真的是….不好看了,冏。

.Net framework 4 來了

很難得會寫這個,這是今天剛好看到的What’s New in the .NET Framework 4,所以就順便記了一下,這次微軟也加了不少東西到 .Net 4 裡。
下面就簡單的條列,詳細的內容還是要看原文章比較清楚。
以前用 1.1/2.0/3.0/3.5 編譯的程式,現在 .Net 4.0 不接受了,除非你有在 configuration file 裡指定 supportedRuntime 或者用 .net 4 重新編譯才行。
In-process side-by-side,可以在同一個 process 載入多個版本的 .Net CLR,這還蠻神奇的。
Diagnostics、效能、GC、DLR 跟 generic 的加強
Embed Interop,這個看起來是可以把原本 Interop assembly 的 type 資訊嵌到你專案裡,這樣 deploy 的時候就不需要拿那個 Interop Assembly 一起 deploy>
新的型別:BigInteger、Complex 跟 Tuple
File System 直接提供 enumerator ,不用自己刻了。
支援 Memory-mapped file 跟 64 bit
類別庫裡也多了不少更方便的類別或者是為原有的 method 提供了更方便的 overload…還有 MEF、Parallel Computing、Networking、Web(ASP.Net)、WCF、WWF、ADO.Net …等等。
ASP.Net 的部份可以看這裡:ASP.NET 4 and Visual Studio 2010 Web Development Overview

電影流水帳(2010/3/26~2010/4/2)

一股腦地看完了四部電影,不過與其說是一股腦,不如說是拖了好一陣子才寫。

  • 大兵小將(IMDB, Wikipedia)。看新聞說這部片是成龍第99部片,成龍真的不簡單。劇情相當簡單,也誠如電影介紹一樣,就小兵運氣很好地俘虜了一個受傷的將軍,想帶回國去領賞。回國的路途中,發生了許多事情,導致兩人的想法都有了很大的改變。我覺得這部片相當程度的改變了成龍以往電影的風格,也就是,這部片除了以往成龍的打鬥、逗趣風格之外,還帶有一些可以讓人省思的地方,像是打仗還是不打仗、沒有了國家,個人存在是否仍有意義等等的議題。蠻值得看的電影。
  • The lovely bones(IMDB, Wikipedia),中譯:蘇西的世界。我是拿公司福委會送的電影票去看的,看完以後我真的覺得後悔。劇情有點像是大輪迴之類的寫實連續劇,蘇西被殺害,靈魂仍然逗留在人間,兇手一直沒找到,家人因此有了隔閡,最後,家人終於團聚,兇手也找到了,可是,兇手卻逃之夭夭。雖然最後還是受到懲罰,但是我覺得花了快兩個小時,最後卻看到兇手就這樣沒受到應該受的懲罰,感覺上就像是被潑了一桶冷水。我沒看過小說,不過單就電影來看,我很難想像這樣的小說為什麼會暢銷。
  • Shutter Island(IMDB, Wikipedia),中譯:隔離島。這個故事真的很有意思,說穿了就沒什麼了,所以這裡就不描述劇情了。看完以後,我想起我以前看的腦髓地獄,這本小說的故事走向基本上就跟電影相當接近,只是小說的最後並沒有說穿主角到底怎麼了,只是就像鬼打牆似的又回到故事的開頭,我那時候看完,真的是不懂到底發生了什麼事情。直到看完這部電影,我才明白發生了什麼事情。
  • Just married(IMDB, Wikipedia),中譯:新婚告急。要結婚的人可以參考的範本電影。電影一開始,男女主角就一路從機場吵回家,然後打算要離婚。接著男主角就開始回憶從相識到相愛到結婚到蜜月的過程。是的,你可以猜到問題在哪兒,就是他們認識的不夠深,所以在蜜月時,因為很多地方發生了摩擦,導致了離婚。之前有收過mail建議人家在婚前最好一起出去旅行一次,這樣可以比較深入地認識對方。原本我以為電影的最後是以離婚收場,但是這是好萊塢電影,所以,兩人還是和好啦~

Clipboard hooking in Gtk#

Windows 下要攔截 Clipboard 的事件處理的話,除了要 override WndProc 以外,還得利用 Windows 提供的函數 SetClipboardViewer()、ChangeClipboardChain()、SendMessage() 來告訴 Windows 說,你的程式會處理 Clipboard。

那在 Gtk# 下要怎麼作呢?

答案是處理 Clipboard 的 OwnerChange 即可,所以程式可以這樣寫:

	private Gtk.Clipboard m_clipboard;
public MainWindow (): base (Gtk.WindowType.Toplevel)
{
// Other stuff...
m_clipboard = Gtk.Clipboard.Get( Gdk.Selection.Clipboard );
m_clipboard.OwnerChange += new OwnerChangeHandler( delegate( object o, OwnerChangeArgs args ) {
m_clipboard.RequestText( delegate(Gtk.Clipboard clipboard, string text) {
Console.WriteLine( "text={0}", text );
} );
} );
}

首先要取得系統的 Clipboard,所以用 Clipboard 的 static function:Get 來取得,接著再指派我們的處理事件進去就行了。相對於 Windows 上的來說,簡單很多。

我有參考 glippper (gnome提供的剪貼簿工具,用 python 寫的),他拿了不只一個剪貼簿,它還用 GetForDisplay 去拿了另一個剪貼簿,我不知道有什麼差別,或許是處理多螢幕或是從遠端連進來時的情況吧~就目前來說,我應該暫時不必要照著glipper這樣作。