Home

日記
形態素解析した結果の並びで怪しいところだけN-gramを使う (15:50)Edit

思いつきネタ。形態素解析した結果の要素の並びとして、いかにもミスヒット(分割)らしいパターンの周辺だけN-gramも併用すると、検索精度が上がったりしないだろうか。

ちょろっと試してみた限りでは、名詞(非人名)+名詞(人名)の並びはいかにも辞書に載っていない名詞のミス分割って感じになりそうだった。あとひらがなの連続単語とかの場合も、なにか特徴的なパターンがありそう。

形態素解析ロジックではうまく分割できないパターンを見つけ出すいい方法があれば、そこだけN-gramを併用することで、インデックスのサイズを抑えながら精度を高めることができそうな気がする。

Published At2005-02-24 00:00Updated At2005-02-24 00:00

日記
ソーシャルブックマークを使ったSPAMデータベース (17:09)Edit

この辺から始まった思いつき。

SPAMコメント/trackbackに書かれていたURL、投稿元のIPアドレスをソーシャルブックマークサービスを使って蓄積し、RSS配信などを使って他のツールから利用すると便利かもしれない。

たとえばdel.icio.usにSPAMコメントに書かれていたURL、IPアドレス(title欄を使っている)を登録してみた例。タグ名としてSPAM_BLACKLIST_URLというユニーク性の高いものを利用することで判別しやすくしている。

ただしこういう使い方をすると他のユーザーに迷惑がかかる可能性が高い。あと、スパマーが妨害のためにゴミURLを大量に投稿してくるかもしれない。というあたり問題もあるんだけど、ソーシャルブックマーク的なアプローチで手軽にSPAM URLデータベースを構築するという案自体は、何か使えそうな気がする。

Published At2005-02-24 00:00Updated At2005-02-24 00:00

日記
キャッシュを表示する時に危険なスクリプトを排除する (19:26)Edit

キャッシングした他サイトのコンテンツを自サイトのURL上で表示した場合、そのコンテンツにスクリプトが含まれていると、そのスクリプトは自サイトのドメイン権限で実行できることになり、自サイトドメインのCookieなどをスクリプトから読まれてしまう可能性がある。で、そういう場合にある程度スクリプトの危険性を排除しつつ、比較的改変が少なくてすむ方法の案。

$invalid = array('cookie', 'location', 'window', 'script');
foreach ($invalid as $str) {
$body = preg_replace('/'.preg_quote($str).'/ie', '"&#".ord("$0").";".substr("$0", 1)', $body);
}

なんて感じにするとどうだろう? 要は危険そうな文字列は最初の一文字を実体参照に置き換えてしまうという方法。$invalidはもうちょいパターンを増やした方がいいだろうな。onという文字列も対象にしておくと、主立ったイベント処理がつぶせるかな。あとxmlhttprequestとかも危険。

そういやGoogleとかwebarchiveとかってどうしているんだろう? まあ自ドメインでスクリプトを実行されても大して危険がないサイトなら、対策を取る必要もないんだろうけど。

Published At2005-02-24 00:00Updated At2005-02-24 00:00

日記
大雪ですよ! (00:08)Edit

渋谷を出たときには雨だったのに、埼玉に着いたらなんか大雪なんですが。車の上とかにすでに10センチ以上つもっているんですが。この調子だと明日の朝子供を保育園に送るのに車を使えないかもしれない。キッツイなー。

Published At2005-02-25 00:00Updated At2005-02-25 00:00

日記
なんかRubyがやたらとCPUを食っているんで (14:14)Edit

いったんリファラーの表示を中止。高速化されたという新しいdisp_refererを入れてみようか。でもうちの場合、あんまりリファラーって使われていない気もするから、非表示のままでもいいかな。

Published At2005-02-25 00:00Updated At2005-02-25 00:00

日記
なんで楽曲データとか歌詞とかのデータを入れないのか (15:30)Edit

コピーコントロールCDとかSACDとかDVD-AUDIOとか、レコード会社さんはなんかいろんなことをやっているけど、そんなのに金をかける余力はあるのに、いまだにCDの楽曲情報はCDDBとかから取らなきゃいけないの? CDの楽曲情報(CDタイトル、曲タイトル、作成者、歌詞、ジャケット画像……)をとっととCDに入れてくれよ。

Published At2005-02-25 00:00Updated At2005-02-25 00:00

日記
静的コンテンツとして生成しつつも、Ajaxを使って動的コンテンツを埋め込む (16:51)Edit

Ajax関連の思いつき。movable typeみたいに基本的にコンテンツは静的に生成する。が、コメントやtrackbackみたいな動的コンテンツ部分が混ざっていると、通常はリビルドしないとコンテンツは表に反映されない(んだよね。MTの作りって見てないけど)。

そこでAjaxを使い、コメントやtrackbackなどの動的要素部分について、非同期でサーバーに問い合わせ、もしも更新があったらその部分だけをダイナミックに書き換える。そうすることで、完全リビルドしなくてもAjaxが有効なブラウザ環境ならば最新データが見える。もしもAjaxが無効な環境だとしても、少なくとも最後にビルドされた状態は見える。

といった感じで、静的生成しつつも、Ajax環境なら動的生成の恩恵も受けられる、という中間形態でパブリッシュできるようにしておくといいかもしれない。

まあblogツールの例の場合は、リビルドした方が効率がよさそうな感じだけど、CMS系一般として考えるとほとんど静的コンテンツ生成+Ajaxによる一部動的コンテンツ、という仕組みがうまくはまる例がありそうだ。blogツールでも切込隊長blogみたいなコメントチャット状態のところだと結構いけるかも。

Published At2005-02-25 00:00Updated At2005-02-25 00:00

日記
ってなんか (16:53)Edit

Ajaxをつかった「くっつき〜」系みたいな感じだな。違いは、js無効でも前回リビルド時のデータが表示されている、と言う点くらいか。

Published At2005-02-25 00:00Updated At2005-02-25 00:00

日記
javascriptでテンプレート的なことをやる方法は? (18:48)Edit

JavaScriptでテンプレート的なことをやってみようかと思って試しに、

<script language="javascript">
function add() {
var clone = document.getElementById('template').cloneNode(true);
var contents = document.getElementById('contents');
contents.appendChild(clone);
clone.all('title').innerHTML = '<h1>タイトル</h1>';
clone.all('number').innerText = Math.random() * 100;
clone.style.display = "block";
}
</script>
<a onclick="add()">add</a>
<div id="template" style="display: none;">
<span id="title"></span>
<span id="number"></span>
</div>
<div id="contents">
</div>

とかやってみたんだけど、allってIEでしか使えない(というか、Mozilla系では使えない)のか。Mozilla系でも使えるようにするには、どう書けばいいんだろう?

惜しい

DIVの子エレメントを取得できないなら、元テンプレートの内容を書き換えちゃってからcloneNodeしてしまえ! と思ったんだけど、Firefoxではなんか挙動が変だ。title、numberを書き換えると一個前にcloneNodeした内容まで書き換わってしまう。cloneNodeしてもIDが一緒だから、getElementById('title')とかしたターゲットがtemplateの中身だと絞れていないってことか? IEだとこっちでも正常に動いているんだけど。  そういやFirefoxでは中身が空のspanのinnerTextは設定できなかった(多分createTextNodeしなきゃダメなんだと思う)んで、innerHTMLに変えた。

<script language="javascript">
function add() {
document.getElementById('title').innerHTML = '<h1>タイトル</h1>';
document.getElementById('number').innerHTML = (Math.random() * 100).toString();
var clone = document.getElementById('template').cloneNode(true);
var contents = document.getElementById('contents');
contents.appendChild(clone);
clone.style.display = "block";
}
</script>
<a onclick="add()">add</a>
<div id="template" style="display: none;">
<span id="title"></span>
<span id="number"></span>
</div>
<div id="contents">
</div>

やっと動くようになった

なんか無駄に回りくどいんだけど、互換性のためにはこう書かなきゃだめなの? もっと短くて両対応な書き方あるかなー。

<script language="javascript">
function add() {
var contents = document.getElementById('contents');
var template = document.getElementById('template');
var clone = template.cloneNode(true);
contents.appendChild(clone);
var title = getChildElementByClass(clone, 'title');
if (title) {title.innerHTML = 'タイトル';}
var number = getChildElementByClass(clone, 'number');
if (number) {number.innerHTML = (Math.random() * 100).toString();}
clone.style.display = "block";
}
function getChildElementByClass(pnode, className) {
for (var i = 0; i < pnode.childNodes.length; i++) {
var current = pnode.childNodes[i];
if (current.className == className) {return current;}
}
}
</script>
<a onclick="add()">add</a>
<div id="template" style="display: none;">
<h1 class="title">default title</h1>
<span class="number">default number</span>
</div>
<div id="contents">
</div>

Published At2005-02-25 00:00Updated At2005-02-25 00:00

日記
タグベースのブラウザ (00:58)Edit

mixiのshinoさんの日記を元にしたネタ。ソーシャルブックマークサービスのタグをたどって閲覧していく行為に特化したブラウザを、Ajaxを使って作るといいのでは。

まず元になる(MMの場合は)メモを開く。すると、そのメモの周辺にはそのメモにつけられたタグが描かれている。タグをクリックすると、そのタグで検索された最新n件のメモが表示され、さらにそれぞれのメモの周辺にはそれにつけられたタグが描かれている……。

って感じのもので、タグによる検索をAjaxを使って先読みしておいて、クリックされた段階で実際に表示する。もしもMindMap的な表現をするとしたら、以下のような感じ(JavaApplet。動作環境がよくわからないんで、見れない人ごめんなさい)。wemaあたりをベースに非同期で読み込んだ付箋を追加していくインターフェースを持たせたら何とかなるかもしれない。

あるいは単純にツリー表示にしてもいい。

  • 『[ネット]『「パソコン通信」とは何だったのか』反応』
    • [SNS]
      • 『Socialtunes』
      • 『はてな SNSもどき』
      • 『[TypeKey][SNS] TypeKey SNS (18:22)』
    • [blog]
      • 『コメントとツッコミとレスとトラックバックのあるブログはどうか』
      • 『ラブラブドキュンパックリコ - Blogのコメント欄が賛同か批判の両極端になりやすい理由とは?』
      • 『ウェブログの心理学』
      • 『アマゾンアソシエイトにNOと言え。』
    • [パソコン通信]
      • 『ITmedia ライフスタイル:「パソコン通信」とは何だったのか (1/3)』
      • 『ニフティ: 「ワープロ・パソコン通信」サービスの終了について』

ツリー表示と言えば、trackbackの追跡なんかもAjaxを使って非同期読み込みにしてもいいな。というか、現在blogmapに組み込んでいるtrackback追跡機能はそのうちAjaxを使って、解析状況に応じてツリーの枝を表示していくように改造しよう。

現在はリミットに達するまでサーバーサイドでたどってから表示しているんで、とっても重い機能になっちゃってる。Ajaxを使えば、1階層だけたどって結果を返すサーバーサイドスクリプトとそれを非同期で読んで結果を表示(追記)するJavaScriptの連携になるんで、とてもシンプルかつ高速に表現できる。しかもユーザーのアクションに応じて展開していけば、不要な枝をいちいちたどらなくてすむ。

Published At2005-02-27 00:00Updated At2005-02-27 00:00