ボクココ

熱海で開発するブログ

Rails Guide で参考になった記事のまとめ

Rails Guideは常に最新のドキュメントがまとめられているため、たまにページに行くと、有益な情報が転がっていることが多々ある。

ちょっと理解が怪しい部分や、開発中によく迷う部分とかをたまに読んでみると、新しい発見があって、成長した気になれる。

今回は最近チェックしたページを紹介しようと思う。

Record Lock

http://railsguides.jp/active_record_querying.html#%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E6%9B%B4%E6%96%B0%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E3%82%88%E3%81%86%E3%83%AD%E3%83%83%E3%82%AF%E3%81%99%E3%82%8B

厳密なWebアプリを作るなら、Transactionロックの話は必須だ。ここらはRails本ではなかなか詳細まで入り込めない部分なので、きっとRecord Lock の章は新しい発見がたくさんあることだろう。

N+1問題

http://railsguides.jp/active_record_querying.html#%E9%96%A2%E9%80%A3%E4%BB%98%E3%81%91%E3%82%92%E4%B8%80%E6%8B%AC%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BF%E3%81%99%E3%82%8B

has_many な関連のモデルをたくさん作っていると、eachの中でsqlを回してしまうようなケースが出てくるかもしれない。そんなSQLの効率に関して気になり出したら、このN+1問題の記事を読むべき時だ。 Eager Load という素晴らしい機能をRailsが提供していることを知るだろう。

ポリモーフィック関連付け

http://railsguides.jp/association_basics.html#%E3%83%9D%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%95%E3%82%A3%E3%83%83%E3%82%AF%E9%96%A2%E9%80%A3%E4%BB%98%E3%81%91

Table設計に関しては経験がモノを言うと思う。そんな中でポリモーフィック関連付けを知っておけば、あの時あんな面倒なことにはならなかったなぁとか、そういう風な感じでこの便利さを知ることだろう。ただこれの導入も慎重に設計しなければならないことはいうまでもない。

関連付けオプション

http://railsguides.jp/association_basics.html#%E9%96%A2%E9%80%A3%E4%BB%98%E3%81%91%E3%81%AE%E8%A9%B3%E7%B4%B0%E6%83%85%E5%A0%B1

has_many で 1の方のリレーションが消えた時、*の方のモデルはどうするか。これはデータ削除の時とか、関連の検索の時とかでつまづくことがある。has_many などの関連付けの持つオプションを知っておくと、より効果的なデータベース操作が可能となる。

部分テンプレート

http://railsguides.jp/action_view_overview.html#%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%80%81%E3%83%91%E3%83%BC%E3%82%B7%E3%83%A3%E3%83%AB%E3%80%81%E3%83%AC%E3%82%A4%E3%82%A2%E3%82%A6%E3%83%88

Viewを扱うなら部分テンプレートは必須の知識だろう。ただ、そんな部分テンプレートも奥が深いことをこの記事を読むことで理解できるだろう。 できる限り部分化していくことが、メンテナンス性を高められる。

共通レイアウトで複数 yield を使う

Rails ネタ。

結論

layout の yield 以外で同様の yield を使いたい場合は content_forを使おう。

解説

app/views/layouts/application.html.erb は共通のレイアウトを定義するデフォルトのレイアウトファイルだ。そこには必ず <%= yield %> が入っていて、各actionのviewはそこに展開される。

さて、たとえば"このページにだけJavaScriptを読み込ませたい"とか"この部分はyieldの他で共通化したい"といったケースがあるだろう。前者はJavaScriptのコードを工夫すればなんとかなるっちゃなるが、コードが煩雑になりがちだった。

そんな時は content_for を使おう。たとえばページ内にだけ projects.css を読み込ませたい場合。

layout 内

<head>  
  <title>Todo List</title>  
  <%= stylesheet_link_tag 'project' %>  
  <%= yield :head %>  
</head>  

ページ内

<% content_for :head do %>  
  <%= stylesheet_link_tag 'projects' %>  
<% end %>

と書ける。application.html.erb をクールに活用してみよう。

雑談

光回線について色々調べてみたら、今は光回線つなぐのに2600円台で繋げられるようだ。これから引っ越しする予定なので、家やマンションで複数内で暮らしたら導入してみよう。

Mac OS X でのPostgreの起動

PostgreSQL のプロセスがいつの間にか無くなってたので、起動するときのメモ。

OS: 10.10.2

pg_ctl -D /usr/local/var/postgres -l /usr/local/var/postgres/server.log start

でおk。

ブラックリストワードをフィルタリングする Obscenity

今日は便利なGemを紹介。

掲示板システムをアプリとかで運用していると、NGワード連発な方々がどうしても出てきてしまう。そのため彼らの投稿は拒否したり特殊文字で置き換えたりする必要がある。

そんな時に便利な Gem が tjackiw/obscenity · GitHubだ。

Gemfile に obscenity を追加し、bundle install後、以下を追加。

$ cat config/initializers/obscenity.rb

Obscenity.configure do |config|
  config.blacklist   = "config/blacklist.yml"
  config.replacement = :stars
end

ブラックリストを記載したymlファイルを置けば完了だ。

そしたら以下のようにチェックできる基本メソッドがある。

Obscenity.profane?("simple text")
=> false

Obscenity.profane?("text with shit")
=> true

バリデータも ActiveRecord, Mongoid それぞれサポートしている。

CGMを運用しているRailsアプリなら是非導入して安全なサイト運営を心がけたいところだ。ちなみに自分のブラックリスト一覧を置いてみてるので、参考にしていただきたい。

black lists in bss

追記

Obscenity のデフォルトのままだと、スペースに囲まれた単語のblacklistのみがになるため、日本語のようにスペース区切りが無い場合はに変換されない問題がある。そこはソースのbase.rb にある \b を消去しなければならない。

最近の興味

ところで、WordPressホスティングは割と面倒だけど、最近はクラウドで簡単にやってくれるようなサービスが出てきているみたい。設置ってだけで何万とか取ってる会社あるし、こういうので自分でさくっと立てられるようになれれば節約になるんじゃないかな。

WiMAXかLTEかひかり回線かの選択

スマホ代が高い」これはあらゆる人にとって共通の悩みかと思う。月々7000-8000円かかるような方も見受けられる。これをどうすれば安く利用できるのか。そこが今回のテーマだ。

家のひかり回線 + LTE

これが最もよくあるパターンで手軽な分、お金がかかるケース。確かに家のひかり回線を引いけば家にいる誰もがそれを使ってネットを使うことができるし、それぞれLTEでパケット使い放題にしていればそれぞれのスマホでネット通信ができる。

LTEテザリング

テザリングというLTE回線を使ってPCやタブレットに接続するサービスがある。これを使えば家のひかり回線をつながなくても、それぞれが持つスマホのみで各自がネットを楽しむことができる。

ただこれには一つ問題がある。それが「通信制限」だ。テザリングの通信は制限がかかっていて、これが動画とか見てるとすぐに到達してしまうくらいの低い制限であるのが問題。気安く見たい動画が見れないというのはほとんどの人にとって痛いことではないだろうか。

WiMAXスマホ従量課金

WiMAXを使えばスマホLTEを使う必要がなくなるので、スマホ代は月3000円程度に抑えることができる。それに加えてWiMAXの料金を支払うことになるが、これはLTEテザリングとは違い制限なしで接続できる。これが最大のメリットだ。

そのため一人暮らしの方はWiMAXを使うべき。家族間でしょっちゅうネットを使う人だけWiMAXを持たせるみたいなことで節約することも可能だ。

WiMAXはサポートで選ぶ

WiMAXスマホ同様、多種多様なキャンペーンで各社が競い合っている。では何で選ぶべきかというと「サポート」だと思っている。

例えば解約時期など、小さい文字位でちらっと書いてあって大変重要なことはWebだとわかりにくいが、口頭で話せばサポートの方が重点的に説明してくれる。これを気にしないでいると解約したい時に違約金で1万円以上の料金を支払わないといけなくなってしまう。

他にもキャンペーンと言ってキャッシュバックがあったとき、銀行口座の登録依頼のメールが10ヶ月以上先に登録したメールアドレスに送ってくる場合もある。これら全てサポートに電話すればちゃんと説明してくれる。

おすすめ WiMAX

サポートでの一番のオススメは NiftyWiMAXだ。料金もお手頃ながら、電話サポートで会員登録からWiMAX申し込みまでやってくれる。これは大変ありがたい。私自身もサポートの良さでNiftyを使い続けている。他のWiMAXサービスに比べてシンプルな印象を受ける。もちろん電話だけして申し込みは自分でしっかりやることも可能だ。


料金で選ぶならGMO。キャンペーンの割引額がかなり高くて基本料も安い。ただキャンペーンは10ヶ月後とかそこらに登録したメールアドレスから口座登録しないといけない。 忘れると振り込みされないといったことがあるので、しっかりとスケジュールに登録しておこう。


また今後に注目したいのが Yahoo!モバイルルーター。この業界は特に変化が激しいので、前良かったのが一転して他に良いサービスができたりする。比較はしっかりしないといけない。

プログラマでもオススメ! Prose で Jekyll の記事を管理する

Jekyll は "Transform your plain text into static websites and blogs."(単なるテキストを静的ウェブサイトやブログに変換するもの)。Jekyll の詳細は以前の記事を参照。

bit.ly

さて、Jekyllでセットアップが完了し、実際にブログなどを運営していこうと思うと以下のような課題に直面するだろう。

画像アップロードが面倒

画像アップロードに関しては構築した自分ですら面倒なので、他人にそれをやらせるのは気がひける。

ローカルで作っているなら、imagesディレクトリかなんかに画像を放り込んで、そのパスを記事内に書くことになるだろう。

Github Web上で編集するならGithub Issue でIssueを作ってそこに画像をドラッグアンドドロップしたのち、その画像 URLコピーをして貼り付けといった流れになるだろう。

こんなんではWordPressの方がいいと言われるに決まっている。

他の記事書く人がGithubに慣れていない

Jekyll は Github Pages の元で動くため、実際に運用で他の人に記事を書かせるときにGithubのUIに慣れてもらわなければならない。英語オンリーでブランチやコミットなどよくわからない単語の羅列を無視しつつ、記事を書いてもらう必要がある。初見だと気が引けてしまうだろう。

Jekyll のメタデータの書き方など、それも手取り足取り教えないとブログ記事を公開することができない。

Prose で解決!

f:id:cevid_cpp:20150326133555p:plain

Prose という Github をクライアントサイドで操れるOSSがある。裏でGithub API を叩きまくっている作りだ。

f:id:cevid_cpp:20150326133408p:plain

Proseを使えば、画像は記事編集のテキストエリアにドラッグアンドドロップするだけでアップロードできる!アップロード先はそのリポジトリ内の画像ディレクトリ内に自動でコミットされる。

さらにJekyllでわかりにくいメタデータもHTMLフォームとしてカスタマイズすることが可能なので、Jekyllを全く知らない人がJekyllでブログを運用していくことが可能だ。 Prose.io を使わせるってのは一つの手だけども、これだと英語しか使えない問題があるので、日本語訳をここに載せておく。

ja.json

ただ、これでもデフォルトは英語のままなので、デフォルトを英語にするにはコードをいじる必要がある。これはgrep検索して置換していくしかない。Prose.io は Backbone.js で書かれていて、ビルドにはGulpを用いている。このProseもForkしてGithub Pages で自分で公開すれば、カスタマイズしたProse.ioを外に出すことができる。その手順は以下が参考になる。

prose/CONTRIBUTING.md at master · prose/prose · GitHub

注意点: 画像アップロードに関して

proseの設定でmediaを指定しないと画像アップロードに失敗してしまう。これに対応するためには、Jekyll で運用しようとしているブログのGithubリポジトリ_prose.ymlを作成し、以下のように記述する。決してProseの方に_prose.ymlを作らないように注意していただきたい。これでハマった。。

prose:
  media: "assets"
  metadata:
    _posts:
      - name: "layout"
        field:
          element: "hidden"
          value: "blog"
      - name: "published"
        field:
          label: "記事を公開"
          element: "checkbox"
          value: "true"
      - name: "summary"
        field:
          element: "text"
          help: "記事概要"
      - name: "image"
        field:
          element: "text"
          help: "画像URL"
      - name: "link"
        field:
          element: "text"
          help: "外部URL"
      - name: "category"
        field:
          element: "hidden"
          value: "blog"

こんな感じのをプッシュすればいい感じに記事編集ができるようになるだろう。

Prose で 素敵なJekyllライフを。

Effective Ruby を読んで

以前から気になっていた "Effective Ruby" を読んだ。 Effective シリーズは中級〜上級向けプログラマーの読むべき本として親しまれている。

個人的にもっとも得意な言語はRubyだったので、このシリーズが出るのを楽しみにしていた("得意な"と変換しようとしたら"特異な"と変換されるくらいには使用している)。

中身のネタバレはもったいないので、この本を通じて自分が今まで見落としていた点を挙げてみようと思う。

nil 時の対応

array = hoge()
array.split('/')[1] 

NoMethodError: undefined method hoge for nil:NilClassRubyプログラマーなら何度も遭遇するであろうこのエラー。配列でnilっぽくしたい時は空の配列を用意してあげたいところだが、その変数にnilが返ってきてしまうとこの問題に出くわしてしまう。

例えばある変数があって、それに array.split('/')とさせるとしよう。ここでarray変数がnilなのか、そもそも配列なのか、よくわからない。ちゃんとコードを戻って読まないといけない。

この問題を解決する素晴らしい手段が本書には書かれている。一体何でしょう?

なんでもかんでもHash使いたい

@hash = {}

@hash[:hoge] = hoge
@hash[:fuga] = fuga
...

これはまさしく自分だった。Hashを使えばコードを簡潔に書くことができる。特にRailsアプリなどではViewに渡すインスタンス変数をHashに変換し、View側でそのHashを取得するような処理を書くことは多いのではないだろうか。

しかし、Hashはなんでもかんでもキーとして詰め込むことができるため、このキーが一体どの部分で入れられたものなのか、コードを読み直す必要が出てくる。また、存在しないキーが出てきてもnilを返すだけで、例外を投げないため間違っているかどうかの判断がつかない。

ではどうするのがEffectiveなのか。一体何でしょう?

reduce をマスターせよ

本書で唯一 特定のメソッドに対して複数ページを割いて解説しているメソッドがある。それが reduceだ。これをわかりやすいサンプルとともに、ただ合計値を出すだけでない他のreduceの使い方を示してくれている。これにより、今まで無駄に書いていたあの処理が実はreduceで書き換えられるということを理解できるだろう。

終わりに

ある程度Rubyに慣れ親しんだ方なら、 何かしらのGemを入れ、気になった時はそのGemのソースコードを読む機会が何度かあったと思う。基本的にはそこから学ぶことが大変多いのだけども、この本はそれらの知識・ノウハウをよくまとめられているという印象を受けた。

対象としてはパーフェクトRubyとか読んだ後なら普通に読めると思うけど、Effective Ruby の場合はそれなりにRubyコードを実際に書いて運用した経験をした後によむと、「あ、こういう書き方ができるのか!」という発見があって楽しく読めると思う。