Just another Ruby porter,

〜2016年7月上旬〜


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

2016-07-01 (Fri)

zsh: 引数リストが長すぎます

先日のrsyncの実験で100万ファイルを作ったわけだけど、
普通に引数で指定すると長すぎてエラーになってしまう。

% time touch a/{01..1000000}
zsh: 引数リストが長すぎます: touch

こういうときはどうするかというとxargsを使う。
これがxargsの本来の使い方でOSの制限内の引数サイズで分割してコマンドを実行してくれる。

% time seq -w 1000000 | xargs touch
seq -w 1000000  0.90s user 0.01s system 2% cpu 34.366 total

ファイルを作るだけでも結構時間がかかる。


2016-07-02 (Sat)

ピタゴラ暗号棒

jqで。

% echo 'つおたくところうやうさきよん' | jq -Rr './""|.[keys|group_by(.%3)[1,2,0][]]'
お
と
う
さ
ん
た
こ
や
き
つ
く
ろ
う
よ

ちょっと縦に場所を食ってるのでpasteで横に。

% echo 'つおたくところうやうさきよん' | jq -Rr './""|.[keys|group_by(.%3)[1,2,0][]]' | paste -sd ""
おとうさんたこやきつくろうよ

実はjqだけでもできる。

% echo 'つおたくところうやうさきよん' | jq -Rr '[./""|.[keys|group_by(.%3)[1,2,0][]]]|join("")'
おとうさんたこやきつくろうよ

ちょっと解説。./""はsplit("")と同じで1文字毎に配列に変換してる。

% echo 'つおたくところうやうさきよん' | jq -Rc './""'
["つ","お","た","く","と","こ","ろ","う","や","う","さ","き","よ","ん"]

ここから「おとうさんたこやきつくろうよ」を拾う。
index的には[1,4,7,10,13,2,5,8,11,0,3,6,9,12]という配列ができれば抜き出せる。

% echo 'つおたくところうやうさきよん' | jq -Rc '[./""|.[1,4,7,10,13,2,5,8,11,0,3,6,9,12]]'   
["お","と","う","さ","ん","た","こ","や","き","つ","く","ろ","う","よ"]

その配列はそれぞれ3で割って1,2,0余るものなのでkeys|group_by(.%3)[1,2,0]と表現できる。

% echo 'つおたくところうやうさきよん' | jq -Rc '[./""|keys|group_by(.%3)[1,2,0][]]'
[1,4,7,10,13,2,5,8,11,0,3,6,9,12]

以上まとめると最初の例になる。


2016-07-03 (Sun)

rsコマンド

結構便利。transposeが簡単にできるのがいいね。
Debian系ならそのものずばりのrsでインストールできる。

% sudo apt-get install rs

transposeは-Tでok。それとxargs -n3みたいなのも可能。

% seq 100 | rs 0 10
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 | rs -j 0 10
  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 | rs -j -g1 0 10
  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 | rs 0 10 | rs -j -g1 -T
  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

ピタゴラ暗号棒もいける。

% echo 'つおたくところうやうさきよん' | grep -o . | rs 0 3 | rs -T -g0 | sed '1{h;d};$G'
おとうさん
たこやき
つくろうよ

2016-07-04 (Mon)

Linux Lite 3.0

Linux Lite 3.0 Final Released
いつのまにかリリースされてたのでupgradeするかと思ったら、
最後のほうにこんな文言が。

There is NO upgrade from Series 2 ( 2.0, 2.2, 2.4, 2.6, 2.8 ) to Series 3.

まじか。インストールし直しだ。

それはそれとしてこのままdo-release-upgradeするとどうなるのか?


2016-07-05 (Tue)

SlackとGoogle Chromeの相性

かなり悪い。

bot-userの生成とかOutgoing Webhooksの設定保存とかしようとすると、高い確率で失敗する。
これがエラーもなく単に元の値に戻るだけだったりするので非常にわかりにくい。
最初は気づかなかったくらい。
なぜか反映されないなと確認して何度か実行してようやく気づいた。
いろいろ試しているとGoogle Chromeだとそんな感じになるようで。
Firefoxでは起きてない。
というわけでSlackの設定で変なことが起きたらGoogle Chromeを疑ってみよう。


2016-07-06 (Wed)

xargs -n1は遅い

xargsはコマンドを省略すると/bin/echoを呼ぶ。
ということはxargs -n1は分割された要素の数だけ/bin/echoを実行してしまう。
10000個で5秒もかかってしまう。

% echo {1..10000} | time -f %E xargs -n1 > /dev/null
0:04.98

そこでtr -s ' ' '\n'の出番だが、fmt -1でもいいかもしれない。短いし。

% echo {1..1000000} | sed 's/ /  /g' | /usr/bin/time -f %E tr -s ' ' '\n' > /dev/null
0:00.91
% echo {1..1000000} | sed 's/ /  /g' | /usr/bin/time -f %E fmt -1 > /dev/null
0:00.97

速度もそんなに変わらない。


2016-07-07 (Thu)

ピタゴラ暗号棒短冊 #jq

七夕ということでピタゴラ暗号棒と短冊を合体してみた。jqで。

% echo 'つおたくところうやうさきよん' | \
  jq -Rr './""|[.[keys|group_by((.+2)%3)[][]]]|"+----+","| \(.[]) |","+----+"' 
+----+
| お |
| と |
| う |
| さ |
| ん |
| た |
| こ |
| や |
| き |
| つ |
| く |
| ろ |
| う |
| よ |
+----+

2016-07-08 (Fri)

jqの小ネタ

複数の条件があるときは全部愚直に書かないといけない。

% seq 10 | jq 'select(. == 1 or . == 3 or . == 8)' 
1
3
8

正規表現でと思ったが、元が数値なのでかえって面倒なことに。

% seq 10 | jq 'select(tostring|test("^(1|3|8)$"))'
1
3
8

jqではcommaでまとめられるようだ。

% seq 10 | jq 'select(. == (1,3,8))'              
1
3
8

cf: json - How to filter array of objects by element property values using jq? - Stack Overflow


2016-07-09 (Sat)

jqで短冊

短冊jq芸を書こうと思ってたら寝落ちして明け方twitterに投稿したのがこれ。

% echo ちょっと出遅れた | jq -Rrs '"+----+","| \((./"")[:-1][]) |","+----+"'
+----+
| ち |
| ょ |
| っ |
| と |
| 出 |
| 遅 |
| れ |
| た |
+----+

やはり寝惚けてたらしく-sなんて不要だった。
そうすれば1.5のバグっぽい仕様の小細工([:-1])も不要になる。

% echo ちょっと出遅れた | jq -rR '"+----+","| \((./"")[]) |","+----+"' 
+----+
| ち |
| ょ |
| っ |
| と |
| 出 |
| 遅 |
| れ |
| た |
+----+

"+----+"が2個出てくるから変数に入れたいとこだが、残念ながらそのほうが長くなる。

% echo ちょっと出遅れた | jq -rR '"+----+"as$s|$s,"| \((./"")[]) |",$s'
+----+
| ち |
| ょ |
| っ |
| と |
| 出 |
| 遅 |
| れ |
| た |
+----+

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