2002-06-07
_ re:じゅんじゅんのにっきちょう「LIRSとかhinaを生成してくれるということなのですが」
●そういえば、はてなアンテナなるサイトがあって
って、アンテナなんですが、なんだかわしらのリモート元にするにはどうしたらよいのでせうか?
編集画面の一番下にリンクが用意されているはずです。たとえば、ダメあんてな出張所の場合ならば、LIRS、HINA、DIとなります。ただ、LIRSはLast-Modifiedが0固定で、Last-Detectedに最終更新(認識)日時が入っているので、そのデータをそのままなつみかんがリモートアンテナ用として使えるかはわかりません(なつみかんでリモート設定をしたことがないんで)。ほかのフォーマットの出力が正しいかどうかも確認していません。たぶんどれかはそのままでも使えると思いますけど。
textmaniaでは、はてなアンテナからのLIRSのLast-DetectedをLast-Modifiedで読み替えるようにして使っています。
_ カテゴリ管理のテスト実装
もうずいぶん放置していた2ch type BBSを作ろう計画(コードネーム:Ich)。最近ずっとVB.NETばっかりやっていて脳みそが腐ってきた気がしたんで、ちょっと脳みそのリフレッシュのためにPHPを使ってリハビリすることにした。
Ich関係は頭の中でかなりいろいろこね回し続けていたんだけど、そう簡単に究極的な設計が思い浮かぶとも思えないんで、ひとまず思いつきの中からよさげな部分だけでも、実際に実装してみて、どんな感じになるのかをテストしてみることにした。で、いろいろパーツ的なものを作っているんだけど、プログラミング以外のところで一番悩みが深いのが、カテゴリ分類のこと。
2chなんかは長く続けているだけあって、かなりいい感じのカテゴリ(板)分類を持っているんだけど、ああいうフラットなやり方ではかなり制約が大きい。そこで、2chのようにカテゴリにスレッドが所属するという仕組みは捨て、スレッドは独立してフラットに存在しつつ、複雑な構造を持つカテゴリがスレッドへのポインタだけを持つ、という形式を考えてみた。
カテゴリは、それに所属するスレッドへのポインタ(ユニークID)のリストを持っている。複数のカテゴリが同じスレッドへのポインタを共有していてもかまわない。というか、共有しているのが前提。そうすることで、複数のカテゴリに所属するスレッドというものが表現できるようになり、自由度が大幅に高まる。
という前提の元に、カテゴリの構造を考えてみる。実装サンプルを別ウィンドウで参照しながら読むと、ちょっとは説明がわかりやすくなるかも。
カテゴリは、基本的に親子関係を持つツリー構造で表現される。ツリーのすべてのノードが、カテゴリとしての意味を持つ。子カテゴリに所属したスレッドは、自動的にすべての親カテゴリにも所属することになる。
ツリーで表現されるカテゴリは、できるだけプリミティブな意味を持つ厳選されたものだけにする必要がある。似たような意味を持つ違ったツリーが乱立しては、分類の意味がなくなってしまうだろう。ただし、ものごとをカテゴリ分類していくと、カテゴリ自体が複数のカテゴリに所属するようなものが出てくる。スレッドを複数のカテゴリに所属させるだけでは、そのあたりは表現しにくい。そういうものにも対応する必要がある。
そこで、カテゴリにリンク情報を持たせられるようにする。これはそのカテゴリに所属するスレッドは、リンクされた別のカテゴリにも自動的に所属することとなる、という意味を表すものだ。サンプルでは、各カテゴリの下に一段頭を下げて書かれている行が、リンクカテゴリとなる。たとえば、「/Computer/Hardware/PC本体/AT互換機/メーカーPC/VAIO」カテゴリは、「/組織/企業/ソニー」カテゴリへのリンク情報を持っているので、前者のカテゴリに所属するスレッドは自動的に後者のカテゴリにも所属することになる。今のところは、リンク先のさらにリンク先までは見ないことにする(懸案事項)。
といった感じでカテゴリというものを表現すれば、かなり柔軟にスレッドを表現できるのではないだろうか。ちなみにサンプルではテストのためにかなり細かい部分までカテゴリを用意してみたが、実際には最初の内は2階層程度まで用意しておき、それより深い部分についてはカテゴリわけする意味がでたら(=そのカテゴリに人気が出たら)、さらに子階層で細分化していく、といった感じの運用になるだろう。
ひとまずざっとやってみた思考実験では、これでかなりうまくいきそうなんだけど、一番問題なのは「ツリーで表現されるカテゴリは、できるだけプリミティブな意味を持つ厳選されたものだけにする必要がある」という部分。いろいろ考えてみた結果が、現在テスト実装に載せているような感じのものなんだけど、こういう方向でいいんだろうか? ツリーの作り方が間違っていたからといってルートから造り直すようなことになると、それまでのカテゴリ情報は破棄しなければならなくなるからな。
かといって、あんまり理想論的にツリーを作ってしまうと、意味なく複雑な(深い)ツリーになってしまって利便性が失われる。現実的に有用な(意味のある)レベルのルートから始めつつも、プリミティブ性は確保するという方針で作ってみているんだけど、結局こういうカテゴリってなものは、それで“森羅万象を表現できる”みたいな高度すぎる理想を持っているため、いくら思考実験してみても納得いくということがない。難しい。
ちなみに、こういう風にカテゴリ−ツリーデータを持たせると、カテゴリ内のスレッド一覧とかヘッドラインとかを生成する負荷がかなり高くなるんだけど、一応運用上は現実的な負荷(個人レベルのサーバー資産で)で収まる設計は思いついたんで、単なる理想論ってだけでなく実装も可能だと思う。ただ、基本的にPHP(Perlでもいいけど)+テキストファイルで完結して動くように設計していたんだけど、カテゴリ→スレッド方向のデータ連携はやっぱりDBに持たせないときつそうなんで、そこだけDBに(も)持たせる方針。なくても動くけれども、そうすると総カテゴリ数はかなり少なめにしておかないと、まともに(速度的に)動かなくなりそうだ。
2005-06-07
_ mod_limitipconn2をインストール (19:53)
久しぶりにblogmapに重い絨毯爆撃を食らったんで、mod_limitipconn2をインストール。ひとまずサンプル通り、
MaxConnPerIP 3 NoIPLimit image/*
だけ設定しておいた。
_ このページに関連した情報 (20:59)
そういえば作ってなかったっけ。現在表示しているページや商品(Amazon)のMM/Memoとblogmapにおける言及状況を表示するbookmarklet。
bookmarklet: どう?
_ PHPの配列で、 (21:34)
ある配列変数が、
$val = array(1, 2, 3);
として与えられたのか
$val = array(0 => 1, 1 => 2, 2 => 3);
として与えられたのかを判別する方法ってないんだろうか? 多分代入されてしまったあとは判別がつかないとは思うんだけど、もしかしたら明示的に配列のキーが与えられたかどうかを判別する手段が存在しないかなー。
どういう時に使いたいのかというと、HTMLのselect-optionなんかのvalue(内部値)とcaption(表示文字列)の組み合わせを連想配列で渡すときに、前者ならばvalueもcaptionも同じものとして扱い、後者ならばキーがvalue、値がcaptionとして扱う、なんて使い分けれないかなーと思った次第。
前者ならば、
<select> <option value="1">1</option> <option value="2">2</option> <option value="3">3</option> </select>
に展開されて、後者ならば、
<select> <option value="0">1</option> <option value="1">2</option> <option value="2">3</option> </select>
に展開される感じね。
2006-06-07
_ PDO-MySQLでのUNIXソケット接続指定
PDO-MySQLでホスト名(+ポート)じゃなくて、UNIXソケット経由で接続するときの設定をいつも忘れるんで、ここに書いておこう。
mysql:unix_socket=/path/to/socket;dbname=DBNAME;username=USER;password=PASS
マニュアルだとPDO_MYSQL DSNに書かれている。


