石
靴の見えないところに入っていて、歩くたびにかかとをつっつく石を取り除いた。
靴の見えないところに入っていて、歩くたびにかかとをつっつく石を取り除いた。
ヤクルト吹いた。いまからすげー不安だ\(^o^)/
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 は初期値の与えかたが自然な感じがする。
慣れるために書いてみる
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 さわってみよう
おもしろいはてダをいくつか見つけて購読開始した。思ったけど、日記中に書いてある id とかを辿っていくと、面白い日記書くクラスタってのがあって、集ってるんだなぁとか思った。
何か唐突に気付いた。僕に必要なのは、先生みたいに誰か一方的に教えてくれる人とかじゃなくて、一緒に学習を続けていける、同じ方向を向いた人なんだなぁたぶん。高校も、大学も、ほんと、全くそういう友達はいなかったなぁ……
アンテナの購読状況と、はてダ、はてブでの id コールを集計したらできるかな。でもひっこんでる人はでてこなくなっちゃうよなぁ。
脳内でいろいろ、ざっくばらんにだけれど、これからのことを計算してみると、いくら稼いでも全く足りないので (お金がない、っていうのは、スピード感が失なわれがちで、すごくよくない)、もっと倹約しよう。
なんか開いてから表示されるまでクソおそくてどうしたもんかなぁ、と思っていたけど、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)