Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Rios::ProxyA proxy framework for CLIid:mooz / @stillpedant
自⼰紹介 名前 id:mooz @stillpedant よく書いていたもの Firefox のアドオン Emacs Lisp Python Ruby は親戚とのつきあい程度
宣伝
Emacsは好きですか?
→Yes
Firefoxは好きで すか?
→Yes
朗報
KeySnailあなたのFirefox,Emacsにしてみませんか?  For Vim users, there  is Vimperator. For  Emacs users, there is  KeySnail.         [ci...
宣伝終
突然で すが
最近 CLIにハマっております
CLI? × Common Language Infrastructure ○ Command Line Interface
変遷CLI Hello World! 期GUI GTK+ 期GUI Web (XUL, HTML, Canvas, ...) 期CLI←今ココ
インタラクティブCLI ユーザがキーを⼊⼒するたびに アプリケーションが反応 (Enterを待たない) 画⾯が下に流れていかない 例  Emacs / Vim  zsh  GNU readline
実現方法 エスケープシーケンスを駆使 ioctl(2) #include <termios.h> curses
問題
テストが難しい テストには以下が必要 プログラムへ⼊⼒を⾏なう プログラムからの出⼒をチェックする どうやって⽂字列を⼊⼒として 渡す? どうやって出⼒を⽂字列として 取得する?
⼈⼒
嫌
自動化したい
Rios::Proxy    gem install rios  アプリケーションのコマンドラ  イン⼊⼒と出⼒にフック   出⼒のチェック・書き換え   ⼊⼒のエミュレーション・書き換え  フック内容は Ruby で記述
動作イメージ
使い方 require "rios/proxy" proxy = Rios::Proxy.new proxy.on_output do |s|   s.gsub(/foo/, "bar") end proxy.listen
簡易版 require "rios/easy" on_output do |s|   s.gsub(/foo/, "bar") end listen
出⼒へのフック proxy.on_output do |s|   # アプリケーションの出⼒が⽂字列 s として渡る   # 返り値:   #   ⽂字列 -> 出⼒をその⽂字列に書き換え   #   空⽂字列 -> その出⼒をキャンセル   ...
⼊⼒へのフック proxy.on_input do |s|   # ユーザの⼊⼒が⽂字列 s として渡る   # 返り値:   #   ⽂字列 -> ⼊⼒をその⽂字列に書き換え   #   空⽂字列 -> その⼊⼒をキャンセル   #   ni...
⼊⼒のエミュレーション以下のようにすると,ユーザがrm -rf / と打ち込み Enter を押したことになる  proxy.input("rm -rf /n")
プロキシ対象プロキシ対象のアプリケーションは Proxy#listen への引数で指定
プロキシ対象::デフォルト # 省略すると ENV["SHELL"] が用いられる proxy.listen
プロキシ対象::任意のコマンド # 配列を渡すと,そのコマンドが exec 経由で実⾏される proxy.listen(["ssh", "moge@foo.bar"])
プロキシ対象::ブロック proxy.listen do ||   # ブロックを渡すと,そのブロック内部がプロキシ対象となる end
応用 自動テスト 柔軟な expect として 端末の録画 (script, ttyrec) キーバインド変更ツール キーロガー
課題 ⼊⼒に対するマッチング 現在: テキトーな範囲でブツ切りに なった⼊⼒・出⼒が渡る イテレータに対する正規表現マッチが 必要 boost::regex を使う?
宣伝
KeySnail 初期化ファイル(.keysnail.js) によるカスタマイズ キルリング anything.el 的な何か プラグインシステム M-x
Upcoming SlideShare
Loading in …5
×

Rios::Proxy - A framework for CLI

4,832 views

Published on

Rios is a proxy framework which works as a proxy
for command line applications and allows developer to hook input/output
of the applications in a blazingly simple way.

See https://github.com/mooz/rios for details.

Published in: Technology
  • Sex in your area is here: ❶❶❶ http://bit.ly/2ZDZFYj ❶❶❶
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Follow the link, new dating source: ♥♥♥ http://bit.ly/2ZDZFYj ♥♥♥
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Be the first to like this

Rios::Proxy - A framework for CLI

  1. 1. Rios::ProxyA proxy framework for CLIid:mooz / @stillpedant
  2. 2. 自⼰紹介 名前 id:mooz @stillpedant よく書いていたもの Firefox のアドオン Emacs Lisp Python Ruby は親戚とのつきあい程度
  3. 3. 宣伝
  4. 4. Emacsは好きですか?
  5. 5. →Yes
  6. 6. Firefoxは好きで すか?
  7. 7. →Yes
  8. 8. 朗報
  9. 9. KeySnailあなたのFirefox,Emacsにしてみませんか? For Vim users, there is Vimperator. For Emacs users, there is KeySnail. [cited from `KeySnail Wiki]
  10. 10. 宣伝終
  11. 11. 突然で すが
  12. 12. 最近 CLIにハマっております
  13. 13. CLI? × Common Language Infrastructure ○ Command Line Interface
  14. 14. 変遷CLI Hello World! 期GUI GTK+ 期GUI Web (XUL, HTML, Canvas, ...) 期CLI←今ココ
  15. 15. インタラクティブCLI ユーザがキーを⼊⼒するたびに アプリケーションが反応 (Enterを待たない) 画⾯が下に流れていかない 例 Emacs / Vim zsh GNU readline
  16. 16. 実現方法 エスケープシーケンスを駆使 ioctl(2) #include <termios.h> curses
  17. 17. 問題
  18. 18. テストが難しい テストには以下が必要 プログラムへ⼊⼒を⾏なう プログラムからの出⼒をチェックする どうやって⽂字列を⼊⼒として 渡す? どうやって出⼒を⽂字列として 取得する?
  19. 19. ⼈⼒
  20. 20.
  21. 21. 自動化したい
  22. 22. Rios::Proxy gem install rios アプリケーションのコマンドラ イン⼊⼒と出⼒にフック 出⼒のチェック・書き換え ⼊⼒のエミュレーション・書き換え フック内容は Ruby で記述
  23. 23. 動作イメージ
  24. 24. 使い方 require "rios/proxy" proxy = Rios::Proxy.new proxy.on_output do |s| s.gsub(/foo/, "bar") end proxy.listen
  25. 25. 簡易版 require "rios/easy" on_output do |s| s.gsub(/foo/, "bar") end listen
  26. 26. 出⼒へのフック proxy.on_output do |s| # アプリケーションの出⼒が⽂字列 s として渡る # 返り値: # ⽂字列 -> 出⼒をその⽂字列に書き換え # 空⽂字列 -> その出⼒をキャンセル # nil -> 何もしない end
  27. 27. ⼊⼒へのフック proxy.on_input do |s| # ユーザの⼊⼒が⽂字列 s として渡る # 返り値: # ⽂字列 -> ⼊⼒をその⽂字列に書き換え # 空⽂字列 -> その⼊⼒をキャンセル # nil -> 何もしない end
  28. 28. ⼊⼒のエミュレーション以下のようにすると,ユーザがrm -rf / と打ち込み Enter を押したことになる proxy.input("rm -rf /n")
  29. 29. プロキシ対象プロキシ対象のアプリケーションは Proxy#listen への引数で指定
  30. 30. プロキシ対象::デフォルト # 省略すると ENV["SHELL"] が用いられる proxy.listen
  31. 31. プロキシ対象::任意のコマンド # 配列を渡すと,そのコマンドが exec 経由で実⾏される proxy.listen(["ssh", "moge@foo.bar"])
  32. 32. プロキシ対象::ブロック proxy.listen do || # ブロックを渡すと,そのブロック内部がプロキシ対象となる end
  33. 33. 応用 自動テスト 柔軟な expect として 端末の録画 (script, ttyrec) キーバインド変更ツール キーロガー
  34. 34. 課題 ⼊⼒に対するマッチング 現在: テキトーな範囲でブツ切りに なった⼊⼒・出⼒が渡る イテレータに対する正規表現マッチが 必要 boost::regex を使う?
  35. 35. 宣伝
  36. 36. KeySnail 初期化ファイル(.keysnail.js) によるカスタマイズ キルリング anything.el 的な何か プラグインシステム M-x

×