ちまちまの課題-状況7/24

   プログラミング [2011/07/24]
やっと、やっと、やっと、
「さるもすなる ほおむぺえじ(おまけ)」の「はなの写真館」「きのこ写真館」の「完全CGI化&Flash化」と称してやっていた作業が終わりました。

何しろ 最後の「Flash化」:なんちゃってスライドショーの開発に苦戦しました。

ActionScriptっていうスクリプトでプログラムを書いて、ビルドすると.swfっていうファイルができるんですけど、
このActionScriptっていうのが、さっぱり良くわかんなくて。
入門書も買わずに、いきなり作り始めたから しかたないですかねー。

さて、「なんちゃってスライドショー」なんですが、何をするものか?というと、

さるが撮った花とキノコの写真を「写真館」として「http://nga78n.miraiserver.com/」に置いてあるのですが、
そこでは、写真にある程度、名前とか科・属とか色とかの情報を付けて、それで「検索」ができるようになってます。
その検索した結果の複数の写真をスライドショーとして見られるようにしてみました。

まあ、画像を扱っているサイトでは、よく見かけられる仕組みですよね。

スライドショーの表示はFlashで、表示する情報を読み出すところがPHP(XML形式出力)になってます。
詳しくは、別途ホームページの「さるもすなる ぷろぐらむ」の方で。

とにかく、課題が一つ終わってめでたい。
\(^ ^)/

あ、写真館のへったクソな写りの悪い写真は、徐々に差し替えて行きます。
たまに見に来てやってください。「はなの写真館」「きのこ写真館」
m(__)m
スポンサーサイト


チマチマの課題-予定外のアクセスカウンタ

   プログラミング [2011/07/05]
昨日も書いたのですが、HPのアクセスカウンタなどで使わせてもらっていた「COOL ONLINE」がサービスを止めてしまった。

なので、新しいカウンタを提供してくれるところを捜そうか・・・・・
と思ったのですが、カウンタごときで、あっちこっち行ったりきたりするのも面倒なので、自分で準備しました。
PHPで。
当然、さるなので、参考サイトのものまねですよ。
ここPHP入門サイトを参考にさせていただきました。

できたのは、こんなソースです。


<?php
//*****************************************************************************
// title: アクセスカウンタ
// file: mycounter.php
// note: セッションにパスがセットされていなかったらカウントアップ
// parameter $_SESSION["countupword"] カウントアップ済みのパス
// coder: by sarumosunaru
// history: 2011/07/04
//*****************************************************************************
define("FONT_TYPE", 4);
define("DSP_RATE", 1.5);
define("AIKOTOBA", "appu-simasita");

session_start();

//****カウンタファイルをオープン
$cntfp = fopen("SARUcount.txt", "r+");
if ($cntfp != false)
{
  //***カウントを読み込む。
  $icount = intval(fgets($cntfp, 128));
  fseek($cntfp, 0, SEEK_SET);
}
else $icount = 0;

//合言葉を確認して、未設定ならカウントアップ
if ($_SESSION["countupword"] != AIKOTOBA)
{
  $icount++;
  //****合言葉を設定
  $_SESSION["countupword"] = AIKOTOBA;
}

//****新しいカウントを保存
if ($cntfp != false)
{
  fprintf($cntfp, "%d\r\n", $icount);
  fclose($cntfp);
}

//****カウンタを文字列に
$countstr = sprintf("%08d", $icount);

//***基準の文字の幅、高さを調べる
$fontwid = imagefontwidth(FONT_TYPE);
$fonthei = imagefontheight(FONT_TYPE);

header("Content-Type: image/png");
//****描画用画像リソース作成(画像の幅、高さ)
$srcimg = imagecreate($fontwid*10, $fonthei+4);
//****背景色の作成(最初にallocateすると背景色になるらしい)
$bgcolor = imagecolorallocate($srcimg, 0x00, 0x00, 0x00);
//****文字色の作成
$fontcolor = imagecolorallocate($srcimg, 0x00, 0x88, 0x22);

$start_x = $fontwid;
$start_y = 2;
//****カウント文字列の描画(画像、フォントタイプ、x,y、文字列、文字色)
imagestring($srcimg, FONT_TYPE, $start_x, $start_y, $countstr, $fontcolor);
//****出力用画像リソース作成(画像の幅、高さ)
$dstimg = imagecreate((imagesx($srcimg))*DSP_RATE, (imagesy($srcimg)*DSP_RATE));
//****画像のコピー(コピー先画像、元画像、先x,y、元x,y、先w,h、元w,h)
imagecopyresized($dstimg, $srcimg,
        0,0,0,0,
        imagesx($dstimg), imagesy($dstimg),
        imagesx($srcimg), imagesy($srcimg));

//****イメージデータのPNGとしての出力
imagepng($dstimg);
//****画像リソースの廃棄
imagedestroy($srcimg);
imagedestroy($dstimg);
?>



でも、前のカウンタがどんくらいだったのか分からないので、適当に初期値設定しちゃいました。
自作の特権ですよね。

あーくたびれた。
今日はこの辺で。m(__)m

後日、見栄えの点で少し変更しました。続きがあります。

続きを読む



ちまちまの課題-状況

   プログラミング [2011/07/03]
やらなきゃいけない・・・というか、
やろうと思っていた「ちまちました課題」の3つめを先週辺りからダラダラとやってました。

課題というのは、ここ数年撮りためていた花とキノコの写真を整理すうるために
「さるもすなる ほおむぺえじ(おまけ)」の「写真館」をCGI化すること。

さっき、何とか動くようになって、前から載せていた写真は見られるようにしましたが、
まだ、写真に写っている花やきのこの情報の入力までは手が回ってません。
更新する仕掛けも作ったので、そんなに時間は掛からないハズなんですけど。
引き続きちまちま入力やって行きます。

と、
そんなことに没頭していたら、「さるもすなる ほおむぺえじ(おまけ)」用にも使っていた無料スペースの「COOL ONLINE」がサービスを停止しちゃってました。6月いっぱいだったみたい。
アクセスカウンタは、COOLのやつを使ってたので、何か探さないといけなくなりました。
面倒です。

でもカウンタ、どんくらいになってたんだろ。
昨年から、infoseekもやめちゃったし、infoseekに吸収されたcoolも止めちゃうし。
ここ(fc2)は大丈夫なんだろか。
都度、引越しは大変なので、暫くは、止めないでほしいなー。

えーと、新しい写真館は、こちらから。
チンケ(ヘタクソ)な写真もままありますが、キノコや山野草にご興味のある方は・・・・
どうぞ、よろしく。 m(__)m



チマチマした課題

   プログラミング [2011/06/02]
ちょっと最近「ネタが尽きた」感があって、書き込みをサボってました。
先週は、こちらで「ナシロダケ」と言われているササタケのタケノコを採ってきたのですが・・・・
それも、「特別書く程でも」と思ったりして。

もう一つの理由が、
さるの頭の中に引っかかっている「ちまちました課題」のせいではないかと。
2つ程、片付けたんですけど、まだあって・・・・・
でもあんまりやる気しなくて・・・・・

ここは一発 自分に気合を入れるために、ここで「やる」と宣言しておきます。
誰のためでもなくて、単に自分のためなんだから、嫌なら止めりゃいいんですけどね。

(1)「さるもすなるほおむぺえじ(おまけ)」の完全CGI&Flash化。
  でもって、「Flash統合開発環境とActiveScript-はじめの半歩」ページ完成。
(2)「PPバンドかごの作り方 実用品編?」作成着手・・・
  その前に斜め網代編み籠の作り方をブログ上で公開。
(3)「さるは自然食」のきのこ編を「きのこ図鑑」に。
(4)「NGA-TOOLS/WIN」の一応の完成(GUI)。
(5) 溜め込んである、花やキノコの写真の整理
(6) えーっとまだあったような。

なんせ、あれもこれも「やりたがり」で。

というわけで、ただいま(1)の取っ掛かり、ダラダラとFlash(ActiveScript)を勉強中。
でも、なんだか難解です。
「動くもの」という意味では、サンプルを探して適当に組み合わせれば、なんとなく動く感じなんですけど、
なぜそう動くかイマイチよく分かってない。
Webサーバ上の画像や音をダウンロードしてきて表示/再生はなんとなく出来ちゃうんです。

手はじめにやった、写真が「じわー」っと変わるやつ。
この「じわーっと出す」も、サンプルを何も考えずにまねしたら、すぐに動いたんですけど、理解度はかなり低いです。(ちなみに、このブログにswfを貼り付けようと思ったらうまく行きませんでしたので、単純なリンクにしてみました。見られますかね。)

まあ、所詮さるなので理解は程々に、まずは片付けること優先で作業していきます。
m(__)m



ZIP書庫内のリストを出力する

   プログラミング [2010/12/18]
またまた、PHP(スクリプト言語)でのプログラム作りの話です。

PPバンド籠製作の話でここを訪問された方には、関係ない話で、申し訳ございません。

とあるとき、「ZIP形式のファイルの中身をリスト(紙)に出して、圧縮前の一覧とファイルのサイズや更新日付を確認する」必要性が、出ました。(オマンマのタネの方の用事です。)
よく考えたら、どっかに解凍して比較すれば済む話なんだけど、あったら便利かなーと思って。
それに、隠しファイルになって、圧縮元にゴミデータが紛れてるようなときに、探し当てることもできるし。
(まあ、チョンボしなければ、ぜーんぜん必要ないんですけど。)

で、そんなフリーツールを探して見ました。急いでるときに1時間ほど。
でも、ぴったり来るのが見つからない。無いのかなー。
そのときは、「無い」からあきらめて、仮で解凍して確認することで、決着?させました。

ふと、PHPにリファレンスを眺めてたら、ZIPを作ったり、解凍したりする関数が準備されてるじゃないですか。
「へー作れるんだ」と思ったのが運の尽き。
作り始めたら、ハマッた。

・・・・・・・・・・・・

でも、何とか動くところまで、持ってきました。
この間、覚えたばかりのWinBinderも使って、それっぽいツールを完成させました。


もし、おんなじように、そんなシチュエーションに会われた方がいたら・・・・どうぞ。
HPにソースも含めて公開しました。exeもダウンロードできます。exeのサイズはデカイです。

こちらのページの最後にリンクしてます。

m(__)m


PHP-はじめの一歩(その13)Windowsプログラムの作り方(6)

   プログラミング [2010/12/04]
いやー「PHP-はじめの一歩」こんなに長くなるとは、思っていませんでした。
すでに半月以上経ってますね。そろそろ終わりにしないと・・ですね。

PHPで作るWindowsアプリの最後です。たぶん今まででも一番ダラダラと説明します。

まずは、「削除」。
行の「削除」のことを忘れていたので、ボタンの追加からです。
ppecomakelist.form.phpの方を変更します。(FEで作成しましたが、既に別のエディタで修正してしまっているので、FEは使えません。)以下の行の追加です。
---------------
if(!defined('IDC_BTDEL')) define('IDC_BTDEL', 1007);

wb_create_control($winmain, PushButton, '削除', 440, 220, 50, 25, IDC_BTDEL, 0x00000000, 0, 0);
---------------
上記を追加するにあたって、他のボタンの配置や、コントロールIDなんかも直す必要もあります。
「必ず」と言う訳ではありません。

それで、処理の方は、window_processファンクションに以下を追加しました。
---------------
//****削除ボタンをクリックされたら
case IDC_BTDEL:
  //リストボックスの選択された行の番号を取得する。
  $curitem = wb_get_selected(wb_get_control($window,IDC_LSSAMPLES));
  //wb_message_box($window, "current item=".$curitem);
  //行番号が0でなければ削除作業
  if ($curitem > 0 && $curitem <= $Line_cnt)
  {
    //その行を詰める
    $i = $curitem - 1;
    while ($i < ($Line_cnt-1))
    {
      $AryList[$i] = $AryList[$i+1];
      $i++;
    }
    $AryList[$Line_cnt-1] = null;
    $Line_cnt--;
    //リストボックスの行の表示
    RenewListBox($window);
    //カレント行の再設定
    if ($curitem > $Line_cnt) $curitem = $Line_cnt;
    wb_set_selected(wb_get_control($window,IDC_LSSAMPLES), $curitem);
  }
  break;
---------------

で、もって最後に「保存」ボタンの処理を追加します。
---------------
//****保存ボタンをクリックされたら
case IDC_BTSAVE:
  //エディットからファイルパス名を取得
  $tsvfile = wb_get_text(wb_get_control($window,IDC_EDFILENAME));
  //wb_message_box($window, "input file name=".$tsvfile);
  //ファイルパスをチェックする。
  if ($tsvfile == "" || $tsvfile == null)
  {
    wb_message_box($window, "保存先ファイルパスを指定してください。",
            MY_NAME, WBC_WARNING);
    wb_set_focus(wb_get_control($window, IDC_BTSELECT));
    break;
  }
  //ファイルに配列データを書き出す。
  SetTsvFile($window, $tsvfile);
  break;
---------------

実際のファイル書き込みファンクションは以下のような感じです。
---------------
//******************************************************************************
//ファイル書き出し
// $window   ウィンドウオブジェクト
// $tsvfile  TSVファイル名
//******************************************************************************
function SetTsvFile($window, $tsvfile)
{
  global $AryList;        //タブ区切りデータ保存配列
  global $Line_cnt;        //レコード数

  //****出力先ファイルをオープン
  //wb_message_box($window, file_exists($tsvfile));
  if (file_exists($tsvfile))
  {
    //****ファイルが既にある場合
    //wb_message_box($window, is_file($tsvfile));
    if (is_file($tsvfile))
    {
      $okng = wb_message_box($window, "既にあるファイルに上書きしますか?",
              MY_NAME, WBC_OKCANCEL);
      if ($okng == false) return;
    }
    //****ディレクトリだったりしたら
    else
    {
      wb_message_box($window, "出力先にディレクトリ名が指定されています。",
              MY_NAME, WBC_WARNING);
      return;
    }
  }

  $tsvfp = fopen($tsvfile, "w");
  if ($tsvfp == false)
  {
    wb_message_box($window, "データファイルのオープンに失敗しました。",
              MY_NAME, WBC_WARNING);
  }
  //****オープン成功
  else
  {
    //****1行づつ出力
    for ($i=0; $i<$Line_cnt; $i++)
    {
      $output_dat = implode("\t", $AryList[$i]) . "\r\n";     //配列をTSV行に変換
      //wb_message_box($window, $output_dat);
      fwrite($tsvfp, $output_dat);
    } //end for:write line

    fclose($tsvfp);
  } //end else:file opened

  wb_message_box($window, "ファイルに出力しました。", MY_NAME, WBC_INFO);

  return;
} //end fuction
---------------

その他、エラー時のメッセージの追加などで、プログラミングは終了。

ここで、思ったとおりに動くか確認して。


●いよいよコンパイル
まずは、フォルダの中を整理します。

①FEが編集用の.prjを作成しているで、サブフォルダに移動。
②3つのソースファイルは、別のサブフォルダに移動します。
③winbinder.phpのインクルードパスを変更します。
④さらに、Bamcompile用のppecomakelist.bcpを作成します。
⑤そのppecomakelist.bcpを指定してBamcompileを起動するバッチファイルも作成します。
⑥また、作成する.exeにアイコンを割り当てたいので、アイコンも準備します。

フォルダファイル構成は、以下のようにしました。①②
---------------
<Bamcompile1.21>
  <ppecomakelist>
    compile.bat    ・・・⑤
    ppecomakelist.bcp ・・・④
    <src>
      ppecomakelist.phpw ・・・③
      ppecomakelist.form.php
      ppecoitemedit.form.php
    <res>
      ppecomakelist.prj
      ppecoitemedit.prj
      sarumosunaru.ico  ・・・⑥
<WinBinder>
  :
  :
---------------

まずは、ここで動作を確認します。

上記の構成にしたあとでは、ppecomakelist.phpwの中でインクルードしているwinbinder.phpのパスが変わっているので注意が必要。

さらに、.exeにしたときの仮想パスにそのインクルードパスを再度変更します。(この時点でWinBinderのスクリプトとしては動作しなくなります。)③
---------------
//****お決まり。必ず必要なインクルード
//include "../../../WinBinder/phpcode/include/winbinder.php";
include "include/winbinder.php";
---------------

Bamcompile用のppecomakelist.bcpを作成します。以下のような感じ。④
---------------
MAINFILE ppecomakelist.phpw
OUTFILE ppecomakelist.exe
WINDOWED
COMPRESS
DESTINATION /
EMBED src
DESTINATION include
EMBED ..\..\WinBinder\phpcode\include\winbinder.php
EMBED ..\..\WinBinder\phpcode\include\wb_generic.inc.php
EMBED ..\..\WinBinder\phpcode\include\wb_resources.inc.php
EMBED ..\..\WinBinder\phpcode\include\wb_windows.inc.php
EXTENSION ..\..\WinBinder\binaries\php4\ext\php_winbinder.dll
---------------

上記を使ってコンパイルするためのバッチファイル(compile.bat)は以下のような感じ。⑤
---------------
..\bamcompile ppecomakelist.bcp -i:res\sarumosunaru.ico
pause
---------------

ここまでやったら、バッチファイルをダブルクリックしてコンパイルを実行させます。
以下のようなメッセージが出たら、コンパイル成功。
---------------
Bambalam PHP EXE Compiler/Embedder 1.21

Using project file: ppecomakelist.bcp
Windowed application
Compress
Mainfile: ppecomakelist.phpw
Outfile: ppecomakelist.exe
Icon: res\sarumosunaru.ico

Encoding and embedding ppecoitemedit.form.php
Encoding and embedding ppecomakelist.form.php
Encoding and embedding ppecomakelist.phpw
Encoding and embedding include/winbinder.php
Encoding and embedding include/wb_generic.inc.php
Encoding and embedding include/wb_resources.inc.php
Encoding and embedding include/wb_windows.inc.php
Embedding php_winbinder.dll and adding it to extension loader
Updating icon...done
Compressing final exe..
Compression done

ppecomakelist.exe created successfully!

C:\Pleiades_e35\Bamcompile1.21\ppecomakelist>pause
続行するには何かキーを押してください . . .
---------------

ppecomakelist.exe が出来てます。念のため動作を確認します。

1012041_1.jpg

EXEのサイズを見ると615Kもある。
php_winbinder.dllも取り込んでいるんでしょうからしょうがないですかね。

これで、当初予定の以下3つの仕掛け全部が完成です。
(Ⅰ)自分のPC上で、タブ区切り形式のデータを作る(編集更新する)ためのプログラム
(Ⅱ)上記のプログラムで作成したタブ区切りデータを読み込んで、一覧ページを表示するためのPHPスクリプト
(Ⅲ)一覧ページ上の「申し込み」ボタンが押されたときに、「申し込み」ページを表示し、必要事項を入力して「送信」とやったら、さるにその内容の連絡を送るPHPスクリプト

せっかく、ここまでやったので、HPにこの内容を昇格させようと思います。
遠からず、http://nga78n.web.fc2.com/cgiintro.htmにソースダウンロード可能なように載せます。
ご興味がある方は、参考になさってください。(参考にはならないか・・・・)


PHP-はじめの一歩(その12)Windowsプログラムの作り方(5)

   プログラミング [2010/12/03]
昨日の続きです。 ここで、昨日の説明で不足がありました。
ダイアログを生成した後に、メッセージハンドラを設定しているのですが、その例を示すのを忘れてました。
それが以下です。
---------------
//**********************************************************
//ダイアログメッセージハンドラ
// $window   ウィンドウオブジェクト
// $id     コントロールID
//**********************************************************
function process_dlg($window, $id, $ctrl, $param1, $param2)
{
  switch($id)
  {
    //****【x】ボタンが押されたら
    case IDCLOSE:
      wb_destroy_window($window);
      break;
  }
}
---------------

で、今日はここにダイアログ上の「追加」「更新」ボタンを押したときの処理を追加します。
こんな感じの処理になります。

---------------
//**********************************************************
//ダイアログメッセージハンドラ
// $window   ウィンドウオブジェクト
// $id     コントロールID
//**********************************************************
function process_dlg($window, $id, $ctrl, $param1, $param2)
{
 global $AryList;        //タブ区切りデータ保存配列
 global $Line_cnt;        //レコード数
 global $CurLItem;        //リストボックスのカレント行番号
 global $MWindow;        //メインウィンドウID

 switch($id)
 {
  //****追加ボタンが押されたら
  case IDC_BTADD:
   //「番号」を取り出す。
   $sample_no = wb_get_text(wb_get_control($window, IDC_EDNO));
   if ($sample_no == "" || $sample_no == null)
   {
    //「番号」が指定されていないときは、エラーメッセージを出す。
    wb_message_box($window, "番号は、必ず指定してください。",
           MY_NAME, WBC_WARNING);
    wb_set_focus(wb_get_control($window, IDC_EDNO));
    break;
   }
   //その他の入力項目を取り出して、配列にセットする。
   $AryList[$Line_cnt] = array();
   ReadEditCtrl($window, $Line_cnt);

   //行数を更新。リストボックスのカレント行を最終行にセット。
   $Line_cnt++;
   $CurLItem = $Line_cnt;
   //メインウィンドウのリストボックス更新する。
   RenewListBox($MWindow);
   wb_set_selected(wb_get_control($MWindow,IDC_LSSAMPLES), $CurLItem);
   //編集ダイアログを閉じる。
   wb_destroy_window($window);
   break;

  //****更新ボタンが押されたら
  case IDC_BTUPDATE:
   //「番号」を取り出す。
   $sample_no = wb_get_text(wb_get_control($window, IDC_EDNO));
   if ($sample_no == "" || $sample_no == null)
   {
    //「番号」が指定されていないときは、エラーメッセージを出す。
    wb_message_box($window, "番号は、必ず指定してください。",
           MY_NAME, WBC_WARNING);
    wb_set_focus(wb_get_control($window, IDC_EDNO));
    break;
   }
   //その他の入力項目を取り出して、配列にセットする。
   ReadEditCtrl($window, $CurLItem-1);

   //メインウィンドウのリストボックス更新する。
   RenewListBox($MWindow);
   wb_set_selected(wb_get_control($MWindow,IDC_LSSAMPLES), $CurLItem);

   //編集ダイアログを閉じる。
   wb_destroy_window($window);
   break;

  //****【x】ボタンが押されたら
  case IDCLOSE:
   wb_destroy_window($window);
   break;
 } //end switch
} //end function

//***********************************************************
//編集ダイアログから読み込み
// $window ウィンドウオブジェクト
// $line_no データ格納先の配列番号
//***********************************************************
function ReadEditCtrl($window, $line_no)
{
 global $AryList;        //タブ区切りデータ保存配列

 $AryList[$line_no][0] = wb_get_text(wb_get_control($window, IDC_EDNO));
 $AryList[$line_no][1] = wb_get_text(wb_get_control($window, IDC_EDFILE));
 $AryList[$line_no][2] = wb_get_text(wb_get_control($window, IDC_EDFILEBIG));
 $AryList[$line_no][3] = wb_get_text(wb_get_control($window, IDC_EDNAME));
 $AryList[$line_no][4] = wb_get_text(wb_get_control($window, IDC_EDSIZEH));
 $AryList[$line_no][5] = wb_get_text(wb_get_control($window, IDC_EDSIZEW));
 $AryList[$line_no][6] = wb_get_text(wb_get_control($window, IDC_EDSIZED));
 $AryList[$line_no][7] = wb_get_text(wb_get_control($window, IDC_EDRSTCNT));
 $AryList[$line_no][8] = wb_get_text(wb_get_control($window, IDC_EDMKCNT));
 $ng_flg = wb_get_value(wb_get_control($window, IDC_RDBANDNO));
 if ($ng_flg == true) $AryList[$line_no][9] = "0";
 else $AryList[$line_no][9] = "1";
 $AryList[$line_no][10] = wb_get_text(wb_get_control($window, IDC_EDCOMMENT));
 $AryList[$line_no][11] = wb_get_text(wb_get_control($window, IDC_EDPRICE));
}
---------------

さあ残りは・・・・「保存」「削除」エラー時の処理などです。

今日はこの辺で。 m(__)m


PHP-はじめの一歩(その11)Windowsプログラムの作り方(4)

   プログラミング [2010/12/01]
このブログに<textarea>を使ってPHPソースを記述しようとしましたが、「自動改行タグ入力」機能が解除できくて・・・・
あきらめました。相変わらずのベタ打ちです。

さて、前回の続きです。なので「前略」で書きます。

▼フォームに配置した「UP」「DOWN」の動作は、
リストボックスの中にリストしたタブ区切りデータのレコードの順番を変えるためにあります。

その前に、前回、「開く」のときに実行するリストボックスに書くレコード(行)の一部を表示する処理をサブルーチン化します。
---------------------------
//****************************************************
//リストボックスの行の表示
// $window   ウィンドウオブジェクト
// $tsvfile  TSVファイル名
//****************************************************
function RenewListBox($window)
{
  global $AryList;
  global $Line_cnt;

  //レコード内の番号とサンプル名を結合した文字列を作り、配列にする。
  $ary_capt = array();
  $ary_capt[$i] = "新規";
  for ($i=0; $i<$Line_cnt; $i++)
  {
    $ary_capt[$i+1] = $AryList[$i][0] . " " . $AryList[$i][3];
    //wb_message_box($window, "made list caption=".$ary_capt[$i+1]);
  }
  //作った文字列をリストにセットする。
  wb_set_text(wb_get_control($window,IDC_LSSAMPLES), $ary_capt);
} //end finction
----------------

サブルーチン化するに当たって、一旦ファイルから読みこんで配列にセットしたデータは、編集して書き戻すまでとっておく必要があるため、配列と行数をグローバル変数にしました。
簡単に言えば、エントリルーチン(function xxxx{}外)で確保した変数を、ファンクション(function xxxx{})内で、「global 変数名;」とやればいいだけです。
それと、リストボックス内の1行目を新規登録用に「新規」と表示するようにしています。

準備ができたところで、process_main(メッセージハンドラ?)内に以下の処理を加えます。
▼「開く」「UP」「DOWN」ボタンが押されたときのための処理です。
----------------
//****開くボタンをクリックされたら
case IDC_BTOPEN:
  //エディットからファイルパス名を取得
  $tsvfile = wb_get_text(wb_get_control($window,IDC_EDFILENAME));
  //wb_message_box($window, "input file name=".$tsvfile);
  //ファイルからデータを読み込んで配列にセットする。
  
  $AryList = GetTsvFile($window, $tsvfile);

  //読み込んだ行数を求める。
  $Line_cnt = count($AryList);
  //wb_message_box($window, "line count=".$Line_cnt);

  //リストボックスの行の表示
  RenewListBox($window);
  break;

//****UPボタンをクリックされたら
case IDC_BTUP:
  //リストボックスの選択された行の番号を取得する。
  $curitem = wb_get_selected(wb_get_control($window,IDC_LSSAMPLES));
  //wb_message_box($window, "current item=".$curitem);
  //行番号が1より大きかったら、一つ前の行と入れ替えを行う。
  $ary_swapwork = array();
  if ($curitem > 1)
  {
    //一行前と入れ替え
    $ary_swapwork = $AryList[$curitem-1];
    $AryList[$curitem-1] = $AryList[$curitem-2];
    $AryList[$curitem-2] = $ary_swapwork;
    //リストボックスの行の表示
    RenewListBox($window);
    //カレント行の再設定
    wb_set_selected(wb_get_control($window,IDC_LSSAMPLES), $curitem-1);
  }
  break;

//****DOWNボタンをクリックされたら
case IDC_BTDOWN:
  //リストボックスの選択された行の番号を取得する。
  $curitem = wb_get_selected(wb_get_control($window,IDC_LSSAMPLES));
  //wb_message_box($window, "current item=".$curitem);
  //行番号が1以上最終行未満なら、一つ後ろ行と入れ替えを行う。
  $ary_swapwork = array();
  if ($curitem > 0 && $curitem < $Line_cnt)
  {
    //一行前と入れ替え
    $ary_swapwork = $AryList[$curitem-1];
    $AryList[$curitem-1] = $AryList[$curitem];
    $AryList[$curitem] = $ary_swapwork;
    //リストボックスの行の表示
    RenewListBox($window);
    //カレント行の再設定
    wb_set_selected(wb_get_control($window,IDC_LSSAMPLES), $curitem+1);
  }
  break;
----------------
ここまでは、順調でした。

▼リストボックス内のレコード(行)をダブルクリックしたら、
そのレコードの内容を表示する編集用ダイアログを表示します。

まずは、ダブルクリックをリストボックスで受け取れるようにするためには、このウィンドウ自体を生成する場合のstyleに変更を加える必要がありました。

FEで作成したppecomakelist.form.php内
----------------
$winmain = wb_create_window(null, AppWindow, 'PPバンド籠サンプルリスト編集', WBC_CENTER, WBC_CENTER, 531, 381, 0x00000000, 0);
----------------

----------------
$winmain = wb_create_window(null, AppWindow, 'PPバンド籠サンプルリスト編集', WBC_CENTER, WBC_CENTER, 531, 381, WBC_NOTIFY, WBC_DBLCLICK);
----------------
に変更します。
ちなみに、WBC_NOTIFYはFEでも指定可能ですが、WBC_DBLCLICKはFEでは設定できないみたいです。

次に、メッセージハンドラのprocess_mainの引数を増やします。
----------------
function process_main($window, $id)
----------------

----------------
function process_main($window, $id, $ctrl=0, $param1=0, $param2=0)
----------------
に変更します。


それで、実際のリスト項目のダブルクリック処理は、
----------------
//****リスト項目をダブルクリックされたら
case IDC_LSSAMPLES:
  if ($param1 == WBC_DBLCLICK)
  {
    //wb_message_box($window, "double click!!".$ctrl.":".$param1.":".$param2);
    //ダブルクリックされたリスト番号を取得する。
    $CurRec = wb_get_selected(wb_get_control($window,IDC_LSSAMPLES));
    if ($CurRec > $Line_cnt) $CurRec = 0;

    //編集ダイアログを表示する。
    //××FEで作成したwb_create_windowは、親ウィンドウが常に
    //××ディスクトップになるため以下のformは必ず修正が必要
    include "ppecoitemedit.form.php";
    wb_set_handler($winmain, "process_dlg");

    //「新規」以外なら、レコードの内容を表示
    if ($CurRec > 0)
    {
      $curitem = $CurRec - 1;
      wb_set_text(wb_get_control($winmain, IDC_EDNO),     $AryList[$curitem][0]);
      wb_set_text(wb_get_control($winmain, IDC_EDNAME),    $AryList[$curitem][3]);
      wb_set_text(wb_get_control($winmain, IDC_EDFILE),    $AryList[$curitem][1]);
      wb_set_text(wb_get_control($winmain, IDC_EDFILEBIG),  $AryList[$curitem][2]);
      wb_set_text(wb_get_control($winmain, IDC_EDSIZEH),   $AryList[$curitem][4]);
      wb_set_text(wb_get_control($winmain, IDC_EDSIZEW),   $AryList[$curitem][5]);
      wb_set_text(wb_get_control($winmain, IDC_EDSIZED),   $AryList[$curitem][6]);
      wb_set_text(wb_get_control($winmain, IDC_EDRSTCNT),   $AryList[$curitem][7]);
      wb_set_text(wb_get_control($winmain, IDC_EDMKCNT),   $AryList[$curitem][8]);
      if ($AryList[$curitem][9] == 1)
        wb_set_value(wb_get_control($winmain, IDC_RDBANDYES), true);
      else
        wb_set_value(wb_get_control($winmain, IDC_RDBANDNO), true);
      //wb_message_box($window, "get value IDC_RDBANDNO=".$AryList[$curitem][9]
      //       ."->".wb_get_value(wb_get_control($winmain, IDC_RDBANDNO)));
      wb_set_text(wb_get_control($winmain, IDC_EDCOMMENT),  $AryList[$curitem][10]);
      wb_set_text(wb_get_control($winmain, IDC_EDPRICE),   $AryList[$curitem][11]);
    }
  wb_set_focus(wb_get_control($winmain, IDC_EDNO));
  }
  //××この処理で単独クリックでメッセージボックスを開いてしまうと
  //××ダブルクリックにならない。
  //else wb_message_box($window, "??? list-box!:".$ctrl.":".$param1.":".$param2);
  break;
----------------

ここで失敗したのが、クリックとダブルクリックが$param1の値で区別できるのかを確かめようとして、
if ($param1 == WBC_DBLCLICK) のときと、そうじゃないときでメッセージボックスを出すようにして試験して見ました。でもどうしてもダブルクリック側のメッセージボックスが出てきません。
つまり最初の1クリック目でメッセージボックスを出してしまうので、ダブルクリックが成立しなくなっていたのですが、そのことに気づくのに結構時間が掛かりました。

その次の躓きが、ダイアログが表示できない問題です。
これは、FEで作成すると、作成されたソースは、ディスクトップを親として作成されているため、こちらのフォームソースも編集しなければ、ならないということです。

FEで作成したppecoitemedit.form.php内
----------------
$winmain = wb_create_window(null, ModalDialog, 'サンプル項目編集', WBC_CENTER, WBC_CENTER, 567, 338, 0x00000000, 0);
----------------

----------------
$winmain = wb_create_window($window, ModalDialog, 'サンプル項目編集', WBC_CENTER, WBC_CENTER, 567, 338, 0x00000000, 0);
----------------
に変更します。

これで、空の編集フォーム(モーダルダイアログ)は表示できるようになりました。

次が、選択されたリスト項目のレコード内容を編集フォームに表示する処理です。(if ($CurRec > 0)以降。)
ここでは、RadioButtonの選択設定がwb_set_selectedでできると思っていたら、wb_set_valueだったということで躓きました。

最後に、ダイアログを生成してデータをセットしただけだと、マウスでクリックするまで、編集に取り掛かれないので、初期状態として、最初の「番号」項目にフォーカスをwb_set_focusでセットしています。

この時点で、表示した編集用ダイアログの各コントロールのTabOrderがアッチコッチになっているのに気が付きました。FEでTabOrderはどうも指定できないらしく。
試したところでは、コントロールをcreateした順番に割り当たるようです。
なので、ppecoitemedit.form.phpを再度編集して、TabOrderとしたい順にwb_create_controlの行の順番を変更しました。

でこんな感じの絵が出ます。
1012011_1.jpg

あと少しかなー。
でもやっぱり、お手軽なんだけど、デバッガが使えない?のがとっても残念。

今日は、この辺で。 m(__)m


PHP-はじめの一歩(その10)Windowsプログラムの作り方(3)

   プログラミング [2010/11/29]
では、PHPを使って目的のウィンドウプログラムを作って見ましょう。
でも、今日は途中までです。

①まずは、格納場所を用意します。
Bamcompile1.21の下に「ppecomakelist」というフォルダを作成しました。

②ウィンドウのフォームを作ります。
WinBinder付属のFE(FormEditor)を起動して、以下のような、二つのウィンドウ(フォーム)を作成しました。
1011293_1.jpg

1011293_2.jpg

プロジェクトを保存するときに、それぞれ「ppecomakelist」、「ppecoitemedit」という名前でppecomakelistフォルダに保存します。
そうすると、それぞれ、名前に.form.phpと.prjと付いたファイルが作成されます。

③ppecomakelistフォームを表示する。
昨日作ったサンプルソース(firstwin.phpw)をベースに以下のようなソースにしました。
基本的に 10行目の「include "ppecomakelist.form.php";」だけ間違えなければ、作ったフォームを表示することはできます。
---------------------------
1 <?php
2 //******************************************************************************
3 //PHPで作るWindowプログラム その1
4 //
5 //******************************************************************************
6 //****お決まり。必ず必要なインクルード
7 include "../../WinBinder/phpcode/include/winbinder.php";
8
9 //****フォームエディタ(FE)で作られたソース。
10 include "ppecomakelist.form.php";
11
12 //****ウィンドウへ"process_main"関数をメッセージハンドラとして割り当てている。
13 //****FEで作成されるメインウィンドウID は、$winmainなので変更。
14 wb_set_handler($winmain, "process_main");
15
16 //****ここでウィンドウ のメインループに入る。これより後に、実行文を書いてはならない。
17 wb_main_loop();
18
19
20 //******************************************************************************
21 //メッセージハンドラ
22 // $window ウィンドウオブジェクト
23 // $id コントロールID
24 //******************************************************************************
25 function process_main($window, $id)
26 {
27  static $listfile_filter = array(
28   array("タブ区切りデータ", "*.tsv"),
29   array("テキストデータ", "*.txt"),
30   array("All files", "*.*")
31   );
32
33
34  switch ($id)
35  {
36   //****参照ボタンをクリックされたら
37   case IDC_BTSELECT:
38   //ファイル選択ダイアログを表示
39   $tsvfile = wb_sys_dlg_open($window, "サンプルリストファイル", $listfile_filter);
40   //wb_message_box($window, "selected file=".$tsvfile);
41
42   //選択されたファイル(パス)をエディットにセットする。
43   wb_set_text(wb_get_control($window,IDC_EDFILENAME), $tsvfile);
44   break;
45
46   //****開くボタンをクリックされたら
47   case IDC_BTOPEN:
48   //エディットからファイルパス名を取得
49   $tsvfile = wb_get_text(wb_get_control($window,IDC_EDFILENAME));
50   //wb_message_box($window, "input file name=".$tsvfile);
51
52   //ファイルからデータを読み込んで配列にセットする。
53   $aryList = array();
54   $aryList = GetTsvFile($window, $tsvfile);
55
56   //読み込んだ行数を求める。
57   $line_cnt = count($aryList);
58   //wb_message_box($window, "line count=".$line_cnt);
59
60   //レコード内の番号とサンプル名を結合した文字列を作り、配列にする。
61   $ary_capt = array();
62   for ($i=0; $i<$line_cnt; $i++)
63    {
64    $ary_capt[$i] = $aryList[$i][0] . " " . $aryList[$i][3];
65    //wb_message_box($window, "made list caption=".$ary_capt[$i]);
66    }
67
68   //作った文字列をリストにセットする。
69   wb_set_text(wb_get_control($window,IDC_LSSAMPLES), $ary_capt);
70   break;
71
72   case IDCLOSE:
73   //****【x】ボタンが押された場合
74   //****ウィンドウを終了する。
75   wb_destroy_window($window);
76   break;
77  }
78 }
79
80
81 //******************************************************************************
82 //ファイル読み込み
83 // $window ウィンドウオブジェクト
84 // $tsvfile TSVファイル名
85 //******************************************************************************
86 function GetTsvFile($window, $tsvfile)
87 {
88  $list_ary = array();
89  $line_cnt = 0;
90
91  //****タブ区切りデータファイルをオープン
92  $tsvfp = fopen($tsvfile, "r");
93  if ($tsvfp == false)
94  {
95   wb_message_box($window, "データファイルのオープンに失敗しました。");
96  }
97  //****オープン成功
98  else
99  {
100   //****1行づつ読み込み
101   while($sline = fgets($tsvfp, 4096))
102   {
103    //****EOF/空行はスキップ
104    if (strlen($sline) < 9) continue;
105    //****配列として分解
106    $list_ary[$line_cnt] = array();
107    $list_ary[$line_cnt] = explode("\t", rtrim($sline));
108    //wb_message_box($window, "#".$line_cnt.":".$list_ary[$line_cnt][0]);
109    $line_cnt++;
110   } //end while:read line
111
112   fclose($tsvfp);
113  } //end else:file opened
114
115  return $list_ary;
116 } //end fuction
117
118
119 ?>
---------------------------

④フォームに配置したコントロール(ボタンとかリストとか)に動きを与えます。
 今日は、データファイル名を指定して、それをオープンし、内容をリストボックス内に表示するところまで作って見ました。
 WinBinderで以下の関数が用意されているので、それを使います。

・wb_sys_dlg_open:ファル選択ダイアログを表示して、選択されたファイルのパス名をリターンする。
・wb_get_control:フォームに配置されているコントロールのウィンドウオブジェクトをコントロールID(番号)から求める。
・wb_set_text:エディットコントロールに文字列をセットする。あるいは、リストボックスに文字列をセットする。リストボックスの場合は、文字列の配列を指定すると複数行にその文字列をセットしてくれる。
・wb_get_text:エディットコントロールから入力されている文字列を取得する。
・wb_message_box:メッセージボックスを表示します。デバック用に使っています。

 今日は
「参照」ボタンの処理(37行目~ case IDC_BTSELECT:)と、
「開く」ボタンの処理(47行目~ case IDC_BTOPEN:)を作りました。
 指定されたデータファイルをオープンして読み込むところは、前回のサーバ側スクリプトのソースをベースにしました。

 上記のソースを「ppecomakelist.phpw」という名前で、ppecomakelistフォルダにセーブします。
 セーブした.phpwをダブルクリックするとWinBinderがスクリプトを実行してくれます。

 で、こんな絵がでます。
1011293_3.jpg


 ここで、WinBinderの感想ですが、やっぱりデバッグの仕掛けが無い(と思っている)のがちょっとねー。
 なので、あっちこっちにwb_message_boxを仕掛けて、ちょっとづつコードを増やして行ってます。
 それと、用意されているwb_xxxx関数のマニュアル(ヘルプ)がWinBinderについてきているんですが、お世辞にも分かりやすいとは言えない内容。ぜんぜん親切じゃない。

 やっぱり下知識がなくても作り始められるのはいいんですが、これだとデバッグにはかなり難儀しそうです。

 今日はこの辺で。 m(__)m




PHP-はじめの一歩(その9)Windowsプログラムの作り方(2)

   プログラミング [2010/11/27]
11/25「PHP-はじめの一歩(その8)Windowsプログラムの作り方」の続きです。
前回で、PHPで作成したスクリプトからexeを作成する方法を説明しました。
今日は、ウィンドウを出して、そこからの操作で「何か」させるプログラムを作るための方法です。

■ウィンドウありプログラムの作成
 Window表示部分も言語使用としてはPHPを使う。
 ただし、エントリになるスクリプトの拡張子は、.phpwである必要がある。
 まずは、サンプルスクリプトを参考にして(ぐぐれば、説明してくれているサイトがあります。)、firstwin.phpwを作ってみましょう。

①シンプルなウィンドウプログラムの作成と仮実行
 bamcompileのフォルダの下にfirstwinフォルダを作成し、以下の内容のfirstwin.phpwを作成します。
------------------
<?php
//******************************************************************************
//PHPで作るWindowプログラム その1
//
//******************************************************************************
//****お決まり。必ず必要なインクルード
include "../../WinBinder/phpcode/include/winbinder.php";

//****ウィンドウ作成
//引数は順に、親ウィンドウのハンドル、作成するウィンドウの種類、
//ウィンドウのタイトル、サイズ(w、h)
$mainwin = wb_create_window(NULL, AppWindow, "ようこそ!", 300, 200);

//****コントロール作成(今回の場合はボタン)
//引数は、親ウィンドウハンドル(前の行のリターン)、コントロールの種類、
//コントロールの配置位置(x、y)、サイズ(w、h)、コントロールのID。
wb_create_control($mainwin, PushButton, "ここを押す", 110, 80, 80, 40, 1);

//****ウィンドウへ"process_main"関数をメッセージハンドラとして割り当てている。
wb_set_handler($mainwin, "process_main");

//****ここでウィンドウ のメインループに入る。
//これより後に、実行文を書いてはいけないそうです。
wb_main_loop();

//******************************************************************************
//メッセージハンドラ
//******************************************************************************
//第1引数にウィンドウのハンドラ、
//第2引数にウィンドウ内のオブジェクトに割り当てられたIDが入る。
function process_main($window, $id)
{
  switch ($id)
  {
    case 1:
      //****ポップアップを生成。
      //第1引数はparentウィンドウ、第2引数は表示テキ スト。
      wb_message_box($window, "メッセージボックスです。");
      break;
    case IDCLOSE:
      //****【x】ボタンが押された場合
      //****ウィンドウを終了する。
      wb_destroy_window($window);
      break;
  }
}
?>
------------------

 セーブしたfirstwin.phpwのアイコンが、WinBinderのアイコンになっていれば、その状態で実行することが可能です。ダブルクリックしてみてください。

 タイトル「ようこそ」の画面が表示されれば、成功です。

 もし、一瞬ウィンドウが表示されているようで、すぐ消える場合は、インクルードしているwinbinder.phpのパスが正しくない可能性があるので、見直してください。

 もっと凝ったものを作成したい場合には、WinBinderに含まれるライブラリ仕様を参照する必要があります。
 「スタート」-「すべてのプログラム」-「WinBinder」-「Welcome to WinBinder」を起動します。右図のウィンドウが表示されます。ウィンドウ中の「WinBinder Manual」をクリックして、関数リファレンスを参照してください。
 その他に、WinBinderをインストールしたフォルダにサンプルがありますので、参考にしてください。
 C:\Pleiades_e35\WinBinder\phpcode\examples

②ウィンドウのデザイン
 画面の大きさやカスタムコントロールの配置を最初からデザインしたい場合は、「スタート」-「すべてのプログラム」-「WinBinder」-「Form Editor」で、FormEditorを起動できます。

 FormEditorの使い方の詳細は割愛します。

 仮に下図のようなウィンドウを作ったとします。(使えるコントロール全部貼ってみました。)
1011271_1.png


 FormEditorのメニュー「File」-「Save project」を選択し、「保存する場所」にfirstwinフォルダを選択して、「ファイル名」(プロジェクト名)も「firstwin」として、作ったデザインをセーブします。
 そうすると、firstwinフォルダに、firstwin.prjとfirstwin.form.phpというファイルが作成されます。
 firstwin.form.phpには、デザインしたウィンドウ/コントロールを生成・表示すための、スクリプト(ソース)が含まれています。firstwin.prjは、そのソースをFormEditorで再編集するときのためのデータです。(注:なので、.form.phpを別のエディタで編集した後に、FormEditorで開いてセーブし直すと、他のエディタで編集した内容は無効になります。)


③デザインの取り込み
 次に、このデザインを先のfirstwin.phpwに取り込みましょう。
 firswin.phpwを以下のように編集することで、取り込み可能です。
------------------
<?php
//******************************************************************************
//PHPで作るWindowプログラム その1
//
//******************************************************************************
//****お決まり。必ず必要なインクルード
include "../../WinBinder/phpcode/include/winbinder.php";

//****ウィンドウ作成
//引数は順に、親ウィンドウのハンドル、作成するウィンドウの種類、
//ウィンドウのタイトル、サイズ(w、h)
//****FEで作成したソースに含まれるため、不要。
//$mainwin = wb_create_window(NULL, AppWindow, "ようこそ!", 300, 200);


//****コントロール作成(今回の場合はボタン)
//引数は、親ウィンドウハンドル(前の行のリターン)、コントロールの種類、
//コントロールの配置位置(x、y)、サイズ(w、h)、コントロールのID。
//****FEで作成したソースに含まれるため、不要。
//wb_create_control($mainwin, PushButton, "ここを押す", 110, 80, 80, 40, 1);

//****フォームエディタ(FE)で作られたソース。
//wb_create_windowと_controlが含まれる
include "firstwin.form.php";


//****ウィンドウへ"process_main"関数をメッセージハンドラとして割り当てている。
//****FEで作成されるメインウィンドウIDは、$winmainなので変更。
//wb_set_handler($mainwin, "process_main");
wb_set_handler($winmain, "process_main");


//****ここでウィンドウ のメインループに入る。
//これより後に、実行文を書いてはいけないそうです。
wb_main_loop();

//******************************************************************************
//メッセージハンドラ
//******************************************************************************
//第1引数にウィンドウのハンドラ、
//第2引数にウィンドウ内のオブジェクトに割り当てられたIDが入る。
function process_main($window, $id)
{
  switch ($id)
  {
    //****FEで作成したボタンコントロールのIDがIDC_PUSHBUTTON1001なので変更。
    //case 1:
    case IDC_PUSHBUTTON1001:
      //****ポップアップを生成。
      //第1引数はparentウィンドウ、第2引数は表示テキスト。

      wb_message_box($window, "メッセージボックスです。");
      break;
    case IDCLOSE:
      //****【x】ボタンが押された場合
      //****ウィンドウを終了する。
      wb_destroy_window($window);
      break;
  }
}
?>
------------------

 .phpwをセーブして、前と同じように、ダブルクリックして実行してみましょう。
 以下の画面が表示されれば成功です。
 [PushButton1]をクリックするとメッセージボックスが表示されるはずです。

⑥コンパイルして単独で動作するEXEを作る
 さあ、いよいよ単独動作(配布)可能なEXEの作成になります。
 難解です。しかもデバッカがないので、ミスしても簡単には修正できません。なぜ、動かないのか調査するのが大変なので、ミスしないように注意してください。

⑥-1 コンパイルパラメタ指定ファイルを作る
 以下の内容をfirstwinフォルダ内にfirstwin.bcpという名前でセーブする。
------------------
MAINFILE firstwin.phpw
OUTFILE firstwin.exe
WINDOWED
COMPRESS
DESTINATION /
EMBED firstwin
EMBED firstwin.form.php
DESTINATION include
EMBED C:\Pleiades_e35\WinBinder\phpcode\include\winbinder.php
EMBED C:\Pleiades_e35\WinBinder\phpcode\include\wb_generic.inc.php
EMBED C:\Pleiades_e35\WinBinder\phpcode\include\wb_resources.inc.php
EMBED C:\Pleiades_e35\WinBinder\phpcode\include\wb_windows.inc.php
EXTENSION C:\Pleiades_e35\WinBinder\binaries\php4\ext\php_winbinder.dll
------------------

・MAINFILE:エントリのある.phpwを指定する。
・OUTFILE:コンパイルした結果のEXE名を指定する。
・WINDOWED:ウィンドウプログラムである場合に指定する。これを指定するとEXE起動時にDOSプロンプトを開かない。ただし、デバック段階では、指定しないと、チープではあるがDOSプロンプトでエラーメッセージを確認することができる場合がある。
・COMPRESS:作成されたEXEを圧縮して小さくする指定。
・DESTINATION:.phpwをコンパイルして実行する場合、もともと動作していた環境(includeしていた.php)を仮想的にEXE内部に配置する必要があるらしい、その仮想フォルダを指定する。
・EMBED:先にDESTINATIONで指定した仮想フォルダに配置する(組み込む)インクルードファイルを指定する。
・EXTENSION:DLLをEXE内に取り込む場合に指定する。少なくともphp_winbinder.dllは必要。


⑥-2 スクリプト内のinclude指定の変更
 DESTINATIONとEMBEDで指定する実行時仮想空間に従ってスクリプトのincludeパスを変更する必要がある。
 つまり、⑥-1の指定の場合、EXE実行時には、
  /(ルート)にfirstwin.phpwとfirstwin.form.phpが配置され、
  /includeにwinbinder.php~wb_windows.inc.phpが配置されている
 という意味になるらしい。
 よって、firstwin.phpw内のincludeの指定では、その仮想のフォルダ指定としなければならない。
------------------


//****お決まり。必ず必要なインクルード
//※絶対パス指定だと、exeにしたとき実行時にもそのパスを参照してしまう。
//include "../../WinBinder/phpcode/include/winbinder.php";
include "include/winbinder.php";


------------------
 他の.phpソースをインルードしてその中のfunctionを実行したいような場合もたぶん同様に、.bcpで指定する必要があるはず。
 ちなみに、その辺の意味を知らずに外部.phpのインクルードを行ったが、うまく行かなかった。

⑥-3 コンパイルする
 「■ウィンドウなしのプログラムを作成してみる」で説明したのと同様に、ディスクトップに作成したBamcompileのショートカットを起動する。表示されるDOSプロンプトで以下のコマンドを実行する。
  例)C:\Pleiades_e35\bamcompile1.21> bamcompile firstwin\firstwin.bcp
------------------
C:\Pleiades_e35\bamcompile1.21> bamcompile firstwin\firstwin.bcp

Bambalam PHP EXE Compiler/Embedder 1.21

Using project file: firstwin\firstwin.bcp
Windowed application
Compress
Mainfile: firstwin.phpw
Outfile: firstwin.exe

Embedding firstwin.bcpEncoding and embedding firstwin.form.php
Encoding and embedding firstwin.phpwEmbedding firstwin.prj
Encoding and embedding include/winbinder.php
Encoding and embedding include/wb_generic.inc.php
Encoding and embedding include/wb_resources.inc.php
Encoding and embedding include/wb_windows.inc.php
Embedding php_winbinder.dll and adding it to extension loader
Compressing final exe..
Compression done

firstwin.exe created successfully!

C:\Pleiades_e35\bamcompile1.21> dir
------------------

 コンパイルが成功したら、dirコマンドを打って見ましょう。
 bamcompile1.21の下に、firstwin.exeが作成されているはずです。

⑥-4 動作確認
 本来、単純に作成されたEXEを実行すればいい話なのですが、この環境の場合はそうはいかないようです。
 開発環境だけで動作するexeが作られる場合があるので、以下のことをやって確認してみてください。
 ・WinBinderのインストール先フォルダの名前を一時的に変更する。
  C:\Pleiades_e35\WinBinder → TWinBinder
 ・作ったプログラムのソースフォルダの名前を一時的に変更する。
  C:\Pleiades_e35\bamcompile1.21\firstwin → Tfirstwin
 その状態で、DOSプロンプトから実行してみてください。
 例)C:\Pleiades_e35\bamcompile1.21> firstwin

 ⑥-1、⑥-2の工程が正しく行われていない場合、.phpwを実行すると正しく動作するのに、⑥-4の確認、あるいは、WinBinderを組み込んでいない他のWindowsPCでは動作しない(全く表示しないし、メッセージも出ません。)現象になりますので、十分ご注意ください。

 PHPスクリプト処理レベルでのエラーがある場合は、DOSプロンプトからコマンド入力で機動した場合、かろうじてメッセージが表示されることがあります。


おー 長かった。
次回は、いよいよ目的のプログラムを作ってみたいと思います。

今日はこの辺で。 m(__)m


PHP-はじめの一歩(その8)Windowsプログラムの作り方

   プログラミング [2010/11/25]
第2部です。

PHPでWindowsプログラムを作れるそうです。

なので、先日作ったサーバスクリプトが使用するタブ区切りデータを作成するためのプログラムを作ってみたいと思います。(※テキストエディタがあれば、十分作成可能なようにデータは簡素化した形式にしましたが、ここはアエテやって見ます。)

●必要環境
▲Bamcompile
 PHPをコンパイルしてexeにする環境
 ①http://www.bambalam.se/bamcompile/
 「Download Bamcompile1.21 (win32) zip」を選択しダウンロードする。
 →http://www.bambalam.se/bamcompile/download/bamcompile1.21.zip

▲WinBinder
 PHPスクリプトでウィンドウ表示/描画などを行うためのライブラリ?スクリプト動作環境
 ②http://winbinder.org/download.php
 「WinBinder-0.46.0.exe」を選択する。
 →http://winbinder.org/files/WinBinder-0.46.0.exe

上記2つだと、デバッグがなんか難しそうなので、コアの処理のデバッグ用に前回もつかったEclipseを使います。もしかしたら、WinBinderのスクリプトもデバックできるのかも・・・・

▲Eclipse
 ③http://mergedoc.sourceforge.jp/
 「Eclips 3.5 Galileo Pleades All in One」を選択し、その後サブセットを選択する画面が表示されるので「PHP」版か「Ultimate」版を選択するとダウンロードが開始される。使用したのは、PHP-JREあり版
 →http://ftp.jaist.ac.jp/pub/mergedoc/pleiades/3.5/pleiades-e3.5-php-jre_20100226.zip


●インストール
 Eclipseのインストールについては、省略します。

▲Bamcompileのインストール
インストールは、bamcompile1.21.zipを展開して、適当なフォルダに配置するのみ。
コンパイルの実行は、DOSプロンプト上で行うので、ショートカットを準備する。
1)ディスクトップ上でマウスの右クリックで、「新規作成」-「ショートカット」を選択する。
2)ショートカット作成のウィザードが起動されるので、以下を指定する。
   作成場所:ディスクトップ
   名前:bamcompile
3)作成された、ショートカットのアイコンを右クリックし、「プロパティ」を表示し、以下を指定する。
   リンク先:%SystemRoot%\system32\cmd.exe /k
   作業フォルダ:C:\Pleiades_e35\bamcompile1.21
   ※C:\Pleiades_e35は、展開したbamcompile1.21の配置先。

▲WinBinderのインストール
インストールは、WinBinder-0.46.0.exeを実行し、インストール先にbamcompileのインストール先の近くを指定する。例えば、C:\\Pleiades_e35\WinBinderとか。



●ウィンドウなしのプログラムを作成してみる
①phpスクリプトを作成する
 Eclipseを起動して、簡単なプログラムを作成する。
 デバックはEclips上で実施する。以下を「first.php」として作成。
 ---------------
  <?php
  echo "はじめてなんです。\n";
  echo "どうぞお手柔らかに。\n";
  ?>
 ---------------
 ※Eclips上でのテスト実行の方法については省略する。
 ※bamconpileのサポートするのは、PHP4なので、Eclipsのプロジェクトを作成する際に、PHP4を指定すること。

②コンパイルして実行
 Bamcompileの環境下に作成したphpファイルをコピーする。
 例)C:\Pleiades_e35\bamcompile1.21\first\first.php
 注)Eclipseの環境がS-JIS以外だと、日本語は文字化けするので、phpスクリプトをS-JISに変換する必要があります。例えば、sakuraエディタは、「名前を付けて保存」を選択すると、「文字コードセット」と「改行コード」を指定できるので、それぞれ「SJIS」、「CR+LF」を選択して保存し直すとよいでしょう。

 Bamcompileのショートカットを起動し、表示されるDOSプロンプトで以下のコマンドを実行する。
 例)C:\\Pleiades_e35\bamcompile1.21> bamcompile first\first.php first\first.exe
 コンパイルが成功したら、実行してみましょう。
 ---------------
 C:\\Pleiades_e35\bamcompile1.21> bamcompile first\first.php first\first.exe

 Bambalam PHP EXE Compiler/Embedder 1.21

 Mainfile: first\first.php
 Outfile: first\first.exe

 Encoding and embedding first\first.php

 first\first.exe created successfully!

 C:\\Pleiades_e35\bamcompile1.21>first\first
 はじめてなんです。
 どうぞお手柔らかに。

 C:\\Pleiades_e35\bamcompile1.21>
 ---------------

 簡単でしたね。

 では、今日はこの辺で。 m(__)m



PHP-はじめの一歩(その7)サーバ側完了

   プログラミング [2010/11/21]
昨日の続きです。

以下のシステム構成が全体なのですが、
(Ⅰ)自分のPC上で、タブ区切り形式のデータを作る(編集更新する)ためのプログラム
(Ⅱ)上記のプログラムで作成したタブ区切りデータを読み込んで、一覧ページを表示するためのPHPスクリプト
(Ⅲ)一覧ページ上の「申し込み」ボタンが押されたときに、「申し込み」ページを表示し、必要事項を入力して「送信」とやったら、さるにその内容の連絡を送るPHPスクリプト

今日、サーバ側で動作する(Ⅱ)(Ⅲ)をほぼ完成させました。
(Ⅲ)でちょっと大変だったのが、JavaScriptで動作する金額計算と、PHPでメールを自動的に送信するところ。
ここでのソース開示は、セキュリティ的になんだか無防備すぎるかと思うので、止めておきます。

残りは、(Ⅰ)ですが、
実は、PHPでWindowsアプリを作れるらしいので、それを次回から書き込んで行きます。

今日は、この辺で。 m(__)m


PHP-はじめの一歩(その6)スクリプトの解説

   プログラミング [2010/11/20]
ゆんべの続きです。

言い忘れてましたが、PHPを使って動的なホームページを作ろうと思ったら、知識としては、だいたい以下のようなのが必要です。

・HTML :タグそのものをスクリプトで操作しながら出力するので。
 ワープロ的なエディタでしかHPを書いてない人だと、タグそのものをあまり見慣れてないでしょうから、ちょっとハードルありますね。

・JavaScript :これまたHTMLの一部ですから。
 こちらも「スクリプト」なので、言わばプログラムです。こっちは、ブラウザ側で動かす部分。
 それに対してPHPは、サーバ側で動く部分。

・PHP :ちょっとだけね。

この時点で「うんざり:ギブアップ」な方も多いかもしれませんが、さるでもやれそうだから、思ったほどではないはず。
だいたい、さるなんかは、さるまねベースですから、細かいところは、その都度ぐぐって(Googleで検索して)ます。
例えば、「PHP ファイルアクセス 例」とか入れれば・・・・・出る出る。それを参考にすればいいだけ。

ちなみに、昨日「PHPって何の略?」って気になってぐぐったら。
「ゆめぞー先生のPHP講座」って言うサイトを見つけました。「ふーん」ですた。
でも、PHPが「PHP Hypertext Preprocessor」の略って言う説明を見て、「PHP」が既に入ってんじゃん???


●さて、昨日のPHPスクリプトの解説
============
  <body ・・・・>



1 <table border="1" width="95%">
2
3 <?php
4 //****変数の初期化
5 $item_ary = array();
6
7 //****タブ区切りデータファイルをオープン
8 $tsvfp = fopen("PPkago_sample_list.tsv", "r");
9 if ($tsvfp == false)
10 {
11 ?>

12   <td><tr>データファイルのオープンに失敗しました。</td></tr>
13 <?php
14 }
15 //****オープン成功
16 else
17 {
18   //****1行づつ読み込み
19   while($sline = fgets($tsvfp, 4096))
20   {
21     //****EOF/空行はスキップ
22     if (strlen($sline) < 9) continue;
23     //****日本語の部分をshift-jisからutf-8に変換
24     $sline = mb_convert_encoding($sline, 'UTF-8', 'SJIS-win');
25     //****配列として分解
26     $item_ary = explode("\t", rtrim($sline));
27     //****材料提供可否とコメントを文字メッセージに変換
28     if ($item_ary[9] == "1")
29     {
30       $fOKNG = "可";
31       $OKmsg = "";
32     }
33     else
34     {
35       $fOKNG = "不可";
36       $OKmsg = htmlspecialchars($item_ary[10]);
37     }
38     //****HTMLとして出力
39 ?>

40     <tr>
41     <td width="50%" align="center" bgcolor="#ffffff">
42     <img src="ppeco/<?=htmlspecialchars($item_ary[1]);?>">
43     </td>
44     <td width="50%" align="left" bgcolor="#ffffff">
45     <font color=blue>番号:
46     <b><?=htmlspecialchars($item_ary[0]);?></b></font><br>
47     <?=htmlspecialchars($item_ary[3]);?><br>
48 <?php
49     if ($item_ary[2] != null)
50     {
51 ?>

52     <a href="ppeco/<?=htmlspecialchars($item_ary[2]);?>">
53     大きい写真</a><br>
54 <?php
55     }
56 ?>

57     <font color=blue>サイズ:おおよそ
58      H<?=htmlspecialchars($item_ary[4]);?>
59     ×W<?=htmlspecialchars($item_ary[5]);?>
60     ×D<?=htmlspecialchars($item_ary[6]);?>
61     cm</font><br>
62     <font color=red>サンプル個数:<b>
63      <?=htmlspecialchars($item_ary[7]);?>
64     /<?=htmlspecialchars($item_ary[8]);?>
65     </b></font><br>
66     <font color=red>材料提供:<b><?=$fOKNG;?></b></font><br>
67     <?=OKmsg;?><br>
68     <font color=green>手数料:
69     <b>¥<?=htmlspecialchars($item_ary[11]);?>
70     </b></font><br>
71     <!input type="SUBMIT" NAME="submit" VALUE="申し込み">
72     </td>
73     </tr>
74 <?php
75   }
76   fclose($tsvfp);
77 }
78 ?>

79
80 </table>



  </body>
============

赤く色を付けたところが、PHPのスクリプトです。<?php・・・?>で囲まれていない部分は、そのままクライアント(ブラウザ)に送られるデータ(HTML)になります。

行番号もふって見ました。
でも、このブログ記事の中にHTMLのタグを記述するのがとっても大変なので、以降<>は省略します。

・4行目 //で始まっているので、コメントです。
 //以降は、行末までコメントとみなされます。
 ちなみに、/*・・・*/の場合は、「・・・」の部分がコメントで、複数の行を跨ぐこともできます。

・5行目 配列変数の宣言です。ここにデータ(タブ区切りデータ)一行分を格納します。
 他の単独の値、文字列を格納するための変数であれば、宣言なしでいきなり使えますが、配列は別っみたいです。

・7~14行目 データファイルをオープンしてます。
 オープンに失敗すると、fopen()はfalseをリターンするので、falseの場合は、tr(行)とtd(カラム)の中に、エラーメッセージを表示して、tableタグを閉じます。
 16行目~ はオープン成功時の処理。その終わり位置は77行目です。

・19行目 whileループです。75行目がループ処理の終わり位置です。
 fgets()で1行づつデータを読み込んで、$slineにセットします。
 gets()は、ファイルの最後まで読むとfalseをリターンするので、その時点でループ終了になります。

・22行目 EOF(end of file)とか空白行があった場合、処理しないで次のループ。
 strlen()は文字列の長さを求める関数で、この場合、9文字より少なかったら、continueで19行目に戻ります。

・24行目 読み込んだ1行分のデータの中に日本語が含まれているような場合、sift-jisからutf-8に変換して、元の$slineにセットします。

・26行目 $slineのデータをexplode()関数で、\t(=タブコード)を区切りとして配列に分解します。
 rtrim()は文字列の中の空白文字とかを削除する関数です。
 これで$item_aryという配列に分解されたデータ(文字)が配置されます。

・29~37行目 材料の提供可否を入力データとしては、1、0で表しているので、人間が見て理解できる文字に置き換えます。また、「不可」の場合に「色違いだったらいいよ」とかコメントを入れるので、その場合のコメントを別の変数にセットしてます。

・40~73行目 ここがHTMLデータの中に繰り返し出力される部分です。
 途中<?=変数;?> となっている部分は、「指定されている変数にセットされているデータをその箇所に文字列としてセットする」という意味です。
 htmlspecialchars()は、指定された文字列の中をチェックしてHTMLとしては問題のある文字(<>など)を問題ない形式に変換する関数です。
 また、48行目から56行目では、大きい写真のファイル名が指定されていなければ、「大きい写真」と表示されてリンクされる画像の指定自体をセットしない ようにしています。

・76行目 75行目がwhileループの終わりの処理なので、使い終わったデータファイルをクローズする処理です。

以上、PHPスクリプト自体は、80行にも満たない内容で、やりたいことができそうです。


●動かして見る(デバッグ)
 Eclipseの使い方になります。

・現在開いているPHPスクリプトをテスト動作させるためには、まずはApacheを動かす必要があります。
 何回か前の記事で書いてたのですが、ディスクトップに作成したxammp_controlのショートカットで起動して、表示されるウィンドウでApacheを[Start]させます。

・次にEclipseに戻って、「実行」-「デバックの構成」を選択します。
 左側の欄に「PHP Webページ」と表示されたアイコンがあるので、そこでマウスを右クリックします。
 表示されるプルダウンメニューから「新規」を選択します。
 右側の欄にデバックする対象を指定できるようになるので、「名前」と「ファイル」を指定します。
 「名前」は適当な名前をつければよくて、「ファイル」はテストしたいPHPファイルを指定します。[参照]ボタンで選択ダイアログを使って選んだ方が、パス指定とか悩まなくて済みます。
 一番下の「URL」が実際にデバック開始時の対象PHPを指定する部分で、ブラウザのアドレスバーと同じ指定方法です。通常は「ファイル」指定を元に自動生成でいいでしょう。
 [適用]ボタンで保存が行われ、この設定がデバッグを開始したときのデフォルトになります。
 [デバッグ]ボタンで、デバック開始です。(2回目以降は、[F11]キーで開始することができます。)

・前のデバック構成の指定で「最初の行でブレーク」が指定されているので、先頭行で動きは一時停止します。
 [F7]はGoで、[F6]は一行づつ(ステップ)実行、関数とかに差し掛かったときに関数の中にステップインする場合は[F5]を押せばいいです。

・例えば、ステップ実行とかで一時停止している状態のときに、スクリプト内の変数とかに、マウスカーソルを近づけると、その時点でのその変数の内容がポップアップ表示されます。
 また、ウインドウ内に「変数」というタグがあれば、そのタグを選択すると、使用している変数の一覧と内容が表示されます。

・止めたい行で一時停止したい場合は、スクリプトソースの行番号の左側をマウスで右クリックすると、プルダウンメニューが表示され、その中の「ブレークポイントの切り替え」を選択すれば、その行にブレークポイントが設定されて、そこを処理する前の状態で一時停止します。当然、ブレークポイントを設定した行ががif文の中で、テスト時にそこが処理されないようなときは、一時停止(ブレーク)は起きません。

●動きました、アップします
 載せたコードは、デバッグしたもの(なので、昨日とちょっと違う)だから、当然動きます。
 HTMLから参照している画像ファイル、それと元になるタブ区切りデータをサーバにアップします。
http://nga78n.miraiserver.com/ppecosamples.php 出ました。
 ついでに、データファイルにもう2レコード追加してアップしなおしてみます。
 出るかな・・・・

 次回は、[申し込み]ボタンをここに追加して、それによって表示される申し込みフォームのページを考えます。
では。m(__)m

 




PHP-はじめの一歩(その5)スクリプトのコーディング

   プログラミング [2010/11/19]
11/18「PHP-はじめの一歩(その4)スクリプトの設計」の続きです。
上記の記事で予告した(?)の機能のスクリプトを作成します。

●テストデータの準備
まずは、扱うデータとして、テスト用データをテキストエディタで作成します。
データの構成は、
-----------
・サンプル番号     :テキスト
・籠サンプルの写真   :画像ファイル名
・大きい写真      :画像ファイル名
・名前         :テキスト
・サイズH       :数値(cm)
・サイズW       :数値(cm)
・サイズD       :数値(cm)
・残数         :数値
・作成数        :数値
・材料の提供可/不可  :1=可、0=不可
・不可の場合のコメント :テキスト
・サンプルの値段    :数値(円)
-----------

これをデータの並び(レコード)に置き換えて、入力すると以下のような感じ。
------------------------------
S-1 PPkagoS-1.jpg PPkagoS-1B.jpg 籠 20 15 25 1 4 1 色違い可 850
S-5 PPkagoS-5.jpg PPkagoS-5B.jpg 筒 25 25 10 0 1 0      1000
------------------------------
間が空いているところは、タブを入力して区切ります。
テスト用なので2行(レコード)もあれば十分でしょう。

ファイル名は、ppkago_sample_list.tsvとします。
これを 開発環境のフォルダである、「C:\Pleiades_e35\xampp\htdocs\sarumosunaru_cgi」にセーブします。

●PHPスクリプトを作る
まずは、Eclipseを起動します。(11/17「PHP-はじめの一歩(その3)サンプルをアップ」ご参照。)

先日作った「sample.php」が表示されました。
この間sample.phpのテストを実行した状態で閉じたので、「PHPデバック」の画面構成になってます。
編集中心の「PHP」という画面構成があるので、それに切り替えます。Eclipseの画面の右上くらいに切り替え用のアイコンボタンがあります。「PHPデバック」と書いてある隣です。

▲新規にPHPスクリプトファイルを開く
「ファイル」-「新規」-「PHPファイル」を選択して、
作成するファイル名を「ppecosamples.php」と付けます。
「完了」ボタンをクリックします。エディタとしてのウィンドウ中央に、<?php とだけ書かれた「ppecosamples.php」が表示されます。

さあ、それではコーディングに入りましょう。

▲作りこむ処理は
昨日も書いたのですが、おおまかな処理シーケンスとしては、以下です。
//****タブ区切りデータファイルをオープンして読み込み
//****1行づつ配列に変換して保持
//****HTMLとして出力

▲今あるHTMLのベースをコピペ
<?php下に「//」でこのプログラムの機能とかをコメントで入れて、?>で閉じます。
次に、今回作る「見た目」は、前のHTMLがあるので、それを一旦全部コピペします。
そこで<table>内をデータファイルを元に作成すればいいだけ。(のはず。)

▲一個一個処理を潰していきましょう。
・ファイルのオープンは、fopen()関数
・読み込みは、一行づつ読む fgets()関数
・一行の解析は、explode()関数
※タブ区切りのデータを簡単に配列にしてくれちゃいます。
 こんな便利な機能があるとは。感動ものです。
・それと、mb_conbert_encoding()関数
 後で気づいたのですが、Windowsなのでデータは単純にはshift-jisとしてデータが作成されます。
 なので、それをUTF-8に変換する必要があります。
※shift-jisのままでもEclipseの設定をshift-jisに設定して、
 htmlに<meta>でcharsetをshift-jisに設定してあげればいいだけ
 なんですけど、今回はサーバ標準?のUTF-8を使います。

▲こんな感じに・・・・・
============
<body ・・・・>



<table border="1" width="95%">

<?php
$errmsg = "";
$item_ary = array();

//****タブ区切りデータファイルをオープン
$tsvfp = fopen("PPkago_sample_list.tsv", "r");
if ($tsvfp == false)
{
  $errmsg = "データファイルのオープンに失敗しました。";
}
//****オープン成功
else
{
  //****1行づつ読み込み
  while($sline = fgets($tsvfp, 4096))
  {
    //****EOF/空行はスキップ
    if (strlen($sline) < 9) continue;
    //****日本語の部分をshift-jisからutf-8に変換
    $sline = mb_convert_encoding($sline, 'UTF-8', 'SJIS-win');
    //****配列として分解
    $item_ary = explode("\t", rtrim($sline));
    //****材料提供可否とコメントを文字メッセージに変換
    if ($item_ary[9] == "1")
    {
      $fOKNG = "可";
      $OKmsg = htmlspecialchars($item_ary[10]);
    }
    else
    {
      $fOKNG = "不可";
      $OKmsg = "";
    }
    //****HTMLとして出力
?>

    <tr>
    <td width="50%" align="center" bgcolor="#ffffff">
    <img src="ppeco/<?=htmlspecialchars($item_ary[1]);?>">
    </td>
    <td width="50%" align="left" bgcolor="#ffffff">
    <font color=blue>番号:
    <b><?=htmlspecialchars($item_ary[0]);?></b></font><br>
    <?=htmlspecialchars($item_ary[3]);?><br>
<?php
    if ($item_ary[2] != null)
    {
?>

    <a href="ppeco/<?=htmlspecialchars($item_ary[2]);?>">
    大きい写真</a><br>
<?php
    }
?>

    <font color=blue>サイズ:おおよそ
     H<?=htmlspecialchars($item_ary[4]);?>
    ×W<?=htmlspecialchars($item_ary[5]);?>
    ×D<?=htmlspecialchars($item_ary[6]);?>
    cm</font><br>
    <font color=red>サンプル個数:<b>
     <?=htmlspecialchars($item_ary[7]);?>
    /<?=htmlspecialchars($item_ary[8]);?>
    </b></font><br>
    <font color=red>材料提供:<b><?=$fOKNG;?></b></font><br>
    <?=OKmsg;?><br>
    <font color=green>手数料:
    <b>¥<?=htmlspecialchars($item_ary[11]);?>
    </b></font><br>
    <!input type="SUBMIT" NAME="submit" VALUE="申し込み">
    </td>
    </tr>
<?php
  }
  fclose($tsvfp);
}
?>


</table>



</body>
============


ちょっと記事が長すぎなので、中身の解説は次回。
今日はこの辺で。m(__)m


PHP-はじめの一歩(その4)スクリプトの設計

   プログラミング [2010/11/18]
11/17「PHP-はじめの一歩(その3)サンプルをアップ」の続きです。

さて、昨日までで、自分のPCでPHPスクリプトを開発(作ってテスト)する環境の構築と、実際のサーバへのアップの段取りができたので、いよいよ目的のものの開発に入ります。

そもそも作りたいのは、
「PPバンドかご サンプルリスト」のページを簡単に更新できる仕掛けと、
「申し込み」を行っていただくためのフォーム。
従来のここ「http://nga78n.web.fc2.com/omake/ppecofrm.html」です。
上記のページは今までは、手で毎回HTMLを更新していました。
また、「申し込み」によって表示されるはずの、申し込みフォームは、infoseekのタダサービス終了とともに無くなってしまいました。


現状の全体構想としては、
(Ⅰ)自分のPC上で、タブ区切り形式のデータを作る(編集更新する)ためのプログラム
(Ⅱ)上記のプログラムで作成したタブ区切りデータを読み込んで、一覧ページを表示するためのPHPスクリプト
(Ⅲ)一覧ページ上の「申し込み」ボタンが押されたときに、「申し込み」ページを表示し、必要事項を入力して「送信」とやったら、さるにその内容の連絡を送るPHPスクリプト

の三つの仕掛けを考えています。

最初は(Ⅱ)から着手します。
一覧データから読み取って「サンプルリスト」ページを表示するスクリプトを作るということです。

通常、というか多くは、こういうリスト形式のものは、DBを利用することが多いのですが、
DB(MySQLとか)利用を許可しているタダサイトは少ないですし、
もしDB利用型で作って、この間のように、スペース提供者が急に「ヤーメタ」ってことになると、路頭に迷ってしまうことになるので、いわゆるDBは利用しないで作ります。
それに、何万件とかのデータを処理するわけではないので。

なので、ページに表示する元データは、Excelやテキストエディタでも編集(データの追加/更新)が可能な、タブ区切り形式のデータを使います。


---------------------------
ここで、PHPの特徴をさらーっと説明すると。

▲<?php ・・・・ ?> で囲まれたところがスクリプトとして、サーバ側で処理される部分になる

▲逆に囲まれていない部分は、HTMLデータとしてクライアント側に送られるデータ

▲PHPは基本的にC言語に似ている。
(ちなみに、さるがプログラム言語として知っているのはC言語のみ。)
 ・処理行の終わりは「;」で終わる。
 ・コメントは「/*・・・*/」「//・・・」
 ・if-else if-else、while、for、switchなどの書き方は、C言語と一緒。
 ・ifとかwhileの処理ブロックは「{・・・}」で囲む。
 ・標準関数的なものもかなりC言語的。数はC言語の比ではない。(と思う。)

▲ちょっと違うかなーというところは、
 ・変数の先頭には、「$」が付く。
 ・付かないのは関数名、defineで定義した定数。
 ・変数の型の宣言は明確ではない。
 ・配列は、「= array(・・・);」で宣言する。
 ・オブジェクトは、「= new xxxx();」で確保?する。(C++はnewでしたっけ?)
 ・メモリ領域の明快な確保/解放はあまり意識しなくてもいい?
  普通の変数は「= null;」、配列は「unset(配列名);」で使用終了する。
  特にやらなくても、処理が終われば、勝手に解放されるみたい。
 ・関数の宣言は 「function xxx()」
 ・defineはプリコンパイルではなく実行時に解釈される。(スクリプトなんで。)
  また、C言語とはちょっと違う。
 ・includeも同じく実行時。なので、include自身もif文で飛ばしたりもできる。

「結構違うじゃん」と思うかもしれませんが、そんなに大したことはない。
コンパイル型の言語に比べれば、かなりいい加減に作ってもそれなりに動く感じ。
楽です。

でも、あくまでも、さるの単なる感想なので、正しい知識は、
「ソフィのPHP入門」等で学習されることをおススメします。
---------------------------

さて、話を元に戻して、(Ⅱ)の設計です。

まずは、表示したいデータの項目を列挙します。
・籠サンプルの写真
・サンプル番号
・コメント
・大きい写真
・サイズ(H、W、D)
・残数
・作成数
・材料の提供可/不可
・不可の場合のコメント
・サンプルの値段
このくらいでしょうか。
この列挙データをファイルとしてスクリプトと同じフォルダに持っていることが(Ⅱ)のスクリプトの動作の前提となります。

それでもって、(Ⅱ)の処理をもう少し具体的な処理区分に分けると以下のようになります。
//****タブ区切りデータファイルをオープンして読み込み
//****1行づつ配列に変換して保持
//****HTMLとして出力
わーシンプル。

では実際にコーディング始めます。
今日の記事は、この辺で。 m(__)m



PHP-はじめの一歩(その3)サンプルをアップ

   プログラミング [2010/11/17]
11/17「PHP-はじめの一歩(その2)Eclipseインストール」の続きです。


昨日作ったPHPスクリプトを 利用申請したサーバにアップして動くかどうか試してみます。

前準備として、昨日インストールしたEclipse/Pleiadesの「C:\Pleiades_e35\xampp\xammp_control.exe」と
「C:\Pleiades_e35\eclipse\eclipse.exe」のショートカットをディスクトップに作成して起動しやすくします。

1)作成したショートカットでxammp_controlを起動して、ApacheをStartさせます。

2)同じく作成したショートカットでeclipseを起動します。
昨日作成したsample.phpの中身が表示されます。

そのスクリプトは、昨日のままの状態では、少しチープすぎるので、もうちょっとだけ手を加えます。
最低限、charsetの指定はしないと文字化けするんで、以下のようなコードにしました。
--------------------
<?php
$honjitu = date("Ymd His");
$message = "はじめてのPHPスクリプトです。";
?>
<html>
<head>
<meta HTTP-EQUIV="Content-Type" content="text/html; charset=UTF-8">
<title>さるもすなる</title>
</head>
<body BACKGROUND="image/mainback.gif">
<hr>
<h1 align="center">
<img src="image/rolling1.gif" align="middle">
<font COLOR="#004466"> さるもすなるCGIテスト中 </font>
<img src="image/rolling2.gif" align="middle">
</h1>
<hr>
<?=$message;?>-<?=$honjitu;?>
<br><br>

<?php include_once "js_hotwavespace.php"; ?>

</body>
</html>
--------------------

途中のinlude_onceは、利用させてもらうサーバの利用規定で、入れなければいけないJavaScriptのコードです。

あと、何個か画像の参照があるので、それをワークディレクトリである「sarumosunaru_cgi」の下に準備します。
実際のパスは、「C:\Pleiades_e35\xampp\htdocs\sarumosunaru_cgi」の下になります。
そこにimageフォルダを作成して、mainback.gif、rolling1.gif、rolling2.gifをセットします。

[F11]と[F7]で動作確認して見ます。
動きました。

3)できたスクリプトをアップしましょう。
ffftpを使います。頂いたメールの情報でFTPのセットアップを行います。
・・・・・・つながったみたい。

ルートに「/cgi-bin」というフォルダが既に用意されていました。
たぶんこの下にphpスクリプトをセットしないと動かないかな?
でも、試しに、ルートにアップしてみます。

sarumosunaru_cgi以下の、sample.php、js_hotwavespace.phpをアップして、
imageフォルダをサーバ上に作成し、.gif三つをアップしました。

ブラウザのアドレスバーに以下のURLを打ち込んで見ます。
http://nga78n.esy.es/sample.php
動きました。


割とすんなり行きました。
おかげで、日を越さない内にこの記事アップできそう。

今日は、この辺で。m(__)m





PHP-はじめの一歩(その2)Eclipseインストール

   プログラミング [2010/11/17]
11/16「PHP-はじめの一歩」の続きです。

ダウンロードしたPleiades(pleiades-e3.5-php-jre_20100226.zip)は、Windows上でPHP開発環境を構築するためのプログラムセットで、以下のものが含まれるらしい。
  + Apache 2.2.11
  + MySQL 5.1.33 (Community Server)
  + PHP 5.2.9 + PEAR (PHP 4 wird nicht mehr unterst・zt)
  + XAMPP Control Version 2.5 from www.nat32.com
  + XAMPP CLI Bundle 1.3 from Carsten Wiedmann
  + XAMPP Security 1.0
  + SQLite 2.8.15
  + OpenSSL 0.9.8i
  + phpMyAdmin 3.1.3.1
  + ADOdb 5.06a
  + Mercury Mail Transport System v4.62
  + FileZilla FTP Server 0.9.31
  + Webalizer 2.01-10
  + Zend Optimizer 3.3.0
  + eAccelerator 0.9.5.3 for PHP 5.2.9 (auskommentiert php.ini)
  etc

肝心のEclipseという名前が出てきてないので、ちょっと不安。
しかも、そもそもJREってなんだ?(Java Runtime EnvironmentでJavaで作られたプログラムを動作させる環境らしい。でも、PHPを開発する環境にどう関連付くのか全く理解できていない。)

前提とするOS環境は、以下だそうだ。
  + 64 MB以上のRAM
  + 250 MB以上のディスクの空き容量
  + Windows NT, 2000, 2003, XP (EMPFOHLEN?), VISTA
  + 32 Bit Systeme (not 64bit PC/SO?)

残念ながら、今使っているWindows7は出てこない。またまた不安。

まずは、インストール方法を解説してくれているサイトを参考に以下の手順でインストールを実行して見ます。


1)「C:\Pleiades_e35」というフォルダを作って、pleiades-e3.5-php-jre_20100226.zipの中身を全てコピー(解凍)。

2)DOSプロンプトを開いて、「C:\Pleiades_e35\xammp\setup_xammp.bat」を実行。
なんだか、成功したような・・・・・

3)今度は、エクスプローラから「C:\Pleiades_e35\xammp\xamp_controler.exe」を実行。
Apacheと書いてある隣の「Start」と書いているボタン押してみた。「Running」と表意されたので、どうも動いたみたい。動作させる際になんかWindowsのセキュリティ関連のメッセージが出力されたが、「ホームネットワーク」を選択して、許可した。
他に、MySQLを起動させるボタンもある。まずは、よく分からないので、触らないでおく。

4)IEを起動して、「http://localhost/」とアドレスを打ち込んでみた。
「XAMPP」とブラウザに大きく出ました。たぶんここまでは成功。

5)そのままでは、外からのアクセスとかが危ないらしいので、セキュリティ設定をする必要があるそうだ。
「http://localhost/」の画面の「日本語」と書いてあるリンクをクリック。

→ようこそ画面が出た。

→左側のメニューから「ステータス」を選択する。

→ステータス画面が出た。以下の内容。
   ----------------
    MySQL データベース 開始
    PHP 開始
    HTTPS (SSL) 開始
    Common Gateway Interface (CGI) 開始
    Server Side Includes (SSI) 開始
    SMTP Service 停止
    FTP Service 停止
   ----------------
あれ?MySQLはstartさせなかったのにと思って、前のxammp_controlのウィンドウをみたら、MySQLが「Runinng」になっていた。・・・いつの間に?

→左側のメニューから「セキュリティ」を選択。
かなり、危ない状況であることが、別ウィンドウで表示された。

→その下に「http://localhost/security/xamppsecurity.php 」とリンクされているところをクリック
MySQLのrootのパスワードとXAMMPのユーザ/パスワード登録を実行する。
MySQLはxampp_controlでStop-Startを行った後、ブラウザの画面の左側のメニューから「セキュリティ」を選択すると前の画面がでて、「要注意」となっている部分が減った。

これで、httpdサーバ(ローカルwebサーバ)の起動は成功したものと思われます。

6)Eclipse(C:\Pleiaes_e35\eclipse\eclipse.exe)を実行して見る
途中、ワークディレクトリをどうするか質問されたが、デフォルトのままとした。
また、Windowsのセキュリティメッセージが表示されたが、再度「ホームネットワーク」を許可とした。
起動した。

7)Eclipseの「ファイル」-「新規」-「PHPプロジェクト」を選択して、プロジェクトを作成する。
プロジェクト名「sarumosunaru_cgi」とした。

→次に、「ファイル」-「新規」-「PHPファイル」を選択してPHPスクリプトをエディタできるようにする。
PHPスクリプト名は「sample.php」とした。

→ソースは簡単に以下の内容を打ち込んだ。
   --------------
    <?php
    $honjitu = date("Ymd His");
    $message = "はじめてのPHPスクリプト";
    ?>
    <html>
    <body>
    <?=$message;?>-<?=$honjitu;?>
    </body>
    </html>
   --------------

→[F11]キーでデバック開始、[F7]キーで続行とやってみた。
Eclipseのデバッカ内のブラウザに何か出ました。
日本語コードを何にするかmetaタグで指定していないので文字が化けしたが、何かはでた。

→試しに、IEでアドレスに「http://localhost/sarumosunaru_cgi/sample.php」と打ったらやっぱり出ました。
ブラウザのエンコードをUTF-8に変更したら、「はじめてのPHPスクリプト-20101117・・・・」と出ました。

成功です。


PHPの言語仕様やサンプルに関しては、http://nyx.pu1.net/ 「ソフィのPHP入門」がさるのバイブルになりそうです。

一段落したので、今日はこの辺で。 m(__)m


PHP-はじめの一歩

   プログラミング [2010/11/16]
サンプル籠だとか、マニュアルだとかを注文してもらう用のサイト(CGI)を作ろうかと思っています。
他のネタも少なくなるころだし、どうせなので、ここで経過を記録して行こうかと思います。

まずは、「なぜCGI(Common Gateway Interface:ブラウザからサーバに対して、何かプログラムを動作させるように指示して、その結果をレスポンスしてもらう仕掛け。レスポンスは、当然ブラウザが受け取って意味をなすHTMLの形式で出力してもらうことが多い。)か?」ということですが。

だいたい、さるのHPは写真とそれへのコメントがセットで、それ以上の脚色を必要としていません。言わばさるレベルな為に何の見た目の工夫もありません。

でも、量が多くなってくると、その整理は、それなりに大変です。

普通、形式がある程度一定で、書かれている内容の構成が一緒なら、それをデータベース化してシンプルに保存しておいて、「見る」ときに、定型化した見た目のフォーマットにはめ込んで見せるのが一般的です。

今までは、HTML形式のタグテキストをエディタで毎回修正していたのですが、「もう少し簡単に中身の追加や更新ができるようにしたいなー」というのがその主な理由です。
でも、この間HPを全体引っ越したおかげで、以前準備していた仕掛けが使えなくなったので、俄然「CGI化が必要になってしまった」というのが本当のところです。

おー。前置きが長い。

さて、「はじめの一歩」なので何からはじめるか。
1)CGIを作る言語は色々ありますが、最近はPHPが多いみたいなのでそれを使います。

2)「PHPを使う」と決めたら、次にそれを「動作させてもいいよ」と言ってくれる、ホームページサービスを探します。
さるの場合、お金を掛けないことを目標にしているので、当然「無料」を探しました。それなりにありました。
で、申し込みました。二日前に申し込んで、今日、ユーザ登録ができたとの回答がありました。

3)PHPでプログラム(スクリプト)を作って、テストする環境を準備する必要があります。
 最悪、「無し」でエディタさえあれば、できないこともありませんが、さすがに、本チャンのサーバ使ってはデバックテストは効率が悪いので、できるだけ開発環境を準備した方がいいでしょう。
 Eclipseという統合開発環境(IDE)があるそうで、「Eclips 3.5 Galileo Pleades All in On」というのが「全部入り」みたいなので、さるは、それをダンロードしました。(http://mergedoc.sourceforge.jp/ ご参考)

この続きは、また次回(できれば明日)。m(__)m


PAD図を作るツール

   プログラミング [2009/11/06]
前回このカテゴリの記事を書いてから、既に3ヶ月経ってますね。

ちょっと気持ちに余裕がでたので、眠い目を擦りながら、作りかけだったプログラムのデバックなんかしてました。
コアになるコンソールプログラムの部分で結構手間が掛かって、今風の見た目の部分は、未だに未着手です。
とほほ。

話は少し代わりますが、PAD図ってご存知ですか?

プログラミングを始める場合、たいていフローチャートという、プログラムの処理手順を図で書くことを習うのですが、それの少し形を変えたやつです。
高級言語向けで、そこからそのままコーディングレベルまで落としこむことができます。(言っている意味が良く分からないかな?)

フローチャートを書いてから、プログラム言語にすると書きやすいということです。

慣れた人だとそんな絵なんか書かなくてもプログラムは書けます。
でも、ここからが落とし穴。

小さいプログラムならまだしも、そうやって作ったプログラムが大きくなってくると・・・・・
他の人が見てもなかなか理解不能だったり、作った本人でも時間が経って忘れてからでは、処理の詳細までなかなか思い出すのに時間が掛かります。(今回、さるの場合はこれ。)

そうしたときに、「きったないソースを理解しやすくする」ために、PAD図にしてしまうという手があります。

「少しは理解しやすくなうのでは?」
そう考えてズーット昔に、C言語で書いたソースからPAD(風)図を作るツールを作りました。
古ーいOS対応ですが、未だにココからダウンロード可能です。

http://www.vector.co.jp/vpack/filearea/dos/prog/tool/
http://nga78n.web.fc2.com/ngaintro.htm

でもって、それをWin32版にしようと、しこしこし始めて、早半年。
少しまともになってきてるので、公開し始めはおりますが・・・・・
http://nga78n.web.fc2.com/prog3cnsl1.htm

出力は「なんちゃってPAD図」だし、あんまりテストしてないし、GUIができていないので
とっーても使いにくいかも知れないですけど・・・「無いよりマシ」くらいの気持ちでなら使えるはず。

「きったないソース」を解析しなければならなくなった方にお薦めします。
「なんちゃってPAD図」の他に、「ソースのネストの最初と最後を線で結んでリスト出力」する機能とか、「なんちゃって関数関連図」を出したりする機能もありますのでよろしければどうぞ。

あっ 言い忘れてましたけど解析する対象はC言語限定です。
でもって、「とんでもなく汚いソース」を食わせると暴走する可能性がありますので、悪しからず。

もう少し使えるようにします。期限は予告できませんけど (^^;)。

sarumosuS.jpg

長くなったので今日はこの辺で。 m(__)m

そうそう、このブログサイトの記事は現在登録日に公開されない問題が出ているので、この記事もすぐには出ないかも。 まいっか。



ご無沙汰

   プログラミング [2009/07/21]
ちょっと久しぶりの記事です。

ここのところ、オモーイ腰を少し上げて、かなり昔に作ったプログラムを今の環境で使えるように弄ってました。
(このブログを主にご覧頂いている方には、かなり縁遠い話かもしれませんが、ネタがこれしかないので、・・・すいません。カテゴリも追加しちゃいました。)

NGA-TOOLSという名前でフリーで公開しているプログラムがあるのですが、
今はたぶん聞きなれないOS/2&MS-DOSというOS環境で作成したもので、Windows系には正式には対応していません。Windows7なんてとんでもない状態。

でも、自分でも未だに使う機会が結構あるし、ダウンロード数も多くはないですが、安定的にあるようなのです。
なので、数年前から気が向いたとき(1年に1度あるかないかの頻度)に今のWindowsで正式に動かそうとしています。(それにしちゃ遅すぎ!とご批判くださる方もいるかもいるかもしれませんね。 (^^;;;;)

というわけで、ここ2週間?ほど、プログラムの移植を行ってました。
何とか一段落したので、途中版なのですが、HPの方にアップして、・・・・・少しホットしているところ。

ちなみにオリジナルを作ったのが、ソースの日付が1996年で最後方だったので、ほぼ15年くらい前に作ってたみたい。(そんな昔だったんだー。)
さらに、Windows版を作ると言い出したのが2002年ごろなので、7年前だったみたい。(遅いにも程がありますよね。)

「そんなの作っても使われるのか?」そんなことも考えてはいるんですが、「自己満足でいいじゃない。」と少し意地になり始めです。

開発環境はフリーのlccを使っているので、慣れてないせいもあって、少しい効率が悪いのですが、まあ何とか進んでます。

移植するのは、あと一種類くらいで、残りはGUIが必要なので新規に作ろうかと思います。
タブンその方が早いと思うんですけど、何せlccでウィンドウプログラムは作ったことがないので、どうなるかは分かりません。なんだかリソースエディタ的なものはなさそうなので、.rcをエディタで弄るんだろうか。むーん。

その他2、3やりたいネタは持っているんですけど、このスピードだと7の次のOSが出る頃までには完成してないでしょうね。・・・・きっと。^^;;)

もーし、その辺に必要性のある方は、どうぞこちらsarumosuS.jpgへ。



カレンダー
07 | 2017/08 | 09
- - 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31 - -
プロフィール

さるもすなる

Author:さるもすなる
さるです。別HPサイト「さるもすなる」から侵食してきました。 山菜/きのこ、それとタイトルにしたPPバンド籠のことをメインに徒然に・・・・暇を持て余したさるの手仕事:男手芸のブログってことで。

最新記事
最新コメント
月別アーカイブ
カテゴリ
天気予報

-天気予報コム- -FC2-
本家のHPのトップ
山菜や茸の話です
PPバンドの籠作品と作り方です
投稿をお待ちしております



ブログランキング・にほんブログ村へ にほんブログ村 ハンドメイドブログへ



マニュアルのお申し込み



検索フォーム
リンク
RSSリンクの表示
ブロとも申請フォーム

この人とブロともになる

QRコード
QR