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

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

KDDIの法人向け端末E03CA、ヤマト運輸導入、やり方によっては大きなビジネスかも?

2006-09-30 21:30:20 | Weblog

 KDDIが、E03CAを法人向けに投入し、これがヤマト運輸で採用されたことは、

KDDI、法人向けタフネスケータイ「E03CA」12月発売
http://k-tai.impress.co.jp/cda/article/news_toppage/31084.html


なんかに書いてあるんだけど、それに加えて、
法林岳之のケータイならオレに聞け!の2006年9月26日(火)放送分で言ってたんだけど、これってauショップでも「注文すれば」買えるらしい。

 ってことになってくると、意外と、KDDIが、法人向けをまじめにやるなら(やるならの話だけど)Docomoにとっては、ちょっと嫌な話かもしれない。
 ビジネス向けのアプリを作る場合のBREWのいやらしさっていうのは、
・ビジネス向けのフレームワークができていない
・機能ごと、機種ごとに特殊な知識が要る
・KDDIの審査があるし、そもそもKDDIからしか、情報が出てこない
 っていうところにあった。しかし、逆にメリットっていうと、いろんな機能がつかえ、大容量っていうことがあった。

 ところが、この問題、法人端末が1つしか出ない、そして、KDDIが、ソフトハウスと代理店契約みたいな感じで結んで、情報を提供しちゃうとしたら。。。

・機能ごと、機種ごとに特殊な知識が要る
 →機種は1機種なんだから、機種ごとってことはない。
  機能に関してKDDIが提供すればいい。

・KDDIの審査があるし、そもそもKDDIからしか、情報が出てこない
 →ソフトハウスがKDDIの代理店になれば、KDDIの営業はすぐにつくし、
  情報も取りやすい(KDDIもソフトハウスもお互いにとって)

ってことで、あとは、フレームワークだけの問題になる。
 しかし、フレームワークの問題は、このブログで、画面ごとに分割して作るフレームワークはもう書いたし、あと、メモリ管理はBREW、いやらしいんだけど、そこに関して、カオル姫方式を使うって言うのは今度書くし、さらに、Excel仕様書からBREWアプリに落とすというようなblancoStrutsか?みたいなノリのこともやっちゃうと。。

 業務アプリ書いていた会社にとって、BREWの敷居は低くなることはたしか。
 あとは、このブログを見ていただければ。。。(って、手前味噌な話になるが。。)

 そーすると、業務アプリ書いていたようなソフトハウスに、KDDIが代理店になってよーみたいなアプローチをすれば、そのソフトハウスが持っていたお客さんが、一機に寝返る可能性も。。ありえると。。

 まあ、Docomoもメガiアプリでどこまで行くかが問題だが、ヤマト運輸が顧客としてついているということろでKDDI、一歩リード??

P.S
 ただし、KDDIのBREWのフレームワークをこのブログで書くということは、iアプリのフレームワークを書かないということではありません。つーか、BREWのやつが終わったら書く予定。でも、ちょっと先ですねえ。。

 BREWのやつ書くと、読者が意外と多いので。。



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

こりゃバッテリーパック特需が来る?富士通も回収で!?

2006-09-30 17:22:56 | Weblog

ここによると、
とうとう富士通もソニー製バッテリー回収を発表
http://gigazine.net/index.php?/news/comments/20060929_fujitsu/


前に東芝も回収発表したし、レノボ、IBMも発表してますよね。
あ、その前に、アメリカのDELLとかアップルも??

おおお、みんなでいっぺんに交換したら。。。
すごい量のバッテリーパックが必要になるんじゃないでしょうか??
そーすっとですよ、バッテリーパックの原料を作っている会社
(って、そもそも、バッテリーパックが何で出来てるかしらないけど。。)
とか、急に特需が来るのかなあ。。。。

。。。って、それ以前に生産追いつかなかったりして(^^;)


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

ソフトバンクからでたW-ZERO3もどき?のX01HTって。。。

2006-09-30 12:33:15 | Weblog

 ウィルコムのW-ZERO3そっくりみたいなのが、
 ソフトバンク(旧ボーダフォン)からでるみたいですねー。
 X01HT

その紹介サイトは
これ http://www.vodafone.jp/mb/special/softbankmodel/x01ht/index.html
のようですが。。これだけだと、ただ似ているっていうだけだけど。。

ここの記事
ソフトバンク初のスマートフォン「X01HT」の突っ込みどころ
http://gigazine.net/index.php?/news/20060929_x01ht/

をみると(以下斜体は上記記事より引用)


どうやら「X01HT」でインターネットに接続すると他の携帯電話機からインターネットに接続する時の上限額である5,700円ではなく9,800円になる模様です。


とか、


「3Gハイスピード」は、下り最大3.6Mbps/上り最大384Kbps(ベストエフォート方式※3)の高速データ通信が可能なサービスです。

※4 「SoftBank X01HT」の通信速度は、下り最大1.8Mbps/上り最384Kbps(ベストエフォート方式)です。

どうして速度が半分になるのでしょうか…なんですかこれは。


とか、細かく見ると、いろいろありそうだ。。。

ま、検討は、もちょっとたってからでしょうな。。





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

東芝が、ソニー製バッテリーを(発火してないけど)自主交換

2006-09-29 22:37:58 | Weblog

ここのプレスリリース
ソニー株式会社のバッテリパック自主交換プログラムに関するお知らせ
http://dynabook.com/assistpc/info/battery/index_j.htm


によると、東芝のダイナブックなど(対象商品は後述)の、ソニー製バッテリーを「発火してないけど」、「念のため」交換してくれるみたい。

対象は、こんなかんじ

dynabook SS LX、L10、L11、M10、M11、M35、MX、MXW
dynabook R10
dynabook TX/2、TX/3、TX/4
Qosmio G30、F30
Satellite T10、T11、T12、T20
TECRA M3、M4、M5、M7、S3
PORTEGE S100、M300、M400、M500
Satellite A50


交換すれば、大丈夫なのかなあ。。

でも、たしかにメーカーといてもPL法があるから、
万一発火して、火事にもなったり、怪我したらその費用も負担しなきゃなんないから。。
大変だよねえ。。
そりゃ、変える気にも。。。って、簡単な話じゃないね。大変だよねえ。。。
交換するバッテリーパックを無償で用意しなきゃなんないもんねえ。。

ほかのパソコンメーカーもつづくのかな?
SIerの皆さんで、ハードも納品しちゃって、上記機種を納めちゃった人は。。。
大変そう(^^)東芝に持っていくの、手伝わされたりして。。。


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

要約も、目的によって(要約)手順が変わるという点では、業務の開発と変わらない?

2006-09-29 19:12:08 | Weblog

 昨日の要約の話。ちょっと違う視点から考えて見ましょう。

 「巧名が辻」の今までの内容を要約しなさい
 「水戸黄門」の今までの内容を要約しなさい

 この2つの要約、どちらもドラマの要約だけど、要約方法はちと違うと思う。

 はじめの「巧名が辻」の要約といった場合、たぶん、次回みるための要約。で、これは、ストーリーがある話なので、要約する内容は

・物語の時代
・登場人物とその関係

 のほかに、

・今後出てくる人と、いままでの状態について

 も答えないとわけ分からない。

 つまり、次回は豊臣秀吉が死んじゃうんですか(ごめんなさい。番組見てないで、宣伝だけなんでよくわかんないが)、そうだとすると、秀吉との関係とか、秀吉がどーなってるんだとか、そのへんまでせつめいがいるわけです。

 その一方、「水戸黄門」の場合1回でよみきりです。
 なので、

・物語の時代
・登場人物とその関係

 ぐらいで十分です。1回からいままでのハイライトを聞いても。。。ねえ(^^;)




 こんなふうに、要約システムは、出力が要約文になるんだけど、

  その要約文っていうのは、目的があって、
  その目的を満たすために必要な情報ってのがある。

  その必要な情報を抽出するためには、
   そのための手段(技術)っていうのがあり
  その手段を段取りよくまとめたのが手順ってことになる。

 前回は、これらの目的+情報抽出の手段(技術)+手順を枠組み(フレームワーク)といってしまったが、こまかくいうと、こうなる。





 たとえば、学校のテストで要約しなさいと出た場合、これは、目的はテストで○をもらうこと、つまり、先生のお好みに合った、答案を作ることである。

 そのためには、手段として、先生は、どういう風に書いたら○をくれるのか?っていうのをしらないといけない。キーワードが出ていれば丸をくれるのか、文章的に「結局」とかいう言葉が使われているところを書くと○をくれるのか?などなどだ。

 そして、その先生が○をくれるポイントが分かれば、そのポイントを満たすための手順を考えればOKだ。

 学校で頭のいいといわれるやつは、この○をもらう仕組みを
  自分で知らなくても自然と身についているか(多くの頭のいいやつはこれ)
  その方法を見抜いているか(予備校の講師など)
 である。

 その逆に、自分が、これが要約だ!とおもってまとめても、先生が○をくれるポイントとは、ずれていれば、自分では高得点をとれそうなつもりでも、国語の点は上がらない。
 「国語ができない!」っていうやつは、たいてい、この手法を自分で考えてしまって、国語の決まり(=先生が○をくれるポイント)を守ってないというのが多い。




 さて、投資の場合の要約になるが、投資においては、目的は儲かることが多い(もちろん、挨拶してもらうためとか、新会社を作って、偉い人をはずして、前の会社をのっとるのためもあるかもしれないが、ここでは置いておく)
 そうすると、投資には、大きく3つの分野があり、それは
   銘柄選定
   波の読み方
   資金配分
 なのだが、これは、各自の手法により、変わって来る。
 たとえば、デイトレードの人の場合の資金配分、銘柄選定法、波の読み方(というか、そもそもこの波は株価ではなく、板情報なのだが)と、うなり取りの場合の資金配分、銘柄選定法、波の読み方は違う。そこで、波の読み方のための、株価のチャートの要約も、違ってくる。

 ここまでの話は、昨日書いた

 で、「情報処理」の2006年9月号のP1016には、「上記のような具体的な値への言及や変化の傾向に関する記述にとどまらず、その原因や評価、さらにはその影響等がまとめられるべきである」とあるが、ウィリアムのいたずらは、そうは思わない。

 なぜなら、株価やドバイ原油の価格は、その価格自体が、すべての材料の要約そのものであるからだ(テクニカルの人は、株価がすべての要約であると考える)。

 評価というのは、後講釈にすぎない。そのようなものを付けると、逆に混乱する。

 そもそも、株価は悪材料が出たから下がる、好材料が出たからあがるというものではない。たいていの場合、悪材料も好材料も付けようがある場合が多い。そうではなく、悪材料が出てもあがっていたら、相場は強い、好材料が出ても、下がっていれば、相場は弱いとみる。

 そして、それにもとづき、行動をとる。たとえば、悪材料が出てもあがっていたら、相場は強いと見るので、ショートポジション(空ウリしてる人)は踏み上げられるのではないかと思って注意する。




 ただ、現在のその瞬間においては、悪材料、好材料はほしい。その材料が出たとき、目の前の株価がどうなっているかで、悪材料が出てもあがっているのか、好材料が出ても下がっているのかがわかるからだ。そして、この場合、悪材料と好材料の出所っていうのは、だいたいきまっているわけだ。

・ブルームバーグ、モーニングスター、ロイターの企業情報、政治の大きなニュース
・政府、各国から出る数字(GDP,CPI、失業者数など)
・各国・各市場相場(NY,ダウ、シカゴの先物、石油、ドル円、インド株指数等)
・決算ニュース(市場予想との違い)
・EDINETからの情報(とくに、大量有価証券報告書の大株主の変化)
・信用取り組み、逆日歩、先物の仕掛け、外資系寄付注文状況等
・ウワサ(本尊の情報、仕手筋が介入してるかどうか、きっこのブログの内容など)
 →証券専門新聞など証券関係のマスコミからわかる

 こういうものが、自分の見ている銘柄についてとか、大きく変化した銘柄について分かったらうれしい。でも、それって、フィスコがだしているので、結局、まとめる場合は、フィスコの情報が、コメントで入っていれば、その程度で十分だ。

 相場を張っているときは、全部ブルームバーグがいってくれるので、それを見てれば十分。。といいたいところだが、市場の急変(先物の仕掛けや発注ミスっぽい動きなど)はわかんないので、それはチェックするソフトは、いると思うけど。。

 いろんな注釈をいれて、それとなーく説明付けても、学者さんはそれで安心だろうが、個人投資家にとって、そんな後講釈は意味がない。





ということで、結局、大事なことは、

要約には目的があるので、それをはっきりさせて
    ↓
その目的達成のための情報抽出方法を考え
    ↓
その抽出情報を適切なカタチに変換して出力する
    ↓
この一連の抽出、出力手順を考える。

っていうことになる。この流れ、ある意味質問応答システムとおなじだし、業務手順を考えているのと、たいしてかわらない。

そして、業務手順からみて、自動要約システムが未完な理由は、
複数の目的を同じ「要約」という業務で定義してしまうので、なにをやったらいいかはっきりせず、結果として、えいやーって業務を適当に決めて(重要語抽出など)仕様にしてしまっているので、本来の目的を達成しえず、うまくいかない。。。

っていう感じに見える。


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

JAVAのフォーマット変換:DOM編(その3:XMLの操作)

2006-09-29 16:48:00 | JavaとWeb

 きのうのJAVAのフォーマット変換:DOM編では、書き出し、JAVAのフォーマット変換:DOM編では、読み込みをやったので、今日は編集をやります。




●XMLのノードを書き換える
テキストのノードにいって、そのノードにsetNodeValueをします。
たとえば昨日のような
<Hotel>
  <HotelName>ホテル1</HotelName>
</Hotel>
<Hotel>
  :
  :
のようになっているときに1番初めのレコードのホテル名を変える場合

NodeList hotellist = xtree.getElementsByTagName("Hotel");
で、Hotelタグのノードをとりだし、

(Element)hotellist.item(0)
で1番初めのホテルをとりだし、それに
getElementsByTagName("HotelName")
をして、1番初めのホテルのホテル名のノードをとりだします。

ホテル名は1個しか入ってないので、上記の結果に.item(0);をかけて、
はじめのものをとりだし、

それにたいして、getFirstChild()をして、ホテル名のノードの初めの要素
ここでは、テキストになってるはずなので、それを取り出して
setNodeValueするのですが。。

よくわかんないっすか(^^;)

結局まとめると、こうなります。
NodeList hotellist = xtree.getElementsByTagName("Hotel");
Node hotelname = ((Element)hotellist.item(0) ).getElementsByTagName("HotelName").item(0);
hotelname.getFirstChild().setNodeValue("ペンギンホテル");




■エレメントの削除

 親のノードをgetParentNode();で取得し
 親のノード.removeChild(削除したいノード);
とします。




■エレメントの追加
ドキュメント.createElement(タグ名)で、エレメントを作成します
ドキュメント.createTextNode(値の文字列)で、テキストを作成します
この作成されたものを、どんどんappendChildで追加してゆき、最後に
実際に追加したいところの親に

親のノード.appendChild(作成した、追加したいノード)

をします




■サンプル仕様
 昨日作成したhotel.xmlを読み込み

 以下の操作をします
・はじめのHotelの要素のHotelNameを”ペンギンホテル”に変えます
・2番目のHotelの要素を削除します
・HotelNameが、「ホテル追加その1」の要素Hotelを追加します。

 その後、Hotel2.xmlとして、書き出します。




■ソース
 実際の編集をやっているのは、赤字の部分です。
import java.io.*;
import java.net.*;
import javax.xml.parsers.*;
import org.w3c.dom.*;

//	出力のために追加
import javax.xml.transform.*;
import javax.xml.transform.dom.*;
import javax.xml.transform.stream.*;

public class test {
	public static void main(String[] args) 
	{
		try
		{
			int	i;
			
			//	InputStreamを作り出すために
			//	ファイルを取得
			FileInputStream fi = new FileInputStream("hotel.xml");

			//==============================//
			//	読み込む		//
			//==============================//
		      // ドキュメントビルダーファクトリを生成
			DocumentBuilderFactory dbfactory = DocumentBuilderFactory.newInstance();
		      // ドキュメントビルダーを生成
			DocumentBuilder builder = dbfactory.newDocumentBuilder();
     		 // パースを実行してDocumentオブジェクトを取得
      		Document xtree = builder.parse(fi);

			//==============================//
			//	編集			//
			//==============================//
			NodeList hotellist = xtree.getElementsByTagName("Hotel");

					//	1番目のノードのHotelNameをペンギンホテルに
			Node	hotelname = ((Element)hotellist.item(0)).
                                        getElementsByTagName("HotelName").item(0);
			hotelname.getFirstChild().setNodeValue("ペンギンホテル");

					//	2番目のノードは削除
			Node	oya	=	hotellist.item(1).getParentNode(); //おやを取得
			oya.removeChild(hotellist.item(1));

					//	エレメント(Hotel)追加
			Element ne1 = xtree.createElement("Hotel");
			Element ne2 = xtree.createElement("HotelName");
			Text 	nt1 = xtree.createTextNode("ホテル追加その1");
			ne2.appendChild(nt1);
			ne1.appendChild(ne2);
			oya.appendChild(ne1);
			
			//==============================//
			//	変換のための元生成	//
			//==============================//
			DOMSource source= new DOMSource(xtree); 

			//==============================//
			//	変換先(ファイル)生成	//
			//==============================//
			File f =new File("hotel2.xml"); 
			FileOutputStream fo = new FileOutputStream(f); 
			StreamResult result = new StreamResult(fo); 

			//==============================//
			//	変換			//
			//==============================//
			TransformerFactory transFactory = TransformerFactory.newInstance(); 
			Transformer transformer = transFactory.newTransformer(); 
			transformer.transform(source, result); 

			//==============================//
			//	あとしまつ		//
			//==============================//
			fo.close(); 
			System.out.println("Job End");
		}
		catch (Exception e)
		{
      		e.printStackTrace();
    	}

	}

}

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



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

BREWで複数画面を開発する場合の方法論(+1:IHTMLCTLのTIPS)

2006-09-29 14:17:17 | Weblog

 シリーズ「BREWで複数画面を(分割して開発可能な)開発する場合の方法論」のつづきというか、 IHTMLVIEWERの具体的な使い方のつづきというかです。

 ここで、IHTMLCTLというのを作っているのですが、それを使う場合
・はじめからカーソルを先頭項目でなく、違う項目に置きたいとき
・項目に初期値を入れたいとき(HTMLに書くのではなく)
・固定文字を変えたいとき、入力項目を追加・削除したいとき

についての方法を書いておきます。




■はじめからカーソルを先頭項目でなく、違う項目に置きたいとき
 たとえば、前の画面の結果から、画面表示したときの、カーソル位置を変えたいケースというのがあります(お得意先なら得意先NO、新規なら会社名にカーソルのように)。
 そのような場合は、

・画面_initAppDataのなかで、
   IHTMLCTL_SetDispDataした後、画面の_DispAppDataで再描画する前に
   IHTMLCTL_DispDataを呼び出し、カーソル位置を設定します。

・ソース
 第二画面において、fukusu1構造体のstr_cur_no(poya->str_cur_no:こういう共通領域を作っておく)に設定された番号にしたがって、カーソルを置きます。poya->str_cur_noには、前の画面で、あらかじめ、どこに飛ばせたいか、設定しておきます。
 赤字の部分が、今回の追加箇所です。
boolean gamen2_InitAppData(fukusu1* poya)
{
	char		*fdata,*fdata2;
	gamen2		*pMe;

	//==========================================//
	//	領域確保			  //
	//==========================================//
	pMe	=	(gamen2 *)MALLOC(sizeof(gamen2));
	if (pMe	==	NULL )
	{
		return	FALSE;
	}

	//	アプリ領域へ設定
	poya->garea	=	(void *)pMe;
	poya->gno	=	GAMEN2_NO;

	//	初期設定
	pMe->phc		=	NULL;
	pMe->pIDisplay	= poya->pIDisplay;
	pMe->pIShell	= poya->pIShell;

	//	カーソル移動設定
	pMe->cur_next[0]	=	0;
	pMe->cur_next[1]	=	1;
	pMe->cur_down[0]	=	0;
	pMe->cur_down[1]	=	1;
	pMe->curno			=	0;

	//	初期領域がある場合
	//	STRCPY(pMe->area1,poya->area1);
	//	のような、コピーをする。

	//==========================================//
	//	表示するHTMLファイルの取得	  //
	//==========================================//
	fdata = IHTMLCTL_GetDispFileData(pMe->pIShell,GAMEN2_FNAME);
	if (fdata	==	NULL )
	{
		return	FALSE;
	}

	//	データを設定
	fdata2	=	(char *)MALLOC(STRLEN(fdata)+40);
	if (fdata2	==	NULL )
	{
		FREEIF(fdata2);
		return	FALSE;
	}
	SPRINTF(fdata2,fdata,poya->sei_ritu,poya->byo);

	//==========================================//
	//	HTMLViewer生成		  //
	//==========================================//
	//	読み込んだfdataをHTMLViewerに設定する
	if ( (pMe->phc = IHTMLCTL_Create(pMe->pIShell,pMe->pIDisplay))== NULL )
	{
		FREEIF(fdata);
		FREEIF(fdata2);
		return	FALSE;
	}

	//==========================================//
	//	HTMLViewerデータ設定	  //
	//==========================================//
	if ( IHTMLCTL_SetDispData(pMe->phc,fdata2)	!=	TRUE)
	{
		FREEIF(fdata);
		FREEIF(fdata2);
		return	FALSE;
	}

	//	カーソルを移動させたい場合など
	pMe->curno = poya->str_cur_no;
	IHTMLCTL_DispData(pMe->phc,pMe->curno,0);

	//==========================================//
	//	HTMLViewer表示・メモリ解放	  //
	//==========================================//
	FREEIF(fdata);
	FREEIF(fdata2);
	gamen2_DispAppData(pMe);

    return TRUE;
}

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



■項目に初期値を入れたいとき(HTMLに書くのではなく)
 データベースから検索した結果を初期値として入力項目に入れたい場合などです。
  そのような場合は、

・画面_initAppDataのなかで、
   IHTMLCTL_SetDispDataした後、画面の_DispAppDataで再描画する前に
   IHTMLCTL_setItemDataを呼び出し、入れたい内容を設定します。
   (名前も間違えないで設定してください。
    名前と、入力項目の番号*を間違えると表示しません)

*入力項目の番号:
 HTMLにおいて、INPUT,A,SELECTを使って入力可能にしている項目について
上の行から(同じ行の場合、左から)みて、0番目、1番目、2番目と番号を
振っていったとき、その項目の当該番号。0からはじまる。
 なお、名前とはINPUT等のname属性に当たる。

・ソース
 1番目の項目(項目名nyuryoku)に、”これは”という文字列を初めに表示します。
 赤字の部分が、今回の追加箇所です。
boolean gamen1_InitAppData(fukusu1* poya)
{
	char		*fdata;
	gamen1		*pMe;

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

	//	初期設定
	pMe->phc		=	NULL;
	pMe->pIDisplay	= poya->pIDisplay;
	pMe->pIShell	= poya->pIShell;

	//==========================================//
	//	表示するHTMLファイルの取得	    //
	//==========================================//
	fdata = IHTMLCTL_GetDispFileData(pMe->pIShell,"gamen1.htm");
	if (fdata	==	NULL )
	{
		return	FALSE;
	}


	//==========================================//
	//	HTMLViewer生成		    //
	//==========================================//
	//	読み込んだfdataをHTMLViewerに設定する
	if ( (pMe->phc = IHTMLCTL_Create(pMe->pIShell,pMe->pIDisplay)) == NULL )
	{
		FREEIF(fdata);
		return	FALSE;
	}

	//==========================================//
	//	HTMLViewerデータ設定	    //
	//==========================================//
	if ( IHTMLCTL_SetDispData(pMe->phc,fdata)	!=	TRUE)
	{
		FREEIF(fdata);
		return	FALSE;
	}

	//	文章追加
	if (IHTMLCTL_setItemData(pMe->phc->name,
			pMe->phc->data,1,"nyuryoku","これは") != 0 )
	{
		FREEIF(fdata);
		return	FALSE;
	}
	IHTMLCTL_DispData(pMe->phc,pMe->curno,0);

	//==========================================//
	//	HTMLViewer表示・メモリ解放	    //
	//==========================================//
	FREEIF(fdata);
	gamen1_DispAppData(pMe);

	//	共通領域初期化
	MEMSET(pMe->sei_ritu,0,20);
	MEMSET(pMe->byo,0,20);

    return TRUE;
}

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

・なお
 この方法は、初期化のみならず、処理中でも、同じようにIHTMLCTL_setItemDataを呼び出して値を変えることができます。




■固定文字を変えたいとき
 項目の値を変えるならIHTMLCTL_setItemDataを呼び出してできますが、
 項目自体を増やしたり減らしたりしたい場合、また、項目以外の固定値のところを変えたい場合は、どうしましょう。。

 一番考えないで手っ取り早くできるのは、同じ画面をもう一度呼び出す方法です。

 つまり、一般に次の画面を呼び出す場合は、
  現在の画面_freeAppDataをして
  次の画面_InitAppDataをしますが、

  現在の画面_freeAppDataをして
  現在の画面_initAppDataをしてしまいます。

 このとき、共通画面の値を変えたりして、次の画面の内容を切り替えたりします。
 
・ソース
 項目0番目が選択されたときに、秒数を30にして、カーソルを1番の項目へもってきて再描画しています(カーソルを1番に持ってくる方法は、上記にあるpoya->str_cur_noを設定する方法でやってます)

 gamen2_HandleEventのはじめのほうで、 赤字の部分が、今回の追加箇所です。

boolean gamen2_HandleEvent(fukusu1* poya, AEEEvent eCode, 
                                 uint16 wParam, uint32 dwParam)
{  
	gamen2	*pMe;

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

	//	フォームのデータ取得
	IHTMLCTL_HandleEvent(pMe->phc,eCode,wParam,dwParam);
	if ( pMe->phc->text_flg !=	0 )
	{
		return	TRUE;
	}

	//	処理する
	switch(eCode)
	{
    case EVT_KEY:	//	カーソル移動に関するキーイベント処理
		switch(wParam)
		{
		case	AVK_SELECT:
			// ほんとうは、ここでやんなくて
			// コールバックでやったほうがいいかも知んないけど、
			// まあ、ついでにここでしておく
			switch(pMe->curno)
			{

			case	0:	//	再挑戦
				gamen2_FreeAppData(poya);

				STRCPY(poya->byo,"三十");
				poya->str_cur_no	=	1;
				gamen2_InitAppData(poya);
				return	TRUE;

			case	1:	// 終了
				gamen2_FreeAppData(poya);
				poya->gno	=	-1; // 終了
				return	TRUE;
			}
			break;

(上記< > ¥は、本当は半角、これ以降gamen2_HandleEventはつづきますが省略)

・ちなみに
 べつにIHTMLCTLの中のIHTMLVIEWERを解放しなくてもいいっていえばいいんですけど、そーするとFREEしないといけないもの、しなくてもいいもの、いろいろ交錯してしまい、結構面倒です。
 このようにfreeAppDataしてinitAppDataしても、そんなに時間がかかるものでもないし、画面がスムーズに切り替わる(途中真っ白になったりするようなことがない)ので、ま、これでいいか。。ということで(^^;)


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

ガンダム風の二足歩行ロボットのラジコン、16,800円だって。。。

2006-09-28 22:04:21 | Weblog

ここのブログ
京商「ガンウォーカー」:ガンダム風の二足歩行ロボットのラジコン
http://www.gizmodo.jp/2006/09/post_210.html

に載ってました。

その製品のページは、以下のとおり
零壱式主力戦闘足機(ガンウォーカー)
No.35201NB キット価格 \ 16,800(税込)
http://www.kyosho.co.jp/web/products/militaries/gunwalker_roller/gunwalker/01mainbattle_fm/01mainbattle_fm-j.html


この手のもので、16800円は安い??





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

動向情報の要約の考え方:要約には目的による枠組みがあると思う

2006-09-28 17:57:36 | Weblog

「情報処理」の(学会の論文誌でないほう)2006年9月「動向情報の要約と可視化」の1016ページ(情報処理は、1年間通番でページ番号が振られる。1月分が1000ページもあるわけではない)に、ドバイ原油価格の変化についての要約と、その技術が載っているんだが。。




 まずは、その載っている1997年10月から2000年4月までのグラフ

 それと同じものがなかったので、ちょっとちがうんだけど、ここから該当箇所を切り出したグラフがこちら



青いほうがドバイ原油=いま対象にしている話なのだが、
この要約が、以下のように書かれているのだ。
(以下斜体は、情報処理2006年9月号1016ページより引用)


原油価格は98年には下げ続け、98年末には1バーレル=10ドル台に落ち込み、99年2月には一時10ドルを割り込んでいた。その後、4月から5月にかけて50%も上昇し、15ドル前後となった。上昇は止まらず、8月後半に1バーレル=20ドル20セントと20ドルの大台に乗り、98年2月以来の高値を更新、9月には、21~22ドルとなった。


 この要約、間違いではない。
 しかし、これって、何かの役に立つ要約なんだろうか(?_?)

 極論を言おう。
 上記の文章だと、これからずっと上昇し、落ちることなしに、30ドルも40ドルもいくように読めてしまう。

ウィリアムのいたずらなら、こうまとめる


 97年から下げ続けたドバイ原油、15ドル近辺で急激に下げ、98年初頭にいったん底、その後もみあっていたが、98年11から再び下げに転じ、98年末に一番底、99年2月に2番底を10ドル付近で付けて、その後急騰している。

 4月から5月で、一時15ドル近辺でもみ合った後は、さらに急騰、20ドルの心理的フシをこえて上昇している。


こう書くと、
・15ドルでいったんも見合ったのは、15ドル付近で急激に下げて窓が開いたため、窓埋めをしたということである。
・10ドルが底で急上昇した。18ドルが前回の山(97年11月以前がないので分からないけど)だとすると、18-10=8なので、18+8=26あたりで、いったん下げる?
・下げた後、18ドルを割らなければ、18ドルが下値支持線となり、上昇相場に入る。
 →ここで、買い!

とわかる。で、実際はどうなったか



 以上のとおり。

 26ドル手前で下げて(目標値まではいかないこともある。みんなそこから下がると分かっているのに、そこまで持っていることはないので)、22ドルまで下がっている。 つまり、18ドルより高いので、上昇相場。この22ドルで買ったとしたら、目標値は、26ドル、あるいは26-22=4なので、30ドル。実際30ドルで、落ちて、22ドルまで調整している。ここで、次の上昇が30ドルまでいかず、26ドルになってしまったので、三尊観音が完成してしまい、下落相場へ、ただし、その下落も、下値支持線の18ドルはキープした=中期的に見て、非常に強い相場となって、その後の上昇になっている。

 つまり、このグラフを見て、欲しい情報は、ふつう今後上昇するか下落するかの判断材料で、その場合、底値や高値、支持線と抵抗線、倍返しとか、3分の1戻しとか、あと窓と日柄なので、それだけを要約してくれればいい。




 そうやって考えると、要約する場合には、枠組みがあって、(この場合グラフを見る枠組み)上記の数値を抽出するロジックとあとは文章化してくれればいいってことになる。

 つまり、要約には目的に沿った枠組みが必要で、その枠組みの情報処理手法が決まっていれば(相場のグラフの場合、大体決まっている)要約は簡単に作れる。

 ただし、要約の枠組みが違う場合には、まったく違う見方になる。

 相場をやっている人で、トレンドを見る人でも、RSIを使う人、移動平均を使う人、ボリンジャー使う人、一目つかう人では、ぜんぜん要約が違う。それはそれでいいわけで、その人がその要約にあった投資手法を持っているのなら、その要約だけ見ればいいからだ(たとえば、ボリンジャーだけを使って投資する手法を持っている人なら、ボリンジャーによる要約だけが欲しいわけで、他の要約は、いらない。1指標だけでない人なら、いろんな要約は、ほしいけど)。

 情報処理に出ている要約は、一般的な数学の知見、すなわち、グラフの見方としての増加と現象、それから変曲点を探し出すという方法で、これで要約するのは、一般的にはいいんだけど、相場では使えない要約になってしまう。




 そういう意味で、要約というのは、利用目的に応じて、こうやって要約して欲しいっていう、期待されるフレームワークがある。そのフレームワークに沿った加工法っていうのもあるわけで、そいつを実現することが大切だ。けっして重要語をだしてくればいいというわけではない。

 たとえば、XBRLから財務情報を要約しようとする場合、一般的に記事にする場合と、ファンダメンタル投資をするために要約するのではちがってくる。
 つぎは、そんな話をしようか、それとも、その情報処理のつづき、グラフへの言語情報による注釈ってのは、あまり意味がない(悪材料がでたから下がるのではない。悪材料が出てもあがっていたら、相場は強いと見る。このとき、ショートポジションは注意、踏み上げられる)っていう話を書くか。。気が向いたほうを書くと思う。

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

JAVAのフォーマット変換:DOM編(その2:XMLの書き出し)

2006-09-28 15:46:48 | JavaとWeb

 きのうの、JAVAのフォーマット変換:DOM編(AJAXやJAVA入出力と比較できる形)。 で、読み込みをやったので、今日は、書き出しをやります。

 書き出し。。。といっても、タグ名、属性、テキストをとってきて、それをファイルにBufferdWriterとかPrintWriterに渡して出力する。。という話ではなくて(それなら、そんなに説明しなくてもいいと思うので)

 ノードやDocumentを、そのままファイル出力しちゃうという方法です。




■概要
 これは、DomからFileOutputStreamに変換するという風に考えます。
 変換するにはjavax.xml.transform.transformerを使うのですが、
 これを使うためには、まずTransformerFactoryのインスタンスを取得しないといけません。
 なので、こんな形になります。

TransformerFactory transFactory = TransformerFactory.newInstance();
Transformer transformer = transFactory.newTransformer();
transformer.transform(source, result);

さて、ここで、sourceが、Dom,resultがFileOutputStreamに相当するわけなのですが、
そのままでは、いけません。
Domは、javax.xml.transform.dom.DOMSourceに、
FileOutputStreamは、javax.xml.transform.stream.StreamResultに
しないといけません。

そのために、以下のようなソースになります



■仕様
 前回取得した、
http://jws.jalan.net/APILite/HotelSearch/V1/?key=guest&pref=130000&l_area=137100&s_area=137102
 の内容を、hotel.xmlに保存しなさい

■ソース
以下のとおり
import java.io.*;
import java.net.*;
import javax.xml.parsers.*;
import org.w3c.dom.*;

//	出力のために追加
import javax.xml.transform.*;
import javax.xml.transform.dom.*;
import javax.xml.transform.stream.*;

public class test {
	/*
	 * 	メイン処理(呼び出し元)
	 */
	public static void main(String[] args) 
	{
		try
		{
			int	i;
			
			//	InputStreamを作り出すために
			//	URLを取得
			URL	url
 = new URL("http://jws.jalan.net/APILite/HotelSearch/V1/?key=guest&pref=130000&l_area=137100&s_area=137102");
			
			//==============================//
			//	読み込む		     //
			//==============================//
		      // ドキュメントビルダーファクトリを生成
			DocumentBuilderFactory dbfactory = DocumentBuilderFactory.newInstance();
		      // ドキュメントビルダーを生成
			DocumentBuilder builder = dbfactory.newDocumentBuilder();
     		 // パースを実行してDocumentオブジェクトを取得
      		Document xtree = builder.parse(url.openStream());

			//==============================//
			//	変換のための元生成     //
			//==============================//
			DOMSource source= new DOMSource(xtree); 

			//==============================//
			//  変換先(ファイル)生成      //
			//==============================//
			File f =new File("hotel.xml"); 
			FileOutputStream fo = new FileOutputStream(f); 
			StreamResult result = new StreamResult(fo); 

			//==============================//
			//	変換		     //
			//==============================//
			TransformerFactory transFactory = TransformerFactory.newInstance(); 
			Transformer transformer = transFactory.newTransformer(); 
			transformer.transform(source, result); 

			//==============================//
			//	あとしまつ	     //
			//==============================//
			fo.close(); 
			System.out.println("Job End");
		}
		catch (Exception e)
		{
      		e.printStackTrace();
    	}

	}

}

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




■結果
 で、hotel.xmlができたと思いますが。。。

 ウィリアムのいたずらは「書き出す」とはいいましたが、
 「きれいに書き出す」とは、言ってません。

 あなたのおっしゃりたいことは、よーくわかります。

 たしかに、インデントとかはしてくれません。
 でも、ノートパッドで見るのではなく、IEでみたり、
 XMLエディタで見る分には、問題ないでしょ!
 あと、コンピューターで入出力する分には。。

 ノートパッドで見るなんつーのは、
 XMLエディタを買えない貧乏人の発想です
 →で、ウィリアムのいたずらもその貧乏人の1人なのだが。。

 貧乏人はぜーたく言っちゃいかん、
 貧乏人は麦をくえ、贅沢は素敵だ!
 うん??でも、今、麦は健康食だよねえ。。

 。。。なんのはなししてるんだ?
 分けわかんなくなってきたので、このへんで。。


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

BREWで複数画面を(分割して開発可能な)開発する場合の方法論(その5:まとめ)

2006-09-28 12:49:38 | ケータイ

シリーズ「BREWで複数画面を(分割して開発可能な)開発する場合の方法論」のつづきです。

 で、次の作業は、まとめるということなのですが、これは、はじめに作った全体のプログラムに、作成した第一画面、第二画面のプログラムを差し替え、IHtmlCtl.c,IHtmlCtl.hをプロジェクトに加えるだけなので、取り立てて説明することはありません。

 ただ、今後、この話はTIPS,つまり、

・はじめに、違うところにカーソルを立てたい場合
・はじめから、初期表示をしたい
・項目の値を入れ替えたい。固定文字の部分を入れ替えたい

 などなどの細かいお話に向かいます。
 ということで、今回、全体的な流れを、ここでまとめておきます。




今回のお話のまとめ

●仕様は、ここ
全体的な流れ(リンク先は、それぞれを説明したブログへのリンク)

●作成手順
(1)全体を作成します
   このとき、各画面はInitAppDataで画面番号に-1を送る(すぐに終了する)ようにして
   ダミーのものを作成します

(2)各画面を作成します
    第一画面は、ここ
    第二画面は、ここ
   →第二画面のほうに、一般的な書き方が書いてあります
   →画面は並行して作成できます。

(3)それをまとめます
  ・(1)のダミーで作成した画面を、(2)で作った画面に入れ替えます。

  
●ソース
   fukusu1.mif==> mifファイル、これは、MIFエディタで作れます

   fukusu1フォルダ
     |-----fukusu1.bid :MIFエディタで作れます
     |-----fukusu1.c
     |-----fukusu1.h
     |-----gamen1.htm
     |-----gamen1.c
     |-----gamen1.c
     |-----gamen2.htm
     |-----gamen2.c
     |-----gamen2.h
     |-----IHtmlCtl.c
     *-----IHtmlCtl.h

このほか、VC++がつくる、プロジェクト関係のソース、DLLがあります(それは省略)


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

無料で使えるフォーマット変換サイト

2006-09-27 23:46:38 | Weblog

まだためしてません。ちょっとメモ
無料で使えるフォーマット変換サイト
http://www.gizmodo.jp/2006/09/post_219.html


によると、(以下斜体は上記記事より引用)

WORDのファイルをHTMLやPDFに変換したり、m4aをMP3に変換したり、とにかくありとあらゆるフォーマットを他のフォーマットに変換してくれます。しかも無料で。

(中略)


ざっと対応しているフォーマットを挙げてみると、Raw text, HTML, XHTML, Microsoft Word, RTF, PDF, PS, Open Office, Star Writer, Pocket Word, Word Perfectといったドキュメント・フォーマットからオーディオ、ビデオ、データベース、スプレッドシートなど実に多彩です。


だって!

そのサイトは、ここ

Media Converter
http://media-convert.com/


だって。あとでみてみよっと


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

JAVAのフォーマット変換:DOM編(AJAXやJAVA入出力と比較できる形)。

2006-09-27 17:17:59 | JavaとWeb

 今回は、Javaの入出力のあと、フォーマットについて。
 むかしCSVについては、やった気がするので、今回はXMLについて。
 DOMを利用します。

 DOMについては、Domによる、XMLデータ操作を、じゃらん宿表示APIで示してみる(その2:説明)で、AJAXを使って実験したので、今回は、これをJAVAでやってみることにします。

 また、いままで、JAVA入出力で、InputStreamReader(InputStream)の形にする方法を説明してきたので、今回、その関連についても説明したいと思います。




■方針

 DOMを扱う場合、JAVAのバージョン1.4以降では、
import javax.xml.parsers.*;
import org.w3c.dom.*;

をして、

// ドキュメントビルダーファクトリを生成
DocumentBuilderFactory dbfactory = DocumentBuilderFactory.newInstance();

// ドキュメントビルダーを生成
DocumentBuilder builder = dbfactory.newDocumentBuilder();

// パースを実行してDocumentオブジェクトを取得
Document xtree = builder.parse(InputStream);

をすると、Documentが取得できます。
builder.parse(InputStream);のところですが、実は
InputStreamでなくても、URIでもFileでもいいのですが、
今回は、いままでの関係から、InputStreamのケースを利用
したいと思います。

つまり、いままでは
new InputStreamReader(InputStream)だったのですが、
今回は
builder.parse(InputStream);
になったということです。

そして、どっかのページから、InputStreamを取得するため、
URL url = new URL(参照するURL名);
したら、url.openStream()で取得しています。

結果として、
Document xtree = builder.parse(url.openStream());
を実行します。




■問題点

 先ほどのAJAXのケースでは、

hotelnode.selectSingleNode

というのを使っていますが、selectSingleNodeメソッドはないので、
FireFoxのケースと同じく、ここで示した

komoku = hotelnode.getElementsByTagName("HotelName");
hotelName[i] = komoku[0].firstChild.nodeValue;

のやりかたを使います。

なお、hotelnodeは、このままではNodeで、getElementsByTagNameが使えないので
Elementにキャストして
komoku = ((Element)hotelnode).getElementsByTagName("HotelName");
のようにします。




■ソース

こんなかんじです。
http://jws.jalan.net/APILite/HotelSearch/V1/?key=guest&pref=130000&l_area=137100&s_area=137102
を検索に行って、ホテル名と住所を画面表示します。

import java.io.*;
import java.net.*;
import javax.xml.parsers.*;
import org.w3c.dom.*;

public class test {
	/*
	 * 	メイン処理(呼び出し元)
	 */
	public static void main(String[] args) 
	{
		try
		{
			int	i;
			
			//	InputStreamを作り出すために
			//	URLを取得
			URL	url
 = new URL("http://jws.jalan.net/APILite/HotelSearch/V1/?key=guest&pref=130000&l_area=137100&s_area=137102");
			
		      // ドキュメントビルダーファクトリを生成
			DocumentBuilderFactory dbfactory = DocumentBuilderFactory.newInstance();
		      // ドキュメントビルダーを生成
			DocumentBuilder builder = dbfactory.newDocumentBuilder();
     		 // パースを実行してDocumentオブジェクトを取得
      		Document xtree = builder.parse(url.openStream());

      		// ルート要素を取得
			NodeList hotellist = xtree.getElementsByTagName("Hotel");
			String buf = "";
			for(i = 0 ; i < hotellist.getLength() ; i ++ )
			{
				//	1件分のホテルデータ取り出し
				Node hotelnode	= 	hotellist.item(i);

				//	各種データ取り出し
				NodeList komoku;
				
				komoku = ((Element)hotelnode).getElementsByTagName("HotelName");
				String	HotelName = komoku.item(0).getFirstChild().getNodeValue();

				komoku = ((Element)hotelnode).getElementsByTagName("HotelAddress");
				String	HotelAddress = komoku.item(0).getFirstChild().getNodeValue();

				//	書き出し
				buf = buf + "¥n" + HotelName + " " + HotelAddress;
			}

			//	表示
			System.out.println(buf);
		}
		catch (Exception e)
		{
      		e.printStackTrace();
    	}

	}

}

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

(なお、今回のものは、JavaでHello Worldを参考にしています。
 ここ http://www.hellohiro.com/xmldom.htm
 バージョン1.3以前のもので、必要なライブラリも、そのサイトに
 かいてありました)



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

TVバンク、P2Pを取り入れた動画配信システムを開発

2006-09-27 16:10:36 | Weblog

 むかし、このブログで、P2Pの動画とか。。って話を書いて、そのあと、すぐに、W杯生中継を見られるP2Pソフトって、まじっすか?っていう話を書いたけど、日本でも、P2Pを取り入れた動画配信システムを行ったそうな。それも、あのEXILEのボーカルオーディションで!

ここのニュース
TVバンク、P2Pを取り入れた動画配信システムを開発
http://slashdot.jp/articles/06/09/26/1451219.shtml


プレスリリースはこちら。。
数万人規模のユーザーに高画質の動画コンテンツを同時配信できる、多人数同時動画配信システム「BBブロードキャスト」を開発
~EXILEライブのネット配信で、最大同時視聴者数25,302人、総視聴者数46,904人を実現~
http://www.tv-bank.com/jp/20060926.html


おおおー、こーなってくると、IPV6マルチキャストで動画配信よりも、
P2P動画配信?のほうが、広がってしまったりして(^^;)
またまたIPV6の普及が。。。(^^;)



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

BREWで複数画面を(分割して開発可能な)開発する場合の方法論(その4:2つめの画面作成)

2006-09-27 14:35:23 | ケータイ

 シリーズ「BREWで複数画面を(分割して開発可能な)開発する場合の方法論」のつづきです。

 前回、第一画面を入れたので、今回は、第二画面を入れます。
 この作業は、第一画面作成作業と同時に出来ます。
 今回は、第二画面作成というより、一般的に、この方式で画面を作る場合について説明します。

 なお、第一作業と並行できるため、今回は、前々回の全体作業が終わったところからはじめるものとします。




■IHTMLCTLの取り込み
これは、前回の第一画面のときとまったく同じです。
 以下のファイルをプロジェクトに追加します。
  IHtmlCrl.c IHtmlCtl.h





■全体部分の修正
 第一画面のように、はじめの画面の場合は、問題ないのですが、第二画面のように、途中からはじめる場合、共通領域に、受け渡す値をセットして、ハンドルイベントのスタートで、対象画面が始まるようにします。

共通領域に、受け渡す値をセット
 関数fukusu1_InitAppData内で、共通領域を初期化するところを

 // テスト用に設定
 STRCPY(pMe->sei_ritu,"20");
 STRCPY(pMe->byo,"40");

のように、ダミーで受け渡す値をセットします

ハンドルイベントのスタートで、対象画面が始まる
fukusu1_HandleEventで、

 // スタート時に、はじめの画面を呼ぶ
 if ( eCode == EVT_APP_START)
 {
  // ここをはじめの画面に変える
  return gamen2_InitAppData(pMe);
 }

のように、第二画面(gamen2_InitAppData)から始めています。

これらの修正を行ったものが、以下のソースです。
 fukusu1.c




■gamen2.hの修正
 修正をらくにするため、以下の変数を取っています。
#define GAMEN2_NO 2   // この画面の画面番号
#define GAMEN2_ITEM_SU 2 // この画面の項目数
#define GAMEN2_FNAME "gamen2.htm" // 読み込みファイル名

 どのように楽なのかは、gamen3.cのところで説明します。

今回、領域の構造体は、以下の形になります。
typedef struct _gamen2 {
    IDisplay      *pIDisplay;
    IShell        *pIShell;
    IHtmlCtl 	  *phc;
    int		  curno; //	カーソルの番号
 
    //	カーソル移動
     int cur_next[GAMEN2_ITEM_SU];
     int cur_down[GAMEN2_ITEM_SU];
} gamen2;


 この画面では、共通領域の値をInitAppDataで参照するだけなので、
とくに必要ないので、とっていません。
 カーソル移動のcur_next、cur_downに関しては、gamen2.cの
gamen2_NextCurItemで説明します。

 あとは、関数宣言となります。
 これらの修正を行ったものが、以下のソースです。
 gamen2.h




■gamen2.cの修正
以下の関数を作成・修正します。

boolean gamen2_InitAppData(fukusu1* pMe);
boolean gamen2_HandleEvent(fukusu1* pMe,AEEEvent eCode, uint16 wParam,uint32 dwParam);
void gamen2_FreeAppData(fukusu1* pMe);
boolean gamen2_DispAppData(gamen2* pMe);
int gamen2_NextCurItem(gamen2* pMe,int flg);

以下、各関数について説明します。

gamen2_InitAppDataについて
 この関数の中では、
・領域確保
・表示するHTMLファイルの取得
・HTMLViewer生成
・HTMLViewerデータ設定
・HTMLViewer表示・メモリ解放
を行います。以下順次説明します

(1)領域確保
ここでは、以下の処理を行います。
・画面領域を確保し、
・アプリ全体の領域のgareaに画面領域を設定
 画面番号も設定
・アプリ全体の領域の内容を、画面領域に設定
・カーソル移動設定

 共通領域から画面の共通領域に保存しておいたほうがいい
ものがある場合は、ここでコピーしますが、今回はないので
その処理はしていません。

 カーソル移動設定とは、後述のgamen2_NextCurItemで
行います。カーソル移動が複雑でないとき便利です。
 なお、ここ以外でも、画面番号が必要なところがあるので
GAMEN2_NOとマクロにしています。
 こうすると、違う画面に、このソースを流用する場合、
GAMEN2をGAMEN11とかに変えればいいだけなので、便利です。

(2)表示するHTMLファイルの取得
 IHTMLCTL_GetDispFileDataで読み込みます。
 読み込むファイルは、GAMEN2_FNAMEとマクロで宣言しています
が理由は、上記GAMEN2_NOと同じです。

 なお、そのまま表示する場合は、よいのですが、一部の文字を
入れ替える場合は、ここで入れ替えます。
 今回は、あらかじめ、正解率と秒数を%sと書いておいて、
SPRINTFで入れ替えています。

(3)HTMLViewer生成
 IHTMLCTL_Createで、生成しています

・HTMLViewerデータ設定
 IHTMLCTL_SetDispData(pMe->phc,fdata2)で読み込んだHTMLと、
それに付随する項目の情報を設定しています。

・HTMLViewer表示・メモリ解放
 読み込んだHTMLをフリーして、gamen2_DispAppDataで
再描画しています。

gamen2_HandleEventについて
 イベント処理です。

 このとき、他の場面にいく場合は、
gamen2_FreeAppData(poya);のように、現在の画面を開放したあと
gamen1_InitAppData(poya);のように、次の画面の開始処理を行います。
 
 また、上下左右キーで、移動するときは
gamen2_NextCurItemで、次のカーソルの位置を求め
(スクロールする場合は、カーソル位置からスクロール位置を求め)
IHTMLCTL_DispData(pMe->phc,カーソル番号,スクロール位置);を呼び出し
gamen2_DispAppDataで再描画します。

 終了させるときは、
gamen2_FreeAppDataで現在の画面を開放した後
poya->gno = -1;
として、画面番号を-1にします。

gamen2_FreeAppDataについて
ここで行う処理は、以下のとおり
・画面の共通領域があれば、それをアプリの共通領域にコピーし
 必要があれば画面の共通領域を解放する
(今回はないので省略)

・IHTMLCTLをリリースし、

・親の画面エリアpoya->gareaをクリーンにする。

gamen2_DispAppDataについて
 リドローします。

 IHTMLVIEWER_Redrawなど、リドローの関数を
 コントロールに応じて呼びます。

gamen2_NextCurItemについて
 次のカーソル位置をもとめます。
 今回は、かんたんなものなので、こんな求め方をしています。

・cur_downに、下キーが押されたら、飛んでいく項目番号を順番にいれていき
・cur_nextに、右キーが押されたら、飛んでいく項目番号を順番にいれます。
→ここまでgamen2_InitAppDataで行います。

・そうしたら、キーごとに、まず、現時点のカーソル位置と、
cur_down(またはcur_next)の番号と同じものを探します。
下(右)キーは、その同じモノ(=現在のカーソル位置)の次を取得し
上(左)キーは、その同じモノ(=現在のカーソル位置)の前を取得します
(範囲外になったら補正する)

このようにすると、飛んでいく画面番号をcur_down、cur_nextにセットする
だけで、一般的に、上下左右のキーが求まります。
ここで、画面数が必要なのでGAMEN2_ITEM_SUという形でマクロにしています。

ここまでの修正でできたソースは、以下のようなかんじです。
 gamen2.c gamen2.htm



ということで、次は第一画面と第二画面を合わせて完成です。
(って、もうあとソースをいれかえるだけだけなんで、
 説明しなくてもいいようなことなんだけど。。。)


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