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

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

AJAX版のGoogleMapを使ったフライトシミュレータ、いれときました

2006-08-08 21:21:07 | Weblog

 きのう、GoogleMapで、空の旅を楽しむアプリと、そのAJAX版が出てる本と、インストール法で、

ここのブログ
自分で操縦して空の旅を楽しめるGoggles :: The Google
http://kengo.preston-net.com/archives/002748.shtml

を紹介するとともに、

Googleマップ+Ajaxで自分の地図を作る本 に、
 上記のようなフライトシュミレーションを、、AJAXでやるサンプルが載っているよということを書いて、さらにインストール方法まで書きました。




でも、どっちも、いまどこを飛んでいるかわかんないので、飛んでいるところをわかるように、マップ画像にも切り替えられる(って、それって、位置がわかるけど、反則じゃないの?という声はどっかにおいておいて)ものを、皆が見れるところに入れときました。

ここ http://www.geocities.jp/xmldtp/sample4_2_2.html


ここにおいていいのかどうかわかんないけど、一応置いてみました。
やばかったら、即刻削除するので、見たい人は(いるのか ^^;)はやいうちにみてね。
このソフトは、修正、再配布可能って、本に書いてあったので、ソフト公開自体はOK
だとおもうけど、ここにおいていいかどうかは(^^;)・・




このソフト、矢印キーで、そっちの方向に行き、
マップ、サテライトのボタンをクリックすると、地図と、衛星写真、きりかわります。。
(なので、はじめのゲームに比べると機能は少ないが、おもしろい)

 マシンが遅い場合、反応がにぶいです。

 とくに、地図と衛星写真の切り替えの場合は、
いったん飛行ストップボタンをおして、
ストップさせてから、地図なり衛星写真に切り替えて、
切り替わってから、飛行スタートにしないと、
(その間も、飛んでいるので)、急にとんでもないところに行っちゃいます。

はじめの計画では、場所も入れられるようにしようかと思ったけど、
緯度経度なんて、わかんないしなあ。。というので、ちょっと試案中

なお、今回修正したのは、このマップボタンをいれたのと、ちょっと移動距離が遅かったので、5倍速にしたところです。

ということで、興味がある方は、はじめのゲームと、あとの本にあったものを改造したものと、両方ごたんのーあれ!

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

ビューやストアドプロシジャでなく、セッションBeanなどのプログラムで操作する理由

2006-08-08 16:32:19 | Weblog

 以前、後で書くと書いた「なぜ、セッション管理相当のものとして、(DBでいう)ビューや、ストアドプロシジャにしないか」ということについて。

 理由は、管理上の問題が主です。
 VIEWで操作しようとなると、かなり数多いVIEWを作るのですが、この管理は、Javaソース管理とちがい、DB側で管理するので、ちと面倒になってきてしまうのです。どんどんVIEWを作られると。
 ストアドプロシジャもそうなんですけど。。

 あと、管理する箇所を局所化したいということがあります。
 セッションBEANでも変更できます。VIEWでも、対応できます。ストアドプロシジャでも対応できますってなってしまうと、1つの対応をどこでやられてるかわかんないし、思いもよらないところに波及してしまったりします。
 そうすると、1箇所にまとめたい。
 そのとき、プログラムはJavaでまとめたいとなると。。セッションBEANってことになる。

 微妙な問題で、ビューをつくると遅くなるという話があります。
 たしかに、更新は、遅くなるかもしんない。
 検索はふつう、はやくなるためにVIEWを使うけど。。場合によるかも?

 こんなところですかね(^^)

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

ロボットの動作を最小基本単位にわけ、オブジェクト化してWebAPIでの案:その2 Flashも。

2006-08-08 15:03:32 | Weblog

 このまえ、ここで、以下のことを書きました。

 ロボットのアクチュエーターの部位をクラスとし、
 そこの1動作を1メソッドとして、最小基本動作とし、
 その最小基本動作をいくつかまとめて、基本動作とする。

 一方、ロボットのセンサーの部位をクラスとし、
 そのセンサから受け取った直接の値を最小基本データとし、
 値を最小基本データをもとに処理したものを基本データとする


今回は、この最小基本動作をどのように記述してWebAPIにするかという
ことについて、思いついたことを書いてみたいと思います。
(試したわけではありません。単なる思い付きをメモ)




こんなふうに、あるやらせたい動作を定義します。


<<説明>>
・時間条件
 なにも記入がない(今回の場合)場合は、上から順々に
 数字が書かれていれば、書かれている秒数経過後に行います。
 (前の動作からの経過時間)
 0は順々に(=なにも書かないのと同じ)
 -1は、同時並列処理可能
 XX:XXの時間の場合は、その時刻が来たときに
 行います。
 センサーの条件の場合、条件式を記述します。

・部位(クラス)
 動作させたい部位を記述します(そこがクラスになっている)

・動作
 させたい動作を最強基本動作、基本動作で書きます

・パラメータ
 動作に必要な引数を記述します。

これを、XMLにして、WebのAPIに、POSTでわたし、操作してもらう
という形を考えてました。




 この形式、結局、時間と部位とメソッドでできているってことで
 Flashのタイムラインとおんなじこと?と思った 

 つまり、時間=タイムライン
     部位=レイヤー
     メソッド=起動する関数

ってことになるかなあと。。
 そーすると、ロボットの腕とか足とか、それぞれに相当するレイヤと、
そのレイヤにおける基本最小単位のと、基本単位の関数を作っておけば、
上のロボット操作のXMLから、Flashのファイルもつくれて、Flash上で
シュミレーションできる。。。のかなあ?

 だとしたら面白いなあ。。

 なんてことを思いました。



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

スパゲティなプログラムを分解してイベントにして、簡単にする方法2・・並行処理がある場合案

2006-08-08 11:29:37 | Weblog

 以前、スパゲティなプログラムを分解してイベントにして、簡単にする方法1・・簡単な例ってのを書きました。そこでは、以下の方法で、複雑に条件分岐するものを、イベント型のプログラムに変えました。

1.まず、入力が1つ、出力が1つ(1本の線しかない)ところは、まとめて、
  1モジュールとします。

2.そして、モジュールの出力のところに、番号を振ります。

3.プログラムを書きます
 while(終わりの番号で無い間)
 {
switch(ステータス)
   {
case 直前の終了番号:
      次の処理(データ);
break;
    :
    :
  }
 }
というかんじになります。


 今回は、これを発展させて、並列処理を含む場合について考えます。
 いろんなやり方があるとおもいますが、そのうちの1つの案について
 あげます。




■例
 以下のような処理を考えます。

 平行線のところ、つまり、処理2と、処理3、4が並行処理になります。
 処理5は、処理2と処理4の両方が終了したときに、行います。



■方針概要

1.引数のハッシュマップに、それぞれの処理において、終了したら、
   キー:処理名、値:"END"(固定文字列)
 を入れます。
 最後の処理(処理5)が終わったら、終了フラグに"END"と入れます。
 エラーが発生したら、発生時に"ERROR"といれます。

2.起動条件は、ハッシュマップから値をとってきて、
   直前の処理が終了していて、今やろうとしている処理が終了していなかったら
   起動します。

3.並行処理のときは、スレッドを起動し、並行処理フラグを"ON"にします。
  並行処理フラグが上がっているときは、ループを抜けます。
  スレッド先で処理が終了したら、もとのイベント処理ループを呼び出します。
  並行処理が終了したら、並行処理フラグをnullにします。
  →並行処理してないときは、イベント処理ループでループします。




■ソースのイメージ
 まず、起動するmain関数部分は、こんなかんじ
import java.util.*;
public class EventTest
{
	public static void main(String[] args)
	{
		HashMap map = new HashMap();
		if ( map	==	null )
		{
			//	エラー
			System.out.println("Error");
			return;
		}
		Syori syori = new Syori();
		syori.roop(map);	//	イベントループへ
		
	}
}

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

ここで、イベント処理クラスSyoriを呼んでいますが、そのイベント処理
のところと、処理1、処理5メソッドは、こんなかんじ。
import java.util.*;
public class Syori {
	/*============================================
	 * イベント処理ループ<p>
	 *============================================*/
	public void roop(HashMap map)
	{
		if ( map == null )
		{
			System.out.println("Error");
			return;
		}
		while(map.get("終了ステータス") == null )
		{
			if ( map.get("syori1") == null )
			{
				syori_1(map);
			}
			if (( map.get("syori1") != null ) &&
					( map.get("syori2") == null ) &&
					( map.get("syori3") == null ) )
			{
				Syori2Thread syori_2 = new Syori2Thread();
				syori_2.set(map,this);
				syori_2.start(); // こいつはスレッドです

				Syori3Thread syori_3 = new Syori3Thread();
				syori_3.set(map,this);
				syori_3.start(); // こいつはスレッドです
				map.put("並行処理フラグ","on");
			}

			if(( map.get("syori3") != null ) &&
					( map.get("syori4") == null ) )
			{
				Syori4Thread syori_4 = new Syori4Thread();
				syori_4.set(map,this);
				syori_4.start(); // こいつはスレッドです
				map.put("並行処理フラグ","on");
			}
			if (( map.get("syori3") != null ) &&
					( map.get("syori4") != null ) &&
					( map.get("syori5") == null ) )
			{
				//並行処理設定解除
				map.put("並行処理フラグ",null);
				syori_5(map); 
			}

			//	終了
			if ( map.get("syori5") != null )
			{
				map.put("終了ステータス","END");
			}

			//	並行処理のときは、ループしないで抜ける
			if ( map.get("並行処理フラグ") != null )
			{
				System.out.println("並行処理で抜ける");
				return;
			}
		}

		//	エラー表示
		String sts = (String)map.get("終了ステータス");
		if ( sts.equals("Error") == true )
		{
			System.out.println("Error");
		}
		System.out.println("Exit");
	}

	/*============================================
	 * 処理11<p>
	 *============================================*/
	public int syori_1(HashMap map)
	{

		//	ここに処理1のときの処理を書く
		//	えらーのときmap.put("終了ステータス","ERROR") ;
		System.out.println("処理1");
		//	処理終了時のステータスをセット
		map.put("syori1","END"); 
		return	0;
	}
	/*============================================
	 * 処理5<p>
	 *============================================*/
	public int syori_5(HashMap map)
	{

		//	ここに処理5のときの処理を書く
		//	えらーのときmap.put("終了ステータス","ERROR") ;
		System.out.println("処理5");
		
		//	処理終了時のステータスをセット
		map.put("syori5","END"); 
		return	0;
	}
}

(上記 < > ¥ は、本当は、半角です)
 処理がおわったところで、syori番号に"END"をセットしています。

スレッドの部分は、こんなかんじ。
今回はsyori2だけ出していますが、syori3,syori4も、2を3や4にかえるだけで、
内容は同じなので、省略しました。
なお、スレッドプログラムの書き方は、こちら
import java.util.*;
public class Syori2Thread extends Thread {
	HashMap map = null;
	Syori	syori = null;
	public void set(HashMap map,Syori syori)
	{
		this.map = map;
		this.syori =syori;
	}
	
	public void run()
	{
		if (( map == null) || (syori == null))
		{
			System.out.print("Error");
			return;
		}
		
		try
		{
			sleep(500);
		}
		catch(Exception e)
		{
			System.out.print(e);
		}
		System.out.println("syori2");

		//	処理終了セット後、処理に戻る
		map.put("syori2","END"); 
		syori.roop(map);	//	処理呼び出し
	}
}

(上記 < > ¥ は、本当は、半角です)
 処理がおわったところで、syori番号に"END"をセットしているほか、
 イベント処理メソッドsyori.roopを呼び出してます。




つまり、今回の話で重要なポイントは
・ハッシュマップ内に作業リストを作っている
・作業リストを起動条件の判定に使っている
・スレッドでの終了後、かならず、処理ループに戻るようにしている
・スレッドの開始時にフラグをあげ、終了時にフラグを下げる
 フラグが上がってるとき(並行処理中)は、ループしない
   =スレッド終了後に、このループがよばれるので
 フラグが下がっているとき(並行処理はない)は、ループする
   
ってなかんじで、このスパゲティシリーズは、とりあえず終了です。

 

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