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

内容 [1/10]

  1. [X]

    Rubyを使ってみよう!

    まずは、Rubyをインストールして利用できるようにしてみましょう。そし て実際にRubyのスクリプトを動かすところまでやってみましょう。

  2. [ ]

    基本的な構文を覚えよう 制御構造 (Ruby 2.0.0)

    プログラミング言語には、プログラムの流れを制御するための構文が用意 されています。基本的な構文の使い方をまとめて覚えましょう。

  3. [ ]

    配列とハッシュ:ビギナーのためのRubyプログラミング入門

    多数の値をまとめて管理するのが「配列」です。この配列の値を名前で管 理できるようにしたものが「ハッシュ(連想配列)」です。これらの基本 的な使い方について説明します。

  4. [ ]

    構造化からオブジェクトへ!

    Rubyでは、スクリプトを整理し、構造的にまとめていくための仕組みが用 意されています。これは、突き詰めれば、プログラムを「オブジェクト」 というものとして作成する考え方へとつながっていきます。この「オブジェ クト」に至るまでの考え方についてここで説明していきましょう。

  5. [ ]

    オブジェクトを更に極める!

    オブジェクトというものの働きや使い方を知ることは、Rubyを使い込んで いくためには避けて通れない道です。今回も更にオブジェクトというもの について説明を続けて行きましょう。今回のキーワードは「アクセサ」 「クラスメソッド」「継承」といったものです。

  6. [ ]

    日時とTimeクラス

    日時を扱うために用意されているのが「Time」というクラスです。このク ラスには、日時の表現はもちろん、日時を使った計算やさまざまなフォー マットによる出力などのメソッドが一通り揃っています。これらの基本的 な使い方についてマスターしましょう。

  7. [ ]

    テキスト(Stringクラス)の基本操作

    テキストの値を扱う「String」クラスには、テキスト操作のためのさまざ まなメソッドが用意されています。それらの中から主なものをピックアッ プして使い方を説明しましょう。

  8. [ ]

    テキストファイルのアクセス

    Rubyでは、テキストファイルに簡単にアクセスすることができます。テキ ストファイル利用の基本を覚えて、データの読み書きの基本について説明 をしましょう。

  9. [ ]

    CSVファイル・アクセス

    CSVファイルは、データベースなどの多数の値からなるデータを保存するの に用いられるテキストファイルです。Rubyには、これを利用するための専 用機能がいろいろと用意されています。CSVの利用をマスターしてデータ管 理を行いましょう。

  10. [ ]

    ERBによるWebアプリケーション開発

    Rubyには「ERB」と呼ばれる、HTMLの中にRubyのスクリプトを埋め込んで実 行する技術があります。これを使えば、簡単にRubyを使ったWebアプリケー ションが作れるのです。その基本的な使い方を覚えましょう。

2.3 その他の入門

てっとり早く全貌を掴むには,

プログラミングしながら

3 ruby 環境作り

自分用の ruby の環境を作りましょう。

ruby のための emacs の設定については,emacsの設定 ((@cis.org @s.org))

3.1 rbenv/gem/bundler

rbenv

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 のパッケージ管理

RubyGems (gem) の使い方・インストール方法

gemを使ってパッケージをいれてみましょう:

gem install pry

bundler

この講義では使いませんが,一応紹介です:

3.2 pry

pry は irb に替わる対話型インタプリタです。デバッガとして使えます。

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.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 [数字]とやると任意のスタックにコンテキストを移動できる。

pry-rails

rails cを置き換えるのがメインで、いくつかは機能がrake taskとかぶっている。 それでも一応使いそうなのを紹介しておく。

  • show-routes

    とにかく実行がめちゃくちゃ速い。spring rake routesより速いので良い。-G(–grep)で絞り込む。 単にパスがどう引っかかるか調べたいときはrecognize-pathを使う。

  • show-model, show-models

    schema.rbとかを開かなくてもスキーマが確認できるので便利。 show-modelsを使うと全部表示される。

  • reload!

    rails cを再起動しなくて済む。

Author: suzuki@cis.iwate-u.ac.jp

Created: 2017-01-30 月 06:43

Validate