成立 PCMan Facebook 專頁

之前常被許多網友要求加 Facebook,但是數量過多難以管理,大部分也都不認識,無法一一加入,所以成立 PCMan FB 專頁。未來長篇的文章還是會放 Blog 上,而平常的小動態會放在 FB。
另外,現在也可以使用 http://blog.pcman.im/ 來連到本網站

2013年9月12日 星期四

新酷音Windows版最新進度 - 支援 Windows 8 64-bit

雖然先前本來只打算支援 Windows 8 的 desktop mode,但是經過持續研究,
以及寄信請教 TSF aware blog 作者 Eric Brown,參考日文輸入法 corvus-skk,
加上對岸強大的開發者,小小輸入法的周永 (dgod) 指點,終於知道怎麼做了。
目前新酷音輸入法,初步可以部分支援 Windows 8 modern UI,
我在 Windows 8 試用版裡面測試,已經可在 metro app 裡面使用了!
值得一提的是,對岸高手周永 (dgod),就是我認識的那位 dgod
之前我們還一起開發過 Linux 桌面 LXDE 專案,實在也太巧,
我居然不知道他會寫 TSF 輸入法!! (我猜他應該也不知道我有在寫 XD)

先前從文件上看來,Windows 8 app 模式不能使用許多舊有功能,
很多輸入法必要的 API 竟都被標注為 desktop mode only,
所以我一直想不出來怎麼做。原來,在輸入法是特例,
雖然 dll 是載入到 app container 內,但是 desktop SDK 的 API 是允許使用的。
終於找到一份文件證實這點:
http://msdn.microsoft.com/en-us/library/windows/desktop/hh848069(v=vs.85).aspx
Quote:
When an IME is loaded into a Windows Store app, it is subject to the same app container restrictions as the app itself. This behavior ensures that IMEs are not able to violate Windows Store app security contracts, despite having access to the desktop SDK (because they are not distributed or certified by the Windows Store)
所以,輸入法雖然跑在 app 內,原 Win32 API 是允許的,但是存取的限制,
仍然受到 app container 安全規範,實地測試發現,可以使用 Registry 的 API
但是在 app 內嘗試讀寫系統登錄,都會造成錯誤。讀寫 app 以外的檔案也會權限不足。
故這些 API 雖然可以調用,但是只要存取到 app 不准許存取的資源,就會發生錯誤。

總結來說,目前已經可支援 Windows 8 store app,但還有許多限制沒有克服

  1. 使用者偏好設定,各個 app 內各自獨立,不能互相讀取,也不能讀取系統登錄,也不能存取 app 自己 package 以外的檔案,所以無法讀取設定檔,不能和 desktop mode 共用設定。微軟官方建議的方式是,建立一個 web service 來儲存這些設定。
  2. app 內儲存設定有自己的方式,新的 API 不相容舊版 Windows,所以可能還是需要額外幫 Windows 8 開發自己的版本
  3. 使用者辭庫無法在 app 內使用,因為 app 內讀不到外界的檔案,只有少數幾個許可的位置可讀取,很多更是無法寫入,但是各個 app 隨不同的 capability 又會不同。此問題目前無解。微軟官方建議的方式是,這些資料應該放在雲端。但是沒網路的時候就不能用了,Windows 8 的這種設計哲學在網路連不上的情況會很難實現。
  4. app mode 和 desktop mode 之間互相溝通預設不被允許,除非經過複雜的安全性設定,但是找不到如何設定的文件或範例。目前比較確定能用的,是透過 web service,只不過,為了交換少數資料,而需要架設 web server...真是殺雞焉用牛刀!
  5. Windows store app mode 下沒有語言列,無法顯示狀態,或存取其他功能。
也許,在 app 模式下關閉使用者辭庫功能是個可行的解法,
但是這仍然沒有解決 app 內和 desktop mode 設定要如何共用的問題。
該不會真的需要寫專用的 web server 吧....

TSF 和 32/64 位元支援都完成了,支援 Windows 8 metro app 有譜了,但還有很長的路要走。

2013年9月10日 星期二

新酷音輸入法 Windows 版,重新出發!

過去曾經把 Linux 上優秀的輸入法「新酷音」移植到 Windows。
雖然後來實在沒時間再參與了,我自己一直還是有在用新酷音
直到現在,因為工作上需要長時間使用 Windows,難用的
微軟新注音,再次喚回我對新酷音輸入法的懷念。
到了 Windows 7 之後,因為系統架構的改變,
新酷音雖有網友做出支援 64 bit Windows,一直沒能運作得很好
因為 Windows 逐步拋棄舊 IME (imm32) 架構,
轉向採用 COM 技術的新 Text Service Framework (TSF)
複雜度呈直線幅度上升,使得許多舊有 IME 常出現難解的奇怪問題
又因 IME 的諸多限制,使舊的新酷音依賴許多 dirty hacks 在運作
最近 Windows 8 更是全面轉向 TSF,開始準備禁用 IME 架構,
以 TSF 全面重寫看來勢在必行了。
先前有網友陳昌倬 (czchen)的努力,用微軟提供的範例程式改造,
初步證實了 TSF 的可行性,在這個鼓舞之下,
我重啟了 Windows 版新酷音計劃
https://github.com/chewing/windows-chewing-tsf/

經過連日熬夜研究,全新 TSF 架構的 Windows 版新酷音終於快可以用了
基本的架構和 API 以及各種工具都完成了,連語言列按鈕和選單,都能正確運作了!
而因為原先微軟提供的範例,是以微軟自己的 MS-PL  (Microsoft Public License)授權,
雖然也算是自由軟體,但是該授權不相容 GPL,而且衍生著作必須沿用 MS-PL
為了避免這個問題,我只好 from scratch 重寫 TSF 支援。
因為 TSF 大量使用 COM (component object model),並且層層疊疊非常複雜,
對開發者並不友善,我將這部份封裝進 libIME 這個函式庫,
這樣未來的其他輸入法開發者,可以直接套用 libIME 封裝的現成架構,
而不需要了解 TSF 就可以快速寫出支援 Windows 的輸入法。

這裡針對 libIME 程式 API 架構寫了簡易說明文件
供有興趣參與開發的朋友參考,希望可以加速大家移植自己的輸入法

基本上透過 libIME 來實做輸入法是很簡單的
只需要碰觸到非常少 TSF,大部分細節和 COM 操作都被隱藏了
libIME 也提供了許多 Windows GUI programming 的工具 classes
Ime::Window, Ime::Dialog, Ime::PropertyDialog...等等,
幫助實做視窗界面和 config dialog

雖然目前進展很順利,大多數問題也克服了,
但是我接下來會需要忙好一陣子,沒時間改太多 code,
文字輸入的部分還有些問題,希望有其他朋友可以
就現有 code 和文件繼續改良,相信很快就能有可用的發行版

至於 Windows 8 store app 支援,看來是沒有指望了
我有 E-mail 給 TSF aware blog 的作者,他是 MS 員工
專精 TSF,經過他的回答,看來要能支援 win 8 app
基本上是需要整個用 win 8 專屬的新 API 重做,
而且設定和資料基本上需要放上 web 才行
因此雖然也是 TSF,但是等於也是要全部重寫另一個
GUI 也是要用新的架構重寫,舊 GUI code 完全不能用
因為限制實在太多,困難度更高,又需要跟 web 連接
我想這不是我們該支援的東西。
詳見微軟的:Guidelines and checklist for IME development (Windows Store apps)

照現有的狀況看,大部分現有軟體要移植到 win 8 metro
基本上是不可能的,除非全部砍掉重寫...
所以,我個人認為,這是一個沒有前途的平台...
把開發應用程式變得比 Linux 上更困難,只是自廢武功而已
集中精力來支援沒人在用的平台,實在不划算
因此,就這樣吧! 支援 desktop mode 就好了

敬請期待,重生的 Window 版本新酷音 TSF 輸入法!