〜2015年5月中旬〜
色の指定を自由に定義できてなかなか楽しい。
% cat date.conf regexp=(\d\d):(\d\d):(\d\d) colours=,red,yellow,cyan % date | grcat date.conf Mon May 11 22:23:37 JST 2015
groupingの()とcoloursが対応している。
色は複数指定可能で、=とか記号を区切りにすればいい。
たとえばcalで日曜を赤、土曜を青にしたければこんな感じになる。
% cat ~/.grc/conf.cal
regexp=^ ?\d{1,2}
colours=white on_red
===
regexp=\d{1,2} $
colours=white on_blue
% cal | grcat conf.cal
May 2015
Su Mo Tu We Th Fr Sa
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
空白まで色をつけなくていいならこんな感じ。
% cat ~/.grc/conf.cal
regexp=^ ?(\d{1,2})
colours=,white on_red
===
regexp=(\d{1,2}) $
colours=,white on_blue
% cal | grcat conf.cal
May 2015
Su Mo Tu We Th Fr Sa
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
なんか見辛い。反転しないで太字で出したほうがいいか。
% cat ~/.grc/conf.cal
regexp=^ ?(\d{1,2})
colours=,red bold
===
regexp=(\d{1,2}) $
colours=,blue bold
% cal -h | grcat conf.cal
May 2015
Su Mo Tu We Th Fr Sa
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
tmuxのステータスラインにshとかbashとか出ても、
スクリプトなのかよくわからんのでプロセス名を変更する方法を調べみた。
zshだとjobs -Z nameで可能。
ただzshでスクリプトはあんまり書かないのでどうでもいい。
bashでの方法が知りたかったが、
man bashしたらexec -a name fooでいけそう。
でもexecしないといけないわけで、それってwrapperだよな。
ってことはexec -aするだけのwrapperスクリプトを作っておけばいいのか。
#! /bin/bash name="$1" shift exec -a "$name" "$@"
chpname.shと名前をつけた。これを日記を書くスクリプトに適用してみる。
#! /bin/sh
date="${1--12 hour}"
exec chpname.sh nikki vim ~/jarp/diary/$(date -d "$date" +"%Y/d%Y%m%d.hnf")
おお、できた。ちゃんとnikkiと表示されるようになった。
最近再生直後は反応しなかったり、予約した番組が録画されなかったり、
消せない番組が出てきたり、そもそも遅かったりと、
ひどい症状だったSmart J:COM Boxさんをリセットしてみたら全部解消された。
やっぱ電源ボタン押してOFFにしても動き続けてるんだよね。
起動だけはやたらと速いし。
たぶんシステムアップデートが最近ないので再起動もかからないから、
長時間動き続けてメモリリークといったところか。
LisperというくらいだからLispでというのが前提にあるんだと思うが、
まあいろんな言語で考えるのも一興。というわけでシェル芸だ。
% echo|awk '{for(;i<length("abcdefghij");)s+=++i;print s}'
55
% id|awk '{for(;i<length("abcdefghij");)s+=++i;print s}'
55
% seq `(cal;id;id)|wc -l`|paste -sd+|bc
55
% seq -s+ `(cal;id;id)|wc -l`|bc
55
% seq -s+ `echo|od -An -td`|bc
55
% seq -s+ `echo|od -iAn`|bc
55
となぜかゴルフしてる。
calは8行、idは1行しか出力しないことを前提にしている。
"\n"はASCIIコードで10なのでodでダンプするときに10進にすれば10を得られる。
bashだと{a..j}でa b c d e f g h i jを表わすので10回繰り返しも結構簡単。
$ a= s=;for i in {a..j};do ((s+=++a));done;echo $s
55
10じゃなくて100とか1000だとこういう方法はなかなか使えないので、
もうちょっと大きいほうがよかったのかもしれない。
Go: 計算なしのFizzBuzz - Qiitaを見て感心したのでbashへ移植。
微調整は10msecじゃ無理だったので100msecで。
#! /bin/bash
if [ -n "$1" ]; then
while :; do
sleep $1; echo -n $2 >> fizzbuzz.txt
done
fi
trap 'trap - SIGTERM && kill 0' SIGINT SIGTERM EXIT
: > fizzbuzz.txt
exec bash $0 3 Fizz &
sleep 0.1
exec bash $0 5 Buzz &
sleep 0.1
for i in {1..100}; do
sleep 1
if [ -s fizzbuzz.txt ]; then
i=
fi
cat fizzbuzz.txt
echo $i
: > fizzbuzz.txt
done
これは正確に3秒とか5秒間隔にはならないので、数を増やせばそのうち破綻する。
日本語のファイル名をつけたPDFをparallelで扱っているとなぜかエラーになる現象にぶちあたった。
% parallel echo ワ{} ::: 1
parallel: Error: Command cannot contain the character �. Use a function for that.
前にもあったので確認してみると「ワ」「ク」あたりが含まれていると起こるようで。
% echo -n ワク | od -tx1 0000000 e3 83 af e3 82 af 0000006
afが怪しい。e3 81 afで試してみる。
% echo '\xe3\x81\xaf'
は
m:scan/1505 % parallel echo は{} ::: 1
parallel: Error: Command cannot contain the character �. Use a function for that.
当たっているようだ。そういえばparallelはperlで書かれてたはずなので直接見てみた。
# Replace replacement strings with {= perl expr =}
# Protect matching inside {= perl expr =}
# by replacing {= and =} with \257< and \257>
for(@command) {
if(/\257/) {
::error("Command cannot contain the character \257. Use a function for that.\n");
::wait_and_exit(255);
}
s/\Q$Global::parensleft\E(.*?)\Q$Global::parensright\E/\257<$1\257>/gx;
}
\257は\xafなのでまさにこれが原因だ。
どうも内部的に一旦置き換えて処理してるようで回避不可っぽい。
とりあえずxargs -Pでもいけるのでそっちで対処した。
convert foo.pdf foo.pngすると内部的にgsが起動されるが、
例のやたらと重くなる問題でほとんど使えない。
じゃ直接gsを起動するとどうなるのか?
% gs -q -dNOPAUSE -r300 -dBATCH -sDEVICE=png256 -sOutputFile=%03d.png foo.pdf
ちょっとオプションがうるさいが、処理は速い。
重くもならない。
ページの範囲も -dFirstPage=0 -dLastPage=99 のように指定できるし、
これで十分かも。
さくらからVENOM対応のメールが来た。
VMの再起動が必要になるので放置してさくら側に任せるか自分でやるかだが、
コンパネにも最近ログインしてないのでやってみた。
VPS側はshutdown -h nowしたが停止にならないので、強制的にVMを停止して起動。
これで一応対応完のはず。
奇しくもCPIも同じようなタイミングだった。
電話は面倒だと思ってやってなかったけど、タブレットでも可能だと聞いてやっと設定した。
それは1ヶ月ほど前だったが、今日久し振りにThunderbirdでメールを書いたら送れない。
そこで2段階認証を思い出した。ってこれどうするんだ?Thunderbirdは対応してない。
調べてみるとアプリ用に別のアクセスキー的なパスワードを発行せよとのこと。
それをパスワードに使えば2段階認証を回避できる。
簡単にrevokeできるからいいってことか。