2008年 05月 28日

Rack はシッカリ autoload autoload

WAF 側で autoload 頑張っても Rack が autoload してなかったら全然ダメだよなーって思ってソース覗いてみたら、フルで autoload しまくってた。Rack++ require "rack" した時点だと rack.rb しか読みこまれない。

あと RubyCocoa の standalonefy の汎用版が欲しいなぁ。gem collect [script name] みたいなので lib 以下に集めたライブラリを突っ込んで、カレントディレクトリに単純に lib を読みにいくようにするだけの rubygems.rb をおく、みたいな。

2008年 05月 25日

Ruby WAF つくろう

とりあえずコンセプトをきめよう。

  • ルーティングが簡単に書けること
  • 起動がそこそこ早いこと (CGI や高速なリスタートをかけるため)
  • 言語側でできそうなことは言語側でやらせること (無用な言語の再実装は避ける)
  • 実装自体が簡単なこと
  • 黒魔法つかわない

なのでとりあえず

  • autoload を効果的に使えるようにする。
  • Object#send と define_method を活用する。
  • Rack ベースのラッパみたいな実装にする。
2008年 05月 23日

gerry++

なんかいつもと違う感じだった。benpy を併発してたせいっぽい

2008年 05月 22日

push し忘れているローカルの git repos を列挙する

`locate /.git/`.split(/\n/).map {|l| l.gsub(%r|/\.git/.+|, "") }.uniq.each {|repo|
	Dir.chdir(repo) do
		head =  `git rev-parse HEAD`.chomp
		remotes = `git rev-parse --remotes`.split(/\n/)
		unless remotes.include? head
			puts repo
		end
	end
}

このコードだと、登録してある remote のうち、少くとも一つに push されていればいい、っていうことになります。

なんかもっといい方法はないかしら

2008年 05月 19日

gerry++

途中下車 / 伊勢原

List::Enumerator を DBIC でつかおうとおもったけどだめっぽい

rewind 呼びすぎなんだよなー DBIC 側でキャッシュしてくれてるのかもしれないけどこれは気持ちわるくて使えないよなぁ。

なので rewind を全部なくしたブランチつくってみよう

ブランチつくってなおしてマージしたりした。0.02 でなおった

2008年 05月 18日

List::Enumerator

http://github.com/cho45/list-enumerator/tree/master

昨日 YAPC から帰ってきてからもそもそ作ってたけど妙に疲れた……

やってることは JSEnumerator とだいたい同じで、Moose 使って一部を Role として分離してリストっぽくつかえるやつに適用可能にしてみた、けど、なんかもっといい方法あるのかなぁ。

基本的に全部遅延評価されるので、DBIC の一行ずつとってくるやつと組合せるといいかもしれないけど試してないです。(リストコンテキストで評価した場合一部はリストで返したり、to_a を明示的によぶと ArrayRef 返すようになってたり)

rewind を一応実装してみたのはいいけど、あんまり信用しないほうがいい感じです。結局、クロージャもごもごやる Enumerator をチェインさせたりすると rewind がどうしても実装できないと思う。殆ど場合は問題ないと思うけど……


例によって % 使わない FizzBuzz

use List::Enumerator qw/E/;
 
use Data::Dumper;
sub p ($) { warn Dumper shift }
 
my $fizzbuzz =
  E(1)->countup->zip(
    E("", "", "Fizz")->cycle,
    E("", "", "", "", "Buzz")->cycle
  )->map(sub {
    my ($n, $fizz, $buzz) = @$_;
    $fizz . $buzz || $n;
  });
 
p [ $fizzbuzz->take(20) ];

CPAN http://search.cpan.org/~satoh/List-Enumerator-0.01/lib/List/Enumerator.pm

Moose alias

__PACKAGE__->meta->alias_method("foo", \&bar); と *foo = \&bar; だとタイプ数的に後者使っちゃうなぁ……

LE

my $fib = fibonacci();

is_deeply [ $fib->take(10) ], [
	0, 1, 1, 2, 3, 5, 8, 13, 21, 34
];

is_deeply [ $fib->take(10) ], [
	0, 1, 1, 2, 3, 5, 8, 13, 21, 34
];

にするか

my $fib = fibonacci();

is_deeply [ $fib->take(10) ], [
	0, 1, 1, 2, 3, 5, 8, 13, 21, 34
];

is_deeply [ $fib->take(10) ], [
	55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181
];

にするかで悩む。今は後者だけど、前者のほうがいい気がしてきた (同じように読んでるように見えるんだから同じものをかえすべき)。

前者に全部あわせた

2008年 05月 16日

git hub ってうったら github の該当ソースツリーを開くようにする

[alias]
	hub-url = !ruby -e 'puts (%Q{http://github.com/%s/%s/tree/master/} + %x{git rev-parse --show-prefix}) % %x{git config -l}.match(%r{^remote.origin.url=git@github.com:([^/]+)/([^.]+).git}).captures'
	hub     = !open $(git hub-url)

http://github.com/guides/jump-to-github-from-your-repository のサブコマンド版です。サブディレクトリでもちゃんと飛ぶようになってます。

hub-url を分けてるのはリモートの git で open が使えないときでもコピペでいけるようにするため