2017年1月25日 星期三

You don't know shell-command (M-!) / eshell !!!

其實測試時能直接開 eshell 實在是很方便,做文件啦(尤其是 htmlfontify轉成 html)什麼的都很快捷。說到 emacs 的 eshell ,可以說是對 pipeline 及 createprocess 相當高段的一個創作。這一定要推薦 Mastering Emacs 這本書,很多時候可能要寫個小小 script 的工作,在 eshell 裏面竟然給幾個組合鍵就搞定了。

shell-command

先來說說 shell-command 。 在 ultraedit 中有幾個很方便的功能,例如 Alt-E,F 可以複製檔案名稱到剪貼簿中,經常搭配著 cmd.exe 來進行各種工作。 emacs 可以做類似的事,例如 M-! pwd (linux 系統上) 或 M-! cd (windows系統上),但是它少了複製/貼上的冗餘動作,只要在下命令前加上 C-u 即可使輸出結果插入當前 buffer 中。

C-u M-! 這個按鍵組合本身就是個經典, 例如 C-u M-! ping xxx.xxx.xxx.xxx ,就可以把ping的結果直接插入到當前文件,這要直接在 cmd.exe 上要多作很多的動作(需要滑鼠),想到就很讚嘆…

其它詳情請參考 https://www.masteringemacs.org/article/executing-shell-commands-emacs

eshell

詳情請參考 https://www.masteringemacs.org/article/complete-guide-mastering-eshell

雖然把它當 bash / cmd.exe 有點太小看它了,不過能在 buffer 中執行 shell 又能把結果立馬拿來編輯,這已經很好用了。

emacs 25.1-2 版

最後, emacs 25.1-2 版已經出了,有很多令人振奮的新功能,讓人覺得 rstudio / iphthon 的功能也被吸星大法吸納的港(?)覺

其中新的動態連結功能,可以想見即將取代目前大部分使用命令列參數來呼叫其它工具程式的局面,好處的話想當然爾可以節省多次呼叫時所需的啟動時間,壞處的話就是可能 lib 寫不好的話反而去掛掉主程式…真心覺得 jboss / websphere 這類服務有點危險, bash 等 shell 寫得愈來愈好,會寫 shell script 的人愈來愈多,回頭一看可能會發現,很多東西其實在 shell 的層級就可以很簡單的解決掉了…

emacs 中 shell-command-to-string 的使用在 windows 平台上的一些想法/心得

shell-command-to-string 由於參數是呼叫平台本身預設 locale 的編碼,並非 unicode/utf-8 ,因此傳遞參數必需直接丟 cp950 編碼 ,印出時也必需是 cp950 ,不然會產生亂碼。 然而如果為了這個原因而必需維護 linux 及 windows 兩種程式版本,也是滿麻煩的。 我的建議是被呼叫端使用 base64 來解/編碼, emacs 端則以  (base64-encode-string (encode-coding-string XXX 'utf-8 t) t) 來傳送引數字串 XXX。

當然,多年以後可能會有比較深的領悟,覺得 emacs 也真是很辛苦的在向英文下相容這工作上下苦工。參考 Coding Systems in `shell-command` 上的說明,把 (setq default-process-coding-system '(utf-8 . utf-8)) 執行一下,就發現在 eshell 竟然可以直接輸入/輸出 utf8 字串了!! (cmd.exe 要在命令列輸入 unicode 也要另外設定,關鍵字 chcp ,網路上很多大大有詳解,就不在此掠美了。)

不過阿Q一點想,也是多學一些技能嘛~~

但是很多時候啟動一個應用程式的成本很高,不論是空間上或時間上的成本,這時候會有必要:
  1. 改寫原程式為 socket server / web service,然後你要讀懂原程式…
  2. 利用 netcat 在 linux 平台上直接解決。不過當初原程式可能沒有想到它會有來自網路的要求,這額外的邏輯,是否能在 script shell 的層次解決,可能還是有點不確定性… 而且 netcat 只能接受一次連線的樣子,這只能做為一個一次性的任務之用,比如測試之類的,參 Linux nc 常見用法
  3. 那還是要自己寫個 script 比較妥當(正解)
寫 script 來直接呼叫程式又有兩種思路:
  • 一種是由 ssh 呼叫,實際上是透過了 shell (sh/bash) 來執行程式,這比較偏向 linux-based 、 administrator-oriented 、 session-oriented 的解法,而且要搭配 session 或 tmux 來讓被呼叫的程式在背景執行,參 5 Ways to Keep Remote SSH Sessions and Processes Running After Disconnection ,再建立一個 tcp server 或 http server 來處理請求。
  • 另一種是由 createprocess 來呼叫,再建立一個 tcp server 或 http server 來處理請求。

console-based (stdin/stdout) vs socket-based

上面說的外部應用程式都是傳統的 console 程式,emacs畢竟原生的 socket 支援滿差的,所以思路比較受限。但是如果應用程式的原生語言對 sockets 的支援不錯的話,其實建議直接寫 socket-based 程式,以 line 導向做 IO。甚至對 xml/jason 支援不錯的話,以 xml/jason 導向做IO,以避掉 EOF 的決定條件問題。


2017年1月14日 星期六

docker X windows10 X tensorflow X syntaxnet (1)

因為各種原因,2016年下半開始,docker終於在windows 10上有比較好用一點了

請依 此網址 安裝,目前最新版是 1.12.6 ,安裝完成後再裝好 kitematic ,搜尋 tensorflow ,按下 create


左邊的黑框中最下一行有密碼,點擊右邊的畫面可以帶出jupyter瀏覽器,輸入密碼即可進入根目錄,打開 1_hello_tensorflow.ipynb 就可以開始玩 tensorflow 了

比較詳細的 docker for windows 安裝說明可參考 https://docs.docker.com/docker-for-windows/

深度學習近年來被炒得火熱,基於的多層 DNN 及單層的 HMM 在某種層次上都是對出象的模式識別,只是得力於 GPU 的能力,使得這些計算變得很便宜。

雖說這種暴力的、"湊答案"式的解空間映射,距離"人工智慧"的想像還差得遠了,但是日常工作中又有多少內容是真的需要"智慧"才能解決呢? 

2017年1月3日 星期二

玩轉 corenlp

進入 http://corenlp.run/ ,輸入一個句子後,按下 Submit

Recent advances in genome engineering technologies based on the CRISPR-associated RNA guided endonuclease Cas9 are enabling the systematic interrogation of mammalian genome function.

結果節錄如下


這樣就可以用來寫個程式,丟到 SQuAD 試試了

參考 SyntaxNet in context: Understanding Google's new TensorFlow NLP model 一文,以 "They ate the pizza with anchovies" 一句為例丟進 corenlp ,果然得到比較好笑的那種結果。

看來要花點時間玩玩 SyntaxNet 了…