月別アーカイブ: 2011年10月

リンクチェッカー「mojo-checkbot」がv0.21になった

 

リンクチェッカー「mojo-checkbot」の最近の改良点。

  • sleepオプションがリクエストの開始の間隔だったのを、終了と開始の間隔とした。
  • evacuate / noevacuateオプションが追加された
  • コマンドがシンプルになった
  • レポートのステータスコード毎に非表示可能にした
  • スタイルシート内のurl(…)もクロールするようになった。
  • スキーム無指定のURIに対応

リンク切れ検索エンジン「mojo-checkbot」がv0.16になった

 

リンク切れ検索エンジン「mojo-checkbot」の最近の改良点。

  • timeoutオプションが動作していなかったのを直した。
  • resumeオプションを追加し、前回の結果を引き継ぐことができるようになった(EXPRERIMENTAL)。
  • metaタグによるリダイレクト先もクロールするようになった。
  • サーバー設定によるリダイレクトの際、今までは最終のURIのみをレポートしていたが、リダイレクト先とその参照元を別項目で報告するようにした(つまり302とかレポート上に現れるようになった)。
  • Firefoxで巨大なjsonを取得するとパースエラーになるため、一度にFetchするデータは100件までとした。
  • コマンドのヘルプを英語/日本語に対応した
  • クローラー自体のエラーもブラウザで見れるようになった
  • 200台のレポートを隠すチェックボックス
  • mapタグもクロール対象
  • メモリ使用量が減りそうな対策をたくさんしたけど、検証はしていない。

サイト内のリンク切れを一括検出する「mojo-checkbot」がβ版になった

mojo-checkbotがある程度できてきたのでベータ版にしてみたよ。githubでゲットできます。最新のバージョン番号のタグがついたものを使ってください。

mojo-checkbotはクローラーにウェブサイト内のステータスコードを収集させつつ、ブラウザでレポートを見れるコマンドラインツールです。checkbotの機能限定版という感じですが、日本語が正常に表示されたり、ファイルを介さないのでシンプルだったり、レポートの見せ方を工夫したりと、色々改善しています。

mojo-checkbotはMojoliciousをベースにしています。Mojolicious本体は同梱されてるのでインストール不要ですが、Mojoliciousのバージョン2からperl5.10.1依存になったので、以前のバージョンで動くかは不明です(5.10.0では動いてる風)。要改善点はまだ多数あるので逐一更新して行きます。見た目がダサいので誰かデザインしてくれませんか。

    mojo checkbot [--start start URL] [--match match string] [--sleep seconds]
        [--ua useragent header] [--cookie cookie string] [--timeout seconds]
        [--evacuate second] [--noevacuate] [--resume]

DESCRIPTION

ウェブサイトのリンクチェッカーです。コマンドラインで開始URLを指定してデーモンを起動し、ブラウザでhttp://127.0.0.1:3000 を開くとチェック状況が逐一報告されます。リンクの収集とステータスコードの収集は再帰的に延々続きますので、matchオプションでURLフィルタをかけておくと、そのうち止まるかもしれません。

OPTIONS

下記のオプションが利用可能です:

クローラーオプション

--start            クロールをスタートするURLを指定します。
--match         チェック対象のURLを正規表現で指定します。
--sleep        クロールの間隔を指定します。
--ua            クローラーのHTTPヘッダに設定するユーザーエージェントを指定します。
--cookie        クローラーがサーバーに送信するクッキーを指定します。
--timeout      クローラーのタイムアウトする秒数を指定します。デフォルトは15です。
--evacuate     [EXPERIMENTAL]レポートをテンポラリーファイルに出力する間隔を指定します。
--noevacuate            [EXPERIMENTAL]resume用のファイル出力を無効化します。
--resume                [EXPERIMENTAL]前回の結果を復元し、再開します。

レポートサーバーオプション

--backlog       Set listen backlog size, defaults to SOMAXCONN.
--clients       Set maximum number of concurrent clients, defaults to 1000.
--group         Set group name for process.
--keepalive     Set keep-alive timeout, defaults to 15.
--listen        Set one or more locations you want to listen on,
                defaults to "http://*:3000".
--proxy         Activate reverse proxy support, defaults to the
                value of MOJO_REVERSE_PROXY.
--requests      Set maximum number of requests per keep-alive
                connection, defaults to 25.
--user          Set username for process.
--websocket     Set WebSocket timeout, defaults to 300.

EXAMPLE1

$ mojo checkbot --start http://example.com --match http://example.com/ --sleep 2
[Mon Oct 17 23:18:35 2011] [info] Server listening (http://*:3000)
Server available at http://127.0.0.1:3000.

EXAMPLE2

本プログラムはMojolicious::Liteをベースにしていますので、そちらのオプションも有効なはずです。

$ mojo checkbot --listen http://*:3001 --start http://example.com

EXAMPLE3

クッキーを指定して要認証サイトのチェックもできます。

$ mojo checkbot --start http://example.com --cookie 
    'key=value; Version=1; Domain=example.com; Path=/; expires=Fri, 
    28 Oct 2011 15:26:47 GMT'

https://github.com/jamadam/mojo-checkbot

Copyright (c) 2011 jamadam

Dual licensed under the MIT and GPL licenses:

mojo-checkbotを作ってみてる!

 

Mojolicious::Liteでウェブサイトのリンクチェックをするmojo-checkbotを作ってみてます。動作は恐ろしくノーチェックです。

$ mojo-checkbot.pl daemon --start http://example.com --match http://example.com/
[Mon Oct 17 23:18:35 2011] [info] Server listening (http://*:3000)
Server available at http://127.0.0.1:3000.

startオプションにURLを指定してdaemonを起動するとクロールが始まり、http://127.0.0.1:3000にブラウザでアクセスすると、チェックしたURLとそのステータスコードが表示されます。

matchオプションでURLを限定することができるので、とりあえずチェック対象を自サイト内にとどめることはできますが、今のところ低機能です。

SYNOPSIS

mojo-checkbot.pl daemon [--start start URL] [--match match string] [--sleep seconds]

jquery.customEventTrigger

 

domの変化などをイベントとして定義できるjQueryプラグイン「jquery.customEventTrigger」っていうのを作りました。setIntervalで状態変化を監視して、変化したら任意のイベントをトリガーするというものです。もっと他にやり方があるかもと思いつつも。

jQueryプラグインでは、利便性のためにコールバック関数をフックできる仕組みにしたりしますが、フックポイントが不足していることがよくあります。かといって、単機能のためにわざわざフックポイントを増やしたくない。そんな時に、本プラグインで独自のキッカケでトリガーするカスタムイベントを定義すればbindやliveやoneで処理できるという訳です。例えば、opacityが1になると発生するイベントを作ってfadeInのコールバック代わりに使ったり、あるクラス名を取得すると発生するイベントを作ったり。

なお、jquery.customEventTriggerはカプセル化のためにsub方式を採用してるので、$.customEventTrigger(selector).method()という使い方になります。

下記のようにshowイベントを定義しておくと、cssのdisplayがnoneから別の値に変わった瞬間にトリガーします。addGettingTrueEventメソッドは条件がfalseからtrueに遷移するのを捉えるのです。

$.customEventTrigger('div.foo').addGettingTrueEvent('show', function(obj) {
    return (obj.css('display') != 'none');
});

下記のように使います。

$('div.foo').bind('show', function() {});

下記のようにresizeXイベントを定義しておくと、Widthが変化した瞬間にトリガーします。addChangeEventメソッドは値の変化を捉えます。

$.customEventTrigger("div.foo").addChangeEvent('resizeX', function(obj){
    return obj.get(0).clientWidth;
});

下記のように使います。

$('div.foo').bind('resizeX', function() {});

もう少し複雑な例。addメソッドは汎用のジェネレータで、上記の2つのメソッドのバックエンドでもあります。第2引数の関数の戻り値を前回の値と比較して変化を捉えますが、比較の仕方を第3引数で指定できます。trueだったらトリガーします。

$.customEventTrigger("div.foo").add('resize',
    function(obj){
        return [obj.get(0).clientWidth, obj.get(0).clientHeight];
    },
    function(a, b){
        if (a !== undefined) {
            return a[0] !== b[0] || a[1] !== b[1];
        }
    }
);

下記のように使います。

$('div.foo').bind('resize', function() {});

addGettingTrueEvent(String eventName, Function newValue[, Int interval])

eventName 任意のイベント名
newValue 値を検出するロジックを関数で指定します。関数は引数としてjQueryオブジェクトを受け取ります。この戻り値がfalseからtrueに変わるとeventNameイベントがトリガーされます。
interval 内部でsetIntervalに渡される実行間隔をmsで指定します。デフォルトは1です。

 

addChangeEvent(String eventName, Function newValue[, Int interval])

eventName 任意のイベント名
newValue 値を検出するロジックを関数で指定します。関数は引数としてjQueryオブジェクトを受け取ります。この戻り値が前回から変化するとeventNameイベントがトリガーされます。
interval 内部でsetIntervalに渡される実行間隔をmsで指定します。デフォルトは1です。

   
add(String eventName, Function newValue, Function compare[, Int interval])

eventName 任意のイベント名
newValue 値を検出するロジックを関数で指定します。関数は引数としてjQueryオブジェクト受け取ります。この戻り値はcompareメソッドの引数として渡されます。
compare 前回の値と今回の値を比較するロジックを指定します。関数は引数として前回の値と今回の値を受け取ります。この戻り値がtrueのときeventNameイベントがトリガーされます。
interval 内部でsetIntervalに渡される実行間隔をmsで指定します。デフォルトは1です。