nDiki : DiKicker

2007年3月8日 (木)

MSNBot が激しすぎるので deny

ここ数日の www.naney.org サーバ高負荷について様子を見ていたところ、DiKicker の処理がリクエストに追いつかなくなる時には MSNBot が激しくアクセスしてきているようである。

MSNBot のページには robots.txt の Crawl-delay を見ると書いてあるので、以前

 User-agent: msnbot
 Crawl-delay: 20

としておいたのだがどうもこれは効いていないらしい。

ちょっとこの連続リクエストはしんどいし、msn からのアクセスは現状全体の 2.5% 程度なのでしばらく弾くことにする。

スポンサード リンク
[ 3月8日全て ]

2007年3月9日 (金)

DiKicker の ArticleDB に変更時刻保存レコードを追加

DiKicker 処理速度短縮のための修正。

キーワード記事ファイルの更新チェックのために今のコードでは、 ArticleDB 内の各キーワード記事オブジェクトを deserialize してそこに保存されている時刻情報と比較する必要がある。 この deserialization を避けるために、時刻情報は直接単独レコードとして DB に保存しておくように改良。

[ 3月9日全て ]

2007年3月14日 (水)

[ DiKicker ] ロック獲得リトライをさらに減らす

相変わらずここ最近 www.naney.org の負荷が上がり気味。 今日は Referer spam の爆撃もきていた様子。

DiKicker の挙動やログを見ていて気がついたのだが、さばききれなくなるのはどうも記事更新チェックの時間が長いからのようだ。 排他ロック獲得ループの回数が今の設定でも長い。

どのみち負荷が高い場合は共有ロックの方が勝ち気味で、排他ロックできなくて終わることが多いはずなので、思いきってもっとリトライの回数を減らしておいた。

それとロック獲得ループの中で「結局ロックできなかった時」に余計に1回 sleep() していたのでこれを削除。

[ 3月14日全て ]

2007年4月3日 (火)

WiKickerJSON でのページ出力機能を追加

最近は DiKicker ばかりに手を入れていたが、久しぶりに WiKicker の改良も行っている。 しばらく前から実装を始めていた JSON 形式での出力機能が今日完成。

今までは WikiPage について

  • HTML 形式による出力
  • Wiki 文法で書かれている生テキスト形式による出力

という2つの出力形式を持っていたので、JSON が加わることで3つめとなる。

サーバ側で WikiPage の構文解析まではやる

クライアントサイドの JavaScript でページの内容に合わせて様々な処理をできるように、サーバ側で構文解析まではしてあげるというのが主な目的。

JavaScript でまたパーサを書いてメンテしていくのも大変なので、その部分はサーバでやってしまおうかと。 構文解析した結果の解析木を JSON 形式で返して、JavaScript 側であとはお好きにという形。

CPAN にある JSON モジュールを使用

サーバ側の Perl プログラムには、構文解析をして解析木を作れるようになっている。 この解析木から Visitor パターンで JSON 形式を生成していく。

依存モジュールを増やすことを避けるべく、最初は自前で JSON 形式に変換していこうと思ったのだがやっぱり面倒だった。 ということで CPAN にあるモジュールをチョイス。

JSON 関連では JSONJSON::Syck、JSON::PC などがあるが今回はインストールのしやすさを考えて pure Perl モジュールとして実装されている JSON を採用することにした。

Visitor クラスで解析木を無名ハッシュ/無名配列のツリーに変換して、JSON モジュールに流しこめば OK。

 use JSON;
 my $json = JSON->new(pretty => 1);
 my $js = $json->objToJson($tree);

WiKickerフレームワークにはフォーマット別に出力を切り換える機構があるので、これに JSON を追加して application/json で送るようにして完成。

ちなみに残念ながら JSON 1.07 は Perl 5.005_03 では make test が fail するので、NaneyOrgWiki では使えない。

[ 4月3日全て ]

2007年4月5日 (木)

サーバの負荷が高くなったら DiKicker が 503 を返して沈静化を待つようにした

www.naney.org を収容しているサーバの負荷が高い状態。

  1. Referer spam 弾きを強化。
  2. 1日半前ぐらいに1度リブートしたようで、Memcached が起動していなかったので起動。

という対処をしたけれどそれでもなかなか負荷が落ちつかない。

傾向としては SpeedyCGI のバックエンド側(speedy_backend)が MaxBackends まで起動して処理が追いつかないと、起動しているフロントエンド側 (speedy) がどんどん増えてしまうという状況のようだ。

DiKicker の高速化も順次着手しているのだけれど追いつきそうにもないので、loave average が高い時は頑張らずに無条件に 503 を返すように修正して対応(以前ハイパー日記システムの時にも同じことをした)。

本当は SpeedyCGI フロントエンドの数に応じて負荷の軽い処理に切り換える等工夫したいんだけれど、フロントエンドの数を取得する方法は簡単にはなさそうなんだよなあ。

[ 4月5日全て ]

2007年5月30日 (水)

WiKicker 0.420 リリース - 変更いろいろ

去年の12月3日以来、約半年ぶりのリリース。 リリースしそびれて、随分変更を累積してしまった。 以下主な変更点。

バージョン番号形式を変更

前回の 0.41 に対して、今回は 0.420 とした。 浮動小数点数的には、増分 0.01 で今まで通り。

今後 version.pm が普及した時のことと、developer release を出す時のことを考えて小数点以下3桁ずつのスタイルに移行することにした (関連記事)。

<meta name="robots" content="noindex,nofollow">

2007年1月に実装。 編集ページや履歴ページが検索エンジンに登録されないようにするための機能。

<a rel="nofollow">

2007年1月に実装。 リンク spam 対応。

AutomaticLink 長を可変にした

2007年3月に実装。 特に DiKicker で1文字キーワードによる自動リンクを有効にするために追加した。

'/' の前を省略した自動リンクを有効にするか無効にするかを設定できるように

前述の機能で1文字での自動リンクを有効にしたら、不便な面が出た。

WiKicker / DiKicker では '/' を階層の区切り文字としても扱うことができるようになっていて、サフィックス部分だけでも自動リンクするようになっている。 自動リンクを1文字にしたら「OS/2」というキーワードに対して '2' でも自動リンクが働き、望まないリンクが張られるようになってしまった。 DiKicker では階層的キーワードは無くてもあまり困らないので、'/' の前を省略した自動リンクを無効にできるようにした。

JSON 形式データ出力

2007年4月に実装

(DiKicker) はてなブックマーク数表示機能を追加

2007年1月に実装

(DiKicker) はてなブックマークエントリーページへのボタン表示機能を追加

2007年1月に実装

(DiKicker) grep 検索機能を追加

2007年2月に実装。自分としては重宝している。

(DiKicker) キーワード記事の下部への文字列挿入機能

Google AdSense 挿入用。

(DiKicker) サーバの負荷が高くなったら 503 を返して沈静化を待つようにした

2007年4月に実装 load average をチェックして負荷が高い時は、503 を返すようにした。

内部コードの結構な書き換え

ソースコードを結構いじった。 deprecated なメソッドの削除も実施したので、0.41 以前から派生しているソフトウェアは多くの場合修正が必要。

[ 5月30日全て ]

2007年7月11日 (水)

nDiki に「はてなスター」をつけてみた

本日よりはじまった「はてなスター」をつけてみた。 nDiki (by DiKicker) はほぼ tDiary 互換の HTML 構造なので、はてなスターの JavaScript プログラムを読み込むようにするだけで、各記事の見出しに Add ボタンが表示されるようになった。素晴しい。

ページの HEAD 要素の中で JavaScript プログラムを読むように指定されているのだが、今の DiKicker ではちょっと手を入れる必要があるので、とりあえずフッタ部分に挿入。

[ 7月11日全て ]

2007年8月23日 (木)

無制限 HTML タグ付けブロックを使って nDikiGoogle Maps を貼る

Google Maps が ID を取得しないでも簡単に自分のサイトに貼れるようになった。 Google Maps で表示される HTML コードをページに埋め込めば、好きな場所の地図を貼ることができる。 これは嬉しい。

早速 nDiki でも貼りたい。

しかし WiKicker という WikiEngine をベースとした DiKicker を使っている nDiki では、現在のところ直接 HTML コードを使えるようにしていないのである。

HTML タグ付けを許すのは嫌」というスタンスできたのだが、他のサービスを貼るという魅力にはやはり勝てないな。 HTML 直書きを許すのは大局的にはデータ活用性などで好ましくない部分もあるが、各種サービスを活用できないで利用価値が下がるのは本末転倒なので、わかった上で使うということで。

ということで nDikiHTML タグ付けブロック機能を有効に設定。

ちなみに現行では HTML::Scrubber ベースで、使えるタグ・属性に制限をつけるフィルタしか用意してなかった。これだと Google Maps のコードがそのまま貼れない。 ということで「DiKicker」および「書く人が限定されているような Wiki」での利用を想定した無制限にスルーするフィルタモジュールを新規追加。

これで Google Maps を貼れるようにした。

では早速。


拡大地図を表示
[ 8月23日全て ]

2007年11月5日 (月)

[ DiKicker ] 関連語から、着目キーワード記事内の語を除外

DiKicker が持っているキーワード毎の関連語表示機能(2005年6月4日)は、関連する語を発見したりたどったりするのに思ったより便利で、よく自分でも使っている。 特にキーワード記事に明示的に関連語リストをつける時に参考にしている。

ただ現在の実装だと(当然)キーワード記事に書いた関連語リストによって関連度がさらに上がるので、新しい語が発見できなくなってしまう。

ということでキーワード記事に出現する語は、関連語リストに含まれないようにした。 合わせて関連語表示数も 20 から 30 に調整しておいた。

これで

  1. あるキーワードの関連語を見る。
  2. 関連語表示を見て関連語を探し、重要ならキーワード記事で言及する。あるいは関連情報としてリンクする。
  3. 関連語表示には、その語が取り除かれて次点の語が表示されるようになる。

という流れで情報発見できるようになった。 ページ間のリンクも強化されるので SEO 的もちょっといいのかな。

[ 11月5日全て ]

2007年11月9日 (金)

Twitter ステータスを nDiki サイドバーに表示

公式の Flash 版 Twitter badge をこのページのサイドバーに表示していたが、以下の点でちょっと不満だった。

  • 「Flash, Just Me」: 自分のみのステータスを表示できるが、1度に1つのみ。キャッシュの関係で古い情報が表示されがち。
  • 「Flash, With Friends」: 自分のみのステータスを表示できない。
  • 「HTML/JavaScript」: JavaScript ファイル読み込みなので、Twitter 側が重いとページのその先のレンダリングが止まってしまう。

「自分の過去のステータスを一覧的にサイドバーに表示する」のがしたいことなのだが、ちょっとマッチしない。 ということで Twitter から RSS フィードを取ってきて、サイドバーに表示することにした。

使ったモジュールは URI::Fetch + XML::RSS + Date::Parse。 それとユーティリティとして WiKicker::HTML と WiKicker::URI。

  1. cron で定期的に Twitter から RSS フィードをとってきて、Perl スクリプトで HTML フラグメントに変換。
  2. DiKicker が読み込む(サイドバーを含む)フッタファイルに挿入。

と簡単に実装してみた。機能的には概ね満足。

今後は L:~ や URL自動リンク化、キーワードの自動リンク化を適宜したい。

[ 11月9日全て ]

About Me

Naney Naney

Naney (なにい)です。株式会社ミクシィで SNS 事業の部長をしています。

About nDiki

nDiki1999年1月に始めたコンピュータ日誌を前身とする NaneyWeb 日記(兼パーソナルナレッジベース)です。

#nNote タグがついている記事は他の記事に比べて、より断片的・未整理・不完全なちょっとしたノートです。まだ結論に至っていない考えなども含まれます。頻繁/大幅に更新したり削除したりすることがあります。

※本サイトの内容は個人的見解であり所属組織とは関係ありません。

Other Notes

ナレッジベースアプリケーション Obsidian で書いているノートの一部を notes.naney.org で 公開しています。

月別インデックス
Process Time: 0.087953s / load averages: 0.63, 0.85, 0.63
nDiki by WATANABE Yoshimasa (Naney)
Powered by DiKicker