public - みる会図書館


検索対象: UNIX MAGAZINE 1996年10月号
6件見つかりました。

1. UNIX MAGAZINE 1996年10月号

連載 / プログラマー入門ーの リスト 3 public import import lmport Observer/Observable をしたデジタル畤計のソース 」 ava ・ applet . * ; 」 ava. ut 土 1. * ; java. awt . *; class CIock2 extends App1et implements Observer Tick tick = nu11; String datestr = nu11 ; public void init ( ) setFont (new Font (getFont ( ) . getName ( ) , public void start() Font . BOLD, 24 ) ) ; tick tick tick public new Tick( (Observer)this) ; . start() ; public void stop() ・ stop(); tick = nu11; VOid update (ObservabIe if (datestr ! = Ⅱ u11 ) { public void paint(Graphics g) repaint() ; datestr (String)arg; 0 , Object arg) g. drawString(datestr,50, 100 ) ; ・ EOF ( ファイルの最御 ・ EOL ( 行末 ) 数字列 ・文字列 されるたびに、ストリームの文字の列から、 StreamTokenizer は、 nextToken() メソッドかま行 UNIX MAGAZINE 1996.10 ・文字列の文字 き出したりすることカそきます。さらに、 キップしたり、引用文字で囲まれた部分を文字列として抜 を抜き出します。また、設定に従って、コメント部分をス class Tick extends ObservabIe implements RunnabIe { Thread thr public Tick (Observer obsv) / / 通知先の Obse て ver を登録する addObserver (obsv) ; = null ; public void start ( ) if (thr = = Ⅱ u11 ) { thr = new Thread(this) ; thr. start(); public void run() while (thr ! = Ⅱ u11 ) { try { Thread. sleep ( 1000 ) ; } catch (InterruptedException e) { / / 状態が変化したことを記録する setChanged() ; Tokenizer を利用して、設定ファイルを読み込むプログ をプログラムで設定することもできます。この Stream- ・コメント文字 ・引用文字 ・空白文字 数列の文字 thr = Ⅱ u11 ; public void stop() notifyObservers(datestr. substring()l , 19 ) ) ; / / 現在時刻を表す文字列とともに Obse て ver へ通知する String datestr = d. t0String() ; Date d = new Date(); ・フォントサイズ ・フォント名 正ファイルは 1 行からなり、 ラムを作ってみましよう。 99

2. UNIX MAGAZINE 1996年10月号

連載 / プログラマー入門ーの リスト 2 Observer を不したプログラム要 public class C10ck2 extends App1et implements Observer フォントの設定 public void init ( ) 時計の停止 public void stop() 時計のスタート public void start() 時刻の文字列を描画する public void paint (Graphics g) 時計を再描画させる 時計の状態の変化を知る関数 表 2 Observer lnterface の全メソッド メソッド式 メソッド E update( 0 わ“ , 。 ) Observable オプジェクトの状態の 変更を受け取る public void update (Observab1e 0 , Object arg) 引数 arg で受け取った時刻を描画させる これで、 CIock2 クラスの処理のあらすしか完成しまし た。あとは、説明の文章をプログラムに変換するだけです。 ObservabIe クラス吏い方 人間の世界では、ふつうは見張られる側より見張る側の ほうが、、しんどい目 " に遭います。ほら、よく刑事ものの ドラマなどでは、犯人力鯨しい部屋のなかでおいしいもの を食べているときに、尾行している廾は炎天 - ドでファス トフードを食べているでしょ ? ところが Java の世界で は、見張る側より見張られる側のほうがすこしよぶんな作 業をしなくてはなりません。 見張る側のコードを思い返してみると、、、 x になった よ " と肩を叩かれるのをひたすら待つだけでした。一方、 UNIX MAGAZINE 1996.10 見張られる側は、 1. 状態の変化の通知先をあらかじめ求する 2. ある操作で状態か変化したらそれを言求する 3. 適当なタイミングで見張る側に状態の変化を通知する の 3 つの処理をおこなってはじめて、 Observer , 、た態の 刻ヒを知らせることカそきます。 表 3 は、 ObservabIe クラスのすべてのメソッドを示 しています。見張られる側の最初の仕事は、状態か変化し たときに通知する Observer オプジェクトを登録するこ とですが、これは addObserver() メソッドでおこないま す。たとえば、日 t オプジェクトの生成時に、通知先のア プレットを addObserver() で求するコードは次のよう になります。 public 時計のコンストラクタ ( ? ? ) addObserver{ アプレット Observer} 2 番目のイ士事は、状態の変化を言求することですが、 れは日 t オプジェクトが 1 秒数えた時点で setChanged() を実行してください。 3 番目の仕事は、状態の変化をアプレットに通知する ことです。 2 不頁の notifyObservers() のどちらも Ob- server オプジェクトに通知できるので、好きなほうを使え はよいでしよう。 notifyObservers() を実行すると、登 録済みのすべての Observer に対して通知が届き、 Ob- server の update() メソッドカ印平び出されます。今回は、 日該リの文字列をアプレットに渡したいので、 public 時計のメソッド ( ? ? ) その他の処理 notifyObservers( 時刻の文字列 ) ; ・その他の処理 とします。 notifyObservers() を実行すると、それまでの状態の 変化の記録はクリアされます。次の notifyObservers( までに setChanged() で状態の変イ求されたときだ け、 notifyObservers() の実行により Observer に通知 されます。このあいだ setChanged() か実行されなけれ 97

3. UNIX MAGAZINE 1996年10月号

連載 / プログラマー入門ーの リスト 1 import import import public デジタ ) 塒計のアプレットのソース java ・ applet . * ; 」 ava. ut i 1 . * ; Java. awt . *; class CIock1 extends App1et implements Runnab1e Thread tick = null; public void init() Font . BOLD , 24 ) ) ; setFont (new Font (getFont ( ) . getName ( ) , / / 24 ポイントのポールド体のフォントを使う public void start() if (tick = Ⅱ u11 ) { / / 時計用のスレッドを生成する tick = new Thread(this) ; tick. start() ; public void run() if (Thread. currentThread() while (tick ! = null) { / / 1 秒ごとに再描画する repaint ( ) ; tick) { は、 11 文字目から 19 文字目の直前の文字 ( つまり 18 文 ん。ときには秒をスキップしてしまうかもしれませんが、 単位の部分は無視しているので、あまり正確ではありませ この日 t は、メソッド呼出しのオーバーヘッドやミリ秒 タル日の出来上がりです。 字目 ) の部分を取り出します。これで、図 2 のようなデジ Thread. sleep ( 1000 ) ; try { run() メソッドの、 かった重要なコードが含まれています。 本題からは外れますが、リスト 1 にはこれまで説明しな 例外里 ご愛敬ということて大目にみてください。 showStatus ( れ sleep() is lnterrupted" ) ; } catch (InterruptedException e) { の部分に注目してください。この try . UNIX MAGAZINE 1996.10 . catch プロ ツ try { Thread. S1eeP(1000) ; } catch (InterruptedException e) { showStatus("sIeep() is lnterrupted") ; public void stop() tick = Ⅱ u11 ; public void paint(Graphics g) / / 現在時刻を保持した Date オプジェクトを作成 Date d = new Date(); / / datestr に時間を表す文字列を設定する String datestr = d. t0String() ; / / 座標 ( 50 , 100 ) の位置に時刻を表示する g. drawString(datestr. substring(ll, 19 ) , 50 , 100 ) ; クは C 言語では見かけなかったコードですね。 Java では、プログラムの実行時に特別な状態 ( たいて いは異常な状態 ) になったときに、さまざまな不鶤頁ク」外 (exception) が発生します。たとえは、あるスレッドが Thread. sleep() 中に他のスレッドが interrupt() を実行 すると、 InterruptedException 伊トが発生します 1 このような伊外を発生するメソッドはかならす、 try { } catch ( 例外の宣言 1 ) { 例外処理 1 } catch ( 例外の宣言れ ) { 例外処理れ } という形式の、 try プロックの内側て呼び出さなくてはな りません。また、 catch の直後の、、例タ ) 旦言 " には、メ ソッドが発生する伊外に対応し列外を言当する必要があ 1 オープンしようとしたファイルカ哘れしないなど、システムカ外を E{E させることもあります。 95

4. UNIX MAGAZINE 1996年10月号

連載 / プログラマー入門ーの 図 4 ファイル覧をするアプレット File Edit View PIaces HeIp IJRL: : / / F L 06000 . e 旧 CS hotiava 0S8 ト h ・ de 信流 00k bin bitmaps 1 i 覗引 02 i e i 覗面 netscape Applet を記 ファイル覧をするアプレットのソース リスト 5 Java ・ applet . * ; import impo rt 」 ava. iO. * ; import 」 ava. awt . * ; App1 et class Fi1eList extends public Fi1e f = Ⅱ u11 ; void init() public / / ディレクトリをオープンする f = new Fi1e("/tmp"); 表 5 FiIe クラスのおもなメソッド メソッドの形式 F ile ( 観ん ) IZHotJava(tm) B 「 0 ” e 「 1. ロ「住 メソッド皀 観んファイルの File オプジェク トを作成する ム別雀限を取得 canRead() canWrite() 書込別限を取得 ファイルかどうかを取得 isFiIe() ディレクトリかどうかを取得 isDirectory() ファイル名を取得 getName() 親ディレクトリを取得 getParent ( ) ディレクトリを作成 mkdir() ファイルを削除 delete ( ) renameTo (file) ファイル名を変更 ディレクトリの下のファイルの一覧 list() を取得 、、・ W ページを表示するアプレットのソース リスト 6 j ava ・ applet . * ; import import Java. net . *; 」 ava. iO. * ; import class ShowWWW extends App1et { public public void init() 二一一口 public void start ( ) try { / / 現在表示している HTML ファイルと、 / / 同じディレクトリにある / / C10ck1. 五 tml ファイルの URL オプジェクトを生成 URL url = new URL(getDocumentBase ( ) , "CIockI . html" ) ; / / App1etContext を取得する App1etContext ac = getApp1etContext ( ) ; / / u て 1 で指定されたページを表示 ac. showDocument (url) ; } catch (Ma1formedURLException e) { } public void paint (Graphics g) / / ディレクトリの下のファイルの一覧 f . list(); String[] flist = for(int i=O; i く flist . length; i + + ) g. drawString(f1ist [ 幻 , 50 , 20 + i * 15 ) ; 「おっと、ちょっと待ったあ。ここで終ったら、見出し ドキュメントを表示するプログラムも中身がたった 3 の Never Ending …は意味不明のままやないか。ちゃん 行の簡単なものなので、ソースコードの例とコメント文で とあの話をせな」 理解してもらいましよう。リスト 6 は、この記事の最初で じつはちょっとしたプログラムのミスが、 ShowWWW 作った CIock1 アプレット (CIock1. html) を表小するア アプレットを Never Ending Applet にしてしまいます。 プレットです。 リスト 7 を見てください。リスト 6 に似ていますが、 「それでは、さよなら、さよなら、さよなら」 URL Ⅱて 1 = new URL(getDocumentBase() , 102 UNIX MAGAZINE 1996.10

5. UNIX MAGAZINE 1996年10月号

連載 / プログラマー入門ーの の第 2 引数か空文字列になっています。この場合、現在 表示している HTML ファイルの URL が生成されます。 すると・・ 、何カ起きるかもうお分かりです 1. 現在表示しているのと同し HTML ファイルをロード して表示する。 2. その HTML ファイルのアプレットが、ふたたひ伺し HTML ファイルをロードして表示する。 3. さらにその HTML ファイルのアプレットが、やはり 同じ HTML ファイルをロードして表示する。 これを、とどまることなくどんどん繰り返してしまいま す。この現象を Never Ending ( 無限に ) といってしま うと、「無限」にうるさい数学者に怒られてしまいますが、 STOP ボタンを押しても止まらないので、状況が分から なければあっけにとられてしまうことでしよう。 Java の / ヾーション この連載で Java 編に突入したころは、 Java 関連の製 品は 0 版ばかりで、製品版は何もリリースされていません でした。しかし、あれから数カ月のあいだに、 Java の生 みの親である Sun Microsystems 以外からも、製品がリ リースされるようになりました。 Java 編の最後は、これらの Java 関連製品のバージョ ン情報て締めくくりましよう。バージョンは 1996 年 8 月 30 日現在のものです。 HotJava 1.0 preBeta 1 Sun Microsystems の Java 対応の Web プラウサ Java DeveIopers Kit 1.0.2 Sun Microsystems の Java の開発キット Java Workshop Dev5 Sun Microsystems のもう 1 つの Java の開発キット Netscape Navigator 3.0 Netscape Communications の Java 対の Web プ ラウサ lnternet Explorer 3.0 Microsoft の Java ヌ寸応の Web プラウサ 2 2 Windows 版のみで UNIX 版はありません。 UNIX MAGAZINE 1996.10 リスト 7 import import xmport public public public Ⅵ石Ⅵ石 W ・べージのロードを繰り返し続けるアプレッ 」 ava. iO . * ; java. net . *; Java ・ applet . * ; トのソース void start ( ) void init() class ShowWWW extends AppIet { try { / / このアプレットを表示している HTML ファイルの URL が / / url 変数に設定される URL url = new URL(getDocumentBase ( ) , / / App1etContext を取得する App1etContext ac = getApp1etContext ( ) ; / / url で指定されたページを表示 ac. showDocument (url) ; } catch (Ma1formedURLException e) { } Java 十 Script JavaScript? Java は WWW の世界に新しい風朝を惹き起こしまし た。ただ、 Java がコンパイルが必要な言語であることは、 やはり大きなネックです。コンパイルエラーで未不明の 工ラーメッセージが表示されたため、先へ進むのをやめて しまった人もいたのではないでしようか ? その点スクリプト言語なら、山冬的にはどこかでつます くにしても、すこしでも動き始めてくオレば感動もひとし おです。たとえ相手カ噺しい言語でも、取り組む勇安仂ゞ湧 きます。 そこで、次回からは Java 言言韶 ) スクリプト版と一碚にで 宣伝している、 JavaScript をとりあげます。コンパイル 言語とスクリプト言語の扱いやすさや、言語仕様の違いを 上交しながら読むのもおもしろいでしよう。 ( あらい・みちこ ASTEC) 103

6. UNIX MAGAZINE 1996年10月号

連載 / プログラマー入門ーの import xmport import import リスト 4 implements Observer { public class C10ck3 extends App1et java ・ i0. *; / / java ・ i0 パッケージ import を追加 」 ava. avt . * ; 」 ava. ut i1. * ; Java ・ applet . * ; StreamTokenizer てファイルを読み込む Font font = Ⅱ u11 ; / / 設定ファイルから読み込んだフォント String datestr = null; Tick tick = Ⅱ u11 ; setFont (font) ; / / フォントを設定する IoadPreference ( ” CIock3. txt / / 設定ファイルを読み込むメソッド public void init() nev Fi1eInputStream(fi1ename) ; Fi1eInputStream fs = / / filename ファイルをオープン try { int size = int style = 0 ; String name = public void IoadPreference (String filename) / / 文字の設定をクリアする必要がある / / vordChars() を実行する前に、 new StreamT0kenizer (fs) ; StreamTokenizer st / / StreamTokenizer オプジェクトを作る st . whitespaceChars ( (int) ' : ' st. ordinaryChar ( (int) , : , ) ・ / / コロンを空白文字として指定する st . wordChars ( (int) ' / / 半角スペースを文字列の文字として指定する st . ordinaryChar ( (int) ' Never Ending . showDocument() は名前のとおり、ドキュメントを表 ては showDocument() メソッドです。 pletContext すべてに興未があるわけではなく、お目当 な AppletContext lnterface ・です。とはいっても、 Ap- 最後に紹介するのは、 AppIet クラスの影武者のよう UNIX MAGAZINE 1996.10 示するメソッドです ( 誌面の都合上、で折り返してい / / フォント名を読み込む if ()t . nextToken() StreamT0kenizer. TT—WORD) { st . sva1; nam. e } else { return; / / フォントサイズを読み込む if ()t . nextT0ken() StreamT0kenizer. TT—NUMBER) { (int) st . nval ; SIZe } else { / / EOF になるまで、フォントスタイルを読み込む showStatus ( "Cannot Read: ” + filename) , catch (IOException e) { showStatus ("N0t Found : ”十 filename) ; } catch (Fi1eN0tFoundException e) { fs . close(); / / ファイルをクローズする style ー = Font . PLAIN; } else if ()t . sval ・ equa1s("PLAIN") ) { style ー = Font . ITALIC ; } else if ()t . sval ・ equa1s("ITALIC")) { style ー = Font . BOLD ; if ()t . sval . equa1s("BOLD")) { ! = StreamT0kenizer . TT_EOF) { while ()t . nextT0ken() font = new Font(name, style, size) ; / / フォント変数に設定する / / フォントオプジェクトを作り、 これ以降のメソッドと Tick クラスは C10ck2 と同様 ます ) 。 101 URL クラスのオプジェクトです。 味する URL (Uniform Resource Locator) を表現する の、、 URL オプジェクト " は、 WWW ページの位置を意 オプジェクトが示すべージを表示します。もちろん、 を実行すると、カレントページと入替えに、引数の URL . showDocument (URL オプジェクト ) App1etContext オプジェクト