一分一秒真剣勝負!

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

RubyKaigi2023

RubyKaigi2023に行ってきました。 内容に関しては例年通り素晴らしいものでしたが、今回は英語力不足を強く感じました。 初日のドリンクアップで台湾の人と話したのですが、英語で喋るのが全く出来ずに半端な会話で終わってしまいました。 日本語をそこそこ勉強されている方だったのである程度のコミュニケーションは取れたけど、英語の方が自信がある人だったので、自分に英語力があればもっと話せたな・・と。 毎回毎回「来年までには英語力上げるぞ」と思っていても、結局変化がほぼ無いまま参加するRubyKaigiだったけど、今回はかなり心にきてます。

rubykaigi.org

RubyKaigi2019

rubykaigi.org

2ヶ月近く前なので今になって書くのもどうかと思うけどRubyKaigi行ってきました。今年は3日間開催で4セッションということもあり、見たいけど見られないセッションがたくさんありました。懇親会で10年以上前にLingrでチャットした江島健太郎さんが偶然隣に座っていたのが面白体験でした。その場の話の流れ等もあってあまり話せなかったけど、Lingr作った時のエピソードとか色々聞いてみたかったな。

Rubyの強さ

RubyKaigiに参加した大抵のエンジニアにありがちな変化がコードを書くことへのモチベーション向上だ。凄い人たちの凄いセッションを連続して見ていると意識が高まるからだと思う。 それは今年も同じだったけど、RubyKaigi2019に参加してあらためて感じたのはコミュニティの強さ。これがあるからRubyは強いんだなと感じました。 毎年死んだと言われるRubyだけど、今も新しい地域Rubyやその他のコミュニティが次々と立ち上がってる。Rubyのコミュニティが生き続ける限りRubyは死なないのだろうと思えたRubyKaigiだった。

エンジニアのファッション

そういえばRubyKaigi後に男子エンジニアのファッションがダサいという話でTwitterがやや荒れていたけど、それは女子エンジニアが増えたということなので自分はいいことだな〜と生温い目で見ていました。

大江戸Ruby会議05に行ってきた

大江戸Ruby会議05に行ってきました。 午前中はRubyのI/Oの話(実装の話です)から始まって、CとかGoのソースコードばかり出てくるLTが続いたので非常にasakura.rbぽいなーと思いつつ聞いてました。 午後もやっぱり濃い内容だったけど、TwitterのTLでは江渡浩一郎さんの「共創コミュニティのデザイン」が一番沸いてた感じありますね。パタン・ランゲージが建築業界で衰退していった理由のくだりなどは想うところありました。 あと、山崎さんのNinjaTalkディスプレイ広告領域カオスマップが出てきた時違和感を感じたwあれっ?って。RubyKaigiでアレを見るとは思わなかった。そういえばスケールアウトさんってRubyな会社だよなって気付いたけど。

Ginza.rb 第8回 Gemfileみせっこ!みんなどんなの使ってます?に先月行ってきた

2月に参加したGinza.rb第8回目についてのエントリー。 書いたのはいいけど、POSTし忘れてました。 というわけでGinza.rbで紹介したgemと紹介し切れなかったgemをまとめました。 全部ではないですが、これってものをピックアップしてます。

Ginza.rbで紹介したgem

seed-fu

seed-fuはseedデータの管理を行うためのgemです。

これに乗り換えたキッカケはRails4でrake db:fixturs:loadを実行してみたらFIXTURES_PATHの指定時にdeprecatedが出た事でした。 (マスターデータをfixtruesでロードしたかった)

Using FIXTURES_PATH env variable is deprecated, 
please use ActiveRecord::Tasks::DatabaseTasks.fixtures_path = '/path/to/fixtures' instead.

FIXTURES_DIRは今まで通りにパラメータで指定できるのに、FIXTURES_PATHは何故かActiveRecord::Tasks::DatabaseTasks.fixtures_pathで指定する方向になるようです。 これはキモいし、なんか不自然な変更なのでまた仕様が変わりそうな予感もする。ならseedでやろうかと思ったのだけど、

rake db:seed # rakeタスク
Rails.application.load_seed # コードで呼び出す場合

どちらもパラメータを受け取らない。実装を見ると、

# File railties/lib/rails/engine.rb, line 538
def load_seed
  seed_file = paths["db/seeds.rb"].existent.first
  load(seed_file) if seed_file
end

"db/seeds.rb"を決め打ちで読み込んでいるのでRailsのseedだとrake db:fixtures:loadの代わりに使う事はできなかった。そこで偶然見つけたのがseed-fuだった。

# rakeタスク
rake db:seed_fu FIXTURE_PATH=path/to/fixtures # パスを指定できる
rake db:seed_fu FILTER=users,articles # 読み込むseedデータを指定できる
# コードで呼び出す場合
SeedFu.seed(fixture_paths, filter) # rakeタスクと同様のオプションを指定可能

という感じでrailsのfixtures:loadとseedのいいとこ取りみたいなライブラリだったので使うことにしました。 パスが未指定の場合"#{Rails.root}/db/fixtures" と "#{Rails.root}/db/fixtures/#{Rails.env}"がデフォルトで設定されているので、環境ごとにseedデータを分けるのも簡単です。production環境のマスターにデータを追加したいなあって時も使えますね。

というわけでseed-fuオススメです。別のエントリーで使い方まとめようかな。

grape

RESTライクなAPIマイクロフレームワーク・・と書かれてますが、 要するにSinatraっぽいAPI専用のフレームワークで、活発に開発が行われています。 Grapeは単体で使用することもできますが、Railsと組み合わせることも可能です。 実際これで某サービスのAPIを実装しました。採用した決め手になったポイントは、

  • Railsのコントローラで作るより高速
  • 実装が読みやすい
  • HTTPリクエストメソッドにPATCHがある(Railsっぽい)
  • Railsと同居できる(ActiveRecordとか呼べる)
  • 最悪やっぱりRailsのコントローラにしようと思った時に、移行作業がそれほど重くなさそう

といったところで、非常に使いやすかったです。 これ流行ってほしいなー。

Ginza.rbで紹介しなかったgem

paper_trail

世代管理用ライブラリ。RailsCastsで紹介されている割には知名度が低い気がする。全く同じ機能をゴリゴリ書いていたプロダクトを思い出して、これを知ってたら工数減らせたなーとか思った。

pundit

権限管理ライブラリ。ポストcancan!最近流行りつつあるようだ。 cancanよりOOPぽく書ける。

まとめ

これぐらいですかね。全部個人的に流行ってほしいなと思ってるgemの紹介でした。

関連URL

Ginza.rb 第8回 Gemfileみせっこ!みんなどんなの使ってます? Ginza.rb 第8回 Gemfileみせっこ!みんなどんなの使ってます? を開催した

HerokuでBambooStackからCedarStackに移行する

Herokuでずっと更新していないアプリをruby2.0に上げようとしたのだが、Gemfileに「ruby "2.0"」と書いてもpushするとbundle installでエラーが出る。調べてみると過去にHeorkuで作ったアプリはBambooStack上で動いていて、使用出来るRubyのバージョンが古いなどなどが原因だった。
なので、Ruby2.0を使えるCedarStackに移行しようと思ったのだがBambooStackからCedarStackへの移行ツールなどは用意されておらず、CedarStackにするには新しくアプリを作るしかなかった。旧アプリ→新アプリへのデータ移行作業をすればいいかと考えたのだけど、BambooStackで作ったアプリのURLは「http://appname.heroku.com/」だったものがCedarStackだと「http://appname.herokuapp.com/」で作られるらしい。独自ドメインを設定していないので、URLが変わってしまう。これでは移行できない・・・と思ったが、アプリ名さえ同じであればheroku.comもherokuapp.comと同じIPを指してくれるので問題は無し。

というわけでまずDBのバックアップ。

bundle exec heroku db:pull sqlite://db/production.sqlite3 --app appname

ここで自分の環境ではエラーが出た。このエントリーを書いている時点ではRuby1.9.3以降でsqlite形式にデータを変換する時にバグがあるらしく、Ruby1.9.2以前のバージンでエクスポートしなくてはならない。(Macで開発している場合は「brew install apple-gcc42」でRuby1.9.2をコンパイルできるようになります。)

そして現在使っているHerokuドメイン"appname"をブラウザから別名にリネーム*1し、今まで使っていた"appname"でアプリを再作成します。

heroku create appname --stack cedar # アプリ削除からこのコマンド実行までに"appname"を取られたら作れなくなるので急いで作る

そしてバックアップしたDBを新アプリにインポート。

bundle exec appname db:push sqlite://db/production.sqlite3 --app appname

これでアクセスしてみて動作確認がとれれば旧アプリは削除してしまってOK。

ちょっと面倒ですね。ブラウザからクリックひとつでStackを移行できるツールがあったらいいのに。

*1:コマンドでもできます

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を使っているところは更新処理」だと判断しにくくなる点が不満ではあるなぁ。

RSenseが素晴らしい


RSense - The most useful development tools for Ruby

これを見てRSenseを導入したんだけど、凄くいい。ただ、ファイルをDLしたりシェルと.vimrcに設定を書いたりが面倒。せめてvimのプラグインの中にRSenseのパッケージも入れてくれたら環境構築が楽になるのだけど、ダメなんでしょうか。