D IT Y

タマキ工務店のIT日記

おーい磯野、ペアプロしようぜ!

f:id:shirotamaki:20211220234501p:plain

フィヨルドブートキャンプ Advent Calendar 2021

このエントリーは、Part1の21日目の記事です。

昨日20日目のエントリーは、

でした。素敵な記事ありがとうございます〜✨

はじめに

フィヨルドブートキャンプの32期生のタマキと申します。現在はプログラマ転職を目指し、RailsJavaScriptを学習中です。

テーマはペアプロです。以下(中島メンターと磯野くん)のやり取りをご覧いただき、その効果楽しさを感じてもらえると幸いです。

著者がペアプロを経験し学んだこと、個人的な思いや考えがミックスされた記事ではありますが「ペアプロって楽しそうだな〜」「ペアプロやりたいな〜」と、興味を持っていただけると嬉しいです。

対象読者

注意事項

今回題材として扱うペアプロは、実務で行う実践的な内容(ペアプロによるソフトウェア開発)とは違い、スクールで学習している生徒側からの質問の延長線上に存在するペアプロを想定しています。プログラミングの他に、タスクの洗い出し、コードの設計など、ペア(メンターと生徒)になって行う活動全般を含みます。

本題

あらすじ

磯野ぴよるど君は、フィヨルドブートキャンプに通う生徒でプログラマを目指し日々学習中です。 そんな中、あるプラクティスで長い間詰まっており、日々悶々とひとり悩み苦しんでいました。 そんな彼を見かけ心配した中島メンターは、ある日、磯野くんへ電話を掛けたところから物語は始まります。。。

登場人物

🐔 中島メンター

フィヨルドブートキャンプのメンターを務める凄腕プログラマ

札幌市在住

趣味は野球で右投げ左打ち。日ハムとスープカレーが好き

🐤 磯野ぴよるど

フィヨルドブートキャンプに通う32期生

ノルウェー生まれの世田谷区在住

最近太り気味で乾燥肌なのが悩み。毎日の筋トレと角の保湿は欠かせない

ペアプロって何ですか?

🐔中島:おーい磯野、ペアプロしようぜ!

🐤磯野:あれれ!?中島メンターじゃないですか。急にどうしたんですか?

🐔中島:磯野くんの日報を確認してたら詰まっていてツラそうだったから、ペアプロでもどうかな〜って思って連絡してみたよ。

🐤磯野:ペアプロって何ですか?おいしいですか?

🐔中島:食べ物ではないよ...(汗) フィヨルドブートキャンプ Part 1 Advent Calendar 2021 、12日目のcafedomancerさんの記事に詳しく書かれているので読んでほしいんだけど、ペアプロは、ペアプログラミングの略で、磯野くんが抱えている問題を解決する手がかりになる魔法のようなプログラミング手法だよ。

🐤磯野:へー、初めて知りました。このようなプログラミング手法があるんですね。ぜひお願いしたいです!

🐔中島:ヨシ!それじゃあ一緒にペアプロしてみよう。以下、紹介している本の記事もお薦めなので時間あるときにぜひ読んでみてね。

🐤磯野:おぉぉ〜!これは、テスト駆動開発で有名なt_wadaさんが書かれているペアプロについての記事ですね!面白そう!

gihyo.jp

基本のスタイル

🐤磯野:ペアプロはじめてなのですが、どんなスタイルでやるのですか?

🐔中島:「ペアプロはこうでなければならない」という事細かな明確なルールはないけど、ある程度は以下のスタイルに沿って実施されることが多いよ

  • 1つのディスプレイ、マシン、キーボードを共有する
  • ロール(役割)を決める。ドライバーとナビゲーター
    • ドライバー: キーボードを操作しコードを書き進めていく人
    • ナビゲーター: ドライバーの横(画面の向こう側にいる人)に座り、ドライバーと会話しながら導く人
  • ペアの種類(3パターン)
    • 新人とベテラン
    • ベテランとベテラン
    • 新人と新人

🐤磯野:へー、なるほど〜。ちなみに中島メンターとはオフラインでは会うことは難しいので、今回はDiscordを使った画面共有でペアプロを行うのですね!

🐔中島:そうだね。ちなみにペアのパターンとしては、「新人とベテラン」の種類に該当するよ。フィヨルドブートキャンプの受講生同士のペアプロも可能だけど「新人と新人」のパターンは立ち往生して先に進めなくなることも多く、注意が必要だよ。

🐔中島:また、ロール(役割)を交代して行うと効果的だけど、新人とベテランのペアの場合は、新人が主にドライバーを務めるケースが多いかな。ドライバーは理解できなかったときにはブレーキを踏んでナビゲーターに助けてらもらえるし、手を動かすことでより理解が深まるからね。

時間はどれくらい?

🐤磯野:ちなみに、今夜は地域のRubyコミュニティに参加したいので、それまでの時間なら空いてますが、ペアプロはどれくらいの時間やるのですか?

🐔中島:いい質問だね。基本のスタイルでも伝えたように明確なルールはないので、時間もその時々によって変わるよ。ワシの経験則にはなるけど、短いと5分程度から、長いと3時間以上と、取り掛かるプログラミングの内容によって時間は変わってくるね。上で紹介した本の中でt_wadaさんは、2時間くらいで到達できそうな目標を設定しペアプロを実施されていることが多いようだね。ただワシの感覚では、フィヨルドブートキャンプの場合は、生徒からの質問の延長線上にペアプロが存在しているので、ガチガチにスタイルを決めてやることは少ないと思うよ。

ペアプロを申し込もう

🐤磯野:まだ朝の9時なので大丈夫そうですね!でも、中島メンターの貴重な時間を奪ってしまい心苦しいです…

🐔中島:そんなことないよ。もちろん、磯野くんが抱えている問題解決を目標に取り組むことにはなるので、新人(磯野くん)に大きなメリットがあるのは間違いないけど、ベテランのワシにも教えることで自分のスキルの棚卸しにもなるし、学べることも多いんだよ。

🐤磯野:そうなんですね…(嬉泣)

🐔中島:今回はワシから声を掛けたけど、今後は磯野くんから積極的にペアプロを申し込むといいよ。フィヨルドブートキャンプならDiscordに専用のチャンネルもあるしね!

🐤磯野:でも、例えば利害関係の少ないコミュニティでペアプロをお願いしたいときもあると思うのですが、そういう時はさすがに引け目を感じてしまいますね...

🐔中島:たしかにその気持ちはわかる。でも、あるコミュニティの主催者がワシと同じことを言っていたんだけど...

「誰しも最初からできる人はいない。最初はみんな初心者だ。我々も多くの先輩方にペアプロしてもらい成長してきた。今の自分があるのはRubyコミュニティの存在が大きい。今は自分が受けてきたものをコミュニティを通じて好きで返しているだけ。気にする必要はない」

🐔中島:磯野くんもコミュニティに参加してわかると思うけど、多くの人はプログラミングが好きだからやっているし、ペアプロをお願いして嫌がる人はコミュニティには参加してないんじゃないかな〜

🐤磯野:神!(嬉泣) そんなこと言われたら惚れてまうわぁ...

🐔中島:そうだね(笑) ペアプロは、現代の徒弟制度みたいなものかもね。磯野くんも成長したら、後輩らにペアプロをすることで、Rubyコミュニティを盛り上げていってね!

ペアプロをお願いする姿勢

🐔中島:『授人以魚 不如授人以漁』......

🐤磯野:んんん!?急にどうしたんですか?

🐔中島:ごめんごめん。中国の古い格言(諸説あり)でさ、こんな言葉があるんだよ。知ってるかい?

「魚を与えれば一日の飢えをしのげるが、釣り方を教えれば一生食べていける」

🐤磯野:魚は大好きですが、この言葉は知りませんでした...(汗)

🐔中島:正直なところ、答えを教えるほうが、聞き手も答える側も手短に済むよね。でもそれでは、聞き手側の成長には繋がらないんだ。ペアプロに限らずだけど、「魚をください」ではなく、「魚の釣り方」を教えてもらう。この姿勢はとても大事だから覚えておいてね。もちろん、ペアプロ以前にまず最初は「魚の釣り方」を自分で調べて何とか問題を解決できるように努力することはマストだよ。

🐤磯野:深いですね...胸に突き刺さります。ぼくはついつい気が焦ってしまい「魚をください」と質問していることが多いので、この格言は腕にタトゥーとして刻んでおきます...

🐔中島:腕じゃなくて心に刻んでね(笑) でも、フィヨルドブートキャンプで学習しているほとんどの生徒は、卒業、就職を目標としている人が多いので、この考え方はとても大事だね。komagataさんがブログでも書かれているけど、 戦力として計算できるエンジニアになるには、「魚の釣り方」を身につける必要がある。エンジニアとしては自走力が必ず必要になるからね。「なぜプログラミングを学んでいるのか?」その目的を見失わないようにね!

ペアプロ前の事前準備

🐤磯野:ペアプロをはじめる前に必要な準備はありますか?

🐔中島:Discordなどに繋いでの画面共有にて実施していくので、マイクやディスプレイ、エディタは問題なく使えるか?使い方に不安がある場合は事前に調べておくといいよ。あと、メモ用の紙やペン(iPadやWeb上のツールでもOK)、そして飲みものは用意しておくと安心だね。「冗談抜きで、水、だいじ」

🐔中島:それから一番大事なことだけど、ペアプロで扱う内容は事前に準備しておこう。必要であれば関連書籍、Webサイト、コードや現状の問題(エラーなど)、調べたこと、試したこと、考えたこと、詰まっていること、このあたりをペアプロ前にまとめておくとベストだね。

🐤磯野:準備大事〜。ペアプロの相手に伝えたい内容を事前に準備しておくと焦らずにスムーズに対応できますね。あと質問は、相手にエスパーさせないことも重要ですよね。

🐔中島:そのとおり!上手な質問については、こちらの伊藤さんのブログ記事もおすすめなので読んでみてね。

ペアプロの進め方(コードを書く前にやること)

🐤磯野:最初は何からはじめていくのですか?

🐔中島:まずは、基本的な進め方を説明するよ。

  • コードを書く前に方向付けを行う
  • 最終目標を定める。(ペアプロを行う時間内で目指す最終目標を決める)
  • ペアプロに入る前にTo-Doリストを作成しておく。
  • To-Doリストは、ナビゲーターが手にしている「地図」のようなもの。
  • 完璧なリストには拘らず、ざっくりしたものでOK。その都度、修正、更新していく。
  • ポイントは、タスクを小さくすること。

🐔中島:必ずしも上記のように進めていくわけではないけど、ひとつの指針として覚えておいてね。

コードを書きながら会話し考えを共有する

🐤磯野:今日のカツオのたたきはおいしかったな〜

🐔中島:旬だからね〜、っておい!......(困) それはさておき、ペアプロで一番大事なのは「会話」だよ。考えていることを口に出すこと。これから書こうと思っていることや、迷ってモヤモヤしていることをまずは言葉にしてみる。ひとりで悩まずにペアプロで取り組んでいる問題、悩みを共有するわけだね。

🐤磯野:独り言のようなものでもいいのですか?

🐔中島:もちろん!具体的なことに越したことはないけど。頭に浮かぶ言葉を口に出すことが大事だよ。沈黙が一番ダメ。「難しい〜、わからない〜」でも、磯野くんの考え、気持ちを言葉にしてね。

🐤磯野:なるほど。考えを共有することで、ナビゲーターはドライバーの考えを聞き、助力してくれるのですね。

ロール(役割)を交代する

🐤磯野:ロールケーキが食べたいな〜

🐔中島:君は食べ物の話しばかりだな〜(困)

🐔中島:ペアプロでは、ロールを交代すると効果的だと言われているよ。主に以下の3つのスタイルでロールを交代することが多いかな。

  • 時間で交代する
  • ステップで交代する
  • 自由に交代する

🐔中島:冒頭でも説明したけど、新人側がドライバーを務めることが多いので、このへんは相手(ベテラン)と相談しながら決めていくのがよいね。

🐔中島:あと、長い時間ペアプロするときは適時休憩を挟んでね。区切りがいいところで、ふりかえりをしてもいいかもね。

ペアプロをはじめてみよう

🐔中島:ここまで来たら、いよいよペアプロをはじめてみよう!

🐤磯野:まだ不安です…(震)

🐔中島:最初は誰でも不安だよ。でも、勇気を出して一歩踏み出せば世界が広がるはずだよ。さあ、一歩踏み出してペアプロの世界に飛び込もう!!

ペアプロの効果

数日後・・・・・

🐤磯野:中島メンターお久しぶりです〜

🐔中島:お〜、磯野くん元気そうだね〜

🐤磯野:あの日からペアプロの良さを知ってしまい、最近はちょくちょく色々なところでペアプロしてます!

🐔中島:いいね〜、どんな効果があった?

🐤磯野:いろんな効果を感じているので一言ではいい表せないのですが、以下のような効果を感じています!


  • 問題解決

    • デバッグ手法を学べる
    • タスクの洗い出し、切り分け方を学べる
  • コードレビューによるさまざまな効果

    • レビュー内容がリアルタイムにコードへ反映される
    • 読みやすく保守性に優れたコードを学べる
    • ミスが生まれにくい。二人の目と脳とで監視することで抜け漏れを防止できる
  • 思考の整理

    • 今自分が考え、これから行うことは何なのかを常に相手に共有することで、思考の整理ができる。コードを書いてから間違いに気づくのではなく、話している最中に気づけることも多い
  • 知識と学びの共有

    • Git操作、エディタの便利機能など、凄腕プログラマが日常使っている技術を目の当たりにできる
    • 技術力の底上げ、高い教育効果を発揮
    • 結果(コード)だけではなく、過程(プログラミング)を共有することで得れる知識やスキル
    • 暗黙知の共有(経験や勘に基づく知識のこと。言葉で表現が難しいもの)勘所やバグの原因究明など、ドキュメントでは伝えづらい重要なスキルを共有できる

🐤磯野:などなど、さまざまな効果を感じています。そして、何よりペアプロは楽しい!メンターやアドバイザーはもちろん、卒業生や現役生、外部コミュニティでもペアプロを体験したのですが、どれもこれも楽しく学びの多いペアプロでした!

🐔中島:楽しいことは何よりだね。ペアプロ情報伝達効率を最大にすることでプログラミングの質を高めることができる、本当に素晴らしい手法だと思う。これらも色々な壁にぶち当たると思うけど、ペアプロを活用して困難を乗り越えて言ってね!

🐤磯野:はい!ありがとうございます!

おまけ

AIとペアプロ

🐔中島:RubyWorld Conference 2021のMatzの基調講演は観たかい?

🐤磯野:まだ観ていないですぅ…

🐔中島:MatzがRubyの未来のヴィジョンについて話しているんだけど、近い将来、Rubyを使ったツールで「AIとペアプロができる日がくるかもしれないよ。

🐤磯野:AIとペアプロ!?凄い未来だ〜!

🐔中島:52:25 ぐらいからその話しになるので、興味があったら観てみてね♪

youtu.be

モブプロって何ですか?

🐤磯野:中島メンター、そういえばモブプロなる美味しそうな名前もよく耳にしますがこれはなんですか?

🐔中島:お!さすがお目が高い。モブプロはね、ペアプロを発展させた手法だよ。

🐤磯野:へ〜、なんかこれも面白そう!

🐔中島:モブとは「群衆」のことで、3〜5人を想定したペアプロを発展させたプログラミング手法のことを指すよ......と、今日はこのへんで詳細は次回のブログにまとめたいと思うから、その時のお楽しみに!

  • 輪読会でレインボー
  • 三鷹でわいわいアプリ作成
  • はるぐち先生とじゃんけんプログラム

以上の3テーマを予定しているよ

おわりに

タマキです。

最後までお付き合いいただきありがとうございました。

今までペアプロに何度も救われた身として、この記事を書けたことを嬉しく思います。

ペアプロ未経験の方へ少しでも参考になれば幸いです。

さて次回は、

の2本です。

それではまた明日もみてくださいね〜!

チェリー本輪読会 最終週まとめ

f:id:shirotamaki:20210619091936p:plain

🍒 はじめに

チェリー本輪読会の第17週目(最終週)のエントリーになります。

輪読会の概要については第1週目にまとめています。

🍒 輪読会 第17週目(最終週)まとめ

第12章12.1.1〜付録(あとがき)まで

期間:2021年9月13日〜2021年9月17日

かれこれ3ヶ月前に終わった輪読会ですが、今更ですが最終週を書きました!

個人的な備忘録(思い出ログ)として書いています。

requireの単位はライブラリ

組み込みライブラリ以外のクラスやモジュールを使う場合は、requireで事前にライブラリを読み込んでおく必要があります。requireしている単位はひとつひとつのクラスやモジュールではなく、ライブラリになります。requireで読み込んでいるライブラリは慣習的に小文字で書くことになっています。gemの命名規則について以下ブログが参考になりました。

推奨される RubyGem の名前の付け方 - yu8mada

Rubyのバージョン管理

Rubyを使用する場合、なるべく最新のものを利用することが推奨されています。

Rubyのバージョン以下のコマンドで確認できます。

❯ ruby -v
ruby 3.0.3p157 (2021-11-24 revision 3fb7d2cadc) [x86_64-darwin20]

x.y.z

  • x majorバージョン
    • アーキテクチャやコンセプトの変更、完全な書き換えがあった場合に増加する
  • y minorバージョン
    • クリスマスごとに増加する。大幅な仕様変更や機能追加が行われる。
    • 後方互換性のない仕様変更が入る可能性がある
  • z teenyバージョン
    • 軽微な使用変更、小さな機能追加が行われる。
    • API互換性を維持するセキュリティフィックス(修正のこと)やバグフィックスが行われる

Ruby 2.1.0 以降のセマンティックバージョニングについて

セマンティック バージョニング

Semantic Versioningとは、ソフトウェアのバージョニング方法の一つです。

「1.23.45」といったように.で区切った3つの数字で表されます。

セマンティック バージョニング 2.0.0 | Semantic Versioning

Gemfileでgemのバージョンを指定する記号の意味

バージョンをGemfileに指定して管理ができます。バージョン番号を指定しない場合は、Bundlerにおまかせになります。

  • 1.7.2 特定のバージョンを使いたいときは、カンマ区切りで指定する
  • >=1.7.2 1.7.2以上であれば何でも良い場合は>=を使う
  • ~> 1.7 ~> 悲観的バージョン演算子と呼ぶ。マイナーバージョンは上げてもいいが、メジャーバージョンは上げたくない場合に使う
  • ~> 1.7.2 パッチバージョンは上げていいが、マイナーバージョンは上げたくない場合に使う

RubyMineでrbenvが反映されない件

RubyMineでのRubyバージョン切り替えは、rbenv shell コマンドで実行する必要があります。

scrapbox.io

その他バージョン管理の注意点

Rubyのバージョンごとにgemを管理する必要があります。

他のgemとの依存関係があり、gemのバージョン変更を試みる際、互換性の問題でエラーになる場合があるので注意が必要です。

自作gem入門

こちら教えていただいgemの入門記事です。

いつかgem作りにもチャレンジしてみたいと思いました!

qiita.com

あとがきの朗読(本人ver.)

なんと!最後のあとがきを著者の伊藤さんご本人に読んでいただきました!

この感動はなかなか文章では伝えづらいですが、とても貴重な体験でした。著者に見守られる輪読会、そして最後にはあとがきを読んでいただき、労いの言葉までいただく。日本中どこを探しても、このような経験ができる輪読会はなかなかないのではないでしょうか?

めちゃくちゃエモい最終回でした!

謝辞

2021年5月25日にスタートし、9月17日に最終回を迎えた輪読会。

あれから月日が経ちましたが、最後は輪読会でお世話になった方々への感謝の気持ちをまとめ締めくくりたいと思います。

始めた当初は完走できるか不安でしたが、終わってみると本当にあっという間で楽しい毎日でした。

就職が決まったメンバー、フィヨルドブートキャンプのカリキュラムを終えられ卒業されたメンバー、別の輪読会を主催しているメンバーなどなど、その後もみなさん各方面で大活躍されています。

輪読会という共通目的を持った仲間で走りきった17週間。輪読会を通しとても成長できました。

輪読会メンバー、多くのアドバイス、サポートいただいた森塚先輩、アドバイザー、メンター、そして著者の伊藤さん!

関わってくれた全ての皆さんに感謝したいです。

ありがとうございました!

参考書籍

🍒 おまけ

チェリー本の完走ブログ

輪読会メンバーのブログも紹介したいと思います。

参加した経緯や輪読会で学んだことなど、読みながら「うんうん、わかる〜」の連続で、輪読会の雰囲気や熱が伝わってくる素敵なブログです。

いっしーさんのブログにも書かれていますが、同じ目的を持って学ぶ仲間ができたことが私も何よりも嬉しく、とても良い経験、財産となりました。

isshi-hasegawa.hatenablog.com

yana-g.hatenablog.com

チェリー本改訂2版が発売されました

すでにご存知かとは思いますが、2021年12月2日にチェリー本の改訂2版が発売されました!もちろん、私もすでに購入し手元にあります。これから、改訂2版の輪読会も開催されるのですが、とても楽しみです。

これからチェリー本を学習する方は、「さくらんぼが2つ」を目印に、改訂2版を買いましょう。ボーっとして間違えて購入しないように注意です(パーフェクトRubyonRailsも改訂版とそうでない版があるのですが、私は過去にやらかした経験があります…w)

blog.jnito.com

また、こちらのブログはチェリー本の差分がわかりやすくまとまっていてお薦めです。

aim2bpgさん の分析力凄すぎる...!

aim2bpg.com

伊藤さんのお墨付きです!

次のステップとしてのお薦め教材

「チェリー本の次に読むべきRuby本のお薦めはなんですか?」と、メンターさんや卒業生の方に質問したときに、よく名前の上がる本をご紹介します。

「パーフェクトRuby」はRubyをさらに体系的、網羅的に学ぶには最適だそうです。チェリー本で学んだ知識をより深く学んでいくことができます。

メタプログラミングについて学ぶのも良いそうで、その中でもダントツに名前が上がるのが「メタプログラミングRuby」です。メタプログラミングを始めるなら、まずはこちらがお薦めとのことです。

改訂2版 パーフェクトRuby

gihyo.jp

メタプログラミングRuby 第2版

www.oreilly.co.jp

書を持てよ、輪読会へ出よう

主催者のトミーさんの呼びかけにより始まった輪読会。

このチェリー本輪読会をきっかけに、その後多く輪読会が誕生しました。すでに終了した輪読会もありますが、現在もフィヨルドブートキャンプ内では多くの輪読会が開催されています。

私が現在参加中の輪読会の一部ですが、以下のブログも輪読会の雰囲気が感じ取れる素敵な内容なので、もし気になった方はぜひ読んでみてください。

paru871.hatenablog.com

isshi-hasegawa.hatenablog.com

また、「参加したいけど、いま一歩踏み出せないあなた」へはこちらのブログを!コミュニティへ飛び込むまでのお気持ちが丁寧に書かれていてわかりみが深いです。

napple29.hatenablog.com


これにてチェリー本輪読会シリーズは完結です!

最後までお読みいただきありがとうございました!

また、どこかの輪読会でお会いしましょう♪

チェリー本輪読会 第16週目まとめ

f:id:shirotamaki:20210619091936p:plain

🍒 はじめに

チェリー本輪読会の第16週目のエントリーになります。

輪読会の概要については第1週目にまとめています。

🍒 輪読会 第16週目まとめ

第11章11.1.1〜第11章11.6まで

期間:2021年9月6日〜2021年9月10日

デバッグ とは

第11章はRubyデバッグ技法について章になります。

デバッグとは、プログラムで起こる不具合の原因を探し出し直すことを指します。

デバッグ - Wikipedia

バックトレース とは

プログラムの実行中にエラー(例外)が発生すると、出力される情報のことをバックトレースと呼びます。以下、リンク先の資料には、「メソッドの呼び出し状況を表したデータ」と書いてありました。

Ruby でのバックトレース活用法

バックトレースは、上に行くほどエラーに近いので、一番上がエラーの発生場所になります。

エラー内容が上から下に遡る(trace back to)しています。

よく発生する例外クラス(Exceptionクラス)

アプリケーションの実行中に発生するエラーを表すオブジェクトです。

るりまには多く例外クラスが掲載されています。

docs.ruby-lang.org

その中でも発生頻度の多い例外クラスがチェリー本では解説されています。

  • NameError
    • 未定義のローカル変数や定数、privateメソッドなどを呼び出したときに発生
  • NoMethodError
    • 存在しないメソッドを呼び出そうとしたときに発生
  • TypeError
    • 期待しないクラスがメソッドの引数に渡されたときに発生
  • ArgumentError
    • 引数の数が違ったり、期待する値ではなかったりした場合に発生
  • ZeroDivisionError
    • 整数を0で除算しようとしたときに発生(1/0 のように0で割ってはいけないとき)
  • SystemStackError
  • LoadError
    • requireやloadに失敗したときに発生
  • SystemError(syntax error)
    • 構文エラー、endやカンマの不足、丸括弧などが閉じていないなどが原因で発

printデバッグ

printデバッグは、簡単ですぐに使えるデバック方法です。私も一番最初に覚えました。

printデバッグと呼びますが、主に、pputs を使って行われます。変数やメソッドの値を出力したり、条件分岐が意図した通りに実行されているかどうかを確認したりに使えます。

printデバックと呼ばれる方法は以下の4つのメソッドが存在します。

  • printメソッド
  • putsメソッド
  • pメソッド
  • ppメソッド(prity printの略)

デバッカ(Byebug)を使う

デバッガを使えば対話的にデバッグをすることができます。

プログラムをステップ実行しながら変数の中身を確認したり、実行される条件分岐を確認したりすることができます。

Rubyの標準ライブラリとして提供されているdebugライブラリがありますが、開発の現場ではdebugライブラリよりも、Byebugという外部ライブラリ(Gem)が使われることが多いようです。

使い方については、伊藤さんのByebugチュートリアルが参考になります。

qiita.com

binding.irb

チェリー本では紹介されていませんが、フィヨルドブートキャンプのメンターさんからbinding.irbを使ったデバッグ方法も伝授していただきましたので紹介したいと思います。

下記のコードようにbinding.irbを挟むと、そこでデバック作業が発動し、irbが起動するしくみです。

def fizz_buzz(n)
  if n % 15 == 0
    "Fizz Buzz"
  elsif n % 3  == 0
    "Fizz"
  elsif n % 5 == 0
    "Buzz"
  else
    n.to_s
  end
end
binding.irb

ブレークポイントirbが起動するので、試したいコードを打ち込むことが可能になります。

今回は、fizz_buzzメソッドを入力してみました。

$ ruby test/fizz_buzz_test.rb
lib/fizzbuzz.rb @ line 12 :

     7:     "Buzz"
     8:   else
     9:     n.to_s
    10:   end
    11: end
 => 12: binding.irb
    13:
    14:
    15: # require 'minitest/autorun'
    16: #
    17: # class FizzBuzzTest < Minitest::Test

irb(main):001:0> fizz_buzz(15)
=> "Fizz Buzz"
irb(main):002:0> fizz_buzz(99)
=> "Fizz"
irb(main):003:0> fizz_buzz(7)
=> "7"

binding.irb を使ったやり方のメリットはデバッガ等の設定をしなくて済むので手軽であること、コードを止めた時点でアクセス(利用)可能な変数やメソッドにアクセスできるので好き勝手コードを打って試行錯誤が試せることです。

「エラーが出ました。どうすればいいですか?」から卒業するための基本と極意

以下では、デバッグの基本と極意が学べます。

qiita.com

日々ハマりまくっているので偉そうなことは書けませんが、デバッグって本当に初心者の方の壁だと思っています。同じバグで何日も詰まったことは数知れず。心が何度も折れそうになりました。。。 何度もメンターさんにペアプロしていただいて助けていただいています。そんな時に痛感することなのですが、メンターさんのデバッグの的確さ、そして速さ。本当に魔法のように問題が解決していきます。

まだまだ初心者を抜け出せたとは言えないませんが、この動画や本書の内容を日々実践し、デバッグ力を上げていきたいと思います。

参考書籍

🍒 まとめ

輪読会が終わり、かれこれ3ヶ月も経ってしまいましたが、第16週目のブログを書きました。

1週目をスタートしたときから「最終週まで書き上げる!」と自分の中で目標を決めていたので、今更ですが書いてみました。次は最終週です!

では、また!(次回、第17週目(最終週))

DateオブジェクトのgetMonth()メソッドは、JSTを基準とした値を返す

f:id:shirotamaki:20211031221627p:plain
出典: いらすとや

はじめに

JavaScriptでは、Dateオブジェクトから、指定したその月の最終日(月末日)を取り出す際、getMonth()メソッド を利用します。

上記の一文だけ読むとそんなに難しいことではない気がするのですが、実際にやってみて、JavaScript独特のDateオブジェクトの挙動に翻弄され、ハマりまくってしまいました。

JavaScript の Dateは、初心者がハマりがちな罠が多いそうです。

何だか面倒な挙動が多く「クセが強い!」Dateオブジェクト。

そんな同じ状況でハマってしまう方の助けになればと思いブログに書き留めておきます。

前提知識

UTCGMTJSTの違い

まず、前提としてDateオブジェクトはUTC協定世界時)を基準としています。

UTCの前は、GMTが世界の標準時でした。

  • GMTの特徴
    • 英国のグリニッジ天文台(経緯0度)での地方平均時(平均太陽が南中する時を正午とする)のことで、天文観測(地球の自転)によって決められる時刻
    • UTCとほとんど同じだが、現在はUTCのほうがより正確であるため、そちらを世界標準として採用している
    • グリニッジ標準時 - Wikipedia

それから、UTCの時刻へ9時間プラスした時刻をJSTと呼びます。

ISO 8160

それから、日付と時刻の表記に関する国際規格に沿って、形式や表記が定められています。

以下、返り値として返される、2021-10-31T11:31:04.554Zや、2021-10-30T15:00:00.000Zという表記も、ISO 8160に準じて定められています。

ISO 8601 - Wikipedia

ハマってしまったこと

Dateオブジェクト

developer.mozilla.org

まずは、Dateオブジェクトを作ってみます。 Date.now()メソッドを使い、現在時刻(UTC)を生成することができます。 ここでは、「UTC」であることがポイントです。

> now = new Date();
2021-10-31T11:31:04.554Z

ここから、その月の最終日を取得するために、以下の引数を渡してあげます。 第三引数に0を渡すと、その月の最終日が返ってくるはずですが…

date = new Date(年, 月, 0);

date = new Date(2021, 10, 0);
2021-10-30T15:00:00.000Z

あれ? 10月30日で最終日ではない…

10月は、31日まで存在しますが、10月30日となっています。

UTCだから、おかしなことになっているのではないかと考え、JSTに変換するメソッドがないか調べてみました。

toLocaleString()メソッド

developer.mozilla.org

ありました。

このメソッドを使うことでJSTへ変換できるようです。

.toLocaleString({ timeZone: 'Asia/Tokyo' })

> now = new Date().toLocaleString({ timeZone: 'Asia/Tokyo' });
'2021/10/31 21:10:38'

出来ました! 現在の日本時刻(21:10)と同じです。

このオブジェクトを使って、今回やりたかったこと(その月の最終日を取得する)試してみます。

まずは、UTCでその月の最終日を取得します。

> const date = new Date(2021, 10, 0);
undefined
> date
2021-10-30T15:00:00.000Z

ここから、変数dateに対してメソッドを実行してみます。 結果、無事に10月31日と表示されました。

> date.toLocaleString({ timeZone: 'Asia/Tokyo' });
'2021/10/31 0:00:00'

toLocaleStringメソッド は、文字通り String(文字列)に修正してしまうものなので注意

ここで本題のgetMonth()メソッドを使い、指定された日時の「月」だけ取得を試みてみます。

> const date = new Date(2021, 10, 0);
undefined
> const endDate = date.toLocaleString({ timeZone: 'Asia/Tokyo' });
undefined
> endMonth = endDate.getMonth();
Uncaught TypeError: endDate.getMonth is not a function

ん? Uncaught TypeError: endDate.getMonth is not a function、値を関数として呼び出そうとしたが、その値が実際には関数ではなかった場合に発生するエラーが返ってきました。

これは小見出しにもあるように、「toLocaleStringメソッド は、文字通り String(文字列)に修正してしまうもの」なので、変数endDateに代入されている値は、Stringなので、レシーバとしては適切ではないようです。

getMonth()メソッドに対しては、Detaオブジェクトを利用する必要があるようです。

以上、私がハマった経緯になります。次に解決方法をまとめます。

結論

ここからは、ハマったポイントを抜け出した結論になります。

正直、結論は「え?そんなことだったの…」と、拍子抜けの内容です。 しかし、上記のDateオブジェクトの挙動のクセを体感したからこその拍子抜けなので、今回は遠回りでしたがとてもよい経験となりました。

DateオブジェクトのgetMonth()メソッドは、JSTを基準とした値を返す

MDNには、以下のように書いていました。

注: Date オブジェクトの中心となる時間値は UTC ですが、日付と時刻、またはその一部を取得する基本的なメソッドは、すべて地方時 (ホストシステムなど) のタイムゾーンとオフセットで動作することを覚えておくことが重要です。

要は、DateオブジェクトのgetMonth()メソッドJSTとして返事をくれるようです!!

一点、注意点としては、0-11の数字で扱っているので、正確な月に修正するには +1 が必要です。

変数dateへ、10月の最終日(31日)のオブジェクトを生成して代入します。

確認してみると、UTCでは、2021-10-30T15:00:00.000Z と表記されています。

> const date = new Date(2021, 10, 0);
undefined
> date
2021-10-30T15:00:00.000Z

では、ここで「getMonth()メソッドJSTとして返事をくれる」が正しいか試してみます。

> date.getMonth();
9

「9」!

無事に9が表示されました!!!

上述しましたが、0-11の数字で扱っているので、9は、10月のことになります。

ちゃんとJSTとして変換して返してくれています。

おまけ

諸々が解決したあと、改めてMDNを読み直してみました。

すると、以下のように「地方時に基づき」と書いてありました…汗

地方時 == 日本の時刻 ですね。

getMonth() メソッドは、地方時に基づき、指定された日付の「月」を表す 0 を基点とした値 (すなわち 0 が年の最初の月を示す) を返します。

developer.mozilla.org

何だか今日は、JavaScriptのトリックに翻弄された一日でした…(JavaScriptにそんなつもりは無いと思いますが…)

引き続きドキュメントをしっかり読み解き、ひとつひとつやっていきたいと思います。

ハッピーハロウィーーン!!

チェリー本輪読会 第15週目まとめ

f:id:shirotamaki:20210619091936p:plain

🍒 はじめに

チェリー本輪読会の第15週目のエントリーになります。

輪読会の概要については第1週目にまとめています。

🍒 輪読会 第15週目まとめ

第10章10.1.1〜第10章10.6まで

期間:2021年08月30日〜2021年09月3日

yield とは

ブロックを引数として受け取り、展開するためにyieldを使います。

ここでいうブロックは、do〜endの処理の中身を指します。

yieldとは、受け取ったブロック引数を展開するしくみです。do〜endの中身を受け取り処理しています。

def playing
    puts 'guitar'
    yield
end
=> :playing

playing do
    puts 'bass'
end

#=> guitar
#=> bass
    

ブロックを引数として受け取る

引数名の前に&を付けることで、ブロックをメソッドの引数として受け取ることができます。

def playing(&block)
    puts 'I play guitar!!'
    sound = block.call('ギュイイイーーーン!!!')
    puts sound
end

playing do | sound |
    sound * 2 
end

#=> I play guitar!!
#=> ギュイイイーーーン!!!ギュイイイーーーン!!!

&blockの「&」って?

&blockの&は、引数にブロックが渡ってきた際に、Procオブジェクトへ変換する役割があります。

qiita.com

ブロックを引数にするメリット

ブロックをほかのメソッドに引き渡すことができます。

def playing_guitar(&block)
    sounds = ['ギュイーン', 'ガガガッ', 'ジャラーン']
    playing_tech(sounds, &block)
end

def playing_tech (sounds, &block)
    puts sounds[1]
    puts block.call(sounds[0])
    puts sounds[2]
end

playing_guitar do | sound |
    sound * 3
end

#=> ガガガッ
#=> ギュイーンギュイーンギュイーン
#=> ジャラーン

callメソッド

docs.ruby-lang.org

Proc とは

Procは、Procedureから来ています。プログラミングにおいて複数の処理をひとつにまとめたものです。手順、手続き。一連の処理を意味を持った一まとまりにすることで、再利用性が高まり、プログラム中に繰り返して現れる処理を一ヶ所で記述でき、プログラムの管理を容易にするしくみです。

ja.wikipedia.org

Procクラスは、ブロックをオブジェクト化するためのクラスです。ブロック、つまり「何らかの処理(何らかの手続)」を表します。Procオブジェクトを実行したい場合は、callメソッドを使います。

shout = Proc.new { 'Hey!Ho!Let\'s go!' }
#=> #<Proc:0x00007fd79c995248 (irb):1>

shout.call
#=> "Hey!Ho!Let's go!"

Proc.newとラムダの違い

-> または、lamdaメソッドで、Procオブジェクトを作ることができます。このような呼び出しで作成したProcオブジェクトを「ラムダ式」と呼びます。

単純な呼び出しでは、Proc,newもラムダも引数の扱いに違いはありません。

add_lambda = ->(a, b) { a + b }
add_lambda.call(100,500)
#=> 600

add_lambda = lambda { |a, b| a + b }
add_lambda.call(10,50)
#=> 60

しかし、ラムダの場合はメソッドの呼び出しと同じように引数の数に過不足があるとエラーが発生します。ラムダの方が引数のチェックが厳密になります。

add_lambda = lambda { |a, b| a + b }
add_lambda.call(10, 20, 30)

# エラーが発生。引数がひとつ多い。
wrong number of arguments (given 3, expected 2) (ArgumentError)

[1, 2, 3].map(&:to_s)イディオム

AtCoderなどでよく使っているイディオムです。

以下、map(&:upcase) と書くことで、Procオブジェクトに変換し、mapメソッドにブロックとして渡すことができます。

[ 'guitar', 'bass', 'drums' ].map { |s| s.upcase }
#=> ["GUITAR", "BASS", "DRUMS"]

[ 'guitar', 'bass', 'drums' ].map(&:upcase)
#=> ["GUITAR", "BASS", "DRUMS"]

Rubyの公式リファレンスが読めるようになる本

zenn.dev

9月3日にZenで公開された伊藤さんの本を読みました。

とても良かったです!

当時は、るりまに書かれていることが「意味がwakaran」の連続で、相当苦しめられました…。

冒頭の説明にもあるように、「ネットの技術記事より公式リファレンスを読め!」とよく指摘されていたましたが、そのるりま自体の意味わからんのですが....と、ずーっと思っていました。

今は、輪読会やプラクティス等で試行錯誤し取り組んできたおかげで、るりまが少しづつ読めるようにはなってきましたが、当時この本で事前に学べていたら、るりまとの向き合い方が全然変わっていたと思いますし、学習効率の向上や必要ない遠回りをせずに済んだと思います。その当時に思い悩んで詰まっていたポイントの解説が満載で、初心者には間違いなく救いの本となると思います。

今からRubyを始める方には、ぜひとも読んでいただきたい!

そんな一冊です!!

参考書籍

🍒 まとめ

だいぶ間が空いてしまいましたが第15週目のブログを書きました。

残り2週!

では、また!(次回、第16週目)

初めてのLT会 Vol.9 感想

LT会に参加しました!

10月9日(土曜)、フィヨルドブートキャンプ内で開催されたLT会へ参加してきました!

今回のテーマは「しくじりから学んだこと」

登壇者7名の皆さんの発表がどれもすごく良かったので感想をブログに書いてみました。

LT会はやる側も見る側も得るものがとても多いです。

まだ参加されたことがない方や、登壇されたことがない方の参考になれば幸いです。

@fuga__chさん

フィヨルドブートキャンプ(以下、FBC)のプラクティスの山場でもある「チーム開発」

自分は少し先のプラクティスではありますが、周りから話しを聞いている限り、「やってけるのか?レビュー受けるのは経験あるが、レビューするとか無理じゃない?」と、不安しかありません。そんな不安をふーがさんはどのように捉えて乗り越えていったのか?今回のLTではそんな貴重な経験談を聞くことができました。間違いを恐れずに、チームメンバーに頼ることの大切さ、今回のLTを聞き、不安が和らぎ楽しみに変わってきました。早くチーム開発したい!!

speakerdeck.com

@Maedaさん

終わらないマラソン…。すごくわかります。自分も隅々まで理解しなければならない。という思いが強い方なので、パラシュート勉強法を意識し、コミュニティを活用していきたいと思いました。プログラマを目指す以上、技術についてのマラソンは終わることありません。それなら、楽しく自分のペースで走り続けたいと思いました。

ある文系プログラマがテックリードを任されるまでに学んだこと ── 最前線で生き延びる4つの戦略 - エンジニアHub|Webエンジニアのキャリアを考える!

speakerdeck.com

@Shugo さん

侘び寂びの効いた素敵なLTでした。タイトルの「休む、」の「、」がなんか好きです。内容もスライドと話の展開もあいまって惹きつけられました。べきべき思考はすごく共感。認知の歪みだと意識して対応していきたいと思いました。最近観た「おつかれシャワー」ともリンクして「休む、」の大切さが沁みました。。。。

#178 メンタル不調の体験談 - YouTube

speakerdeck.com

@haruguchiさん

「孤学」

自分もひとりで学習しているときに限界を感じ、それからFBCに参加した経緯があり、とても共感できるLTでした。当時、自分では「独学」だと思っていましたが「孤独」だったとは…。(独学大全読み返したいと思います)

独学大全 | 書籍 | ダイヤモンド社

現在、haruguchiさんとは輪読会でご一緒してますが、説明が論理的でわかりやすく、いつも助けてもらっています。声馴染みという表現も素敵でした。これからもよろしくお願いします!

speakerdeck.com

@Aseiideさん

直前までスライド作成していたとは思えない安定感抜群の発表でした。しかも明日もLT出るとは凄すぎる!

kaigionrails.doorkeeper.jp

GitHubのissueの機能は知りませんでした。早速使ってみようと思います。タスクの分解を解像度と表現されているのがわかりやすかったです。自分はタスク分解が下手なので、今回の内容でもあった粒度を常に意識して取り組んでいきたいと思いました。

ideさんは輪読会など、普段から話す機会も多いのですが、話す内容の構成が論理的でとても分かりやすく尊敬します。明日も頑張ってください!

speakerdeck.com

N4be さん

LT後の雑談タイムでは楽しくおしゃべりでき盛り上がりました。しかし、そこでの印象が強くLTの内容が思い出せません…w

そんな明るく素敵なN4beさんは、大学とも並行してFBCも器用にこなされている印象だったので、今回のようなしくじりは意外でした。「プラクティスをどんどん進めたい」という誰しもがかかる悪魔の呪いに立ち向かっていくために「面倒くさがらない、本読もう、公式文書を読もう。」みんな失敗から学んで成長しているんですね。

ビール片手にN4beさんとしくじり話を語り合いたくなる、そんな素敵なLTでした!

Prost!!

speakerdeck.com

@napple29さん

当時を思い返すとSSH接続のプラクティスに取り組んでいるとき、マジわからん‥‥の連続でした。本当ツラかった。。。「全くわからないことがわかった経験が自信になった」これは完全にわかりみでした。自分もわからない経験を乗り越え、その度に自信になり今も続けられていますが、わからないままで終わらなかったのは、FBCのおかげです。

冒頭で「初心を思い出す系LT」とありましたが、いつでもこの初心を忘れないようにしたいと思える、そんな素敵なLTでした!

speakerdeck.com

主催の@siroemkさん

LT会の主催お疲れさまでした!

とても楽しく学びの多い会でした。 ぜひ今後はTシャツ作りましょう!w

チェリー本輪読会 第14週目まとめ

f:id:shirotamaki:20210619091936p:plain

🍒 はじめに

チェリー本輪読会の第14週目のエントリーになります。

輪読会の概要については第1週目にまとめています。

🍒 輪読会 第14週目まとめ

第9章9.1.1〜第9章9.7まで

期間:2021年08月23日〜2021年08月27日

エラーとは

プログラムの処理中に発生するエラーにはいくつか種類があります。

  • データのエラー((広い意味で)データの誤り。構造上の間違いなど)
  • システムのエラー(ハードディスクが故障、回線が切断など)
  • プログラミングのエラー(メソッド名、引数が存在しない、間違っているなど)

上記のようなさまざま状況で発生するエラーですが、プログラムを正常に戻し処理を続けるには、エラーの原因を取り除く必要があります。その際に役に立つのが「例外」という仕組みです。

Rubyには、エラー処理をサポートするための「例外処理」の仕組みが備わっています。

例外(Exception)とは

wikipediaには以下のように書いています。

プログラミングでは、プログラムがある処理を実行している途中で生じ得る、設計から逸脱した状態を「例外」という。

例外 - Wikipedia

ここでは、地震、落雷により急にパソコンのハードウエアが壊れてエラーが起きるような、想定が困難な状況ではなく、「メソッド名の定義がおかしい。変数に誤った値が格納されている、タイポしている等」予め発生する可能性があると思われる、想定しているエラーのことを指しています。通常、例外は何らかの理由により処理が中断され、その状況に関する情報が通常とは異なる経路で送出されます。

例外処理とは

エラーが起きたときに行う処理のことを例外処理と呼んでいます。プログラムの実行中にエラーが起こると、プログラムは一時中断し「例外処理」を探しそれを実行します。

仮に、以下のファイルを用意し実行してみました。敢えて、行末のメソッドで呼び出すことができない引数を渡しています。

# fizz_buzz.rb

def fizz_buzz(n)
  if n % 15 == 0
    'Fizz Buzz'
  elsif n % 3 == 0
    'Fizz'
  elsif n % 5 == 0
    'Buzz'
  else
    n.to_s
  end
end

fizz_buzz(foobarbaz)

結果、プログラムが一時中断し「例外処理」が出力されます。

❯ ruby fizz_buzz.rb
fizz_buzz.rb:13:in `<main>': undefined local variable or method `foobarbaz' for main:Object (NameError)

例外処理もオブジェクト

上記の例外処理では、NameErrorとなり、「定義されていないローカル変数またはメソッドなので、エラーですよ〜」と怒られています。この例外処理は、NameErrorクラスのオブジェクトになります。

NameError(未定義のローカル変数や定数を使用したときに発生します。)

class NameError (Ruby 3.0.0 リファレンスマニュアル)

例外クラス(るりま)

例外も例外クラスのインスタンス(オブジェクト)なので、るりまに情報がまとめられています。

library _builtin (Ruby 3.0.0 リファレンスマニュアル)

例外処理が発生した場合、るりまを読んでも具体的な解決策がわかないことが多いです。その際は、適切なキーワードを元に(エラー文など)解決策をググって見つけた方が早いです。(個人的意見)

例外を捕捉して処理を実行する

何らかの理由で例外が発生してもプログラムを続行したい場合は、begein 〜 rescue 〜 end と、記述することで、プログラムを続行させることができます。

# 構文

begein
    # 例外が起きうる処理
rescue
  # 例外が発生した場合の処理
end

実際に試してみました。

puts '演奏開始'

module BassGuitar
    def play(bassist)
        puts "#{bassist}: ブン!ブン!"
    end
end

begin
    bass_guitar = BassGuitar.new('ジャコ・パストリアス')
rescue
    puts '機材トラブルが発生したが、このまま演奏を続行する'
end

puts '演奏終了'

この処理を実行してみると...

# 処理結果
演奏開始
機材トラブルが発生したが、このまま演奏を続行する
演奏終了

「演奏開始」を出力し、その後、begin以下で「例外が起きうる処理」を書いていますので、rescue以下で、「機材トラブルが発生したが、このまま演奏を続行する」がputsで出力されました。その後の「演奏終了」まで無事出力されたので、最初から最後までプログラムを実行できたことになります。

例外オブジェクトから情報を取得する

例外オブジェクトから情報を取得することも可能です。

# 構文

begin
    # 例外が起きうる処理
rescue => 例外オブジェクトを格納する変数
    # 例外が発生した場合の処理
end

rescue => e として、変数に例外オブジェクトを格納することができます。変数eは、exception(例外)から来ています。

例外オブジェクトへメソッドを使うことで、エラーメッセージmessageメソッドを返したり、バックトレース情報backtraceメソッドを返したりすることができます。

module BassGuitar
    def play(bassist)
        puts "#{bassist}: Bom!Bom!"
    end
end

begin
    bass_guitar = BassGuitar.new('ジャコ・パストリアス')
rescue => e
    puts "エラークラス: #{e.class}"
    puts "エラーメッセージ: #{e.message}"
    puts "バックトレース: #{e.backtrace}"
    puts "---------------------------------"
end

この処理を実行してみると...

# 処理結果
エラークラス: NoMethodError
エラーメッセージ: undefined method `new' for BassGuitar:Module
バックトレース: ["(irb):27:in `<main>'", "/Users/shiro/.rbenv/versions/3.0.2/lib........(省略)
---------------------------------

変数eへ格納した例外オブジェクトの情報を出力することができます。

意図的に例外を発生させる

例外は捕捉するだけではなく、コードの中で意図的に発生させることもできます。

その際に使用するのが、raiseメソッドです。

チェリー本のプログラム例を試してみました。(9.3 「意図的に例外を発生させる」チェリー本341頁)

def currency_of(country)
 case country
    when :japan
      'yen'
    when :us
      'dollar'
    when :india
      'rupee'
    else
      raise
  end
end

# 実行結果
currency_of(:italy)
(irb):24:in `currency_of': unhandled exception
  from (irb):27:in `<main>'
  from /Users/shiro/.rbenv/versions/3.0.2/lib/ruby/gems/3.0.0/gems/irb-1.3.5/exe/irb:11:in `<top (required)>'
    from /Users/shiro/.rbenv/versions/3.0.2/bin/irb:23:in `load'
  from /Users/shiro/.rbenv/versions/3.0.2/bin/irb:23:in `<main>'

???

エラーメッセージにunhandled exception と出てしまいました。

チェリー本とるりまには、特定の例外クラスに該当しないエラーが起こった場合はRuntimeErrorが発生すると書いてあるが、なぜ?

質問してみました

伊藤さんから回答いただきました。

どこかのタイミングで表示が変わったようです。以下のように記述すると、RuntimeErrorを出すことができました。

def currency_of(country)
  case country
  when :japan
    'yen'
  when :us
    'dollar'
  when :india
    'rupee'
  else
    raise
  end
end

begin
  currency_of(:italy)
rescue => e
  p e
end

# 実行結果
RuntimeError

例外処理のベストプラクティス

  • 例外処理のセオリー
    • 例外が発生したら即座に異常終了させよう
    • フレームワークの共通事項に全部丸投げしよう

安易にrescueせずに、フレームワークに備わっている例外処理の仕組みに処理を委ねるのがセオリーです。実際にrescueすべきケースに遭遇した時、今回の件を改めて見直し対応を検討するのが、初心者の内はベストプラクティスだと思いました。

RubyMine入門

zenn.dev

フィヨルドブートキャンプ受講生の@ikumatdkrさんが、Zennで出版されたRubyMineの入門書です。

RubyMineを使い始めたばかりの方、基本操作は覚えたんだけどさらなる便利機能を覚えたい方、ぜひとも一度読んでいただきたい内容です。

僕もRubyMineを使い初めて3ヶ月目ごろに読みましたが、知らない内容や知ってはいたが使いこなせていない内容が盛りだくさん、かつ親切丁寧に説明されており、非常に勉強になりました。

RubyMineは、ググっても詳しく丁寧に説明されている情報があまりありません。また公式ページも細かい説明までは載っていなく、RubyMine初心者にとっては、まず最初に読むべきベストな一冊だと思います!!

しかも無料!@ikumatdkrさん、ありがとうございます〜!

参考書籍

🍒 まとめ

今週は例外処理編でした。

例外処理のベストプラクティスに書いたように、まずはフレームワークに従うのが良いとは思いますが、裏側で起こっている処理の仕組みを知ることができ勉強になりました。

次は、yield、Procについて書きたいと思います。

では、また来週!(次回、第15週目)