ruby

preloadがうまくいかないときに何とかするbulk_loaderというライブラリを作ってみた

github.com というやつが先々週のgithub trendで流行っていたんですが、もっとうまく書けそう、という気がしたので書いてみました。 (GraphQL使ってないので同じ用途に使えるかは今のところ不明ですが。 # app/models/post.rb class Post < ApplicationRecor…

bundle update 2016-01-25

activerecord-import v0.11.0 https://github.com/zdennis/activerecord-import/compare/v0.10.0...c0a4393a AR 5.0 betaまわりの対応を進めているもよう。ただテスト一部通ってないのでまだ微妙かもしれない。 capistrano-rails v1.1.6 https://github.com/…

rubocopがもっさりするときは除外ディレクトリを見直してみるとよいかもしれない

前のエントリで書いたrubocopがもっさりする問題を調べてみると、どうやら走査する必要のないディレクトリのファイルまでチェックしてしまっていて非常に遅くなっているのが原因だったようだ。なお、rubocopは**/*で終わる文字列のパターンをディレクトリを…

guard-rubocopでsystem経由の呼出しを止めると快適になった

github.com guard-rubocopの中身を見たらsystemで呼びだしていたので、直接Rubocop::CLIを呼びだして起動するようにしてみたら爆速になって快適になりました。 もっさりするのでテストのあとにrubocopを実行するようにしていたけど、これなら先に実行しても…

bundle update 2016-01-13

aasm v4.7.0 https://github.com/aasm/aasm/compare/v4.5.1...v4.7.0#files_bucket 新しくhookポイントが追加されている。 全イベントの前後やTransactionの前後にイベントが仕込めるようになったもよう。 カラム名が存在しないやつに設定してしまったときの…

Unicornでslow restart

Unicornの同時接続数がわりと少ないのに気づいたので、えいやとworker_processesを増やしたら今度はdeploy時にちょっと詰まり気味になってしまった。これは、deployのタイミングで重いシステムコールであるforkを連発するため、と思われる。そこで、Startlet…

dalliはfork safeか?

ふと、dalliがunicornなどのmulti processで動作するアプリケーションで動かしたときにコネクションを張りなおす処理をしないといけないか気になったので、調べてみた。 gist8284358これを実行してみると、 true 1 I, [2014-01-07T00:27:41.396287 #9290] IN…

rrails v1.0.0 released.

以前公開した、rails/rakeコマンドを超早くするrrailsですが、 http://d.hatena.ne.jp/walf443/20120427/1335482420あれから、色々な方に使っていただいているようで、パッチをいくつかもらったりしてupdateしたりしています。最近quark-zjuさんという方から…

適度に実行時間を抑制するrate_throttle

cronなどで統計処理のSQLをたくさん投げたりするときに、mysqlにあまり負荷をかけたくないので、適度にsleepを挟みながら実行させる、という処理を書くときに、perlだと、Sub::Throttleというid:kazuhookuさんのライブラリを使っていたのですが、rubyで同様…

fork時のrand()の挙動

perlでforkしたときに、srand呼ばないと親プロセスとseedの値が同じになってしまうので、子プロセスの間でrand値が変わらなくてハマる、という経験があったのだけど、rubyの場合だとそのようなことはないようだ。 # perl use strict; use warnings; warn ran…

rackのアクセスログをfluentdへ投げるミドルウェア

railsのアクセスログは、とても機械的に解析しづらく、運用するにはあまりよろしくない。そこで、Rack::CommonLoggerを使ってアクセスログを別途とったりしようとしていたのですが、(一般的にはNew Rericとかをつかうのが普通なんでしょうか?) ログのローテ…

UNIXSocketに対応してないライブラリを無理矢理対応させる

プロトコルは同じなので、既にあるクライアントライブラリを使いたいのだけれど、そのクライアントライブラリが想定しているサーバーは、unixsocketには対応していない場合、クライアントライブラリにUnixSocketに対応させるpatchを送ってもacceptはされない…

railsコマンドの実行を超早くするrrails

最近はお仕事で久々にがっつりrubyを書いてます。rails難しいです。それはさておき、railsコマンドの実行が遅いのがつらいので、色々探していたら、jugyoさんのrails-shを見つけました。rails-shはscalaのsbtとかみたいに、railsを読みこみ済みの環境を起動…

libdrizzleのruby拡張ライブラリ

http://d.hatena.ne.jp/tokuhirom/20090612/1244764189ちょっと面白そうだったので、軽く調べた感じだと今のところなさそうだったので、上でやってることができるぐらいに作ってみた。ちょっと時間があまりなくてまだベンチマークとかはとったりできてない。…

第7回Gotanda.rb

もう何回目か数えるのもめんどくさくなってきましたが、今日もひたすら前回の続きをしてました。Rackの上で書いていると、 def action return not_found if cond1 return not_found if cond2 return not_found if cond3 [ 200, { 'Content-Type' => 'text/pl…

YARVの気持ちに触れる方法

ふとYARVの気持にふれてみようと思ったんですが、どうやるんだったかよく忘れてしまうのでメモ。 yoshimi% ruby -e 'puts RubyVM::InstructionSequence.compile("(0..100).each {|i| }").disasm' == disasm: <RubyVM::InstructionSequence:<compiled>@<compiled>>========== == catch table | catch type: brea</compiled></rubyvm::instructionsequence:<compiled>…

実行しているrubyインタプリタを使って別のrubyスクリプトを実行する

ベンチマークをまとめて走らせるプログラムなどを書いているようなときは、 system('/usr/bin/ruby some_script.rb')とか書きがちなのですが、 /usr/bin/rubyと固定で書いてると、 別のところにある1.9.1とかでふと実行してしようと思ったときにスクリプトを…

クラス内で使いたい関数を明示的にincludeできるようにする

rubyで次のようなコードはわりとよくあると思います。 # some/utils.rb module Utils module_function def html_escape str # ... end def html_unescape str # ... end end # some/more_utils module MoreUtils module_function def some_func end end # so…

nestした構造のprocを作る

# ok. bl1 = proc { p "called!!" } #=> #<Proc:0x00636a14@(irb):1> bl2 = proc { [1, 2].each(&bl1) } #=> #<Proc:0x00633788@(irb):2> bl2.call "called!!" "called!!" #=> [1, 2] ふつうは上記のような挙動をするが、 bl = proc { p "called!!" } #=> #<Proc:0x006369b0@(irb):1> bl = proc { [1, 2].each(&bl) } #=> #</proc:0x006369b0@(irb):1></proc:0x00633788@(irb):2></proc:0x00636a14@(irb):1>

札幌Ruby会議01にいってきた

jpmobileでいつもパッチなどを送らせていただいてるid:darashiさんや、wassr上でよくやりとりしてるid:h-sbtさんなど、札幌の面々はいろいろふだんからつきあいがあり、実際に会いたかったので、札幌にいってきた。wassrでの位置情報の地図はこんな感じ以下…

gemのパッケージを展開する

gemをインストールはしたくないけど、展開して中身を見たいときのやりかた コマンドラインからやるなら以下のようにすれば一応展開できてるっぽい。 mkdir classx-0.0.4 tar xvf classx-0.0.4.gem -C classx-0.0.4 cd classx-0.0.4 tar xvzf data.tar.gz意外…

インスタンスからdefaultを呼ぶ

http://d.hatena.ne.jp/fbis/20080918/1221717538metaクラスからたどって直接呼び出した方がわかりやすいんではないかと思ったりしました。 package Foo; use Moose; has hoge => ( is => 'rw', lazy => 1, default => sub { 100 }, ); __PACKAGE__->meta->m…

継承可能なクラス属性

Rubyのクラス属性まわりは個人的には結構ややこしいと思っています。クラスに保存できるデータには以下のようなものがあります。 クラス変数 クラスローカル変数( クラスインスタンス変数? ) メソッド クラス変数 @@variableのように表記します。以下1.8での…

JSONからIRCにポストするやつ

以前 http://d.hatena.ne.jp/walf443/20080523/1211497763 でGithubのHookを受けてIRCにポストしたりするやつを紹介したのですが、Github以外の場合からも同じコネクションを叩きたかったりしたので、その部分を分離してJSONから叩けるようにしてみました。c…

ClassX::Role::Logger

ClassXなクラスにこいつをincludeしてやると、標準ライブラリのloggerがattributeとして使えるようになります。 require 'classx/role/logger' class YourApp include ClassX extends ClassX::Commandable include ClassX::Role::Logger def run self.logger…

ClassXがclassからmoduleになりました

東京Ruby会議01で発表したところ、ClassXがclassじゃなくてmoduleの方が便利じゃね?とか、使いたいけど、classになってるばかりに使えなさそう。と言う声が多かったので、どうせ誰も使ってないよね?ということで変えてしまいまいた。つまりこういうふうに使…

ClassX::Commandableで簡単CLIアプリ

東京Ruby会議の懇親会で一番反響が良かったのはClassX::Commandableだったということでブログでもあたらめて紹介しておく。MooseにはMooseX::GetoptとかMooseX::App::Cmdという便利なモジュールがあったのでMooseX::GetoptをパクってClassX::Commandableとい…

東京Ruby会議01で発表しました

Akasaka.rbの活動の一環として東京Ruby会議01でClassXについて発表してきました。スライドは http://github.com/walf443/classx/tree/master%2Fdoc%2FTokyoRubyKaigi01_classX.pdf?raw=trueからDLできます。発表すると、 http://github.com/walf443/classx/t…

ClassX::Declare

東京Ruby会議01で高井さんにどうよといわれたやつ。 http://github.com/walf443/classx/tree/28f1694a54968cb56c674fe62a6f2b6ad35a46b9/lib/classx/declare.rb↑のやつには使うとどんな風にできるかの説明がなかったので書いておきます。http://gist.github.…

RubyCocoaでFluent Interfaceはどうか

http://subtech.g.hatena.ne.jp/secondlife/20080709/1215530958のFluent InterfaceはRubyCocoaの呼びだしで使えたらうれしいかもと思った。今はobjc_sendをつかって、 NSTimer.objc_send(:scheduledTimerWithTimeInterval, 120,- :target, self, :selector,…