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

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

PHPで、SOAっぽい?ことをやらせる、XML-RPCについて、その仕様と使い方のありか

2005-11-30 16:46:31 | PHP

 以前、ブログのコメントで、 エンジニアAさんから

ふと思ったのですが、PHPでSOAっぽく作っている開発ベンダってあるんでしょうか?

っていただいたのですが、

 SOAっぽいといえば、XML-RPCって、そうですよね。

たぶん

 。。。。ちがうかな(^^;)


 で、XML-RPCを、PHPで開発している会社というと、

  このGooのブログが、そうみたいです!!

Gooのスタッフブログ XML-RPC公開についてによると、


先ほど、XML-RPC APIを公開しました。XML-RPC APIはブログを外部から操作するための仕組みのことを言います。


ってかいてあって、その下のほうで、


このブログライター機能をお使いいただくには皆さんのブログごとに設定が必要です。詳しい使い方はこちらをご覧ください。


で、「こちら」のページにとぶと、最後に


◆エンドポイントについて

「goo RSSリーダー」以外のXML-RPC API対応のアプリケーションをお使いの方は、以下のエンドポイントを設定して下さい。

http://blog.goo.ne.jp/xmlrpc.php


ってかいてあって、最後.php出終わっているので、たぶん、PHPでしょう。。きっと

 おお、GooのXML-RPCは、PHPでやっているのね。。。




 って、それはいいとして、ウィリアムのいたずらがXML-RPCに、詳しくないからかしら。。。

 XML-RPCといっても、仕様は、いっぱいあると思うんですけど(^^;)

 たぶん、Blogger XML-RPC APIをサポートしてるんですよね、きっと??

 ちがうかなあ。。

 ちなみに、Blogger XML-RPC APIについて説明してあるサイトは
 こことかここ
 XML-RPC全般の仕様についてはこちら

で、肝心の、PHPでの、XML-RPCのやりかた(サーバー、クライアントとも)については
 こちら
http://www.linux.or.jp/JF/JFdocs/XML-RPC-HOWTO/xmlrpc-howto-php.html





ついでに、Javaの場合は、Apache XML-RPCになるらしい。
ここ
http://ws.apache.org/xmlrpc/


ちなみに、もうすでに、Apache XML-RPCで、GooのXML_RPCを使ってみた人もいるみたい
ここ
http://blog.goo.ne.jp/pie001/e/bee5d82fb3e8973d763b54fb5f59cd49

そこに、サンプルのソースコードものっているみたいっす。

P.S といっても、ウィリアムのいたずら、いま忙しいので、ぜんぜん試してない&試している暇ないのであった。



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

無償のWeb脆弱性テストツールとWebアプリケーションファイヤウォールなどなどの話

2005-11-30 10:29:31 | JavaとWeb

 日経システム構築2005年12月号に載っていた、Webの脆弱性の調査ツールなどなどの記事について、
 日経システム構築に載っているサイトって、わかりにくいページがのっていたり、使い方のページが載っていないので、使い方がわかんなーい!と思うので、ここで、フォローしてみたりする。




無償の脆弱性テストツール:自動的にテストしてくれる



■■ Nessus
ここ
http://www.nessus.org/


使い方の説明についてなどは、
【連載 】高機能スキャナ「Nessus」を使ったセキュリティ診断

■■ Nikto
ここ
http://www.cirt.net/code/nikto.shtml


使い方の説明についてはこんなところ
http://kinshachi.ddo.jp/kurage/html/MT/comp/archives/000387.html
http://bal4u.dip.jp/mt/server/archives/2004/10/webtopzlebxli_n.html
http://www.altech-ads.com/product/10001240.htm

■■ Wikito ■■
NikitoのWindows版。日経システム構築の紹介してある会社のページからは、探しにくいと思う。
このページから、ダウンロードできるみたい
http://www.sensepost.com/research/wikto/


スクリーンショットもそこにあるし、ドキュメントもダウンロードできるけど。。。登録が必要かもかも




無償の脆弱性テストツール:手作業の支援をするもの


■■ Achilles■■ 
 アキレスといっても、この会社ではない。(あたりまえじゃ ^^;)
ここ
http://www.mavensecurity.com/achilles

そのページによると、このソフトは

The first publicly released general-purpose web application security assessment tool. Achilles acts as a HTTP/HTTPS proxy that allows a user to intercept, log, and modify web traffic on the fly.

なんだって。

 で、さらに、そのページに、「presentation pageにいくと、Webアプリケーションのセキュリティをテストするために、achillesをどうやって使うかについて見れるよー」ってことらしいので(ウィリアムのいたずらの訳によると)、いってみると(ここ) 
(以下、表題のみ、ウィリアムのいたずらが一部日本語に訳して&ないしはかたかなにして、引用)


 ウェブアプリケーション ハッキング
 最新のハッカーツールと、テクニック!(2005-10)
 アタック ポータルポイント&クリックハッキング
 セッションIDケーススタディ


 おお、さっきのツールの説明は、結局どこにあるのだかわかんないけど(じゃ、だめじゃん ^^;)心引かれる題名です。

 って、話それてきたんで、つぎ

■■ Paros ■■ 
ここ
http://www.parosproxy.org/index.shtml


使い方については、ここらへん

■■ WebScarab ■■
ここ
http://www.owasp.org/software/webscarab.html

で、これがEclipsのプラグインで動くらしく
ここ
http://linux.softpedia.com/get/System/Networking/WebScarab-for-Eclipse-6898.shtml

このページから、スクリーンショットがみれるようになっている。
ここにもスクリーンショットがあったりする




有償の脆弱性テストツール:有償だけど、有名なやつ


■■ AppScan ■■
ここ(テクマトリックスのページ)
http://www.techmatrix.co.jp/products/security/watchfire/prod/appscan.html





WAF(Webアプリケーションファイヤーウォール)について



 ちょっと、話がちがってくるけど、その記事にでていた、WAFについて。
 その記事に紹介されているページだと、わかりにくいとおもうので、このページのほうが、いいんじゃないかっつーページを書いてみました。

■■ ModSecurity■■
Apache用
すべて、ここにまとまっている

■■ Guardian@JUMPERZ.NET■■
IISでも使えるらしい。
ここに日本語ユーザーズマニュアルがあるので、こちらからはいって、ダウンロードサイトにいったほうがいい




ログ解析ツールででていたものについて



マイクロソフトが出している、LogPaserは、このページのほうが、わかりやすいかも



そのほかで、記事のなかにあったものについてのフォロー



 ちなみに、その記事の13、14あたりの規約については、そのほかの規約と一緒に、このページにまとめてあったりする

 なお、その記事の11で、脅威モデルについて、マイクロソフトの説明ページがのっているが、中途半端なページ(第一部、脅威とその対策の紹介の3番目「脅威モデルを作成する」)からなので、そうではなく、はじめのページからみたほうがいいと思います。

 初めのページは、ここ
 Web アプリケーション セキュリティ強化: 脅威とその対策


P.S このブログは、ブログルポの評価システムで、評価できるようにしてあります。気が向いたら、したのURLをクリックして、評価してね!
この記事を評価する




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

11月30日のメルマガは、外部設計について

2005-11-29 22:43:33 | コピーされるほど儲かるシステム!

 11月30日、「コピーされるほど儲かるシステム!開発日記」第25号を出します。

 内容は、外部設計について。
 以前書いた外部設計で、やることなどの内容プラスアルファです。

ということで、あとは決り文句。




 25号のメルマガについての、感想などはここの「コメント」にどうぞ!

 メールと、ウィリアムのいたずら自身のブログについては、このブログの
「コピーされるほど儲かるシステム!開発日記」へのメールについて
http://blog.goo.ne.jp/xmldtp/e/a58b79b40b1148c2f744556e27b76a79
を参照してください




 さらにつけたし。

 ちなみに、そのメルマガっていうのは、
ここのことです
http://www.geocities.jp/xmldtp/mag.htm

このブログは、そのメルマガについて、書くはずだったんだが。。。(>_<!)

P.S いつも、上記の「決り文句」を書いていて、もう20回以上になるが、
今日はじめて、その「決り文句」に、誤字があるのに気付いた(>_<!!)
 

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

フリーのPHPエディタを使ってみる&そのダウンロードサイト

2005-11-29 18:39:05 | PHP

 PHPで、最近書くことが、多くなった。
 メモ帳じゃなくって、エディタがあったほうがいいなと思ったけど、
 Zend Editorは、3万円以上もするので、あちゃ。。ということで、却下!

 ということで、フリーで使える、PHPエディタをとりあえず、つかってみることにした。
 そのPHPエディタのサイトはここ
http://phpspot.net/php/phpeditor.html


 で、ダウンロードしてみた。

 おお、なんとなくつかえそうじゃん!
 ちゃんと、文字を打つと色分けされるし。。




 まずはじめに、立ち上げて
 プロジェクトを「ファイル」の「名前を付けてプロジェクトを保存」でつくって、
 そのプロジェクトに、とりあえず、いままで作ったphpプログラムを
  「ファイルから追加」で追加して
 で、ちょこっと修正して、保存して
 「実行URLの設定」でhttp://127.0.0.1/そのPHPにして
 「実行URLを開く」にすると、実行する!おお!!

 で、コードチェックは、
 「実行」の「構文チェック」をやると、php.exeの場所をきくので、
 指定すると(普通C:¥phpとかにはいってる)
 おお!チェックするぞ!

 ただ問題は。。。それを開いてみると、
 改行コードが¥nだ(>_<!)
 (¥rが入ってないので、ぜんぶつながっちゃってる。↑が改行のところに入ってる)
 しかたないっす。
 一度保存したのを、ワードパッドで開いて、再度MS-DOS形式で保存しなおすっす。。
 



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

PHPでつくる、仕様書からのプログラム自動生成(その4:データファイルの仕様など)

2005-11-29 17:19:22 | Weblog

 昨日書いた、仕様書をCSVで書き出し、雛形ファイルを用意すると、仕様書の内容をいれて、プログラムが自動生成するという話。

 今回は、その仕様書の形式とか。。の話
 もう一度、手順を書くとこんなかんじ。

■■ 手順的にはこんなかんじ
・仕様書をCSV書き出ししたものと、
・雛形を用意して、
   ↓
・このPHPを実行すると、
   ↓
・ブラウザ上に、雛形の指定したところへ、仕様書の値を入れて
 ソースを書き出す。

 前のブログは、雛形ファイルの書き方だったので、今回は、「仕様書をCSV書き出したもの」について




■■ 仕様書の形式

仕様書の形は、昨日の例に示したような、(CSVっていってるけど、本当は)タブ区切りのテキストです。いちおう昨日の例をしめしておくとこんなかんじ。
Mtr>
テーブル名	HELLO_WORLD_TABLE	PRIMARY KEY	NO
名前	型	桁数(文字のとき)	NOT NULL
NO	INTEGER		NOT NULL
LANGUAGE	VARCHAR	50
MESSAGE	VARCHAR	100


上のほうに、繰り返しとは関係ない項目をかき、
(例の場合は、テーブル名とプライマリーキー)

見出しをいれて、
(名前 型 桁数(文字のとき) NOT NULLの行)

あとは、繰り返し部分をかきます。
繰り返しのはじめの行が、for $i=開始行 の開始行になります。

で、0スタートです(0行0桁からはじまる。1ではない)
したがって、例の場合は、開始行は2からです。




ふつうのExcelの仕様書をCSVファイル形式でおとすと、こんな感じになると思います

 で、昨日のPHPプログラム(makepro.php)にバグがあって、途中に、改行だけの空白行があった場合、その行を読み飛ばしてしまいます。
 そのため、最終行以外で、改行だけの行がある場合、漢字の空白なり、何か文字を入れるなりして、空白行でないようにしてください。
(今度、Webに公開するかもしれませんけど、そのときは、途中に空白行があっても大丈夫なように、直しておきます)




 実際にこれを使ってやる場合、雛形をいっぺんに作ると、バグがあると、なにもでない!となってしまい、バグが見つけにくいので、まず、テストデータをつくって、雛形をすこし作ったら、確認しながら、全体を作っていったほうが、やりやすいです。




 ちなみに、なんで、これで、ソースが作成されるかというと、実は、ここのブログで書いたことの応用です。

 コントローラー=makeproでやっていること
    画面の内容をセッションにいれて
    処理(CSVデータを読み込む)をして
    その結果を、セッションに入れて
    画面(ここでは、雛形プログラム)を呼び出す

 処理部分(shori)=makeproのshori
    CSVデータを読み込んでいる

 画面=自動生成されるソースプログラム
    セッションの内容($dataにいれている)を、セットして、
    画面(じゃなくって、ソースコードだけど)を生成

 これを一連の処理として実行すると、CSVデータを読み込み、その内容をセッションにセットして、雛形ファイルをLocationで呼び出して、セッションにはいっているCSVの内容を取り出して、雛形の指定のところに入れてもらうと、画面のかわりにソースコードをつくってくれるということです。




 っていうことは、データをセットして、画面のかわりに、PDFlibを使って、PDF書き出しをしたら
帳票作成ツールができるのかとか?

 っていうことは、データをセットして、画面のかわりに、GDを使って、グラフ書き出しをしたら
グラフ作成パッケージができるのかとか?

 言われたら。。。たぶんできるんでしょうな。。 

 (ただ、その場合は、雛形ファイルをPHPプログラムにするより、雛形ファイルは、位置と、文字や線など表示種類と、文字の場合、CSVデータのどの項目を出力するのかの指定にして、画面プログラムは、CSVデータと、この雛形データを読み込んで表示する形にしたほうが、後での雛形修正が楽)

 とするとですよ。。。

 Javaなんかだと、帳票作成ツールは、自分で作らないけど、PHPの場合、そういうツールを作れるから、PHPのほうが、自由度たかいっちゃー、たかいよね。



 ということで、この「PHPでつくる、仕様書からのプログラム自動生成」シリーズはここで完結です。



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

CVSを使った構成管理の問題と対策

2005-11-29 14:22:49 | 開発ネタ

 確か、日経システム構築の今月号(2005年12月)に、CVSを使って、ドキュメント管理とソース管理、システムの自動生成テストを行い、オフシェア(中国利用)で開発した例が載っていたと思います。
 ですが、そこでは、単に成功事例だけで、一般的に、どういう問題が起こり、どういう対策ができるか?なぜ、そういう手法をとったのかについては、かかれていなかった気がします。
 そこでウィリアムのいたずらが、今日はまず、CVSによる構成管理の問題点と、その対応策について(この点に注意すれば、けっこうおおきな開発でも使えそうという話)を書きます。




 まず、CVSによる集中型の構成管理(1箇所をCVSサーバーにして、すべてそこに成果物をおき、管理する方法)は、そこにも指摘されていたように、オフショアでは問題ありますし、そうでなくても難しいと思います。

 そこに指摘されていたのは、中国の通信事情でした。

 これは、中国の一般的なソフトハウス(注:中国の場合、大学が直営?のソフトハウスを持っている場合があり、その場合は、事情が違うかもしれない)の場合、通信回線が(厳密に言うと)「遅くなることがある」ということです。

 これについては、中国のIXについての事情があるかもしれません。
 日本と違い、外国への通信をするためのIXは。。。(いわないでおこう。。壁に耳あり商事にメアリー:ちょっとちがう?調べれば分かる)。

 (中略)

 てなわけで、通信事情に、問題がある「場合がある」のですよ。
 それに、日本でも、ある場所にサーバーをおいてソース管理するといった場合、わけもわかんないフリーの人や、大手競合会社が入ってきていいのか?という問題があります。
(最近のシステムでは、FNHIの複数が部分的に受託するということがある)




 ということで、自然と、分散型の構成管理になります。

 この方法は、ある一定時間に、自動的あるいは手動的に、ネットワークあるいはフットワーク(だれかが持っていくということ、別にフットワークの配送に限ったわけでなく、一般名称)を使って送り、全体を構成管理するサーバー(CVSサーバーでも、なんでもいいんだけどね)に送ります。

 このとき、構成管理の追加、変更の申請書があると、作業的に、実はバグ発生時のバージョン管理で楽なんですけど、そんなことは、OSS信奉者には、「面倒になるだけだ」といって、受け入れられないことなんで、書いてもらえない気がします(といいつつも、この書類を、「やみくもに」書かされることもある。その場合は、この書類を十分に使いきれていない。つーか、なぜ書くのか分かっていないことも多かったりする。結合テスト以降のバグのときにつかう)。




 この場合の問題は、多くは結合テスト以降で起こります(それ以前では、起こらない。また、中小規模では起こらない。開発場所がある程度多くないと起こらない)。

■問題1 (集中型でも、分散型でも起こります)
 ある会社が、呼び出されるほうの”インターフェース(引数または返り値などの)の”修正を行ったとき、一部の会社は対応しているが、ほかの会社は対応していないため、コンパイルができなくなることがある。
 この場合、バグフィックスを確認するためのテスト確認作業が(コンパイルができなくなるので)遅れる。

■問題2 CVSから、更新されたソースだけを入れ替えて、独自で、コンパイルしてテストされた場合に問題が起こる。

 あるいは、jarファイルの一部だけを持ち帰ってテストされたときなどで。。

 そうすると、バグが起こっても、どの状態のソースのときに、バグがおきたのか分からない

 たとえば、ソースA,B,C、D,Eとあったとき、

 10:30分にソースBが
 10:50分にソースDが
 11:00分にソースB、Cが更新されたとする。

 このとき、勝手に最新版をとってきて、テスターがテストしていいとしたとき、
 (ありえないけど)

 テスター甲は、10:45分にソースを落とし、10:55分に、ソースEの箇所で起きたバグを発見し、11:10分に報告したとする。
 その時点で、Eの担当が11:15分に、ソースを入れ替えて見ても、再現しなかった場合、何が原因なのか、わからない。(この場合、ソースBのバグがEに影響したもので、11:00の修正版で直ってて、今のソースでは、自然治癒している可能性がある)。バグ票に、発見時間が書いてあったとしても、更新が頻繁に行われ、かつ、すべての時計の時刻が必ずしも正確でないという状況の場合は、意味がない。

→この問題は、実は起こらない。必ず対策が行われるので。

 そして、このための対策として行われることのために、実はCVSの利用は広まっていない。




■■ 対応策

●問題2についての対応策

・後者の対応として、ビルド番号(ないしはバージョン番号)をいれて、一定時刻にコンパイルするようにしています。

 そして、バグ票には、かならずビルド番号をいれます。

 テスト対象になるのは、このビルド番号を持っているオブジェクトのみです。

 上記の例の場合、10:30、Bがいれたあと、一斉ビルドを行い、bild no 200511291145というものだったとしたら(めんどーなので、NOを時刻とした)、バグ票にそうかかれるので、開発の人は、現在のバージョンで再現しない場合、このビルドNOのオブジェクトとソースを取り出して確認するので、問題箇所を再現できます。

 ふつう、このような形で管理していると思います。

 あの日経システム構築の場合も、この手法でしたよね。一定時間でのコンパイル。

 だからこの問題は、起きません。

 しかし、こうやってやる場合、そのコンパイル時間前までに、ソースをある場所にFTPで送って(HTTPやHTTPSでアップロードでも、いいけど)、そのあとmakeでプログラムを実行して、ビルドしたオブジェクトを公開、ソースを退避させ、保存しておけばいいじゃん!っていうことになります。

 そのとおりです。。

 でもそうすると、CVSいらないです。

 事実、CVSのような構成管理ルーツは使わないということも多いですよね。

 ちなみに、このため、バグ票に、ビルド番号(ないしはバージョン番号)は絶対入れてね!




●問題1についての対応策

 前者の問題は、現在、マネージャーレベルで、打ち合わせして、「いっせのせ!」で、ある日のバージョンに入れるということで対応していますが、連絡ミスなどの問題が発生することが多いです。
(なお、このためにも、バージョン(一定時間のビルド)という概念が必要になってきます)

 なので、それへの抜本的な対策は、インターフェースを基本的に共通にして、新旧、どちらの引数でも送れるようにして、引数内にバージョンをいれ、そのバージョンを見て、それなりの処理をすればいいです。

 この方法として、ハッシュマップや連想配列を使う方法については、前にブログに書きました。
ここ

 なお、前のバージョンで使ったソースは、できるだけ消さないほうがいいです。
 前に戻すこともけっこうありますので。。。

 ただ、そーすると、みにくくなっちゃうんですよね。ソースが。
//DEL Ver1.0
//
//
//DELEND
 とかが、いっぱいでてきちゃって。。

 なので、メソッドレベルで、たとえば、
バージョン1.0なら、a_1_0,
  バージョン1.1なら、a_1_1
 というかんじで、バージョンごとにメソッドをつくっちゃって、こぴぺで対応するのも、いいかもお。。そー言う意味でも、コントローラーが必要だったりする。




●そのほかの構成管理の問題と対策

 そのほかの問題として、デグレードと、それを起こさないための、リグレッションテスト(回帰テスト)の実行方法の問題があります。
 これについては、テストの自動生成って言う話になるのですが、それについては、その日経システム構築の記事にもかいてあったし、まあ、ここのブログでも書いた気がする(どの記事かは忘れた)なので、今回は省略




 思いついたところは、こんなかんじ。
 結局、まとめると、日経システム構築の記事は、成功の秘訣がCVSによる管理のように読めてしまうんだけど、CVSによる管理は、基本的には集中型に向いている(常時ネットワークが見れる)のであって、記事のように分散型にするのであれば、CVSでなくても、別にかまわない。

 むしろ、あの記事での成功事例は、テストの自動生成と確認部分にあって、それを実現するには、インターフェースのミスマッチ(上記問題(1)のこと)を防ぐということで、そのインターフェースミスマッチを防がないと、オフシェア開発は難しいんだけど、そこの部分の対策については書いてなかったね。

 つーような、オフシェアの話は、今度、気が向いたときに。。。

 もう、長くなりすぎちゃったので。。


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

PHPでつくる、仕様書からのプログラム自動生成(その3:雛形ファイルの仕様)

2005-11-28 18:14:01 | PHP

前に書いた仕様書をCSVで書き出し、雛形ファイルを用意すると、仕様書の内容をいれて、プログラムが自動生成するという話。

■■ 手順的にはこんなかんじ
・仕様書をCSV書き出ししたものと、
・雛形を用意して、
   ↓
・このPHPを実行すると、
   ↓
・ブラウザ上に、雛形の指定したところへ、仕様書の値を入れて
 ソースを書き出す。

前のブログで、「このPHPを実行すると」のPHPと、それを呼び出す実行画面について、書いたので、今回は、「雛形を用意して」の雛形ファイルの書き方です




■■ 雛形ファイルのつくりかた

(1)てきとーにプログラムを書いてください
 もちろん、PHPプログラムでなくてもいいです。
 例には、SQLを示しましたが、JavaプログラムでもPHPプログラムでも、
 もちろん、一般的な文章、つまり、「あんたくび!」というドキュメントでもOKです。

(2)半角の< > &を、変換します
 雛形にある、< は <に > は >に & は &に変換したほうがいいです
 (なお、上の行の&は、本当は半角)
  
(3)ここで、あたまとおわりに、じゅもんをつけてください。
 頭に付ける呪文は、こんなかんじ
<?
//==============================//
//	文頭の呪文		//
//==============================//
	session_start();
	$data	=	$_SESSION['data'];
?>
<html>
<BODY>
<pre>

(上記の< >は、実際には半角です)

おわりにつける呪文はこんな感じ
</pre>
</BODY>
</HTML>

(上記の< >は、実際には半角です)

(4)CSVファイルのデータが入るところを指定します

・値が直接入るところには、
  <?=$data[0][1]?>のように
<?=$data[行番号][列番号]?>を指定してください
(どこも空白を空けないでください)

なお、はじめの行は0行目、列も0列目からはじまります
(1スタートでなく、0スタートです)


・繰り返しのところは
<?for($i = 開始行; $i < count($data) ; $i++){ ?>
<?}?>

で囲ってください。開始行のところは、データファイルで、繰り返し部分のところが
はじまる行を指定します。つまり、見出し行の次の行です。
(上記のなかで、実際に指定するのは、開始行だけです)

・繰り返しの中で、ある列の値を表示するには
 <?=$data[$i][列番号]?>
 として、行のところに$iを書きます。

・条件のときは、
<?if (条件文) { ?>
<?}else { ?>
<?}?>
でかきます。そうすると、条件文が成立したときに、かきだします。
(elseの行は、なくてもOK)
 条件式の中で、データファイルの値を利用するときは、$data[行番号][列番号]、繰り返しの中で利用するときは$data[$i][列番号]となります。

基本的にはこうなのですが、実は<? ?>のなかでは、好きにPHPプログラムを書いていただいて問題ありません

(5)そして、このファイルを保存して拡張子をPHPにします。




今、じかんがないので、データファイルの構造と、なぜこれで、自動生成するのかについて、この方法のメリットについては、今度の機会に書きます。



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

PHPでつくる、仕様書からのプログラム自動生成(その2:操作画面の内容と、実行プログラム)

2005-11-28 17:35:07 | PHP

 先ほど書いた、仕様書をCSVで書き出し、雛形ファイルを用意すると、仕様書の内容をいれて、プログラムが自動生成するという話。

■■ 手順的にはこんなかんじ
・仕様書をCSV書き出ししたものと、
・雛形を用意して、
   ↓
・このPHPを実行すると、
   ↓
・ブラウザ上に、雛形の指定したところへ、仕様書の値を入れて
 ソースを書き出す。

ここで、「このPHPを実行すると」のPHPと、それを呼び出す実行画面について、以下に書きます。




■■ 実行画面について
 実行画面の様子は、こんなかんじ。
<form method="POST" action="makepro.php">
CSVファイル名:<input type="text" name="csvfname">  1行のバイト数:<input type="text" name="gyolen" value=1000><BR>
雛形ファイル名:<input type="text" name="hinafname">                
<input type="submit" name="submit" value="実行">
</form>

(上記の < > ¥ は、実際には半角です)

で、画面の様子は、ここの。。。と書こうと思ったら(>_<!!)

gooやってくれるな(^^;)

前のブログの例その1 の実行画面、
 編集画面では、フォームの形になっていたのに、それをエントリしたとたんに、ソースが書かれてる(>_<!) 

 これじゃ、みなさんには、実行画面のイメージがわかんないですよね。。

 具体的には、CSVファイル名、雛形ファイル名 1行のバイト数の入力エリアがあります。

 ここでCSVファイル名は(実際にはタブ区切りですけど)データファイル名、

 雛形ファイル名は、雛形として用意したファイル名を入れてください。

 1行のバイト数は、データファイルの最大の1行のバイト数なのですが、実際のものより、大きい分には問題ありません。




 ということで、実行画面は、入力フォームです。ここで、makepro.phpというのを呼び出しています。
makepro.phpというのは、何をやっているかというと、こんな感じのことをしてます
(といって、以下、ソースプログラムです)

<?
//======================================//
//	コントロール部分		//
//======================================//
	session_start();

		//======================//
		//	処理実行	//
		//======================//
	$VO = shori($VO);

		//======================//
		//	次の画面表示	//
		//======================//
	if ( $VO['nextJob']	==	"ERROR" )
	{	//	エラー時は、エラー画面
		$_SESSION['errmsg'] = $VO['errmsg'];
		header("Location:errmsg.php¥n¥n");
	}
	else
	{	//	正常時、雛形ファイルへ
		$_SESSION['data'] = $VO['data'];
		header("Location:".$VO['hinafname']."¥n¥n");
	}

//=======ここまで:以降は、関数を書いてます===============================//

?>

<?
//======================================//
//	処理部分			//
//======================================//
function shori($VO)
{
		//======================//
		//	データセット	//
		//======================//
	$VO['csvfname']	=	$_POST['csvfname'];
	$VO['gyolen']	=	$_POST['gyolen'];
	$VO['hinafname']=	$_POST['hinafname'];

		//======================//
		//	エラーチェック	//
		//======================//
	$VO['nextJob']	=	"OK";
	if ( $VO['csvfname']	==	"" )
	{
		$VO['nextJob']	=	"ERROR";
		$VO['errmsg']	=	"CSVファイル名の指定がありません";
		return $VO;
	}
	elseif ( $VO['hinafname']	==	"" )
	{
		$VO['nextJob']	=	"ERROR";
		$VO['errmsg']	=	"雛形ファイル名の指定がありません";
		return $VO;
	}
	elseif ( $VO['gyolen']	<=	0 )
	{
		$VO['nextJob']	=	"ERROR";
		$VO['errmsg']	=	"1行のバイト数の指定をしてないか、不正値";
		return $VO;
	}

		//======================//
		//	データ取得	//
		//======================//
	$file = fopen($VO['csvfname'],"r");
	if ( $file == "" )
	{
		$VO['nextJob']	=	"ERROR";
		$VO['errmsg']	=	"CSVファイルのオープンに失敗しました";
		return $VO;
	}

	$i = 0;
	while (($rec =fgetcsv($file,$VO['gyolen'],"¥t") ) != "" )
	{
		if ( count($rec) > 1 )
		{		//	セルが1つよりおおく存在
			$data[$i] = $rec;
			$i ++;
		}
		elseif ( ( count($rec) == 1 ) && ($rec[0] != "" ) )
		{		//	セルが1つだが、そのセルは空でない
			$data[$i] = $rec;
			$i ++;
		} 
	}
	fclose($file);
	$VO['data']	=	$data;

	return $VO;
}
?>

(上記の < > ¥ は、実際には半角です)

 つまり、shoriというところで、CSVファイルを読み込み(fgetcsvのところ、そこでいろいろやってるのは、改行だけの行があったときは、無視する処理)、それを'data'というところにいれて、最終的には、エラーならエラー画面に、そうでなければ、dataをセッションに入れて、雛形ファイル(じつはこのファイル、PHP形式で書くので、呼び出せる)を呼び出しているだけです。

 ??なんで、自動生成するのか?

っていう話ですが、それは、雛形ファイルの仕様について書いた後で、説明します。

 今回は、とりあえずここまで。

 次回、気が向いたら書く内容は、雛形ファイルの仕様についてです。


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

PHPでつくる、仕様書からのプログラム自動生成(その1:操作方法と具体例)

2005-11-28 17:03:45 | PHP

 仕様書から自動生成を行うプログラムについて、前のブログでとりあげましたけど、今回(から?)、具体的に、その内容を書きます。
 今回は、はじめに、操作内容と具体例について。




■■ どういった内容か?
 こんな感じのことをします。

・仕様書をCSV書き出ししたものと、
・雛形を用意して、
   ↓
・このPHPを実行すると、
   ↓
・ブラウザ上に、雛形の指定したところへ、仕様書の値を入れて
 ソースを書き出す。




■■ わけわかんないので、例その1

・こんな、テーブル仕様書(CSVファイル)を用意します
テーブル名	HELLO_WORLD_TABLE	PRIMARY KEY	NO
名前	型	桁数(文字のとき)	NOT NULL
NO	INTEGER		NOT NULL
LANGUAGE	VARCHAR	50
MESSAGE	VARCHAR	100


で、こんな雛形ファイルを用意します。
<?
//==============================//
//	文頭の呪文		//
//==============================//
	session_start();
	$data	=	$_SESSION['data'];
?>
<html>
<BODY>
<pre>
CREATE TABLE <?=$data[0][1]?> (
<? for($i=2 ; $i < count($data);$i++){ ?>
<?	switch($data[$i][1])
	{
	case	"INTEGER":
		print("	" . $data[$i][0] ."	INTEGER	" .  $data[$i][3] . ",");
		break;
	case	"VARCHAR":
		print("	" . $data[$i][0] ."	VARCHAR(" .  $data[$i][2] . ") " . $data[$i][3] . ",");
		break;
	//	今回は、これ以外ないので省略
   	}
?>

<?}?>
	PRIMARY KEY(<?=$data[0][3]?>)

); 
</pre>
</body>
</html>

(上記 < > ¥ は、本当は、半角)

で、これらの雛形ファイルと、CSVファイル(本当はタブ区切りだけど)をサーバーにおきます。

そして、以下の実行画面で

値設定と実行


<form method="POST">
CSVファイル名:<input type="text" name="csvfname">  1行のバイト数:<input type="text" name="gyolen" value=1000>
雛形ファイル名:<input type="text" name="hinafname">                
<input type="submit" name="submit" value="実行">
</form>

で雛形ファイルと、CSVファイルを指定すると、

こんなもんが、画面にあらわれます。
CREATE TABLE HELLO_WORLD_TABLE (
	NO	INTEGER	NOT NULL,
	LANGUAGE	VARCHAR(50) ,
	MESSAGE	VARCHAR(100) ,
	PRIMARY KEY(NO)

); 


あとは、これを貼りこんで実行してください。
仕様書を、上記の形式で書くと、雛形は変えなくても、CREATE文が、同じように自動生成されます。
(つーことは、仕様書が何百もある場合は、「値を設定して、このプログラムを呼び出し、結果を保存する」というJAVAプログラムを書いてしまえば、どんなにあろうとも、ボタン1発、JAVAプログラムをよべばいいということ)




■■ 例その2:

で、こんどは、データをINSERTしましょう。

CSVファイルは、テストデータとして、こんな感じで用意しておきます
テーブル	HELLO_WORLD_TABLE
名称	NO	LANGUAGE	MESSAGE
型	INTEGER	VARCHAR	VARCHAR
1	1	"日本語"	"こんにちわ 世界"
2	2	"英語"	"Hello World"


で、雛形ファイルは、こんなかんじ
<?
//==============================//
//	文頭の呪文		//
//==============================//
	session_start();
	$data	=	$_SESSION['data'];
?>
<html>
<BODY>
<pre>
<? for($i=3 ; $i < count($data);$i++){ ?>
INSERT INTO <?=$data[0][1]?> ( <?
	for($j=1 ; $j < count($data[1]);$j++)
	{ 
		print $data[1][$j];
		if ( $j != count($data[1]) - 1 )
		{
			print ",";
		}
	}
?> ) VALUES( <?
	for($j = 1 ; $j < count($data[$i]) ; $j ++)
	{
		if ( $data[2][$j]	==	"VARCHAR")
		{
			print "'" . $data[$i][$j] . "'" ;
		}
		else
		{
			print $data[$i][$j];
		}
		if ( $j != count($data[1]) - 1 )
		{
			print ",";
		}
	}
?>);
<? } ?>
</pre>
</body>
</html>

(上記 < > ¥ は、本当は、半角)

で、さっきのプログラムを実行すると、こんなかんじで、データができる
INSERT INTO HELLO_WORLD_TABLE ( NO,LANGUAGE,MESSAGE ) VALUES( 1,'日本語','こんにちわ 世界');
INSERT INTO HELLO_WORLD_TABLE ( NO,LANGUAGE,MESSAGE ) VALUES( 2,'英語','Hello World');


あとはいれればいいだけ。
これは、CSVデータ部分を変えると(きまりはあるが)、
・このテーブルの一部のデータの自動生成はもちろんOKだし、
・それ以外のテーブルのデータの自動生成も、OKです。
(雛形は変えなくていい)




■■ 例その3
 じつは、さっきのブログのinsertToTbl($db,$data)、selectTbl($db)は、この方式で、例1のCSVファイル(テーブル定義)と、ある雛形を使って、自動的に作っている。
 ここでは、INSERT文とselect文しかないけど、delete,Update、selectもwhere句を使ったものなども、雛形を作って自動生成できる。




 あとは、同じように、ドライバ部分も雛形を作れば、自動生成して、すぐに、テーブル定義、DBアクセス関数、ドライバができて、テストできる。

 という話で、では、
・その実行画面と、
・そこから呼ばれるPHPプログラムと
・雛形の書き方
は、どーなっているのというのが、ここでのお話。

ただ、話がながくなったので、このへんでおしまい。

気が向いたら、第二話で実行画面と、そこから呼ばれるPHPを公開します。


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

PHPのmysqliを使った、SQL文実行(prepareで)と検索実行(commitの話も)

2005-11-28 16:25:48 | PHP

 この話書きましたっけ?今、調べたら、このブログには引っかかるんだけど、ぜんぜん違うページがひっかかるので、ここに書いておきます。

■■ 前提となるテーブル
ここのテーブルを使わせてもらいます
SQL文を引用すると、こんなかんじ
CREATE TABLE HELLO_WORLD_TABLE (
	NO	INTEGER	NOT NULL,
	LANGUAGE	VARCHAR(50) ,
	MESSAGE	VARCHAR(100) ,
	PRIMARY KEY(NO)
); 


■■ やること
 以下のPHPプログラムを実行します。
 ここでは、
(1)DBをオープンします

(2)データをセットしてINSERTします
 →insertToTblという関数を呼び出します

(3)その結果を取得します
 →selectTblという関数を呼び出します

(4)DBをクローズします

(5)結果を表示します

これらを、PHPで書くと、以下のとおり
<HTML>
<BODY>
<?
	include("hello.php");

	//--------------------------------------//
	//	DB操作部分			//
	//--------------------------------------//

	//	DBのオープン
	//	ユーザー名などは、実際にあわせて、書き換える
	$db = mysqli_connect("localhost", "ユーザー名", "パスワード", "使用DB");
	if (!$db)
	{
		print("接続できませんでした");
		exit();
	}
	
	//	INSERTしてみる
	$data['NO']		=	3;
	$data['LANGUAGE']	=	"テスト語";
	$data['MESSAGE']	=	"Insertのテスト";
	insertToTbl($db,$data);

	//	結果を取得してみる
	$kekka = selectTbl($db);

	//	クローズ
	mysqli_close($db);

	//--------------------------------------//
	//	結果表示部分			//
	//--------------------------------------//
	print "<table border = 1>";
	for($i = 0 ; $i < count($kekka); $i ++ )
	{
		print "<tr>";
		for ($j = 0 ; $j < count($kekka[$i]) ; $j ++ )
		{
			print "<td>" . $kekka[$i][$j] . " </td>";
		}
		print "</tr>";
	}
	print "</table>"; 

?>
</BODY>
</HTML>

(上記中 < > ¥ は実際には、半角です)




■■それらを実現する関数
 prepareステートメントを使って、Insert実行の例が、
 insertToTbl($db,$data);のほう。

 検索のほうが
 selectTbl($db);

どちらも、利用前に、
$db = mysqli_connect(ホスト名, "ユーザー名", "パスワード", "使用DB");
で、DBのハンドルを取得しておく必要有(それを引数$dbとして渡している)
また、最後に
mysqli_close($db);
を行う。

プログラムは、このとおり
<?
	function insertToTbl($db,$data)
	{
		//	ステートメントの設定
		$sql = 'INSERT INTO HELLO_WORLD_TABLE (NO,LANGUAGE,MESSAGE) VALUES(?,?,?)';
		$stmt = mysqli_prepare($db,$sql);
		mysqli_stmt_bind_param( $stmt,"iss",$NO,$LANGUAGE,$MESSAGE);

		//	値設定
		$NO 	=	$data["NO"];
		$LANGUAGE 	=	$data["LANGUAGE"];
		$MESSAGE 	=	$data["MESSAGE"];
	
		//SQL文を実行する
		mysqli_stmt_execute($stmt);

		//ステートメントクローズ
		mysqli_stmt_close($stmt);

	}

	function selectTbl($db)
	{
		//SQL作成
		$sql = 'select * from HELLO_WORLD_TABLE';

		//SQL文を実行する
		$rs = mysqli_query($db, $sql);
		if (!$rs)
		{
			return $kekka;
		}

		$i = 0;
		while($row=mysqli_fetch_array($rs))
		{
			for($j=0;$j < count($row) ; $j++) 
			{
				$kekka[$i][$j] = $row[$j];
			}
			$i++;
		}

		//結果レコードをメモリから開放
		mysqli_free_result($rs);

		return $kekka;
	}
?>

(上記中 < > ¥ は実際には、半角です)




■■ つけたし
今回は、commit処理を行っていない。
する場合は、DBのハンドルを取得したのち

//オートコミットOFF
mysqli_autocommit($db, FALSE);

をして、コミットする場合は、
mysqli_commit($db);
ロールバックのときは
mysqli_rollback($db);
を発行する。




■■ なんで、こんなことをかくのか
 insertToTbl($db,$data);と、selectTbl($db);のテーブルごとの自動生成プログラムを例として、今度書くかもしれないので(このブログに)


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

仕様決めがしやすく、テストファーストにしやすいメソッド、関数の引数の決め方

2005-11-27 09:20:24 | 開発ネタ

 伝票指向アプリケーション・アーキテクチャというのがあるそうですね。
 日経システム構築2005年12月号P129によると。。
 そこでは、各コンポーネント間でのデータ流通を、伝票という概念に統一させているそうです。

 この考えが、はやるかどうかはさておき、たしかに、(JAVAなどでは)メソッド間(Cだと関数間)で、受け渡す変数と、返り値を統一すると、仕様決めがしやすく、すぐにテストでき(スタブも、テストドライバもすぐに作れる)、構成管理における、リンクできない問題(引数が違ってリンクできない問題)も解決されます。




 具体的にいうと、
 Javaの場合、メソッドの引数をハッシュマップ、返り値もハッシュマップにします。
 perlやPHPの場合、連想配列にします
 C++やCでは、
 typedef struct
 {
    char **key;
    void **val;
 } VO;
 というかんじの構造体(C++の場合は、クラス)をつくり、そのVOとします。

 そうすると、結局、メソッドはすべて
HashMap VOret = methodXX(HashMap VO);
 (methodXXは、どんなもんでもOK(任意のメソッド))
 のカタチになってしまいます。

 で、実際に受け渡したい引数の内容は、そのハッシュマップVOにセットします。
 そして、処理内容は、受け取ったVOにセットし、返します。
 (受け取ったVOに、そのままセットし、返します。そのため、このメソッドに関係ない値がVOに入っていて、受け取った場合、その値を削除することが、仕様になければ、そのまま返します)。




 例を示します。
 今、本来だと、月日をセットし、今年の曜日を数値で返すメソッド、dateToYobiというメソッドがあったとします。そうすると、こんな感じになります。

int yobi = dateToYobi(int tuki,int hi);

 でも、この形式だと、こんな感じになります
 HashMap VO;
// 月(tuki)日(hi)の設定
VO.put("tuki",new Integer(tuki));
 VO.put("hi",new Integer("hi"));

// メソッドは、こんなかんじ
 VO = dateToYobi(VO);

// 結果はVOに入ってる
Integer result = (Integer)VO.get("result");
Integer yobi = (Integger)VO.get("yobi");

 これだけなら、呼び出しが、めんどくさくなっただけです。

 ところが、dateToYobiの仕様が変更になり、年の指定も必要になった場合(そして求める結果は、その指定した年月日の曜日を求める)
 上記の方法だと、
 int yobi = dateToYobi(int nen,int tuki,int yobi);
 に変えないといけません。これを変えるには、引数が変わっているため、すべて、このメソッドを使っているところを変えなければいけません。

 さらに、構成管理の立場から見れば、この関数を、今すぐ変えてしまうと、連絡がまだ行っていない担当者のところは、昔の関数のままなので、新旧の違った引数をもったメソッドが混在し、おかしな動きになったりします。

 ところが、上記のHashMapにいれる方法であれば、
 HashMap VO;
// 月(tuki)日(hi)の設定
 VO.put("version","1.1");
 VO.put("nen",new Integer("nen"));
VO.put("tuki",new Integer(tuki));
 VO.put("hi",new Integer("hi"));

// メソッドは、こんなかんじ
 VO = dateToYobi(VO);

とすればいいだけなので、引数、返り値ともに、VOでかわらず、構成管理上も、新旧のメソッドが混在しても問題ありません。とくにversionがはいっているので、1.1なら、最新のものとして処理し、入ってない場合(本来は1.0とか入れておいたほうがいいけど)だったら、前のバージョンのものとして処理すれば(そのときちゃんと処理するか、エラー表示するかは、実装者がどうしたいかによる))OKです。問題ありません。




 この場合、引数が変更になっても対応できるので、とりあえず、メソッド名だけをきめておいて、コーディングしておいてもらい、後から、詳細に引数と返り値を決めることもできます。変更も容易です。

 さらに、引数の形式が決まっているので、すぐに、テストドライバが作れます。
 モジュール名がabcなら、そのテストドライバの呼び方は
HashMap VO = new HashMap();
// ここに、引数がはいるが、あとからきめればよい。
VO = abc(VO);
 なのに、きまっています。

 スタブもとりあえず作る場合は
 public HashMap abc(HashMap VO)
 {
    return VO;
 }
 と、すぐ作れます。引数については、あとから決まったときに追加すればいいです。

 そして、テスト結果表示も、呼び出し前のVOの値と、呼出し後のVOの値を表示するだけでOKです。




 上記の説明では、引数の個数が変わったケースですが、型が変わったケースでもOKです。
 たとえば、上記の場合、年月日を String YYYYMMDD;のカタチであらわすことになった場合、
int yobi = dateToYobi(String YYYYMMDD);
 だと、新旧の物が混じると、リンクできなくなるかもしれませんが、HashMap VOを使うケースだと

HashMap VO = new HashMap();
VO.put("version","1.2");
VO.put("ymd",YYYYMMDD);
VO = dateToYobi(VO);

 となるだけなので、まったく問題ありません。




 上記の説明は、Javaでしたけど、perlやPHPなら、HashMapの代わりに連想配列を使っていただければ、同じことができます。Cの場合は、上記にあげた構造体で、keyの文字列の配列と、値(val)のvoid*の配列に、値をセットしていれることになります(put,get,freeの関数は作っておくべきでしょうけど)

 で、これらのことは、特別な技術を導入する必要もなく、ただ、コーディング規約を、このように決めてしまえばいいだけです。

 現状では、アーキによっては、こういう仕様がくるのですが、
 (ただし、本人が、このようなことを理解してやっているかどうかは疑問)

 普通は、こういう仕様にならず、
 int yobi = dateToYobi(int nen,int tuki,int hi);
 のような仕様になるので、とーぜんのことながら、構成管理に失敗し(新旧のモジュールが混じってしまったり、前のに戻せ!(新しいのが間に合わないため)とかで、現場混乱、テストモジュールもすぐに作れず。。。とかで、えらい開発が大変になったりします。

 大きなシステムになればなるほど、仕様は決まらないので、この差は大きいですね。

 つまり、アーキの読み、ないしは、ウィリアムのいたずらのブログを見ているかどうかで、多くの人が残業になるかどうかがきまるということです(うん、前者はそのとおりだが、後者はそうなのか??)



 なお、HashMapでなく、これをXMLのDomでやってもOKではあるのですが、Domの場合話が複雑になる(入れ子が容易にできるため、複雑な引数にされてしまう)ことがあるので、HashMapのほうが、仕様を切りやすかったりします。

 とはいえ、どっちでもいいんですけどね。。。



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

PHPをWebだけでなく業務システムへ応用するケースと、その問題点と可能性

2005-11-26 12:20:46 | PHP

 日経システム構築の2005年12月号(最近きた、「緊急点検!Webアプリ・セキュリティ」の号)の128ページにヤナセの方が、

ユーザーが語るWebアプリケーション基盤の最適解 J2EEとPHPを適所で使う

 というのが出ています。

 で、そこによると(以下斜体部分は上記記事からの引用)

サーバー環境をUNIX/Linuxに絞った結果、大規模システムはJ2EE、中小規模の開発はPHPという判断に落ち着きました。

(中略)

 利用経験から言えば、PHPは画面(HTML)テンプレートで一歩優位、素早い開発に向く。その反面、高いレベルの情報が必要だし、技術者に不足感があります。


 ウィリアムのいたずらが、ちょこっとPHPを使った結果からみても、PHPは、Webだけではなく、業務システムの開発に向いていると思います。
 中小規模の開発(中小企業の開発ではない。あとで理由を述べる)ならば、Webで公開するためでなく、社内利用での業務システム開発のために使うのでも、向いていると思います。

 そういう意味では、将来的には、PHPベースでの業務システム開発というのも、あり!というか、結構使われるかもしれません。




 しかし、PHPで業務システムを今、開発するには、問題があると思います。

 ひとつは、PHPが、オープンなゆえの相性とバージョンアップの問題です。

 つまり、PHPをApache上で動かすとするとすると、Apacheが、かりに、5.0とか10.0とかバージョンアップしていったとき、PHPも、Apacheとの連携部分のモジュールを変えていかなければなりません(具体的にはphp5apache2.dllのことをさしてます。これが、php7apache10とかになるかもしれないということです)。

 さてこのとき、apacheの最新版に対して、PHPのすべてのバージョン(PHP3,PHP4...)が対応してくれるかどうか?ということです。

 もし、対応してくれないとすると、

・Apacheに何か問題があって、バージョンを上げないといけない(かりに10にしよう)。
・でも、今PHP3で開発していて、そのバージョンに対応するものが出ていない(PHP3apache10.dllがサポート外で開発されなくなった)。
・なので、PHPもバージョンアップということになった(ここでPHP6としましょう)
・しかしPHP3からPHP6へのバージョンアップは、(バグも含めた)完全な互換があるように作るかどうかわからない(とくにオープンシステムだと)
・そのため、PHP3ではうまくいくのに、PHP6では動かない!となってしまったとき、

急にプログラム修正が発生してしまいます。

費用発生です。でも、中小企業だと、その費用を急に出せといわれてもねえ。。

って問題です。




 この問題は、どこかのメーカーが、商用でPHPモジュールをつくってしまい(たとえば、InterStage PHPとかいって、富士通がPHP互換モジュールを自社で開発するとか)、下位互換を保つとか、あらかじめ、情報をサーチしておいて、サポート対象外になりそうだったら、バージョンアップ開発をしてしまうとかすれば、ある程度解消します。

 ただ、前者のように、どこかメーカーがだすとなると、結構なお金がかかりそうだし、後者の「情報をサーチして」というのは、中小企業の場合、自社にそういう部隊を作れないでしょう。

 じゃあ、ソフト屋さんと、顧問契約??っていうのもねえ。。あんまりなさそうだし。。

 そんなときこそ中小企業診断士と思うかもしれませんが、診断士でPHPを組む人がはたして何人いるか(ゼロではないことは、確信する。なぜなら、ここに1人いるから)。。。

 つーと、中小企業の開発向きのはずのPHPが、中小企業で採用すると、一番危険になってしまうのです(>_<!)

 ただ、大手企業の1部門でのちょっとした開発などでは、使われてくるかもしれません。

 あとは、PHPベースのパッケージソフトとかでてくれば、状況は変わると思いますけどね。。




 人の問題は、高いレベルを求めないのであれば、状況は、変わってくる可能性はあると思います。はじめ、食えないWeb系のプログラマさんやフリーの人(=ウィリアムのいたずら?)がはいっていき、それが広まれば、派遣会社でも、対応してくるんじゃないでしょーか?

 で、じゃあ、そうなる可能性は?というと、上記にもかいたように、PHPのパッケージソフト(有償のものでも無償のものでも)が出てくると、かなり違ってくると思います。

 そのパッケージソフトとして考えられるものは
・Accessのように、DB定義と作成、DB操作、帳票出力ができるソフト
 (DBはSQLLiteでPHPベースで記述)
・PHPから呼び出す、帳票作成SDK(PHPのクラス提供かなあ。。)
  →雛形とデータをいれて、PDFで出力
・ユニットテスト環境

ただ、これらのものが、PHPベースだと作りやすいこともたしかで、フリーで出る可能性もたかいですよね。。

え、「お前作れ」って

。。。形勢わるくなってきたんで、このへんで(^^;)


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

仕様書からのプログラム自動生成って、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等の)ソース中の(半角の)< > &は、 &lt; &gt; &amp;(&は、本当は小文字)に、「すべて置換」しておくこと。(じゃないと、タグと思われて、異常終了になってしまう)

そうすると

(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でシェアする