投稿者: miztaka, カテゴリ: html, tips
こんな些細なことにはまったのでメモです。
次のようにtitleタグが「。」で終わるHTMLだとIE7で表示されません。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<title>タイトル。</title>
<meta http-equiv="Content-type" content="text/html; charset=UTF-8" />
</head>
<body>
<h1>Hello World</h1>
</body>
</html>
XML宣言が無いとだめなのか!?と疑ってみたが関係なし。
解決方法はなんとも簡単。
Content-typeの設定をtitleタグより上に書くようにしたら問題なく表示されるようになった。
これまでtitleタグはheadの先頭に書くようにしていたけれどもContent-typeのmetaタグを先に書くように習慣付けておいたほうが無難そうだ。
[tips] titleタグが「。」で終わるとIE7でコンテンツが表示されない罠 はコメントを受け付けていません
WebアプリケーションやWebサイトを構築するときにヘッダーやサイドバー領域などにメニューやタブを(アコーディオンや短冊型など)配置するデザインが一般的かと思います。
このようなデザインでは現在表示されているページのメニューには class=”active” などと指定してフォーカスを当てるようになっていることが多いですね。
全てのページをべたで静的HTMLとして作る場合はいいですがメニューやサイドバーを共通部品としてSSIやサーバーサイドのテンプレートエンジンでインクルードしている場合はどうやってメニューにフォーカスを当てようか思案のしどころです。
このような場面で使えそうなアイディアを紹介します。
jqueryを使ってonload時にメニューにフォーカスを当てる(classを追加する)ようにします。
まず、メニューのフォーカスを当てたい要素には menu_ではじまるidをつけます。
つぎに、各ページのbodyのクラス属性に activeにしたいメニューのid名を列挙します。(メニューが多段構造になっている場合を考慮。)
このようにすることで全ページを共通処理できます。
jQuery(function($){
// メニューアクティブ
var classes = $('body').attr('class');
if (classes) {
var class_ar = classes.split(' ');
for (i=0; i<class_ar.length; i++) {
if (class_ar[i].match(/^menu_/)) {
var obj = $("#"+class_ar[i]);
obj.addClass("active");
}
}
}
});
メニューやタブをjavascriptでactiveにするちょっとしたアイディア はコメントを受け付けていません
[tips] 新しく作成したSVNリポジトリにファイルが追加できなくなった場合は はコメントを受け付けていません
- 空メールを受信したい
- ケータイからメールで画像アップロードを受け付けたい
など、複数のアドレスを1つの宛先(パイプ経由でプログラムに渡す)にまとめたい時にpostfixでは正規表現でのalias_mapが使えます。
しかし、この正規表現の指定方法が曲者でした。
エイリアスで正規表現を使うには main.cf に以下のように設定をして、
alias_maps = hash:/etc/aliases,regexp:/etc/postfix/aliases.reg
/etc/postfix/aliases.reg に正規表現と宛先のペアを書いていくだけです。
さてここで問題の正規表現の書き方ですが、例えば [email protected] (xxxxは数字4桁) というアドレスを hogeに転送したい場合、
/^hoge[1-9]{4}$/ hoge
でも
/^hoge[1-9]{4}@example.com$/ hoge
でも期待通りになりません。
正解は
/^hoge[1-9]{4}(@example.com)?$/ hoge
です。
つまり「ドメイン付でもドメインなしでもヒットするように正規表現を書かなければいけない」のです。
なぜかというとpostfixの仕様が以下のようになっているためです。
- local_recipient_mapsでのユーザの存在確認の際、正規表現テーブルではドメイン付きで検索している
- それに対してlocalがalias_mapsとして検索する時にはローカルパートのみで検索している
なんだか悲しい仕様ですね。。
postfix の alias を正規表現で指定したいときの注意点 はコメントを受け付けていません
「楽観的排他制御」という言葉を初めて目にしたのはJavaフレームワークSeasar2のS2Daoにおいてでした。
それまでの開発ではSELECT FOR UPDATEを多用していた気がしますが、以来ほぼすべてのプロジェクトで「楽観的排他制御」のパターンを用いることにしました。統一的でシンプルな仕様だからです。
以下のようなしくみを言います。
- 全てのテーブルには version列(int)またはtimestamp列(timestamp)を用意する。(version列のほうがよいと思います。)
- レコードの更新をするときに version列もwhere句に含め、set句にはversion列をインクリメントする。(timestampの場合はtimestampをセット。)
- update件数が0件だったら例外を投げる。
- 上記動作をDBアクセスライブラリ(ORマッパー)が透過的に取り仕切る。(開発者は意識しない。)
Teeple2 でこれを実現する方法を解説します。
Teeple2のDBアクセスライブラリ Teeple_ActiveRecordでは、insertおよびupdateの実行前に teeple_activerecord_before_insert, teeple_activerecord_before_update という関数の存在を調べ、存在した場合はこれらを実行した後に insert(update)を実行するようになっています。
このhook関数にはエンティティオブジェクト自身が引数として渡ってくるので、ここでversion列をインクリメントしたり条件を追加することによって楽観的排他制御が実現できるわけです。
例えば以下のようなコードをuser.inc.phpに追加します。
function teeple_activerecord_before_update($obj) {
if (property_exists(get_class($obj), 'version') === TRUE) {
// 楽観的排他制御
$obj->setConstraint('version', $obj->version);
$obj->version += 1;
}
return;
}
Teeple2で楽観的排他制御を実現するには はコメントを受け付けていません