July 05, 2008

Sabel JS - DatePicker(Sabel.Widget.Calendar)

Sabel 1.1で追加されるSabel.Widget.Calendarのサンプル。

カレンダーで日付を選択し、その選択された日付をインプットに適用するDatePicker.jsを書いてみた。
DatePicker.js

function datepicker(inputs) {
  Sabel.Array.each(inputs, function(input) {
    var div = document.createElement("div");
    div.style.position = "absolute";
    div.style.zIndex = 100;
    document.body.appendChild(div);
    
    var self = {
      element: Sabel.get(input),
      calendar: new Sabel.Widget.Calendar(div, {
        callback: function(date) {
          self.element.value = date.join("-");
        }
      }),
      render: function() {
        self.calendar.render();
      }
    };
    
    div.style.top  = Sabel.Element.getCumulativeTop(self.element)  + "px";
    div.style.left = Sabel.Element.getCumulativeLeft(self.element) + "px";
    
    self.calendar.WeekDays = ["日", "月", "火", "水", "木", "金", "土"];
    self.element.observe("mousedown", self.render);
  });
}
インプットのidをdatepicker()関数に渡すだけで使用できる(簡単に使えるようにしているため、任意のタイミングでカレンダーを消すなどの処理はできない)。インプットをクリックすると、そのインプットの位置にカレンダーが表示され、日付をクリックするとインプットに年-月-日が入る。
<script type="text/javascript" src="Sabel.js"></script>
<script type="text/javascript" src="DatePicker.js"></script>

<script type="text/javascript">
  new Sabel.Event(window, "load", function() {
    datepicker(["inputid1", "inputid2", ...]);
  });
</script>
動作の様子はこちら
* 実際にサンプルのように表示するにはSabelに含まれるcssや画像が必要


July 04, 2008

Internet Explorerではこのページは表示できません

JavaScriptを使用していて「Internet Explorerではこのページは表示できません」と出ることがある。IEがDOMの構築を終える前にDOM操作などを行おうとする場合にこうなったりならなかったり。

とりあえず、window.onloadイベントのリスナーで処理すれば安全な様子。
new Sabel.Event(window, "load", function(){
  // process
});


July 03, 2008

grep | sed

以下のような実行ログから失敗したid(\[\d+\]の部分)を抽出する。
20080701 15:20:01 SUCCESS: username [10502]
20080701 18:14:41 FAILURE: username [3821]
20080702 08:39:22 SUCCESS: username [9134]
20080702 14:43:52 FAILURE: username [6810]
20080702 21:11:05 SUCCESS: username [8819]
20080703 08:31:34 SUCCESS: username [13266]
...
grepで失敗の行を取り出してsedに渡す。
結果をfailures.phpに出力。
grep FAILURE some.log | sed -e 's/^.*\[\([0-9]*\)\]/\1 => 1,/' > failures.php
こんな感じになる。
3821 => 1,
6810 => 1,
...
ちょっと付け足してphpの配列にする。
使用する側のプログラムではissetでチェックしたいのでこの形式に。
in_array()だと遅い。
<?php

$failures = array(
3821 => 1,
6810 => 1,
...
);

...

if (!isset($failures[$targetId])) {
  // process
}
キャプチャに使う括弧をバックスラッシュでエスケープする必要がある。
これに少しはまった。

July 02, 2008

Sabel 1.1 Release Announcement

Sabel-1.1のリリースが7/7(月)に決定しました。
概要は以下の通りです。
  • (Core)Sabel::using()でクラスファイルを読み込めたかどうかに応じてbool値を返すように変更
  • (Function)get_temp_dir()関数追加
  • (Function)md5hash()関数追加
  • (Function)remove_nullbyte()関数追加
  • (DI)DIコンテナ追加
  • (Aspect)Aspect追加(AOPアライアンス準準拠)
  • (Mail)メール(送信/Mimeデコード)追加
  • (Http)HTTPクライアント追加
  • (Annotation)バックスラッシュによるクオートのエスケープに対応
  • (Response)設計の改善・ステータスオブジェクト追加
  • (Request-Validator)一つの入力に対し複数のバリデーションメソッドを登録できるように改善
  • (Controller-Redirector)外部サイトにリダイレクトする際などに使用するurl()メソッドが正常に動作しない問題の修正
  • (View-Pager)実装の改善(3割程度の高速化)
  • (View-PageViewer)実装のスリム化(setPriorityPrevious(), setPriorityNext(), setIgnoreEmpty()メソッド削除)
  • (Session-Memcache)createメソッドでポート番号を指定できるように改善, addServer()メソッド追加
  • (Storage-Memcache)addServer()メソッド追加
  • (Cache-Memcache)addServer()メソッド追加
  • (Util-FileSystem)Sabel_Util_FileSystemによりディレクトリやファイルを作成する際のデフォルトのパーミッションを744から755に変更
  • (DB)バイナリデータ(画像・ファイル)の保存・取得に対応
  • (DB)行のバージョニング(楽観的ロック)に対応
  • (DB)sabel.db.mssql(Microsoft SQL Server)パッケージの追加
  • (DB)Sabel_DB_Modelの各メソッドに対するコールバックの対応が変更
  • (DB)Joinオブジェクト使用時のカラムの指定を可能に改善
  • (DB-Model)selectWithChildrenメソッドを削除
  • (DB-Model)save()メソッドによりモデルの状態をデータベースに反映する際、プライマリキーの値が変更されている場合に例外を投げるように変更
  • (Test)Sabel_Test_Fixtureクラス追加
  • (Processor-Action)リクエストバリデーションがURIクエリに対応
  • (Processor-Session)session.use_trans_sidがOnかつクライアントがCOOKIEを無効にしている時にセッションIDが2重に付加される問題の修正, セッションが開始されていない際にリンクやリダイレクト先URIにセッション名が付加される問題の修正
  • (JS)Sabel.Environment追加
  • (JS)Sabel.Class追加
  • (JS)Sabel.KeyEvent追加
  • (JS)Sabel.Number追加
  • (JS)Ajaxアップローダ追加(apc必須)
  • (JS)Dateピッカー(カレンダー)追加
  • (JS)ElementにgetRegion(), replaceClass()メソッド追加
  • (JS)Sabel.Util.UriをSabel.Uriに変更
  • (JS)Element.getDimentionsメソッドのバグ修正
  • (JS)Effectのバグ修正
  • (JS)要素の絶対位置取得メソッドのバグ修正
  • (JS)現在のスクロール量取得メソッド追加
  • (JS)Stringクラスの大幅な改善(sprintf, htmlspecialchars, chr, repeat追加など)
  • (JS)Ajaxのオプションにtimeout, scope追加
  • (JS)Eventにscope追加
  • (JS)widget.Overlayの改善(Widget.Overlayにリネーム)
  • (Task)各種ジェネレータ追加
  • (Task)バッチ実行ファイル(sabel.php)で正常なアプリケーションルートパスが定義されない問題の修正
  • (Addon-Form)Formオブジェクトが保持するHTMLを書き出すオブジェクトの初期化に不具合があったのを修正, モデルにバージョンカラムがある場合にclose()メソッドで</form>タグとともにバージョン値をhiddenで書き出すように対応
  • (Addon-Renderer)ショートタグ形式の場合にHTMLエスケープするようにSabelレンダラを改善, SabelレンダラのHTMLタグを抜き出す正規表現を最小マッチに変更
  • (Lib-Paginate)setOrderColumn()メソッドをsetOrderColumns()に変更, setDefaultOrder()メソッド追加, uriの指定を省略可能に改善
  • rewriteモジュールがロードされていない場合にInternal Server Errorになる問題の修正
  • Scaffold(sabelコマンド)にlangオプション(ja)追加
  • $_SERVER["HTTP_HOST"]を参照している箇所を$_SERVER["SERVER_NAME"]を参照するように変更

    Powered by Sabel

June 30, 2008

Apache - Basic Authentication

簡単に済ませたいとき、たまに使うBasic認証。「たまに」なのでいつも忘れる。

パスワードファイル作成。
$ htpasswd -c /usr/local/www/data/myapp/config/.htpasswd username
New password: [enter password]
Re-type new password: [enter password]
Adding password for user username
http.confに設定を追加する。
<Directory "/usr/local/www/data/myapp/">
    AuthType Basic
    AuthName "Private Area"
    AuthUserFile /usr/local/www/data/myapp/config/.htpasswd
    Require valid-user
</Directory>