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

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

日東電工の「気持ちが分かるシート」って、特徴点抽出とバウリンガルで作れそうな気が(^^;)

2007-02-09 18:41:28 | Weblog

 山手線乗ってて、電車の中でいろいろやる広告(占いとか、天気とか)のやつをみていて、思ったんだけど、日東電工の「気持ちが分かるシート」って、「コレって無理」みたいに出てるけど、あれ、作れそうじゃありません?

 その気持ちが分かるシートって言うのは。。

 犬が何を考えているか、そのシートをかけると見えるっていうもの。。

 なんだけど。。。




 犬って、「遊んで欲しい」とか、いろんな気持ちをしぐさであらわしますよねえ。。そーやってサイエンスZEROでやってたし、こんな本もあるそうな

77のしぐさでわかる犬の気持ち
http://poochnavi.com/books/asin/4344404793/


っていうことは、
(1)あらかじめ、飼っている犬(普通の状態と思われるもの)を何回かカメラに取っておき、
   平均点を取ることにより、犬の普通の状態の特徴点を割り出しておく

(2)犬のしくさをカメラで撮る

(3)(2)で取った犬のしぐさの特徴点を(1)と比較し

(4)その77のしぐさの特徴点と比較し、一番近い心理状態の絵を

(5)その透明シートにだす。

むかし、バウリンガルなんていうのもあったから、声から、一番近い心理状態を割り出し、透明シートにだしてもいいかもしれない。




 問題は(そのシートを犬が持ってくるのだが)、
 犬に、どうやって、

 そのシートを持っていけば、飼い主は気持ちが分かってくれる

 ということを教えるかだ。。


 って、ムダに頭を使ってる気がする。

 上記の本を読むだけで、犬の気持ちが分かるのなら、
 単に本を読めばいいだけの気が・・・(^^;)



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

JavaからmySQLのデータ取得、OpenOffice Calcで印刷してExcel形式で保存

2007-02-09 16:32:45 | OpenOffice

 昨日のOpenOfficeの話の続き。
 昨日同様、日本語についてまで考えると、まだまだやんないといけないことありそうだけど、
 とりあえず、今の段階で、書いておきます。

 昨日は、OpenOfficeに書くところまでやったけど、そのあと、プリンタから出力して、Excel形式で保存して、クローズします。



■事前準備
 昨日と、同じです。
(1)まず、mySQLをインストールして、userテーブルを作成し、データを入れます。
(2)JDBCドライバをとってきて、それを、Eclipseで、プロジェクトのパスに通します。
(3)OpenOfficeのjarをEclipseのパスに通します
(4)mySQLを起動します
(5)OpenOfficeを起動します

詳しい方法に関しては、昨日の「事前準備」を参照




■ソース
Sample01.java,OpenOffice.java,Calc.javaの一部を修正します。

●Sample01.java
プログラムは以下のとおり
/**
 * サンプルプログラム
 * 参考にしたサイト
 * http://www.okapiproject.com/java/java_tools/openoffice/
 *                          developer/openoffice_program1.htm
 * (本当は1行です。長いので、きりました)
 * 
 */
import com.sun.star.lang.*;
import com.sun.star.bridge.*;
import com.sun.star.uno.*;
import com.sun.star.frame.*;

import com.sun.star.sheet.*;
import com.sun.star.container.XIndexAccess;
import com.sun.star.table.*;
import com.sun.star.beans.PropertyValue;

import java.sql.*;
import java.util.*;

/**
 * OpenOffice.org の表計算(Calc)に「Hello World」と出力する。
 */
public class Sample01 {

    /**
     * 起動パラメータなし。
     * @param args String
     */
    public static void main(final String[] args)
    {
      	OpenOffice of = null;
        Calc	cl = null;

		//======================================//
		//	OpenOfficeと接続		//
		//======================================//
        XMultiServiceFactory xMSF = null;
        try
        {
        	of = new OpenOffice();
        	xMSF	=	of.connect();

        }
        catch (java.lang.Exception e)
        {
            e.printStackTrace();
            System.out.println("OpenOfficeの起動に失敗");
        }

		//======================================//
		//Calc を起動				//
		//======================================//
        XSpreadsheetDocument myDoc = null;
        try
        {
	        cl = new Calc(xMSF);
   	    	myDoc	=	cl.open("private:factory/scalc","_blank");
        }
        catch (java.lang.Exception e)
        {
            e.printStackTrace();
            System.out.println("表計算の起動に失敗");
        }


		//======================================//
		//シートを取得				//
		//======================================//
        XSpreadsheet oSheet = null;
        try
        {
			oSheet = cl.getSheetByPosition(myDoc,0);
        }
        catch (java.lang.Exception e)
        {
            e.printStackTrace();
            System.out.println("シートの取得に失敗");
        }

		//======================================//
		//DB接続				//
		//======================================//
	Vector allData = new Vector();	// データをここに入れておく
   	try 
   	{
			// ドライバクラスをロード
      		Class.forName("org.gjt.mm.mysql.Driver");

      		// データベースへ接続
      		String url =
		 "jdbc:mysql://localhost/test?useUnicode=true&characterEncoding=sjis";
      		Connection con =
		 DriverManager.getConnection(url,"root","rootのパスワード");

		    // ステートメントオブジェクトを生成
      		Statement stmt = con.createStatement();
      		String sql = "SELECT * FROM user";

      		// クエリーを実行して結果セットを取得
		    ResultSet rs = stmt.executeQuery(sql);
      		ResultSetMetaData meta = rs.getMetaData();
      
      		// 検索された行数分ループ
      		while(rs.next())
      		{
			HashMap mp = new HashMap();
      			for(int i = 1 ; i <= meta.getColumnCount(); i ++ )
      			{
      				mp.put(meta.getColumnName(i),
                                        rs.getString(meta.getColumnName(i)) );
      			}
			allData.add(mp);		
      		}

		    // データベースから切断
      		stmt.close();
      		con.close();
	}
	catch (java.lang.Exception e)
	{
      		e.printStackTrace();
    	}
      
		//======================================//
		//	セルに書き出し		    //
		//======================================//
        XCell oCell = null;
        try
        {
	     	for(int i = 0 ; i < allData.size() ; i ++ )
      		{
      			HashMap mp = (HashMap)allData.elementAt(i);
      			String[] key = (String[]) mp.keySet().toArray(new String[0]);
      			for(int j = 0 ; j < key.length ; j ++ )
      			{
		        	oCell = cl.getCell(oSheet,i,j);
            		oCell.setFormula(key[j] + "=" + (String)mp.get(key[j]));
      			}
      		}
        }
        catch (java.lang.Exception e)
        {
            e.printStackTrace();
            System.out.println("セル書き出しで失敗");
        }

		//======================================//
		//	印刷・保存		   //
		//======================================//
	try
	{
		//	印刷
		of.printout(cl.getComponent(myDoc),1);

		//	Excel形式で保存
		cl.saveAsExcel(myDoc,"c:¥¥temp¥¥test.xls");

		//	クローズ
		of.close(cl.getComponent(myDoc));
	}
	catch(java.lang.Exception e)
	{
            e.printStackTrace();
            System.out.println("プリントアウト失敗");
	}

        //処理終了
        System.exit(0);
    }
}

(上記<> ¥は、本当は半角。赤字部分が昨日と違うところ)
DB名、ホスト名、ユーザー名、パスワードに関しては、昨日の内容を参照



●OpenOffice.java
昨日のものに追加されるのは以下のとおり
    /**
     * プリントアウト
     * 参考にしたサイト
     * http://weblogs.java.net/blog/tchangu/archive/2005/12/open_office_jav_1.html
     * @param  oDoc XComponen
     * @param  busu int
     * @throws Exception Exception
     */
	public	void	printout(XComponent oDoc,int busu)
           throws java.lang.Exception
	{
		XPrintable xPrintable =
                   (XPrintable)UnoRuntime.queryInterface(XPrintable.class,oDoc);

		PropertyValue[] printOpts = new PropertyValue[1];
		printOpts[0] = new PropertyValue();
		printOpts[0].Name = "Pages";
		printOpts[0].Value = Integer.toString(busu);
		xPrintable.print(printOpts);
	}

    /**
     * クローズ
     * @param  oDoc XComponen
     * @throws Exception Exception
     */
	public	void	close(XComponent oDoc)
           throws java.lang.Exception
	{
		XCloseable xClose =
                   (XCloseable)UnoRuntime.queryInterface(XCloseable.class, oDoc);
		int kai = 0;
		for ( kai = 0 ; kai < 100 ; kai++)
		{
			try
			{
				xClose.close(true);
				break;
			}
			catch(CloseVetoException e)
			{
				Thread.sleep(2000);
			}
		}
		
		if ( kai	>=	100 )
		{
            System.out.println("クローズできず。手動でクローズ");
		}
	}

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

なお、クローズは失敗すると、2秒寝かせて(2000のところ。ここの数字を変えると、寝ている時間が変わる)処理を繰り返す。それを100階やっても失敗したら、エラー表示「何らかの原因でクローズできません。手動でクローズしてください」して抜ける。



●Calc.java
昨日のものに追加されるのは以下のとおり
    /**
     * Excel形式で保存
     * 参考にしたサイト
     * http://weblogs.java.net/blog/tchangu/archive/2005/12/open_office_jav_1.html
     * @param  oDoc XSpreadsheetDocument
     * @param  busu int
     * @throws Exception Exception
     */
	public	void	saveAsExcel(XSpreadsheetDocument oDoc,String path)
			 throws java.lang.Exception
	{
		XStorable xstorable =
                (XStorable) UnoRuntime.queryInterface(XStorable.class, oDoc);
		PropertyValue[] storeProps = new PropertyValue[1];
		storeProps[0] = new PropertyValue();
		storeProps[0].Name = "FilterName";
		storeProps[0].Value = "MS Excel 97";

		File oFile = new File(path);
		xstorable.storeAsURL(oFile.toURL().toString(),storeProps);
	}

    /**
     * 単純に保存
     * @param  oDoc XSpreadsheetDocument
     * @param  busu int
     * @throws Exception Exception
     */
	public	void	saveAs(XSpreadsheetDocument oDoc,String path)
			 throws java.lang.Exception
	{
		XStorable xstorable =
                (XStorable) UnoRuntime.queryInterface(XStorable.class, oDoc);
		PropertyValue[] storeProps = new PropertyValue[0];
		File oFile = new File(path);
		xstorable.storeAsURL(oFile.toURL().toString(),storeProps);
		
	}

    /**
     * コンポーネントの取得
     * @param  oDoc XSpreadsheetDocument
     * @return XComponent
     * @throws Exception Exception
     */
	public	XComponent	getComponent(XSpreadsheetDocument myDoc)
			 throws java.lang.Exception
	{
	   return (XComponent)UnoRuntime.queryInterface(XComponent.class,myDoc);
	}

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

なお、saveAsExcelのかわりにsaveAsにすると、OpenOffice形式で保存する。
プロパティの"FilterName"の値を変えると保存内容が変わるが、どのような"FilterName"があるかについては、
OpenOffice.orgとJooReportsを利用してJavaからPDFを出力する
http://codezine.jp/a/article.aspx?aid=131

OpenOffice.orgがサポートするフォーマット変換(かなり下のほう)を参照。

とりあえず、今回はここまで。

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

触ってコンピューター操作するより、魔法のステッキを振って操作したほうが、かっこいいと思う

2007-02-09 14:27:39 | Weblog

 昨日、NHKのプロフェッショナル仕事の流儀に石井 裕 氏が出てました(途中までしか、みてないけど)。

 で、やってたんだけど、なにかに触ってコンピューターを動かすってやつ。。

 うーん、新規性を求める石井先生だと、そっちのほうなのかもしれないけど、

 ウィリアムのいたずらとしては、アニメの世界では使い古された感もあるけど、
 やっぱ、魔法のステッキを振っていろんなことができたほうがいいよねえ。。

 つまり、3階回して、ステッキを上に上げると、一番上にあるコマンドを実行するとか。。

 ゲームなんかだと面白いと思う。3階回して、ステッキを上に上げると、相手を攻撃。
 ステッキを投げ出すと退却。。。などなど。。




 仕組みは、Wiiリモコンと同じ。
 ただ、ポインタ部分を上にするのではなく、ステッキの真ん中とかのほうがいいかも
 (真ん中とてっぺんの2箇所?)

 振ったことを判断するセンサーがあって、どういうふうに動かしたかが分かる。
 それを、飛ばす。。。信号を飛ばすところが、急激な動きだと難しいのかなあ。

 まあ、Wiiリモコンを魔法のステッキの形にするだけともいえるが(^^;)




 ステッキのデザインは、当然「しょこたん」でしょう。
 宣伝も「しょこたん」です。

 ここまで書いて気がついたかもしれませんが。。
 当然、実用第一弾は、セーラームーンのゲームです。
 しょこたんにコスプレしていただいて、
 セーラームーンになりきって、
 そのステッキをふって、悪を退治するCMをするのです。。

 (ここで、ポインタ部分の話をした理由が分かると思います。
  そう、あのハート部分をポインタにして、ヒカルのです ^^)

 ワナゴナかなんかで企画して。。。
 って、それまで、ワナゴナやってるのかあ(^^;)
 (っていうか、そのまえに、こんな考え、ソッコウでボツでしょう。。 ^^;)




 はじめの話に戻って。。
 もし、こんな話を石井先生にしたら、一言だろう。。。 why (^^;)


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

見た目から、端末が使えないことがあるかも?

2007-02-09 12:13:47 | 開発ネタ

昨日の非機能要件の話。

マシン配置が、見た目でかわるということ。

ブラウザを使う場合、Windowsアプリを使う場合、ケータイを使う場合などなどで、
ユーザーインターフェースが規定されてしまう。
これと、ネットワークが絡んでくると、そーいうマシン配置が出来ないということがある。




 たとえば、ケータイを使う場合、商品コードを入力したら、すぐに商品名を出したい、
もっとすごいと、頭の文字を入力したら、その候補を選べるようにしたいなどという
ケースがある。

 こういう場合、サーバーアクセスしていると、間に合わないって言うことがある。


 じゃあ、アプリで対応するとなると、BREWとiアプリで使えるコントロールが
違う。もし、無いコントロールを使おうとすると、全部作らないといけなくなり、
大幅な開発増となる。

 たとえばBREWの場合、インターフェース(Iではじまるやる)のコントロールに、コンボボックスはたしかなかった(リストボックスになる)。
 なので、コンボボックスを使う場合、IHTMLViewerっていうのを使うことになるけど、その場合は、テキストボックスで複数行入れるのに、問題がある(今は変わってるかも)。

 ってことになると、IHTMLVIEWERとITEXTCTLを混在して使うと、別々にわけないといけない(IHTMLVIEWERの上にITEXTCTLを載せても、IHTMLVIEWERしか表示されない。なので、分離しないといけない)。

 そうすると、一箇所にまとめないといけない。。。

 え、IHTMLVIEWERを何箇所もやればって(^^)。。。
 うー、KDDIに聞いてくれ(^^;)

 てなことで、ケータイ画面には、制約がある。




 てなわけで、あとで、ケータイが使えない。。。なんてなると、その場で入力できず、業務フローがかわってしまうっていうことがある。

 他にも、ブラウザでJavascriptでやった場合の制約とか、いろいろある。

 なので、先に、GUIを決めておかないと、あとで、いやー、できない(>_<!)

 ってなって、無理やりなんかして、工数オーバーになる危険がある。

 じゃあ、どのタイミングで。。。っていうことになるけど、
 新しいシステムの入出力を決めるときには、GUIが決まっていて、そのGUIにもとづいて、入出力ができるかっていう確認をしないといけないよね。



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