2010年10月19日火曜日

GWTでJSONを扱う ~JsonpRequestBuilderを利用する~

GWTでJSONPを扱う方法です。JsonpRequestBuilderを使うことで、JSONデータを自動的にクラスにマッピングしてくれます。以下のサンプルは次のJSONのデータを扱うことを前提としています。JSONPですから、外部サイトも参照可能です。
{
"name":"ochi",
"age":10,
"adress":
{"name":"Osaka"}
}
以下のプログラムは、クライアント側のプログラムです。Userクラスに自動的にマッピングしてくれます。
JsonpRequestBuilder jb = new JsonpRequestBuilder();
   jb.requestObject(
      "http://XXXXX.XXX.XXXX.json",
        new AsyncCallback<JsArray>() {
        public void onFailure(Throwable caught) {
           GWT.log("failure", caught);
        }
        public void onSuccess(JsArray<User> result) {
            StringBuilder sb = new StringBuilder();
            Window.alert("Success");
            for (int i = 0; i < result.length(); i++) {
               sb.append(result.get(i).getName());
            }
            resultArea.setValue(sb.toString());
        }
   });
ここで、注意しなければならないのは、クラスの宣言方法です。下記のように、JSNI形式でなければなりません。
import com.google.gwt.core.client.* ;
import java.util.* ;

final public class User extends JavaScriptObject {

  protected User(){
  }

  public native java.lang.Long getId()/*-{
     return this['id'];
  }-*/;

  public native Address getAddress()/*-{
     return this['address'];
  }-*/;

  public native java.lang.String getName()/*-{
     return this['name'];
  }-*/;

  final static public class Address extends JavaScriptObject {

    protected Address(){
    }

    public native java.lang.String getName()/*-{
       return this['name'];
    }-*/;

  }
}
このようなクラスを記述するのが手間ですが、実は作成を支援してくれるサイトがあります。
 JSONの雛形データをいれるとこのフォーマットに変換してくれるとても素敵なサイトです。(こういう世のためになるサイトを作りたいですね)

(追記:2010/10/22)
***.gwt.xml ファイルには
<inherits name='com.google.gwt.jsonp.Jsonp' /> 
の記述が必要です。

GWTでJSONを扱う ~JSONParserを利用する~

GWTのクライアント側で、JSONのパースを行う方法です(この方法はあまり使われないかもしれません)。
下記は、testjsonという文字列にJSON形式のデータが入っているという前提です。
最終的にJSONStringに変換してその値を取り出しています。なんかまどろっこしいですよね。

なお***.gwt.xml ファイルには
< inherits name='com.google.gwt.json.JSON' />
の記述が必要です。

2010年10月7日木曜日

[C++/CLI] UDPプログラミング

UDP送信プログラムのメモ書きです。下記のサンプルは、サーバー側でテキストボックスの内容を送信しています。

送信側(サーバ)
int groupPort = 11000;
IPEndPoint ^groupEP = gcnew IPEndPoint(IPAddress::Parse("255.255.255.255"), groupPort);
//ブロードキャストの場合
//groupEP = gcnew IPEndPoint(IPAddress::Broadcast, groupPort);
groupEP = gcnew IPEndPoint(IPAddress::Parse("192.168.1.28"), groupPort);

Socket ^socket = gcnew Socket(AddressFamily::InterNetwork, SocketType::Dgram, ProtocolType::Udp);
socket->SetSocketOption(SocketOptionLevel::Socket, SocketOptionName::Broadcast, 1);
socket->SendTo(System::Text::ASCIIEncoding::ASCII->GetBytes(textBox1->Text), groupEP);
受信側(クライアント)
Socket ^listener = gcnew Socket(AddressFamily::InterNetwork, SocketType::Dgram,ProtocolType::Udp);
IPEndPoint ^localEndPoint = gcnew IPEndPoint(IPAddress::Any, 11000);
listener->Bind(localEndPoint);

EndPoint ^ep = gcnew IPEndPoint(0,0);
System::Diagnostics::Debug::WriteLine("Ready to receive…");


array<Byte> ^data = gcnew array<Byte>(1024);
int recv = listener->ReceiveFrom(data, ep);
String ^stringData = Encoding::ASCII->GetString(data, 0, recv);
System::Diagnostics::Debug::WriteLine(stringData);
listener->Close();


2010年10月6日水曜日

2010年 第21回教育システム若手の会(misokatsu2010)開催概要

テーマ:教育システム研究のこれから

内容:今回で21回目を迎える教育システム若手の会では,「教育システム研究マップ」を作り,自分たちの研究を位置づけていくことを通して,教育 システム研究のこれからを考えるディスカッションを企画しました.それに加えて,1日目の午後には,若手の研究発表(リサーチセッション)を設け ることで,若手自身の研究について学生や若手研究者同士で議論する機会を新たに企画しました.

研究についての発表やディスカッションを通して,自分の研究と他の人の研究を相対比しながら,今後の教育システム研究について考えていきます.
また,若手の会に参加する年齢層が広くなってきたこともあり,20代の院生を中心とした若手と,30代の教員を中心とした中堅とに分けてディス カッションすることで,視点の違いなども感じられるように考えています.


日時: 11月5日(金)~7日(日)

場所: 観光旅館 柏屋
〒470-3235 愛知県知多郡 美浜町野間字畑中45番地
http://www.mihama-s.or.jp/kashiwaya/

対象者: 教育システム関連の若手研究者(自称も含む)及び学生

スケジュール概要:

5日(金)
15:00-18:00 リサーチセッション(研究発表&議論)
夕食
20:00-22:00 開会のあいさつ,自己&研究紹介

6日(土)
9:00-9:15 議論のテーマについて説明
9:15-10:20 セッション1:『自分たちの研究について整理・分類』
10:30-12:00 セッション2:『教育システム研究マップの作成』
昼食
13:00-14:30 セッション3:『教育システム研究マップの融合・マッピング』
休憩
14:45-16:45 セッション4:『次なる研究の位置づけ』
17:00-18:00 全体セッション『成果発表&議論』
夕食
21:00-    ナイトセッション・エンドレスセッション

7日(日)
朝食・部屋の片づけ
9:30-10:00 クロージングセッション
移動
12:00-    味噌カツパーティー
解散

補足:セッション1,2では,若手グループと中堅グループに分けてセッション.


後援: 人工知能学会 先進的学習科学と工学研究会(予定)
電子情報通信学会 教育工学研究会(予定)
日本教育工学会
教育システム情報学会


参加申込はWebからできます。
http://www.watanabe.ss.is.nagoya-u.ac.jp/wakate2010/index.html


幹事:広島大学    倉山 めぐみ
関西大学    遠海 友紀
京都外国語大学 村上 正行
名古屋大学   林 佑樹
名古屋工業大学 立岩 佑一郎

問い合わせ先:
プログラム幹事:京都外国語大学 村上 正行
会場幹事:名古屋工業大学 立岩 佑一郎
問い合わせ用メールアドレス:
misokatsu@watanabe.ss.is.nagoya-u.ac.jp

========================================

2010年10月2日土曜日

Java Logging API ~まずはSystem.out.printlnから脱却しよう~

ここでいうログとはシステムが出力するログのことで、
  • 利用状況のログ
  • 動作確認のログ
  • エラーログ
などがあります。プログラミングの際には標準出力(System.out.println等)やファイル出力などで行うことがあると思いますが、上述のようなログの目的であればロギングツールの利用を勧めます。代表的なロギングツールには
  • Log4J
  • Java Logging API(Java標準)
があります。後者はJava標準ですので、ここではJava Logging APIを扱います。
 
このようなLoggingツールを利用する理由ですが、
  1. ログ情報であるということが明示的になる
  2. ログの目的に応じたレベル設定ができる
  3. 各種ログ生成のためのツールが揃っている
などが挙げられます。もちろん自前で用意してもいいのですが、このようなライブラリには「ロギング」についてしっかりと考えられて作られてますから、中途半端に自作するよりはましであることがわかると思います。また、この種のライブラリやフレームワークを利用する方が第3者が可読しやすいコードが書けるというのもあります。

ログのレベル
以下の7種類が用意されています。
  1. FINEST
  2. FINER
  3. FINE
  4. CONFIG
  5. INFO ・・・ 情報
  6. WARNING ・・・ 警告
  7. SEVERE ・・・ 致命的
通常はINFO以下の3つの段階を利用します。

Java Loggin APIの使い方

以下のような記述をします。
Logger log =Logger.getLogger(Logger.GLOBAL_LOGGER_NAME);
log.info("プログラムを実行します");
log.warning("警告メッセージです");
log.severe("致命的なエラーが発生しました");

ログのレベルに対応した出力メソッドがありますので、使い分けることになります。これだけでは便利さが分かりにくいかもしれませんが、実行時にログの出力レベルを設定することで、重要なメッセージだけを出力できるようになります。例えば、動作確認はINFOレベルでありデバッグ時に確認するさいに使われるものです。稼動時には、WARNIGやSEVEREのみを出力するといったことが可能です。また、System.out.printlnよりはどういう意味であるのかが明示的になり、コードが読みやすくなります。

2010年10月1日金曜日

無名クラス、匿名クラスを理解する

GWTのRPCを利用するときに、無名クラスの記述がでてきます。Javaに慣れていない人にはわかりにくいところですので、無名クラスについて取り上げます。
例えば、以下のようなインタフェースが定義されていたとします。このインタフェースには2つの抽象メソッドが定義されています。抽象メソッドですので、定義されているのは名前だけで、実際の内容は実装するクラスで書く必要があります。
interface Callback {
  void onSuccess();
  void onFailure()
}
つづいて、このインタフェースを実装するクラスを作成します。必ずCallbackインタフェースで定義されているメソッドを定義しなければなりません。
class TestImpl implements Callback{
  void onSuccess(){
   //ここに何かかく
  }
 void onFailure(){
   //ここに何かかく
  }
}
そして、実際に利用するときには、下記のように書くことになります。
このようにクラスのインスタンスを生成することで、onSuccess等のメソッドを呼び出すことができます。
Callback test = new TestImpl();//あるいは右のような書き方でもよい TestImpl test = new TestImpl();
test.onSuccess();
上記のクラスを宣言する手間を省けるのが無名クラスです。以下のように省略することができます。
Callback test = new Callback{
  void onSuccess(){
   //ここに何かかく
  }
 void onFailure(){
   //ここに何かかく
  }
}
何が省略されているかわかりますか?インタフェースクラスは、直接newすることはできませんが、このようにnewしながら中身を定義することで、newされるものは Callbackインタフェースを実装した何か?(つまり無名のクラス)になります。だから、インタフェースで受け取ることができます。

UIBinderにて画像を表示する ~Imageタグ~

UiBinderを利用して、画像を配置するには、Imageタグを使います。



あるいは、Java側で処理することも可能です。
userIcon.setUrl("ochi.png");
画像ファイルは、webのディレクトリに配置してください。


なお、ImageResourceクラスを利用する方法があるらしいのですが、まだ未確認なのでこの方法で。確認次第、アップします。