インタフェースの
Sansan株式会社さまオフィス
(株) 永和システムマネジメント
アジャイル事業部
Ruby x Agile グループ
伊藤 浩一 (@koic)
2015.05.15 (Fri)
Ruby合同勉強会@Sansan
From IDE to Terminal
こころHead First Readline
http://www.ruby.or.jp/ja/news/20150326_2.html
Computer programmer, guitarist.
Leader of an Agile software development team
at Eiwa System Management, Inc.
Lives in Shinjuku.
@koic photo token by @NaCl
COMING SOON!	

http://agile.esm.co.jp/cases/sansan.html にて公開予定
今日の話
GUIのメリットはYSIWYG̶What You
See Is What You Get (見たとおりのも
のが結果を得られる) ーというものです。そ
してデメリットはWYSIAYGーWhat You
See Is All You Get (見たとおり以上のも
のは得られない) ーなのです。
21. コマンド・シェルの力を使うこと
『達人プログラマー』78 ページより抜粋
GUIが使えない場合
はシェルを使う。
「黒い画面」の異名で有名
入力インタフェースと
実装インタフェース話
http://ja.wikipedia.org/wiki/GNU_readline
•#1 入力インタフェース
•#2 Ruby標準ライブラリ
•#3 異言語バインディング
Readlineの歩き方
#1
•#1 入力インタフェース
•#2 Ruby標準ライブラリ
•#3 異言語バインディング
Readlineの歩き方
• 人とコンピュータのインタフェース
• 考えるために考えない by @mtsmfm
• 「思考の速さで入力する」
• キーバインディング重要、ショートカット重要
• 如何に指の筋肉運動を変えずに操作するか?
• コマンドラインに限らず、Readline のインタフェー
スで操作できるアプリケーションがさりげなくある
入力デバイスの重要性
https://speakerdeck.com/mtsmfm/find-your-favorite-tools?slide=26
• Ctrl+a (行頭へ移動)
• Ctrl+e (行末へ移動)
• Ctrl+f (1文字進む)
• Ctrl+b (1文字戻る)
• Ctrl+p (入力履歴を戻る)
• Ctrl+n (入力履歴を進める)
• Ctrl+h (現直前の文字削除)
• Ctrl+l (画面をクリアする)
私がターミナルでよく使う行内編集
• Ctrl+r (入力履歴から補完)
• Meta+f (1ワード進む)
• Meta+b (1ワード戻る)
• 入力中のCtrl+d (現位置削除)
• Ctrl+k (現位置以降を行末ま
で削除してバッファへ)
• Ctrl+y (バッファを貼付ける)
ほかにあったかな?
ショートカット
は早く覚えた
分効果も高い
https://twitter.com/koic/status/18370534918
ちなみにデフォルト
ではEmacsという
エディタの操作らし
いですよ (ステマ)
#2
•#1 入力インタフェース
•#2 Ruby標準ライブラリ
•#3 異言語バインディング
Readlineの歩き方
http://docs.ruby-lang.org/ja/2.2.0/library
http://docs.ruby-lang.org/ja/2.2.0/class/Readline.html
https://github.com/koic/acappella/commit/bbebaa99cea88c1559e683a8739112ed08977187?diff=split
#3
•#1 入力インタフェース
•#2 Ruby標準ライブラリ
•#3 異言語バインディング
Readlineの歩き方
異世界を繋げる
バインディング
インタフェース
https://github.com/ruby/ruby/blob/ruby_2_2/ext/readline/readline.c
ruby.h
readline.c
C言語による拡張実装の世界
Client Readline
<<ruby>>
Rubyの世界
C言語実装をRubyのインタフェース実装で使えるようにアダプタされてる
Readlineの作り概要
※1…readline.hは環境により互換実装editlineが使われる
※2…ruby.h直接ではなくinternal.h経由で読んでる
(internal.hは外に使わせないヘッダっぽい。理解が足らず)
readline/
readline.h
<<readline>>
ロードパスに含まれた.rbに継ぎ
.so, .bundle, .dllを読む
ビルドによる越境
※1
※2
世界を渡る
時の決め事
http://ja.wikipedia.org/wiki/%E5%A4%A7%E8%88%AA%E6%B5%B7%E6%99%82%E4%BB%A3#/media/File:CantinoPlanisphere.png
Cの変数には型があり,データには
型がありません.(中略) 逆にRuby
の変数には型がなく,データに型が
あります.この違いのため,Cと
Rubyは相互に変換しなければ,お
互いのデータをアクセスできません.
https://github.com/ruby/ruby/blob/trunk/doc/extension.ja.rdoc
• 用途
• 既存のC言語ライブラリを使いたいとき
• 開発速度を犠牲にしても実行速度を得たいとき
• RubyのAPIの知識、考え方を流用可能 (呼び出し方はC言語の流
儀に乗る)
• メモリ管理をRubyの処理系に任せられたり、そうじゃなかったり
• Rubyの拡張を C言語で書くなら、こうあって欲しいのインタ
フェースになっている
C言語による拡張
readline.c
https://github.com/ruby/ruby/blob/ruby_2_2/ext/readline/readline.c#L1800
• void Init_readline(void) がライブラリ定義のエン
トリ
• Rubyは拡張ライブラリをロードする時に「Init_ラ
イブラリ名」という関数を自動的に実行します (中略)
この関数の中でクラス,モジュール,メソッド,定数
などの 定義を行います.
• 組み込みライブラリの String であれば、string.c
に void Init_string(void) という具合になっている
ライブラリ定義の入り口
https://github.com/ruby/ruby/blob/ruby_2_2/ext/readline/readline.c#L1800
(extension.ja.rdoc より抜粋)
モジュール定義
https://github.com/ruby/ruby/blob/ruby_2_2/ext/readline/readline.c#L1828
https://gist.github.com/koic/cf46eccf3cc6e7c066fe
C言語の関数でありながら
Rubyのインタフェースに
置き換えて考えられる
• メソッド名と実装の関数を紐付ける
インターフェイスの三原則
『インターフェイス指向設計』15 ページより抜粋
• 原則1 インターフェイス実装は、そのメソッ
ド名が示す通りの処理をしなければならない
• 原則2 インターフェイス実装は他に危害を加
えてはならない
• 原則3 インターフェイス実装は、責務を果た
せない場合にそれを呼び出し元に伝えねばな
らない
驚き最小の
原則
Principle of Least Surprises
Rubyに慣れた人にとっての
(入り口は><)
Ruby拡張ライブラリ
流儀
C言語で構成されたフレームワークの世界
郷に入っては郷に従え
TO
 BE
 CONTINUED
予習復習研究はこちら
http://www.amazon.co.jp/dp/4274066428
プログラミングRuby 第2版 言語編
Rubyのしくみ
-Ruby Under a Microscope-
http://www.amazon.co.jp/dp/4274050653
Rubyソースコード完全解説
http://www.amazon.co.jp/dp/4844317210
青木 峰郎 (著), まつもと ゆきひろ (監修)
Dave Thomas (著), Chad Fowler (著), Andy Hunt (著),
田和 勝 (翻訳), まつもと ゆきひろ (翻訳)
Pat Shaughnessy (著), 島田 浩二 (翻訳), 角谷 信太郎 (翻訳)
おわりに
http://fkino.net/20150225.html

インタフェースのこころ