head first readline

44
インタフェースの Sansan 株式会社さまオフィス (株) 永和システムマネジメント アジャイル事業部 Ruby x Agile グループ 伊藤 浩一 (@koic) 2015.05.15 (Fri ) Ruby合同勉強会@ Sansan From IDE to Terminal こころ Head First Readline

Upload: koichi-ito

Post on 02-Aug-2015

2.583 views

Category:

Engineering


1 download

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 ページより抜粋

“GUIが使えない場合はシェルを使う。

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.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 インターフェイス実装は、責務を果たせない場合にそれを呼び出し元に伝えねばならない

驚き最小の 原則

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

See you later, in the Ruby community.

https://www.facebook.com/photo.php?fbid=819944131416418&set=p.819944131416418