SSI に mod_gzip

SSI を使ってるページを mod_gzip で圧縮しようとしてちとハマり。

mod_gzip_on Yes 
mod_gzip_item_include mime ^text/.*
mod_gzip_item_include file ".html$"
mod_gzip_item_include handler "server-parsed"
とやってみても圧縮されない。mod_gzip_dechunk が必要でした。
mod_gzip_dechunk Yes
Apacheクックブック―Webサーバ管理者のためのレシピ集

TT で TT のタグを出力

タイトルだけだとなんの事やら分かりませんが。。
やりたい事としては、以下のようなテンプレートをバッチで処理して[% foo %]だけを処理したテンプレートを生成、そのテンプレートを Web アプリから読んでリクエスト毎に [% bar %] だけを処理したいって事です。
つまり、バッチ処理後に [% bar %] って文字列が残ってれば OK です。
<html>
<head>
<title></title>
</head>
<body>
[% foo %]
[% bar %]
</body>
</html>
[% bar %] をエスケープ出来ないかなと思って、以下のように書いてみたけど、 \ がそのまま出力されてしまって駄目。。
\[\% bar \%\]
なんとなく勘で以下のように書いてみたらパースエラー
[% '[% bar %]' %]
結局、以下のように書いたら思った通りの事が出来ました。
[% '[' _ '% bar %' _ ']' %]
もっとうまいやり方あったりするのかな。。

Perl Template Toolkit

Sledge::Dispatcher

Sledge::Dispatcher をリリースしました。
社内で使ってた Sledge 用の mod_perl ハンドラです。

以下のような感じで使います。
# 詳細はソース読んでください。。
  <Location /webapp>
  SetHandler perl-script
  PerlHandler Sledge::Dispatcher::Properties
  PerlSetVar SledgeMapFile /path/to/map.properties
  </Location>
上記の /path/to/map.properties は以下のような URI, クラスの対応を 記述したファイルになります。
/ = YourProject::Pages::Root
/foo = YourProject::Pages::Foo
上記設定で URI と呼び出されるメソッドの対応は以下のようになります。
/webapp/ -> YourProject::Pages::Root::dispatch('index')
/webapp/hoge -> YourProject::Pages::Root::dispatch('hoge');
/webapp/foo/bar -> YourProject::Pages::Foo::dispatch('bar');
いちいち CGI ファイルを作る必要が無くなってラクチンだと思います。
ダウンロードは sourceforge.jp から出来ます。
http://sourceforge.jp/projects/sledge/

Apache拡張ガイド〈上〉サーバサイドプログラミング

prototype.js をちゃんと使ってみる。

prototype.js をちゃんと(仕事で)使ってみようという事でゴニョゴニョしたメモ。

やりたい事は通常のテキストを編集可能にして Ajax で保存っていうありがち(?)な事。
で、使い方の勉強がてら書いたコードをのせておくと以下のような感じ

var Editable = Class.create();

Editable.prototype = {
    initialize: function(text, url) {
        this.view = $(text);
        this.url = url;
        Element.show(this.view);
        this.editor = document.createElement('input');
        this.editor.type = "text";
        Element.hide(this.editor);
        this.view.parentNode.appendChild(this.editor);
        Event.observe(this.view, 'dblclick', this.showEditor.bindAsEventListener(this), false);
        Event.observe(this.editor, 'blur', this.editDone.bindAsEventListener(this), false);
    },

    showEditor: function() {
        Position.clone(this.view, this.editor);
        this.editor.value = this.view.innerHTML;
        Element.toggle(this.view, this.editor);
        Field.focus(this.editor);
    },

    editDone: function() {
        Element.toggle(this.view, this.editor);
        var parameters = encodeURIComponent(this.view.id) + "=" + encodeURIComponent(this.editor.value);
        new Ajax.Request(this.url, {
            method: 'post',
            asynchronous: true,
            parameters: parameters,
            onLoading: function() {
                this.view.innerHTML = "saving...";
            }.bind(this),
            onSuccess: function() {
                this.view.innerHTML = this.editor.value;
            }.bind(this)
        });
    }
};
これを、editable.js として保存して、以下のように呼び出すとダブルクリックで編集可能、編集が終わったら別のとこをクリックで保存ってな挙動になります。

<html>
<head>
<meta http-equiv="Content-Script-Type" content="text/javascript" />
<script type="text/javascript" src="prototype.js"></script>
<script type="text/javascript" src="editable.js"></script>
<title></title>
</head>
<body>
<div id="editText" style="border: 1px solid #000000; width: 300px;">Hello World!</div>
<script type="text/javascript">
new Editable('editText', '/path/to/save.app');
</script>
</body>
</html>

/path/to/save.app がリクエストを受けとるアプリケーションになります。
アプリ側には <id>=<値> って感じで値が渡ってきます。
prototype.js 使うとコードがスッキリして精神衛生上よろしいですな。。

さんま

2ae042be.jpg
Profile

いけべ

  • ライブドアブログ