Progress bar 実装

PHPでファイルアップロード時に進捗を表示するProgress barの実装をやってたりする。

PHP5のAPC(Alternative PHP Cache)で、ファイル送信時の情報取得が使えるようになったのだが、サーバがPHP4のシステムで動いているので、PHP5に置き換えられない。

PHP4とPHP5の同居が必要なのと、Apacheでモジュールを組み込むにしても、mod_phpは4と5を同時に組み込む事ができないので、それぞれを組み込んだApacheを動かす必要がある。

通常動かしているApacheとは別にもう1個別portで動かして、特定のURL以下をreverse proxyで置き換えなんてトリッキーなやり方で動作環境は確保した。

で、Progress barのソースサンプルを入手して実装しようとしたのだが、非常に難解な組み方をしていて、「何かあるな」という感じはしていたのだが、別に気にせず、原理を理解して、Ajaxのprototype.jsを使ってコードを書いた。

しかし、safariでテストした時、全然動かない。
非同期通信で呼ばれるPHPスクリプトのアクセスログが発生せず、Progress barを表示するページで、formにAjax.requestの処理の入った関数が呼ばれているかを吐き出すようにしてみると、ちゃんと呼ばれている。

しかし、Ajax.requestの行だけ、全く無視された状態になっていた。サンプルだと動く。サンプルは、ページ遷移しないか、一部が遷移するようになっていて、非同期通信でAPCの情報を取得しているのは、遷移しない部分…。

ここで、サンプルがなぜ難解な方法で組まれているのか全てを理解した。
APCの情報を取るのに、一部のブラウザではページ遷移が起こる場合、Ajax.requestなどの非同期通信のjavascriptコードが一切動かなくなるのだ。

根本的に構造の見直しが必要で、ほとんど一から作り直し(笑)

まあ、なんとかでっち上げつつあるが、今はIE6で後方互換モードでないと表示しないとかしょうもないブラウザのバグの対処に当たっている。

暫く、SI業から遠ざかっていたから動向を良く知らなかったが、Microsoftは相変わらず、世間に迷惑をかける実装を続けていたのか。実にMicrosoftらしいと感心する事しきり(笑)。

Cyrus IMAPd

業務でCyrus IMAPdなんかと戯れている。

社内の業務で使っているExchange Serverが、お客さんのメールをバシバシBadMailに落とし、届かないという由々しき事態となっているので、捨てようという話で(笑)、代替環境を試験している。

しかし、pop3コネクタかExchange Serverの挙動は非常におかしい。

MIMEエンコードしてあるメールアドレスの名前部分をデコードしてから、メールアドレスとして正しいかを評価し、RFC違反だとしてBadMailフォルダに叩き落してくれる。しかも、それがpostmasterには通知されない。

喩えば、「(株)会社名<hoge@fuga.co.jp>」みたいなので、()内はメールアドレスではコメント扱いだが、( だけが削除されて、複数の変なアドレスに変換される。

これは、Outlookも変な仕様を継承していて、宛先などの行頭に ( が入っていると勝手に削除する。

()を全角にすり替えてやると通るのだろうが、そもそもSMTPでRFC違反にならないように、わざわざMIMEエンコードしているものを、なんでデコードした上に正しくないアドレスを創作して、評価するんだ?

「ユーザーは馬鹿だから、かしこいマイクロソフトが正しいRFCに準拠したアドレスに修正して、メールが不達になる最悪の事態を防ぎます」とでも言いたそうだな。

実際は、その蛇足のせいで、届いて当たり前のメールが届かなくなっているんだが、一体何を考えとるんだ?

MIMEデコードしているのは、恐らく、サーバーサイドのメールの振り分けの為だろうが、MIMEデコード前にメールアドレスが正しいのかをチェックして、それからMIMEデコードだろう。何でこんなクソな実装ができるのか理解に苦しむ…。

Cyrus IMAPdはさすがに軽くてパフォーマンスは良い感じ。しかし、sendmail、procmailと連携させるのに色々と調べないといけなかった。

古いドキュメントを見ると、色々と設定しなくてはいけないのだが、新しいsendmailになると、cyrus imapdとの連携が出来るようになっていて、sendmail.mcに2行書いて終わりとか簡単になっている。

procmailと連携させる場合だと、sendmail.mcはいじる必要が無く、/etc/procmailrcを作成すれば良いのだが、cyrus imapにメールを渡す時にヘッダ部にFrom: 以外のFromがあるとダメなので、formailで削除しておくとか、殆ど検索しても出てこないようなマイナーな設定をやらないといけないから苦労した。

余りコードをゴリゴリ書くような事は無く、殆ど設定弄って環境構築するシステムインテグレーションだから、楽でいいなあ。

転職

今日は転職先へ初出社。

会社説明、新入社員教育、入社手続き書類受け取り、一部提出といった具合。
提出すべき書類のチェックリストも渡され、やっぱり普通以上の会社は違うと感心した。

当たり前と言えば当たり前なのだが、前の会社が余りにも杜撰でいい加減過ぎで、段取りが悪かったから、普通の事だって感動してしまう。

入社はわしだけかと思いきや他に2名。あと、入社時に研修に参加していなかったという人が3名居て、計6名で研修というか訓示みたいなのを受けた。

わしの配属先は企画開発室。
部門としては、商品開発部門なのだが、わしの仕事は社内インフラ整備など、会社の業務効率化を行う事がメインとなる。

いわゆる社内ツール整備といった仕事となるが、平均年齢が若い会社だけあって、既に色々と面白い事をやっていて、楽しませてくれそうだ。