2005-02-01 [長年日記]
_ gonzui の php support (00:57)
とくひろさんが、昨日のネタを使って、gonzuiのPHP parserを書いてくれました。試してみたところ、ちゃんとPHPのコードとして認識されcolorizeしてくれるようになりました。ただ、関数とかクラスの定義はうまく認識されていない模様。でも、ここまで動くものがあればあとは自力でいじっても何とかなりそうな感じです。ありがとうございました。
_ 関数・クラス対応バージョン (13:46)
おお、早くも関数・クラス定義に対応したバージョンにアップデートされましたよ。インポートし直したら、今度はちゃんとPHPの関数使用率統計とかも現れた。
ただ、勢い余ってPEARライブラリをまとめてgonzuiにつっこんでみようかと思ったら、PEARのtgzなアーカイブを食わせるとgonzuiがうまく認識できない模様。いったんtarで展開してからもう一度tgzに固め直してやるとうまく食えるらしいけど、何かアーカイブのフォーマットが違うんだろうか?
ひとまずhttp://gonzui.ishinao.net/以下には自分がチェックしたい公開アーカイブをつっこんでおくけど、それとは別に自分の作ったコードをgonzuiで閲覧できるようにしたプライベートなgonzuiも立ち上げておくと便利そうだな。どうせなら、Subversionリポジトリと適当に同期をとるようにしておくと、さらに便利かも。あるいは単に特定ディレクトリにおかれたtgzファイルをチェックして、更新されていたらremove、importを自動的にしてくれるだけでもいいか。
あと、gonzui用PHPパーサーページが独立した模様。
ところで、gonzuiは基本的には自前で各言語のパーサーを持つというアプローチみたいだけど、このPHPのアプローチみたいに他言語で使いやすいパーサーがある場合は、それを使ってgonzuiに取り込むためのインターフェースを持たせておくと便利かもしれない。インターフェースっていうか中間出力のフォーマットを決めておく感じかな。XMLとかYAMLとか。
_ mm_footer.rbとrss_recent.rb改造版 (15:37)
ちゃんとRuby(とtDiary)のお勉強をしてから真面目に書き直そうかと思ってたんだけど、キビシイ督促(笑)を受けたんで、適当バージョンを公開しておきます。
なかにはrss_recent.rbの改造版と、それに依存したmm_footer.rbがあります。rss_recentは、
- 引数にテンプレート文字列を渡すことで、出力するHTMLを変更できるようにした
- RSSのcontent:encoded要素を解釈&保存するようにした(require 'rss/content')
- RSSの取得(パース)失敗時には古いキャッシュを使うようにした
- アイテムが0のときは空文字列を返すようにした
という改造を施しています。あとデフォルトのテンプレートを従来のものと変えちゃっているんで、置き換えるとrss_recentの出力が変わってしまいます(どう変わるかというと、ここのサイドバーのような内容になります)。
で、mm_footer.rbは改造版rss_recentを使って、各日付のフッタにその日のMMの内容(content:encoded部のみ)を表示するプラグインです。面倒くさいんでMMのユーザーIDは17行目あたりに、
mm_user = 1 # your MM id
とかしちゃってるんで、それを自分のIDに書き換えて使ってください。というか本当は、プラグインで設定を編集・保存できるようにしつつ、未設定の場合は表示しないようにすればいいんだけどね。ついでにテンプレートもWebインターフェースで変更できるようにしておけばいいんだけどね。
標準のテンプレートでは、<div class="section"><ul class="mm_footer">なんて感じになってるんで、適当にCSS定義を追加して見た目を変えてください。ul.mm_footer span.url {font-size: 80%; color: silver;}とかしておくと、ここの表示みたいな感じでURL文字列が目立たなくなります。
ところでテンプレートに埋め込んだ文字列変数を再評価するのにevalを使っているんだけど、もっと安全な方法ってないのかな? それともsecureの設定で使用できる命令とかが絞られて自動的に安全になる? というかもしかしたらsecure関連の設定によっては、このコードはそのままじゃ動かないかも?
あ、あとcontent:encodedをCGI.escapeHTMLしないで出力してますけど、その場合content:encodedに攻撃コードを入れられることによって、tDiaryをおいているドメインに対して攻撃を受ける危険性があります。一応そういうリスクを念頭に置いた上でご利用ください。
_ ジャスト「一太郎」の販売中止を命じる 松下アイコン訴訟で判決 (もっと詳しく) (17:15)
こういうつまらん特許は、行使しようとした結果もめたらその段階で、まずそれが本当に特許として有効な技術なのかどうかの再審査を受けるようにして、それでつまらん内容だと判断されたら簡単に無効化できるようにならないだろうか。
特許の初期審査にコストをかけられないというのは、まあしょうがないとしよう。すでに取得済みのつまらない特許も山のようにあるだろうから、今から入り口を塞いでも手遅れだ。だから、入り口(新規申請)は今まで通りでかまわない。
ただし、それを行使しようとしてもめた場合(裁判になった場合)、特許が有効という前提で侵害されているかどうかを争う前に、まずその特許自体の妥当性を審査するようにする。そうすれば、妥当な技術審査をするべき件数は大幅に減るだろうから、1件あたりにはそれなりのコストをかけられるんじゃないか。
個人的には、その問題について世界中の人が考えた場合、100人以上の人が思いつきそうな技術(手段)は、特許にならない、とかして欲しいな。10人でもいいかも。
2005-02-03 [長年日記]
_ 薬をもらいに行った (17:54)
まだ症状は出ていないんだけど、今年はひどいという話だし、そろそろ来だしたという人もいるみたいなんで、花粉症の薬をもらいに行ってきた。ひとまず去年と同じ弱めの薬3週間分。今年も去年みたいに楽に乗り切れるといいんだけどなー。
_ Sleipnir用メモ登録スクリプト (18:52)
SleipnirでMMへの登録bookmarkletが動かない(というかbookmarklet一般が動かないんだけど)という嘆き(?)を目にしたんで、Sleipnir用スクリプトのサンプルを。というか、bookmarkletをSleipnirで動かしたい場合は、Sleipnirのスクリプトを(JavaScriptモードで)新規作成して、TODOのところにbookmarkletのJavaScriptコード部分をコピペして、もしwindowオブジェクトを使っているところがあったら、pnir.GetWindowObject(id)に書き換えればだいたい動くんじゃなかろうか? Sleipnirのスクリプトってほとんど使ったことないから知らないけど。
var pnir;
var document;
var id;
pnir = new ActiveXObject("Sleipnir.API");
id = pnir.GetDocumentID(pnir.ActiveIndex);
document = pnir.GetDocumentObject(id);
if (document == null) {
pnir.MessageBox("Document オブジェクトを作成できません");
}
else {
pnir.GetWindowObject(id).open('http://1470.net/mm/memo_form.html?url=' + escape(document.location.href));
document = null;
}
pnir = null;
リンクバーに追加すればSleipnirでもbookmarkletを使えるんだそうな
リンクバーっていつも非表示にしていたから気づかなかった。
2005-02-04 [長年日記]
_ ローカルblogおよびグルーピングサーバー (14:52)
思いつき。自分のローカルPC上でhttpdを動かして、そこでローカルblogを動かす。ローカルblogは、以下のような機能を持つ。
- 本人は、http://localhost/blog/なんてURLでふつうのblogのようにアクセスできる。もちろんエントリーの投稿とか編集とかもできる。通常はlocalhostのみからアクセスできる(allow from 127.0.0.1)。公開したいエントリーを、http://localhost/blog/public/なんてディレクトリーにマウントすることも可能。そうするとLAN内の他のPCから公開されたエントリーを閲覧することもできる。
- ローカルblogに投稿されたエントリーのうち指定したものを、インターネット上に公開された(一般的な)blogツールと同期することができる。bloggers APIを使ったり、あるいはベタにフォームでPOSTしたり(その場合は新規投稿以外の動作は保証されない)。つまり、ローカルblogは公開前の下書きとしても利用できる。
- ローカルblogには、del.cio.usとかMMとかみたいなメモ付きブックマーク的機能もある。また、ローカルblogではメモした時点の外部URLのコンテンツをすべて自動的にローカルバックアップする機能を持つ(MMでは権利関連が面倒なんで実装していない機能)。更新チェックなどの機能もあると便利かもしれない。
- LAN内にあるローカルblog同士は相互に連携することができる。同じLAN内に接続されたローカルblogの存在を自動的に認識し、LAN内でオンラインのローカルblogそれぞれの更新状況などを取得することができる。また、相互にtrackbackなどを送受信することもできる。
- ローカルblogを管理するグルーピングサーバーを作ることができる。グルーピングサーバー上にアカウントを持つローカルblogが、そのLANに参加すると、ローカルblogの内容はグルーピングサーバーと同期される。つまり、グルーピングサーバーが存在するLANに接続している間は、ローカルblogはグルーピングサーバー上にマウントされて見える。これによりグルーピングサーバーが存在するLAN上では、あるローカルblogがオフラインのときでも、そのローカルblogのデータ(の同期されたもの)にアクセスできる。
- グルーピングサーバーは、update pingサーバーやtrackbackセンター、グループに所属するすべてのblogに対する全文検索(estraierのメタ検索とかを応用してもいいかも)などの機能を持つ。
という仕組みで何ができるのかというと、
- ひとまずインターネットにつながらない環境でも、ローカルPC上で動作するblogツールを使ってエントリーを書くことができる。
- そこに書かれた記事はそのままではインターネット上に公開されないので、下書きやメモなどの雑多な内容を自由に(blogツールの使用感覚で)書くことができる。
- インターネット上に公開したい記事は、そのまま外部サーバーと同期をとるだけで、公開することもできる。
- 下書きや情報収集中に参照した外部URLのデータは、自動的にローカルblog環境にスクラップされていき、後で(オフラインで)閲覧することができる。
- グルーピングサーバーがあるLAN上にいるときは、ローカルblogがグルーピングサーバー上で管理されることにより、グループウェアの1クライアント的な存在となる。
本当は、ドキュメント管理用のWiki、ファイル管理&履歴管理ツール(subversion)とか、Webメールクライアント(IMAPベース)とか、スケジューラークライアント(iCalベース)とか、デスクトップ検索システム(Estraierベース)と連携させて、ローカルPC上で動作する壮大なインターネットクライアントシステム、というか、Notesみたいなクライアント単体でも動作しサーバーとも連携できるグループウェアシステムの置き換えを妄想していたんだけど、そこまで行くと話がまとまらなくなったんで、ひとまずblog周辺に絞って書いてみた。誰か頑張ってオープンに仕様を切って作ってみませんか。ローカルで動く部分だけならそのうち作りたいけど、連携部分とかグルーピングサーバーの部分まで作る根性はあんまりないんだよなー。
2005-02-06 [長年日記]
_ またいかれた (19:00)
金曜日の夕方からまたおかしくなった。USB経由で充電すらできなくなっていたんだけど、ACアダプターにつないだら一応充電できるようになった。単体での再生はできるようになったんだけど、以降(USB接続で)PCで認識できなくなった。ネットで調べるとWindowsでUSB接続は何かと問題が出ることが多いらしいんで、ひとまずfirewireの変換アダプターを買ってきて試してみよう。それでダメなら修理か。
2005-02-07 [長年日記]
_ やっぱり故障らしい (12:32)
IEEE1394の6pin to 4pin変換アダプターを買ってきてつないでみたいんだけど、やっぱり認識してくれない。さらに別のPCに別のUSBケーブル(オクサンのiPod miniのやつ)を使って接続してみたんだけど、やっぱり認識してくれない。ということで完全に本体が故障しているっぽいな。
しかも、そうやって試しているうちに、満充電状態から数分でバッテリーのメモリがふたメモリも減りやがったよ。まだ買ってから1ヶ月ちょっとだし、バッテリーがへたるのには早すぎだよね。以前も満充電から3時間くらいでバッテリー残量がゼロになり、それからもう一度再生ボタンを押してみたらバッテリー残量ゼロのまま、3時間くらい再生できたことがあったし。
おかしな症状が出始めたのって、買ってからすぐだったんだけど、結局騙し騙し1ヶ月ちょっと使って来ちゃったから、今から持っていっても初期不良交換はしてくれないだろうなー。修理扱いは面倒くさそうだなー。ちょっと気合いを入れて交渉してみようかなー。
2005-02-08 [長年日記]
_ また休み (22:21)
なんかすごい勢いで有給が減っていくな。下の子がようやくうんこが固くなってきたかと思ったら、今度は熱を出したんで一回休み。昨日もオクサンが休んでいるんだけどね。っつーか、先月今月で2人合わせて2週間くらい休んだんじゃないか。
_ アップル直でしか受け付けないのね (22:21)
まだ買って一ヶ月だし、もしかしたら初期不良交換してくれるかなーと、買ったジャスコに持っていったら、アップル製品は交換の場合もすべてアップル直でしか受け付けないと言われた。しょうがないんでWebから申し込み。バッテリーの挙動も怪しいんで、できれば交換になってくれるといいんだけどなー。
_ キャッシュ機能 (22:39)
URL関連のメモについては、本人のみが閲覧できるキャッシュ機能を追加しました。自分のメモを[編集]すると、キャッシュへのリンクが表示されます。
キャッシュはメモを作成した時点の内容になります。また、キャッシュの期限は今のところ30日にしていますが、もっと短くなるかもしれません。この機能に関する仕様はばりばり変更されたり、あるいは機能自体がなくなったりするかもしれません。
2005-02-09 [長年日記]
_ インフルエンザ (15:46)
今週頭から熱を出していた下の子供。今日病院に連れて行ったところ、インフルエンザであることが判明した。熱が下がってから2日後まで登園禁止だと。本人はそんなに具合悪そうじゃないから、親のスケジュール調整の方が問題だな。良くて一週間くらいかかるんだろうなー。ようやく下痢の風邪も治ってきたところだったのに。
_ BackgroundScan Off (21:09)
1年前に買ってすぐに初期不良交換を1回、初期不良修理を1回行った後にも、
- なんだか知らんがiTunes(を初めとするオーディオデバイスを長時間つかむソフトウェア)でやたらとサウンド再生が不安定(音飛びというか、バッファメモリが壊れたみたいなノイズ混じりの再生になる)
- 無線LANがぶつぶつ切れる(30分くらいで突然切れて、しばらくすると復活する。SSHなんかを使っているとばりむかつく)
- というか、やたらと動作がぎくしゃくしている(何かの拍子に、Windowsの操作が数秒間固まっては復活するの繰り返しになる)
という症状が頻発して非常に不満足度が高かったLavie RXだけど、無線LAN(UGJZ 11a/b/g MiniPCI Netword Adapter)の設定をBackgroundScan Offに変更したら、諸症状がほとんどでなくなった模様。もしかしてBackgroundScanを行うたびに他のハードウェアの動作に支障が出るくらい負荷がかかっていたのか?
ひとまず上記設定を変更してから、iTunesの再生がおかしくなる症状は全くなくなった。あと、無線LANがぶつぶつ切れる症状にもまだ出会っていない。これでようやくふつうのマシンとして使えるレベルになった。
ただ新しく、サウンドチップ(SoundMax Integrated Digital Audio)が突然無反応になる(OS上では正常動作しているけど、まったく入出力がなくなる)症状が出るようになった。けど数時間に一回しか起きないし、そうなった場合はサウンドチップを無効→有効と変更するとリセットされて復活するんで、まあ運用でカバーできる範囲かな。
あまりにむかつくんで、そろそろ次のマシンを物色し始めていたんだけど、これでしばらくこのマシンを使い続ける気力が出たな。
2005-02-10 [長年日記]
_ 修理に出した (14:35)
引き取り修理は「時間指定ができない」と書かれていたけど、それ以前に日付の事前通知すらないのね。突然やってきた。Webから確認できるステータスにも「受付中」のままなのに。
_ spamほいほいがあふれた (17:55)
spamほいほいにしているIMAP4(courier-imap)のフォルダに2万件くらいメールがたまったら、becky!で移動も削除もできなくなってしまった。しょうがないんでサーバー上でディレクトリごと削除。imapって実用的に使えるメール件数は何件くらいまでなんだろう。というか、今回の制限はサーバー側にあったんだろうか、クライアント側にあったんだろうか。
imapをストレージ的にマウントして、グループウェアサーバーのバックエンドとして使うというネタを考えていたんだけど、あんまりばりばり使うとすぐに破綻するのかな。専用クライアントから見るとグループウェア(スケジュール、ToDo、メール、ドキュメント置き場)に見えて、メールクライアントから見えると単なるメール(特定書式+添付ファイル)に見えるようにすると、結構便利そうだと思うんだけど。
_ wikiにドラフト(下書き)という概念を持たせると便利かも (20:01)
ひとまず思いつきレベルを適当に書いたものをドラフトとして保存しておいて、あとでちゃんと推敲してcommitする。あるいは、誰でも編集できるけどそのデータはいったんドラフトとして保存され、管理者がcommitした場合のみ本来のドキュメントと差し替えられる。
とか言い出すと、ふつうにバージョン管理ツール的な概念を適用した方がいいんだろうな。でもblogでwikiでも、下書きレベルでいったんサーバーに保存したい(けど公開したくない)場合って結構あるよね。まあ使い勝手のいいローカルblog的な方向に向かう手もあるけど、サーバーにドラフトデータの保存機能を追加する方が手っ取り早そうだ。
そういやwiki系にbloggers APIみたいなものってまだでてきていないのかな。
2005-02-11 [長年日記]
_ いろいろ変えました (14:57)
主だった変更点は、
- トップページに表示する情報を整理した(特に新着情報を減らした)
- 代わりに、各カテゴリーごとの新着情報を別ページで表示するようにした(URL、ASIN、地図、テレビ番組)
- [類似メモ]を[関連情報]に変更し、「キーワードが似ているメモ」「同一URL/ASINに関するメモ」「同一URL/ASINにリンクしたサイト」をまとめて表示するようにした
- mylist以外のメモ表示時にも、メモコメント等を表示するようにした。
あたりかな。
_ タグの日本語揺らぎをロジックで吸収する (14:59)
そういや、日本語のタグ(MMではジャンル)の揺らぎをロジックで吸収する実験として、
「同じ話題に違うタグが付けられているものは、(重複数が多いほど)同じ意味を示している可能性が高い(たとえばあるURLメモに付けられているタグに「技術」と「tech」が多かった場合、それらは同一の意味だ、とか)」
を試してみたんだけど、現状だと人によってタグの使い方が全然違うんで、ちょっと難しいな。一つの話題に一つのタグしか付けられないならば、まだそういう方向で絞りやすいんだけど、一つのメモに複数のタグがつけられる場合、重複しているからといって必ずしも同じ意味とは限らないもんな。
やっぱりフリーワードをロジックで判別するよりも、ある程度の運用ルールを決めた上で、そのルールを守りやすい環境を整えてあげる(入力補助とか)ことで、タグの揺らぎを運用方面から減らしていった方がいい気がする。
_ タグってぇのは、ジャンルのことじゃないよね? (19:16)
タグの難しいところは、単に自分が便利なように検索キーワードとして定義する以外に、他人との連携のために「他の人とも共有できそうなキーワードも入れておいた方が便利」だというところ。で、そういう一般化を行うとどうしてもタグは、カテゴリーとかジャンルとかレベルの曖昧な表現になってしまう。というか、そういうタグも入れておいた方が便利。
だから、
- 他の人と連携しやすいような誰でも使いそうな(曖昧な)タグ
- ちょっと一般的ではないかもしれないけど、何人かは使いそうな(中間的な)タグ
- 自分のみが便利な(入力した自分のみわかればいい特徴的な)タグ
なんて感じで、個人的な利便性とソーシャルな連携とのどちらも考えつつ、さらにシステム的な制限とか入力の手間とか別軸の制限も加わる中で、ある程度の文字数・時間内でタグを入力していくことになる。
で、そう考えると上記の3パターンのうちどれが正しい(より良い)というわけでもない。だから以前は、入力する人が好きなように使っていく中で、システム側がその中からソーシャルな連携情報として使えそうな情報を抽出していくのが無難じゃないかなーと思っていた。
けど、「[MM] タグの日本語揺らぎをロジックで吸収する (14:59)」で書いたように、当初使えると思っていた類似タグ抽出ロジックが使えなかったんで、現時点では、さっきの3パターンで言うところの2番目に相当するあたりを推奨タグとして、システム側で積極的に入力支援機能とかを用意して、ユーザーが入力する段階でそれらを使うようにし向けていく方がより良いんじゃないかなーと思っていたりする。
ただ、こうやって説明してきたニュアンスは多分多くのユーザーには伝わらないだろうし、だいたいこんな説明を書いてもユーザーはほとんど読まないで使うだろう。さらに、ニュアンスを理解してくれた人の中でも、実際にそれぞれが2に沿って定義したタグの揺らぎが大きいだろう。ということで、結局のところはもうちょっと様子を見ながら、なるようになっていく中で面白い解決策が見つかるといいなー、って感じなんですよ。
あと、MMの場合はソーシャルブックマーク的な使い方もできるけど、URLやASINや地図やテレビ番組をキーにした何でもメモツールであり、簡単個人ニュースサイト作成ソフト(mylistページの見た目をtDiaryテーマで装飾)でもあり、スケジュール管理ソフト(未来の日付でメモを登録)でもあり、個人ワークフロー(メモ種類とジャンルの組み合わせで、書籍購入管理などにも使える)ツールでもあるんで、タグ方面は個人的な趣味としていろいろやっているけど、このツール自体の機能としてはあんまりコアなものでもないんだよな。
2005-02-15 [長年日記]
_ 治癒証明 (02:43)
ようやく下の子のインフルエンザの治癒証明が取れたんで、明日から通常復帰できる。それにしても、小児科すげー混み方だったな。午前中に2回行ったけど2回とも靴が外まであふれていたんで、午後一で行ってようやく治癒証明をもらえた。
オクサンの方もなにやら面倒くさそうな病気(命に別状があるようなものではないけど)になったりと、ここ最近いろいろあるなー。俺も最近また結石君が不穏な動きを見せ始めている気がするんだよなー。
_ 戻ってきた (13:58)
新品交換されて戻ってきた。8日に申し込んで、10日に集荷に来て、14日付の発送。その間、Web上のステータスは最後まで「(向こうへの)商品到着」から変わってなかったな。
_ まだ薬は飲んでないけど (17:34)
家を出たときにちょっと目がしばしばした気がした。そろそろ始まりそうかな。
2005-02-16 [長年日記]
_ あーびっくりした (04:58)
つくばで震度5だった模様。埼玉は震度4。車の警報機がばりばり鳴った。
_ HTTP_Clientで連続アクセスするとき (10:10)
require_once 'HTTP/Client.php'; $client =& new HTTP_Client(); $client->get($url1); $client->get($url2);
なんて感じで書くと、$url2にはHTTP_REFERERとして$url1が渡されちゃうんだね。気をつけないと。
ちなみに
HTTP_Clientクラスの概要によれば、
HTTP リダイレクトのハンドリング、クッキーのストア、 また、リクエスト間のリファラをセットします。
となっていて、HTTP_REFERERが渡されるのは仕様通りの挙動なんですよ。なんか「漏れ」というと、HTTP_Clientの実装が悪いように聞こえるんで、ちょっと補足。
_ del.icio.usみたいなサービスは (11:36)
いろんな国の人がそれぞれの言語でデータを登録できるようにするのもいいけど、指定した言語で登録されたデータのみを抽出できる仕組みも用意しておいた方がいい気がする。
っつーか、日本語の投稿がたくさんある状態って、非日本語圏の人たちはどう思っているんだろう? じゃまくせーとか思ってないかなー。
_ refererを記録するbookmarklet (14:47)
同窓版だと、
javascript:document.location.href= 'http://1470.net/mm/memo_form.html?url='+ escape(document.location.href)+ ';memo_url='+escape(document.referrer);
別窓版だと、
javascript:void(
window.open('http://1470.net/mm/memo_form.html?url='+
escape(document.location.href)+
';memo_url='+escape(document.referrer)));
なんて感じのbookmarklet(実際には改行は削る)を使うと関連URLのところにデフォルトでHTTP_REFERERが入るようになりますよ。逆にじゃまくさい場合もありそうだけど。
_ bookmarkletを拡張する場合 (15:20)
上記でmemo_urlという引数を使ってますけど、そのほかにも、
- memo_date 日付
- memo_title タイトル
- memo_kind 種類
- memo_eval 評価
- memo_genre ジャンル
- memo_text コメント
- memo_url 関連URL
なんてのが使えるんで、適当なカスタムbookmarkletを作っておくと便利な場合もあるかもしれません。
_ お気に入り新着リストを追加 (19:08)
気に入った人のみの新着メモを表示する機能。
各ユーザーのmylistのヘッダ部分に「このユーザーをお気に入り新着リストに 追加する / 削除する」なんてリンクがあるんで、そこからユーザーをお気に入りに追加する。
自分のお気に入り新着リストを見たい場合は、自分のmylistページのヘッダ部にある「お気に入り新着リスト: URL / メディア / テレビ番組 / 位置情報」のところをクリック。
って感じで、標準で用意しましたよ>nazokingさん。もっとSNSっぽく料理することもできるけど、実用本位でこんなもんでいいや。
お気に入り新着リストを他のユーザーから見えるようにするか見えないようにするかちょっと迷ったけど、1470.net上では基本的にすべての情報を公開する方針なんで、全公開。
2005-02-17 [長年日記]
_ ダブル定額は今月で解約 (13:48)
最初のうちはいろいろ遊んでいたんだけど、もうあんまり使わなくなってきたんで、ダブル定額は解約することにした。高画質写真をメールで送り放題ってのは捨てがたいんだけど、思ったより撮影するのが面倒くさいし。
で、休眠中のAirH"カードを引っ張り出して、これを京ぽんとやらに機種変更することを検討中。こっちは、単体でもPCとつないでもどっちも定額なんだね。
_ iTunesで聴いているアルバムをMMに登録する (15:03)
ふと思いついたんで、「Hacking the Hack #92: iTunes COM API で今聞いている曲を Blog エントリに掲載: blog.bulknews.net」を応用して、iTunesで今聴いているアルバムをMMに登録するJavaScriptを作ってみた。
// Get Trackname from iTunes using COM
var iTunes = WScript.CreateObject("iTunes.Application");
var track = iTunes.CurrentTrack;
// Create text
var strNowPlaying = track.Artist + " " + track.Album;
// Open blogmap media search
var objIE = WScript.CreateObject("InternetExplorer.Application");
objIE.Visible = true;
objIE.Navigate("http://1470.net/bm/searchmedia?mode=music-jp");
// Do Search
while (objIE.busy);
while (objIE.document.readyState != "complete");
objIE.document.forms[0].q.value = strNowPlaying;
objIE.document.forms[0].submit();
while (objIE.busy);
while (objIE.document.readyState != "complete");
// naviate to MM/Memo form
var detailUrl = objIE.document.links[5].href;
if (detailUrl.substring(0, 28) == "http://1470.net/bm/asininfo/") {
var mmUrl = "http://1470.net/mm/memo_form.html?asin=" + detailUrl.substring(28) + ";memo_kind=PL";
objIE.Navigate(mmUrl);
}
WScript.Quit();
これをitunes2mm.jsなんてファイル名で保存しておく(日本語を使うなら文字コードはEUC推奨)。iTunesで音楽を聴いているときに、このファイルを(IEで)開くと、blogmapのメディア検索を使ってCDを検索し、うまくCD情報見つかった場合はその商品をMMに登録するフォームを開く。まあお遊びネタだけど、ちょっと面白いよね。
_ 今見ているスレをp2で見るbookmarklet (15:29)
って絶対すでにどこかにあるだろうなー。
javascript:document.location.href= 'http://url/to/read.php?nama_url='+ escape(document.location);
「http://url/to/read.php」の部分は実際に使用するp2のread.phpのURLに書き換える。あと、改行も本当はなし。
2005-02-18 [長年日記]
_ submitに認証コードを含ませるコメントSPAM対策 (16:18)
さっきMMの方で思いついたけど、書ききれなかったコメントSPAM対策。
submitボタン自体に認証処理を付加してみる方法。単にhiddenで認証コードを渡してもいいけど、ボタン自体に認証コードを含ませておくと、「どのボタンを押すか」という人間が頭を使って選択する余地ができるんで、応用範囲が広がりそう。
時間制限も付けているけど、これはあまり意味がないかな?(フォーム自体をGETされたら、時間切れ前にPOSTされちゃうだろうし) でもまあ時間切れだった場合は再投稿フォームを新しいsubmitボタン付きで生成して、「フォームの有効期限切れです。もう一度投稿を行ってください」とかするだけだから、ユーザーの手間はそれほどかけないでしょう。
define('SEED', 'SOME_SEED_VALUE'); //適当な文字列
define('TERM_OF_VARIDITY', 60 * 10); //10分間有効
header('content-type: text/html; charset=euc-jp');
main();
function main() {
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
if (check_submit()) {
echo 'SUCCESS';
} else {
echo 'NOT VALID';
}
}
echo '<form method="POST" action="'.$_SERVER['PHP_SELF'].'">';
show_submit_button();
echo '<input type="submit" name="submit_'.time().'_'.md5(time()+1).'" value="こっちはだめ">';
echo '</form>';
}
function show_submit_button() {
$now = time();
$check = md5($now . SEED);
echo '<input type="submit" name="submit_'.$now.'_'.$check.'" value="投稿する">';
}
function check_submit() {
foreach (array_keys($_POST) as $key) {
if (preg_match('|^submit_([0-9]+)_([0-9a-f]+)$|', $key, $matches)) {
$time = $matches[1];
$check = $matches[2];
if ($time < time() - TERM_OF_VARIDITY) {continue;}
if (md5($time . SEED) == $check) {return TRUE;}
}
}
return FALSE;
}
一応実働サンプルも置いておこう。
全部のsubmitを投稿されちゃうといやだし
if (md5($time . SEED) != $check) {return FALSE;}
もした方がいいのかな。でもそうなると、チェックする順番も意味が出てきちゃうな。ってまあ思いつきネタだから厳密に考えなくてもいいか。
2005-02-19 [長年日記]
_ AirH" Phoneからの位置情報メモ (00:37)
AirH" Phone(動作確認済みなのは、AH-K3001Vのみ)からの位置情報メモの投稿機能を用意しました。
AirH" Phoneから1470.net 位置情報APIにアクセスすると、AirH" Phone用というリンクがあるので、それをクリックしてください。位置情報を取得してよいか聞かれ、はいを選ぶと位置情報を取得します。
取得結果ページには、MMへのメモ登録リンク、Yahoo! Mapの該当位置へのリンクが表示されるので、MMへのメモ登録を選択してください。TypeKey認証が行われたあと、登録フォームへと遷移します。
なおAH-K3001Vにおいては、位置情報精度対決! AH-K3001V v.s. AH-J3002V!によれば、AirH" Phone用をブックマークしておき、パケット通信が切断された状態から直接上記ブックマークを開くことで、精度の高い位置情報が取得できるそうです。ただし、試してみた限りでは200メートル程度の誤差は出るようですが。
ちなみにMM自体はまだ携帯端末対応を全然やっていないので、Operaが使えるAirH" Phoneといえどもあまり使い勝手は良くありません。そのうち徐々に携帯電話での使い勝手も向上させていきます。
_ 風邪をひいたくさい (02:10)
今日の夜は天気予報通り雪が降っていて、昼間の好天と比べてちょっとびっくりしたわけだけど、雪で濡れたせいか家に着いたら猛烈に頭が痛くなってきた。風邪かな。それとも会社でもついに罹患者が出たインフルエンザの方か。
_ URL検索を追加 (14:26)
MMに登録されているURLを検索する機能を追加しました。
- URL検索 - http://1470.net/mm/searchurl
この日記に関するURLを検索したい場合は、
なんて感じで使います。現在表示しているページをこの機能を使って検索するbookmarkletは、
javascript:document.location.href= 'http://1470.net/mm/searchurl?url='+ escape(document.location.href);
なんて感じです。
_ URLを利用した関連情報表示に対応しました (15:39)
従来は、あるメモに関する情報を表示する際には、
という形でメモの内部IDを使った指定方法しかできませんでしたが、新しく、
という形での関連情報表示に対応しました。上記のような指定をした場合、そのURLについて最初に登録されたメモに関連する情報が表示されます。もしもそのURLに関するメモが存在しない場合は、そのURLに関するメモを登録するフォームが開きます。
この機能を使って、現在表示しているページのMMにおける関連情報を呼び出すbookmarkletは、
javascript:document.location.href= 'http://1470.net/mm/related?url='+ escape(document.location.href);
なんて感じになります。
_ JavaScriptで選択した文章を投稿フォームに渡す (16:53)
このあたりで実験されている例のアレですが、JavaScriptで非ASCIIなテキストをescapeとかencodeURIComponentすると、Unicodeとしてエンコードされて%uxxxxとか&#nnnn;とかになるっぽいですね。
で、PHPのurldecodeは文字コードは環境依存の%xx形式しかデコードできない(けど、どちらかというと現状ではこちらの方が標準的な処理だよね)んで、JavaScriptでエンコードされた文字列をデコードするには、それ専用のロジックを追加しなければならないようです。
が、基本的にmemo_form.htmlに渡される引数は、一般的なCGI同士の連携で使えるようにするのが主なので、あまり非標準的な動きはさせたくありません。現状私はこの件に関する知識が足りていないため、JavaScriptから渡されたパラメータのデコードに中途半端に対応すると、なんとなくろくなことにならない気がします。
ということで、ひとまずは上記のような形式でJavaScriptでエンコードされた文字列のデコードには対応しないことにします。ただ、各パラメータで文字コードの自動認識に対応したので、ひとまず
なんてbookmarkletを使うと、運が良ければ選択した部分がメモ本文として渡されます。けど、選択部分の内容によってはうまく渡されなかったり(文字欠け)、あるいはうまく文字コードが認識できなかったり(文字化け)することがありますので、まあちょっと便利な場合もあるよね、程度にしか使えませんが。
jounoさんのところで紹介されていたところをながめてみたところ
一番手軽でそれなりの結果が得られる方法としては、encodeURI関数を使ってエンコードする方法っぽいので、それに変えてみた。
2005-02-20 [長年日記]
_ 地道にコード整理&高速化中 (01:27)
そろそろコアとなる機能は出そろったので、いろいろ整理中。動かしているコードを直接リファクタリングするという大技実施中に付き、ときどきエラーメッセージが出たりする方もいたかもしれませんが、そろそろ整理も終わったのでまたしばらく安定運用に戻ります。多分。きっと。
_ 位置情報検索を追加 (15:30)
MMに位置情報専用の検索機能を追加しました。
- 位置情報検索 - http://1470.net/mm/searchmap
そのうちXML HTTP Requestのテストを兼ねて、もうちょい使いやすいインターフェースにしようっと。
_ XML HTTP Requestを使ってみた (19:37)
位置情報検索のインターフェースで最近流行っているらしいXML HTTP Requestを使ってみた。
位置情報検索のフォームで都道府県と市町村の組み合わせを入力させるんだけど、都道府県と、それに対する市町村情報をあらかじめロードしておくのはうざい。だから、都道府県を選択した段階で、それに対応する市町村一覧を持ってきて、市町村用のドロップダウンリストにセットする。
XML HTTP Requestオブジェクトを作成するところは、「Using the XML HTTP Request object」のサンプルをほぼそのまま利用。あとは、都道府県ドロップダウンリストのonchangeで、change_prefecture()関数を呼ぶ。change_prefecture()関数の中では、XML HTTP Requestを使って現在選択されている都道府県に対応する市町村データをカンマ区切り文字列でもらってきて、市町村用ドロップダウンリストをその内容にあわせてアップデート。
ひとまず手元のIE、Firefoxでは動いたけど、Opera(7.5)では動かなかった。Opera 7.6 preview 1以降では動くらしいからまあいいや。どうせこの機能を使う人は(現状では)あまりいないだろうし、面倒だから、非対応バージョンへの救済措置は用意しない。
_ デザインいじりと集計期間短縮化 (20:03)
blogmapのデザインをいろいろいじっています。あと、blogmapのランキング集計期間を短くしました。URLランキングを48時間→24時間、メディアランキングを一週間→3日間にしてます。その分ランキングの動きは激しくなりますが、SPAM的な情報の影響も受けやすくなると思いますので、リンクを踏む前にはいろいろ注意してください。
2005-02-21 [長年日記]
_ HTMLから自動抽出したジャンル機能を追加 (13:07)
URLに関するメモを登録するとき、メモ登録フォームの各種ジャンルが並んでいる部分の下に「HTMLから自動抽出したジャンル」という項目があります。その横にある[ここをクリックすると自動抽出を行います]という部分をクリックすると、対象のHTMLドキュメントから特徴語を抽出し、ジャンル候補として表示します。表示されたジャンルをクリックすると(JavaScriptが有効な環境ならば)ジャンル欄に追加されます。
単に出現回数と出現位置から適当に特徴語らしきモノを抽出しているだけなので、対象のHTMLドキュメントの構成などによっては、あまりぱっとしないものしか出てこないかもしれませんが、運がいいと半自動でジャンルを登録できるでしょう。
といった感じで、XML HTTP Requestを覚えたんでいろいろ使ってみたりしているのでした。
_ 表示が遅れています (12:56)
1470.net上のサービスのバックエンドのDBで、更新系のDBから表示系のDBへのレプリケーションプロセスが21日朝の時点でこけていたため、ほとんどのページで表示される情報が古い時点で止まっていました。先ほどレプリケーションを復活させたんで、そのうちレプリケーションが追いつけば、最新の情報が表示されるようになります。
ちなみに、MMなどで登録されたデータ自体はきちんと登録されていますので、ご安心を。でも、念のためときどきメモデータのバックアップ等はローカルに保存しておいた方がいいかもしれません。バックアップデータは、設定画面からダウンロードできます。
_ HTMLからのキーワード抽出機能をデフォルトでONにしました (13:06)
HTMLからキーワードを抽出する機能を、自動的に実行するようにしました。単にload時に実行ボタンをjavascriptでclickしているだけですけど。
自動的に抽出したキーワードをジャンルとして指定する機能とかつけると、はてなブックマークっぽくなるかな。でも自動抽出したキーワードの妥当性を判別するロジックって、はてなダイアリーキーワードみたいなチェックに使えるデータがないと、自前で作り込みになっちゃいそうだからちょっとつらいな。
_ 頭痛が消えない (15:46)
先週末あたりから始まった頭痛が消えない。これはやっぱり風邪ではなく花粉症かなー。ってことで、今日から花粉症の薬を飲み始まることにした。これで治まるようならやっぱり始まったってことなんだろうな。でも、まだ頭痛以外の症状は出ていないんだけど。
_ 自分のサイトをタグ付けする (20:07)
ソーシャルブックマークサービス系のサービスは使い勝手がいい(ように作ってある)。タグ機能を搭載したソーシャルブックマークサービスを利用することで、Webサイト上のさまざまな情報に、手軽にタグという形でのメタ情報を付与できる。
ということは、自サイトのコンテンツにメタ情報を付与するための外付けのツールとして、ソーシャルブックマークサービスを利用できるのではないだろうか。
自分のサイトのコンテンツに自分自身でタギングしていくことにより、ソーシャルブックマークの枠組みにおいて自サイトのコンテンツを再評価し、一つの統一的な基準によるメタ情報検索インターフェースを作成することができる。またそのインターフェースは、他のユーザーの手による同一フォーマットの(全Webレベルでの)コンテンツへとつながっていく。
ただ、そうやって過去の自サイトのコンテンツにタグ付けしていくと、新着ブックマークによる鮮度の高い情報が見つけやすいという利点がスポイルされてしまうかもしれない。まあ自サイトのコンテンツについても、タグ付けする意味があると自分で考えるものに対してのみタグ付けしていけば、それはそれで意味があるかな。
_ 死んだふりに3000ガバス (21:33)
_ テスト (21:56)
MindMapを貼り付けられるようにしておくと、何か楽しいことができるかなー。JavaAppletのブラウザーなんだけど、どのくらいの環境で見られるんだろう? 動作環境的に良さそうなら、そのうちtDiaryのプラグインにしよう。
あ、ちなみに上のデータは特に意味はないです。表示用に適当にでっち上げただけで考察はしていない。
2005-02-22 [長年日記]
_ はてなブックマークっぽい機能を取り込む方法 (15:16)
HTMLから抽出したキーワードを使って全文検索をかけるインターフェースを用意すると、さらにはてなブックマークっぽいことができるかな。さらにキーワードをカテゴライズするデータベースを用意して、タグと自動抽出語からそのメモの所属カテゴリーを自動判別したりもできそうだな。でもカテゴライズ用データベースを作るのはだるい作業になりそうだからやらないと思うけど。
_ 今日も頭が痛いなー (15:19)
_ XML HTTP Requestが標準化したら (16:45)
必須ではない要素は全部XML HTTP Request経由の遅延読み込みに追い出してしまって、ひとまず最低限の要素だけ表示し、後付で付加的な要素を遅延もしくはオンデマンド読み込みするようなインターフェースが一般化しそうだな。
いまのうちに、そういうインターフェースデザインについて考えておいた方がいいかもしれませんよ>Webデザイナーの方々。
そうなるとWebアプリケーションにおける遷移が、ページ単位の遷移(PostBack含む)と、XML HTTP Request経由の遷移(というか追加読み込み)がミックスされた感じになるんだろうな。なんかその辺をうまく管理するライブラリとかが欲しくなってきそうだな。
_ リファラによるコミュニケーションの復権 (21:01)
ソーシャルブックマークみたいなサービスが流行ると、trackbackとかコメントとかが使われていたシーンを、ソーシャルブックマーク系サービスへの登録で代替する例が増えていきそう。
その結果として、再び(Web日記文化的な)リファラをベースにしたコミュニケーションツール(要はtDiaryみたいに積極的にリファラを公開したりとか)が流行りそうな悪寒。
_ っつーか、真面目に悪寒がする (21:01)
これは花粉症じゃなくて風邪みたいだな。インフルエンザである可能性も50%はありそうだ。明日午前中に病院に行こう。
2005-02-23 [長年日記]
_ HTMLからのキーワード自動抽出の精度を上げた (00:02)
- URLにページ内アンカーが含まれている場合は、そのアンカー部以降を評価するようにした
- ChaSenで形態素解析したあと、名詞・未知語・記号要素の連続は複合語としてまとめて扱うようにした
ってだけなんだけど、前よりもだいぶいい感じで抽出できるようになった気がする。
_ 自動抽出キーワードによる検索機能を追加 (09:52)
属性による検索で、ジャンル検索を行う際に、自動抽出したキーワードも検索対象に含めることができるようにしました。ただし、自動抽出したキーワードによるインデックスが付与されているのは、この機能に対応した時点以降に登録されたメモのみとなっています(既存のメモも更新することで自動抽出キーワードインデックスが付与されます)。
ってのはどういうことかというと、まったくジャンルを指定せずに登録したメモに対しても、そのドキュメントにたとえば「ブログ」などというキーワードが含まれている場合は、属性による検索機能を使って検索できるようになるわけです。
というのは結局のところ、はてなブックマークがやっている自動キーワード付与の仕組みをまねしてみたわけですね。はてなブックマークとは違って、こちらのキーワードは純粋にロジックで抽出している(キーワードデータベースを持たない)分、ゴミキーワードがいろいろ混ざりそうですけど。
ひとまず機能としては実装しましたけど、インターフェース的には腐っているんで、利用状況を見ながらおいおいもうちょっと使い勝手のいいインターフェースを用意していきます。
2005-02-24 [長年日記]
_ 痛みのお裾分け (00:37)
さっき右足の小指の爪を座椅子の布地に引っかけましてね。最近そういや爪を切ってないなーとは思ってたんですけど、やけにがっつりと引っかかりまして。しかも引っかかったままに、結構勢いよく足を振り抜きまして。いや、痛みは大したことなかったんですけどね。ただ小指を見てみたら、なんだか爪が真ん中から縦に割けているわけですよ。しかも根本まできっちりいっちゃてるわけですよ。なんかあんまり見たくない画づらだったんで、できるだけ目の焦点を合わせないようにしながら、爪切りで外側半分の爪を切ってみたわけですけどね。その跡になんか赤い色が見えたんで、その辺は深く追求しないようにして、ひとまず放置しているわけですが。いやまあ痛みは大したことないんですけどね。なんかちょっと精神的だめえじってやつですか。まあそういうことですよ、掛布さん。
_ 形態素解析した結果の並びで怪しいところだけN-gramを使う (15:50)
思いつきネタ。形態素解析した結果の要素の並びとして、いかにもミスヒット(分割)らしいパターンの周辺だけN-gramも併用すると、検索精度が上がったりしないだろうか。
ちょろっと試してみた限りでは、名詞(非人名)+名詞(人名)の並びはいかにも辞書に載っていない名詞のミス分割って感じになりそうだった。あとひらがなの連続単語とかの場合も、なにか特徴的なパターンがありそう。
形態素解析ロジックではうまく分割できないパターンを見つけ出すいい方法があれば、そこだけN-gramを併用することで、インデックスのサイズを抑えながら精度を高めることができそうな気がする。
_ ソーシャルブックマークを使ったSPAMデータベース (17:09)
この辺から始まった思いつき。
SPAMコメント/trackbackに書かれていたURL、投稿元のIPアドレスをソーシャルブックマークサービスを使って蓄積し、RSS配信などを使って他のツールから利用すると便利かもしれない。
たとえばdel.icio.usにSPAMコメントに書かれていたURL、IPアドレス(title欄を使っている)を登録してみた例。タグ名としてSPAM_BLACKLIST_URLというユニーク性の高いものを利用することで判別しやすくしている。
ただしこういう使い方をすると他のユーザーに迷惑がかかる可能性が高い。あと、スパマーが妨害のためにゴミURLを大量に投稿してくるかもしれない。というあたり問題もあるんだけど、ソーシャルブックマーク的なアプローチで手軽にSPAM URLデータベースを構築するという案自体は、何か使えそうな気がする。
_ キャッシュを表示する時に危険なスクリプトを排除する (19:26)
キャッシングした他サイトのコンテンツを自サイトの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とかってどうしているんだろう? まあ自ドメインでスクリプトを実行されても大して危険がないサイトなら、対策を取る必要もないんだろうけど。
2005-02-25 [長年日記]
_ 大雪ですよ! (00:08)
渋谷を出たときには雨だったのに、埼玉に着いたらなんか大雪なんですが。車の上とかにすでに10センチ以上つもっているんですが。この調子だと明日の朝子供を保育園に送るのに車を使えないかもしれない。キッツイなー。
_ なんかRubyがやたらとCPUを食っているんで (14:14)
いったんリファラーの表示を中止。高速化されたという新しいdisp_refererを入れてみようか。でもうちの場合、あんまりリファラーって使われていない気もするから、非表示のままでもいいかな。
_ なんで楽曲データとか歌詞とかのデータを入れないのか (15:30)
コピーコントロールCDとかSACDとかDVD-AUDIOとか、レコード会社さんはなんかいろんなことをやっているけど、そんなのに金をかける余力はあるのに、いまだにCDの楽曲情報はCDDBとかから取らなきゃいけないの? CDの楽曲情報(CDタイトル、曲タイトル、作成者、歌詞、ジャケット画像……)をとっととCDに入れてくれよ。
_ 静的コンテンツとして生成しつつも、Ajaxを使って動的コンテンツを埋め込む (16:51)
Ajax関連の思いつき。movable typeみたいに基本的にコンテンツは静的に生成する。が、コメントやtrackbackみたいな動的コンテンツ部分が混ざっていると、通常はリビルドしないとコンテンツは表に反映されない(んだよね。MTの作りって見てないけど)。
そこでAjaxを使い、コメントやtrackbackなどの動的要素部分について、非同期でサーバーに問い合わせ、もしも更新があったらその部分だけをダイナミックに書き換える。そうすることで、完全リビルドしなくてもAjaxが有効なブラウザ環境ならば最新データが見える。もしもAjaxが無効な環境だとしても、少なくとも最後にビルドされた状態は見える。
といった感じで、静的生成しつつも、Ajax環境なら動的生成の恩恵も受けられる、という中間形態でパブリッシュできるようにしておくといいかもしれない。
まあblogツールの例の場合は、リビルドした方が効率がよさそうな感じだけど、CMS系一般として考えるとほとんど静的コンテンツ生成+Ajaxによる一部動的コンテンツ、という仕組みがうまくはまる例がありそうだ。blogツールでも切込隊長blogみたいなコメントチャット状態のところだと結構いけるかも。
_ ってなんか (16:53)
Ajaxをつかった「くっつき〜」系みたいな感じだな。違いは、js無効でも前回リビルド時のデータが表示されている、と言う点くらいか。
_ javascriptでテンプレート的なことをやる方法は? (18:48)
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>
2005-02-27 [長年日記]
_ タグベースのブラウザ (00:58)
mixiのshinoさんの日記を元にしたネタ。ソーシャルブックマークサービスのタグをたどって閲覧していく行為に特化したブラウザを、Ajaxを使って作るといいのでは。
まず元になる(MMの場合は)メモを開く。すると、そのメモの周辺にはそのメモにつけられたタグが描かれている。タグをクリックすると、そのタグで検索された最新n件のメモが表示され、さらにそれぞれのメモの周辺にはそれにつけられたタグが描かれている……。
って感じのもので、タグによる検索をAjaxを使って先読みしておいて、クリックされた段階で実際に表示する。もしもMindMap的な表現をするとしたら、以下のような感じ(JavaApplet。動作環境がよくわからないんで、見れない人ごめんなさい)。wemaあたりをベースに非同期で読み込んだ付箋を追加していくインターフェースを持たせたら何とかなるかもしれない。
あるいは単純にツリー表示にしてもいい。
- 『[ネット]『「パソコン通信」とは何だったのか』反応』
- [SNS]
- 『Socialtunes』
- 『はてな SNSもどき』
- 『[TypeKey][SNS] TypeKey SNS (18:22)』
- [blog]
- 『コメントとツッコミとレスとトラックバックのあるブログはどうか』
- 『ラブラブドキュンパックリコ - Blogのコメント欄が賛同か批判の両極端になりやすい理由とは?』
- 『ウェブログの心理学』
- 『アマゾンアソシエイトにNOと言え。』
- [パソコン通信]
- 『ITmedia ライフスタイル:「パソコン通信」とは何だったのか (1/3)』
- 『ニフティ: 「ワープロ・パソコン通信」サービスの終了について』
- [SNS]
ツリー表示と言えば、trackbackの追跡なんかもAjaxを使って非同期読み込みにしてもいいな。というか、現在blogmapに組み込んでいるtrackback追跡機能はそのうちAjaxを使って、解析状況に応じてツリーの枝を表示していくように改造しよう。
現在はリミットに達するまでサーバーサイドでたどってから表示しているんで、とっても重い機能になっちゃってる。Ajaxを使えば、1階層だけたどって結果を返すサーバーサイドスクリプトとそれを非同期で読んで結果を表示(追記)するJavaScriptの連携になるんで、とてもシンプルかつ高速に表現できる。しかもユーザーのアクションに応じて展開していけば、不要な枝をいちいちたどらなくてすむ。
_ DBをHDD×2+別サーバー×1に分散 (23:48)
今まで一台のサーバー上のHDD2台に分散させていたDBデータを、さらにもう1台のサーバー上にもレプリケーションするように変更。ついでに、検索系の処理でリアルタイム性が必要そう&そんなに重くないQUERYが多いものに関しては、新しいレプリケーションサーバーに回すようにしてみた。ただ、新しくDBを動かしたサーバーのスペックがしょぼいんで、もしかしたら逆効果になるかもしれない。ダメそうだったら設定を元に戻しつつ、新しいいまどきのスペックのサーバーにリプレースすることを真剣に考えてみよう。
2005-02-28 [長年日記]
_ 本格化してきましたねー (09:23)
昨日から標準で鼻水オプションが付くようになり、今日はもうくしゃみオプションが頻発するようになったので、防具屋で立体マスクを装着してきましたよ。このくらいになってくると、薬を飲むタイミングをきちんと測らないと、朝起きたら目が開かなくなっていたりしそうだ。
_ 逆をつかれた (15:23)
下の子供がおなかを下し気味なんで、下手したら保育園から呼び出しを食らうかなーと思っていたら、上の子が熱を出したと呼び出しを食らった。なんだか思いっきりフェイントに引っかかって脇を抜かれたような気分。
_ そしてハットトリックを決められた (18:10)
上の子もインフルエンザ確定。熱が下がってから、さらに2日は休まなければならないんで、今週いっぱい保育園休みは確定だな。せめて今週中に治癒証明をもらえれば、来週頭から行かせられるんだけど。


飯に行くついでに計画的に勢い余って
_ smbd [recent_rssの改造版、公開マダー?(AA略 … スミマセン]
_ smbd [ありがとうございます〜]