July 05, 2008
Sabel JS - DatePicker(Sabel.Widget.Calendar)
Sabel 1.1で追加されるSabel.Widget.Calendarのサンプル。
カレンダーで日付を選択し、その選択された日付をインプットに適用するDatePicker.jsを書いてみた。
* 実際にサンプルのように表示するにはSabelに含まれるcssや画像が必要
カレンダーで日付を選択し、その選択された日付をインプットに適用する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イベントのリスナーで処理すれば安全な様子。
とりあえず、window.onloadイベントのリスナーで処理すれば安全な様子。
new Sabel.Event(window, "load", function(){
// process
});
July 03, 2008
grep | sed
以下のような実行ログから失敗したid(\[\d+\]の部分)を抽出する。
結果をfailures.phpに出力。
使用する側のプログラムではissetでチェックしたいのでこの形式に。
in_array()だと遅い。
これに少しはまった。
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"]を参照するように変更

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 usernamehttp.confに設定を追加する。
<Directory "/usr/local/www/data/myapp/">
AuthType Basic
AuthName "Private Area"
AuthUserFile /usr/local/www/data/myapp/config/.htpasswd
Require valid-user
</Directory>