読者です 読者をやめる 読者になる 読者になる

drilldripper’s blog

機械学習とソフトウェア開発を頑張ってます

Ruby on Railsチュートリアルを軸にしてWeb周辺技術を勉強した

最近まとまった時間ができたので、Web開発手法の勉強をしていました。

Ruby on Railsチュートリアルが体系的に学べて良いという話を聞いていたので、これを軸にしながら自分のWeb知識の穴を埋めていくことにしました。

Ruby on Rails チュートリアル:実例を使って Rails を学ぼう

一区切りついたのでまとめておきたいと思います。

前提知識

以下は勉強を始める前の私の知識です。

  • Webフレームワークを使ったことがない

    • PHPなどで開発をしたことはある
    • MVCモデルは一応理解している
      • Java Servletを使った講義を受けたことがある
    • DB Migrationなどの言葉は聞いたことがある
  • Rubyを一行も書いたことがない

    • 普段はPythonC++を書いている
    • 趣味でJSも少し書く
  • CS的なインフラの基本技術は知っているが、IaaSやPaaSなどにはあまり明るくない

参考書

Railsチュートリアルをやる前に、参考書でWeb技術に基礎を固めました。

最初にWebを支える技術を読みました。

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

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

RESTの基本を学ぶのに非常に役立ちました。またステートレスやリソースなど、「なんとなく意味はわかるけど正確には知らない」知識を得ることができたり、実践的なAPI設計などが書かれていて非常に良い本だと思います。途中microformatsAtomなど、今ではあまり使われていない技術に多くのページが割かれているので、興味がない人は適当に読み飛ばせばいいと思います。(Webの栄枯盛衰を感じる歴史としては面白いと思います。)

次にマスタリングTCP/IP 入門編を読みました。*1

マスタリングTCP/IP 入門編 第5版

マスタリングTCP/IP 入門編 第5版

名著だと言われていますが、教科書的で結構退屈です。また既に知っている知識が多かったので、私は適当に読み流しました。

低レイヤーを学んだので、次は高レイヤーのIaaSやPaaSを学ぶことにしました。今回はAWSを選択しました。

Amazon Web Services クラウドネイティブ・アプリケーション開発技法 一番大切な知識と技術が身につく (Informatics&IDEA)

Amazon Web Services クラウドネイティブ・アプリケーション開発技法 一番大切な知識と技術が身につく (Informatics&IDEA)

評判が良くて比較的出版が新しかったのでこの本を選びました*2スクリーンショットなども多く、手を動かしながらサービスを満遍なく学習できて面白かったです。無料枠で十分遊べます。

AWSRailsチュートリアルにはあまり関係ないかと思っていましたが、一部ストレージサービスのS3を使う部分などがあり、学んだ知識を生かすことができました。

Rubyの学習

RailsチュートリアルではRubyの前提知識を求めていませんでしたが、さすがにHello Worldも書けない状態で特攻するのは嫌だったので、簡単に言語仕様をさらいます。

まずは公式ドキュメントを読みました。

20分ではじめるRuby

他言語からのRuby入門

公式ドキュメントは量が少なく、あまりにもあっさりとしているので他の資料にもあたりました。

[Ruby]他言語使用者のためのRuby入門知識まとめ - Qiita

便利なRubyイディオム - Qiita

ASCII.jp:Ruby超入門(前編)|Rubyで学ぶRuby

特にRubyで学ぶRubyは面白かったです。(Rubyで自作インタプリタを作る連載で、正直文法やイディオムの書き方を学ぶのには適していませんけど…)

Ruby on Railsチュートリアル

ここまでやった段階でRuby on Railsチュートリアルに取り掛かりました。基本的には演習問題に取り組み、erb(HTML)とCSS以外はコピペしない方針で進めました。

Twitterライクなアプリを作る中でGitの使い方からマイグレーション、PaaSへのデプロイ、テスト駆動開発などを実践的に学ぶことがでます。 思っていたよりもにWebの広範囲な知識が得られてやってよかったと思います。

またGitのコミットの粒度やコメントの書き方などは普段の開発にも活かせる部分があり、Masterブランチ一本で開発していた自分のプロジェクトを見直すきっかけにもなりました。

たくさんのことが学べる素晴らしいチュートリアルですが、それは裏を返せば非常に長大なチュートリアルであるということです。 電子書籍版のPDFに換算すると800ページ以上あるので*3、結構挫折感は強いです。個人的には勢いに任せて一気にやるといいと思います。

補足:Ruby on Railsチュートリアルのメモ

以下はチュートリアルを進めながらのTipsやエラー回避、感想です。

進めながらメモをとっているので、適当なことを言っている可能性があります。

1章

  • Cloud9が推奨されているが、小回りがきいて便利だと思ったのでローカル環境を作成
    • JetBrainsのIDEが使いたいとうモチベーションが大きい
  • nokogiriでインストールエラーが発生
    • Command Line Toolsをいれておく必要がある

2章

  • Viewを表示しようとしたらArgumentError: key must be 32 bytesのエラー

  • RailsはRESTfulを採用した先駆者らしい

    • Webを支える技術を読んでおいてよかった感ある

3章

  • コミットの粒度や命名規則のあたりがいい話
  • .erbはhtmlを書ける
  • テスト駆動開発
    • 知識として知ってたけど、実際にこのプロセスをやるのは初めてだ

4章

  • 言語仕様
    • ここはサラッと流せそう
    • Railsの拡張も結構ある

単なるRubyのコードを書くのであれば、モジュールを作成するたびに明示的にインクルードして使用するのが普通ですが、Railsでは自動的にヘルパーモジュールをインクルードしてくれるので、include行をわざわざ書く必要がありません。 つまり、このfull_titleメソッドは自動的にすべてのビューで利用できるようになっている、ということです。

  • メソッドが破壊的かどうかを表現するために!をつけるルール、すごく良さそう
  • 必ずしも守られているわけではなさそうだけど http://qiita.com/tadsan/items/7baab2605a4d8ac1858e

  • pythonのスライスとrubyのスライスは仕様が違うので注意

    • [0..7]としたときに、7自体も含まれる

5章

  • CSSを書くのが結構めんどくさい

    • 自分が普段書かないからサラサラかけなくてストレスなのかも
  • HTTP技術の話

    これは、HTTP標準では技術的にリダイレクト後に完全なURLが要求されるためです。ただし、ほとんどのブラウザではどちらの方法でも動作します。

  • Webを支える技術にそんなようなことが書いてあったなあ

6章

  • 名前だけ知ってたActive Recordの概念が出てきた
    • SQLの操作を抽象化している
  • ここでRails console内で生成されるTime Stampの値がおかしいことに気付く

  • 正規表現がでてきた

    • 読むのがめんどくさくて、たぶんあってるだろうと思ってコピペする
      • 普段から正規表現に対してはこのスタンス。良くない癖だ…。
  • passwordはハッシュ化して保存する

7章

  • RESTに従ってデータベースを取得したサービスを設計し始めた

    • Resourceとしてデータを扱う
  • debuggerメソッド、とても便利。ブレイクポイントだ

  • POSTで送ることのできる要素を限定させる(Strong Params)
    • すべての要素を送ろうとするとエラーが発生する
  • pluralize
    • 英語を複数形にするメソッド。言われてみればめっちゃ需要ある
  • configを一行変更するだけで簡単にSSL通信ができてすごい
    • というよりもHerokuが簡単にSSLを無料で扱えるのが使えるのがすごい

8章

  • rails routesでルーティングが表示できる

    • コンソールで対話的にwebアプリを作れるメリットを感じる
  • 残念ながらヘルパーメソッドはテストから呼び出せない

    • これ少しめんどくさい

9章

  • XSSの対策をしなくていいの?と思いながら進めていたけど、railsが自動的にやっていたみたい
    • やっぱり標準で対応するべきだよなー
    • PHPだと明示的にescapeしないといけないし、世の中を良くするためにはデフォルトで対策したほうがよい
  • 記憶トークンの使用はセッションハイジャックの対策にもなって一石二鳥
  • PythonのselfとRubyのselfは似たような感じ?
  • 署名と暗号化を同時に行う。合理的

  • 0も1もRubyの論理値ではtrue

    • if文を書くときに他言語に慣れてると罠に嵌りそう
  • チェックボックスとかの分岐のテストはなかなか大変

10章

  • そういえばテストではpostじゃなくてpatchが使われている機会が多いことに気づいた
  • has_secure_passwordはオブジェクト生成時に存在性を検証する
    • ユーザ登録時にnilが有効にならない
  • log_in_asヘルパーがすごく強力であることがわかってきた
  • unless @user == current_userよりもunless current_user?(@user) のほうがわかりやすいという説明、いまいちピンとこない
    • 前者のほうが何をしているか明確でいいと思う
      • Python的な考え方かもしれない
  • Cookieをユーザが手動で削除してフォームを送信する場合を考慮してテストされてて、なかなか細かい
  • ブラウザはネイティブではDELETEリクエストを送信できないらしい
    • 知らなかった…。

11章

  • このへんでようやくedit_account_activation_urlの意味がわかってきた
    • @がURLで使えないということを初めて知った
  • どうやってメール受信のテストをやるのかなあと思いながら読み進めていたけど、簡単にプレビューする方法がRailsで提供されているらしい。

    • この仕組、テストが行いやすくするための工夫だよなあ
      • これがないとTDDはしにくそう
  • assert_matchめっちゃ便利

  • メタプログラミング

  • テストがあるとリファクタリングしたときの安心感があって良い

    • ところでコントローラからモデルに操作を移したい理論的な動機について書かれていないんじゃないか?
      • 感覚としてなんとなくわかるけど
  • 本番環境でメールのテストを行うためのプラグインをHerokuで使うためにクレジットカード登録が必要

    • 先延ばしにしていた登録をここで終わらせる
    • Vプリカが使えるのでセキュリティ的にも安心
  • 本番環境でメールがなかなか届かなくて失敗してるかと思ったけど、時間がかかっているだけだった。

12章

  • この章の序盤は本当に11章とやっていることの本質は変わらないっぽい
  • チュートリアルで一番難しいのは、漏れがないようにテストを書く演習な気がしてきた
  • ようやくこの章でログインの管理が終わった。結構しんどかった。

13章

  • PostgresQLではStringとTextではパフォーマンスの差が出ないのは初めて知った
  • Reference型よい
    • 今自分は間違いなくmigrationのメリットを享受している
  • 状況に応じて生のSQLが読み書きできないと処理ができない部分がまだたくさんある
  • pluralizeがまた出てきた
    • 中身は泥臭いルールベースのコードなのかな
  • if object.errors.any?objectにするだけで抽象度が高くコードが書けて楽しい
  • 文字列をescapeする必要がなくても、とりあえずescapeしておく癖をつける
  • 画像のファイル名にはStringを使うのか
    • 全部Textにするのはだめなのか?
  • この章で初めてvalidationのメソッドを自分で書くことになった
    • railsの機能が豊富なのか、それともいままでの課題が基礎的なものだったのか
      • たぶん両方だと思う

14章

  • 冒頭のデータベース設計、すごく参考になる
    • データベース正規化を実際のサービスに当てはめて、パフォーマンスと保守性を考慮しながら設計している
  • foreign_key: "follower_id"という記述
    • ActiveRecordはDBを操作しているということを思い出させてくれる
  • HTMLを構造的にテストしていくのは複雑で難しい
    • 現実ではさらにデザイナーとバックエンドを書く人が別れているケースもあるから、もっと難しくなりそう
  • RailsにおけるAjax、JSをまったく意識せずに使える

各行の末尾にセミコロン ; があることに注目してください。 これはプログラミング言語によくある文法で、古くは1950年代中ごろに開発されたALGOLまで遡ります。

  • ;を使わない言語をはじめに使う人達も増えてきたんだろうな…。(老害感)

  • アプリ完成

    • 長かったけどすっごく面白かった

*1:すごく昔買った本を引っ張り出してきた

*2:AWSは進化が速く、陳腐化しやすいので比較的新しい参考書を選んだほうが良いと思います

*3:https://gumroad.com/l/railstutorialjp_ebook