$ brew upgrade ruby-build
$ rbenv install 2.0.0-p0
$ rbenv global 2.0.0-p0
$ brew install curl-ca-bundle
$ cp /usr/local/Cellar/curl-ca-bundle/1.87/share/ca-bundle.crt /usr/local/etc/openssl/cert.pem
$ gem install bundler rbenv-rehash

Rails Best PracticesのLaw of demeterを直してる時に結構出てくる。

class Award < ActiveRecord::Base
  belongs_to :story
  delegate :user, :user_name, to: :story, prefix: true
end

class Story < ActiveRecord::Base
  belongs_to :user
  delegate :name, to: :user, prefix: true
  
  has_many :awards
end

class User < ActiveRecord::Base
  has_many :stories
end
>> Award.find(1).story_user_name # => "komagata"

これは分かりやすくなってる!・・・のかな・・・。

starseekerのフィード見てて、

・・・えっ?

・・・え?・・・・え!?

・・・・・・・・・・・・・・・・。

RailsでDBのデータ変更はどこに書く? - komagataの続き。

コメント欄やFacebook、Twitterなどで色々教えていただきありがとうございます!

ちょっとFBの過去ログ見つからないんですが確か@kdmsnrさんが

「Rails Wayにseed.rbではdelete_allしろと書いてあった」

と仰ってました。

つまり、rake db:seedはproductionで毎回実行する。リエントラントに書くってことですな。

自分のプロジェクト(怖話)でも、今までInsertSeedMigrationみたいに書いてたのをrakeタスクとseedに移すように書きなおしてます。

どういう時に何が困ってたのかやっと自分の中でまとまってきたんですが、要は、

「最初の3人のユーザー」とか「最初の10件のPOST」とか「productionで後々増えていくデータの初期データ」をどうするのか?ってことでした。

User.delete_allしてUser.create!をseedに書くとproductionで他のUserが消えちゃうし。seedでif Rails.env.production?する?

Title only.

怖話Andyというユーザー名で登録しようとするとエラー。

Mysql2::Error - Duplicate entry 'Andy' for key 'index_users_on_name'

多分小文字のandyとぶつかってるんだろうな。

validates :name, uniqueness: trueしてるのに何故だろう。mysqlのcollationが変なのになってるのかなと確認してみるも問題無し。

uniquenessを確認している部分のSQLクエリをみてみると・・・

SELECT 1 AS one FROM `users` WHERE `users`.`name` = BINARY 'Andy' LIMIT 1

BINARY・・・だと・・・!?

deviseの設定でcase_insensitive_keysを設定しないとBINARYで確認しにいくようです。

# config/initializers/devise.rb:
config.case_insensitive_keys = [ :email, :name ]

ここにnameも追加してOK。configのコメントぐらいちゃんと読んどけってことですな。

starseeker

「usefulなライブラリを求めてるのにstarseekerを使ってない?」

「ふざけるな!」

「本日より貴様をスノーボール二等兵と呼ぶ」

「いい名前だろ、気に入ったか?」

成人男性の98%が利用してるというstarseeker.soに関して、残念ながら残りの2%に該当してしまった人(もしいるとすれば)にご説明させて頂きます。

starseekerとは

githubで自分がfollowしている人がstarを付けたrepositoryを毎朝メールしてくれるサービスです。

ただ僕はRSSもTwitterも見ない人のものは全く見ない代わりに見ると決めた人はひとつも漏らさず見るスタイル(情報収集スタイルについて - komagata)なので、starseekerもRSSフィードで見てます。

例えば、

moroさんがstarしてるreposは何か実用的でちょこっと便利なやつなんだろうなーとか

junoさんがstarしたのは、俺が知らないなんかおしゃれなgemとかなんだろう、とか

kenchanさんはすごくエッジなライブラリを見つけててすごいな、とか

全く知らなかったclojureを始めた時も、clojureの有名な人をfollowしとけばそこから直ぐに良い人が見つかって広がりました。

ビジネスマンが日経読んでないと上司に怒られる・・・みたいな。これが無い生活は考えられません。

あと、starseeker.so自体もruby2.0.0-p0, rails4beta1, pumaでソースがとても綺麗で参考になりました。

まあ、控えめに言って 神サービス ・・・ ですよね。

#263 Client Side Validations - RailsCasts

modelに定義したvalidationルールを使ってclient sideでもjsでvalidateしてくれるclient_side_validationsは糞便利なんですが、hiddenな要素はvalidateできない。

例えば、user_idがhiddenであって、特定のユーザーをブロックしたい時にはhidden要素もclient_side_validationsでvalidateしたい。

jsを2行書けば済むことなんですが、今後もありそうなのでgemにしました。

komagata/client_side_validations-with_hidden · GitHub
# Gemfile:
gem 'client_side_validations-with_hidden'
// app/assets/javascripts/application.js:
//= require rails.validations
//= require rails.validations.with_hidden

productionのデータ変更処理をmigrationに書くとrails_best_practicesに怒られる。

Rails Best Practices | Isolating Seed Data

怖話のコードで言えば下記の様なもの。

# encoding: utf-8                                                                        
class InsertSeedToSound < ActiveRecord::Migration
  def up
    Sound.create!(id: 1, name: "鳥の鳴き声")
    Sound.create!(id: 2, name: "犬の鳴き声")
    Sound.create!(id: 3, name: "水滴")
    Sound.create!(id: 4, name: "カエルの鳴き声")
    Sound.create!(id: 5, name: "ラジオのチューニング")
  end
    
  def down
    Sound.delete_all
  end
end

僕はmigrationに書いちゃってるけどみんなさんはどうやってますか?

seed.rbに書けっていうけどrake db:seedってリエントラントに書くもの?最初の一回だけじゃないの?

それとも、productionの状態に合わせて過去のmigrationをまとめてseed.rbをそれに合わせて書きなおすみたいなことするのかな?

ちょっと周りのrubyist2名ぐらいに聞いた感じ結論が出なかったので「ふつうこうだよ」っていうのを知ってる方がいたら教えていただけるとありがたいです!(@komagata

追記:

RailsでDBのデータ変更はどこにかく?〜真相編〜 - komagataのブログ

jenkinsのlingr-pluginを使おうとして挫折したメモ。ローカルに最小限のjenkinsをセットアップし、echo Helloするだけのjobを作って試してみました。

lingr appのapp_keyを得る

% irb -rdigest/sha1
>> Digest::SHA1.hexdigest('key' + 'secret')
=> "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

Global Lingr SettingsにUserName, Password, AppKey, Roomを設定する。(これRoomにパスワードかかってる場合はどうなるんだろう?)

Build Nowしてみると、

app_keyが無いって言われちゃう。

lingr-pluginをデバッグしてみようと思い、公式reposからcloneしてきてbuildしようと試みる。

% cit clone git://github.com/jenkinsci/lingr-plugin.git
% cd lingr-plugin
% mvn test
[INFO] Scanning for projects...
[WARNING] 
[WARNING] Some problems were encountered while building the effective model for org.jenkins-ci.plugins:lingr-plugin:hpi:0.2-SNAPSHOT
[WARNING] 'build.plugins.plugin.version' for com.cloudbees:maven-license-plugin is missing. @ org.jenkins-ci.plugins:plugin:1.420, /Users/komagata/.m2/repository/org/jenkins-ci/plugins/plugin/1.420/plugin-1.420.pom, line 191, column 15
[WARNING] 
[WARNING] It is highly recommended to fix these problems because they threaten the stability of your build.
[WARNING] 
[WARNING] For this reason, future Maven versions might no longer support building such malformed projects.
[WARNING] 
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building lingr-plugin 0.2-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[WARNING] The POM for org.yoshiori.lingr:lingr-bot:jar:0.1 is missing, no dependency information available
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.782s
[INFO] Finished at: Sun Feb 24 20:36:52 JST 2013
[INFO] Final Memory: 9M/81M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal on project lingr-plugin: Could not resolve dependencies for project org.jenkins-ci.plugins:lingr-plugin:hpi:0.2-SNAPSHOT: Failure to find org.yoshiori.lingr:lingr-bot:jar:0.1 in http://maven.jenkins-ci.org/content/groups/artifacts/ was cached in the local repository, resolution will not be reattempted until the update interval of maven.jenkins-ci.org has elapsed or updates are forced -> [Help 1]
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/DependencyResolutionException

org.yoshiori.lingrのlingr-botが取れないみたいです。lingr-botの方も自前でbuildして、mvn install:install-fileで入れてみてからbuildしても駄目。(色々足りないエラーが出る)

とりあえずmavenを初めて使った俺のjavaスキルじゃ疲れたので一旦休憩しまーす。

ところでmavenって「めいぶん?」「めいゔぁん?」