IT-Tecスクラップ

IT技術に関する覚え書き。
Hu-BasicからVistaまで、思いついたら都度更新。

catコマンド

2006年10月19日 15時15分04秒 | etc
「海外の女性Linuxユーザ団体のMLで、挨拶ついでに

『ウチの猫は、小さいときからLinuxマシンのキーボードやマウスをおもちゃにして育って、もう立派な大人になったのに、catコマンドが使えないのよ』

と言うと、

『お宅の猫は、自分のことを人間だと思ってて、catコマンドよりmanコマンドが使いたいんじゃないの?』

と返事が返ってきた」

PDFlibの実践4

2006年09月06日 15時36分27秒 | PHP
  • 指定領域内に文字列を均等割付する

  • 【導入】
    「1文字当たりの文字幅を縮小」することで、領域を超過する場合の対処は行えた。
    他方、領域に満たない場合の対処はどうであろうか。

    先の、チラシに複数の店舗名を縦に列記するという例では、さらに下記のような要求が加わることがままある。
    ・領域内の最大文字数に満たない場合は、領域内に均等割付をする

    ここで言う「均等割付」とは、文字間隔(ピッチ)を増加させることにより、
    指定領域内に文字を収める(先頭文字の左端が領域の左端、末尾文字の右端が領域の右端に接する)
    という手法である。

    しかし、PDFlibには「ピッチを調整するオプションは存在しない」ようである。
    よって、自分でその仕組みを実装する必要がある。

    【1文字当たりのピッチ算出アルゴリズム】
    1.領域内の最大文字数($max_length)から1文字あたりの幅($letter_w)を算出
    2.出力文字数($length)×$letter_wで文字出力領域幅(非ピッチ領域幅)を算出
    3.領域幅($width)-非ピッチ領域幅でピッチ領域幅($pitch_total_w)を算出
    4.$pitch_total_wをピッチ適用文字数($length-1)で割って、1文字当たりのピッチ($ptich_w)を取得
    (ただし「$length > 1」かつ「$length < $max_length」)

    【例1】
    ピッチ算出処理

    /* ================================================== */
    /* 文字間隔(ピッチ)幅の取得
    /* ================================================== */
    function GetLetterPitchWidth($text,$max_length,$width) {

    //文字数を取得
    $length = mb_strlen($text);

    //最大文字数に満たない場合はピッチを適用
    if ($length < $max_length) {

    $letter_w = $width / $max_length;;

    $pitch_total_w = $width - ($length * $letter_w);

    //2文字以上の場合はピッチを適用する
    if ($length!=1) {
    $ptich_w = $pitch_total_w / ($length - 1);
    }

    //1文字しかない場合はピッチを適用しない
    else {
    $ptich_w = 0;
    }

    }

    //最大文字数以上ならばピッチは適用しない
    else {

    $ptich_w = 0;
    }

    return $ptich_w;

    }
    /* ================================================== */

    【ピッチ適用アルゴリズム】
    1.出力文字を1文字($letter)取り出す
    2.始点・終点が(x1,y1)(x2,y2)である場合、x2=x1+1文字あたりの幅($letter_w)である
    3.$letterを出力する
    4.次の文字の始点x1=現在のx2+1文字当たりのピッチ($ptich_w)である
    5.全ての出力文字を処理するまで繰り返す

    【例2】
    ピッチ適用処理


    //文字数を取得
    $length = mb_strlen($text);

    for ($i=0;$i<$length;$i++) {

    //終点(x2)は始点(x1)+1文字幅
    $xy['x2'] = $xy['x1'] + $letter_w;

    $letter = mb_substr($text,$i,1);

    //ここに1文字を出力する処理

    //次の始点(x1)は現在の終点(x2)+ピッチ幅
    $xy['x1'] = $xy['x2'] + $pitch_w;

    }

    【残った問題】
    今回の均等割付処理には、以下の問題が残っている。
    これらは解決次第、別途記述したいと思う。

  • 半角文字が含まれる場合、きれいに均等割りにならない

  • プロポーショナルフォントへの対応が漏れている

  • PDFlibの実践3

    2006年09月06日 14時53分03秒 | PHP
  • 指定領域内に「フォントサイズを変えずに」文字列をフィットさせる

  • 【導入】
    PDF_fit_textlineの「fitmethod」オプションで「nofit」以外のどれを選んでもフォントサイズが変更される可能性がある。

    ここで、チラシに複数の店舗名を縦に列記するという例を考えてみると、下記のような要求をされることが多い。
    ・1つの店舗当たりの領域(横幅)は同一
    ・店舗名の文字数に関わらずフォントサイズは同一

    この場合「フォントサイズは同一」ということを実現するためには「nofit」を選ぶしかないが、
    文字数が多いと領域からはみ出してしまう。
    これを解決するためには「1文字あたりの文字幅を縮小する」しかない。

    【文字数から1文字あたりの縮小率を割り出す】
    まず、下準備として領域内の最大文字数を決める必要がある。
    これは、領域幅が固定、フォントサイズも固定であるのだから容易に割り出せるはず。

    $lengthを出力する文字数、$max_lengthを領域内の最大文字数とすると、
    $ratio = $max_length / $length * 100;
    で求められる$ratioが1文字幅の縮小率である。
    (ただし、「$length <> 0」 かつ 「$max_length < $length」)

    この縮小率をPDF_fit_textlineの「horizscaling」オプションにセットすればよい。

    【例1】
    1文字当たりの縮小率を算出する処理

    /* ================================================== */
    /* 文字幅比率の決定
    /* ================================================== */
    function GetLetterWidthRatio($text,$max_length) {

      $ratio = 0;

      //文字数を取得
      $length = mb_strlen($text);

      //最大文字数を超える場合は比率を算出
      if ($max_length < $length) {
        $ratio = $max_length / $length * 100;
      }

      //最大文字数以内ならば等倍
      else {
        $ratio = 100;
      }

      return $ratio;

    }
    /* ================================================== */

    【例2】
    (x1,y1)(x2,y2)=(0,0)(100,200)の領域に
    「x軸左寄せy軸中央配置」で「1文字の幅を縮小率80%」で
    文字列"abcde"を出力する


    //出力文字列
    $val = "abcde";

    //始点
    $x = 0;
    $y = 0;

    //領域サイズ指定
    $box_w = 100;
    $box_h = 200;

    //寄せの指定
    $align_x = "0";
    $align_y = "50";

    //フィットタイプの指定
    $fittype = "nofit";

    //縮小率の指定
    $horizscaling = "80";

    //オプション引数の組み立て
    $opt_str = "boxsize {".$box_w." ";
    $opt_str .= $box_h."} ";
    $opt_str .= "position {".$align_x." ";
    $opt_str .= $align_y."} ";
    $opt_str .= "fitmethod $fittype ";
    $opt_str .= "horizscaling $horizscaling";

    //テキスト描画実行
    PDF_fit_textline($pdf_obj,$val,$x,$y,$opt_str);

    PDFlibの実践2

    2006年09月06日 13時05分04秒 | PHP
  • 指定領域に文字列をフィットさせる

  • 【PDF_fit_textlineの「fitmethod」オプションを指定する】

  • nofit:指定フォントサイズでそのままテキストを出力する。領域を超過したらはみ出す。

  • clip:指定フォントサイズでそのままテキストを出力する。領域を超過したらはみ出た部分だけ切り取られる(出力されない)。

  • meet:領域が埋まるように縦横にフォントサイズを拡大・縮小する。アスペクト比(※)は保持する。

  • auto(デフォルト):領域内に収まる場合はnofitと同じ。領域を超過する場合はmeetと同じ。

  • slice:領域の縦か横のどちらかに接するようにフォントサイズを拡大・縮小する。接しない方の軸の超過部分は切り取られる。アスペクト比は保持する。

  • entire:領域が埋まるように縦横にフォントサイズを拡大・縮小する。アスペクト比は保持しない。

  • ※アスペクト比:文字の縦横の比率。これを保持してフォントサイズを変更すると文字の見た目(形)は変わらない。無視すると文字の見た目(形)も変化する。

    【例】
    (x1,y1)(x2,y2)=(0,0)(100,200)の領域に「x軸左寄せy軸中央配置」で「領域に収まる最大サイズ」で文字列"abcde"を出力する


    //出力文字列
    $val = "abcde";

    //始点
    $x = 0;
    $y = 0;

    //領域サイズ指定
    $box_w = 100;
    $box_h = 200;

    //寄せの指定
    $align_x = "0";
    $align_y = "50";

    //フィットタイプの指定
    $fittype = "meet";

    //オプション引数の組み立て
    $opt_str = "boxsize {".$box_w." ";
    $opt_str .= $box_h."} ";
    $opt_str .= "position {".$align_x." ";
    $opt_str .= $align_y."} ";
    $opt_str .= "fitmethod $fittype ";

    //テキスト描画実行
    PDF_fit_textline($pdf_obj,$val,$x,$y,$opt_str);

    PDFlibの実践1

    2006年09月04日 15時53分09秒 | PHP
  • 指定領域に文字列を出力する


  • ・PDFlibの座標は、通常の画像描画アプリケーションとはy軸が反転していることに注意。
    数学のxy軸グラフと同じで、上に行くほどyの値が大きくなる。
    つまり(x1,y1)は領域の左下、(x2,y2)は領域の右上である。

    ・先にフォントの指定はしておくこと

    ・領域内でのx軸,y軸のポジショニング(上下寄せ、左右寄せ等)は「position」オプションで指定する。
    position{$x_align,$y_align}のように記述し、x,yそれぞれに0(left/bottom),50(center/middle),100(right/top)のいずれかを指定する。

    【例】
    (x1,y1)(x2,y2)=(0,0)(100,200)の領域に「x軸左寄せy軸中央配置」で文字列"abcde"を出力する


    //出力文字列
    $val = "abcde";

    //始点
    $x = 0;
    $y = 0;

    //領域サイズ指定
    $box_w = 100;
    $box_h = 200;

    //寄せの指定
    $align_x = "0";
    $align_y = "50";

    //オプション引数の組み立て
    $opt_str = "boxsize {".$box_w." ";
    $opt_str .= $box_h."} ";
    $opt_str .= "position {".$align_x." ";
    $opt_str .= $align_y."} ";

    //テキスト描画実行
    PDF_fit_textline($pdf_obj,$val,$x,$y,$opt_str);

    キャッシュを行わないようにするには(画像編)

    2006年08月30日 15時07分24秒 | HTML
    メタタグでコンテンツそのもののキャッシュをしない場合でも、画像はローカルのものが使われることがある。
    その場合は、Javascriptで画像ファイルにTimeStamp(現在時刻)を付与して呼び出すとよい。
    常に最新の画像が表示されるようになる。

    (例)
    <html>
    <head>

    <!-- こいつらだけでは心もとない -->
    <META HTTP-EQUIV="Pragma" CONTENT="no-cache">
    <META HTTP-EQUIV="Cache-Control" CONTENT="no-cache">
    <META EQUIV="expires" CONTENT="0">

    <script language="JavaScript">
    function reloadImage() {
         var fName = "logo_img.jpg?"+(new Date()).getTime();
         document.images["logo"].src = fName;
    }
    </script>

    </head>

    <body onload="javascript:reloadImage()">
    <img src="上でセットするからここはなんでもよい" name="logo">
    </body>
    </html>

    PDFlibの導入

    2006年08月29日 14時36分47秒 | PHP
  • 概要

  • PHPlibはPHPでPDFファイルをハンドルするための有償ライブラリである。
    下記の3形態がある。
    A PDFlib単体(73,500円) 真っ白なPDFファイルに自分で座標を指定して文字や線を引くことしかできない。
    B PDFlib+PDI(147,000円) Aに加えて、既存の
    PDFファイルを読み込むことができる。
    C PPS[PDFlibパーソナライゼーションサーバ](220,000円) Bに加えて、AdobeAcrobatのプラグインとして「ブロック」を設置できるようになる。PHPからはブロック名を直接指定できるので、座標を意識する必要がなくなる。


    通常の帳票出力では「ひな型を使用して可変項目をプログラムから出力する」というのが一般的だろう。
    それを行うためには最低でもB、デザインとプログラムを分離して行うのであればCが必要となる。

  • 座標単位について

  • 座標の単位は「PDFポイント」と呼ばれる独自単位である。「1ポイント≒0.3528mm」なので、当然誤差が発生する。
    また、マニュアルでは座標をメートル法に拡大する関数(PDF_scale(p, 28.3465, 28.3465))が紹介されているが、このAPIを使うとフォントのポイントや線の幅などにも影響するようなので、自分で変換用のメソッドを作った方が無難だ。

    /* ================================================== */
    /* 指定値をセンチメートルからPDFポイントに変更する
    /* 指定する箇所は直感的に分かりやすいcm単位で指定し、
    /* APIに渡す直前にPDFポイントに変換する
    /* ================================================== */
    function ChangeScaleFromCentiMeter($val) {
    $val = $val * 28.3465;
    return $val;
    }
    /* ================================================== */

  • 始点・終点について

  • 通常の座標系のように(x1,y1)=左上、(x2,y2)=右下ではなく、(x1,y1)=左下、(x2,y2)=右上となる。
    y軸が反転しているので要注意。

  • 技術サポートについて

  • ライセンス購入前は、技術的質問は受け付けてくれない。
    例えば「指定領域への均等割付を行う」場合に、「Q:均等割付はできますか?」→「A:できる」と答えてくれるが、その方法は教えてもらえない。

    またライセンス購入後は5インシデントあたり5万円で技術的質問を受け付けている。
    コスト的に見て「技術的サポートは受けられない」という場合が多いのではないだろうか。

  • FPDFについて

  • パッケージのCを購入できず、自分で座標を指定することになった場合は、フリーウェアの「FPDF」の利用も検討してみてはどうだろうか。

    FPDF日本語サイト

    初めてのPerl

    2006年08月29日 07時52分58秒 | 書籍
    初めてのPerl

    オライリージャパン

    このアイテムの詳細を見る


    Perlの入門書。
    他の言語をある程度習得していて、これからPerlを学ぶという人(今時いるのかは別として)に最適。
    1から読んで学ぶ形式なので、リファレンスとしては使いにくい。
    無駄に多い脚注は「読み物としては」面白い。

    SQLポケットリファレンス

    2006年08月29日 07時48分16秒 | 書籍
    SQLポケットリファレンス

    技術評論社

    このアイテムの詳細を見る


    SQL使い必携のリファレンス。
    これを手元におき、必要なときにコマンドや文法を調べる。
    さらに細かく知りたくなったらネットで検索。
    問題解決の端緒を開く基本リファレンスだ。

    キャッシュを行わないようにするには

    2006年08月28日 16時56分34秒 | HTML
    【方法】
    <HEAD>タグ内に下記の<META>タグを記述する。

    <HEAD>
    <META HTTP-EQUIV="Pragma" CONTENT="no-cache">
    <META HTTP-EQUIV="Cache-Control" CONTENT="no-cache">
    <META EQUIV="expires" CONTENT="0">
    </HEAD>

    【補足】
    このエントリでも使用しているが、
    開始タグのエスケープ文字列は「&lt;」
    終了タグのエスケープ文字列は「&gt;」
    である。