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

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

「Google Earthで裸の人々を観察してみる」って、あれ、海岸、ヌーディストビーチとかは。。。

2006-12-01 23:25:53 | Weblog

ここのニュース
Google Earthで裸の人々を観察してみる
http://gigazine.net/index.php?/news/comments/20061201_naked_people/

ま、そこに、ちいさく、裸の人が載っている
。。。といっても、全裸ではない。はい。

まあ、衛星写真ですから、そーいうことも。。。

ちょっとまってください。。。
それじゃあ、海岸線などは、どーなるんでしょう?
水着の人ばっか??

もっと、ちょっとまってください。
世界には、ヌーディストビーチというのがありますよね。。。
とおもったら、もうすでにやっている人がいた
「Google Earthでヌーディストビーチを、、」
http://sea.ap.teacup.com/hadaka/39.html

うーん、だめっすか。。。

もっとも、ビーチによっては、ホモのヌーディストビーチもあるそうな。。
うーん、間違えないように見ないといけません(^^;)??




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

ソニー、ゲームハードから撤退の前兆?久多良木氏は日々の業務運営から離れる

2006-12-01 20:54:09 | Weblog

ここの痛いニュース
"ソニー、ゲームハード撤退の前兆"…英フィナンシャル・タイムズ報じる
http://blog.livedoor.jp/dqnplus/archives/866045.html


(YAHOOニュースだとここ。[その他]の最後のニュース)
によると(以下斜体は、上記痛いニュースより引用)


ソニー・コンピュータエンタテインメント(SCE)の久多良木健社長が会長に就任。
昇格人事ではあるが、久多良木氏は日々の業務運営から離れることに。ソニーがビデオゲームのハードウエア製造から撤退する前兆との見方も浮上。


おー、ソニー、どーなっちゃうんだ。。
っていうか、そーするとニンテンドー、一人がち。。

ゲームメーカーにとっても、市場が減るっていうか、
戦略のたてなおしになるよねえ。。
もし、こんなことがおこったら。。

そーいうメーカーは、ケータイにでも、参入する??

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

USBでミサイル発射4,980円、発売しているのは当然、あの会社。。

2006-12-01 20:11:35 | Weblog

ここのニュース

USBミサイルランチャー2種類が発売、飛距離は4m超に
http://www.watch.impress.co.jp/akiba/hotline/20061125/etc_missile.html


によると、USBに接続してミサイル発射するおもちゃ?
が4980円で売られているそうな。

発売してるのは、
あのばけたんストラップなどを出している
ソリッドアライアンス



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

iアプリやJavaの画面において、イベント処理を画面内に置くかどうかでデスマーチを考える(その1)

2006-12-01 16:34:54 | Weblog

 iアプリやJavaの画面において、イベントに対する処理部分を書く方法が、大きく分けて2つあります。

 1つは、画面のクラスの中に、書いてしまう方法
 もう1つは、画面とイベントを分けてしまう方法です。

 今回は、それぞれについて紹介ます。

 で、次回のこのシリーズで、どっちを使うかの判断基準みたいな話をまず書きます。

   前者の書き方で書くと、あとで、デスマーチになることがあります。
   でも、後者の書き方はめんどっちいこともあります。

 で、その辺の判断基準を書いたあとで、
 昨日のブログの話をちょっと書きます。





■仕様と概要

 まず、2つの話を書くために、サンプル(例)を挙げます。

 いま、ボタンを2つだし、

 一方が押されたらNo1 Pushと表示、
 もう一方が押されたらNo2 Pushと表示して終了する

 AWTプログラムを書くこととします。




■1.画面のクラスの中に、イベント処理書いてしまう方法

この場合、呼び出し部分(mainがある部分)と、画面部分に分けたほうがやりやすいので、
そうします。

すると、こんなプログラムになります。

呼び出し部分(クラス名Test、呼び出し画面クラスGamen1)は、
こんなかんじになります。

public class Test {

	public static void main(String[] args)
	{
		new Gamen1();	
	}
}


で、画面のほうなのですが、今回は、イベント処理もやってしまうので、こんなかんじ。
import java.awt.*;
import java.awt.event.*;
import java.util.*;


public class Gamen1 implements ActionListener {
	Frame 		f;
	Button		b1;
	Button		b2;

	public Gamen1()
	{

		f = new Frame("test");
		f.setSize(240,100);
		f.setLayout(null);

		b1 = new Button("no1");
		b1.setLocation(1,10);
		b1.setSize(100,80);
		b1.addActionListener(this);
		f.add(b1);

		b2 = new Button("end");
		b2.setLocation(120,10);
		b2.setSize(100,80);
		b2.addActionListener(this);
		f.add(b2);

		f.setVisible(true);
	}
	
	public void actionPerformed(ActionEvent e)
	{

		Object o = e.getSource();

		//おされたことを表示
		if ( o.equals(b1)== true)
		{
			System.out.println("No1 Push");
			return;
		}
			//	終了
		if ( o.equals(b2)== true)
		{
			System.out.println("No2 Push");
			f.dispose();
			return;			
		}
	}
}





■2.画面とイベントのクラスをわける方法(その1:イベントはまとめる)

 一方、画面とイベントを一緒のクラスに書かないで、分けてしまう方法もあります。
 イベントは全部1つにまとめてもいいし、
 極端な場合、1イベント1クラスにする方法もあります。

 で、ここでは、イベントは全部1つにまとめるほうについて

 呼び出し側のTestクラスは一緒です。
 画面が以下のように変わります。

import java.awt.*;
import java.awt.event.*;
import java.util.*;


public class Gamen1  {
	Frame 		f;
	Button		b1;
	Button		b2;

	public Gamen1()
	{
		
		Gamen1Event ge = new Gamen1Event();
		ge.g	=	this;
		
		f = new Frame("test");
		f.setSize(240,100);
		f.setLayout(null);

		b1 = new Button("no1");
		b1.setLocation(1,10);
		b1.setSize(100,80);
		b1.addActionListener(ge);
		f.add(b1);

		b2 = new Button("end");
		b2.setLocation(120,10);
		b2.setSize(100,80);
		b2.addActionListener(ge);
		f.add(b2);

		f.setVisible(true);
	}
} 

(赤字は1.とくらべた変更ポイント)

で、一方、画面1の全イベント処理はこうなります。
import java.awt.*;
import java.awt.event.*;
import java.util.*;


public class Gamen1Event implements ActionListener{
	Gamen1	g = null;
	
	public void actionPerformed(ActionEvent e)
	{

		Object o = e.getSource();

		if ( g	==	null )
			return;
			
		//おされたことを表示
		if ( o.equals(g.b1)== true)
		{
			System.out.println("No1 Push");
			return;
		}
			//	終了
		if ( o.equals(g.b2)== true)
		{
			System.out.println("No2 Push");
			g.f.dispose();
			return;			
		}
	}
}

前のクラス内で書いたものと、大体同じなのですが、
違いは、Gamen1の要素をアクセスするとき、g.という形でアクセスしてるくらいです。




■2.画面とイベントのクラスをわける方法(その2:1イベント1クラス)

で、極端な場合、1イベント1クラスにできます。

このときの画面のソースはこんなかんじ
import java.awt.*;
import java.awt.event.*;
import java.util.*;


public class Gamen1  {
	Frame 		f;
	Button		b1;
	Button		b2;

	public Gamen1()
	{

		
		f = new Frame("test");
		f.setSize(240,100);
		f.setLayout(null);

		b1 = new Button("no1");
		b1.setLocation(1,10);
		b1.setSize(100,80);

		Gamen1Event1 ge1 = new Gamen1Event1();
		ge1.g	=	this;
		b1.addActionListener(ge1);
		f.add(b1);

		b2 = new Button("end");
		b2.setLocation(120,10);
		b2.setSize(100,80);

		Gamen1Event2 ge2 = new Gamen1Event2();
		ge2.g	=	this;
		b2.addActionListener(ge2);
		f.add(b2);

		f.setVisible(true);
	}
}

(赤字は、2のイベントすべての場合と違うところ)

NO1のイベント処理クラスは、こんなかんじ
import java.awt.*;
import java.awt.event.*;
import java.util.*;

public class Gamen1Event1 implements ActionListener{

	Gamen1	g = null;
	
	public void actionPerformed(ActionEvent e)
	{
		if ( g	==	null )
			return;
		System.out.println("No1 Push");
		return;
	}
}


NO2っていうかendのイベント処理クラスは、こんなかんじ
import java.awt.*;
import java.awt.event.*;
import java.util.*;

public class Gamen1Event2  implements ActionListener{

	Gamen1	g = null;

	public void actionPerformed(ActionEvent e)
	{
		if ( g	==	null )
			return;

		System.out.println("No2 Push");
		g.f.dispose();
		return;			
	}
}


極端そうに見えますが、実際、サーブレットやStrutsなどでも、
1アクションに対応するのは1サーブレット、つまり1クラス
なわけで、それほど、極端な話でもないかと、思います。




ということで、今回はソースの紹介だけですが、
次回のこのシリーズでは、
1の方法だと、開発時に、修正が入ると困り、
デスマーチになるというのを

具体的な話にすると、問題があるので、
それを抽象的にぼやかした形で、紹介します。

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

BREWでiアプリ統合作成ツールのための、1イベント1関数化(その2:呼ばれる側のソース)

2006-12-01 13:40:36 | ケータイ

 シリーズBREWでiアプリっぽくリスナーをつけるため、1イベント1関数にする方法のつづきです(名前が長いので改名しました)

 いま、1つの画面仕様書から、雛形ファイルを変えるだけで、BREWとiアプリ(あとJavaもOKだけど)、2つに対応したソースを出すツールを考えています。
 で、その場合、まず、

1.あるイベントが発生したときに、ある関数に飛ぶように登録します
2.そのイベントがきたら、登録してある関数をディスパッチします
3・結果として、イベントごとに関数を用意すれば、その関数に飛んでくれることになります。

ということを実現することが必要だってことになって、これを実現する関数として
以下の4つの関数が必要だということになりました

//■1.生成
IEventList *IEVENTLIST_Create();

//■2.解放
void IEVENTLIST_Release(IEventList *pMe);

//■3.イベント登録(addListenerにあたる)
int IEVENTLIST_Add(IEventList *pMe,void* pArg,int kind,AEEEvent eCode,
    uint16 wParam,uint32 dwParam,PFNAEEEVENT func);

//■4.イベント処理(ディスパッチ)
boolean IEVENTLIST_HandleEvent(IEventList *pMe, AEEEvent eCode, uint16 wParam, uint32 dwParam);

 今回は、このソース(ヘッダファイルとソースファイル)について公開します。




■ヘッダファイル(IEventList.h)
ヘッダファイルについては、以下のとおりです。
/*============================================
FILE: IEventList.h
内容:イベント設定
作者:ウィリアムのいたずら
=============================================*/


/*============================================
INCLUDES AND VARIABLE DEFINITIONS
=============================================*/
#ifndef _IEVENTLIST_H
#define	_IEVENTLIST_H
#include "AEE.h"        // Standard AEE definitions
#include "AEEShell.h"   // AEE Shell Services
#include "AEEStdLib.h"  // AEE stdlib stuff

//============================================//
//	変数定義				//
//============================================//

//	イベント判断種類
#define	IEVENTLIST_KIND_ECODE	0	// eCodeだけで判断する
#define	IEVENTLIST_KIND_WPARAM	1	// wParamも
#define	IEVENTLIST_KIND_DWPARAM	2	// dwParamも


//============================================//
//	イベント保持クラス追加		//
//============================================//
typedef struct _IEventList
{
	int	eventsu;		//	イベントの数
	int	*kind;		//	イベント判断種類
	AEEEvent	*eCode;		//	コード
	uint16	*wParam;		//	第一詳細引数
	uint32	*dwParam;		//	第二詳細引数
	PFNAEEEVENT *func;		//	呼び出し関数
	void	**pArg;		//	引渡し関数
} IEventList;
/*===============================================
FUNCTION DEFINITIONS
================================================*/
#ifdef _IEVENTLIST_C
IEventList *IEVENTLIST_Create();
void IEVENTLIST_Release(IEventList *pMe);
int IEVENTLIST_Add(IEventList *pMe,void* pArg,int kind,AEEEvent eCode,
	uint16 wParam,uint32 dwParam,PFNAEEEVENT func);
boolean IEVENTLIST_HandleEvent(IEventList *pMe, AEEEvent eCode,
	uint16 wParam, uint32 dwParam);
#else
extern IEventList *IEVENTLIST_Create();
extern void IEVENTLIST_Release(IEventList *pMe);
extern int IEVENTLIST_Add(IEventList *pMe,void* pArg,int kind,AEEEvent eCode,
	uint16		wParam,uint32 dwParam,PFNAEEEVENT func);
extern boolean IEVENTLIST_HandleEvent(IEventList *pMe, AEEEvent eCode,
	 uint16 wParam, uint32 dwParam);
#endif
#endif

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





■ソースファイル(IEventList.c)
ソースファイル(上記4つの関数)については、以下のとおりです。
/*==========================================
FILE: IEventList.c
内容:イベント設定
作者:ウィリアムのいたずら
============================================*/


/*===========================================
INCLUDES AND VARIABLE DEFINITIONS
============================================*/
#define	_IEVENTLIST_C
#include	"IEventList.h"

/*==========================================
FUNCTION DEFINITIONS
============================================*/
//==========================================//
//	関数名:IEVENTLIST_Create	       //
//	内容 :イベントリストの生成       //
//==========================================//
IEventList *IEVENTLIST_Create()
{
	IEventList *pMe;

	//	メモリ領域確保
	pMe	=	NULL;
	if ( (pMe = MALLOC(sizeof(IEventList))) == NULL )
	{
		return	NULL;
	}

	//	初期化
	pMe->eventsu	=	0;
	pMe->eCode	=	NULL;
	pMe->wParam	=	NULL;
	pMe->dwParam	=	NULL;
	pMe->func	=	NULL;
	pMe->pArg	=	NULL;

	return	pMe;
}


//==========================================//
//	関数名:IEVENTLIST_Release	       //
//	内容 :イベントリストの解放       //
//==========================================//
void	IEVENTLIST_Release(IEventList *pMe)
{
	if ( pMe	==	NULL )
		return;

	if ( pMe->kind		!=	NULL)
	{
		FREEIF(pMe->kind);
	}

	if ( pMe->eCode		!=	NULL)
	{
		FREEIF(pMe->eCode);
	}

	if ( pMe->wParam		!=	NULL)
	{
		FREEIF(pMe->wParam);
	}

	if ( pMe->dwParam		!=	NULL)
	{
		FREEIF(pMe->dwParam);
	}

	if ( pMe->func		!=	NULL)
	{
		FREEIF(pMe->func);
	}

	if ( pMe->pArg		!=	NULL)
	{
		FREEIF(pMe->pArg);
	}

	FREEIF(pMe);
}

//==========================================//
//	関数名:IEVENTLIST_Add	        //
//	内容 :イベントリスト追加	        //
//==========================================//
int IEVENTLIST_Add(IEventList *pMe,void *pArg,int kind,AEEEvent eCode,
	uint16		wParam,uint32 dwParam,PFNAEEEVENT func)
{
	int	n_eventsu;
	int	*n_kind;
	AEEEvent	*n_eCode;
	uint16	*n_wParam;
	uint32	*n_dwParam;
	PFNAEEEVENT *n_func;
	void	**n_pArg;
	
	if ( pMe	==	NULL )
		return	-1;

	//	新しい領域確保
	n_eventsu	= pMe->eventsu	+	1;
	n_kind	= (int *)MALLOC(n_eventsu * sizeof(int));
	n_eCode	= (AEEEvent *)MALLOC(n_eventsu * sizeof(AEEEvent));
	n_wParam	= (uint16 *)MALLOC(n_eventsu * sizeof(uint16));
	n_dwParam	= (uint32 *)MALLOC(n_eventsu * sizeof(uint32));
	n_func	= (PFNAEEEVENT *)MALLOC(n_eventsu * sizeof(PFNAEEEVENT));
	n_pArg	= (void **)MALLOC(n_eventsu * sizeof(void *));

	//	古い領域のコピーと解放
	if ( pMe->eventsu	!=	0 )
	{
		MEMCPY(n_kind,pMe->kind,pMe->eventsu * sizeof(int));
		FREEIF(pMe->kind);
		MEMCPY(n_eCode,pMe->eCode,pMe->eventsu * sizeof(AEEEvent));
		FREEIF(pMe->eCode);
		MEMCPY(n_wParam,pMe->wParam,pMe->eventsu * sizeof(uint16));
		FREEIF(pMe->wParam);
		MEMCPY(n_dwParam,pMe->dwParam,pMe->eventsu * sizeof(uint32));
		FREEIF(pMe->dwParam);
		MEMCPY(n_func,pMe->func,pMe->eventsu * sizeof(PFNAEEEVENT));
		FREEIF(pMe->func);
		MEMCPY(n_pArg,pMe->pArg,pMe->eventsu * sizeof(void *));
		FREEIF(pMe->pArg);
	}

	//	新しい領域を転送
	pMe->eventsu	=	n_eventsu;
	pMe->kind	=	n_kind;
	pMe->eCode	=	n_eCode;
	pMe->wParam	=	n_wParam;
	pMe->dwParam	=	n_dwParam;
	pMe->func	=	n_func;
	pMe->pArg	=	n_pArg;

	//	新しい値を転送
	n_eventsu --;	//	配列の最後は、個数 -1
	pMe->kind[n_eventsu]		=	kind;
	pMe->eCode[n_eventsu]		=	eCode;
	pMe->wParam[n_eventsu]		=	wParam;
	pMe->dwParam[n_eventsu]		=	dwParam;
	pMe->func[n_eventsu]		=	func;
	pMe->pArg[n_eventsu]		=	pArg;

	return	0;
}

//===========================================//
//	関数名:IEVENTLIST_HandleEvent      //
//	内容 :イベントリストのイベント処理//
//===========================================//
boolean IEVENTLIST_HandleEvent(IEventList *pMe, AEEEvent eCode, 
                                   uint16 wParam, uint32 dwParam)
{
	int	i;

	//	引数チェック
	if ( pMe	==	NULL )
	{
		return	FALSE;
	}

	for(i = 0 ; i < pMe->eventsu ; i ++ )
	{
		switch(pMe->kind[i])
		{
		case	IEVENTLIST_KIND_ECODE:
			if	( eCode	==	pMe->eCode[i] )
			{
				return	(pMe->func[i])(pMe->pArg[i],
                                            eCode,wParam,dwParam);
			}
			break;
		case	IEVENTLIST_KIND_WPARAM:
			if (	( eCode	==	pMe->eCode[i] ) &&
				( wParam	==	pMe->wParam[i]) )
			{
				return	(pMe->func[i])(pMe->pArg[i],
                                               eCode,wParam,dwParam);
			}
			break;
		case	IEVENTLIST_KIND_DWPARAM:
			if (	( eCode	==	pMe->eCode[i] ) &&
				( wParam	==	pMe->wParam[i]) &&
				( dwParam	==	pMe->dwParam[i]) )
			{
				return	(pMe->func[i])(pMe->pArg[i],
                                               eCode,wParam,dwParam);
			}
			break;
		}
	}
	return FALSE;
}

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




 このシリーズの次回は、この説明をするか、それとも、呼び出す側(今回は呼ばれる側、この関数を使う側のこと)の話を書くか、考え中です。。

 では、今回はここまで。

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