ぺのめも

Web開発を勉強中。学んだことや思ったことなど

VSCodeのRemote ContainerでRubyの開発環境を構築する

はじめに

Ruby on RailsWebサービスを個人開発中です。
Docker+VSCode Remote Container開発環境を作るにあたり、初めてで色々調べながら進めたので、記録しておきます。
やってみて分かったのですが、開発環境はDockerコンテナを使いつつ、コーディングはローカルでやるのと全く変わらない感じでVSCode上でできるので、かなり快適です。

そもそもDockerとは?

Docker自体に初めて触れる方の場合は、こちらの記事をさらっと読んでから戻ってくると、この後の内容を読み進めやすいと思います。

peno022.hatenablog.com

手順

VSCodeでコンテナを起動・接続する

プロジェクトディレクトリ自体は、既に作成済みの状態から始めます。
VSCode公式のドキュメントの手順に沿って進めていきました。
code.visualstudio.com

1)Docker Desktopのインストール

  • Windows: Docker Desktop 2.0+ on Windows 10 Pro/Enterprise. Windows 10 Home (2004+) requires Docker Desktop 2.3+ and the WSL 2 back-end. (Docker Toolbox is not supported. Windows container images are not supported.)
  • macOS: Docker Desktop 2.0+.
  • Linux: Docker CE/EE 18.06+ and Docker Compose 1.21+. (The Ubuntu snap package is not supported.)
  • Remote hosts: 1 GB RAM is required, but at least 2 GB RAM and a 2-core CPU is recommended.

私の場合はMacを利用しているので、Mac版のDocker Desktopを利用しています。
Docker Desktopのインストール自体は過去に行っていたので(ほとんど使わないままでしたが)、今回はアプリを最新バージョンにアップデートすることだけ実施しました。

2)VSCodeを起動し、対象ディレクトリとコンテナの設定方法を選択する

VSCodeを起動し、開発対象のプロジェクトのフォルダを開きます。
VSCodeのコマンドパレットを開き(Macであれば command + Shift + p)「Dev Containers: Open Folder in Container...」を選択します。
ディレクトリ選択画面が開くので、コンテナ上で開発したいプロジェクトのディレクトリを選択すればOKです。
ディレクトリを選択すると、コンテナ設定の方法を選択する画面になります。

  • From a predefined container configuration definition...
    →既存のテンプレートから選択する形式です。
  • From 'Dockerfile'
    →プロジェクトディレクトリに既にDockerfileもしくはdocker-compose.ymlを作成済みであれば、それを元にコンテナを実行します。

コンテナの設定方法を選択する
コンテナの設定方法を選択する

今回はまだDockerfileを何も作っていなかったので、「From a predefined container configuration definition...」のほうを選択しました。

3)ベースとなるテンプレートを選択する

ベースとなるテンプレートを選択する画面になります。
今回は「Ruby on Rails & Postgres」を選択しました。
ちなみに「i」のアイコンをクリックすると、そのテンプレートのリポジトリがブラウザで開きます。

ベースにするDockerイメージを選択する
ベースにするDockerイメージを選択する

次に、Rubyバージョンを選択します。
今回は「3.1」を選択しました。

Rubyのバージョンを選択する
Rubyのバージョンを選択する

さらに追加でインストールしたいものがあれば、選択します。
今回は何も選択せず、「OK」だけ押下。

追加でインストールしたいものを選択
追加でインストールしたいものを選択

4)プロジェクトがコンテナ上で開く

ここまでの設定を終えると、コンテナの構築が始まり、VSCodeが再読み込みされました。簡単!

VSCodeがコンテナを起動・読み込み
VSCodeがコンテナを起動・読み込み

ローカルでプロジェクトを開いていた時のVSCodeの見え方と違うのは、

  • ウィンドウの左下にDev Containerの表示が出ていること
  • ターミナルでコンテナ内のシェルが動くようになっていること

です。

ウィンドウの左下にDev Containerの表示が出ている
ウィンドウの左下にDev Containerの表示が出ている

この時点で、.devcontainerディレクトリ配下にこれらのファイルが自動作成されています。

  • create-db-user.sql
  • devcontainer.json
  • docker-compose.yml
  • Dockerfile

作成されたDockerfileの内容:

FROM mcr.microsoft.com/devcontainers/ruby:0-3.1

# Install Rails
RUN gem install rails webdrivers

# Default value to allow debug server to serve content over GitHub Codespace's port forwarding service
# The value is a comma-separated list of allowed domains 
ENV RAILS_DEVELOPMENT_HOSTS=".githubpreview.dev,.preview.app.github.dev,.app.github.dev"

# [Optional] Uncomment this section to install additional OS packages.
# RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \
#     && apt-get -y install --no-install-recommends <your-package-list-here>

# [Optional] Uncomment this line to install additional gems.
# RUN gem install <your-gem-names-here>

# [Optional] Uncomment this line to install global node packages.
# RUN su vscode -c "source /usr/local/share/nvm/nvm.sh && npm install -g <your-package-here>" 2>&1

Dockerfileを編集する(必要に応じて)

土台のDockerイメージを変更

Rubyのバージョンが細かく指定できなさそうだったのと、既にnvmインストール済みだったりしてコンテナの中身が分かりづらかったので、土台のDockerイメージをmcr.microsoft.com/devcontainers/ruby:0-3.1ではなく、Docker Hubのofficial imageのrubyに変更しました。

# FROM mcr.microsoft.com/devcontainers/ruby:0-3.1 を書き換え
FROM ruby:3.1.3

hub.docker.com

nvm、nodeをインストール

nvmの公式で記載されているインストール方法はbashで実行するのが前提です。

# 公式に記載のインストールコマンド
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.3/install.sh | bash


しかし、今回利用するDockerイメージのデフォルトのshellはshだったので、bashを実行するために

SHELL ["/bin/bash", “-c”]

をDockerfileに追記したうえでbashコマンドを書く必要がありました。
一時的にbashを使う場合はRUN ["/bin/bash", "-c", "echo hello”]とも書けるみたいですが、基本bashでよいので、こちらにしておきました。
参考: qiita.com
更新後のDockerfile:

FROM ruby:3.1.3
SHELL ["/bin/bash", "-c"]

# Install Rails
RUN gem install rails webdrivers

# Default value to allow debug server to serve content over GitHub Codespace's port forwarding service
# The value is a comma-separated list of allowed domains
ENV RAILS_DEVELOPMENT_HOSTS=".githubpreview.dev,.preview.app.github.dev,.app.github.dev"

# [Optional] Uncomment this section to install additional OS packages.
# RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \
#     && apt-get -y install --no-install-recommends <your-package-list-here>

# [Optional] Uncomment this line to install additional gems.
# RUN gem install <your-gem-names-here>

RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.3/install.sh | bash \
  && source ~/.bashrc \
  && nvm install 19.4 \
  && nvm use 19.4

再ビルド

Dockerfileを更新したら、VSCodeのコマンドパレットから「Rebuild Container」を実行するだけで、再ビルド・再読み込みされます。簡単で助かりますね。

デバッグする時

ただ、VSCodeの「Rebuild Container」でビルドすると、エラーが出た時にログが見られず原因がよく分かりませんでした。
なので、下記のような手順を取るとやりやすかったです。
(前節に書いた、今回の状況だとデフォルトshellがbashではないということを知らずビルドに失敗したりしました)

  1. いったんローカルの適当な場所にDockerfileをコピー
  2. docker build -t tmp-image .のコマンドを実行してビルド(※)
  3. エラーが出たらログを見て適宜Dockerfileを修正
  4. ビルドに成功することを確認してから、そのDockerfileの内容を.devcontainer配下の本体のDockerfileに反映し、以降はVSCodeの「Rebuild Container」を利用

※Dockerビルドコマンドの補足

  • -tはタグ名をつけるオプション
  • tmp-imageの部分は任意の名前でOK
  • .の部分はコピーしたDockerfileが置いてあるディレクトリへの相対パス

フルタイムで働く社会人が月に100時間の勉強時間を確保できるようになるまで。私なりの具体的なやり方と失敗事例

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

adventar.org

はじめに

はじめまして、penoです。

私は、IT企業で自社サービスのプロダクトマネージャーとして働きつつ、2022年4月からフィヨルドブートキャンプというコミュニティーでプログラミングを学んでいます。

フィヨルドブートキャンプでの今までの学習時間は、プロフィール画面を見ると合計で522.5時間(*1)。

 

合計学習時間(執筆時現在)

ずっとプロジェクトマネジメント業・ディレクション業に就いており、プログラミング業務の機会が少なかった私ですが、Rubyを学びRailsを学び、オブジェクト指向を学び、Vueを学びReactを学び、自分でnpmのライブラリを作り、Githubでチーム開発をし、自作サービスのプロトタイプに着手するところまで来ました。

とても楽しいです。

さて、フィヨルドブートキャンプは素晴らしい学習環境を提供してくれます(*2)が、どんな学習手段であれ、会社員として働いている以上、まず最初に苦労するのは、十分な学習時間を確保することではないでしょうか。

私自身も例にもれず、「もっと勉強したいのに時間がない!」というもどかしさと日々戦いながら、今に至っています。

色々と改善を試したところ、最初は40時間/月くらいでしたが、最近は150時間/月くらいの勉強時間を確保できるようになってきたので、本記事ではその試行錯誤について書こうと思います。

同じような環境の方の参考になれば幸いです。

前提

私の生活スタイルは、ざっくり下記のような感じです。

  • 東京都内にパートナーと二人暮らし(子供なし)
  • 土日祝休みのフルタイム会社員
  • 平日は9時半頃に出勤し、21時頃に帰宅
  • テレワークはほぼ無し
  • 土日のどちらかは友人と遊んだりごはんに出かけることが多い

仕事にも全力でコミットしたいのである程度仕事の時間は確保する必要がある一方で、子供がいないので育児時間は不要、というのが前提となるところかと思います。

その1:可視化

PDCAを回すには、まず可視化しないと始まりません。
私の場合は、学習開始時からずっと、スプレッドシートで学習時間を記録してグラフにしています。

1日に1行、

  • 学習時間(例:1.5時間)
  • ざっくり何をしたか、または学習できなかった時は理由を一言でコメント(例:npmパッケージの作成/朝からキャンプ)

を記録する形です。1分くらいで書けます。

(※学習内容の詳細記録については、フィヨルドブートキャンプの場合は「日報」という形で別途作成することになります)

また、目標時間については、私にとって無理のない範囲(=実現可能だとしっかり思える範囲)にしようと思い、最初は「平日に1時間、休日に4時間」としていました。

  • 仕事で遅くなっても1時間ならなんとかなりそう
  • 友人と飲みに出かける場合でも、昼間に4時間なら確保できそう
  • たとえば土曜に丸一日出かけて学習時間が0だったとしても、日曜日に8時間頑張ればなんとか回収できそう

という感じで、実現可能なラインとしてざっくり決めた形です。

予定値・予想値・実績値のグラフを作る

学習時間のグラフ(過去分なので予想値の線は実績値に重なっています)

疲れていたりするとついつい学習をサボりがちになっていたのですが、予定値・予想値・実績値がグラフで分かるようにすることで

  • 予定時間のグラフに対して実績が追いついていない
  • このままだと予想線の傾きが予定に対して全然足りない

という状態になるとすぐに分かって焦るので、リカバリしようという気持ちが湧きやすくなりました。個人的には非常におすすめです。

予想線はスプレッドシートforecast関数でざっくり回帰直線を引いているだけなので正確なものでは全然ないですが、効果はあったと思います。

あえて累計時間のグラフも入れる

累計学習時間のグラフ

累計時間は必ず増えていくので、改善という観点で言えば見なくてもよい指標かと思うのですが、個人でコツコツと学習する場合には、自分を褒めてモチベーションを保つという観点で役に立つなあと思っています。

たとえ前月との差分が小さくても、「私って今まででこんなに勉強したんだ!えらい!」と日々自分を褒めやすいので、時々眺めています。

失敗したこと:細かすぎる可視化

行動記録系のアプリも試したのですが、行動の開始/終了ごとにポチポチボタンを押していくような形が面倒で続かず。私には合いませんでした。

 

その2:日報の効率化

フィヨルドブートキャンプの場合は、学習した日は必ず日報を提出することになっています。

最初は、

  1. その日の学習を終える(たいてい夜なので、この時点で早く寝たい)
  2. 今日一日何をしたか思い出す
  3. 日報を書いて提出する

という形で行っていたのですが、日報を書くのに時間がかかるし、何をしたか思い出すだけでも大変だしで、しんどいな〜と思っていました。

リアルタイムで日報を書く

学習開始時に日報の枠を作成し、作業をしながら「よし今からこれをやろう」と思ったタイミングで、それをそのまま日報に書くというスタイルに変更変更したところ、かなり快適になりました。

  • やったことや調べたことなど
    • 学習しながらその時に書く
  • 翌日以降にやること
    • 学習終了時には、ここだけまとめる

という形です。

日報が不要な方でも、学習記録をつけている方であれば、試せるかもしれません。

その3:出勤前に学ぶ

平日は基本的に帰宅後の夜に勉強していたのですが、仕事が長引いたり、飲み会があったりして予定が変則的になってしまい、帰宅が遅くて全く勉強できなかった、という日も多くありました。

朝のうちに1時間のノルマを消化

そこで、平日ノルマである1時間は出勤前に消化してしまい、帰宅後は余裕があれば学ぶというスタイルに切り替えました。

実際にやってみると、平日の学習時間を確保できる確率が上がるのもそうなのですが、「仕事を終えて帰宅した時に既にノルマは完了している 」という、メンタル面での安心感がすごいです。

帰宅後、まだ元気がある日は追加で夜にもう少し勉強すれば「ノルマ以上に勉強した!えらい!」と思えるし、「今日は疲れたからゴロゴロしちゃおう〜」としたとしても、「今日のノルマは達成済みだから立派!えらい!」と思えるので、モチベーションが保ちやすいなと感じています。

たまに寝坊してうまくいかない日もありますが、気にせずゆるっと続けていこうと思います。

失敗したこと:睡眠時間を削る

言わずもがな。テンションが上がって無理をしてしまうのはよくないですね。
翌日くらいにはどうせ寝坊をするので学習時間的にもプラマイゼロないしマイナスです。

その4:出かける前の午前中を軽視しない

土日のどちらか一方は出かけることが多いのですが、出かける日は「今日は遊ぶ日だから時間ないしいいや」と、一切の学習を放置することが多くありました。

ですが、そんなに早朝から遊びに出かけるなんて実際はめったにありません。実は午前中に意外と時間を作れるんですよね。

12時に家を出てランチに向かう日なら、朝ごはんを軽めにして8時〜10時は勉強する、といったことを心がけ、月に10-15時間は学習時間を積み増せています。

番外編

他にも色々やりました。

部屋が寒すぎて集中できない!

電気ストーブを即ポチ。あたたかいです。
アイリスオーヤマの6000円くらいのものを買いました。

気分転換と勉強を兼ねる

プログラミングの息抜きに英会話とか。
すきま時間用に、最近はReal英会話というアプリを使っています。サクサクできてお気に入り。

Real英会話

Real英会話

  • LT Box Co., Ltd.
  • 教育
  • ¥1,200

apps.apple.com

食事に限界までメリハリをつける

金曜日の夜や土日はちょっと良いレストランに出かけて全力で食事を楽しむ代わりに、平日は全ての食事をBASEブレッドに置き換えて15〜30分くらいで済ませるという試みもしました。さすがに続かなかったのですが、それはそれとしてBASEブレッドは気に入っています。

歌う

歌や楽器は、短時間で一気に息抜きができて最高です。1曲なら5分程度。ただノッちゃうと5分では済まないこともあります。

通勤中は勉強しない

家にいる時間はできるだけ勉強に集中できるように、電車での通勤中(30分くらい)はむしろSNSYoutubeを見て全力でダラダラしています。
ここはその人の通勤時間や通勤方法によるところが大きいとは思いますが。

断酒

私の場合はここ数年ですっかりお酒が弱くなっていたのもあり、ハードルは低かったです。
節約にもなるかなーと思いましたが、代わりにノンアルコールのワインやビールをコレクションするようになってしまったので、経済的には変わらず。

最後に

勉強だけではなく、家族とおしゃべりをしたり、旅行に出たり、友人とゲームをしたりする時間も、私にとってはもちろん大事です。

自分にとって持続可能なやり方であることを大前提に、これからも楽しく学習を続けていきたいなーと思います。

フィヨルドブートキャンプ Part 1 Advent Calendar 2022 、明日はwataさんの記事に続きます!

 

*1:フィヨルドブートキャンプ入会の1ヶ月前から学習記録を始めていたり、1ヶ月の海外旅行に出ている間は休会したりしているので、この後に出てくる累積時間のグラフの値とは少し乖離があります。

*2:フィヨルドブートキャンプについては、他の生徒の方々や偉大なメンター陣が色々と書いていらっしゃるので、そちらもぜひ読んでみてほしいです。私もいつか別記事で書きたい。

siroemk.hatenablog.com

blog.jnito.com