20200207のRubyに関する記事は9件です。

[Ruby]Dateクラスで日付を扱う

RubyのDateクラスについて

  • RubyのDateクラスを使用することで『日付』を扱うことができます。
 # Dateクラスを読み込む
 require "date"

 # Date.newの引数に年月日を渡して、変数dayに格納
 day = Date.new(2020,2,22)

 # dayの出力結果は「2020-02-22」となる
 puts day

 # 「sunday?」メソッドは日付が日曜日かどうか真偽値を返す
 puts day.sunday?

Dateクラスの便利な使い方やメソッドについて、また随時更新していきたいと思います!
ご覧いただきありがとうございました!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Railsで部分テンプレートを使用時、Missing テンプレートエラーが出た際、解決したこと

Missing partial shared/_header with {:locale=>[:en], :formats=>[:html], :variants=>[], :handlers=>[:raw, :erb, :html, :builder, :ruby, :coffee, :jbuilder]}. Searched in:っというエラーが発生した際、どう解決したのか

erbファイルに部分テンプレートを書く際は、基本 <%= render 'ファイル名' %> でよかったはず・・・・
以下参照(ピカワカさんありがとうございます)
https://pikawaka.com/rails/partial_template

スクリーンショット 2020-02-07 21.09.21.png

以上のような階層です。

部分テンプレートを当てたい場所と、使用するテンプレートについて

テンプレート化したいものはsharedファイルの中にある

_header.html.erb っというファイル

部分テンプレートを使用する場所は

new.html.erb

ファイルをまたいでいるため、shared/テンプレ化したファイル名
っという記述であってるはず・・・・

っと思ったが、

スクリーンショット 2020-02-07 21.19.18.png

devise/shared/headerっというファイルを指定したら解決

<%= render "devise/shared/header" %>

上記の通り上の階層のdeviseを指定すると、部分テンプレートを使用できた。
謎でしたが・・・・とにかく解決した!10分くらいで解決したのが幸い。

ここは違う、ここはこうしたほうが良い等々ございましたらご指摘いただけますと幸いです。
最後までみていただきありがとうございます。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

人の感情を可視化するアプリを作りました【キドアイラク】

はじめに

皆さん初めまして!
本記事は私がrailsで作った初めてのアプリである「キドアイラク」の紹介記事になっています。
スクリーンショット 2020-02-07 16.08.35.png

https://kidoairaku2019.herokuapp.com

この「キドアイラク」がどのようなアプリかというと、タイトル通り「人の感情を可視化する」アプリです。
自分がここ数日どんな感情で過ごしていたのか、他の人はどんな時にどんな感情を抱くのかを一目で確認することができます。
街中を歩く一人一人の感情が透けて見えるイメージです。
本サービスを作った背景や機能は後ほど詳しく語りたいと思いますので、もし興味がある方は読んで頂けると幸いです。

そして、僅か一ヶ月ほどで作ったのでショボい作りにはなっていますが、是非一度使っていただけると嬉しいです。

作った理由

ある一枚の画像

このサービスを作るきっかけになったのはある一枚の画像です。
lain.jpg
この画像は1998年に放送された『Serial experiments lain』というアニメのワンシーンです。
ネット上で顔の見えないアバターが好き勝手に意見を言い合っています。
このシーンを見たとき、現在SNS上で起こる炎上をうまく表現されていると感じました。
全く顔も表情も分からないユーザー同士が140字程度で意思疎通を図るなんて土台無理な話です。
元々SNSの炎上に対する嫌悪感があったので、この画像を見ながら「どうすれば炎上しないSNSを作れるだろうか」と考えていました。
そこで思い浮かんだのが「文章に感情を付ける」というアイデアでした。

今のSNSには「感情」が足りない

現実とインターネットの最大の違い、それは「感情」が見えるかどうかだと思います。
例えば、現実世界で挨拶する時、私たちは相手の表情、声のトーン、雰囲気から、相手がどんな感情かを判断することができます。
一方、インターネットの中では、どんな気分でいたとしても「おはようございます」の一言で表現できてしまいます(絵文字や顔文字が付く場合もありますが)。
これでは相手の気持ち、感情を全く理解することができません。
また、現在のSNSは構造上、どうしても自己顕示欲に塗れた人たちが多くなってしまうので、結果的に相手の意見を理解しようともせず自分の考えを押し付けるユーザーが発生してしまいます。
それがSNSで炎上が起こる原因だと感じました。
もし、ネット世界で相手の感情を簡単に理解できるようになれば、ネット上のコミュニケーションはどう変化するだろうか。
いつしかそんなことに頭が支配され始めました。

「感情」を健康にしたい

これはサービスを作り終わった後に思い付いたことです。
みんなジムに行ったり、ジョギングしたり、自分の身体を痛めつけることで健康を維持(確認)していますが、一週間に一回自分の感情を確認することは怠っています。
しかし、感情を確認することは非常に重要です。
自分がどんな時に感情を変化させるのか、最近の自分の感情はどんな割合なのか。
それを徹底的に理解しなければ、真の意味で健康にはなれないのではないでしょうか。

人の感情が知りたい

このサービスを作った最後の理由。
それは、「人の感情が知りたい」という単純な願望です。
私はある時期から、街中を歩いている一人一人が何を考えているのか、どんな感情で生きているのかと疑問に思って生きてきました。
この記事を読まれている方の中にも、そんな人がいると思います。
しかし、実際に街中の人に話しかけることもできず。
また、現状のSNSでは的確な感情把握ができません。
それなら自分で作るしかない、ということで「キドアイラク」を作ることを決めました。

キドアイラクの三つの機能

ここからは「キドアイラク」の主な機能について説明します。

自分の文章に感情をつける

スクリーンショット 2020-02-07 16.11.37.png
本サービスでは文章を投稿する際に「喜怒哀楽」の四つの感情をつけていただきます。
投稿された文章には感情が表示されるので、その文章がどんな感情で書かれたのか、一目でわかります。
また、文章を投稿するたびに自分の感情と向き合うことで、感情を俯瞰的に見る習慣がつき、結果的に自分の感情をコントロールしやすくなると考えています。
他にも、喜怒哀楽それぞれの投稿を見ることができるので、あまりネガティヴな意見を見たくない場合は、「よろこび」や「たのしい」の部分だけ見ていただくことも可能です。

自分の感情がグラフ化される

スクリーンショット 2020-02-07 16.23.19.png
マイページでは、最近自分がどんな気持ちでいるかを把握できる「感情グラフ」を見ることができます。
グラフは「当日」と「過去一週間」の二種類存在しており、他ユーザーの感情を見ることも可能です。
「怒りの感情が多いから減らそう」「もっと嬉しい気持ちを増やしたい!」といったように、日頃の感情を知ることで、自分を変えるきっかけを作ることができるのです。
他にも特定のワードがどのような感情のもと書かれているかを検索できる機能もありますので、ぜひお好きなワードを調べてお楽しみください。

承認欲求から解放される

他のSNSでは「他人から評価されたい」と考える自己承認欲求の強いユーザーが数多くいます。
その原因は、いいね数や(ツイッターで言う)リツイート数が表示されるからでしょう。
SNSに資本主義の要素を作ったことで、多くの人がその数字に囚われるようになってしまいました。
しかし、本来良質なコミュニケーションを築く上で、そういった数字を表示する機能は必要ありません。
現にインスタグラムはいいねの数を非表示にしましたし、ツイッターもいいね機能を失くす話が度々出ています。
そういったこともあり、キドアイラクでは「いいね機能」「シェア機能」「フォロー機能」を導入しないことで、必然的に承認欲求から解放される仕組みに設計しました。
誰かに認められようとするのではなく、常に自分と向き合い、成長しようと前を向き続ける向上心を持ちたい方にオススメのサービスです。

まとめ

全く0の知識から作ったので、ひとまず完成させられたことにホッとしています。
しかし、それ以上に圧倒的な技術不足を痛感しました。
自分が思ったようにできないことも多く、直さなければいけないところは山ほど存在します。
デザインも他所から拝借したものも多くありますから、それも直す必要がありそうです。
何より、自分の頭にあるものを形にする難しさを嫌という程知りました。
ものづくりって大変ですね。

最後にもう一度URLを貼っておきます。
ぜひ一週間ほど使ってみてください。
自分の感情と向き合い、自己分析してくだされば、このアプリの効果を実感していただけると思います。
https://kidoairaku2019.herokuapp.com/

ここまで読んでくださった皆さん、本当にありがとうございました。
エラーがなんども出て大変な時もありましたが、今回の経験を糧に、さらに色んなものを作っていきたいと思います。
その時はまたよろしくお願いします。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【実体験をもとに】30歳未経験から独学4ヶ月でバックエンドエンジニアとしてWeb系自社開発企業へ転職するまでのロードマップ

こんにちは。

2020年2月現在、スタートアップ期のWeb系自社開発企業から内定をいただきました。
今回はこれからプログラマーとしてWeb企業へ転職される方を応援するため、私が知識ゼロの状態から学習をスタートし転職するまでの過程を踏まえたロードマップを共有します。
一つの例として参考にしていただければと幸いです。

前置き

本記事はプログラミング初心者を対象にしたものなので、理解しやすいように噛み砕いて文章を作成しています。
多少語弊のある内容もあるため現役プログラマーの方の閲覧時は生暖かい目で見てください(笑)

私の実体験をもとに作成していたため、実際にはもっと素晴らしいロードマップもあると思います。

投稿者スペック

エンジニアキャリア1ヶ月目のできたてホヤホヤ新人
年齢:30歳(既婚)
住所:埼玉県
前職:一般企業の拠点マネジメント系
学歴:大卒(文系)
・プログラミングの知識はゼロ(多少Excelを触れるくらい)
・わりとコミュ力はあるほう

転職先での待遇

給料(年収):400万ほど(前職と同程度)
社会保険などの福利厚生
リモートワーク可

学習開始から転職までにかかった期間

■4ヶ月
うち3ヶ月は前職と並行して学習
うち1ヶ月は前職の有給を使用し就活に専念
前職の退職日1週間後に内定をいただきました。

学習方法

eラーニング(Progade.CODEPREP)
MENTA
Qiita
その他IT技術に関するブログ
各技術の公式リファレンス(各技術公式の説明書)

転職完了時のスキルセット

HTML
CSS
Ruby
Ruby on Rails
MySQL
Rspec
AWS
Docker
CircleCI
Git

ロードマップ(1月スタートとする)

1月:基本学習(Progateを使用)
2月:ポートフォリオ作成
3月:ポートフォリオのブラッシュアップ
4月:就活

私は仕事をしながら通勤時や帰宅後、休日を利用して学習しました。
仕事の繁忙から半月の間全く勉強できない事も・・・。
平日は1〜3時間、休日は4〜7時間ほど勉強していました。
(もちろん30分くらいしか勉強しなかった日も間々ありました)
もっと少なくても多分ダイジョーブ!

先に記載しますが、Progateなどの学習サイトを周回する必要は無いと思っています
実際に技術を使用して何か成果物を作るのが一番早い学習方法であり、学習サイトではそのための足がかりさえ得られれば良い。というのが私の個人的見解。(百聞は一見に如かずというやつですね)
たっぷりと時間があるならともかく、仕事をしながら勉強していた私にとって学習サイトを周回するのは時間的な費用対効果が低かったのです。

1月 基本学習

第1週 HTML&CSSの学習

Progate (https://prog-8.com/) を利用しての学習。
難しいものではありません。サクッとクリアして、何か簡単なWebサイト1つを模写しました。
私は下記のようにデザイン例の載ったサイトから好みのものを一つ選んで同じようなレイアウトを1から作ってみました。
https://sankoudesign.com/
※「カーソルを合わせたらポップアップが出る〜」だとかそういった事はスルーして良いと思います。

第2週 Rubyの学習

Progateを利用しての学習。
完全に理解する必要は無いと思います。この段階では感触さえつかめれば良。
基礎の基礎とはいえ、この段階で完全な理解をするのは難しく時間がかかります(=挫折しやすくなる)。
あまり気構えせずにユルく馴染ませていきましょう。
※逆にこの段階では、学んだことを何に使うのか分かっていない状態のため、うまく定着しないでしょうしね(^^;)
※先述したように今後のことを考えるとさらに踏み込んだ学習は必須なので、後で改めて学習しましょう。

第3週〜第4週 Ruby on Rails の学習

Progateを利用しての学習。
今までと違いしっかりと理解しながら学習すべきだと思いました。
1つのセクションが終わるたび自分のPC上で同じように開発を行ってゆくという方法で復習をしました。
Progateでは「指示された通りに穴埋めをしてゆく」というスタイルで課題を進めるため、ただの作業になってしまいがち。「今自分が何をしているのか」ということや「システムの全体像」がイメージしづらく、うまく定着しないと考えたからです。

2月 ポートフォリオ作成

プログラマー転職において必須とも言えるのがポートフォリオの作成です。
これに最低限のクオリティを持たせなければ好条件での転職は望めないでしょう。
※どのようなポートフォリオを作成すべきかについてはまた別の機会に提案できればと思っています。

第1週〜第2週 基本機能を備えた動画投稿サービスを作成 & MySQLの学習

Qiitaを参考にした記事投稿サービスを作成しました。
同時に否が応でもDBに関する学習をしなければなりません。MySQLあるいはPostgreSQLを選択するのが無難かなと。
着実に機能を実装してゆくのはとても楽しく苦にならないかと思いますが、これまでとは違い予期せぬエラーとの戦いが始まります。
解決できないエラーに直面した時に相談できる相手がいると良いですね。
slackなどのプログラマーコミュニティーに入ったり、MENTAを利用することをお勧めします。
また、ここからGitHubの使用を始めました。(1時間もあれば使えるようになります)

第3週〜第4週 作成したアプリをAWSへデプロイ

Herokuへのデプロイであればすぐに完了すると聞きますが、ここはより実践的にAWSへデプロイしました。
初学者にはかなりの難題でした。私は先輩エンジニアに教えてもらってなんとかなりましたが、知り合いがいない場合はMENTAの使用を強くお勧めします。

3月 ポートフォリオのブラッシュアップ

ここまでで作成したポートフォリオはチュートリアルで学んだものに毛が生えた程度のものという評価になると考え、成果物に対してさらに+αのアピールポイントをつけていきました。
またこの時期は年末で私の仕事が大変忙しく、学習にかけられる時間は半分以下になっています。

第1週〜第2週 Dockerによる開発環境構築

Dockerは初学者には大きなハードルとなりますが、現在の開発現場ではスタンダードになっているとの情報を得ましたので必ず手をつけることをお勧めします。
前職場の先輩がベテランプログラマーの知人に私のことを話した際「Dockerを使用してポーロフォリオを開発しAWSへデプロイした」と伝えたところ「それは就活成功するやつだね」と言われたそうです。
そのくらい「Dockerを扱える」というのは初学者への評価をするにあたって一つの指標となるのかなと思いました。

参考にしたのはQiitaの記事https://qiita.com/nsy_13/items/9fbc929f173984c30b5d
Dockerは注目度が高い技術のため、参考文献が多いのが幸いですね!先人に感謝!!

第3週〜第4週 CircleCIの導入 & Rspec導入

※私自身は仕事で忙しくこの時期は全くと言っていいほど学習に手をつけられていません。しかし、本来であればこのタイミングが良いと思い記載します。

CIツールとしてCircleCiを学習。これもまた注目度の高い技術なので参考文献がゴロゴロ転がっています。
CD機能についてまではできていなくても良いと思います。この段階では自動テストのために導入すれば十分かと。
CDまでできたらすごい。ぜひ教えてください。

【補足】 ここでCircleCIでなく、何かしらのAPIをポートフォリオに導入する方が就活に活きると思いました。

4月 就活

いよいよ就活です。
就活と同時並行で改めてRubyの学習を行うとなお良かったな〜と思います。
就活における注意点というか心構えのようなものは別の機会でお話しできればと思いますが、私が強く思ったことだけ。

  • 焦らずゆとりを持って取り組む。
  • ただし最初の1社はとにかく早い段階で選考を受ける。
  • 何十社も受ける必要はない。
  • Wantedlyプレミアム会員に登録する。

5月まで突入しても良いと思います。そうそううまくいくものではないので、納得いく会社から内定をもらえるまでじっくりと取り組んでください。

【補足】3月の段階から就活をスタートする方が効率的かもしれません。

私は仕事が忙しく、とても無理でしたが・・・。

終わり

以上が私がプログラミング学習を始めて〜内定に至るまでの過程です。
長文を読んでいただきありがとうございます。
最後に私のプログラマー転職を成功に導いてくれた要因を列挙します。

  • コツコツと勉強を続けていく持続力
  • 「プログラミング楽しい!」とまでは行かないまでも、特に苦にならないという相性。
  • 初対面の人とも仲良くなれるコミュニケーション能力。
  • 即行動・即実践する意識。
  • アドバイスをしてくれるエンジニア仲間。
  • ほどほどに休憩を取っていたこと。
  • 無職状態になったとしても生活できるだけの貯金があったこと。
  • くじけそうな時に支えてくれた家族。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Ruby解答]変数

[Ruby解答]変数

概要

  • 基礎学習中メンター向けの変数の学習フォローのための解答です
  • 解答例を読み、わからなかったところをメモ書きしましょう
  • わからなかったところは基礎学習中の方同士で説明しあってみましょう
  • わからなければメンター教育担当に聞きましょう

解答例

kubo_array = ["くぼる","なにわろてんねん"]

for kubo in kubo_array do
  for_kubo = kubo
end

kubo_array.each do |kubo|
  each_kubo = kubo
end

puts for_kubo
puts each_kubo 
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Railsでja.ymlが反映されない

railsにてja.ymlに追記をしたが反映されなかった

ja.yml
#変更前(反映されなかったもの)
ja:   
    activerecord:
      attributes:
     board:
          name: 名前
          title: タイトル
          body: 本文

#変更後
ja:   
    activerecord:
      attributes:
        board:
          name: 名前
          title: タイトル
          body: 本文

boardのインデントが問題で反映されなかったよう。
直したら反映された。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【備忘録】can't find gem bundler(Gem::GemNotFoundException)というエラーの解決法

何をしようとしていた時に起きたエラーなのか

git cloneで他の人が作ったアプリをローカル環境に移し、bundle installする時に以下のエラーが起きた。


can't find gem bundler (>= 0.a) with executable bundler (Gem::GemNotFoundException)

「実行できるbundlerが見つかりません」というエラーである。

やってみたこと

とりあえず、bundlerもgemなので 'gem list'コマンドを実行して確認してみる。


$ gem list

すると、

bundler (2.1.4)

自分のローカル環境でbundler発見。

次に、外からcloneしたアプリのGemfile.lockを確認してみる。

BUNDLED WITH
   2.0.2

あれ、バージョンが一致してないぞ?

原因

今回のエラーの原因は、自分がローカルで使用するbundlerと他の人のGithubからcloneしてきたアプリで使用されていたbundlerのバージョンに差異があったことだった。

解決法

一度cloneしてきたアプリのGemfile.lockを削除して、再度bundle install。

$ rm -rf Gemfile.lock
$ bundle install

そうすることで、自分がローカルで使用しているbundlerのバージョンが反映されたGemfile.lockがまた生成されるので、無事にbundler関連のコマンドが使えるようになる。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Ruby Error[Your Ruby version is 2.6.3, but your Gemfile specified 2.6.5]

Ruby Error[Your Ruby version is 2.6.3, but your Gemfile specified 2.6.5]

上記のエラーに引っ掛かったので記事にしました。

環境

macOS Catalina 10.15.3

Rubyのversionを変えたくても変えられない。

スクリーンショット 2020-02-06 23.09.29.png

rbenvの導入

ここを参考にして、rbenvというRubyのversion管理ツールを導入した。

$ brew install rbenv ruby-build

.bash_profileへ記述

eval "$(rbenv init -)"

または

$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile

初期化設定の反映

$ source ~/.bash_profile

目的とするversionのRubyをinstall

$ # install可能なversionを表示
$ rbenv install -l
$ # versionを指定してinstall
$ rbenv install 2.6.5
$ # インストールしたversionを使用可能な状態にする⇒shimsへの反映
$ rbenv rehash

README.md上に、新しいversionをinstallした後に関して、

Installs shims for all Ruby executables known to rbenv (i.e., ~/.rbenv/versions//bin/). Run this command after you install a new version of Ruby, or install a gem that provides commands.

と記述があるので、shimsをinstallするためにrbenv rehashを行います。

version切替

version切り替えに関して、このような記述があったので、ひとまず現在のディレクトリ下のversionを切り替えるために以下のようなコマンドを実行します。

$ rbenv lacal 2.6.5

もちろんglobal用も用意されています。

Current Directoryのversion確認

$ rbenv versions
  system
* 2.6.5 (set by /Users/[user_name]/.rbenv/version)

2.6.5と表示されています!
目的のversionを手に入れることができた!と思いきや、、、

解決されたと思ったら、何故か同じエラーが繰り返される

スクリーンショット 2020-02-06 23.09.29.png
何故でしょう?

参照している場所が違うのではいか?

bundlerの場所を調べる

$ which bundler
/Users/hoge/.rbenv/shims/bundler
(hogeにはusernameが入る)

中身を確認

$ cat /Users/hoge/.rbenv/shims/bundler

#!/usr/bin/env bash
set -e
[ -n "$RBENV_DEBUG" ] && set -x

program="${0##*/}"
if [ "$program" = "ruby" ]; then
  for arg; do
    case "$arg" in
    -e* | -- ) break ;;
    */* )
      if [ -f "$arg" ]; then
        export RBENV_DIR="${arg%/*}"
        break
      fi
      ;;
    esac
  done
fi

export RBENV_ROOT="/Users/hoge/.rbenv"
exec "/usr/local/Cellar/rbenv/1.1.2/libexec/rbenv" exec "$program" "$@"
(hogeにはusernameが入る)

間違っていなさそう。
他にも

$ which ruby
$ which bundle

などと同様なことを確認したが、参照先に間違いはなさそうだった。

しかし、ここが原因だと指摘している記事もあった。

解決(たまたま)

たまたま以下のコマンドを打ち込んだら解決された。

$ bundle install

そもそもbundler, bundleとは

  • bundler
    プロジェクト内で使うGemのパッケージ管理ツール。
  • bundle
    bundlerを扱うコマンド

結局のところ、なぜ解決されたのか

$ bundle install
(省略)
Bundle complete! 5 Gemfile dependencies, 104 gems now installed.
Bundled gems are installed into `./vendor/bundle`

因みに上記のコマンドを実行することで、Gemfileをもとにgemをインストールすることができる。
上記のコマンドで解決されたわけだが、その訳は、rbenvと依存関係にあったパッケージがinstallされていなかったからではないか。と推測する。

しかし、ここ

This happens when there is a difference between the version of Ruby you are using locally, and the versions specified in your Gemfile and Gemfile.lock.

と書かれていることから、カレントディレクトリで使おうとしているrubyのversionとGemfileに記載されているrubyのversionが異なっていたことが原因だと考える。

試しにGemfileを見てみました。

$ gem environment
RubyGems Environment:
  - RUBYGEMS VERSION: 3.0.3
  - RUBY VERSION: 2.6.5 (2019-10-01 patchlevel 114) [x86_64-darwin19]←確かに2.6.5になっている!!
  - INSTALLATION DIRECTORY: /Users/s09519/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0
  - USER INSTALLATION DIRECTORY: /Users/s09519/.gem/ruby/2.6.0
  - RUBY EXECUTABLE: /Users/s09519/.rbenv/versions/2.6.5/bin/ruby
  - GIT EXECUTABLE: /usr/bin/git
  - EXECUTABLE DIRECTORY: /Users/s09519/.rbenv/versions/2.6.5/bin
  - SPEC CACHE DIRECTORY: /Users/s09519/.gem/specs
  - SYSTEM CONFIGURATION DIRECTORY: /Users/s09519/.rbenv/versions/2.6.5/etc
  - RUBYGEMS PLATFORMS:
    - ruby
    - x86_64-darwin-19
  - GEM PATHS:
     - /Users/s09519/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0
     - /Users/s09519/.gem/ruby/2.6.0
  - GEM CONFIGURATION:
     - :update_sources => true
     - :verbose => true
     - :backtrace => false
     - :bulk_threshold => 1000
  - REMOTE SOURCES:
     - https://rubygems.org/
  - SHELL PATH:
     - /Users/s09519/.rbenv/versions/2.6.5/bin
     - /usr/local/Cellar/rbenv/1.1.2/libexec
     - /Users/s09519/.rbenv/shims
     - /usr/local/bin
     - /usr/bin
     - /bin
     - /usr/sbin
     - /sbin

実行結果の3行目に書かれている通り、2.6.5と書かれていました。
自分がうっかり$ rbenv lacal 2.6.5する場所を間違えてしまったかもしれません。(記憶してなくて申し訳ないです)

参考

https://qiita.com/_am_/items/c1dbeb11f40bbbac8fd9
https://qiita.com/kHigasa/items/2e9764e7e80d1bdd8186
https://qiita.com/hisonl/items/162f70e612e8e96dba50

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

クラスメソッド、インスタンスメソッド。いつ使うのか。

まだエンジニアとして働く前、ちょうどRubyの勉強を始めた時に書いた「メソッドとクラスメソッドとインスタンスメソッドが曖昧だった」という記事があります。
この記事ですが、すでに1年半ほどが経過しているにも関わらず現在もいいねが押されており、初学者の助けになっているのであれば嬉しい限りです。
しかし、読み返してみるとこの記事は概念を説明しているだけで実際にどのように使えばよいのかは記述されておらず、腑に落ちないところがあるのかなと思いました。
そこで、今回はできる限り実例を交えて解説していきたいと思います。

いきなりですが、あなたは校長先生になります。

あなたにはいまから校長先生になっていただきます。生徒が入学してくるため、入学した生徒の管理をRubyで行ってください。

クラスを作る

まずはクラスを作成しましょう。クラス名は1年1組で、担当教師は山中先生です。

最初は最低限の機能
class Class
  def initialize(teachername, grade, group)
    # gradeは学年、groupは組
    @teachername=teachername
    @grade=grade
    @group=group
  end
end

my_class = Class.new("山中", 1, 1)

とりあえずクラスが1つできました。

生徒を入学させる(入学メソッド作成)

生徒を入学させていきます。入学する生徒の数は5人です。入学させるためにインスタンスメソッドを作成し、入学させましょう。

5名が入学
class Class
  def initialize(teachername, grade, group)
    @teachername=teachername
    @grade=grade
    @group=group
    # 名簿を作成
    @roster=[]
  end

  def enter(name)
    # インスタンスメソッド
    @roster.push name
  end
end

my_class = Class.new("山中", 1, 1)
my_class.enter("平沢")
my_class.enter("秋山")
my_class.enter("田井中")
my_class.enter("琴吹")
my_class.enter("真鍋")

このように、作成したクラスに何かアクションを行いたい場合はインスタンスメソッドを使用します。

追加入学。そして名簿の出力

どうやら手違いがあったため、入学する生徒が5名追加となりました。
幸い、1年2組と森岡先生がいらっしゃいますのでクラスを追加しましょう。
また、クラス名簿を出力するメソッドも追加します。これはインスタンスメソッドでしょうか。クラスメソッドでしょうか。

クラス名簿を出力
class Class
  def initialize(teachername, grade, group)
    @teachername=teachername
    @grade=grade
    @group=group
    @roster=[]
  end

  def enter(name)
    @roster.push name
  end

  def print_roster()
    # インスタンスメソッド?クラスメソッド?
    print @roster
  end
end

yamanaka_class = Class.new("山中", 1, 1)
yamanaka_class.enter("平沢")
yamanaka_class.enter("秋山")
yamanaka_class.enter("田井中")
yamanaka_class.enter("琴吹")
yamanaka_class.enter("真鍋")

morioka_class = Class.new("森岡", 1, 2)
morioka_class.enter("鳴宮")
morioka_class.enter("竹早")
morioka_class.enter("山之内")
morioka_class.enter("如月")
morioka_class.enter("小野木")

yamanaka_class.print_roster()
# > ["平沢", "秋山", "田井中", "琴吹", "真鍋"]
morioka_class.print_roster()
# > ["鳴宮", "竹早", "山之内", "如月", "小野木"]

クラス名簿=クラスごとの名簿を出力する。のでインスタンスメソッドになります。

全校生徒の人数を出力したい

いきなり生徒数が増えましたが、インスタンスメソッドを作成していたためコードの修正は軽微なものでしたね。
ただ、今後も急な転校などが発生する恐れがあります。また、今でこそ全校生徒は少ないですが、今後は増えていくかもしれません。
そうなると全校生徒の人数を把握するのが大変です。
そこで、クラスメソッドを使用して全校生徒数を出力してみましょう。

全校生徒に関わる処理追加
class Class
  # 全校生徒数をクラス変数で定義
  @@all_students_count = 0

  def self.print_all_students_count
    # クラスメソッドで全校生徒数を出力するメソッド追加
    print "全校生徒は#{@@all_students_count}人です"
  end

  def initialize(teachername, grade, group)
    @teachername=teachername
    @grade=grade
    @group=group
    @roster=[]
  end

  def enter(name)
    @roster.push name
    # 入学したら全校生徒数を+1
    @@all_students_count += 1
  end

  def print_roster
    print @roster
  end
end

Class.print_all_students_count
# > 全校生徒は0人です
# まだ入学者がいないため全校生徒は0人
yamanaka_class = Class.new("山中", 1, 1)
yamanaka_class.enter("平沢")
yamanaka_class.enter("秋山")
yamanaka_class.enter("田井中")
yamanaka_class.enter("琴吹")
yamanaka_class.enter("真鍋")

Class.print_all_students_count
# > 全校生徒は5人です
# 山中先生のクラスに入学したため5人

morioka_class = Class.new("森岡", 1, 2)
morioka_class.enter("鳴宮")
morioka_class.enter("竹早")
morioka_class.enter("山之内")
morioka_class.enter("如月")
morioka_class.enter("小野木")

yamanaka_class.print_roster()
morioka_class.print_roster()

Class.print_all_students_count
# > 全校生徒は10人です
# 森岡先生のクラスにも入学したため10人

まずはクラス変数で全校生徒数(@@all_students_count)を0で初期化しています。
そして、enterメソッドで入学後、全校生徒数に対して+1をするようにしました。これで入学者が増えると全校生徒数も増えていきます。
最後に、self.print_all_students_countのクラスメソッドを用意して全校生徒数を出力しています。
出力するタイミングを入学前、入学後、追加入学後に分けることによって挙動が確認できるかと思います。
このように、クラスメソッドは各クラス共通で使用できるメソッドであるといえます。

まとめ

インスタンスメソッド

  • インスタンス毎で挙動を制御したい場合に使用する
  • 今回だと入学はクラス(学級)ごとに行うためインスタンスメソッドとなる

クラスメソッド

  • クラス全体で共通の挙動を行う際に使用する
  • 今回だと全校生徒はClassが管理していた

あとがき

途中から全校生徒はクラス管理なのか?と疑問が出てきてしまい、悩みながらも書き抜きました。非常に良い記事とは言いにくいところがありますが、メソッドの役割理解・分類の助けになればと思います。
また、最近はPythonばかり書いているので久々にrubyと触れ合いました。文法や規約などに違反していた場合はコメント欄へ記述していただけると大変うれしく思います。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む