携帯端末向けサイトの管理者Aは悩んでいた。とある携帯キャリアの課金体系ときたらひどい仕様で、入会日から一か月後に入会状態の継続が確定するのだが、他のキャリアのように月初に〆日があるのと違って、特に月末になるといったいいつ継続確定すればいいのかまったくもって判断がつかない。2月28日の翌月って3月28日なのか?翌々月は?1月31日の翌月は?直感で解決できない仕様は悪い仕様である。開発者の悩みは尽きない。
しかし、管理者Aの悩んでいるのは、そんなことではなかった。仕様書を読めばわかる問題なら、散文には慣れている文学部出身のAにはたやすいことだ。過ちを恐れるあまり舌が凍りついたような文面に、ご丁寧にもコピープロテクトまでかかった小癪な仕様書も、彼の読解能力の前には交通安全の標語とさして違いはない。数日の内に、バッチ処理は仕様通りに動作するよう完璧に設計され、実装され、凄まじいテストにも完璧に耐え、crontabの美学に完璧にのっとってスケジューリングされた。開発チームは祝杯をあげ、バッチ処理はもう半年間ずっと問題なく動いている。
だが、問題は起こった。ある朝、彼の携帯電話がけたたましい音を鳴らして気だるい春の空気を切り裂いた。サーバから直接送信されるアラートだ。件名を見ただけで、彼の眠気は吹き飛んだ。完璧な上にも完璧な例のバッチ処理が動作していないのだ。ユーザ情報の集計処理は来るはずのデータを待ちながら悲鳴を上げている。そんな馬鹿な!完璧なことピンポン玉のごときあのバッチ処理が失敗するなんて!
会社のサーバに繋がる秘密の端末からキーを叩く彼は驚愕した。完璧なバッチは完璧なまでに詳細な実行ログを残すことになっている。しかし、ログは一切残っていない!どういうことだ!crontabは変更されていない。プログラムに手を加えられた形跡もない。
ふと、管理者Aは/var/log/cronを覗いてみたい誘惑に駆られた。そして、恐る恐るコマンドを叩き、犬にしか聞こえない周波数帯で悲鳴を上げた。
$ sudo grep "perfectBatch.sh" /var/log/cron | grep $USER \
awk '{print $1 " " $2 " " $3 " " substr($8, 2)}'
password:
.............
Mar 22 04:00:00 /usr/local/bin/perfectBatch.sh
Mar 23 04:00:00 /usr/local/bin/perfectBatch.sh
Mar 24 04:00:00 /usr/local/bin/perfectBatch.sh
Mar 26 04:00:00 /usr/local/bin/perfectBatch.sh
............
ない!ない!25日がない!
完璧なバッチは、完璧に作られ、完璧に設定されている。しかし、まさかcronに無視されるとは誰も思っていなかった。死すべき定めの人間の現実は、そんな思いを平気で踏みにじるのか。管理者Aは、ふと故郷の景色を思い出した。
と。
まあ、そんなわけで、割と負荷の高いサーバを運用した経験のある人なら、cronが実行されなかったのであわてたことがある人も結構いると思う。かくいう筆者も同じで、原因を調査してもこれといって手がかりもなく困り果てていた。1台や2台のサーバならなんとか確認して運用することもできるが、100台にもなるとそうはいかない。
そこで、cronはそもそもちゃんと動かないという前提で、確認の手間を省くことでなんとかならないかと考えることにした。思いついた方法は2つで、
(1) サーバ内に問題検知エージェントが稼働している
(2) 全てのバッチ処理は完了通知をリモートサーバに投げる
1の場合、エージェントの稼働を監視する方法がないので、結局同じことになる。2の場合、どこかに集中管理用サーバを用意して、いつどのサーバからどんな通知がこないといけないかをデータとして保持したアプリケーションが通知を受け付け、問題を検知する。この場合、集中管理サーバだけ確認しておけばいいので運用は簡単だ。バッチ処理の側に終了通知を投げる機能の追加が必要だが、これから作るものに適用していって、うまくいくようなら全部のマシンのバッチ処理に適用すればいい。
そんなわけで、バッチ処理の集中管理システムというものを作ってみたくなったのだが、そもそもこの手の問題にはみんなどうやって対応しているのだろうか。もっといい知恵があれば知りたいし、そんなのとっくにあるよという方がいれば教えてほしい。キモは、cronが無視するタスクの検知だ。
Popularity: 5% [?]
かみさんにメールですごいことを言われた。反省の意味をこめて真摯に受け止め、我が身を振り返る。
社交性のなさと社会性のなさはピカイチなのが自分て気がついてないとこもすごいよ。会社の人にもわかりにくいって遠回しに言われてるじゃん
私はどこ行っても問題なく友達もできるし、長く付き合ってるし。そっちは誰もいないじゃん
検証しよう。
社交性のなさ
社交性を計測するのは難しいが、この一ヶ月間に付き合いで何をしたか数えてみよう。
・会社の同僚と飲みに行く 2回
深夜の対応で帰れなくなったのと昼から何も食べていなかったのが理由で会社の近所の居酒屋で食事した。それから、最近iPhone用アプリケーションを開発することにした同僚の買い物に付き合って有楽町のビックカメラに行って帰りに食事がてら一杯飲んだ。実に社交的である。
・親戚の見舞いに行く 1回
持病で入院した親戚を見舞って、不便なのでイーモバイルでメールのチェックくらいできるようにしてきた。実に社交的である。
・お隣さんとホームパーティー 2回
月1回くらいのペースでやっている。もっとも自分から動くわけではないのでこれはカウントしない。
・友人に会う 1回
といってもyomoyomoと飲んだだけ。まあ、これは大変に社交的な活動だと思う。
結論としては、私は非常に社交的である。
社会性のなさ
これは常識のなさといったものだろうか。Wikipediaによれば、社会性とはギブ・アンド・テイクの関係だという。そういう意味では、おれのものはおれのもの、お前のものもおれのもの、を信条とするかみさんこそ社会性の欠落が甚だしいのではないかとも思うが、どうだろう。
それから、基本的な定義として、社会性とは
一般に一定の規範を有する社会において、これに参加する個人として円滑に他の構成員に受容され、かつ自己の目的を達成することができる性質のこと。
とされているわけだが、我が身を振り返ってみても、これといって社会参加できていないわけでもない気がする。どこでも相手にされないとしても、それだって円滑な受容であることに違いはない。無事その日をすごすという目標が達成できれば問題はない。
わかりにくさ
自分のわかりにくさについて検証するのは、もはや靴ひもを引っ張って飛ぶくらいの難易度だとしか思われないのだが、やってみよう。
・世論調査
会社で近くにいる人たちに「わたしの話すことは理解しにくいか?」と質問する。結果は、100%が「はい」で、その他の回答さえなかった。わかりにくさについては完全な裏付けがあることが判明した。
しかし、逆に、常にわかりにくいのであれば、少なくともわかりにくいということに関しては非常に明確かつわかりやすいのではないか。
友達がいない
私に友人はいないのか。そもそも友情とは何か。わからないことはすべてWikipediaに聞いてみよう。いわく、友情の最も弱い形体は「知り合い」であるそうな。なるほど、知り合いなら大勢いる。私の社交性の高さは際立っている。このレベルであれば相当有利な勝負が展開できるであろう。しかし、弱い形体のものが多く集まる薄利多売のようなモデルは基盤としては脆弱である。そこで、逆に友情の最も堅固な形体である(とWikipediaに書いてある)「生涯の親友」レベルの友人を獲得できているかどうかが勝負の分かれ目となろう。では、この「生涯の親友」とは何か。件の記事によれば
これは長期にわたり離れ離れになることがあろうとも、つながりが切れず、双方が無条件で信頼しあうような関係についていう。友情の絆の強さは相手のための自己犠牲というかたちで現れることも少なくない。
と定義されている。なるほど。無条件の信頼とはまたハードルの高い関係だ。条件もなしに信頼するわけだから、たとえ百万円で羽毛布団を売りつけられようと信頼が崩れてしまうようであってはならない。これでは無条件であることと無関心であることの区別さえつかない気がするが、それが真の友情というものであれば、納得するしかあるまい。
また、Wikipediaでは大衆受けするテーマ(男が女について知らないこと、とか)の本で成功した心理学者を引用して、友情の3段階というものを提唱されている。
心理学者のヘルプ・ゴールトバーグ (Herb Goldberg) は、友情は3つの段階を経過するという。彼によると仲間意識のひとつ前の段階が、友情だという。
ゴールドバーグはまた第一の段階を、「役に立つ友情」と呼んでいる。どんな理由にせよ、双方に有利、有益なことをもたらしてくれる限り、繋がっていく友情である。
第二のものは、「目的志向の友情」といわれる。なにか特定の目的があって、たとえば余暇に一緒に草野球、釣り、ゴルフなどを楽しむための連れというわけである。
第三の段階は、文字通り「友情」である。特定の目標、目的、利用を追い求めることなく、ただなにかの機会に知り合って、互いによく熟知ししあったという友人。この関係の中での利害は伴わず、ただ友情それ自体が目的になっている。
「金の切れ目が縁の切れ目」から「下手の横好き」を経て、真の友情が生まれるという、なんだか寅さんのようなお話である。
いろいろ考えてみたが、申し訳ないけれど何の目的や利害もなく友人である人間など存在しないような気がする上に、無条件の信頼など無関心と何の違いもないという事実を鑑みて、私にはそんな友人などいないとここに断言することにした。そういう点ではかみさんのいうことももっともである。
総合評価では、4項目の内、2項目がかみさんの言い分を裏付けていることになった。つまり、The SmithsのReel around the fountainのように半分だけ正しいので、引っ叩かれても文句もいえない状態ということになる。
というわけでスミスのビデオ。
教訓としては、たとえひどい人格批判をされても、あまり自分のことは真剣に考えない方がいいということで、なぜなら真剣に考えるとうんざりするから。
Popularity: 4% [?]
小さな疑問。
もともとはデータベースの処理を意味するのだが、最近ではウェブアプリケーションの新規登録、閲覧、更新、削除フローの呼び名としても知られるCRUDという言葉があって、データモデルを指定するとアプリケーションを自動生成してくれるフレームワークもあちこちにあるのだが。
普通、新規登録とか更新のときって、いきなりデータを保存しないでプレビュー画面を出すはずだ。でも、自動生成されたCRUDアプリケーションにプレビュー画面機能はたいていなかったりする。
これが不思議で仕方がない。新規登録や更新用フォームがWYSIWYGエディタあればわからないでもないのだが。
そういえば、RESTとCRUDのミスマッチとかいう記事があったが、RESTにしてもプレビューはどこにも定義されていないはずだ。PUTとかDELETEの結果を前もって確認して、最後に決定したいというようなやりとりは基本的にはクエリ的なアクションになるのだが、どちらかといえばトランザクションといえるかもしれない。だったら、CRUDの範囲にはおさまらないだろうし、そのへんはいったいどうなってるのか。
Popularity: 3% [?]
何をしているのかはわからないけど、ステルス検索というサービスをやっているらしいBlekkoという会社があるようだ。
dmesgに怪しげなログが残っていた。普通、DoS攻撃とかで残るようなログなので、それにしてはヌルい回数だからおかしいなとIPアドレスを調べてみたら、Blekkoという組織からのアクセスだった。
TCP: Treason uncloaked! Peer 38.108.180.137:31690/80 shrinks window 数字:ずらずら. Repaired.
Blekkoとは:
$ whois 38.108.180.133 [Querying whois.arin.net] [Redirected to rwhois.cogentco.com:4321] [Querying rwhois.cogentco.com] [rwhois.cogentco.com] %rwhois V-1.5:0010b0:00 rwhois.cogentco.com 38.108.180.133 network:ID:NET-266CB40018 network:Network-Name:NET-266CB40018 network:IP-Network:38.108.180.0/24 network:Postal-Code:94065 network:State:CA network:City:Redwood City network:Street-Address:100 Marine Parkway network:Org-Name:Blekko network:Tech-Contact:ZC108-ARIN network:Updated:2008-09-17 10:42:07 network:Updated-by:John Knowles %ok
ステルス・サーチというくらいだから、なるほどackを返さないとかやってるみたいだ。とりあえず実害はないので気にするのはやめる。
Popularity: 5% [?]
PHP-5.3.0beta1を動かすと、strtotimeを使った際にWarningが出る。
$ php -r 'print(strtotime("2009/01/01 00:00:00"));'
PHP Warning: strtotime(): It is not safe to rely on the system's timezone settings.
You are *required* to use the date.timezone setting or the date_default_timezone_set()
function.
In case you used any of those methods and you are still getting this warning,
you most likely misspelled the timezone identifier. We selected 'Asia/Tokyo'
for 'JST/9.0/no DST' instead in Command line code on line 1
PHP Stack trace:
PHP 1. {main}() Command line code:0
PHP 2. strtotime() Command line code:1
いわれたとおりに
$ php -r 'date_default_timezone_set("Asia/Tokyo");
print(strtotime("2009/01/01 00:00:00"));'
date_default_timezone_set()関数を使うと何もいわれない。また、php.iniを
[Date] ; Defines the default timezone used by the date functions date.timezone = 'Asia/Tokyo'
のように変更すると何もいわれなくなる。これが正しいかどうかは不明。ググレカスにお伺いを立てると結構ヒットする。知らなかったなあ。
Popularity: 8% [?]
jsが入っているのにJavascriptのインタプリタ以外に使い道がないなあ、と思っていたらPeclにspidermonkeyというのが追加されていた。検索するともう記事が見つかったりして、楽しそうなのでさっそくインストール。PHP5.3beta0以上が必要なので、テスト環境のPHPもついでに更新。php.iniのextension_dirを
extension_dir=/usr/lib/php/exntesions/no-debug-non-zts-20090115
のように更新しておかないといけない。
で、pecl install spidermonkey-alphaを実行したら見事にこける。ヘッダファイルjsapi.hがないとのこと。でもそのファイルは/usr/include/直下にある。で、手動でspidermonkey拡張モジュールをダウンロードしてconfigureの中身を見ると、
for i in $PHP_SPIDERMONKEY /usr/local /usr; do
for j in js mozjs; do
test -f $i/include/$j/jsapi.h && SPIDERMONKEY_BASEDIR=$i
&& SPIDERMONKEY_INCDIR=$i/include/$j && SPIDERMONKEY_LIBNAME=$j
&& break
done
test -f $i/include/$j/jsapi.h && break
done
if test -z "$SPIDERMONKEY_INCDIR"; then
{ { echo "$as_me:$LINENO: error: jsapi.h not found. Please reinstall libjs." >&5
echo "$as_me: error: jsapi.h not found. Please reinstall libjs." >&2;}
{ (exit 1); exit 1; }; }
fi
こんな箇所があり、spidermonkeyのヘッダファイルは/usr/includeか/usr/local/include直下ではなくその下のjsかmozjsディレクトリでないといけないらしい。なんなんだ。以前spidermonkeyをインストールしたときの手順に問題があるんだろうか。
まあ、ヘッダファイルはみんなjs*.hという名前だったので、さくっと
# mkdir /usr/include/js && cd /usr/include/js # for i in `ls ../js*.h`; do ln -s $i `echo $i | sed "s/..\///"`; done # pecl install spidermonkey-alpha
適当なことをやって、ようやくインストール完了。ちなみにmozjsにするとやっぱりpeclからのインストールは出来なかった。なぜだ?
Popularity: 8% [?]


