カテゴリー: Computer

PHP 5.0.5リリース

PHP 5.0.5がリリースされました。XMLRPCのセキュリティフィックスが含まれています。

他のディストリビューションも同じとは思いますが、Momonga LinuxのXMLRPCは現行リリース(5.0.4-6m)でもセキュリティ対策済みです。

coMomongaのススメ

遅ればせながら初めてcoLinuxのMomonga版であるcoMomonga2+(今のところ非公開です。8月のコミケで販売していたそうです。私はプロジェクトメンバーなのでscpでサーバから拾ってきました。)を使ってみました。非常に便利かつ思っていたよりレスポンスも良いです。

coLinuxは初めてだったので一番最初はcoMomongaでは無くcoLinuxのインストーラから選択できるDebianをルートファイルシステムを使ってみました。このルートファイルシステムには本当に最小限のパッケージしかインストールされていないようでした。viもemacsも無い状態でした。ネットワーク経由でapt-getすれば良いのかも知れませんがviさえ無くて戸惑いました。Gentooのルートファイルシステムも選択できます。こちらはもう少し多くのパッケージがインストールされているのかも知れませんが試しませんでした。

次にcoMomongaのISOイメージを試す事にしました。coMomongaのISOにはcoLinuxとXming(Xディスクプレイサーバ)インストール方法や設定に必要な全てのファイルが含まれています。WindowsのCDドライブにCDを挿入すると自動的にインストールマニュアルが表示されます。Xmingのバイナリも付いていてX Window環境も直ぐに構築できます。このマニュアル通りに設定するだけで簡単にセットアップできました。

# ただし、このノートPCがWindowServerのドメインメンバー
# であった為、ICS(インターネット接続の共有)がグループ
# ポリシーで無効に設定されていたのでネットワークが使え
# ませんでした。ドメインからワークグループに変えてネット
#ワークを使えるようにしました。

ブートが非常に速いのは助かります。同じノートPCのパーティションにインストールしたMomongaLinuxを起動するより随分速いです。Xも普通にストレスの無いパフォーマンスで動作します。コーディングなどの用途向け十分なレベルです。

私のノートPC
-PentiumM 1.3Ghz
-768MB RAM
-80GB 5200rpm HDD
-WindowsXP Pro SP2

スクリーンショット
coMomonga
(coMomongaをWindows上で実行し、coMomonga上のXクライアントに、Windowsで実行しているXmingからXDMCPでcoMomongaのXを起動している画面。正確に書くと長いですね… 説明は面倒ですがインストールは非常に簡単)

今までノートPCのWindows環境でUNIXライクな環境が必要な場合にはcygwinを、Emacsが使いたい時はMewを使っていましたが今後はcoMomongaを使う事にします。ノートPCにもMomongaLinuxをインストールしていますが、諸事情によりWindowsがメインOSになっています。雑誌などの評価で非常に便利とは思っていたのですが食わず嫌い(嫌いではなかったですが)で今まで損をしていました。

このcoMomonga2+ですが、Momonga Projectから今度のOSCで売りに出るそうです。是非購入(寄付?)しましょう :)

PHP関西セミナーの資料

9月3日にPHP関西のセミナー講師をさせていただきました。プレゼンテーションファイル作成の時間が足りなかった為、予定していたより内容が薄い資料になってしまいました。話を聞いて頂いた方以外にはよく分からないかも知れませんが、最近のオープンソースのPHPアプリケーション脆弱性レポートからどのように脆弱性が作られたか考察しました。

セミナーを聞いて頂いた方向けに、その時のプレゼンファイル(PowerPoint形式)を公開します。

pgbenchのpthread版

(やはりバグを発見したので修正)

JPUG広報Blogに「pgbenchのpthread版が欲しい」と書いていましたが、先週末にPHP関西のセミナー講師を引き受けていたのでその移動時間中にテキトーに作ってみました。テキトーに作ったので勘違いしてバグを入れていました。今度はたぶん正しい結果になっていると思います。

サーバ環境
Athlon64 3200/3GB Memory/SATA2 HDD/Momonga Linux x86_64
PostgreSQL 8.0.3(64bit)(全てのSQL文をホスト/ポート付きで記録。他はほぼデフォルト。)

クライアント環境
AthlonXP 2500+/2GB Memory

pthread版pgbench

[yohgaki@dev pgbench]$ time ./pgbench -v -h 192.168.100.204 -U yohgaki -c 10 -t 100
starting vacuum…end.
starting full vacuum…end.
Warming up 15 seconds…
Start benchmarking…
End benchmarking….. (4.96586 seconds)
transaction type: TPC-B (sort of)
scaling factor: 10
number of clients: 10
number of transactions per client: 100
total number of transactions processed: 1000
tps = 235.404176 (excluding connections establishing)

real 0m25.739s
user 0m0.214s
sys 0m0.313s
[yohgaki@dev pgbench]$

こんな感じです。

何だか遅くなってしまたのでコードをもう少し効率化してみました。
今度はオリジナル版よりは速くなりました。

pthread版pgbench

[yohgaki@dev pgbench]$ time ./pgbench -v -h 192.168.100.204 -U yohgaki -c 50 -t 10
starting vacuum…end.
starting full vacuum…end.
Warming up 0 seconds…
Start benchmarking…
End benchmarking….. (1.16363 seconds)
transaction type: TPC-B (sort of)
scaling factor: 1
number of clients: 50
number of transactions per client: 10
total number of transactions processed: 500
tps = 429.689481 (excluding connections establishing)

real 0m2.655s
user 0m0.047s
sys 0m0.088s

オリジナル版

[yohgaki@dev pgbench]$ time pgbench -v -h 192.168.100.204 -U yohgaki -c 50 -t 10
starting vacuum…end.
starting full vacuum…end.
transaction type: TPC-B (sort of)
scaling factor: 1
number of clients: 50
number of transactions per client: 10
number of transactions actually processed: 500/500
tps = 337.674248 (including connections establishing)
tps = 379.093451 (excluding connections establishing)

real 0m1.615s
user 0m0.043s
sys 0m0.210s

と、多少スレッド版の方が速いです。今度は繰り返し実行してみてもスレッド版の方が速い傾向は変わりませんでした(汗

ベンチマークを開始する前にウォーミングアップの時間を設定したかった事、クエリ実行間隔をランダムに設定したかった事もpthread版が欲しかった他の理由でした。そこで

-w ウォームアップ時間(秒)
-r ランダム遅延(マイクロ秒)

も設定できるようにしました。よくあることですがサーバに負荷をかけた直後は良い性能がでるためウォームアップ時間は設定できた方が便利です。

ウォームアップ時間を5秒に設定した場合

[yohgaki@dev pgbench]$ time ./pgbench -v -h 192.168.100.204 -U yohgaki -c 50 -t 10 -w 5
starting vacuum…end.
starting full vacuum…end.
Warming up 5 seconds…
Start benchmarking…
End benchmarking….. (1.48874 seconds)
transaction type: TPC-B (sort of)
scaling factor: 1
number of clients: 50
number of transactions per client: 10
total number of transactions processed: 500
tps = 335.854481 (excluding connections establishing)

real 0m6.671s
user 0m0.124s
sys 0m0.260s

とこの様な感じです。オリジナル版にウォームアップ時間オプションを追加して欲しいな、と書いておいたら石井さんが追加してくれるはず :)

ソースは
http://www.ohgaki.net/wiki/index.php?PostgreSQL%2Fppgbench
からダウンロードできます。変更するかもしれないので日付を入れておきました。日付が入っていないソースは古いソースです。もし古いソースをお持ちの場合、新しいソースを使ってください。古い物にはバグがあります。

FedoraCoreのメイン開発プラットフォームはx86_64?

PentiumDを購入したのですがMomongaのカーネルでは945/955チップセットのSATAデバイスは現状のカーネルでは認識しませんでした。少し前のブログにパッチを当てたらとりあえず認識したと書きましたが、素直に最新のカーネル使ってみようとFedoraCore develのカーネルをCVSから拾ってきました。

x86_64でビルドしたところ問題なくビルド&動作しました。やはり基本には忠実でないと…
i686でビルドしたところ簡単なシンタックスエラーでビルドに失敗しました。FedoraCoreの開発者のほとんどはi386からx86_64に移行しているのかも知れませんね。

DJB先生の標準PCもAthlon64ですが、

The 2005.05.14 standard workstation costs $552. Notes on the price:

http://cr.yp.to/hardware/advice.html

とたったの$552です。香川ではECCメモリは店頭で売っていないですし、通販で買っても結構高い(前回買った時はDDR2-533 1GBが24,000円ちょっとが最安値)での普通のメモリを買えばこれくらいで作れそうです。私も最近Athlon64のPCをMomongaビルド用のPCとして作りました。Athlon64 3200、nVidia gForce FX5200、メモリ3GB、250GB+400GB HDDという感じで作ったので$552とは行きませんでしたが、むかーしDynabook386SX用に買った60MB(60GBではありません)HDDと同じ程度の値段で作れました。

しかしスーパーマルチドライブ安くなりましたね。バルクなら5000円切ってました。

LinuxとICH7は鬼門?!

GigabyteのGA-8I945Gマザーボードを購入しました。このマザーボートを購入した理由はPCI Express x16用のハイエンドグラフィックスカードは必要なかった事と廉価なPCI Expressグラフィックスカードが無かった事、そしてPentinumDを使いたかった為です。
# IntelのxxxGチップセットはグラフィックスカード機能を内蔵しています。
# 16MBくらいのメインメモリは使えるのだろう、と思っていたらGA-8I945G
# は最大でも8MBしか使えません…

945チップセットはICH7によってPATA/SATA IDEインターフェース機能が提供されています。ネットで検索するとSuSEなどのディストリビューションではSATAのみの環境でもインストールできているようですがMomonga Linux 2はインストールでませんでした。ATA HDDのFAQサイトではata_piixかahciでICH7で利用できると書いてあるのですが、SATAデバイスは全く認識されない状態でした。

仕方が無いのでPATAのHDDとDVD ROMをIDE0インターフェース接続してとりあえずインストールした後、いろいろ試して見る事にしました。しかし、このIDE0のインターフェースが悪いのかICH7サポートが悪いのか、DVD ROMをはずしてもhdparmで2MB/秒程度の速度しか出ていません。状態を確認するとDMAさえ使っていませんでした。hdparm -d1でDMAを有効に設定しようと試みても「サポートしていない」旨のエラーでDMAも有効に出来ません。

なんとしてもSATA HDDを使えるようにしなければと思いつつネット検索していると、カーネルのデバイス認識に問題あるため(?)チェックコードを削除するとSATAドライブを認識できたケースがある事を見つけました。kernelに次のパッチを適用してやっとSATA HDDが認識できました。

--- linux-2.6.10/drivers/scsi/ata_piix.c.orig   2005-08-01 10:44:38.000000000 +0900
+++ linux-2.6.10/drivers/scsi/ata_piix.c        2005-08-01 10:44:53.000000000 +0900
@@ -589,12 +589,6 @@
        port_info[0] = &piix_port_info[ent->driver_data];
        port_info[1] = NULL;

-       if (port_info[0]->host_flags & PIIX_FLAG_AHCI) {
-               int rc = piix_disable_ahci(pdev);
-               if (rc)
-                       return rc;
-       }
-
        if (port_info[0]->host_flags & PIIX_FLAG_COMBINED) {
                u8 tmp;
                pci_read_config_byte(pdev, ICH5_PMR, &tmp);

hdparmでも66MB/秒と普通の数値が出ています。cp -ax でPATAにインストールしたMomonga Linux 2をSATAにコピーし、grub.confやinitrdイメージを作り直してパッチ付きカーネルでブートできるようにしました。ここでは書いていませんが、要所要所で適切にBIOSも設定しなければなりません。設定を間違えるとPATAのディスクさえ認識してくれません。ご注意下さい。

他のディストリビューションでSATAのみの環境でのブートを試みたのはKnoppix3.9 日本語版だけですが、これもSATAデバイスを全く認識してくれませんでした。SuSEなら大丈夫(?!)なのかもしれませんが…

GigabyteのGA-8I945GはLinuxで使えない事もないですがお勧めできるM/Bでは無いです。同じシリーズのM/Bも同じかと思います。M/Bの問題と言うより、もしかしてICH7/ICH7RはLinuxにとって鬼門?!

# PS/2マウスコネクタの接触が悪いのか、他の原因なのか分かりませんが
# マウスが動かなくなるのも困ります。抜き差しすると直ります…
# 955チップセットに買い換えるかな…

DNSサーバを使ったユーザトラッキング

前からちょくちょく見かけていたのですが最近はDNSサーバを使用しユーザトラキングを行っているSPAMメールがどんどん増えているように思えます。

SPAMMERとしてもどのどのメールアドレスからは反応(クリック)があったのか知りたいので最も安直な手口として

http://example.com/?u=user@example.com

の様なメールがありました。さすがにこれではトラッキングしていることがばればれなので

http://example.com/?id=1234

とか

http://example.com/?prod_id=1234

等とトラッキングしている事を判りづらくする試みは行われていました。ちょっとコンピュータ(Web)を知っている方ならトラキングを行っている(行える)事は明らかなので、最近はドメイン名も使うSPAMMERも増えてきたようです。

http://tracking_id.example.com/
tracking_idはユーザを特定できるIDとなる任意文字列

の様な形式URLが使われています。こんな事をしても全部のサーバ名を作るのが大変では?と思うかも知れませんがDNSサーバによってはワイルドカードが使用できます。

*.example.com 10.10.10.10

の様な定義ができるのです。ユーザがアクセスしてきたらアクセスしてきたHOST情報からユーザを特定し記録した後、別のサイトにリダイレクトする、等の方法を使っているはずです。
# リダイレクトはしてもしなくてもどちらでも良いです。念のため。

DJBDNSユーザなら誰でも思いつく方法と思いますが、広まるまでに時間が必要でしたね :p

岡山県工業技術センターでPHPセミナー

岡山県工業技術センターでPHPの入門セミナー講師をさせていただきました。会議室に満員の70名ほどの方に聞いていただきました。

入門といっても前半がPHPの紹介、後半がセキュリティ対策の基礎、という入門用のセミナとしては内容がPHPに特化していたと思います。PHPを使っていない方も多かったので私の本と同じで評価は大きく分かれるセミナーになったと思います。

しかしセキュリティ対策の基礎は資料だけでも十分参考になると思うので少しでも安全なWebサイト構築の助けになればよいと思います。

PHPのE_STRICTエラー

PHPのエラーレポートレベルはphp.ini設定のerror_reportingで設定されています。

PHP5から追加されたE_STRICTで「あれ」と思われるかもしれない状況があるので書いておきます。

PHP5でE_ALLをerror_reportingに設定してもE_STRICTレベルのエラーは報告されません。デフォルト設定ファイルではE_STRICTは無視されるようになっています。

error_reporting = E_ALL | E_STRICT

と設定しないとより厳しいエラーチェックが行われません。

開発時には言語が用意しているエラーチェックを出来る限り多く使用するべきです。しかし、E_STRICTレベルのエラーレポートを行う設定を行った場合に問題が発生する場合があります。次のコードがどのように処理されるか考えると分かります。

<?php
error_reporting(E_ALL); // E_STRICTは不必要

class foo {
  var $bar;
}
?>

E_STRICTで報告されるエラーには”var”宣言されたプロパティにpublic/private/protectedを使用するよう推奨するエラーがあります。このエラーはコンパイル時に発生するため、スクリプト中でerror_reporting関数を使ってエラー報告レベルと変更してもE_STRICTエラーを無視できません。E_STRICTエラーが有効な環境で、error_reporting関数で確実にE_STRICTエラーが発生しないようにするには、E_STRICTエラー出力を抑制するには最初に読み込まれるファイルのコード中にE_STRICTエラーが発生しないしerror_reporting関数を使用してエラー報告レベルを変更しなければなりません。

# E_STRICTは開発時だけ使う、という方針がお勧めです。
# PHP4用に作ったアプリの修正は手間な場合は、INSTALL
# ファイルなどにE_STRICTは無効にするよう書くだけでも
# 良いかもしれません。

備考:
E_NOTICEレベルのエラーは全て実行時に発生するエラーであるため、E_STRICTの様な問題は発生しません。念のため。

追記:
今時のPHPアプリケーションならE_STRICTエラーも発生しないようにプログラムを作成すべきす。

 

PHPのメモリ・リソースリークの修正

気が付いていてもやってないことが多いので、せめて近日中に処理しようと思っていることくらいは公開して自分にプレッシャーをかけてみる事にしました。

PHPにはError HandlerやException Hanlderを使った場合、メモリやリソースが開放されない場合があります。多少のリークは問題とならない場合がほとんどですが中にはサーバがフリーズしてしまうケースもあります。原因と修正すべきコード、対処方法なども分かっています。取り掛かろうとしてinternalsに軽くメールしたのち放置中…

# この問題と原因は随分前から知っていて放置してました :(

関数の戻り値と定数値(リテラル)への参照

追記:このエントリへのアクセスが多いので加筆修正しました。

Fatal error: Only variables can be passed by reference

直訳すると「致命的エラー:変数のみ参照渡しが可能です」となります。エラーメッセージの通りvariable(以外)の値は参照として渡せないのでエラーになっています。エラーメッセージが適切かどうかは微妙ですが、意訳すると「致命的エラー:ソースコード中に記述した定数値(リテラル)へのアクセスはできません」あたりが妥当と思います。当然ですがdefineで定義した定数値を返す事は可能です。PHP内部では定数は変更できない「変数」の様に実装されているからです。このエントリの「定数値」を正確に書くと「ソースコード中に記述された定数値」となります。

もっと読む

.mobiドメイン承認

何度か「もう新しいドメインは必要ない」とこのブログに書いていますが、ICANNはモバイル用に.mobiを承認したようです。

EU用の.euドメインは、EUが最終的には統一国家のような体制を目指しているので必要かとおもいますが、アダルトサイト用.xxxやモバイル用.mobiはドメイン名のレジストラとごく一部の利用者(ドメインを必要とするもの)を除いて不必要なドメインです。管理上、地域別にドメイン名を付けるのは理解できます。しかし、サイトの種類に応じてドメイン名を付ける、と言うアイデアは破綻している事が証明されてから久しいです。トップレベルのドメイン名がどんどん増えていますが、レジストラのみ儲ける仕組みですね。
# 会社名.xxx等をアダルトサイト運営者に取得されないように
# するためだけに企業が.xxxドメインを取得するのは目に見え
# ています。.xxxドメインの半数以上は普通の企業のドメイン
# となると思います。(アダルトビジネスを甘く見すぎ?)

ところでアフリカ連合が統一国家的な体制になった場合、ドメイン名をどうするか問題になりますね。.auは既に使用済みです。この心配が現実になるとしても少なくとも50年以上先の話とは思いますが。

不必要なIT化?!

裁判で電子投票の無効が確定したそうです。

前から思っていたのですがタッチパネルだけで投票する事がそんなに便利なのでしょうか?自宅にいながらインターネット経由で投票できるならまだしも、投票所に行かなければならないのにタッチパネルで投票する事の意義は無いと考えています。物理的に投票者が投票所に行くのですからもっとセキュアな仕組み(検証可能であることも含む)にするべきだと思います。
# 私が知っている電子投票システムはタッチパネルの物ですが
# 岐阜県可児市議選のシステムも同じかどうかは知りません。

私がシステムを設計するのであれば、マークシートとシートリーダを用意して投票と同時にマークシートを読み取らせる様にします。集計結果は投票時間が終了するまで誰も見れない仕組みにすればよいでしょう。万が一、集計データがなくなったり、今回の裁判の様に機器が使えなくなってもも後でマークシートを読めばよいだけです。選挙結果に異議がある場合もマークシートを読み直せばよいだけです。最悪の場合、アメリカの大統領選の様に人間がマークシートを一枚一枚確認する事態になるかも知れませんが、それでもタッチパネルだけの投票より遥かに容易に結果を再検証可能です。完全な電子投票では結果の検証手段が無いという致命的な欠陥があります。

利便性向上も目的の一つですが、電子投票にしたために投票をやり直すようでは経費もそうですが、利便性は低下するばかりです。

将来はネットワーク経由で投票を行えるようにするための実験として紙などを利用しない投票形式にしているのかも知れませんが、個人的には10年後でもネットワーク経由での電子投票には反対すると思います。安全性への疑問が拭いきれないからです。投票所に行かずに投票を行うことは不可能である事を前提とすると、今の電子投票システムは無用の長物としか思えません。電子投票システムの実験をしたいなら別途行って欲しい物です。

経費節減が電子投票推進の理由の一つになっていますが、投票用紙をマークシートにするだけも十分費用削減効果があるのではないでしょうか?そしてマークシート式投票用紙を使用した方が安全性など含め優れた点が多いのではないでしょうか?

さらに各自治体がいろいろな電子投票システムを作っていると思いますが、この状況は改善したのでしょうか?ばらばらに作っていたのでは税金の無駄遣いです。かと言ってシステムを統一すると不正が発生するリスクが大きくなってしまいます。

今の電子投票システムは不必要なIT化の代表例でしょう。

# 子供の安全性確保のためにRFIDを持たせる、というアイデア
# と同じくらい不必要かつ無駄なことだと思います。