Everyday Railsを読んだ感想

はじめに

Rails学習の仕上げとしてテストについて学ぶ機会があり、その教材としてEveryday Railsを読んだので、その感想を書きたいと思います。

学んだこと

非常に多くの内容が書かれており、一度読んだだけで全てを理解することはできなかったのですが、以下の内容は特に意識していきたいと感じました。

  • RSpecの基本
  • テストデータの準備の仕方
  • DRY(Don't Repeat Yourself)は大切だが、過度に意識する必要はない

難しかったところ

初めて勉強する内容にありがちですが、なかなか書き慣れず手が止まることが多いと感じました。こちらの書籍はコード量が豊富で非常に勉強が進めやすいのですが、勉強した内容を活かして何かをしようとすると途端に手が動かなくなり、書籍に戻って確認しながら進めることがほとんどでした。

最後に

内容が非常に盛りだくさんでRSpecの数少ない書籍だと思うので、Rails学習者はぜひ読んでみてください。

JavaScript Primer - 迷わないための入門書を読んだ感想

はじめに

本記事は以下の教材を読んだ感想を書いております。

jsprimer.net

良かったところ

Javascriptの基本から応用までこれでもかというくらい詳しく記載されています。第一部に基本文法、第二部に応用編と題してTodoアプリの作成などを行っており、どの項目にもサンプルコード豊富に記載されているのでとても理解がしやすくなっております。

学んだこと

基本編

  • JavaScriptとは
  • コメント
  • 変数と宣言
  • 値の評価と表示
  • データ型とリテラル
  • 演算子
  • 暗黙的な型変換
  • 関数と宣言
  • 文と式
  • 条件分岐
  • ループと反復処理
  • オブジェクト
  • プロトタイプオブジェクト
  • 配列
  • 文字列
  • 文字列とUnicode
  • ラッパーオブジェクト
  • 関数とスコープ
  • 関数とthis
  • クラス
  • 例外処理
  • 非同期処理:Promise/Async Function
  • Map/Set
  • JSON
  • Date
  • Math
  • ECMAScriptモジュール
  • ECMAScript

応用編

  • アプリケーション開発の準備
  • Ajax通信
  • エントリーポイント
  • HTTP通信
  • データを表示する
  • Promiseを活用する
  • Node.jsでCLIアプリ
  • Node.jsでHello World
  • コマンドライン引数を処理する
  • ファイルを読み込む
  • MarkdownをHTMLに変換する
  • ユニットテストを記述する
  • Todoアプリ
  • エントリーポイント
  • アプリの構成要素
  • Todoアイテムの追加を実装する
  • イベントとモデル
  • Todoアイテムの更新と削除を実装する
  • Todoアプリのリファクタリング

難しかったこと

第一部の基本文法ではthisや非同期処理が難しいと感じました。他の内容は別の言語を勉強した際に似たようなことを勉強するのでほとんど苦労しなかったのですが、thisや非同期処理は今まで勉強したことがない内容だったので、一周目で理解することはできませんでした。全体的に初学者には難しい内容なので、理解できない場合は他の記事を読んで改めてこの教材に取り組んだほうが良いと思います。

達人に学ぶDB設計 徹底指南書を読んでみた

はじめに

現役若手エンジニア、またエンジニアを目指している人が勉強する内容のほとんどはプログラミング言語に関する内容だと思います。 言語も大事だと思いますが、DB設計もしっかり勉強しておくべきだと思います。なぜなら、設計がしっかりしていないと後で取り返しがつかないことになるからです。 今回、以下の教材を用いてDB設計について勉強したので、その感想を投稿します。

www.amazon.co.jp

内容

  • データベースを制する者はシステムを制す
  • 論理設計と物理設計
  • 論理設計と正規化 ~なぜテーブルは分割する必要があるのか?
  • ER図 ~複数のテーブルの関係を表現する
  • 論理設計とパフォーマンス~正規化の欠点と非正規化
  • データベースとパフォーマンス
  • 論理設計のバッドノウハウ
  • 論理設計のグレーノウハウ
  • 一歩進んだ論理設計~SQL木構造を扱う
  • 演習問題の解答

良かったところ

  • DB設計の重要性が理解できる
  • 正規化について詳しく記載されている
  • 重要なポイントには「勘どころ」が記載されており、内容の把握がしやすい

学んだこと

本書で論理設計に関すること、特に正規化の方法や利点や欠点、ER図の便利さを学ぶことができました。また、論理設計だけでなく物理設計に関する内容も記載されており、論理設計の結果を受けて物理的な領域や格納方法を決めるものだということを学びました

難しかったこと

正規化は重要な内容ではありますが、慣れるまで練習をしないといけないと感じ、個人的には難しく感じました。そのため、以下の教材で教材で正規化について勉強してから本書を読み進めると内容が理解しやすくなると思います。

www.udemy.com

現場で使える Ruby on Rails 5速習実践ガイドを読んだ感想

タイトルの通り、現場で使える Ruby on Rails 5速習実践ガイドを読んだので、その感想を書きます。

現場で使える Ruby on Rails 5速習実践ガイド

良かったところ

実際のアプリ作りを通してRailsの内容を深く学ぶことができます。アプリ作りの基本から実際の開発プロジェクトの流れ、実践的なノウハウなど、ただアプリ作りをするだけでなく、何を意識したらより良いものが作れるのかが書かれているため、現場で活かすことができると思います。

悪かったところ(もしあれば)

強いて挙げるとするならば、Slimというテンプレートエンジンで話が進めれれており、よく見るERBではないため、Slimについて知らない人は別途勉強しておいた方が読みやすい内容だと思います。

学んだこと

実際にRailsを使う現場に入った際に意識すること、注意することが細かく記載されており、手を動かすだけでなく考え方も学べて非常に良かったです。

難しかったこと

基本の内容があまり細かく書かれていない感じがしたため、一度別の教材で勉強したのちに追加で深掘りしていく際に使用する方が良いと感じました。

まとめ

Railsを使った開発の仕方や実際の開発の流れが書かれているため、現場でも使えるのではないかと感じました。ただ、Railsに全く触れたことがない人にとっては難易度が少し高すぎる気がするので、一度他の教材で勉強することをお勧めします。

RailsアプリをDocker化する手順

Dockerの勉強をしたので、その復習として既存のRailsアプリをDocker化することにしました。

環境

Ruby: 3.2.2 Rails: 7.0.6 DB: PostgreSQL

手順

Dockerfileの作成

まずはイメージを作成するために必要なDockerfileを作成します。 今回Rubyのイメージを3.2.2と指定したところ、RUN apt-get ~の実行の際に 次のようなエラーが生じました。

生じたエラー

#5 0.903 Get:1 http://deb.debian.org/debian bookworm InRelease [151 kB]
#5 0.959 Get:2 http://deb.debian.org/debian bookworm-updates InRelease [52.1 kB]
#5 0.991 Get:3 http://deb.debian.org/debian-security bookworm-security InRelease [48.0 kB]
#5 1.032 Err:1 http://deb.debian.org/debian bookworm InRelease
#5 1.032   The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 0E98404D386FA1D9 NO_PUBKEY 6ED0E7B82643E131 NO_PUBKEY F8D2585B8783D481
#5 1.084 Err:2 http://deb.debian.org/debian bookworm-updates InRelease
#5 1.084   The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 0E98404D386FA1D9 NO_PUBKEY 6ED0E7B82643E131
#5 1.133 Err:3 http://deb.debian.org/debian-security bookworm-security InRelease
#5 1.133   The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 54404762BBB6E853 NO_PUBKEY BDE6D2B9216EC7A8
#5 1.135 Reading package lists...
#5 1.149 W: GPG error: http://deb.debian.org/debian bookworm InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 0E98404D386FA1D9 NO_PUBKEY 6ED0E7B82643E131 NO_PUBKEY F8D2585B8783D481
#5 1.149 E: The repository 'http://deb.debian.org/debian bookworm InRelease' is not signed.
#5 1.149 W: GPG error: http://deb.debian.org/debian bookworm-updates InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 0E98404D386FA1D9 NO_PUBKEY 6ED0E7B82643E131
#5 1.149 E: The repository 'http://deb.debian.org/debian bookworm-updates InRelease' is not signed.
#5 1.149 W: GPG error: http://deb.debian.org/debian-security bookworm-security InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 54404762BBB6E853 NO_PUBKEY BDE6D2B9216EC7A8
#5 1.149 E: The repository 'http://deb.debian.org/debian-security bookworm-security InRelease' is not signed.
#5 1.149 E: Problem executing scripts APT::Update::Post-Invoke 'rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true'
#5 1.149 E: Sub-process returned an error code
------
executor failed running [/bin/sh -c apt-get update && apt-get install -y     build-essential    libpq-dev    nodejs    postgresql-client    yarn]: exit code: 100

これに対する解決策としてRubyのイメージをbullseyeに変更しました。(Ruby参考記事)

Dockerfile

# apt-getのエラーを防ぐためにbullseyeイメージを使用
FROM ruby:3.2.2-bullseye
# 必要なパッケージをインストール
RUN apt-get update && apt-get install -y \
    build-essential\
    libpq-dev\
    nodejs\
    postgresql-client\
    yarn
# コンテナ内にホストと同じディレクトリを作成。
WORKDIR /rails-docker
COPY Gemfile Gemfile.lock /rails-docker/
RUN bundle install

docker-compose.ymlの作成

今回はRailsコンテナとDBコンテナを作成するため、docker composeを使用します。docker composeを使用することで、コンテナ起動時に長いコマンドを打ち込む必要がなくなり、複数コンテナを扱いやすくなります。 また、PostgreSQLイメージを12とするとDBコンテナが起動しないという事象が発生したため、DBイメージにはpostgres:12-bullseyeを使用しました。
PostgreSQL参考記事

docker-compose.yml

version: '3'

# ホストにボリューム領域を確保する
volumes:
  db-data:

services:
  web:
    build: .
 # コンテナ起動時にコマンドをこの実行
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
 # 使用するポート(Railsのデフォルトは3000)
    ports:
      - '3000:3000'
    volumes:
      - '.:/rails-docker'
 # database.ymlの環境変数を設定
    environment:
      - 'DATABASE_PASSWORD=postgres'
    tty: true
    stdin_open: true
 # dbコンテナ作成後にwebコンテナを作成する
    depends_on:
      - db
    links:
      - db

  db:
    image: postgres:12-bullseye
 # コンテナを削除してもデータが消えないように、ホストのファイルをコンテナにマウントする
    volumes:
      - 'db-data:/var/lib/postgresql/data'
 # 使用するデータベースの環境変数を設定
    environment:
      - 'POSTGRES_USER=postgres'
      - 'POSTGRES_PASSWORD=postgres'

database.yml

最後にDBの設定をファイルに記述していきます。

default: &default
  adapter: postgresql
  encoding: unicode
 # docker-compose.ymlのサービス名を指定する
  host: db
  user: postgres
 # PostgreSQLのデフォルトポートを指定
  port: 5432
 # docker-compose.ymlで指定した内容を読み取る
  password: <%= ENV.fetch("DATABASE_PASSWORD") %>
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>

ビルド後、DBを作成

# コンテナを起動。再ビルド時には「--build」をつける
docker-compose up -d

# コンテナ内に入る
docker-compose exec web bash

#コンテナ内でDB作成
rails db:create

# データベースのテーブル定義を作成
rails db:migrate

# コンテナを抜ける
exit

# コンテナを再起動。「restart」でも可
docker-compose up

エラー無く実行ができれば完了

確認

localhost:3000にアクセスし、アプリのデータ登録を行う。その後、Ctr+Cでアプリを終了し、docker-compose upでコンテナを再起動させ、先程登録したデータが残っているかを確認する。

参考資料

クィックスタート: Compose と Rails
米国AI開発者がゼロから教えるDocker講座
php:8.2-fpmのdocker imageでapt-getしたらエラーが出まくった
PostgreSQL参考記事

Rubyのoptparseについて書いてみた

※詳しくは、以下の公式ドキュメントを参照

docs.ruby-lang.org

はじめに

RubyにはARGVを使用してコマンドライン引数を取り出す機能があります。

# sample.rb
com0 = ARGV[0]
com1 = ARGV[1]
com2 = ARGV[2]
com3 = ARGV[3]
p com0, com1, com2, com3

$ ruby sample.rb -a 'test1' -b 'test2'
# -a
# test1
# -b
# test2

optparseを使う

optparseを使うことでオプションを受け付けることができるようになります。 先ほどの例にoptparseを入れて確認してみましょう。

# sample.rb
require 'optparse'
opt = OptionParser.new

opt.on('-a')
opt.on('-b')

# parse!()の場合、ARGVが変更される
opt.parse!(ARGV)
p ARGV

$ ruby sample.rb -a 'test1' -b 'test2'
# ["test1", "test2"]

$ ruby sample.rb -a foo bar -b baz
# ["foo", "bar", "baz"]

このように、aオプションとbオプションを作成することができました。

オプションの引数

-aオプションの引数の指定を必須にする場合は、-a VALと指定します。必須ではない場合は-a [VAL]とします。

# sample.rb
require 'optparse'
opt = OptionParser.new

opt.on('-a VAL') {|v| p v }         # <- " VAL" を追加
opt.on('-b') {|v| p v }

opt.parse!(ARGV)
p ARGV

$ ruby sample.rb -a foo bar -b baz
# "foo"
# true
# ["bar", "baz"]

$ ruby sample.rb -a
#/usr/local/lib/ruby/1.9/optparse.rb:455:in `parse': missing argument: -a (OptionParser::MissingArgument)

プロを目指す人のためのRuby入門(チェリー本)を読んでみた

はじめに

チェリー本の内容を一通り目を通したので、その感想を書いていきたいと思います。

gihyo.jp

内容

第一章 本書を読み進める前に
第二章 Rubyの基礎を理解する
第三章 テストを自動化する
第四章 配列や繰り返し処理を理解する
第五章 ハッシュやシンボルを理解する
第六章 正規表現を理解する
第七章 クラスの作成を理解する
第八章 モジュールを理解する
第九章 例外処理を理解する
第十章 yieldとProcを理解する
第十一章 パターンマッチを理解する
第十二章 Rubyデバッグ技法を身につける
第十三章 Rubyに関するその他のトピック

良かった点

Rubyの内容がほぼ全て網羅されていると思います。入門という名前になっていますが、Ruby初学者から仕事でRubyを使っている方まで対象になっているように感じました。また、「これは7-3-⚪︎ ⚪︎⚪︎で説明したように」のように過去に扱った内容を用いる際はどこに記載がされているのかが分かるため、内容が思い出せない時に振り返りやすくなっています。内容も盛りだくさんのため、今後Rubyで開発をする際の辞書としても使えると感じました。

学んだこと

入門と記載されている通り、標準出力や配列などの基礎的な内容からハッシュやシンボルといった他の言語ではお目にかかれないものまで余すことなく学ぶことができました。また、正規表現やクラスのように他の言語でも使える内容やデバッグ技法といった実際の開発のエラー対応のやり方など、かなり実践寄りの内容も扱っており、非常に勉強になりました。

難しかった点

第一章から第六章までは比較的スムーズに読み進められましたが、それ以降は第十二章を除いて難しくなっています。自分も理解ができていないところがたくさんあるため、再度読んで理解をしていきたいと思います。

全体を通して

RubyRailsで開発をするための基礎になります。Rubyの理解が中途半端のままではRailsの理解も浅くなってしまいます。ただ、一度に全てを理解することはかなり難しいため、一通り目を通したら必要に応じて振り返るという使い方が自分には合っていると感じました。