記憶の外付けHDD

切実に頭にUSBのコネクターがほしいです。なるべくtype-cでお願いしたいです。(忘れないように、プログラミング学習で学んだことを投稿してます)

2019/10/18_チェリー本(11日目)

はじめに

10/18もチェリー本をちょっとだけ読みました。 (途中で寝落ちしてしまった…)

読んだ本

プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発・デバッグ技法まで Software Design plus | 伊藤 淳一 | コンピュータ・IT | Kindleストア | Amazon

本編

読んだページ数

  • 第4章(P115)

新しく知ったこと

配列内の要素の取得方法

範囲を指定して取得

tea_material = ["はとむぎ", "玄米", "月見草", "どくだみ", "はぶちゃ",  "プーアール"]
puts tea_material[0,3]
#=> "はとむぎ", "玄米", "月見草"
ポイント
  • 書き方
    配列[取得する最初の要素番号, 取得する要素数]
  • 例では、要素番号0の「はとむぎ」から3つ、要素を取得しています。

  • Rangeを使っても似たようなことができます。
    (↓この記事に記載)
    2019/10/16_チェリー本(9日目) - 記憶の外付けHDD

後ろから○番目を取得

tea_material = ["はとむぎ", "玄米", "月見草", "どくだみ", "はぶちゃ",  "プーアール"]
puts tea_material[-1]
#=> "プーアール"

puts tea_material[-2]
#=> "はぶちゃ"

puts tea_material[-2, 2]
#=>"はぶちゃ",  "プーアール"
ポイント
  • 添え字に-1を指定すると、最後の要素が取得できる。
  • -2だと、最後から2番目の要素が取得できる。
  • つまり、「最後から○番目」という日本語を「-○」に変換すればOK

  • 前項で説明した配列[取得する最初の要素番号, 取得する要素数]を使えば、最後から○番目の要素から要素を△個取得することもできる

    • 例([-2, 2])では、最後から2番目の「はぶちゃ」から2個要素を取得している。

そのほか(ダイジェスト)

添え字を複数指定して要素を取得(≠範囲指定)

value_atメソッドを使う

最初からn個の要素を取得

firstメソッドを使う

最後からn個の要素を取得

lastメソッドを使う

あとがき

  • iTerm2を導入して、hotkeyに「shift」+「z」を指定しました。
    気軽に呼び出せるので、黒い画面さんといい友達になれそうです。
  • 知らないこと多すぎて、全然進まない…
    (ダイジェスト方式、使って行こうかな)

以上

2019/10/17_チェリー本(10日目)

はじめに

今日もチェリー本、ちょっとだけ読みました。

読んだ本

プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発・デバッグ技法まで Software Design plus | 伊藤 淳一 | コンピュータ・IT | Kindleストア | Amazon

本編

読んだページ数

  • 第4章(P102〜P114)

新しく知ったこと

読んだ部分は、プログラムを作成する例題の部分でした。
そこで解説されていたリファクタリングの考え方が参考になったので、それを書きます。

例題コード

以下のコードをリファクタリングしたいと思います。

def principal(d, r, y)
  d.upcase + r.upcase + y.upcase +
end

puts principal("d", "r", "y")
#=> DRY

リファクタリング①:DRY原則

  • DRYとは、"Don't repeat yourself"の略
  • 繰り返しを避ける」という意味
  • 例題コードの場合、upcaseメソッドを3回も繰り返して使っている
    • 問題点:コードを書き換えるとき、同じ修正を3回する必要があり、書き換えをミスする可能性が高まる。
修正例
def principal(d, r, y)
  dry = ""
  [d, r, y].each do |ele|
    dry << ele.upcase
  end
  dry + "原則"
end

puts principal("d", "r", "y")
#=> DRYの原則
解説
  • upcaseメソッドを3回記載するかわりに、引数を配列に格納して、eachメソッドを使用しました。

リファクタリング②:適切なメソッドを使用

eachメソッドブロック処理では、Stringクラスの変数「dry」へ各要素をしている。
この部分は、injectメソッドを使用すると、もっとすっきり書けます。

※ injectメソッドは2019/10/15_チェリー本(8日目)で解説してます。

修正例
def principal(d, r, y)
  [d, r, y].inject(""){ |dry, ele| dry + ele.upcase } 
end

puts principal("d", "r", "y")
#=> DRY
  • injectメソッドを使えば、変数 dryの定義が不要
  • do~end{~}に書き換えた

ということで、コードをスッキリさせることができました。

あとがき

リファクタリングをしてきましたが、"dry".upcaseで済む内容なんですよね…
例題考えるの、むずかしい!!

以上

2019/10/16_チェリー本(9日目)

はじめに

今日もチェリー本、ちょっとだけ読みました。

読んだ本

プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発・デバッグ技法まで Software Design plus | 伊藤 淳一 | コンピュータ・IT | Kindleストア | Amazon

本編

読んだページ数

  • 第4章(P99〜P102)

新しく知ったこと

Rangeオブジェクト

  • 値の範囲を表すオブジェクト
  • ..は最後の値を含む
    • 1..4は「 1以上4以下」
  • ...は最後の値を含まない
    • 1...4は「1以上4未満」

Rangeオブジェクトの便利な使い方

配列から一部を抜き出す
  • 配列から一部要素を抜き出すときに、Rangeオブジェクトを使用できる
position = ["", "", "", ""]

puts position[1..2]
#=>怒, 哀
  • ネガティブな感情だけを抜き出すことができました。
  • [1..2]の記載で、配列の「2番目以上3番目以下」の要素を抜き出せます。
文字列から一部の要素を抜き出す
  • 文字列から一部要素を抜き出すときも、Rangeオブジェクトを使用できる
chosyu = "リキラリアット"
puts chosyu[2..6]
#=> ラリアット
  • 長州感が一気になくなり、滑舌がよくなった気がします。
  • [2..6]の記載で文字列の3文字目から7文字目を抜き出せました。
以上以下、以上未満を判定する
# 平成かどうかを判別するメソッド

def heisei?(age)
  (1989..2019).include?(age)
end

heisei?(1988)  #=> false
heisei?(2000) #=> true
  • 論理演算子(<,>,=)を使うよりも、Rangeオブジェクトを使ったほうが、簡単に記載できる
  • case文でも使える 例
# 昭和か平成か判定するメソッド

def age(num)
 case num
 when 1926..1988
   puts "昭和"
 when 1989..2019
   puts "平成"
 else
   puts "ググってください"
 end
end

age(1988)  #=> 昭和
age(2000)  #=> 平成
値が連続する配列を作成する
  • to_aメソッドで配列化する
("a".."d").to_a

#=>  ["a", "b", "c", "d"]
  • [*](splat展開)でも配列を作成できる
[*"a".."d"]

#=>  ["a", "b", "c", "d"]

以上

2019/10/15_チェリー本(8日目)

はじめに

今日、仕事が急遽夜勤になったんですが、「こ、これだけは…」と思い、ちょっとだけ読みました。

読んだ本

プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発・デバッグ技法まで Software Design plus | 伊藤 淳一 | コンピュータ・IT | Kindleストア | Amazon

本編

読んだページ数

  • 第4章(P○○〜P○○) ※ kindle版を使ったので、わかんないっす…

新しく知ったこと

inject メソッドとreduceメソッド

  • 配列の各要素に対して処理を行うが、大きな特徴として前の要素に対して行った処理の結果を次の要素の処理に引き継げる
  • reduceメソッドはエイリアスメソッド

number = [ 1, 2, 3 ]
number.inject("加藤") { |result, n| result + n.to_s }

#=> "加藤123"

数列かと思いきや、人名が出来あがりました。

解説

  • ブロックの第1引数には、ブロックの処理の結果が引き継がれる
    • 1回目はinjectメソッドの引数("加藤") が入る
    • 2回目は 1回目の処理の結果("加藤1") が入る
  • ブロックの第2引数は、配列の要素が格納される。

&:

  • ブロック処理は、&:に置き換えることができる。

以下の2つは同じ挙動をする

# 1
["ddt", "sto", "stf"].map{ |ele| ele.upcase }

# 2
["ddt", "sto", "stf"].map(&:upcase)

#=> ["DDT", "STO", "STF"]

解説

&:で書き換えられる条件は以下の通り

  1. ブロック引数が1つだけ
  2. ブロック内のメソッドに引数がない
  3. ブロック内では、メソッドを呼び出すだけ
    (複数の処理を実行できない)
    (演算子はメソッドでないので不可)

あとがき

  • ブログの記載で例を考えるのに時間がかかっているなーと 気付き、例に使い題材を絞ったらいいんじゃないか?と思いました。
    なので、今後は日本史プロレスが多めになると思います

  • DDTの由来って、殺虫剤らしいです。知らなかった… DDT(プロレス技) - wikipedia)

  • 手元にipadしかなかったので、コードはRubyPicoというアプリを使って確認しました。

以上

2019/10/13、14_チェリー本(6、7日目)

はじめに

昨日、更新しそこねたので、本日は、2日分書きます…

読んだ本

プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発・デバッグ技法まで Software Design plus | 伊藤 淳一 | コンピュータ・IT | Kindleストア | Amazon

本編

読んだページ数

  • 第4章(P95〜P97)

新しく知ったこと

ブロックの囲み方

  • do〜end{ }もOK
囲い方 使い時
do〜end ブロック処理が長い&改行
{ } ブロック処理が短い&一行で書く
  • 以下の2つの結果は同じく月曜日 火曜日 水曜日 木曜日 金曜日を出力する
# do~endパターン
weekday = ["","","","",""]
weekday.each do |day|
  puts "#{day}曜日"
end
# { }パターン
weekday = ["","","","",""]
weekday.each { |day|  puts "#{day}曜日"}

配列を使うメソッド

mapメソッドとcollectメソッド

  • mapcollectエイリアスメソッド1
    ※ mapメソッドは知っているので割愛

selectメソッドとfind_allメソッド

  • selectfind_allエイリアスメソッド
  • ブロック要素の戻り値がになった要素だけで、新たな配列を生成する
element = ["","","","",""]
element.select { |ele| ele.empty? }

#=>["", ""]

empty?は空配列だったらtrueを返すメソッド

rejectメソッド

  • ブロック要素の戻り値がになった要素だけで、新たな配列を生成する
    select(find_all)メソッドと逆)
element = ["","","","",""]
element.select { |ele| ele.empty? }

#=>["月", "火", "水"]

findメソッドとdetectメソッド

  • select(find_all)メソッドと同じ処理で、最初の要素だけ返す
  • detectは「検出する」の意
prime_number = [2, 3, 5,]
prime_number.detect { |num| num.odd? }

#=> 3

あとがき

知らなかったメソッドが多かったので、あんまり進みませんでした…

以上


  1. エイリアスメソッドは、同じ挙動がするのに名前だけ違うメソッド

2019/10/12_チェリー本(5日目)

はじめに

台風19号の影響、特になかったので、今日もちゃんとちょっとだけチェリー本読みました。
ただ、今後のことを考えて、これから

  • 個人実装を優先的にやるから、チェリー本読書は1日10ページ目安にやる(勉強のための勉強になってる気がするので...)
  • RSpec使えるようになりたいので、テストの項目は飛ばす

ことにしようと思います。

読んだ本

プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発・デバッグ技法まで Software Design plus | 伊藤 淳一 | コンピュータ・IT | Kindleストア | Amazon

本編

読んだページ数

  • 第2章(P67〜P68)
  • 第4章(P86〜P95)

新しく知ったこと

配列の一番最後に要素を足す

# prime numberは「素数」
prime_number = [2, 3, 5,]

prime_number << 7

#=> [2, 3, 5, 7 ]
# 「7」が一番最後に追加される

さまざまな配列の要素の消し方

delete_atメソッド

  • 削除したい要素の要素番号(添 え字)を指定して削除

配列memoryから嫌な記憶(要素番号1の「先生をお母さんと…」)を削除

memory = ["修学旅行は日光", "先生をお母さんと呼んでしまった"]
memory.delete_at(1)
#=> memory = [”修学旅行は日光”]

delete_ifメソッド

  • 条件に該当した要素のみを削除する方法
  • delete_atとの違い
    • 要素番号(添え字)がわからなくても消せる
    • 一度に復数の要素を消せる
    • 削除対象の条件は、ブロック内で指定する。

事象:配列putcher_numで、エースピッチャーがつける背番号「1」を2つ作ってしまった
対応:「1」が付いている要素を全部消す。(監督は誰に「1」を渡すか、まだ決めかねている)

pitcher_num = [1, 10, 14, 1]

pitcher_num.delete_if do |pit|
 pit == 1
end

#=>pitcher_num = [10, 14]

あとがき

寝落ちしてしまったので、更新が翌日になってしまいました…

以上

2019/10/11_チェリー本(4日目)

はじめに

チェリー本読書を今日もしました。 だんだん日課になってきて、いい感じです!

読んだ本

プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発・デバッグ技法まで Software Design plus | 伊藤 淳一 | コンピュータ・IT | Kindleストア | Amazon

本編

読んだページ数

  • 第2章(P56〜P67)

新しく知ったこと

デフォルト値付きの引数

  • 引数ありのメソッドに引数を渡さなかった場合でも、エラーにならない
    (通常、引数ありメソッドに引数を渡さなかった場合、ArgumentErrorになる)
  • デフォルト値ありとデフォルト値なしの引数を混在させることもできる

def brother (first, second, third = "なし")
  puts "長男は#{first}"
  puts "次男は#{second}"
  puts "三男は#{third}"
end

#=> 長男はせいじ
#=> 次男はジュニア
#=> 三男はなし
  • 三男には引数がないから、デフォルトの「なし」が表示される。

あとがき

万が一、台風で避難しなければいけなくなったら、チェリー本持っていこうがちょっと悩んでます…

以上