PHP5.3で#は非推奨(いまさら)

特に変更を加えていない処理を通るテストをしていると、
Deprecated: Comments starting with '#' are deprecated
と大量の非推奨メッセージが。
どうやらPHP5.3から#のコメントは非推奨になったとのことで、そのエラーが出ていたようです。

ちょっと前に、Yahoo!ウォレット実装のために5.3に上げたのが原因でしょう。
そういえば、まだ審査結果が来ないのですが。

通常のスクリプトには#は使わないのですが、iniファイルでは普通に使っていました。
perlと共用できる利点があったのですが、これで分けないといけなくなったのはちょっと残念です。

結局はテーブルに戻る?

HTML5のタグのお話です。
ちょっと前にも書きましたが、「表ではない」ものにtableを使わないように調整しているわけです。
しかし「表ではない」ものが何かという定義もあいまいなままですね。
表(table)の1行(row)を抜き出して、同じ構図のまま表示する場合は表とする。
表(table)の1行(row)を抜き出して、構造を変えて表示する場合はすでに表ではないとします。
つまり、横に長いrowを詳細表示するために縦方向に書きなおす場合は、表としての構造を成さなくなりtableは使えなくなります。
rowは結果的にcolumn(cell)の箇条書きになるので、ulタグ一択になると考えます。
ただし、九九表のように縦も横も同じ内容の場合は表だと仮定できます。
とまぁ、ややこしいのでタイミングによっては微妙に解釈を変えるかもしれませんが。

試行錯誤したのですが、結局はdisplayプロパティのtable、table-row、table-cellに回帰せざるを得ませんでした。


ul.table {
display: table;
}
ul.table li {
display: table-row;
}
ul.table li>* {
display: table-cell;
}

表ではないのにrowspan、colspanを必要なら、構造を再検討するということにしています。
これで落ち着くのかな?

HTMLにおけるテーブルレイアウトの苦悶

HTMLにおいて、テーブルレイアウトは使用すべきではない。
はいそうですかと、表ではないコンテンツをtableからulに変更するものの、
スタイルシートでは結局display:tableを使用することになる。
float:leftdisplay:inline-blockを駆使しても、
縦方向のデザインに問題が生じる。
tableタグへいかに似せるかに労力を割くこの現状は果たして是か非か。

TCPDFで縦書きテキストをフォント埋め込みに対応させる

TCPDFで縦書きを実現するには、フォント設定ファイルの書き換えで実現するのが一般的です。
※ IPA明朝の場合

$type = 'cidfont0';
$dw = 1000;
$enc = 'UniJIS-UFT16-V';
$diff='';
//$file='ipam.z';
//$ctg='ipam.ctg.z';
$cidinfo=array('Registry'=>'Adobe', 'Ordering'=>'Japan1','Supplement'=>5);
include(dirname(__FILE__).'/uni2cid_aj16.php');

この方法ではAdobe ReaderまたはAdobe Acrobatでは、PostScriptで印刷ができません。
「文章を印刷できません。」
「印刷するページが選択されていません。」
と表示されて出力できません。
画像として印刷することはできますが、今一つな感じです。
Illustratorに読み込ませればアウトライン化されるので印刷に使用できるようになりますが、
ページが複数ある場合は現実的ではありません。

ちなみに、「Foxit」ではPostScriptのままで出力できるので、こちらを使用するのも手です。

要は、TCPDFで縦書きテキストを生成する際に指定するCIDフォントは非埋め込みであり、
これがPostScriptで印刷する場合に問題となるというわけです。
では、埋め込んで縦書きを実現してみる方法を探してみましょう。

まず、TCPDFの標準エンコードは「Identity-H」です。
この形式でないとフォントを埋め込めないというか、フォント埋め込み用の独自エンコードかもしれません。
PostScriptを弄っている人なら、末尾の「-H」が気になりますね。
これを変更するには、本体の「tcpdf.php」ファイルを書き換える必要があります。
メソッド「AddFont」に

} elseif ($type == 'TrueTypeUnicode') {
$enc = 'Identity-H';

というコードがあるので、「’Identity-V’」に書き換えてみましょう。
すると、なんということでしょう。
テキストが縦書きになりました。
もちろん、フォント設定ファイルは何も弄りません。
ただし、フォントは埋め込みの状態にしておきます。
非埋め込みでは化けます。

しかしよく見ると括弧やハイフンなどが横書き用のままです。
CIDフォントでは「uni2cid_aj16.php」をincludeすることでマッピングを変更しているのですが、
Identityでマッピングをしているところがまだよくわかりません。
おそらく、これを調整でいれば完全な縦書きを実現できるはずです。

もし参考頂き、対応方法を見つけられましたらご一報いただければ幸いです。
また、余裕があれば調査します。

スタイルシートのfloatが使いこなせない

回り込みを指定するfloatですが、いまいち使いこなせない。
「float:left」がいいのか、「display:inline」または「display:inline-block」なのか判断しかねる場面が多い。
何故回り込みをさせるのか意味を考えればどれかは特定できるのだけれど、実際のレンダリングを考えるそうもいかないこともある。
これはおそらくデザインの問題なのかもしれないけれど。

ブロックの中で「float」させておいて、次のブロックがくいこまないようにするためには「overflow:hidden」をかませるのだけれど、「float」させたブロックの中で折り畳みメニュー的なものを入れたい場合、ブロックの領域をはみ出るものは隠れてしまう。
これが大問題。

結局は大きさ固定するために「min-height」で逃げたりしても、後で文章の長さがかわってまた同じ悩みにはまるのはいい加減もううんざりだ。
うん、やはりデザインの問題なのだろうけど、どうしようもない。

PHPのセッション管理はスッキリさせたい

PHPで手続きの途中で別のことをさせてまた戻るときに、
セッションに中断した情報を保存させたりします。
また、リダイレクト先でメッセージを表示させたいときにも利用しますね。

いままでは
$_SESSION['notice'] = $_SERVER['REQUEST_URI'];

$location = './';
if( isset($_SESSION['location']) ){
$location = $_SESSION['location'];
unset($_SESSION['location']);
}
header("Location: $location");

とかやったりするわけですが、あちこちでこんな処理を書くのはダサいですよね。

なので、ユーザ用クラスを作って放り込むことにしたわけです。
手続の中断情報を入れるために、カッコよくInterceptとでもしましょう。

class USER {

public function setIntercept( $location ){
$_SESSION['location'] = $location;
}
public function getIntercept( $flagClear=false ){
if( !isset($_SESSION['location']) ){ return; }
$location = $_SESSION['location'];
if( $flagClear ){ $this->clearLocation(); }
return $location;
}
public function clearLocation(){
if( !isset($_SESSION['location']) ){ return 0; }
unset($_SESSION['location']);
return 1;
}

}

こんな感じでスッキリさせました。
※コードは直書きでtypoちゃんと見てません、あしからず。

JavaScriptでURLをカッコよくパースする

次のようなURLがあったとします。
http://www.printry.jp/product/category/detail.php?product_category_id=15#productId193
これをパースしていろいろ弄りたいのですが、
「?」で分割して、右側を「&(&)」で分割して、「=」で分割して…
というのが何をやっているのか一目瞭然なのですが、次の方法があるようです。


var elm = document.createElement('a');
elm.href = 'http://www.printry.jp/product/category/detail.php?product_category_id=15#productId193';

console.log(elm.hostname);
// www.printry.jp
console.log(elm.pathname);
// /product/category/detail.php
console.log(elm.search);
// ?product_category_id=15
console.log(elm.hash);
// #productId193

これはなるほど、DOMに丸投げというわけですね。
カッコよく決まってデメタシデメタシ。

PHPのSmartyテンプレート内でstr_repeatを使う

テンプレートエンジンSmartyでのお話。
PHPの関数も基本的には使用できるのですがパラメータで何時も同だったらちょっと悩むので、検索したらヒットするように残しておこうかなと。
マニュアルを見なくても大体わかりますよね。
string str_repeat ( string $input , int $multiplier )
PHPでstr_repeat(1,2)と書くものは、
Smartyでは第1パラメータを先頭に持ってきて、{1|str_repeat:2}となります。
一度使うとしばらくは覚えてるんですが、なぜか忘れてしまっていますね。

印刷用画像サイズ計算ツール公開

印刷用に画像を用意する場合、サイズの計算が少々面倒です。
仕上げサイズ?解像度?塗り足し?
一気に解決できるツールをご用意しました。

その名もまんまの「印刷用画像サイズ計算」です。
計算はJavascriptで行います。
全体では10分ぐらい要したと思います。

印刷注文は、管理人が運営するプリントライまでどうぞ。