Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[討論] 還是 IPC 架構問題 #17

Open
PCMan opened this issue Apr 9, 2017 · 7 comments
Open

[討論] 還是 IPC 架構問題 #17

PCMan opened this issue Apr 9, 2017 · 7 comments

Comments

@PCMan
Copy link
Member

PCMan commented Apr 9, 2017

@KenLuoTW @osfans @jessy1092 這邊需要跟大家溝通討論一個問題。上一版換成 web-based 的架構之後,後端就像是一般 web service,開發除錯比較容易,但後來發現有以下問題:

  1. 開 port 傳 http 容易被防毒軟體擋下 (已知 Bitdefender 會影響)
  2. http service 有 cache 機制會影響資料 consistency,雖然手動強制關閉了,但總感覺不太保險
  3. 正確維護每個 backend server 的狀態有難度,且 http request 有 timeout 問題, server side 的狀態發生改變也很難即時回饋回來
  4. 原先是希望這樣同一套架構也可以把 http server 跑在遠端,就可以變成 cloud-based,但後來想到如果複雜的認證機制像 oauth 那些,全讓 PIMELauncher 用 C++ 實做的話,不太實際。

所以現在有個新的提案:
不要用 http server,PIMELauncher 改直接用 pipe 和 python & node.js 的 stdin/stdout 相接。來自 client 的指令由 PIMELauncher 轉送進 backend 的 stdin,處理後的輸入法輸出 print 到 stdout,由 PIMELauncher 讀取後送回 client,每一行是一個 json message
這樣 python & node 就只需要 loop 從 stdin 讀入每一行的輸入,處理完畢後,把輸出 print 到 stdout,完全不需要任何 server,也不需要任何 thread or async i/o 架構。

有不少優點:

  • 這是目前 Google Chrome / Firefox 的 Web Extensions 的 native messaging 使用的架構,已被驗證過
  • 不用開 port,單純 I/O redirect,防毒軟體比較不會叫,也不怕防火牆
  • 任何程式語言都可以實做,即便不支援 socket / http,因為只需要能讀 stdin,print 到 stdout 即可,彈性更增加。(連 VB script 和 shell script 都可以寫,雖然沒人會這樣做)
  • PIMELauncher 很好即時知道後端狀況,因為 pipe 連接一旦發生問題會 broken pipe error,不用像 http 等 timeout,不會 block
  • 我已經實驗成功用 libuv 來實做這架構 (for python),在 libuv 的 branch 裡面

但缺點是:

  • 除錯會變困難,以前直接把想要的東西 print 數值出來看,現在不能亂 print 了,可能要改寫到 log file
  • 輸出輸入的 protocol 需要改,舉例來說。print 出來的 output 前面要加上 PIME_MSG: 這樣的 prefix,才當作有效 output,否則忽略。這樣可以避免某些 python library 或 code 裡面不小心 print 了其他非輸入法 output 的東西而被當成 output。

關於除錯困難的部份,我打算自己寫一個除錯工具在 PIMELauncher 內,打開就可以看到中間的訊息內容,來補足 stdio 被拿去做 IPC 無法輸出 console 視窗來看 print 結果的缺點。

如果是這樣的方案,大家覺得可以接受嗎?Thanks!
@jessy1092 特別需要你的意見,因為 node.js 不確定這樣改會不會很麻煩或是發生問題

@PCMan
Copy link
Member Author

PCMan commented Apr 9, 2017

@KenLuoTW @osfans @jessy1092 BTW, 有個好消息,有位企業主來信表示願意贊助 code signing 的費用,正在洽談中,如果可以,下次就可以幫發行的執行檔簽章了,應該會減少一些被視為不明來源惡意程式的問題。

@PCMan
Copy link
Member Author

PCMan commented Apr 16, 2017

@jessy1092 目前 libuv_experiment branch 內的 python 版本已經移植到使用 stdio 做 IPC 的版本,初步實驗滿穩定的,但是中間的資料格式可能還會改。我近期會把這部份完成。
@KenLuoTW @osfans 另外現在這個 branch 內多提供一個工具叫 PIMEDebugConsole,打開可以隨時連上 PIMELauncher 監看 debug message,這樣可以解決拿 stdio 做 IPC 後不容易印出 debug 內容的問題。

@jessy1092
Copy link
Member

@PCMan 話說這次也會先 release alpha 版嗎? 想實際安裝來測試一下 XD 主要是 debug 的方式,node 部分主要 debug 都會 stdout 出來,不確定會不會有影響

@PCMan
Copy link
Member Author

PCMan commented Apr 22, 2017

@jessy1092 這裡有可以測試的版本:
https://drive.google.com/file/d/0B4BhmC8V2mivOFhycFNZbkFyR0k/view?usp=sharing
@KenLuoTW @osfans @jessy1092 我想要發行一個新版本,不知道你們這裡還有沒有什麼問題要修?另外新版的版本號,我有點想直接跳上 1.0,然後之後開始改用 semantic versioning
不知道大家覺得如何? 一路修修改改到現在,覺得 public API 差不多該穩定下來了。

@PCMan
Copy link
Member Author

PCMan commented Apr 22, 2017

剛有發現 bug,我上傳了新的 installer (網址跟剛剛一樣)

@Arthurmcarthur
Copy link

PIME在輸入時,若切換窗口,則輸入提示框並不會自動消失,這個問題雖然不是bug,但是有時候意外的窗口切換,會給使用者帶來困擾,也與微軟倉頡等輸入法的行為不同。請問能否改成輸入提示框會在切換窗口後自動消失的形式,和微軟等輸入法的行為一致呢?

@buaabyl
Copy link

buaabyl commented May 26, 2017

这个其实和httpserver的FastCGI模式很类似。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants