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/
スクリプトも簡単ですが,やっぱり動作はブラウザ依存します.

2008年11月30日日曜日

コーディング規約

って大事だなって思った瞬間.

後輩のデバッグに付き合っている時のこと.

後輩の作ったlinkという自前クラス(多分伝送路クラスだと思う)が型として認識されない(link p でエラーが出る).
しかも,Windows上でMinGWだとOKなのにSolarisやLinux上だと怒られる...
なんでかと思ったら,linkって関数があるらしい.知らんかった...ってか,Windows上にはないのね.

コーディング規約って大事だなって思った瞬間でした..

クラス名は大文字で始めましょう!!


追伸.link2って名前でエラーを逃れた後輩をちょっと尊敬しました.

2008年11月21日金曜日

NetBeans 6.5

正式にリリースされました.

http://ja.netbeans.org/

2008年11月14日金曜日

行列のできるプログラミング言語(3)

C++編(2)


■(鬼の)liboctave



#include <octave/config.h>
#include <octave/Matrix.h>
#include <iostream>
using namespace std;

int main(int argc, char**argv)
{
double m[][3] = { { 3, -4, 2 }, { 2, 5, 3 }, { -2, 3, -2 } };
Matrix A(3,3);
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
A(i,j) = m[i][j];
// 行列の表示
cout << "matrix A:" << endl << A << endl;
// 逆行列の表示
cout << "inv(A):" << endl << A.inverse() << endl;
// 元の行列との積の計算
cout << "A*inv(A)" << endl << A*A.inverse() << endl;
// ついでに固有値分解(笑)
EIG eig(A);
cout << "Eigen Vector" << endl << eig.eigenvectors() << endl;
cout << "Eigen Values" << endl << eig.eigenvalues() << endl;

return 0;
}

2008年11月7日金曜日

boost 1.37

リリースされたようです.

この辺参照.
新しいライブラリはProtoのみみたいですけど.

にしても,肥大化の一途を辿るboostの到着点は何処??

2008年11月5日水曜日

Solaris 10 10/08

Solaris 10 10/08が10月31日に出ました.
http://www.sun.com/aboutsun/pr/2008-10/sunflash.20081031.1.xml

2008年11月1日土曜日

行列のできるプログラミング言語(2)

C++編


boost::numeric::ublas編


uBLAS_Util.hpp


#ifndef __UBLAS_UTIL_HPP__
#define __UBLAS_UTIL_HPP__

#include <iostream>
#include <cmath>
#include <boost/numeric/ublas/matrix.hpp>
#include <boost/numeric/ublas/vector.hpp>
#include <boost/numeric/ublas/io.hpp>
#include <boost/numeric/ublas/lu.hpp>
#include <boost/numeric/ublas/triangular.hpp>

using namespace std;
using namespace boost;
using namespace boost::numeric;
using namespace boost::numeric::ublas;

typedef ublas::matrix<double> dmatrix;
typedef ublas::matrix<complex<double> > cdmatrix;
typedef ublas::vector<double> dvector;
typedef ublas::vector<complex<double> > cdvector;

/*
matrixの表示
*/
template<class Matrix>
void m_print(Matrix x) {
int n1 = x.size1();
int n2 = x.size2();
for (int i = 0; i < n1; i++) {
for (int j = 0; j < n2; j++) {
cout << x(i, j) << "\t";
}
cout << endl;
}
return;
}

/*
vectorの表示
*/
template<class Vector>
void v_print(Vector x) {
int n = x.size();
for (int i = 0; i < n; i++) {
cout << x(i) << endl;
}
return;
}

#endif

main.cpp


#include <iostream>
#include <boost/numeric/ublas/matrix.hpp>
#include <boost/numeric/ublas/vector.hpp>
#include <boost/numeric/ublas/io.hpp>
#include <boost/numeric/ublas/lu.hpp>
#include <boost/numeric/ublas/triangular.hpp>
#include "uBlas_Util.hpp"
using namespace std;
using namespace boost::numeric::ublas;

int main() {
// make matrix A
dmatrix A(3, 3);
double m[][3] = { { 3, -4, 2 }, { 2, 5, 3 }, { -2, 3, -2 } };
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
A(i, j) = m[i][j];
}
}
cout << "matrix A:" << endl;
m_print(A);
// make A^-1
dmatrix I = identity_matrix<double>(3);// 単位行列
dmatrix copyA(A);// Aのコピー
// LU分解時の行交換情報が入る行列
permutation_matrix<> pm(A.size1());
// LU分解
lu_factorize(A,pm);
// 行交換を考慮した前進消去と後退代入
lu_substitute(A,pm,I);

// 解の表示
cout << "A^-1" << endl;
m_print(I);
// A*A^-1
cout << "A*A^-1" << endl;
m_print(prod(copyA,I));

return 0;
}

行列のできるプログラミング言語(1)

いつか何かの役に立つかも知れないのでメモ.

Java編



Jakarta commons math



import java.math.BigDecimal;
import org.apache.commons.math.linear.*;

public class Main {
public static void main(String[] args) {
// 行列Aを作成
double[][] m = {{3,-4,2}, {2,5,3}, {-2,3,-2}};
BigMatrix A = MatrixUtils.createBigMatrix(m);
System.out.println("行列A");
printBigMatrix(A);
// Aの逆行列A^-1を求める
BigMatrix inA = A.inverse();
System.out.println("行列A^-1");
printBigMatrix(inA);
// AとA^-1の積
BigMatrix tmp = A.multiply(inA);
System.out.println("A*A^-1");
printBigMatrix(tmp);
// 連立方程式
// Ax = b
BigDecimal [] b =new BigDecimal [3];
double [] t = {0,6,1};
for(int i=0;i<3;i++){
b[i]= new BigDecimal(t[i]);
}
BigDecimal[] x = A.solve(b);
System.out.println("連立方程式");
for(int i=0;i<3;i++){
System.out.println(x[i]);
}
return;
}
public static void printBigMatrix(BigMatrix tmp){
for (int i = 0; i < tmp.getRowDimension(); i++) {
for(int j=0;j<tmp.getColumnDimension();j++){
System.out.print(tmp.getEntry(i, j) + "\t");
}
System.out.print("\n");
}
}
}


JAMA編



import Jama.*;

public class Main {
public static void main(String[] args) {
double[][] m = {{3,-4,2}, {2,5,3}, {-2,3,-2}};
Matrix A = new Matrix(m);
double [] t = {0,6,1};
Matrix b = new Matrix(3,1);
for(int i=0;i<3;i++)
b.set(i, 0, t[i]);
Matrix x = A.solve(b);
for(int i = 0;i<x.getRowDimension();i++)
System.out.println(x.get(i, 0));
}

}

2008年10月24日金曜日

Java3Dを使おう(2)

Java3DでSunSPOTを3Dで作成しようと現在勉強中(ってほど時間かける余裕ないけど)

現在までの成果はこんな感じ..
日本語のまとまったドキュメントが欲しいです...なんか本でも買おうかな(笑)



ついでにソースリスト.


package java3dsuspot;

import com.sun.j3d.utils.behaviors.keyboard.KeyNavigatorBehavior;
import com.sun.j3d.utils.behaviors.vp.OrbitBehavior;
import javax.swing.*;
import java.awt.*;

import javax.media.j3d.*;
import com.sun.j3d.utils.geometry.Box;
import com.sun.j3d.utils.universe.*;
import javax.vecmath.*;

/**
* Java3DでSunSPOTを作成
* @author taka
*/
public class Spot3D extends JFrame{
private TransformGroup objTrans1;
private TransformGroup objTrans2;
private SimpleUniverse uni;
private Canvas3D canvas;
private RotationInterpolator rotatX;
private RotationInterpolator rotatY;
private RotationInterpolator rotatZ;
private Alpha alpha;
/**
* コンストラクタ
*/
public Spot3D(){
setLayout(new BorderLayout());
GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
canvas = new Canvas3D(config);
getContentPane().add(canvas, BorderLayout.CENTER);

BranchGroup scene = createSceneGraph();
uni = new SimpleUniverse(canvas);
uni.getViewingPlatform().setNominalViewingTransform(); // 視点の設定
uni.addBranchGraph(scene);

setOrbitBehavior();

setSize(600, 600);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
/**
* 3Dオブジェクトの作成
*/
public BranchGroup createSceneGraph() {
// ObjectTreeの根の用意
BranchGroup objRoot = new BranchGroup();
// 座標軸を追加
Point3d[] vertex = new Point3d[6];

vertex[0] = new Point3d(-10.0, 0.0, 0.0); vertex[1] = new Point3d(10.0, 0.0, 0.0);
vertex[2] = new Point3d(0.0, -10.0, 0.0); vertex[3] = new Point3d(0.0, 10.0, 0.0);
vertex[4] = new Point3d(0.0, 0.0, -10.0); vertex[5] = new Point3d(0.0, 0, 10.0);

LineArray geometry = new LineArray(vertex.length,
GeometryArray.COORDINATES | GeometryArray.COLOR_3);
geometry.setCoordinates(0, vertex);

geometry.setColor(0, new Color3f(Color.red));
geometry.setColor(1, new Color3f(Color.red));
geometry.setColor(2, new Color3f(Color.cyan));
geometry.setColor(3, new Color3f(Color.cyan));
geometry.setColor(4, new Color3f(Color.blue));
geometry.setColor(5, new Color3f(Color.blue));

Shape3D shape = new Shape3D(geometry);
objRoot.addChild(shape);

// 光源を追加
objRoot.addChild(createLight1());
objRoot.addChild(createLight2());
// 新しい座標系
Transform3D t3d1 = new Transform3D();
Matrix4f mat = new Matrix4f(
1.0f,0.0f,0.0f,0.5f,
0.0f,1.0f,0.0f,0.0f,
0.0f,0.0f,1.0f,0.0f,
0.0f,0.0f,0.0f,1.0f
);
t3d1.set(mat);
Transform3D t3d2 = new Transform3D();
Matrix4f mat2 = new Matrix4f(
1.0f,0.0f,0.0f,0.0f,
0.0f,1.0f,0.0f,0.0f,
0.0f,0.0f,1.0f,0.0f,
0.0f,0.0f,0.0f,1.0f
);
t3d2.set(mat2);
// transグループの作成
objTrans1 = new TransformGroup(t3d1);// x方向+0.5
objTrans2 = new TransformGroup(t3d2);// 変更なし
// 許可
objTrans1.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
objTrans1.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
objTrans2.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
objTrans2.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
/*
alpha = new Alpha(
1, Alpha.INCREASING_ENABLE, 0, 0, 3000, 400, 0, 3000, 400, 0);
Transform3D axis = new Transform3D();
axis.setTranslation(new Vector3f(0.0f, 0.0f, 0.0f));
//axis.rotX(Math.PI / 2);
RotationInterpolator rotat =
new RotationInterpolator(
alpha, objTrans2, axis,0.0f, (float) Math.PI / 2);
BoundingSphere bounds = new BoundingSphere(new Point3d(), 100.0);
rotat.setSchedulingBounds(bounds);
objTrans2.addChild(rotat);
*/
// key操作
KeyNavigatorBehavior knb = new KeyNavigatorBehavior(objTrans2);
BoundingSphere bounds = new BoundingSphere();
bounds.setRadius(100);
knb.setSchedulingBounds(bounds);
objTrans2.addChild(knb);

// objTreeに追加
objTrans2.addChild(objTrans1);
objRoot.addChild(objTrans2);

// Boxを作成
Appearance ap = new Appearance(); // 物体の質感
Material ma = new Material();
ma.setDiffuseColor(1.0f,1.0f,1.0f); // 色の設定(RGB)
ap.setMaterial(ma);// materialをappearanceにセット
Box box = new Box(0.5f,0.1f,0.3f,ap); // Boxの作成
Box box2 = new Box(0.08f,0.02f,0.3f,ap);


// 木に追加
objTrans2.addChild(box);
objTrans1.addChild(box2);
// コンパイル
objRoot.compile();

return objRoot;

}
/**
* 回転系
*/
public void rotation(){
// x軸
Transform3D axis = new Transform3D();
axis.setTranslation(new Vector3f(0.0f, 0.0f, 0.0f));
axis.rotZ(Math.PI / 2);
rotatX = new RotationInterpolator(
alpha, objTrans2, axis, 0.0f, (float) Math.PI * 2);
BoundingSphere bounds = new BoundingSphere(new Point3d(), 100.0);
rotatX.setSchedulingBounds(bounds);
objTrans2.addChild(rotatX);
}
/**
* 光源を作成
* @return
*/
private Light createLight1() {
// 平行光源
DirectionalLight light = new DirectionalLight(true,
new Color3f(1.0f, 1.0f, 1.0f), // 光源の色
new Vector3f(0.0f, 0.0f, -1.0f));// 光の向き
// AmbientLight light = new AmbientLight(true,new Color3f(1.0f,1.0f,1.0f));
light.setInfluencingBounds(new BoundingSphere(new Point3d(), 100.0));// 中心点,影響する範囲

return light;
}
private Light createLight2() {
AmbientLight light = new AmbientLight(true, new Color3f(1.0f, 1.0f, 1.0f));
light.setInfluencingBounds(new BoundingSphere(new Point3d(), 100.0));// 中心点,影響する範囲
return light;
}
/**
* マウス操作
*/
public void setOrbitBehavior(){
OrbitBehavior orbit = new OrbitBehavior(canvas,OrbitBehavior.REVERSE_ALL);
orbit.setSchedulingBounds(
new BoundingSphere(new Point3d(0,0,0),100)
);
uni.getViewingPlatform().setViewPlatformBehavior(orbit);
}

}

2008年10月21日火曜日

この前,学会で見たやつがついに
http://www.fcl.fujitsu.com/release/2008/20080924.html

2008年10月18日土曜日

ボゴソート

いよいよ情報処理技術者試験が明日に迫りました.
僕含め研究室の同期,先輩が必死に勉強していることと思います.

そんな中,面白いソートアルゴリズムを発見しました.

ボゴソート

これもソートアルゴリズムのひとつだ,と言い張る勇気が僕もほしいです...

2008年10月15日水曜日

Java3Dを使おう(1)

最近,誰も記事を書かないので頑張って更新.
今日から少しJava3Dを使うことにしました.何に使うかはおいおい....

そろそろ"Operaerの憂鬱"とか連載記事が始まるのではないかとちょっと期待してます(笑)

Java3DはJava向けの3D描画API拡張です.何故かJ2SDKとかには入ってません.どーいうことかって言うと別途自分でインストールしてねってことです.

現在はjava.net内のprojectページが配布サイトです.
この辺から自分に合ったのを落としてきて適当にインストールします.

続く(?)

2008年10月12日日曜日

SunSPOT SDK ver4.0

久々の更新.

SunSPOT SDK ver4.0がいつの間にか正式にリリースされていました.
この辺参照.

以下,公式のBBSからの引用です.

Version 4.0 of the Sun SPOT SDK (the Blue release) is now available for downloading via SPOT Manager. To install it go to http://www.sunspotworld.com/SPOTManager/ and click on the SPOT icon. In the SPOT Manager open the Preferences tab and select "General Release Updates". Then go to the SDK tab and choose "v4.0 Blue (Latest Update)".

Major changes include:

* Upgrading a SPOT to Blue will delete any user set properties because the section of SPOT flash memory used to store properties has changed.
* Can now deploy multiple application suites to be loaded & run on a SPOT
* The SPOTWorld application is now called Solarium
* Demos are now included as part of the SDK: /Demos
* Three new demos have been added: DatabaseDemo, HTTPDemo and SendDataDemo
* New SPOT-Utilities directory containing utility applications to calibrate the accelerometer, sniff packets and test the eDemo sensors
* New persistent system properties to specify default radio channel, pan id and transmit power.
* Several new ant commands
* SPOT host applications should no longer use the SPOT class; use RadioFactory instead.
* Bugs in the eDemo board UART code have been fixed and the UART API changed.
* The RoutingManager has been fixed so that its normal operation no longer prevents the SPOT from going into deep sleep.
* Many SPOT library jar files were renamed or moved
* Almost 200 bugs fixed

Please see the Release Notes for more details.

When reporting problems or bugs please be sure to specify which version of the SDK you are using.

2008年9月8日月曜日

Sun SPOT Manager v4.0

が公開されました.
この辺参照.

2008年9月5日金曜日

こんなんあります

Linux搭載低価格ノート
国内初だそうで.
http://itpro.nikkeibp.co.jp/article/NEWS/20080904/314129/

研究室内のブラウザ闘争に新たな局面(?)
googleがブラウザを出しました.名前はgoogle chromeです.軽く使ってみた感じだと,相当早いです.これから天下を取るかも知れません.
タブをそれぞれ別プロセスにして,タブが一個クラッシュしても他を守るようにしていたり,javascriptエンジンがgoogleのオリジナルだったりってのが特徴のようです.
暇な人はお試しあれ!!

2008年8月26日火曜日

アイディア

http://gogo.gs/
世の中、技術よりもアイディアが大事なことを痛感しました。

2008年8月25日月曜日

MinGWにおけるgccのバージョン

ふと気になって確認したら,自分のPCのMinGWのgccのバージョンがなんと3.45だった.
ちなみにLinux,Unixなんかでは現在4.3が最新らしい.

そんなわけで,この辺の話についてちょっと調べてみたのでメモ.

まず,MinGWの公式(MinGW.org)の公式リリースはやはり3.45が最新なようです(それも結構前に出たやつ).
MinGWでも4.3を使うには,

・MinGW公式で現在テスト段階(だと思う)のアルファ版を使う(参照)

・非公式なMinGW用バイナリ(?)を使ってみる.みっけたのは,これこれ.インストールの仕方はそれぞれのサイト参照.

・cygwin上でmake(この辺参照)

さ~てどれにしようかな・・・.

2008年8月16日土曜日

boost1.36がリリース

夕方から研究室に出てきたら豪雨で帰れなくなりました...

それはさておき,boost1.36がリリースされましたのでメモ.
boost.orgのnews参照.

今回のバージョンアップでは,新たに4つのライブラリーが加わっているようです.

Accumulators:
Framework for incremental calculation, and collection of statistical accumulators, from Eric Niebler.
Exception:
A library for transporting of arbitrary data in exception objects, and transporting of exceptions between threads, from Emil Dotchevski.
Units:
Zero-overhead dimensional analysis and unit/quantity manipulation and conversion, from Matthias Schabel and Steven Watanabe
Unordered:
Unordered associative containers, from Daniel James.

興味のある人は見てみましょう.

2008年8月10日日曜日

NetBeans6.5M1

がリリースされていました(いつの間に!!).

まだベータ版ってことで日本語版ではありませんが,SunSPOT用プラグインも新しいのが使えます.

この辺のページを見て試してみよう!!

NetBeans6.5M1
java.net内のSPOTs projectのnetbeans-spotのページ

ってか,最近更新されませんな~.

2008年7月1日火曜日

プログラミング環境?

これはヒトリゴト(笑)

最近,研究室の後輩がVSでerf(),erfc()が使えないと騒いでいたそうな.
確かに,VSは何故かerf()などはない(自分がB4の時も同様の事件があった).

先輩としてはVSよりはgccなんかを使ってほしいのでMinGWの利用を勧めてるのだけれども,今度は,VSでソース書いて,コマンドプロンプトでgcc使ってコンパイルする新勢力が!!
個人的にはMeadow+MinGW or NetBeans+MinGWを勧めてるんだけども(笑)

しかし,まぁ,その後輩たちVS用のBoostも入れてるわけで...
実はBoostにerf,erfcがあるのでVSでもerf,erfcは使えるのだ!!

・・・・これを言うとVSが流行りそうだし,どうしたもんかと思う今日この頃...

2008年6月28日土曜日

グラフ作成

センサーの情報をグラフ化したいと思い,色々調べたところJFreeChartというものを見つけました.
これを使って,SunSPOT の加速度をリアルタイムでグラフ化してみました.


こんな感じのグラフを簡単に表示することが出来ました.

2008年6月14日土曜日

リモートSunSPOTのアドレスのエリアス

SunSPOTにリモートでdeployするときとかはアプリケーションホームディレクトリのコマンドプロンプトで
> ant -DremoteId=0014.4F01.xxxx.xxxx deploy
なんてするわけですが,アドレスをいちいち書くのは面倒くさい.
そこで,ユーザホームディレクトリ(だいたいC:\Documents and Setting\hoge\,.sunspot.propertiesなんかのファイルがあるとこ)にspot.namesというファイルを作り
boo=0014.4F01.xxxx.xxxx
nakamoto=0014.4F01.yyyy.yyyy
などと書いておき,
> ant -DremoteId=boo deploy
なんてやり方でできてちょっと幸せ.

2008年6月8日日曜日

最新Demoを入手しよう!!

java.netにSunSPOTのプロジェクトがあり,最新のDemoをSubversionで落とせます.
こっちの方にはSPOTManagerでダウンロードしたDemoには含まれないものもありますので,落としておいて損はないでしょう.

というわけでいつも通りメモ.SunSPOTに限らず,SubversionやCVSでファイルを配布しているプロジェクトは世界中に数多くあります(boostとかもそーみたい).

ここがSunSPOTプロジェクトのページです.

準備1
取りあえず,無料登録なのでアカウント作っておいて下さい.

準備2
Subversionクライアントのインストール.今回は,Windows用のクライアントソフトの中でもGUI操作可能で使いやすいTortoiseSVNを使ってみましょう.この辺見ながら適当にインストールしてください.必要なら日本語化もしときましょう.

以上の準備ができたら,早速ダウンロードしてみましょう.

手順1.保存先ディレクトリの作成
Demoのダウンロード先ディレクトリを作成します.今回は,C:\tmp\spotdemoとします.

手順2.チェックアウト
チェックアウトしましょう.下図の様にspotdemosフォルダ上で右クリックして,メニューからSVNチェックアウトを選択します.


すると,下図のようなウィンドウが開きますので,図を参考にURLに
https://spots-sdk-demos.dev.java.net/svn/spots-sdk-demos/trunk
と入力してOKをクリックします.
しばらく待つと,認証を求められますので,作成したアカウントとパスワードを入力してください.ダウンロードが始まります.




以上でダウンロードが完了しました.
また,これらのファイルは日々更新されていますので定期的に更新しましょう.やり方としては,spotdemos上で右クリックして,メニューからSVN更新です(下図).



以上!!

2008年6月7日土曜日

コマンドラインでホストアプリケーション

コマンドラインでホストアプリケーションの実行方法について
まず,netbeansでホストアプリケーションを作成します.
次に,コマンドラインで作成したホストアプリケーションのディレクトリに移動し,
ant host-compile
と打ち込みます.すると,ホスト用のアプリがコンパイルされます.
そして,
ant host-run
と打ち込むと,作成したホストアプリケーションが実行されます.
*SunSPOTが接続されていないと実行されません!
以上!

2008年5月27日火曜日

SunSPOTプロジェクトにもjavadocを...

お気づきの方もいるかと思いますが,現在のNetBeans用SunSPOTプラグインはバグがあります(+使い勝手が悪い・・).一番大きな問題として,プラグインが生成するMANIFEST.MFが間違っているということが挙げられます.

もう一つ自分が気になることとしては,何故かNetBeans上でSunSPOTプロジェクトにjavadoc生成が見当たらないことです.
どーいうことかって言うと,NetBeansで作成したプロジェクトには下図のように"javadocを生成"コマンドが用意されているのに,な・ぜ・か,SunSPOTプロジェクトだとjavadocの生成ができないのです。




そんなわけで,原因を調べてみたところ,プラグインの吐き出すbuild.xml(プロジェクトフォルダ内にあるヤツ)は{$sunspot.home}/build.xmlをimportしていて,そのbuild.xmlにtargetとしてjavadocが書かれていないことが判明!!.

そんなわけで,適当に書き足しましょう.
SunSPOT sdkをインストールしたフォルダにあるbuild.xmlの最後に以下の要素を書き足します.この時,</project>よりも後ろに書かないように!!
<target name="javadoc">
<delete dir="./javadoc" />
<mkdir dir="./javadoc" />
<javadoc sourcepath="src" destdir="./javadoc" />
</target>

最低限の設定な上に,ソースフォルダ名とかべた書きでカッコ悪いですが,これで一応動きます.
最後に,NetBeansにjavadocタスクの存在を教えてあげましょう.
プロジェクトのプロパティ画面を開いて,構築と実行の"javadocを生成"のトコロにjavadocと書き足しましょう(下図).なんかエラーが出るけど気にしない(笑)




以上でSunSPOTプロジェクトでもjavadocを吐けるようになりました.

****追記****
今回設定したjavadoc生成なんて,コマンドラインでやっても大した事ないので,メンドクサイだけかもしれません.
もうちょっと工夫したほうがいいかもしれない(クラスパスとかね)と思ったけど,今回はココまで.
ちなみに私はDoxygen派です!!

2008年5月26日月曜日

SunSPOTでRSSIをとる

指針

  • サーバ


    • サーバはデフォルト送信電力で送る(多分フルパワー)

    • クライアントの送信電力を指定


  • クライアント


    • サーバに指定された送信電力で返信

    • 受信時RSSI取得しその値をサーバに返す


  • サーバ


    • 返信のRSSIを取得

    • 繰り返し




サーバ側

package org.sunspotworld;

import com.sun.spot.peripheral.Spot;
import com.sun.spot.io.j2me.radiostream.*;
import com.sun.spot.io.j2me.radiogram.*;
import com.sun.spot.peripheral.NoRouteException;
import com.sun.spot.peripheral.radio.IRadioPolicyManager;
import com.sun.spot.util.*;

import java.io.*;
import javax.microedition.io.*;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;

public class RSSIServer extends MIDlet {

private final String toAddress = "0014.4F01.xxxx.xxxx";
private final String port = "100";
private RadiogramConnection conn = null;
private Radiogram dgs = null;
private Radiogram dgr = null;
private IRadioPolicyManager rpm = null;

protected void startApp() throws MIDletStateChangeException {
System.out.println("Starting Server");
new BootloaderListener().start(); // monitor the USB (if connected) and recognize commands from host

int rssi = 0;
int rssiReply = 0;
int outputPower = 0;
int outputPowerReply = -25; // クライアント出力電力の初期値 (理論上-32からいける)
int cntNoRoute = 0;

while(true){
try {
rpm = Spot.getInstance().getRadioPolicyManager();
conn = (RadiogramConnection) Connector.open("radiogram://" + toAddress + ":" + port);
dgs = (Radiogram)conn.newDatagram(conn.getMaximumLength());
dgr = (Radiogram)conn.newDatagram(conn.getMaximumLength());

outputPower = rpm.getOutputPower(); // 設定済みの出力電力取得

try {
dgs.reset();
dgs.writeInt(outputPowerReply); // 返信用の出力電力を送る
conn.send(dgs); // 送る to クライアント
conn.receive(dgr); // 受信
rssiReply = dgr.readInt(); // RSSI@クライアントの取得
rssi = dgr.getRssi(); // RSSI@サーバの取得
System.out.println("outpower@s="+outputPower+" rssi@c="+rssiReply+" outpower@c="+outputPowerReply+" rssi@s="+rssi);
} catch (NoRouteException e) {
System.out.println("No Route to "+toAddress);
cntNoRoute++;
if(cntNoRoute == 3){
notifyDestroyed();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
conn.close();
}
} catch (Exception e) {
e.printStackTrace();
}
outputPowerReply++; // クライアントの送信電力を1ずつ上げてもらう
if(outputPowerReply >= 31){
outputPowerReply = -25;
}
Utils.sleep(1000);
}
// notifyDestroyed(); // cause the MIDlet to exit
}

protected void pauseApp() {
}

protected void destroyApp(boolean unconditional) throws MIDletStateChangeException {
}
}

クライアント側

package org.sunspotworld;

import com.sun.spot.peripheral.Spot;
import com.sun.spot.peripheral.radio.IRadioPolicyManager;
import com.sun.spot.io.j2me.radiostream.*;
import com.sun.spot.io.j2me.radiogram.*;
import com.sun.spot.peripheral.NoRouteException;
import com.sun.spot.util.*;

import java.io.*;
import javax.microedition.io.*;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;

public class RSSIClient extends MIDlet {

private final String port = "100";
private IRadioPolicyManager rpm = null;
private RadiogramConnection conn = null;
private Radiogram rg = null;
private Radiogram rgReply = null;

protected void startApp() throws MIDletStateChangeException {
System.out.println("Starting Client");
new BootloaderListener().start(); // monitor the USB (if connected) and recognize commands from host

rpm = Spot.getInstance().getRadioPolicyManager();

int rssi = 0;
int outputPower = 0;
while (true) {
try {
conn = (RadiogramConnection)Connector.open("radiogram://:" + port);
rg = (Radiogram)conn.newDatagram(conn.getMaximumLength());
rgReply = (Radiogram)conn.newDatagram(conn.getMaximumLength());

try {
conn.receive(rg); // 受信
rssi = rg.getRssi(); // RSSI@クライアント取得
outputPower = rg.readInt(); // 返信用出力電力取得 from サーバ
rpm.setOutputPower(outputPower); // 返信用出力電力設定@クライアント
System.out.println("true output power = "+rpm.getOutputPower());
rgReply.reset();
rgReply.setAddress(rg); // 返信用アドレス設定
rgReply.writeInt(rssi); // 取得RSSI@クライアントを返信 to サーバ
conn.send(rgReply); // サーバへ返信
} catch (NoRouteException e) {
e.printStackTrace();
notifyDestroyed();
} finally {
conn.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
//notifyDestroyed(); // cause the MIDlet to exit
}

protected void pauseApp() {
}

protected void destroyApp(boolean unconditional) throws MIDletStateChangeException {
}
}

サーバ動作例

クライアント動作例


ナゾ

  • 送信電力の指定が-32から-3までしかできない(-3以上大きくしても無視される,+31以上になると怒られる,-32だと小さすぎて2つのSPOTをくっつけても通信不可能)

2008年5月24日土曜日

boost 1.35.0がリリース

boost 1.35.0がリリース(2008/3/29)されてました.
http://www.boost.org/users/news/version_1_35_0
特殊関数(Besselとかerfcとか)が加えられたので利用価値あり.
サンプル

#include ≤boost/math/special_functions/bessel.hpp>
int
main(int argc,char** argv)
{
for(double i=-20;i<=20;i+=0.01)
printf("%f\t%f\n",i,boost::math::cyl_bessel_j(0,i));

return 0;
}

2008年5月21日水曜日

コマンドラインで実機を操作してみました!!

今日はコマンドラインで実機にアプリを乗せ,実行する方法を紹介します.
使用するコマンドは[ant deploy][ant run]のみです.それでは順を追って説明します.
まず,アプリを乗せたい端末をPCに接続します.また,コマンドライン上で乗せたいアプリのプロジェクトフォルダに移動して下さい.
ex.  cd C:\Sun\SunSPOT\Demos\AirText
ここで,コマンド[ant deploy]を実行.その後コマンド[ant run]を実行.以上です!

これだけでは記事として寂しいので,Basestationを用いてリモートでターゲット端末にアプリを乗せる方法も紹介したいと思います.
まず,BasestationをPCに接続します(厳密にはbasestationで無くても可能).また,コマンドライン上で乗せたいアプリのプロジェクトフォルダに移動して下さい.
ここで,[ant info]を実行して下さい.現在PCに接続されている端末の情報が表示されます.

上図の赤線のようにBasestationモードに設定されていることを確認して下さい.もし,
Configured to run the built-in dummy application
をという設定になっている場合は,コマンド[ant startbasestation]を実行して下さい.Basestationモードに切り替わるはずです(一度Basestationモードにした端末は[ant upgrade]をしないとモードを元に戻せないかもしれないのでお気を付け下さい).
それでは,ターゲット端末にアプリを流し込みたいと思います.
コマンド[ant -DremoteID=0014.4F01.????.???? deploy](????.????はターゲット端末の裏側に記載されているアドレス)を実行します.その後コマンド[ant -DremoteID=0014.4F01.????.???? run]を実行して下さい.上手く動作しましたか?

もし,動作が上手くいかない場合は「端末をリブートしてコマンドを実行」という作業を何度か行ってみて下さい.これで動く場合もあります.それでも失敗するようなら,OTAやOwner Keyの設定を変更する必要があるかもしれません.よく分からない場合はとりあえず端末をupgradeすることをお勧めします.大抵のエラーはこれでどうにかなるので・・・.

2008年5月20日火曜日

Sensorを使ってみた

5月10日の記事【通信サンプル】と5月16日の記事【Sensorを使おう】を参考にして,
加速度センサーのデータを他のSunSPOTにブロードキャストで送信するプログラムを作成.
5月10日の送信本体classを以下のように書き換える.

package org.sunspotworld;

import com.sun.spot.peripheral.Spot;
import com.sun.spot.sensorboard.EDemoBoard;
import com.sun.spot.sensorboard.peripheral.ITriColorLED;
import com.sun.spot.io.j2me.radiostream.*;
import com.sun.spot.io.j2me.radiogram.*;
import com.sun.spot.util.*;
import com.sun.spot.sensorboard.peripheral.*;
import java.io.*;
import java.lang.Thread;
import javax.microedition.io.*;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;

/**
* SunSPOT通信テスト用アプリケーション(送信側)
* ひたすら"Hello World"の文字列をブロードキャストし続ける
*/
public class StartApplication extends MIDlet {
private DatagramSender sender; //!< 通信を行う
private final String PROTOCOL ="radiogram://broadcast:230"; //!< 通信プロトコル
private IAccelerometer3D Accele = EDemoBoard.getInstance().getAccelerometer();//加速度センサーのインスタンス作成
private double acc;//加速度用の変数
/**
* アプリ開始時に呼ばれる.
* @throws javax.microedition.midlet.MIDletStateChangeException
*/
protected void startApp() throws MIDletStateChangeException{
try {
sender = new DatagramSender(PROTOCOL, 31, 3);
int i = 0;

while(true){
        //2秒待つ(これをやらないと大量に出力されるため)
try{
Thread.sleep(2000);
} catch (InterruptedException e){
e.printStackTrace();
}
        //x軸の加速度をaccに代入する
acc = Accele.getAccelX();
        //加速度(acc;double)を文字列に変換して,sender.sendに渡す
sender.send("Hello:" + Integer.toString(i)+" " + Double.toString(acc));
i++;
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
protected void pauseApp() {
// This is not currently called by the Squawk VM
}
protected void destroyApp(boolean unconditional) throws MIDletStateChangeException {

}
}

こんな感じです.
demoのソースを見ればセンサーの使い方は大体わかると思います.

2008年5月16日金曜日

Sensorを使おう!!

相変わらず,ノラリクラリとSunSPOTで遊んでいます.

今回はセンサーの使い方メモ.
SunSPOTのeDemoボードには,
- 照度センサー
- 3軸加速度センサー
- 温度センサー
が付いています.
当然ながら開発者はこれらのセンサーから,値を取得したり,値の変化イベントを拾ったり出来ます.

そんなわけで,やり方メモ.今回は照度センサーを例にしますが,別のセンサーでも大差ありません.また,スイッチなんかも全て同じような使い方です(これがオブジェクト指向の良いトコロ).


1.照度センサーのインスタンス作成.
これは,EDemoBoard.getInstance().get~でいけます.~の部分はセンサーによって異なります.例えばこんな感じ.
ILightSensor Light = EDemoBoard.getInstance().getLightSensor();


2.センサーから現在の値を取得.
センサーが現在観察している値を取得するメソッドです.
但し,こいつはセンサーごとにメソッド名・引数共に異なりますので注意!!
Light.getAverageValue()
// 又は
Light.getAverageValue(int n)


3.イベントを拾う
Javaプログラマはおなじみのイベントハンドラの登録です.
手順としては,
-1- イベントハンドラの作成と登録
-2- 閾値(Threshold)の設定
-3- 閾値イベントの有効化
です.
注意事項としては,-3-で有効化した閾値イベントの有効期限は1度だけです.どーいうことかというと,閾値イベントを有効にしておけば,値が閾値を越えたときに登録したイベントハンドラのメソッドが呼ばれます.しかし,そこで閾値イベントは無効になり,次回からは閾値を超えてもイベントハンドラは呼ばれません.これを避けるためには,イベントハンドラ内で再び閾値イベントを有効にする必要があります.

ま,これは実際にソースを見たほうが早いでしょう.
// イベントハンドラ登録
Light.addILightSensorThresholdListener(new ILightSensorThresholdListener() {
// 閾値を越える変化があった時に呼び出される.
public void thresholdExceeded(ILightSensor light, int val) {
System.out.println("thresholdExceeded!!");
System.out.println("val:" + val);
light.enableThresholdEvents(true); // イベント登録は毎回有効にする.
}
// 閾値が変更されたとき呼び出される
public void thresholdChanged(ILightSensor light, int low, int high) {
System.out.println("thresholdChanged!!");
System.out.println("Low:" + low + "\tHigh:" + high);
}
});
Light.setThresholds(20, 60); // 閾値の設定(直後にthresholdChangedが呼ばれる
Light.enableThresholdEvents(true);// イベント登録を有効化

ソースから分かるように,ThresholdListenerは2つのメソッドを持ちます.1つは,閾値を越えたときに呼ばれるメソッド.もう1つは,閾値が変更されたときに呼ばれるメソッドです.これは,他のセンサーにも共通なようです.

追記
さっき気づいたのだけれども,SPOT ManagerのConsoleに
SDK Color: "purple". Demos color: "orange". Release mismatch. Demos not installable.

のエラーが.
確かにNetBeans上でDemo眺めてるとクラスが見つからなかったり不思議なエラーが出てたなぁと,しみじみ納得.

2008年5月13日火曜日

SunSPOT用語のまとめ

SunSPOT関連で少し,用語のメモ.暇なときに書き足します・・・・多分.

・SunSPOT


"Sun Small Programmable Object Technology"の略.
コイツについては今更でしょう.

・J2ME


"Java2 Platform Micro Edition"の略.要するに組込み用のJava規格(cf:J2SE,J2EE).
J2MEの環境では,アプリケーションは特定のプロファイル向けに作成されおり,プロファイルは特定のコンフィギュレーションを基本としているらしい.
代表的なコンフィギュレーションとして,
-CLDC
-CDC
があるそうな.

・Squawk VM


小型デバイス向けに設計されたJavaVM.J2ME CLDC 1.1に準拠.SunSPOTの上ではコイツが動いているそうな.
このVMの特徴としては,
-小型デバイス向け
-OSを必要としない
-Javaで書かれている
-一つのVM上で複数のJavaアプリが動く
って感じ(?).
最近オープンソースになったそうな.Windows上でビルドに成功した人も居るってどっかで聞きました.

・MIDlet


携帯電話など小型の情報端末で実行できるJavaアプリケーションの形式の一つ(っつうかクラス).SunSPOT上で動かすアプリはMIDletクラスを継承する.
最低限
- startApp()
- pauseApp()
- destroyApp()
は実装しましょう.

2008年5月10日土曜日

SunSpot通信サンプル

この辺見ながら適当に作ったサンプル.
送信側はひたすら"Hello:送信回数"をブロードキャストし続ける.受信側は受信したメッセージをコンソロールに出力し続けるだけという超シンプルなプログラムです.参考までに....

まずは,送信側本体
package org.sunspotworld;

import com.sun.spot.peripheral.Spot;
import com.sun.spot.sensorboard.EDemoBoard;
import com.sun.spot.sensorboard.peripheral.ITriColorLED;
import com.sun.spot.io.j2me.radiostream.*;
import com.sun.spot.io.j2me.radiogram.*;
import com.sun.spot.util.*;
import com.sun.spot.sensorboard.peripheral.*;
import java.io.*;
import javax.microedition.io.*;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;

/**
* SunSPOT通信テスト用アプリケーション(送信側)
* ひたすら"Hello World"の文字列をブロードキャストし続ける
*/
public class StartApplication extends MIDlet {
private DatagramSender sender; //!< 通信を行う
private final String PROTOCOL ="radiogram://broadcast:230"; //!< 通信プロトコル
/**
* アプリ開始時に呼ばれる.
* @throws javax.microedition.midlet.MIDletStateChangeException
*/
protected void startApp() throws MIDletStateChangeException{
try {
sender = new DatagramSender(PROTOCOL, 31, 3);
int i = 0;
while(true){
sender.send("Hello:" + Integer.toString(i));
i++;
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
protected void pauseApp() {
// This is not currently called by the Squawk VM
}
protected void destroyApp(boolean unconditional) throws MIDletStateChangeException {
}
}


次はデータ送信を行うクラスの例
package org.sunspotworld;

import com.sun.spot.io.j2me.radiogram.RadiogramConnection;
import com.sun.spot.peripheral.Spot;
import java.io.IOException;
import javax.microedition.io.*;

/**
* データグラム送信用クラス
*/
public class DatagramSender {
private DatagramConnection conn;//!< コネクション
private Datagram datagram;//!< データグラム
/**
* コンストラクタ
*/
public DatagramSender(String protocol,int power,int maxHops)throws IOException{
Spot.getInstance().getRadioPolicyManager().setOutputPower(power);
conn = (DatagramConnection)Connector.open(protocol);
((RadiogramConnection)conn).setMaxBroadcastHops(maxHops);
datagram = conn.newDatagram(conn.getMaximumLength());
}
/**
* メッセージ送信メソッド
*/
public synchronized void send(String message) throws IOException{
datagram.reset();
datagram.writeUTF(message);
conn.send(datagram);
}

}


最後に受け手側本体
package org.sunspotworld;

import com.sun.spot.sensorboard.*;
import com.sun.spot.io.j2me.radiostream.*;
import com.sun.spot.io.j2me.radiogram.*;
import com.sun.spot.util.*;
import com.sun.spot.peripheral.*;
import java.io.*;
import javax.microedition.io.*;
import javax.microedition.midlet.*;
import java.util.*;

/**
* SunSPOT通信テスト用アプリケーション(受信側)
* ひたすら受け取ったパケットをコンソロールに表示し続ける
*/
public class StartApplication extends MIDlet {
private final String PROTOCOL = "radiogram://:230"; ///< 通信プロトコル文字列
private DatagramConnection conn; //!< コネクション
private Datagram datagram;//< データグラム
/**
* アプリ開始時に呼ばれる
* @throws javax.microedition.midlet.MIDletStateChangeException
*/
protected void startApp() throws MIDletStateChangeException {
try {
Spot.getInstance().getRadioPolicyManager().setOutputPower(31);
conn = (DatagramConnection) Connector.open(PROTOCOL);
datagram = conn.newDatagram(conn.getMaximumLength());
while (true) {
datagram.reset();
conn.receive(datagram);
String message = datagram.readUTF();
System.out.println(message);
}
} catch (IOException ex) {
ex.printStackTrace();
}
}

protected void pauseApp() {
}
protected void destroyApp(boolean unconditional) throws MIDletStateChangeException {
}
}

2008年5月9日金曜日

「google-code-prettify」を導入しました

Blogger でソースコードに色付けをする - google-code-prettifyを導入しました.
使い方は、<pre class="prettyprint"> #表示したいソースコード# </pre>
で色がつきます.
注意! < と> はそのまま打ち込むと表示エラーになるので、
"&lt;" "&gt;"としてください.(但,&は半角で)

使用例
#include< iostream >
int main(){
cout<< "hello!"<< endl;
}

こんな感じです.

NetBeans6でSunSPOT開発

NetBeans6にSunSpot開発用プラグインをインストールする方法のメモ.


1.ここからプラグインをダウンロード(ファイル名は変更されてなければ"com-sun-sunspot-updatecenter.nbm").また,ダウンロードの際にIEを使うと拡張子がzipに書き換えられるので,そんな時は慌てずnbmに変更する.



2.NetBeans6を起動して,[ツール]メニューのプラグインをクリック.



3.プラグインウィンドウが起動するので,ダウンロード済みタブを選択して,プラグインの追加から,さっき落としたファイルを選択.



4.次に同ウィンドウの使用可能なプラグインタブを開いてカタログを再読み込みボタンを押してしばらく待てば,SunSPOT関係のプラグインが3つか4つくらい新たに増えるので,そいつにチェックを入れる.最後にインストールボタンを押せば勝手にインストールが始まる.


以上!!

2008年5月8日木曜日

今日起こったエラー②

追記
Solarium が立ち上がらない
->.spotworld.propertiesと.sunsopt.propertiesを消し,さらにant,SunSPOTSDKを入れなおした

今日起こったエラー

SPOTManagerをクリックした後,大きい実機の写真が出たのにもかかわらず開かない.
->C:\Documents and Settings\%自分のアカウント%にある.sunspot.properties内のバックスラッシュ(/)を¥に書き換えたため起動しなくなったと考えられる

Solariumで,New virtual SPOTを起動するとConsole Output中にエラーが出る
(C:\Sun\SunSPOT\sdk/lib/squawk.suiteがない!)
->ないので, (C:\Sun\SunSPOT\sdk\bin\squawk.suite)からコピーする。

エミュレータでDemoが動かない
->.sunsupot.propertiesを確認する
デフォルトは(sunspot.home=C:/Program Files/Sun/SunSPOT/sdk)
なので,/Program Filesを消す

2008年5月7日水曜日

SunSpot実機にプログラムを落とす

***SunSpot実機にプログラムを落とす

それぞれを接続してドライバをインストールする.
(ソフトウェアを自動的に選択でいけるはず)
いけない場合はCD-ROMから入れる.

SunSPOTManagerを開き,おのおのをUpgradeする.
親機
1.Upgradeを選択
2.OTAcommand->EnableOTA comand serverを選択
3.BaseStation->Start Basestationを選択

子機
Upgradeを選択

再起動する.

親機を接続し,SunSPOTManagerを開く
Solarium->Slariumを選択する
子機が表示されます
*表示されないとき
・子機の電源が入っているか確認
・Discovery->Discovery Sun Spotsを選択
・再起動してみる
・親機を接続し,
 OTAcommand->EnableOTA comand serverを選択
 BaseStation->Start Basestationを選択
・一からやり直す

子機にプログラムを入れる
子機上で右クリック->Deploy a MIDlet bundleを選択

Choose...を押し【再生ボタン】ぽい印がついている
ディレクトリを選択する
Startを選択->1:~を選択する

2008年5月6日火曜日

SunSpot インストール

詳しくは
Shuichi Machida's Weblog : Weblog

SunSPOTManagerのインストール
http://www.sunspotworld.com/SpotManager/
よりLAunch the Sun SPOT Manager applicationをダウンロードする
SPOTManager.jnlpを実行し,上部タブのSDK'sを選択
v3.0 Purpleを選択して下部インストールボタンを押す

※ ベースディレクトリに空白を含んでいると、ツールの一部動作に
不具合がでることがあるようです。なので、Windowsの場合は一旦イン
ストールした後 C:\Documents and Settings\<ユーザ名> ディレクトリ
以下にある .sunspot.properties ファイルを編集して、sunspot.home
の値を変更(c:\Sun\SunSPOT\sdk など)後にもう一度SDKをインストール
しなおすと良いかもしれません。

SunSPOTManagerを実行するためにはApache Antが必要
http://ant.apache.org/ のdownload -> apache-ant-*.*.*-bin.zipをダウンロード
-> 解凍
解凍したフォルダを適当な場所に移動ex:c\user\local\apache-ant...

パスを通す
システムのプロパティ(マイコンピュータ->右クリック->プロパティ)
詳細設定->環境変数
ANT_HOME さっき解凍したフォルダの場所を指定
PATH さっきのフォルダのbinの場所を指定

デモプログラムを入れる
SPOTManagerのPreferencesのUpdate Center のところでBeta Update Centerを選択する
SPOTManagerのSDKsでDemosをクリック
->デモプログラムがダウンロードされる

サンプルプログラムを動かしてみる
SPOTManagerのSPOTWorldの下部にあるSPOTWorldをクリック
->SPOTWorldが起動する
Emulatorを選択し、New virturl SPOTを選択する
->virtualSPOTが出てくる
virtualSPOTで右クリックしspecify Application jar...を選択し、
Sun/SunSPOT/Demos/EmulatorDemoにあるjarファイルを選択する
virtualSPOTで右クリックしRunMIDletから好きなものを選択する
->プログラムが開始される

NetBeans用プラグインを入れる
**NetBeans IDE 6.0 には対応していないので注意!(Modulesボタンがアクティブにならない)
NetBeans IDE 5.5をインストールする.
SunSPOT Manager のSDKsの下部にあるModulesをクリックする.
->インストール開始
終了するとNetBeansにプラグインが入る.

Javaの環境がない時:jdk1.5.0が推奨されている
jdk1.5.0をインストールする.
環境変数に"JAVA_HOME"を追加、場所にjdk1.5.0*** の場所を指定
環境変数Pathに jdk1.5.0*** のbinの場所を追加する

NetBeansでプログラムを書く
NetBeans 5.5.1を起動する
ファイル->新規プロジェクトを選択
プロジェクトを選択でカテゴリ"一般"、プロジェクト"Sun SPOT Application"を選択し次へ
適当な名前を決め完了する

※manifest.mfを書き換えないといけいない!
左端のウィンドウの"ファイル"タブを選択する.
resource->META-INF->MANIFEST.MFをダブルクリックする
*MANIFEST.MFの中身
MIDlet-Name: SunSpotApplication
MIDlet-Version: 1.0.0
MIDlet-Vendor: Sun Microsystems Inc
MIDlet-1: src/org/sunspotworld/StartApplication, , org.sunspotworld.src/org/sunspotworld/StartApplication
MicroEdition-Profile: IMP-1.0
MicroEdition-Configuration: CLDC-1.1
四行目を変更する
*変更後
MIDlet-1: src/org/sunspotworld/StartApplication, , org.sunspotworld.StartApplication

右端にある"プロジェクト"で右クリック->"プロジェクトを構築"をクリック
->jarファイルが作成される

virtual SOPTで作成したjarファイル("作成したフォルダ/suite"にある)を選択すると実行できる

2008年3月14日金曜日

blogはじめました

研究等の雑記を書いていきます.