何だかよく分からない

あるプロジェクトで、ハード担当が全くハード選定をやらないので、わしはPCとlinuxを使って、ソフト実験環境を作ってしまっているのだが、時折、「こんなんできました」みたいなメールを送っている。

それについて、ハード担当が、メールで返事を返して来て、「ネットワークについてはよく分からないから教えて欲しい」などと言ってきた。

しかし、具体的に何が分からないのかも書いておらず、そもそも何が分からないのかすらさっぱり分からない。

わしのやってる事は、socketオープンして、サーバのapacheにコネクション張って、

GET /test.php?param=1234

みたいな文字列を送出して、apacheが応答して来た文字列をsscanf()で読み取ってるだけだ。

一言で言えば、「HTTPで通信しています」で終了。

別に秘密の独自プロトコルを使ってる訳でもないし、HTTPの仕様なんて全世界に公開されてるし、解説してある文献も腐るほどある。

そもそもこういうソフトウエアのアプリケーションレヴェルの話は、プロジェクト的には、ソフト担当のわしが握る事になるから、ハード担当が気にしたってしょうがない話だが、知りたがる理由がそもそも不明だ。

下衆の勘繰りで考えると、このネタを別の案件で使いたいのか?と思ったりするのだが、さすがにこの辺の話は、「スクリプトをパクって自分のホームページに組み込んだら、よく分からないけど何とかなった」というレヴェルの話じゃない。

強いて解決法を挙げると、

プログラミング言語Cとか、Linuxの本とか、マスタリングTCP/IPとか、そういう本を全部読んで理解した上で質問して来てくれという感じ。

もっとも、これだけの本を読んで理解できているなら、「HTTPで通信しています」で分かるはずだから、質問すらして来ないだろうけど。

あと、こういう事も書いてあった。
「また、自分のWEBサーバー上でデータベースMYSQL等の操作も、実験していますが、良く理解できていません」

知らんがな(´・ω・`)

けっ

試用期間終了後も見直し無しだとよ

上司は、ボーナスで考慮して貰えるように働きかけるとか言ってたが、どうせ空手形だし、ボーナスと基本給じゃ全然違うし、職安の求人広告の最低賃金より安く買い叩かれた事は、一生忘れないよ 🙂

Cyrus IMAPd監視ツール

社内メールサーバに障害が起こっていたが、Cyrus IMAPdのDBのログのownerがrootになっていて書けないという原因だった。

/etc/init.d/cyrus-imapd stop
chown cyrus.imap /var/lib/imap/db/*
/etc/init.d/cyrus-imapd start

とやって、 再びstartさせたら治ったが、ログを見る限りでは、DBのログローテーションタイミングで、ctl_cyrusdbが新たに作成したログへの書き込みに失敗しているという感じ。

Web検索すると、Macの事例がちょこっと読めたりするのだが、英語のメーリングリストまで当たってみても、具体的にどういう対策を採れば解決するのかという情報は皆無で、バージョンは今2.2.12だが、2.3.xに上げたとしても直る保証がない。

何しろ、DBのログローテーションのタイミングで起こるので、よっぽど大量のメールを処理してても滅多に起こるものでもない。しかし、休日に呼び出されるのも嫌なので、ログを監視して自動復旧するツールを作った。

昔、perlでpppのログ監視して、pppが切断されたら再upとか、PCMCIAのAirH”カードを再初期化するツールを作っていたので、その応用で、maillogを監視し、ctl_cyrusdb\[\d+\]:.*DBERROR.*Permission denied ってのに反応するようにした。

Cyrus のdeliverはIMAPdでスプールできないと/var/spool/mailに落としてくれるので、

formail -d -s sendmail hoge</var/spool/mail/hoge

とかやると、落っことしたメールを再配送できる。

監視ツールでは、この再配送までを自動でやるようにしてはいるが、実際に障害が起こらないとうまく動くかは分からないんだなこれが(笑)

部門紹介

新入社員に部門紹介という事で狩り出された。
3/21に発足した部門で、 実働2週間ちょっとの実績ゼロの部門で一体何を語れというのやら…。

まあ、適当に握っておいたが、部門には2名しか居なくて、おまけに肩書きのある人が公式には存在しないという謎の組織だ。

組織というのは、責任者を立てて、そこへ権限委譲して、その上位の者は責任者を管理してピラミッド構造のヒエラルキーを構築するってのがセオリーだが、 責任者が明確になっておらず、指揮系統が明確ではないというのは、非常にやり辛い。

例えば、別部門から仕事の依頼などがあれば、常識で言えば、わしのような下っ端は「私の一存では決められませんので、上長の許可を得てください」と言うのが鉄則だ。

どこぞの新入社員教育だったかで、「たとえ社長が業務を命令したとしても、所属上長の許可無く仕事を受けてはいけません。必ず『上長を通してください』と言うようにしましょう。」と習った。

所謂、「頭越し」をしてはいけないという事だが、これは、通常、部門責任者が部下の業務遂行進捗管理をやっているから、部門責任者の知らぬ所で、部下が勝手に仕事を受けて、予定していた業務が計画通りに進まない等という事態が起こらないように、この鉄則は存在する。

しかし、今は「わしの上長は誰?」みたいな感じで、非常に落ち着かない状態だ。
それよりも、今月の20日で入社6ヶ月になるが、まだ仮採用の身分なのがなんだかなあって感じだな。

ツール作り

Cyrus IMAPdと腐れExchange Serverのメールをバックアップアカウントへ合成コピーした時に、腐れExchange Serverのメールがダブるので、それを消すツールを作った。

こういうちょいとしたツール作りは楽しい:-)

まあ、普通のまともなメールサーバーなら、Message IDが同じだとメールの同一性は保証されていて、Cyrus IMAPdへスプールしてもインテリジェントにduplicate markを付けて、冗長な同じメールは実データとして格納しないはずだ。

しかし、腐れExchange ServerとOutlookは意味の無いReceivedヘッダをわざわざ追加し、winmail.datとかいう何の役にも立たないゴミを付加してくれるので、さすがのCyrus IMAPdも別のメールとしか見てくれないようだ。

「簡単」と素人を騙して売りつけ、実は制御不能の腐れExchange Serverなんぞ相手にしていなければ、作る必要の無いツールな訳だが、まあ、問題解決のプロセスを考えるのが面白いからよかろう。

で、最初、PHPで組んだ時に、UIDがキーの連想配列にMessage IDを格納して、array_unique()という簡単な処理で、ダブってないMessage IDのリストが作れ、array_diffで、削除すべきメールのリストがすぐ作れた。

だが、盲点は、消されるのはダブっているメールの一方であって、必ずしも腐れExchange Serverのゴミメールじゃないという事だ。

そこで、imap_fetch_overview()で取得したサイズも配列に格納し、array_multisort()で、UID、Message ID、Sizeのそれぞれの配列をソートする。

すると、リストで、ダブっているMessage IDのトップは必ずサイズの小さいものとなり、array_unique()で生き残るのは一番最初に見つかったものなので、サイズの大きいメールが駆逐されるというアルゴリズムにした。

これで完璧だ:-D

しかし、マイクロソフトのもたらす後戻り工数って、全世界規模だとどれくらいの損害額なんだろうなあ。

退化

ファイルアップロードスクリプトが正常に動いているか、時折、ログを観察しているのだが、以前、ファイルの二重送信が原因と思っていたログパターンがまた現れた。

以前は、そのログを見て、送信ボタンの二度押しでの二重送信はJavaScriptで封じたのだが、また起こったという事は別の要因がある。

サーバログを見ると、400 BadRequestになっていた。
うーむ…、cookie関係か?二重送信っぽいので、ブラウザ2つ開いて、それぞれで送信したらどうなるんだろ?と、試験してみるとアウト!

そう言えば、セッション名は特段設定してないので、2つのブラウザで送信したら、片方が完了した時点でセッション変数は全滅するな(笑)。

という事で、セッション名を設定する事で、ブラウザ何個開いて送信しようが大丈夫になった。しかし、cookieファイルが増大していく…

cookieファイルを期限切れで破棄にするには、「アップロードが成功しました」と表示するスクリプトのヘッダ部分で、Set-Cookieを設定してブラウザに食わせてやらねばならない。

しかし、元々のあったものが、cookieの明示的な削除をして無くて、複数セッション利用時の事も全く考慮されておらず、セッション破棄の前に、色々とHTMLを表示してしまっている。

その為、いざ、cookieファイルを消そうとすると、パラメータの渡し方からロジックを洗い直さなければならず、構造からやり直しという事になる(–;

しかし、昔のわしなら、お客様の使用法を想定して、ブラウザを複数開いてファイル送信なんて事は事前に思いついたのだが、問題が起こるまで分からんというのは退化してきたのかのう。

まあ、言い訳をさせて貰うと、すでに運用されているスクリプトで、そういう事態が今まで問題に成らなかった訳が無いという思い込みがあったな。

メールゴミ箱

Exchange+Outlookで、他人がメール送信に失敗した時に、わしのマシンを踏み台にしようとする件だが、メールゴミ箱を作った。

ArGo Softwareのフリーのメールサーバで、こいつのリレーをONにしつつ、ウィルスバスターのパーソナルファイヤウォールで、ポート25の送信を禁止しておく。そうするとOutlookがわしのマシンを踏み台送信に使おうとしても、ローカルのメールサーバに投げて、そこでbounce mailでドロップされて終了。

これでお客様に何通も同じメールを送りつける内の一通は減らす事ができた訳だが、他にも同じ対策をするか微妙だな。何せ、今までLinuxのサーバにメールを投げていた時は全く何の問題も無かった訳だし、Exchange+Outlookだけが「送信したメールが届かない」等の不具合がある。

全て踏み台送信対策をした場合、送信メールが届かないという事例が多発するだろう。 Exchange+Outlookってつくづくどうしようも無いクソだなあ。早く捨てたいのう…。

踏み台送信に使われているであろうと思っていたRemoteProcefureCallについて余りよく調べられていないのだが、踏み台送信にはUDPだけでも無いようだ。OutlookはExchangeアカウントを設定すると、Exchangeの送信トレイを使うように強制されてしまうが、その送信トレイが関係している気がするな。

まあ、こんなMicrosoftのしょうもない製品に時間を取られるのもバカバカしいから、詳しい検証はしていないが、アカウント共有で複数人が同じ送信トレイを使うのは、プログラマの勘で止めておいた方が良い気がするな。

Exchangeで各自にアカウントを作り、public folderを使うというのなら、何通も同じメールを相手に送信するという馬鹿げた現象が無くなる気がするが、どうせ、この一言を言ったところで、誰もやらないだろうし、やるとなると全てわしがやらされるハメになるから言わない(^^:

Google Chrome

今更だが、ブラウザのテストに使用。
ファイル送信時にプログレスバーを表示するPHPスクリプトのテストを行った
ファイル送信でサイズオーバー検出にJavaScriptの非同期通信部を利用しているのだが、応答が帰ってくるのに5分以上もかかる。

safariも含む他のブラウザだと、すぐに応答が返ってきて、送信ファイルサイズオーバーを警告できるのだが、Chromeはこの非同期通信で送信ファイル情報がなかなか得られない。

数メガのファイルでも、大抵、最初の数秒間は情報が取得できずエラーとなる。
JavaScriptのエンジンは速いのかもしれないが、htmlエンジンはsafariをベースとしているので、それとの組み合わせで、うまくいってない部分があるみたいな気がする。

元々、safari自体が、PHPのAPCと相性があまりよろしくなく、ブラウザの戻るボタンで戻って、ファイル送信すると、APCの情報が一切取れないというのがあり、Chromeはそれに更に輪をかけて相性がよろしくない。

詳しく検証はしていないが、APCは、動作がフォームの値の順番に依存するので、ブラウザが順番が変えたりすると、期待した動作にならない事があるので、それが原因か?と思ったりする。

しかし、昔と違って、今時のブラウザはどれも長いJavaScript書いても落ち難くなったなあ。

明日は我が身か…

なんか、わしより少し後に入った人が月末で辞めるとか。

「試用期間終了」という事らしいのだが、やけにあっさりと切られるんだなあ…。
わしもまだ試用期間中だから、対岸の火事という訳にもいかぬ。

入った時に試用期間は「6ヶ月」と言われたが、周りでは「それは間違いだ。3ヶ月だ」なんて話も聞こえてくる。

3ヶ月ならとうに過ぎてるから、今月末までに辞令があるか、話があれば試用期間は3ヶ月だったという事だが、そのままだったら、6ヶ月の方が正しかったという事だな。

しかし、不安定な身分というのも落ち着かんのう。

インターネット接続共有にハメられる

会社で急にDNSが引けなくなるという現象が出た。

とりあえず、ネットワークアダプタの「修復」ボタンを押すと治るのだが、暫くするとまたDNSが引けなくなる。

ルータのDNS機能が悪いのか原因が良く分からない。

Wiresharkを入れてパケットダンプして眺めていると、ルータを差し置いて「俺がルータだ。俺がDNSだ」と喚いているヤツを発見。

で、結局、そのマシンでインターネット接続共有がONになっていたせいだった。

Windowsでインターネット接続共有をONにすると、パソコンがルータのようになるのは知っていたが、DHCPdまでやらかしてくれるとは思って無かった。

確かに家庭内で分かっててやるなら問題無いが、そういうマシンを企業のLANに繋がれてしまうと、配下のマシンを増やそうとしやがるから鬱陶しい。

しかし、今時、パソコンでpppoeで接続してる環境なんてあるのかねえ?
大抵はブロードバンドルータだから、こんな機能は要らないと思うのだが…。

例によって、何でMicrosoftはこういう問題の多い実装をやらかすのか、理解に苦しむ。基本姿勢が「人に迷惑をかけても使ってる人は便利だからいいじゃん」とかいう感じで実装してやがるから、大層ムカつくのでございます。

しかし、こういうMicrosoftの下種な実装で余計なトラブルを増やしてくれるおかげで、わしの様な者が職にあぶれずに済むんだけどね:-)