SSブログ

[記]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一緒注文したのに、別々発送してくれたようです。

その2012125()不在れなかった『ゆうメール』の再配達も、今夜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不在票ですね。
の為に玄関郵便受けの確認すると、『ゆうメール』の不在票っていました。2012127()って、4日じゃないですか。
今日19から再配達依頼してある『ゆうメール』とは荷物のようです。こちらの不在票共有スペースの郵便受けにっていたのに。担当者によって不在票いていく場所えるのは容赦してほしいです。


クロネコヤマト』は、今日再配達いました。最終は20以降ですが、時間指定なしです。
ゆうメール』は、今日再配達いません。最終が19以降なので、もうっているようです。しょうがないので、20121215()午前中再配達申請です。


ゆうメール』がきました。荷物は『魔女宅急便』のBlu-ray Discでした。
おいおい、いいのかそれ。
ここは『クロネコヤマト』にしておかないといけないようながするのですが。


クロネコヤマト』がきました。2が、2個口きました。

発送するなら、1個口でもよかったのに。

Amazon.co.jp をご利用いただき、ありがとうございます。 ご注文いただいた商品を少しでも早くお届けするため、本日、Amazon.co.jp が一部の商品を発送いたしました。

きっと、タッチの発送してしまったんでしょうね。


20121215()再配達依頼した『ゆうメール』ですが、これは2012125()発売のYUIさんのベストアルバムですね。

2同時リリースだと気付かずに別々注文してしまったので、これも2個口きます。
そのYUIさんですが、このベストアルバムの発売をもって、無期限活動休止するそうです。
音楽以外いてくのか、いつかまた音楽ってくるのか、本人にもかっていないようですが。
いずれ、本人えをつけるのでしょう。

[Perl]find

Perl指定ディレクトリ以下てのファイル一覧ようとったら、File::Find使うのがです。
しかし、File::Find個人的いにくいとじたので、2012117()車輪再発明しちゃいました。
それで、めでたしめでたし、だったのですが、ある環境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とほぼ処理時間になりました。
ちなみに、2012117()車輪再発明したオレオレfindも、ほぼ処理時間でした。
には、stat()がものすごくいファイルシステムもあるわけですね。

[Perl]Nya::Tree 0.1

2012117()車輪再発明したオレオレ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);

じディレクトリを複数回指定すると複数回リストアップしてしまう不具合があったので対策しています。
重複方法はいろいろありますが、2012628()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コマンドでやったほうほうをつかってます。


nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

Facebook コメント

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。