takaiwa.net

Android、Java、Web系、Linux、マラソン等の備忘録

2011/09/29

LinuxのJavaアプリケーションをリモート(Windows)のEclipseでデバッグ

0 件のコメント

試した環境


■実行環境

  • OS:Linux CentOS 5
  • java version "1.6.0_21"

■デバッグ環境

  • OS:Window XP SP3
  • java version "1.6.0_25"
  • Eclipse:Eclipse IDE for Java Developers Version: Indigo Release

 

Eclipseで提供されているコネクタについて


Eclipseで提供されているコネクタは2種類あります。

  • Socket Attach
  • Socket Listen

 
socketattachlisten

Socket Attachを利用した場合は、この環境ではLinux側が接続されるホストになり、逆にSocket Listenの場合はEclipse側が接続されるホストになります。

どちらでやってもJavaアプリのデバッグは行えます。大まかな指針としては、計算リソースから考えてスペックの強力な方をホストにするのが良いそうです。実行環境がモバイル端末とかなら明らかにホストはEclipse側でしょうか。。

また、コネクタに8000ポートを使うのでファイアウォールなど設けてる場合はポートを開ける必要があります。この環境で言えば、LinuxはWebサーバとして公開しているので、無駄にポートは開けたくないところ。。というわけで、Eclipse側をホストにするSocket Listenを採用したいと思いますが、やり方自体はそんなに大きく変らないので、両方試してみました。

デバッグ用のサンプルコード

サンプルコードというか、とりあえず動くかどうかが分かれば良い程度のコード。 System.out.printlnあたりにブレークを貼って、ブレークポイントに止まる事をEclipse上で確認。

package remotedebug;

public class RemoteDebugHello {

/**
* @param args
*/
public static void main(String[] args) {
System.out.println("Hello Remote Debug!");

}

}


Linuxマシンで実行しやすようにプロジェクトをJARファイルとして出力。




  1. プロジェクトを右クリックしてExportを選択


  2. JavaのRunnable JAR fileを選択


  3. 出力したいクラスを選択し、JARファイル名を入力してそのままFinishボタンを押下



WS000220



出力されたJARファイルをLinuxマシンにアップロードして、動くかどうか実行してみる。





$ java -jar RemoteDebugHello.jar




Socket Attachモードでデバッグしてみる





前述した通り、ポート8000を使うので、Linux側のファイアウォールに8000を使えるようにしておく。ポートを開けないで、デバッグを行おうとすると、Eclipse側で「Failed to connect to remote VM. Connection timed out.」というエラーダイアログが出ました。




以下のコマンドでLinux側のホストの準備をさせておきます。




$ java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,address="8000" -jar RemoteDebugHello.jar




Eclipse側は、メニューで Run (実行) > Debug Configurations (デバッグの構成) の順にクリックし、さらに Remote Java Application (リモート Java アプリケーション) をダブル・クリックします。



WS000213 




  • Name:(任意の名前)


  • Project:Browseボタンでサンプルコードのプロジェクトを選択


  • Connection Type:Standard(Socket Attach)を選択


  • Host:(LinuxマシンのIPアドレス)


  • Port:8000



と設定。Allow termination of remote VMにチェックを付けると、アプリケーションのデバッグ中に接続先の VM を終了できるようになります。これでDebugボタン押下でデバッグが始まります。。。



ところが、「Failed to connect to remote VM. Connection refused. Connection refused: connect」というエラーダイアログ。。




原因はよくわかりませんが、ググってみると、VMを再起動させれば良いということで、上記のLinux側のコマンドを停止させ、再度コマンドを実行し、もう一度EclipseのDebugボタンを押下すると上手くいきました。




↓貼ってたブレークポイントに引っかかった(緑のライン)




WS000215





Socket Listenモードでデバッグしてみる





今度はEclipse側がホストになるので、Eclispse側から動かします。


先ほどのDebug Configurations画面でConnection Type:Standard (Socket Listen)を選択してDebugボタンを押下。



WS000217 


接続待機中と表示されます。


続いて、Linux側で以下のコマンドを実行します。






$ java -Xdebug -Xrunjdwp:transport=dt_socket,address=192.168.1.2:8000,suspend=y -jar Remo
teDebugHello.jar


上記の192.168.1.2の部分はWindowsマシンのIPアドレスに変更してください。



WS000219






ブレークポイントに引っかかりました。 



 

[参考文献]
Eclipse を使ってリモートで Java アプリケーションをデバッグする

2011/09/25

サーバのメモリやCPUリソース監視に役立ちそうなコマンド

1 件のコメント

コマンドを確認したOS

  • CentOS 5

コマンドでのメリット

障害対応や原因究明のような緊急を要する作業には、GUIの解析ツールよりコマンドでの解析の方が汎用的。

システム管理の項目

構成管理 システムをこうせいする機器やソフトウェアといったリソースを管理したり、各リソースの設定情報などを管理
障害管理 異常を検出したら、その箇所を特定し、回復にあたる。また、事前に障害を定義し、検出の方法や対策、またはシステム予防などを取りまとめる
性能管理 システムの稼働状況などを基に、一定の性能を保っているか監視し、その維持にあたる
セキュリティ
管理
脆弱性対策、サービス停止攻撃に対する防御など、システム保護につとめ、セキュリティリスクを低減する。また、事前にセキュリティポリシーを策定
課金管理 使用したリソースを基に超すとを算出したり、課金に必要な情報を収集

Software Design (ソフトウェア デザイン) 2011年 02月号 [雑誌] 特集1:サーバ・ネットワーク超管理術より引用

ここでは、性能管理のCPU稼働率やメモリ使用率などをチェックしたい

psコマンド

起動中のプロセスの状態を一覧表示。

[httpプロセスの状態を確認したい場合 ]

# ps aux | grep httpd | grep -v grep
apache 1541 0.0 3.1 51744 32576 ? S Sep19 0:35 /usr/sbin/httpd
root 2495 0.0 1.4 31920 15112 ? Ss Aug27 0:01 /usr/sbin/httpd
apache 3238 0.0 3.4 54364 35208 ? S Sep18 1:18 /usr/sbin/httpd
apache 3239 0.0 3.4 54620 35344 ? S Sep18 1:18 /usr/sbin/httpd
apache 3240 0.0 3.4 54256 35052 ? S Sep18 1:10 /usr/sbin/httpd
apache 15076 0.0 3.3 53708 34572 ? S Sep18 1:17 /usr/sbin/httpd




[オプション]


















a 全ユーザのプロセスの状態を表示
u プロセスのユーザ名と開始時刻を表示内容に付加
x 制御端末を持たないデーモンなどのプロセスも合わせて表示





[上記のオプションで表示される内容(左から順番に)]






















































USER プロセスの実行ユーザ
PID プロセスID
%CPU CPU時間と実際に処理した時間の比率
%MEM 実メモリの使用率
VSZ プロセスの仮想メモリサイズ(kbytes単位)
RSS プロセスが使用している物理(スワップされていない)メモリサイズ(kbytes単位)
STAT 別表参照
START 開始時刻
COMMAND 実行しているコマンド





[STATの表示内容(1文字目)]











































D


ディスク(あるいは他の割り込み不可能な短期間の)待ち状態

I


idle状態(20秒以上スリープしている)

J


jail上で実行

R


runnable(実行可能)状態

S


20秒未満のsleep状態

T


stop状態

Z


死んでいる(ゾンビ)状態





[STATの表示内容(2文字目)]









































































+


プロセスはその制御端末のフォアグラウンドプロセスグループに属している

>


CPU のスケジュール優先度が上げられている

<


メモリ要求に対するソフトリミットが指定されており、現在そのリミットを超えている。このようなプロセスは(必然的に)スワップされない

A


ランダムなページスワップを要求した

E


終了しようとしている

L


実メモリ中にロックされたページを持っている

N


プロセスはスケジューリング優先度が下げられている

S


FIFO ページスワップを要求した

s


セッションリーダである

V


vfork の間、一時中断されている

W


スワップアウトされている

X


トレースされているかデバッグされている




grep -v grepはこれを入れないと、このコマンドのプロセスも拾ってきてしまう。



[sortコマンドでCPU使用率順に表示]



# ps aux | sort -nr -k 3


[sortコマンドでメモリ使用率順に表示]
# ps aux | sort -nr -k 4





[ソートのオプション]


















-n 先頭の文字列を数値として扱う
-r 比較の結果を逆順にする
-k<位置1> [, <位置2>] ソートするのに用いるフィールドを指定する。<位置1>から<位置2>の直前までがソートキーになる。


上記のコマンドだとたくさん表示されるかもしれないので。





# ps aux | sort -nr -k 4 | head -n 10




とすると、メモリ使用率の上位10件を降順で表示してくれる。







topコマンド



システムやプロセスのリアルタイムな稼働状況を表示する



$ top

top - 11:26:33 up 28 days, 19:16, 1 user, load average: 0.06, 0.06, 0.00
Tasks: 125 total, 1 running, 123 sleeping, 0 stopped, 1 zombie
Cpu(s): 4.3%us, 3.6%sy, 11.6%ni, 80.5%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 1027196k total, 798976k used, 228220k free, 145096k buffers
Swap: 2031608k total, 88k used, 2031520k free, 341680k cached

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND








[1行目]
























11:26:33 現在時間
up 28 days, 19:16 稼働時間(28日と19時間16分稼働中)
1 user ログインユーザ数
load average: 0.06, 0.06, 0.00 CPU待ちのプロセス数の1分、5分、15分ごとの平均値。一般的にはこの数字が大きいほどCPUの負荷が高いと考えられる








[2行目(プロセス(タスク)関連)]






























125 total 総稼動プロセス数
1 running 稼働中のプロセス数
123 sleeping 待機中のプロセス数
0 stopped 停止プロセス数
1 zombie ゾンビ・プロセス数







[3行目(CPUの使用状態)]
















































4.3%us ユーザプロセスによる使用率
3.6%sy システムプロセスによる使用率
11.6%ni 優先指定プロセスによる使用率
80.5%id システム アイドル率
0.0%wa ファイルIOの待ち時間
0.0%hi ハードウェア割込み要求での使用時間
0.0%si ソフトウェア割込み要求での使用時間
0.0%st steal time。不本意なCPU時間消費(直訳でスマソ)







[4行目(メモリの状態)]
























1027196k total メモリ総量
798976k used 使用したメモリ量
228220k free 未使用メモリ量
145096k buffers バッファキャッシュの量







[5行目(スワップ領域の使用状況)]
























2031608k total スワップ領域総量
88k used 使用したスワップ領域の量
2031520k free 未使用スワップ領域の量
341680k cached ファイルキャッシュの量







[カラム]















































































PID プロセスID
USER タスクの所有者の実効ユーザ名
PR タスクの優先度
NI タスクのnice値
VIRT 仮想イメージ。タスクが使用している仮想メモリの総量(KB)

VIRT = SWAP + RES
SWAP タスクの総仮想メモリイメージのうちスワップされたサイズ(KB)
RES タスクが使用しているスワップされていない常駐している物理メモリ

RES = コードサイズ(KB) + 実効可能コード以外に割かれる物理メモリ(KB)
SHR タスクが利用している共有メモリの総量(KB)
S プロセスの状態

D:割り込み不可能なスリープ状態


R:実行中


S:スリープ状態


T:トレース中/停止された


Z:ゾンビ
%CPU CPU使用率。
%MEM メモリ使用率。タスクが使用している利用可能な物理メモリの占有率
TIME+ CPU時間。(1/100単位)
COMMAND プログラム名


上記のように単発でtopコマンドを実行した場合は、リアルタイムに状況を見ることができる。通常はCPU使用率順になっている。「Shift + M」でメモリ順に並べ替える事もできる。リアルタムの状況は目視で確認しやすいが統計的に調べるには、バッチモードで定期的に結果を出力させる方法もある。






$ top -b -d 1


 














-b バッチモードで起動
-d スクリーンの更新間隔。この場合、1秒間隔で出力される



 


$ top -b -d 1 >> log.txt


このようにファイルに書き込む事もできる。





freeコマンド







システムの空きメモリと利用メモリの量を表示する






 free -s 2



 







-s 後に指定する数字の秒間隔でポーリングを行う(この場合2秒間隔)


 


             total       used       free     shared    buffers     cached
Mem: 1027196 808728 218468 0 150476 342224
-/+ buffers/cache: 316028 711168
Swap: 2031608 88 2031520





[カラム]































total メモリの総量
used 使用したメモリ量
free 空きメモリ量
buffers バッファに利用(転用)されるメモリ量
cached キャッシュに利用(転用)されるメモリ量



実際に空いているメモリ:free + buffers + cachedで計算できる。計算しなくても赤字の部分が空いているメモリ量。



vmstatコマンド







メモリーやCPUの負荷率や使用状況を表示する






$ vmstat 2
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 88 218040 150676 342324 0 0 3 16 12 3 1 0 99 0 0
0 0 88 217876 150676 342324 0 0 0 0 1072 1465 24 6 71 0 0


2秒間隔で状況を表示する









































Procs b: 割り込み不可能なスリープ状態にあるプロセス数
Memory

swpd: 仮想メモリの量。

free: 空きメモリの量。


buff: バッファに用いられているメモリの量。


cache: キャッシュに用いられているメモリの量。


inact: アクティブでないメモリの量 (-a オプション)。


active: アクティブなメモリの量 (-a オプション)。


Swap

si: ディスクからスワップインされているメモリの量 (/s)。

so: ディスクにスワップしているメモリの量 (/s)。


IO

bi: ブロックデバイスから受け取ったブロック (blocks/s)。

bo: ブロックデバイスに送られたブロック (blocks/s)。


System

in: 一秒あたりの割り込み回数。クロック割り込みも含む。

cs: 一秒あたりのコンテキストスイッチの回数。


CPU

これらは CPU の総時間に対するパーセンテージである。

us: カーネルコード以外の実行に使用した時間 (ユーザー時間、nice 時間を含む)。


sy: カーネルコードの実行に使用した時間 (システム時間)。


id: アイドル時間。Linux 2.5.41 以前では、IO 待ち時間を含んでいる。


wa: IO 待ち時間。Linux 2.5.41 以前では、0 と表示される。


2011/09/20

Twitterの個別つぶやきURLからブログなどへ貼り付けるHTMLタグを生成するスク リプト

0 件のコメント

タイトルの通りですが、Twitterのつぶやきをブログなどで引用したい場合に、つぶやきのURLからHTMLタグへ変換するスクリプトを作りました。


ss1


操作は、上図のようにTwitterのつぶやきの個別ページへ行って、

http://twitter.com/#!/takaiwa29/status/115752810422878208

のようなリンクをコピーし、変換ページのTweet url欄へ貼り付けて、「submit」ボタンを押せば、薄黄色枠にHTMLコードを出力します。

HTMLコードは、以下の2種類用意しています。

  • スタイル属性埋め込み(HTMLコードのみ)
  • スタイルシート分離(CSSコード+HTMLコード)


スタイル属性埋め込みは、デザインをstyle=””アトリビュートで記述しているので、ブログ等へそのままHTMLコードを貼り付けられます。スタイルシート分離の方は、そのstyleアトリビュートの部分をスタイルシートへ記述しているので、CSSコードとHTMLコードをそれぞれ貼り付けてください。

デザインは、

Simple Style(NAVERの引用風)

WS000201

と、

Balloon Style(Togetter風)を用意しています。

 WS000202

お好みでスタイルシートを編集してみてください。ちなみに、スタイルシートの大まかなclassの構成は、

Simple Style :

simplestyle


Balloon Style:

bs

スクリプトの動作は、Firefox、Chrome、Opera、Safariで確認しましたが、ほとんどやっつけなので、何かバグ等あればコメントに下さい。

URLは、

http://twitter.com/#!/○○○/status/☆☆☆

○○○:アカウント名(screen name)
☆:任意の数字

の形で入力してください。それ以外形式は取得できません。



■2011/10/20 追記
URLのアカウント名にアンダースコアが入ってるとTweetを取得できなかったので、取得できるよう修正。

2011/09/16

NETBOOKから異音がするので分解しようとして後悔した件

3 件のコメント

マウスコンピュータのネットブック(LB-F1500W)から異音がするので、


何で異音がでるんだ?ということで、分解して調べてみようと。。

DSC_0741 

上図の格子状になってるCPUファンあたりが怪しいなと、裏側のネジを外してみました。見える部分のネジを外しても、一向に外れる気配のないnetbook。。

何かカラクリがあるはずだ!と、いろいろ見ていると、

P9150064

お!∑(゜∀゜)

P9150065

隠し扉 ハケ━━(σ゚∀゚)σ━━ン!!

とテンション上がっていたのもつかの間、

DSC_0744

こちら側は外れようとしているものの、

DSC_0745

DVDドライブ側に外れる気配なし。。。( ゚_゚)ポカーン
というわけで、誰か分解してる人いるだろうとググってみました。

・ノートPCの蓋の外し方(マウスコンピュータ製) | OKWave
http://okwave.jp/qa/q1054624.html

[ベストアンサーを抜粋]
勝手に分解すると、メーカーが修理を拒否する場合がありますから、一般人は絶対やってはいけません


・マウスコンピューターのノートPCのHDDを交換したいのですが | OKWave
http://okwave.jp/qa/q6016538.html

現物見てわからないならやめておいたほうがいいですね
あなたには無理だと思います
対処できる人間ならば現物見て自分で探りながらバラします

まぁそんなわけで、素人は触んな!ってことですね(;^_^A
これ以上やると、自分で元に戻せなくなりそうなので、異音の件は諦めます。とりあえずお金貯めましょう。。ってことで、組み立て再開。

と思ったら、ネジ1本ない!!

とりあえず、無しでも固定はされてそうなので、電源ON!(;^_^A

あれ(゚Д゚≡゚Д゚)? タッチパッドでマウスポインタ動かせない!!なんで!?

P9150069 

よく見たら、盛り上がってるしw\(^o^)/
まぁUSBマウスさせばおkなんですが、お布団の上でのうつぶせライフは本日をもって終了ということで。。。。。。○| ̄|_

危険かもしれませんが、利用できるうちは使い続けるということで。。MADE IN CHINAと書いてあるので、そのうち爆発するかもしれませんが。。。w

2011/09/11

Design Pattern : Adapter

0 件のコメント

どんなパターン?


  • インタフェースに互換のないもの同士を組み合わせる事ができるようにする。
  • 既存クラスに一皮かぶせて必要とするクラスを作る


具体的な例を挙げるなら、増補改訂版Java言語で学ぶデザインパターン入門にも取り上げられているように、ノートパソコン等のACアダプターの例が分かりやすいと思う。

designpatternadapter


当たり前の事だが、ノートパソコンを動かすには直流12Vの電源が必要で、コンセントの交流100Vの電源をACアダプターを使って、直流12Vに変換している。

このように、「既に提供されているもの(交流100V)」と「必要なもの(直流12V)」のギャップを埋めてくれるのがAdapterでこのような考え方をデザインパターンにしたのが、Adapterパターン。

どんな場合に適用できる?


  • 既存のクラスのインタフェースが必要なインタフェースと一致していない場合
  • 既存のクラスを利用することで、実装工数やテスト工数が大幅に削減できる(テスト実績があるクラスを利用したい)場合
  • バージョンアップ等により古い版と新しい版の互換性を持たせて共存させたい場合

テスト実績があるクラスを利用している場合、もしバグが発生しても、Adapter役のクラスを重点的にチェックすれば良い。もし、Adapterパターンを適用する際に、既存クラスもいぢってしまうと、テスト範囲が既存クラスにまで及ぶので、注意が必要。

構造(継承を使ったもの)


WS000197

構造(委譲を使ったもの)


WS000198

構成要素


Target Clientが必要とするメソッドのインタフェースを定義
Client Targetのインタフェースを利用して仕事を行う
Adaptee 既存の(テスト実績があるなどの)クラス。一皮かぶせられるクラス
Adapter AdapteeクラスのインタフェースをTargetクラスのインタフェースに適合させる。一皮かぶせるクラス

2011/09/04

Design Pattern:Iterator

0 件のコメント

どんなパターン?

ある集合の内部実装を知らなくても、その要素へ順番にアクセスする方法を提供

どんな場合に適用できる?



  • 数える対象の内部実装と切り離して数え上げを行いたい場合
  • 異なる集合に対して、単一の数え上げインタフェースを実装したい場合
  • 数える対象の総数が予め分かっていない場合に効果的(テキストファイルの内容を、先頭から1行ずつ取得する場合など)

 

構造

図1-1 Iteratorの構造 
図1-1 Iteratorの構造


Iteratorのインタフェースのメソッドには、上記以外にも、

  • First() :カレント要素を1つめの要素として初期化
  • CurrentItem():現在の要素を返す


などの機能を実装しても良いかもしれない。


構成要素



Iterator 順番に走査していくインタフェース(API)を定義する
ConcreteIterator Iteratorで定義したインタフェースを実装する。
Aggregateオブジェクトの走査の最に、カレント要素を保持
Aggregate Iteratorオブジェクトを生成するためのインタフェースを定義
ConcreateAggregate Aggregateが定義しているインタフェースを実装する。



 

サンプル


数える所だけ着目して、お寿司屋さんの大将をメインにふざけたサンプルを作ってみました。ツッコミどころは探せばいくらでもあると思いますが、まあこんな使い方ということで。

WS000189 

原形をとどめなくなってもいけないので、上図1-1に数え上げの対象となるSushiクラスを追加し、Concreteの部分だけお寿司屋さんっぽくして、それを使うMainTaishouクラスを加えました。

MainTaishouクラスでは、

  1. お客さんの注文を聞く
  2. お会計(お寿司の数え上げ)


を行います。

サンプルの全体像




※画像サイズが2605×3641と無駄にでかいので注意




ソースコード一覧


Iterator.java
package SampleIterator;

public interface Iterator {
public abstract boolean hasNext();
public abstract Object next();
}



Aggregate.java
package SampleIterator;

public interface Aggregate {
public abstract Iterator iterator();
}



Order.java
package SampleIterator;

import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;

/**
* 注文クラス
* @author takaiwa.net
*
*/
public class Order implements Aggregate{

// お寿司料理金表(ネタ、値段)
private Map<String,Integer> nedanhyo = new HashMap<String, Integer>() {{
put("いわし", 130); put("こはだ", 130);
put("タマゴ", 170); put("さんま", 170);
put("かんぱち", 220);put("さば", 220);
put("大トロ", 280);
}};

private LinkedList<Sushi> denpyou = null;

public Order() {
// 空の注文伝票を作成
this.denpyou = new LinkedList<Sushi>();
}

/**
* お客さんから注文を受け付ける
* @param sushi
*/
public void append(Sushi sushi) {
// 注文されたお寿司を伝票へ
this.denpyou.push(sushi);
}

/**
* 値段表から食べた寿司の情報を返す
* @return
*/
public Sushi getItem() {
Sushi sushi = this.denpyou.pop();
String name = sushi.getName();
// 値段の書き込み
sushi.setPrice(this.nedanhyo.get(name));
return sushi;
}

/**
* お皿の枚数を返す
* @return
*/
public int getItemSize() {
return this.denpyou.size();
}

public Iterator iterator() {
return new OrderIterator(this);
}
}



OrderIterator.java
package SampleIterator;

/**
* 注文Iteratorクラス
* @author takaiwa.net
*
*/
public class OrderIterator implements Iterator{

private Order order = null;
private int item = 0;

public OrderIterator(Order order) {
this.order = order;
}

public boolean hasNext() {
if(this.item < order.getItemSize()) {
return true;
}
else {
return false;
}
}

public Object next() {
Sushi sushi = this.order.getItem();
this.item++;
return sushi;
}
}



Sushi.java
package SampleIterator;
/**
* 寿司クラス
* @author takaiwa.net
*
*/
public class Sushi {
private String name = null;
private Integer price = null;

/**
* コンストラクタ
* @param name
*/
public Sushi(String name) {
// 寿司の名前を設定
this.name = name;
}
/**
* 寿司の名前を返す
* @return
*/
public String getName() {
return this.name;
}
/**
* 値段の設定
* @param price
*/
public void setPrice(Integer price) {
this.price = price;
}
/**
* 値段を返す
* @return
*/
public Integer getPrice() {
return this.price;
}
}



MainTaisho.java
package SampleIterator;

/**
* 大将クラス
* @author takaiwa.net
*
*/
public class MainTaisho {

/**
* @param args
*/
public static void main(String[] args) {

System.out.println("いらっしゃせー、何にしましょう?");

Order order = new Order();

// お客さんの注文を聞く
order.append(new Sushi("タマゴ"));
order.append(new Sushi("いわし"));
order.append(new Sushi("さんま"));
order.append(new Sushi("かんぱち"));
order.append(new Sushi("大トロ"));
System.out.println("へい、おまち!");

// お会計
System.out.println("お会計は...");

Integer total = 0;
Iterator okaikei = order.iterator();
while(okaikei.hasNext()) {
Sushi sushi = (Sushi)okaikei.next();
System.out.println(sushi.getName() + " " + sushi.getPrice() + "円");
total += sushi.getPrice();
}

System.out.println("合計で" + total + "です。");
}

}


実際の実装例




Java自体に実装されています。
上記ソースにも登場した、LinkedListもそのオブジェクトをMainTaishouに返せるなら、直にIteratorで数え上げ可能です。あとは、SetインタフェースがIteratorを実装しているので、HashMap等でentrySetメソッドを実行するなどして、Iteratorで数え上げもできます。


参考文献




ふざけたサンプルより、まともなサンプルが見たい方は、


が参考になるかと思います。

関連しているパターン




  • Vistor パターン

  • Composite パターン

  • Factory Method パターン