Ruby

#shibuyarb でRailsのN+1 countクエリについてLTしました

追記: 2017/09/06 少しAPIが冗長なもののActiveRecordへのモンキーパッチが少ないバージョン activerecord-precounter というのを作りました。こちらの方がバグりにくいはずなので、現在はactiverecord-precounterの方を使うことが推奨されます。 github.com…

Ripperによるhamlのattributeパースの話

Hamlのパーサぶっ壊れてる問題 本家のHamlは以下の入力を与えるとSyntaxErrorになる。 %div{ foo: "}" } これはHamlが単に{と}の数だけ合わせてパースしているからである。 *1 通常この問題を解決するには字句解析器を使い、現在パースしているのが何のトー…

Hamlit v1.0.0をリリースしました

3月末に、Hamlit v0.1.0を作りSlimやErubisより高速なHaml実装「Hamlit」をリリースしましたという記事を書いた。 haml-specを通しているのでHamlと高い互換性と持っていてかつ速いという宣言をしたものの、実際にリリースしてみると随所からバグ報告が上が…

Slimより高速なHaml実装「Hamlit」をリリースしました

slim-template/slimのcompiled benchでオリジナルのhamlに比べ8倍高速に動作するhaml実装をリリースしました。 github.com なぜ高速なHaml実装を作ったのか 個人的にhamlのシンタックスのほうが好きなので、「hamlは遅いからslimを使う」みたいな人を減らし…

RubyistのためのGolangメタプログラミング

Goでは、reflectパッケージを使うとリフレクションを行うことができる。 そこで、以下のことを任意のstringによる動的な指定で行うことができるかを調べた。 send (関数, メソッド呼び出し) define_method (関数, メソッドの定義) const_get (任意の型のオブ…

RubyとGoの思想を比較して思うこと

僕は主にRubyとGoを書く。この2つを使っていると、「(Rubyに比べて)Go辛いなあ」と思うことがあるのだが、なんで辛いのかはよくわかってなかった。 最近仕事にGoを使い始めたRubyistが社内ブログでGoのPros/Consを書いていたんだけど、そのConsも自分が辛…

Railsでデバイスの判定をするのに便利なgemを作った

rack-user_agent を作った rack-user_agentという、User-Agentに応じていろいろな判定ができるメソッドを生やすRack::Request拡張を作った。 tagomorisさんのWootheeを使ってRack middlewareでUser-Agentをパースしておいて、 その結果に応じてrequestから簡…

Rack applicationのプロファイリングにはrack-lineprofが便利

RubyKaigi 2014行った。良い発表がいろいろ聞けたんだけど、最近ISUCONに向けてwebアプリのチューニングに興味があったので特にfinal keynoteが興味深かった。 その中で紹介されていたtmm1/rblineprofが行ごとの実行時間を表示してくれるのでとても便利そう…

ConoHaのVPSの初期設定をChef Soloでやってみた

普段はさくらのVPSに普通に手でソフトウェアをインストールしてWebアプリを動かしていたんだけど、 さすがにそろそろサーバーの状態管理を自動化したくなったのと、単純に面白そうなのでChefによるサーバー管理に挑戦することにした。 それで、気軽に壊して…

ActiveRecordでN+1 countクエリを潰す方法、あるいはactiverecord-count_loaderの使い方

追記:activerecord-count_loaderはactiverecord-precountに変わりました。使い方はこちら。 ActiveRecordでassociationを読むためにN+1クエリが出てしまった場合、 includesなどのメソッドを利用することで発行されるクエリの数を減らすことができる。*1 と…

Karabinerの設定を楽に書けるやつ作った

経緯 いろいろ思うところあってエディタを乗り換えようと思ったんだけど、キーバインドを異常にカスタマイズしているおかげで、みんなが使うはずの基本的なキーバインドが衝突して押せないという事態が発生し、Karabinerの設定を大きく変える必要が出てきた…

vim-tagsで快適Rubyコードリーディング

ctagsでtagsというファイルを生成すると、vimでカーソル位置にあるクラスやメソッドの定義に簡単にジャンプすることができます。 自分で定義したものだけでなく、Gemfile.lockにある依存ライブラリにもジャンプでき、非常に便利です。 本記事ではvim-tags(ct…