読者です 読者をやめる 読者になる 読者になる

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,…

ClassX::ValidateでHashをチェックする

http://d.hatena.ne.jp/rubikitch/20080710/1215641240メソッドの引数にHashをとるのはいっぱいあるときでもきれいに書けるので個人的にはあまり嫌いではない。classXを使うとHashのチェックが柔軟にできるよというおはなし。 require 'classx/validate' cla…

メソッドの渡すHashもきっちりチェックしたい

http://d.hatena.ne.jp/walf443/20080524/1211650071前の記事でコンストラクタに渡せるHashのキーと値を宣言的に書くことで見通しが良くなると書きましたが、コンストラクタに限らず、メソッドにオプションとして渡すHashもきっちりチェックしたいはず。とい…

デフォルトのオプションと:isおよび:requiredオプションの廃止

classXで、Mooseをなぞるのをやめてアクセサの宣言のデフォルトの設定を変更しました。 :writableオプションを指定しない限りは、アクセサはwriterをpublicにしないようになりました。これは、単にreaderを定義する時は、オプションを明示的に定義する必要は…

メソッドの渡すHashもきっちりチェックしたい

http://d.hatena.ne.jp/walf443/20080524/1211650071前の記事でコンストラクタに渡せるHashのキーと値を宣言的に書くことで見通しが良くなると書きましたが、コンストラクタに限らず、メソッドにオプションとして渡すHashもきっちりチェックしたいはず。とい…

Rack::Auth::IPをリリースしました

GitHubPostRecieverでGitHub以外からのpostは受け付けたくなかったのでRackでIPのアクセス制限ができるRack::Auth::IPというミドルウェアを作ってみました。rackupのファイルの中で、 require 'rack/auth/ip' # ローカルネットワークにアクセスを制限する us…

classXを使うと何がうれしいか

http://d.hatena.ne.jp/walf443/20080520/1211239672で触れた宣言的なアクセサをGitHubPostRecieverに試しに適用してみた + has :host, :is => :ro, :kind_of => String, :required => true + has :port, :is => :ro, :kind_of => Integer, :default => 6667…

Commit Bot for GitHub

GitHubでは、プロジェクトのコミットをfollowして興味のあるプロジェクトのコミットのみをまとめてみれるのですが、毎日それらを全部見るのはなかなか大変だったりします。興味のあるプロジェクトの場合、割とfreenodeにIRCのチャンネルがあって、そこにjoin…

Mooseっぽい柔軟なアクセサ

最近perl界隈で話題のMooseをちょくちょく弄ってみたりしているのですが、宣言的なアクセサは見通しも良くなるし、なかなか良いなと思ったんでRubyでもそれっぽく動作するやつを書いてみました。Mooseっぽくコンストラクタも勝手に用意するようにしてみたの…

ブロックの解釈の仕方をカスタマイズする

DSLみたいなものを作ろうとしてると、どうしてもブロックを俺俺文法で解釈させたくなって調べてみた。ParseTreeというライブラリを使うとRubyのコードをS式に変換することが出来る。 S式に変換できるのは、モジュール単位、モジュールのメソッド単位、文字列…

rspec-fixutre 0.0.1をリリースしました

先日言っていた機能はまだ足してはないのですが、一通り個人的に使いたい機能を動くようにして、テストも充実させたのでgemにしました。 gem install rspec-fixtureでインストールできます。http://coderepos.org/share/changeset/6563で、単純なテストがい…

RSpecをTest::Baseっぽく使う

RSpecでテストを書いていて単純なテストなんだけど、いろいろなデータで検証させたいといった場合に毎度毎度exampleを書くのがめんどくさいと思い、こんな感じでTest::Baseっぽく使えるやつを作ってみた。 describe Point, "detect_location" do with_fixtur…

時間の差から簡単に単位変換できるライブラリDateTime::Smartをリリースしました

この前、誕生日を迎えたのですが、自分が何歳になったのかいまいち思い出せなくて、rubyで計算させようとしたのですが、時刻の差から年を出すのはそれほど簡単ではなかったので、ライブラリにしました。なにやらruby-listでもちょうどその話題があがっていた…

sortの例

http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/43494を見て。aとかbとかという変数名が例に載ってるのは初心者には優しくないと思った。 %w(foooo barr baz).sort {|one, anothor| one.size <=> anothor.size } #=> ["baz", "barr", "foooo"…

ActiveResourceを少し触ってみた

TwitterのAPIでRailsのActive Resouceを試してみる http://blog.tkmr.org/tatsuya/show/318-twitter-api-rails-active-resouceの影響を受けてActiveResourceを使ってみた。上の記事と合わせて思ったことをつらつらと書きます。多くの場合書くクラスの設定は…

Kernel#dp

Rubyレシピブックのレシピ8.1をみて--debugオプションをRubyインタプリタの起動時につけると$DEBUGがtrueになるというのを知って、Kernel#dpとかKernle#dppとかKernel#dyとかが標準であれば良いのにと思った。こんな感じ。 module Kernel def dp *args p(*ar…

Rubyクックブック

タイトル的にはレシピ本と同じようにもっとライトな感じの本かと思ったら案外そうではなくて非常に内容の濃い本だった。特に内容が今までに出版されている本とはほとんど被ってなくてこれは買いの本だと思った。内容的にはRHGを除いては現在出ている日本語の…

Java2Ruby本

読んだ。なかなか熱い本だった。Rubyより、というよりはJavaをほとんど知らない自分にとっては自分のRubyに対して感じているRubyの良さが率直に書いてあって読んでいて気持ちよかった。例えば、Javaの現在の開発ではオープンソースの様々なツールやフレーム…

OptionParserまとめ

あまりコマンドラインを処理するプログラムを書かない…というよりはオプションが色々あるような立派なコマンドラインアプリを今まであまり書いてなかったのでOptionParserの使い方に苦労したのでまとめておく。柔軟で慣れると楽だけど,暗黙的なところを理解…

Ruby会議

Webが重かったので店頭に逝ったらすんなりチケットとれた。家の近くにローソンがあってよかった…。

Regexp.compileはエスケープまではしてくれないのね…

久々にRubyを書いていてハマった。 date = "2007/04/13 12:00:00 +9:00" #=> "2007/04/13 12:00:00 +9:00" %r{#{date}}.match date #=> nil %r{#{Regexp.escape(date)}}.match date #=> #<MatchData:0x10844bc> %r{#{date}} #=> /2007\/04\/13 12:00:00 +9:00/ どうやらスラッシュ</matchdata:0x10844bc>…

RSpecのソースコードの手がかり

本格的にRSpecを使う場合,Test::Unitのssert_~みたいなメソッドを追加したくなることもあるでしょう。そういった際にどういったところを読めばよいかの手がかりのようなものを示したいと思います。*1まず,テスト自体の実行の流れの追い方。lib/context/run…