Rios::Proxy - A framework for CLI
-
Upload
masafumi-oyamada -
Category
Technology
-
view
3.884 -
download
2
description
Transcript of Rios::Proxy - A framework for CLI
Rios::ProxyA proxy framework for CLI
id: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.
[cited from `KeySnail Wiki']
宣伝終
突然ですが
最近 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.newproxy.on_output do |s| s.gsub(/foo/, "bar")endproxy.listen
簡易版
require "rios/easy"on_output do |s| s.gsub(/foo/, "bar")endlisten
出⼒へのフック
proxy.on_output do |s| # アプリケーションの出⼒が⽂字列 s として渡る # 返り値: # ⽂字列 -> 出⼒をその⽂字列に書き換え # 空⽂字列 -> その出⼒をキャンセル # nil -> 何もしないend
⼊⼒へのフック
proxy.on_input do |s| # ユーザの⼊⼒が⽂字列 s として渡る # 返り値: # ⽂字列 -> ⼊⼒をその⽂字列に書き換え # 空⽂字列 -> その⼊⼒をキャンセル # nil -> 何もしないend
⼊⼒のエミュレーション以下のようにすると,ユーザが rm -rf / と打ち込み Enter を押したことになる
proxy.input("rm -rf /\n")
プロキシ対象プロキシ対象のアプリケーションは Proxy#listen への引数で指定
プロキシ対象::デフォルト
# 省略すると ENV["SHELL"] が用いられるproxy.listen
プロキシ対象::任意のコマンド
# 配列を渡すと,そのコマンドが exec 経由で実⾏されるproxy.listen(["ssh", "[email protected]"])
プロキシ対象::ブロック
proxy.listen do || # ブロックを渡すと,そのブロック内部がプロキシ対象となるend
応用自動テスト
柔軟な expect として
端末の録画 (script, ttyrec)
キーバインド変更ツール
キーロガー
課題⼊⼒に対するマッチング
現在: テキトーな範囲でブツ切りになった⼊⼒・出⼒が渡る
イテレータに対する正規表現マッチが必要
boost::regex を使う?
宣伝
KeySnail初期化ファイル(.keysnail.js)によるカスタマイズ
キルリング
anything.el 的な何か
プラグインシステム
M-x