2008年11月12日水曜日

[SunSPOT]IO制御

このエントリーをはてなブックマークに追加
SunSPOTのIOポートを利用します.
モーターを回します.
2台のSunSPOT端末を利用します.

1台は,SunSPOT端末で,Z軸の傾きをもう一台のSunSPOT端末に送信します.

受信側では,Z軸がプラス方向の場合は,モーターを正回転,マイナス方向の場合には,逆回転させます.

[送信側SunSpotIOSender.java]
import com.sun.spot.sensorboard.EDemoBoard;
import com.sun.spot.io.j2me.radiogram.*;
import com.sun.spot.sensorboard.peripheral.IAccelerometer3D;
import com.sun.spot.sensorboard.peripheral.ITriColorLED;
import com.sun.spot.sensorboard.peripheral.LEDColor;

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

public class SunSpotIOSender extends MIDlet {

private static final int HOST_PORT = 67;
private final int CENTER = 0;
private final int FORWARD = 1;
private final int BACK = -1;
private final double THRESHOLD = 0.6;
private final int NUM = 30;

protected void startApp() throws MIDletStateChangeException {
RadiogramConnection rCon = null;
Datagram dg = null;
double z;

IAccelerometer3D accelerometer = EDemoBoard.getInstance().getAccelerometer();
ITriColorLED[] leds = EDemoBoard.getInstance().getLEDs();

try {
rCon = (RadiogramConnection) Connector.open("radiogram://broadcast:" + HOST_PORT);
dg = rCon.newDatagram(50);  // only sending 12 bytes of data
} catch (Exception e) {
System.err.println("Caught " + e + " in connection initialization.");
System.exit(1);
}

int[] Zdirects = new int[NUM];
int point = 0;
int Ztransmit = CENTER;

while (true) {
try {
z = accelerometer.getTiltZ();

// Z軸判定
if(point == NUM) point = 0;
if(z > THRESHOLD){
Zdirects[point] = FORWARD;
} else if(z < -1 * THRESHOLD){
Zdirects[point] = BACK;
} else {
Zdirects[point] = CENTER;
}
point++;

if(isSameValues(Zdirects)){
if(Zdirects[0] != Ztransmit){
dg.reset();
Ztransmit = Zdirects[0];
dg.writeDouble(Ztransmit);
rCon.send(dg);
if(Ztransmit == FORWARD){
setLEDGreen(leds);
} else if(Ztransmit == BACK){
setLEDRed(leds);
} else {
setLEDOFF(leds);
}
}
}
} catch (Exception e) {
System.err.println("Caught " + e + " while collecting/sending sensor sample.");
}
}
}

private void setLEDRed(ITriColorLED[] leds){
for(int i = 0; 0 < leds.length; i++){
leds[i].setColor(LEDColor.RED);
leds[i].setOn();
}
}

private void setLEDGreen(ITriColorLED[] leds){
for(int i = 0; 0 < leds.length; i++){
leds[i].setColor(LEDColor.GREEN);
leds[i].setOn();
}
}

private void setLEDOFF(ITriColorLED[] leds){
for(int i = 0; 0 < leds.length; i++){
leds[i].setOff();
}
}

private boolean isSameValues(int data[]){
int start = data[0];

for(int i = 1; i < data.length; i++){
if(start != data[i])
return false;
}
return true;
}

protected void pauseApp() {
// This will never be called by the Squawk VM
}

protected void destroyApp(boolean arg0) throws MIDletStateChangeException {
// Only called if startApp throws any exception other than MIDletStateChangeException
}
}
[受信側 SunSpotIOReceiver.java]
import com.sun.spot.sensorboard.EDemoBoard;
import com.sun.spot.sensorboard.IDemoBoard;
import com.sun.spot.io.j2me.radiogram.*;
import com.sun.spot.sensorboard.peripheral.ITriColorLED;
import com.sun.spot.sensorboard.peripheral.LEDColor;
import com.sun.spot.sensorboard.io.IIOPin;

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

public class SunSpotIOReceiver extends MIDlet {

private static final int HOST_PORT = 67; 
private final int FORWARD = 1;
private final int BACK = -1;

protected void startApp() throws MIDletStateChangeException {
RadiogramConnection rCon = null;
Datagram dg = null;
double Zdirect;

try {
// Open up a server-side broadcast radiogram connection
// to listen for sensor readings being sent by different SPOTs
rCon = (RadiogramConnection) Connector.open("radiogram://:" + HOST_PORT);
dg = rCon.newDatagram(rCon.getMaximumLength());
} catch (Exception e) {
System.err.println("setUp caught " + e.getMessage());
}

// "eDemo"ボードの参照を取得
IDemoBoard eDemo = EDemoBoard.getInstance();

// 汎用入出力ポート(D0)にアクセスするための参照を取得
IIOPin pin0 = eDemo.getIOPins()[EDemoBoard.D0];
IIOPin pin3 = eDemo.getIOPins()[EDemoBoard.D3];
pin0.setAsOutput(true);
pin3.setAsOutput(true);

// eDemoボード上のLEDにアクセスするための参照を取得
ITriColorLED[] leds = eDemo.getLEDs();

while (true) {
try {
// Read sensor sample received over the radio
rCon.receive(dg);
Zdirect = dg.readDouble();

// Zについて
if(Zdirect == FORWARD){
pin0.setHigh();
pin3.setLow();
setLEDGreen(leds);
} else if(Zdirect == BACK){
pin0.setLow();
pin3.setHigh();
setLEDRed(leds);

} else {
pin0.setLow();
pin3.setLow();
setLEDOFF(leds);
}
} catch (Exception e) {
System.err.println("Caught " + e +  " while reading sensor samples.");
}
}
}

private void setLEDRed(ITriColorLED[] leds){
for(int i = 0; 0 < leds.length; i++){
leds[i].setColor(LEDColor.RED);
leds[i].setOn();
}
}

private void setLEDGreen(ITriColorLED[] leds){
for(int i = 0; 0 < leds.length; i++){
leds[i].setColor(LEDColor.GREEN);
leds[i].setOn();
}
}

private void setLEDOFF(ITriColorLED[] leds){
for(int i = 0; 0 < leds.length; i++){
leds[i].setOff();
}
}

protected void pauseApp() {
// This will never be called by the Squawk VM
}

protected void destroyApp(boolean arg0) throws MIDletStateChangeException {
// Only called if startApp throws any exception other than MIDletStateChangeException
}
}
実行結果 IO部分
久々にはんだこてを使いました.
IO部分には,紙などを止めるクリップを使用し,手作り感が満載です.

[SunSPOT]3D加速度の取得

このエントリーをはてなブックマークに追加
Sun Microsystems社が開発したSunSPOTをいじってみました.
SunSPOT(http://jp.sun.com/products/software/sunspot/)


SunSPOTの端末で取得したXYZ軸方向の加速度をBaseStationに転送し,ホストPC上でグラフ化します.
グラフ化にはJFreeChartを使用しました.
JFreeChart(http://www.jfree.org/jfreechart/)

[端末側SunSPOT AccelationOnSunSpot.java]
import com.sun.spot.sensorboard.EDemoBoard;
import com.sun.spot.io.j2me.radiogram.*;
import com.sun.spot.sensorboard.peripheral.IAccelerometer3D;
import com.sun.spot.util.Utils;

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

public class AccelationOnSunSpot extends MIDlet {

private static final int HOST_PORT = 67;

protected void startApp() throws MIDletStateChangeException {
RadiogramConnection rCon = null;
Datagram dg = null;
IAccelerometer3D accelerometer = EDemoBoard.getInstance().getAccelerometer();


try {
rCon = (RadiogramConnection) Connector.open("radiogram://broadcast:" + HOST_PORT);
dg = rCon.newDatagram(50);  // only sending 12 bytes of data
} catch (Exception e) {
System.err.println("Caught " + e + " in connection initialization.");
System.exit(1);
}

double x,y,z;

while (true) {
try {
x = accelerometer.getAccelX();
y = accelerometer.getAccelY();
z = accelerometer.getAccelZ();

dg.reset();
dg.writeDouble(x);
dg.writeDouble(y);
dg.writeDouble(z);
rCon.send(dg);

Utils.sleep(100);
} catch (Exception e) {
System.err.println("Caught " + e + " while collecting/sending sensor sample.");
}
}
}

protected void pauseApp() {
// This will never be called by the Squawk VM
}

protected void destroyApp(boolean arg0) throws MIDletStateChangeException {
// Only called if startApp throws any exception other than MIDletStateChangeException
}
}


[ホスト側BaseStation AccelationOnDesktop.java]
import com.sun.spot.io.j2me.radiogram.*;
import javax.microedition.io.*;

import javax.swing.JFrame;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.DateAxis;
import org.jfree.chart.axis.DateTickMarkPosition;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.labels.StandardXYToolTipGenerator;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.StandardXYItemRenderer;
import org.jfree.chart.renderer.xy.XYItemRenderer;
import org.jfree.chart.title.LegendTitle;
import org.jfree.data.time.Millisecond;
import org.jfree.data.time.TimeSeries;
import org.jfree.data.time.TimeSeriesCollection;

import java.awt.Font;

public class AccelationOnDesktop extends JFrame implements Runnable{
private static final int HOST_PORT = 67;
private Thread th;
private TimeSeries XSeries;
private TimeSeries YSeries;
private TimeSeries ZSeries;

public AccelationOnDesktop(){
initChart();

th = new Thread(this);
th.start();
}

public void initChart(){

//create DataSeries object
XSeries = new TimeSeries("X", Millisecond.class);
YSeries = new TimeSeries("Y", Millisecond.class);
ZSeries = new TimeSeries("Z", Millisecond.class);

TimeSeriesCollection dataset = new TimeSeriesCollection();
dataset.addSeries(XSeries);
dataset.addSeries(YSeries);
dataset.addSeries(ZSeries);

DateAxis domainAxis = new DateAxis("Time");
domainAxis.setTickMarkPosition(DateTickMarkPosition.MIDDLE);

ValueAxis rangeAxis = new NumberAxis("Acceleration");

XYItemRenderer renderer = new StandardXYItemRenderer();
renderer.setToolTipGenerator(StandardXYToolTipGenerator.getTimeSeriesInstance());

XYPlot plot = new XYPlot(dataset,domainAxis,rangeAxis,renderer);
plot.getRenderer().setToolTipGenerator(StandardXYToolTipGenerator.getTimeSeriesInstance());

JFreeChart chart = new JFreeChart("XYZ Acceleration", JFreeChart.DEFAULT_TITLE_FONT, plot, true);
LegendTitle legend = chart.getLegend();
legend.setItemFont(new Font("Ariel", Font.BOLD, 20));
ChartPanel cPanel = new ChartPanel (chart);

this.add(cPanel);
}

public void run() {
RadiogramConnection rCon = null;
Datagram dg = null;
double x,y,z;

try {
rCon = (RadiogramConnection) Connector.open("radiogram://:" + HOST_PORT);
dg = rCon.newDatagram(rCon.getMaximumLength());
} catch (Exception e) {
System.err.println("setUp caught " + e.getMessage());
}


while (true) {
try {
rCon.receive(dg);
x = dg.readDouble();
y = dg.readDouble();
z = dg.readDouble();

XSeries.add(new Millisecond(), x);
YSeries.add(new Millisecond(), y);
ZSeries.add(new Millisecond(), z);  
} catch (Exception e) {
System.err.println("Caught " + e +  " while reading sensor samples.");
}
}
}

public static void main(String[] args) throws Exception {
AccelationOnDesktop aod = new AccelationOnDesktop();
aod.setSize(600,300);
aod.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
aod.setVisible(true);
}
}

実行結果

2008年7月30日水曜日

Javaからネイティブコードを生成する方法

このエントリーをはてなブックマークに追加
Javaでネイティブな実行ファイル(コード)を作成する方法をご紹介します.

構築環境はUbuntu 8.0.4です

準備:
GCJ (GNU Compiler for Java)をインストール
% sudo apt-get install gcj


ちなみにapt-getを使う際,プロキシを介すネットワーク環境の場合
以下のように設定ファイルを作る必要があります.
% sudo vim /etc/apt/apt.conf

Acquire {
http::proxy "http://[username]:[password]@[proxy_addr]:[port]/"
}




gcjのインストール後,[% gcj -v]等で正しくインストールされ,パスも通っているか確かめます.


プログラム作成:
以下のようなサンプルプログラムを作成します.
//Hello.java
public class Hello{
public static void main(String[] args){
System.out.println("hello World");
}
}

コンパイル:
方法1:オブジェクトファイルを作らずコンパイルする方法
% gcj --main=Hello -o Hello.exe Hello.java

方法2:オブジェクトファイルを作成してコンパイルする方法
% gcj -c -o Hello.o Hello.java
% gcj --main=Hello -o Hello Hello.o

以上です.Swingやawt等のGUIを作成しようするプログラムはうまく動作しないことがあるみたいです.

2008年7月11日金曜日

JavaからWin32APIをたたく方法

このエントリーをはてなブックマークに追加
JavaからWin32APIを呼ぶ方法を調べたのでメモしときます
(Cとかで書け、というツッコミは御勘弁)

JavaからC系の言語を使用するための方法として
JNI(Java Native Interface)が存在します。

Win32APIを使用するCのプログラムコードを書き、
それをJavaからこのJNIを利用することで、間接的にJavaからWin32APIを使用することが可能となりますが、JNIは使用するまでに多くのステップ数を踏む必要があります。



そこで、Win32APIをJavaから利用するためのライブラリを使用します。

そのライブラリはEclipseのPluginsディレクトリ内に存在する「org.eclipse.swt.win32.win32.x86_[バージョン].jar」です。

このjarファイルにクラスパスを通し、importすることで、ライブラリを利用することができます。
(Eclipseでjarファイルにクラスパスを通す場合は[プロジェクト名を右クリック]-[Build Pass]-[Add External Archives]です)

/////////////////////
サンプルプログラム
/////////////////////
//Main.java

import org.eclipse.swt.internal.win32.OS;

public class Main {
static void process() {
int hDC = OS.GetDC(0);
try {
for (int i = 0; i < 500; i += 1) {
OS.MoveToEx(hDC, 0, i, 0);
OS.LineTo(hDC, 500, 500 - i);
try {
Thread.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} finally {
OS.ReleaseDC(0, hDC);
}
}

public static void main(String[] args) {
process();
}
}

参考サイト:
http://homepage2.nifty.com/igat/igapyon/diary/2005/ig051228.html
http://d.hatena.ne.jp/unageanu/20070518

2008年6月29日日曜日

論文発表

このエントリーをはてなブックマークに追加
4月の下旬にFIT2008情報科学技術フォーラムに投稿した論文が採択されました.

9月2日に慶応大学の湘南藤沢キャンパスで発表してきます.
頑張ります.


学部4年の間に後2,3回外で発表し,採択かどうかに関わらず1本英語論文を書いてみたいな.
これを目標に頑張ります(もちろん,研究内容がしっかりしたものじゃないとダメだと思うけど)


ちなみに発表会のリストなるものを研究室の先生に教えてもらったので記載します
http://www.ipsj.or.jp/cgi-bin/ipsj_calendar.cgi


↓ここらへんが日程的によい気がするので,前向きに考えていきたいと思います.

マルチメディア通信と分散処理ワークショップ(山口)
http://www.dpsws.org/2008/WS/

NSDI (ボストン)
http://www.usenix.org/events/nsdi09/cfp/cfp.html

2008年5月28日水曜日

分散(第1章)

このエントリーをはてなブックマークに追加



「分散システム 原理とパラダイム」
アンドリュー・S. タネンバウム (著), マールテン・ファン スティーン (著), Andrew S. Tanenbaum (原著), Maarten van Steen (原著)

↑の本を読むことになったので、まとめていきます
今回は第1章



■分散システムの定義
分散システムはそのユーザに対して単一のコヒーレントシステムとして見える独立したコンピュータの集合である。

例1)大学や会社部署におけるワークステーションのネットワーク
例2)注文の自動処理を支援する作業フロー情報システム
例3)World Wide Web


■目標
○ユーザとリソースとの接続
例えば、1つのプリンタを複数ユーザで共有

○透過性
プロセスやリソースが複数のコンピュータにまたがって物理的に分散されている事実を隠蔽したい。

○開放性
インターフェース定義が重要
メカニズムからポリシーの分離

○スケーラビリティ
拡張のし易さ


■ハードウェア概念
○マルチプロセッサ
全てのCPUは共有メモリに直接アクセス


○同種マルチコンピュータシステム
各CPUはそれ自身のローカルメモリを持つ

○異種マルチコンピュータシステム
分散システムの多くはコレ


■ソフトウェア概念
○分散オペレーティングシステム
-ユニプロセッサオペレーティングシステム
CPUが1つだけのコンピュータを管理

-マルチプロセッサオペレーティングシステム
CPUが複数のコンピュータを管理

-マルチコンピュータオペレーティングシステム

-分散共有メモリシステム

■ミドルウェア
分散透過性を改善するために用いられるソフトウェアの付加的な層

○ミドルウェアモデル

○ミドルウェアサービス
-通信機能
-アクセス透過性
-名前付け
-永続性

■まとめ
分散システムは共同で動作する
○利点
-異なるコンピュータで動作する異なるアプリケーションを単一のシステムに統合しやすくなる
-分散システムは下位にあるネットワークの大きさに比して大規模化しやすい

2008年5月2日金曜日

Stubを用いないRMI通信

このエントリーをはてなブックマークに追加
/////////////////////
クライアント用プログラム
/////////////////////
//Client.java
import java.rmi.Naming;

public class Client {
public static void main(String[] args) {
if(args.length != 1){
System.err.println("% java -option Clinet IP_ADDRESS");
return;
}

try {
Hello stub = (Hello) Naming.lookup("rmi://" + args[0] + "/Hello");
String response = stub.sayHello();
System.out.println(response);
} catch (Exception e) {
e.printStackTrace( );
}
}
}



/////////////////////
サーバ用プログラム
/////////////////////
//Server.java
import java.rmi.registry.Registry;
import java.rmi.registry.LocateRegistry;
import java.rmi.server.UnicastRemoteObject;

public class Server implements Hello {
public String sayHello( ) {
return "Hello World!";
}

public static void main(String args[]) {
try {
Server obj = new Server();
Hello stub = (Hello)UnicastRemoteObject.exportObject(obj, 0);

Registry registry = LocateRegistry.getRegistry();
registry.bind("Hello", stub);

System.out.println("Server ready");
} catch (Exception e) {
e.printStackTrace( );
}
}
}



/////////////////////
共通プログラム
/////////////////////
//Hello.java
import java.rmi.Remote;
import java.rmi.RemoteException;

public interface Hello extends Remote {
String sayHello() throws RemoteException;
}



サーバ側のディレクトリ構造
(例では,C:\work内にServer.classとHello.class,C:\codebase内にHello.classを配置)
// 配置
C:-+-work-------+-Server.class
| |
| +-Hello.class
|
+-codebase---+-Hello.class


// サーバ側コマンド
// 適当な箇所でレジストリを立ち上げる
// 例では,Cの直下でレジストリを立ち上げている
C:\>rmiregistry

// rmiregistryとは別のコマンドプロンプトを立ち上げる
// 例では,C:\work内
C:\work>java -Djava.rmi.server.codebase=file:///C:\codebase\ Server




クリアント側のディレクトリ構造
(Client.classとHello.classを同じディレクトリに配置)
// 配置
-+-Client.class
|
+-Hello.class


// クライアント側コマンド
java Client [サーバのIPアドレス]

2008年5月1日木曜日

javax.tools

このエントリーをはてなブックマークに追加
プログラムからプログラムをコンパイル&呼び出す方法について
(IEでソースをコピーすると改行が崩れるので,そういう人はFireFoxで)

実行環境:JDK 6

呼び出すプログラム


//Main.java

import java.io.File;

import javax.tools.JavaCompiler;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;
import javax.tools.JavaCompiler.CompilationTask;

import java.lang.reflect.Method;

public class Main {

// プログラムをコンパイルする
static void compile(String fileName) {
// 1. JavaCompiler インスタンスを取得.
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
if(compiler == null) {
System.out.println("Compiler is not provided.");
return;
}

// 2. java.io.File ベースのファイル・マネージャ.
StandardJavaFileManager fileManager =
compiler.getStandardFileManager(null, null, null);

// 3. コンパイルするソース・ファイル.
File[] sourceFiles = { new File(fileName + ".java") };

// 4. コンパイル・タスクを取得する.
CompilationTask task = compiler.getTask(
null, fileManager, null, null,
null, fileManager.getJavaFileObjects(sourceFiles));

// 5. コンパイル・タスクを実行し, 結果を表示する.
boolean result = task.call();
if(!result){
System.out.println("Compile error");
return;
}
}

// リフレクションを用いて,メソッドを呼び出す
static void reflect(String fileName , String methodName)
throws Exception{
// クラスを取得
Class cls = Class.forName(fileName);
// メソッドを取得
Method method = cls.getMethod(methodName,null);
// メソッドを実行
method.invoke(cls.newInstance(),null);
}

public static void main(String[] args) throws Exception {
if(args.length != 2){
System.out.println("%java -option Main FILENAME METHODNAME");
};

compile(args[0]);
reflect(args[0], args[1]);
}
}



呼び出されるプログラム

//Test.java

public class Test {
public void print(){
System.out.println("hello");
}
}


コンパイル 方法
C:\MyPrograms\Java\jdk1.6.0_03\libの部分は環境によって変える

set lib=C:\MyPrograms\Java\jdk1.6.0_03\lib
javac -cp .;%lib%\tools.jar Main.java
java -cp .;%lib%\tools.jar Main Test print


<参考URL>
javax.tools を使って動的アプリケーションを作成する
TECHSCORE

2008年4月26日土曜日

FIT投稿

このエントリーをはてなブックマークに追加
情報処理学会主催の2008 第7回情報科学技術フォーラム(FIT)に論文を投稿しました.
参照URL:http://www.ipsj.or.jp/10jigyo/fit/fit2008/index.html

査読に通れば,発表ということになります.

2008年4月21日月曜日

論文締切

このエントリーをはてなブックマークに追加

FIT2008 第7回情報科学技術フォーラムの査読付き締め切りは4/24の15:00。

長い(であろう)研究生活の第一歩。

難しいと思うけど、Acceptしてくれるといいなぁ~。

もう一息!!

(か、二息か三息か・・・)

2008年4月13日日曜日

心構え

このエントリーをはてなブックマークに追加
(技術情報なし)

中山和久という人が書いた文章だったんだけど,リンク切れでうまく表示できなかったので,Googleのキャッシュからコピペ・・・

いくつかいい言葉があるな



1. 全世界のバイオの力を総結集して世界の富を全部集めても、大腸菌一つもとからは作れない。これは厳然たる事実で、なぜできないのかといえ  ば、「大腸菌様」がなぜ生きているのかが、科学的に分からないからです。まして、人間がどうして生きているかは、私は99パーセント分からないと思う。(中略)しかし、それは神というよりも、サムシング・グレートとしか言いようがない。
(解説:筑波大学時代の恩師M先生の著書からの引用。生きていることって本当に不思議です。生命科学の研究者としては生きていることの本質に少しでも迫りたいものです。でもそこにたどり着くのは長い道のりです。)

2. ライフサイエンスに絶対はない
(解説:生きていることはファジーです。簡単には割り切れない生命現象はたくさんあるでしょうし、まったく予想もつかないようなことが起こっているのかもしれません。)

3. 種の無いところに木は生えぬ
(解説:どんな天才でも、何もないところから新たな発想をすることはできません。普段勉強して得た基礎知識をもとにして、新たな発想が生まれます。)

4. アンテナは大きいほど良い
(解説:自分のやっている狭い研究分野だけにとらわれることなく、いろんなことを勉強しましょう。バックグラウンドが広ければ広いほど、柔軟な発想が生まれてきま す。それに、今やっている研究を一生続ける訳ではありません。いろんなことに興味を持ちましょう。)

5. 中原をめざす
(解説:研究をする際には、枝葉のことにはあまりとらわれずに、まずはその現象の本質を見極めましょう。)

6. 「100打ったうちの1つ当たりゃ 一流の研究者や! 10打ったうちの1つ当たりゃ 超一流の研究者や!!」
(解説:大学院生時代にN先生から何度も聞いた言葉。研究は試行錯誤の連続です。失敗にめげてはいけません。)

7. 嘘からでた真
(解説:実験をやって予想通りの結果が得られることは少ないですが、失敗したと思った予想外の結果のなかに真実が隠されているかもしれません。失敗だと思った実験 のデータをゴミ箱に捨てることなく、ちゃんと記録に残しておきましょう。)

8. 1日10歩 3日で30歩 30歩進んで 20歩下がる
(解説:実験がうまくいかない時には、もう一度元に戻って良く考えてみましょう。何かヒントが思い浮かぶかもしれません。)

9. 棚から落ちたボタ餅を確実に拾う
(解説:セレンディピティー serendipity を確実にものにするのも研究者としての大切な資質です。)

10. ピペットマン持っては日本一の 夢も大きなサイエンティスト 世界を相手に勇気を持って 中央突破を試みる 頑張れ! 強いぞ! 僕らの仲間 京大.....
(解説:研究をやっていると、海外の研究室との競争になることはしばしばです。毎日がオリンピックみたいなものです。昔懐かしいアニメの主題歌のメロディーに乗ってこの歌を口ずさみ、真っ向勝負を挑みましょう。)

11. 先生の背中 先輩の背中
(解説:先生や先輩から見習う点は多いものです。もちろん、見習わない方が良いこともありますが....)

12. 何は友あれ
(解説:研究仲間は将来にわたって大切な存在です。コンビニ弁当を一人で食べるだけではなく、仲間と一緒にメシを食ったり酒を飲んだりしながら、研究のことや将来のことやくだらない世間話に花を咲かせましょう。将来、きっと自分の財産になるはずです。)

13. 聞くは一時の恥、聞かぬは一生(末代)の恥
(解説:知らないことを恥じる必要はまったくありません。先生や先輩にドシドシ質問して自分の糧としましょう。質問せずにずっと知らないままでいることほど損なことはありません。聞く勇気を持ちましょう。)

14. 僕はここにいる
(解説:研究をやっていく上で自己満足できるかどうかが最も重要ですが、他己満足(他人からの評価)が得られなければ研究を継続できません。自分の存在をどのぐらいアピールできるかはとっても大切です。自分の研究内容を人にわかりやすく伝えましょう。)

15. 今 古い船を動かせるのは 古い水夫じゃないだろう
(解説:フォーク少年だった頃によく聴いた吉田拓郎の「イメージの詩」の一節。人それぞれに感じ方は違うと思いますが、何となく意味は伝わるでしょう。)

16. もう一息
  もう一息と言ふ処でくたばつては
  何事もものにならない。
  もう一息
  それにうちかつてもう一息
 それにも打ち克つて
  もう一息。
  もう一息
  もうだめだ
  それをもう一息
 勝利は大変だ
  だがもう一息。
(武者小路実篤『もう一息』解説:掛谷秀昭先生のシンポジウムでの発表の最後のスライドで、とっても印象的でした。)

2008年4月12日土曜日

Javassist

このエントリーをはてなブックマークに追加

千葉 滋氏(東京工業大学・大学院情報理工学研究科 )開発

バイトコード(クラスファイル)を直接操作することのできるライブラリ.

これはどういうことかと言うと,普段プログラムを作る際には,Javaプログラム(*.java)をコンパイルし,クラスファイル(*.class)を得る.これをJAVA VM上にロードすることにより実行する.

Javassistでは,プログラムを変更することなく(また,コンパイルすることなく)クラスファイルを操作することができる.

例として,何の機能を持たないA.javaを用意する.

[A.java]

public class A{

}

A.javaをコンパイルしたA.classはこのようになる.(実際はバイトコードなので見ることはできない)


[A.class(編集前)]

public class A extends java.lang.Object{
public A();
}


このA.classに対し,Javassistを用いたMain.javaにて編集を行ってみる.

[Main.java]


import javassist.*;

public class Main {
public static void main(String[] args) throws Exception {
ClassPool cp = ClassPool.getDefault();
CtClass cc = cp.get("A");

// フィールドの追加
CtField f1 = CtField.make("int x;", cc);
cc.addField(f1);

// メソッドの追加
CtMethod m = CtNewMethod.make(
"public String toString() {" +
" return \" abcde \"; }", cc);
cc.addMethod(m);

// クラスファイルの更新
cc.writeFile();
}
}


Mainプログラムを動かすとA.classの中身は以下のようになる.

[A.class(編集後)]

public class A extends java.lang.Object{
int x;
public A();
public java.lang.String toString();
}

このようにJavassistを用いることにより,バイトコードにフィールドの追加やメソッドの追加などの処理を行うことができる.

他にも,いろんなことができるみたいなので,↓ページをご覧くらはい.

http://www.csg.is.titech.ac.jp/~chiba/notes/javapress03/index.html

(Javassist -- Java バイトコードを操作するクラスライブラリ -- 入門)



2008年4月11日金曜日

テスト

このエントリーをはてなブックマークに追加
テストです.