_ さらに au も。えーと、携帯キャリア以外の宛先に送る際の変換はなしですかそうですか。
_ そもそもそのキャリアでしか通用しない勝手規格を自網の外に垂れ流すというそのこと自体がおかしいわけ。順番が違うよね。まず、どこに送ってもトーフにならないようにするべきなのであって、絵文字が使える宛先だったら一般の宛先とは違う変換テーブルを使うようにする、というのはその後からつけたすべき機能のはず。つーか、前者は携帯メールで絵文字を使えるようにした当初から実装して当然なのに、なんで今もって放置されてるんだか。携帯キャリア相互間だけとはいえ変換して送るようになるのは、まあ、進歩、なんだろうねぇ。
_ これだけ長時間のサービス停止を決断したのは、たいしたもんだと思う、ほんと。
_ が、このメンテって全ユーザに影響があるんだよね。ふつーは影響が最小限になるように、たくさんあるシステムをひとつずつ作業していくものなんだけど、この作業から推測されることは、それができるような小分けシステムにはなっておらず、全ユーザが収容されているシステムがたったひとつ存在してるだけなんだろうということ(もちろんサーバとしては何百台とあるんだろうが、それが全体としてひとつのシステムを構成しているんだろう)。今回のメンテの最中は閲覧以外の記事投稿やトラックバック、管理機能といったあたりが全滅のようだから、これらの機能がたったひとつしかないシステムで集中管理されていた、と思ってたぶん間違いないと思う。ココログってサブドメインがいっぱいあったから、少なくともそのサブドメイン単位でシステムが分割されていて、メンテもそれぞれ別個に可能なんだろうと思ってたんだけど、どうやらそうなってはいなかったようだ。そんな構成じゃ処理能力が追いつかなくなってあたりまえだってばさ。
_ 処理しきれる数のユーザだけを収容したシステムをいくつも用意し、それらのシステムを束ねる別システムを作って連携させる。もちろん、システム間の結合はできるだけ粗にして連携させなきゃいけない情報は最低限度に抑える。そうじゃなくちゃスケールしないよ。
_ で、メンテの内容はどうやら OS と RDBMS のバージョンアップだけらしく、システム構成の根本的な見直しはないらしい。それじゃ一時しのぎにしかならないよ。遅かれ問題は再燃する。まあ、nifty の中の人もそれがわからないほどバカじゃないだろうから、このメンテが終わったらきっとすぐ次の対策に移るだろうし、あるいは実は今回の作業でちゃんとスケールするシステムに作り変えるんだけどそれを周知してないだけ、という可能性もあるけど。
_ だそうです。ついに。
_ えー、うちではカシオの FIVA102 というちんまいノート PC がサーバとして動いてるんですが、発熱がすげーです、こいつ。で、ある程度以上の温度になったら勝手にサスペンドしてくれるです。
_ そいつが、今日のクソ暑さのせいで今年はじめて止まりました。去年の夏は2回止まったんだっけな、たしか。熱暴走したりするわけじゃないんでそれほど困ったちゃんなわけじゃないけど、やっぱり現役で動いてるサーバが勝手に止まるのは不便だな。自宅内サービス専用に動いてるだけのサーバで、外に提供しているサービスには一切かかわっていないから他人様には迷惑はかけてないんだけど。
_ つーか、MediaGX 233MHz メモリ 96MB なんてマシンはそろそろ引退させた方がいいんだろうか。でも自分用に使うだけならこれでもぜんぜん困ってないんだよなぁ。
_ ちなみに、外向けサービスを担当してる方のマシン(つまり、この日記を公開してるサーバ)は富士通の LOOX S8。Crusoe TM5500 700MHz でメモリ 128MB の、やっぱりちんまいノート PC。うちの用途ではオーバースペック:-)。
_ 3連休だからどっか遠くに遊びに行こうかとも思ったんだけどさ、北の方に行くと雨で、西の方は暑くて、天気予報を見て萎えた。そんなわけでヒキコモリ。
_ この前は素数だったけど、 今度は 3x+1 問題だそうな。
_ ヒマなので、ちょいと頭の体操。また例によって m4 で:-)。
divert(-1) Collatz・角谷の予想(偶数なら2で割り、奇数なら3倍+1するという操作を 繰り返すと1に収束する)で、収束するまでのステップ数が最大の数を求める % m4 collatz.m4 % m4 -Dmax=10000 -Dverbose collatz.m4 GNU m4 ではマクロのネスト数がデフォルトの制限を突破してしまうので、 % m4 -L500 collatz.m4 のように上限を緩和してやる必要があるようだ。 FreeBSD の m4 ではふつーに実行可能。 ifdef(`max', `', `define(`max', `100')') # dnl をはずすと冗長出力 dnl define(`verbose') # どっちか選べ define(`g', `g1($1)') ←計算結果をキャッシュして高速化 dnl define(`g', `g2($1)') ←キャッシュしないでメモリ節約 define(`f', `ifelse(eval($1%2), `0', eval($1/2), eval($1*3+1))') define(`g1', `ifelse($1, `1', `1', `ifdef(`g_'$1, `g_'$1, `define(`j', f($1))ifdef(`verbose', `define(`v', v j)')dnl define(`g_'$1, incr(ifdef(`g_'j, `g_'j, g1(j))))g_$1')')') define(`g2', `ifelse($1, `1', `1', `define(`j', f($1))ifdef(`verbose', `define(`v', v j)')incr(g2(j))')') define(`H',0) ifdef(`verbose', define(`v', `')) # forloop マクロ。GNU m4 の info からコピペ。 define(`forloop', `pushdef(`$1', `$2')_forloop(`$1', `$2', `$3', `$4')popdef(`$1')') define(`_forloop', `$4`'ifelse($1, `$3', , `define(`$1', incr($1))_forloop(`$1', `$2', `$3', `$4')')') divert(0)dnl forloop(`i', 1, max, `define(`G', g(i))dnl ifelse(substr(eval(H - G), 0, 1), `-', `define(`h', i)define(`H', G)')dnl ifdef(`verbose', i:v (G) define(`v', `'))')dnl h (H)_ だいぶ長く感じるかもしれないけど、いろいろよけいなことをしてるせいであって、実質的には15行程度。m4 にはループ構造がない、配列もハッシュもない、数の大小比較すらできない、というわけで、そのあたりをすべて自前でなんとかやりくりしております。まあ、マクロプロセッサであって言語じゃないしな。
_ m4 はわりと便利で強力なんだけど、複雑なことをしようとするとこんな感じで暗号になってしまう(これでもわかりやすく書いたつもり)。そういう場合にはおとなしく別の言語を使うべきだわな。sendmail が難解なのは、sendmail.cf という暗号を生成するために m4 という別の暗号を使わなきゃならんことも大きいと思う。
_ なお、わしはそんなにしょっちゅう m4 を使ってるわけじゃないので念のため。
_ 2.2 が出てだいぶ経つし、そろそろ入れかえるかぁ、ということでインストール。もっとも、わしは Web 屋さんじゃないし、最新の機能が必要とかそういうわけじゃないんだけどね。
_ というわけで、設定完了。あちこちの Linux のディストリビューションがこれまでそうだったように、httpd.conf がデフォルトで分割されたので、2.0.58 と 2.2.2 の初期状態の設定がどう変わったのか調べるのに diff がまったく役に立たず手間どったけど、たぶん問題なかろう。とりあえず、80番はこれまでと変わらず 2.0 で、SSL で動いてる自分専用のバーチャルホストだけ 2.2 に移行。妙な設定とかは SSL の方に集中してるので、こっちで問題なく動けばだいじょうぶだろ。何日か調整しつつ様子を見て完全に切り替えるということで。
_ そういえば、これまでは <IfModule mod_hoge.c> だったのが、2.2 では <IfModule hoge_module> になってるな。これは断然正しい。なんでソースファイル名で指定せにゃならんのかずっと疑問だったんだ。
_ といっても、わしの場合は <IfModule> とか <IfDefine> とかみんな消しちゃうからほとんど関係ないけど。Apache 2.0 では <IfModule mod_php.c> の中に PHP の設定を書いても無視されるんだけど、これは mod_php.c でも mod_php4.c でもなく、sapi_apache2.c が正しいから。でも、こんなのふつーわかんないよね。どうしても必要だからこそその設定を書くんだから、<IfModule> なんか使って場合によって無視されるようなことになったらかえって不都合だ。<IfModule> がなければ、モジュールのロードを忘れてたときに起動にコケるけど、そのモジュールを使うからこそ設定を書くわけで、そもそもそのモジュールのロードを忘れるなんて論外。考慮する必要なんかない。
_ Apache 2.2 では mod_version というモジュールができて、これをロードすれば
という記述ができるようになってるんだけど、やっぱり同じ理由で必要ないね。つーか、そんなに <IfHoge> が好きなら<IfVersion >= 2.2> # 2.2 以降専用の設定 </IfVersion>ってやらなきゃ。ほら、<IfHoge> がいかにバカバカしいかわかるでしょ。<IfModule version_module> <IfVersion >= 2.2> # 2.2 以降専用の設定 </IfVersion> </IfModule>_ なんか話が脇道に逸れたけど、ま、いいや。
_ ひと月ほど前から新人さんが配属されてあたりをうろついてます。すげー。前にいた会社は親会社の横暴により、子会社では新卒採用ゼロ、親会社で採用された新卒の出向ゼロという状態が5年ほど続いていた(わしが最後の新卒入社だった)ので、ぴっかぴかの新入社員なんてのを間近に見たことがないのであります。中途はけっこういたけどやっぱりくたびれてるしね。
_ 新入社員研修を受けてから配属されてきてるはずなんだけど、さらに手厚い勉強会をやってる。座学なんてもういいからとっとと実戦に参加させればいいのにと思うんだが、まあいいや、と口を出さずに外野を決めこんでいたらわしにも講師のお鉢がまわってきてしまった。わしも彼らよりたった3ヶ月だけ先輩のくたびれた中途新人なんだけどねぇ。
_ そんなわけで、ストレージについての新人向け資料を書いてみたり。つーか、前にいた会社では人手が足りなくてストレージ方面は保守ベンダに丸投げしてたから、わしだってそっち方面のことは素人に毛が生えた程度にしか知らんのだけどなぁ。
_ で、資料を書きながら頭の中に RAID5 の構造を頭ん中に思い浮かべてたわけなんだが、ふと、生ディスクではなく、NFS を RAID みたいに束ねたらどうなるんだろとひらめいた。RAID ってディスクの単体障害には強いけど、RAID をマウントしてるマシンはひとつしかないから、こいつが死んだらけっきょく意味ないんだよね。NAS を使えばいいんだけど、それだってディスク以外のところが死んだら意味ねーし(NAS のファームウェアバグのために全停止してアップデートした経験あり)。ちうわけで、RAID みたいに複数のファイルサーバを仮想的にひとつのファイルサーバとみなしてディスクの読み書きを分散すれば、複数のサーバが同時にひとつのファイルシステムをマウントできて、かつ、ファイルサーバがひとつぐらい死んでもデータは失われずサービスも止まらないというかっちょええストレージができるんじゃね?
_ などと、脳内妄想していてふと思いだした。それ、 Google file systemだな。 このへんも。まったく同じものではないけど、発想は似たようなものだ。凡人の思いつきなんぞ、もう誰かがとっくに実現してるってことだ。というか、「思いついた」んじゃなくて「思いだした」だけだろ。わしが知らんだけで商用のストレージ製品でもきっとあるんだろうな。