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
は繰り返し処理に対して使用します。
機能としては
- 繰り返し処理から脱出する(終了させる)
- 対象となる繰り返し処理は以下のとおり
- while
- until
- for
- イテレーター (ここにeachが含まれる)
です。
例題
明日、火曜日は燃えるゴミの日で、捨てるの忘れないようにしなきゃなー。と思っているので、こんな例題を考えました。
- システムの説明
- 配列をゴミ箱(
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
- 次の方法は、値が忍者だったとき、スキップするという発想です。
if
とnext
を使用します。
edo_people = ["侍","百姓","宣教師","忍者"] edo_people.each do | human | next if human == "忍者" puts human end
- 解説
if
とnext
を使って、「もし変数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のアルゴリズム問題で、苦戦してしまったので、その解説をしようと思います。
その問題とは、rubyでif
を使わず、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
考察結果
実行できました!
参考
- 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.rb
にconfig.time_zone = 'Tokyo'
を追加
参考
余談
そろそろ個人アプリを作り始めようと思ってます。
でも、何を作るか、いいものが思いつかない。
(ちなみに、最初に思いついたのは、「飲食店に飾ってあるけど、誰のものかわからないサイン色紙」を共有する投稿型のアプリでした…)