カテゴリー:IT

PHPフレームワーク

2008年9月15日(月)

私はデスクトップアプリケーションの開発はC++、WEBアプリケーションはJava、Pythonで開発することがほとんどだ。WEBアプリで主流のPHP、Perlは通常は使わない。

4年ほど前だが、中規模のWEBアプリケーションを受注した。発注者側の希望はPHP言語での開発だったが、調査したところPHPでは不適当という結果となり、Java/Strutsで開発した。そのときPHPが「不適当」となった理由は次のように記憶している。
・開発効率を高めバグを少なく抑える観点から、開発はオブジェクト指向言語にしたい。しかしその当時のPHPは、オブジェクト指向機能が強化されたPHP5が出たばかりで、安定性に疑問があった。PHP4ではオブジェクト指向機能が不足していた。
・当時のPHP5周辺ライブラリはほとんど非クラス(非オブジェクト指向)だった。
・PHP5用のWEBアプリ用フレームワークが無かった。

このたび仕事先でちょっとしたWEBアプリを開発することになった。小規模アプリなので私は当然 Python/TurboGears での開発を提案したが却下され、PHPに決定となってしまった。ただ私の強い意向で、PHPフレームワークは使用して良いこととなった。

PHP言語は、オブジェクト指向できちんと作ればメンテナンスしやすい強固なプログラムを作ることができるが、(素人が作るような)力技のメンテナンス性に欠けた脆いプログラムも作ることができる。まあ自由度の高い言語といえばそうなのだが、自由度が高すぎるのも困ったものだ。そこで自由度にたがをはめる必要がある。その制約がフレームワーク、という訳だ。

調査したところ、結構良いフレームワークが出ているのに驚いた。私が良いと思ったのは
CakePHP, Ethna, CodeIgniter, Symfony の4つだ。これらはみな、Ruby言語の「お化けフレームワーク」である Ruby on Rails の影響を受けている。Ruby on Railsの人気は大変なものだ。他のあらゆるスクリプト言語で、Ruby on Railsライクなフレームワークが誕生している。PHPでもこれら4つがその代表選手だ。中でも CakePHPは、4つの中で一番 Ruby on Railsに近いような気がする。いまは、Symfonyを重点的に調査中だ。

それにしても私はPHP言語はそれほど好きになれない。大きな理由は、感覚的なものだが、ソースコードのルックスがあまり綺麗でないように感じるからだ。例えば、スクリプトの前後を
<?php

?>
で囲むのはどうも好きでない。また変数の前に $が必要なのもどうも美しくない。また例外処理で、finally が無いのは不満である。とはいえ仕事なので、好き嫌いには関係なくPHP+フレームワークでの開発作業にとりかかる。

IE6とIE7の共存

2008年5月23日(金)

先週の記事 WindowsXP SP3再起動問題のとおり、新マシンにWindowsXP SP3をインストールした。ブラウザは、最新のInternet Explorer7(以下IE7)にバージョンアップ。当社では初めてのIE7だ。歴代のInternet Explorerは標準と異なる動作があり、IE6からIE7のバージョンアップで何らかの問題が発生することは予想していたが、やはり発生した。なんと会社のホームページの画像がずれて表示されている。IE6では<img>タグで画像を隙間無く並べようとしたとき、他のブラウザでは発生しない隙間ができてしまう問題があり、少々姑息な手段(いわゆるCSSハック)で対応していた。その部分がIE7ではNGとなっている。

IE7をインストールしたIE7は私のマシンではない。私の開発マシンにIE7をインストールする必要があるが、IE6も残しておきたい。しかし、IE6とIE7を共存することは不可で、IE6をIE7にバージョンアップしたら共存どころかIE6には戻れない。

なにか良い手立ては無いものかとネットを探したところ、次の2つの方法があった。
1.スタンドアローンIE7
VelocIT Toolsというサイトの”IE7 Standalone”である。これはまさにスタンドアローンであり、IE6と共存できるらしい。早速ダウンロードし、インストールしようと試みた。このソフトの面白いところは、マイクロソフトからIE7をダウンロードし、それはインストールせずに”IE7 Standalone”ディレクトリにコピーし、”IE7 Standalone”のインストーラを走らせる、という点だ。早速試みたが、マイクロソフトからダウンロードするIE7は英語版を想定しており、日本語版IE7ではメッセージが出てインストールできなかった。

2.MultipleIE
MultipleIEというフリーソフトだ。これは、E3, IE4.01, IE5, IE5.5, IE6 が同梱されており、IEの好きなバージョンをインストールできる。早速、私の開発マシン(Windows XP SP2, IE6)にMultipleIEのIE5, IE5.5, IE6をインストールしてみた。

これは上手く行った。インストールした3つのバージョンが別々に動作する。メニューは英語だが、何の設定も不要で、そのまま日本語のサイトが表示できる。

様々なサイトを表示させてテストし、このソフトは問題なく使えることがわかった。そこで、私のマシンをIE7にバージョンアップした。IE7にバージョンアップ後も、MultipleIEは問題なく動作している。

いや、取るに足りない問題はあった。IE7バージョンアップ後のMultipleIEのIE6で、”Favorites”ボタンを押下すると左サイドバーに以前のIE6と同じ「お気に入り」リンクリストが表示される。そのリンクのひとつをクリックすると、なんとWindowsの「印刷」ダイアログが出て来てしまう。まあこれはキャンセルすれば良いし、そもそもMultipleIEのIE6で「お気に入り」を表示させなければよいのだから、このバグには目をつぶることにした。

なお少し気になることはある。それはMultipleIEの動作の問題ではなく著作権の問題だ。インストールされたMultipleIEディレクトリ中を見ると、各バージョンのIEと関連DLL(どうみてもマイクロソフト製)が格納されている。これは、未確認だがIEのライセンス違反になるかもしれない。

とはいえ、複数バージョンのIEを共存することができた。早速会社のホームページを修正し、IE6,IE7で正常に表示させることができるようになった。

これを機会に、サイトチェック用に他のブラウザもインストールした。今後、WEBアプリ開発時は次のブラウザでチェックすることにした。(ちなみに私のメインブラウザはFireFoxだ。)

・Windows
(1)FireFox
(2)IE6
(3)IE7
(4)Opera
(5)Safari

・Linux
(1)FireFox(Windows版FireFoxとは同一バージョンでも異なる動きの場合があった。)

本来はこの他にMac上でのIEとSafariが必要だろうがMacは所有していない。買っても他に使い道が無いので。。。

それから、IE5.5以前はユーザが少ないことが予想されるため無視することにした。

WindowsXP SP3再起動問題

2008年5月16日(金)

今週前半、新パソコンにWindowsXPをインストールした。若干の問題はあったがインストールは正常に終了。次にWindowsを最新の状態にするため、Windows Updateを実行した。かなりの時間を要したが、Updateは正常に終了し、再起動。ところが、再起動後にログインしてもまた自動的に再起動される。何度ログインしても再起動の無限ループ。

インストールの過程で種々ドライバのインストールでトラブったため、ドライバの問題かもしれないと仮説を立てた。そしてやむなくWindowxの再インストールを行った。インストール後、最低限のドライバのみインストールし、Windows Updateを実行。今度はうまく行った。正常にログインできた。そして残りのドライバをインストールし、すべてOKと相成った。

この問題、前記のようにてっきりドライバの問題と思ったが、実はそうではなかった。次の記事を偶然見つけた。Windows XP SP3、今度はエンドレス再起動の問題生じるという記事である。

今回実行したWindows Updateでは、最新のService Pack(SP)3がインストールされた。そのSP3の問題だったのだ。

原因についてはWindows XP SP3の不具合続くに詳しい。次のとおりだ。

この問題は、HPやそのほかのOEMベンダーが、Intelベースのマシンで使われたのと同じイメージファイルをAMDベースのマシンに使用したケースで起きると記している。こういったマシンにSP3を導入すると、再起動を繰り返すなどの不具合が発生する。

「IntelとAMD用のイメージは同じであるため、どちらのシステムにもintelppm.sysドライバがインストールされ、動作している」とジョハンソン氏は記している。「このドライバはIntelベースのコンピュータで電力管理機能を提供する。AMDベースのコンピュータでは、 amdk8.sysが同じ機能を提供する。MicrosoftはKnowledge Baseの記事の中で、同一コンピュータに両方のドライバをインストールするのはサポート対象外の構成であり、そのイメージを採用したOEMに責任があると指摘している」

 「通常は、AMDベースのコンピュータ上でintelppm.sysを動作させても問題は起きないようだ。しかし、サービスパックをインストールした後の最初の再起動の際に大きな問題が発生する。コンピュータが起動できなくなるか、わたしの場合のように、0×0000007eのSTOPエラーコードを表示してクラッシュする」とジョハンソン氏は付け加えている。

そう、問題の起きたパソコンはCPUがAMDなのだ。上記中で

同一コンピュータに両方のドライバをインストールするのはサポート対象外の構成であり、そのイメージを採用したOEMに責任がある

と、責任はマイクロソフトには無いような発言があるが、それは違う。私がインストールしたWindowsはOEMではなくマイクロソフト純正だからだ。

上記記事の別の箇所で

さらにホイットマン氏は「この問題の影響を受けたシステムの数はわずかだ」と付け加えた。

とのこと。そうだろうか。それはともかく、滅多に発生しないとマイクロソフトが認識していることが私のマシンで発生したことは確かだ。そして、私はいままでWidowsの何倍もLinuxのインストールをしているがLinuxではインストール時に問題の発生したことはほとんどなかった、ということも付け加えておかなければならない。

spamメールの嵐

2008年5月15日(木)

今日はspamメールの嵐だった。1日で約1,000通を超えるのではないか。朝一番にメールを受信すると約350通のspamから始まった。ただ、これは通常のspamメールではない。ほとんどすべてがメールサーバからのエラーメールなのだ。つまりこういうことだ。

謎の人物Xが私のメールアドレスを騙り、おそらく数千のspamメールを世界に発信したのだ。相手先メールアドレスには存在しないメールアドレスが含まれており、そのメールサーバからご丁寧に「メールアドレスが存在しない」エラーメールが形式上の差出人の私宛てに送信された、という次第。

私はメールフィルタソフトPOPFileを社内サーバのLinux機にインストールして使用している。このPOPFileがメールに付けたspamマークのあるメールはダウンロードせずに即サーバから削除する設定になっているので、今回の事件で私のメールクライアントソフトのフォルダがspamメールで溢れるような実害はなかった。しかし、私のメールアドレスを差出人として世界中に数千のspamメールがバラ撒かれたとは、実に不愉快な話である。

ちなみにそのメールフィルタソフトPOPFileはもう4年使用している。その間の総受信数は約4万5千メール。検出精度は99.86%、つまり誤った検出は0.14%ということになるので、結構優秀なフィルタソフトだと思う。ちなみに受信した75%はspamメールだった。これを敷衍すれば、ネットを流れるメールの4分の3はspamということになる。この世にspamメールなかりせば、いかにネットは軽くならまし。

mysql4.0とmysql5.0の共存

2008年5月3日(土)

数日前にmysql3.23とmysql5.0の共存という記事を書いた。このサーバ、10日ほどmysql3.23とmysql5.0が共存していたが、若干の問題が発生し、mysql3.23のバージョンを上げてmysql4.0とmysql5.0を共存することにした。(いままでのmysql3.23は削除。)メモを兼ねて共存手順を書いておく。

インストールするmysql4.0のポート、ソケットは次のとおり。
ポート: 43306
ソケット: /tmp/mysql.sock4.0

1: /etc/my.cnf を5.0専用にする
/etc/my.cnf 修正
[mysqld] を  [mysqld-5.0] に変更しmysql再起動。

2: ソースインストール
ソースmysql-4.0.27.tar.gz は/tmp下にコピーしておく。
実行は新ユーザ mysql4 とする。

# useradd mysql4
# mkdir /usr/local/mysql4.0
# chown mysql4 /usr/local/mysql4.0

# cd /usr/local/src
# mkdir mysql-4.0.27
# chown mysql4 mysql-4.0.27
# su - mysql4
rootはここまで。

$ cd /usr/local/src
$ tar xvzf /tmp/mysql-4.0.27.tar.gz
$ cd mysql-4.0.27

$ ./configure –prefix=/usr/local/mysql4.0 –with-extra-chrasets=all –with-charset=ujis –with-pthread –with-named-thread-libs=-lpthread –disable-dependency-tracking –without-bench –without-debug –enable-assembler

$ make >make.log 2>makeErr.log

次のエラーとなる。

mysqld.cc:(.text+0×3911): undefined reference to `my_fast_mutexattr’
mysqld.o:mysqld.cc:(.text+0×3b35): more undefined references to `my_fast_mutexattr’ follow
collect2: ld returned 1 exit status

ある記事によれば

my_fast_mutexattrはmysys/my_thr_init.cに
以下のように定義されています。

#ifdef PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP
pthread_mutexattr_t my_fast_mutexattr;
#endif

この定義を次のように変更したら、makeは成功しました。

//#ifdef PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP
pthread_mutexattr_t my_fast_mutexattr;
//#endif

とあり確かにmakeは成功するが、ソースを見るとこれでは心配なので mysys/my_thr_init.cに

// ADD
#define PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP 1

行を先頭付近に付加した。これでOK。

$ make install >install.log 2>installErr.log

インストールOK。

3: /etc/my.cnfに4.0専用記述を追加

[mysqld-4.0]
port=43306
basedir=/usr/local/mysql4.0
datadir=/usr/local/mysql4.0/var

4: DB初期化
ユーザ mysql4

$ cd /usr/local/src/mysql-4.0.27
$ scripts/mysql_install_db

5: mysqlデーモン開始
rootで実行。

# /usr/local/mysql4.0/bin/mysqld_safe –log-error=/var/log/mysql40.log –socket=/tmp/mysql.sock4.0 –pid-file=/usr/local/mysql4.0/var/mysqld40.pid –user=mysql4 &

6: mysqlコマンド接続
mysqlデータベース接続には次のどちらかで接続する。

$ /usr/local/mysql4.0/bin/mysql –port=43306 –socket=/tmp/mysql.sock4.0 -uroot mysql

または

$ /usr/local/mysql4.0/bin/mysql –port=43306 -h127.0.0.1 -uroot mysql

mysql4.0アクセスには/usr/local/mysql4.0/bin/下のコマンドを使用する。

以上でmysql4.0とmysql5.0は共存し、私のサーバにて正常に動作している。

mysql3.23とmysql5.0の共存

2008年4月29日(火)

本日ブログ開設。右のプロフィールにあるとおり、このブログではPython, TurboGears,バロックオーボエの話題が中心の予定である。しかし本日は初日なのに全然違う話題である。

先日、仕事で借りている専用サーバの移転作業を行った。サーバ中には10サイト近くサイトがあるためある程度の工数は予想したが、結果としてはそれを遥かに上回る工数を要してしまった。原因は、データベースmysqlのバージョンの違いである。

旧サーバはmysql3.23、新サーバはmysql5.0。文字コードで問題の発生する可能性はMLなどで事前に知ってはいた。確かにブログの移転で若干の問題は発生したが、/etc/my.cnfの設定、データベースの文字コード指定等でクリアできた。

問題はJava(Servlet)アプリケーション。これは医学データ収集用WEBアプリケーションで、5,6年前(だいぶ前)に作ったものだ。

文字コード(文字化け)問題はこのJavaアプリケーションでも発生した。ただこれも、/etc/my.cnfの設定、データベースの文字コード指定のみならず、mysql-connector-javaのバージョンや設定を変えることで、少し時間はかかったがクリアできた。しかしどうしても解決できない問題が発生してしまった。

それは、「TIMESTAMP NULL」問題である。良く知られたことだがMySQLのデータ型のTIMESTAMPは癖があり使わない方が良い。しかしこのJavaアプリではTIMESTAMP型は多用されていた。そして、TIMESTAMP値の0またはNULLを代入する際、TIMESTAMP型の開始日時である 1970-01-01 00:00:00 を設定していた。これはmysql3.23では問題なく動作する。しかしmysql5.0では例外が発生してしまう。

ここからが試行錯誤の始まりだった。mysql5.0ではJSTとUTCの9時間のずれを考慮しているようで、1970-01-01 09:00:01 は設定できる。しかし 1970-01-01 09:00:00 は設定できない。NULLを設定してみると、mysqlのTIMASTAMP型の振るまいでカレント日時が代入されてしまう。

この「設定できない」という意味は、Javaから設定できない、という意味である。コンソールのmysqlコマンドでは設定できる。mysqlコマンドでは 1970-01-01 09:00:00 は設定でき、SELECTでそれを見ると NULL として表示される。この振るまいをJavaから行いたいのだが。いろいろ試行錯誤し、調査の結果、これは不可能であることがわかった。このJavaアプリで必要な、TIMESTAMP型に初期値を設定するという処理がmysql5.0では不可能なのだ。

サーバ移転の期限は迫ってくるし、さあ困った。そこで思いついた案が、mysql5.0が動いているサーバに別途mysql3.23を動かし、共存させる、という方法だ。設定ファイルの/etc/my.cnfが悪さをしないかちょっと心配だったが、結果としては共存できた。そして件のJavaアプリからはmysql3.23側に接続し、問題なく動作している。

ここで、mysql5.0動作環境にmysql3.23を共存インストールする手順について簡単にまとめておく。

1: mysql5.0環境のセーブ
念のため、mysql5.0関連ファイルをセーブしておく。
(1)2ファイルセーブ
/etc/my.cnf
/etc/rc/init.d/mysqld

(2)mysqlデーモンを止めてから /var/lib/mysql セーブ

2: /etc/my.cnf を5.0専用にする
/etc/my.cnf 修正
[mysqld] を  [mysqld-5.0] に変更しmysql再起動。問題の無いことを確認する。

3: ソースインストール
実行は新ユーザ mysql3 とする。またmysql3.2の最後のバージョンのソース mysql-3.23.58.tar.gz を入手し、/tmp下に存在するものとする。

$ su -
# useradd mysql3
# mkdir /usr/local/mysql3.23
# chown mysql3 /usr/local/mysql3.23

# cd /usr/local/src
# cp -p /tmp/mysql-3.23.58.tar.gz .
# mkdir mysql-3.23.58
# chown mysql3 mysql-3.23.58
# su - mysql3

rootでの実行はここまで。以降は、新ユーザ mysql3 で実行する。

$ cd /usr/local/src
$ tar xvzf mysql-3.23.58.tar.gz
$ cd mysql-3.23.58
$ ./configure –prefix=/usr/local/mysql3.23 –with-extra-chrasets=all –with-charset=ujis

ところが上記最後の ./configure でエラーが発生した。

checking “LinuxThreads”… “Not found”
configure: error: This is a linux system and Linuxthreads was not
found. On linux Linuxthreads should be used. Please install Linuxthreads
(or a new glibc) and try again. See the Installation chapter in the
Reference Manual for more information.

調査の結果、これはMySQLのバグのようで、configureにオプションを付加すれば良いことがわかった。

$ ./configure –prefix=/usr/local/mysql3.23 –with-extra-chrasets=all –with-charset=ujis –with-pthread –with-named-thread-libs=-lpthread –disable-dependency-tracking –without-bench –without-debug –enable-assembler

次にmakeを行う。

$ make >make.log 2>makeErr.log

今度は次のエラーとなった。

mysqld.o:mysqld.cc:(.text+0×306e): more undefined references to `my_fast_mutexattr’ follow
collect2: ld returned 1 exit status

調査の結果、あるサイトの次の記述を参考にした。

my_fast_mutexattrはmysys/my_thr_init.cに
以下のように定義されています。

#ifdef PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP
pthread_mutexattr_t my_fast_mutexattr;
#endif

この定義を次のように変更したら、makeは成功しました。

//#ifdef PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP
pthread_mutexattr_t my_fast_mutexattr;
//#endif

目出度くmakeは成功した。そしてインストール。

$ make install >install.log 2>installErr.log

4: .my.cnf
/home/mysql3下に次の内容で .my.cnf (ドット’.'ファイルであることに注意)作成

[mysqld]
port=13306
basedir=/usr/local/mysql3.23
datadir=/usr/local/mysql3.23/var
socket=/tmp/mysql.sock3.23
log=/usr/local/mysql3.23/var/mysql.log

5: DB初期化
ユーザ mysql3で次を実行。

$ cd /usr/local/src/mysql-3.23.58
$ scripts/mysql_install_db

6: mysqlデーモン開始

$ /usr/local/mysql3.23/bin/safe_mysqld &

mysqlデーモンのプロセスIDは次のファイルに格納されている。
/usr/local/mysql3.23/var/xxxxx.pid (xxxxxは環境に固有)

そこで、次のコマンドでmysqlデーモンを停止できる。

$ kill `cat /usr/local/mysql3.23/var/xxxxx.pid`

7: mysql3.23 自動実行
/etc/rc.d/init.d/mysqld をコピーして mysql3 とし、上記の内容で修正。

8: mysqlコマンド接続
・mysqlデータベース接続

$ /usr/local/mysql3.23/bin/mysql –port=13306 –socket=/tmp/mysql.sock3.23 -uroot mysql

または

$ /usr/local/mysql3.23/bin/mysql -h127.0.0.1 –port=13306 -uroot mysql

なおこの初期状態ではrootにパスワードが設定されていないので至急設定する。
そして、mysql3.23側データベースアクセスは、/usr/local/mysql3.23/bin/下のコマンドを使用すればよい。

以上でmysql5.0とmysql3.23の共存に成功した。

 
サブタイトル カレンダー

 

2017 年 12 月
« 3 月    
 12
3456789
10111213141516
17181920212223
24252627282930
31  
秘書
サブタイトル profile

 

職業はソフトウェアエンジニア。趣味はバロックオーボエとモダンオーボエ演奏。このブログでは、Python・Go・Scala言語、そのWEBアプリケーションフレームワーク、そしてバロックオーボエ・クラシカルオーボエの話題を中心に書いて参ります。

サブタイトル 検索

 

サブタイトル 最近のトラックバック

 


QLOOK ANALYTICS