2008-04-03 (木)
■ INSERT か UPDATE かを自動的に判別して行う ON DUPLICATE KEY UPDATE
データベースを更新する際に、該当するレコードが存在することが保証されていない場合は、 最初に SELECT して、その結果によって INSERT か UPDATE に場合分けするしかないのだろうか? 検索してみたところ、こんなのが見つかった。
- MySQLについて質問 テーブルA フィールド1 フィールド2 レコードを追加or更新する場合なのですが、フィールド1に同じ値のレコードが存在する場合は、そのレコードのフィ.. - 人力検索はてな
- MySQL :: MySQL 4.1 リファレンスマニュアル :: 6.4.3 INSERT 構文
MySQL 4.1 以上の方言で良ければ、ON DUPLICATE KEY UPDATE というのが使えるとのこと。 そういえばそんなのがあった気がする。
使ってみようかと思ったが、実際にコードを書いてみると、 INSERT の SQL と UPDATE の SQL をそのままくっつけたような SQL を直書きしなければならず、どうも見通しが悪くなる。 それに、こんなところで MySQL 限定にしてしまうのも嫌なので、 素直に O/R マッパーの機能を使って、INSERT か UPDATE に場合分けするようにした。
SQL 1回で処理する方が速いんだろうけれど、そんな頻繁に行う処理の部分でもないし。
2008-04-06 (日)
■ SIE 0.13 がリリース
SIE は Internet Explorer で SVG を表示可能にする JavaScript ライブラリです。 ブックマークレットとして利用することもできます。 前回のバージョン からの変更点は以下の通りです。
- path 要素の ArcTo に複数の相対座標を対応させた
- style="stroke-width: 10;" のような形式の指定に対応
- stroke-opacity の指定が効かなかったのを修正
- opacity の端数切り上げの処理を除去
- font-size 属性に対応させた
- transform 属性のバグを修正
- polygon、 polyline 要素の points 属性のパースを改良
- 属性の付いていないg要素に対応した
変更箇所の内、半分くらいは私がパッチを提出したものですが、 処理としては実装されているのにその処理を通っていなかったという、 なんというか、もったいなかったケースがほとんどです。
でも、これでようやく、有名な(?)lion.svg が表示できるようになりました。 テストページにもサンプルを追加しておきましたので、ぜひ IE で見てみて下さい。
■ mod_rewrite を使って DirectoryIndex と同等の設定をする
上のサンプルページは XREA の s45 サーバに置いてあるのですが、 なんだか最近、ttp://.../SVG/index.html のようにアクセスするとOKなのに、 ttp://.../SVG/ のようにアクセスすると 404 のエラーになってしまっていたようなので、対策をしました。
最初、.htaccess ファイルに、
DirectoryIndex index.html
の設定を追加したのですが、効果がないようなので、結局こういう設定を追加しました。
RewriteEngine On
RewriteBase /SVG
RewriteCond %{REQUEST_URI} =/
RewriteRule .* index.html [QSA,L]
サーバ側の DirectoryIndex 関連の設定がおかしいんじゃないか、という気もするのですが、 それほど重要なページでもないので、これでごまかすことにします。
2008-04-08 (火)
■ Zend Framework 用チュートリアルのまとめ
Zend Framework in Action の記事 より。 現在公開されている Zend Framework のチュートリアルの一覧が、以下のページでまとめられています。
以下の範囲をカバーしているようです。
- Getting Started
- Zend_Acl
- Zend_Auth
- Zend_Controller
- Zend_Db
- Zend_Feed
- Zend_Form
- Zend_Layout / Zend_View
- Zend_Log
- Zend_Mail
- Zend_Search_Lucene
- Zend_Validate
- Web Services
- Unit Testing
紹介されているもののうち、3分の1くらいには目を通したことがありますが、 オススメは一番最初に挙がっている
ですかね。 Zend Framework 0.2 の頃から少しずつ更新されている、歴史のあるチュートリアルです。
2008-04-12 (土)
■ SVG のサンプルページの調子がまたおかしい
この前、mod_rewrite を使って DirectoryIndex と同等の設定をしたが、 さっき見てみたら、また URL の末尾に index.html をつけないとアクセスできない状態になっていた。 いったい何が悪いのかと .htaccess ファイルとにらめっこしていたら、またいつの間にか直っていた。 なんなんだ。
広告がいけないんだろうか? それとも XREA の他のサーバに移せば直ったりするんだろうか? XREA 以外にもサーバスペースは持っているので、そこに移してもいいんですが、 とりあえず、サンプルページへのリンクは index.html 付きに直しておくことにします。
2008-04-13 (日)
■ GeSHi 1.0.7.21 用の修正パッチ
GeSHi のバージョンを 1.0.7.21 に上げたら PukiWiki 用プラグインの動作がおかしい、 という報告を受けたので調べてみました。 GeSHi のコードと変更履歴を眺めてみると、修正漏れと思われる箇所がありました。 パッチを貼っておきます。
--- geshi/php.php.orig 2008-03-17 00:55:34.000000000 +0900
+++ geshi/php.php 2008-04-13 11:10:24.000000000 +0900
@@ -301,8 +301,8 @@
0 => 'color: #66cc66;'
),
'REGEXPS' => array(
- 0 => 'color: #0000ff;',
- 1 => 'color: #ff0000'
+ 0 => 'color: #ff0000;',
+ 1 => 'color: #0000ff;'
),
'SCRIPT' => array(
0 => '',
この修正を取り入れつつ、GeSHi 1.0.7.21 以降用のスタイルシートも作り直しました。 以下のページに置いておきますので、必要な人は持っていって下さい。
2008-04-14 (月)
■ GeSHi の set_symbols_highlighting() の設定
GeSHi 1.0.7.21 では、記号の部分のハイライト処理が GeSHi 1.0.7.20 以前とは変わっているようです。 昨日作った PukiWiki 用のスタイルシート では、その変更に対応するのを忘れていたので、 また新しく作り直しました。 必要な人は、以下のページからダウンロードして下さい。
ところで、デフォルトでは、記号もハイライトされる設定になっているようですが、 それだとかえって見づらい気がします。 PukiWiki の geshi.inc.php プラグインの場合でしたら、設定ファイルの default.php に、
$geshi->set_symbols_highlighting(false);
を追加すれば、記号の部分がハイライトされるのを抑制できます。
2008-04-15 (火)
■ ある文字列を含まないものにマッチする正規表現
どう書けばいいのか分からなかったので、検索してみた。
ある文字列を含まないものにマッチする正規表現
(?:(?!foo).)*
?: の部分は、キャプチャしないことを高速化のために指定しているだけなので、 本質的な部分だけ取り出すと以下のようになる。
((?!foo).)*
なるほど。 「foo を前に持たない文字」だけで構成されている、という正規表現なわけか。
ついでに、もう少し具体的な例を。 今回やりたかったのは、 (大文字小文字は区別せず)foo や bar を含む文字列は除外したい、というもの。 そのための正規表現は、次のようになる。
'/^(?:(?!(?:foo|bar)).)*$/i'
ただし、PHP の場合は、
に書かれている通り、パターン修飾子の D もつけた方が良いケースが多いと思うので、 そのことは忘れないように。
2008-04-19 (土)
■ Zend Framework 用コンポーネント Revulo_View_Phtmlc 0.4 を公開
Revulo_View_Phtmlc は、 Zend Framework のビュースクリプトの記述を楽にするコンポーネントです。
- $this->foo でなく $foo と書くことで変数の値を参照できます
- <?= ... ?> で囲まれた範囲は、自動的に HTML エスケープされます
- 複数のビュースクリプトを1つにまとめて高速化する機能もあります
前バージョン からの変更点は以下の通りです。
- compileFragments() メソッドを追加し、ビュースクリプトを1つにまとめる機能はデフォルトでは無効に
バージョン 0.3 で高速化のための機能を組み込んだのですが、 これだと、include されるビュースクリプトを書き換えた場合に、 自分でキャッシュを削除しないと表示が変わらないという問題があったので、 デフォルトではこの機能をオフにすることにしました。
でも、アプリケーションが安定稼働し始めて、ビュースクリプトを滅多に書き換えなくなった時には、 この機能を上手に使えばかなり高速化されます。
2008-04-21 (月)
■ useradd コマンドには -m オプションをつけよう
useradd コマンドに -m オプションを付けると、 ユーザアカウント作成時にホームディレクトリも作ってくれる。 今までそう覚えていたのに、さっき CentOS で作業していたら、 -m オプション無しでもホームディレクトリが作られた。 あれ? なんで?
調べてみると、/etc/login.defs にこう書かれていた。
# # If useradd should create home directories for users by default # On RH systems, we do. This option is overridden with the -m flag on # useradd command line. # CREATE_HOME yes
なるほど。RedHat 系では -m オプションは付けなくても良い、と。
でも確か Debian は違ったはず、と思ったので、実際に試してみたところ、 やはり Debian では -m オプションを付けないとホームディレクトリは作られなかった。
ということで、 useradd コマンドには -m オプションを付けて使う、と覚えておいた方がいいと思います。
■ pam_wheel.so を使う場合は、SU_WHEEL_ONLY の設定は不要
wheel グループのユーザしか su コマンドを使えないようにするために、 両方設定しろ、と書いているページが結構あるが、 Debian の /etc/login.defs を見ると、
################# OBSOLETED BY PAM ############## # # # These options are now handled by PAM. Please # # edit the appropriate file in /etc/pam.d/ to # # enable the equivelants of them. # ############### ...... #SU_WHEEL_ONLY ......
と書かれている。 つまり、SU_WHEEL_ONLY を設定するのは古いやり方ということ。
/etc/pam.d/su に、
# (RedHat 系) auth required pam_wheel.so use_uid # (Debian 系) auth required pam_wheel.so
のように書くだけで十分なはず。
2008-04-26 (土)
■ @import を使うと遅くなる
Yahoo! の Exceptional Performance のページを読んでいたら、えっ! と思うことが書かれていた。
One of the previous best practices states that CSS should be at the top in order to allow for progressive rendering.
In IE @import behaves the same as using <link> at the bottom of the page, so it's best not to use it.
げげげ、マジですか!?
実は以前、@import って速度的にどうなんだろう? と思って調べたことがある。 HTTP Header のやりとりを調べて、どういう場合にキャッシュが効くのかチェックしたりしたのだけれど、 その時は、<link> を使っても @import を使っても違いはない、と結論づけた。
でも、そうか。どのタイミングで CSS が読み込まれるのか、というのは見てなかった。 じゃあ、@import ってなるべく使わない方がいいんだな。
