教育部電子辭典轉星際譯典(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 字典檔,所以我這不算是做白工。

rails 101 練習(6)

練習作業6 – 撰寫自動化 Rake 以及 db_seed

這一章不難,照著做就可以了。要新增 Rake 的 tasks 是在 lib/tasks 下加檔案,打 rake -T 就可以看到新增的 task。要預先建制基本的資料,則是要修改 db/seeds.rb,在裏面寫程式去操作。

練習作業7 – 將論壇 deploy 到租來的 VPS

這一章因為沒打算租 VPS,所以就紀錄重點,沒實際練習。

作者建議用獨立版本的 Ruby 以及 Ubuntu/Debian,一般系統的 Ruby 與套件都較老舊,所以不建議。ImageMagick 還是沒提到為什麼會有雷,這再找找看好了,總是要知道為什麼吧。[1]

作者習慣在 enom.com 買域名,在 linode 租 VPS。之後就是教導怎麼使用 capistrano,這邊要做不少設定,由於沒打算租用,這部份就跳過去啦。[2]

註:

  1. 我還是找不到為什麼有雷,難道指的是無法順利轉換圖檔的尺寸與解析度嗎?至少照我目前的環境與步驟是可以轉換的。
  2. 其實應該也不用租用,就拿自己家裡的伺服器來實驗應該也是可以。

rails 101 練習(5)

練習作業4-為每篇文章加上分頁機制,就介紹 counter cache、pagination 跟 scope,照著做沒什麼問題。scope 的部份會比較需要去思考,他的用法真的很巧妙。

練習作業5-每一篇文章可以上傳附件,安裝 paperclip 會撞到牆。paperclip 最新的版本需要 Ruby 1.9.2 以上的版本,而依照前面的環境架設,Ruby 是 1.8.7,在 Gemfile 的地方,要改用 gem “paperclip”, “~> 2.7” 這樣就可以順利安裝了。

然後試著要上傳時,就出現警告說,ImageMagick 沒安裝,這是我之前偷懶沒做的部份。就回頭做,想說試試看用系統的 ImageMagick 會發生什麼事情,就不管作者的警告,用 apt-get 安裝上去,然後用 gem 安裝 rmagick。在安裝時,會說找不到 imagemagick 的 header 檔,imagemagick 的 header 檔案是在另外兩包裡,所以要再下 sudo apt-get install libmagickcore-dev libmagickwand-dev  來安裝。 安裝完以後,再用 gem install rmagick 就可以了。

接著的部份照做就沒什麼問題了。

rails 101 練習(4)

練習作業2-為論壇加入使用者機制

這一章沒什麼問題,主要是編輯 Gemfile 裝上 devise plugin 來達成使用者機制。

練習作業3-為論壇加入管理者機制以及管理者後台

這一章也沒什麼問題,照著改,是很快改好,但用了很多時間找錯誤,有些甚至是之前沒注意到的地方。這邊 xdite 是用 diff 的方式來表示修改過的地方,顯得比較凌亂,照著打容易錯漏(也可能是我眼力變差了)。

今天搞定以後,想到一件事情,如果有用版本控制的話,在每章做完,測試完成以後,最好上個 tag,這樣在出錯時,可以用 git diff 跟之前的 tag 做比對,看到底那邊沒改到。

$git tag end_of_practice_3

參考資料:

rails 101 練習(3)

接著昨天的 5.4.5 開始做。

做的時候,發現最好在建好專案的時候,就使用 git init && git add . 把檔案都納入版本控制。之後每次修改、測試完成,就提交。這樣除了很清楚每個步驟修改了什麼之外,也可以方便的進行練習作業。例如 5.4 是 scaffold,而 5.5 是衍生練習作業,要練習就可以先回復到 5.3 的版本,然後再建 branch 出來練習。這意味著,最好是把 git 練熟比較好,要不然就是要多開幾個目錄來練。

在 5.7 resources 與雙層 resources 的地方,要注意檔名所在路徑有錯,記住大原則,routes.rb 一定在 config 下,.html.erb 一定在 app/views 下…,這樣就不會找不到檔案可改。在這邊我是用打字的,所以我把時間花在找打字錯誤上,書上的程式沒問題。

rails 101 練習(2)

從第五章建 scaffold 開始,在執行 rake db:migrate 時撞到牆。rake 吐出錯誤訊息:

ERROR: ‘rake/rdoctask’ is obsolete and no longer supported. Use ‘rdoc/task’ (available in RDoc 2.4.2+) instead.

找了好多文章,都說要用移除現有的 rake,安裝回 rake 0.8.7 才可以。我是卡在無法移除 10.0.3,後來是找到 stackoverflow 的這篇,說要用 rvm use @global && gem uninstall rake -v 10.0.3。執行以後先按 Y,再按 N,再執行 rake 會有錯誤,所以我再執行一次 gem install rake -v 0.8.7 來安裝。

回到專案目錄下再次執行 rake db:migrate,出錯,說不滿足條件,要重新 bundle install,原來 gem 的 requirement 會紀錄在 Gemfile.lock 裡,修改完 Gemfile.lock ,執行 bundle install 以後,就可以執行 rake db:migrate 了。此時資料庫是用 sqlite3,路徑在專案目錄的 db 下,名稱是 development.sqlite3 。

今天就做到 5.4.5。

rails 101 練習(1)

一兩年前就買了Rails 101,只翻了一點點,就擱下了。 最近朋友也買了,正在練習,因為他是 Linux 新手,就撞了蠻多牆,問了我不少問題,是故,我也跟著看和做了一次。我的環境是 Ubuntu 12.04。

  1. 安裝必要的套件:sudo apt-get install build-essential zlib1g-dev libssl-dev libreadline-dev libmysqlclient-dev libbuilder-ruby
  2. 安裝 rvm:curl -L https://get.rvm.io | bash -s stable –ruby ,這是用 curl 抓取 script 內容,並且導向到 bash 去執行,-s 表示 script 會從 stdin 來,stable –ruby 是給 script 使用的。
  3. 初使化 rvm 環境:source .rvm/scripts/rvm ,這行很重要,之後重新開 terminal 時,都要確定有導入 rvm 環境,要不然會有錯誤。
  4. 安裝 ree:rvm install ree ,然後設為預設: rvm ree –default 。(rvm 可以安裝不同版本的 ruby,像 jruby, ironruby, ruby 等等的,很方便)
  5. 新增 ~/.gemrc,內容是 gem: –no-ri –no-rdoc ,這樣之後 gem install 時,就不產生 doc 檔案,這部份是參考 Ruby on Rails 實戰聖經裡的建議做的。如果不加這個,會撞到牆,說文件產生不出來,需要安裝別的套件才可以。有在另外一台電腦上試過,要先 gem install rdoc-data,再 rdoc-data –install ,應該就可以。反正暫時不會用到 doc,不如就不安裝。
  6. 安裝 rails:gem install rails -v=3.0.7
  7. 安裝 mysql gem:gem install mysql
  8. 書裡提到不要用預先編譯好的 Imagemagick,而要自行編譯,沒說原因。這步驟我跳過了。
  9. Apache 跟 POW 我也都跳過了,目前是練習,所以先用 rails server 頂著就好。
  10. 建新專案跟檢查:rails new forum_demo && cd forum_demo && bundle check && bundle install
  11. 啟動 web server:rails server ,然後開啟瀏覽器,網址輸入 http://localhost:3000 就可以看到頁面。
  12. 新增 controller 跟頁面,就是照書上講的,會碰到狀況的,就是要先刪除掉 public/index.html,這樣才會出現新增的頁面。原本沒注意到要刪除,我想說因為是 pages controller,就用 http://localhost:3000/pages/welcome ,理論上應該會看到,結果卻說 route 未定義,應該是還有地方沒設定吧。

今天先做到這裡為止。

試裝FireApp

FireApp 是可以試用的,只是網站上只提供付費下載,$14 美金,算是很便宜,想要試用的話,得自行編譯。編譯的步驟不太難,對 ruby/rvm/git 熟的人,應該一下子就裝好了。

以下是我的安裝步驟,我的環境是 Ubuntu 12.04 LTS

  1. 下載 FireApp:git clone https://github.com/handlino/FireApp.git
  2. 下載 submodule:cd FireApp && git submodule init && git submodule update
  3. 解決 submodule 問題,我這邊有遇到無法取得 tka-serve 的問題,後來是參考 StackOverflow 上的這篇才解決,先 git log --oneline -p -- lib/ruby/common/tka-serve 取得第1行的 SHA1 ,然後用 git checkout <sha1>~ — lib/ruby/common/tka-serve 取得 tka-serve 代碼,然後重新執行 git submodule update ,最後 git commit 即可。
  4. 安裝 JDK6/rvm/bundler/rake/gems/nodejs:sudo apt-get install openjdk-6-jdk ruby-bundler rake nodejs ruby-rvm ruby-gems ,nodejs 是給 sass/scss 用的。
  5. 下載 rawr:bundle install rawr
  6. 下載 jruby:rvm install jruby-1.6.7
  7. 切換 JDK 為 1.6,官方建議用 1.6,所以如果用 1.7 的話,得用 update-alternatives –config java 切換;我原本是裝 openjdk-7-jdk,裝完 openjdk-6-jdk 以後,順序有自動調整為 1.6 優先,為了安全,還是檢查一下。
  8. 編譯:bundle exec rake rawr:bundle:linux
  9. 啟動:bin/startJar-linux.sh

覺得好用的話,要記得去購買,讓這個軟體更好。

安裝的心得:

  • 原來 rvm 是有點類似 python virtualenv 的東西,可以用來安裝/執行各種版本的 ruby/jruby/rake ,我卡在這邊卡了好久。
  • git submodule 要多練習才是。

試用的感想,這比較像是 template 產生器加上即時 web server 的快速專案產生器,有點像是 Adobe 之前釋出的 bracket,bracket 比較偏重於即時就能看到結果,FireApp 的好處是結合 sass/scss 與 RoR 的 template system,在 HTML 的編寫可以搭配 ZenCoding,這樣的組合可以說是如虎添翼。

Firefox 18 的 PDF Viewer

看到新聞說 Firefox 18 已經有內置 PDF Viewer 了,找了選單,卻找不到怎麼開,用開新檔案,只會出現詢問下載位置的視窗。

找了一下,找到這篇 Show PDF inline Test Plan 才發現 Status 標為 Disabled until Firefox 19,所以是已經內置,但是功能沒打開。就心血來潮,在網址列輸入 about:config 找 pdf,果然看到 pdfjs.disabled 被標為 true,就把這個值改為 false,然後重新啟動 Firefox,就可以從「開新分頁」>「開啟檔案」去開啟 pdf 了。

不過,後來我還是把這個值給回復為 true 了,Mozilla 開發小組把這功能 disable 應該是有原因的,就等 Firefox 19 再說吧。

raspberry pi 的聲音

我是用 HDMI 接電視,我有參考過這篇:Raspberry Pi測試音訊介面 了,但還是沒有聲音,爬文以後,發現是要在第一個 partition 的 config.txt 裡去設定 hdmi_driver=2 (如果是在 raspberry pi 上,是在 /boot/config.txt ),設定完,重新開機就可以用 aplay 來播放聲音檔案了。

目前還需要解決的問題有:

  • 無線網路卡
  • 鍵盤+滑鼠+無線網路這樣會導致電力不足的樣子。