Ruby SilverとGoldに合格した

はじめに

Ruby 3に対応したRuby技術者認定試験に合格しました。

Ruby Association Certified Ruby Programmer Silver version 3

Ruby Association Certified Ruby Programmer Gold version 3

www.ruby.or.jp

Ruby Silverの方は94点、Goldの方は86点でした。

目次

Ruby力について

読んだことあるRubyの書籍は、ゼロからわかる Ruby 超入門プロを目指す人のためのRuby入門(通称:チェリー本)です。

実務経験は半年ほどです。

受験経緯

資格試験がRuby 3にアップデートされたためです。いいタイミングで一回落ちても再度受験可能キャンペーンがあったので、落ちてもOK精神で受験を決めました。

Ruby技術者認定試験再受験無料キャンペーン(2022年10月3日開始)

勉強時間

Silver

12/14 ~ 12/28(12/28受験)

20 ~ 25hほど

Gold

12/29 ~ 1/10(1/10受験)

25hほど

※ Silverの方は昔ちょこちょこRExを解いたりしたこともあったりなど、正確な時間ではないです

やったこと

SilverもGoldもどちらも、

  1. RExで9割〜10割安定するまでやる
  2. 模擬問題集・合格教本(最後の方についてる問題集2つ)を満点取れるまでやる
  3. 直前に受験体験記を見る

という方針で学習しました

具体的にやったこと

Silver

  • REx 12回

  • 模擬問題集 4回

  • 合格教本(最後の方についてる問題集2つ) 3回

Gold

  • REx 8回

  • 模擬問題集 5回

  • 合格教本(最後の方についてる問題集2つ) 3回

受験して思ったこと

参考にさせてもらった記事

思ったこと

Rubyについて知らないことがたくさんあることがわかったのと、会社の人が喜んでくれたのでそれだけでも勉強してよかったと思いました。

FjordBootCampというプログラミングスクール内で実施されていた、ゼロからわかる Ruby 超入門プロを目指す人のためのRuby入門(通称:チェリー本)の輪読会で学んだ知識がとても役に立ちました!

maeda-seina.hatenablog.com

おわりに

Rubyについてわからないことが増えたので、引き続き学習していきたいと思います

Discordrb + Heroku Schedulerでのやらかしについて

はじめに

フィヨルドブートキャンプで学習しています@Maedaといいます。 現在自作サービスを作るプラクティスでDiscord Botの作成に取り組んでいます。

Discordrb + Heroku Schedulerを使用した際につまづいたことについて話していきたいと思います。

目次

現在作成しているもの

Discordサーバー内のテキストチャンネルからランダムに一つ選び毎朝アナウンスしてくれる、テキストチャンネル紹介botを作成しております。

ruby-jpではrubotyというSlack botが毎朝9時にサーバー内のチャンネルをランダムで一つ紹介してくれています。このDiscord版(フィヨルドブートキャンプのDiscordサーバー内で使用)を作成しています。

まだ作成は終わっていませんが、こんな風にDiscord botがチャンネル紹介をしてくれるイメージです↓

botが毎日決まった時間にチャンネル紹介するようにしたいな〜と思ったのが、Heroku Schedulerを導入した経緯になります。

はまったところについて

では早速、自分がはまったことについてです。

Heroku Schedulerを導入する上で、まず1時間に一回定期実行してくれるのかをテスト検証してみようと思い、毎時間30分(1:30→2:30→3:30...)になったらチャンネル紹介するコマンドを実行するというjobをHeroku Schedulerに登録しました。

その結果、3時間に1回しかbotがチャンネル紹介してくれないという問題が発生しました...

(下の画像のような感じで、3時間に1回しかbotがチャンネル紹介してくれない...)

なんでだろう...という状態だったので、一つ一つ原因を調査してみることにしました。

調査

調査をフィヨルドブートキャンプのメンターの方と一緒に行って頂きました。

まずは、きちんとデプロイやHeroku Schedulerの設定がうまくできているかを確認しました。

→ここはHerokuのドキュメント通りに行ったため、問題なさそうということになりました。

次に、設定したjobがきちんと実行されているかどうかを確認をするため、「ログを集める・読む」ということを行いました。

ログの情報から、実行されたプロセスがずっと残り続けている。ということがわかり、ここが怪しいのではないか?ということに。(本来であれば、Process exited with status 0State changed from up to completeというような感じで、プロセス自体が完了になっているはず!)

(実際のログ↓)

Mar 16 01:30:24 rocky-temple-69583 heroku/scheduler.6680 Starting process with command `bundle exec ruby bin/bot_run.rb`
Mar 16 01:30:24 rocky-temple-69583 heroku/scheduler.6680 State changed from starting to up
Mar 16 02:32:30 rocky-temple-69583 heroku/scheduler.6680 Cycling
Mar 16 02:32:30 rocky-temple-69583 heroku/scheduler.6680 State changed from up to complete
Mar 16 02:32:31 rocky-temple-69583 heroku/scheduler.6680 Stopping all processes with SIGTERM
Mar 16 02:32:31 rocky-temple-69583 heroku/scheduler.6680 Process exited with status 143
Mar 16 04:30:09 rocky-temple-69583 heroku/scheduler.1568 Starting process with command `bundle exec ruby bin/bot_run.rb`
Mar 16 04:30:10 rocky-temple-69583 heroku/scheduler.1568 State changed from starting to up
Mar 16 05:31:08 rocky-temple-69583 heroku/scheduler.1568 Cycling
Mar 16 05:31:08 rocky-temple-69583 heroku/scheduler.1568 State changed from up to complete
Mar 16 05:31:10 rocky-temple-69583 heroku/scheduler.1568 Stopping all processes with SIGTERM
Mar 16 05:31:10 rocky-temple-69583 heroku/scheduler.1568 Process exited with status 143
Mar 16 07:30:19 rocky-temple-69583 heroku/scheduler.6649 Starting process with command `bundle exec ruby bin/bot_run.rb`
Mar 16 07:30:19 rocky-temple-69583 heroku/scheduler.6649 State changed from starting to up
Mar 16 08:31:30 rocky-temple-69583 heroku/scheduler.6649 Cycling
Mar 16 08:31:30 rocky-temple-69583 heroku/scheduler.6649 State changed from up to complete
Mar 16 08:31:31 rocky-temple-69583 heroku/scheduler.6649 Stopping all processes with SIGTERM
Mar 16 08:31:31 rocky-temple-69583 heroku/scheduler.6649 Process exited with status 143

(実際の画像↓)

そもそも、このサービスのやりたいこととしては「Discord Botが毎日1回サーバー内のテキストチャンネルをランダムに一つ紹介する。」それだけであるので、 本来であればプロセスが生き続けている事自体がおかしいことに気づきました。

そこで初めて、不必要にbotを稼働させてしまっていることに気づきました。。。(ログを見るまでは気づいてませんでした...)

コードを見てみると、自分が行いたいことは 「botがチャンネルにメッセージを送るようにする」という事であり、それはDiscordrb::API::Channel.create_message(...)で実現できているのにも関わらず、「botを継続的に稼働させるようにする」という行う必要のないDiscordrb::Bot.new(...).runまで行うようにコードを書いてしまっている事がわかりました。


参考

  • Discordrb::API::Channel.create_messageについて

https://drb.shardlab.dev/v3.4.0/Discordrb/API/Channel.html#create_message-class_method

  • Discordrb::Bot.new(...).runについて

https://drb.shardlab.dev/v3.4.0/Discordrb/Bot.html#run-instance_method


「不必要にbotを稼働させてしまっていた」ここが今回の一番のやらかしポイントでした。

この部分を修正しデプロイし直した結果、きちんとHeroku Schedulerが作動し、1時間毎にチャンネル紹介をしてくれるようになりました。

修正したPRです

github.com

なぜチャンネル紹介が3時間おきに行われたのか?について

Heroku Schedulerの話に戻りますが、1時間おきにHeroku Schedulerが実行されるようjobを設定しているのにも関わらず、3時間おきに実行されてしまうという問題がありました。

この件について調べてみたところ、Heroku Schedulerのログの中にあるサイクルがあることがわかりました。

(実際のログ↓)

# ---ここから
Mar 16 01:30:24 rocky-temple-69583 heroku/scheduler.6680 Starting process with command `bundle exec ruby bin/bot_run.rb`
Mar 16 01:30:24 rocky-temple-69583 heroku/scheduler.6680 State changed from starting to up
Mar 16 02:32:30 rocky-temple-69583 heroku/scheduler.6680 Cycling
Mar 16 02:32:30 rocky-temple-69583 heroku/scheduler.6680 State changed from up to complete
Mar 16 02:32:31 rocky-temple-69583 heroku/scheduler.6680 Stopping all processes with SIGTERM
Mar 16 02:32:31 rocky-temple-69583 heroku/scheduler.6680 Process exited with status 143
# ---ここまで

# ---ここから
Mar 16 04:30:09 rocky-temple-69583 heroku/scheduler.1568 Starting process with command `bundle exec ruby bin/bot_run.rb`
Mar 16 04:30:10 rocky-temple-69583 heroku/scheduler.1568 State changed from starting to up
Mar 16 05:31:08 rocky-temple-69583 heroku/scheduler.1568 Cycling
Mar 16 05:31:08 rocky-temple-69583 heroku/scheduler.1568 State changed from up to complete
Mar 16 05:31:10 rocky-temple-69583 heroku/scheduler.1568 Stopping all processes with SIGTERM
Mar 16 05:31:10 rocky-temple-69583 heroku/scheduler.1568 Process exited with status 143
# ---ここまで

# ---ここから
Mar 16 07:30:19 rocky-temple-69583 heroku/scheduler.6649 Starting process with command `bundle exec ruby bin/bot_run.rb`
Mar 16 07:30:19 rocky-temple-69583 heroku/scheduler.6649 State changed from starting to up
Mar 16 08:31:30 rocky-temple-69583 heroku/scheduler.6649 Cycling
Mar 16 08:31:30 rocky-temple-69583 heroku/scheduler.6649 State changed from up to complete
Mar 16 08:31:31 rocky-temple-69583 heroku/scheduler.6649 Stopping all processes with SIGTERM
Mar 16 08:31:31 rocky-temple-69583 heroku/scheduler.6649 Process exited with status 143
# ---ここまで
  1. Heroku Schedulerが起動し、bundle exec ruby bin/bot_run.rbが実行された結果ファイル内に記載されている、Discordrb::API::Channel.create_messageが実行されてチャンネル紹介が行われ、Discordrb::Bot.new(...).runが実行されてbotの稼働が始まる。

  2. 1時間後、Heroku Schedulerが起動するも、Cycling(再起動が実行)が行われ、まだ残っているプロセス(Discordrb::Bot.new(...).run)を強制終了させる。(jobに設定してあるbundle exec ruby bin/bot_run.rbは実行されていない)

  3. 1時間後、実行されるはずのHeroku Schedulerが起動されない。→1に戻る。

→ この1~3のサイクルが繰り返されて、3時間毎にチャンネル紹介がされていたということがわかりました。


色々調査しましたが結局のところ、

  • 2.で、Heroku Schedulerに設定したコマンドが実行されずに、プロセスを殺しただけで終了してしまっていること。
  • 2.で残っているプロセスを殺して終了した後、1時間後に実行されるはずのHeroku Schedulerが全く実行されていないこと。(その1時間後に再び定期実行されるようになる)

この2点に関してはなぜなのかわかりませんでした...

(わかる方がいらっしゃれば、コメントしてくださると幸いです。)


追記(3/30)

jnchitoさんからコメントいただきましたので、追記させて頂きます。

ここは僕もよくわからないのですが、Schedulerのドキュメントの「Long-running jobs」を読むと、そもそも「スケジューリング間隔をオーバーするような長時間のタスクはSchedulerを使うな」的なことが書いてあるので、あまり深追いしなくても良さそうな気がします。想定外の使い方をしてしまったので想定外の動きになった、ぐらいな結論でいいかもしれません。数秒〜数分で終わる適切なタスクを設定する上では、こういった問題は起きないはずなので。

https://devcenter.heroku.com/articles/scheduler#long-running-jobs

Heroku側も想定していない使い方をしてしまっていたので、どれだけ調べても推測でしかわからなそうということです。。。

そもそもの使い方がイレギュラーすぎると、原因も追いにくいということが分かりました😓

今回のまとめ

botを稼働させるという必要のないことをしてしまい、Heroku Schedulerが1時間後に次のコマンドを実行するときに前のプロセスが残り続けている。という問題が起きた結果、今回のような3時間に1回しか実行されないという問題に繋がってしまった。というのが今回の一連の流れです。

自分のやりたいこととしては、サーバー内のチャンネル情報を取得し、その情報をフォーマットし、その結果をbotに出力させる。ということなので、「スクリプトを実行する」ことで事足りるにも関わらず、使わなくてもいい機能であるDiscordrb::Bot.new(...).runを行ってしまっていた。ということが一番のやらかしポイントでした。 (Discordrb::Bot.new(...).runを行う必要があるのは、そのサーバー内にbotを常駐させて何かコマンドに対して反応させる必要がある時のような場合に行う)

学んだこと

  • Discord bot動作させる上で、 Discordrb::Bot.new(...).runを行うことが必要条件ではないことを学びました。(Discordrb::Bot.new(...).runbot稼働させる上で最低限必要なもの。)

  • Herokuのログを見るには、Papertrailというアドオンを入れておくと良い。

→ターミナルからもログはみれるが、Papertrailは検索機能がありとても使いやすかった。

→設定からTime zoneを日本時間に変更できる。(デフォルトではUTCで設定されているので、少し見づらい。)

  • 新しい技術(今回でいうとDiscordrbライブラリとHeroku)を使うときは、きちんとドキュメントを読むことが大事であると実感しました。きちんと理解しないまま使用すると、こんなこと間違えるわけない!!!という間違いを平気でしてしまうことがわかりました。

おわりに

最後まで読んでいただき、ありがとうございます。

この問題で1週間くらい悩まされたので、原因がわかったときは本当にスッキリしました! 一緒に調査して頂いた、フィヨルドブートキャンプのメンターの@cafedomancerさんありがとうございました!

また、今回このようにブログ記事にしたのも、 これまたフィヨルドブートキャンプのメンターである、伊藤淳一 (id:JunichiIto) さんにフィヨルドブートキャンプのDiscordサーバー内で自分(@Maeda)の調査方法(問題に対して「仮説」→「検証」を全然行えていなかった)が良くないとご指摘を受けたところから始まりました。(まだよくわかってない箇所がいくつかありますが...) 記事としてまとめるきっかけを頂き本当に感謝しております。

自分のようなことではまらない人が出ないことを祈っています!

輪読会のすすめ

はじめに

この記事はフィヨルドブートキャンプ Advent Calendar 2021 Part 1 24日目の記事です。

フィヨルドブートキャンプ Advent Calendar 2021 Part 2もあります。

本日Part2の方の記事はSakiさんの記事になります!楽しみです!

昨日はあじたまさんの記事でした。

azitama.com

目次

簡単な自己紹介

フィヨルドブートキャンプ32期生のMaedaと申します。

Webエンジニアを目指してフィヨルドブートキャンプで学習中です。

なぜこの記事を書こうと思ったか

この約4ヶ月間輪読会に参加してみて、輪読会良いな〜という思いでいっぱいなので、その気持ちを書きたい!と思ったためです。

この記事を読んで、輪読会に参加してみたいな。輪読会いいな。と思っていただければ嬉しいです。

では早速、輪読会で個人的に良かったな〜と思うポイントをつらつらと書いていこうと思います。

注意

この記事はフィヨルドブートキャンプ生向けの内容になっている箇所が少なからずあります。

その点はご了承ください。

輪読会とは?

フィヨルドブートキャンプにいると輪読会という言葉があまりにも当たり前に使われています。ですが輪読会って何?っていう人もいらっしゃると思いますので簡単に説明しておきたいと思います。

数人が一つの本を順番に読んで解釈をし、問題点について論じ合ったりすること。 (デジタル大辞泉「輪読」の解説)

フィヨルドブートキャンプで行われている輪読会は、 司会・ドライバー・読む順番を決めて、モブプロ形式で一つの本を順番に読んでいき、わからないところや疑問に思ったことがあればその場で質問し、最後にHackMDに気づきや学びを書き、一人づつ発表する。という流れで行われています。

これだけの説明ではわかりにくいと思うので、より具体的に知りたい方は下の記事を参照してください。輪読会がどのようなものかイメージつくと思います!

チェリー本輪読会 第1週目まとめ - D IT Y

チェリー本輪読会を完走した感想 - Leap of faITh

チェリー本輪読会を完走しました - やなぎにっき

shirotamaki.hatenablog.com

isshi-hasegawa.hatenablog.com

yana-g.hatenablog.com

参加したいと思ったきっかけ

輪読会のワイワイとした熱気が伝わってきて楽しそうだな〜と思った。

輪読会きっかけでもくもく会が始まったりなど、外から見ていると、とても楽しそうで、個人で細々と学習していたこともあり、かなり羨ましく思っていました。

輪読会にラジオ参加した時に、めっちゃ勉強になる!すごい!!!と感銘を受けた。

雰囲気でコードを読んでしまっていた自分からして、論理的にコードを読み下していた前チェリー本輪読会の皆さんの凄さは今でも覚えています!(現在開催されているチェリー本輪読会は2代目です。) 皆さんみたいにRubyが読めるようになりたいなと思い、輪読会に参加したいなと思いました。

本読むのが苦手で、輪読会の力を借りたいと思った。

チェリー本輪読会を主催してくださっているParuさんの記事に書いてあるように、まさに自分もなかなか一人では本を読み進めるのしんどいな〜と悩んでいました。

本が読めない人だったことに今頃気づいた私が輪読会に救われた話 - Every day is a new day.

paru871.hatenablog.com

参加して良かったこと

Rubyについてとにかく勉強になる。

+ってInteger#+メソッドだったんだ。とか、if文って実は式だったんだ。とか、イミュータブルなクラスには破壊的メソッドがないんだ。とか、メソッド呼び出しには必ずレシーバが必要で、なくても動いているのは省略されているだけだったんだ。などなど...

ここには書ききれないほどたくさん学びがありました。 どれも個人での学習では気づけなかったことばかりです!

コードの読み方を教えてもらった。

今まではコードを雰囲気で読んでいただけだった。ということに気付かされました。 教えてもらったという言い方は語弊があるかもしれませんが、参加されている皆さんのコードの読み方を見たり、聞いたりするだけでかなり勉強になりました。 今までRuby難しいなと思っていたのですが、それはただコードを読むということができていなかっただけだったのかもしれないな。と今では思っています。 自分の学習のステージが上がったような気がしています!

参加してる人と仲良くなれた。

毎日参加していることもあり、徐々に参加メンバーと仲良くなっていきます。 くだらないことを話したり、日報で励ましあったり、詰まっているプラクティスのことを質問したりなどなど、良い関係を築けているな〜ありがたいな〜と日々感謝しています。

輪読会でたら元気になるということが多々ある。

くっっっ...今日はなんか元気出ないな。という日でも輪読会出てみると、皆さんからエネルギーをもらって切り替えて学習できたりすることが多いです!

コミュニケーションを取れる場所ができた。

一人ではどうしても孤独な学習となりがちです。 少しの悩みでも相談できる人がいるだけで心がかなり楽になります。 輪読会参加が学習を続けられている要因の一つになっているなと感じています。

公式リファレンスを読む癖がついた

わからないことが出てきたら、まず公式リファレンスを参照するようになりました。これも輪読会のおかげで身についたことだと思います。

卒業生の方や現役エンジニアの方が参加してくれる

受講生同士で進めているため、全くわからない。という場面がよく出てきます。そんな時は卒業生の方や現役エンジニアの方が教えてくれたり、一緒に考えたりしてくれるのでとてもありがたいです。

本を細かく丁寧に読むという楽しさを教えてもらった。

チェリー本をかなり細かく丁寧に読み進めています。確かに時間がかかりますが、その分めちゃくちゃ深く学べて学びが多いです。こんなことまで書いてあるのか。といつもびっくりしています。 一人で読んでたら絶対にできないことだと思います。

コミュニティに慣れるということにつながる

質問タイムなどのコミュニティに参加するハードルが下がったように思います。 輪読会参加が、コミュニティ慣れにつながっているのかもしれないと感じてます。

参加するか迷う理由

勉強は個人でするものだ。

自分のペースで学習したい。という人には向いてないかもしれません。ただ、学習はめちゃくちゃ長いので、個人で学習していると辛くなってしまう。という人なんかは、みんなでワイワイやって進んでいくのがオススメなんじゃないか。と思っています。(自分がまさにそうです。)

読み終わるまで期間が長すぎる

早く終わらせてどんどん学習したいという人には向いていないかもしれません。逆に、少しずつ深く学びたいという人にはとっておきの学習機会だと思います。

よそもの扱いされたら嫌だな。

これは真逆です。参加してくれるだけで、みんなめっちゃ喜びます。

参加していて面白いと思ったこと

たまに特殊なイベントが発生する(開催してくれる人に感謝。)

輪読会のメンバーでモブプロやったり、難しかった単元や箇所の復習会をやったりなど。

最初は気づかなかった参加している人のいいところが見えてくる。

質問するのがうまい人、気配りがすごいできる人、説明がとにかくうまい人、場を和ませることができる人、指摘をするのが的確で早い人、調べるのが早い人、進行役がとても上手な人、まとめるのが上手い人、などなど。

チェリー本輪読会を気になっている方へ

開催日時

平日の18:00~19:00の1時間

現在やっているところ

第7章のクラスの章の途中です。

チェリー本輪読会特有の特徴

  • 優しい人が多い(主観)

  • 始まる前の10分間で悩み相談できる。

  • 最後全員一人一人が発表する時間がある。

チェリー本輪読会の具体的な流れ

18:00〜 プラクティスで詰まっているところなど、悩み相談したい人がいたら相談する時間になっている。その後、司会(進行役)とドライバー(画面共有してコードを打つ人)と読む順番を決める。(今は始まる前に事前に決まっている。)

18:10〜 本を読む人が、音読して読み進めていく。コードも読み下す。疑問点や気づいたことがあったらその場で質問する。

18:40〜 今日の学びと気づきをHackMDに書き込む。(学んだことを言語化する時間がある。)

18:45〜 学んだことを一人ずつ発表する。

19:00〜 解散

途中から参加するのなんだかな...という方へ

どしどしラジオ参加でも遊びに来てください。 来てくれたら輪読会メンバーみんな喜びます。 特に主催のParuさんが喜びます。

しかし、最初から参加して学習したいという気持ちはすごくわかります。自分もそうでした。

丁度、フィヨルドブートキャンプの卒業生であるふーがさんが主催される「りんどく.rb」でチェリー本の輪読会が1月頃から始まるそうです。(しかも第二版!!)

そしてこちらはフィヨルドブートキャンプ生じゃなくても参加できるそうです!

詳しくは、ふーがさんの記事に書かれているので気になる方は読んでみてください!

Rubyの技術書を輪読する”りんどく.rb”を立ち上げます - No day younger than today

fuga-ch85.hatenablog.com

また、🎍新春 輪読会EXPO🎍というイベントがフィヨルドブートキャンプ生向けにはなりますが、開催されます。 数々の輪読会を主催されてきたトミー (id:eatplaynap329)さんが主催されます。 現在フィヨルドブートキャンプで開かれている各輪読会の紹介などがあるそうなので気になる方は参加してみてください!

参加する勇気がなかなかでないという方へ

フィヨルドブートキャンプ生の輪読会やコミュニティ参加までの苦悩などが書かれている記事があります。 めちゃくちゃいい記事なのでぜひ読んでみてください。

本が読めない人だったことに今頃気づいた私が輪読会に救われた話 - Every day is a new day.

私のコミュニティ参加のきっかけについて - いろはにほへと

paru871.hatenablog.com

napple29.hatenablog.com

おまけ

現在輪読会で通読しているプロを目指す人のためのRuby入門(通称チェリー本)の著者である伊藤淳一 (id:JunichiIto)さんは、フィヨルドブートキャンプのメンターなのですが、一度だけ伊藤さんがふらっと輪読会に遊びにきてくださったことがありました。 その時に、「なんか質問ある?」と聞いてくださったのですが、 突然のことすぎてみんなびっくりしすぎて誰も質問できなかったということがありました笑

次の日、次来てもらった時に質問を用意しておかないと!ってみんなで反省会をしました。

おわりに

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

初ブログを書いた感想は、ブログ書くのはかなり体力がいる!ということです。これを知れただけでも書いてよかったな〜と思いました。

フィヨルドブートキャンプ生の皆さんのブログの書き方を参考にして作成させてもらいました! ありがとうございました。

明日はフィヨルドブートキャンプ Advent Calendar 2021 Part1 Part2の最終日となります。

最終日は、@komagataさんと、mh@mobiler⚡️さんの記事です!楽しみです!😄