〜2010年10月下旬〜
体調不良のため寝ていたが、redmineからメールが化ける件をちょっと調べた。
[ruby-dev:42435]がThunderbirdでも化けていてやはり元が悪いんだろうと推察。
化けるのはbodyを生のiso-2022-jpで送ってるのにQuoted-printable指定してるのが原因。
これでは=が含まれる文字があるとそこから化けてしまう。
具体的にはよく使われる「書」がそれに当たる。
% echo 書 | nkf -Wj | od -tx1z 0000000 1b 24 42 3d 71 1b 28 42 0a >.$B=q.(B.< 0000011
そういえばSubjectも生のiso-2022-jpだな。今となっては珍しい。
やっとシーズン6まで見終わった。シーズン7からはテレビで見てるので追いついたことになる。
DVDと再放送と今やってるシーズン9と同時に見てるが、全然混乱しないとことがなんかすごい。
$:.fillか。これはおれも気づいてたんだけど環境依存なんだよね。ゴルフ場だと$:の要素は
/usr/local/lib/site_ruby/1.8 /usr/local/lib/site_ruby/1.8/i486-linux /usr/local/lib/site_ruby/1.8/i386-linux /usr/local/lib/site_ruby /usr/lib/ruby/vendor_ruby/1.8 /usr/lib/ruby/vendor_ruby/1.8/i486-linux /usr/lib/ruby/vendor_ruby /usr/lib/ruby/1.8 /usr/lib/ruby/1.8/i486-linux /usr/lib/ruby/1.8/i386-linux .
と11個あるのでうまくいく。0,1,4,...,100とまさにぴったりはまる。
でもUbuntu 10.10のruby 1.8.7だと
/usr/local/lib/site_ruby/1.8 /usr/local/lib/site_ruby/1.8/x86_64-linux /usr/local/lib/site_ruby /usr/lib/ruby/vendor_ruby/1.8 /usr/lib/ruby/vendor_ruby/1.8/x86_64-linux /usr/lib/ruby/vendor_ruby /usr/lib/ruby/1.8 /usr/lib/ruby/1.8/x86_64-linux .
のように9個なので0,1,4,...,64と81,100が除外されずに失敗する。
?dを99にすれば100には対処できるが81はどうやっても無理。
ゴルフ場の個数までは確認しなかったのが敗因だな。
この問題の絶妙なところは3以上ってとこ。これが2以上だと
a=*2..99 p a-a.map{|x|x*x}
とあまり面白みがない。
なんというまだろっこしさ。
% git status | awk '/modified/{print $3}'
で十分だよね。
crontabで隔週金曜日に実行する方法について調べてたら結構面倒なことのようで。
一見fri/2でよさげだが、これは第1,3,5金曜日を意味するので、
5週目があると翌週が1週目になり連続してしまう。
つまりあくまでも月の中だけで閉じた話になっている。
じゃあ、date +%Wを使うのはどうだろうと
0 0 * * fri test $(expr $(date +\%W) \% 2) = 1 && command
としてみたが、定義を見てつらつら考えてみると
%W 年の週数, 月曜が週の初め (00..53)
月単位が年単位になっただけで、年によっては年末年始で破綻しそう。
つまりどこかからの起点で考える必要がある。dateだと+%sしかない。
%s 1970-01-01からの秒数 00:00:00 UTC
なんか日本語訳が変だが、1970-01-01 00:00:00 UTCからの秒数だな。
これを60*60*24*7=604800で割ればよさげだ。
ただし、1970-01-01は木曜日なのでここを起点にするのは得策ではない。
週の始まりを日曜日とするなら1970-01-04を起点にしたほうがいいだろう。
JSTも考慮すると結局オフセットは
% date -d 1970-01-04 +%s 226800
となる。以上をまとめると以下のようなcrontabになる。
0 0 * * fri test $(expr \( $(date +\%s) - 226800 \) / 604800 \% 2) = 1 && command
と、長々とdateを使う方法を書いてきたが、実はflagファイルを使えばもっと簡単にできる。
0 0 * * fri if [ -f flag ];then rm flag; else touch flag; command; fi
flagファイルを作ったり消したりを繰り返せばいい。
0 0 * * fri mkdir flag 2> /dev/null && command || rmdir flag
ってのもありかな。
あれ?each_with_indexでいいような。
% irb >> x = [*"A".."Z"].shuffle => ["H", "K", "T", "N", "O", "I", "J", "Z", "Y", "U", "P", "B", "R", "E", "Q", "S", "X", "L", "A", "F", "C", "M", "W", "V", "G", "D"] >> x.each_with_index.max[1] => 7 >> RUBY_DESCRIPTION => "ruby 1.8.7 (2010-06-23 patchlevel 299) [x86_64-linux]"
いっぱいたまった後で読むをひたすら読みまくっていたら、すでに読めない記事もあった。
livedoorニュースだ。まあでもさすがに10日ぐらい経ってる記事はもう読まなくてもいいようだ。
Read It Laterはbookmarkletより拡張をインストールしたほうが便利だ。
manualのhistoryのとこを読んでたが、普通に変数でも使えるとわかった。
% a=ls % echo $a:u LS % echo ${(U)a} LS % pwd /home/eban % echo $a:a /home/eban/ls % echo $a:c /bin/ls
:aで絶対パスにしてくれる。これは地味に便利かも。
:cでPATHを探して最初に見つかったコマンド。
そろそろiconv一掃するか。まずはこの日記のRSS出力の部分を。
openの引数を"r:iso-2022-jp:utf-8"にすればよさそうだ。
あまりに懐しくてWhat's Michaelの6巻を読んで確認した。
ちゃんと持ってた。初版だった。もう20年以上前なんだな。
というわけで、しばらくお休み。と書いても意味ないんだが。
サーバが死んでるのでdlvr.itから警告がやってきた。
We have not been able to successfully retrieve the following feed continuously over a period of more than 24 hours. We will no longer attempt to retrieve it until you reactivate in your dlvr.it account.
ちゃんと機能してるねえ。dlvr.itは安定してるし結構いいよね。