〜2010年7月下旬〜
shinhさんから教えてもらった。wakeの$<は何度でも参照できる。
wake golfは楽しい。sed好きな人ならはまる。
znzさんにman git-rev-parseせよと教えてもらった。
'master@{日付}'でいいらしいんだが、なぜかcloneした時点から先には遡れない。
% git checkout 'master@{2007-01-01}' warning: Log for 'master' only goes back to Fri, 23 Jul 2010 00:32:02 +0900. <後略>
どうしたもんかねえ。
git logで地道に探すしかないのかなと、まずはタイムスタンプの形式を変えるオプションを見始めた。
とかなんとかしてるうちに--beforeを発見。これでいけるじゃん。
最終的にはcommit hashだけわかればいいので、
% git --no-pager log --before='{2007-01-01}' -n1 --pretty=tformat:%h e7a9936
を使ってcheckoutすればいける。
ネタ元と同じ解がちらほら。IVとかの処理が面倒だが、%でうまいこと回避できるのがミソなんだよね。
あと
このPerl goflも参考になる。
これは便利。
% mplayer video.flv -ss 00:23 -endpos 6 -vo gif89a:fps=5:output=output.gif -vf scale=400:300
でvidoe.flvの23秒目から6秒間をアニメーションGIFに変換できる。
でも画質はひどい。減色処理がひどすぎるな。
1フレームごと1枚ずつPNG画像にしてからpngquantあたりで減色したほうがよさげ。
つづく。
mplayerには-vo pngで各フレームを指定したディレクトリに保存する機能がある。
これを使うと間にpngquantでの減色処理をはさめるのでちょっとはましな画質になる。
% ./youtube-dl -o ninja-cat.flv http://www.youtube.com/watch\?v\=v71Dtj2W7pw % mplayer ninja-cat.flv -endpos 3 -vo gif89a:output=ninja-cat.gif
これで一応昨日のやつができあがり。
% mplayer ninja-cat.flv -endpos 3 -vo png:outdir=cat % cd cat % ls 00000001.png 00000011.png 00000021.png 00000031.png 00000041.png 00000051.png 00000061.png 00000071.png 00000002.png 00000012.png 00000022.png 00000032.png 00000042.png 00000052.png 00000062.png 00000072.png 00000003.png 00000013.png 00000023.png 00000033.png 00000043.png 00000053.png 00000063.png 00000073.png 00000004.png 00000014.png 00000024.png 00000034.png 00000044.png 00000054.png 00000064.png 00000074.png 00000005.png 00000015.png 00000025.png 00000035.png 00000045.png 00000055.png 00000065.png 00000075.png 00000006.png 00000016.png 00000026.png 00000036.png 00000046.png 00000056.png 00000066.png 00000076.png 00000007.png 00000017.png 00000027.png 00000037.png 00000047.png 00000057.png 00000067.png 00000008.png 00000018.png 00000028.png 00000038.png 00000048.png 00000058.png 00000068.png 00000009.png 00000019.png 00000029.png 00000039.png 00000049.png 00000059.png 00000069.png 00000010.png 00000020.png 00000030.png 00000040.png 00000050.png 00000060.png 00000070.png % pngquant 256 *.png % ls 00000001-fs8.png 00000014-fs8.png 00000027-fs8.png 00000040-fs8.png 00000053-fs8.png 00000066-fs8.png 00000001.png 00000014.png 00000027.png 00000040.png 00000053.png 00000066.png 00000002-fs8.png 00000015-fs8.png 00000028-fs8.png 00000041-fs8.png 00000054-fs8.png 00000067-fs8.png 00000002.png 00000015.png 00000028.png 00000041.png 00000054.png 00000067.png 00000003-fs8.png 00000016-fs8.png 00000029-fs8.png 00000042-fs8.png 00000055-fs8.png 00000068-fs8.png 00000003.png 00000016.png 00000029.png 00000042.png 00000055.png 00000068.png 00000004-fs8.png 00000017-fs8.png 00000030-fs8.png 00000043-fs8.png 00000056-fs8.png 00000069-fs8.png 00000004.png 00000017.png 00000030.png 00000043.png 00000056.png 00000069.png 00000005-fs8.png 00000018-fs8.png 00000031-fs8.png 00000044-fs8.png 00000057-fs8.png 00000070-fs8.png 00000005.png 00000018.png 00000031.png 00000044.png 00000057.png 00000070.png 00000006-fs8.png 00000019-fs8.png 00000032-fs8.png 00000045-fs8.png 00000058-fs8.png 00000071-fs8.png 00000006.png 00000019.png 00000032.png 00000045.png 00000058.png 00000071.png 00000007-fs8.png 00000020-fs8.png 00000033-fs8.png 00000046-fs8.png 00000059-fs8.png 00000072-fs8.png 00000007.png 00000020.png 00000033.png 00000046.png 00000059.png 00000072.png 00000008-fs8.png 00000021-fs8.png 00000034-fs8.png 00000047-fs8.png 00000060-fs8.png 00000073-fs8.png 00000008.png 00000021.png 00000034.png 00000047.png 00000060.png 00000073.png 00000009-fs8.png 00000022-fs8.png 00000035-fs8.png 00000048-fs8.png 00000061-fs8.png 00000074-fs8.png 00000009.png 00000022.png 00000035.png 00000048.png 00000061.png 00000074.png 00000010-fs8.png 00000023-fs8.png 00000036-fs8.png 00000049-fs8.png 00000062-fs8.png 00000075-fs8.png 00000010.png 00000023.png 00000036.png 00000049.png 00000062.png 00000075.png 00000011-fs8.png 00000024-fs8.png 00000037-fs8.png 00000050-fs8.png 00000063-fs8.png 00000076-fs8.png 00000011.png 00000024.png 00000037.png 00000050.png 00000063.png 00000076.png 00000012-fs8.png 00000025-fs8.png 00000038-fs8.png 00000051-fs8.png 00000064-fs8.png 00000012.png 00000025.png 00000038.png 00000051.png 00000064.png 00000013-fs8.png 00000026-fs8.png 00000039-fs8.png 00000052-fs8.png 00000065-fs8.png 00000013.png 00000026.png 00000039.png 00000052.png 00000065.png % mkdir org % mv <->.png org % ls 00000001-fs8.png 00000014-fs8.png 00000027-fs8.png 00000040-fs8.png 00000053-fs8.png 00000066-fs8.png 00000002-fs8.png 00000015-fs8.png 00000028-fs8.png 00000041-fs8.png 00000054-fs8.png 00000067-fs8.png 00000003-fs8.png 00000016-fs8.png 00000029-fs8.png 00000042-fs8.png 00000055-fs8.png 00000068-fs8.png 00000004-fs8.png 00000017-fs8.png 00000030-fs8.png 00000043-fs8.png 00000056-fs8.png 00000069-fs8.png 00000005-fs8.png 00000018-fs8.png 00000031-fs8.png 00000044-fs8.png 00000057-fs8.png 00000070-fs8.png 00000006-fs8.png 00000019-fs8.png 00000032-fs8.png 00000045-fs8.png 00000058-fs8.png 00000071-fs8.png 00000007-fs8.png 00000020-fs8.png 00000033-fs8.png 00000046-fs8.png 00000059-fs8.png 00000072-fs8.png 00000008-fs8.png 00000021-fs8.png 00000034-fs8.png 00000047-fs8.png 00000060-fs8.png 00000073-fs8.png 00000009-fs8.png 00000022-fs8.png 00000035-fs8.png 00000048-fs8.png 00000061-fs8.png 00000074-fs8.png 00000010-fs8.png 00000023-fs8.png 00000036-fs8.png 00000049-fs8.png 00000062-fs8.png 00000075-fs8.png 00000011-fs8.png 00000024-fs8.png 00000037-fs8.png 00000050-fs8.png 00000063-fs8.png 00000076-fs8.png 00000012-fs8.png 00000025-fs8.png 00000038-fs8.png 00000051-fs8.png 00000064-fs8.png org 00000013-fs8.png 00000026-fs8.png 00000039-fs8.png 00000052-fs8.png 00000065-fs8.png % cd .. % mplayer "mf://cat/*.png" -vo gif89a:output=ninja-cat-pngquant.gif
とこんな感じでできあがり。zshでは<->は数字だけを意味するので簡単に仕分けることが可能。
ImageMagickのconvertを使う方法もある。
各フレームをばらばらにPNGへmplayerで落とし込むとこまでは同じ。
まずはdelayの計算。3秒を枚数で割って100すると10msec単位のdelayが出る。
% echo $[3.0 / `ls | wc -l` * 100] 3.9473684210526314
これを使って一気にGIFに変換。
% convert -delay 4 *.png ninja-cat-convert.gif % ls -o ninja-cat*.gif -rw-r--r-- 1 eban 3947147 2010-07-28 00:36 ninja-cat-convert.gif -rw-r--r-- 1 eban 587975 2010-07-27 00:15 ninja-cat-pngquant.gif -rw-r--r-- 1 eban 457208 2010-07-27 00:12 ninja-cat.gif
できあがりがなんかでかいな。その分きれいだけど。
昨日サイズがやけに違うなで終わったが一応調べてみた。
ImageMagickのidentifyで見てみるとmplayerで作った画像は
% identify ninja-cat.gif ninja-cat.gif[0] GIF 320x240 320x240+0+0 8-bit PseudoClass 256c 446KiB 0.000u 0:00.000 ninja-cat.gif[1] GIF 320x240 320x240+0+0 8-bit PseudoClass 256c 446KiB 0.000u 0:00.000 ninja-cat.gif[2] GIF 320x240 320x240+0+0 8-bit PseudoClass 256c 446KiB 0.000u 0:00.000 ninja-cat.gif[3] GIF 320x240 320x240+0+0 8-bit PseudoClass 256c 446KiB 0.000u 0:00.000 ninja-cat.gif[4] GIF 320x240 320x240+0+0 8-bit PseudoClass 256c 446KiB 0.000u 0:00.000 ninja-cat.gif[5] GIF 320x240 320x240+0+0 8-bit PseudoClass 256c 446KiB 0.000u 0:00.000 ninja-cat.gif[6] GIF 320x240 320x240+0+0 8-bit PseudoClass 256c 446KiB 0.000u 0:00.000 ninja-cat.gif[7] GIF 320x240 320x240+0+0 8-bit PseudoClass 256c 446KiB 0.000u 0:00.000 ninja-cat.gif[8] GIF 320x240 320x240+0+0 8-bit PseudoClass 256c 446KiB 0.000u 0:00.000 ninja-cat.gif[9] GIF 320x240 320x240+0+0 8-bit PseudoClass 256c 446KiB 0.000u 0:00.000 ninja-cat.gif[10] GIF 320x240 320x240+0+0 8-bit PseudoClass 256c 446KiB 0.000u 0:00.000 ninja-cat.gif[11] GIF 320x240 320x240+0+0 8-bit PseudoClass 256c 446KiB 0.000u 0:00.000 ninja-cat.gif[12] GIF 320x240 320x240+0+0 8-bit PseudoClass 256c 446KiB 0.000u 0:00.000 ninja-cat.gif[13] GIF 320x240 320x240+0+0 8-bit PseudoClass 256c 446KiB 0.000u 0:00.000 ninja-cat.gif[14] GIF 320x240 320x240+0+0 8-bit PseudoClass 256c 446KiB 0.000u 0:00.000
のように3秒間で15枚。一方convertのほうは76枚。単にこの違いだった。
mplayerのdefaultは5fpsなんだな、ってman mplayerに書いてあった。
だからきれいに見えたのか。
やっとGmailのspam問題も落ち着いてきた。もうspamフォルダを監視しなくてもよさげだ。
sort | uniq -cしてみたら利用できそうな規則性が。 wakeで使ってみた。
してみたらなどと他人事のように書いているが、おれが出した問題なんだよなあ。
起動するまでが遅い。parrotがそういうもんなんだっけ?
% time ./perl6 -v This is Rakudo Perl 6, version 2010.07-47-g9fd5eaa built on parrot 2.6.0 Copyright 2008-2010, The Perl Foundation ./perl6 -v 0.55s user 0.04s system 100% cpu 0.588 total
Rubyと同じ書き方もできる。
% ./perl6 -e 'print "a b c".split(" ").join(":"), "\n"' a:b:c % ruby -e 'print "a b c".split(" ").join(":"), "\n"' a:b:c
というかもうまったく別の言語だよね。
s///とかy///もチェーンできればなあ。
パッケージクリーナーが便利。なるほど。PPAってのがあるんだな。