Home

Shin x blog

PostgreSQL 外部キーロック

この記事の所要時間: 138

PHP4+PostgreSQL7.4での開発中にトランザクションが終了しない現象が発生しました。アプリケーションのログを見てみても[begin]は発行されているのに[rollback/commit]が発行されていませんでした。

結局これ自体はPHP側の問題でPostgreSQLは無関係だったのですが、問題の処理を調べている際に複数回処理を実行するとロック待ちのような状態になりました。この処理ではアプリケーションから明示的にロックを行っていなかったので不思議に思い、DBのログを見てみると以下のようなログを発見。

LOG:  statement: SELECT 1 FROM ONLY "public"."t_category_m" x WHERE "category_id" = $1 FOR UPDATE OF x

アプリケーションで発行しているSQLではないのでgoogleに聞いて以下のサイトを見つけました。

行ロックをかける理由は,t2が参照している行が削除されるようなことがあると困るからである。そうなると,t2がt1を参照しているという参照整合性制約が崩れてしまうから,それを防ぐためにロックをかけるのはやむをえない措置と言える。

【PostgreSQLウォッチ】第20回 PostgreSQL 8.1ベータ・テスト開始,新機能ロールと共有行ロック:ITpro (2006-10-03)

外部キーを含む行をINSERTすると参照テーブルの関連行をロックしてしまうとの事です。まあ考えてみると当たり前なのですが、特に意識していなかったので「?」になりました。

普段は問題無いんでしょうが、これ意識しておかないと処理待ちやデッドロックが発生したりとまずい事になりそうです。

 

ちなみに8.1からは記事にあるとおり共有ロックにてこの問題は回避されているそうです。

PHPで1から100を表示

  • 2006-09-29 (金)
  • PHP
この記事の所要時間: 129

PHPで1から100の数字を表示するコードをスマートに書くネタがGANCHIKU.comで紹介されていました。

他のPHPerな方だったら、どんな書き方するかなー。

会社で楽しかった瞬間。 at GANCHIKU.com (2006-09-29)

との事なので反応してみました。(ちなみに元ネタは人力検索はてな-PHPのコードを教えてください。…

まずぱっと思いついたコードがこちら

< ?php
echo "<table>";
for ($i = 0 ; $i < 10 ; $i++) {
  echo "<tr>";
  for ($j = 0 ; $j < 10 ; $j++) {
    printf("<td>%d< /td>", $i * 10 + $j + 1);
  }
  echo "< /tr>";
}
echo "< /table>";
?>

まあ何の変哲もないコードです。ただ誰が見ても分かりやすいと思います。

で、エントリのワンライナーがかっこ良かったのでインスパイアwして書いたのがこちら

$ php -r 'foreach (range(0,9) as $v1) { foreach (range(1,10) as $v2) { printf("%02d ", $v1*10+$v2); } echo "\n"; }'

あんま変わってないです。。。

しかしPHPにはいろいろな配列関数がありますね。range()とかarray_chunk()とかは今回のエントリを見るまで知りませんでした。(array_chunk()は同じようなのを以前に自作した覚えがあったり。)

CakePHP array-based Active Record

この記事の所要時間: 138

NYPHPにて行われたCakePHPプレゼンのレビュー記事です。

Last night at the monthly NYPHP meeting, Nate Abele presented an introduction to CakePHP, a web application framework.

Chris Shiflett: CakePHP Visits New York (2006-09-28)

CakePHPの特徴が簡潔に書かれていて興味深い内容なのですが、以下の一文にピクッときました。

Cake has an array-based Active Record implementation.

私が初めてCakePHPを触った時に感じた印象(違和感)がまさにこれでした。うーん、ぴったりの表現です。

Cakeを初めて触る方はこれを頭にいれておけばすんなり入れるかと思います。

 

エントリのコメントを見るとプレゼンを行ったnateからこの件についてコメントがありました。

(1) The reason we decided to go with an array-based approach to ActiveRecord had to do with PHP4, but it also has a lot to do with the fact that even in PHP5, the array support, (i.e. all the great things you can do with arrays really simply) still outweigh PHP’s ability to manipulate objects.

配列ならシンプルだし、オブジェクトより速いでしょ。という事ですね。まあこれはこれでアリですね。

PHP4.2系でPEAR::Mail_mimeDecodeを使う

  • 2006-09-27 (水)
  • PHP
この記事の所要時間: 145

PEAR::Mail_mimeDecodeは送信されたメールをパースするクラスなのですが、PHP4.2系環境だと以下のようなNoticeが出てしまいます。

PHP Notice:  Use of undefined constant __CLASS__ - assumed '__CLASS__' in /usr/local/lib/php/pear/Mail/mimeDecode.php on line 178

これはMail_mimeDecode#decode内で__CLASS__を使用しているために発生します。(__CLASS__は4.3.0からサポート

アドホックな方法ですがPHP4.2系環境では__CLASS__を以下のように書き換えればokです。

        // determine if this method has been called statically
        //$isStatic = !(isset($this) && get_class($this) == __CLASS__);
        $isStatic = !(isset($this) && get_class($this) == strtolower('Mail_mimeDecode'));

 

2006/10/05追加:
考えてみれば__CLASS__を定義しておけば良いですね。(そういえば前にis_a()で同じような事をしてました。。。)

< ?php
if (!defined('__CLASS__')) {
  // メソッド内に書くなら
  define('__CLASS__', get_class($this));
  // それ以外なら
  define('__CLASS__', strtolower('Mail_mimeDecode'));
}
?>

1チップMSX

この記事の所要時間: 118

1チップMSXが売りだされるそうです。

D4エンタープライズは27日、MSX2相当の環境を手のひらサイズで再現する「1chipMSX」の生産を決定、事前登録していた顧客宛に優先販売の案内を開始した。

21世紀に甦るMSX伝説 -1チップMSXの優先販売、27日午後3時から受付開始 (MYCOMジャーナル) (2006-09-27)

MSX懐かしいですね。

中学生の頃に初めて買ったPCがPanasonicのMSX2機でした。(MSXハードウェアデータベースを見るとおそらくFS-A1F)当初はゲームマシンと化していたのですが、雑誌のサンプルプログラムを入力したのをきっかけにどんどんプログラムの世界にはまっていきました。頭で考えている事をプログラムで実現できるという事は快感でしたね。

Basic+Z80アセンブラで作ったゲームを雑誌に投稿したりもしました。(掲載された号はまだ実家にあったりします。。。)Z80アセンブラを使ってのプログラミングは直接ハードウェアを叩く感覚があり、とても楽しいものでした。今は上位レイヤで開発をしていますけど、あの頃の経験はプログラミングの基礎として生きていると思います。

その頃の経験があるせいかソフトウェアエンジニア(技術者)と聞くとそのあたりのレイヤで開発をしている人を指すような気がして、ちょっと自分は違うかなーという感覚があったりします。

また機会があれば触れてみたい世界です。

 

■参考リンク
MSXアソシエーション

Movable TypeにXSSの脆弱性

この記事の所要時間: 032

Movable Typeにセキュリティホールが見つかったようです。

脆弱性が存在するMovable Typeのバージョンは3.3、3.31、3.32。また、Movable Type Enterpriseのバージョン1.01および1.02にも同様の脆弱性が確認されている。

「Movable Type」にセッションハイジャックの危険性–最新版にバージョンアップを – CNET Japan (2006-09-27)

JVN#68295640にも情報があります。

当該バージョンを使用されている方はバージョンアップを。

Ajaxと組み合わせる言語

  • 2006-09-26 (火)
  • PHP
この記事の所要時間: 023

Ajaxと組み合わせる言語1位はPHPだそうです。

言語ではPHPがもっとも人気が高く、次いでJavaとなっている。

もっとも人気のあるAJAX言語は? フレームワークは? (MYCOMジャーナル) (2006-09-26)

今時のサイトではAjax+PHPがトレンドなのでしょうか。PerlやRoR・ColdFusionなどを抑えて、Javaが2位というのが意外な気がしました。

MINI KEYBOARD III – R

この記事の所要時間: 122

MINI KEYBOARD III

キーボードをMINI KEYBOARD III – Rにしました。それまでHHKB Lite2+ワイヤレスマウスという組み合わせだったのですが細かな不満点があったので変えました。やはりポインテングデバイス一体型は使いやすいですね。

実は以前もこのキーボードを使用してたんです。特に不満も無かったのですが、コーヒーをかけて壊してしまいました。新たなキーボードを注文しようとしたのですが、納期が1ヶ月待ちだったので代用としてHHKB Lite2を使うようになりました。ファンクションキーが無くてちょっとギークっぽい?とはじめは楽しんでたのですが、やはりWin環境ではファンクションキーをわりと使うのでいささか不便な思いをしていました。

決定的になったのはマウスの方です。操作の際にキーボードから手が離れるのがイヤというものありますが、これの充電器がいまいちで充電切れ(赤ランプが点滅する)のマウスを充電器に置いても反応なし。いろいろな置き方を数回やってようやく充電が始まるというのがうっとおしくてたまりませんでした。

そんな思いをしていた時にふとMINI KEYBOARDを思い出し、購入に至ったわけです。

まだ使い出したばかりですが、打刻感は普段ノートを使ってる事もあり抵抗無いですし、何よりポインテングデバイスが付いているのが便利ですね。(まあまだマウスカーソルを動かそうとするとついつい手がキーボードを離れてマウスを探してしまいますが。)

またいつコーヒーをかけるかもしれないので、スペアを買って置いた方が良さそうです。;-)

point

ポッチが2種類になっていました。

よく使うコマンドは?

  • 2006-09-24 (日)
  • unix
この記事の所要時間: 131

普段良く使うコマンドって何でしょうか?

history|awk ‘{print $2}’|awk ‘BEGIN {FS=”|”} {print $1}’|sort|uniq -c|sort -r

Review your most oft-used UNIX commands – Lifehacker (2006-09-23)

ローカルサーバで実行したところ以下のような感じでした。

$ history|awk '{print $2}'|awk 'BEGIN {FS="|"} {print $1}'|sort|uniq -c|sort -r
    168 cd
    140 ls
    109 exit
    105 sudo
     90 vi
     65 dig
     49 php
     47 psql
     22 cat
     16 mv
     14 make
     14 ./configure
     13 su
     11 svn
     11 rm
     11 cp
      9 find
      7 top
      7 ab
      6 tar
      6 tail
      6 mkpasswd
      6 /home/xxx/php5/bin/php
      5 gdb

エントリでは上位のコマンドについてエイリアスを作る事によりキー入力を少なくできるのでは、というTipsが書かれていました。

さらにエントリの元ネタ(UNIX productivity tips)では他にも色々なTipsが紹介されています。

CakePHP1.1.8.3544への移行

この記事の所要時間: 038

既にCakePHP1.1.7.3363で動作しているシステムをCakePHP1.1.8.3544にアップグレードする方法です。

  • 念のため既存のソースを全てバックアップ
  • 1.1.8.3544のcake/を既存のcake/にコピー
  • 1.1.8.3544のapp/webroot/css.php,app/webroot/js/vendors.phpを既存のディレクトリにコピー

フレームワークを変更している場合は別途修正が必要になりますのでご注意を。

ちなみに以前このサイトで公開したパッチは1.1.8.3544でもそのまま使用できます。もしご利用の方は1.1.8.3544にアップグレード後、パッチを当ててください。

Home

検索
フィード
メタ情報

Return to page top