Home

日記
すみません、ここ数ヶ月古い日記に対してのツッコミ、trackbackに気づいていませんでしたEdit

tDiaryのspamフィルタの設定で、10日以上前に対するツッコミ、trackbackをspamとして非表示受信(通知メールもなし)にする、という設定をしていたのをすっかり忘れていて、ここ数ヶ月10日以上古い日記に対してのツッコミ、trackbackがあっても全然気づいていませんでした。

今古い日のデータを見直してチェックしていますが、今まで古い日記にツッコミ、trackbackをくれた方々、反応できなくてごめんなさい。

Published At2006-07-14 00:00Updated At2006-07-14 00:00

日記
blogmapでのフィード配信をはじめましたEdit

blogmapの注目URI、注目MONO、新着URI、新着MONOのフィード配信をはじめました。ちなみにリニューアル版のblogmapってのは、いったいどういうものなのかというと、複数のフィードを解析した結果をフィード配信する(HTMLでも見れますけど)ための、フィード解析&フィルタリングツールになります。

ITmedia Biz.ID:“情報を読まない”情報収集術――「未読RSS恐怖症」対策」みたいな話もありましたけど、RSS/Atomフィードリーダー等の発達とフィード配信を行うサイトが増えることによって、情報を素早く大量に収集することが可能になっていますが、そうやって収集された大量の情報を人間が吸収する段階がボトルネックになりつつあります。

そこで、単に情報を素早く大量に集めるだけでなく、その情報をうまく吸収する仕組み(良くできたRSSリーダーだとか、あるいはソーシャルブックマークの注目リストやお気に入り機能など)がいろいろ用意されはじめているわけです。そういう情報の吸収方法を効率化する仕組みの一つが、blogmapになります。

blogmapではフィードリーダーと同様に、ユーザーが自分のお気に入りのRSS/Atomフィードを登録していきます。しかし、ふつうのフィードリーダーと違って、フィード情報をそのまま(たとえば新着順などで)表示すると言うことはありません。

blogmapでは、フィードに含まれるエントリー情報から、

  • リンクしたURL(Webページ)に関する情報
  • リンクしたMONO(Amazon商品ページ)に関する情報

を解析し、その二つの情報をキーとして、

  • 新しくリンクされたURL、MONOに関する情報
  • 最近よくリンクされているURL、MONOに関する情報

というリストを作ります。つまり、いちいち実際のエントリーの内容を読まなくても、URL、MONOに関する情報のみを自動的に抽出してくれるわけです(参考 :私のblogmap)。

いわゆる読み物系サイトなどの場合は、エントリー本文を読まないと意味がありませんが、情報中心のサイトの場合は、まずURLおよびMONO系情報のみをチェックするだけで、十分に有用な情報が手に入ります。そこで何か気になる情報が見つかった場合は、そのURL、MONOに関する情報を扱っているエントリー本文を読んで、さらに詳しい情報を得ればいいのです。

このような処理は、技術力のある人ならばPlaggerなんかを使って、独自のフィルターを作ることによって対応していることでしょう。しかし、Plaggerは誰でも使えるツールというわけではありません。

リニューアル版1470.netに搭載したblogmapは、そういった高度なフィルタリング処理を、誰でも簡単に実現できるようにしたツールなのです。

という理想の元に設計したわけですけど、実際にそういう風に使えるのかどうかはまだ分かりません。まあぼちぼち使ってみて、不満や改善案などがあったらコメントください。

MM/Memoのお気に入り相当の機能は

リニューアル版1470.netの各ユーザーのフィードをblogmapに登録することで、それらのユーザーのフィードをミックスした新着情報、注目情報が抽出されるようになります。

他のSBMのフィードの場合

blogmapでは、基本的にblog等のエントリー情報を含むフィードを解析し、そのフィードの本文(description、content:encoded、contentなど)内に含まれるURLを解析します。

一般的なSBMの場合は、そのフィードのアイテム要素としてURL情報を持ち、本文等にそれらURLへのリンクを持たないため、同じロジックでは解析対象となりません。1470.netのように、本文要素にURL情報を含むフィードを配信するSBMの場合(あるのか知りませんけど)は対応できます。

アドホックに有名SBMを別扱いに処理することも不可能ではありませんが、できればそういう汚い実装は避けたいので、現時点では他のSBMで提供されるフィードをblogmapに登録しても、そのURL等は解析対象にはなりません(/uri/*系の情報には、どのフィードに登録されたかなどの情報が表示されるようになるので、登録しても意味がないわけではないですけど)。

このあたりは何かいい方法(統一的な扱いで、なおかつ有意な情報を得る方法)が見つかるまでは、ペンディング状態です。

具体的な利用イメージとしては

主に情報提供系サイトで、

  • その主たる内容が、URL抽出によっておおむね表現される
  • RSS/Atomフィードで全文(もしくはそれに近い)コンテンツを配信している
  • 日々更新される情報量が多くて、すべてのエントリーを読み切れない

ようなサイトに関しては、RSS/Atomフィードリーダーに直接登録するのはやめてしまいます。代わりにそのようなサイトはblogmapに登録し、blogmapの新着もしくは注目URIのフィードをチェックするようにします。

そうすることで、エントリー本文を毎回チェックするサイトと、情報の中の一部のみをチェックするサイトを区分し、日々の情報の整理を効率化させよう、といった感じになります。

ただまあ私の場合は、普段フィードリーダーでエントリーを全部読むサイトもそうでないサイトも、コンテンツ本文が配信されているサイトはほとんど登録しちゃってますけど。

Published At2006-07-14 00:00Updated At2006-07-14 00:00

日記
対応方法が思いつかないspamEdit

そのページに書かれている文章から抜き取ったテキストの最後に1行(宣伝)URLを追加したツッコミspamがさっき来たんだけど、これって機械的な識別がえらく難しそうだな。日本語利用チェックとか、URL文字列割合チェックとか、その手の対応はすべて無効で、ほぼURL・ドメインベースのblacklistで対応するしか手はないんじゃなかろうか。

Published At2006-07-15 00:00Updated At2006-07-15 00:00

日記
タグ入力支援機能の改善Edit

リニューアル版1470.netのタグ入力支援機能を、使いにくいまま放置している。この辺は結局Ajaxを使わなければならず*1、Ajaxを使う場合はちゃんと設計してから作らないとぐだぐだになりがち*2なんで、隙間でちょっと機能追加するといった感じで作れない。

ひとまずタグ入力支援機能として、どういう機能があれば使いやすいのか自分の中でまとめ切れてないんで、具体的にどういう支援機能があればうれしいみたいなご意見募集中です。

*1 タグ入力支援インターフェースは扱うデータ量が多いんで、それをすべてサーバーサイドで生成していると、メモ入力フォームという頻繁に表示するページの応答速度が遅くなってしまい、使い物にならなくなる

*2 クライアントサイドとサーバーサイド(API)との連携が必要になるんで、単に一つのプログラムを作るのではなく、2つのプログラムを別々に作って、それらを協調動作させるような設計が必要になり、そういうのは仕様変更に弱いから、初期の設計を適当にすませられない

Published At2006-07-15 00:00Updated At2006-07-15 00:00

日記
データフォーマットはJSONでもいいでしょうか?Edit

メモのバックアップ向けのAPIを作りかけている。インターフェースは基本RESTで行こうと思っているんだけど、データフォーマットをどうしようか悩み中。XMLが無難ではあるんだけど、やっぱりうざいなー。特にTSVとかCSVでも十分に表現できるようなデータを、わざわざXMLにするのがだるい。ただ、そういうときにTSVとかCSVとか使うってのも、扱うデータフォーマットの統一感とか、データが途中でぶち切れたとき対策とかの点でいまいちだ。で、今のところJSONにしちゃおうと思っていたりするんだけど、それだと困るって人はいますかねー。まあ最悪クライアント側のサンプル実装もこっちで作れば問題ないか。

Published At2006-07-15 00:00Updated At2006-07-15 00:00

日記
6時頃から8時半頃までサーバーが死んでましたEdit

今朝6時頃から8時半頃まで、フロントサーバーが刺さっていて、応答しない状態になっていました。

CRONDプロセスがやたらと増殖して、プロセス数を食いつぶして、shutdownすら効かない状態になっていた(ハードリセットした)んだけど、これはいったい何だったんだろう?

Published At2006-07-16 00:00Updated At2006-07-16 00:00

日記
タグ入力補助機能追加中Edit

しばたさんの要望を中心に、タグ入力補助機能を追加していっています。

で、まずタグの「インクリメンタル・タグ補完」を追加しました。タグ欄に文字を入力すると、過去に自分が使用した、その文字から始まるタグを候補として表示されます。ただし、migemo風のローマ字入力→日本語推測→タグ補完まではできていません。これはmigemoを内部で使うよりも、自前で辞書を持った方がいいかもなー。

あと、同じURI、MONOを扱った他のメモに使われたタグを「おすすめ」として表示する機能もつけておきました。MONOの場合は、作者名なども「おすすめ」として表示します。

「関連語のsuggestion」(タグ自体の関連性をたどる)も難しくなさそうなんで、そのうち対応すると思います。

関連語のsuggestionもつけてみました

インターフェース的にはちょっと微妙だけど、使い物にはなるかな。

Published At2006-07-16 00:00Updated At2006-07-16 00:00

日記
lighttpd+fastcgi+PHP 5って安定しない?Edit

なんかしばらく動かしておくと、CPUパワーを消費し続けるPHPプロセスが生まれて、そいつらのせいでじわじわとload averageがあがっていく。lighttpdを再起動すると直るんだけど、場合によってはlighttpdを再起動しても上記のようなPHPプロセスが居座り続けて、強制的に殺さないといなくなってくれない。どこかに無限ループになるような処理があったりして、そいつがPHP/fastcgiプロセスとしてずっと動き続けてたりするんだろうか? ひとまず定期的にlighttpdは再起動しておくのが無難か?

Published At2006-07-16 00:00Updated At2006-07-16 00:00

日記
メモ情報取得APIEdit

主にメモデータバックアップ目的のためのメモ情報取得APIを用意しました。すみません。API仕様を変更してます。戻り値を直接ルートノードから返すのではなく、必ず"result"ノード下に収納することにしました。

リスト取得

  • URL - http://1470.net/api/memo/list
  • パラメータ(QUERY_STRING)
    • userName - 1470.netユーザーID(省略可)。指定すると、そのユーザーのメモ情報のみが対象となる。
    • updt - 更新日時(省略可)。指定するとその更新日時以降に更新されたメモのみが対象となる。
  • リクエストメソッド - GET
  • 戻り値
    • データ形式 - JSON
    • 例 {"info": {"totalCount": 1234}, "result": [{"id" : 998, "updt" : "2006-06-30 02:16:20"}, {"id" : 999, "updt" : "2006-06-30 02:16:21"}, ...]}
    • info.totalCount - 該当した総項目数(2000を超えている場合、各項目として返るのは最初の2000件)
    • result.* - 各項目
      • id - メモID。メモにつけられたユニークなID。
      • updt - メモの更新日時(JST)
    • ソートオーダー
      • updt asc。
  • 制約
    • 結果が2000件を超える場合は、最初の2000件のみを返す。その場合updtパラメータ指定などを使って、続きの情報を取得し直す必要がある。

メモ情報取得

  • URL - http://1470.net/api/memo/[メモID]
  • パラメータ - なし
  • リクエストメソッド - GET
  • 戻り値
    • データ形式 - JSON
    • 例 {"result": {"id" : 34553, "url" : "http://1470.net/user/ishinao/2006/07/01#m_34553", "title" : "集英社 ハチミツとクローバー 9 (9) 羽海野 チカ", "comment" : null, "eval" : null, "tags" : ["羽海野 チカ", "ハチクロ", "マンガ"], "groups" : {}, "uri" : {}, "mono" : [{"asin" : 4088653521, "uri" : "http://www.amazon.co.jp/exec/obidos/ASIN/4088653521/ref=nosim/ishinao-22", "title" : "集英社 ハチミツとクローバー 9 (9) 羽海野 チカ"}], "map" : {}, "event" : [{"name" : "集英社 ハチミツとクローバー 9 (9) 羽海野 チカ 発売日", "stdt" : "2006-07-14 00:00:00", "eddt" : null}], "todo" : null, "rgdt" : "2006-07-01 14:04:38", "updt" : "2006-07-16 20:55:51"}}
    • 項目
      • id - メモID
      • userName - ユーザーID
      • url - メモURL
      • title - メモタイトル
      • comment - コメント
      • eval - 評価
      • tags - タグ(配列)
      • groups - グループ(配列)
      • uri - メモに添付されたURI情報(配列)
        • url - URL文字列。
        • title - URIで示されたドキュメントのタイトル。
      • mono - メモに添付されたMONO情報(配列)
        • asin - ASINコード。
        • url - Amazon個別商品ページURL。
        • title - 商品情報(タイトル+著作者情報)。
      • map - メモに添付された位置情報(配列)
        • name - 位置情報名。
        • latitude - 緯度。
        • longitude - 経度。
        • zoom - Google Maps APIにおけるズーム情報。
      • event - メモに添付されたイベント情報(配列)
        • name - イベント名。
        • stdt - イベント開始日
        • use_sttime - イベント開始日で時間要素も有効かどうか
        • eddt - イベント終了日
        • use_edtime - イベント終了日で時間要素も有効かどうか
      • todo - メモに添付されたToDo情報
        • name - 次に行うToDo名。
        • tododt - その予定日。
      • rgdt - メモ登録日
      • updt - メモ更新日

バックアップクライアントサンプル実装

require_once 'Zend/Json.php';
$userName = 'ishinao';
$dataDir = '/tmp/backup';
$listUrl = 'http://1470.net/api/memo/list';
$itemUrl = 'http://1470.net/api/memo/';
$touchFile = $dataDir . '/touch';
$updt = filemtime($touchFile);
$rawListData = file_get_contents($listUrl . '?userName=' . urlencode($userName) . '&updt=' . urlencode(date('Y-m-d H:i:s', $updt)));
$decodedListData = Zend_Json::decode($rawListData);
$list = $decodedListData['result'];
foreach ($list as $row) {
$memoId = intval($row['id']);
if (!$memoId) {continue;}
$dataFile = $dataDir . '/' . $memoId . '.txt';
if (file_exists($dataFile) && (filemtime($dataFile) == strtotime($row['updt']))) {continue;}
$rawItemData = file_get_contents($itemUrl . $memoId);
$decodedItemData = Zend_Json::decode($rawItemData);
$item = $decodedItemData['result'];
if ($item['id'] != $memoId) {
throw new Exception('memo cannot read: ' . $memoId);
}
file_put_contents($dataFile, $rawItemData);
touch($dataFile, strtotime($row['updt']));
touch($touchFile, strtotime($row['updt']));
}

Published At2006-07-17 00:00Updated At2006-07-17 00:00

日記
携帯用ユーザーページを追加しましたEdit

携帯ページにユーザーページ(ユーザーごとの新着/ToDo表示)を追加しました。これで出先でToDo(っつーか買物リスト)をチェックしやすくなったな。

携帯(フルブラウザ以外)でもツール系の機能を使えるようにするべきかなー。携帯は閲覧さえできればそれで十分かなー。と迷いつつちょろっと試してみたところ、TypeKeyやはてな認証APIはEZWebから接続できない(SSL証明書が携帯非対応)ことが判明。ひとまず無理か。俺自身はW-ZERO3+Operaでフル機能使えるしなー。

Published At2006-07-17 00:00Updated At2006-07-17 00:00