2008年 03月 12日

靴の見えないところに入っていて、歩くたびにかかとをつっつく石を取り除いた。

あれhaやばい

ヤクルト吹いた。いまからすげー不安だ\(^o^)/

Perl のリスト、ハッシュのマージ、reduce メモ

Ruby での

require "pp"

data = [
	{ :name => "foo", :value => 1 },
	{ :name => "bar", :value => 2 },
	{ :name => "baz", :value => 3 },
]


pp data.inject(0) {|r,i| r + i[:value] }

pp data.inject({}) {|r,i| r.update( i[:name] => i ) }

__END__
6
{"baz"=>{:value=>3, :name=>"baz"},
 "foo"=>{:value=>1, :name=>"foo"},
 "bar"=>{:value=>2, :name=>"bar"}}
use List::Util qw/reduce/;

use Data::Dumper;
sub p ($) { print Dumper shift }

my $data = [
	{ name => "foo", value => 1 },
	{ name => "bar", value => 2 },
	{ name => "baz", value => 3 },
];

p reduce { $a + $b->{value} } 0, @$data;

p reduce { +{ %$a, $b->{name} => $b } } {}, @$data;

__END__
$VAR1 = 6;
$VAR1 = {
          'bar' => {
                     'value' => 2,
                     'name' => 'bar'
                   },
          'baz' => {
                     'value' => 3,
                     'name' => 'baz'
                   },
          'foo' => {
                     'value' => 1,
                     'name' => 'foo'
                   }
        };

引数のとりかた的に Perl は初期値の与えかたが自然な感じがする。

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)