Just another Ruby porter,

〜2014年9月上旬〜


<Older(,) | Newer(.)> | Recent(/)>> | RDF

2014-09-01 (Mon)

convertでものすごく重くなる処理をなんとかする

convertはとにかく画像を全部読み込もうとする。
圧縮されてるものは伸長される。
だから数が多いと途中から他のプロセスにも影響が出るくらい遅くなる。
ということはメモリに読み込ませなければいいわけで、
-limit area 8kとかで制限すればとりあえず回避できる。
mmapになるから遅くなるけど、確実に進む。-debug cacheでその様子がわかる。


2014-09-02 (Tue)

90度回転を改善

ページ数が増えると使い物にならなかった 偶数奇数処理だけど、
昨日の件を考えると-limit area 8kで一応解決する。
しかし遅い。368枚で4分。

% convert *.png -format "convert %f -rotate %[fx:t%2?90:-90] -verbose /tmp/%f" info:

よく見ると画像の内容はどうでもよくてscene numberのtとファイル名のfしか使ってない。
というわけで1画素だけ読み込むことにする。これでメモリの消費量を抑えられるはずだ。

% convert "*.png[1x1+0+0]" -format "convert %f -rotate %[fx:t%2?90:-90] -verbose /tmp/%f" info:

8秒ほどで終了した!

% convert *.png -crop 1x1+0+0 -format "convert %f -rotate %[fx:t%2?90:-90] -verbose /tmp/%f" info:

ではだめ。同じように見える処理だが、こちらは結局全部読み込んでから-cropの処理が走るので後の祭り。


2014-09-03 (Wed)

resizeとgeometryとextractとthumbnail

ImageMagickのconvertの話。
実はみんなサイズ指定した場合はresizeだったりするが、これってどう違うのか?
たとえば80%とか指定するとちゃんとみんな80%になる。
マニュアルを見るとextractとresizeは同じと書いてある。
geometryはあまりにもあっさりとした説明でよくわからない。
thumbnailはとにかく速いということだが、resizeと大して速さは変わらない。
一方GraphicsMagickだとthumbnailはめちゃくちゃ速い。resizeの倍ぐらい。
というわけで、GraphicsMagickでスキャン画像を-resizeするなら-thumbnailにしたほうがいい。
ただ文字の太さというか濃さがかなり違うように思うんだけど、フィルタかなにかが違うのか?

% gm benchmark -iterations 100 convert 100.pbm -resize 60% -crop 300x200+100+100 -strip resize-60.png
Results: 1 threads 100 iter 10.25s user 10.26s total 9.747 iter/s 9.756 iter/cpu
% gm benchmark -iterations 100 convert 100.pbm -thumbnail 60% -crop 300x200+100+100 -strip thumbnail-60.png
Results: 1 threads 100 iter 4.13s user 4.88s total 20.492 iter/s 24.213 iter/cpu

ImageMagickだとどちらも20秒以上かかっている。結果は同じ。

% convert -bench 100 100.pbm -resize 60% -crop 300x200+100+100 -strip resize-60.png      
Performance[1]: 100i 4.871ips 1.000e 20.430u 0:20.530
convert -bench 100 100.pbm -thumbnail 60% -crop 300x200+100+100 -strip thumbnail-60.png
Performance[1]: 100i 4.666ips 1.000e 21.340u 0:21.430
% cmp resize-60.png thumbnail-60.png
% 

2014-09-04 (Thu)

Morphology

Morphology of Shapesが面白い。スキャン画像に適用するには文字を太くしたいときに使えそう。
たとえばDilateメソッドで拡大させればいい。
kernelとしては十字1画素がまずは無難。
いろんなkernelの最小がこれになるのでどれでもいいが、
デフォルトが1になってるDiamondがいいかな。

% convert foo.png -negate -morphology Dilate Diamond -negate foo-mor.png

こんな感じでok。-morphologyは白が主なので黒い文字を拡大したければ-negateする必要がある。

なかなかいい感じ。ただ単位が画素なのでdpiが低い画像だとつぶれる。


2014-09-05 (Fri)

Google Chrome 要素の検証 Copy as cURL

要素の検証のNetworkはよく使うが、リンクの部分を右クリックするとCopy as cURLなんてものが!

curl 'https://www.google.co.jp/search?q=hoge&hl=ja&ie=UTF-8&btnG=Google+%E6%A4%9C%E7%B4%A2&domains=jarp.does.notwork.org&sitesearch=jarp.does.notwork.org&gws_rd=ssl' \
-H 'accept-encoding: gzip,deflate,sdch' \
-H 'accept-language: ja,en-US;q=0.8,en;q=0.6' \
-H 'user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1736.3 Safari/537.36' \
-H 'accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' \
-H 'referer: https://jarp.does.notwork.org/jarp/diary/' \
-H 'cookie: SID=<省略>' \
-H 'x-client-data: CJa2yQEIpLbJAQiptskBCMaIygE=' \
--compressed

一番下のGoogle 検索でhogeを検索させたのがこれ。
ボタンを押す前にPreserve logはチェックしておこう。画面が変わってもログが残る。
cookieが長いと大変なことになりそうだが、これは便利だ。


2014-09-06 (Sat)

Morphology Erode

低解像度ではDilateだと穴がやはりつぶれ気味でなんとかならないかなとErodeを試してみた。
Erodeは白を縮小するが逆にいうと黒を拡大するわけで、-negateする必要もない。

でやってみたのが下図だが、なぜかいい感じにDilateよりも抑え気味な変換になっている。

% convert 100.pbm -crop 200x300+400+300 \
  \( +clone -morphology erode diamond \) \
  \( +clone -negate -morphology dilate diamond -negate \) \
  -bordercolor gray -border 1x2 +append \
  \( -gravity center -size 200x30 label:{Origial,Erode,Dilate} -border 1x2 +append \) \
  -append 100-erode-dilate.png

単純に逆というわけでもないんだな。面白い。


2014-09-07 (Sun)

驚くほどきれいな本文

あばれるの困るが逆にきれいにそろってしまうのも困る。

これは100枚ほど重ねたわけだけど、だめだったようで。
そこでerodeで黒を拡大してみる。ちょっと派手目にdiamond:3にしてみた。
これでくっついた。

縦方向にくっつくとまたやっかいなのでrectangle:7x1とかがいいかも。


2014-09-08 (Mon)

今日のお題ring

こんな感じで80行ほどのファイルがある。5行でも同じなので5行で。

A
B
C
D
E

これを

A B
B C
C D
D E
E A

とするにはどうしたらいいかというのが今日のお題。
ちなみ今これをどうやって作ったかというと、
vimでまず:%s/$/ /で空白を足しといて、
BからEまでCTRL+Vで選択してyして
"A "の空白へカーソルを移動してpして最後にAを追加。
実は意外に簡単にできちゃって唖然としてたりするがまあいいか。
本当はawkでやろうと思ってたんだけど。


2014-09-09 (Tue)

昨日のお題ring

やっぱawkでやってみるよ。

% printf "A\nB\nC\nD\nE\n" | awk '{if(l)print l,$0;else f=$0;l=$0}END{print $0,f}'    
A B
B C
C D
D E
E A

配列にしようかと思ったが、最初だけ覚えておけばいいのであった。
だったらこれでもいいのか。

% printf "A\nB\nC\nD\nE\n" | sed '1h;1!p;$G' | paste -d' ' - - 
A B
B C
C D
D E
E A

pasteで- -を指定する技はちょくちょく出てくる。


2014-09-10 (Wed)

「1から100の整数ただし5つの異なる方法」

zshにはrepeatがあるので。

% repeat 100 echo $[++i]

あとはzshじゃなくてもbashでもいける。{1..100}を変換する。
xargsはコマンドを指定しないと/bin/echoが呼ばれる。

% echo {1..100} | xargs -n1

awkで変換。

% echo {1..100} | awk '(OFS=RS)&&$1=$1'

trじゃなくてもsedで。

% echo {1..100} | sed 'y/ /\n/'

/etcからじゃなくて乱数で。

% repeat 1000 { echo $[RANDOM%100+1] } | sort -nu | head -100

最後に最近熱いconvertで。

% convert null: -duplicate 99 -scene 1 -format %s info:

<Older(,) | Newer(.)> | Recent(/)>> | RDF


WWW を検索 jarp.does.notwork.org を検索

わたなべひろふみ
Key fingerprint = C456 1350 085F A320 C6C8 8A36 0F15 9B2E EB12 3885
Valid HTML 4.01!