Slide 1

Slide 1 text

Ruby で Web アプリ⼊⾨ 2016.7.28

Slide 2

Slide 2 text

とおもったのですが、 それを 2 時間ではつらいので

Slide 3

Slide 3 text

Ruby で Web アプリを理解する 2016.7.28

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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 他多数

Slide 7

Slide 7 text

7 Copyright © FOLIO K.K. All right reserved. Ruby がどう動いているのか https://speakerdeck.com/shyouhei/ruby-and-its-evaluation

Slide 8

Slide 8 text

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 で実装されていることもあり、共⽣することができます。

Slide 9

Slide 9 text

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++ はオブジェクト指向でも記述できることもあり、書き⽅が異なるが考え⽅が 共通する部分が多いです。

Slide 10

Slide 10 text

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 もその 選択肢の⼀つとなりつつあります。

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

基本⽂法

Slide 16

Slide 16 text

の前に

Slide 17

Slide 17 text

17 Copyright © FOLIO K.K. All right reserved. Object String Class Float Class Ruby は全てオブジェクトであり、値は全てインスタンスです。 これを理解すると、Ruby の⼤半が分かったと⾔っても過⾔ではないです。 オブジェクト "Ruby" .downcase .length .class .methods 10.1 .abs .round

Slide 18

Slide 18 text

基本⽂法

Slide 19

Slide 19 text

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;

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

21 Copyright © FOLIO K.K. All right reserved. 添え字にスカラー数値以外の型も使⽤できる配列です。 Ruby では Hash class です。 PHP C++ Ruby 連想配列(ハッシュ / ハッシュマップ) 100, 'max' => 30); $hash['sum']; // 100 hash = { sum: 100, max: 50 } hash[:sum] # => 100 hash = { "sum" => 100, "max" => 50 } hash["sum"] # => 100 #include std::map hash = { { "sum", 100 }, { "max", 50 }, }; hash["sum"]; // 100

Slide 22

Slide 22 text

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 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("ちっちゃい"); }

Slide 23

Slide 23 text

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 # => ちっちゃい

Slide 24

Slide 24 text

24 Copyright © FOLIO K.K. All right reserved. 処理をまとめて定義した構⽂です。 Ruby では def を使って定義を⾏います。 PHP C / C++ Ruby メソッド(関数) 1 # => 2

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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 順番を気にせずに引数に参照を渡すことができます。

Slide 27

Slide 27 text

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', 'お昼寝')

Slide 28

Slide 28 text

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]); }

Slide 29

Slide 29 text

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) もあったりします。

Slide 30

Slide 30 text

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 以下のようにも書けます。

Slide 31

Slide 31 text

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 (正規表現) なんかもあります。

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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 は継承元の同じ名のメソッドを呼び出す命令です。

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

⼀区切り

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

42 Copyright © FOLIO K.K. All right reserved. Web アプリケーションとは 皆さんが主に⾒ているのは HTML / JavaScript / CSS /JSON / JPG等の画像を表す⽂字列 を返すものではないでしょうか

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

44 Copyright © FOLIO K.K. All right reserved. Ruby と Web アプリケーション

Slide 45

Slide 45 text

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 未満のフレームワーク – ドキュメント数や知⾒が少ないため、学習コストがかかる

Slide 46

Slide 46 text

ここからは 実際に✋を動かしてみましょう

Slide 47

Slide 47 text

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

Slide 48

Slide 48 text

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 を叩いてみましょう。

Slide 49

Slide 49 text

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

Slide 50

Slide 50 text

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

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

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

Slide 54

Slide 54 text

実装タイム

Slide 55

Slide 55 text

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 分からなかったらどんどん質問する

Slide 56

Slide 56 text

No content