2013年3月18日月曜日

php5でのexecとstderr

stderrをstdoutにリダイレクトする事で、stderrが用意されないIIS6で落ちるのを防ぐことができます。

exec("pdftk.exe 2>&1", $output, $retval);

問題点:stderrとstdoutの区別が付かなくなってしまいます。エラー表示(stderr)なのか、情報(stdout)なのか。
 
proc_openを使うと、個別に対応可能ですが、手間です。
 
成功・失敗だけを見たいのであれば、$retvalを見れば十分な場合も多いです。
 
良識的なコマンドラインツールは、次のような$retvalを返すように考えられ作られています。
0 = 成功
0 以外 = 失敗 (正だけではなく、負の場合も有るので注意が必要。アクセス違反を意味する 0xC0000005 つまり -1073741819 等。)
 
そういう場合ではstderrをstdoutに結合する方法も有効と思います。

2013年3月16日土曜日

IIS6にはstderrが無い?

Webサーバ上でコマンドラインアプリを動かすことは良くある事と思います。

正常に動作し、エラーが出なければ何も問題無いのですが、エラーが起こったらstderrに詳細を流す事が多いです。

Apacheではstderrに流されても平気ないのですが、

IIS6だと、アプリが強制終了になる事を確認しています…

多分stderrが未定義なんじゃないかと思います。

CGIはstdinやstdoutや環境変数で子プロセスとやり取りすると思うのですが、

ISAPIはDLLであり、WebサーバとはAPI呼び出しで結合していますから… stdin/stdout/stderrを使っていない・存在しない。

子プロセスを開く際に、stderrへの出力を補足(リダイレクション)し、そのまま捨てるか、どこかに放流する必要が有ります。

2013年3月15日金曜日

Softbank 103P アドレス帳(VCF)の一括書き出し・取り込み手順

本体→microSD
  • ツール
  • SDバックアップ
  • データ参照
  • 1 電話帳
  • [メニュー]
  • 5 microSDへコピー
  • 暗証番号入力
  • 全件microSDへコピーしますか? YES

microSD、保存先と思われるファイルパス
D:\PRIVATE\MYFOLDER\Utility\Contacts\Contacts.BCK\XXXXXX00.VCF

出力例:
BEGIN:VCARD
VERSION:2.1
N;CHARSET=SHIFT_JIS:枚岡合金工具;株式会社;;;
SOUND;X-IRMC-N;CHARSET=SHIFT_JIS:ヒラオカゴウキンコウグ;カブシキガイシャ;;;
TEL;CELL:0667582001
EMAIL;WORK:info@sg-loy.co.jp
ADR;CHARSET=SHIFT_JIS;ENCODING=QUOTED-PRINTABLE;WORK:;;2-7-22;=91=E5=8D=E3=
=8Es=90=B6=96=EC=8B=E6=92F=92=86;=91=E5=8D=E3=95{;544-0013;=93=FA=96{
NOTE;CHARSET=SHIFT_JIS;ENCODING=QUOTED-PRINTABLE:=83=81=83=82
X-NO:10
X-CLASS:PUBLIC
END:VCARD

microSD→本体
  • ツール
  • SDバックアップ
  • データ参照
  • 電話帳
  • ファイル選択。例:XXXXXX00
  • [メニュー]
  • 4 全件本体へ上書きコピー
  • 端末暗証番号入力
  • 全件本体へコピーしますか? YES
  • 本体の登録内容が削除されます よろしいですか? YES