這篇文章是除錯紀錄與寫給 Power User/Geek 參考服用,一般使用者請等 googleearth-package (Ubuntu) 正式版修正。

今天用 Holux M-241 紀錄了一段騎自行車的路程,本想取出 KML 來丟進 Google Earth 看一下到底繞了多遠。結果久久沒用的 Google Earth 一開即當,看了看還在 4.2 版。於是決定升級一下,發現 Google Earth for Linux 的支援相當糟糕。

在 Debian/Ubuntu 上,你可使用 googleearth-package 這個工具,來幫你把 googleearth 包裝成 deb 格式。於是你可以用 dpkg 來安裝、管理。相較於 Google Earth 原本提供的安裝方式,這樣顯然乾淨多了。不過試了幾次,發現 Google Earth 啟動後瞬間就會當掉,並存了一份 Crashlog 在 ${HOME}/.googleearth/crashlogs/。

於是開始了除錯旅程。我的環境是 Debian Sid.

Google 官方版本

決定手動下載安裝看看,很悲慘的是一執行 GoogleEarthLinux.bin 就出現以下錯誤

Verifying archive integrity... All good.
Uncompressing Google Earth for GNU/Linux 5.2.1.1588..............................................................
setup.data/setup.xml:1: parser error : Document is empty

^
setup.data/setup.xml:1: parser error : Start tag expected, '<' not found

^
Couldn't load 'setup.data/setup.xml'

你必須這樣做之後才能正確啟動安裝程式

$ sh GoogleEarthLinux.bin --target /tmp/ge
$ cd /tmp/ge
$ mv -fv setup.data/bin/Linux/x86/setup.gtk /tmp/ge/setup.data/bin/Linux/x86/setup.gtk2
$ ./setup.sh

安裝完畢之後,你會發現啟動 Google Earth 時,閃過幾個畫面,console 訊息會告訴你 Google Earth has caught signal 11.

你可以在 ${HOME}/.googleearth/crashlogs/ 找到當機的軟體日誌。你可能會看到以下訊息

Stacktrace from glibc:
./libgoogleearth_free.so(+0xd090b)[0xb773090b]
[0xb7789400]
/usr/lib/libgdk_pixbuf-2.0.so.0(gdk_pixbuf_from_pixdata+0x13f)[0x94979daf]
/usr/lib/libgdk_pixbuf-2.0.so.0(gdk_pixbuf_new_from_inline+0x63)[0x9497a073]
/usr/lib/flashplugin-nonfree/libflashplayer.so(+0x4d335)[0x94f7d335]
/usr/lib/flashplugin-nonfree/libflashplayer.so(+0x4bd8e)[0x94f7bd8e]
/usr/lib/flashplugin-nonfree/libflashplayer.so(NP_Initialize+0x1ae)[0x94f8028e]
./libQtWebKit.so.4(+0x747b22)[0xb62edb22]
./libQtWebKit.so.4(+0x747c0c)[0xb62edc0c]
./libQtWebKit.so.4(+0x6062ff)[0xb61ac2ff]
./libQtWebKit.so.4(+0x604516)[0xb61aa516]
./libQtWebKit.so.4(+0x60476a)[0xb61aa76a]
./libQtWebKit.so.4(+0x712beb)[0xb62b8beb]

這是 Google Earth 內建的 QtWebKit libraries 試著要載入 browser plugins,由於相容問題當掉了。有鑑於 Google Earth 內附得 Qt libraries 還造成其他的問題,像是中文選單變成方格等等。我們可以砍掉 Google 附贈的 Qt4,直接用系統內建的 Qt4 函式庫即可。

cd google-earth
for qtlib in libQtCore.so.4 libQtGui.so.4 libQtNetwork.so.4 libQtWebKit.so.4 ; do
    mv ${qtlib} ${qtlib}.moved.for.workaround
done

另外一個問題是 libIGGfx.so,它顯然用 (linked) 了 libfreeimage3,但是實際跑起來卻會造成問題。

Stacktrace from glibc:
/usr/lib/googleearth/libgoogleearth_free.so(+0xd090b)[0xb788290b]
[0xb78db400]
/usr/lib/googleearth/libIGGfx.so(+0x1296c9)[0xb3f206c9]
/usr/lib/googleearth/libIGGfx.so(FreeImage_LoadFromHandle+0xb1)[0xb3f0e2c1]
/usr/lib/googleearth/libIGGfx.so(_ZN3Gap3Gfx7igImage21platformLoadFreeImageEPNS_4Core6igFileEbPNS0_19igImageMetaDataListE+0xa1)[0xb3ef84b1]
/usr/lib/googleearth/libIGGfx.so(_ZN3Gap3Gfx10igOglImage12platformLoadEPNS_4Core6igFileEPNS0_19igImageMetaDataListE+0x112)[0xb3ef8bb2]
/usr/lib/googleearth/libIGGfx.so(_ZN3Gap3Gfx7igImage8loadFileEPNS_4Core6igFileEPNS0_19igImageMetaDataListE+0x12d)[0xb3ee91ad]
/usr/lib/googleearth/libevll.so(_ZN5earth4evll7Texture9LoadBytesEPKhi+0xa6d)[0xb0ad7b8d]
/usr/lib/googleearth/libevll.so(_ZN5earth4evll7Texture12ProcessWorkQEd+0x184)[0xb0ae3594]

解決方法是自己裝 libfreeimage3,然後用 LD_PRELOAD 換掉 Google Earth 包在 libIGGfx.so 中的函式。如下

LD_PRELOAD=/usr/lib/libfreeimage.so.3 googleearth

這樣你應該可以順利的啟動 Google Earth 5.2 了。

Debian/Ubuntu 版本

在 Debian 與 Ubuntu 上,Adnan Hodzic已經包裝了 googleearth-package,Debian 跟 Ubuntu 使用者只需要下達 make-googleearth-package 指令,系統就會自動下載 Google Earth,並包裝成 deb 檔案。再用 dpkg -i googleearth_*.deb 安裝即可。

目前的版本 (0.5.7) 還是用 Google Earth 預設的 Qt4 與 libfreeimage3。我提了一版修正,希望新版中可以預設刪除 Qt4 與 libfreeimage3,修正檔可於 #596423 取得。

之前用 Microsoft ExcelOpenOffice Calc,時常會想在寫函式時使用 SQL 語法。因為你在試算表中,最常用得功能之一,就是統計並計算出原始資料工作表 (Sheet) 中的數值。

例如,你可以用 SUMIF, COUNTIF, FILTER 等公式,去統計、過濾查出某一種類別的加總或平均。可是這樣一來,你得寫好一行公式,然後把他拉開複製到每一個儲存格 (Cell) 中,有時參照 (cell reference) 沒寫好或無意中拉錯一格計算範圍,你就算錯所有資料。偏偏這種錯誤很容易在不停重複複製儲存格時發生。

所以你就想,為什麽不讓我直接 SELECT * FROM cells GROUP BY 來拉資料就好?可是這些試算表軟體,都只讓你從其他 Data Source 中拉資料時,才能用 SQL 語法。但是把手上的資料匯入 Microsoft Access 或 OpenOffice Base 又很脫褲子放屁。

最近為了方便分享資訊給其他人,常改用 Google Spreadsheets 編輯。發現 Google Spreadsheets 有一個 Query function,可以讓你在試算表中用類似 SQL 得 Google Visualization API Query Language.

Query Language 本來的設計是讓你可以從線上資料庫中撈資料,以便整合到 Google Chart Tools / Interactive Charts (aka Visualization API) 中,如此你可以把自己的資料接出來 (Google I/O 2009 – Implement Your Own Visualization Datasource) 餵給 Visualization API。

而 Google Spreadsheets 的 Query function 則是整合了 Query Language,讓你直接把試算表當作 Data Source! 所以你可以直接用 SELECT *,把另外一個表格中資料全數複製。你也可以用 GROUP 跟 aggregation functions 如 avg(), count(), sum() 把一個表格中的資料統計算好列出來!非常方便,過去要重複好幾次計算,甚至那種千行以上的工作表都可以瞬間就處理好,出錯得機率也小了許多。

Youtube 上有一則非常好的示範

我記得幾年前 (應該是 2002-2005 間),為了妥善保存自己在 Debian 上的各種工作資料,希望能夠用比較加密過的方法,將資料寫到光碟中。當時的想法是利用類似 cdbackupmcrypt 等工具,將資料以自訂的檔案格式與加密演算法存到光碟中。

這種方式有幾個好處。

  • 第一,由於格式完全自訂,並非 ISO/CDFS,因此一般電腦軟體是無法辨識解讀的。
  • 第二,即便 Image 被強取出來,還是要猜出所用得演算法與金鑰,才能解壓出原始檔案。
  • 第三,當時光碟平均儲存成本比硬碟低,可以多燒幾份異地備援。

壞處是,幾年前資料頂多幾百 Mb,備份燒錄進 CD or DVD 還沒有問題,但是現在媒體資料、程式碼等等幾乎都是動輒幾 G 以上,用光碟實在太慢、太麻煩了。而且這個方法不支援循序備份,每次都是完整備份。由於太慢、太麻煩,你可能幾天或幾周才做一次備份,偶爾備份間的空窗期就會漏掉重要資料。備份重點就是隨時有一份最新的重要工作文件的副本阿。另外一個問題是,沒有良好的備份紀錄管理工具 (archive viewer),所以你每次想查檔案就得重新解開整片光碟才能找到。

第三個問題是,光碟其實是非常不保險的儲存媒體。過個幾年,當時備份用的光碟,可能就變質而無法讀取。更糟糕的是自訂的格式,沒有考慮容錯 (Error detection and correction),所以更難從變質、損壞的 CD 中把資料取出來。若不幸,你買到一批塗料品質不佳的光碟片,或功率老化的光碟機,那幾年後才後悔都已經來不及了。

重新調查了新的備份方式,目前改用的其中一個方法是 duplicity,duplicity 有幾個特色符合我的需求

  • GnuPG 加密與簽章壓縮檔。
  • 支援循序備份,並用 rsync 來傳送備份檔案。
  • 備份檔中用標準的 tar 跟 rdiff 產生的 delta 檔。
  • 支援多種備份的網路檔案協定 – local file storage, scp/ssh, ftp, rsync, HSI, WebDAV, and Amazon S3

所以如果你願意的話,你可以花一點小錢,把已 PGP 加密過到檔案,傳到 S3 上做雲端備份。;-) 這樣就不用擔心一些線上備份服務 (Dropbox, Ubuntu One, SpiderOak),用一些曖昧不明的加密方式或根本不加密的方式儲存你的檔案。

預設使用方法很簡單,就是 duplicity /home file:///tmp/home 這樣即可使用。你若太懶,只是一般使用者不想下指令的話,也可以裝 Déjà Dup操作超簡單,只需滑鼠點點點就可以設定備份的目錄,跟要儲存的位置。還原也是利用視覺介面點選後,就可以解壓縮出來。

當然,技客如你,可能會需要複雜一點的手稿,來儲存各種不同分類的檔案,這裡僅分享一個我自己用得小 Script.

在試著分享軟體專利的荒謬性字幕時,試著想要把影片跟字幕嵌入到網頁裡面,方便大家點開就可以直接看。試了幾個線上服務,如 Youtube, Vimeo, blip.tv 等等,發現他們要嘛限制播放時間,否則就是不支援字幕系統。

實在不想耗費時間剪接,後來發現軟體專利的荒謬性影片擺在 Internet Archives,而且直接用 HTML5 Video Tag 播放,轉念就試試 JavaScript 吧。很快找到 j^jquery.srt.js,這之小程式會自動下載跟解讀 SubRip (*.srt) 格式的字幕檔,然後在影片播放的同時,依照時序自動更新字幕,就算使用者快轉也會自動跳到新位置,相當方便。效果可以看軟體專利的荒謬性一文的影片。

必要的話,也可以稍微修改,讓字幕直接浮在影片位置上,顯示會更接近一般播放軟體,可能更美觀。

所以 JavaScript with HTML5 又多解決一項 Flash 可以辦到的事情啦。:D

Updated, 2010-05-16 14:00: 理想中的多國字幕系統,可以參考 Ilias Ismanalijev嘗試。除了用 jquery.srt.js 外,也有一Timed Text (TT) Authoring Format 規格可用。詳情可見 Silvia Pfeiffer 在 HTML5 Video Accessibility 上的相關推展

軟體專利的荒謬性

雖然有些朋友專職從事專利或軟體專利的撰寫、管理工作。但是我必須承認,我實在厭惡軟體專利制度。實在也很不願的被迫撰寫軟體專利,來助長這種錯誤的制度。過去有段時間,時常查閱特定領域的軟體專利,當時即發現幾乎大部份的習知技術 (prior art)都早以含糊不明的文字廣泛的登記為專利了。而且,這些專利註冊者,十有八九並非實際利用其創意經營生意。

於是,你幾乎沒有任何辦法撰寫一套不違反專利的軟體。但你若想經營一套生意,唯一保護你自己的方法是更賣力註冊其他的專利,用更模糊的字眼申請專利,於是你便能在受到威脅時,以攻為守。為了能夠長久在產業中存活,你不得不花費資源投資在專利開發上,而不是提供服務或製造產品。專利制度不再是鼓勵創新,而成為繳交給大企業的變相稅金。

《軟體專利的荒謬性》是由自由軟體基金會所贊助的紀錄片,片中適當剪輯了幾個專訪,正好在半小時內,完整的頗析關於軟體專利的問題與觀點。相當值得你花半小時時間來了解。

Patent Absurdity 影片授權為創用CC 姓名標示-禁止改作 (CC-BY-ND) 3.0. 作者請見關於此紀錄片。感謝阮一峰進行簡體中文字幕翻譯,我將其轉成正體中文,並花了點時間調整了一下文字,歡迎下載使用,並給予指教。授權同阮一峰先生採 CC-BY 3.0

歡迎轉錄影片與字幕。

你若無法觀看影片,請安裝支援 HTML5 Video 播放功能瀏覽器,如新版 Firefox 3.6,或使用 Flash 版本

上一篇文章簡單分享一下我對 Gnome Shell 的粗淺觀點,在 Gnome Shell 中,另外一個更令人驚喜的技術特色是 – JavaScript.

Gnome Shell 大部分的程式碼都是基於 JavaScript 所開發,利用 Gjs (Javascript Bindings for GNOME) 與 GObject Introspection,你就可以直接使用 GTK+ 的相關函式庫,例如 Gnome Shell 大量使用的 Clutter 等。

當然,決定採用 JavaScript 當然會引起一些爭論,不過我個人是樂見其成。試用你可以利用 Looking Glass,直接在類似 Firefox JavaScript console 的介面下,直接用 JavaScript 控制 Window manager 的反應與作用,多方便!而且還可以直接用 JavaScript 寫 Window Manager 的 Extensions! 幾乎所有開發需求都可以用 JavaScript 完成。你若想玩玩,可以從這份開發文件開始玩,叫出 Looking Glass 的方法可參考 Cheat Sheet

其實,在桌面系統中使用 JavaScript 為基礎並非創舉,在 Gnome Shell 之前,Litl 所推出的 Easel Webbook. 便是利用 gjs 所開發,一些技術細節可以參考 cananian文章

Gnome Shell 用得 JavaScript bindings 是 gjs, 基於 Mozilla SpiderMonkey 引擎。另外 Gnome 社群還有一套 Seed 則是基於 Webkit 所開發,也支援 GOI (GObject Introspection) binding.