Upgrade to Pro — share decks privately, control downloads, hide ads and more …

RubyでWebアプリを理解する

 RubyでWebアプリを理解する

2016年7月28日に行われた学生さん向けの Ruby 勉強会の資料です。

kenchan0130

July 29, 2016
Tweet

More Decks by kenchan0130

Other Decks in Technology

Transcript

  1. 4 Copyright © FOLIO K.K. All right reserved. ⾃⼰紹介 名前

    l ⼤⻄ 正恭 前職 l 株式会社 ディー・エヌ・エー – 主にヘルスケア事業を担当 現職 l 株式会社 Folio – 主にセキュリティ周りや社内環境整備 – 機械学習 – スタートアップなので基本何でも屋さん 主に使⽤している(いた)⾔語 l Ruby、JavaScript、R、Scala、Swift tadayuki.onishi kenchan0130
  2. 5 Copyright © FOLIO K.K. All right reserved. 今⽇の予定 Ruby

    の世界の話(45分くらい) l 多⾔語との⽐較 l エコシステム l 基本⽂法 Webアプリケーションの話(45分くらい) l Webアプリケーション l 実践 ⽬的 l Ruby を使⽤して Web アプリケーションとはなんぞやを理解する
  3. 6 Copyright © FOLIO K.K. All right reserved. Ruby とは

    まつもとゆきひろ(通称 Matz)により開発されたオブジェクト指向スクリプト ⾔語であり、スクリプト⾔語が⽤いられてきた領域でのオブジェクト指向プログ ラミングを実現する。(wikipedia) 実装 l CRuby – C で実装されている Ruby – ⼀般に Ruby と⾔うとこちらを指す – 2016.7.28 現在で最新版は 2.3.1 l JRuby – Java で実装されている Ruby – 2016.3.27 に CRuby 2.x の⽂法をサポートしたバージョンがリリース l mruby – Raspberry Pi 等の組み込みシステム向けの軽量版 l 他多数
  4. 7 Copyright © FOLIO K.K. All right reserved. Ruby がどう動いているのか

    https://speakerdeck.com/shyouhei/ruby-and-its-evaluation
  5. 8 Copyright © FOLIO K.K. All right reserved. l 書こうと思えば⼿続き型で書ける

    l 演算⼦は、複合代⼊⼦やビット演算 ⼦も含めて、だいたい同じ l ⽂字列は可変 l コードをコンパイルする必要がない l オブジェクトは強く型付けされてい る l マクロやプリプロセッサ、キャスト もポインタもないです l ヘッダファイルはない l メソッド(関数)の引数は(ほとんど)参 照渡しされる l ⾏の終わりにセミコロンは不要 l 「ブロック」は C にあるブロックと は別もの l メソッド呼び出しに関連付ける コード⽚を意味する l 変数は必要になったら、新しい変数 名に紐付けるだけ l false と nil だけが偽 l ⽂字列の終端は null ⽂字ではない C と Ruby 似てる点 異なる点 Ruby は C で実装されていることもあり、共⽣することができます。
  6. 9 Copyright © FOLIO K.K. All right reserved. l 演算⼦は、複合代⼊⼦やビット演算

    ⼦も含めて、だいたい同じ l メンバ呼び出しもある l -> ではなく . (ドット) l 継承可能 l : (コロン) ではなく < (⼩なり) l namespace 的なこともできる l 実際は module 化 l 例外を扱うための作法は⼀緒 l 明⽰的に参照を扱うことはない l オブジェクトは強い型付けがされる が、動的に⾏われる l 最後が ? や ! で終わるメソッドがある が、これはメソッド名の⼀部 l コンテナクラスは Array と Hash の2 種類だけ l 型変換はない C++ と Ruby 似てる点 異なる点 C++ はオブジェクト指向でも記述できることもあり、書き⽅が異なるが考え⽅が 共通する部分が多いです。
  7. 10 Copyright © FOLIO K.K. All right reserved. l 動的に型付けされる

    l 変数も宣⾔しなくても使⽤できる l クラスがある l eval がある l 式展開が使⽤できる l ヒアドキュメントがある l 例外機構がある l PHP 5.x 以下の⼈はすみません l かなり膨⼤な標準ライブラリがある l 強い型付けがある l ⽂字列、数、配列、ハッシュなども オブジェクトである l リフレクション機能はオブジェクト ごとに備わっている l 変数は参照である l 抽象クラスが存在しない l false と nil のみが偽になる PHP と Ruby 似てる点 異なる点 PHP は Web アプリケーションを作る道具として普及しているが、Ruby もその 選択肢の⼀つとなりつつあります。
  8. 11 Copyright © FOLIO K.K. All right reserved. Ruby の⼈気

    Ruby on Rails と呼ばれる Web フレームワークが⽕付け役となり、 Web アプリケーションを始め、CUI ツール作成⾔語としても⼈気があります。 向いていると⾔われている⽤途・便利な点 l テキスト処理 – Perl と同等レベルの強⼒な正規表現 l メタプログラミング – お⼿軽にメタプログラミングが可能であり、⾮常に協⼒ l 並列実⾏ – 簡単にスレッド、プロセスレベルに分けて実⾏できる – Ruby が CPU やメモリを結構⾷うため、やり過ぎ注意 l ⽤意なコーディング – 直感的なコーディングが可能 – 必要なメソッドは⼤体⽤意されている
  9. 12 Copyright © FOLIO K.K. All right reserved. Ruby のエコシステム

    Ruby をインストールする(されている)と gem コマンドがインストールされて います。 これが RubyGems とよばれる Ruby ⾔語⽤のパッケージ管理システムです。 デフォルトで、https://rubygems.org/ のリポジトリを参照しています。
  10. 13 Copyright © FOLIO K.K. All right reserved. インタラクティブ Ruby

    Ruby をインストールする(されている)と irb コマンドがインストールされて います。 Ruby の REPL(Read-Eval-Print Loop) であり、さくっと Ruby を試したい場合等 に便利です。 REPL を使⽤して、ご⾃⾝で試されながらだと習得が早くなるかと思います。
  11. 14 Copyright © FOLIO K.K. All right reserved. Pry リポジトリの

    README にも記載されていますが、 「Pry is a powerful alternative to the standard IRB shell for Ruby」 つまり、視認性の向上や使いやすさを向上させた irb です。
  12. 17 Copyright © FOLIO K.K. All right reserved. Object String

    Class Float Class Ruby は全てオブジェクトであり、値は全てインスタンスです。 これを理解すると、Ruby の⼤半が分かったと⾔っても過⾔ではないです。 オブジェクト "Ruby" .downcase .length .class .methods 10.1 .abs .round
  13. 19 Copyright © FOLIO K.K. All right reserved. データを記憶しておくための領域に、固有の名前を付けたものです。 PHP

    C / C++ Ruby 変数 / 定数 # ローカル変数 variable = 1 # グローバル変数 $variable = 1 # インスタンス変数 @variable = 1 # クラス変数 @@variable = 1 # 定数 VARIABLE = 1 // 変数 int variable = 1; // 定数 const int variable = 1; <?php // ローカル変数 $variable = 1; // グローバル変数 global $variable = 1; // 定数 define('VARIABLE', '1');
  14. 20 Copyright © FOLIO K.K. All right reserved. 配列は添え字で個々の要素を区別できる、データの集合です。 Ruby

    では Array class のインスタンスです。 PHP C / C++ Ruby 配列 ary = [1, 2, 3, 5, 8, 13] ary[0] # => 1 ary[-1] # => 13 ary[0..2] # => [1, 2, 3] int ary = {1, 2, 3, 5, 8, 13}; ary[0]; // 1 ary[sizeof(id)/sizeof(id[ 0]) - 1]; // 13 <?php $ary = array(1, 2, 3, 5, 8, 13); $ary[0]; // 1 end($ary); // 13
  15. 21 Copyright © FOLIO K.K. All right reserved. 添え字にスカラー数値以外の型も使⽤できる配列です。 Ruby

    では Hash class です。 PHP C++ Ruby 連想配列(ハッシュ / ハッシュマップ) <?php $hash = array('sum' => 100, 'max' => 30); $hash['sum']; // 100 hash = { sum: 100, max: 50 } hash[:sum] # => 100 hash = { "sum" => 100, "max" => 50 } hash["sum"] # => 100 #include <map> std::map<std::string, int> hash = { { "sum", 100 }, { "max", 50 }, }; hash["sum"]; // 100
  16. 22 Copyright © FOLIO K.K. All right reserved. 複数の条件式を組み合わせて複雑な分岐を⾏う事ができます。 Ruby

    では標準で if, unless, case が⽤意されています。 PHP C / C++ Ruby 条件分岐 height = 170 if height > 180 puts "でかい" elsif 160 < height && height < 180 puts "普通" else puts "ちっちゃい" end <?php $height = 170; if ($height > 180) { print("でかい"); } else if (160 < $height && $height < 180) { print("普通"); } else { print("ちっちゃい"); } int height = 170; if (height > 180) { printf("でかい"); } else if (160 < height && height < 180) { printf("普通"); } else { printf("ちっちゃい"); }
  17. 23 Copyright © FOLIO K.K. All right reserved. Ruby の条件分岐は特徴があり⾯⽩いため、少し踏み込んで紹介します。

    条件分岐 後置の if l Perl や CoffeeScript にも存在する「後置の if 」を使⽤することができる 値を返す l Scala のように式としても扱える height = 130 put "ちっちゃい" if height < 160 height = 130 str = if height > 160 "普通" else "ちっちゃい" end str # => ちっちゃい
  18. 24 Copyright © FOLIO K.K. All right reserved. 処理をまとめて定義した構⽂です。 Ruby

    では def を使って定義を⾏います。 PHP C / C++ Ruby メソッド(関数) <?php function mtd($arg1, $arg2) { print $arg1."¥n"; print $arg2."¥n"; return $arg1 + $arg2; } mtd(1, 2); // 1 // 2 int mth(int arg1, int arg2) { printf("%d", arg1); printf("%d", arg2); return arg1 + arg2; } mtd(1, 2); // 1 // 2 def mtd(arg1, arg2) puts arg1 puts arg2 return arg1 + arg2 end mtd(1, 2) # => 1 # => 2
  19. 25 Copyright © FOLIO K.K. All right reserved. メソッド(関数) def

    mtd(arg1, arg2) puts arg1 puts arg2 arg1 + arg2 end Ruby のメソッドでは、最後に評価された結果が return されるため、 必要がある場合を除いて、 return を省略することが多いです。 また、引数にはデフォルト値を設定することができます。 def mtd(arg1, arg2 = 0) puts arg1 puts arg2 arg1 + arg2 end mtd(1) # => 1 # => 0
  20. 26 Copyright © FOLIO K.K. All right reserved. メソッド(関数) Ruby

    2.0 より、メソッドはキーワード引数を取れるようになりました。 def mtd(arg1:, arg2:) puts arg1 puts arg2 arg1 + arg2 end mtd(arg2: 10, arg1: 1) # => 1 # => 10 順番を気にせずに引数に参照を渡すことができます。
  21. 27 Copyright © FOLIO K.K. All right reserved. Ruby の参照渡し

    Ruby の変数やメソッドの引数には参照を渡しています。 そのため、参照しているオブジェクトを破壊的に変更した場合は、 全てに影響が出たように⾒えます。 var1 変数 var2 オブジェクト [Object ID] 53940 "Ruby は楽しい" var1 = var2 = var1 Object ID 54940 を参照してね var2.sub!('Ruby', 'お昼寝')
  22. 28 Copyright © FOLIO K.K. All right reserved. ある決められた回数繰り返し実⾏する部分を指⽰するための構⽂です。 PHP

    C / C++ Ruby 繰り返し int numbers[] = {1, 2, 3, 5}; int number_length = sizeof(numbers) / sizeof(numbers[0]); for (int i = 0; i < number_length; ++i) { printf("%d¥n", numbers[i]); } <?php foreach (array(1, 2 ,3 , 5) as $num) { print($num . "¥n"); } for num in [1, 2, 3, 5] puts num end # こっちの方をよく使う [1, 2, 3, 5].each do |num| puts num end
  23. 29 Copyright © FOLIO K.K. All right reserved. Swift のブロック、JavaScript

    のコールバックに近いと考えていただくと理解が 速いかもしれません。(※ C のブロックとは異なります) 引数の固まりです。 ブロック 先ほど唐突に出てきた [1, 2, 3, 5].each do |num| puts num end 別の書き⽅として [1,2,3,5].each { |num| puts num } procObj = proc { puts num } [1,2,3,5].each(&procObj) もあったりします。
  24. 30 Copyright © FOLIO K.K. All right reserved. ブロック def

    two_times(number, &block) two_times_number = number * 2 block.call(number, two_times_number) two_times_number end nubmer = two_times(100) { |before, after| puts "#{before} から #{after} になりました" } # => 100 から 200 になりました number # => 200 実際にブロックを取るメソッドを定義してみます。 def two_times(number) two_times_number = number * 2 yield(number, two_times_number) two_times_number end 以下のようにも書けます。
  25. 31 Copyright © FOLIO K.K. All right reserved. % 記法

    % (パーセント)記法は各リテラルの別の書き⽅です。 ⼤⽂字だと、式埋め込みが可能です。 %i / %I %w / %W %q / %Q %Q(これは "Ruby" です) # => "これは ¥"Ruby¥" です” %q(これは "Ruby" です) # => "これは ¥"Ruby¥" です" str = "Ruby" %Q(これは #{str} です) # => "これは ¥"Ruby¥" です" %q(これは #{str} です) # => "これは ¥#{str} です" %W(A B C) # => ["A", "B", "C"] %W(A B C) # => ["A", "B", "C"] str = "C" %W(A B #{str}) # => ["A", "B", "C"] %w(A B #{str}) # => ["A", "B", "¥#{str}"] %I(Ruby C PHP) # => [:Ruby, :C, :PHP] %i(Ruby C PHP) # => [:Ruby, :C, :PHP] str = "Ruby" %I(#{str} C PHP) # => [:Ruby, :C, :PHP] %i(#{str} C PHP) # => [:"¥#{str}", :C, :PHP] %x (コマンド実⾏), %s (シンボル化), %r (正規表現) なんかもあります。
  26. 32 Copyright © FOLIO K.K. All right reserved. クラス String

    や Integer などはクラスでしたが、⾃分⾃⾝でクラスを定義することもで きます。 initialize メソッドはコンストラクタとして認識されます。 class User def initialize(first_name, last_name, gender) @first_name = first_name @last_name = last_name @gender = gender end def full_name bind_name end private def bind_name(sep = ' ') [@last_name, @first_name].join(sep) end end user = User.new('yamada', 'taro', 1) user.full_name # => taro yamada
  27. 33 Copyright © FOLIO K.K. All right reserved. クラス クラスは継承が可能であり、⾃作クラスや既存のクラスを拡張することができま

    す。 クラスは多重継承ができませんが、 Mix-in を使⽤することでその弱さを補うこと ができます。(※ 後述します) class CapitalValue < String def initialize(str) super(str.upcase) end end value = CapitalValue.new('test') value # => TEST 継承を⾏った場合、同⼀名のメソッドはオーバーライドされます。 super は継承元の同じ名のメソッドを呼び出す命令です。
  28. 34 Copyright © FOLIO K.K. All right reserved. クラス クラスにはインスタンスメソッドとクラスメソッドが存在します。

    今まで定義していたのは、インスタンスメソッドです。 クラスメソッドは 「self + メソッド名で」定義することができます。 class User attr_reader :gender def self.male(first_name, last_name) new(first_name, last_name, 1) end def initialize(first_name, last_name, gender) @first_name = first_name @last_name = last_name @gender = gender end end user = User.male('yamada', 'taro') user.gender # => 1
  29. 35 Copyright © FOLIO K.K. All right reserved. クラス Ruby

    のコードを⾒ていると、上記のようなコードが出てきます。 これは特異クラスと呼びます。 今はクラスメソッドを作成するためのイディオムであると思っていただいて構い ません。 class User class << self def male(first_name, last_name) new(first_name, last_name, 1) end end end
  30. 36 Copyright © FOLIO K.K. All right reserved. クラス class

    User attr_reader :gender def initialize(first_name, last_name, gender) @first_name = first_name @last_name = last_name @gender = gender end end インスタンス変数にアクセスするためのメソッドを⽣やすクラスメソッドです。 attr_reader 以外にも以下のようなものが存在します。 l attr_writer l attr_accessor class User def gender @gender end def gender=(value) @gender = value end end
  31. 37 Copyright © FOLIO K.K. All right reserved. モジュール Ruby

    のモジュールは namespace を作成する役割と、Mix-in による実装継承を ⾏うための役割の 2 つを兼任しています。 Mix-in namespace module Admin class User def whois 'admin' end end end module General class User def whois 'general' end end end Admin::User.new.whois # => admin General::User.new.whois # => general module Speaking def hungry 'I¥'m hungry.' end end module Sports def play 'soccer' end end class User include Speaking include Sports end user = User.new user.hungry # => I'm hungry. user.play # => soccer
  32. 38 Copyright © FOLIO K.K. All right reserved. 例外 プログラムに異常が発⽣した際にそこで処理が⽌まります。

    ⾃分⾃⾝で例外を発⽣させたり、 例外を捕捉して回復のための処理を記述することも可能です。 begin # 実行する処理 rescue # 例外が発生したときの処理 else # 例外が発生しなかったときに実行される処理 ensure # 例外の発生有無に関わらず最後に必ず実行する処理 end
  33. 39 Copyright © FOLIO K.K. All right reserved. ここまでのまとめ ここまで、Ruby

    の世界の話と基本的な⽂法を⾒てきました。 l Ruby には便利なエコシステムが⽤意されている l ⽂法は他の⾔語と似ている部分が多い l 基本は全てオブジェクトであることの理解が肝 l 独⾃の概念もあるので徐々に理解ゆくとよい
  34. 41 Copyright © FOLIO K.K. All right reserved. Web アプリケーションとは

    そもそも Web アプリケーションとは何でしょうか。 リクエストを投げたら、レスポンスを返すアプリケーション
  35. 42 Copyright © FOLIO K.K. All right reserved. Web アプリケーションとは

    皆さんが主に⾒ているのは HTML / JavaScript / CSS /JSON / JPG等の画像を表す⽂字列 を返すものではないでしょうか
  36. 43 Copyright © FOLIO K.K. All right reserved. Ruby と

    Web アプリケーション This is Why Learning Rails is Hard には Rails を習得するために必要な技術要素 ⼀覧が載っています。(Web アプリケーションを習得するために必要な技術要 素であると⾔い換えてもよいと思います) l Ruby language l Rubygems l Rails framework l Git l IDE / Editor l Software engineering l SQL & data modeling l Tests l Deploy l www
  37. 45 Copyright © FOLIO K.K. All right reserved. Ruby の

    Web アプリケーションフレームワーク Ruby では先ほどの⽂字列レスポンスを効率よく返すための フレームワークやツールなどが豊富に揃っています。 Ruby の Web アプリケーションフレームワークの考え⽅は様々な⾔語の Web ア プリケーション開発に応⽤される程に発展していると⾔えるでしょう。 l Ruby on Rails – Ruby で随⼀に有名なフレームワーク – その名の通り、レールに乗る必要があるため、学習コストがかかる – ⼀度レールに乗ると開発スピードが速くなる – フルスタック l Sinatra – DSL で⼿軽にかけるフレームワーク l Padrino – Sinatra 以上 Rails 未満のフレームワーク – ドキュメント数や知⾒が少ないため、学習コストがかかる
  38. 47 Copyright © FOLIO K.K. All right reserved. Web アプリケーションの基礎を体感する

    gem で rack をインストールしてみましょう。 Rack gem をインストールすることで l rackup コマンド l 最⼩限の Rack アプリケーション l 最⼩限の Rack ミドルウェア l その他、基本的なユーティリティ を利⽤することができるようになります。
  39. 48 Copyright © FOLIO K.K. All right reserved. Web アプリケーションの基礎を体感する

    app = proc do |env| [200, {'Content-Type' => 'text/plain'}, [ 'This is a web app.' ]] end run app config.ru というファイル名で以下のファイルを⽤意してみましょう。 rackup コマンドを叩いて、ブラウザで localhost:9292 を叩いてみましょう。
  40. 49 Copyright © FOLIO K.K. All right reserved. Web アプリケーションの基礎を体感する

    Web アプリケーションとは何でしたでしょうか? リクエストを投げたら、レスポンスを返すアプリケーション つまり、今のが最⼩の「Web アプリケーション」です。
  41. 50 Copyright © FOLIO K.K. All right reserved. Web アプリケーションの基礎を体感する

    Rack なんかより 実際に明⽇から使える Web アプリケーションを知りたいんです! Sinatra や Rails も呼び元をたどると、rack アプリケーションです。 まずは、これを体感してもらいました。
  42. 51 Copyright © FOLIO K.K. All right reserved. Ruby によるアプリケーション開発の準備

    Web アプリケーションでも CLI アプリケーションでも、Ruby で効率よくアプリ ケーションを開発できるように下準備をしてみましょう。 gem で bundler をインストールしてみましょう。 Bundler gem をインストールすることで l プロジェクト固有の Rubygems の管理 l Rubygems の依存関係の解決 l 環境毎に使⽤する Rubygems の管理 を利⽤することができるようになります。
  43. 52 Copyright © FOLIO K.K. All right reserved. Ruby によるアプリケーション開発の準備

    bundle コマンドが使えるようになっています。 Gemfile に使⽤したい Rubygems を記載します。 試しに rack を設定してみましょう。 source 'https://rubygems.org' gem 'rack' パッケージ毎に Rubygems を管理できるようになりました。
  44. 53 Copyright © FOLIO K.K. All right reserved. Ruby によるアプリケーション開発

    タイトルと本⽂が投稿できる Web アプリケーションを作ってみましょう。 https://github.com/kenchan0130/ruby-webapp-lecture
  45. 55 Copyright © FOLIO K.K. All right reserved. まとめ 全体のまとめ

    l Ruby の⽂法をみてきました l Ruby には rack という Web サーバーが gem として配布さていました – rack は様々なフレームワークの元になっていることが多い l Sinatra を使⽤して保存がして表⽰するようになりました 今後(Ruby)勉強するに当たっての Tips l 作りたいもの(こと)を探して作り始めてみる l RubyMine などでソースコードを追っかける l Ruby Magazine を読んでみる l 分からなかったらどんどん質問する