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

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

JUDEが、「astah*」(アスター)に名前変わるんだって!

2009-09-16 23:51:46 | Weblog

UMLなどの描画ツールJUDEが、「astah*」(アスター)に名前変わるんだって!
ここ
JUDE から astah* へ名称変更・新価格などを発表
http://www.change-vision.com/ja/astah.html

なーぜー?

政権交代したから?じゃあ、なぜasoに似たastah?
あ、わかった(^_^)v
きっと、どっかの引っ越し会社のように、製品一覧で、
50音順でも、アルファベット順でも、
前のほうにくるため?真ん中じゃ、めだたないもんねえ・・・


・・・え、ばかなこと言ってないで、平鍋さんのブログみろって(^^;)
(理由書いてある)

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

UML等各種ダイアグラムのエラーチェック体系化(その32:業務流れ図→プログラム)

2009-09-16 18:07:23 | Weblog

シリーズUML等各種ダイアグラムのエラーチェック体系化です。

 現在「いろんなダイアグラムをRDBにいれよう!」化計画、
 をやっていて、
  ・クラス図
  ・ER図
  ・アクティビティ図
  ・ユースケース図
  ・DFD
  ・機能構成図(DMM)
  ・業務流れ図
 までをやりました。
 で、今回、まず、業務流れ図+アクティビティ図をあわせたものから、プログラムがどこまで作れるかについて、検討してみます。

ちなみに、今までのまとめは、ここ




■元となる「業務流れ図+アクティビティ図」

こんなかんじのテーブル構成
●レーンテーブル
  (レーンID,ロール(レーン名),親レーンID)
●エッジテーブル
  (エッジID,エッジ種別、元ノード等ID,先ノード等ID,エッジ説明)
●エッジコネクタテーブル
  (コネクタID,番号等)
●動作ノード(アクション)テーブル
  (動作ノードID,動作名、所属レーンID、親動作ノードID,動作ノード種別)
●オブジェクトノードテーブル
  (オブジェクトノードID、オブジェクト名、親オブジェクトノードID,オブジェクト種別)
●制御ノードテーブル*
  (制御ノードID,制御ノード種別)
●コメントテーブル
  (コメントID,コメント内容)


ここから、プログラムを書くわけですが、まず、参考図として、
EAの業務流れ図の
これ http://www.meti.go.jp/policy/it_policy/ea/gainen/product/wfa/images/2-34f.gif
をプログラムにすることを考えます。




■プログラム作成手順

こんなかんじ
1.オブジェクト種別に対する、プログラムのフレームワークを決定する
2.業務流れ図から、それに対応するプログラムを当てはめる
3.作成する。

ではまず、1から




■オブジェクト種別に対する、プログラムのフレームワークを決定する

 入出力の種別ごとに、プログラムのフレームワークが決まってきます。

今回は、

  ・コンピューター画面
  ・帳票 
  ・コンピューターファイル

とあります。

今回は、以下のように決定したとします。

  コンピューター画面=Struts
  バッチプログラム=作っておきます

上記2つから呼び出されるプログラムとして
  帳票=XML出力→FOPを使って→PDF
  コンピューターファイル=O/Rマッピング・・・までいくと面倒なので、
     SQLを受け取ったら、書き出すプログラムを作ってあるとする



■業務流れ図から、それに対応するプログラムを当てはめる

 さっきの図から当てはめます。あくまでも、現状のとおり、手作業のとことはそのままとして。

コンピューター画面=Struts
  (1)受講者募集
  (2)民間企業/他省庁参加申し込み
  (3)省内参加申し込み
  (4)受講者確認登録
  (5)テスト結果登録

バッチプログラム
  (6)受講者リスト作成
  (7)アンケート分析

 ただし、アンケート分析は、記入されたアンケート用紙を入力しているので、普通に考えると、画面が必要と思われます(ないってことは、マークシートなの?)


そして、DBとしては
  (A)研修募集テーブル
  (B)受講者テーブル
  (C)人事テーブル
が必要で(もちろん、DBは、正規化などすると、増える可能性アリ)、
帳票は、
  (D)受講者リスト
になります。帳票としてほかに、
  ・テスト結果
  ・アンケート記入
がありますが、これは、手作業からきているので、コンピューター化された帳票ではないと考えられます(テストを採点して出来たテスト結果と、アンケートを記入した紙)。
 なお、上記に書いたように、手作業の紙を入力するには、画面が必要なはずですが、アンケート分析には、画面がないので、アンケートはマークシートのような、画面入力ナシで電子化できるものと考えられます。
 また、テスト結果の登録は、テスト結果の画面入力によって、行われるものと考えます。

 上記コンピューター画面やバッチプログラムと、DB,帳票の関係(呼び出し)は、図のエッジの連結から、こんかんじと想像できます。
  (1)受講者募集
     Actionで、(A)研修募集テーブル呼び出し
  (2)民間企業/他省庁参加申し込み
     Actionで、(A)研修募集テーブル呼び出し
  (3)省内参加申し込み
     Actionで、(A)研修募集テーブル呼び出し
  (4)受講者確認登録
     Actionで、(B)受講者テーブル呼び出し(入出力のはず)
  (5)テスト結果登録
     Actionで、(C)人事テーブル呼び出し
  (6)受講者リスト作成
     バッチプログラムで、
        (A)研修募集テーブル呼び出し
        (B)受講者テーブル呼び出し
        (D)受講者リスト書き出し
  (7)アンケート分析
     バッチプログラムで、
        (B)受講者テーブル呼び出し
        (C)人事テーブル呼び出し
 となります。




■3.作成する。

 と、ここまできて、各画面の作成となります。
 で、これだけの資料で、どこまで作成できて、あと何が必要なのかについては、次回以降に書きたいと思います。

 ってことで、今日はここまで。



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

EclipseでWML,XHTML,HTMLを作成する方法

2009-09-16 16:32:18 | Weblog

 Eclipseから、XHTMLやHTML,ケータイのXHTMLや、(WAPの)WMLを作成、編集する方法について。

【環境】eclipse 3.5 (日本語パッチを当てていない)




【手順】



1.メニューから、File→New→Othersを選択


2.出てきたダイアログで、XML→XMLを選択


3.XMLファイルを保存するプロジェクトとファイル名を選択

ここで、HTMLを保存したいからと、NewFile.htmとしても、先にいけない。拡張子は必ずxmlにしないといけないようだ。もちろんファイル名NewFile部分は変えてよい。

4.次のダイアログで、一番上(DTDからXMLファイル新規作成)を選ぶ

DTDに、しないとできない。

5.次のダイアログ、下のほうまでいって、XHTMLなり、WMLなり、作りたいもののDTDを選ぶ。


ただし、HTMLを作りたい場合、そこにあるHTMLを選択しても、次の画面で、エラーになる。そこで、仕方ないからXHTMLを選ぶ

6.次の画面でFinishをクリック


7.画面からタグを操作
 HTMLの場合、HTMLをクリックすると、HEAD,BODY,TITLEと、クリックするだけででてくる。titleの右側が、titleと文字が出ている。ここをクリックすると、文字が入力できる。
 BODYに新しい子を作りたい場合、AddChildをクリック。作りたい要素を選ぶ。

 文字入力は、要素を作って、さらに、Add Childの#PCDATAでもできるけど

たとえば、H1の右側をクリックするだけで、文字を入力することも出来る。




●HTMLを書きたい場合


 これだとXHTMLなので、HTMLの場合は、Sourceタブをクリックして


テキスト内容を表示して、HTMLタグ内の部分だけ、なにかにコピーして保存するかんじ?
ちなみに、このSourceファイルから、書くこともできる。


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

Javascriptを使い、ブラウザでSQLを組み立てると、かなり柔軟に仕様変更できるが・・・

2009-09-16 12:12:59 | Weblog

 昨日の、Javascriptを利用してActionを実行する方法だけど、この応用で、Javascriptを使い、ブラウザでSQLを組み立てると、サーバー側のプログラムを変えずに、かなり柔軟に仕様変更できる。

 さらに、サーバー側のプログラムはStrutsでなくても、CGIでも、サーブレットでも、何でもよくなってくる。

 具体的に例をだそう。

 なお、これ以降の説明中に出てくるテーブルは、改訂新版 はじめてのSQLの36ページDEPT表を使っている。(が、実は、どんなテーブルでもOKなのお・・・ってことは、後でわかる)




■概要

 たとえば、Strutsを利用して検索の場合、

(1)検索画面では、strutsタグでは、hiddenで、paraという1項目だけを定義する(ここにSQLが入る)
(2)そして、他の入力項目はINPUTタグで定義し(そうすると、ActionFormで、セッターゲッターを定義しなくてよい)、ボタンを用意する。
(3)ボタンが押されたら、入力項目からデータを取ってきて、検索SQL文を作成し、paraにセットし、submit()して、サーバーへ
(4)サーバー側では、paraからSQL文を受け取り、それを実行、結果をArrayList(要素はHashMap)にいれる
   1レコード1ArrayListの要素(=1HashMap)で、
   1レコード分のHashMapの1つのキーは1項目分、値は、それに対する値
(5)そのArrayListをセッションにいれて、結果表示JSPは、そのセッションの値を
   元に表示する。

 Strutsでない場合、(3)をsubmitでなく、AJAX(REST)とかにして、(5)の返り値をXMLにするとかすれば、サーバーのフレームワーク、言語は問わないことになる。




■ソース

ってことで、まず、(1)~(3)を実行する、検索部分のJSPはこんなかんじ(index.jsp)
<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
<%@ taglib uri="http://struts.apache.org/tags-logic" prefix="logic" %>
<%@ page contentType="text/html; charset=utf-8" %>
<html:html>
<HEAD>
<TITLE>検索</TITLE>
<script type="text/javascript" language="javascript">
<!--

function zikko()
{
	where = "";
	where = addwhere(where,selectForm.basho.value,"LOC","'");
	where = addwhere(where,selectForm.dname.value,"DNAME","'");
	selectForm.para.value = "SELECT * FROM DEPT";
	if ( where != "" )
	{
		selectForm.para.value += " WHERE " + where;
	}
	selectForm.submit();
}		

function addwhere(where,val,key,flg)
{
	if (val != "")
	{
		if ( where != "" )
		{
			where += " AND";
		}
		where += ( " "+ key+ "=" + flg + val + flg );
	}
	return where;
}
// -->
</script>
</HEAD>
<BODY>
<html:form action="/select">
<html:hidden property="para"/>
場所<INPUT TYPE=text NAME="basho" size="6"/><BR>
名前<INPUT TYPE=text NAME="dname" size="6"/><BR>
<html:button property="b1"  onclick="zikko()">検索実行</html:button>
</html:form>
</BODY>
</html:html>

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

そして、(4)の部分だが、まず、ActionFormは、こんなかんじで、
package dbsample;
import org.apache.struts.action.*;
public class selectActionForm  extends ActionForm {
	private String para;
    public String getPara() {
        return para;
    }
    public void setPara(String para) {
        this.para = para;
    }
}

(4)を実行するActionは、こんなかんじ
package dbsample;
import java.sql.*;
import java.util.*;

import javax.servlet.http.*;
import org.apache.struts.action.*;
import java.io.*;

public class selectAction extends Action {
	 public ActionForward execute(
		     ActionMapping mapping,
		     ActionForm form,
		     HttpServletRequest request,
		     HttpServletResponse response) {

		//	画面パラメータの取得
	 	selectActionForm myForm = (selectActionForm)form;
		//	セッションの取得
        	HttpSession session = request.getSession();
	        
    		try
    		{
        		Connection con = null;
        		Statement stmt = null;
    			
        		// DB接続(testデータベースに、ログイン名root,パスワードpasswordの場合)
    			Class.forName("org.gjt.mm.mysql.Driver");
   			con = DriverManager.getConnection("jdbc:mysql:///test","root","password");
    			stmt = con.createStatement();

    			//	SQL(画面から引数para)実行
    			ResultSet rs = stmt.executeQuery(myForm.getPara());

    			//	結果をArrayListに
    			ArrayList<HashMap<String,String>> result 
    				= new ArrayList<HashMap<String,String>>();
    			while(rs.next())	//	行数分処理
    			{
    				HashMap<String,String> map = new HashMap<String,String>();
    				//	項目数分出力
    				for(int j = 1 ; j <= rs.getMetaData().getColumnCount() ; j ++)
    				{
    					map.put(rs.getMetaData().getColumnName(j),
    					 		rs.getString(j));
    				}
    				result.add(map);
    			}
    			//	あとしまつ
			stmt.close();
			con.close();
				
			//	結果をセッションにいれる
			session.setAttribute("result",result);
			session.setAttribute("kekka","");
    		}
    		catch(Exception e)
    		{
			session.removeAttribute("result");
			session.setAttribute("kekka",e.toString());
    			return mapping.findForward("error");
    		}
			return mapping.findForward("success");
	 }
}

(上記 < >は、本当は半角)
SQLを受け取るところ、myForm.getPara()になっている。
つまり、javascriptでSQLを作って、そのまま実行している。

そして、結果表示は、こんなかんじ(kekka.jsp)
<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
<%@ taglib uri="http://struts.apache.org/tags-logic" prefix="logic" %>
<%@ page contentType="text/html; charset=utf-8" %>

<HTML>
  <HEAD>
    <TITLE>検索結果</TITLE>
  </HEAD>
  <BODY>
    結果<BR>

<table border=1>
<tbody>
<logic:notEmpty name="result" scope="session">
<logic:iterate id="me" name="result" scope="session" indexId="idx">
	<tr>
		<td><bean:write name="me" property="DEPTNO" /></td>
		<td><bean:write name="me" property="DNAME" /></td>
		<td><bean:write name="me" property="LOC" /></td>
	</tr>
</logic:iterate>
</logic:notEmpty>
</tbody>
</table><BR>
<A HREF="index.jsp">戻る</A>
</BODY>
</HTML>

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

エラーの場合は、エラーメッセージを出している(error.jsp)
<%@ page contentType="text/html; charset=utf-8" %>
<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
<%@ taglib uri="http://struts.apache.org/tags-logic" prefix="logic" %>
<HTML>
  <HEAD>
    <TITLE>エラー</TITLE>
  </HEAD>
  <BODY>
    <H2>
      <bean:write name="kekka" scope="session"/>
    </H2>
    <A HREF="index.jsp">戻る</A>
  </BODY>
</HTML>

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

ついでに書くと、struts-config.xmlは、こんなかんじ
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE struts-config PUBLIC
          "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"
          "http://struts.apache.org/dtds/struts-config_1_3.dtd">

<struts-config>

    <form-beans>
        <form-bean name="selectForm" type="dbsample.selectActionForm"/>
    </form-beans>

    <action-mappings>
        <action
            path="/select"
            type="dbsample.selectAction"
	    name="selectForm" scope="request" validate="false">
	          <forward name="success" path="/kekka.jsp"/>
	          <forward name="error" path="/error.jsp"/>
	</action>
    </action-mappings>

</struts-config>

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




■メリット

こりゃー、チョー便利だ。
テーブル項目を追加、変更したい場合,
たとえば、DEPTNOという項目を追加したい場合、
検索部分のJSP(index.jsp)を
<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
<%@ taglib uri="http://struts.apache.org/tags-logic" prefix="logic" %>
<%@ page contentType="text/html; charset=utf-8" %>
<html:html>
<HEAD>
<TITLE>検索</TITLE>
<script type="text/javascript" language="javascript">
<!--

function zikko()
{
	where = "";
	where = addwhere(where,selectForm.basho.value,"LOC","'");
	where = addwhere(where,selectForm.dname.value,"DNAME","'");
	where = addwhere(where,selectForm.deptno.value,"DEPTNO","");
	selectForm.para.value = "SELECT * FROM DEPT";
	if ( where != "" )
	{
		selectForm.para.value += " WHERE " + where;
	}
	selectForm.submit();
}		

function addwhere(where,val,key,flg)
{
	if (val != "")
	{
		if ( where != "" )
		{
			where += " AND";
		}
		where += ( " "+ key+ "=" + flg + val + flg );
	}
	return where;
}
// -->
</script>
</HEAD>
<BODY>
<html:form action="/select">
<html:hidden property="para"/>
場所<INPUT TYPE=text NAME="basho" size="6"/><BR>
名前<INPUT TYPE=text NAME="dname" size="6"/><BR>
番号<INPUT TYPE=text NAME="deptno" size="6"/><BR>
<html:button property="b1"  onclick="zikko()">検索実行</html:button>
</html:form>
</BODY>
</html:html>

(上記 < >は、本当は半角。赤字は修正箇所)
ってなかんじで、値をいれるところと、あとSQL文をつくるところを変えるだけで、本体を何もいじらないでできる。

ってか、テーブル自体変えちゃう事だってできる。
もちろん、変更に伴い、結果表示画面を変えることはある。でも、結果表示もJSPだけなので、結局JSPを書き換えるだけで、Action,ActionFormは変えずに、Tomcatをとめずにできる。

 エラーチェックはJavascriptですればいいし。。。

 つーか、元となるプログラムは
  ・select用(execQuery実行)
  ・1行Update用(execUpdate実行)
  ・トランザクション複数行更新用
 の3つを用意すれば、あとは画面のJSPを作れば、どーにでもなりそうな気がする
(画面制御は、kekka.jspにlogic:forwardを書いて、ステータス(をセッションに入れておき)によって、表示したいJSPにフォワードするようにすれば、struts-configの修正もいらない。
ステータスは、成功時、次に遷移するステータスをjavascriptでSQLと一緒に送るようにすればいい。もちろん、条件とかもあり、それも送らないといけない場合もあるかもしれないけど、まあ、そのへんは適当に拡張してもらって・・・)




■問題点

 しかし、このやり方は致命的問題点がある。

 セキュリティがぼろぼろだ。
 SQLがパラメータなので、テキトーなSQLを送ると、それを実行してしまう。
 テーブル全削除とか・・(^^;)

 なので、このままでは、使えないだろう。

 ただ、テーブルごとに画面を用意し、"SELECT * FORM DEPT "ぐらいを書いておき、Where句のみをJavascriptで作らせ(そのとき、Javascriptで、エラーチェックする)、サーバー側でも、複数文かかれていないか、つまり、";"とかが含まれていないかをチェックし、実行するという形にすれば、かなり柔軟に画面やDBが変えられることになる。

 とはいえ、今のように画面項目を受け渡すようにしてしまうと、DBや画面の項目変更に伴い、プログラムが動く。これは、ちょっと作業工程的に、ためし作りがしにくくなってくる(理由は、UML等各種ダイアグラムのエラーチェック体系化のほうで出てくる)。

 ということで、どこまでjavascriptを使って、クライアント側に柔軟性を持たせるかということが、セキュリティと開発効率の間でトレードオフになってくるわけだが、クラウドとかマッシュアップの流れは、明らかに、クライアント側に柔軟性を持たせる方向に進んでいるといえる。
(かといって、SQL発行までやらせはしないけど。。。)


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