教育部電子辭典轉星際譯典(stardict)字典檔心得

大約在4月底的時候,在 http://3du.tw 上看到還文於民的活動,就認領了轉換字典檔為 stardict 字典檔的工作。

首要的工作就是瞭解字典檔的格式,stardict 字典檔可以從很多格式轉換,像是 XML、Tabfile 等等的。轉換的工具已經有提供了,安裝 stardict-tools 套件以後,就有一堆工具放在 /usr/lib/stardict-tools 下,也有提供 GUI 工具 (stardict-editor)。

我最早是想用 XML 格式 (Textual Dictionary File Format),所以我就利用工具將現有的字典檔轉換為 XML,並且參考文件,來寫程式產出檔案,結果並不順利。即便是一個只有一個詞的檔案,轉換為字典檔以後,stardict 也無法辨識到。

後來就使用最容易,而且網路上最多人分享的 Tab file format。格式很簡單,詞與說明用 Tab 字元分隔,說明裡如果有需要換行或是做排版,可以用 \n  \t 等逸出字元來排。

程式則是用 python 來撰寫,主要使用 jinja2 來配合模版產出詞與說明,用 multiprocessing 模組善用 CPU 資源,程式放在 https://github.com/elleryq/moe2stardict 。以下記錄一下我有遇到的問題跟解決方法:

  • 使用 multiprocessing 時無法使用 profiling,上網 Google 的結果,都是建議要先在單一 process 的情況下去 profiling ,解決問題以後,再來搭配 multiprocessing。
  • 在執行程式時,所花費的時間一直很長。我是等到完成的都差不多時,才看這問題。用 profiling 去查看,才發現問題出在 jinja2 上,我把初始化模版的程序放在迴圈裡了,導致每處理一個詞都要初始化一次,非常浪費時間,大約要十分鐘以上。當我把這初始化的程序移出迴圈以後,速度提昇了超過十倍以上,不到一分鐘就執行完畢。
  • 同理,我也把 regular expression 的 compile 移到程式的一開始就執行,避免在會被多次呼叫的函式裡去 compile。
  • http://3du.tw 所提供的 json 原始檔裡有些像 {[8e41]} 的字元,沒有顯示出字來,發信件到 g0v.tw 聊天室問,唐鳳回應說,直接把這些字先忽略掉就好,這些字是異體字。所以我就把這些忽略掉了,非常謝謝她的回應。

目前我只有做國語辭典的轉換,其他還有客語、台語、成語的部分,就看之後有沒有人認領了,或者是等有空的時候再來弄。不過說真的,現在用 stardict 的人應該不多了吧,stardict 專案開發進度在原作者 hu zheng 失蹤後,僅在今年初有釋出 3.0.4,修正幅度不大,也沒有新功能。很多都建議轉用 goldendict,幸好 goldendict 也吃 stardict 字典檔,所以我這不算是做白工。

電影流水帳(2013/6/15~2013/6/24)

yuliya-snigir-wide
這是 Die Hard 5 的女主角 Yuliya Snigir,片子最後為了父仇,開著直昇機去撞 McClane 父子,結果當然是…失敗…

  • A Good Day to Die Hard (IMDB, Wikipedia),中譯:終極警探5-跨國救援。John 有好幾年沒看到兒子了,突然接到兒子在俄羅斯被抓去關的消息,於是決定去莫斯科。John 才剛到莫斯科法院門口,就發現不對勁,沒多久就發生爆炸,他的兒子 Jack 帶著 Komarov 逃出。原來 Komarov 是個政治犯,拒絕交出秘密檔案,CIA 判斷他有危險,就組織了搜救行動,讓 Jack 被關,以便救援。Jack 出了法院看到父親,這一個當下,就錯失了好的時機,導致 Jack 跟 Komarov 沒能順利逃出,只好採取第2方案逃到 Safe house。在逃到 Safe house 途中,持續被追殺,John 持續的幫忙,終於順利逃到 Safe house。到了 Safe house 以後,原本以為可以鬆一口氣,想不到仍然被追殺,Safe house 毀了。Jack 決定繼續完成這個行動,就說服 Komarov 交出秘密檔案,Komarov 說只要也帶女兒逃出俄羅斯,就願意交出來,於是就打電話跟女兒 Irina 約好地點。到了約定的地點以後,發生了出乎意料的情況,Irina 投奔了 Komarov 的政敵陣營,帶走了 Komarov,John 跟 Jack 陷入危機。陷入危機的二人差點死去,Jack 接下來不知道該怎麼辦了。John 鼓舞了 Jack ,依照莫名其妙的邏輯判斷之後,認為他們接著會去車諾堡,就去偷了車子跟槍枝,往車諾堡去。Komarov 被帶到車諾堡,打開秘密房間,正要取出秘密文件時,這時候又發生出乎意料的情況。父女原來是假裝反目成仇,要利用政敵的力量來幫助他們取得藏在庫房裡的鈾來變賣。政敵被 Komarov 埋伏在其身邊的人幹掉,接著,John/Jack 來到車諾堡,發現了真相,展開一場火拼。John 父子當然不負 Die Hard 家族之名,順利幹掉 Komarov 父女,故事結束。故事到後面有點不太合理,但是有轉折,讓人小驚奇;另外也讓 John 父子二人和好,還算不錯看。
  • Jack the Giant Slayer (IMDB, Wikpedia),中譯:傑克-巨人戰記。傑克與魔豆的故事,之前鞋貓劍客也借用了一樣的故事,但這部電影拍的比較接近原來的故事,我覺得蠻不錯的。大致的故事就跟原來的故事一樣,不同點在於鋪了一個傳說。很多年前,僧侶製造了魔豆,想看看天上是否有上帝,結果卻連接到巨人族所居在的地方,巨人族很開心的到地上吃吃喝喝 (吃人),人類怎麼都抵擋不了。後來,人類藉著僧侶打造的皇冠,控制巨人,讓他們乖乖回到天上,接著把皇冠跟魔豆都藏了起來。經過許多年之後,出現了主角 Jack,Jack 苦哈哈地帶著老馬去市場,結果跟僧侶換了魔豆。這個僧侶其實是好人,他從想篡位的 Roderick 手裡偷到魔豆,想避免 Roderick 號令巨人以稱王。想自己決定命運的公主 Isabelle 逃出去,正巧遇到 Jack,又很湊巧的,豆子遇到水,把房子帶到天上。沒跟上的 Jack 加入國王組織的搜救隊到天上去,一上去,魔豆就被 Roderick 拿走,Jack 只保留了一顆。在 Roderick 有意的剷除搜救隊跟巨人的夾擊之下,搜救隊長 Elmont 跟公主 Isabelle 被抓走,Roderick 則利用皇冠控制了巨人。Jack 趁亂救出 Elmont 跟 Isabelle,Elmont 在送走 Jack 跟 Isabelle 後,埋伏在豆藤附近,想要奪回 Roderick 的皇冠。到了隔天的早晨,Roderick 率領巨人族到了豆藤,Elmont 衝出來跟 Roderick 一陣扭打,幹掉了 Roderick,但皇冠被巨人 Fallon 奪走。在下面的國王認知到以前的傳說是真的以後,就忍痛下令砍斷豆藤。Jack 跟 Isabelle 快到地面時,豆藤就斷了,靠著 Jack 的機警,兩人順利落地。Elmont 在豆藤要倒時,上了豆藤,也幸運地降落在城堡的護城河。巨人族痛失到地面的機會,可是,幸運地發現了 Roderick 的魔豆,於是種下魔豆,大舉進攻地面。人類靠著城堡對抗巨人的侵襲,一邊抵抗的同時,掉入護城河的巨人 Fallon 潛入城堡,追擊要去燒狼煙通知鄰國的 Jack 與 Isabelle。這兩人當然是打不過巨人,就在 Jack 要被巨人吃掉的時候,Jack 把僅存的一顆魔豆丟到巨人嘴裏,急速成長的魔豆將巨人絞碎,Jack 取得可以控制巨人的皇冠。接下來,就是 Jack 用皇冠將巨人再次趕回天上,跟公主過著幸福快樂的生活了。

PySide – Custom Label

自訂 QT Widget 的練習,網路上關於 PySide 的教學文不多,所以是找 C++ 範例文章來試著轉換為 PySide 看看。基本上還蠻簡單的,就是一些函式要去查查 QT 文件。

不囉唆,直接貼 code。

電影流水帳(2013/6/1~2013/6/14)

Maggie Grace
這位就是 Taken 裡飾演女兒的 Maggie Grace,很漂亮。

  • The Penguins of Madagascar (IMDB, Wikipedia)。這個不是電影,是在電視上演的卡通,有蠻多個故事的。我一直就覺得馬達加斯加電影裡的四隻企鵝很有戲,很高興製作公司把這四隻企鵝的故事做成卡通。
  • Parker (IMDB, Wikipedia),中譯:偷天派克。派克是個很厲害的竊賊,一開始跟準岳父的人合作去偷錢,等偷到錢以後,合夥的4個人問他要不要參加下一攤,派克不想,結果就被滅口丟在路邊了。派克運氣很好,被人救了,沒有死,就決定報仇。派克就開始打聽,得知了這4個人在佛羅里達,要偷更大筆的珠寶。在這個時候,Jennifer Lopez 飾演的瀕臨破產的房屋地產經紀人 Leslie 來跟他接洽,在逛了不少房子以後,Leslie 去調查了 Parker 的背景,判定他根本不想買房子,就直接跟他攤牌說,我可以幫你,只要到時候分我一些甜頭。Parker 在確定她的誠意以後,決定讓她幫忙。合夥的四人這時也知道 Parker 沒死來尋仇了,所以也找了殺手要幹掉 Parker。Parker 跟殺手打的難分難解,打到全身重傷才把殺手幹掉。重傷之餘,他跑去找 Leslie 幫忙打電話給他的未婚妻,然後他的未婚妻就來幫忙包紮。在這樣的重傷情況下,他仍然決議復仇,於是他埋伏在那四人的巢穴,Leslie 不放心,也跟了過去。就在那四人搶到珠寶,回到巢穴以後,這幾個人就展開一場惡鬥,Parker 最終把這四人幹掉,也救出被綁架的 Leslie。最後在分開前就講好,怎麼分贓,在一年以後,Leslie 收到鉅款,還清了她所有債務。
  • Taken 2 (IMDB, Wikipedia),中譯:即刻救援2。這集的劇情更簡單。前妻婚姻遇到困境,爸爸提議說,要不要來我這邊。於是爸爸去伊斯坦堡出差,前妻跟女兒也去了伊斯坦堡一起度假。第1集死去反派的父親矢志復仇,在掌握情資之後,就在伊斯坦堡埋伏。女兒故意讓爸爸跟媽媽一起出去,想製造機會讓他們復合,就在出去走走的時候被綁架了。這時候爸爸就發揮神一般的本領,細心聆聽跟計算自己所在的位置,等到了反派的巢穴,被關的時候,就趕緊打電話給女兒,指示女兒該怎麼做。之後女兒就依照指示躲避,甚至還去救爸爸。整個過程蠻驚險的,總之最後就帶女兒去了美國領事館,再單槍匹馬救出媽媽。我覺得裡面最神的一段是爸爸利用音速與車速再加上女兒丟手榴彈的爆炸去計算自己所在位置的橋段,這真的是太厲害了。