はてなキーワード: chdirとは
~/hatena/q1408437001% sh batch.sh cat.jpg glenn.jpg london.jpg virgo.jpg
jpeg run with "cjpeg -quality 30 w.pnm > t.jpg" & "djpeg t.jpg > w.pnm"
#1 cat1.diff.png: mean 658.499
#1000 cat1000.diff.png: mean 0
im run with "convert w.pnm -quality 15 t.jpg" & "convert t.jpg w.pnm"
#1 cat1.diff.png: mean 1012.47
#1000 cat1000.diff.png: mean 0
j2k run with "opj_compress -r 400 -i w.pnm -o t.jpg.j2k > /dev/null 2>&1" & "opj_decompress -i t.jpg.j2k -o w.pnm > /dev/null 2>&1 ; mv t.jpg.j2k t.jpg"
#1 cat1.diff.png: mean 852.046
#10 cat10.diff.png: mean 153.899
#1000 cat1000.diff.png: mean 0
jpeg run with "cjpeg -quality 30 w.pnm > t.jpg" & "djpeg t.jpg > w.pnm"
#1 glenn1.diff.png: mean 3399.9
#10 glenn10.diff.png: mean 13.1817
#100 glenn100.diff.png: mean 0
#1000 glenn1000.diff.png: mean 0
im run with "convert w.pnm -quality 15 t.jpg" & "convert t.jpg w.pnm"
#1 glenn1.diff.png: mean 3774.37
#10 glenn10.diff.png: mean 2.9123
#100 glenn100.diff.png: mean 0
#1000 glenn1000.diff.png: mean 0
j2k run with "opj_compress -r 400 -i w.pnm -o t.jpg.j2k > /dev/null 2>&1" & "opj_decompress -i t.jpg.j2k -o w.pnm > /dev/null 2>&1 ; mv t.jpg.j2k t.jpg"
#1 glenn1.diff.png: mean 5124.25
#10 glenn10.diff.png: mean 34.9354
#100 glenn100.diff.png: mean 0.54037
#1000 glenn1000.diff.png: mean 0
jpeg run with "cjpeg -quality 30 w.pnm > t.jpg" & "djpeg t.jpg > w.pnm"
#1 london1.diff.png: mean 1145.86
#10 london10.diff.png: mean 2.94233
#100 london100.diff.png: mean 0
#1000 london1000.diff.png: mean 0
im run with "convert w.pnm -quality 15 t.jpg" & "convert t.jpg w.pnm"
#1 london1.diff.png: mean 1589.42
#10 london10.diff.png: mean 0.262741
#100 london100.diff.png: mean 0
#1000 london1000.diff.png: mean 0
j2k run with "opj_compress -r 400 -i w.pnm -o t.jpg.j2k > /dev/null 2>&1" & "opj_decompress -i t.jpg.j2k -o w.pnm > /dev/null 2>&1 ; mv t.jpg.j2k t.jpg"
#1 london1.diff.png: mean 1874.1
#10 london10.diff.png: mean 34.7301
#100 london100.diff.png: mean 0
#1000 london1000.diff.png: mean 0
jpeg run with "cjpeg -quality 30 w.pnm > t.jpg" & "djpeg t.jpg > w.pnm"
#1 virgo1.diff.png: mean 655.998
#10 virgo10.diff.png: mean 0.593173
#100 virgo100.diff.png: mean 0
#1000 virgo1000.diff.png: mean 0
im run with "convert w.pnm -quality 15 t.jpg" & "convert t.jpg w.pnm"
#1 virgo1.diff.png: mean 967.051
#10 virgo10.diff.png: mean 0.276289
#100 virgo100.diff.png: mean 0
#1000 virgo1000.diff.png: mean 0
j2k run with "opj_compress -r 400 -i w.pnm -o t.jpg.j2k > /dev/null 2>&1" & "opj_decompress -i t.jpg.j2k -o w.pnm > /dev/null 2>&1 ; mv t.jpg.j2k t.jpg"
#1 virgo1.diff.png: mean 689.347
#10 virgo10.diff.png: mean 72.9174
追記:quality 95でも行った。収束は遅くなるが100回までで収束した。
jpeg95 run with "cjpeg -quality 95 w.pnm > t.jpg" & "djpeg t.jpg > w.pnm"
#1 cat1.diff.png: mean 59.3537
#10 cat10.diff.png: mean 9.35999
#1000 cat1000.diff.png: mean 0
jpeg95 run with "cjpeg -quality 95 w.pnm > t.jpg" & "djpeg t.jpg > w.pnm"
#1 glenn1.diff.png: mean 2104.51
#10 glenn10.diff.png: mean 69.472
#100 glenn100.diff.png: mean 10.8727
#1000 glenn1000.diff.png: mean 0
jpeg95 run with "cjpeg -quality 95 w.pnm > t.jpg" & "djpeg t.jpg > w.pnm"
#1 london1.diff.png: mean 79.604
#10 london10.diff.png: mean 80.2684
#100 london100.diff.png: mean 8.79387
#1000 london1000.diff.png: mean 0
jpeg95 run with "cjpeg -quality 95 w.pnm > t.jpg" & "djpeg t.jpg > w.pnm"
#1 virgo1.diff.png: mean 213.594
#10 virgo10.diff.png: mean 11.7891
~/hatena/q1408437001% cat batch.sh
#/bin/sh work=w.pnm temp=t.jpg list="jpeg im j2k" enc_jpeg="cjpeg -quality 30 $work > $temp" dec_jpeg="djpeg $temp > $work" enc_im="convert $work -quality 15 $temp" dec_im="convert $temp $work" enc_j2k="opj_compress -r 400 -i $work -o $temp.j2k > /dev/null 2>&1" dec_j2k="opj_decompress -i $temp.j2k -o $work > /dev/null 2>&1 ; mv $temp.j2k $temp" for orig in "$@" ; do for name in $list ; do eval enc=\$enc_$name eval dec=\$dec_$name if [ "x$enc" == x -o "x$dec" == x ] ; then continue ; fi echo $name run with \"$enc\" "&" \"$dec\" || continue mkdir $name > /dev/null 2>&1 chdir $name || contimue convert ../$orig $work || return 1 i=0 before=../$orig for c in 1 10 100 1000 ; do while [ $i -lt $c ] ; do eval $enc && \ eval $dec && \ i=$((i+1)) || break done base=${orig%.*}${i} cp $temp ${base}.jpg convert $work ${base}.png composite $before ${base}.png -compose difference ${base}.diff.png echo -n "#$i " identify -format '%f: mean %[mean]\n' ${base}.diff.png before=${base}.png done chdir .. || return 1 done done
サンプルデータの元は下記を使用
コーデックは下記を使用
最近Perl界隈ではMoose、MooseってなんかMooseってのが流行ってるらしい。
自分自身のブログでは、さもずっと前からMoose知ってたかのように振舞うために、増田で先に放出しておく。てへへ。
プログラマ層が限りなく低い増田にこんなこと書いてもだれも見てくれない気はするけど。
初めてのMoose - Mooseのすすめ - はてな#hide-k
meta object protocol について考えてみる - TokuLog 改めChumbyとどきました日記
YappoLogs: Moose のコードを探索して理解を深めた
Mooseってのは結局のところClass::MOPのラッパーみたいなもんだと。
で、Class::MOPってのは何だ?ってことだけど、メタなんとかプログラミング?え?プロトコル?まーどっちでもいい。
よくよく読んでいくとメタなんとかとか大層な名前が付いてるけど、結局のところPerlのpackageそのものの操作をオブジェクティブ扱えるようにしたものみたいだ。
つまりだな、例えばpackageに対して動的に(静的ではなく!)メソッドを追加したい場合、今までなら
package Foo; **Foo::method = sub { return 'hoge'; }; print Foo->method;
のように型グロブに関数のリファレンスを突っ込むということをしなければなかったが
use Class::MOP; my $class = Class::MOP::Class->create('Foo'); $class->add_method('method',sub { return 'hoge'; }); print Foo->method;
みたいな感じでかっこよく追加できるってわけさ。ま、これはほんの一例だけどな。(他にもメソッドを削除したりフックしたり色々できる。その辺は今回省略。)
本来なら「package Foo」とするところを「my $class = Class::MOP::Class->create('Foo');」と書ける。
これの何が良いのかというと、$classというオブジェクト経由でFooパッケージを色々操作できるところにつきる。
型グロブを使用したり「no (warnings|strict)」をしたりパッケージを操作する処理っていうのはPerlのキチャナイ構文が多かったのだが、Class::MOPのおかげでスッキリ綺麗に書けるようになったってこった。
で、次にMooseだが、これは結局のところClass::MOPのパッケージ管理の部分に+αしただけのラッパーだ。
でもその+αってのが結構凄かったりする。
もうこの辺の話はさんざん既出だが、例えばhasという関数を使ってアクセサや型定義が出来たり
package Foo; use Moose; has 'method' => ( is => 'rw', isa => 'Int' , default => '10' ); my $obj = Foo->new; print $obj->method; # 10 $obj->method(50); print $obj->method; # 50 $obj->method('hoge') # Int型じゃないのでエラー
Moose::Roleを使ってRubyのMixinみたいなことができたりする。
でも実はこれらの処理ってのは本当は別に凄くもなんとも無い。
アクセサ生成なんてClass::Accessorがあるし、関数の引数の型チェックなんてのもParams::Validate等昔から存在してるし、Mixinに関してはもともとPerlは多重継承できるので最初からできるし。
じゃあなんでみんなMoose、Moose言ってるのかっていうと、それはやはりClass::MOPの存在が大きいであろう。
綺麗且つ柔軟にパッケージの操作が出来るClass::MOPが土台にあって、今まで別々の役割として存在してきたモジュール達を統合し、よりわかりやすく、より柔軟に、そしてより強力なPerlのオブジェクト指向を構築できるようにした。それがMooseなのだ。
・・・しかし、小生。
Mooseについて調べていくうちに一つ残念に思ったことがある。
オブジェクトにメソッドを追加する機構がないのだ。
オブジェクトにメソッドを追加する、だ。パッケージにではなく、オブジェクトに、だ。
具体例をあげる。
package Foo; use Moose; my $obj = Foo->new; $obj->meta->add_method('hoge', sub { return 'hoge' }); print $obj->hoge; # hoge
ちなみに$obj->metaというのはFooパッケージを管理するClass::MOPへのアクセサだ。
ということは上記の処理はFooに対してhogeというメソッドを追加していることになる。
では次の例。
package Foo; use Moose; my $obj = Foo->new; $obj->meta->add_method('hoge', sub { return 'hoge' }); print $obj->hoge; # hoge my $obj_2 = Foo->new; print $obj_2->hoge; # hoge
$obj_2->hogeが呼べてしまうわけだ。
$obj->metaは結局のところFooパッケージなのだから、そこにメソッドを追加しているので当然の結果である。
$objだけにメソッドを追加することは、Mooseではできないのだ。
非常に残念である。ああ、残念だ。
・・・しかし、小生。
これでもプログラマの端くれである。こんなことでめげていてはMooserを名乗れないのである。(あ、MooserってのはMoose使いの人の俗称ね。今僕が考えたの)
なのでオブジェクトにメソッドを追加できるように拡張して見せよう。
package Foo; use Moose; use Class::Object; my $class_object = Class::Object->can('new'); override new => sub { ref($class_object->(shift))->SUPER::new(@_) }; my $obj = Foo->new; $obj->meta->add_method('hoge', sub { return 'hoge' }); print $obj->hoge; # hoge my $obj_2 = Foo->new; print $obj_2->hoge; # エラー
たった3行追加するだけで実現できる。さすがMoose。
ただし、Class::Objectを利用しているのでFoo->newで返ってくるパッケージがFoo::0といったようにFooではなくなってしまっているのでrefとかでパッケージ名の比較ができなくなってしまう問題が発生する。
でもこれも継承順をいじったりと本気で頑張れば、表向きに見せるパッケージ名をFooすることも可能だろう。
その添削の役目はどこかのハッカーに任せるとして、今日のところはこの辺で終了としたい。
Moooooooooooooose!と叫ぶのが流行ってるみたいなので、もっとも長くMooooooooooooooose!と叫んだ最初の男となるべく下記の処理を残しておく。
length q chdir uc and print chr ord uc q rmdir and do { print chr ord q xor x while $a++ < 0xffffffff } or print chr ord qw q sin q and print chr ord q ne sin and print chr hex length q q shift shmread bless q;