[記]2012-12-11(火), [荷]発送, [働]英文法, [荷]受領, [Perl]find, [Perl]Nya::Tree 0.1, [Perl]Nya::Find 0.3
[記]2012-12-11(火)
目を覚ましたのは6時でした。
『吉田照美 ソコダイジナトコ』を聴きつつ、布団を脱出しました。
携帯電話のアラームが5分毎にスヌーズするはずなのに、1回しか鳴らなかったのが気になります。
体組成計で測定して、準備をして、8時に家を出ます。
えっ!?
1時間くらい、ぶっ飛んでますよ!!
昨夜はあまりに寒くて眠れなかったのですが、それと関係あるのでしょうか。
[荷]発送
Amazonからメールが来ましたよ。
Amazon.co.jp をご利用いただき、ありがとうございます。 ご注文いただいた商品を少しでも早くお届けするため、本日、Amazon.co.jp が一部の商品を発送いたしました。
昨夜注文した本2冊が発送されたようですが、2冊一緒に注文したのに、別々に発送してくれたようです。
その他、2012年12月5日(水)に不在で受け取れなかった『ゆうメール』の再配達も、今夜19時以降に手配してあります。
今日は19時までに帰宅して、受け取りラッシュです。
[働]英文法
職場の同僚がファイルを変更したというので変更レビューをしたのですが、変更内容は『エラーメッセージ』の修正でした。
File is not found.
というエラーメッセージを、
File not found.
というふうに修正していました。
昔はメモリーが貴重だったので、エラーメッセージからbe動詞を省いて容量削減していましたが、今はそこまでこだわる必要はないんじゃないでしょうか。
The file is not found. (ファイルは見つけられない)
The file was not found. (ファイルは見つけられなかった)
The file has not found. (ファイルは見つけられなかった)
The file could not be found. (ファイルは見つけられることができなかった)
文法的に正しくすると、回りくどく見えてしまいますけどね。
[荷]受領
なんとか19時ちょっと過ぎに帰宅しました。
共有スペースの郵便受けには、不在票は入っていませんでした。
玄関の郵便受けに、『クロネコヤマト』の不在票が挟んでありました。19時の再配達に間に合わなかったのかと焦りましたが、配達時刻が昼過ぎでした。昨夜注文した本2冊の不在票ですね。
念の為に玄関の郵便受けの中を確認すると、『ゆうメール』の不在票が入っていました。2012年12月7日(金)って、4日も前じゃないですか。
今日19時から再配達を依頼してある『ゆうメール』とは別の荷物のようです。こちらの不在票は共有スペースの郵便受けに入っていたのに。担当者によって不在票を置いていく場所を変えるのは容赦してほしいです。
『クロネコヤマト』は、今日の再配達が間に合いました。最終は20時以降ですが、時間指定なしです。
『ゆうメール』は、今日の再配達は間に合いません。最終が19時以降なので、もう締め切っているようです。しょうがないので、2012年12月15日(土)の午前中に再配達申請です。
『ゆうメール』が届きました。荷物は『魔女の宅急便』のBlu-ray Discでした。
おいおい、いいのかそれ。
ここは『クロネコヤマト』にしておかないといけないような気がするのですが。
『クロネコヤマト』が届きました。本2冊が、2個口で届きました。
同じ日に発送するなら、1個口でもよかったのに。
Amazon.co.jp をご利用いただき、ありがとうございます。 ご注文いただいた商品を少しでも早くお届けするため、本日、Amazon.co.jp が一部の商品を発送いたしました。
きっと、タッチの差で先に発送してしまったんでしょうね。
2012年12月15日(土)に再配達を依頼した『ゆうメール』ですが、これは2012年12月5日(水)発売のYUIさんのベストアルバムですね。
2枚同時リリースだと気付かずに別々に注文してしまったので、これも2個口で届きます。
そのYUIさんですが、このベストアルバムの発売をもって、無期限活動休止するそうです。
音楽以外の道を歩いて行くのか、いつかまた音楽に戻ってくるのか、本人にも分かっていないようですが。
いずれ、本人が答えを見つけるのでしょう。
[Perl]find
Perlで指定ディレクトリ以下の全てのファイル一覧を得ようと思ったら、File::Findを使うのが楽です。
しかし、File::Findは個人的に取り扱いにくいと感じたので、2012年11月7日(水)に車輪の再発明しちゃいました。
それで、めでたしめでたし、だったのですが、ある環境でfind
と速度比較をしたところ、find
より倍以上も遅いことがわかりました。
open my $FIND, '-|', "find $dir -name '*'" or die "$dir:$!";
こうやってfind
を呼び出すほうが速いという、残念すぎる結果です。
しかし、find
のオプションを変えて、ファイルだけ探すようにしたところ、ものすごく遅くなることが判明しました。
$ time find . -type f > /dev/null real 0m39.689s user 0m0.068s sys 0m1.256s $ time find . -name '*' > /dev/null real 0m16.212s user 0m0.091s sys 0m0.726s
なんということでしょう、2倍以上も遅くなったではありませんか。
39.689 / 16.212 = 2.448倍
find . -name '*'
で得られたファイル一覧を、perlで-f $file
してファイルかどうか確認したところ、find . -type f
とほぼ同じ処理時間になりました。
ちなみに、2012年11月7日(水)に車輪の再発明したオレオレfind
も、ほぼ同じ処理時間でした。
世の中には、stat()
がものすごく遅いファイルシステムもあるわけですね。
[Perl]Nya::Tree 0.1
2012年11月7日(水)に車輪の再発明したオレオレfind
は、ハッシュツリーを構築するのが面倒になって、ファイル一覧を配列で返すようにしてしまいました。
改めて、指定ディレクトリ下のファイル一覧を元にハッシュツリーを構築するスクリプトを書いてみます。
#!/usr/bin/env perl package Nya::Tree; use strict; use warnings; use Carp; our $VERSION = '0.1'; ${^WIN32_SLOPPY_STAT} = 1; # 5.10 sub tree { my($dir) = @_; my $hash = {}; my @queue = ($dir); while (my $dir = shift @queue) { opendir my $DIR, $dir or croak "$dir:$!"; for (grep !m|^\.+$|, readdir $DIR) { my $full = $dir.'/'.$_; -r $full or next; if (-f _) { my $ref = $hash; map { $ref->{$_} ||= {}; # Directory (ref) $ref = $ref->{$_}; } split('/', $dir); $ref->{$_} = -s _; # File (!ref) } elsif (-d _) { push @queue, $full; } } closedir $DIR; } $hash; } sub hash2list { my($hash, $dir) = @_; if ($dir) { return map { ref $hash->{$_} ? hash2list($hash->{$_}, $dir.'/'.$_) : $dir.'/'.$_ } sort keys %{$hash}; } else { return map { ref $hash->{$_} ? hash2list($hash->{$_}, $_) : $_ } sort keys %{$hash}; } } package main; use strict; use warnings; use Data::Dumper; use feature qw(say); my $dir = shift; my $hash = Nya::Tree::tree($dir); print Dumper($hash); say for Nya::Tree::hash2list($hash);
ディレクトリはリファレンスとして記録し、ファイルはスカラー値を記録しています。
リファレンスじゃなければなんでもいいので、ファイルサイズを記録しています。
[Perl]Nya::Find 0.3
パスを分解してハッシュツリーを作ればいいだけなので、オレオレfind
に組み込んでもいいかも知れません。
#!/usr/bin/env perl package Nya::Find; use strict; use warnings; use Carp; our $VERSION = '0.3'; ${^WIN32_SLOPPY_STAT} = 1; # 5.10 sub find { my(@files, @queue); my %uniq; for (grep !$uniq{$_}++, @_) { -r $_ or next; -f _ and push @files, $_; -d _ and push @queue, $_; } while (my $dir = shift @queue) { opendir my $DIR, $dir or croak "$dir:$!"; for (grep !m|^\.+$|, readdir $DIR) { my $full = $dir.'/'.$_; -r $full or next; -f _ and push @files, $full; -d _ and push @queue, $full; } closedir $DIR; } @files; } sub tree { my $hash = {}; for (find(@_)) { my $ref = $hash; my @path = split('/', $_); my $base = pop @path; for (@path) { $ref->{$_} ||= {}; # Directory (ref) $ref = $ref->{$_}; } $ref->{$base} = -s $_; # File (!ref) } $hash; } sub hash2list { my($hash, $dir) = @_; if ($dir) { return map { ref $hash->{$_} ? hash2list($hash->{$_}, $dir.'/'.$_) : $dir.'/'.$_ } sort keys %{$hash}; } else { return map { ref $hash->{$_} ? hash2list($hash->{$_}, $_) : $_ } sort keys %{$hash}; } } package main; use strict; use warnings; use Data::Dumper; use feature qw(say); say for Nya::Find::find(@ARGV); my $hash = Nya::Find::tree(@ARGV); print Dumper($hash); say for Nya::Find::hash2list($hash);
同じディレクトリを複数回指定すると複数回リストアップしてしまう不具合があったので対策しています。
重複を取り除く方法はいろいろありますが、2012年6月28日(木)にawk
コマンドでやった方法を使ってます。
[記]2012-12-11(火)
めをさましたのは6時でした。
『よしだてるみ ソコダイジナトコ』をききつつ、ふとんをだっしゅつしました。
けいたいでんわのアラームが5分毎にスヌーズするはずなのに、1回しかならなかったのがきになります。
たいそせいけいでそくていして、じゅんびをして、8時にいえをでます。
えっ!?
1時間くらい、ぶっとんでますよ!!
さくやはあまりにさむくてねむれなかったのですが、それとかんけいあるのでしょうか。
[荷]発送
Amazonからメールがきましたよ。
Amazon.co.jp をご利用いただき、ありがとうございます。 ご注文いただいた商品を少しでも早くお届けするため、本日、Amazon.co.jp が一部の商品を発送いたしました。
さくやちゅうもんしたもと2冊がはっそうされたようですが、2冊いっしょにちゅうもんしたのに、べつべつにはっそうしてくれたようです。
そのた、2012ねん12がつ5にち(すい)にふざいでうけとれなかった『ゆうメール』のさいはいたつも、こんや19時いこうにてはいしてあります。
きょうは19時までにきたくして、うけとりラッシュです。
[働]英文法
しょくばのどうりょうがファイルをへんこうしたというのでへんこうレビューをしたのですが、へんこうないようは『エラーメッセージ』のしゅうせいでした。
File is not found.
というエラーメッセージを、
File not found.
というふうにしゅうせいしていました。
むかしはメモリーがきちょうだったので、エラーメッセージからbeどうしをはぶいてようりょうさくげんしていましたが、いまはそこまでこだわるひつようはないんじゃないでしょうか。
The file is not found. (ファイルは見つけられない)
The file was not found. (ファイルは見つけられなかった)
The file has not found. (ファイルは見つけられなかった)
The file could not be found. (ファイルは見つけられることができなかった)
ぶんぽうてきにただしくすると、まわりくどくみえてしまいますけどね。
[荷]受領
なんとか19時ちょっとすぎにきたくしました。
きょうゆうスペースのゆうびんうけには、ふざいひょうはいっていませんでした。
げんかんのゆうびんうけに、『クロネコヤマト』のふざいひょうがはさんでありました。19時のさいはいたつにまにあわなかったのかとあせりましたが、はいたつじこくがひるすぎでした。さくやちゅうもんしたもと2冊のふざいひょうですね。
ねんの為にげんかんのゆうびんうけのなかをかくにんすると、『ゆうメール』のふざいひょうがいっていました。2012ねん12がつ7にち(きん)って、よっかもぜんじゃないですか。
きょう19時からさいはいたつをいらいしてある『ゆうメール』とはべつのにもつのようです。こちらのふざいひょうはきょうゆうスペースのゆうびんうけにいっていたのに。たんとうしゃによってふざいひょうをおいていくばしょをかえるのはようしゃしてほしいです。
『クロネコヤマト』は、きょうのさいはいたつがまにあいました。さいしゅうは20時いこうですが、じかんしていなしです。
『ゆうメール』は、きょうのさいはいたつはまにあいません。さいしゅうが19時いこうなので、もうしめきっているようです。しょうがないので、2012ねん12がつ15にち(ど)のごぜんちゅうにさいはいたつしんせいです。
『ゆうメール』がとどきました。にもつは『まじょのたっきゅうびん』のBlu-ray Discでした。
おいおい、いいのかそれ。
ここは『クロネコヤマト』にしておかないといけないようなきがするのですが。
『クロネコヤマト』がとどきました。もと2冊が、2個口でとどきました。
おなじひにはっそうするなら、1個口でもよかったのに。
Amazon.co.jp をご利用いただき、ありがとうございます。 ご注文いただいた商品を少しでも早くお届けするため、本日、Amazon.co.jp が一部の商品を発送いたしました。
きっと、タッチのさでさきにはっそうしてしまったんでしょうね。
2012ねん12がつ15にち(ど)にさいはいたつをいらいした『ゆうメール』ですが、これは2012ねん12がつ5にち(すい)はつばいのYUIさんのベストアルバムですね。
2枚どうじリリースだときづかずにべつべつにちゅうもんしてしまったので、これも2個口でとどきます。
そのYUIさんですが、このベストアルバムのはつばいをもって、むきげんかつどうきゅうしするそうです。
おんがくいがいのみちをあるいていくのか、いつかまたおんがくにもどってくるのか、ほんにんにもわかっていないようですが。
いずれ、ほんにんがこたえをみつけるのでしょう。
[Perl]find
Perlでしていディレクトリいかのすべてのファイルいちらんをうようとおもったら、File::Findをつかうのがらくです。
しかし、File::Findはこじんてきにとりあつかいにくいとかんじたので、2012ねん11がつ7にち(すい)にしゃりんのさいはつめいしちゃいました。
それで、めでたしめでたし、だったのですが、あるかんきょうでfind
とそくどひかくをしたところ、find
より倍いじょうもおそいことがわかりました。
open my $FIND, '-|', "find $dir -name '*'" or die "$dir:$!";
こうやってfind
をよびだすほうがはやいという、ざんねんすぎるけっかです。
しかし、find
のオプションをかえて、ファイルだけさがすようにしたところ、ものすごくおそくなることがはんめいしました。
$ time find . -type f > /dev/null real 0m39.689s user 0m0.068s sys 0m1.256s $ time find . -name '*' > /dev/null real 0m16.212s user 0m0.091s sys 0m0.726s
なんということでしょう、2倍いじょうもおそくなったではありませんか。
39.689 / 16.212 = 2.448倍
find . -name '*'
でうられたファイルいちらんを、perlで-f $file
してファイルかどうかかくにんしたところ、find . -type f
とほぼおなじしょりじかんになりました。
ちなみに、2012ねん11がつ7にち(すい)にしゃりんのさいはつめいしたオレオレfind
も、ほぼおなじしょりじかんでした。
よのなかには、stat()
がものすごくおそいファイルシステムもあるわけですね。
[Perl]Nya::Tree 0.1
2012ねん11がつ7にち(すい)にしゃりんのさいはつめいしたオレオレfind
は、ハッシュツリーをこうちくするのがめんどうになって、ファイルいちらんをはいれつでかえすようにしてしまいました。
あらためて、していディレクトリしたのファイルいちらんをもとにハッシュツリーをこうちくするスクリプトをかいてみます。
#!/usr/bin/env perl package Nya::Tree; use strict; use warnings; use Carp; our $VERSION = '0.1'; ${^WIN32_SLOPPY_STAT} = 1; # 5.10 sub tree { my($dir) = @_; my $hash = {}; my @queue = ($dir); while (my $dir = shift @queue) { opendir my $DIR, $dir or croak "$dir:$!"; for (grep !m|^\.+$|, readdir $DIR) { my $full = $dir.'/'.$_; -r $full or next; if (-f _) { my $ref = $hash; map { $ref->{$_} ||= {}; # Directory (ref) $ref = $ref->{$_}; } split('/', $dir); $ref->{$_} = -s _; # File (!ref) } elsif (-d _) { push @queue, $full; } } closedir $DIR; } $hash; } sub hash2list { my($hash, $dir) = @_; if ($dir) { return map { ref $hash->{$_} ? hash2list($hash->{$_}, $dir.'/'.$_) : $dir.'/'.$_ } sort keys %{$hash}; } else { return map { ref $hash->{$_} ? hash2list($hash->{$_}, $_) : $_ } sort keys %{$hash}; } } package main; use strict; use warnings; use Data::Dumper; use feature qw(say); my $dir = shift; my $hash = Nya::Tree::tree($dir); print Dumper($hash); say for Nya::Tree::hash2list($hash);
ディレクトリはリファレンスとしてきろくし、ファイルはスカラーちをきろくしています。
リファレンスじゃなければなんでもいいので、ファイルサイズをきろくしています。
[Perl]Nya::Find 0.3
パスをぶんかいしてハッシュツリーをつくればいいだけなので、オレオレfind
にくみこんでもいいかもしれません。
#!/usr/bin/env perl package Nya::Find; use strict; use warnings; use Carp; our $VERSION = '0.3'; ${^WIN32_SLOPPY_STAT} = 1; # 5.10 sub find { my(@files, @queue); my %uniq; for (grep !$uniq{$_}++, @_) { -r $_ or next; -f _ and push @files, $_; -d _ and push @queue, $_; } while (my $dir = shift @queue) { opendir my $DIR, $dir or croak "$dir:$!"; for (grep !m|^\.+$|, readdir $DIR) { my $full = $dir.'/'.$_; -r $full or next; -f _ and push @files, $full; -d _ and push @queue, $full; } closedir $DIR; } @files; } sub tree { my $hash = {}; for (find(@_)) { my $ref = $hash; my @path = split('/', $_); my $base = pop @path; for (@path) { $ref->{$_} ||= {}; # Directory (ref) $ref = $ref->{$_}; } $ref->{$base} = -s $_; # File (!ref) } $hash; } sub hash2list { my($hash, $dir) = @_; if ($dir) { return map { ref $hash->{$_} ? hash2list($hash->{$_}, $dir.'/'.$_) : $dir.'/'.$_ } sort keys %{$hash}; } else { return map { ref $hash->{$_} ? hash2list($hash->{$_}, $_) : $_ } sort keys %{$hash}; } } package main; use strict; use warnings; use Data::Dumper; use feature qw(say); say for Nya::Find::find(@ARGV); my $hash = Nya::Find::tree(@ARGV); print Dumper($hash); say for Nya::Find::hash2list($hash);
おなじディレクトリをふくすうかいしていするとふくすうかいリストアップしてしまうふぐあいがあったのでたいさくしています。
ちょうふくをとりのぞくほうほうはいろいろありますが、2012ねん6がつ28にち(もく)にawk
コマンドでやったほうほうをつかってます。
コメント 0