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のコメントぐらいちゃんと読んどけってことですな。
「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_hiddenproductionのデータ変更処理を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)
追記:
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って「めいぶん?」「めいゔぁん?」
Githubも使ってたというAWSベースのPaaSの老舗Engine Yard Cloudを試してみました。
Engine Yard CloudはAWSの東京リージョンもサポートし、最初の500時間無料とのことで今後複数台構成を考えている怖話の移行先として動くかどうかデプロイしてみます。
Application作成。githubのreposを直接入れることができるのは嬉しい。
deployのためのキーが発行されます。これをgithubや自分のgit repos serverに登録してやれば勝手に取ってきてdeployしてくれると。
怖話のgithub reposのDeploy Keysにさっきのキーを登録。
Environmentの作成。Application Serverが選べるのか。怖話はunicornなので選択。rubyもgemもデフォルトでOK。
無料お試し中は東京リージョンは選べないそうです。残念。MySQLのバージョンを選んで、へーDBバックアップやインスタンスのスナップショットもデフォルトで取ってくれるのか。
一番気になるインスタンス構成の選択画面。
- Single Instance
- 1台でアプリもDBも賄う。
- Staging Configuration
- appサーバー2台とDBサーバー1台。
- Production Configuration
- appサーバー3台とDBサーバー2台(master and slave)
- Custom Configuration
- カスタム。(お試し中は派手にできないらしい)
appサーバーは良い感じにbalanceしてくれるらしい。しかしDBサーバーはどうなってるんだろう。やっぱりアプリ内で明示的にmaster, slave分けてアクセスするんだよね?
とりあえずStaging configurationで。
後はただ起動処理を眺めます。ログを見るとchefで色々ガーっとやってくれてるみたいです。
rake db:migrateのところをrake db:seedにして怖話のseedを実行。そして割り当てられた仮のドメインにアクセスしてみると。
おお、特に何もいじってないのに怖話のproductionが動いた!凄いぞEYC!
鬼サポート
実は初めてdeployした時は500番が出て動きませんでした。
右下にあるサポートチャットに、
"I deployed an app. But dosen't work."
とか物凄い抽象的な助けを求めたら、
「railsアプリにエラーがあるのかもしれない。ここからsshでログインできるから"/path-to/production.log"にあるログを見てみたらどうだい」
みたいなこと言われたので見てみたら、Engin Yard Cloudとか関係無く、普通に怖話のproduction(のseedのコード)がバグってただけでした。修正してアップし直したら動きました。
多分あっちは昼間なんだろうけど、夜の2時頃、お酒を飲みながら適当にインフラを弄ってた俺としては助けを求めた瞬間に的確に帰ってきたサポート体制に感動しました。(飲酒も手伝って)
logentriesのサポートチャットを使った時も同じような体験をしましたが、技術的にちゃんとわかってるサポートが瞬時に答えてくれるってのは今時のサービスでは当たり前なんでしょうか?ありがたすぎるぞ。
感想
VPSで動かしてた怖話のproductionが何の変更も無しに動いたのはびっくり。あと金額も俺の超概算だとAWS直に10〜20%ぐらい載っけるぐらいの思ってたより安い価格設定。
自分の用途としてはある程度規模のサービスで、しっかりした会社からの受託開発を受けたら本気で検討する価値ありだなと思いました。
なんだかんだ行っても複数台構成には色々と面倒がついてきますし(デプロイ、監視、ロギング、バックアップ等)、何よりもAWSで作りこんだら引き継ぎが超面倒そう。リアルに想像すると「EC2で作りこんであの会社に引き継いだら運用できるのかな・・・」って思う時がありますが、EYCなら引き継げそう。特に鬼サポートはちゃんとした会社にとってはありがたいと思います。ググレカスとか言われないですし。

