サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
ノーベル賞
www.asahi-net.or.jp/~dp8t-asm
この表から分かるのはXMLがすべての項目で要件をクリアしていることです。逆にHTMLとSGMLは項目ごとに得意・不得意がはっきりしています。PDFは表示以外の項目にあまり良い点数がついていませんが、これはフォーマットの目的の違いによるもので優劣という形で判断すべきことではないことは言うまでもありません。 XMLのアーキテクチャ XMLの言語仕様は32ページの非常にシンプルなものですが、もちろんこれだけでXMLの世界を理解することはできません。XMLを中心とした数多くの機能から構成されるアーキテクチャ全体が重要なのです。 本稿では便宜上XMLのアーキテクチャを以下の4つに分類してみました。(図(XMLのアーキテクチャ) ) 基本仕様 アプリケーション言語 インタフェース 応用 本節では、基本仕様、アプリケーション言語、インタフェースについて説明します。応用は次節「XMLの用途」で取り上げます
コーディングレベルの速度の最適化というものは、システム全体のバランスと いう観点からは必ずしも重要度の高いものとはいえません。 長い目で見た場合、速度よりも信頼性や拡張性、保守性の方が重要だからです。 過度の最適化は可読性と相反する要素も多く、さらに設計の範囲を狭めてしま うことすらあります。 それにもかかわらず得られる速度は些細であることが多いのです。 しかしこのレベルの最適化を無視してよいのかというとそうではありません。 議論を進める前に具体的な例を見てみましょう。 以下の表はjavac -Oによりコンパイルしたプログラムをjavap -cにより逆アセ ンブルしたものです。 アセンブラのコメントは筆者が補っています。 Javaソースとコンパイル結果(JDK 1.1.3) Java アセンブラ 0 iconst_0 // [stack] = 0 1 istore_2 // i = [st
記号 UMLのクラス図ではクラスは以下に示すクラスアイコンで表現されます。 左側のクラスアイコンは簡略形で最低必要な情報を表示したもので、右側のク ラスアイコンは全情報を表示した形です。 クラスアイコン内の情報は必要に応じて省略することが可能で左側のクラスア イコンと右側のクラスアイコンの間の任意の形式を目的に応じて選択すること ができます。 中央のクラスアイコンが通常用いられる形式です。 クラスアイコンは3つの四角で構成されています。 上側の箱は名前コンパートメントでクラス 名前やクラスの種別が表示されます。 中央の箱は属性コンパートメントで属 性のリストが表示されます。 下側の箱はオペレーションコンパートメン トでオペレーションのリストが表示されます。 属性コンパートメント(中央)とオペレーションコンパートメント(下側)は省略 可能です。 UMLではclassはname compart
小学校の算数では掛け算、割算はそれぞれ足し算、引き算の繰り返しと教えていますが、コンピュータのCPU内で行われている演算も基本は同じです。 足し算と引き算を使って割算を行うプログラムはJavaでは次のように書くことができるでしょう。 演算終了後、変数divisionとremainderにそれぞれ商と剰余が格納されます。 int lhs = 27; int rhs = 3; // do division int division = 0; int remainder; while (lhs >= rhs) { division++; lhs -= rhs; } remainder = lhs; ここでおもしろいのは割算の計算の結果、商と剰余が同時に求まるということです。 Javaでは除算の、商を求めるオペレータと剰余を求めるオペレータとして別々に用意されています。"/"が商、"%"が剰余を求
Meadow de JDEは最強のJava開発環境であるJDE(Java Development Environment)をWindows版emacsであるMeadow上で使用するためのノウハウを公開します。 もちろん情報の多くはUNIX上で動作する一般的なemacsでも有効です。
java.io.Readerとjava.io.Writerには行単位の入出力を行うための機能が定義 されていないので、必然的にjava.io.BufferedReaderと java.io.BufferedWriterが実質的な基本クラスとなります。 ファイルアクセスのためのキャラクタストリームはjava.io.FileReader、 java.io.FileWriterで生成することができるのですが、残念ながらコード系を 指定することができないためデフォルトのコード系変換しか使用することがで きません。 日本語を扱わなければならない我々の場合は、java.io.FileInputStreamと java.io.FileOutputStreamとInputStreamReaderとOutputStreamWriterを組合 わせて適切なコード系変換を行う必要がありま す。 入力 キャラクタ
この文書を処理するプログラムは次のようになります。 このプログラムはHelloWorld文書のgreetingタグの内容を表示するものになっています。 HelloWorld.java import java.util.Vector; import java.net.URL; import java.io.OutputStream; import java.io.PrintWriter; import jp.gr.java_conf.jaba2.io.UURL; import org.w3c.dom.DocumentContext; import org.w3c.dom.Document; import org.w3c.dom.Node; import org.w3c.dom.NodeEnumerator; import org.w3c.dom.Element; import org.w3c
$ java -jar setup.zip インストールツールが起動されますので、その指示に従ってください。 HelloWorld リスト3.1[hello.xml]はHello WorldのためのサンプルのXML文書です。 <?xml version="1.0" ?> <!DOCTYPE greeting SYSTEM "hello.dtd"> <greeting to="xmluser@xml.gr.jp" from="asami@zeomtech.com"> <title>hello</title> <message>Welcome to Relaxer world</message> </greeting> リスト3.2[hello.rng]はこのXML文書のRELAX NGスキーマです。 <?xml version="1.0" encoding="UTF-8" ?> <gramm
なお最適化の判断基準となるバイトコードはJDK 1.1.4(一部JDK 1.1.3)のjavac -Oにより生成しています。 このコンパイラの最適化は少しおばかさんで、10年以上前のUNIXにバンドルさ れていたポータブルC程度のようです。 変数の宣言の順番やregister宣言を駆使して、生成されるアセンブラコードを 想定しながらCのコーディングを行っていたというかつてのUNIX Wizardにとっ ては腕を奮う(最後の?)チャンスといえますね。 しかし、最新の最適化技術を搭載したコンパイラが近い将来に登場することは 明らかであり、あまり現在のコンパイラの出力にこだわってしまうのも得策と いえません。 そこでこのページでは以下の方針を取ることにしました。 できるだけJava VMのバイトコードの特性に起因する最適化を対象にする Javaコンパイラのクセに起因する最適化については、その旨、
ストリームはあらかじめサイズが分かっていないテキストを操作するのには適しているアクセス方法ではあるのですが、やはり文字列として一度メモリ内に読込んで操作する方が便利です。 ここではストリームから文字列を作る方法について考えてみます。 まずは最もシンプルな例。 ファイルからjava.io.FileReaderで入力ストリームを作成し、そこから読込んだ文字をjava.io.StringWriterに書き込んでいます。 最後にStringWriterのtoStringメソッドで文字列を取出します。 BufferedReaderは性能上の観点から使用しています。 Reader reader = null; StringWriter writer = null; try { reader = new BufferedReader(FileReader("file")); writer = new S
基本型 まずもっともシンプルなイベントを見てみましょう。 Fooというイベントを提供する場合、まずFooEventクラスを定義します。 Fooという名前がついたjava.util.EventObjectのサブクラスがあるということ自身が意味のあることで、メソッドは必ずしも定義されていなくてもかまいません。 EventObjectであることの要件を満たすためにイベントソースをコンストラクタの引数に指定します。 ここで指定されたイベントソースはEventObjectのgetSourceメソッドで参照することができます。 import java.util.EventObject; public class FooEvent extends EventObject { public FooEvent(Object source) { super(source); } } 属性がある場合 イベントオ
数値を表す文字列とプログラムの数値の相互変換にはいくつかの方法が用意さ れています。 数値ラッパはjava.lang.Numberのサブクラスであるjava.lang.Integerや java.lang.FloatといったクラスでJavaの基本型であるintやfloatをオブジェ クトとして扱うためのラッパクラスです。 基本的な数値の基本型、数値ラッパと文字列の変換機能は、この数値ラッパク ラスとjava.lang.Stringによって提供されています。 国際化を意識したフォーマット機能はjava.text.NumberFormatが提供していま す。 通貨の位取りや各言語での数値表現を取り扱うために使用します。 java.io.StreamTokenizerによる文字列から数値の変換は、ストリームからトー クンヲ切出す処理の一環として行われます。少し特殊な用法と言えます。 カテゴリ ク
入力 もっとも一般的なアクセス方法はバイト単位でのアクセスです。 バイト単位のリードにはInputStreamのread()メソッドを使用します。 FileInputStreamから直接バイト単位でアクセスすることもできますが、効率 上の問題から間にBufferedInputStreamを挿んでいます。 注意して欲しいのが処理の最後でfinallyを使用してストリームのクローズを 行っていること。 使い終わった資源は速やかに解放するのが正しいプログラミング作法です。 資源解放にはfinallyを使用するのがJava流で、プログラムの見通しが良くなっているのがわかります。 バイト単位 InputStream in = null; try { in = new BufferedInputStream(new FileInputStream("foo"))); int b; while ((b
UTF(Unicode Text Format)はUnicodeのテキストをデータとして入出力する時 に用いるフォーマットです。 UnicodeコンソーシアムではUTF-7, UTF-8, UTF-16の3種類のUTFを定義してい ますが、Javaではこの中のUTF-8を採用しています。 UTF-8の最大の特徴はASCIIコードは、まったく同じエンコーディングが行われ ることです。 つまり通常のASCII文字列に対してUTF-8を使用した入出力を行うことができる わけです。 ファイル名やドメイン名などASCIIコードの範囲で定義される文字列の入出力 に向いているといえるでしょう。 java.io.DataInput、java.io.DataOutputにデータ入出力にUTF-8の入出力機能が定義されています。 UTF-8のコード ビット列 内容
フォルトはシステム側で発生する異常であり、アプリケーションプログラムでキャッチしても適切なリカバリ処理を行うことができません。 Errorはまさにこのために存在する例外です。 メソッドのthrows節で宣言する必要はなく、アプリケーションプログラムでキャッチすることも想定されていません。 フェイラーはアプリケーションの設計の範囲内のエラーであり、当然アプリケーションプログラム側でリカバリ処理を行える可能性があるものです。 メソッドのインタフェースはクライアントとサプライヤの間の契約であるので、発生が予想されるエラーに関してthrows節で宣言することは当然と言えるでしょう。 throws節で宣言された(RuntimeExceptionでない)Exceptionはクライアントでキャッチすることが必要になります。 デフェクトはアプリケーションのバグに起因するエラーであり、アプリケーションプログ
Javaのオブジェクトはcloneメソッドでオブジェクトの複製を作ることができ ます。 cloneメソッドによるオブジェクトの複製はオブジェクト変数をそのままコピー することで行われます。 intやdoubleなどの組込み型は値として格納されているので、完全にコピーさ れるのですが、オブジェクト変数は参照がコピーされるため、複製元と複製先 のオブジェクト間で、共通のオブジェクトを参照することになります。 このような複写の方法をシャローコピー(shallow copy)と呼びます。 つまりJavaのオブジェクトのcloneメソッドのデフォルトのセマンティクスは シャローコピーというわけです。 たとえば以下のPersonオブジェクトに対してcloneを行うとシャローコピーが 行われ、クローン元のPersonオブジェクトとクローン先のPersonオブジェクト 間でStringオブジェクトが共有さ
JDK1.1で導入された委譲型のイベントモデルはJavaのプログラミングパラダイ ムに大きなインパクトを与えました。 イベントによるオブジェクトの連携は、独立して開発された部品を結合する 目的に適しています。 JavaのコンポーネントアーキテクチャであるJavaBeansを実現する上で必須の 要素技術であるといえるでしょう。 イベントとJavaBeansの組み合わせにより、インヘリタンスによる静的なクラ スの再利用とは違った次元の、より柔軟性の高いオブジェクト指向プログラミ ングが可能になるに違いありません。 じゃばじゃばではイベントの使い方とイベントの設計の2つの視点からJavaの イベントについてみていきます。 イベントの設計 イベントオブジェクトの設計 イベントリスナの設計 イベントアダプタの設計 イベントソースの設計 イベントの使い方 イベントの受信 関連記事 コーナー 記事 関連
Javaのプログラムの実行中に存在しているオブジェクトを保存したりネットワー クを経由して送信したりするためにはオブジェクトをプログラムの外部に持ち 出す必要があります。 実行中のオブジェクトは関連するオブジェクトに対する参照を持っておりツリー 構造あるいはネットワーク構造の構成しているので、そのままのメモリイメー ジで外部に持ち出すことはできません。 ではどのようにすれば外部に持ち出すことができるのでしょうか? 外部に持ち出すためにはオブジェクトをバイト列の形式に変換します。 バイト列すなわちバイナリのデータはコンピュータの最も基本的なデータ構造 で、そのままファイルに格納することもできるしネットワーク経由でリモート のホストに送信することもできます。 バイナリに変換されたオブジェクトは、必要な時に元のオブジェクトに復元で きなければなりません。 Javaではこのようにオブジェクトをバイ
JavaBeansではメソッドのシグネチャについていくつかの命名規約を持ってい ます。 これはJavaBeansがインタフェースの自動抽出を行うことを可能にするためで す。 JavaBeansはIntrospectorというJavaBeansのインタフェースを自動的に抽出す る機能を持っているのですが、この時にシグネチャに沿って抽出を行うのです。 BeanInfoを陽に定義することでシグネチャ規約に準じていないメソッド を用いることも可能なのですが、シグネチャ規約に準じないことのメリットは 考えられないので、通常はこの規約を念頭においたメソッドを作成するのが良 いでしょう。 JavaBeansのシグネチャ規約 カテゴリ 名前 例 備考
1 入門編 1.1 はじめに XMLの仕様書である「Extensible Markup Language(XML) 1.0 (W3C Recommendation 10-February-1998)」がW3Cから公開されてから約2年。このシンプルなメタマークアップ言語は、インタネットを支える基盤技術としてすっかり定着してきました。 「XMLとJavaが変えるオブジェクト技術」(JAVA PRESS Vol.6)で解説した通り、XMLは単なるWWWの後継技術というだけではなくオブジェクト技術全体にインパクトを与えるキーテクノロジであり、さらにJavaとの組合わせにより統合的なフレームワークとしてITシステム構築の中核技術、必須の構成要素となっています。JavaとXMLの組合わせを軸として、今後のインタネットテクノロジが旋回していくといっても過言ではないでしょう。 そのような技術的な展開が予想
JavaプログラマのためのUML事始め スリーアミーゴス スリーアミーゴス(3 amigos)といえば古くはスティーブ・マーティン主演のコメディ映画「Three Amigos」(邦名「サボテン・ブラザーズ」)、最近では織田裕二主演のドラマで映画にもなった「踊る大捜査線」に登場した湾岸署の3人組みといったところが思い浮かびますが、オブジェクトの世界でスリーアミーゴスと言えば、知らないとモグリともいえる3大メソドロジストであるブーチ(Booch)、ヤコブソン(Jacobson)、ランボー(Rumbaugh)の3氏を指す言葉です。(1) なぜ彼らがスリーアミーゴスと呼ばれるようになったのか。もちろんこれは彼らがUML(Unified Modeling Language)のオリジナルデザイナーだから。現在のUMLはOMGによる正式な規格化のプロセスを経ていますが、当初は彼らが所属するRationa
オブジェクト指向設計 UML(Unified Modeling Language) クラス図 クラス図のモデルエレメント クラス ステレオタイプ コンクリートクラス アブストラクトクラス インタフェース ユーティリティ メタクラス アソシエーション アグレゲーション コンポジッション アソシエーションクラス コレクション オーダードコレクション マップ ジェネラライゼーション ディペンデンシィ コール オブジェクト コラボレーション パッケージ ノート コメント 制約 オブジェクト図 オブジェクト アソシエーション コラボレーション ユースケース図 システム ユースケース アクタ ジェネラライゼーション(ユースケース) ジェネラライゼーション(アクタ) シーケンス図 オブジェクト コラボレーション図 オブジェクト アソシエーション 状態チャート図 状態 初期状態 終了状態 遷移 コンポ
1 はじめに Javaプログラミングを行っていくうえで、大きな関門となるのはオブジェクト指向分析/設計でしょう。「クラスとオブジェクトの違いは」といった初歩的なものから、「再利用性を高めるためのフレームワークとコンポーネントの責任の配分の度合」といった高度なものまで、Javaプログラミングの要諦(ようてい)はオブジェクト指向分析/設計との関係の中にあるに違いありません。 Javaプログラマという立場からオブジェクト指向分析/設計を取り巻く状況を整理してみるのが本稿の目的です。 業界標準のオブジェクト指向モデリング言語であるUMLと、代表的なオブジェクト指向分析/設計プロセスであるユニファイドプロセス、そして最近発展が著しいパターン技術をベースにJavaプログラマに取ってのオブジェクト指向分析・設計の枠組みを総括してみました。 2 オブジェクト指向とは何か オブジェクト指向といえばクラスやイ
次のページ
このページを最初にブックマークしてみませんか?
『www.asahi-net.or.jp』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く