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

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

仕様書からプログラムソースを生成する方法(Excelの仕様書編 その21:イベント追加 ソース)

2006-12-25 14:34:27 | ケータイ

BREWの画面部分のプログラムをExcelの仕様書から自動生成するという、シリーズ仕様書からプログラムソースを生成する方法の続きです。

 いま、、仕様書にイベントを追加しています。
 前回、その仕様書の様子を示しました。
 今回は、出力サンプルを示します。



■必要なファイル

 その前に、必要なファイルについてです。
今までどおり、
・アプリソースfukusu2.c
・アプリヘッダfukusu2.h
●画面ソースgamen1.c
●画面ヘッダgamen1.h
・共通領域ソースIKHMap.c
・共通領域ヘッダIKHMap.h
・バージョンヘッダversion.h
は、必要です。
そのうち、●をつけたものは、今回修正が入って変更があります。

さらに、イベントということで、
・イベント処理ソースIEventList.c
・イベント処理ヘッダIEventList.c
●画面用イベントソースgamen1event.c
●画面用イベントヘッダgamen1event.h
が必要です。

 ただし、イベント処理のIEventList.c、IEventList.hは、すでに、ここ
でソースを書いているので、今回、あたらに紹介するのは
(1)画面ソースgamen1.c(修正)
(2)画面ヘッダgamen1.h(修正)
(3)画面用イベントソースgamen1event.c(新規)
(4)画面用イベントヘッダgamen1event.h(新規)
となります。

 以下、順に示していきます。


■(1)画面ソースgamen1.c(修正)
イベント関係のところが追加となります。
イベント処理は、gamen1_HandleEventでいろいろかいてましたけど、
それをばっさり、IEVENTLIST_HandleEvenで処理することになります。

で、そのため、イベントをIEVENTLIST_Addを使って、initAppDataでセットします
また、領域をFreeAppDataで解放します。

その結果、ソースは、以下のとおりです(赤字は、修正箇所)
/*================================
FILE: gamen1.c
=================================*/
#define _GAMEN1_C

#include	"gamen1.h"
#include	"gamen1event.h"	//	追加:イベント処理

/*==================================*/
// 関数名:gamen1_HandleEvent	    //
// 内容 :イベント処理		    //
/*==================================*/
boolean gamen1_HandleEvent(fukusu2* poya, AEEEvent eCode,
                              uint16 wParam, uint32 dwParam)
{  
	gamen1	*pMe;

	//	チェック
	if ( poya	==	NULL )
		return FALSE;
	if ( 	( poya->gno	!=	1 ) ||
		 (poya->garea	==	NULL ))
		return FALSE;
	pMe	=	(gamen1 *)poya->garea;

	//	メニューイベント
	if ( pMe->pMenu1	!=	NULL )
	{
		if ( IMENUCTL_HandleEvent(pMe->pMenu1,eCode,
                              wParam,dwParam) == TRUE )
		{
			return	TRUE;
		}
	}

	//	追加:イベント処理
	return	IEVENTLIST_HandleEvent(pMe->pElist,eCode,wParam,dwParam);

}

/*==================================*/
//関数名:gamen1_InitAppData	    //
//内容 :領域確保・描画	    //
/*==================================*/
boolean gamen1_InitAppData(fukusu2* poya)
{
	char		*fdata;
	gamen1		*pMe;
	AEERect		rect;
	AECHAR	*menubuf;
	char	*menuTitle;

	//==========================================//
	//	領域確保		            //
	//==========================================//
	pMe	=	(gamen1 *)MALLOC(sizeof(gamen1));
	if (pMe	==	NULL )
	{
		gamen1_FreeAppData(poya);
		return	FALSE;
	}
	//	アプリ領域へ設定
	poya->garea	=	(void *)pMe;
	poya->gno	=	1;

	pMe->pMenu1	=	NULL;
	pMe->pIDisplay	= poya->pIDisplay;
	pMe->pIShell	= poya->pIShell;

	//==========================================//
	//	追加:イベント処理		    //
	//==========================================//
	//	親領域の設定(イベント先で使う)
	pMe->poya	=	poya;

	//	イベント領域確保
	if ( (pMe->pElist = IEVENTLIST_Create() )	==	NULL )
	{
		return FALSE;
	}

	//	イベント設定
	IEVENTLIST_Add(pMe->Elist,pMe,IEVENTLIST_KIND_ECODE,
			EVT_APP_START,0,0,gamen1_STARTEvent);
	IEVENTLIST_Add(pMe->Elist,pMe,IEVENTLIST_KIND_WPARAM,
			EVT_COMMAND,2000,0,gamen1_EndEvent);

	//==========================//
	//	メニューの作成	    //
	//==========================//
	if	( ISHELL_CreateInstance( pMe->pIShell, 
		AEECLSID_MENUCTL, (void**)&pMe->pMenu1 ) != SUCCESS )
	{
		gamen1_FreeAppData(poya);
		return FALSE;
	}
	rect.x	=	1;
	rect.y	=	1;
	rect.dx	=	200;
	rect.dy	=	150;
	IMENUCTL_SetRect(pMe->pMenu1,&rect);

	//==========================//
	//	メニュー項目の表示  //
	//==========================//
	
	menuTitle = "開始";
	menubuf = (AECHAR *)MALLOC((STRLEN(menuTitle)+1)*sizeof(AECHAR));
	if ( menubuf	==	NULL )
	{
		gamen1_FreeAppData(poya);
		return FALSE;
	}
	MEMSET(menubuf,0,(STRLEN(menuTitle)+1)*sizeof(AECHAR));
	STREXPAND(menuTitle,STRLEN(menuTitle),menubuf,
			(STRLEN(menuTitle)+1)*sizeof(AECHAR));
	IMENUCTL_AddItem(pMe->pMenu1,NULL,NULL,1000,menubuf,NULL);
	FREEIF(menubuf);

	menuTitle = "終了";
	menubuf = (AECHAR *)MALLOC((STRLEN(menuTitle)+1)*sizeof(AECHAR));
	if ( menubuf	==	NULL )
	{
		gamen1_FreeAppData(poya);
		return FALSE;
	}
	MEMSET(menubuf,0,(STRLEN(menuTitle)+1)*sizeof(AECHAR));
	STREXPAND(menuTitle,STRLEN(menuTitle),menubuf,
			(STRLEN(menuTitle)+1)*sizeof(AECHAR));
	IMENUCTL_AddItem(pMe->pMenu1,NULL,NULL,2000,menubuf,NULL);
	FREEIF(menubuf);

	gamen1_DispAppData(pMe);

	//	共通領域を設定
//	pMe->pMap	=	poya->pMap;

    return TRUE;
}

/*==================================*/
//関数名:gamen1_FreeAppData	    //
//内容 :領域のフリー		    //
/*==================================*/
void gamen1_FreeAppData(fukusu2* poya)
{
	gamen1	*pMe;
 
	// 対象かどうかチェック
	if ( poya->gno	!=	1 )
		return;
	if ( poya->garea	==	NULL )
		return;
	pMe	=	(gamen1 *)poya->garea;

	//	メニューフリー
	if ( pMe->pMenu1	!=	NULL )
	{
		IMENUCTL_Release(pMe->pMenu1);
		pMe->pMenu1	=	NULL;
	}

	//	追加:イベントフリー
	IEVENTLIST_Release(pMe->pElist);

	//	全体フリー
	FREEIF(pMe);

	//	親のエリアをクリア
	poya->garea	=	NULL;
}

/*==================================*/
//	関数名:gamen1_DispAppData  //
//	内容 :画面の初期表示	    //
/*==================================*/
boolean gamen1_DispAppData(gamen1* pMe)
{
	int	curpos,buhinpos;

	//	初期化
	curpos		=	0;
	buhinpos	=	0;

	//==================================//
	//	リドローする		    //
	//==================================//
	//	ここに、
	//	1.リドローと、
	//	2.次のフォーカス指示を書く
	//	テキストエリアのRedrawやUpdateする
	if ( pMe->pMenu1	!=	NULL )
	{
		//	リドロー
		IMENUCTL_Redraw(pMe->pMenu1);
//		カーソル番号pMe->curnoから、部品の番号(仕様書のA桁の
//	         No)に変換する。その番号をbuhinposだとすると
		if(buhinpos	==	0)
			IMENUCTL_SetActive(pMe->pMenu1,TRUE);
		else
			IMENUCTL_SetActive(pMe->pMenu1,FALSE);
	}

	return	TRUE;
}

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



■(2)画面ヘッダgamen1.h(修正)

イベントを入れる領域と、親(アプリのポインタ)を入れておく
領域を新たに取ります。

ソースは、以下のとおりです(赤字は、修正箇所)
/*=====================================
FILE: gamen1.h
======================================*/
#ifndef _GAMEN1_H
#define	_GAMEN1_H
/*======================================
INCLUDES AND VARIABLE DEFINITIONS
==================================== */
#include "AEEModGen.h"
#include "AEEAppGen.h"
#include "AEEShell.h" 

#include "AEEMenu.h"

#include "fukusu2.h"	//	アプリ画面

//==================================//
//	定数定義		  //
//==================================//
/*-------------------------------------------------------------------
Applet structure. All variables in here are reference via "pMe->"
-------------------------------------------------------------------*/
// create an applet structure that's passed around. All variables in
// here will be able to be referenced as static.
typedef struct _gamen1 {
	IDisplay      *pIDisplay;
	IShell        *pIShell;
	IMenuCtl	  *pMenu1;

	//	追加:イベント領域
	IEventList		*pElist;
	//	追加:親領域
	fukusu2			*poya;

} gamen1;

/*-----------------------------------------------------------
Function Prototypes
------------------------------------------------------------*/
#ifdef _GAMEN1_C
boolean gamen1_HandleEvent(fukusu2* poya,AEEEvent eCode, 
				uint16 wParam,uint32 dwParam);
boolean gamen1_InitAppData(fukusu2* poya);
void    gamen1_FreeAppData(fukusu2* poya);

//	画面表示
boolean gamen1_DispAppData(gamen1* pMe);

#else

extern boolean gamen1_HandleEvent(fukusu2* pMe,AEEEvent eCode,
				 uint16 wParam,uint32 dwParam);
extern boolean gamen1_InitAppData(fukusu2* pMe);
extern void    gamen1_FreeAppData(fukusu2* pMe);

//	画面表示
extern boolean gamen1_DispAppData(gamen1* pMe);

#endif
#endif

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



■(3)画面用イベントソースgamen1event.c(新規)
イベントをやるプログラムです。今回は、終了のときプログラムを
終了するようにしてあります。
ソースは、以下のとおりです(全部新規追加です)
/*=====================================
FILE: event1Ctl.c
=====================================*/
#define	_EVENT1CTL_C

/*===================================
INCLUDES AND VARIABLE DEFINITIONS
=================================== */
#include "AEEModGen.h" 
#include "AEEAppGen.h"
#include "AEEShell.h" 
#include "gamen1.h"
#include "gamen1event.h"

//==========================================//
//	関数名:gamen1_EndEvent		  //
//	内容 :終了			  //
//==========================================//
boolean gamen1_EndEvent(void* pArg, AEEEvent eCode,
				 uint16 wParam, uint32 dwParam)
{
	gamen1 *pMe;
	if ( (pMe = (gamen1 *)pArg)	== NULL )
		return	FALSE;

	if ( pMe->poya	!=	NULL )
	{
		gamen1_FreeAppData(pMe->poya);
		pMe->poya->gno	=	-1;
	}
	return	TRUE;
}

//==========================================//
//	関数名:gamen1_STARTEvent	  //
//	内容 :開始			    //
//==========================================//
boolean gamen1_STARTEvent(void* pArg, AEEEvent eCode,
				 uint16 wParam, uint32 dwParam)
{
	return	TRUE;
}

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



■(4)画面用イベントヘッダgamen1event.h(新規)
呼び出した関数の宣言をします。
ソースは、以下のとおりです(全部新規追加です)
/*==================================
INCLUDES AND VARIABLE DEFINITIONS
================================== */
#ifndef _GAMEN1EVENT_H
#define	_GAMEN1EVENT_H
#include "AEE.h"
#include "AEEShell.h"
#include "AEEStdLib.h" 

#ifdef _GAMEN1EVENT_C
boolean gamen1_STARTEvent(void* pMe, AEEEvent eCode, 
				uint16 wParam, uint32 dwParam);
boolean gamen1_EndEvent(void* pArg, AEEEvent eCode,
				uint16 wParam, uint32 dwParam);
#else
extern boolean gamen1_STARTEvent(void* pMe, AEEEvent eCode,
				uint16 wParam, uint32 dwParam);
extern boolean gamen1_EndEvent(void* pArg, AEEEvent eCode,
				uint16 wParam, uint32 dwParam);
#endif
#endif

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




 ということで、今回はここまでです。



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

海外郵便は、住所をQRコードで仕分けするとか、国別番号を導入するとかしてくれないかな。。

2006-12-25 12:49:40 | Weblog

ちょっと前の話だけど、コメントをはずしたので、炎上する心配がなくなったので
きょう、とりあげてみます。

ここの痛いニュース
私たちはロボットではない」…現職郵便局員が明かす『深夜勤』…東京新聞
http://blog.livedoor.jp/dqnplus/archives/878109.html


ここの意見、多くは郵便局は甘いとか、そういう意見しかなかったので、
違う立場からいうと、みんなから、たたかれそう・・・・
(なので、コメント欄があるときは、書かないでいました)




 でも、海外郵便を出すこともある、ウィリアムのいたずらの意見は、ちょっと違う。

 その元になっている東京新聞ニュース
現職郵便局員が明かす『深夜勤』
http://www.tokyo-np.co.jp/00/tokuho/20061217/mng_____tokuho__000.shtml

には、こうやって書いてある(以下斜体は上記ニュースより引用)

 国際郵便で、もし仕分けを間違え、別の国に運ばれてしまったら大変なことになる。とりわけ手書きのあて名には判読が難しいものもある。「一番眠い時間に体を休められない。もうろうとした頭で絶対にミスが許されない仕事に取り組まなければならないので激しいストレスになっている」


 そうなのよ、国際郵便って、英語で国名を書くから、紛らわしいんだけど、
 それを、意識もうろうとした中でやられたら。。
 ひえー(>_<!)

 送るほうとしたら(ウィリアムのいたずらの場合)、送っているのは、クリスマスカードとかなので)、時間かけてくれてかまわないから、間違いなく、仕分けしてほしいわけ。。

 そーすると。。。やっぱ、こんな、深夜労働なんていう、女工哀史的なことにたよらず、

 機械を導入して欲しいわけよ。。




 もし、海外郵便に、国別番号というのを導入すれば、郵便番号と同じ仕組みなので、おんなじように仕分けできると思うので、そーしていただきたい気がする。。

 そうすれば、郵便局の窓口でも、どこの国にだすか、一発でわかるし、仕分けも
間違えない(国別番号を間違えて書けば、間違うけど、それは書いた本人がわるい!ということで。。いいと思う)


 あと、国内は、郵便バーコードってあるけど、
 海外の場合は、。住所も書いた上で、住所をQRコードにしたものも、印刷して貼ってもいい(直接印刷してもいいし、QRコードを紙やシールにだして、それを貼っても可)ってして欲しい(これは国内でも導入していいと思うけど)。

 そして、それが貼ってある場合はQRコードにもとづき、迅速に処理すると。。
 もちろん、QRコードがはってあれば、仕分けを自動化してもいいけど、
 そこまで行かなくても、QRコードを読み取って、仕分けの箱の番号を表示するって言うようなiアプリ、BREWアプリを開発して、ケータイを使って仕分けしてもいいと思う。

 もちろん、QRコードが間違っていたら、間違って仕分けされても文句なし(^^;)
 で、国名だけ入っていればいいので、住所が入りきらなかったら、宛名や会社名、部署は、いれないでOK!(QRコード以外に、ちゃんと住所も併記されているので、そっちにちゃんと書けばOK!)

 さらに、窓口に出した場合は、ケータイなり、専用機でQRコードを読んで、「送りさきは、どこどこですね。120円です!」とか、ちゃんとQRコードを確認してくれて(なので間違いない)、それに応じて、料金も自動的に計算するアプリを開発すれば。。

 ってしてくれれば、仕分けも楽になると思うけどなあ。。

 QRコードでやると、早く配達してくれるとか、料金安くなるとかしないと、だめかなあ。。
 (もちろん逆に、QRコードはってないと、後回しに配達するとか、料金を上げるという手もあるけど。。)

 でも、もしそうなれば、これ、普及すると思うんだけど。。。

 システム的には、ケータイは、普通持ってる人、多いだろうし、
 アプリ開発が、そんなに難しいとも思えないし。。
 (数百万から1~2千万??。。。全国でやれば、元は取れるよね。。すぐに。。)
 
 QRコードの出力は、フリーでもでてるしい。。。




 労働強化して、郵便を危険にする前に、こーいう省力化について、考えたほうがいい(お客さんとしては安心)と思うんですけど、どーでしょう?郵便局さん(^^;)



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

Javaの画面表示-その5:JSPで表示、JavaBeanで処理(MVC版)(その2:ソース)

2006-12-25 02:39:49 | JavaとWeb

 シリーズJavaの画面表示のつづきです。前回、JSPで画面表示部分とコントローラー、Javaのクラスでモデルを担当して、MVCにするという話をかきました。

 で、その際に、必要なソースは、以下のとおり。

JSP
・index.jsp:View 初めの画面(修正)
・kekka.jsp:View 結果表示(修正)
・shori.jsp:コントローラー(新規)

JavaBean
・Shori1.java:モデル(今までのものと変わりません)

 Shori1.javaは、ここの「■Javaのソースコード Shori1.java」と同じ(修正はありません)ので、そちらを見てもらうこととして、今回は、のこりの上記3つのJSPのソースについて書きます。



■index.jsp:View 初めの画面のソース
 これは、呼び出し先が、kekka.jspからshori.jspにかわっただけで、基本的に変わりありません。
 ソースはこんな感じ(赤字は、修正したところ)
<html>
<head>
<%
//==============================================//
//	画面用の部分				//
//==============================================//

//	変数を受け取る
	String msg = request.getParameter("msg");
	if ( msg	==	null )
	{
		msg	=	"";
	}


//==============================================//
//	以下、画面表示				//
//==============================================//
%>
<title>早打ちの練習</title>
</head>
<body>
<h1><font color=red><%=msg%></font></h1>
<H1>早うちの練習</H1>
以下の文を打とう!<BR>
<B>This is a pen</B><BR>
<form method=get action="http://127.0.0.1:8080/test/jsp/shori.jsp">
<input type=text name=nyuryoku size=20><P>
<input type=submit name=do value=打ち終わった!><P>
</form>
</html>

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



■kekka.jsp:View 結果表示のソース
 変数を受け取って、それを表示するだけになりました。
 ソースはこんな感じ(赤字は、修正したところ)
<html>
<head>
<title>早打ちの練習</title>
</head>
<body>
<%
//==============================================//
//	変数を受け取る
//==============================================//
	String ritu = request.getParameter("ritu");

//==============================================//
//	以下、画面表示				//
//==============================================//
%>
<H1>結果</H1>
正解率 = <%=ritu %><BR>
</html>

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



■shori.jsp:コントローラーのソース

 新規作成です。
 変数を受け取り、JavaBeanを呼び出し、結果に応じた画面を表示します。
 ソースはこんな感じ
<html>
<head>
</head>
<body>
<%@ page language="java" import="pac1.*" %>
<jsp:useBean id="shori1" class="pac1.Shori1"/>
<%
//==============================================//
//	変数を受け取る
//==============================================//

	String nyuryoku = request.getParameter("nyuryoku");

//==============================================//
//	モデル部分の処理
//==============================================//
	String ritu = shori1.rituKeisan(nyuryoku);

//==============================================//
//	結果表示
//==============================================//
	if ( ritu.equals("NO DATA!")	==	true)
	{
		response.sendRedirect("http://127.0.0.1:8080/test/jsp/index.jsp?msg=INPUT_ERROR");
	}
	else
	{
		response.sendRedirect("http://127.0.0.1:8080/test/jsp/kekka.jsp?ritu=" + ritu);
	}

%>
</body>
</html>

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




 今回はここまで。


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

Javaの画面表示-その5:JSPで表示、JavaBeanで処理(MVC版)(その1:概要)

2006-12-24 23:35:35 | JavaとWeb

シリーズJavaの画面表示のつづきです。前回、JSPから、Javaのクラスを呼び出す話で、最後のほうに、

ということで、MVCの構成にして、モデルをJavaBeanにして、Vは今までどおりJSP,コントローラー(C)となるJSPを作るようにしたほうが、よさそうです。

ということで、このシリーズ、次回から、その「JSPで表示、JavaBeanで処理(MVC版)」をやってみたいと思います。


と書いたので、今日は、その
・JSPでView(画面表示)
・JSPでC(コントローラー)
・JavaBeanでモデル
というのをやって見たいと思います。




具体的には、

・初めの、入力画面で、コントローラーshori.jspを呼び出します。
・shori.jspでは、JavaBeanを呼び出し、結果を受け取ります
・JavaBeanは、今までとおなじものを使います。
・結果がNO DATA!だったら、index.jspを呼び出し、エラーメッセージを出す
    それ以外なら、kekka.jspを呼び出し、正解率をを出す

というふうにします。

ということで、ソースの構成とMVCの役割は、以下のようになります

JSP
・index.jsp:View 初めの画面(修正)
・kekka.jsp:View 結果表示(修正)
・shori.jsp:コントローラー(新規)

JavaBean
・Shori1.java:モデル(今までのものと変わりません)




次回のこのシリーズでは、上記のソースのうち、修正/新規の
index.jsp,kekka.jsp.shori.jspの内容を書きます。

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

Hello World以前のプログラム言語(その11:JavaでHello World)

2006-12-24 18:21:18 | 土日シリーズ

情報処理とは何?から、Hello Worldを出力するまでの流れをかく、シリーズHello World以前のプログラム言語のつづきです(このシリーズは、土日に書きます)。

 前回は、オブジェクト指向で、どんな構文が必要かということを書きました。

 今回は、JavaでHello Worldを書き出します。



■前回までのお話
 結局、前回までで、言葉に、こんな機能があればいいということをかきました。

クラス  ===  継承関係を書く

   データ
     型    変数
      :
      :
      :
   データの終わり(明確にわかればなくてもいいけど)


   処理1=== 引数、引数・・・
     ・変数を宣言する文
     ・処理を命令する文
     ・条件によって、処理を分けるための文
      :
      :
      :
   処理1のおわり(明確にわかればなくてもいいけど)

   処理2=== 引数、引数・・・
     ・変数を宣言する文
     ・処理を命令する文
     ・条件によって、処理を分けるための文
      :
      :
      :
   処理2のおわり(明確にわかればなくてもいいけど)

   :
   :
   :

   処理N=== 引数、引数・・・
     ・変数を宣言する文
     ・処理を命令する文
     ・条件によって、処理を分けるための文
      :
      :
      :
   処理Nのおわり(明確にわかればなくてもいいけど)

クラスの終わり(明確にわかればなくてもいいけど)


つまり、ポイントは、以下のとおりです。
・クラスの始まりと終わりの書き方
・データの書き方
・処理のはじまりと終わりの書き方
・Hello Worldと書き出す処理をさせるには?

今日は、以上のやり方について書きます。



■クラスの始まりと終わりの書き方
 Javaでは、クラス名を
class Test {

}

のようなかたちで、class クラス名というカタチでクラスを宣言します。
範囲は{から}までの間です。

上記の例だと、Testというクラスを書くよ!っていってます。

なお、classの前にpublicやprivateなど、見える範囲をかきます。普通
また、なにかから継承されている場合は、
public class Test extends Thread {
}

のように、クラス名のあとに、extends 継承の親のクラス名をつなげます。
上記の場合、Threadクラスから、継承されているカタチで、Testクラスを書くよ!といってます。



■データの書き方
以下の赤字の部分
class Test {
	public int a;
	public int b;
}

のように、データを書きます。
つまり、
見える範囲 型  変数名;
public   int  a;
のような形で書きます。




■処理のはじまりと終わりの書き方
処理、つまりメソッドは、以下の赤い部分です
class Test {
	public void a(String msg)
	{
	}

	public int b(String msg,int val)
	{
		return 0;
	}
}


つまり、
見える範囲 返り値の型 メソッド名(引数の型 引数,引数の型 引数,...)
public   int     b     (String  msg,int    val  )
のように書いた後、{ }でくくります。このくくられている間に書かれているのが
処理内容です。

 また、メソッドが関数のカタチ、つまり、引数を渡して、処理してもらい、
その結果を知りたい場合は、結果=返り値の型を書きますが、
 引数を渡して、処理してもらったら、あとは、値をかえしてくれなくていい
場合は、返り値をvoidにします。

 返り値は、return 返り値;で返します。

 なお、上記の場合は、クラスを生成しないと、メソッドは使えません。
 クラスを生成しなくても起動させるには、staticというのにします。
こんな感じ。。
class Test {
	public static void main(String[] args) {

	}

}


publicのあとに、staticというのがはいってます。この場合、
クラスをnewしなくても、Test.main("abc");と呼び出せば、
実行します。
 なお、public static void main(String[] args) のメソッドは
とくべつで、このメソッドは、Javaの実行環境で、java クラス名、
この場合 java Testと呼び出すと、この

  public static void main(String[] args)

に記述されているメソッドを実行します。




■Hello Worldと書き出す処理をさせるには?

 System.out.println("出力したい文字");

 と書けば、文字を出力します。
 なので、

 System.out.println("Hello World");

 とかけば、Hello Worldと出力します。
 つまり、
public class Test {

	public static void main(String[] args) {
		System.out.println("Hello World");
	}
}

とかけば、Hello Worldと出力します。
これで、できあがりです(^^)




 これで、目的のHello Worldを書き出せたので、
とりあえず、このシリーズは、おしまいとします。

 来年から、このシリーズのデータベース版?である

   Hello World程度のデータベース

 を、土日シリーズとしてはじめます。


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

ウォーターフォールにおけるテストとアジャイルにおけるテスト

2006-12-24 15:29:07 | Weblog

 ウォーターフォールにおけるV字型開発、いわゆる
 要求仕様、外部設計、詳細設計、プログラミングとやっていって、
 逆に、
    プログラミング/詳細設計の確認として単体テスト
    外部設計の確認として結合テスト
    要求設計の確認として総合(システム/運用)テスト
 というように、テストをしていくという開発と、

 アジャイルによるテストファーストのテストの場合の意味合いの違いについて
ちょっと書いてみたいと思います。(唐突ですけど)




 ウォーターフォールの場合、工程を下流から上流へとさかのぼっていくかたちでテストします。

 一方、アジャイルの場合は、大きいところから決めていき、呼び出すメソッド、すなわち下流はスタブとして用意して、とりあえずテストします。そうしないと、テストファーストにならないですから。

 この場合、上流から、下流へテストしていくことになります。

 つまり、ウォーターフォールでは、
・単体テスト、
・IT1(結合テストで、単体で分けられたユニットが、インターフェース、仕様どおり動き、結合可能かテストするブラックボックステスト)、
・IT2(結合テストで、要求仕様をもとに、おおきく、サブシステムにわけて展開するが、そのサブシステム間の接続があっているかどうかを確認するテスト)
・システムテスト(要求仕様の、非機能要件が満たされているかどうか確認する)
・運用テスト(要求仕様の、ToBeとしてあげた、機能要件、すなわち、コンピューター導入後の業務が、実行可能か確認する)
という順番になるが、

 アジャイルではいわば、IT2,IT1、単体テストのように、落ちていくことになる。

 ちなみに、ウォーターフォールでも、設計段階で、上位から下位へと確認していくことは、行う。ただし、この場合、実機で動かすものがないので(プログラムはできてないので)、レビューというカタチで各フェーズで行うことになる。しかし、レビューは、レビュワーの力量にさゆうされてしまう。




 一方、アジャイルの場合、はじめにシステムテストを行うことはできない。

 なぜなら、全体ができるというのは、一番下位の部分ができてからということになるので、それまで、テストできない。

 そーすると、こまるので、それを担保するために、プロトタイプを作成する目的が変わってくるんだけど、それは、また別の機会に。。

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

これって、いわゆるガチャピンSNS??と思ったけど。。。

2006-12-24 13:50:54 | Weblog

ここのアメーバニュース
ガチャピンにクリスマスプレゼント?腹黒疑惑が再燃
http://news.ameba.jp/2006/12/2378.php

によると(以下斜体は上記ニュースより引用)

 ガチャピンさん(5歳・恐竜のこども)が、クリスマスを目の前に活発に動き出した。

 まずは12月21日に「ガチャピンClub」がオープン。これは、ブログサービス「Vox」を利用したもので、「ガチャピンの友達」にならないとガチャピンが公開する「友だちにだけ見せたい」記事や画像を見ることができない。友達になるには招待状が必要で、フジテレビKIDS会員には、ガチャピンからの招待状が送られていたという。


・ガチャピンの友達にならないと、友達にしか公開してない記事や画像は見れない
・友達になるには、招待状が必要

おお、SNSっぽいです。
ガチャピンSNSとおもったけど。。

うん?
・招待状をもらうには、「フジテレビKIDS会員」になることが必要、
 逆に言うと、フジテレビKIDS会員になればいいっていうことだよねえ。。

フジテレビKIDS会員って、多分フジテレビKIDSクラブのメンバー登録した人のことだと
おもうけど、そのフジテレビKIDSクラブは、
ここ http://www.fujitvkidsclub.jp/

ここから、無料でメンバー登録できるので、SNSというよりかは、
単に、フジテレビKIDSクラブに入るかどうかの問題みたいですね(^^)。。



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

PDCAサイクルとPDSサイクルの違い

2006-12-23 23:46:24 | Weblog

ちょっと気になったというか、後の話で使うかもしれないので。。
自分のメモ的には、リンクだけでいいんだけど、少し説明。

PDSとPDCAの違いは、
ここ http://www.technofer.co.jp/FAQ/FAQ9001_070.html
の受講生がもろきいているけど、もともと、PDSサイクルというのがあって、
それを品質管理のほうで、SをC(チェック)とA(Act)にわけた。

 なお、そこには、はっきりかいてないけど、PDCAというのが出てくるのは、
ここhttp://www.atmarkit.co.jp/aig/04biz/pdca.html
によると、W・A・シュハートといっている。(デミングはPDSAとしている)

 SをCとAにわけたということは、AにおけるActが、以下のような性格を
もつことになる。

 Aは、初めに立てたPの範囲内において、それを継続するか、破棄するか、カイゼンするかを決定し、行動するものである。つまり、Pの範囲でのカイゼンの行動をとる。

 一方PDSサイクルにおいて、Sで評価した結果、新しいPをたてるときは、PDCAのあらたなP同様、以前のPDCAの結果に影響は受けるものの、新しいPであるから、自由に建てられる(PDCAのAのように、はじめのPの範囲に対しての反応ではなく、それをにらみながらも、あらたなPを自由にたてることができる)。

 PDCAサイクルのAの意味に関しては、
 ここ http://jikan.livedoor.biz/archives/50904625.html
 そこによると、
Act : take actions to continually improve process performance.
だそうな。。


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

LAOXのThe Computer館の中が昔と違ってた

2006-12-23 23:04:54 | Weblog

 今日、ひさびさに、LAOXのThe Computer館(秋葉原)にいったら、
 なんか、昔と違ってて、3階のソフトのコーナーが5階にいってて、
3階がよくわかんない(^^;)コーナーになっていた。

 で、The Computer館の周りも変わってて、工事してたし。。。

 秋葉原に、ちょっといかないと、大きく変わってしまうようだ。。
 最近は。。

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

楽天のオークションが、たたかれてるね

2006-12-23 21:46:28 | Weblog

ここ
被害者が告発「楽天オークションはトラブル続きの最悪サイトです」
http://www.mynewsjapan.com/kobetsu.jsp?sn=562


ほー、ウィリアムのいたずらは、
オークションはやってないので、
あんまり関係ないけど。。。
うーん、なんかいろいろありそうな気配??

でも、このネタ、本家(楽天日記にあります)では、
絶対かけないネタだ(^^;)

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

業務のまとめからDFDへの変換方法

2006-12-23 20:07:58 | 開発ネタ

 最近、業務をまとめたシートと、入出力についてまとめたシートをつかって、DOA,オブジェクト指向の各種の図やシナリオ、テストデータやプログラムに展開する話を書いています。

 今回はDFD(データフローダイアグラム)について書きます。



■まず、DFDとは、なにか?

 DFD(データフローダイアグラム)は、デマルコによって提唱されたもので、
構造化分析とシステム仕様という本に詳しく書かれています(この本自体は、古典として有名)。

 で、この図は、国のEAでも「機能情報関連図」として、描くものになっています。
 実際、そのサンプルが、EAのページの
機能情報関連図(DFD):現状モデルの策定
http://www.meti.go.jp/policy/it_policy/ea/gainen/product/dfd/1.html

にあります。

 そこの下のほうにある図がDFD(のサンプル)です。

 ちなみに、システム全体と、外部とのやり取りを書いた、最上位のDFDを、コンテキストダイアグラムといいます。そして、DFDの終わりは、1枚の紙で機能を文章化できるくらいのレベルまで落とし込むとされます。この「1枚の紙で機能を文章化」されたものが、ミニスペックといいます。

で、結局、DFDは、なにを書くのか?っていうことになると、
ここ http://www.meti.go.jp/policy/it_policy/ea/gainen/product/dfd/5.html

にあるように、こんな種類のものを書きます(上記のデマルコの本の69ページ)。

データ源泉/データ吸収
 四角の図形で描かれているものです。外部からのデータ入力がデータ源泉、外部へのデータ出力が、データ吸収になります。

プロセス
 楕円で書いているものです

ファイル
 二重線の中に文字を書いているものです。実際にはファイルだけでなく、DBも入ります。
 永続性のあるデータってことです。

データフロー
 矢印の線です。




■業務をまとめたシートからDFDを書くには?

 では、以前書いた、業務をまとめたシートからDFDをかく方法についてです。
 ここでは、とくに、受注を例にかんがえます。

(1)これから描こうとする業務のシートをあけて、内容の子アクティビティをチェック
   受注シートをあけて、子アクティビティをチェック、この子アクティビティが、
   プロセスとしてかかれます。

(2)子アクティビティは、プロセスですので、てきとーに楕円を書いて、
   そこに、子アクティビティ名をいれて、プロセスの表記をしてください。
   たとえば、受注の子アクティビティに、受注受付、受注票作成、とあったら、
   受注受付のプロセスと、受注票作成のプロセスを書きます。

(3)(2)の子アクティビティのシートをひらいて、それぞれについて
   入出力のところをみてください。

   このの入力のうち、ファイルは、ファイル名.項目名となっているはずです。
   DBは、テーブル名.項目名となっているはずです。

   このうち、ファイル名の部分、テーブル名の部分を取り出し、
     もし、まだ図にかかれていなかったら、
       ファイルの二重線を描いて、
       そこにファイル名(テーブル名)をかいて、
       矢印の線(データフロー)を書きます(プロセス側に矢印がくる)
     図に描かれていたら、
       書かれているファイルのところから
       矢印の線(データフロー)を書きます(プロセス側に矢印がくる)

   出力も同様に、出力のところをみて、ファイル名を書いたり、データフローの
   矢印を書きます(ファイル側に矢印がきます。つまり、矢印の方向が逆です)

   もし、データフローにデータ項目を書く場合は、上記入出力のところの
   テーブル名.項目名の、項目名のほうを書いてください。

   上記の例だと、まず、「受注受付」の入出力をみて、入力に書かれているものの、
   ファイル名、テーブル名を取り出して、ファイルとして書き、データフローを
   いれます。項目名も必要なら、データフローに書いてください。
    出力も同じことをします。
   そのあと、「受注票作成」もみて、同じことをします。
 
(4)上記の入出力の入力のうち、ファイル入力以外の入力、つまり、画面入力は、
   データ源泉にあたります。

    その画面を入力する「人」など(画面自体ではありません。ちゃんと、
   画面表示のアクティビティを書いていれば、その担当者にあたります)について、
   四角形を書いて、データ源泉として、矢印を書きます
   (プロセス側に矢印がきます)

   入出力の出力のうち、ファイル以外、つまり、画面出力と帳票出力は、
   データ吸収にあたります。
    その画面や帳票を見る「人」など(画面・帳票自体ではありません。ちゃんと、
   画面出力のアクティビティを書いていれば、その担当者にあたります)について、
   四角形を書いて、データ吸収として、矢印を書きます
   (四角形の吸収側に矢印がきます)

   なお、項目名を書く場合、画面名、帳票名でOKの場合、項目まで書く場合、
   いろいろあります。

   先ほどの例だと、「受注受付」では、受注受付画面がこれにあたります。
   この受注受付画面を入力する人(受注係の場合、お客様の場合と、考えられるが
   実際に入力する人)を四角をかいて、データ源泉とする。

   「受注票作成」では受注票を見る人(1人、1部署だけとは限らない)を、
   データ吸収として、四角をかいて、そのあと、データフローを書く。

(5)「後のアクティビティ」のところをみて、あとのアクティビティに、データフロー
   を書く(1つとは限らない)後のアクティビティ(プロセス)のほうに矢印が来る

   先ほどの例だと、「受注受付」の「後のアクティビティ」に、「受注票作成」
   と書いてあると思うので、「受注受付」から「受注票作成」にむけて矢印を
   書く。




大体こんな感じでできると思います。

では、次は、また違う図で。。

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

いまの、若いひとは、「ワープロ専用機って見たことない」そうだ。。

2006-12-23 14:14:22 | Weblog

Impress Watchの萌えニュースで、10年前のニュースというのを
やってます。
出演は、 村井真里さんと、中畠綾香さん、
やっぱ、この2人っすよねー(^^)

っていうのは、さておき、この中で、
「ワープロって、パソコンでやるんじゃないの?」
「ワープロ専用機って見たことない」
っていうようなこといってるくだりがでてくる。。。

がーん。。。そー言う世代なのか(@_@!)

ひえー。。。。

そんな世代では、きっと、「松」や「桐」っていっても、木の名前だろう。。
「一太郎」はまだしも、三四郎。。は、柔道の人?
「五郎」は、野口五郎??いやいや、野口五郎も、あやしいよねえ。。。

 意外と、のむらのよっちゃんとかも、「あ、あゆのバックバンドの人?」っていわれそうだし、近藤真彦は、「車関係の人?」っていわれそうだし、田原俊彦は、「あ、最近株で3500万もうけた人?」とかいわれ。。。って、それはないって(^^;)

P.S そーやって、みんな変わっていく中で、この前、テレビショッピングのカラオケの紹介で、「あずさ2号」を歌っていた「狩人」は、ある意味偉大だ。。



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

ウォーターフォールとスパイラルモデルの問題点とインクリメンタルモデル

2006-12-23 12:46:20 | Weblog

ちょっと自分に対するメモみたいなもん。
開発方法論のウォーターフォールとスパイラルモデルの問題と、
おとしどころとしてのインクリメンタルモデル




■ウォーターフォールモデル=途中の仕様変更の問題、間違えると大変
 ウォーターフォールモデルは、開発をいくつかのフェーズ(要求分析、外部設計、内部(詳細)設計、プログラム、単体テスト、結合テスト、総合テスト(システムテスト、運用テスト)に分け、それぞれのフェーズを完了してから、次のフェースにうつる。

 いわゆるV字型開発というものになる

 この開発は、1フェーズが長く、先が見えにくい上、数年もかかるプロジェクト
の場合、途中で仕様変更ができないので、時代遅れのシステムになるという問題もあるが、それ以上に、大きくなった場合、上流工程で間違いがあると、下流工程で総崩れになる危険がある。

 たとえば、ユーザーインターフェースで、カーソル移動をいろいろできるように
設計していたが、実は、その画面ツールでは、クライアント側の入力に応じてカーソルを移動するという仕組みはなかった。
 などというとき。。。

 プログラミングするときに気づいたなどとなると、外部設計まで戻らないといけない。

 ここまでのミスは、まずないが、仕様の取り違えや矛盾が、かなり下流になって
からくるということはある。

 仕様変更が多く、オープンシステムになって、作ってみないと、どういう制約があるかわからないという昨今は、そのため、スパイラルモデルを検討されるようになった




■スパイラルモデル=ループ、逆スパイラルに陥る危険性
(ここで言っているスパイラルモデルは通俗的な意味であり、
 ベームのいう学術的なスパイラルモデルではない。
 学術的なスパイラルモデルはまったくの別物で、以下の内容はあてはまらない)

 
 スパイラルモデルの場合は、開発工程を、何度も繰り返していく
 (くどいが、この定義は、ここなどに書かれている通俗的なもので、ベームのものとは異なる)。
 そのため、逐次仕様変更も可能になってくる。

 しかし、このことは、開発中に仕様変更が入るため、仕様追加したことによる、
インターフェースの矛盾や、変更し忘れなどを招く危険がある。
 この場合、品質は悪くなり、それを取り繕うためになにかすると、またそこに
バグが入ったりしてという、やればやるほど悪くなる逆スパイラルを招く危険が
ある。

 また、スパイラル、とくにテストファーストでやっている場合、仕事をしている
ような気になるので、モデルの本当に難しいところを置いておいて、わかりやすい
ところから手をつけ、そこを何度もカイゼンしていくという危険がある。

 この場合、本当に考えなければいけないところは、何時間も考えないといけないので、なかなか先に進まない。そーいうことはあとまわし、ブラックボックスということにしてしまい、わかりやすいところばっかり、あーでもない、こーでもないと議論する、

 つまり、仕事はしているが、おなじところを堂々巡りするループにおちいる。

 ここで、スパイラルは、何周までという規定をもうけてしまうと、今度は、
その周回をまわれば、本当にシステムができるのかどうか?がわからない。




■インクリメンタルモデル

 そこで、インクリメンタルモデルがでてきた。
 大きなシステムをサブシステム、サブサブシステム。。。とわけ、その中では、ウォーターフォールが採用され、システム全体としては、順次、サブシステムをつくっていくという流れ。
 この場合、本来のインクリメンタルモデルではないかもしれないが、サブシステム(ないしサブサブシステム、もっと小さく分けたなら、その単位)を1つのプロジェクトとして、各プロジェクトはウォーターフォールで作成し、プロジェクトが完了した後で、そのシステムの足りない点や、仕様変更したい点をまとめ、その修正も1プロジェクトとしてしまうと、プロジェクトをいろいろやっていくことによって、スパイラルのように、仕様変更に対応できるようになる。

 この場合、どの時点で、そのサブサブシステムにわけ、その際、何を決め、その各プロジェクトをどのように運営していくことで、一番効果的にできるか。。。
 という疑問が生じる




 今回はここまで。上記の疑問は、別の機会に。



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

Linuxのファイルシステムの1つを開発した人の会社、格安で売却の方針。というのも開発者が殺人の

2006-12-23 04:00:57 | Weblog

容疑で勾留されていて、弁護費用がなくなっちゃうから。。。会社を売るそうな。

ちなみに、そのファイルシステムはReiserFS
(表題の字数制限の関係で、みょうなところで、切れてしまった ^^;)

で、その記事が載ってるのが、ここのスラッシュドットニュース
Linux: 妻の殺害容疑で勾留中のHans Reiser、Namesysを売却方針
http://slashdot.jp/linux/06/12/22/0642220.shtml

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


ReiserFSの開発者であり、妻の殺害容疑で現在も勾留中のHans Reiser氏であるが、本家Slashdotのストーリーによれば、彼の会社である Namesys社を売却する方針のようだ。これは、彼自身の弁護のための費用が尽きかけているため


(中略)


確かにReiserFSを所有できることを魅力に感じるところもありそうだ。


(中略)


気になる捜査の状況だが、本家ストーリーで参照しているWired Newsの記事から、Nina Reiserさんの行方はまだ分かっていないようだ。Hans Reiser氏が逮捕されたのは、彼の家と車からNinaさんの血痕が見つかったからのようだが、Hans氏は現在も無実を主張している。


Linuxのファイルシステムの開発者が、奥さんの殺人容疑で勾留てのもすごいが、
その裁判費用が底をつきそうなんで、会社売っちゃうって言うのもすごい(^^;)

で、買うとしたら、どこの会社??

やっぱ、ここは、ターボリナックスにかっていただきたーい!
この前、Laser5買収したでしょ。
だから今度はReiserFSって、どお(^^)

日本人はLとRの発音の違いができないから、困るよ(-_-)
といわれそうなんで、このへんで。。。


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

Winny対策で10億円、総務省予算

2006-12-22 23:23:03 | Weblog

ここのニュース
総務省予算:ウィニー対策で10億円
http://www.mainichi-msn.co.jp/seiji/gyousei/news/20061222k0000m010142000c.html

で、一つ、気になったんだけど(以下斜体は上記ニュースより引用)

Winny対策として、技術開発する内容、


ネットワーク上のファイル共有ソフトの利用状況を監視し、情報の漏えいを迅速に発見する技術や、


まではいいんだけど。。。


漏えいした情報を削除して、被害の拡大を防ぐための技術開発などを行う


漏洩もとのデータを消したって、もう、一度漏洩したら、どんどんコピー
されちゃうから、意味ないよねえ。。

てーことは。。。
漏洩したデータを保存した人のパソコンの中に入って、削除する??
うん??どーやってやるの??
きょうみしんしん!?

・・・ウィリアムのいたずら、なにか、大勘違いしてる??
(そんな気もする。。)


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