Just another Ruby porter,

〜2014年8月上旬〜


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

2014-08-01 (Fri)

ruby-talk ML

なんか急にruby-talk MLが止まってしまって、
どうなってるのかログを見てもよくわからず、
週末にでもじっくり調べようと思っていたら、
今日になって突然流れてきた。
単に寂れただけ?
他のruby-coreとかは動いていたしなあ。


2014-08-02 (Sat)

第12回本当は怖くないシェル芸勉強会

Q6をzshで。

% printf "5\n3\n4\n10\n2\n" | while read a;do echo ${(l:2:)a} ${(l:a::*:)};done
 5 *****
 3 ***
 4 ****
10 **********
 2 **

awkで文字を繰り返すにはOFSを使う手もある。

% awk 'BEGIN{NF=5+1; OFS="*"; print}'                                          
*****
% printf "5\n3\n4\n10\n2\n" | awk '{printf "%2d ", $1; NF=$1+1; $1=""}OFS="*"'   
 5 *****
 3 ***
 4 ****
10 **********
 2 **

区切りは間にあるのでフィールド数は1つ大きい。

Q2をGNU sedで。

% < kaibun sed 'h;s/.*/echo &|rev/e;x;G;s/\n.//'
たけやぶやけた
わたしまけましたわ

小問1のほうはzshならこんな方法も。

% echo わたしまけ > >(rev) | sed 'N;s/\n.//'
わたしまけましたわ

teeだとfdが違うようでstdoutひとつにはまとまらなくなる。

% echo わたしまけ | tee >(rev) | sed 'N;s/\n.//'
けましたわ
わたしまけ
% (echo わたしまけ | tee >(rev)) | sed 'N;s/\n.//'
わたしまけましたわ

2014-08-03 (Sun)

Q5 各行の数字を大きい順にソートしてください

Q5をzshで。

% cat input
A 31 1234 -42 4
B 10 31.1 -34 94
% < input while read -A a;do echo ${(nO)a};done
A 1234 31 4 -42
B 94 31.1 10 -34

本来ならAとBは別に処理して

% < input while read -A a;do echo $a[1] ${(nO)a[2,-1]};done
A 1234 31 4 -42
B 94 31.1 10 -34

のようにすべきだが、大きい順だとうまい具合にまとめてソートしても題意と合ってしまう。
numeric sortでも数値よりもアルファベットのほうが大きいらしい。

処理を分けるなら

% < input while read a b;do echo $a ${(s: :nO)b};done
A 1234 31 4 -42
B 94 31.1 10 -34

のように数字の部分だけsplitする手もあるかな。


2014-08-04 (Mon)

文字列の繰り返し

awkで素直に書くとloopになる。

% awk 'BEGIN{for(i=0;i<5;i++)$0=$0"*";print}'                    
*****

結構短い。"%*s"の空白を利用する手もある。

% awk 'BEGIN{$0=sprintf("%*s",5,"");gsub(/./,"*");print}'
*****

これはシェルスクリプトでも使われる。

% s=`printf "%*s" 5`;echo "${s// /*}"
*****

5バイトならなんでもいいので

% s=`w|head -c5`;echo "${s//?/*}"
*****

という手もある。長いときはyesで。
先日は

% awk 'BEGIN{OFS="*";NF=6;print}'
*****

と書いたが、

% awk 'BEGIN{$5=OFS="*";print}'
*****

のほうが5という数字が出てくるのでわかりやすいかもしれない。短いし。

% printf "5\n3\n4\n10\n2\n" | awk '$1=sprintf("%2d ",$1){$$1=OFS="*"}1' 
 5 *****
 3 ***
 4 ****
10 **********
 2 **

2014-08-05 (Tue)

たいへんよくできましたハンコをむりやり縦書きに

今日はハンコの日なので縦書きに挑戦してみた。
まずは

% printf "たいへん\nよくでき\nました\n"
たいへん
よくでき
ました

をなんとかする。3つの部分を別々に処理しよう。というわけでこんなのを考えた。

% printf "たいへん\nよくでき\nました\n"|tac|xargs -n1 -I% sh -c \
  'echo "%"|grep -o .|convert -pointsize 40 -font 梅明朝-Regular -gravity northeast -stroke red -strokewidth 4 label:@- -trim miff:-' | \
  convert - +append tydtyd.png

やってる内容はだいたいこんな感じ。

% alias tate='convert -pointsize 40 -font 梅明朝-Regular -gravity northeast -stroke red -strokewidth 4 label:@- -trim' 
% printf "た\nい\nへ\nん"|tate taihen.png
% printf "よ\nく\nで\nき"|tate yokudeki.png
% printf "ま\nし\nた"| tate mashita.png
% convert mashita.png yokudeki.png taihen.png +append tydtyd.png

あとは 昨年作ったガワと組み合わせて完成。

% convert tyd.png \( tydtyd.png -resize 50% \) -gravity center -compose multiply +composite -rotate -20 tyd2014-20.png


2014-08-06 (Wed)

環境変数が設定されていたら実行する

まあ、普通はこんな感じのdebug文になると思う。

% sh -c 'if [ -n "$debug" ]; then echo foo; fi'         
% debug=1 sh -c 'if [ -n "$debug" ]; then echo foo; fi'
foo

短くするにしても&&を使うぐらい。
でもそれよりもっと簡単に書けることに最近気づいた。
変数展開にいまいち使い途のよくわからない+があるが、
これがぴったりはまる。先の例は

% sh -c '${debug:+echo foo}'                     
% debug=1 sh -c '${debug:+echo foo}'
foo

で済んでしまう。debugが設定されていればecho fooに置き換わるので。

${parameter:+word}
	Use Alternate Value.  If parameter is null or unset, nothing is
        substituted, otherwise the expansion of word is substituted.

環境変数さえ設定されていれば値は空でもいいとするなら:+を+にすればいい。

% debug= sh -c '${debug:+echo foo}' 
% debug= sh -c '${debug+echo foo}' 
foo

2014-08-07 (Thu)

ls -lのサイズを3桁区切りに

英語ではcommifyというが、ls -lしてもcommaで区切ってくれない。

% ls -l saitama-temp.log
-rw-r--r-- 1 eban eban 1871583 2013-09-25 14:55:00 saitama-temp.log

GNU coreutilsのnumfmtを使えばフィールド指定もできるのでピンポイントで変換可能。

% ls -l saitama-temp.log | numfmt --grouping --field=5
-rw-r--r-- 1 eban eban 1,871,583 2013-09-25 14:55:00 saitama-temp.log

GNU coreutilsのいくつかのコマンドはオプション--block-sizeか、
BLOCK_SIZE環境変数で'を指定すると区切ってくれる。

% BLOCK_SIZE=\'1 LC_NUMERIC=en_US.UTF-8 ls -l saitama-temp.log
-rw-r--r-- 1 eban eban 1,871,583 2013-09-25 14:55:00 saitama-temp.log
% BLOCK_SIZE=\'1 LC_NUMERIC=en_US.UTF-8 du saitama-temp.log
1,871,872	saitama-temp.log
% BLOCK_SIZE=\'1 LC_NUMERIC=en_US.UTF-8 df .                 
Filesystem             1B-blocks            Used         Available Use% Mounted on
/dev/sda2      1,960,461,266,944 841,254,100,992 1,019,597,889,536  46% /

localeも適切に指定してやる必要がある。

   A block size specification preceded by `'' causes output sizes to be
displayed with thousands separators.  The `LC_NUMERIC' locale specifies
the thousands separator and grouping.  For example, in an American
English locale, `--block-size="'1kB"' would cause a size of 1234000
bytes to be displayed as `1,234'.  In the default C locale, there is no
thousands separator so a leading `'' has no effect.

2014-08-08 (Fri)

表形式を整形する(columnとsc)

columnを使うときれいに整形されるが、数値でも左詰めにしてしまう。

% seq 100 | xargs -n10                 
1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30
31 32 33 34 35 36 37 38 39 40
41 42 43 44 45 46 47 48 49 50
51 52 53 54 55 56 57 58 59 60
61 62 63 64 65 66 67 68 69 70
71 72 73 74 75 76 77 78 79 80
81 82 83 84 85 86 87 88 89 90
91 92 93 94 95 96 97 98 99 100
% seq 100 | xargs -n10 | column -t
1   2   3   4   5   6   7   8   9   10
11  12  13  14  15  16  17  18  19  20
21  22  23  24  25  26  27  28  29  30
31  32  33  34  35  36  37  38  39  40
41  42  43  44  45  46  47  48  49  50
51  52  53  54  55  56  57  58  59  60
61  62  63  64  65  66  67  68  69  70
71  72  73  74  75  76  77  78  79  80
81  82  83  84  85  86  87  88  89  90
91  92  93  94  95  96  97  98  99  100

むかしからあるがあまり使われないコマンドにscがある。
これを使うと右詰めになる。

% seq 100 | xargs -n10 | psc | sc -W% -
  1  2  3  4  5  6  7  8  9  10
 11 12 13 14 15 16 17 18 19  20
 21 22 23 24 25 26 27 28 29  30
 31 32 33 34 35 36 37 38 39  40
 41 42 43 44 45 46 47 48 49  50
 51 52 53 54 55 56 57 58 59  60
 61 62 63 64 65 66 67 68 69  70
 71 72 73 74 75 76 77 78 79  80
 81 82 83 84 85 86 87 88 89  90
 91 92 93 94 95 96 97 98 99 100

ただ、今度は文字列も右詰めにしてしまうし、
計算式らしいものはそれなりに評価されてしまう。

% ls -l
total 1832
-rw-r--r-- 2 eban eban 1871583 2013-09-25 14:55:00 a.txt
-rw-r--r-- 2 eban eban    2880 2014-07-26 09:18:54 foo.txt
% ls -l | psc | sc -W% -
      total 1832
 -rw-r--r--    2 eban eban 1871583       1979 14:55:00   a.txt
 -rw-r--r--    2 eban eban    2880       1981 09:18:54 foo.txt

元々スプレッドシートだしねえ。awkで書くか。

scといえば面白い機能があって、簡単にtrasnposeできる。

% seq 100 | xargs -n10 | psc -r | sc -W% -
  1 11 21 31 41 51 61 71 81  91
  2 12 22 32 42 52 62 72 82  92
  3 13 23 33 43 53 63 73 83  93
  4 14 24 34 44 54 64 74 84  94
  5 15 25 35 45 55 65 75 85  95
  6 16 26 36 46 56 66 76 86  96
  7 17 27 37 47 57 67 77 87  97
  8 18 28 38 48 58 68 78 88  98
  9 19 29 39 49 59 69 79 89  99
 10 20 30 40 50 60 70 80 90 100

2014-08-09 (Sat)

scanimageの--swdespeckオプション

なかなかすごいオプションを発見した。

--swdespeck 0..9 (in steps of 1) [0]
    Maximum diameter of lone dots to remove from scan.

英語だったのであまりよく見てなかったが、
これは孤立した点のようなノイズを除去してくれるということだな。

早速0と9でどのくらい違うかやってみた。

いやー、これはすばらしい。三点リーダーが完全に消えている。
って消えちゃだめだから真ん中の5ぐらいにしとくか。
あと本当の小さいノイズもちゃんと消えてる。


2014-08-10 (Sun)

ImageMagickのconvertはfoo.pbm.gzでもok

scanimageでスキャンするとpbmとかpgmになるが、
pngにするよりはそのままgzip *.pbmで圧縮したほうが簡単なので、
最近はpbm.gzだらけになっている。
ふとconvert foo.pbm.gzでひょっとしたらいけるのかと思って試したら全然問題なく処理できた。
このあたりは気が利いてるな。

bzip2でもいけるが、xzはだめのようだ。delegates.xmlに書けばいけるのかもしれないが。


<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!