2010年12月15日水曜日

Javaでグラフを作る方法 - Java

あるデータをプログラムで解析するときにグラフで表示できたらいいよなー

というわけでJavaでグラフを作る方法です。


eclipseとJFreeChartを使います。

JFreeChartのプロジェクトページ(http://www.jfree.org/jfreechart/)から最新版のものをダウンロードして解凍します。(今回はjfreechart-1.0.13で説明します)

解凍したら、jfreechart-X.X.X\lib の中にあるjfreechart-X.X.X.jarとjcommon-X.X.X.jarをeclipseのJavaプロジェクトのフォルダ直下に入れておきます。
プロジェクトを右クリックし、Properties → JavaBuildPath → Libraries → AddJARs をクリックし、jfreechart-X.X.X.jarとjcommon-X.X.X.jarを選択し、OKをクリックします。

これで、JFreeChartを使ってグラフが書けるようになります。


さてどう使うかというと、プログラムを見たほうが早いと思います。

参考資料に簡単なのが乗っててわかりやすかったです。


参考資料
1.ThinkIT「JFreeChartでグラフ作成(前編)様々なグラフ 」

2010年12月1日水曜日

近況

ついに、12月1日になりました。

ついに、待ちに待ったモンハンPSP3rdが発売しました。まだ買ってないけどーORZ

龍馬伝が終わりました。


そして、卒論の期限があと2ヶ月くらい…
そろそろ本腰入れていかないとまずい時期ですね。
とりあえず、タイトル、目次(暫定)が完成し、これから中身を埋めていこうというところです。
うちは卒論の総ページ数が30ページですので15分の1ができたとこ…ORZ

付録のプログラムは、7割がたできてるのでなんとかなりそうかな?
しかし、プログラムの評価とかも考えていかなければならないの大変です。

2010年11月21日日曜日

Concurrency Utilities - Java

OverlayWeaverのIterativeRoutingDriverクラスのrouteメソッドを読んでいて思ったこと。
java.util.concurrent.ExecutorServiceってなんだ?

ってことで調べてみました。


まず、並行プログラミングをするとき、よくThreadクラスを使って行いますね。しかし、これを使いこなすのはちょっと難しい。ってことで、J2SE 5.0からは並行プログラミングを容易にするのためのライブラリConcurrency Utilitiesが導入されました。これで、スレッドを簡単に?操れるみたい。
(ライブラリは、java.util.concurrentに含まれています。)


そんでExecutorServiceというのは、そのライブラリの中に含まれているタスクの非同期実行を担当するExectuorインターフェイスの派生インタフェースです。
そして、実際に使用するのはその実装クラスであるThreadPoolExecutorクラスで、これを利用するとスレッド・プール方式での処理が実行可能となる。(参考資料2のイグゼキュタの仕組みの項目を見るとわかりやすいです。)

詳しい説明は、参考資料を見てください。

いや、別に説明するのがめんどくさいわけではないんだからね。ξ゚⊿゚)ξ


とりあえず、勉強がてら作ってみたプログラムを載せときます。

import static java.util.concurrent.TimeUnit.MILLISECONDS;

import java.util.Date;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class ThreadPoolExecutorTest {

 public static void main(final String[] args) {
  new ThreadPoolExecutorTest().start();
 }

 public void start() {
  System.out.println("開始");

  // Runnableを使う場合
  final BlockingQueue queue = new LinkedBlockingQueue();
  for (int i = 0; i < 10; i++) {// タスクをqueueに事前に積んでおき実行することができる
   queue.add(new Task(1));
  }

  System.out.println("タスク実行その1");
  final ExecutorService executerService = new ThreadPoolExecutor(3, 3,
    500, TimeUnit.MILLISECONDS, queue,
    new ThreadPoolExecutor.CallerRunsPolicy());
  
  System.out.println("タスク実行その2");
  for (int i = 0; i < 10; i++) {
   executerService.execute(new Task(2));// タスクの実行
  }
  
  // Callableを使う場合
  System.out.println("タスク実行その3");
  int timeout = 1000;
  for (int i = 0; i < 10; i++) {
   if (i == 5) {
    timeout = 50;
   }
   Future future = executerService.submit((Callable) new Task(3));// タスクの実行
   try {
    // タスクの結果を取得する。ただし、設定した時間までに処理が終わらなかったらタイムアウトする。
    Date time = (Date) future.get(timeout, TimeUnit.MILLISECONDS);
    System.out.println("タスク終了時間: " + time);
   } catch (InterruptedException e) {
    e.printStackTrace();
   } catch (ExecutionException e) {
    e.printStackTrace();
   } catch (TimeoutException e) {
    System.err.println("タスクがタイムアウトしました");
    e.printStackTrace();
   }
  }

  // 必ずshutdownを実行する。実行しないとスレッドが開放されない。
  System.out.println("ShutDown実行。");
  executerService.shutdown();
  System.out.println("終了");
 }

 private static class Task implements Runnable, Callable {
  int taskNumber = 0;

  Task(int taskNumber) {
   this.taskNumber = taskNumber;
  }

  @Override
  public Date call() {
   try {
    System.out.println(taskNumber + "タスク開始");
    MILLISECONDS.sleep(100L);// 100 ミリ秒のスリープ
    System.out.println(taskNumber + "タスク終了");
   } catch (InterruptedException e) {
    e.printStackTrace();
   }
   return new Date();
  }

  @Override
  public void run() {
   try {
    Date time = this.call();
    System.out.println(taskNumber + "タスク終了時間:" + time);
   } catch (Exception e) {
    e.printStackTrace();
   }
  }
 }
}

参考資料
1. 「Java SE 6完全攻略」第49回 Concurrency Utilitiesの変更点 その1 
2. 第6回 並行プログラミング用ライブラリ(1)――Excecutorの仕組み

2010年11月20日土曜日

プロセス、スレッド、タスクの違い - Java

ちょっと気になったので、メモっときます。

プロセス(Process:手順、処置)
 プログラムの実行単位です。プロセスは1つ以上のスレッドと、ファイル、ヒープメモリなどのリソースで構成される。マルチプロセスと言うと、1つのOS上で同時に複数のプログラムを並行して動かせる機能。

スレッド(Thread:糸)
 プロセス(プログラム)内の処理単位です。マルチスレッドと言うと、1つのプロセス内で同時に複数の処理を行える機能。

タスク(Task:仕事の単位)
 プロセス内の実行単位です。(←推測です。Timerクラスのドキュメントを見ると、「タスク実行スレッド」という言葉が使われているからという理由、(゚_゚i))
 ちなみに、Timerクラスでは、TimerTask(implements Runnable)型のインスタンスをscheduleメソッドに入れて、何秒後に実行とか、何秒ごとに実行とかができるみたいですね。


参考資料
1.プロセス、スレッド、ファイバ、タスク、ジョブ、違いを整理してみようAdd Star

2010年10月6日水曜日

今日はCEATEC JAPAN 2010 に行ってきました。

見てきたもの(一部省略)

3D
1.SHARP
3D映像を体験できました。風景やCGキャラなどは立体的に見えてすごかったです。
しかし、人間やアニメのキャラクターが出るシーンは、2Dのキャラと背景に高低差を付けただけなかんじで微妙でした。
 あと、クアトロンという4原色のディスプレイも見てきました。従来のものと比較するとすごくきれいになって驚きました。やばいです。

2.SONY
  3D大画面LEDがすごかったです。臨場感もあり、風景の映像が流れるとほんとにそこにいるような感覚になってやばかったです。
また、リアルタイムで3D映像に変換しそのままディスプレイに流すという技術もすごかったです。

3.東芝
普通の2Dゲームを3Dにリアルタイムで変換し、プレイするというのがすごかった。あと、裸眼3Dなるものがあったらしいのだが、2時間待ちとかであきらめました。


グリーンIT
1.NISSAN
    ソーラーツリーというのがありました。名前のとおりソーラーパネルを葉に見立てたもので、太陽の向きにその葉を向けて発電効率を上げようというもの。あとソーラーパネル(葉の部分)が透明になっていてデザインもよかったです。
電気自動車の未来的な話もしてました。自動車が道路を走りながらワイヤレスに充電できたり、自動車同士で通信しあって衝突しないようにするというものでした。これは、デモがあったのですが実際の車は使わず、eporo というロボットでやっていました。

2.FUJITSU
スマートグリッドとかホームネットワークのお話。スマートグリッドは、各家庭にスマートメーターを取り付けてスマートメーター同士でアドホックネットワークを構築して電力状況を確認するというもの。
ホームネットワークというのは、家の中にサーバーを一つおいてエネルギー利用を最適化するといったものでした。


NGN
1.NTT
  VOIPとかSIPの話。電話にIPが使われてるということと、その通信プロトコルにSIPが使われているというもの。


クラウドとか
なんか微妙でした。


半導体デバイスとか
がんばったけど、よくわからなかった。


その他?
1.知識創成コミュニケーション研究センター
概念辞書がおもしろかったです。検索した言葉の多様な意味的関係をWebから取得するというもの。ガンダムのパイロットを検索してて、知ってるキャラがちらほらとww

2.YAMAHA
ボーカロイドのポスターがあってそっから声が出てくるというもの。そのポスターが通路に一定間隔で置かれてたので、その通路を通ってったら飲食コーナーがあった。
あと、YAMAHAブースにはミクと誰か?のコスプレイヤーもいましたw


こんなかんじです。

あとは、おみやげをたくさんもらってきました(笑)
手さげ袋が3つ。
ボールペンが3つ。
ペン消しゴムが2つ。
メモ帳っぽいのが2つ。
携帯ストラップが1つ。
昆布キャラメルが1箱。

2010年10月4日月曜日

近況

先日、大学院の合格が決まりました。
やったね!!


今やってること
1.卒研「P2P関連のこと?」
2.授業の課題「パズルゲーム作ってる」、10月19日まで
3.授業の課題2「パブリックコメントの1505番と1506番を出す。」、10月22日まで
     1505番「クラウド対応型セキュリティ対策技術の研究開発
     1506番「国際連携によるサイバー攻撃予知・即応技術の研究開発


最近読んだ本
1.Javaネットワークの真髄(途中で挫折ORZ)
2.ルー・ガルー(分厚いけど中身はスラスラ読めて面白かった。近未来ICT、推理、戦闘もの?)
3.数学ガール(読み途中、頭使うのでおもしろいです。けど中盤からよくわかんなくなってきた)


ポケモン
四天王2回目クリア、シロナも倒した。けど伝説ポケはレシ、ビク以外放置。
いまは、新環境の状況整理。


夏アニメが終わって、秋アニメがはじまた。

いそがしいw

2010年10月2日土曜日

ネットワーク勉強中

IPアドレス(ネットワークアドレス + ホストアドレス)
コンピュータのネットワークインターフェイスコントローラ(NIC)に一つまたは複数のIPアドレスが付けられます。

ポート(1~65535)
そのホスト内の個々のネットワークサービスを表す1~65535の数値。
通常、パケットにはポート番号が書かれており、 そのパケットの行き先サービスを指定します。(たとえば、Webでは80番ポートを使うよう決まっている)
既定ポート:1~1023
登録ポート:1024~49151

ソケット{ IPアドレス, ポート }
ホスト上の各通信サービスと外部を結ぶ通信接点。ソケットにはローカルホストのIPアドレスとサービスを表すポート番号が結びついています。


TCP
TCPのコネクションは、パケットの中にあるフラグを使っておこなわれます。
TCP(Transmission Control Protocol)、transmission(送ること、伝送)

例:クライアント・サーバー
通信の始め方
クライアント「サーバーへSYNフラグをセットしたパケットを送信。」
サーバー「クライアントにSYN/ACKフラグをセットしたパケットを送信。」
クライアント「サーバーへACKフラグをセットしたパケットを送信。」

やり取り
クライアント「サーバーへRequestデータを送信」
サーバー「クライアントにACKフラグをセットしたパケットを送信。」
サーバー「クライアントにReplyデータを送信。」
クライアント「サーバーへACKフラグをセットしたパケットを送信。」

通信の終わり方
クライアント「サーバーへFINフラグをセットしたパケットを送信。」
サーバー「クライアントにACKフラグをセットしたパケットを送信。」
サーバー「クライアントにFINフラグをセットしたパケットを送信。」
クライアント「サーバーへACKフラグをセットしたパケットを送信。」

用語リスト
SYN:Synchronize(同期信号)
ACK:Acknowledge(確認応答)
Request(要求)
Reply(返事)
Fin:Finale(終局)


UDP(User Datagram Protocol)、Datagram(一回の送信内容)
TCPのような接続の確立や確認がなく、いきなりデータ本体を相手に送る。
ブロードキャストアドレスに対して送信できる。(TCPはできない)


ルーティング
後で書く?


参考文献
1. エズモンド・ピット著 「JAVAネットワークプログラムの真髄」
2. パソコンおやじ「TCP/IP通信の概要」

2010年9月20日月曜日

近況

一昨日は、大学院進学の内部推薦の面接でした。
聞かれたこと
1.進学理由
2.卒研について
3.得意な科目、不得意な科目
4.大学院に入ったらどういうことをやりたいか
5.大学院卒業後どういったことをやりたいか
たぶん、一通り答えられた気がする。


昨日は、埼玉県警札の採用試験(1次筆記)を受けてきました。

結果は惨敗…ORZ
教養試験では、時間内に全て解けなくて適当に塗りつぶしていた。
論文試験では、これも時間内に書ききれず、文が途中で途切れて終わってしまった。あと、内容も変なこと書いた気がする。
適正試験は、普通にできたw


最近、ぜんぜんブログ更新していませんでしたが、この試験の勉強をしていたからです。
おかげで、一般常識的なものが身についた。気がする。


ところで、

一昨日ポケモンBWが発売したわけですが、ようやく今日できるようになりました。
そして、今日はずっとポケモンやってました。
プレイ時間9時間くらいww
あと一週間ぐらいは、またブログを更新できなさそうだ。

2010年8月28日土曜日

MapReduceを勉強しよう - Java

MapReduceというのは、最近注目されているGoogleの分散処理アルゴリズムです。
最近って言っても2年以上前ですけどね…ww


始めに、MapReduceの処理はMapフェーズとReduceフェーズに分かれます。
Mapフェイズで、入力データを分割して処理。
Reduceフェイズで、処理したデータをまとめます。


まずはMapReduceの理解を深めるために、
ある小銭の束の合計金額をMapReduceの考え方を使って求めてみましょう。
1. Mapフェイズ
小銭を1,5,10,50,100,500円のグループに分けてそれぞれの枚数を数えます。そして、グループごとの合計金額を計算します。
2. Reduceフェイズ
グループごとの合計金額を全て足して、小銭の束の合計金額が求まります。

しかし、これだけだとMapReduceのすごさはちょっとわかりずらいですね。
じゃあもう少しスケールアップしてみましょう。

さて、小銭の数がもし50枚程度なら一人でもこの合計金額を計算することは簡単でしょう。
しかし、もし小銭が10000枚あったらどうでしょうか?

一人では大変ですよね。

じゃあ、6人でやりましょう。

私は1円、君は5円、ユーは10円、あなたは50円、お前は100円、あんたには500円をそれぞれ数えてもらいます。

最後に、みんなの求めた金額を足せば合計金額が求まります。
わかったかな?
このような分散処理の考え方がMapReduceというわけです。




さて次は、このMapReduceをJavaを使って体験してみましょう。

参考文献1を見て体験してください。


個人的には参考文献1のMapReduceはなんか違うなーって思ったんだけど
まあいいか、
一応、自分なりの解釈でメモ書きしておきます。


「ある文字列の英字をカウントする」プログラムについて考えます。

1. 準備
ある文字列は「abcaba」とします。
値を保持するためのMapEntryクラスを用意します。
MapEntry
char key;
int value;
2. Mapフェイズ
文字列を一文字ずつ読み取り、keyが文字、valueが1であるMapEntryオブジェクトを生成して、LinkedListに格納していきます。
abcaba
111111
MapEntryオブジェクトをソートします。
aaabbc
111111
このリストをa,b,cのグループに分けてさらに別のリストに格納します。 (入力データを分割)
  a  | b |c
aaa|bb|c
111|11|1

あとはa,b,cの要素ごとにカウント。

3. Reduceフェイズ
カウントした数をデータ保存用の配列に格納。そして、必要とあらば出力。


こんな感じかな。
MapとReduceの境目が微妙だけど…


参考文献
1. @IT「GoogleのMapReduceアルゴリズムをJavaで理解する」

2010年8月19日木曜日

近況 - 雑談

最近、勉強していませんでした。

なぜかって夏休みですからね、アニメ見たり、マンガ読んだり、ラノベ読んだりしてました。あとお盆のお墓参りで5日ほど帰郷していました。

しかし、いくら夏休みと言っても遊びすぎは良くありませんね。
そろそろ勉強とか再開しないと。
そして、いいかげん卒研も進めないとヤバそうです。


話は変わりますが、最近不景気ですね。
どうして不景気になってしまったのか自分なりに考えていました。
暇だったので…いや、別に勉強のやる気が起きないからじゃないよ。
あと、足りない知識は想像で補っています。

まず不景気とは、
別に世の中のお金が減っているわけではないんですね。売買や取引が少なくなってお金が回らなくなっているということなんです。といっても稼いでる人はたくさん稼いでるわけなのですが、その人たちがお金を使わずためこむからお金が回らなくなり不景気になるわけですね。

じゃあどうすれば景気が良くなるのでしょうか?
お金をたくさん稼いでる人が、たくさん稼いだ分だけお金を使えばいいのです。
しかし、さすがに人にお金を使わせるのはなかなか難しいことです。
というわけで、たくさん稼いでる人や企業からはたくさん税金を取って国民に還元(経済対策)すれば解決しそうなきはするのですが、なかなかうまくいかないみたいですね。

しかしなぜ景気が回復しないのでしょうか?
それは、国単位での景気対策でしかないからでしょう。一つの国で景気対策してお金をばらまいても他の国のほうにお金が回ってしまえばたいして意味が無いのです。
そして、そんな中で稼いでる国はちゃっかり稼いでいるんですね。ということは、お金をたくさん稼いでる国が、たくさん稼いだ分だけお金を使えばいいのです。しかし、さすがに国にお金を使わせるのは本当に難しいことです。

さて、どうしようか。

2010年8月7日土曜日

昨日の見たサマーウォーズについて - 雑談

ネタバレ注意。


っといってもストーリーはスルーで、ITネタだけ拾ってきます。

・OZ
イメージとして、セカンドライフ+グーグル+マイクロソフト+…
ってかんじかな。独占禁止法に引っかかるしww 

・暗算で、年月日をから曜日を算出
やり方は、ツェラーの公式 を使うようです。日付を代入するだけなので3分もあれば私でも出来る気はするのですが、暗算は無理そうです。

・健治が解いた暗号
2056桁(10進数の羅列)の暗号ですね。
紙とペン使って解ける暗号って何だよww
そして、最後は暗算とかwww
よっぽど暗号が簡単なのか、健治のスペックが神がかってるのか。
まあ、僕は暗号については詳しくないんで、よくわかりませんでした。

・ラブマシーン
いかにも悪者っぽいけど、額にハートマークがついているというシュールな敵です。
知識欲を持ったハッキングAIということですが、プログラムですよね。ってことは、どっかのパソコン上で動いてるのだろうから、そのパソコンをネットワークからはずせば解決するんじゃないのか?
もしくは、ハッキングAIというわけだから、ウイルスみたいに不特定多数のパソコンに感染してボットネットワークみたいなのを形成し、グリッドコンピューティングみたいな感じで動いてるのかな?
よくわかりませんね。

・でっかいパソコン
あんなでっかいの需要あるのかなー?


感想
ITネタを扱っていたこともあり、そこそこ楽しめました。

2010年8月1日日曜日

近況 - 雑談

・OverlayWeaverでGUIアプリを作成中

まだできてないので、これについてはそのうち書く予定です。一応、概要だけ書いておくと、DHTShellを改造してチャットプログラムみたいなのを作ろうと計画中。


・ここ一週間で、ラノベを4冊読破しました

読んだのは以下の4つ。

  1. 不気味で素朴な囲われた世界
  2. きみとぼくが壊した世界
  3. 不気味で素朴な囲われたきみとぼくの壊れた世界
  4. フルメタルパニック 「せまるニック・オブ・タイム」
1~3は、西尾維新さんの世界シリーズですね。
世界シリーズは、一巻目の「きみとぼくの壊れた世界」を5年前ぐらいに読んで以来、触れていなかったのですが市の図書館で偶然見つけてしまい一気に読んでしまいました。
あと、これの続編で「ぼくの世界」と言うのがあるらしいのですが、楽しみです。


4つ目は、最近発売されたフルメタの最新刊。まちに待った最新刊です。
何年待ったことか、3年ぐらいかなー
そして、ついにクライマックスですね。
どうクライマックスなのかは、読んでみてのお楽しみ!!
そしてそして、終に次巻で完結です。
はやく、読みたいよー!!


さてさて、それではネタバレでも


なんてしたら、怒られそうなので、
ネタバレはせずに、

心に残ったセリフだけ紹介してみようかな。うる覚えだけど…



  1. 「 デスノートで悪いやつを全員殺すのと、ドラゴンボールで悪いやつ以外を生き返らせるって言うの思考は、同じなのかどうか…」
  2. 「ほら、確か冒頭でさ、お兄様、お兄様って連呼されてるじゃん。…」
  3. 「疑わしきは罰せずとか言って、疑われた時点で既にそれが罰なんですよ。…」
  4. 「イエス、アイ、マム」
 このセリフにグッときたら、今すぐ書店へゴーですよ。

2010年7月27日火曜日

標準入出力コンポーネントを作ろう - Java - GUI

前回、標準出力コンポーネントをGUIに組み込みました。

今回は標準入力コンポーネントもGUIに組み込んでみます。

最初は、てっきり InputStreamを実装しなければいけないのかと思い、ByteArrayInputStreamを継承して、なんちゃらかんちゃらとがんばっていました。
10時間くらいww


ググったり…


ByteArrayInputStreamのソースコード読んだり…


System.in.read()をデバックしてF5連打したり…


しかし実際は、これ↓でいいみたい。InputStreamを実装する必要なんて無かったし…ORZ
  System.setIn(new ByteArrayInputStream(this.getText().getBytes()));
あとは、テキストエリアに文字を入力して、ボタンが押されたらこいつを呼び出してやればオッケー。


・メモ:気になったこと
今回作った入力コンポーネントだと、ボタンが押されるたびに ByteArrayInputStreamのインスタンスを作っているのだけど、いいのかな?インスタンスが参照されなくなったらガベージコレクションが発動するからいいと思うのだが…。



以下が、今回作ったプログラムです。

入力コンポーネント
import java.awt.*;
import java.io.*;

import javax.swing.JTextArea;

public class InputTextArea extends JTextArea {

 public InputTextArea() throws HeadlessException {
  super();
  this.setEditable(true);
 }

 public void setToSystemIn() {
  System.setIn(new ByteArrayInputStream(this.getText().getBytes()));
 }
}

出力コンポーネント
import java.awt.*;
import java.io.*;

import javax.swing.JTextArea;

public class OutputTextArea extends JTextArea {
 private TextAreaOutputStream out;
 private PrintStream printStream;

 public OutputTextArea() throws HeadlessException {
  super();
  this.setEditable(false);
  out = new TextAreaOutputStream(this);
  printStream = new PrintStream(this.getOut());
 }

 public void setToSystemOut() {
  System.setOut(getPrintStream());
 }

 public void setToSystemErr() {
  System.setErr(new PrintStream(out));
 }

 public TextAreaOutputStream getOut() {
  return out;
 }

 public PrintStream getPrintStream() {
  return printStream;
 }

 public void flush() {
  this.append(out.toString());
  out.reset();
 }
}

class TextAreaOutputStream extends ByteArrayOutputStream {
 private OutputTextArea textarea;

 public TextAreaOutputStream(OutputTextArea textarea) {
  super();
  this.textarea = textarea;
 }

 public synchronized void write(byte[] b, int off, int len) {
  super.write(b, off, len);
  textarea.flush();
 }

 public synchronized void write(int b) {
  super.write(b);
  textarea.flush();
 }

 public void write(byte[] b) throws IOException {
  super.write(b);
  textarea.flush();
 }
}

GUIウインドウ
package gui1;

import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;

public class Window extends JFrame implements ActionListener, Runnable {

 BufferedReader reader;
 private String putdata;

 /** コンポーネントの宣言 */
 private JPanel panel1;
 private InputTextArea inputTextArea;
 private JButton button1;
 private JPanel panel2;
 private OutputTextArea outputTextArea;
 private JPanel panel3;
 private JButton button31;
 private JButton button32;
 private JButton button33;
 /** コンポーネントのサイズ */
 // frameの高さと幅のサイズ
 private static final int FRAME_HEIGHT = 350;
 private static final int FRAME_WIDTH = 310;
 // containerの高さと幅のサイズ
 private static final int CONTAINER_HEIGHT = 350;
 private static final int CONTAINER_WIDTH = 310;
 // panel1の高さと幅のサイズ
 private static final int PANEL1_HEIGHT = 30;
 private static final int PANEL1_WIDTH = 300;
 // panel2の高さと幅のサイズ
 private static final int PANEL2_HEIGHT = 250;
 private static final int PANEL2_WIDTH = 300;

 Window() {
  inputTextArea = new InputTextArea();
  outputTextArea = new OutputTextArea();
  outputTextArea.setToSystemOut();
 }

 public void Display() {
  setTitle("sample");// タイトル
  setBounds(0, 0, FRAME_WIDTH, FRAME_HEIGHT);// Windowの大きさ
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// フレームを閉じたときプログラムを終了

  try {// 外観をWindows風に設定
   UIManager
     .setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
   SwingUtilities.updateComponentTreeUI(this);
  } catch (Exception e) {
   e.printStackTrace();
  }

  // Containerを生成(nullLayout)
  Container container = getContentPane();
  container.setLayout(null);
  container.setBounds(0, 0, CONTAINER_WIDTH, CONTAINER_HEIGHT);

  panel1 = new JPanel(new GridLayout(1, 2));
  panel1.setBounds(0, 0, PANEL1_WIDTH, PANEL1_HEIGHT);
  button1 = new JButton("Put");
  inputTextArea.setBounds(panel1.getVisibleRect());// textAreaをpanel1の位置と大きさに適合させる
  inputTextArea.setLineWrap(true);// テキストエリアの幅で文字列を折り返す
  panel1.add(new JScrollPane(inputTextArea));
  panel1.add(button1);
  button1.addActionListener(this);

  // TextArea用のPanel
  panel2 = new JPanel(new GridLayout(1, 1));
  panel2.setBounds(0, PANEL1_HEIGHT, PANEL2_WIDTH, PANEL2_HEIGHT);
  outputTextArea.setBounds(panel2.getVisibleRect());
  outputTextArea.setLineWrap(true);
  panel2.add(new JScrollPane(outputTextArea));

  // Button用のPanel
  panel3 = new JPanel(new GridLayout(1, 3));
  panel3.setBounds(0, PANEL2_HEIGHT + PANEL1_HEIGHT, PANEL1_WIDTH,
    PANEL1_HEIGHT);
  button31 = new JButton("Get");
  button32 = new JButton("button2");
  button33 = new JButton("button3");
  panel3.add(button31);
  panel3.add(button32);
  panel3.add(button33);

  // ボタンにアクションリスナーを付加
  button31.addActionListener(this);
  button32.addActionListener(this);
  button33.addActionListener(this);

  // containerにパネルを追加
  container.add(panel1);
  container.add(panel2);
  container.add(panel3);

  setVisible(true); // ウインドウを見えるようにする
 }

 public void actionPerformed(ActionEvent ae) {
  if (ae.getSource() == button1) {
   inputTextArea.setToSystemIn();
   reader = new BufferedReader(new InputStreamReader(System.in));
   try {
    putdata = reader.readLine();
   } catch (IOException e) {
    e.printStackTrace();
   }
  } else if (ae.getSource() == button31) {
   System.out.println(putdata);
  } else if (ae.getSource() == button32) {
   System.out.println("button3が押されました。");
  } else if (ae.getSource() == button33) {
   System.out.println("button3が押されました。");
  }
 }

 public void run() {
  Display();
 }

 public static void main(String[] args) {
  Window window = new Window();
  new Thread(window).start();
 }
}

2010年7月26日月曜日

標準出力コンポーネントを作ろう - Java - GUI

前回作ったGUIに標準出力コンポーネントを追加してみる。
標準出力コンポーネントについては、参考文献を見てね。


以下が前回作ったGUIに標準出力コンポーネントを追加したプログラムになります。

参考文献1から引用したプログラム(こちらでは、JTextAreaを継承しています。)
import java.awt.*;
import java.io.*;

import javax.swing.JTextArea;

public class OutputTextArea extends JTextArea {
 private TextAreaOutputStream out;

 public OutputTextArea() throws HeadlessException {
  super();
  this.setEditable(false);
  out = new TextAreaOutputStream(this);
 }

 public void setToSystemOut() {
  System.setOut(new PrintStream(this.getOut()));
 }

 public void setToSystemErr() {
  System.setErr(new PrintStream(this.getOut()));
 }

 public TextAreaOutputStream getOut() {
  return out;
 }

 public void flush() {
  this.append(out.toString());
  out.reset();
 }

}

class TextAreaOutputStream extends ByteArrayOutputStream {
 private OutputTextArea textarea;

 public TextAreaOutputStream(OutputTextArea textarea) {
  super();
  this.textarea = textarea;
 }

 public synchronized void write(byte[] b, int off, int len) {
  super.write(b, off, len);
  textarea.flush();
 }

 public synchronized void write(int b) {
  super.write(b);
  textarea.flush();
 }

 public void write(byte[] b) throws IOException {
  super.write(b);
  textarea.flush();
 }
}
前回作ったGUIプログラムを少し変更
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;

public class Window extends JFrame implements ActionListener, Runnable {
 /** コンポーネントの宣言 */
 private JPanel panel1;
 private JTextArea textArea1;
 private JButton button1;
 private JPanel panel2;
 private OutputTextArea out;
 private JPanel panel3;
 private JButton button31;
 private JButton button32;
 private JButton button33;

 private String putdata;

 /** コンポーネントのサイズ */
 // frameの高さと幅のサイズ
 private static final int FRAME_HEIGHT = 350;
 private static final int FRAME_WIDTH = 310;
 // containerの高さと幅のサイズ
 private static final int CONTAINER_HEIGHT = 350;
 private static final int CONTAINER_WIDTH = 310;
 // panel1の高さと幅のサイズ
 private static final int PANEL1_HEIGHT = 30;
 private static final int PANEL1_WIDTH = 300;
 // panel2の高さと幅のサイズ
 private static final int PANEL2_HEIGHT = 250;
 private static final int PANEL2_WIDTH = 300;

 public static void main(String[] args) {
  Window test = new Window();
  // サブコンポーネントの推奨サイズおよびレイアウトに合わせてこの Window をサイズ変更するように設定
  // test.pack();
 }

 public Window() {
  setTitle("sample");// タイトル
  setBounds(0, 0, FRAME_WIDTH, FRAME_HEIGHT);// Windowの大きさ
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// フレームを閉じたときプログラムを終了

  try {// 外観をWindows風に設定
   UIManager
     .setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
   SwingUtilities.updateComponentTreeUI(this);
  } catch (Exception e) {
   e.printStackTrace();
  }

  // Containerを生成(nullLayout)
  Container container = getContentPane();
  container.setLayout(null);
  container.setBounds(0, 0, CONTAINER_WIDTH, CONTAINER_HEIGHT);

  panel1 = new JPanel(new GridLayout(1, 2));
  panel1.setBounds(0, 0, PANEL1_WIDTH, PANEL1_HEIGHT);
  textArea1 = new JTextArea();
  button1 = new JButton("Put");
  textArea1.setBounds(panel1.getVisibleRect());// textAreaをpanel1の位置と大きさに適合させる
  textArea1.setLineWrap(true);// テキストエリアの幅で文字列を折り返す
  panel1.add(new JScrollPane(textArea1));
  panel1.add(button1);
  button1.addActionListener(this);

  // TextArea用のPanel
  panel2 = new JPanel(new GridLayout(1, 1));
  panel2.setBounds(0, PANEL1_HEIGHT, PANEL2_WIDTH, PANEL2_HEIGHT);
  out = new OutputTextArea();
  out.setBounds(panel2.getVisibleRect());
  out.setLineWrap(true);
  out.setToSystemOut();
  panel2.add(new JScrollPane(out));

  // Button用のPanel
  panel3 = new JPanel(new GridLayout(1, 3));
  panel3.setBounds(0, PANEL2_HEIGHT + PANEL1_HEIGHT, PANEL1_WIDTH,
    PANEL1_HEIGHT);
  button31 = new JButton("Get");
  button32 = new JButton("button2");
  button33 = new JButton("button3");
  panel3.add(button31);
  panel3.add(button32);
  panel3.add(button33);

  // ボタンにアクションリスナーを付加
  button31.addActionListener(this);
  button32.addActionListener(this);
  button33.addActionListener(this);

  // containerにパネルを追加
  container.add(panel1);
  container.add(panel2);
  container.add(panel3);

  setVisible(true); // ウインドウを見えるようにする
 }

 public void actionPerformed(ActionEvent ae) {
  if (ae.getSource() == button1) {
   putdata = textArea1.getText();
  } else if (ae.getSource() == button31) {
   System.out.println(putdata);
  } else if (ae.getSource() == button32) {
   System.out.println("button2が押されました。");
  } else if (ae.getSource() == button33) {
   System.out.println("button3が押されました。");
  }
 }

 public void run() {

 }
}

これでSystem.out.printlnで出力した値がTextAreaの方に出力されました。


参考文献
1.AllAbout - 標準出力コンポーネントを作ろう

2010年7月20日火曜日

Swingを勉強しよう - Java - GUI

dhtshellの解読が大体終わった気がするので、
そろそろアプリを作ろうと思う。


やっぱりアプリと言ったらGUIにしないといけないよな。
ってことで、Swingをちょっと勉強しないと

とりあえず、Java+SwingでGUIアプリを作るためのテンプレート(GridLayoutレイアウト編)という記事を参考に作ったのがこれです。



そして、そのプログラムがこちらです。
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;

public class SwingTest extends JFrame implements ActionListener {
 /** コンポーネントの宣言 */
 private JPanel panel1;
 private JTextArea textArea1;
 private JButton button1;
 private JPanel panel2;
 private JTextArea textArea2;
 private JPanel panel3;
 private JButton button31;
 private JButton button32;
 private JButton button33;
 private String putdata;

 /** コンポーネントのサイズ */
 // frameの高さと幅のサイズ
 private static final int FRAME_HEIGHT = 350;
 private static final int FRAME_WIDTH = 310;
 // containerの高さと幅のサイズ
 private static final int CONTAINER_HEIGHT = 350;
 private static final int CONTAINER_WIDTH = 310;
 // panel1の高さと幅のサイズ
 private static final int PANEL1_HEIGHT = 30;
 private static final int PANEL1_WIDTH = 300;
 // panel2の高さと幅のサイズ
 private static final int PANEL2_HEIGHT = 250;
 private static final int PANEL2_WIDTH = 300;

 public static void main(String[] args) {
  SwingTest test = new SwingTest();
 }
 
 public SwingTest() {
  setTitle("sample");// タイトル
  setBounds(0, 0, FRAME_WIDTH, FRAME_HEIGHT);// Windowの大きさ
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// フレームを閉じたときプログラムを終了

  try {// 外観をWindows風に設定
   UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
   SwingUtilities.updateComponentTreeUI(this);
  } catch (Exception e) {
   e.printStackTrace();
  }

  // Containerを生成(nullLayout)
  Container container = getContentPane();
  container.setLayout(null);
  container.setBounds(0, 0, CONTAINER_WIDTH, CONTAINER_HEIGHT);

  panel1 = new JPanel(new GridLayout(1, 2));
  panel1.setBounds(0, 0, PANEL1_WIDTH, PANEL1_HEIGHT);
  textArea1 = new JTextArea();
  button1 = new JButton("Put");
  textArea1.setBounds(panel1.getVisibleRect()); // textAreaをpanel1の位置と大きさに適合させる
  textArea1.setLineWrap(true); // テキストエリアの幅で文字列を折り返す
  panel1.add(new JScrollPane(textArea1));
  panel1.add(button1);
  button1.addActionListener(this);

  // TextArea用のPanel
  panel2 = new JPanel(new GridLayout(1, 1));
  panel2.setBounds(0, PANEL1_HEIGHT, PANEL2_WIDTH, PANEL2_HEIGHT);
  textArea2 = new JTextArea();
  textArea2.setBounds(panel2.getVisibleRect());
  textArea2.setLineWrap(true);
  panel2.add(new JScrollPane(textArea2));

  // Button用のPanel
  panel3 = new JPanel(new GridLayout(1, 3));
  panel3.setBounds(0, PANEL2_HEIGHT + PANEL1_HEIGHT, PANEL1_WIDTH, PANEL1_HEIGHT);
  button31 = new JButton("Get");
  button32 = new JButton("button2");
  button33 = new JButton("button3");
  panel3.add(button31);
  panel3.add(button32);
  panel3.add(button33);

  // ボタンにアクションリスナーを付加
  button31.addActionListener(this);
  button32.addActionListener(this);
  button33.addActionListener(this);

  // containerにパネルを追加
  container.add(panel1);
  container.add(panel2);
  container.add(panel3);

  setVisible(true); // ウインドウを見えるようにする
 }

 public void actionPerformed(ActionEvent ae) {
  if (ae.getSource() == button1) {
   putdata = textArea1.getText();
  } else if (ae.getSource() == button31) {
   textArea2.setText(putdata);
  } else if (ae.getSource() == button32) {
   textArea2.setText("button2が押されました。");
  } else if (ae.getSource() == button33) {
   textArea2.setText("button3が押されました。");
  }
 }
}
若干パクリ臭がするけどいいよね。よくなかったらごめんなさい。


参考文献
Java+SwingでGUIアプリを作るためのテンプレート(GridLayoutレイアウト編)

2010年7月14日水曜日

Threadを勉強しよう - Java

スレッドとは、一つの処理の流れです。
マルチスレッドとは、並列に複数のスレッドを動かすということです。

スレッドを作成する方法は2つあります。
1. Threadクラスを継承
2. Runnableインターフェイスを実装
どちらも、run()メソッドを実行するたびに新しいスレッドが作成されて動き出します。
*詳しい説明は、javaSE6のドキュメントを見るとわかりやすいです。

ちなみに、スレッド立てる方法は2つありますが、Runnableインターフェイスを実装したやり方がお勧め。
なぜかって、クラスは一つしか継承できないからです。


スレッド豆知識
1. t.interrupt()
 このスレッドに割り込みます。

2. synchronized:複数のスレッドが同時に処理できないようにする。
 使用法は、synchronizedをメソッドの修飾子にする。もしくは、synchronized(対象のオブジェクト){処理}ブロックを記述する。

2010年7月12日月曜日

集中力を高める方法 - 雑学

集中力が切れたとき、
また、これから勉強するので集中したいとき、

どうすれば、集中力を高めればよいのだろうか?


私がよくするのは、正座をして瞑想です。
このとき呼吸は腹式呼吸で、
6秒吐いて3秒吸うという丹羽式呼吸法を行います。

ポイントは、6秒吐いて3秒吸うというところ
息を吐いている時は副交感神経が働いてアルファ波が出て、
吸っている時は交感神経が働いてベータ派が出ます。
だから、息を吐く時間を長くしてあげればよいのです。


これでアルファ波をガンガン出るので、集中力が高まりまくるのだー!!

2010年7月11日日曜日

Javaの入出力ストリームを勉強しよう - Java

入力ストリームというのは、
キーボードとかから送られてくる入力信号(InputStream、バイトストリーム)、
ハードディスクから読み込むデータ(FileReader、キャラクタストリーム
の流れる道(入力源)

出力ストリームというのは、
ディスプレイに送られる出力信号(OutputStream、バイトストリーム)、
ハードディスクに書き込むデータ(FileWriter、キャラクタストリーム
の流れる道(出力先)

注意:使用したストリームは必ず閉じるようにしてください。

メモ
バイトストリーム:バイト単位で、入出力を行う。 
キャラクタストリーム:文字単位で入出力を行う。

・豆知識1
ファイルを1文字ずつコピーするのは効率が悪いので、行単位すなわちバッファ付きの入出力を行うのがお勧めです。
バッファ付きでないストリームをラップしてバッファ付きにするためのクラスは4つあります。
バイトストリーム用: BufferedInputStreamBufferedOutputStream
キャラクタストリーム用: BufferedReaderBufferedWriter

・豆知識2
javaではたまに「ストリームをフラッシュする」という言葉が出てきます。
このフラッシュ「 flush() 」についての話です。

「出力ストリームがファイルやネットワークの場合、こまめにデータを出力するよりも、データが貯まった時点でまとめて出力した方が効率がいい場合があります。その場合、データを「バッファ」に貯めておき、まとめて出力する方法が取られます。この「まとめて出力する」ことを「フラッシュ」といいます。」*参2より引用
ちなみに、flush()メソッドは、java.io.PrintStreamで定義されています。


参考文献
1.楽STACK「標準入出力」
2.JavaA2Z「フラッシュとは」

最終更新日 2010 - 7/25

Socketの勉強をしよう - Java

overlayweaverのdhtshellを解読してたら
private Socket sock;

こんな変数を見つけたのがことの始まりでした。
なにこれ?ってことで、

P2Pにとっては、かなり重要そうな感じがしたので勉強することに

メモ
java.net.Socket
「このクラスは、クライアントソケット (単に「ソケット」とも呼ばれる) を実装します。ソケットとは、2 つのマシン間で通信を行う際の端点のことです。」

java.net.ServerSocket
「このクラスはサーバーソケットを実装します。サーバーソケットは、ネットワーク経由で要求が送られてくるのを待ちます。これは、その要求に基づいていくつかの操作を実行します。その後、場合によっては要求元に結果を返します。」


それでは、勉強開始!!
JavaでHelloWorld ソケット編というのを参考に

まずは、サーバー側のソースコード
package socket;

import java.io.*;
import java.net.*;

public class HelloWorldMultiThreadServer {
 public static void main(String argv[]) {
  try {
   // 指定されたポートにバインドされたサーバーソケットを作成します。
   ServerSocket serverSocket = new ServerSocket(5555);

   // メインループ
   while (true) {
    try {
     System.out.println("クライアントからの接続をポート5555で待ちます");
     // accept()は serverSocketに対する接続要求を待ち、それを受け取ります。
     Socket socket = serverSocket.accept();
     System.out.println(socket.getInetAddress() + "から接続を受付ました");

     // 処理をスレッドに任せます
     new Connect(socket);

    } catch (Exception ex) {
     ex.printStackTrace();
    }
   }
  } catch (IOException e) {
   e.printStackTrace();
  }
 }
}

class Connect extends Thread {
 private Socket socket = null;

 public Connect(Socket socket) {
  this.socket = socket;
  // スレッド開始
  this.start();
 }

 public void run() {
  try {
   // ソケットの出力ストリームを取得
   PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
   // ソケットの入力ストリームを取得
   BufferedReader in = new BufferedReader(new InputStreamReader(
     socket.getInputStream()));

   // 読み込んだ行をそのまま出力ストリームに書き出す
   String inputLine;
   while ((inputLine = in.readLine()) != null) {
    out.println(inputLine);
   }
   System.out.println("処理が終了したので接続を切ります");

   // 入出力ストリームを閉じる
   in.close();
   out.close();
   // ソケットを閉じる
   socket.close();
  } catch (Exception e) {
   try {
    socket.close();
   } catch (Exception ex) {
    e.printStackTrace();
   }
  }
 }
}
次に、クライアント側のソースコード
package socket;

import java.net.*;
import java.io.*;

public class HelloWorldSocketClient {
 public static void main(String[] args) {
  try {
   // ストリームソケットを作成し、指定された IPアドレスの指定されたポート番号に接続します。
   Socket socket = new Socket("localhost", 5555);

   // ソケットの出力ストリームを取得
   PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
   // ソケットの入力ストリームを取得
   BufferedReader in = new BufferedReader(new InputStreamReader(
     socket.getInputStream()));

   // 「Hello World」をサーバーに送る
   out.println("Hello World");
   // 読み込んだデータを表示
   System.out.println(in.readLine());

   // 入出力ストリームを閉じる
   out.close();
   in.close();
   // ソケットを閉じる
   socket.close();
  } catch (IOException e) {
   e.printStackTrace();
  }
 }
}

このソースコード書いた人すごいなー。
ソースコード読んだだけでソケットがなんとなくわかっちまったぜ。

ちょっと引っかかってしまったのが、入出力ストリーム。
感覚的にはわかったんだが、理解はしてない。
あとで、勉強だな。


参考文献
JavaでHelloWorld ソケット編

2010年7月10日土曜日

分散環境エミュレータを使ってみよう - overlayweaver

DHTシェルを何度も何個も起動させるのってめんどくさいなーって時に使える。

使い方は簡単

まずは、SimpleScenario.txtというファイルを作ります。
そこに、次の内容を書き込んで、拡張子(.txt)を消しておく
timeoffset 2000 # invokes the first node class ow.tool.dhtshell.Main arg -p 10000 schedule 0 invoke # invokes 3 nodes, which contacts the first node (emu0) to join an overlay arg emu0 schedule 1000,1000,3 invoke

次にコマンドプロンプトを起動して、SimpleScenarioのあるディレクトリまで移動。
そして、
owemu SimpleScenario
と、実行すると以下のようにノードが四つできあがります。

C:\workspace\overlayweaver>owemu SimpleScenario
DHT configuration:
hostname:port: emu0:3997
transport type: UDP
routing algorithm: Chord
routing style: Iterative
directory type: VolatileMap
working directory: .
A DHT started.
A shell server is waiting on the port tcp/10000
[Clock jump or overload detected: class ow.tool.
1ba34f2, 2312 msec behind]
DHT configuration:
hostname:port: emu1:3997
transport type: UDP
routing algorithm: Chord
routing style: Iterative
directory type: VolatileMap
working directory: .
initial contact: emu0:3997
A DHT started.
DHT configuration:
hostname:port: emu2:3997
transport type: UDP
routing algorithm: Chord
routing style: Iterative
directory type: VolatileMap
working directory: .
initial contact: emu0:3997
A DHT started.
DHT configuration:
hostname:port: emu3:3997
transport type: UDP
routing algorithm: Chord
routing style: Iterative
directory type: VolatileMap
working directory: .
initial contact: emu0:3997
A DHT started.



ちなみに、シナリオファイルを和訳すると、以下のようになります。

遊戯
「俺のターン!
 初期ノードを0ミリ秒後に発動!!
 クラスは、ow.tool.dhtshell.Mainで、引数は-p 10000だ!(10000番ポートで接続を待つ)

 さらにー!1000ミリ秒待ってから~
 三つのノードを1000ミリ秒ごとに一つ発動するぜー!!
 そして、こいつらを初期ノードに接続してオバーレイに参加だー!!!」

海馬
「なにー!?
 たった1ターンでノードを四体だとー!」




ちなみに、ow.tool.dhtshell.Mainの、引数を以下のようにすると
arg -p 10000 -r Recursive -t TCP -a Kademlia

ルーティングスタイル:Recursive(再帰方式)、通信タイプ:TCP、アルゴリズム:Kademlia
こんな感じで、DHTの設定を変えることもできます。



参考文献
OWの使い方
分散環境エミュレータのマニュアル
DHT シェルのマニュアル

2010年7月8日木曜日

overlayweaverの使い方(eclipse) - overlayweaver

1.環境準備

まずは、Java SE Development Kit のJDK、JREをダウンロード、インストールしてください。

次にeclipseをダウンロードして、 適当な場所に展開してください。
eclipseを起動したら、workspaceを決めます。ちなみに私は、c\workspace にしてます。あと、パスに日本語(例えば デスクトップ\workspace)とかは避けてねw

とりあえず、準備終了


2.overlayweaverのビルド(コンパイル)

まず、overlayweaverをzipでダウンロードして、これをworkspaceに解凍します。
そして、eclipseで「ファイル→;新規→プロジェクト→その他→既存のAntビルドファイルからのJavaプロジェクト→C:\workspace\overlayweaver\build.xmlを参照」とし、完了。このとき、javac宣言を選択という項目があり、compile.mainの方を選択しておく。

その後、overlayweaverのbuild.xmlを右クリックし、実行→Antビルドを実行し、コンソールに「BUILD SUCCESSFUL」と表示されれば成功です。

これで、サンプルプログラム(dhtshellとか)が使えるようになります。


3.dhtshellを使ってみよう

(1)PATHの設定
マイコンピュータを右クリックしてプロパティの設定画面へ
詳細設定の環境変数へ
PATH変数を編集して(私の場合) C:\workspace\overlayweaver\bin; を追加します。

(2)dhtshellの実行
コマンドプロンプトを開き、owdhtshellコマンドを実行するとdhtshellが起動します。

後は公式に丸投げします。

いや、別にめんどくさくなったからじゃなんだからね。あとは公式にのってるから省略しただけなんだよ。


ちなみに、eclipseを使わない場合のビルドの仕方は公式の方に全部載ってるのでそっちを参照してください。


参考文献
OverlayWeaver文書
p2p設計入門(4)---順調に分からないまま進む。