記憶の外付けHDD

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

2019/09/17_学んだこと

まず、アルゴリズム問題解いたので、新しく覚えた知識を記載します。

classメソッド

  • どのクラスに属しているか分かる

使用例

p "さわやか".class 
# => String

p 84.class 
# => Integer

require "date"
p Date.today.class
# => Date

文字列や整数は、全てStringクラスやIntegerクラスのオブジェクトになるらしいです。

参考

compact!

  • 配列とハッシュに対して使える
  • nilを削除して、レシーバーの中身をスッキリさせてくれる
  • 「!」が付いている = 破壊的メソッドなので、レシーバーの値を変えてしまう。
    • レシーバーを破壊したくない場合は、compactメソッドを使う

使用例(配列)

negima = ["鶏肉",nil,"ねぎ",nil,nil,"鶏肉","ねぎ"]

negima.compact!
p negima
# => ["鶏肉","ねぎ","鶏肉","ねぎ"]

参考


postgreSQL

個人開発はHerokuでデプロイするかなーと思っているので、データベースはpostgreSQLを使う予定です。
なので、今日、インストールしてみました。

今日つかったコマンド

  • インストール brew install postgresql
  • 起動 brew servises start postgresql

  • 停止 brew services stop postgresql

  • コンソールの起動 psql postgres

  • コンソールの終了 \q

以上

2019/09/16_return?break?(Ruby)

まえがき

今日もrubyアルゴリズム問題を解きました。
解いてて「ここはreturnだっけ?breakだっけ?」となったので、両者について簡単にまとめます。

return

returnメソッドに対して使用します。
機能としては

  • メソッドを途中で終了させる
  • メソッドの返り値を指定する

です。

break

break繰り返し処理に対して使用します。 機能としては

  • 繰り返し処理から脱出する(終了させる)
  • 対象となる繰り返し処理は以下のとおり

です。

例題

明日、火曜日は燃えるゴミの日で、捨てるの忘れないようにしなきゃなー。と思っているので、こんな例題を考えました。

  • システムの説明
    • 配列をゴミ箱(garbage_can)に見立ててます。
    • 配列(ゴミ箱)の上から何番目に燃えるゴミがあるか調べるシステムです。
    • 明日捨てなきゃいけない、燃えるゴミを探します。
  • 問題
    • (     )の中に入るのは、return? break?

↓例題(コード)↓

# メソッドの定義
def search_garbage_can(garbage_can, target_garbage)
  garbage_can.each_with_index do |garbage, i|
    if garbage == target_garbage
      puts "#{garbage}は、上から#{i + 1}番目に入ってます。"
      (  return? break?   )
    end
  end
  puts "それはゴミ箱の中に入ってません。"
end

# 配列(ゴミ箱)の定義
garbage_can = ["燃えないゴミ","資源ゴミ","粗大ゴミ","燃えるゴミ"]

# 調べたいゴミ(燃えるゴミ)の定義
target_garbage = "燃えるゴミ"

# システムの実行
search_garbage_can(garbage_can, target_garbage)
  • 答え
    • return
  • 解説
    • breakにしてしまうと、each_with_indexからしか抜け出せないため、以下の2つが表示されてしまう。
      • 繰り返し処理内の「燃えるゴミは上から4番目です。」
      • 繰り返し処理外だけどメソッド内の「それはゴミ箱の中に入ってません。」
    • したがって、search_garbage_canメソッドを終了させなければいけないので、returnを使います。

参考

2019/09/15_rubyの配列とeach(忍者の存在を知られないようにする)

まえがき

  • 今日も、rubyアルゴリズム問題を解いたので、新しく私の一部となった知識を記録します。
  • 内容は、配列関係です。

    例題

    以下の配列から、eachを使って全員をputsしなさい。
    ただし、忍者は除くものとする。 (存在を知られちゃいけないので)

edo_people = ["","百姓","宣教師","忍者"]

each処理をスキップする

忍者をputsしちゃいけないってことは…
→ 忍者をeachしないようにするってことなんで、
eachメソッドの対象から外す方法を調べました。

方法1

  • まず、要素の最後以外を対象にeachするという発想です。
  • array[番号].each do ~という方法を使います。
edo_people = ["","百姓","宣教師","忍者"]

edo_people[0..2].each do | human |
  puts human
end
  • 解説

    • eachメソッドの対象である配列の中身を[0..2]という記載で、「侍(要素番号0)」から「宣教師(要素番号2)」だけに限定します。
  • 問題点
    この方法だと

    • そもそも忍者の位置がわかんない。
    • 黒船が来航したので、配列に「ペリー」を追加したい。

    といった場合、対応できないです。

方法2

  • 次の方法は、値が忍者だったとき、スキップするという発想です。
  • ifnextを使用します。
edo_people = ["","百姓","宣教師","忍者"]

edo_people.each do | human |
  next if human == "忍者"
  puts human
end
  • 解説
    • ifnextを使って、「もし変数humanの値が忍者だったら、putsを飛ばす」という処理を追加しました。
    • ちなみに、↑のコードでは、「後置のif」というやつで記載してます。普通の条件分岐の書き方でもOKです。

これで、「あれ?なんとなく屋根裏に忍者がいる気がする…」といった場合でも、安心して「越後屋、お主悪よのぉ〜」的な密談ができますね。

参考

2019/09/13_eachってhashにも使えるんですね!(ruby)

今日知ったんですけど、eachメソッドって、hashに対しても使えるんですね!
基本の欠如がやばいっす…

例1

明日、燃えるゴミの日なんですよ。
だから、朝、早起きしなきゃなー、めんどくせっ!と思ってたもんで…

array = { garbage: "", type: "燃えるゴミ"}

array.each do | key, value |
  puts "キーは#{key}で、値は#{value}です。"
end

# ↓出力結果
#キーはgarbageで、値は紙です。
#キーはtypeで、値は燃えるゴミです。

ポイント

  • キーとバリューを取り出すので、eachのブロック引数が2つ
  • なお、ブロック引数が1つの場合は、garbage: 紙といった具合に、キーと値の両方が返ってきます。

例2

ちなみに、キーだけまたは値だけ欲しい場合は、以下のように記載します。

array = { garbage: "", type: "燃えるゴミ"}

array.each do | key, value |
  puts "値は#{type}です。"
end

# ↓出力結果
#値は紙です。
#値は燃えるゴミです。

といった風に、処理を書くところ(do~endの中)に、扱いたい方のブロック引数のみ書けばOKです。

これ1つ覚えておけば、keysメソッドvaluesメソッドのことをすっかり忘れてしまっても、なんとかなります!

参考文献

伊藤淳一『プロを目指す人のためのRuby入門』技術評論社,2017年,149ページ


あとがき

今日は、メソッドの気の利いた使い方思いつかなかったっす…
想像力も欠如ぎみですね…

以上

20190912_「せんぷうき」から「ぷ」を取り出す(rubyで文字を抽出)

まえがき

今日もアルゴリズム問題を解いてました。
そこで、新しいメソッドを学んだので、記載します。

例題

文字列「せんぷうき」から「ぷ」だけを抜き出しなさい。
(目の前に扇風機があったもんで…)

答え

str = 'せんぷうき'
puts str[2]

=> ''

解説

  • 使ったメソッドは文字列[位置]
    • [位置]には左から数えた文字数(数字/0から始まる)を入れる

他にいろいろ試して見ると…

str = 'せんぷうき'

puts str[0]
=> ''

puts str[-1]
=> ''
# '-1'は末尾の文字を抽出する

puts str[1,2]
=> 'んぷ'
# [位置,文字数]にすると、位置から指定した文字数を取得できる

参考

instance method String#[] (Ruby 2.6.0)

あとがき

アルゴリズム問題を毎日解くようにしてるんですけど、そもそもアルゴリズムってなんだろ?
アルゴリズムといえば、思い浮かぶものはこれだけど…
01 アルゴリズムたいそう - YouTube

2019/09/11_case文の使い方(fizzbuzz問題)

はじめに

rubyアルゴリズム問題で、苦戦してしまったので、その解説をしようと思います。
その問題とは、rubyifを使わず、fizzbuzz問題を解くと言うものです。

はまった点

条件分岐だけど、if使えないってことは…
case文を使えばいいのかってなったんですけど、そもそものcaseの使い方があやふやなため、このあと 、ドツボにハマりました。

実際に書いたコード

for num in 1..100 do
  case num
  when num % 15 == 0
    puts "fizzbuzz"
  when num % 5 == 0
    puts "fizz"
  when num % 3 == 0
    puts "buzz"
  else
    puts num
  end
end

結果、1から100までの数字が素直に出力されました…

case文について理解する

case文はif文と同じ条件分岐の仲間なので、使い慣れているif文をcase文で書き直してみたいと思います。

例題プログラム

変数hospitalに

  • "takasu"が入っていたら、YES!
  • "shonan"が入っていたらpassion!
    を返すプログラムを作ってみます。
    (考えてるとき、湘南美容外科クリニックの広告が目の前にあったもんで…)

if文

hospital = "takasu"

if hospital == "takasu"
  puts "YES!"
elsif hospital == "shonan"
  puts "PASSION!"
end

=> "YES!"が出力

んー、しっくり!
ドバイあたりをヘリコプターで飛んでいる光景が目に浮かんできます。

case文

さっきの美容外科プロクラムをcaseで書いてみると

hospital = "shonan"

case hospital
when "takasu" then
  puts "YES!"
when "shonan" then
  puts "PASSION!"  
end

=> "PASSION!"が出力

ちゃんと、相川先生の好きな言葉が返ってきました。

ポイント

  • caseの後ろに比較の対象となるオブジェクトを指定する
  • whenのあとには、一致しているか検査する値&実行する処理を記載する。

変数に入った値が一致しているかどうかはイメージつくけど、
fizzbuzz問題みたいに、計算結果を比較したい場合はどうすればいいのか…?

考察

開き直って、case文の特徴を抜き出してみると…

  • 「caseの後ろ」と「whenの後ろ」が一致している
    → 処理が開始する

  • 「case」には、不変の値を書く

ってことだから…

  • caseの後ろに0を書く(条件分岐の中で不変の部分だから)
  • whenの後ろnum % ◯(式の部分)を配置

したらどうか…?

 # コードは以下のとおり
 
for num in 1..100 do
  case 0
  when num % 15 then
    puts "fizzbuzz"
  when num % 5 then
    puts "fizz"
  when num % 3 then
    puts "buzz"
  else
    puts num
  end
end

考察結果

実行できました!

f:id:daawwaa:20190911195446j:plain
結果

参考

- case文 - 条件分岐 - Ruby入門

感想

  • 解決できてうれしかった!四角い頭が丸くなった感じです!
  • ただ、公式リファレンスとか見ず、推論だけでいろいろ試してみただけなので、プログラミングの学習方法として正しかったのか自信ないっす…

以上

2019/09/10_日本の時間にセットする(rails)

そういえば、作成してたチャットアプリに表示している時間が、
どこか別の国の時間になっていたので、修正しました。

修正方法

コード

config/application.rb

(中略)

module APP
  class Application < Rails::Application
    config.time_zone = 'Tokyo'
    #↑これを追加
    config.i18n.default_locale = :ja
    (中略)
  end
end

解説

  • config/application.rbconfig.time_zone = 'Tokyo'を追加

参考


余談

そろそろ個人アプリを作り始めようと思ってます。
でも、何を作るか、いいものが思いつかない。
(ちなみに、最初に思いついたのは、「飲食店に飾ってあるけど、誰のものかわからないサイン色紙」を共有する投稿型のアプリでした…)