2011/07/04

PHPでpost_max_size以上のデータを投げても何とかハンドリングしたい

最近phpコードを書いているんですが、post_max_size以上のデータを受け取ると

PHP Warning: POST Content-Length of 9456137 bytes exceeds the limit of 8388608 bytes in Unknown on line 0

なんてエラーを吐いてくれてエラーチェックができないんです。
対策はいくつか考えたんですが、
apacheのLimitRequestBodyを使う
コンテンツを配置するたびにapacheの設定を書くのが面倒だし確実に忘れる。AllowOverrideも環境依存だし。。
javascriptで制御
所詮クライアントサイドの気休めでしかないので信頼性低い。
MAX_UPLOAD_SIZEをhiddenで埋め込む
これも気休め。
と、どれもイマイチ決定打に欠けます。

実際にpost_max_size以上のデータを受け取ったとき、$_POSTのデータが破壊されるのか変数として提供することをあきらめるのかはわかりませんが、$_POSTの中身が空になるので、これを検知しちゃえばいいんじゃね?
ということで、意図的にエラーを発生させて観察してみました。その結果、post_max_size以上のデータを受け取ると、$_POST、$_FILESの両方とも、isset()にかけるとtrueが返されますがcount()で見ると空っぽなんですね。
これを受けて、下記のようなコードで逃げてみました。

// max_post_size越えのデータを受信した場合の対策
if(count($_POST) == 0 && count($_FILES) == 0)
{
死に際のエラー処理
exit();
}

本来はPHP側が正しくハンドリングしてくれればいいんですが、どうもこの辺のチェックが甘いようで、逃げの手法だということは知りつつもこの方法で決定。期待した動作になりました。

ちなみに、cent5系でふつうにインストールされるrpmなphpです。

# php -v
PHP 5.1.6 (cli) (built: Mar 31 2010 02:44:37)
Copyright (c) 1997-2006 The PHP Group
Zend Engine v2.1.0, Copyright (c) 1998-2006 Zend Technologies

2011/03/30

iTunesの"牛丼肉抜き"

(複数所有している)どのパソコンでもiPhoneは認識させたいけど、iTunesのデータは特定のマシンにしか入れていない方へ。
iTunesデータを持たせていないPCでiPhoneを充電したりすると、期待もしてないiTunesが上がってきたりしてジャマだったりしませんか?
人のiPhoneを挿したら同期が始まって慌てて止めてたりしませんか?

そんな時におススメなのが「iTunesの"牛丼肉抜き"」。
「ドライバやbonjourは入ってるけどiTunesは入ってない」状態を作ることで、iPhoneとして認識はするけどiTunesに反応しないPCにすることができます。
やりかたは簡単。
一度iTunesをインストールした後で、「iTunesだけをアンインストール」するんです。

iTunesをインストールすると、下記のものがまとめてインストールされます。
・Apple Application Support
・Apple Mobile Device Support
・Apple Software Update
・Bonjour
・iTunes
・QuickTime
なので、ここから「iTunes」だけをアンインストールすると、他のパッケージが残るというカラクリ。

Apple Mobile Device Supportは、iPhoneを使う時のWindows向けドライバを持っているので、本当に最小であればそれだけ残して後は削除、というのもありですが、自分のパソコンでは上記からiTunesを抜いただけになっています。

あ、共有パソコンだと肉抜きは難しいかもしれませんね。

2011/01/15

Intel Active Management Technologyを使ってみた

kvmの実験用に購入したIntelのDQ45CBですが、搭載されているQ45チップセットがvProに対応しています。このvProを使用することで、外出先からパソコンの電源制御やBIOS操作ができるとあるので、試してみることにしました。
今回試すのは、Intel Management Engineを設定し、外部から電源制御を行えるようにすることです。


では、まずハードウェア側の準備から始めましょう。やることは下記の3つです。
(1)Management Engineを有効にする(現在の設定が無効になっている場合)
(2)パスワードの設定
初期パスワードが設定されていますが、初期パスワードはみんな書くのを遠慮しているので、自分で調べるか知っている人(最終的にはIntelの人?)に聞いてみて下さい。ちなみに、今回は自分自身で調べてみました。調べると出てくるものです。また、パスワードの強度についてですが、(1)英字/数字/記号を含む、(2)8文字以上であること、が条件なので、忘れないようにしましょうね!
(3)ネットワーク設定
DHCPのままでも後で見つけられるのですが、安定的な管理のためには固定IPにした方が良いでしょう。あと、外部から接続するときのためにゲートウェイは忘れずに! LAN内からしか繋がないのなら、少し歩いて自分で電源ボタン押しにいけばいいでしょ(ぉ
(4)その他の設定
ある場合とない場合があるので、都度説明します。

では具体的な手順についてです。

F2を押してBIOSに入り、メニューから「Intel(R) ME」を選択しましょう。
設定画面に入るときにパスワードを設定します。
パスワードの設定が終わると、メニューに入れるようになります。

続いて、「Intel(R) Active Management Technology Configuration」のメニューからネットワークを設定します。
追加の設定ですが、プロビジョニングの設定を行いましょう。
同じ階層に「Provisioning Configuration」というメニューがあります。
「Enterprise」となっているところを、「Small-Medium Business」に変えておきます。
この状態でBIOSを保存しましょう。

ここまでできたら、ハードウェア側の準備は完了です。
あとのお楽しみのために、一度電源を落としておきましょう。

続いて、Intel AMT Developer Tool Kitを以下のURLからダウンロードします。

Download the latest version of Manageability Developer Tool Kit
http://software.intel.com/en-us/articles/download-the-latest-version-of-manageability-developer-tool-kit

ダウンロードしたMSIをインストールすると、下記の3つのプログラムが入ります。
・Manageability Commader Tool
・Manageability Connector Tool
・Manageability Outpost Tool
ここでは、このうち"Manageability Commader Tool"というプログラムを利用します。


で、起動したのがこの画面。


さっき登録したIPアドレスとパスワードを利用して、このツールに登録します。
IPアドレスをDHCPで取得させる場合は接続先IPが分からないので、DHCPのスコープを入力してStartを押しましょう。
たぶん出てきます(笑)


追加が完了したら、左ペインに現れたマシンをクリックすると、右ペインが「Connect & Control」というウィンドウに変わります。
さっそく接続してみましょう。Connectボタンを押してみます。


つながったよ兄さん!!


さっそくツリーの中を見てみます。資産情報からハードウェア情報までちゃんと見えてます。


さて、今回のお目当て、リモート制御機能です。
タブを「Remote Control」に切り替えます。


そこに現れた「Take Control」というボタンを押すと、Serial Over LANで画面制御ができるようになります。
画面を良くみると、「IDE Redirect」という項目が表示されており、その脇にイメージファイルが指定されていることから、
うまく使えばリモートでのインストールだってできそうですね。


とりあえず立ち上げてみましょう。
「Remote Command」のメニューから「Remote Reboot to BIOS Setup」を選んでみます。
なぜ普通に起動しないかって?そりゃ一番分かりやすいからですよ(笑)
右上に表示されていた状態がSoft off(S5)からFull Power(S0)に変わり、しばらく待つとちゃんとBIOSの画面になりました。
Serial over LANなので、画面レンダリングが昔のパソコン通信を見ているようです。

外出先から自宅にVPNが張れれば、あとはほぼ思いのままです。