2008年12月24日水曜日

SunSPOTでユニキャスト

なんか,SunSPOT-Basestation間でユニキャストができないという報告があったので,試してみた.
(SunSPOTいじるの久しぶりなので,不備があったら突っ込みお願いします)

まずは,ソース(ソースが長くならないようにシンプルなものを載せています).

サンスポット側


package net.java.dev.netbeansspot;

import com.sun.spot.io.j2me.radiogram.*;
import com.sun.spot.util.Utils;
import javax.microedition.io.*;
import javax.microedition.midlet.*;

public class Application extends MIDlet {
private final String PROTOCOL = "radiogram://0014.4F01.XXXX.XXXX:67";// べた書きだっせ~
protected void startApp() throws MIDletStateChangeException {
RadiogramConnection rCon = null;// 通信用クラス
Datagram dg;// データグラム
try {
rCon = (RadiogramConnection) Connector.open(PROTOCOL); // 回線開いて
dg = rCon.newDatagram(rCon.getMaximumLength());// データグラム作って
while (true) {// 無限ループ!!
dg.reset();
dg.writeUTF("Hello SunSPOT!!");
rCon.send(dg);
System.out.println("hoge");
Utils.sleep(2000);
}
} catch (Exception e) {
System.err.println("Caught " + e + " in connection initialization.");
System.exit(1);
}
}
protected void pauseApp() {
// This is not currently called by the Squawk VM
}
protected void destroyApp(boolean unconditional) throws MIDletStateChangeException {
// TODO
}


ホスト側


package net.java.dev.netbeansspot;

import com.sun.spot.io.j2me.radiogram.*;
import javax.microedition.io.*;

public class SunSpotHostApplication {
private static final int HOST_PORT = 67; // port指定
// 通信部
private void run() throws Exception {
// 前準備
RadiogramConnection rCon; // コネクション
Datagram dg;// データグラム
try {
rCon = (RadiogramConnection) Connector.open("radiogram://:" + HOST_PORT);
dg = rCon.newDatagram(rCon.getMaximumLength());
} catch (Exception e) {
System.err.println("setUp caught " + e.getMessage());
throw e;
}
// データ受信&&表示を行うループ
while (true) {
try {
rCon.receive(dg);// 受信
String addr = dg.getAddress(); // 送信元を取り出して
String msg = dg.readUTF(); // メッセージを取り出して
System.out.println(addr + ":" + msg);// 表示
} catch (Exception e) {
System.err.println("Caught " + e);
throw e;
}
}
}
// main
public static void main(String[] args) throws Exception {
SunSpotHostApplication obj = new SunSpotHostApplication();
obj.run();
}
}


実行結果


きれいに載せるの面倒なので,デスクトップのキャプチャで.





普通に動いた...

少し考察


今回は,BaseStationもSunSPOTも両方ケーブルにつないだ状態で行った.
これは,BaseStationを使ってリモートでSunSPOTにアプリケーションを配置・実行してしまうと,最初のオープンで失敗するからです.というのは,(適当に書いたソースなモンで)SunSPOT側のアプリは起動後すぐにBaseStationに対して接続を試みますが,BaseStationはリッスンになっていないので余裕でこけるのです.
即ち,アプリを実行する順番は(エラー処理をちゃんと書かないのであれば)
BaseStation→SunSPOTであるべきです.

要するに,回線を開くタイミングや,回線が落ちた時の処理,エラー処理などもうちょっと複雑な処理を入れてあげないとねってコトです.

(ちなみに,今回のソースで,通信が成功している状態で突然ホストアプリを止めるとSunSPOTはどんな挙動を示すでしょう??)

2008年12月21日日曜日

お得なお知らせを使ってみた!!

先日インストールしたVS2008はsp1にバージョンアップすると、C++0x(C++の次の企画)が一部使えます.また,g++もver 4.3(だっけ?)からは-std=gnu++0xオプションを付けることで,C++0xの一部を使うことができます.

でも,どっかのblogによると,VS2008のC++0xにはバグがあるとか無いとか...
そんなわけでC++0xで実装予定の,<random>ヘッダを試してみました.

#include <iostream>
#include <random>
#include <ctime>
using namespace std;
using namespace std::tr1; // gnu++0xでは不要.

int main() {
mt19937 e(static_cast<unsigned long>(std::time(0)));
uniform_int<> d(0, 10);
variate_generator<mt19937, uniform_int<> > g(e, d);

for(int i=0;i<10;i++) cout << g() << "\t";

return 0;
}


プログラムの中身としては,0から10までの乱数を発生させます.

実行結果.

まずは,g++

c:\usr\home\cpp>g++ -std=gnu++0x test.cpp

c:\usr\home\cpp>a.exe
0 6 10 0 5 9 9 1 1 8


次いで,VS2008 SP1

C:\usr\home\Projects\HelloVS2008\Debug>HelloVS2008.exe
-4 2 1 3 -3 -4 -3 -1 -2 4


あれ,おかしくね??

2008年12月11日木曜日

お得なお知らせを試してみた!!

先日KEITA Aさんから研究室内に回ったお得なお知らせを試してみた.

まずは,ここにアクセスして,M$にメールを送ります.
メールに記載する内容も全然多くなくて1分で終わります.書くのは,学校名・氏名・学年・大学で使っているメールアドレス位です.

1日後位にM$社からメールが来るので,そのメールに書いてあるURLをクリックして,ダウンロードサイトへ.

とりあえずVS2005とVS2008をダウンロードしてみました.
VS2005のisoが2ファイルで900M位.VS2008は1ファイル3.8G位(笑
M$のサーバにしてはかな~り早くダウンロードできました.すばらしい~

問題は,VS入れて何に使うかだけど...

2008年12月9日火曜日

KDE on Windows

こんな時代なんですね...
ちょっと感動した.

2008年12月5日金曜日

Emprise JavaScript Charts

100%pure javascriptでグラフ書けます.
http://www.ejschart.com/
スクリプトも簡単ですが,やっぱり動作はブラウザ依存します.