2018年11月 : してログ

複数の条件で処理を分けたい場合は、「if ~ else if ~」といった繰り返しでコードを記述すると思いますが、条件式の開始位置が合わず、どうやっても美しいとは言えないコードになります。同じような条件分岐に、「switch ~ case」文もありますがこちらを多少トリッキーな書き方をすることで、見やすいコードにすることができます。

if ~ else if で記述した場合

if ($val1==1) {
	$color = 'red';
} else if ($val2==1) {
	$color = 'orange';
} else if ($val3==1) {
	$color = 'yellow';
} else if ($val4==1) {
	$color = 'purple';
} else {
	$color = 'default';
}

switch (true) ~ case で記述した場合

switch (true) {

case $val1==1:
	$color = 'red';
	break;

case $val2==1:
	$color = 'orange';
	break;

case $val3==1:
	$color = 'yellow';
	break;

case $val4==1:
	$color = 'purple';
	break;

default:
	$color = 'default';

}

このように通常は変数を記述する部分に true と入れることで、各 case 文に条件式を記述することができます。人によっては break 文が余計で嫌とか思うかも知れませんが、条件式の開始桁が揃って見やすくなるので、直観的には分かりやすい書き方だと思います。

Unicode(UTF-8)を採用しているサイトで、これらの文字が小さく(半角サイズで)表示されてしまう場合があります。ブラウザがこれらの記号が表示される際、小さく表示される欧文フォントが選択されてしまうために起こります。いくつか対応方法がありますが、CSS で font-family を固定してしまうのがベストだと思います。

日本語フォントを指定した場合

日本語フォントを指定すると「○×□」は正しい幅で表示されます
<div style='font-family:"MS ゴシック"'>○×□</div>

欧文フォントを指定した場合

欧文フォントを指定すると「○×□」は半角の幅で表示されます
<div style='font-family:"Arial"'>○×□</div>

以前の私は「font-family: monospace」を指定していましたが、これだとブラウザに依存してしまうのでお勧めしません。ブラウザのデフォルト設定に依存しないよう、しっかりフォントを固定しておくことをお勧めします。また例では「MS ゴシック」のみですが、Windows でも MacOS でも大丈夫なように複数の日本語フォントを指定するのが良いと思います。

ようはブラウザのデフォルト設定で、欧文フォントが日本語フォントより優先されているため、Unicode で表示可能な記号が欧文フォントで描画されてしまうということでしょう。Unicode だと欧文フォントでも表示可能な記号としてマップされているのだと思います。ただ、欧文と日本語でフォントを分けたい場合は対応できませんが、個人的には同じフォントで描画した方が好きなので問題ありません。

今ではすっかり廃れた感のある SOAP だが、久しぶり(というか PHP では初)に作成する機会があり、やっぱり苦労の連続になりました。XML 地獄という言葉もあるらしいが、しっかりと設計されておらず名前空間が入り乱れてるような複雑な XML は、もはやいじめでしかないように思う。せめて、stdClass や SimpleXML で軽くアクセスできるようなレベルに留めてもらいたいものである。

今回悩んだのは、あるメソッドに XML 文書をポストしてくる仕様で、受け取った時点で stdClass にパースされてしまっているというもの。その XML がシンプルな要素のみで構成されているなら、むしろ簡単にアクセスできるのでいいのだが、前述したような名前空間が入り乱れ、同じ要素名で属性が違うとかいうものがあると対応できない。stdClass では、名前空間プレフィクスは消えるし、属性にはアクセスできないためである。それであれば、プレーンテキストで受け取れれば簡単に解決できるのにどうしても出来ない。そもそもデフォルトでオブジェクトにするのなら DOMDocument じゃないのかなあ?

という訳で、PHP の SOAP エクステンションじゃあどうにもならないので、裏技的な手法で生の XML を取得することができたので紹介します。SOAP のリクエストは POST で来ますので、その生データを横取りする方法です。

$soapxml = file_get_contents('php://input');

注意点としては、返ってくるのは SOAP エンベロープにラップされた XML になるので、適切に抜き出す必要があるということ。具体的には、DOMDocument に変換してルート要素を抜き出して saveXML すれば良いです。他にスマートな方法があるかも知れませんが、とりあえずこれでうまく行っています。

以前から気になっていたのですが、TS ファイルを大量に含むフォルダをエクスプローラで開いたときに、異常なハードディスクのアクセスが発生しフリーズしてしまうことが多々ありました。「グァーーーゴゴゴゴゴ」とシーク音が酷く鳴るのでハードディスクの故障かと疑いました、それ以外はまったく問題ありません。なんとなく、プレビューでファイルを読みにいってるときに不具合があるんだろうなと察しは付いていて、縮小アイコンが表示される前にすばやく一覧表示にするなどしてしのいでいました。

しかし、どうしても開けないフォルダーが出てきて、重い腰をあげて調べなおしてみることにしました。いろいろ試してみて、ハードディスクの問題では無いのは分かりました。ネットで探そうにも検索キーワードが見えなくて紋々としていましたが、「Windows TSファイル フリーズ」これで答えが出てきました。

これによると、動画ファイルの再生時間などのプロパティを読み込んでエクスプローラで表示するような機能があり、これがうまく行かないようです。そう言えば、エクスプローラの詳細表示で「長さ」の列が表示されていないファイルがあったと思います。

具体的な方法は次の2ステップになります。

  • ShellExView このツールをインストールします
  • "MF MPEG Property Handler" という項目を探し、Disabled = yes に変更します

結果は見事解決です。恐らくはムダなシークをするようなプログラムを組んでいて、小さい動画の場合は顕著に表れないとかそんな感じなのでしょう。TS ファイルだと数十ギガバイトにもなるので膨大でムダなシークをしてるんだろうね。なんか最近の Windows ってこんなんばっかだなあ。