2016 Ruby
Table of Contents
ホーム / 講義 / ruby / OO / poker開発 / emacs / meta-ruby / note / github-repos / svn-repos 2015 /
1 ruby 情報
2 ruby入門
2.1 2016
初回に, 20分ではじめるRuby を先ず読み,やってみましょう。
次に,2~3回かけて,とほほのRuby入門 をやり ましょう。
2.2 2015
ビギナーのためのRubyプログラミング入門 をやりましょう
内容 [1/10]
[X]
Rubyを使ってみよう!
まずは、Rubyをインストールして利用できるようにしてみましょう。そし て実際にRubyのスクリプトを動かすところまでやってみましょう。
[ ]
基本的な構文を覚えよう 制御構造 (Ruby 2.0.0)
プログラミング言語には、プログラムの流れを制御するための構文が用意 されています。基本的な構文の使い方をまとめて覚えましょう。
[ ]
多数の値をまとめて管理するのが「配列」です。この配列の値を名前で管 理できるようにしたものが「ハッシュ(連想配列)」です。これらの基本 的な使い方について説明します。
[ ]
構造化からオブジェクトへ!
Rubyでは、スクリプトを整理し、構造的にまとめていくための仕組みが用 意されています。これは、突き詰めれば、プログラムを「オブジェクト」 というものとして作成する考え方へとつながっていきます。この「オブジェ クト」に至るまでの考え方についてここで説明していきましょう。
[ ]
オブジェクトを更に極める!
オブジェクトというものの働きや使い方を知ることは、Rubyを使い込んで いくためには避けて通れない道です。今回も更にオブジェクトというもの について説明を続けて行きましょう。今回のキーワードは「アクセサ」 「クラスメソッド」「継承」といったものです。
[ ]
日時とTimeクラス
日時を扱うために用意されているのが「Time」というクラスです。このク ラスには、日時の表現はもちろん、日時を使った計算やさまざまなフォー マットによる出力などのメソッドが一通り揃っています。これらの基本的 な使い方についてマスターしましょう。
[ ]
テキスト(Stringクラス)の基本操作
テキストの値を扱う「String」クラスには、テキスト操作のためのさまざ まなメソッドが用意されています。それらの中から主なものをピックアッ プして使い方を説明しましょう。
[ ]
テキストファイルのアクセス
Rubyでは、テキストファイルに簡単にアクセスすることができます。テキ ストファイル利用の基本を覚えて、データの読み書きの基本について説明 をしましょう。
[ ]
CSVファイル・アクセス
CSVファイルは、データベースなどの多数の値からなるデータを保存するの に用いられるテキストファイルです。Rubyには、これを利用するための専 用機能がいろいろと用意されています。CSVの利用をマスターしてデータ管 理を行いましょう。
[ ]
ERBによるWebアプリケーション開発
Rubyには「ERB」と呼ばれる、HTMLの中にRubyのスクリプトを埋め込んで実 行する技術があります。これを使えば、簡単にRubyを使ったWebアプリケー ションが作れるのです。その基本的な使い方を覚えましょう。
2.3 その他の入門
てっとり早く全貌を掴むには,
プログラミングしながら
- ミニツク - Rubyのe-ラーニング研修システム
- Ruby入門 (全23回) - プログラミングならドットインストール 一話2〜3分でまあ聴きやすい
- rubymonk
- 若手エンジニア/初心者のためのRuby 2.1入門 最新記事一覧 - ITmedia Keywords https://www.atmarkit.co.jp/ait/kw/ruby_nyumon.html
3 ruby 環境作り
3.1 rbenv/gem/bundler
rbenv
- 個人毎に用意できる ruby の環境
- ~/.rbenv/ の配下にバージョンごとに
- ~/.rbenv/shims/ の配下にえらんだバージョンのバイナリへのリンクが ある
自前で rbenv+ruby-build をインストール
古いLinuxでも,最新の ruby が使えるように。
rbenv を利用した Ruby 環境の構築 | Developers.IO
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile echo 'eval "$(rbenv init -)"' >> ~/.bash_profile source ~/.bash_profile rbenv --version
rubyのインストール
Ruby開発環境の準備+rbenvの使い方 - TASK NOTES
- 前半はMacOSX用の記述ですが,rbenvインストール後は,そのまま使え ます。
# [~/] rbenv install --list # インストール可な ruby を表示
最新の安定版を入れましょう:
rbenv install 2.3.0-dev # rbenv global 2.3.0-dev # rbenv init # シェルの設定
インストールされたことを確かめましょう:
which ruby # ruby インタプリター which gem # ruby パッケージ管理コマンド which irb # 対話型 ruby インタプリター
.bashrc に下記のコマンドを付け加えましょう:
eval "$(rbenv init -)"
gem – ruby のパッケージ管理
bundler
この講義では使いませんが,一応紹介です:
3.2 pry
pry は irb に替わる対話型インタプリタです。デバッガとして使えます。
- Ruby - 今更聞けないpryの使い方と便利プラグイン集 - Qiita https://qiita.com/k0kubun/items/b118e9ccaef8707c4d9f
- 第3回 Pry ~IRBをより見やすく、より便利に~ https://www.school.ctc-g.co.jp/columns/masuidrive/masuidrive03.html
- Rubyistよ、irbを捨ててPryを使おう - TIM Labs https://labs.timedia.co.jp/2011/12/rubyist-should-use-pry.html
- Emacs×Ruby - PryをEmacsで使ってみる - https://rubikitch.com/%E3%81%AB%E7%A7%BB%E8%BB%A2%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F
https://d.hatena.ne.jp/rubikitch/20140627/pry
- emacs で run-ruby で pry が動きだし,いろいろ便利に使えます。
4 ruby におけるプログラムの実行のまとめ
4.1 プログラム
self とクラス
- 自分 (self) は,あるクラスから生まれたオブジェクトである
- 自分 (self) は,コード (ブロック) を実行する
リテラル
オブジェクトを表す文字列.そのオブジェクトが評価値.
変数
オブジェクトの名前, 束縛を持ち,その値が評価値
- ブロックが持つブロックローカル変数
- オブジェクトがもつインスタンス変数
- クラスが持つクラス変数,定数
メッセージパッシング式
obj.msg(*args)
- オブジェクト obj に文字列 msg とオブジェクト列を(引数として)渡す
- msg は操作を表し、その意味は obj によって決まる
- obj が組み込みオブジェクトになると計算され結果のオブジェクトとな る
- 評価値は上記を再帰的に行うことで計算される
メソッドとクラス
メソッドはクラスに属し, クラスは継承でき, 継承したクラスのメソッドも利用できる
文と制御
- begin … end
- rescue, ensure
- retry, raise
- if, unless, case
- while, until, for
- break, next, redo, retry
- def, alias, undef
スコープの切り替え
class C end def m() end { ... }
5 rubyあれこれ
5.1 オブジェクトとメソッド呼び出し
メソッド呼び出しができるのは実体 (オブジェクト)中のブロック
オブジェクト中の実行の場 (ブロック) は二ヶ所
- self のトップレベルブロック
- 実行中のメソッドブロック
5.2 String.newで起こること
Class
- Class オブジェクトだけは,オブジェクトを生み出せる (特異) new メソッドをもつ
- Class オブジェクトは,継承できる
- Class オブジェクトを,継承したオブジェクトをクラスとする
- Class はクラスである
String は Class を継承して生まれているので,new メソッドが実行できる
String オブジェクトが new を実行する
- String クラスのインスタンスを生成し,selfとする
- self.initialize を実行する
- self を返す
5.3 オブジェクトとクラスとモジュール
オブジェクト
- メッセージのレシーバとなり,メソッドの実行ができる
- 独自の状態を持てる
モジュール < オブジェクト
- 独自の名前空間を持つ 名前の定義
クラス < モジュール
- オブジェクトの性質を継承 (レシーバ)
- モジュールの性質を継承 (名前空間)
- クラスに特有なメソッドを持つ (オブジェクトの生成,子クラスの生成)
[1,2,3].each { return 1}
[1,2,3].each { break }
def m [1,2,3].each { return 1} end
def m [1,2,3].each { break } end
5.4 クロージャ
- クロージャ
- コードと環境の組み
- コード
- 名前を使った一連の操作
- 環境
- 名前に対して値を与える
- 名前
- メソッド名,局所変数,インスタンス変数、クラス変数、グ ローバル変数, 定数
self, class, module構造 はクロージャには閉じこめられない?
5.5 フレーム
- メソッド呼び出しを実行する環境
- ブロックはフレーム内で実行される(と思う)
- Procとlambda で,違うのは所属するフレーム
6 rubyは生産性が高い?
- ruby を仕事で使おう https://itpro.nikkeibp.co.jp/article/COLUMN/20060921/248715/
上記記事への批評 https://d.hatena.ne.jp/fromdusktildawn/20061002/1159784863
上記記事への ((s-:)) の考え
- できるかどうかじゃなくて,そのやり方の「抽象化」が問題なんだよ ね.原則が問題となる.原則がメタのやり方の源.
- Scheme なら原則はシンプルで,何でもできる.が,自由すぎるのが問題 視される.僕は好きだけど.
- Ruby の原則もシンプル.オブジェクト指向の枠組みの中で自由さが得 られる純粋で少ない原則を持つ.
- Scheme のRS で言っている,少ない原則で無限の拡張性を得ること. それがメタプログラミングの原則.
- メタプログラミングのやり方は,言語の原則で決まる. じゃ,メタメタプログラミングは? リフレクティブな手法のすべては, 結局言語の原則に依る.
- 手続き型言語で最もシンプルな原則の言語は,Scheme.
- 手続き型言語にオブジェクト指向原則を入れて最もシンプルな原則を 持つ言語が,Ruby. (だと信じている)
ちょっと毛色が変わるけど,実行プロセスが扱えるかと言うのもメタで 本質的.対象とできるかということ.言語レベルとは違うメタレベルを 手に入れられる.
これに関しては,Scheme が最もシンプルでキレイ.
Ruby はオブジェクト指向の枠組みで,最もシンプルでキレイ(と信ず る).
- IPA java https://www.ipa.go.jp/software/open/ossc/download/Model_Curriculum_E1_Guidance_4_1_1.pdf
7 pry
7.1 what is pry?
- what
- irbの代替,デバッグ
- links
7.2 Rubyistよ、irbを捨ててPryを使おう
起動
$ pry [1] pry(main)> [2] pry(main)> ->n{ i=0;j=1;n.times{j=i+i=j};i }.call(10) => 55 [3] pry(main)> def foo [3] pry(main)* ^
shellとの統合
Pryはshellと統合し、shellのコマンドをPryコンソール上で実行できます。 ただ、コマンドの前に'.'を付けて実行します。
[1] pry(main)> .ls [2] pry(main)> .pwd [3] pry(main)> .git log --pretty=oneline [4] pry(main)> x = "class Hoge" [5] pry(main)> .find . -name "*.rb" | xargs grep #{x}
組み込みコマンドのshell-modeを使うと、
- プロンプトにカレントディレクトリが表示され、
- tabキーでディレクトリ名を補完できるようになり、
- よりファイル操作が簡単になります。
[6] pry(main)> shell-mode pry main:/Users/yoppi $ shell-mode [8] pry(main)>
shell-modeを抜けるには、再度shell-modeコマンドを実行します。
組み込みコマンド
[1] pry(main)> help
以下に便利な組み込みコマンドの一部を紹介します。
- hist
- Pryコンソールで評価した過去の式の一覧を確認できます
- ls
- 現在のフレームで有効なオブジェクトを表示します。'デバッガとして使う'で詳しく紹介します
- gem-install、gem-list
- Pryコンソール上でgemをインストールしたり、gemの一覧を確認できます
- gist-method
- gemのgistをさらにラップしたものが使えます
- shell-mode
- Pryからシームレスにファイルにアクセスでき、Pryからファイルを操作したい場合はshell-modeになると便利です
- !
- Pryで評価しているフレームをリセットします
- ri
- riコマンドをPry上で実行します
- show-doc
- 対象メソッドのドキュメントを表示します
- show-method
- 対象メソッドの実装表示します
オブジェクトを調査する
Pry独自の概念として、オブジェクト間を移動できます。 デバッガのフレー ムに似ています。 lsコマンドで現在のオブジェクトの一覧を表示し、cdコ マンドでそのオブジェクトに移動できます。
[1] pry(main)> a = "foo" [2] pry(main)> ls locals: _ _dir_ _ex_ _file_ _in_ _out_ _pry_ a version [3] pry(main)> cd a [4] pry("foo"):1> nesting Nesting status: -- 0. main (Pry top level) 1. "foo" [5] pry("foo"):1> ls Comparable methods: < <= > >= between? String methods: ... [6] pry("foo"):1> upcase => "FOO"
深くネストしたオブジェクトの調査もcdして潜っていける
簡易デバッガとして使う
適当な箇所に次のコードを差し込みましょう。
binding.pry binding.pry if expression
ここがブレークポイントになり、Pryコンソールが立ち上がりま す。
停止した時点で評価されたオブジェクトにアクセスできるので、デバッグを 自由に進められます。 ステップ実行したければ、binding.pryを停止させた い箇所に埋め込みましょう。
普通のRubyアプリケーションであれば、edit-methodコマンドで現在のメソッ ド名を指定することでそのメソッドを編集でき、また、直接エディタで編集 した場合reload-methodで読み込みなおすとstep実行できます。
7.3 ドキュメントに素早く参照できる
show-method、stat等のコマンドが用意されています。 また、シェル経由で riコマンドをそのまま使用できます。 VimやEmacs使い達は、それぞれのエ ディタ上で素早くドキュメントを牽けるようにしているはずですが、irbで 作業しているときには牽けません。 Pryではこれらの組み込みコマンドが提 供されていることで、素早くドキュメントにアクセスできます
[1] pry(main)> ri Array#sample [2] pry(main)> require 'pathname' [3] pry(main)> show-doc Pathname#children
gemやCの実装も読める
さて、Rubyのオブジェクトに対してメソッドを呼び出すわけですが、そのオ ブジェクトがどう実装されているか気になるときがあります。 特に、gemラ イブラリを使っているときに、APIがどんなことをしているのか素早く知り たいわけです。
[4] pry(main)> require 'nokogiri' [5] pry(main)> show-method Nokogiri::HTML::Document.parse From: /Users/yoppi/opt/local/ruby/ruby-1.9.3-p0/lib/ruby/gems/1.9.1/gems/nokogiri-1.4.4/lib/nokogiri/html/document.rb @ line 64: Number of lines: 22 Owner: #<Class:Nokogiri::HTML::Document> Visibility: public def parse string_or_io, url = nil, encoding = nil, options = XML::ParseOptions::DEFAULT_HTML ...
また、Rubyの組み込みライブラリはCで実装されています。 よくRubyiest達 はCで実装しているコードを眺めて、実装を楽しんだり、もっと改善できる ところはなかな? と考えるときがあります。 Pryなら簡単に該当する組み込 みライブラリのCのコードを読めます。 Cのコードを読むには、pry-docをイ ンストールしておく必要があります。 たとえば、Array#sampleは同様に
[6] pry(main)> show-method Array#sample static VALUE rb_ary_sample(int argc, VALUE *argv, VALUE ary) { VALUE nv, result, *ptr; long n, len, i, j, k, idx[10]; ...
と、show-methodコマンドで牽くだけです。 これでC実装を素早く読めるの で今まで実装を読まなかった人も読むようになり、Rubyの開発も活発になり そうです。 大変便利ですね。
7.4 https://github.com/pry/pry
ls - change scope
ls [-m|-M|-p|-pM] [-q|-v] [-c|-i] [Object] ls [-g] [-l]
-m, --methods Show public methods defined on the Object (default) -M, --module Show methods defined in a Module or Class -p, --ppp Show public, protected (in yellow) and private (in green) methods -q, --quiet Show only methods defined on object.singleton_class and object.class -v, --verbose Show methods and constants on all super-classes (ignores Pry.config.ls.ceiling) -g, --globals Show global variables, including those builtin to Ruby (in cyan) -l, --locals Show locals, including those provided by Pry (in red) -c, --constants Show constants, highlighting classes (in blue), and exceptions (in purple) -i, --ivars Show instance variables (in blue) and class variables (in bright blue) -G, --grep Filter output by regular expression -h, --help Show help
find-method
nesting – seeing the nested context
jump-to
switch-to
7.5 今更聞けないpryの使い方と便利プラグイン集
info
site: Ruby - 今更聞けないpryの使い方と便利プラグイン集 - Qiita
linked_from: pryに関する73件の投稿 - Qiita
pryが何であるかが書かれていない
Ruby のデバッガ
meta-ruby講義での,pryの実践的な紹介のため
最低限の使い方
まだpryを使ったことがない人はこれだけ知ってれば十分な気がする。
binding.pryで任意の場所からREPLを立ち上げる
ソースの任意の箇所にbinding.pryを書いてRubyのプログラムを走らせると、実行中にその行でストップしてpryのREPLが立 ち上がり、その環境での変数がどうなっているかなどが参照できる。 アプリが原因不明のエラーを出している時、落ちている直前にbinding.pryを挟んで原因を調査したり、テストが落ちている原 因の特定などに便利。
pry標準の機能
pryの便利な機能をよく使いそうな順に紹介する。
?, show-doc, ri, $, show-method
?やshow-docを使うとドキュメントやソースコードを見ることができる。
riはriコマンドを実行する。
$やshow-methodを使うとメソッドの定義を見ることができる。
edit
今はまだどこにソースがあるかがわからないところにbinding.pryを貼りたいことがある。 editを使うとpryで定義場所を調べたあとエディタでそれを開くみたいなコストが減らせる。 あとは周辺をそのまま読みたいときにも便利。
エディタは$EDITORをいじるか.pryrcにPry.editor = 'vim'とか書けば変えられる。
cd, ls, Tab補完
pryも普通のシェルと同じようにcd, lsやタブキーによる補完がある。 cdを使うとコンテキストを移動できる。上の画像ではmainからAcitveRecord::RelationやArelの内側に入っている。
lsは現在のコンテキストにおけるメソッドや変数の一覧が見れる。 メソッドの一覧だけ見たいときはls -m。ls –grepで絞込ができる。
exit!, !!!, exit-program, disable-pry, edit -m
何度も呼ばれるメソッドやループの内側にbinding.pryを書いて何度もブレークして困った事がある人は多いと思う。 一番楽で乱暴な方法はexit!, !!!, exit-programでプロセスを終了してしまうことである。でもこれだと例えばrails s上でやると rails sが落ちる。 disable-pryは以降pryが完全に無効になるのでプロセスは死なないけど、以降binding.pryが使えなくなる。
多分一番健全な方法は、ちょっと面倒だけどedit -mで現在のメソッドからbinding.pryを取り除くことだと思う。
.とshell-mode
「.」で始めると以降をシェルのコマンド入力として受け付ける。画像のように#{}の式展開が使える。 shell-modeを使うとカレントディレクトリを表示してくれるのと、ファイル名補完が有効になる。
help
単にRubyの式を評価するだけでなく、pryには独自のコマンドが存在する。その全リストをhelpコマンドで確認することがで きる。 セクションごとに分けて表示してくれるので、例えばpry-railsプラグイン特有の機能のリストを見たいときなどに役に立つ。
各コマンドは-h(–help)をつけると使い方を見ることができる。 余力がある人はhist, find-method, whereami(@), nesting あたりは見ておくと良いと思う。
便利なプラグイン (pry関連プラグイン)
個人的には以下の3つだけ知ってれば十分だと思う
pry-byebug
古代のRuby向けに作られたpry-navとpry-debuggerの後継がpry-byebug。 ステップ実行など、デバッガとしてちゃんとpryを使いたい場合はこれが必要になる。
以下のコマンドだけ覚えておけば良い。
コマンド 操作 step メソッドの内部に入る next 現在のメソッド内で1行進める finish 現在のメソッドを抜ける continue デバッグを抜ける
pry-stack_explorer
show-stackしてスタックのリストを出しframe [数字]とやると任意のスタックにコンテキストを移動できる。