"Webを支える技術" 読了

Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)

Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)

感想

タイトルの通り、Webを支える技術について説明されている本である。Web誕生の歴史についても語られており、今のWebを支える技術がどのような思想で設計され、何故普及したのかということを理解することができる。

何となく理解したつもりになっていた技術 (HTTP, URI, HTML, REST等) について、改めて体系的に学ぶことができ、理解が深まった。内容がわかりやすく結構さくさく読み進められたので、初心者にもおすすめできる。個人的にはもっと早く読んでおきたかったなと思う。

注意点として、2010年に発行された本なので、最新技術については当然触れられていない。例えば、HTTPはHTTP 1.1が中心として取り上げられているため、本書の知識を元にHTTP/2やHTTP/3等を追加で学ぶ必要があるだろう。

余談

ちなみに、この本を読んでから実際の技術仕様 (以下はURIとHTTP 1.1の仕様) を軽く確認してみたのだが、結構理解できることに気付いた。

英語の読解自体に時間が掛かってしまうので、学習するなら体系的にまとまった本を読むのが手っ取り早い。しかし、長期的に技術を追い続けるなら、英語も学ばなければならないなと思う。

RubyでRSS/Atomを取得するfeedjiraを試してみる

Ruby on RailsでFeed Readerを作ってみようと思い立ちgemを調べた所、feedjiraというのが良さそうだったので試してみる。

require 'feedjira'

url = "https://hira0hrk.hateblo.jp/feed"
feed = Feedjira::Feed.fetch_and_parse url
puts feed.title
puts feed.url
puts feed.last_modified
puts "---"
feed.entries.each do |entry|
  puts entry.title
  puts entry.url
  puts entry.published
  puts "---"
end

実行結果。

hira0hrkのブログ
https://hira0hrk.hateblo.jp/
2018-11-18 04:32:10 UTC
---
Ruby on RailsにおけるPUTとPATCHの話
https://hira0hrk.hateblo.jp/entry/2018/11/18/133210
2018-11-18 04:32:10 UTC
---
Ruby on Rails Tutorial の学習をローカルの仮想環境 (VirtualBox + Linux Mint) で進めるための環境構築
https://hira0hrk.hateblo.jp/entry/2018/10/30/221851
2018-10-30 13:18:51 UTC
---
Ruby on Rails Tutorialを完走したのでふりかえる
https://hira0hrk.hateblo.jp/entry/2018/10/28/224252
2018-10-28 13:42:52 UTC
---

Feed Readerを作る場合、定期的に取得処理を行う必要があるが、取得する度に同じ記事が登録されないようにしなければならない。"最後に取得した時の最終更新日より新しい記事があればDBに追加する" という感じで実装すれば、同じ記事を登録せずに済みそう。

Ruby on RailsにおけるPUTとPATCHの話

Ruby on Railsではリソースの更新にPATCHが使われている。HTTPの更新メソッドであるPUTとPATCHの違いを整理する。

用語

  • 羃等 (idempotence): ある操作を何回行っても結果が同じこと
  • 安全 (safe): 操作対象のリソースの状態を変化させないこと

PUTとPATCHの違い

PUTは羃等であるため、完全なリソースの情報をリクエストに含める必要がある。PATCHは羃等でないため、リソースの部分的な情報が含まれていればよい。

Admin権限を持つユーザモデルで考える。あるユーザのAdmin権限を有効にしたい場合、PUT /users/:idadmin の値を変更するのは適切ではない。PUTはリソースの部分的な更新ではなくリソース全体を更新するメソッドなので、PUT /users/:id/admin とすべきである。

リソースに対して部分的な更新を行なうのがPATCHメソッドである。今回の例だと、PATCH /users/:idadmin の値のみを更新することができる。

Ruby on Railsではリソースを完全に置換することは稀なので、部分的な更新をするPATCHがデフォルトになった。

参考

Ruby on Rails Tutorial の学習をローカルの仮想環境 (VirtualBox + Linux Mint) で進めるための環境構築

Ruby on Rails Tutorial では、開発環境として AWS Cloud9 というクラウドIDEサービスを推奨している。環境構築不要で進められるというメリットもあるが、自分の好きなエディタを選んだりすることはできない。そこで、ローカルで開発を進めるための環境構築手順をまとめる。

概要

Windows 10 に VirtualBox + Linux Mint をインストールし、仮想環境で開発を進められる状態を構築する。

環境

手順

以下を順番にインストールしていく。

VirtualBox

以下からダウンロードしてインストールする。

64bit 版の Linux Mint をインストールする場合、BIOS から CPU の仮想化技術を有効化しておく必要がある。

Linux Mint

以下から ISO ファイルをダウンロードする。

VirtualBox仮想マシンを作成する。タイプとバージョンは以下を指定する。

作成した仮想マシンの "設定 > ストレージ > 光学ドライブ" より、ダウンロードした ISO を選択する。

これで普通のコンピュータに Linux をインストールするのと同じ仮想環境ができるので、起動して Linux Mint をインストールする。

設定メモ

Guest Additions をインストールする。"デバイス > Guest Additions CD イメージの挿入" を選択し、以下コマンドを実行する。

# Guest Additions のインストール
$ sudo /media/user/VBox_GAs_5.2.20/VBoxLinuxAdditions.run

ユーザのディレクトリ名を英語に変換する。

# ユーザのディレクトリ名を "日本語 => 英語"
$ LANG=C xdg-user-dirs-gtk-update

プログラミング用フォント Ricty を生成する。生成したフォントは /usr/share/fonts/ 配下に置くと追加される。

# 生成したディレクトリからフォントを移動
$ sudo mv *.ttf /usr/share/fonts/truetype/

VirtualBox の共有フォルダを設定する。ホスト側で仮想マシンの "設定 > 共有フォルダー" より共有するフォルダを設定する。ゲストOS側で利用できるようにするには vboxsf グループにユーザを追加する必要がある。

# ゲストOS側でvboxsfグループにユーザを追加
$ sudo gpasswd -a USERNAME vboxsf

rbenv + ruby-build

Ruby のバージョンを切り替えられるようにするために、rbenv と ruby-build をインストールする。

rbenv

# rbenvをクローン
$ git clone https://github.com/rbenv/rbenv.git ~/.rbenv

# rbenv高速化のためにbashの拡張をコンパイル
$ cd ~/.rbenv && src/configure && make -C src

# 環境変数へ追加
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.profile

# セットアップのコマンドを実行
$ ~/.rbenv/bin/rbenv init
# Load rbenv automatically by appending
# the following to ~/.bash_profile:

eval "$(rbenv init -)"

# 自動でrbenvを読み込む設定を追加
$ echo 'eval "$(rbenv init -)"' >> ~/.profile

# 設定ファイルを反映
$ source ~/.profile

# バージョンが表示されるかを確認
$ rbenv -v
rbenv 1.1.1-39-g59785f6

ruby-build

# plugins ディレクトリを作成
$ mkdir -p ~/.rbenv/plugins

# 作成したディレクトリに ruby-build をクローン
$ git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build

# インストール可能なバージョン一覧を表示
$ rbenv install --list
Available versions:
  1.8.5-p52
  1.8.5-p113
  1.8.5-p114
  1.8.5-p115
...

Ruby

# 現在の安定版 (2.5.1) をインストール
$ rbenv install 2.5.1
The Ruby openssl extension was not compiled.
The Ruby readline extension was not compiled.
The Ruby zlib extension was not compiled.
ERROR: Ruby install aborted due to missing extensions
Try running `apt-get install -y libssl-dev libreadline-dev zlib1g-dev` to fetch missing dependencies.

# ライブラリが不足していたので、指示通りにインストールする。
$ sudo apt-get install -y libssl-dev libreadline-dev zlib1g-dev

# 再度実行
$ rbenv install 2.5.1
Downloading ruby-2.5.1.tar.bz2...
-> https://cache.ruby-lang.org/pub/ruby/2.5/ruby-2.5.1.tar.bz2
Installing ruby-2.5.1...
Installed ruby-2.5.1 to /home/user/.rbenv/versions/2.5.1

# インストールされたか確認
$ ruby -v
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-linux]

折角rbenvを入れたので、別のバージョンと切り替えてみる。

# 別のバージョン (2.4.4) をインストール
$ rbenv install 2.4.4
Downloading ruby-2.4.4.tar.bz2...
-> https://cache.ruby-lang.org/pub/ruby/2.4/ruby-2.4.4.tar.bz2
Installing ruby-2.4.4...
Installed ruby-2.4.4 to /home/user/.rbenv/versions/2.4.4

# インストールされているバージョンの一覧を確認
$ rbenv versions
* system (set by /home/user/.rbenv/version)
  2.4.4
  2.5.1

# バージョンの切替 (2.4.4を指定)
$ rbenv global 2.4.4

# 現在のバージョンを確認
$ rbenv version
2.4.4 (set by /home/user/.rbenv/version)

$ rbenv versions
  system
* 2.4.4 (set by /home/user/.rbenv/version)
  2.5.1

# 実際のバージョンを確認
$ ruby -v
ruby 2.4.4p296 (2018-03-28 revision 63013) [x86_64-linux]

Rails

まず、Gemのインストール時にドキュメントをインストールしないよう設定する。

# Gemのインストール時にドキュメントをインストールしないよう設定
$ printf "install: --no-rdoc --no-ri\nupdate:  --no-rdoc --no-ri\n" >> ~/.gemrc

RubyGems.orggem-install には、--no-rdoc--no-ri は非推奨なので -​-document を使えと書いてある。そのうち -​-document の方に統一されるかもしれないので注意が必要である。

設定したら、Railsと実行に必要なものをインストールする。

# Railsのインストール
$ gem install rails -v 5.1.6

# バージョンの確認
$ rails -v
Rails 5.1.6

# SQLite3のインストール
$ sudo apt-get install libsqlite3-dev

# Node.jsのインストール
$ sudo apt-get install nodejs
$ sudo apt-get install npm

Editor (VS Code)

公式サイトからdebをダウンロードして以下のコマンドを実行する。

$ sudo dpkg -i <file>.deb
$ sudo apt-get install -f # Install dependencies

設定ファイルの共有には、Setting Syncという拡張機能を使うと便利。

Ruby on Rails Tutorialを完走したのでふりかえる

Ruby on Rails Tutorialを終えたので、簡単にふりかえる。

学習を始めた理由

Excelと向き合ってばかりの仕事をしており、技術が身に付かない不安に駆られたので勉強を始めることに。GitやTDDを使いながら、Webアプリケーションで用いられる基本的な機能を一通り実装できるRuby on Rails Tutorialを選択した。

事前知識

会社の研修で在庫管理のWebアプリケーションを作成した際、以下の技術を使用した経験がある。しかし、業務でプログラミングをする機会がなく、実務経験に乏しい。

プライベートでは以下の勉強をしたことがある。趣味レベルであり、仕事で使うことがない技術なので当然実務経験はない。

学習結果

Ruby on Railsを用いてTwitterの簡易的なクローンを作成した。主な機能は以下の通り。

  • ユーザの登録/削除
  • メールを用いたアカウントの有効化/パスワードの再設定
  • セッション/Cookieを用いたログイン
  • ユーザに紐付けられたマイクロポスト
  • ユーザのフォロー

プログラミングやMVCに関する基本的な知識はあったので、割とさくさく進められた。ただ、Rails特有の書き方や省略記法は、慣れないとコード見ただけでは読み解けないと思った。簡単に書けるというメリットはあるものの、なぜそういう書き方ができるのかをしっかりと理解しておく必要がある。

Gitについては、章毎 (機能毎) にBranchを作成し、実装が終わったらAdd -> Commit -> Merge -> Pushを行った。本番環境へのデプロイも、GitでHerokuにPushするだけでなので非常に簡単だった。章が終わるタイミングでCommitしていたので、もっと細かい粒度でCommitした方が良かったかもしれない。

また、テスト駆動開発 (TDD) を用いて実装を行った。テストを先に書いてから実装するという流れで進められるので、実装の間違いに気付き易い。Guardによる自動テストを用いれば、品質を高めつつ面倒な作業は自動化することができる。TDDと自動テストを実践しながら進められるというのはかなり有益だったと思う。

次の目標

復習も兼ねて、要素技術を掘り下げながら2周目をやろうかと思う。毎日こつこつ進めていたので、おそらく忘れている部分もあるはず。また、簡潔に説明されていた部分を掘り下げて学習したい。並行して以下の本を読み進めていこうと思う。