TEHC CAMP 91期夜間休日 卒業後活動記録

7月19日 学習のアウトプット

Rubyドリル

任意の文字列に特定の文字列が含まれているか判断するプログラム

要件

  • 任意の文字列にcatとdogの文字列が含まれている場合は、True

  • 任意の文字列にcatとdogの文字列が含まれていない場合は、False

雛形

def include_cat_and_dog?(str)
 #処理
end

#呼び出し例
include_cat_and_dog?("catdog")

出力例

  • include_cat_and_dog?("catdog") → True

  • include_cat_and_dog?("catcat") → False

  • include_cat_and_dog?("1cat1cadog") → True

include?メソッド

指定した要素が含まれているか判断するメソッド

解答

def include_cat_and_dog?(str)
 if str.include?("cat") && str.include?("dog")
  puts True
 else
  puts False
 end
end

#呼び出し例
include_cat_and_dog?("catdog")

include?メソッドを使用してcatとdogが含まれているかを判断します。 さらに、演算子&&を使用することで、catとdogどちらも含まれているとういう条件になります。

ifとelse

要件

プログラムを実行すると

① 「[0]:カロリーを表示する、[1]:終了する」という選択肢が表示され、数字を入力することができる

② 0を入力すると「500kcal」と表示され、上記の①が繰り返される

③ 1を入力するとアプリケーションが終了する

while

条件によって繰り返し処理を行う

while 条件式 do
 処理するアクション
end

プログラムを終了させずに同じ処理を繰り返す場合は

while true do
 処理するアクション
end

⚠無限ループになるので、止める時はctrl+c

解答

while true do
 puts "[0]:カロリーを表示する"
 puts "[1]:終了する"
 input = gets.to_i
 
 if input == 0
  puts "500kcal"
 elsif input == 1
  exit
 end
end

while true do として、処理を繰り返します。 入力された値が、0の場合は500kcalを表示し、 1 が入力された場合は、exitとなり終了します。

progate

Ruby on Rails 学習コースⅩ

いいね機能の実装

まずは、likesテーブルを作成します。

$ rails g model Like user_id:integer post_id:integer

カラムも同時に作成しています。

値が空では登録できないようにバリデーションを設定します。

validates :user_id, {presence: true}
validates :post_id, {presence: true}

投稿にいいねしたかを表示させます。
show.html.erbファイルに記述します。

<% if Like.find_by(user_id: @current_user.id, post_id: @post.id) %>
 いいね!済み
<% else %>
 いいね!していません
<% end %>

likesコントローラーを作成します。 ビューファイルなどはいらないため、controllersフォルダに手動で作成します。

ルーティングを設定します。

post "likes/:post_id/create" => "likes#create"

likesコントローラーにcreateアクションを記述します。

def create
 @like = Like.new(
   user_id: @current_user.id,
   post_id: params[:post_id]  
 )
 @like.save
  redirect_to("/posts/#{params[:post_id]}")
end

createアクションへのリンクにします。
show.html.erbファイルの いいね!していませんの部分を

<%= link_to("いいね!", "/likes/#(@post.id)/create", {method: "post"}) %>

に書き換えます。

一言日記

最近、サボり気味でした。 モチベーションが上がらない…… というより、何がしたかったのかわからなくなった。 プログラミングスクールにいけば、転職して、人生変えられるって思ってたけど、 結局、そんなにうまく行かないですね。 今まで何もしてこなかったんだから、当然といえば当然。 35歳になってやっと、これからのことを考えるようになって、 今をなにをしないといけないのか、何ができるのかを考え行動するように心がけるようになりました。 ようやくスタートラインって感じです。 いや、まだ準備運動かも…… とはいえ、プログラミング、動画編集しながら、 地方移住&カフェ開業も視野にいれつつがんばります。

TEHC CAMP 91期夜間休日 卒業後活動記録

7月5日 学習したこと

Rubyドリル

randメソッド

num = rand(10)

このコードを実行するとランダムな数字が代入されます。

要件

numが5以上だった場合は「○は4より大きい!」

4以下だった場合は「○は5より小さい!」

と表示されるようにします。○には変数numの数字が入るようにします。

randメソッド

num = rand(100)
puts num
=> # 0~99の範囲でランダムな数字が生成される

回答

num = rand(10)
if num >= 5
 puts "#{num}は4より大きい!"
else
 puts "#{num}は5より小さい!"
end

解説

ランダムな数値を生成するためにrandメソッドを使い、変数numに代入します。

演算子 >= を使用し、5以上かどうかを判定しています。

運勢の表示プログラム

要件

誕生日を入力すると、今日の運勢を表示するプログラムを作成します。

・引数として誕生日の数字を受け取る(例:4月3日なら403、11月15日なら1115と入力)
・誕生日の数字に、乱数で生成された0 ~ 9の数字のいずれかを掛け算し、その後4で割った時の余りを算出
・シャッフルした占い結果を格納した配列から、上記の数値の順番の値を取り出す
 ["凶","中吉","吉", "大吉"]

shuffleメソッド

配列の要素をランダムにシャッフルし、結果を配列として返すメソッド。

# shuffleメソッドで配列をシャッフルし、変数animalsに代入
animals = ["cat", "dog", "rabbit"].shuffle

puts animals
# => ["rabbit" , "cat", "dog"]

回答

def result_of_uranai(birthday)
 results = ["凶", "中吉", "吉", "大吉"].shuffle
 num = birthday * rand(10) % 4
 puts "今日のあなたの運勢は、#{results[num]}だよ!"
end

puts "誕生日を入力してください"

birthday = gets.to_i
result_of_uranai(birthday)

解説

result_of_uranaiメソッドを定義し、引数にgets.to_iで入力しbirthdayに代入された値を渡しています。

流れは、変数resultsにshuffleメソッドでシャッフルした値が代入します。

次に、変数resultsから値を取り出す計算を行います。

「誕生日の数字に、乱数で生成された0 ~ 9の数字のいずれかを掛け算し、その後4で割った時の余りを算出」を

num = birthday * rand(10) % 4

とします。

最後に計算結果ををもとに、出力します。

引数とハッシュ

要件

映画のハッシュを定義し、格納されている「title」(タイトル)・「genre」(ジャンル)・「year」(公開年)の三つの要素の中から一つを取り出すプログラムを作成します。

定義する変数

①movie = {"title" => "ハリーポッター", "genre" => "ファンタジー", "year" => "2001年"}

②ユーザーが入力するキーを、getsメソッドを利用し定義します

実行結果

#【例】titleの要素を取り出したい場合
# デスクトップに移動
%cd Desktop
# Rubyファイルを実行
%ruby argument_test.rb
 "以下から一つを選んで入力してください。
・title
・genre
・year"
#「title」を入力
title
ハリーポッター

回答

def movie_info(movie, data)
 puts movie[data]
end

movie = {"title" => "ハリーポッター", "genre" => "ファンタジー", "year => "2001年"}

puts "以下から一つを選んで入力してください。
 ・title
  ・genre
  ・year"
 
info = gets.chomp

movie_info(movie, info)

解説

ハッシュ名[キー名]とすることで、そのキーに対応するバリューを取り出すことができます。

キーに文字列を使用してハッシュを定義した場合、キーを文字列で指定します。

【例】movie["title"]

シンボルを使用して、

movie = {title: "ハリーポッター", genre: "ファンタジー",  year: "2001年"}

のように定義した場合、キーをシンボルで指定します。

文字列のキーではバリューを取得できません。

【例】movie[:title]

よって、getsの返り値を文字列からシンボルに変換する必要があります。

def movie_info(movie, data)
  puts movie[data]
end

movie = {title: "ハリーポッター", genre: "ファンタジー",  year: "2001年"}

puts "以下から一つを選んで入力してください。
  ・title
  ・genre
  ・year"

info = gets.chomp.to_sym

movie_info(movie, info)

to_symメソッドで、文字列からシンボルに変換しています。

クラスとインスタンス

要件

・Personクラスはプロパティ name, ageを持っている。
・StudentクラスはPersonクラスを継承している。
・Studentクラスにはintroduceメソッドが定義されている。実行すると
 「私の名前は◯◯です。◯歳です」と表示がされる。
・Studentクラスのインスタンスを作成し、introduceメソッドを実行する。

クラスの継承

利用したいすべてのクラスを最初から作成することなく、共通する部分を受け継ぐことができます。

class クラス名 < 継承したいクラス名(親クラス)

end

具体的には

class Animal
  def initialize(name)
    @name = name
  end
end

class Dog < Animal
  def name
    puts "名前は#{@name}です。"
  end
end

pochi = Dog.new("ポチ")
pochi.name

AnimalとDogの2つのクラスがあり、Dogクラスの共通した部分を受け継ぎたいので、Dog < Animal とします。これによりpochi.nameでメソッドを呼び出したときに、問題なく@nameにアクセスが可能になります。

回答

class Person
  def initialize(name, age)
    @name = name
    @age = age
  end
end

class Student < Person
  def introduce
    puts "私の名前は#{@name}です。#{@age}歳です"
  end
end

yamada = Student.new("山田", 20)
yamada.introduce

StudentクラスはPersonクラスの共通する部分を受け継ぎたいので、Student < Person としました。これによってyamada.introduceでメソッドを呼び出したときに、@nameへアクセスできるようになります。

progate

Ruby on Rails 学習コースⅨ

投稿とユーザーを紐付ける

  1. postsテーブルにuser_idカラムを追加する
  2. 投稿時にuser_idの値を入れて保存する
    @current_user.idで現在ログインしているユーザーを取得する
  3. モデルにインスタントメソッドを定義する
    return User.find_by(id: self.user_id)
  4. ユーザーに紐づく複数の投稿を取得する
    whereメソッド
    条件に合致する複数のデータを取得するメソッド

一言日記

本当にやりたいこと

プログラミングを勉強して、就活がスタートして、

いろいろ考えます。

自分がやりたいことってなんだったんだろう?

なんでプログラミングを学ぼうと思ったのかな?

就活がはじまって、面接対策に考えた、

自己PRとか、エンジニアを目指した理由とか、志望動機とか…

嘘ではないんだけど、心のどこかでひっかかる気がする。

いい印象を持ってもらうために、世の中のためとか、人に喜んでもらうとか…

間違ってはないんだけど、なんか違うよね?

そのまえに、自分じゃない?

就活支援面談で自分視点が強すぎるって言われたから、世の中のためとか人のため

って考えたけど、そもそも転職したいと思ったのも、このまま使い捨ての駒に

されたくないって思ったのがきっかけで、「人生を変えたい」と思って行動した。

間違ってるかもしれない、うまく行かないかもしれない。

でも、このままは嫌だって思ったから、プログラミングを学んで

自分で稼げる力を手に入れるために、退職した。

でも、また表面だけ取り繕って、就活して、企業にはいって

それじゃ今までと、同じことにならない?

一つの選択肢として、就職って道を残したけど

スクールを卒業して、これからどうお金を稼げばいいかわからなくて

不安で、就職するしかないのかなって囚われて、自分を取り繕って

もやもやしながらも就活して、

でも、ほかに何をしたらいいかわからず、毎日が過ぎていく。

たぶん、ここをしっかり考えないと就活してもうまく行かない気がする。

どこかに就職できたとしても、また消耗しながら自分を見失っていく気がする。

読んだ本

「考えるな、助けろ。」イケハヤ✕若者

内容は、イケハヤさんとやりたいことがわからない若者の対談。

イケハヤさんは効率よく稼げて、面白そうなものをゲーム感覚でやっているそうです。

やりたいことは簡単には見つからないみたいです。

「やってみてはやめてを繰り返して、人と違うことを楽しむ」ことが大事なんだとか。

たしかに楽しくないと続かないのはわかりますね。

あたりまえのようで、楽しめてない気がします。

プログラミングスクールのときは、週一でチームで共有できたから楽しかった。

でも、いまは淡々とこなすだけで楽しさがなくなった。

仕事と繋がっていれば達成感とかから楽しみが得られるんだろうけど

それもないからただこなしているだけになっている。

あと、人と違うことをしないといけないそうです。

人と同じことばかりやっていると、自分で考えることがなくなる。

言われたことしかできない人間になる。

たしかに、じぶんで考えて行動しようとするとうまく行かないことばかりで

しんどい、めんどくさい事が多い。

仕事をやめて、言われたことをやっているのがいかに楽だったか実感しました。

ただ、楽なことをやっていても成長はしない。

私は、退職して、うまくいかないことばかりで、なにしたらいいかもわからないし、

しんどいけど、35歳ではじめて、自分の人生を真剣に考えている気がします。

これからどうなるかわからないけど、後悔だけはしたくない。

これからは、たのしいことを、追い続けよう。

やりたいことは簡単に見つからない。

たのしみながら、スキルを磨いて、その過程で自分のやりたいことを磨き込んでいく。

を心がけていきたいと思います。

あと、ボランティアをやってみたいと思うようになりました。

TEHC CAMP 91期夜間休日 卒業後活動記録

7月4日

Rubyドリル

任意の文字列から特定の連続する文字列を検知するプログラム

  • 任意の文字列から連続する文字列"xyz"を探し、その直前にピリオド(.)がない場合はTrueを出力する
  • 任意の文字列から連続する文字列"xyz"を探し、その直前にピリオド(.)がある場合はFalseを出力する
  • 上記2つの条件に当てはまらない場合はFalseを出力する

出力例

  • xyz_there('abcxyz') → True
  • xyz_there('abc.xyz') → False
  • xyz_there('xyz.abc') → True
  • xyz_there('azbycx') → False
  • xyz_there('a.zbycx') → False

参考

include?メソッド

指定した要素が配列または文字列に含まれているか判断するメソッド

str = "foobar"
puts str.include?("bar")
#=> true
puts str.include?("hoge")
#=> false

回答

def xyz_there(str)
 if str.include?(".xyz")
  puts "False"
 elsif str.include?("xyz")
  puts "True"
 else
  puts "False"
 end
end

xyz_there('abcxyz')

回答

”abc.xyz”という文字列の場合

str.ininclude?("xyz")においてもtrueとなってしまうので、

str.include?(".xyz")の条件式をstr.include?("xyz")より前に設置します。

引数

数字を2つ渡すと、それらを掛け算した結果を返すプログラムを作ります。

定義する変数

2つの数字を、num1、num2という変数にgetsメソッドを利用して定義します。

実行結果の例

#デスクトップに移動
$cd Desktop
#Rubyファイルを実行
$ruby argument_test.rb
最初の数字を入力してください
5
2番目の数字を入力してください
6
5と6をかけた答えは30です!

回答

def multiplication(num1, num2)
 puts "#{num1}と#{num2}をかけた答えは#{num1 * num2}です!"
end

puts "最初の数字を入力してください"

num1 = gets.to_i

puts "2番目の数字を入力してください"

num2 = gets.to_i

multiplication(num1, num2) 

解説

引数の受け取り側の名前はなんでもいいのですが、メソッドの呼び出し側と

同じにしたほうがわかりやすくなります。

複数の引数を渡すこともできますが、引数の受け取り側はメソッドの呼び

出し側での引数の順番で代入される値を決めています。

順番が逆になるとややこしくなるので注意が必要です。

クラスとインスタンス

要件

  • Bookクラスを作成する
  • Bookクラスは@titleと@priceをプロパティとして持っている
  • attr_readerを使用する
  • Bookクラスのインスタンスを作成する(タイトル、価格は任意)
  • 作成したインスタンスから、タイトルと価格を取得し画面に表示させる。

参考

attr_readerメソッド

インスタンス変数を呼び出すメソッドを定義するメソッド

記述量を減らせます

attr_readerを使用しない場合

class Dog
  def initialize(name)
    @name = name
  end

  def name
    @name
  end

end

dog = Dog.new("ポチ")
puts dog.name

attr_readerを使用した場合

class Dog
  attr_reader :name

  def initialize(name)
    @name = name
  end
end

dog = Dog.new("ポチ")
puts dog.name

回答

class Book
 attr_reader :title, :price

 def initialize(title,  price)
  @title = title
  @price = price
 end
end

book = Book.new("プロを目指す人のためのRuby入門", 3218)
puts book.title
puts "#{book.price}円"

解説

sttr_reader :title, :priceという記述で、@titleと@priceにアクセスできる

ようにしています。

繰り返し

times分を使って、繰り返すプログラムを作ります

10.times do |i|
 puts "#{i + 1}回目の繰り返し"
end

解説

繰り返したい回数 .timesで繰り返す回数を決めます。

10.timesとendの間に、繰り返す出力を記述します。

○回目の繰り返しと出力するには、10.times do |変数名| として

変数名に現在の繰り返し回数が入るようになります。

プログラムなので1回目は0となるので+1にしています。

progate

Ruby on Rails 学習コースⅧ

before_action

全アクションで共通する処理をまとめることができます。

before_action :呼び出すメソッド名

省略

def メソッド名
 処理
end

onlyを用いて、指定したアクションのみでメソッドを実行できるようになります。

applicationコントローラーで定義すると、他のコントローラーで継承して、使うことができます。

before_action :メソッド名, {only: [:index, edit, :shoe]}

一言日記

働くってなんだろう?

仕事?

私は何がしたかったんだろう……

TECH CMAPでプログラミングを学んで、卒業して、就活を開始しているけど

結局、入社できたとして、

研修して、かんたんな業務を経験しながら

勉強を続けて、いつかはエンジニアになれる

って道。

10年ほど若かったらそれでいいんだろうけど

35歳からその道で大丈夫かな。

経験積めた頃には、また技術が新しくなって

若い世代と戦うことになる。

勝てるか?

勝てたとしても、かなりの消耗になることは間違いない。

セブンイレブンをやめる時は大丈夫!行ける!って

思ってたけど、現実はそんなに簡単じゃない。

まぁあのままセブンにいても消耗していくだけなので

辞めたのは間違いじゃなかったって思っているけど

これから、どう進めばいいかわからない。

私の向いていること、ワクワクすること、苦じゃないこと、世の中のためになること

毎日考える。

答えが見つからない。

平気な顔しているけど

内心は不安でいっぱい。

稼ぐ力がないのに仕事をやめて

収入がない状態はまずかった。

もっとはやくに行動して、クラウドソーシングくらいは

経験しておくべきだった。

数万円でも稼げていれば、

すこしは楽だったはず。

後で後悔……

いつも同じことを繰り返す。

ブログとクラウドソーシングで少しは稼げるように

頑張ろうかな。

ちょっとでも稼げたら、

不安がマシになる気がする。

今は、就活に専念しようと思ったけど、

「稼ぐ」ことにフォーカスしてみよう。

フリーランスは憧れるけど、

自分で考えないといけないので、しんどい。

組織の中にいるほうが、楽だよね。

でも、楽して自分で考えなかった結果が今だよね。

これからは、自分で考え行動しないと。

不安で、辛いけど、頑張る。

TEHC CAMP 91期夜間休日 卒業後活動記録

7月2日 学習したこと

Rubyドリル

預金システムのアルゴリズム

要件

銀行口座に10万円の預金残高があり、お金を引き出すプログラムを作成します。
・お金を引き出すwithdrawメソッドを作成する
・お金を引き出すと手数料110円かかり、「◯◯円引き落としました。残高は◯◯円です」と表示する(残高は手数料を引いた額を表示します)
・もし預金残高より多く引き落としたら「残高不足です」と表示する

参考

def withdraw(balance, amount)
  fee = 110  # 手数料
# 引き落とし額と残高を表示する、もしくは残高より多く引き落としたら残高不足と表示
end

balance = 100000  # 残高
puts "いくら引き落としますか?(手数料110円かかります)"
money = gets.to_i
withdraw(balance, money)

回答

def withdraw(balance, amount)
 fee = 110
 if balance >= (amount + fee)
  balance -= (amount + fee)
  puts "#{amount}円引き落としました。残高は#{balance}円です"
 else
  puts "残高不足です"
 end
end

balance = 100000
puts "いくら引き落としますか?(手数料110円かかります)"
money = gets.to.i
withdraw(balance, money)

解説

入力した金額(amount)と手数料(fee)の合計が100000以上かどうかを

if文で条件分岐しています。

100000以上の場合は、balance -= (amount + fee)

が処理されます。

配列に格納された数値の合計値を算出するプログラム

要件

  • 配列に格納された3つの数値の合計を出力する
  • ただし、同じ数値が2つ以上含まれている場合、その数値は合計する要素に含めない

出力例

  • lone_sum([1, 2, 3]) → 6
  • lone_sum([3, 2, 3]) → 2
  • lone_sum([3, 3, 3]) → 0

参考

def lone_sum(ary)
  # 処理を記述
end

# 呼び出し例
lone_sum([1, 2, 3])

回答

def lone_sum(ary)
  uniq_nums = []
  ary.each do |num|
    count = 0
    ary.each do |i|
      if num == i
        count += 1
      end
    end
    if count < 2
      uniq_nums << num
    end
  end

  # uniq_nums
  sum = 0
  uniq_nums.each do |unique_num|
    sum += unique_num
  end
  puts sum
end

# 呼び出し例
lone_sum([1, 2, 3])

解説

2〜13行目で重複しない値のみ取り出す処理を、16〜19行目で重複しない値のみになった配列内の合計を求める処理を行っています。

num == i で重複したときcountが増えるようになります。

重複した値が1つのときだけ、uniq_nums配列に値を追加します。

これを配列の数だけ繰り返します。

そして、uniq_nums配列内の合計を求めます。

Rubyの検索

配列に任意の値が存在するかどうか、そして何番目に存在するか、

検索するコードを作ります。

要件

  • 添字が0の要素の配列における「1」は「配列の0番目に存在する」と表現します。
  • 任意の値が配列内に存在しない場合は、「値は配列内に存在しません」と表示する
  • 存在する場合は、配列の何番目にあるかを表示する。

バイナリーサーチ

配列に入ったデータに対する検索を行うときに用いられる手法。

まず、中央の値を確認し、検索したい値との大小関係を用いて、検索したい値が中央の右にあるか、左にあるかを判断します。それを繰り返し、片側には存在しないことを確かめながら検索していく方法。

https://tech-master.s3.amazonaws.com/uploads/curriculums//353ef454a5c0be1064c8256f72998bac.png

出力例

検索したい数字を入力してください
5
5は配列の2番目に存在します 

検索したい数字を入力してください
7
7は配列内に存在しません

回答

def binary_search(array, right, target)
  left = 0
  while left <= right
    center = (left + right) / 2
    if array[center] == target
      return center
    elsif array[center] < target
      left = center + 1
    else
      right = center - 1
    end
  end
  return -1 
end

array=[1,3,5,6,9,10,13,20,26,31]

puts "検索したい数字を入力してください"
target = gets.to_i
number_of_elements = array.count

result = binary_search(array, number_of_elements, target)

if result == -1
  puts "#{target}は配列内に存在しません"
else
  puts "#{target}は配列の#{result}番目に存在します "
end

1〜14行目で中央の値を見て、検索したい値との大小関係を用いて、検索したい値が中央の値の右にあるか、左にあるかを判断して、片側には存在しないことを確かめながら検索を行う処理を行っています。13行目のreturn -1は何も当てはまるときがないときに、最終的な返り値になります。

条件演算子

要件

3桁の整数を入力し、その整数の「百の位・十の位・一の位の和」が

10の倍数からの差が

・2以内であるときは"True"
・それ以外は"10の倍数との差は○です"

と表示されるようにします。

出力例

  • near_ten(117)→True
  • near_ten(123)→10の倍数との差は4です
  • near_ten(111)→10の倍数との差は3です

*百の位・十の位・一の位の和が6などの時に、「10の倍数との差は6です」と出力せずに、「10の倍数との差は4です」と10の倍数から近い方の差を出力するようする。また、0も10の倍数に含むものとする。

回答

def near_ten(num)
  total = (num/100) + (num/10 % 10) + (num % 10)
  remainder = total % 10
  if remainder <= 2 || remainder >= 8
    puts "True"
  elsif remainder <= 5
    puts "10の倍数との差は#{remainder}です"
  else 
    puts "10の倍数との差は#{10 - remainder}です"
  end
end

(num/100) + (num/10 % 10) + (num % 10)で百の値・十の位・一の位を

それぞれ足し合わせています。

<num/100 (百の位)>
num = 117の場合

117/100 は1.17になります。integer型の計算では小数点以下は切り捨て

になるので「1」になります。

<num/10 % 10(十の位)>

num = 117の場合

117/10 は11.7になり、小数点を切り捨てられ11になります。

11 % 10 は10で割った余りを計算結果とするので、余り1となり

十の位は「1」となります。

<num % 10の場合(一の位)>

num = 117の場合

117 % 10 は117を割った際の余りを計算結果とするので、

余りは7となります。

よって、一の位は「7」になります。

progate

Ruby on Rails 学習コースⅧ

10ページまでクリア

TEHC CAMP 91期夜間休日 卒業後活動記録


7/1 学習内容&まとめ

Rubyドリル

クラスとインスタンス

class Student
  def set_name(name)
    @name = name
  end

  def self.introduce
    puts "私の名前は#{@name}です。"
  end
end

student = Student.new
student.set_name("山田太郎")
student.introduce

これではエラーが出ます。

①エラーが起きた原因

クラスメソッドとインスタンスメソッドを間違えているのでエラーになります。

クラスメソッドインスタンスメソッド
概念の違いクラス全体で共通したふるまいを表すクラスから生成されたインスタンスのふるまいをあらわす
使い方の違い定義するときは、self.を頭につける
クラスのみ使用可能
定義するときはなにもつけない
インスタンスのみ使用可能
コードdef self.メソッド名

end
def メソッド名

end

*頭に@をつけた変数はインスタンス変数と呼びます。

別のインスタンスメソッド内でも使用できるようになります。

最後の行で、クラスメソッドintroduceをインスタンスが呼び出しているが、クラスメソッドはインスタンスから呼び出せないのでエラーになります。

②正しいソースコード

class Student
  def set_name(name)
    @name = name
  end

  def introduce
    puts "私の名前は#{@name}です。"
  end
end

student = Student.new
student.set_name("山田太郎")
student.introduce

文字の順番を入れ替えて出力するプログラム

要件

  • 任意の文字列の最初の2文字を取得する
  • 取得した2文字を最後尾に移動させた状態で、その文字列を出力する

出力例

  • left2("Hello") → lloHe
  • left2("java") → vaja
  • left2("Hi") → Hi

値の取得

文字列に対して配列同様に[ ]を用いて取得したい文字列のインデックスを指定することで、値を取得できます。

str = "HELLO"

puts str[1]
# => 1

回答

def left2(str)
 puts str[2..-1] + str[0..1]
end

left2("Hello")

解説

str[2..-1]で3文字目から最後まで、str[0..1]で最初の2文字を取得しています。

最初の2文字を最後に移動させた状態にしたいので、str[2..-1] + str[0..1]

の順にしています。

特定の数値の個数を算出するプログラム

複数の数字が格納されている配列に「9」が何個含まれているか出力するプログラムにします。

要件

  • 配列の中の数字に対して、9の個数を数える
  • 数えた9の個数を出力する

出力例

  • array_count9([1, 2, 9]) → 配列の中には9が1個です
  • array_count9([1, 9, 9]) → 配列の中には9が2個です
  • array_count9([1, 9, 9, 3, 9]) → 配列の中には9が3個です

countメソッド

引数に指定した数字に一致するものの個数を数え、その結果を返すメソッド

ary = [1, 2, 4, 2]

ary.count(2)
 # => 2

回答

def array_count9(nums)
 count = nums.count(9)
 puts ("配列の中には9が#{count}個です")
end

array_count9([1, 2, 9])

解説

countメソッドを使い、指定した数字に一致するものの個数を数えます。

if else

2桁の正の整数を入力し、その整数が、10の倍数からの差が

2以内である時はTrue

それ以外はFalseと出力するメソッドを作ります。

出力例

  • near_ten(12)→True
  • near_ten(17)→False
  • near_ten(19)→True

回答

def near_ten(num)
 quotient = num % 10
 if quotient <= 2 || quotient >= 8
  puts "True"
 else
  puts "False"
 end
end

解説

2桁の整数が10の倍数から差が2以内ということは、10で割ったときの余りが2以下または8以上と解釈できます。

この処理を

quotient = num % 10
 if quotient <= 2 || quotient >= 8

で行っています。

progate 学習コースⅧ

7ページまで

一言日記

最近モチベーションが上がらない。

ってことで、今月からカレンダーに手書きで完了したことを記入する

方法にしてみました。

  • 進んでいる感覚がある方がモチベーション維持できるということ
  • スマホやPCでは余計なものを見てしまう

以上をふまえた上で大きめの卓上カレンダーに書き込めばいいのでは?

と思い、今月から試しにやってみます。

いつまで続くかわからないけど、常に見えるようにしているので

忘れることはないはず。

やることリスト

①就活

②朝のルーティン

③英語と数学の勉強

④プログラミングの勉強

⑤ブログ&読書

できた番号をカレンダーに記入していきます。

あれもこれもやらないとって、自分をおいこんで結局できなくて

へこんで、あせって…

余裕をもったほうがいいんだろうけど

今までが何もしてこなかったから

ついあせってしまう。

一歩ずつと心のなかで言い聞かせながら、今できることをがんばります。

TEHC CAMP 91期夜間休日 卒業後活動記録

6/26 学習したこと&まとめ

Rubyドリル

if else

要件:

  • 購入金額が999円以下の場合、3%のポイント
  • 購入金額が1000円以上の場合、5%のポイン
  • 誕生日の場合はポイントが5倍

となるポイント付与サービスのメソッドを作ります。

誕生日の場合はtrue、誕生日でない場合はfalse

.floorメソッド

小数点の切り捨てを行うメソッド。

呼び出し方:

calculate_points(amount, is_birthday)

出力例:

calculate_points(500, false) → ポイントは15点です
calculate_points(2000, false) → ポイントは100点です
calculate_points(3000, true) → ポイントは750点です

def calculate_points(amount,is_birthday)
 if amount <= 999
  point = amount * 0.03
 else
  point = amount * 0.05
 end
 if is_birthday
  point = point * 5
 end
  puts "ポイントは#{point.floor}点です"
end
解説

購入金額が999円以下なのか1000円以上なのかを if amount <= 999

で判断して、購入金額に対して0.03または0.05をかけてポイント数を

計算してpointに代入させます。

その後に、is_birthdayがtrueの場合変数pointに5をかける処理にしています。

point.floorとして小数点を切り捨て、ポイント数を出力します。

FizzBuzz問題

1~100までの数字を出力して、

3の倍数のときは「Fizz
5の倍数のときは「Buzz」
両方の倍数である15の倍数のときは「FizzBuzz

と出力するプログラムを作ります。

whileメソッド

条件を指定して繰り返し処理をするメソッド

def fizz_buzz
 num = 1
 while (num <= 100) do
  if (num % 3 == 0) && (num % 5 == 0)
   puts "FizzBuzz"
  elsif (num % 3) == 0
   puts "Fizz"
  elsif (num % 5) == 0
   puts "Buzz"
  else
   puts num
  end

  num = num + 1
 end
end

fizz_buzz
解説

while (num <= 100)で1~100までの数字を出力します。

if文で条件分岐させ、3の倍数のとき、5の倍数のときを先に記述すると

15の倍数のときの処理をする前にtrueになってしまうので、15の倍数である条件式を一番に記述します。

15の倍数の条件式は(num % 15 == 0)でも可能です。

FizzBuzz問題の応用

いくつまでカウントするか、引数で指定できるようにします。

範囲を指定して繰り返しする場合
範囲演算子(..)
(開始する値..終了する値)

# 1~6までの範囲を指定して、繰り返し表示
(1..6).each do |num|
  puts num
end

を使います。

def fizzbuzz(max_num)

  (1..max_num).each do |num|
    if num % 15 == 0
      puts "FizzBuzz"
    elsif num % 5 == 0
      puts "Buzz"
    elsif num % 3 == 0
      puts "Fizz"
    else
      puts num
    end
  end
end

puts 'いくつまで数えますか?'
num = gets.to_i
fizzbuzz(num)
解説

1..max_num で1から入力した値まで繰り返すようにしています。

2つの文字列の末尾に対して一致、不一致を判断するプログラム

2つの文字列の末尾の文字を比較して、

一致する場合は、true

一致しない場合は、false

を出力するプログラムを作ります。

要件:

  • メソッドの引数に、任意の2つの文字列を指定する。
  • 引数に指定された2つの文字列のうち、どちらかがもう一方の文字列の末尾にある場合は、Trueを出力する
  • 上記を満たせていない場合は、Falseを出力する
  • 入力された文字が大文字でも小文字でも、同一の文字として処理を行う

出力例:

end_other('Hiabc', 'abc') → True
end_other('AbC', 'HiaBc') → True
end_other(‘abc’, ‘HaIoBc’) → False

sliceの範囲指定
#範囲を指定して要素を切り取る場合
# 要素を定義
array = "Hiabc"

#配列番号(インデックス番号)の-3から-1の範囲の文字列を切り取る
array.slice(-3..-1)
#=> abc
downcaseメッソド
大文字を小文字に変換するメソッド
# 大文字を含んだ文字列を定義
irb(main):001:0> name = "Hiabc"
=> "Hiabc"

# downcaseメソッドを使用し、小文字に変換
irb(main):002:0> name.downcase
=> “hiabc”

を使います。

def end_other(a, b)
  a_down = a.downcase
  b_down = b.downcase
  a_len = a_down.length
  b_len = b_down.length
  if b_down.slice(-(a_len)..- 1) == a_down || a_down.slice(-(b_len)..- 1) == b_down
    puts "True"
  else
    puts "False"
  end
end

# 呼び出し例
end_other('Hiabc', 'abc') 
解説

大文字と小文字を区別しないようにdowncaseメソッドを使い、

小文字に変換して、a_downとb_downに代入しています。

その後に、どちらかの文字列を小文字がもう一方の最後にある場合を

区別するための処理になります。

slice(-(a_len)..- 1)としているのは、対象の文字列分を切り取るためです。

if文でabcの最後にHiabcが含まれているか、Hiabcの最後にabcという文字列が含まれているかを判別しています。

b_down.slice(-(a_len)..- 1)は、b_down.slice(-5..-1)となります。しかし、b_down = abcとなっているので、インデックス番号-5から-1という条件で切り取ることができません。そのため、この部分はnilとなります。結果、nil == a_downは等しくないと評価されるので、falseになります。

続いて
a_down.slice(-(b_len)..- 1)は、a_down.slice(-3..-1)となります。

hiabcという文字列の最後にabcが含まれているかを確認したいので、abcという文字列分を左から数えます。すると、hiabcの最後までを範囲指定していることがわかります。そしてa_down = hiabcとなるので、インデックス番号-3から-1という条件で切り取るとabcが残ります。結果、abc == b_downは等しいと評価されるので、trueとなります。

progate

復習

rails g migrationコマンド

マイグレーションファイルのみを作成するコマンド

$ rails g migration ファイル名

カラムを追加するとき
add_column :テーブル名, :カラム名, :データ型
Fileクラス

ファイルを作成するために、Fileクラスのwriteメソッドを使います。

$ rails console
> File.write("public/sample.tet","Hello World")

画像を保存するには、File.binwriteを使います。

File.binwrite("public/user_images/#{@user.image_name}",image.read)
              #ファイルの場所                 #ファイルの中身

一言日記

同じRuby on Railsでもテックキャンプとプロゲートですこし違う。

ただ、違いはあれ基本は同じなので復習にも新しい学習にもなります。

あたらしいスキルを身につける時は、複数の媒体で学習する方が、ものになる

確率が上がるってのは、こういうことなのかと実感。

午前に会社説明会に参加しました。

プログラミングの教育事業をしている企業で、求人ページ見てて感じた

仲間と一緒に成長できるとか、熱意をもった仕事に夢中になれるとか

説明会でさらに感じました。

こうゆう会社で働けたら生きることが楽しくなるのかな…。

いまでなんとなく生きてたから(笑)

この年になってやっと、自分の成長とかやりたいこととか真剣に考えるように

なって、プログラミング勉強したり、瞑想したり、運動したり、もっと早く

気づいてたらって思うけど、過去の出来事があったから、今があって、

今やから考え行動することができた。って思う。

ただ、やっぱりふとした瞬間に過去を悔やんでしまう。

過去ではなくこれからどうするかってことが大事なのはわかってはいるのに…

今できることを少しずつ積み上げるしかないですよね。

さて、今日もがんばります。

TEHC CAMP 91期夜間休日 卒業後活動記録

6/24 学習内容&まとめ

Rubyドリル

if else

平日ではないまたは、休暇の場合はtrue

休暇ではない場合はfalseと条件分岐させるメソッドを作ります。

出力例:呼び出し元の引数に、trueまたは falseを2つ渡します。

第一引数の値は「平日かどうか」第二引数には「休暇かどうか」を、

trueまたはfalseで表します。

sleep_in(false, false) → true
sleep_in(true, false) → false
sleep_in(false, true) → true

def sleep_in(weekday, vacation)
 if (weekday != true) || (vacation == true)
  puts true
 else
  puts false
 end
end

解説:

第一引数、第二引数にtrueもしくはfalseを渡すメソッドになります。

第一引数には「平日である = 土日祝日ではない」場合にtrue

第二引数には、「休暇をとっている」場合はtrue

この2つの引数から、平日ではないもしくは休暇の場合はtrue、

平日である場合はfalseを返すためにif文で条件分岐しています。

「平日ではない」のように「〜ではない」と否定の条件の場合は

「!=」を使用します。

weekday != true で平日ではないとなります。

論理演算子||を使い、平日ではないまたは休暇の場合と定義しています。

簡単な計算を行うRubyプログラム

2桁以上の整数を入力すると、十の位と一の位の数字を足し算、

十の位と一の位の数字を掛け算を行い、最後に2つの結果を足し合わせて

出力するプログラムを作ります。

出力例:

> 二桁の整数を入力してください
> 15

# 1 + 5と 1 * 5をそれぞれ計算

> 足し算結果と掛け算結果の合計値は11です
def addition(a, b)
  a + b
end

def multiplication(a,b)
  a * b
end

def slice_num(num)
  # 10の位
  tens_place = (num / 10) % 10
  # 1の位
  ones_place = num % 10
  return tens_place, ones_place
end

puts "二桁の整数を入力してください"
input = gets.to_i
X, Y = slice_num(input)
add_result = addition(X, Y)
multiple_result = multiplication(X, Y)
puts "足し算結果と掛け算結果の合計値は#{add_result + multiple_result}です"

解説:

ある整数を取り出すには

①取り出したい数字の桁数で割る
② ①の結果をさらに10で割った、そのあまりが任意の桁の数字

です。

Rubyの整数同士の計算だと返り値は小数点以下は切り捨てになります。

そのルールを利用して、変数X、Yに代入しています。

変数にカンマでくきると、同時に複数の変数を定義できます。

X、Yに10の位、1の位を同時に代入しています。

最後に結果を足して合計値を出力します。

末尾の文字列を3回出力する

対象の文字列の末尾に位置する文字を取得し、それらを任意の回数

繰り返して出力するプログラムを作ります。

要件:

  • 対象の文字列から末尾にある2文字を取得すること
  • 取得した2文字を3回繰り返して出力すること

出力例:

extra_end('Hello') → 'lololo'
extra_end('ab') → 'ababab'
extra_end('Hi') → 'HiHiHi'

使うメソッド:

sliceメソッド

配列や文字列から指定した要素を取り出す事ができるメソッド

# 配列を作成します
array = [0,1,2,3,4,5,6]

# 配列から引数で指定した要素を取得します
ele1 = array.slice(1)
puts ele1
#=> 1

# 配列番号-4から4つ分の要素をsliceします
ele2 = array.slice(-4,4)
puts ele2
#=> 3, 4, 5, 6

# 配列はもとのままです
puts array 
#=> [0,1,2,3,4,5,6]
def extra_end(str)
 right2 = str.slice(-2, 2)
 puts right2 * 3
end

extra_end('Hello') #"Hello"で呼び出した場合

解説:

extra_endの仮引数strに値を渡し、strに対してsliceメソッドを使用します。

sliceメソッドの1つ目の引数で文字列の後ろから2番目の要素を基準点として

います。2つ目の引数で基準点から2つ分の要素を取り出す指定になります。

そして、取り出した要素を3回繰り返すようにします。

if else

仕様:

・メソッド外で定義された3つの正の整数を、それぞれ仮引数a,b,cとして

numメソッド内で使用する。
・第一引数と第二引数は足し算をし、変数abに代入。
・第三引数が3以下の場合は変数abを第三引数の値で割り、結果を出力する。
・第三引数が4以上の場合は変数abを第三引数の値で掛け、結果を出力する。

出力例:

num(1,5,3) → 2
num(1,5,5) → 30
num(1,9,-2) → -5

def num(a,b,c)
 ab = a + b
 if c <= 3
  puts ab / c
 else
  puts ab * c
 end
end

解説:

1つ目の仕様をab = a + b で第一引数aと第二引数bを足すようにしています。

つづいて、第三引数cが3以下なのかをc <= 3の条件分岐します。

trueの場合は変数abをcで割る処理、falseの場合は変数abにcをかける

処理をするようにしています。

progate

学習コースⅥ

進捗:完了

復習

#複数行の入力フォーム
<textarea>
#Ⅰ行の入力フォーム
<input> *終了タグは必要ない
#フォームに入力された値を送信するためにname属性を指定する
<p>ユーザー名</p>
<input name="name">
<p>メールアドレス</p>
<input name="email">
#フォームの初期値をvalue属性で指定する
<p>ユーザー名</p>
<input value="たろう">
<p>メールアドレス</p> #Rubyコードを使う場合
<input value="<%= @user.email %>">
#保存が成功したときサクセスメッセージを表示させる
def create
 @user = User.new()
  if @user.save
   redirect_to()
   flash[:notice] = "登録が完了しました"
  else
   render()
  end
end

一言日記

昨日はかなり寝坊してしまいました。

テックキャンプが終わってから、モチベーションが低下気味。

というよりこれからどうしようか悩んでいるのが原因かな。

1つ目の道は就職すること

2つ目はフリーランスとして仕事をすること

ただ、どちらも経験がない私にできるのだろうかという不安…

そして、就職することへの不安。

これまで、人間関係のトラブルが多かった。もうこりごり。

だから、就職して人間関係が大丈夫かなって事と、

新しいことに挑戦する恐怖感がつきまとう。

思い切ってこのままフリーランスって道もあるけど、

生活できるだけの収入を得られるか不安。

テックキャンプのスクールを決めた時は

プログラミングを学んで、クラウドワークスとかで

受注できるくらいにはなっているかと思ったけど

結局、勉強しようが関係ないってことを実感。

勉強じゃなくて、行動できるかどうかの方が大切。

とりあえず、やってみて

うまく行かなかったときに勉強するのがいい。

勉強しても収入につながらなければモチベーションが下がる。

頭にもはいらない。

この仕事のここがわからないから

わからないところを勉強する

って順序がいい気がする。

誰かもそんなこと言ってたし…

石橋を叩いて叩いて…ビビる人。

小さいことから行動しよう。

できそうな案件に応募してみよう。

就活も8月くらいまで頑張って

決まりそうになかったら、そのとき考えよう。

という思考がぐるぐるしてたので

昨日はおもいきって、1日海外ドラマ見てました(笑)

ゲーム・オブ・スローンズ ファイナル・シーズン」

アマゾンで購入しました(笑)

ジョン・スノウがかっこいい

デナーリス・ターガリエンはきれい。最後はこわかった…

1話見てやめるとか無理なんで1日で全話見ました(笑)

いや〜おもしろかった。

何度も見直したい海外ドラマの一つですね。

さて、今日は勉強を頑張ろう!