ウィリアムのいたずらの、まちあるき、たべあるき

ウィリアムのいたずらが、街歩き、食べ物、音楽等の個人的見解を主に書くブログです(たま~にコンピューター関係も)

仕様書からのプログラム自動生成って、VBAで書くと大変だけど、PHPなら、楽勝かもお?

2005-11-25 17:32:14 | PHP

 現在実験中!のお話。

 Excelの仕様書から、Excel VBAで、Javaなり、いろいろな設定ファイルなり、テストデータなりを自動生成させるっていうことは、良くあると思います。というか、ウィリアムのいたずらの仕事の大半は、それです。

 で、この作業は、基本的にはこうなります。

(1)元データとなる、仕様書をExcelファイルで用意する

(2)自動生成する雛形(プログラムなり、スクリプトなり)を用意する。
  そこに、元データのどこがはいるかを、タグで指定する

(3)Excelで、雛形をよみこみ、タグが出てきたら、そのタグを解釈し、
   繰り返しなら繰り返す
   条件なら条件判定して、OKなら書き出す、NGなら書かない
   値をとってくる場合は、元データからとってくる
 というプログラムをマクロ(VBA)でつくる

(4)Excelの上記マクロを実行する。




 でもでもでも、ですよ。。。

(1)の元データって、実は、CSVでもぜんぜんOKなんですよ。

で、

(2)の雛形ファイル、これを、PHPでかく。

つまり、ソースコードのあたまに、
<?
//==============================//
//	文頭の呪文	  //
//==============================//
	session_start();
	$data	=	$_SESSION['data'];
?>
<html>
<BODY>
<pre>

(実際の<>は、半角)

って、かいちゃうわけよ。で、ソースプログラムを書く。
で、最後に
</pre>
</body>
</html>

(実際の<>は、半角)

 ってかくと、中身は、JavaやCなんかのソースプログラムなんだけど、PHPで扱える形式になるよねえ。。。
 なので、PHPファイルとして(拡張子phpで)保存しておく。

 もちろん、このとき、(Java等の)ソース中の(半角の)< > &は、 < > &(&は、本当は小文字)に、「すべて置換」しておくこと。(じゃないと、タグと思われて、異常終了になってしまう)

そうすると

(3)のプログラムは、CSVファイルを読み込み、雛形PHPファイルを解釈して、ソースを書き出すっていうことだよねえ。。。

 ところが、PHPを使えば
 ・CSVファイルを読み込んで、
 ・今まで説明したように、その内容をセッションに入れる。
 ・そして、雛形ファイルをLocationで設定して呼び出すと。。。
 ・呼ばれた雛形ファイルは、
    セッションの中に入っている元データをもとに、
    ソースを(展開して)作成するよねえ
    →つまり、プログラムを自動生成する。。よねえ。。




おお、そうすると、
(1)元データをCSVで用意して、
(2)雛形ファイルをPHPで、
    上記呪文部分と、
    値を出力する部分を<?=data[1][2]?>のように指定
    条件部分(IF文を書く)
    繰り返し部分
     <?for($i = 5 ; $i <count($data) ; $i++){?>とか書くのと    を指定して用意し、
(3)はじめのフォームからCSVと雛形のありかを指定し、
(4)サーバーで、CSVファイルを読んで、雛形をLocationで呼び出すPHPプログラム(これは汎用的に使える)を書けば、

もう、なんでも、自動生成できるじゃん!

 すげー、Excelなんかだと、このタグを解釈する部分のプログラムが難しい(IF文や繰り返し処理などが難しい)んだけど、PHPなら、そこの部分を書く必要がない(PHPのエンジンがやってくれるので)から。。。数十行でかけちゃう!(Excelだと、数百行、や千行以上になってくる)

 おおおお




 というのを、今実験中です。上の意味がわかんなかった人でも、実験結果をみれば、分かってもらえると思います。現在、普通のファイルの自動生成はOKなんですけど、今度は、実際のプログラムを雛形にして、テストしてみるつもりです(実際の説明のときのサンプルは、この実験したものと異なり、もっとわけりやすいのにすると思いますけど)

以上、現在ウィリアムのいたずらが、研究中の中間報告でした

P.S 本当のことを言うと、今日、これを書こうと思って、つくってたんだけど、テストが終わらなかったのです。


  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

MVCに分けることの奥義?(MVCに分けるために利用する技術は、必須ではない。代替可能)

2005-11-25 14:44:16 | Weblog

 昨日のブログの、MVCの奥義とは?ってことについて、ここで書きます。

 MVCというのは、結局、画面(V)と、処理部分(C)という、異質なものを分けたいという話につきる。で、この分けるときに、後のデバッグのことや、管理上の問題から、一度、コントローラーに集中させると便利っていう話でしかない。

つまり、それらをまとめると、こんなかんじ。
・画面と処理という異質なものを整理するには、それぞれをわけることが必要
・で、その際、それらを管理するコントローラーがあると便利
・で、このとき、画面と処理で共通に使うデータをどこかに用意しないといけない
  このとき、用意の仕方は2とおり
    ・1つは、各画面、各処理関数に、共通に利用する変数の入れ物を用意し
     その入れ物を渡す
     →このいれものを、バリューオブジェクト(VO)と呼ぶことにしよう
    ・もうひとつは、すべての画面、処理関数が、共通にアクセスできる領域を用意する

 逆に言うと、この領域を渡さない限り、独自に動きが取れない。
 そして、この領域の構造を柔軟に作れば、独立性がたかまり、ユニットテストしやすくなる。
 さらに、(今まであげた例で言えば)セッションという共通領域に、どういう項目が入っているかについて知らなくても(さらに決まっていなくても)、テストやコーディングが可能になっている。

 ということが大事なので、別に、セッションを使うことや、Locationで飛ばすことが大事なのではありません。実際、セッションやLovationを使わなくたって、1本のプログラムに、最終的にまとめる形だって、MVCの考え方で、作ることは可能だったりします。

 たぶん、こちらの方法のほうが、現実的だと思います。

 ということで、その例を今回は示しましょう。




■■ 具体例
 いままでどおり、伝言板の例です。

■■ 基本的な方略
・はじめに、処理部分を、1つのファイルにまとめて書き、それを関数にします。
 この関数に必要な変数は、$VOという引数の中にいれ、処理結果を$VOにいれ、この値を返します
・コントローラーでは、
 画面から受け取った$_POSTの値を$VOにセットし、この関数を呼び出す形にします
・画面は、この$VOの値を表示するのみの形にします(いままでの$_SESSIONが$VOに変わったってこと)
・最後に、
  コントローラー
  画面
  処理関数
 の順に書いて、1つのファイルにまとめます。
・ユニットテストは、処理関数を1つのファイルにまとめておいてあるので、そのファイルをインクルードし、処理関数を呼び出し、$VOを表示する画面を作成し、それを起動して確認します。

■■ 具体的なファイル内容

●処理関数部分
まずは、処理関数部分です。
<?
//==============================================//
//	処理部分				//
//==============================================//
function shori($VO)
{

	//	データセット
	//	本当は、DB検索とかをする
	$rec['simei'] = "社長";
	$rec['naiyo'] = "健康に注意して馬車馬のように働け";
	$data[1] = $rec;

	$rec['simei'] = "部長";
	$rec['naiyo'] = "オレの給料を上げるため、お前らは死ぬほど働け";
	$data[2] = $rec;

	$rec['simei'] = "係長";
	$rec['naiyo'] = "あのー、できないことを要求されても、できません";
	$data[3] = $rec;

	$VO['dengon'] = $data;

	return $VO;
}
?>

(上記の< > ¥ は実際には、半角です)
こんなかんじで、allinone_shori.phpというファイルにまとめておきます。

●画面部分
 画面部分は、いままでの、$_SESSIONのところを、$VOに変えます
 具体的なサンプル、コントローラー+画面+処理で書きます

●コントローラー
 コントローラーは、処理関数を呼び出し形になります。
 具体的なサンプル、コントローラー+画面+処理で書きます

●コントローラー+画面+処理
 コントローラーと、画面、処理をまとめて、1つのファイルにします。
 こんな感じです。
<?
//==============================================//
//	コントロール部分			//
//==============================================//
	foreach($_POST as $key => $val)
	{
		$VO[$key] = $val;
	}

	//	処理部分呼び出し
	$VO = shori($VO);


//==============================================//
//	ここから下は、結果表示			//
//==============================================//
?>

<HTML>
<BODY>

<? print $VO['username']?>さんへ<p>

今日の伝言<p>
<table border=1>
<? foreach($VO['dengon'] as $rec){ ?>
<tr><td><? print $rec['simei'] ?></td><td><? print $rec['naiyo'] ?></td></tr>
<? }?>
</table>
</BODY>
</HTML>

<?
//==============================================//
//	処理部分				//
//==============================================//
function shori($VO)
{

	//	データセット
	//	本当は、DB検索とかをする
	$rec['simei'] = "社長";
	$rec['naiyo'] = "健康に注意して馬車馬のように働け";
	$data[1] = $rec;

	$rec['simei'] = "部長";
	$rec['naiyo'] = "オレの給料を上げるため、お前らは死ぬほど働け";
	$data[2] = $rec;

	$rec['simei'] = "係長";
	$rec['naiyo'] = "あのー、できないことを要求されても、できません";
	$data[3] = $rec;

	$VO['dengon'] = $data;

	return $VO;
}
?>

(上記の< > ¥ は実際には、半角です)
 これを、allinone.phpとして、保存します。

●呼び出し画面HTML
 呼び出し画面のHTMLファイルは、上記のallinone.phpを呼び出す形にします。
 こんなかんじです。
<HTML>
<HEAD><TITLE>てすとだぴょん</TITLE></HEAD>
<BODY>
<Form action="allinone.php "method="post">
    Name:  <input type="text" name="username"><br>
<input type="submit" name="submit" value="実行">
</form> 


●デバッグ画面
 デバッグは、最初に、allinone_shori.php(処理部分のみのPHP)を呼び出し、処理を実行し、$VOの値を書き出します。こんなかんじです。
<?
//////////////////////////////////////////////////////////
//	プログラム開始					//
//////////////////////////////////////////////////////////

			//	処理をインクルード
	include("allinone_shori.php");

			//	初期設定
	$VO['username'] = "課長";
	$VO = shori($VO);

?>

<html>
<head><title>テスト結果</title><head>
<body>

<h3>テスト結果</H3>
<? 
	print_dispdata($VO,"");
?>

</body>
</HTML>

<?

//////////////////////////////////////////////////////////
//	ここで使う関数					//
//////////////////////////////////////////////////////////

	//==============================================================//
	//	関数:print_dispdata					//
	//	内容:表示します					//
	//	引数	$data	表示するもの				//
	//		$mae	表示時、行の前の文字(スペース)	//
	//==============================================================//
	function print_dispdata($data,$mae)
	{
		foreach($data as $key => $val)
		{
			if ( is_array($val)	==	true)
			{
				print $key . "は、配列<BR>";
				print_dispdata($val,$mae . " ");
			}
			else
			{
				print $mae . $key . ":" . $val . "<BR>";
			}
		}
	} 
?>





 このやりかたであれば、もし、テンプレートを使うとしても、$VOを書き出して、最後の画面表示部分が、変わってくる感じになる程度だと思います。

 画面をこのように、入れ込むのではなく、Locationで呼び出す場合も、コントロールの最後に、呼び出し部分をheaderで指定し、画面部分をカットすればOKです。

 で、テンプレートを使わないなら、このままで、だれも、文句を言われないと思います(そこまで、くわしくはチェックしない。プログラムって、構造計算書と一緒。。おお、これは、禁句です(^^;)

 ということで、いままでのやり方を、ちょっとひねることによって、対応可能です。

 実際のところ、どれくらいひねるか?(前のMVCの方法でいくか、今回みたいにするか、テンプレート使うかなどなどは)は、場合によって違います。ただし、テンプレートを使う場合、うまく使える範囲、問題が起こる範囲と、その原因くらいは、おさえておかないといけないかもしれません。
(まだ、この分野に関しては、研究中なので、ここで、披露するとしても、もっともっと先のことでしょう)

 え、奥義というほどじゃないって。。。たしかに、ケンシローに怒られそうだ(^^;)

  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

眞鍋さんもスパイウェアに感染。。。眞鍋さん以上に注意しないといけないアナウンサーもいるのでは?

2005-11-25 11:23:49 | Weblog

 眞鍋かをりさんが、スパイウェア撲滅キャンペーン出席したそうな、
 で、眞鍋さん、スパイウェアに

「私も感染してました」と驚いた様子。「意識が薄い人も多いので、これから広めていければ」とPRしていた。

そうです(斜体部分は、このニュースから引用)

 そーだよねー、眞鍋さんだったら、眞鍋さんのパソコンの個人情報だけでも売れそうだもんねー。芸能人の人は、たいへんですよね。。。

 訪問したサイト一覧を出されて、イメージ総崩れ!なんて、ありそーだもんねー。

 とくに、(芸能人ではないが)このアナウンサーは注意すべきだろう!


  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする