head first readline
TRANSCRIPT
インタフェースの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 ページより抜粋
• 人とコンピュータのインタフェース
• “考えるために考えない” 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 (バッファを貼付ける)
ほかにあったかな?
http://docs.ruby-lang.org/ja/2.2.0/class/Readline.html
https://github.com/koic/acappella/commit/bbebaa99cea88c1559e683a8739112ed08977187?diff=split
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.chttps://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 インターフェイス実装は、責務を果たせない場合にそれを呼び出し元に伝えねばならない
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 (著), 島田 浩二 (翻訳), 角谷 信太郎 (翻訳)
See you later, in the Ruby community.
https://www.facebook.com/photo.php?fbid=819944131416418&set=p.819944131416418