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レイアウト編)