2008年 03月 11日

List::Enumerator

慣れるために書いてみる

package List::Enumerator;

use strict;
use warnings;

use base qw/Exporter/;
our @EXPORT = qw/E/;

use Exception::Class ( "StopEnumeration ");

sub E {
	List::Enumerator->new(@_);
}


sub new {
	my ($class, @args) = @_;

	my $self = {};
	bless $self, $class;

	$self->_init(@args);

	$self;
}

sub _init {
	my ($self, @args) = @_;

	my $i = 0;
	$self->_init_with_fun(sub {
		$i < @args ? $args[$i++] : StopEnumeration->throw;
	});
}

sub _init_with_fun {
	my ($self, $fun) = @_;
	$self->{fun} = $fun;
}

sub next {
	my $self = shift;
	$self->{fun}->();
}

sub each {
	my ($self, $fun) = @_;
	eval {
		while (1) {
			local $_ = $self->next;
			$fun->($_);
		}
	}; if (my $e = Exception::Class->caught('StopEnumeration')) {
	}
}

sub map {
	my ($self, $fun) = @_;
	my @ret = ();
	$self->each(sub {
		push @ret, $fun->($_);
	});
	wantarray ? @ret : List::Enumerator->new(@ret);
}
use Data::Dumper;
sub p { print Dumper shift }

use List::Enumerator;


E(1, 2, 3)->each(sub {
	p shift;
	p $_;
});

p [ E(1, 2, 3)->map(sub { $_ * $_; }) ];

E(1, 2, 3)->map(sub {
	$_ * $_;
})->each(sub {
	p $_;
});

cycle かくまえに眠くなった

もうちょっと経ったら (謎) autobox さわってみよう

2008年 03月 10日

はてキはてダ

おもしろいはてダをいくつか見つけて購読開始した。思ったけど、日記中に書いてある id とかを辿っていくと、面白い日記書くクラスタってのがあって、集ってるんだなぁとか思った。

人、学び

何か唐突に気付いた。僕に必要なのは、先生みたいに誰か一方的に教えてくれる人とかじゃなくて、一緒に学習を続けていける、同じ方向を向いた人なんだなぁたぶん。高校も、大学も、ほんと、全くそういう友達はいなかったなぁ……

はてなのクラスタリング

アンテナの購読状況と、はてダ、はてブでの id コールを集計したらできるかな。でもひっこんでる人はでてこなくなっちゃうよなぁ。

計算

脳内でいろいろ、ざっくばらんにだけれど、これからのことを計算してみると、いくら稼いでも全く足りないので (お金がない、っていうのは、スピード感が失なわれがちで、すごくよくない)、もっと倹約しよう。

Open Fastladder / MySQL

なんか開いてから表示されるまでクソおそくてどうしたもんかなぁ、と思っていたけど、slow_log を有効にして観察したら 10 秒とか 40 秒とかかかるクエリがあったのでインデックスはってみた。劇的にはやくなった。更めて、自分で DB のことわかってないなぁ……と気付かされた (超ごく最近まで slow_log をとれることすら知らなかった)。

実際に実行したやつ (phpmyadmin からもごもごやってた)

ALTER TABLE `items` ADD INDEX `feed_id_stored_on_created_on` ( `feed_id` , `stored_on` , `created_on` , `id` )  

ためしてないけど、Migration:

# db/migrate/009_add_items_index.rb
class AddItemsIndex < ActiveRecord::Migration
	def self.up
		add_index :items, [:feed_id, :stored_on, :created_on, :id], :name => :items_search_index
	end

	def self.down
		remove_index :items_search_index
	end
end


問題のログ

# Time: 080310  9:59:22
# User@Host: root[root] @ localhost []
# Query_time: 47  Lock_time: 0  Rows_sent: 10  Rows_examined: 3511
SELECT * FROM `items`   WHERE (items.feed_id = 36 AND (stored_on >= '2008-03-10 01:31:30'))  ORDER BY created_on DESC, id DESC LIMIT 10;

はったあとの EXPLAIN

$ mysql -u root fastladder
mysql> EXPLAIN SELECT * FROM `items`   WHERE (items.feed_id = 36 AND (stored_on >= '2008-03-10 01:31:30'))  ORDER BY created_on DESC, id DESC LIMIT 10;
+----+-------------+-------+-------+--------------------------------------------------------------+------------------------------+---------+------+------+-----------------------------+
| id | select_type | table | type  | possible_keys                                                | key                          | key_len | ref  | rows | Extra                       |
+----+-------------+-------+-------+--------------------------------------------------------------+------------------------------+---------+------+------+-----------------------------+
|  1 | SIMPLE      | items | range | index_items_on_feed_id_and_link,feed_id_stored_on_created_on | feed_id_stored_on_created_on | 13      | NULL |  115 | Using where; Using filesort | 
+----+-------------+-------+-------+--------------------------------------------------------------+------------------------------+---------+------+------+-----------------------------+
1 row in set (0.06 sec)
2008年 03月 09日

pl

OpenFL 用の Plagger がずっとうごきっぱで鯖が重かったので 30min ごとのクロールじゃなくて 1h ごとにした。

言葉

なにかいろいろ、浮かんでは消えることがあるけれど、うまく言葉にできない。消化するのに時間がかかる。あとなんか、言葉を選ぶことについて、やらないといけないことがあるのだけれど、心を消費することなので、難しい。

言葉は魔法で、呪いだ、と感じる。一言の重さを、ポジティブにもネガティブにも実感する。一言の「イイネ」と、一言の「どうなのソレ」みたいなのの大きさ、もちろん文脈によるにしても、そういうのは本当に呪いだ。

TODO ドメインの更新

やばいわすれそうだ

トラックナンバー

[[トラックナンバー]] 知らなかった。こんな用語あるんだ。

バーガーのCDってもう手に入らないから、できるだけバックアップしときたいよなぁ。RAID くんでるやつに mp3 はおいてるけど、ロスレスで保存すべきだよなぁ。ついでに Amazon S3 にいれたいなぁ。