perl

Minillaで複数のテストスイートを実行するようにする

今ちまちま書いてるRedisismというRedis向けのフレームワークでは、Redisとのコネクション周りとかクエリ投げたりするところのハンドリングを自前では持っていなくてほとんど同じインターフェースなので、RedisDBあるいはRedisに任せている。そうなると、Red…

fork時のrand()の挙動

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

複数サーバーでtail -fする

各サーバーへ入ってなんか状態を監視というのをやりたいことがあります。各サーバーのログファイルをtail -fとか。それだけだと、単にforkして何かコマンド実行させればよいだけ、だったりしますが、単にそうしてしまうと、標準出力などがメインのプロセスに…

memcachedのように使えるBloomFilter

YAPCでmalaさんの話を聞いていて、memcachedのようにお手軽に使えるbloom filterがあるとひょっとすると便利かもしれない、とふと思ったのでAnyEventつかって、Bloom::Fasterのwrapperを書いてみました。https://github.com/walf443/p5-bloomd-server以下の…

Test::Tester

以前テストライブラリのテストを書く際に、Test::Builder::Testerがつかえる、という記事を書いたが、Test::Builder::Testerは、テストの失敗の文字列を一字一句かえないように調整したりするのが、ダルいなぁ、というのがあったりして、もっとよいやつを探…

続 Test::TypeConstraints

http://d.hatena.ne.jp/walf443/20110704/1309738408 で公開した、Test::TypeConstraintsですが、反応をもとに、微調整してCPANへあげました。 type_is_a_okというメソッド名をtype_isaにしました Data::Validatorに依存せず、Mouse::Util::TypeConstraints…

local $var += 1の挙動

Test::TypeConstraintsのレビューをしてもらっていたときにid:gfxさんに教えてもらったのですが、 local $Test::Builder::Level += 2;としていたのですが、これは、「元々の$Test::Builder::Levelに2を足す」、という挙動にはならないです。そもそも、これは…

Test::TypeConstraints

ちょっと固めに書いておきたいところで、メソッドの戻り値の型をテストしておきたくて、Smart::Argsとかを使うのに慣れてくると、ArrayRef[Int]とかでテストできると楽だなぁと思ったので書いてみました。https://github.com/walf443/p5-test-type_constrain…

Skeleton::CoC

フレームワークにそってアプリケーションを開発していると、これを追加するには、このクラスとこのクラスを作って、ここにテンプレートを追加する、といったことがよくある。railsとかだとscript/generateとかあってテンプレートを元にファイルを自動生成で…

Cache::Pluggable

Cache::な名前空間を持つライブラリは、get/setなどのインターフェースがわりとそろえてあるのですが、ライブラリによって微妙に挙動が違ったりして、ちょっと別のライブラリを検証してみたり、とかが意外としづらいです。例えば、Cache::Memcached::Fastで…

dainamoを書きました

ちょっと前からdainamoというプロジェクトを始めました。元々各プロジェクトの雛形にgearman/schwartz/qudoのworkerのスクリプトがあり、そこから自動生成させて、微妙にカスタマイズしつつ、使っていたのでした。 しかし、その自動生成させたやつに微妙にバ…

ファイルが更新されたら勝手にspork -makeするやつ

自前のプレゼンツールを作ろうといつも思いつつ結局時間に追われてついついSporkを使ってしまっています。しょっちゅうファイル更新するたびにspork -make打つのもめんどくさいので、ちょっと書いてみました。最近地味にFilesys::Notify::Simple期です。 use…

gearman-top

以前書いたperlbal-topのgearman版があると便利なことがちょっとあるかもしれないということなので書いてみました。http://d.hatena.ne.jp/walf443/20100121/1264083979 ./gearman-top statusとかで数秒に1回admin portをたたいてstatusを実行して表示するの…

DBIx::Skinnyの動的なSQL生成の挙動を調べるREPL

そもそも悩むくらいならsearch_namedでいいんじゃね?という話はありますが、動的生成するようにしておく方が便利ということもまぁまぁあったりします。あと、なんだかんだでsearchは便利なのでよく使うんですが、細かいところでどう書くんだったけなー、とい…

Plack::Middleware::DoCoMoGUID

ドコモ向けのサイトを書いている場合に自分サイトのどのページでもiモードIDをとりたいというのはよくあることですが、 PlackのMiddlewareでやれそうかなと思いつつ、他に書いてる人がいなそうだったので書いてみました。http://github.com/walf443/p5-plack…

__PACKAGE__を使わない方がよいとき

一時期社内でbless {}, __PACKAGE__が流行っていて、このやり方は継承した際に問題があるので使わない方がよいんじゃないですかねということで問題になるケースをあげてみる。 package Foo; sub new { bless {}, shift; } sub call_foo { my $self = shift; …

DBIx::Skinny::ProxyTable

すっかりブログに書きわすれていたんですが、こんなの作りましたhttp://github.com/walf443/p5-dbix-skinny-proxy_table基本的にDBIx::Class::ProxyTableの使い勝手を踏まえつつ、 微妙にこうだったらよかったねーという部分を機能追加した感じになっていま…

perlbalのadmin portをtop風に見る

夜中にサーバーが重くなったりしたときとかにチャットで同僚と会話しながらサーバーの増強とかやってると、進行状況が不明になったりしがちでperlbalの割り振り状況をtop風に見れるのが欲しかったので書きました。一定時間ごとにadmin portに引数で渡したコ…

Re: DBIx::Skinny で update_or_create

http://d.hatena.ne.jp/magicalhat/20100121/1264076085より オマケとして、UPDATE じゃなくて INSERT した場合には、関連するレコードも更新しなくちゃ! とゆーパターンも想定して、DBIx::Class でも利用できる in_storage というメソッドもつけてみました…

DBIx::Skinny::Pager

DBIx::Skinnyで簡単に使えるpagerが実装されていない主な理由は、 http://perl-users.jp/articles/advent-calendar/2009/dbix-skinny/19.html とかに書いているんですが、管理画面にありがちな データを様々な条件で検索するページみたいなのを書くときにはS…

perlapiのctags用ファイルを作るスクリプト

あけましておめでとうございます。今年もよろしくおねがいします。正月ということでふだんなかなかできないことをやろうかなということでXS勉強中です。XSにはあまり詳しくないのでCPANにある実例を色々読んだりしてるとperldoc引きまくりな刑になるわけです…

local::libと.modulebuildrc

自宅の開発マシン(MacBook)と自宅サーバー(色々)のCPANはlocal::libで インストールしたのを1つのgitリポジトリにしているのですが、 .modulebuildrcのpathがフルパスになっていてハマったのでいちおうメモ。 diff --git a/.modulebuildrc b/.modulebuildrc …

MogileFS::Client::WithCacheを書いた

MogileFS::Clientは通常、get_pathsで得られた結果をperlbal側にX-REPROX-CACHE-FORでキャッシュさせることでtracker(MySQL)へのアクセスを抑えるように運用するのが一般的ですが、たまにアプリ内でget_file_dataしてそれをもとに微妙にカスタマイズして画像…

彼氏がtmt.vimを使ってなかった。別れたい

Text::MicroTemplateで書かれているHTMLのテンプレを素のvimのシンタックスハイライトを有効にした状態で開いていると、ひどい状態になってしまいます。というわけで、eruby.vimを参考にしつつid:mikihoshiが書いていたのを、色々細々調整してみてだいたい変…

Testライブラリのテストを書く

テストライブラリを書くときに local Test::More::Level += 1 を忘れるとテストがこけたときに呼び出し元がおかしくてどのテストを直せばよいかわからないということになってしまいます。ということでしっかりそういうテストも書いておきたいですね。Test::B…

インスタンスから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…

MogileFSを読んでみる

brad productsはMemcachedに代表されるように非常に設計が素朴で、それでいて高性能ということで興味がわいたのでmogilefsdを中心にMogileFSのソースコードを読んでみました。まず、http://code.sixapart.com/svn/mogilefs/から最新版のコードをチェックアウ…

Array#eachっぽいのを実装

プロトタイプ宣言の練習にRubyのeachを書いてみた。 sub myeach(&@) { my ($block, @array) = @_; for my $item (@array) { &$block($item); } return [@array] } 実行結果は以下の通り、 pirl @> myeach { my $item = shift; printf("%d\n", $item * $item)…

今日のラクダ 9章 データ構造

昨日まとめきれなかったものをまとめておく。 9章 9.1.5 よくある誤り p.318 $AoA[$i] = [@array] # 最も安全、場合によっては最も早い $AoA[$i] = \@array; # 速いが,リスキーである(配列がmy宣言されていなければならない) @{$AoA[$i] = @array; # ちょっ…

今日のラクダ 6章 サブルーチン,8章 リファレンス

今回はかなり重要な情報が多し。 6章 サブルーチン 6.1 p.252 &$subref(LIST) # 間接呼び出しでは&を省略できない $subref->(LIST) # (ただし間に->を置く場合を除く) 基本的には$subref->(LIST)を使いそう。 6.4 プロトタイプ p.263 プロトタイプ宣言に関し…