ゆみんぐ ~Yumi+Programming~

弓道とプログラミングを楽しむブログ

【Rails 7 + Hotwire】弓道の練習記録の管理・集計ができるアプリ「弓道練習記録帳」をリリースしました

はじめに

このたび、Rails 7とHotwireを使用した自作アプリ弓道練習記録帳」をリリースしました。
Rails 7から導入されたHotwireというフレームワークを使うと、JavaScriptをあまり使わずにSPAのような動きをするWebアプリを作ることができます。今回、弓道練習記録帳を作るにあたりRails 7を使用することにしたため、こちらも使ってみようと思い導入しました。
ユーザー認証のGemとしてDeviseを使っていますが、作成時点では正式にRails 7の対応がなされていませんでした(※)。そのため、一部Devise関連でTurboを切って実装した部分がありますが、メインの機能はすべてHotwireを使用して実装しています。
(※作成時点では対応していませんでしたが、2023年2月17日にTurboに正式対応したDevise 4.9.0がリリースされています)

アプリURL kyudo-training-log.com

GitHubリポジトリ github.com

弓道練習記録帳の紹介

弓道練習記録帳は弓道の練習記録を管理・集計するためのアプリで、スマートフォンやPCで手軽に練習記録の入力をしたり、過去の練習メモや月間の練習量の確認ができます。

特徴

  • 練習した射数、練習で気づいたことのメモを記録でき、カレンダーに射数を表示します。
  • 入力した記録は一覧で表示されます。記録の際に「固定表示する」にチェックをすると一覧の1番上に表示されます。また、「大切な記録」にチェックを入れたものだけを一覧表示することができます。
  • 今月どれだけ練習できるかの目標射数を入力でき、現在どれだけ練習したかの実績が表示されます。
  • あえて的中率は記録しません。的中率にこだわらず練習量を積み重ねて自分がどれだけ練習したかを分かりやすくします。

使い方

1.今月の目標を入力します。今月の目標射数と実績射数、残り射数が表示されます。

2.練習記録を入力します。

3.カレンダーに練習した射数が表示されます。射数をタップ・クリックで記録の詳細が確認できます。

4.入力した記録は一覧で表示されます。固定表示の記録は1番上に、大切なメモと切り替えができます。

作った経緯

このブログのタイトルにもなっている通り、私は高校から弓道を始め現在まで続けています。
これまで練習で気づいたことや弓を引いた数(射数)等の記録を紙のノートに書いていました。ですが紙のノートだと書くのを忘れてしまったり、違うノートになった時に振り返るのが大変だったりします。
その点、スマホを使ってその場で手軽に練習記録を残せれば、記憶が鮮明なうちに記録でき、ノートが手元になくてもいつでも振り返ることができるな、と思ったのが始まりです。
スマホ弓道用のアプリとして、中った、外れたといった「的中をつけるアプリ」はいくつかありますが、自分の練習環境が変わったこともあり、的に向かわない練習(束ねた藁に向かって引く、ゴム製の弓を引く、何も持たずに型を確認する等)の比率が高くなり、自分に合わなくなってきました。的に向かって引かないので、的中をつけるアプリは逆に「こんなに練習が少ないのか…」とモチベーションを下げる要因ともなっていました。
また、的中については、高的中を維持できれば自信につながるかもしれませんが、自分のような的中に波がある人間には、的中率が低い状態が続いて練習のモチベーションが下がり、引くのが怖くなってしまうこともありました。
そのため、的中を記録するのではなく、練習量(射数)を記録し、積み上げた記録を可視化することで、練習へのモチベーションを高め、練習の習慣化の助けになると考え作成することにしました。
弓道は初めてから的に向かって引けるようになるまでに的に向かわない練習を一定期間する必要があります。そういった場合にもこのアプリで練習量や教わったことを記録できるため、上達やモチベーション維持の助けになると考えています。
このアプリが自分と同じ境遇の方や初心者の方などのプラスになれば幸いです。

技術スタック

開発について

開発の流れとして、エレベーターピッチを作成、ペーパープロトタイプを作成、技術検証、リソース・DBを設計してからプロジェクトを作り始めました。
技術検証・技術選定については、Railsのバージョンについて悩みましたが、フィヨルドブートキャンプのメンターから、いずれ最新のものに変わっていくのだから、なるべく新しいものを使った方が良いとのアドバイスもあり、Rails 7に決定しました。その流れでHotwireを使うことになりました。
フロントエンドは初めはVue.jsで作成する予定でしたが、Hotwireを使って作成していくうちに自分のアプリはHotwireで足りるし、Vue.jsは必要ないかも…と思い、途中で仕様変更してVue.jsは使わないことにしました。
また、新しい技術を1つ入れようと思い、RSpecを選択しました。これまでフィヨルドブートキャンプのテストはminitestだったため1から勉強する必要はあったのですが、RSpecは広く使われているようなので、今のうちに使えるようになっておいて損はないと考えました。RSpecは選んで良かったなと思っています。
プラットフォームは初めはHerokuを使おうと考えていましたが、Heroku有料化が発表されたこともあり、別のプラットフォームを含め検討しました。結果として、Hotwireはリージョンの影響が大きいため、東京リージョンがあるFly.ioを選択しました。

やって良かったこと

カンバンにIssueを細かく作成する

自作サービスを作りにあたり、GitHubにカンバンを作成して、初めの段階で技術検証・リソースDB設計からプロジェクト作成、リリースするまでの大まかなIssueをざっと登録していきました。
その後、自分のサービスに必要なことをザッと洗い出してIssue登録し、あとは思いついたり必要だと思った時に随時追加するようにしました。
そのおかげで、やったこと、今やっていること、これからやることが明確になり、少しずつでも進んでいる感覚ができたのでモチベーションを維持することができました。
この「やることを細かくする」ということは、フィヨルドブートキャンプで1番大事だったことかなと思います。「lsコマンドを作る」というプラクティスでもチーム開発でも、課題を書いてその中で必要なこと、やることを細かく分けていくことで、初めは雲をつかむような課題だったものに道筋ができるようになります。これはプログラミングに限らず、どんなことでも使える考え方で、とても重要なことだと思います。

Hotwireの導入

このアプリの最大の特徴です。冒頭で述べたとおり、ユーザー認証以外のメインの機能には全てHotwireを使用しています。
プロジェクト作成の序盤でHotwireを使ってチュートリアルをやっているうちに、Vue.jsを使ってやろうとしていたことがほぼできてしまうことがわかりました。ここでVue.jsの導入をやめてHotwireに絞って実装することにしました。
Hotwireの動きに苦しめられることもありましたが、これからHotwireを使用していくことが増えるだろうという中で、先に経験が積めたのは良かったと思います。
今回、参考にさせていただいた中で大変助かったのは以下のページです。

zenn.dev

note.com

RSpecの導入

上でも書きましたが、今回新しい技術に1つチャレンジしてみようということでRSpecを選択しました。(Hotwireも入れたら2つになったかも…?)
フィヨルドブートキャンプのプラクティスはminitestを使用しており、そちらはだいぶ慣れていたので広く使われているRSpecをやってみたくなりました。幸い、番外編のプラクティスにRSpecがあったのでそちらを参考にしたり、Everyday Railsを読みながら動かしてみたりして覚えていきました。minitestと表記は違えど、基本的な書き方や考え方はそれほど変わらないと感じたので、あまり詰まらずに今回のアプリに導入できました。
ちなみに、テストを書いていると、毎回「楽しい!」と思います。特にシステムテストで自動で検証されていき全てパスすると達成感を感じて楽しいです。こういうテストや検証することが好きなのかな〜と思ったりしました。

苦労したこと

Hotwireの動きとDevise

Hotwireについては、まず使用しないで機能を実装→少しずつTurbo Frames化していくという流れで進めました。カレンダー機能としてSimple CalendarというGemを導入しましたが公式でHotwireでの使い方が示されており、こちらは問題なく導入することができました。
一方、ユーザー認証にはDeviseを使用しており、こちらは作成時点ではユーザー間で対応方法が示されているだけで本家の対応はまだされておらず、情報を探して不具合を潰しながら進めました。こちらはフィヨルドブートキャンプのメンターの方の記事や、Everyday Railsのサンプルアプリなどを参考にさせていただき、対応することができました。

qiita.com

github.com

時間の確保

自作サービス作成に限らず、フィヨルドブートキャンプ全般に渡って苦労したのが学習時間の確保でした。
新型コロナウイルスの初期から感染症担当となったこともあり、仕事をしながらフィヨルドブートキャンプを進めるのはそれなりに負担がある状態で、家族が寝てから学習を開始することが普通になっていました。自作サービスに入ってからはIssueを細かく作成したこともあり、一定のペースでできるようになったので学習習慣が完全に身についたかなと思います。苦労したことでもあり、自分にとって最大のプラスとなったことでしょうか。

おわりに

2020年8月にフィヨルドブートキャンプに入会して2年半、時間はかかってしまいましたが、自作サービスのリリースまで来ることができました。諦めずにここまで来られたのは、駒形さんや町田さんをはじめ、メンターの皆様、また、卒業生や受講生の皆様のおかげだと深く感謝しております。
フィヨルドブートキャンプの各プラクティスは順番も含めて凄く考えられていて、初めてRailsのプラクティスでRails newをして立ち上げた時に、これまでのプラクティスが繋がって感動したのを覚えています。チーム開発や自作サービスでは、これまで学んだことをフルに活用する必要があったので、そういった総合力がついたのではないかなと感じています。
卒業まで辿り着いて考えてみると、フィヨルドブートキャンプで得られたものとして、プラクティスをクリアするためにどう課題に取り組み、どう乗り越えてきたというところが1番大きいのではないかと思います。何が課題になっているか、何をどう調べ理解すれば良いか、そういった経験や考え方が身につき、自作サービスを作りきることで自走力がついたと実感できました。
卒業はゴールではなく、ようやくスタートラインに立つ資格を持ったということです。これからフィヨルドブートキャンプで得たものを活かして新しい道に進んでいこうと思います。ありがとうございました。

Fly.ioへRailsアプリをデプロイ

概要

フィヨルドブートキャンプの卒業課題である自作サービスをFly.ioにデプロイしたので手順をまとめました。

環境

Fly.ioにした理由

当初、自作サービスのプラットフォームはHerokuを予定していましたが、2022.11.28に無料プランの提供を廃止するという発表があったため、別のプラットフォームも含めて検討しました。

Herokuのほか、Render、Railway、Fly.ioを検討対象にしていましたが、作成している自作サービスがHotwireを使用しているので、Regionの影響を大きく受けるのが判明しました。

【参考】Hotwireの良かった点、辛かった点、向いているケース、向いていないケース - 猫Rails

Heroku以外の、Render、Railway、Fly.ioの対応Regionsを調べたところ、一番近いRegionsは、Renderがシンガポール、Railwayは西アメリカ、Fly.ioが東京でした。

Fly.ioはRailsアプリをデプロイする記事あり問題なさそうだったので、Fly.ioで進めることにしました。

インストール・アカウント登録

公式ページのトップページGet Startedから導入手順に進みます。

まずはflyctlをインストールします。Homebrewがある場合は以下のコマンドでインストールできます。Homebrewについてはこちらにあります。

$ brew install flyctl

次にアカウントを登録します。以下のコマンドを実行します。

$ flyctl auth signup

ブラウザが起動してアカウント登録画面が表示されます。

EメールかGitHubのどちらかを選択できるので、今回はGitHubを選択しました。

GitHubの認証が終わるとクレジットカード入力画面が表示されるが、入力欄の下のリンクでスキップしました。 (注:スキップしたら設定ファイル作成時にエラーが出ました。後述しています。)

スキップするとDocsに移動するのでここで閉じてOK。

ターミナルにメッセージが表示されています。これでログインできました。

Waiting for session... Done
successfully logged in as メールアドレス

次回ログインする場合は以下のコマンドでブラウザが起動し、ログイン画面が表示されます。

$ fly auth login

デプロイに必要なファイルを作成

次にデプロイに必要なファイルを作成します。以下のコマンドで表示される質問に答えていけば自動で作成されます。

$ flyctl launch

アプリ名を入力します

Scanning source code
Detected a Rails app
? Choose an app name (leave blank to generate one): 

リージョンを聞かれるのでそのままTokyo, Japan (nrt)で決定。

automatically selected personal organization: メールアドレス
? Choose a region for deployment:  [Use arrows to move, type to filter]

ここでエラーが発生しました。

Error We need your payment information to continue! Add a credit card or buy credit: https://fly.io/dashboard/my-account/billing

クレジットカード情報を入れないと進めないようなので、公式ページのダッシュボードから入力して再度fly launchを実行。

以下の質問が出るので、全てNoで回答したら、またアプリ名から質問が始まりました。

? Overwrite "/Users/macbook-it/kyudo-training-log/.dockerignore"?
? Overwrite "/Users/macbook-it/kyudo-training-log/Dockerfile"?
? Overwrite "/Users/macbook-it/kyudo-training-log/lib/tasks/fly.rake"?

Postgresqlを使用しているのでYes。

? Would you like to set up a Postgresql database now? 

無料枠で使いたいのでそのまま1番上を選択。

? Select configuration:  [Use arrows to move, type to filter]
> Development - Single node, 1x shared CPU, 256MB RAM, 1GB disk
  Production - Highly available, 2x shared CPUs, 4GB RAM, 40GB disk
  Production - Highly available, 4x shared CPUs, 8GB RAM, 80GB disk
  Specify custom configuration

するとDB情報やDATABASE_URLが表示されます。二度と見られないと書いてあるので、安全な場所に転記して残しておきます。

Save your credentials in a secure place -- you won't be able to see them again!

Redisは使用していないのでNo。

? Would you like to set up an Upstash Redis database now?

以下のメッセージが表示されます。これで初期設定が完了しました。

Your Rails app is prepared for deployment.

If you need custom packages installed, or have problems with your deployment
build, you may need to edit the Dockerfile for app-specific changes. If you
need help, please post on https://community.fly.io.

Now: run 'fly deploy' to deploy your Rails app.

デプロイ

次にデプロイです。以下のコマンドを実行するだけです。

$ fly deploy

【省略】

 1 desired, 1 placed, 1 healthy, 0 unhealthy [health checks: 1 total, 1 critical]
--> v0 deployed successfully

しばらく待つと完了するので、以下のコマンドでサイトを見ることができます。

$ fly open

ブラウザが立ち上がって表示を確認できました。

なお、URLはhttps://アプリ名.fly.devになります。

独自ドメインを使う場合の設定手順については、また記事にしようと思います。

再度デプロイする場合

コードを修正して再度デプロイする場合は、以下のコマンドを実行すればOK。簡単です。

$ fly deploy

参考サイト

2023年にやりたいこと

前回の記事で2023年の目標を書いたのですが、あまりにもあっさり書きすぎてしまったので、改めて今年やりたいことを書いていこうと思います。

書いておけば年末にどれだけできたか確認もできて良さそう。(フィヨルドブートキャンプの他の方のブログを参考にしてみました😅)

↓前回の記事

enrichmylife.hatenablog.jp

とりあえず項目をざっと挙げてみて、1つずつ詳細を書いていきます。

2023年にやりたいことリスト

  • 仕事
    • フィヨルドブートキャンプを卒業する
    • 転職する
    • RubyKaigiに行ってみる
    • 技術イベントに最低1つは参加する
    • 英語を勉強する
    • スタンディングデスクを買う(必要があれば)
    • 新しいMacbookを買う(必要があれば)
    • 大きいモニターを買う(必要があれば)
  • 弓道
    • 審査を2回受ける
    • 全日本選手権に挑戦する
    • 弽(ゆがけ)を買う
    • 弓を買う
  • 生活
    • 運動の習慣を定着させる
    • 瞑想の習慣を定着させる
    • 朝型の生活に変える
    • 家族旅行に行く

とりあえずパッと思いつくのはこれぐらいでしょうか。

物欲はそこまでないので買いたい物は少なめです。それでは各項目について見ていきます。

仕事関係

フィヨルドブートキャンプを卒業する

まずは最優先事項である、フィヨルドブートキャンプの卒業。今は最終課題の自作サービス作成の中盤ぐらいなので、年明けから気合いを入れ直して進めていこうと思います。

転職する

次に卒業後は転職活動。条件は厳しいかもしれませんが、自分に合った所に入りたいです。前職で活かせる所は少ないかもしれませんが、コツコツ真面目にやることには長けているし、足りないものを見つけて改善していくことが得意です。どうでしょう?!(こっそりアピール)

RubyKaigiに行ってみる

フィヨルドブートキャンプでの卒業生の方達のRubyKaigi 2022の感想動画を見てとても楽しそうだったので、今年はぜひ現地に行きたいなと思っています。オンラインよりも現地の空気を肌で感じたい!

技術イベントに最低1つは参加する

現職の関係もあり、これまで全然できなかったことの1つ。これは時間的な余裕の面から考えて卒業・転職後になってしまうだろうなと思っています。でもまず初めのステップとして最低1つは参加したいです。

英語を勉強する

プログラミングを学習していると痛感するのが自分の英語力の足りなさ。フィヨルドブートキャンプに入会前は少しやっていましたが、入会してからは並行してやるのは厳しいなと思って休止しています。

最近はDeepL翻訳の凄さを実感してはいますが、ずっと翻訳し続けるのも手間だし、せめて文章が読めるぐらいにはなりたい所です。

スタンディングデスクを買う(必要があれば)

こちらは必要があれば欲しい物です。転職してリモートワークになった時に、スタンディングデスクの方が良いのかな?と思ったりしています。というかちょっと使ってみたいのでこれは買うかも。

新しいMacbookを買う(必要があれば)

今使っているのはMacBook air 2019で、フィヨルドブートキャンプのチーム開発のデモで動きが遅くて待たせてしまった記憶があるので、転職して必要であれば買いたいです。転職先によっては支給されることもあるのかな?

大きいモニターを買う(必要があれば)

今は24インチのモニターとMacBookのダブルモニターですが、32インチぐらいのが欲しいな〜と思っています。これは仕事との兼ね合いで本当に必要であれば、という感じになりそうです。

弓道関係

審査を2回受ける

昨年、1つ上に上がったので、次の段に挑戦したいです。

今までは遠征していましたが、転職していると時間的な都合もありそうなので、近場で審査会があるところで日程が合えば受審する感じになりそうです。

全日本選手権に挑戦する

全国大会の最高峰で全日本選手権という大会があります。

出場するにはまず県の選考会で選ばれる必要があるので、その県の選考会に挑戦します。

弽(ゆがけ)を買う

弓を引く時に右手につける革のグローブのような物です。こちらは夏に手型を取ってオーダーしてあるので、春までには完成しそうです。

弓を買う

一昨年に注文した竹弓です。弽は自分に合った物が1つあれば十分ですが、弓は破損のリスクもあるし、竹弓は季節によって歪みも出たりするので何張かを調整しながら使用する必要があります。

また、竹は自然素材なので、出来上がってからしばらくは慣らしながら引いていくため、ちゃんと使えるようにするのにある程度時間がかかります。

今のレギュラーの竹弓は2〜3張あるのですが、次のレギュラーにすべく注文した竹弓になります。こちらも春ごろ完成する見込みです。

生活関係

運動の習慣を定着させる

弓はほぼ毎日引いているので、それ以外ということで。

11月中旬ぐらいから、朝起きたらバーピーをするというのを続けています。バーピーとは、ジャンプ→スクワット→腕立て→ジャンプ→…を続ける運動です。

最終的にはHIIT(High Intensity Interval Training:高強度インターバルトレーニング)の一種である「タバタ式トレーニング」、20秒やって10秒休む✖️8セットをできるようにするのを目標にしています。HIITは心肺機能を高めるのが主目的ですが、細胞が活性化したり集中力が上がったりする運動らしいので、最初は5回から始めて少しずつ回数を増やしていった結果、今は20秒6セットができるようになりました。

高強度と名のつく通りやった後はキツイですが、時間対効果の高い運動でもあるし、フルセットでできるようになるのが目標です。心拍数をどれだけ上げられるかがキモなので、慣れてきたら回数を増やすか強度を上げる必要は出てきそうです。

瞑想の習慣を定着させる

こちらも11月中旬から続けています。マインドフルネスってやつです。これも運動と一緒に朝のルーティーンに入れているものですが、頭の中をスッキリさせたり集中力や記憶力を上げたりする効果があるそうです。

手始めに1分から始めて現在は2分で続けています。10分はできるようになりたいなと思うので、こちらも少しずつ時間を長くしていく予定です。

朝型の生活に変える

すっかり夜に学習をするスタイルになってしまっているので、どこかで切り替えて朝型の生活にしたいです。

これも一気に早起きにして継続するのは大変なので、少しずつ早くしていくのが良いのかなと思っています。1週間に1分ずつとか…😅

家族旅行に行く

毎年夏休みには家族旅行に行っているので、こちらは生活が変わっても絶対に続けたいです。

コロナの状況もありますが、2泊3日ぐらいで遠出したいです。個人的には沖縄か北海道に行きたいんだけどな〜。

まとめ

以上、2023年にやりたいこと、欲しい物を書いてみました。

すでに年末から始めているものもありますが、今年の終わりにどうなっているか楽しみです。

習慣化について

ちなみに、習慣化をしやすくするためには、「最初は心理的なハードルを限りなく低く設定する」ということが大切らしいです。

運動やダイエット、禁煙など、いきなりドカッと始めてしまうとすぐに続かなくなってしまうのは身に覚えのある方も多いかもしれません。

そのため、自分は本当に少しの時間や回数から始めて心理的な抵抗がなくなってきた頃に負荷を上げるようにしています。

また、すでに習慣となっているものに新しい習慣をくっつけて流れにした方が習慣化しやすいという話も聞いたので、現在は「起床→お手洗い→洗面→瞑想→目標確認→バーピー」という流れで実施しています。

全部で10分前後なので大した時間もかかかないし、一つ終わったら次、次、という風に進むし、心理的ハードルも下げた内容なので半分自動化してやっているような感じになっています。

この調子で良い習慣を増やしていったら年末にどんな習慣が身についているのか、これもちょっと楽しみにしてます😁

2022年の振り返りと2023年の目標

久々にブログを書きたくなったので、2022年の振り返りと2023年の目標を書いていこうと思います。 フィヨルドブートキャンプを初めて300日経った時に一回振り返ってブログを書いています。

enrichmylife.hatenablog.jp

あれから1年半…ようやく最終課題の「自作サービスを作る」に入り、終わりが見えてきています。 もっと早く終わると思っていたけど、なかなか思うように進まずにようやくここまで来た感じです。

また日報をざっと見返しながら、2022年は何をやってきたのか振り返ります。

2022年の振り返り(フィヨルドブートキャンプ)

1/2〜1/17

JavaScriptのプラクティスの途中から始まった2022年。作り途中のnpmを仕上げていきました。 作ったnpmはこちら。ランダムに与えられた4つの数字を+ー✖️➗で10を作るというミニゲームです。 今見てみると最高で74DLだったのが驚き。

www.npmjs.com

1/12-2/15

Vue.jsのプラクティスを進める。人間ドックが1泊2日で、PCを持って行って部屋でずっとVue.jsの学習をしていた気がします。

2/16-3/2

ついにチーム開発のプラクティスに入りました。フィヨルドブートキャンプでは、みんなが使っているフィヨルドブートキャンプのWebアプリのスクラム開発していくというプラクティスがあります。まずはチーム開発に入るためのスクラム開発についての学習と開発参加の準備をしました。

3/2-8/28

チーム開発開始。Issueごとにポイントがあり、20ポイント分マージされたらチーム開発は卒業になります。初めは簡単なIssueで慣れた後に少しずつ難易度が上がっていきます。ついていけるか不安でしたが、やってみると大変ではありましたが何とかなったような感じです。

序盤で原因不明のJavaScriptエラーに悩まされたのと仕事が忙しくなったのもあり、同じIssueをずっとやっていました。レビュー依頼が来ていましたが対応する時間や精神的な余裕がなく、遅れた挙句キャンセルしてしまったのは大変申し訳なかったと思います。ペアプロで一応は対処できたましたが、もう少し早くお願いすれば良かったです。 あとは無理そうなら早めにレビューを断る勇気もあって良かったかもしれません。結局迷惑をかけてしまうことになってしまうので、見通しが悪いと正直に伝える勇気があれば良かった。いま見返してみると、他のIssueを進めながら2ヶ月ちょっとこのIssueをやっていてもったいない感じ😓

終盤ではGood First Issueのモブプロに参加して、自分が詰まった所、テストやPR、レビュー依頼の流れなど、これまでやってきた中で得たものを伝えることができました。 通常は2〜3ヶ月で卒業らしいですが、仕事をしながらで思ったように時間が取れず、なんだかんだで半年かかってしまいました。

5/28-9/5

チーム開発が半分を過ぎたあたりから、卒業課題である自作サービスを考え始めましたが、ここからすぐチーム開発でいっぱいいっぱいになってきたので、間が飛び飛びになりながら少しづつ進めていきました。チーム開発が終わったあたりから本格的に自作サービスに取り組み始めました。エレベーターピッチ、ペーパープロトタイプを作成し、DBやURI設計、技術検証をして準備を進めていきました。

9/14-現在

チーム開発も終わり、自作サービス作成の下準備も大体終わったタイミングで自作サービスを本格的に作り始めました。3ヶ月半経って、現在は自作サービスのデザインが大体終わり、細かい動作を修正しているところ。テストも同時に書いていく余裕がなかったので、2023年はテストを書く所から始まる感じです。

2022年の振り返り(仕事)

仕事面は引き続きコロナに振り回される日々。これは2020年のフィヨルドブートキャンプに入会した時の状況とほとんど変わっていません。年内ででっかい仕事の段取りは終わったので、あとは流れを見守るのみ…。新しい仕事が振られてメイン担当になってしまったので余裕はあまりありません😢

2022年の振り返り(弓道

高校からずっと続けている弓道ですが、2022年は大きな進展がありました! 審査会で合格し、1つ上に上がることができました!前の段からだいぶかかったので嬉しかったです。

2023年の目標(フィヨルドブートキャンプ・仕事)

これはもちろん卒業!年度内には絶対に卒業したい! 自分の後から入会した方が次々に卒業して新しい道に進むのを見てきたので、そろそろ自分の番だぞ!とひそかに思っています😅 そのまま新しい道に自分も進んで行きたいと思っています。

2023年の目標(弓道

次の段に挑戦していきたいと思います。1つ上がるまでだいぶかかっているので、次はどうなるか想像がつきませんがコツコツ頑張っていきたいです。 あとは全日本選手権の県代表を目指して精進していきます。こちらを目指して頑張れば昇段は見えてくると思うんですが、道のりはなかなか厳しい感じです。でも頑張る!!

今年もよろしくお願いします

弓道を高校からずっと続けられているように、好きなものはちょっと大変でもやり続けられる気がします。 フィヨルドブートキャンプも入会して2年半。諦めずに続けられているのは、入会時に思ったこともありますが、やっぱり自分に向いているからなのかなと思っていたりもします。 今年は新しい道に進めるように、まずは卒業して自作サービスをリリースできるよう励んでいきます!

Ruby技術者認定試験silverに合格しました

年末の話ですが、Ruby技術者認定試験のsilverに合格しました。

【公式サイト】Ruby技術者認定試験

なぜ試験を受けようと思ったか

フィヨルドブートキャンプで学習を進める中で、Rubyの基本的な文法とかメソッドの知識が足りないと実感しました。Ruby技術者認定試験ではそこのところが補完できるかなと思い、とりあえず模擬問題集であるRubyExamination(REx)をやってみることにしました。

【参考】REx - Ruby Examination 【参考】Rexの使い方

どうせやるならただ問題集を解くよりも、試験合格を目指してやって合格できれば一石二鳥じゃん!と思って受験を決めました。受験にあたり参考にしたのは以下の記事です。

【参考】Ruby Silverに合格したので、勉強方法をまとめてみた(2019年2月版) - Qiita

【参考】Ruby技術者認定試験Silver version 2.1を受けて… - Qiita

勉強した期間

RExを始めたのが2021/10/4で、試験が2021/11/27だったので、大体2ヶ月弱の勉強期間でした。 メインはフィヨルドブートキャンプなので、仕事の昼休み等の空き時間にコツコツ進めた形です。

やったこと

勉強したのは主に次の3つです。同時並行ではなく順番にやってました。

  1. REx
  2. Ruby技術者認定試験合格教本
  3. 模擬問題集
・REx (10/4〜10/23)

まずはRExから始めました。これはスマホでできるので昼休みを使って解いていました。

1日1回、大体30分ぐらいかかります。だんだん問題も見慣れてくるため、最終的には20分ぐらいになったかも。ただ解くだけではなく、間違った問題を良く復習して潰していくのが試験勉強の王道かなと思います。

本番は50問出題で合格ラインが75%のため、38問正解がボーダーラインとなります。結果は毎日Twitterで報告していました。

日付 点数 日付 点数
10/4 40 10/14 86
10/5 66 10/15 94
10/6 54 10/16 88
10/7 66 10/17 84
10/8 76 10/18 98
10/9 78 10/19 92
10/10 72 10/20 90
10/11 76 10/21 88
10/12 74 10/22 92
10/13 88 10/23 90

初めの方は本当に出来が悪く、当てずっぽうで答えているのも多い状態。ただ、8割は同じ問題で残り2割で違う問題を出すような作りになっているようなので、何回もやっていると流石にわかるようになってきます。反復は大事。 ただ、問題の内容が選択肢の順番も含めて全て同じなため、何回も繰り返すと選択肢で覚えてしまうという悪い状態になってきたため、一旦休止して書籍のRuby技術者認定試験合格教本をやることにしました。

Ruby技術者認定試験合格教本 (10/24〜11/23)

教本はSilverとGoldの出題範囲がわかるようになっているため、Silverの部分のみを解き進めました。動作はターミナルでirbを使って確認することもあり。1回全体をざっと進めて、苦手なところを復習。少しづつなので1ヶ月ほどやっていました。

・模擬問題集とREx (11/24〜11/27)

テキストが一通り終わったので試験の公式ホームページにリンクがある模擬問題集を解いてみました。現在はPDFの配布ではなくGitHubで公開されています。点数は覚えていませんが70点ぐらいだった気がします。合格ラインに届いていないのでかなり焦った記憶が。

【参考】silver_j.md

模擬問題集の復習をしつつ、もう一度RExをやってみました。テキストを一通りやったおかげで解説を読んでも理解度が前回と違いました。でも9割を超えられなかったことに危機感が…。

日付 点数
11/24 92
11/25 88

後はテキストや模擬問題集の見直しで当日を迎えます。

試験当日

試験は全国のPCスクールのようなところでオンラインで受験するような形式で、日付と時間は自由に選べます。

当日は1時間半ぐらい早く着いてしまったので、カフェでこれまでの復習をしました。後は他の合格者の記事を見て、ミニツクという問題集を載せているサイトがあることを知ったので、最終確認としてざっとやりました。ここから何問か同じような問題が出題されたのでやって良かったです。

【参考】ミニツク - Rubyのe-ラーニング研修システム

試験会場で受付をして、PCブースに通されて試験開始。

持ち込めるものは一切ありません。机に紙と鉛筆が置いてあるので、メモはそれでしろとのこと。紙は試験後回収されます。

RExと同じように選択肢をどんどん選んでいって、答えが怪しい問題はフラグを立てられます。後で確認しやすいです。

全て解答したら解答完了ボタンで早く終了させることも可能です。試験時間は90分ですが、自分は2回ぐらい確認しても45分ぐらいで終わってしまったので、早く終了させました。

ちなみに、終了したら即結果が表示されるので、この時が一番緊張した気がします。変な汗をかきました。

結果は90点で合格!ギリギリかと思っていましたが余裕でした。

感想

こうして2ヶ月弱の試験勉強は良い結果で終えることができました。受験した感想をいくつか書いておきます。

  • 受験を通じて、基礎的なRubyの文法力は確実に身についた。これはRExで反復した効果が大きいと思う。
  • 試験に使っているRubyのバージョンが古い。2.1とかだったかも。フィヨルドブートキャンプでは3.0を使用しているので、そちらで使っている書き方では不正解になることがある。公式教本にも「これ以降のバージョンでは対応している」とか書いてある。これを覚えておかなければいけないのが面倒。
  • RExは選択肢を覚えてしまい効果がだんだんと低くなる。模擬問題集とか色々な問題を解いた方が良い。
  • RExの問題がそのまま出題されることは少ない。解答の根拠をしっかり押さえておく必要がある。
  • 合格して就職に役立つかは未知数。(たぶん関係ない気がする)
  • おそらく落ちていても費用対効果の面で2回目は受験していなかったかも。

午前中の試験だったので、合格後にちょっとリッチにランチをとりました。

試験からの開放感もあり、最高の美味しさでした!これだけでも受験したかいがあったかも!

これから受験される方の参考になれば幸いです。

Railsでモデル名を変更する時にやったこと

フィヨルドブートキャンプの「Railsでユーザーフォローを作る」というプラクティスで実行した手順メモです。

ユーザーを自己結合するための中間テーブルを設けており、モデル名をrelatonship.rbにしていました。そこから別の名前(仮にfollow_relationship.rbとする)に変更することになりましたが、モデル名の変更はそれだけで済む問題ではなく、データベース、モデル、コントローラー、ルーティング、ビューまで、関連しているものを全て修正する必要があります。

概要

  1. マイグレーションファイルを作成、編集
  2. モデル名を変更、内容修正
  3. コントローラー名を変更、内容修正
  4. ルーティングを修正
  5. ビューを修正

環境

参考記事

手順

1.マイグレーションファイルを作成します。テーブル名はrelationshipsからfollow_relationshipsに変更するので、change_relationships_to_follow_relationshipsとなります。

$ rails g migration change_relationships_to_follow_relationships

マイグレーションファイルを編集し、テーブル名を変更します。今回はインデックスも付けていたのでrename_indexを使用します。 インデックス名はschema.rbを見ると書いてあります。

class ChangeRelationshipsToFollowRelationships < ActiveRecord::Migration[6.1]
  def change
    rename_table :relationships, :follow_relationships
    rename_index :follow_relationships, 'index_relationships_on_follower_id', 'index_follow_relationships_on_follower_id'
    rename_index :follow_relationships, 'index_relationships_on_following_id_and_follower_id', 'index_follow_relationships_on_following_id_and_follower_id'
    rename_index :follow_relationships, 'index_relationships_on_following_id', 'index_follow_relationships_on_following_id'
  end
end

2.モデル名を変更します。 今回のプラクティスはgitを使用しているので、ただファイル名を変更するだけでは変更履歴が追えなくなってしまいます。 そのため、gitで反映されるようにgit mvを使用してファイル名を変更します。

$ git mv relationship.rb follow_relationship.rb

次にモデルの内容をclass Relationshipからclass FollowRelationshipへ修正します。

class FollowRelationship < ApplicationRecord

関連しているモデルuser.rbの内容も同様に修正します。

〜〜〜
has_many :active_relationships, class_name: 'FollowRelationship', 〜〜
〜〜〜
has_many :passive_relationships, class_name: 'FollowRelationship', 〜〜
〜〜〜

3.コントローラー名を変更します。これも同様にgit mvを使用して変更します。

$ git mv relationships_controller.rb follow_relationships_controller.rb

コントローラーの内容をclass RelationshipsControllerからclass FollowRelationshipsControllerへ修正します。

class FollowRelationshipsController < ApplicationController

4.rails db:migrateを実行した後、ルーティングを修正します。 routes.rb:relationshipsだった部分を:follow_relationshipsに修正します。

resource :follow_relationships, only: %i(create destroy)

5.最後にビューファイルを修正します。 今回はユーザーの詳細画面に名前付きルーティングヘルパーを使用していたので、ルーティングを確認し該当部分を修正します。 該当部分はフォロー・フォロー解除のボタンの部分。

<% if current_user != @user %>
  <% if @user.followed_by?(current_user) %>
    <p><%= link_to t('views.follow.cancelled'), user_follow_relationships_path(@user.id), method: :delete %></p>
  <% else %>
    <p><%= link_to t('views.follow.followed'), user_follow_relationships_path(@user.id), method: :post %></p>
  <% end %>
<% end %>

まとめ

モデル名の変更するにはデータベース、モデル、コントローラー、ルーティング、ビューなど、関連しているものを全て修正する必要がありました。

また、gitを使っていることもあってファイル名の変更にはgitのコマンドを使う必要があるので注意が必要です。

(変更履歴を残さずにファイルを削除して新たに追加する方法もあると思いますが、今回はこの方法にしました。)

フィヨルドブートキャンプをはじめて300日が経ちました

フィヨルドブートキャンプの皆さんがブログでアウトプットされてるので、自分も書きたいな〜っと思ったんですが、その日がちょうど入会して300日目だったので今までやってきたことを振り返ることにしました。

フィヨルドブートキャンプでは学習した時は日報を書くことになっており、何のプラクティスを何時間やったのかも残せるようになっています。それを初めから見直してみて、何をどのぐらいやったのか書き出してみます。

今までの学習内容

フィヨルドブートキャンプのホームページに学習内容が掲載されていますが、全体はこんな感じです。

bootcamp.fjord.jp

これまで学習してきた各項目ごとの期間と時間をまとめてみました。

ラクティス 期間 時間
学習の準備・開発環境 2020/8/26〜8/27 3.75
HTML & CSS 2020/8/31〜10/15 54.25
Vi 2020/10/15〜10/16 2
Linux 2020/8/28〜8/31、10/16〜11/7 41.25
Git & GitHub 2020/11/24〜12/8 10.5
Ruby 2020/11/7〜11/23、12/9〜2021/2/20 109.75
HTTP 2021/2/16〜2/17 4.5
Nginx 2021/2/21〜2/26 5
データベース 2021/3/3〜4/4 23.5
Webアプリケーション 2021/4/4〜6/15 70.75
Ruby on Rails 2021/6/12〜6/21 18.25

日報の数は158なので、300日毎日やっていたわけではなく、およそ2日に1回という感じでしょうか。 (やる気に波があったりするので、あまり学習しない週もあればガッツリやった週もある感じです。) これ以外に昼休みや合間の時間にスマホで参考資料を読むだけで机に向かわず、日報を書かない日もあったので、実際はもう少しやっていると思います。 LinuxRubyで期間が飛び飛びになっているのは、途中でプラクティスが統合されたり順番が変更になったりしたためです。常にプラクティス内容がブラッシュアップされています。

学んだこと

  • HTMLとCSSの基本的な書き方、flex boxの使い方
  • Vimの基本的な使い方
  • Linuxのファイル操作、sshの基本、SSL /TLSの仕組み *Rubyのgem、bundler、rubocopについて
  • カレンダーのプログラム、ボウリングのスコア計算プログラム、lsコマンド作成、wcコマンド作成
  • HTTPの基本
  • NginxでSSL対応サイト作成
  • SQLの基本、PostgreSQLの基本、データベース設計
  • Sinatraを使ったWebアプリ作成、DBを利用したWebアプリ作成
  • Railsの基本、i18n

特に印象に残っているもの

Rubyのプラクティスに入り、FizzBuzz、カレンダーのプログラムと、本格的にプログラミングが始まり考えるのが楽しかった覚えがあります。ボウリングのプログラムも新ルールと旧ルールの2通り作成し、手強かったような気がします。 そして難しいと評判のlsコマンドは自分もかなり苦労した記憶はありますが、あえて他の人の日報を見ずにgoogle先生と公式リファレンスを頼りに独力で作成しました。かなり力技感のあるコードになってしまったような気がしますが、おかげでリファレンスを見るスキルや思考・分析のスキルが磨かれたと思います。 WebアプリケーションではSinatraを使用してメモアプリを作成しましたが、ちょうど年度始めの仕事の忙しさもあり、精神的にかなり凹んでしまいました。フィヨルドブートキャンプのメンターをはじめとする皆さんの暖かい言葉もあり、無事メンタルも復活し、そこからは良いペースで進められています。

フィヨルドブートキャンプについて

フィヨルドブートキャンプで新しいことを学習するのは楽しいです。また、それぞれ学習環境が違う中で、各々のペースで学習を進めていますが、Discordで個人のチャンネルで分報を書いたり、気づきや独り言を書いたりすると他の方がリアクションしてくれるので励みになります。人と人との繋がりのある良いコミュニティだなぁと常々感じています。 卒業するまでは結論は出せないのかもしれませんが、今のところはフィヨルドブートキャンプに巡り合って、そして勇気を出して始めて良かったと思っています。

これからのこと

いよいよRailsのプラクティスに入って、今までつけた知識が繋がっていく感じもあり楽しく進められています。一方、プラクティスの進捗状況は60%でまだまだ先は長いです。年度内に卒業することを目標に、引き続きがんばります!!