Help us understand the problem. What is going on with this article?

SchooのRuby実践のまとめ

SchooのRuby実践の内容をまとめました
動画を見た人の備忘録に使えます!

どうも、ITのんびりです
Railsの自社開発企業に入社してもうすぐ2ヶ月です
未経験で入社した同僚の中でぼくだけスクールでRubyやRailsの勉強していませんでした。
だから、仕事中にSchooという動画学習サービスで勉強しました。

Ruby実践は全部終わったので、その内容をまとめました

記事を読んで興味が出たら、Schooで動画を見てみてください
初心者には動画の方が挫折せずに続きやすいと思います!

前の記事:Ruby入門のまとめ

1. 第1回 流行語メソッドを作ろう

1.1 ファイルをクラスにまとめる

ppap.rbとほぼ同じファイルを2つ作る

correct_aryを

[
'zun',
'zunzun',
'zundoko'
]

[
'dodo',
'sukosukosuko',
'dodo',
'sukosukosuko',
'dodo',
'sukosukosuko'
]

のファイルを作る。word_aryとsuccess_strも合わせて変わる。

今までならppap.rbのように長いファイルを個別に作らないといけなかったが、クラスと継承を使えば簡単になる。

buzzword.rbに全体の構造を書く。

class Buzzword
  def say(word_ary)
    lists = []
    count = 0 
    while true do
      word = word_ary.sample
      print word
      print ' ' 
      lists << word
      # 正解の配列より短い場合は評価しない
      if lists.length > @correct_ary.length then
        count = count + 1 
        # 配列から正解の配列の要素数分を取り出す
        candidate = lists.last(@correct_ary.length)
        # 抽出配列が正解の配列と一致する場合はsuccessと返す
        if candidate == @correct_ary then 
          puts @success_str
          puts '(' + count.to_s + '試行目)'
          break
        end 
      end 
    end
  end
end

piko.rbなどにbuzzword.rbから継承させて初期値を入れる。

class Piko < Buzzword
  def initialize
    # 決め台詞
    @correct_ary = [ 
      'pen',
      'pineapple',
      'apple',
      'pen'
    ]
    # 成功時に表示する文字列
    @success_str = 'ペンパイナッポーアッポーペン!'
  end
end

execution.rbの

require ファイル名

でそのファイルを読み込める。拡張子はいらないみたい(入れても動くっぽい)

ここでインスタンスを作ってsayメソッドを呼び出す

require './buzzword'
require './kiyo'
require './piko'
require './shin'

kiyo = Kiyo.new
piko = Piko.new
shin = Shin.new

word_ary = [ 
  'pen',
  'apple',
  'pineapple',
  'zun',
  'zunzun',
  'zundoko',
  'dodo',
  'sukosukosuko',
]

kiyo.say(word_ary)
piko.say(word_ary)
shin.say(word_ary)
ruby execution.rb

で実行される

buzzword.rbには構造だけ書いて、個別に変わる単語などは書かないことで、他の単語で同じことをしようとしてもbuzzword.rbは変える必要がない

モジュールを使っても同じようなことができる

module BuzzwordModule
  def say(word_ary)
    lists = []
    count = 0 
    while true do
      word = word_ary.sample
      print word
      print ' ' 
      lists << word
      # 正解の配列より短い場合は評価しない
      if lists.length > @correct_ary.length then
        count = count + 1 
        # 配列から正解の配列の要素数分を取り出す
        candidate = lists.last(@correct_ary.length)
        # 抽出配列が正解の配列と一致する場合はsuccessと返す
        if candidate == @correct_ary then 
          puts @success_str
          puts '(' + count.to_s + '試行目)'
          break
        end 
      end 
    end
  end
end


class KiyoModule
  include BuzzwordModule
  def initialize
    # 決め台詞
    @correct_ary = [ 
      'zun',
      'zunzun',
      'zundoko'
    ]
    # 成功時に表示する文字列
    @success_str = 'KI・YO・SHI!'
  end
end


require './buzzword_module'
require './kiyo_module'

kiyo = KiyoModule.new

word_ary = [ 
  'pen',
  'apple',
  'pineapple',
  'zun',
  'zunzun',
  'zundoko',
  'dodo',
  'sukosukosuko',
]

kiyo.say(word_ary)

モジュールはクラスと似ているがインスタンスが生成と継承ができない

他のモジュールを使うときは<<で継承じゃなくて、include モジュール名にする

モジュールは単体ではインスタンスは作れない

インスタンスを作りたいときはクラスを使う

メソッドの集まりだけで、クラスを使うほどではないときはモジュールを使うらしい

たくさんクラスを作りすぎず、モジュールで済むものはモジュールにする

クラスの中にモジュールをincludeでミックスインできる

2.  第2回 例外処理の活用法

2.1 例外処理とは

例外処理とは、予想外の出来事が起きた時に、プログラム全体が異常終了することなく回避し、原因がわかるように対処すること。エラー処理のこと。

例外処理は環境依存のものと、人為的な想定もれに大別される

環境依存 人為的な想定もれ 人為的な想定もれの具体例
ハードウェアの故障 不可能な演算 ゼロで割る
OSの設定ミス ユーザの入力間違い 数値のところに文字列を入れてしまった 半角1と全角1
ライブラリの欠損 存在しない記憶領域へのアクセス その他 コンピュータのファイルを読み込もうと思ったら、ファイルがなかった

2.2 Rubyでの例外処理の書き方

対象式をbegin、endで囲む。rescueは例外発生時、ensureは例外発生に関わらず実行する

x = 4
y = 0
x / y

#=> ZeroDivisionError (divided by 0)

これだとダメなので例外処理を入れると

x = 4
y = 0

begin
x / y
rescue
p "ゼロで割ることはできません。"
ensure
p "#{x}#{y}で割りました。"
end

#=> "ゼロで割ることはできません。"
"4を0で割りました。"
=> "ゼロで割ることはできません。"

これでエラーは出ない

y = "2"で文字列にしてしまうと

TypeError (String can't be coerced into Integer)

というエラーになる

rescueとensureの順番を入れ替えるとエラーになる

SyntaxError ((irb):51: syntax error, unexpected rescue, expecting end)
rescue
^~~~~~
begin
    rescue
        error_type,...=>evar #省略すると全例外を補足。evarに例外オブジェクトが格納。
        then

        else
    ensure
end

thenとelseで例外の場合わけもできる

beginとendで囲まなくても、メソッドのdefの中や、クラスのclassの中にrescueとensureを書けば使える

raiseメソッドはraiseと書いたところで強制的にエラーを発生させることができる

構文 例文 意味・使い方
raise raise エラーを強制発生 rescue内では、直近のエラーを再現する
raise"エラー文" raise "エラーでがんす" エラー文を表示
raise 例外クラス raise SyntaxError 自分でエラーの種類を指定できる
raise 例外クラス "エラー文" raise SecurityError "エラーじゃないけどわざとエラー" 指定とエラー文

Rubyには組み込みライブラリとして様々な例外クラスが用意されている。例外が起きると自動生成してくれる。

取ってきたいファイルがない場合

#before
file = File.open("blog.rb", "r")#=> Errno::ENOENT (No such file or directory @ rb_sysopen - blog.rb)

# after
begin
file = File.open("blog.rb", "r")
rescue
p "ファイルが存在しません。"
ensure
p "対象のファイルは#{file}でした。"
end
#=> "ファイルが存在しません。"
"対象のファイルは#<File:0x00007f8fe51615d0>でした。"
=> "ファイルが存在しません。"

ファイルがなくて開けなくてもエラーが起きないので、そのまま処理を続けられる

raiseと.inspectでオブジェクトの中身を調べられる。式が複雑な場合や事実を確認したい時に便利。

x = 3
raise x.inspect

#=> RuntimeError (3)
#raiseだけだとRuntimeError ()になる

3.  第3回 正規表現の活用法

3.1 正規表現とは

文字列のパターンマッチをすること。

メタ文字という専用文字を使い表現することができる。

マッチするかどうかを判定できる

マッチする箇所が文字列のどこなのかわかる

メタ文字を使うと正規表現オブジェクトが自動的に作られる

Regexp.new("d") =~ 'diveintocode'

簡単に書くと

/d/ =~ 'diveintocode'

右辺を左辺で評価する

Regular expression(Regexp)

3.2 正規表現の書き方

3.2.1 1文字マッチ

種類 メタ文字 意味
1 文字クラス a-z aからzまでの文字
2 繰り返し + 1回以上使われている
3 アンカー ^ 行頭にマッチする
4 選択 dive|rise dive か rise に一致する
5 グルーピング (dive) dive でワンセット
6 位置指定 (?=D) 先頭が D で始まる
7 コメント (?#コメントです ) 正規表現内にコメントを記載できる
8 オプション i 大文字小文字を判別しない

1文字マッチ。対象の文字列内に任意の1文字が含まれているか どうかを判定する。

目的 書き方 結果
1 dという文字が含まれているかを判定する /d/=~'diveintocode' =>0 (0番目にあるという意味)
2 sという文字が含まれているかを判定する /s/=~'schoo' =>0
3 nという文字が含まれているかを判定する /n/=~'Hiroyoshi Noro' =>nil (大文字小文字が区別する)
4 Nという文字が含まれているかを判定する Regexp.new("N") =~ 'Hiroyoshi Noro' => 10 (スペースは1文字に数える)

2文字以上含まれるときは1番目の位置を表示する

Regexp.new("o") =~ 'diveintocode'
=> 7

/dive/ =~ 'diveintocode'
=> 0

/ive/ =~ 'diveintocode'
=> 1

複数文字で正規表現すると、その文字の始まりが何文字目かを表示するみたい

3.2.2 繰り返しマッチ

繰り返しマッチ。対象の文字列内に任意の文字が繰り返し含まれているかどうかを判定する。

目的 書き方 結果
1 d という文字が1つ以上含まれているかを判定する 「最左最長一致」 /d+/ =~ 'diveintocode' => 0
2 n という文字が0こ以上含まれているかを判定する 「最左最短一致」 /n*/ =~ 'Hiroyoshi Noro' => 0
  • が 1つ以上、 * が 0こ以上。文字は左から評価する。
/d+/ =~ 'diveintocode'
=> 0

/o+/ =~ 'diveintocode'
=> 7

/r+/ =~ 'diveintocode'
=> nil

/d+/ =~ 'ddddddiveintocode'
=> 0

/d+/ =~ 'ddddddiveintodddddde'
=> 0

/d/ =~ 'ddddddiveintodddddde'
=> 0

dddddを1つの塊として認識する

/n*/ =~ 'Hiroyoshi Noro'
=> 0

/n/ =~ 'Hiroyoshi Noro'
=> nil

/H*/ =~ 'Hiroyoshi Noro'
=> 0

/i*/ =~ 'Hiroyoshi Noro'
=> 0

/Hiro*/ =~ 'Hiroyoshi Noro'
=> 0

/iro*/ =~ 'Hiroyoshi Noro'
=> 1

nがなくてもnilではなくて0を返す

3.2.3 アンカー

アンカー。対象の文字列内の指定の場所に指定の文字が含まれるかどうかを判定する。

目的 書き方 結果
1 d という文字が行の頭に含まれているかを判定する /^d/ =~ 'diveintocode' => 0
2 n という文字が行の末尾に含まれているかを判定する /n+$/ =~ 'Hiroyoshi Noro' => nil
3 o という文字が行の末尾に含まれているかを判定する /o+$/ =~ 'Hiroyoshi Noro' => 13
  • が 1つ以上、 * が 0こ以上。文字は左から評価する。
/^d/ =~ 'diveintocode'
=> 0

/^i/ =~ 'diveintocode'
=> nil

/^dive/ =~ 'diveintocode'
=> 0

/n+$/ =~ 'Hiroyoshi Noro'
=> nil

/n+$/ =~ 'Hiroyoshi Noron'
=> 14

/o+$/ =~ 'Hiroyoshi Noro'
=> 13

3.2.4 選択

選択。対象の文字列が選択肢のいずれかにマッチするかどうかを判定する。3つ以上の選択肢も可能。

目的 書き方 結果
1 diveかriseのどちらかであるかを判定する /dive|rise/ =~ "dive" => 0
2 rubyかpythonのどちらかであるかを判定する /ruby|python/ =~ "java" => nil
3 rubyかpythonかjavaのいずれかであるかを判定する /ruby|python|java/ =~ "java" => 0

| が選択肢の区切り文字。半角スペースを入れないよう注意!

3.2.5 グルーピング

グルーピング。対象の文字列に所定の文字の組み合わせがマッ チするかどうかを判定する

目的 書き方 結果
1 「apple」が含まれているか どうかを判定する /(apple)/ =~ "penpinappleapplepen" => 6
2 「apple」が繰り返し含まれ ているかどうかを判定する /(apple)+/ =~ "penpinappleapplepen" => 6
3 「ppap」が含まれているか どうかを判定する /(ppap)/ =~ "penpinappleapplepen" => nil

(  ) の間にグルーピングしたい文字列を記載する

3.2.6 位置指定

位置指定。対象の文字列の指定の位置に指定の文字列があるか どうかを判定する。

目的 書き方 結果
1 先頭が「D」で最後が「e」で 終わる単語かどうかを判 定する /(?=D)\w+(?=e)/ =~ "Dive into Code" => 0
2 先頭が「D」で最後が「e」で 終わる単語かどうかを判 定する /(?=D)\w+(?=e)/ =~ "DIVE INTO CODE" => nil

(?=) は文字指定、\w は英字であることを意味。

3.2.7 コメント

コメント。正規表現で記載したものの中に開発者向けのコメントを 入れ込むことができる。

目的 書き方 結果
1 開発者向けコメント /DIVE INTO (?#Really?) CODE/

(?#  ) の間にコメントを記載する

3.2.8 オプション

オプション。正規表現で指定したパターンに対して所定のオプショ ンを指定することができる。

目的 書き方 結果
1 大文字小文字の区別なし /(?=D)\w+(?=e)/i =~ "DIVE INTO CODE" => 0
2 正規表現内の空白を無視 して、コメントも有効にする /(?=D) #comment \w #comment +(?=e) #comment /x

x オプションはファイルにコードを記載するときに活用できる

3.2.9 使用例

郵便番号や電話番号、年月日とメールアドレスに正規表現を使う ことが多い。試してみよう。

目的 書き方
1 郵便番号 /^[0-9]{3}-[0-9]{4}$/
2 電話番号 /^\d{2,4}-\d{2,4}-\d{4}$/
3 年月日 /^(\d{4})-(0[1-9]
4 メールアドレス /[\w_-]+@[\w_-]+.[\w._-]+/

4.  第4回 キーボードやファイルの入出力管理

キーボードで入力値を開発したプログラムに認識させたり、ファイルの読み書きをさせたい場合には、特別なライブラリ「IO」を活用 する必要がある

入出力の目的は、Rubyプログラムがその外部からデータを出し入れすること

種類 用途 具体例
標準入出力 ターミナル上での入出力 入力 gets
出力 puts
ファイル入出力 ファイルの読み書き 開く open
閉じる close
ディレクトリ操作 移動やファイル、ディレクトリ作成 現在地表示 pwd
そのほか URLにアクセスして読み込み 読み込み open

4.1 標準入出力

標準入力はgets。標準出力はputs、print でお馴染み。それぞれ、レシーバを省略して記載することができる。

種類 書き方 用途 特徴
標準入力 STDIN.gets
$stdin.gets
gets
ターミナル上の入力値を入力する(受け取る) 定数 STDIN や 定数 $stdin に格納されている
※改行も1文字として認 識するため要注意
標準出力 STDOUT.puts
STDOUT.print
$stdout.puts
$stdout.print
puts
print
ターミナル上に値を出力する (表示する) 定数 STDOUTや定数 $stdout に格納されている

RubyではSTDIN,getsを単にgetsとかけるが、正式にはSTDINをつける(裏側ではそう動いている)

gets
hello
=> "hello\n"

STDIN.gets
hello
=> "hello\n"

puts "hello"
hello
=> nil

STDOUT.puts "hello"
hello
=> nil

STDOUT.print "hello"
hello=> nil

getsを叩くと、ターミナルに入力できるようになる

getsの後に引数を書くと入力待ちになって、他の文字を入れても表示してくれなくなる。エラー。

while str = gets
  if str.chomp == "DIVE INTO CODE"
    print "正解:", str
    break
  end
  print "「コードの世界にダイブする!」は?"

この後にDIVE INTO CODEと入力すると

正解: DIVE INTO CODE
=> nil

と出力される

4.2 ファイル入出力

目的 コード例 特徴
開く File.open("ファイル名", モード)
open("ファイル名", モード)
ファイルを開くときにモードを指定する。読み込みや書き込みモードがあり、細かい指定がある。
モードを省略すると読み込みモードになる。
読み込み gets
readline
一行読み込む
一行読み込む
書き込み puts
print
write
改行を入れて書き込み
改行は入れずに書き込み
改行をつけずに書き込んだバイト数を返す

openはブロックの処理で操作内容を書けばまとめて操作でき、終了時に自動でファイルを閉じる。開きっぱなしにならない。

closeを書かなくていいから楽

open("ファイル名", モード) do |io|
    io.readline
    io.gets
    など
end


open("4th_sample.txt", "a+") do |io|
  p io.gets
  p io.readline
  p io.read
  p io.puts
  p io.write "スクー「Ruby実践」に登壇。"
end

#"MBAエンジニア講師。\n"
#"リクルートやワークスアプリケーションズなど異業種・異職種への転職を4度経験。\n"
#"あらゆる時間を計測し、未経験の職務でゼロから短期間に成果をあげる独自の生産性向上手法を確立。\nワークスアプリケーションズの特待生制度「問題解決能力発掘プログラム」の突破経験と1年間の独立起業過程でエンジニア人材の不足を痛感した原体験から、#実務経験を得てエンジニアになるためのハイレベル・プログラミングスクール「DIVE INTO CODE」を創業。"
#nil
#37
#=> 37

読み込んでpでターミナルに出力して、writeで一行書き込む。ターミナルには書き込んだ内容は表示されないがファイルを見ると追加されている。

4.3 ディレクトリ操作

irbで

Dir.pwdを叩くと現在のディレクトリが表示される

Rubyコード Linuxコマンド
Dir.pwd pwd
Dir.chdir("パス") cd パス
Dir.mkdir("ディレクトリ名") mkdir ディレクトリ名
Dir.rmdir("ディレクトリ名") rm -rf ディレクトリ名

ネームベース

IPベース

IPアドレスに複数のドメインを割り当てるのは可能

場合によっては接続していいドメインを制限しているときがある

IPアドレスをアドレス欄に直で打っても接続していいドメインでなければ接続できない

最近はIPアドレスとドメイン名とポート番号のセットでユニークに特定しているらしい

5. 第5回 カスタムパーツ gem

gemとは非公式の第三者が開発したライブラリ

Ruby on Railsもgem

rubygems.orgで一覧が見られる

gemコマンドでインストールできる

gemのbundlerを使うとGemfileに書いたものを一括入手できる

gemを使いたいときは「使いたいgem github」とかで検索すると、そのgemのgithubが見られる

そのREADMEにインストール方法や使い方などが書いてある

rails sでサーバを立ち上げているときに、ターミナルを閉じたりしてしまって、新しくrails sができないときは

cat tmp/pids/server.pid

で番号を見て

kill -9 番号

でrails sを停止できる

おわりに

最後まで読んでいただきありがとうございました。
次はRuby on Rails入門の内容をまとめて記事にします!
QiitaやTwitterなどにコメントをしてもらったり、SNSでシェアしてもらえるとうれしいです!


Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away