Rios::Proxy - A framework for CLI

36
Rios::Proxy A proxy framework for CLI id:mooz / @stillpedant

description

Rios is a proxy framework which works as a proxyfor command line applications and allows developer to hook input/outputof the applications in a blazingly simple way.See https://github.com/mooz/rios for details.

Transcript of Rios::Proxy - A framework for CLI

Page 1: Rios::Proxy - A framework for CLI

Rios::ProxyA proxy framework for CLI

id:mooz / @stillpedant

Page 2: Rios::Proxy - A framework for CLI

自⼰紹介名前

id:mooz

@stillpedant

よく書いていたものFirefox のアドオン

Emacs Lisp

Python

Ruby は親戚とのつきあい程度

Page 3: Rios::Proxy - A framework for CLI

宣伝

Page 4: Rios::Proxy - A framework for CLI

Emacsは好きですか?

Page 5: Rios::Proxy - A framework for CLI

→Yes

Page 6: Rios::Proxy - A framework for CLI

Firefoxは好きですか?

Page 7: Rios::Proxy - A framework for CLI

→Yes

Page 8: Rios::Proxy - A framework for CLI

朗報

Page 9: Rios::Proxy - A framework for CLI

KeySnailあなたのFirefox,Emacsにしてみませんか?

For Vim users, there is Vimperator. For Emacs users, there is KeySnail.

[cited from `KeySnail Wiki']

Page 10: Rios::Proxy - A framework for CLI

宣伝終

Page 11: Rios::Proxy - A framework for CLI

突然ですが

Page 12: Rios::Proxy - A framework for CLI

最近 CLI にハマっております

Page 13: Rios::Proxy - A framework for CLI

CLI?× Common Language Infrastructure

○ Command Line Interface

Page 14: Rios::Proxy - A framework for CLI

変遷

CLI

Hello World! 期

GUI

GTK+ 期

GUI

Web (XUL, HTML, Canvas, ...) 期

CLI←今ココ

Page 15: Rios::Proxy - A framework for CLI

インタラクティブCLIユーザがキーを⼊⼒するたびにアプリケーションが反応(Enterを待たない)

画⾯が下に流れていかない

例Emacs / Vim

zsh

GNU readline

Page 16: Rios::Proxy - A framework for CLI

実現方法エスケープシーケンスを駆使

ioctl(2)

#include <termios.h>

curses

Page 17: Rios::Proxy - A framework for CLI

問題

Page 18: Rios::Proxy - A framework for CLI

テストが難しいテストには以下が必要

プログラムへ⼊⼒を⾏なう

プログラムからの出⼒をチェックする

どうやって⽂字列を⼊⼒として渡す?

どうやって出⼒を⽂字列として取得する?

Page 19: Rios::Proxy - A framework for CLI

⼈⼒

Page 20: Rios::Proxy - A framework for CLI

Page 21: Rios::Proxy - A framework for CLI

自動化したい

Page 22: Rios::Proxy - A framework for CLI

Rios::Proxy

gem install rios

アプリケーションのコマンドライン⼊⼒と出⼒にフック

出⼒のチェック・書き換え

⼊⼒のエミュレーション・書き換え

フック内容は Ruby で記述

Page 23: Rios::Proxy - A framework for CLI

動作イメージ

Page 24: Rios::Proxy - A framework for CLI

使い方

require "rios/proxy"proxy = Rios::Proxy.newproxy.on_output do |s| s.gsub(/foo/, "bar")endproxy.listen

Page 25: Rios::Proxy - A framework for CLI

簡易版

require "rios/easy"on_output do |s| s.gsub(/foo/, "bar")endlisten

Page 26: Rios::Proxy - A framework for CLI

出⼒へのフック

proxy.on_output do |s| # アプリケーションの出⼒が⽂字列 s として渡る # 返り値: # ⽂字列 -> 出⼒をその⽂字列に書き換え # 空⽂字列 -> その出⼒をキャンセル # nil -> 何もしないend

Page 27: Rios::Proxy - A framework for CLI

⼊⼒へのフック

proxy.on_input do |s| # ユーザの⼊⼒が⽂字列 s として渡る # 返り値: # ⽂字列 -> ⼊⼒をその⽂字列に書き換え # 空⽂字列 -> その⼊⼒をキャンセル # nil -> 何もしないend

Page 28: Rios::Proxy - A framework for CLI

⼊⼒のエミュレーション以下のようにすると,ユーザが rm -rf / と打ち込み Enter を押したことになる

proxy.input("rm -rf /\n")

Page 29: Rios::Proxy - A framework for CLI

プロキシ対象プロキシ対象のアプリケーションは Proxy#listen への引数で指定

Page 30: Rios::Proxy - A framework for CLI

プロキシ対象::デフォルト

# 省略すると ENV["SHELL"] が用いられるproxy.listen

Page 31: Rios::Proxy - A framework for CLI

プロキシ対象::任意のコマンド

# 配列を渡すと,そのコマンドが exec 経由で実⾏されるproxy.listen(["ssh", "[email protected]"])

Page 32: Rios::Proxy - A framework for CLI

プロキシ対象::ブロック

proxy.listen do || # ブロックを渡すと,そのブロック内部がプロキシ対象となるend

Page 33: Rios::Proxy - A framework for CLI

応用自動テスト

柔軟な expect として

端末の録画 (script, ttyrec)

キーバインド変更ツール

キーロガー

Page 34: Rios::Proxy - A framework for CLI

課題⼊⼒に対するマッチング

現在: テキトーな範囲でブツ切りになった⼊⼒・出⼒が渡る

イテレータに対する正規表現マッチが必要

boost::regex を使う?

Page 35: Rios::Proxy - A framework for CLI

宣伝

Page 36: Rios::Proxy - A framework for CLI

KeySnail初期化ファイル(.keysnail.js)によるカスタマイズ

キルリング

anything.el 的な何か

プラグインシステム

M-x