→マックにmacportでgit入れたコメントをどうぞ入れたのでメモ。macportsをダウンロードしてインストール。jamadamjquery.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に遷移するのを捉えるのです。'none');});下記のように使います。{});下記のようにresizeXイベントを定義しておくと、Widthが変化した瞬間にトリガーします。addChangeEventメソッドは値の変化を捉えます。obj.get(0).clientWidth;});下記のように使います。{});もう少し複雑な例。addメソッドは汎用のジェネレータで、上記の2つのメソッドのバックエンドでもあります。第2引数の関数の戻り値を前回の値と比較して変化を捉えますが、比較の仕方を第3引数で指定できます。trueだったらトリガーします。});下記のように使います。値を検出するロジックを関数で指定します。関数は引数としてjQueryオブジェクトを受け取ります。この戻り値がfalseからtrueに変わるとeventNameイベントがトリガーされます。内部でsetIntervalに渡される実行間隔をmsで指定します。値を検出するロジックを関数で指定します。関数は引数としてjQueryオブジェクトを受け取ります。この戻り値が前回から変化するとeventNameイベントがトリガーされます。内部でsetIntervalに渡される実行間隔をmsで指定します。値を検出するロジックを関数で指定します。関数は引数としてjQueryオブジェクト受け取ります。この戻り値はcompareメソッドの引数として渡されます。前回の値と今回の値を比較するロジックを指定します。関数は引数として前回の値と今回の値を受け取ります。この戻り値がtrueのときeventNameイベントがトリガーされます。内部でsetIntervalに渡される実行間隔をmsで指定します。jamadam作ったPlack::Middleware::StackTrace::ParseMessageを1件のフィードバックPlack::Middleware::StackTrace::ParseMessageってのを作ってみた。名前が微妙なので考え直すかも。テンプレートエンジンが投げる例外がテンプレートファイルを指していることがあります。Mojo::TemplateとかText::PSTemplateとか、たぶんMasonも。Text::PSTemplateなら下記のようなメッセージでdieします。...」な例外をパースしてDevel::StackTraceの先頭に追加してくれます。すると、Plackのデバッグスクリーンの先頭にテンプレート内のコンテキストが表示されるので、テンプレートのデバッグが楽になります。ちなみに最近よく使ってるMojoliciousにはこの機能があって、意外とキラーフィーチャーだったりしたので、これでいつでもフレームワーク移行できそう。jamadamMojoliciousのバンドルファイルを整理するプラグインコメントをどうぞMojoliciousのエラー画面で使われている画像やJSやCSS。リバースプロキシを拡張子などのホワイトリストで記述すると、これらのバンドルファイルがプロキシを通過せずに404エラーになってしまう。具体的にはこういうケース。[L,P,QSA]バンドルファイルはなぜかpublic直下にちりばめられているため、記述しづらい。それにファイル名が衝突してることに気付かずハマりそう。そこで、バンドルファイルがあたかも単一ディレクトリにまとまってるかのように装うプラグインMojolicious-Plugin-UnmessifyBundleです。'mojolicious-bundle'};これを使うと例えばバンドルされたjqueryは/mojolicious-bundle/js/jquery.jsでアクセスできます。エラーページのHTMLソースも適当に書き換えられます。すると、バンドルファイルをワンライナーでホワイトリスト入りさせることができるのです。[L,P,QSA]前回以上にニーズのなさそうなネタでした。jamadamMojoliciousアプリにPlack::Middlewareをプラグインするプラグイン1件のフィードバックレスポンスフィルター系のPlack::Middleware::*をMojoliciousのafter_dispachフックにねじ込むプラグインMojolicious-Plugin-PlackMiddlewareです。そんなニーズない?MojoX::Tusuで古いウェブサイトを移植するとき、/mobile/なんてディレクトリがあったら、「Plack-Middleware-ForceCharset」で強制的にShift_JISで出力するとかしたい。現状でもソースでauto_detectするオプションがあるからいいんだけど、明示的にしたい。enable_ifっぽい判定もできるようにしたので、きっとできると思う。jamadamMojoX::TusuアプリのセットアップコメントをどうぞMojoX::Tusuのセットアップ手順。上から順にMojolicious、Text-PSTemplate、MojoX-Tusuのインストールです。バージョン番号は最新で。https://github.com/jamadam/MojoX-Tusu/tarball/master/v0.21黒い画面が使えない人はそれぞれのディストリビューションをDLしてlibディレクトリだけでも動きます。上記の手順でインストールし終えると、下記のコマンドでアプリをジェネレートできるようになります。MyAppmy_appディレクトリが生成されたはずなので、下記のように組み込みサーバーで起動。http://127.0.0.1:3000.以上で、ブラウザからスケルトンにアクセスできます。スケルトンのディレクトリ構造は下記のとおり。jamadamCSSでいじれるディレクトリツリーの生成スクリプトコメントをどうぞブログ記事にディレクトリーツリーを掲載しようと思ったんだけど、treeコマンドの出力は味気ないので、CSSでいじりやすくHTML出力できるperlスクリプトをチョー適当に作った。本来の仕事が進まない。}crypt.plddsn_get.shmemo.txtffmpeg02.3gp02a.wav01a.3gp01a.wav02a.3gp2ch.mp3test.3g2brave01_2.avi.filepart01.3gpCSSもかなりテキトー。jamadamMojoliciousにウェブ制作をデプロイするコメントをどうぞ「ウェブアプリ開発」と「ウェブ制作」って別のジャンルなのかなあ。受託のコーポレートウェブ制作を生業にしていると流行りのウェブアプリケーションフレームワーク的なものにあまり馴染めない。別世界の出来事のようだ。これって何となくURLディスパッチに対する発想の違いな気がしたので、Mojoliciousのディスパッチャを豪快に差し替えて、ウェブ制作を「デプロイ」できるようにした。apache風のディスパッチャをMojoliciousに登録する「MojoX::Tusu」。リクエストパスはサーバーのディレクトリ階層を意味する。テンプレートもstaticファイルもpublic_htmlに突っ込む。server-parsedの対象は拡張子で決める。apacheのDirectoryIndexに相当する機能。apacheのErrorDocumentに相当する機能。otherのread権限のないファイルへのアクセスは403エラー。apacheを真似てディレクトリfooへのアクセスはfoo/にリダイレクトしてみた。hypnotoad上で今までどおり動作しました。.html」としたのと似た状態になり、htmlファイル内の好きなところに動的コンテンツを挿入できるという訳です。念のため先に書いておくと、Mojoliciousの標準のテンプレート命名規則(index.html.epとか)がMojoX::Tusuの差し替えたディスパッチャの方針と合致しないため、今のところepやeplは使えません。epRendererあたりをそっくり差し替えれば行けそうですが、とりあえず僕のお気に入りのテンプレートエンジン「Text::PSTemplate」でお楽しみください。MojoX::Tusuを用いたMojoliciousアプリは下記のようになります。routeは必要ありません。MojoX::Tusu->new($self);}URLディスパッチに関しては内部的に下記のようなことをやってます。リクエストパスがテンプレートの在り処を意味するという訳です。ちなみにname('')としているのはテンプレート名が空(/へのアクセス)のとき、自動生成されたroute名がテンプレート名になってしまうからなのです。rootが必要な場合意外はテンプレート内にurl_forと書く必要はありません。デザイナーさんが使うオーサリングソフトとの親和性も高いです。リンクパスの表記を巡っては、ここ1年くらいhtmlのbaseタグを活用して乗り切ってきたのですが、いろいろ面倒を抱え込むことにもなってやめたという経緯もあります。このデフォルトのrouteは初回のon_processフックで登録してるので、startup内でルートが登録されればそちらが優先されます。