Just another Ruby porter,

〜2010年10月下旬〜


<Prev(,) | Next(.)> | Recent(/)>> | RDF

2010-10-21 (Thu)

[Redmine] Redmineからのメールがたまに化ける件

体調不良のため寝ていたが、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だな。今となっては珍しい。


2010-10-22 (Fri)

[ドラマ] 相棒

やっとシーズン6まで見終わった。シーズン7からはテレビで見てるので追いついたことになる。
DVDと再放送と今やってるシーズン9と同時に見てるが、全然混乱しないとことがなんかすごい。


2010-10-23 (Sat)

[Golf] perfect square free

$:.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}

とあまり面白みがない。


2010-10-24 (Sun)

Show the changed files in your GIT repo

なんというまだろっこしさ。

% git status | awk '/modified/{print $3}'

で十分だよね。


2010-10-25 (Mon)

[Tips] crontabで隔週実行

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

ってのもありかな。


2010-10-26 (Tue)

[Ruby] list comprehension

あれ?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]"

2010-10-27 (Wed)

後でまとめて読む

いっぱいたまった後で読むをひたすら読みまくっていたら、すでに読めない記事もあった。
livedoorニュースだ。まあでもさすがに10日ぐらい経ってる記事はもう読まなくてもいいようだ。
Read It Laterはbookmarkletより拡張をインストールしたほうが便利だ。


2010-10-28 (Thu)

[zsh] 今日のzsh

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を探して最初に見つかったコマンド。

[Ruby] warning: iconv will be deprecated in the future, use String#encode instead.

そろそろiconv一掃するか。まずはこの日記のRSS出力の部分を。
openの引数を"r:iso-2022-jp:utf-8"にすればよさそうだ。


2010-10-29 (Fri)

ちくわしか持ってねえ

あまりに懐しくてWhat's Michaelの6巻を読んで確認した。
ちゃんと持ってた。初版だった。もう20年以上前なんだな。


2010-10-30 (Sat)

jarpディスククラッシュ

というわけで、しばらくお休み。と書いても意味ないんだが。


2010-10-31 (Sun)

[dlvr.it] dlvr.it Service Alert

サーバが死んでるので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は安定してるし結構いいよね。


<Prev(,) | Next(.)> | Recent(/)>> | RDF


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

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