一分一秒真剣勝負!

Ruby, Railsなど。Web系の技術ネタを充実させたい・・が、そうなるかは分からない。

RSpecでshouldからexpectへ移行する時に困ったこと

RSpecのExpectationsでshouldが非推奨となり、expectが推奨になったわけですが、expectで書くかと思った時に困ることがあった。例えば、

subject { User.new }
its(:login_id) { should be_nil }

のようなコードを書きたくてもshouldが無いと書けないのでは?と思ってたわけです。
これが書けないってなるとまだshouldで様子見かと判断していたのですが、
実はこのケースについてはconfigでshouldをdisabledにしてもサポートされていました
ちょっと安心。shouldを使える場所はshouldを使い続けて、書かざるを得ない部分だけexpectを使えばもしshould継続!って展開になっても対応は最小限で済むはず。
しかし、shouldが使えないとなるとコードをパッと見て「expectを使っているところは更新処理」だと判断しにくくなる点が不満ではあるなぁ。

undefined method `mtime' for nil:NilClass(i18n-js)

RailsJavaScriptの国際化をするライブラリは今のところi18n-jsが有名です。
暫く使っていなかったのだけど、久しぶりに使う機会がきたのでgithubを見てみたら便利になってた。なんとassetsを有効にしている環境なら以下の2行を追加するだけで動いてくれるらしい。

//= require i18n
//= require i18n/translations

早速やってみた(Rails3.2.12)ら「undefined method `mtime' for nil:NilClass」というエラーが発生。調べてみると"rake i18n:js:setup"でconfigファイルを作ってやれば動くとのこと。
・・で、configファイルを作ったら無事動きました。ちなみにtranslations fileを指定したりする必要は無いようです。前回使った時はtranslations fileがgrepの時にひっかかりまくってうざかったんですよね。それが無くなるだけでかなり快適。

Rails + Sass + Compass環境でTwitterBootstrapのvariablesを変更する

【注意】この情報古いっす。bootstrap-sassのgithub見てください。もっと簡単にできます。

bootstrapの公式サイトには Customize variablesというページがあって、これを変更する事によって色などを変更したbootstrapをダウンロードできます。これをRailsで変更したいという時にどうするか。

環境は、Railsが3.1.12で、gemは bootstrap-sass, compass-railsを使用しているものとします。

bootstrap-sassではこのファイルで全てのvariablesが宣言されているので、これを上書きしえてしまえばいいわけです。

ファイル構成

以下の様な構成でファイルを作成します。

app/assets/stylesheets/
├── application.css.scss
├── bootstrap
│   └── _variables.scss # variablesを定義する場所
├── bootstrap_load.css.scss # bootstrap読み込み用
└── layout.css.scss # 独自の定義など

各ファイルの内容

app/assets/stylesheets/bootstrap/_variables.scss

$tableBackground: #fff;  // 例えば@tableBackgroundを上書きしたいならこんな感じ。

app/assets/stylesheets/application.css.scss

@import "compass";

app/assets/stylesheets/bootstrap_load.css.scss

@import "bootstrap/variables"; // _variables.scssで変数を上書きしている
@import "bootstrap";           
@import "bootstrap-responsive";

app/assets/stylesheets/layout.css.scss

// 独自に定義したスタイルを書く

大体こんな感じ。app/assets/stylesheets/bootstrap/_variables.scssはsass-railsと同じディレクトリ構成にしておいた方が分かりやすくていいかなと思ってこうやってます。bootstrap-sassが推奨のテンプレをgenerateしてくれるといいんだけどなあ。

Haml 4.0 has been released!!

Haml4.0でた。
http://blog.haml.info/post/42998475354/haml-4-0-has-been-released

CHANGELOGはしっかり読んでないけど、一個だけサンプルコードが書いてあって、これは個人的に嬉しかったな。

Haml now flattens deeply nested data attribute hashes. For example:
.foo{:data => {:a => "b", :c => {:d => "e", :f => "g"}}}
would render to:
<div class='foo' data-a='b' data-c-d='e' data-c-f='g'></div>

いい。

はてなブログのiPhoneアプリ

iPod touch 欲しい! id:hatenablog

落としてみたけど、なかなか良い感じ。
ブログはPCで書くからいいやと思っていたけど、そういえば下書きの記事はちょいちょいスマホから書き足せると便利だと感じた。

iPhone4Sのバンパー系ケースに使えるUSBケーブルのスペーサー


今までiPhone4SのケースはEdyを入れられるものを使っていたんだけど、Edyは定期入れに入れる事にしてバンパー系のケースを買いました。Bladeってやつでなかなか良かったんだけど、これを付けてしまうと充電する時にApple純正のUSBケーブルじゃないと刺さらない事に気付く。
100均のiPhone用USBケーブルが使えなくなるのは困るので、スペーサーを探したところ、2000円以上するものが有名で確実そうだったが、自宅用・外出用・職場用に買ったら6000円を超えてしまう。さすがにそれはないだろって事で安いのを探したら手頃なのを発見。

30pinスペーサーII for iPhone/iPad ホワイト

30pinスペーサーII for iPhone/iPad ホワイト


これです。現時点で1個270円。純正ケーブルと同じ幅で充電出来ました!さんざんネットでググったんだけど、Blade使ってて充電できたってレビューが見つからなかったので、刺さってよかったです。

ELECOM iPhone4/4S 対応 スマートフォン用ヘッドホン延長ケーブル 4極 S型 0.1m ブラック MPA-EHPS01BK

ELECOM iPhone4/4S 対応 スマートフォン用ヘッドホン延長ケーブル 4極 S型 0.1m ブラック MPA-EHPS01BK


イヤフォンジャックも普通の形状のものは刺さらなくなったので、延長ケーブルを購入。バンパーケースを買うと金がかかるなあ。

Webアプリケーションのモデル設計

Forkwell12月17日(月)のニュースレターから引用。

Forkwellでもご多分に漏れず、モデル設計を最初にしっかりと考えこんで作りました。
特に、なるべくコードレベルでシンプルに、少ないコードで行きたい、と考えていました。
例えば単一テーブル継承(STI)やポリモーフィズムなどを利用して可能な限りシンプルに作ったり、
ひとつ変更すれば関連するモデルが更新されるようなフックを仕掛けたり、といったところです。

ところが、これらには罠があります。
それは、開発した当人たちにとってはわかりやすくても、途中からジョインした人たちはパッと見
良くわからない(=読みにくい)、というところです。
現にForkwellチームの中では、
「あー、そうやってたの。わかんなかった」
「いやいやそれはちょっと」
という悲しい光景が繰り広げられるという結果になってしまいました。

なので、今ではForkwellはポリモーフィズムなどの技術はなるべく使わず、素直に必要なモデルを
必要なだけ作ってやるという方式を取ることにしています。

それがいいですね。その時点では素晴らしい設計であっても、運用していくうちに当時の設計思想には当てはめられない機能を実装しなければならない状況になったり、プロジェクトの途中からアサインしたエンジニアが認識できなくて変な実装をしてしまったりといった事はよくあります。
モデル・ER図・テーブル定義をざっと見ただけで大体の実装をイメージできてしまうぐらいが丁度いいのではと思ってます。程度によりますが、冗長的な実装になっても人数が増えてきた場合にコンフリクトしにくくなるとか、急な増員をした場合でも理解しやすければすぐに即戦力になってくれるなどメリットもある。
まあ、技術を知ってると使ってみたいってのはわかりますけどね。