復刊.comの『bit別冊 Common Lisp Object System とその周辺』が目出たく100票に到達したようです(ログインしないと票数が確認できないけど)。もちろん復刊のための版元との交渉すらまだこれからなわけで予断も許さない状況ですがひとまずよかったね、と。LL魂効果かしら。
まあ(以前にも書いたけど)オレは持ってるんだけどね。
正直なところ本当に優れた本かというとそうでもないという気が実はオレはしています。なんというかな、たとえば Lisp の勉強をしたくて読むような本じゃないんですよ。でも当時も今も日本語の本で CLOS に言及している本なんてこれしかなかったという事情が評価を押し上げたタイプの本だと思う。
でも、もちろん復刊するとすればいいことだと思う。それだけの価値のある本ではあるけど。
こないだの、さくらインターネットでレンタルしている専用サーバがいきなり死んだ一件にも困ったものだったが、今日は自宅のマシンが死にました。
ことの起こりは今日も朝から暑かったことが原因だということにしておこう。ぼくは冷房をつけ、朝飯ということでパンをトースターで焼くことにし、そのあいだウェブをちょっと見るかとゆっくりしていたのだが、いきなり電気が切れた。ブレーカーが落ちたのだ。
まあそんなことはよくある話で油断していたのが悪かった。まずかったのはデスクトップ機がいきなり落ちたことだった。これはしばらくずっとおうちサーバをやっていて、ネットワーク的には ADSL ルータの役目も負っていたし、おうちサーバとしての機能はだいぶほかに移したけれども DNS だけはまだやっていた(移行するのがめんどかったので)。しかたないので電源を入れたのだが、きちんと起動せず手動で fsck せよという。面倒くさかったので、 fsck -y したのだが、チェックが終了してもファイルシステムはまだ dirty だという。それでいろいろ試してみたのだが、 / のパーティションの一部のブロックが破損して読み込めない状態になっていた。さいわいパーティションを分けていて、ほかのところは生きていたからデータとしてはほとんど欠損はない状態だが、 / がないので起動できない。いや、実はシングルユーザモードでもいろいろやってみたら PPPoE のダイアルアップくらいは可能であることがわかったのだが、いずれにせよ問題がありまくりだろう。
そういうわけでいろいろやってたけど、とりあえず ADSL ルータを買ってることにし、webにつながりさえすれば DNS はレジストラのサイトから手続きを踏み、なんとかなった。あとはブッ壊れたマシンの再セットアップだが、余っているHDDがあったのでこちらに新たに FreeBSD をインストールし、既存の HDD はセカンダリに繋いでマウントできることを確認した。いまはソフトウェアのセットアップの最中。
というわけで、作業としてそれほど凄く大変というわけではないとはいえ、焦った焦った。ブレーカーを落としてデスクトップマシンがいきなり落ちるのもわりあいよくある話なのですっかり油断をしていました。
もしくはハッカーは算数に弱いという話。
皆さんは、ある自然数が与えられたとき、その数が11の倍数かどうかを判定する方法を知っているだろうか。
3の倍数かどうかを判定するとき、10進数表記にして各ケタの数字を合計し、その合計が3の倍数であればもとの数も3の倍数、という判定方法は知っている人が多いと思う。似たようなやつに11の倍数というのがあるのですよ。
その方法では、各ケタを1つずつ飛ばして足す。すると1つの自然数から2つの合計値が出てきます。その合計値が一致するか、差が11の倍数のとき、もとの数も11の倍数なのです。
たとえば「121」という数がありますね。奇数個目は 1 + 1 で2、偶数個目は 2 なので一致していますが、これは11の倍数です。また 9152 は 9 + 5 = 14、 1 + 2 = 3 で差が11となりますから11の倍数です。たとえば 123455233 も11の倍数ですが、 1 + 3 + 5 + 2 + 3 = 14、 2 + 4 + 5 + 3 = 14 で一致しています。
さて本当でしょうか。本当なんですが、ちょっと不安になったので、ランダムな例からチェックしてみましょう。
import Test.QuickCheck
newtype Rank = R Integer deriving Show
instance Arbitrary Rank where
arbitrary = fmap (R . (`mod` 10)) arbitrary
f :: [Rank] -> Integer
f l = foldl (+) 0 $ zipWith (\(R x) n -> x * 10 ^ (n-1)) l [1..]
g :: [Rank] -> (Integer, Integer)
g = odd (0, 0)
where odd (x, y) (R v:vs) = even (x+v, y) vs
odd t [] = t
even (x, y) (R v:vs) = odd (x, y+v) vs
even t [] = t
c :: [Rank] -> Bool
c l = (f l `mod` 11 == 0) == ((abs $ uncurry (-) $ g l) `mod` 11 == 0)
*Main> quickCheck c
OK, passed 100 tests.
チェックされました。
という話なんですがここまでに紆余曲折を経ております。何度か失敗してドキっとした。まず最初は単純に f とかを [Int] -> Int としていたのですが失敗しまして、なぜかというと各ケタに22とか-7とか来てますがこれはアウトです。しかたないのでケタに対応して 0 - 9 の範囲内の数値を生成する Rank 型を宣言するハメになりました。 Arbitrary は幸いにして fmap だったので作るのは簡単でしたが……。で、そこを直してみたらまたアウト。 f の返り値が Int になってて、ケタが大きいとオーバフローしちゃいまして負事例が発生してしまいました。なので Integer に直しました。
そういう紆余曲折のすえにテストには成功したわけですが、もちろんこれはどうも正しそうだという確認ができたというだけであり正しさが証明されたわけではありません。こんなこと書いてるヒマがあったら真面目に「なぜそうなるのか」を考えなさいってこった。
なぜそうなるかも本当はそんなに難しくありませんが……。
http://d.hatena.ne.jp/lethevert/20070806/p3 を見てて思ったけど Clean じゃなくて Haskell の話なのでコメントじゃなくてこっちに書く。
Haskell の GHC 拡張のひとつに functional dependency (関数従属)というのがあり、こういう場合の問題に対処できます。こんな感じ。
class Measured a v | a -> v where
measure :: a -> v
instance Measured (Node v a) v
この「| a -> v」の部分は「aを引数に取りvを返す関数」ではなく、型同士の依存関係を関数形式で記述したものです。意味としては「aが決まればvの型が一意に定まる」ことを意味しています。この場合、インタンスにおける (Node v a) と v の関係が定まるため上手く行きます。まだ言語仕様には入っていないので、 GHC なら -fglasgow-exts が必要ですが。
詳しい話はGHCのマニュアルを参照のこと。あれ、論文のリンクが切れてるなあ。ま、タイトルでぐぐれば出てくるでしょう。
いろいろあって参加できなかったLL魂ですが、どうも Lua が注目を集めることに成功したようですね。まあ、こういうイベントはたいてい「ふーんこういう言語もあるのかー」と思って興味はあるけど使うことなくそれでオシマイ、というのが典型的かという気もしますが(笑)、でももし LL魂に参加して Lua って言語に興味を持ったweb系のエンジニアがいたら、 lighttpd をさわってみるといいと思います。
ここを読んでるそーゆー方面の人であれば lighttpd というhttpサーバがあることくらいは知っていると思います。 Rails 方面でもよく使われているし。で、この lighty にはいろんなモジュールが提供されているんですが、そのひとつに mod_magnet というのがありまして。
機能としては非常に些細なもので、たとえばメンテナンスページにリダイレクトしたりとか、そういう制御ができるモジュールなんですが、この制御に Lua が使われているのです。で、「非常に些細」なのはそこに書いてある例がそうだという話なだけで、その気になりゃけっこういろんなことができるんじゃないかなあと思うんですよね、これ。リクエストは触れるし、レスポンスヘッダも弄れるみたいだし、ファイルも見えるようだし、言語も turing complete だし。まあ Apache だと mod_* みたいな外部モジュールがありますけれども、 lighty には標準で mod_lua だけついている、みたいな感じかなーと。
わたしも時間があったらいろいろやってみたいなーと思いつつ何もできていない状態ですが、どうでしょうか皆さん。
ここ数回ほどは番外編がつづいている『電脳コイル』。先週も大爆笑の傑作だったけど、今週はちょっとイイ話。首長竜のようなイリーガルとの心の交流めいたものを描いたエピソード。
>
所詮、作りものの命なのよ! それもイリーガルよ! 感情移入したら損なだけよ!
と泣き叫ぶフミエの台詞が印象に残る。
……のだけど、でも一番のオドロキはハラケン叔母が実は女子高生だったということだったりして。いやーすごく驚きました。いくらなんでも20歳は過ぎてると思っていた……!
てゆーか、小学生のガキに「オバちゃん」呼ばわりされる女子高生の心境やいかに。
まあいろいろ言いたくなるというか、例によってサーバがうんぬんという台詞はミョーに宙に浮いちゃうのでよした方がいいというかもっとその辺の説明は感覚的にウマいといいのになあというかでもその部分はファンタジーな作品だと解しているのでどうでもいいんだけど気になるなあとか、先週でイリーガルと意思疎通ができるデバイスが発明されたのにまったく使われてないのはイリーガルの種が変わると言葉も変わるってことですかとか、夜が明けるくらいならもっと早く行動しておけばよかったのではとか、まあいろいろ思わないでもないんだけど「原川叔母=女子高生」という衝撃にはかないませなんだ。
ふと思ったメモ。
darcs レポジトリの公開方法は web から見えるようにするというだけだけど、実際にはそこに push することを考えると、その辺のレンタルサーバではムリだろう(darcsコマンドが動いてくれないといけないので。 Linux 用にビルドした darcs をこっそり仕込んでおく、という手はあるかもしれないが……)。
ところで darcs がリモートレポジトリに対して操作を行うとき、リモートマシン側で必要となるコマンドはさして多くない。 darcs それ自身以外には scp と sftp が使われるくらいか(ssh経由の場合の話ね)。とすると、それ専用のユーザを用意して、その特定のコマンドのみの実行を許可する設定としておけば、レポジトリ専用のユーザを作成できるだろうと思われる。
レポジトリ専用ユーザはログインすらできないから、最初にプロジェクト名のユーザを作成し、上記の設定を書き換え不能な設定で用意しておけば darcs レポジトリホスティングサービスは提供できそうである。
ただ、いくつか設定したい項目もあるから、そのための web システムは必要だろう。
>
author、motdなどの設定変更
>
レポジトリの新規作成 / コピー / 削除
>
公開鍵の登録 / 削除
これくらいかな。これが可能な設定を用意しておけばいいかなあ。
現在の city5.org のレポジトリは私が自分のアカウントでやっていて、個人用途としてはその程度で何ら問題はないと思う。じゃあ何でこんなことを考えるかというと、バージョン管理システムの普及っていう面で考えると、公開されるレポジトリの量によるんじゃないか、という気がするわけだ。 cvs がずいぶん長いこと存続していた(いる)のは subversion のホスティングサービスがなかったからじゃないかと。さくっとそんなことができれば、まあ打倒 subversion/svk はちょっと無理としても、ちっとは普及するのかなーという感じがしたわけだけど。
どんなもんだろうか。
ちゃんとした感想を書けないので短文で。
岩明均『ヒストリエ』[4]
待望の続刊。ようやく1巻の冒頭につながって、エウメネスの冒険はまだ始まったばかりですかね。面白い。
山名沢湖『つぶらら』[2]
山名沢湖のメルヘン成分なしまんが。そんかわり暴走成分が多め。これ。正直1巻の時点ではあんまり面白くないと思ってたんだけど2巻にきて楽しめるようになりました。主人公のズレっぷりがいい感じ。
土山しげる『喰いしん坊!』[14]
えー賞とか取るまんがじゃないと思うんですが。映画はどう考えても駄映画というかVシネの予定がなんか盛り上がってるんで上映でもしときますか風ですが見に行っておきたいが。
中身は個人的にはどうでもいい感じの鳥飼過去編。しかも決着つかず。
古林海月『米吐き娘 大吟醸』
貧乏をかこつ少女、山田みのりは日に4〜5回ほども精米を吐く「米吐き娘」だったのでした……というユーモアまんが、の続刊。ゆるい感じがわたしはわりと好きなのだった。前巻と今巻のあいだになぜか取り零しのエピソードがあるのがうらめしい。
ヒストリエ (4)
| つぶらら (2)
| 喰いしん坊! (14)
| 米吐き娘大吟醸
本日19時過ぎころ、ふとアンテナをチェックしようとしたら繋がらない。lighty落ちた?とsshしてみたが繋がらない。 imap も繋がらない。っていうか ping 通らない。つまり、
サ ー バ が 死 ん で お り ま す
という具合で、メールとウェブの両方で活躍している jmuk.org / city5.org のサーバがお亡くなりになっておりました。いろいろ思いあたるフシを考えていたのですがどう考えてもない。というか繋ぐ直前の1時間くらいは別室で用件がありましたし、バックグラウンドでタスクをこなしたりもしていないため、自分が何かをやったとは考えにくい。
このサーバはさくらの専用サーバを利用しているのだけど、さくらの工事情報やトラブル情報の記載もなし。
しかし考えられるのは電源が急に落ちるとかネットワークケーブルが外れるとか、そういったタイプの問題。で、これは電話だな、と思ってサポートページを見てみると時間は10:00〜18:00。あちゃー……という感じで、とりあえず駄目元で問い合わせフォームから状況を送って再起動するように要請してみた。
しかしまずいのは、メールとウェブを両方やらせていたわりにバックアップを取っていないというアホなことをやっていたことで、これはまずい。もしデータが壊れていたらとりかえしのつかないことになっている。どうするかどうするか。
という感じでぐるぐるしていたのだけど、そんなすぐに対応が来ることもないだろうし明日朝までは手も脚も出ないだろうなな、と思ってたら21時ころに先方からメールで連絡があり、復帰したとの連絡。データも何もかも元どおり。
問題については、
>
該当のサーバーでございますが、コンソール接続にて確認しましたところブラックアウトしており画面に何も表示されていない状態でございました。
>
ハードウェアのチェックにてコンデンサの破損を確認いたしましたので緊急ではございますがハードウェア交換を行わせていただきました。
>
交換後はping sshでの疎通を確認できております。
と教えてもらいました。この夜間に(備蓄があったからだろうとはいえ)そこまでやってもらうのは有り難い。
ま、復旧までが早かったのもデータ欠損なしだったのもたまたまという気はするけれど、さくらは対応がいいということがわかりまして個人的にはむしろ評価向上でした。それはさておきいくらなんでもノーバックアップはリスキーすぎるのでそういう設定はすぐやりましたが。
ところで何もかも一つの(一社の)サーバで任せきりというのはちっと怖くて、何かのときのためにどっかに代替を用意しておいて長びきそうなトラブルのときはスワップできるようになってるといいかもなあ、などと思った次第。ほかのレンタルサーバも借りてみようかなあ、ロリポップくらいなら安いしな。