アペフチ

『RESTful Webサービス』でRailsを覚える

今日はちょっと思い出話でも。

Groongaもくもく会@札幌 2015-12-30に参加して来た。帰札した翌日から熱を出して寝込んでいたのだが、直前で治って本当によかった。

もくもく会ではDroonga HTTP Serverのインストールスクリプトの修正を試みていた。進捗はこんな感じ:https://github.com/droonga/droonga-http-server/compare/master…KitaitiMakoto:centos-systemd

その後は忘年会@Sinatra札幌&Sapporoonga 2015-12-30。そこで話題になった一つに、Railsの躓きポイントの話があった。既にうろ覚えだがこんな感じだったと思う。

ウェブアプリケーションを作ったことがない状態でRailsに入門すると、どこで何が起こっているか分からない。scaffoldしてアプリケーションが動くようにはできる。でも何がどうなっているか分からない。その後Sinatraをちょっと勉強して、

get '/' do
# ...
end

get '/entries' do
# ...
end

get '/entries/1' do
# ...
end

みたいなのに触れてみて初めて、「Railsはroutesをまず見るべきなんだ」と分かった、という話。そこから、Rails(のようなフルスタックのフレームワーク)に触れる前に、ウェブの基本的な仕組みを学ぶべきだ、という話になった。その場にはDjangoをやっている人もいて、やり始めはやはり同じような分からなさを感じていたらしい。

僕は、自分のRailsの覚え方は普通ではないし人に勧めるような物ではないと感じていたのだけど、この話を聞いていると意外とよかったのかも知れないと思えてきた。僕がRailsを覚えたのは、Railsの本でも勉強会でもなくて(当時はプログラミングの話をする相手すらいなかった)、『RESTful Webサービス』だった(今はPDF版もあるようだ)。

オライリー・ジャパン
発売日 : 2007-12-21

この本は、勿論Railsの入門書ではない。書名の通り、RESTful Webサービスの解説書だ。前半で、ウェブとは何か、HTTPとは、URIとは、アドレス可能性とは、RESTとは、といった基礎的な考え方と、実例として、Google Mapsのような地図サービスのサーバーサイドのリソース設計が紹介される。今実家にいて手元に実物が無いので記憶頼りだが(こういう時電子本だったら……)、どういうXMLにするべきか(当時はWeb APIはXMLを返すのが普通だった。そしてWeb APIでなくWebサービスと呼ばれていた)、どういうURIにするべきか、地図の拡大・縮小はURIとしてどのように表現するといいか、といったことが紹介される。

そうしてみっちりと理論的なことを叩きこまれた後で後半、ようやくサンプルウェブアプリケーションとして、del.icio.usクローンのブックマークサービスを作ることになる。この時に採用されたフレームワークが、Ruby on Railsだったのだ。Railsのバージョンは2で、ようやくRESTfulルーティングが入ったような頃だったと思う。Rackはまだ入っていなかった。

僕はこれを読みながら、HTTPメソッドとRailsのアクション名との対応表を何度も見返しながら、サンプルアプリケーションを写経することでRailsを覚えていった(Railsアプリケーションの作り方の簡単な解説もあった)。上で言っていた「ウェブアプリケーションの基本的な仕組み」を散々解説された後でRailsに触れることになったし、しかもこの本の順番だとURI設計をし、config/routes.rbに反映させて確認してからようやくコントローラーやモデルの実装に入った。期しないで、上で挙げた落とし穴に嵌らなかったわけだ。

Rails Guides日本語)やRails Tutorial日本語)、またはRails用の本を使ったわけではないので、正当な覚え方ではないのだろうと思っていた(その後Railsの本も何冊か読んではいる)し、何より人に勧めるような覚え方ではないと感じていたのだが、意外とそうでもないのかも知れない。しかし、この本は多少古い(XML、del.icio.us、Rails 2……)ので、やっぱり人には勧めにくい。そこで、『Webを支える技術』の実践編という位置付けで、Railsを使ったハンズオンチュートリアルを書いてみるのはどうだろう。

そこまでいかなくても、いきなりRailsで手を動かすのではなくて、先にこの本を読んでおくことにするのはどうだろう。

なお、当たり前の断りとして、適した覚え方は人それぞれだ。特に、人は自分の習得方法がいい物だと思いがちなので、そういったバイアスもある。何より僕は今のRails 4、5は殆ど触っていないので、今でも通用する考え方かは分からない。

Middleman Web Components

何度か書いたように、この日記はPolymerで作っている、つまりウェブコンポーネントを使っている。そこで、一般的に使いそうな機能をMiddleman拡張として書いていたのだが、今日RubyGemとしてリリースした。Middleman Web Componentsだ。

もちろんまだまだ足りないことは多いんだろうと思うが、自分の日記を触りながら拡張していきたいと思う。

Middleman Blogの類似記事をGroongaを使ってリストアップするRubyGemを作った

この日記はGroonga Advent Calendar 2015の21日目の記事です。今日は25日です。大幅に遅れてしまって、本当に申し訳ありません。

Middlemanでブログの類似記事一覧を作る拡張にMiddleman-Blog-Similarがある。類似判定のアルゴリズムを選べたりといい所もあるのだがこれは今のMiddleman v4に対応していない。それにGroonga Advent CalendarのネタとしてもGroongaが使いたかったので、Groongaの類似文書検索機能を使って同様のことをやってみた。

https://github.com/KitaitiMakoto/middleman-blog-similar-groonga

使うにはmiddleman-blog-similar-groongaをインストールし、config.rb

activate :blog_similar_groonga

と追記する。

拡張を有効化するとブログ記事向けのレイアウトでsimilar_articlesというヘルパーが使えるようになる。ここでイテレートされるオブジェクトには

  • key.key(パス)
  • title
  • path
  • body(タグを取り除いたもの)

の属性があって、わざわざ他記事のBlogArticlesオブジェクトまで辿らなくても済むようになっている。類似記事のタイトルを表示しつつリンクにしたいだけなら充分だろう。

<section>
  <h2>類似記事</h2>
  <ul>
  <% similar_articles.each do |article| %>
    <li><%= link_to article.title, article.key.key %></li>
  <% end %>
  </ul>
</section>

として使うことができる。

今は本文での類似しか見ていないが、タイトルやタグを使ったほうが人間の感覚に合うだろうから、改善を続けていきたい。

名前は似ているがMiddleman-Blog-Similarとは全く互換性が無いので注意すること。