前兩年有使用過,可是最近想起來時,卻發現什麼記憶都不剩,只記得好像是解決 cross domain 的方案。上網找了一下,終於讓我給想起來了,下面用我懂的話來寫,這樣下次又忘記時,可以很快想起來。
在利用 xmlhttp(或form) post/get 時,目標的網址(action)跟目前網頁的網址必須是在同一個網域上,否則會無法post/get。該怎麼解決呢?就要利用所謂的 jsonp。jsonp 是利用動態安插 script tag 的方式來繞過 cross domain 的限制,script tag 裡的 src 不受 cross domain 的限制,一般來說,src 裡的網址會多加一個參數 callback (當然,不一定要叫作callback),也就是說,後端收到這個 request 時,會去進行處理(一般會處理為json資料),最後輸出時,會輸出 javascript ,並且將 json 資料傳入你指定的 callback並執行,這樣就完成了。
本來以為 PIXNET API 可以直接利用 jsonp,就不需要另外刻後台來拉資料,結果今天去看時,發現沒有,大概是之前眼花了吧…
pixnetalbummaker(2)
GAEO 0.5 beta用的不順,再加上開發已經停止,所以還是用回文件相對比較多的0.3版。
之前從trunkly-python抄來的代碼不太適用於PIXNET API,所以稍做了改動,原本是這樣使用的:
print( pixnet.get_users_elleryq() )
print( pixnet.get_album_sets( {'user': 'elleryq' }) )
現在得這樣用:
print( pixnet.get_users( "elleryq", {} ) )
print( pixnet.get_album_sets( parameters={'user': 'elleryq' }) )
是說,應該要好好來研究一下cross domain的xmlhttp,這樣根本就不用寫後台了,直接呼叫PIXNET API就好~
歡樂智多星的機率隨想
歡樂智多星是胡瓜在衛視中文台主持的節目,遊戲的規則是,參加的人有30萬,每關有3個選擇,然後可以選擇全部押在一個答案上,或是分散,只要過了五關,剩下的錢就你的。
先不考慮最低的押注是1萬的這個規則。最早的規則是可以把錢分散在3個答案上,所以這樣子的機率是 (1/3) ^ 5 = 1/243,最近看的時候,發現節目修改規則了,變成你只能把錢分散在兩個答案上,看起來過關機率降低了,但是實際上,只要排除掉不可能的那個答案,然後平均分散押注在另外兩個答案的話,這樣子機率是 (1/2) ^ 5 = 1/32,反而提高了!!
現在在加上最低押注是一萬的規則。如果把錢分散在3個答案上,押注金額較多的又剛好過關,那麼,
- 10萬:10萬:10萬
- 4萬:3萬:3萬
- 2萬:1萬:1萬
- 孤注一擲
- 孤注一擲
同樣的情況,但只能把錢分散在兩個答案上,這邊再加上一個都會過關的假定:
- 15萬:15萬:0
- 8萬:7萬:0
- 4萬:4萬:0
- 2萬:2萬:0
- 1萬:1萬:0
從上面的分析看來,參賽者不再一定需要知道正確答案,也就是你可以什麼都不知道,在此情況時,嚴格執行排除最不可能的答案,並且把錢平均分散在其他兩個答案上,這樣最後至少可以得到一萬元。相較之前的規則,在第四次以後就只能孤注一擲的情況來說,節目的新規則把勝率提高許多。
pixnetalbummaker(1)
我環境是ubuntu 10.04,依照GAEO文件,以easy_install安裝gaeo,可以順利安裝。
但在產生專案時,卻會出現:”OSError: [Errno 2] No such file or directory: ‘/usr/local/lib/python2.6/dist-packages/gaeo-0.5-py2.6.egg/oildrum/static'” 的錯誤。
此錯誤應該與easy_install的EGG有關係,原因是因為少檔案,下載官方的 zip 檔案可以發現以 easy_install 安裝以後的 oildrum 跟 zip 裡的 oildrum 檔案數目並不一樣,也就是說少安裝了。解決方法也很簡單,就把 zip 檔案裡的 oildrum 複製過去即可。
電影流水帳(2011/4/8~2011/4/26)
等後半年有特休的時候,看能不能消化掉比較多的電影債…最近啟動原始碼的片名source code蠻有梗的,例如:
Dilbert: I watched source code yesterday. (我昨天看了source code)
Dogbert: Linux kernel or Android? (是Linux kernel的還是Android的?)
不過 watch 跟 read 在英文上的意思差很多,只要一亮出動詞,就又沒梗了…
- TRON(IMDB, Wikipedia),中譯:創:光速戰記。這是1982年Tron的復刻板本,單就劇情來看,在1982年那個時候,真的是很創新的題材,很令人驚訝的,除了人能進到電腦世界以外,很多部份都還蠻寫實的。但是同樣的劇情放到現在,除了特效之外,好像就沒什麼了…劇情是小男孩的父親在小男孩小時候消失了,一直都沒回來。長大以後去老爸工作的地方看,才知道他真的到電腦世界裡去了,於是就進去看看。進去以後才知道他的父親沒有晃點他,只是因為他創造的程式反叛了他才沒辦法回來,一待之下就待了十幾年。要出來,就要改變,故事就是在講這個,最後當然是出來了,還多帶了一個女人出來,真的是很神奇,讓我想到桂正和的電影少女啊…
- Detective Dee and the Mystery of the Phantom Flame(IMDB, Wikipedia),中譯:通天神探狄仁傑。放中譯的原因是因為大陸那邊的譯名跟台灣不一樣,然後英文片名也頗有趣味。其實故事比較像是推理小說,跟當時的時代背景什麼的,沒什麼太大關係,有應用到的梗,一個就是武則天跟李唐的一些糾葛,一個就是人名。故事編的還蠻好看的,國師真的是跟武則天有很奇妙的關係,兇手竟然是自己的好朋友,最後頗有柳暗花明的感覺,不錯看的電影。
編譯DLR debug version
因為 Pro DLR 有介紹編譯Dynamic Language Runtime debug version的部份,如此一來就可以利用Visual studio來追蹤DLR內部的運作。
下載位置在這兒,目前是1.0版。
假設你是用 Visual studio 2010/Visual studio express 2010的話:
- 如果要在 .Net 4 下debug,開啟 Src 下的 Codeplex-DLR-Dev10.sln。
- 如果要在 .Net 2 (3.5也算)下debug,開啟 Src 下的Codeplex-DLR.sln 或 Codeplex-DLR-VSExpress.sln,開啟以後,會說要轉換。
編譯以後,就可以在 Bin 目錄下找到檔案。
本來想說真不妙,竟然得一個個Project去改Target framework,還去找了人家寫好的Visual studio macro來做,可以是後來發現reference也要改,就暈了。幸好早就有提供.Net 2.0版本的solution檔案了。
電影流水帳(2011/2/23~2011/4/7)
脫逃出現在的世界吧…follow this link…
- Sorcerer’s apprentice(IMDB, Wikipedia),中譯:魔法師的學徒。不難看的電影。一開始就交代了魔法師的故事,一切從梅林開始。梅林在死後,大弟子勾結外面的惡魔法師要搶奪一個咒語,與梅林另外兩個徒弟打起來,後來兩個趁著惡魔法師沒注意,將她封了起來。封起來的代價就是大家都變成俄羅斯娃娃,只剩下尼可演的魔法師。在攸長的歲月裡,俄羅斯娃娃外面因為又封印了許多魔法師的緣故,陸續套上愈來愈多的娃娃。時間很快就到了現代,主角在小時候不小心遇到了魔法師,被梅林的遺物選為繼承者。他不小心放出了大弟子,導致魔法師為了阻止他,自我封印,兩人都到了瓶子裡。時間很快,過了十年,主角長大了,魔法師也因為咒語失效陸續被放出來,然後就展開了訓練、打鬥的過程,最後當然是主角變得很powerful,將壞蛋都收拾掉。主角是一整個弱掉,因為演魔法師的都是大咖,太搶眼了。
- 涼宮ハルヒの消失(IMDB, Wikipedia),中譯:涼宮春日的消失。我是先看過小說才來看電影。電影的節奏有點悶,不過整個氛圍相當微妙,帶有淡淡的愛情感覺,還不錯。故事大致就是照著小說來演,這裡就不破梗了。總之,時間機器的設定真的是很好用啊!!(咦?這樣算破梗嗎?)
gcin筆記(2)
看了 gcin 的程式,覺得頗亂,命名跟檔名是有其規則,例如 pp 是指詞音、pho 是注音、gtab 是亂倉打鳥、倉頡…等,不過,對於要新增輸入法,並沒有 interface讓人知道說該實作些什麼。看到這裡有點想放棄了說~
連線的部份是 socket,但 event 的處理則是用 glib 的 io_channel (g_io_add_watch)。
當 client 第一次跟 server 建立連線,是在 cb_new_gcin_clients(),gcin_clients 在 cb_new_gcin_client() 被配置出來,這邊是在超過預先配置好的 gcin_clients 的時候,才以 trealloc() 去重配置。在一開始如果有太頻繁的client過來(仔細想想,好像不太可能),每次都重新配置,是不太有利的。但是如果改用 g_list 或 g_array 來做,感覺上又不是很划算。
server 收到 client request 的點是在 im-srv.cpp 裡的 cb_read_gcin_client(),裏面會去執行 process_client_req()。process_client_req() 在 im-dispatch.cpp 裡,拿到 fd,直接用之前在 cb_new_gcin_client() 預配置的陣列 gcin_clients 去做判斷、處理。裏面會根據 req_no 再去看要呼叫 ProcessKeyPress()/ProcessKeyRelease()…等函數 (在 eve.cpp 裡)。
參考 anthy 日文輸入法,好像比較好,因為同樣也是外部的library
下面是掃過 eve.cpp 以後,得到的一些東西:
- feedkey_anthy()
- feedkey_anthy_release()
- hide_win_anthy()
- show_win_anthy() => init_in_method() 會用到
- move_win_anthy()
- get_win_anthy_geom()
- anthy_visible() => 給 win_is_visible() 用
- init_win_anthy() => init_in_method() 會用到
- anthy_get_preedit()
- gcin_anthy_reset() => 給 gcin_reset() 用
- flush_anthy_input => 給 flush_edit_buffer 用
看起來是要實作這些部份。
init_win_anthy(): anthy 是用 dlopen 的方式載入,這樣也對,可以省掉一開始不必要的配置。
gcin筆記
gcin輸入法以 INMD 定義,在 gtab-list.cpp 裡載入,從 gtab.list 載入,裏面決定了檔名、方法…
如果要加新酷音,
- 在 method_codes[] 裡增加一個項目, !CHEWING
- gtab.list 裡增加一個新的項目,新酷音 ] !CHEWING chewing.png
- MAX_GTAB_NUM_KEY 也要再加1
- load_gtab_list 一開頭把 method_type 寫死了,所以這邊也要加,inmd[16].method_type=method_type_CHEWING
- 加 method_type_CHEWING
以上從 gcin-setup.cpp 的 cb_default_input_method() 開始追
callback 裡呼叫了 create_gtablist_window(),然後再呼叫 create_model()。從裏面的 add_items() 再看到 load_gtab_list() 而推導的。
從 GtkIMContextClass 的 filter_keypress 開始看: gtk_im_context_gcin_filter_keypress
大致上的架構是這樣子:
gtk_im_context -> gcin client <-> gcin server
eve.cpp 裡的 ProcessKeyPress 是處理 Key 的部份,所以這邊可以看到輸入法的切換、暫時切換為英文、選phrase…等等的處理。
好久沒用Vimana之gundo
因為看到了Gundo.vim,就想說來試用看看。
要安裝 vim 插件,當然就是用 vimana,於是就更新許久未用的vimana。依照vimana的readme,以cpanm來進行重安裝。但是卻無法安裝,cpanm告訴我有 “Can’t locate inc/Module/Install.pm”
太鳥了,去年有碰到此問題,但沒解決,果然有報應,該找出原因的還是該找出來,否則以後一直會遇到。亂找了一下,發現要安裝 libmodule-install-perl 才行,於是就立馬執行了 sudo apt-get install libmodule-install-perl。
接著再來安裝,是說,不知道為什麼,會有Test fail的情況,所以就省略掉測試,改用 cpanm –sudo –reinstall -n “Vimana的目錄” 這樣就大功告成了。