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通信の概要」