marunomaruno-memo

marunomaruno-memo

カルクーベ

2010年03月31日 | Weblog
カルクーベ
http://calqueve.com/
で、食べ歩きできるケーキを買う。
ワッフルコーンにケーキを詰めた、食べ歩けるスタイルの新しいケーキ。
いちごショートケーキ、チョコバナナクリーム、チーズケーキの3種類あり、3つ頼む。
好みでは、イチゴショートが一番よいかな。
名前の由来を聞いたところ、「軽く食う」だそうだ。
まあ、軽く食うには少々高い(399円)が。。。
「赤い彗星」という名のケーキもあり、ショーウィンドウの上には赤い彗星の模型が置いてあった。
「白い弾丸」?というのもあり、これも、ガンダムか?
でも、ワッフルコーンにケーキ詰めるのなら、アイスクリームも乗っているとよかったかもしれない。

自動採番テーブルの補足

2010年03月26日 | DB
自動採番テーブルの補足
================================================================
■自動採番テーブル

□ 主キー項目などで、自動的に採番したい項目などは、「SERIAL」型
を指定します。なお、SERIAL型は、INTEGER型の数値として扱われます。
INSERTする度に、1ずつ加えられますが、連番を保障するものではあり
ません。

例:

CREATE TABLE sample (
    id SERIAL PRIMARY KEY, 
    data text
);

INSERT INTO sample VALUES(DEFAULT, 'test data1');

INSERT INTO sample(data) VALUES('test data2');

SELECT * FROM sample;
 id |    data
----+------------
  1 | test data1
  2 | test data2
(2 rows)


□ 現在のid列の値を取得する

SERIAL型の実体は、シーケンス・オブジェクトです。
このオブジェクト名は、「\d テーブル名」コマンドで取得できます。

\d sample
                         Table "public.sample"
 Column |  Type   |                      Modifiers
--------+---------+-----------------------------------------------------
 id     | integer | not null default nextval('sample_id_seq'::regclass)
 data   | text    |
Indexes:
    "sample_pkey" PRIMARY KEY, btree (id)

または、「\ds」メタコマンドで、シーケンスの一覧が表示できます。

\ds
              List of relations
 Schema |     Name      |   Type   |  Owner
--------+---------------+----------+----------
 public | sample_id_seq | sequence | postgres
(1 row)

SERIAL型の実体のシーケンス名は、
「テーブル名_列名_seq」
になっています。

現在の値を取得するのは、CURRVAL関数を使います。

SELECT CURRVAL('sample_id_seq');
 currval
---------
       2
(1 row)

また、つぎにどの値が取得されるかは、NEXTVAL関数を使います。

select NEXTVAL('sample_id_seq');
 nextval
---------
       3
(1 row)

ただ、このとき、注意しないといけないのは、シーケンスにNEXTVAL関
数でアクセスすることで、値が更新される、ということです。単に、次
の値を予想したい場合は、CURRVAL関数の結果に1を加えたもので使うと
よいです。ただし、シーケンスは連番を保障していないので、あくまで
も予想です。実際に、NEXTVALを使ってデータを挿入してから、その値
を取得するとよいでしょう。


■外部キー制約があるテーブルへの行の挿入

つぎのような関係があるテーブルを想定します。

    ORDER → DETAIL

なお、矢印は、1対多の関係を表し、矢が「多」側 (外部キー制約を設
定しているテーブル)、矢じりが「1」側 (外部キー制約によって参照さ
れているテーブル)を表します。

基本的な形として、つぎのように手続きを書いていきます。
なお、これはJDBCを使った擬似コードのイメージなので、実際のプログ
ラミングでは、JavaとJDBCにしたがって書く必要があります。

---
START TRANSACTION;

INSERT INTO ORDER VALUES(DEFAULT, ...);

SELECT CURRVAL('order_id_seq');
int id = res.getInt();

while (...) {    // DETAILの行数分だけ
    INSERT INTO detail VALUES(DEFAULT, ?, ...);
    stmt.setInt(1, id);
}

COMMIT;
---

ここで、テーブルdetailの1列目はSERIAL型を使ったdetailテーブルの
主キー、2列目が、orderテーブルの主キーに関係した外部キーです。


                                                            以上


Lego Mindstoms NXT - leJOS - (16) 光センサーの調整

2010年03月24日 | LEGO
◆ Lego Mindstoms NXT - leJOS - (16) 光センサーの調整
================================================================================

■光センサー調整を調整する

光センサーから取得する値は、ロボットを動かす回りの環境によって、異なります。

また、センサー一般にいえることですが、センサー自体の性能によっても、取れる値の範
囲が違ってきます。たとえば、NXT標準の光センサーは10ビットなので、0~1023までの値
を取得することができますが、8ビットのセンサーや、12ビットのセンサーの場合ですと、
取れる値の範囲は、それぞれ0~255、0~4095と、違う範囲の値になってしまいます。
もちろん、ハードウェアが違えば、プログラムも違ってきますが、このようなセンサーの
値などは標準的にパーセントで取得できると、どの環境、どのハードウェアでも同じしき
い値でプログラミングできるようになります。

つぎのプログラムは、まず、暗いところと、明るいところの光量を取得し、それぞれを光
量の最小値、最大ととして設定します。そして、任意のところの光量を測定して表示しま
す。


□calibrateLow()とcalibrateHigh()を使う

これらのメソッドは、直前にreadValue()メソッドで読んだ光量をもとに、最小値、最大
値を設定します。これの後、readValue()メソッドを実行した結果は、0~100の間に収まる
ようになります。

---
import lejos.nxt.Button;
import lejos.nxt.LightSensor;
import lejos.nxt.SensorPort;

/**
 * 「トライボット」使用
 * 光センサーを調整する。
 * 
 * @author marunomaruno
 * @version 1.0, 2010/03/15
 * @since 1.0
 */
public class LightSensor13 {
    public static void main(String[] args) throws Exception {
        // 光センサーオブジェクトをポート3で生成する。
        LightSensor lightSensor = new LightSensor(SensorPort.S3);

        // センサーが安定するまで少し待つ
        Thread.sleep(100);

        // 最小値を設定する。
        System.out.println("Press Button if dark.");
        Button.waitForPress();
        int lowValue = lightSensor.readValue();                          // (1)
        lightSensor.calibrateLow();                                      // (2)
        System.out.println(lowValue + " " + lightSensor.readValue() + " " + 
                                            lightSensor.readNormalizedValue());

        // 最大値を設定する。
        System.out.println("Press Button if bright.");
        Button.waitForPress();
        
        int highValue = lightSensor.readValue();
        lightSensor.calibrateHigh();                                    // (3)
        System.out.println(highValue + " " + lightSensor.readValue() + " " + 
                                             lightSensor.readNormalizedValue());

        // 値を取得
        System.out.println("Press Button.");
        Button.waitForPress();
        System.out.println(lightSensor.readValue() + " " + 
                           lightSensor.readNormalizedValue());

        // プログラムを終える
        System.out.println("Press Button to exit.");
        Button.waitForPress();
    }
}
---

□ int lowValue = lightSensor.readValue();            // (1)

readNormalizedValue()メソッドによって、実際の値を取得します。
このメソッドは、NXTの場合は、0~1023までの範囲の値を取得します。
APIによると、145 (暗い) から 890 (太陽光)の範囲とのことです。


□ lightSensor.calibrateLow();                                // (2)

calibrateLow()メソッドで、このメソッドの直前にreadValue()メソッドで読み取った値
を、次にreadValue()メソッドで読んだときに 0 と読めるように設定します。


□ lightSensor.calibrateHigh();                              // (3)

calibrateHigh()メソッドで、このメソッドの直前にreadValue()メソッドで読み取った値
を、次にreadValue()メソッドで読んだときに 100 と読めるように設定します。


■setLow()とsetHigh()を使う

これらのメソッドは、直前にreadNormalizedValue()メソッドで読んだ光量をもとに、最
小値、最大値を設定します。これの後、readValue()メソッドを実行した結果は、0~100の
間に収まるようになります。

---
import lejos.nxt.Button;
import lejos.nxt.LightSensor;
import lejos.nxt.SensorPort;

/**
 * 「トライボット」使用
 * 光センサーを調整する。
 * 
 * @author marunomaruno
 * @version 1.0, 2010/03/15
 * @since 1.0
 */
public class LightSensor13 {
    public static void main(String[] args) throws Exception {
        // 光センサーオブジェクトをポート3で生成する。
        LightSensor lightSensor = new LightSensor(SensorPort.S3);

        // センサーが安定するまで少し待つ
        Thread.sleep(100);

        // 最小値を設定する。
        System.out.println("Press Button if dark.");
        Button.waitForPress();
        int lowValue = lightSensor.readNormalizedValue();            // (1)
        lightSensor.setLow(lowValue);                                // (2)
        System.out.println(lowValue + " " + lightSensor.readValue());

        // 最大値を設定する。
        System.out.println("Press Button if bright.");
        Button.waitForPress();
        int highValue = lightSensor.readNormalizedValue();
        lightSensor.setHigh(highValue);                              // (3)
        System.out.println(highValue + " " + lightSensor.readValue());

        // 値を取得
        System.out.println("Press Button.");
        Button.waitForPress();
        System.out.println(lightSensor.readNormalizedValue() + " " + 
                           lightSensor.readValue());

        // プログラムを終える
        System.out.println("Press Button to exit.");
        Button.waitForPress();
    }
}
---

□ int lowValue = lightSensor.readNormalizedValue();            // (1)

readNormalizedValue()メソッドによって、実際の値を取得します。
このメソッドは、NXTの場合は、0~1023までの範囲の値を取得します。
APIによると、145 (暗い) から 890 (太陽光)の範囲とのことです。


□ lightSensor.setLow(lowValue);                                // (2)

setLow()メソッドで、readNormalizedValue()メソッドで読み取った値を、readValue()メ
ソッドで読んだときに 0 と読めるように設定します。


□ lightSensor.setHigh(highValue);                              // (3)

setHigh()メソッドで、readNormalizedValue()メソッドで読み取った値を、readValue()
メソッドで読んだときに 100 と読めるように設定します。


■光センサー調整ユーティリティ

光センサーを調整する部分をユーティリティ化します。

---
import lejos.nxt.Button;
import lejos.nxt.LightSensor;

/**
 * 「トライボット」使用
 * 光センサーを調整するユーティリティ。
 * 
 * @author marunomaruno
 * @version 1.0, 2010/03/15
 * @since 1.0
 */
public class Calibrator01 {

    /**
     * 光センサーを調節する。
     * 調節し終わったら、いずれかのボタンの押下をうながし、待ち状態になる。
     * @param lightSensor 光センサー
     */
    public static void calibrate(LightSensor lightSensor) {    // (1)
        // 最小値を設定する。
        System.out.println("Press Button if dark.");
        Button.waitForPress();
        int lowValue = lightSensor.readNormalizedValue();
        lightSensor.setLow(lowValue);
        System.out.println(lowValue + " " + lightSensor.readValue());

        // 最大値を設定する。
        System.out.println("Press Button if bright.");
        Button.waitForPress();
        int highValue = lightSensor.readNormalizedValue();
        lightSensor.setHigh(highValue);
        System.out.println(highValue + " " + lightSensor.readValue());

        // スタートする。
        System.out.println("Press Button to start.");
        Button.waitForPress();
    }

}
---

□ public static void calibrate(LightSensor lightSensor) {    // (1)

光センサを調整するメソッドです。


■このユーティリティを使うプログラム

---
import lejos.nxt.Button;
import lejos.nxt.LightSensor;
import lejos.nxt.SensorPort;

/**
 * 「トライボット」使用
 * 光センサーを調整する。このとき、光センサー調整クラスを使う。
 * 
 * @author marunomaruno
 * @version 1.0, 2010/03/15
 * @since 1.0
 */
public class LightSensor14 {
    public static void main(String[] args) throws Exception {
        // 光センサーオブジェクトをポート3で生成する。
        LightSensor lightSensor = new LightSensor(SensorPort.S3);

        // センサーが安定するまで少し待つ
        Thread.sleep(100);

        // 光センサーを調整する
        Calibrator01.calibrate(lightSensor);                    // (1)
        
        // 値を取得
        System.out.println(lightSensor.readNormalizedValue() + " " + 
                           lightSensor.readValue());

        // プログラムを終える
        System.out.println("Press Button to exit.");
        Button.waitForPress();
    }
}
---

□ Calibrator01.calibrate(lightSensor);                    // (1)

光センサを調整するユーティリティを使います。staticメソッドなので、クラス名.メソ
ッド名で呼び出します。

                                                                           以上



Subversion のインストールと利用

2010年03月22日 | プロジェクト管理
Subversion のインストールと利用
================================================================================

■ Subversion

・Subversion は、バージョン管理システムです。バージョン管理システムは、プロジェ
クト・チームではなくてはならないものです。

・バージョン管理システムは、つぎの2つの中核的な機能をサポートする必要があります。
    * 変更内容を矛盾なくソース・コードに統合する
    * チームの作業履歴を記録する 

・チームのメンバーが新たに作業を行った場合、メンバーは変更内容をリポジトリーにコ
ミットすることによってその作業を共有します。

・使用可能な最新状態のリソースを入手するには、ローカルのワークスペースを更新して、
リポジトリー上の変更内容を反映します。

・プロジェクトのリポジトリーはプロジェクトの現在の状態を表しています。チームのメ
ンバーは、任意の時点でリポジトリーの情報を使ってワークスペースを更新し、自分の作
業が最新状態かどうかを知ることができます。

・履歴も保持しています。これにより、現在の作業を以前のバージョンと比較して、必要
があれば以前の作業状態に戻すことができます。

・バージョン管理においては、チームの作業を調整して現在のプロジェクト状態の定義が
ひとつしか存在しないようにし、チームとしてひとつに統合された作業を保持することも
不可欠です。 

・今回は、つぎのソフトウェアをインストールして使います。
    * サーバーソフト         VisualSVN-Server
    * クライアントソフト     TortoiseSVN
    * Elipseプラグイン       subclipseプラグイン


■ サーバーソフト VisualSVN-Server の導入

Subversionを、WindowsマシンにGUIを使ってインストール・設定できます。
インストールする手順:
    1. ダウンロード
    2. インストール
    3. ユーザーの作成
    4. グループの作成
    5. リポジトリの作成
    6. リポジトリの設定


1. ダウンロード

以下のサイトから、
VisualSVN-Server-2.1.1.msi
をダウンロードします。

VISUALSVN SERVER
http://www.visualsvn.com/server/download/


2. インストール

msi形式なので、そのままインストールすればOKです。

なお、VisualSVN-Server があれば、Subversionサーバーや、apacheも必要ありません。


3. ユーザーの作成

[Users]で右クリック -  [Create User...]で、
[ユーザー名]と[パスワード]x2回
を入力して
[OK]


4. グループの作成

[Groups]で右クリック -  [Create Group...]で、
[グループ名]を指定して、
[Add...]
で、ユーザーを追加する

最後に[OK]


5. リポジトリの作成

[Repositories]で右クリック -  [Create New Repository...]で、
[リポジトリ名]
を入力して
[OK]


6. リポジトリの設定

[リポジトリ名]で右クリック -  [Properties] -  [security]タグ -  [Add]ボタン
で、ユーザーまたはグループを追加
[OK]


■クライアントソフト(TortoiseSVN)のインストール

クライアントソフトとして、TortoiseSVNを使います。これは、エクスプローラーの右ク
リックで、「更新」や「コミット」などができるようになります。
インストールの手順は以下のとおりです。
    1. ファイルのダウンロード
    2. TortoiseSVNのインストール
    3. 日本語化プラグインのインストール
    4. 日本語化


1. ファイルのダウンロード

以下の2つのファイルをダウンロードします。

tortoisesvn: TortoiseSVN Downloads
http://tortoisesvn.tigris.org/
http://sourceforge.net/projects/tortoisesvn/files/Application/1.6.7/TortoiseSVN-
1.6.7.18415-win32-svn-1.6.9.msi/download

TortoiseSVN-1.6.7.18415-win32-svn-1.6.9.msi
LanguagePack_1.6.7.18415-win32-ja.msi


2. TortoiseSVNのインストール

TortoiseSVN-1.6.7.18415-win32-svn-1.6.9.msiをダブルクリックしてインストールしま
す。インストールが終わると、PCの再起動が要求されます。


3. 日本語化プラグインのインストール

メニューで日本語を使うためには、LanguagePack_1.6.7.18415-win32-ja.msiをダブルク
リックしてインストールします。


4. 日本語化

[エクスプローラーのフォルダ]右クリック - [TortoiseSVN] - [Settings] - [General] 
- [Language]
を
[日本語]
にして[OK]


■リポジトリのURL

リポジトリのURLは以下の形式になります。

https://ホスト名/svn/リポジトリ名

たとえば、testという名前のリポジトリであれば、以下のようになります。
https://localhost/svn/test


■バージョン管理の開始

1. 作業用フォルダを作り、[フォルダ名]右クリック - [SVNチェックアウト] で、そのフ
ォルダとリポジトリと同期を取ります。


■日々の作業

1. 作業用フォルダを作り、[フォルダ名]右クリック - [SVN更新] で、更新されたファイ
ルを自分のローカルにコピーします。

2. 自分のローカル・フォルダで作業します。

3. 作業し終わったら、[フォルダ名]右クリック - [SVNコミット]
    - 必要に応じて、[最近のログメッセージ]を記入
    - コミットするファイルにチェックをつけて[OK]


■リポジトリブラウザ

ブラウザーから、リポジトリのURLにアクセスすることで、中のドキュメントを照会する
ことができます。


■Eclipseでsubversionを使う

ソースを開発するようになったときは、開発環境として、Eclipseを使います。
Eclipseで、Subversionを使うには、そのためのプラグインが必要です。ここでは、
subclipseプラグインを使います。
    □subclipseプラグインのインストール
    □tomcatプロジェクトを作る
    □プロジェクトとをリポジトリに登録する
    □日々の作業


□subclipseプラグインのインストール

1. Eclipse を起動

2. [ヘルプ] -  [ソフトウェア更新] -  [使用可能なソフトウェア] -  [サイトの追加]
ボタンを押下

[ロケーション]に、

http://subclipse.tigris.org/update_1.0.x

を指定して[OK]


2. [http://subclipse.tigris.org/update_1.0.x]にチェック -  [インストール]ボタン
押下


□tomcatプロジェクトを作る

プロジェクト名は mbshop


□プロジェクトをリポジトリに登録する(誰かひとりが行う)

1. [mbshop]右クリック -  [チーム] -  [プロジェクトの共用] -  [SVN] -  [次へ] - 
[新しいリポジトリロケーションを作成] -  [ロケーション]に
[リポジトリのURL]
を設定

リソースの選択で、[work]以外はすべてチェック


□日々の作業

1. [mbshop]右クリック -  [チーム] -  [更新]

2. 作業

3. [mbshop]右クリック -  [チーム] -  [コミット]

リソースの選択で、[work]以外はすべてチェック
必要に応じてコメントを書く


■参考URL

Subversionの使い方
http://www.cis.kit.ac.jp/~kiro/research/kiro.php?Subversion%A4%CE%BB%C8%A4%A4%CA%FD

Eclipse で Subversion を使う
http://www.ibm.com/developerworks/jp/opensource/library/os-ecl-subversion/

                                                                           以上


Lego Mindstoms NXT - leJOS - (15) タイマーとストップウォッチ

2010年03月16日 | LEGO
◆ Lego Mindstoms NXT - leJOS - (15) タイマーとストップウォッチ
================================================================================

NXTボタンを使ったリスナー、センサーを使ったリスナーは、それぞれ、

(8) ボタン・リスナー 2008-08-26 
http://blog.goo.ne.jp/marunomarunogoo/d/20080826

(9) リスナー 2008-09-02 
http://blog.goo.ne.jp/marunomarunogoo/d/20080902

で行いました。今度は、タイマーを使ったリスナーを学習しましょう。

■時間がきたらプログラムを終える

タイマーを使って、時間がきたらプログラムを終了させます。
ついでに、今までのEscボタン押下でもプログラムが止まるように、ButtonListener も合
わせて実装しましょう。

□リスナーを利用するクラス

まずは、その場で10秒間回転するプログラムです。
ただし、mainメソッドの中では、20秒間回転するようになっています。
タイマーリスナーを使い、10秒で終了するようにしています。

TimerListener01.java
------------------------------------------------------
import jp.marunomaruno.nxt.timer.s01.ExitListener;
import lejos.nxt.Motor;
import lejos.util.Timer;
import lejos.util.TimerListener;

/**
 * 「トライボット」使用
 * その場で10秒間回転する。
 * 
 * @author marunomaruno
 * @version 1.0, 2010/03/08
 * @since 1.0
 */
public class TimerListener01 {
    public static void main(String[] args) throws Exception {

        // 10秒でプログラムを終了するタイマーを設定する。
        TimerListener timerListener = new ExitListener();     // (1)
        Timer timer = new Timer(10000, timerListener);        // (2)
        timer.start();                                        // (3)
        
        // その場で20秒回転する。
        Motor.B.forward();
        Motor.C.backward();
        Thread.sleep(20000);
        
        timer.stop();                                         // (4)
    }
}
------------------------------------------------------

□TimerListener timerListener = new ExitListener();    // (1)

タイマーリスナーのオブジェクトを生成します。
これは、TimerListenerインターフェースを実装したオブジェクトになります。
今回は、ExitListenerクラスとして作りました。


□Timer timer = new Timer(10000, timerListener);        // (2)

タイマーリスナーは、このタイマーオブジェクトに設定します。


コンストラクター
---
Timer(int theDelay, TimerListener el) 
    イベント遅延の時間をtheDelayミリ秒とし、リスナーelとするタイマーオブジェクト
を生成するとコンストラクターです。
---

メソッド
---
 int getDelay() 
    theDelayミリ秒経過するごとに、 timedOut()メソッドにメッセージを送ります。

 void start() 
    タイマーを起動します。このとき、timedOut()メソッドにメッセージを送ります。

 void stop() 
    タイマーを停止します。
---


□timer.start();                                        // (3)

タイマーを起動します。


□timer.stop();                                        // (4)

タイマーを停止します。


■ExitListener

プログラムを終わらせるリスナーです。
このリスナーは、いずれかのボタン(想定はESCAPEボタン)押下または、指定された時間に
なったらプログラムを終了するリスナーとして作ります。

------------------------------------------------------
package jp.marunomaruno.nxt.timer.s01;

import lejos.nxt.Button;
import lejos.nxt.ButtonListener;
import lejos.nxt.Sound;
import lejos.util.TimerListener;
/**
 * Escボタン押下または、指定された時間になったらプログラムを終了するリスナー。
 * 
 * @author marunomaruno
 * @version 1.0, 2010/03/08
 * @since 1.0
 */
public class ExitListener implements ButtonListener, TimerListener {    // (1)
    /* (non-Javadoc)
     * @see lejos.nxt.ButtonListener#buttonPressed(lejos.nxt.Button)
     */
    public void buttonPressed(Button button) {    
        exit(262);    // C
    }

    /* (non-Javadoc)
     * @see lejos.nxt.ButtonListener#buttonReleased(lejos.nxt.Button)
     */
    public void buttonReleased(Button button) {
        exit(277);    // C#
    }

    /* (non-Javadoc)
     * @see lejos.util.TimerListener#timedOut()
     */
    public void timedOut() {                                            // (2)
        exit(294);    // D
    }

    /**
     * トーンを鳴らしてプログラムを終了する。
     * @param freq 周波数
     */
    private void exit(int freq) {                                        // (3)
        Sound.playTone(freq, 200);
        Sound.pause(300);
        System.exit(0);
    }
}
------------------------------------------------------

□public class ExitListener implements ButtonListener, TimerListener {    // (1)

このクラスには、ButtonListenerインターフェースと、TimerListenerインターフェース
を実装しています。

ButtonListenerインターフェースは、以下のメソッドがあります。詳しくは、
(8) ボタン・リスナー
を参照してください。
    public void buttonPressed(Button button)
    public void buttonReleased(Button button)


また、TimerListenerインターフェースは、以下のメソッドを持ちます。
    public void timedOut()


□public void timedOut() {                                            // (2)

このtimedOut()に、タイムアウトしたときの処理を記述します。今回は、このクラスのpr
ivateメソッドであるexit()メソッドを呼び出して、そこでプログラムを終了させます。


□private void exit(int freq) {                                        // (3)

これは、指定された周波数のトーンを鳴らしてプログラムを終了します。


■ストップウォッチ

今度は、ストップウォッチのように、NXT画面に動かしてからの経過秒数を表示するプロ
グラムを作りましょう。

□TimerListener02.java
------------------------------------------------------
import jp.marunomaruno.nxt.timer.s01.StopwatchListener;
import lejos.nxt.Button;
import lejos.nxt.Motor;
import lejos.util.Timer;
import lejos.util.TimerListener;

/**
 * 「トライボット」使用
 * その場で回転し、1秒ごとに経過時間を画面に表示する。
 * 
 * @author marunomaruno
 * @version 1.0, 2010/03/08
 * @since 1.0
 */
public class TimerListener02 {
    public static void main(String[] args) throws Exception {

        // 1秒ごとに画面表示するタイマーを設定する。
        TimerListener timerListener = new StopwatchListener();    // (1)
        Timer timer = new Timer(1000, timerListener);

        // 開始する。
        System.out.println("Press any button to start stopwatch.");
        Button.waitForPress();
        timer.start();                                            // (2)
        
        // その場で回転する。
        Motor.B.forward();
        Motor.C.backward();
        
        // 終了する。
        System.out.println("Press any button to stop stopwatch.");
        Button.waitForPress();
        timer.stop();                                            // (3)
        Motor.B.stop();
        Motor.C.stop();

        // プログラムを終了する。
        System.out.println("Press any button to exit program.");
        Button.waitForPress();
    }
}
------------------------------------------------------

□TimerListener timerListener = new StopwatchListener();    // (1)

つぎで作る、ストップウォッチを実装するリスナーのオブジェクトを生成します。


□timer.start();                                            // (2)

タイマーを起動します。


□timer.stop();                                            // (3)

タイマーを停止します。


■ストップウォッチ・リスナー

呼び出されるごとに経過時間を画面に表示するリスナーです。

□StopwatchListener.java
------------------------------------------------------
package jp.marunomaruno.nxt.timer.s01;

import lejos.util.Stopwatch;
import lejos.util.TimerListener;

/**
 * 呼び出されるごとに経過時間を画面に表示する。
 * 
 * @author marunomaruno
 * @version 1.0, 2010/03/08
 * @since 1.0
 */
public class StopwatchListener implements TimerListener {    // (1)

    private Stopwatch stopwatch;                      // (2) ストップウォッチ
    
    /**
     * コンストラクター。
     */
    public StopwatchListener() {
        this.stopwatch = new Stopwatch();            // (3)
        this.stopwatch.reset();                      // (4)
    }
    
    /* (non-Javadoc)
     * @see lejos.util.TimerListener#timedOut()
     */
    @Override
    public void timedOut() {                         // (5)
        System.out.println(stopwatch.elapsed() / 1000);    // (6)
    }
}
------------------------------------------------------

□public class StopwatchListener implements TimerListener {    // (1)

TimerListenerを実装します。


□private Stopwatch stopwatch;    // (2) ストップウォッチ

ストップウォッチ・オブジェクトを入れるフィールドを宣言します。

コンストラクター
---
Stopwatch() 
---
            
メソッド
---
 int elapsed() 
    経過時間をミリ秒単位で返します。

 void reset() 
    時間をリセットします。
---


□this.stopwatch = new Stopwatch();    // (3)

ストップウォッチ・オブジェクトを生成します。

コンストラクターは、この引数のないものだけです。


□this.stopwatch.reset();                // (4)

ストップウォッチをリセットします。


□public void timedOut() {                           // (5)

タイムアウトしたときのメソッドを定義します。


□System.out.println(stopwatch.elapsed() / 1000);    // (6)

ストップウォッチから経過時間を取得して表示します。elapsed()メソッドは、ミリ秒で
取得するので、秒単にするため、1000で割っています。

                                                                        以上

レインボー戦隊ロビン (東映アニメモノクロ傑作撰vol.2)

2010年03月07日 | Weblog
年末に、
サイボーグ009 怪獣戦争 劇場版、1967
http://www.tsutaya.co.jp/works/10017082.html
をレンタルで見たが、このとき、ドルフィン号で海上を行く009たちと、
「レインボー戦隊ロビン」とすれ違うシーンがあった。
「レインボー戦隊ロビン」も見てみたい、ということで、DVDを探したが、
ない。

単体で、4話分入っているDVDはあったが、売り切れ。
結局、この単体の4話分のDVDが入っているボックス
東映アニメモノクロ傑作撰vol.2
を買う。

内容は、以下のとおり。
宇宙パトロールホッパ
第1話:宇宙少年ジュン
第14話:チビッコ政府誕生
第21話:太陽の子ライマン
第27話:お母さんは地球星

レインボー戦隊ロビン
第1話:怪星人現る!
第6話:宇宙にかける虹
第26話:パルタ星最后の日
第28話:リリにおまかせ

海賊王子
第1話:南海の王子
第14話:海賊同盟
第28話:トンダ海峡を突破せよ
第31話:海賊旗よ永遠に

「レインボー戦隊ロビン」は、懐かしい。ロビンも、第1話からからみると、
第28話は相当成長している感じだ。話の内容はあまり覚えていないが、
「教授」や「ベル」は覚えている。
4話分を見て、ますます、レインボー戦隊ロビンを見たくなった。
DVDで出してくれないかしらん。LDでは出ているみたい。でも、LDはいまさ
ら買う気はないが、DVDが出たら、きっと買うだろう。

「宇宙パトロールホッパ」も、不思議だが、ホッパ人については覚えてい
る。というよりも、初期のオープニングは記憶にある。再放送やったのか
な。

「海賊王子」は、見ていなかったと思う。この中では一番新しいものだが、
まったく記憶にないので。主人公のキッドの声を、星飛雄馬やアムロの古
谷徹が子供のころやっていた、ということで、けっこう興味深い。第1話と
第31話では明確に声が違い、これが、声変わりした結果か、と思っていた
が、実は、最初のころは古谷徹がキッドの声ではなかったみたい。
海賊王子が、上の3つの中では一番新しいためか、絵やストーリーがしっか
りしている印象。


CanonのプリンターMP520の不思議

2010年03月01日 | Weblog
CanonのプリンターMP520を使っている。
白黒印刷で、黒インクが残っているのに、カラーインクの分がなくなると
印刷できない。
不思議だ。
上記から考えると当然なのだが、ここ数ヶ月は白黒印刷しかしていないのに、
カラーインクが減る。
なぜだろう。

ちなみに、MP520 は、黒・シアン・マゼンダ・イエローの4色のインクを
使っているタイプ。