U. - みる会図書館


検索対象: 月刊 C MAGAZINE 2000年7月号
184件見つかりました。

1. 月刊 C MAGAZINE 2000年7月号

MONTHLY HEADLINE JN 団では , S 曰を用いて , 特定のネー リモートデバッガアプリケーションの のミキシングおよびレンダリングが可能 ムサービスやディレクトリサービスを , 己述を容易にするため , 高レベルの Java なソフトウェアミキサを備えている。 「サービスプロバイダ」として導入する。 日言ロインタフェイスを定義する。 lnput Meth0d Framework VI .3 には , 次の 3 種類のサービスプロバ そのほかの新規事項 イダが組み込まれているほか , Java ソ lnput Meth0d Framework( 以下 IMF) は , Java アプリケーションが E (lnput Met フトウェアの Web サイトから最新版を VI .3 では , SDK の各ツールに関して 入手することもできる。 hod Engine) と連携動作したり , あるい もさまざまな変更が行われた。とくに ja ・ LDAP (Lightweight Directory Access は JavaTl M E を開発したりするための枠 vac コンパイラは完全に再実装され , 速 P 「 otocol) サービスプロバイダ 組みである。 F は , lnput Method Clie 度の向上が図られた。また , A 曰につい LDAP は , インターネット標準のディ nt API( 以下 IMC API) と , lnput Meth ては , 先に紹介したもの以外にも , RMI, レクトリサービスアクセスプロトコル。 0d Engine SPI( 以下 IME SPI) から構成 RMI/IIOP, ドラッグ & ドロップ , Java2 ・ COS (Common Object Services) ネー される。 IMC API は , テキスト編集コン D, Swing, AWT, セキュリティ , ネッ ムサービスプロバイダ トワーク , リフレクション , オブジェク ポーネントど ME との間の通信をサポー COS は , CORBA (Common Object R ト直列化 , AccessibiIity, Collections Fr トするインタフェイスやクラスを提供す equest Broker Architecture) オブジェク る。一方 , VI .3 で新規に追加された E amework, java. math, java 」 ang, java. ト参照を格納するためのネームサーバ。 S 曰は , 任意の Java 実行環境で使用でき util に関して機能拡張が行われた。 ・ RMl(Remote Method lnvocation) レ öIME を , Java 言語で開発するための枠 このうち AWT には , 印刷 A 円の拡張機 ジストリサービスプロバイダ 組みである。 能として JobAttributes クラスと PageAttri butes クラスが追加された。 129 ページ RMI レジストリに登録されているリモ デバッガインタフェイス ( JPDA ) ートオブジェクトへのアクセスに用いる。 の Java Programming Tips では , 印刷解 JPDA (Java PIatform Debugger Archit 像度の指定などに制限があると述べた。 Java Sound API ecture) とは , 複数のプラットホーム , 異 しかし , これらでは印刷ジョブや印刷ペ なる VM, さまざまなバージョンの SDK の ージの属性が制御できるとのことで , 印 オーディオやⅦ引テータの取り込み , 間で高い移植性を持つテパッガアプリケ 処理 , 再生用の新 A 日が加わり , サウン 刷結果の改善が期待される。詳しくは , 近いうちに同連載でご紹介したい。 ド機能が大幅に強化された。 ーションを , ツール開発者が容易に作成 できるようにする多層テパッグアーキテ そのほかの機能として , ユーザインタ オーティオに関しては , AIFF, AU , クチャである。通常のユーザが J PDA を フェイスのテストを支援する java 」 ang. WAV の各ファイルの読み書きが可能で 直接利用する機会は少ないと思われる Robot クラスがある。これはキーポード ある。サポートする形式は , モノラルま やマウスなどのネイティブな入力イベン が , 各社が提供する Java テパッガを通 たはステレオ , 8 ビットまたは 1 6 ビット トを発生させるクラスで , アプリケーシ のテータで , サンプルレートは 8KHz か じて , 間接的に JPDA の恩恵を受けるこ ョンのテストの自動化や操作のデモンス ら 48KHz, 符号化テータは a - w または とになるであろう。 トレーションの作成などに利用できる。 mu-law となっている。 JPDA は , 以下の三つの階層で構成さ VI .3 の概要をご紹介してきた。 Java Ⅶ団に関しては , Ⅶ団 Type 0 , Ⅶ団 れている。 Type 1 , Rich Music Format(RMF) の各 ・ JVMDI(Java VM Debug lnterface) 1 . 1 から Java2 への移行ほどのインパク ファイルの読み書きが可能である。また , VM が提供するテパッグサービスを定 トはないものの , アプリケーションやア ソフトウェアでのⅦ団 WaveTable の合 義する。 プレットの開発者にとって , パフォーマ 成とシーケンシング , およびハードウェ ・ JDWP (Java Debug Wire ProtocoI) ンスの向上や新 A 日など , さっそぐそ ア M 一団デバイスへのアクセスをサポー テパッグ対象と , デバッカのプロセス の効果の程を確かめてみたくなるような バージョンアップである。 トする。一方 , 出力に関しては , 最大 64 間で行われる通信を定義する。 チャネルのオーディオおよびⅦ団音楽 ・ JDI(Java Debug lnterface) ( ひぐべん工房 ) 一三ロ MONTHLY HEADLINE 159

2. 月刊 C MAGAZINE 2000年7月号

MONTHLY HEADLINE Products Java 2 PIatform Standard Edition Ver. 1.3 がリリース Sun Microsystems より , Java 2 曰 a 廿 0 rm Standard Edition の最新版である Ve 「 . 1 .3 ( 以下 VI .3 ) の SDK および JRE ( Java Runtime Environment) がリリースされた。 Java TechnoIogy Home Page (http://ww w.javasoft.com/) からダウンロードでき VI .3 は , クライアントサイドのアプ リケーションやアプレットのパフォーマ ンス向上に主眼を置いている。ほかにも , 多くの新規機能が導入され , 既存機能に 対しても改良が加わった。その概要をレ ポートする。 パフォーマンスの向上 VI .3 では , 起動時間の短縮 , メモリ サイズの削減 , プログラム実行速度の向 上など , 全般的なパフォーマンスの改善 が図られている。 とくに , VM(Virtual Machine) に関し ては大きな変更がある。以前の VM と J げ ( Just Time コンパイラ ) の代替として , VI .3 では Java HotSpot Client VM を使用 する。この VM は , Java HotSpot Perfor mance Engine のサーババーションと同 様に , Java HotSpot 技術を利用してい るが , V. 1 .3 の VM ではプログラムの起動 時間の短縮を重視してお去クライアン ト環境に適している。 Java H0tSpot では , プログラムの性 能ポトルネックとなる部分 ( ホットスポ ット ) を検出して , その部分だけをネイ ティブコードにコンパイルし , インライ ン化などの手法で最適化する。ほかの部 ◎ URL http://www.javasoft.com/ 158 C MAGAZINE 2000 7 分はコンパイルせずにインタブリタで実 行するため , コンパイル時間を節約でき , その時間を最適化に充当できる。加えて , メモリ割り当ての高速化やカべージコレ クタの効率化 , スレッド同期の省メモリ 化とスピードアップが図られている。 VI .3 では , VM 以外にも , 起動時間の 短縮とメモリサイズの削減のため , 以下 ・ JAR のメモリ使用量削減 するため , 起動時間を短縮できる。 ったときに , 必要なクラスのみをロード していたが , V 1 .3 では実際に必要にな 以前は起動時に不要なクラスもロード ・ Swing のロード時間短縮 のような改良が施されている。 ポートしていたが , アプレット以外の Web 以前の Java Plug-in もキャッシュをサ トの起動時間を短縮する機能である。 おくことにより , 次回使用時にアプレッ プレットをローカルディスクに保存して キャッシング」は , ダウンロードしたア れた。そのなかのひとつ , 「アプレット 間の短縮に関するさまざまな改良が行わ アプレットに関しては , おもに起動時 アプレットの機能拡張 るため , 起動時間を短縮できる。 を , 実際に必要になったときにロードす は起動時にロードしていた一部の D LL DLL のサイズを縮小した。また , 以前 ・ DLL の縮小と遅延ロード 要なメモリ量を削減した。 を改善し , JAR ファイルのロード時に必 JAR ファイルのインデックス作成方法 ドキュメントとキャッシュを共用してい たため , 大きなアプレットではキャッシ ュがフラッシュされてしまうことがあっ た。 VI .3 では , Java 曰 ug - in のタグにお いて , キャッシュの動作を明示的に指定 できるようになった。新しいキャッシュ 機能を適用したアプレットは , ローカル ディスクに保存され , サーバ上で更新さ れたときにだけ再ダウンロードされる。 したがって , アプレットが更新されない かぎり , 常に高速起動が可能となる。 そのほか , アプレットサポートクラス のローカルファイル化 , 拡張機能の自動 インストール , JAR インテックスを利用 した JAR ファイルの分割 , といったダウ ンロード時間短縮 , 起動高速化のための 改良が行われた。 JNDI VI. 3 には , JNDl(Java Naming and Di rectorylnterface) が組み込まれた。 JNDI とは , さまざまなネームサービスやディ レクトリサービスを , Java アプリケー ションから , 統一的なインタフェイスで 扱うための枠組みである。 J N 引アーキテクチャは , API (Applic ation Programming lnterface) と SPI(S ervice ProviderInterface) で構成される。 Java アプリケーションは , API を用いて さまざまなネーム / ティレクトリサービ スにアクセスできる。一方の S 曰は , さ まざまなネーム / ディレクトリサービス を透過的にプラグインするためのインタ フェイスである。

3. 月刊 C MAGAZINE 2000年7月号

MONT Ⅳ HEADLUNE Products Java 用クラスライブラリ「 JBAL 2.0 」 J BAL は , ( 株 ) ヴァーテクス・ソフト ・ボタン ウェアが販売する , Java のビジネスア ・カレンダ プリケーション用クラスライブラリのシ ・チェックポックス リーズ名である。 ・ファイル選択 ・入力領域 JBAL シリーズ ・リストボックス JBAL シリーズは , シリーズ第 1 弾の画 ・ラジオボタン 面作成支援ライブラリ「 JBAL Screen Ed ・テーブ丿レ ition 」がすでに発売されており , 今回シ ・切り替え表示 リーズ第 2 弾として JBAL Screen Edition ・メニュー ・タブストリップ が機能強化されて Ve 「 . 1 . 1 となり , さら にテーブル作成支援ライブラリ「 JBALT などがある。これらのインタフェイスの able Edition Ver. 1 .0 」が追加された。販 配置は , 細かく行えるようになっている。 売の形態として , 各クラスライブラリ単 JBAL Table Edition の特徴 体販売と , ふたつを合わせた JBAL Ver. 表の作成を支援するクラスライブラリ 2.0 がある。なお , 秋にはデータベース アクセス支援の「 JBAL DB Access Editio (Fig. 2 ) 。表を構成する要素である行 , n 」の発売が予定されている。 列 , そしてセルなどを作成し , 制御する ための多くのクラスが含まれている。 JBAL シリーズは , Java によるビジネ このクラスライブラリの特徴は , セル スアプリケーションの開発に役立つ Java クラスライブラリ集である。シリーズの 単位でのカラーやフォント , コンポポッ クスの制御化可能なことだ。 特徴として , ・ Java2 (JDKI .2.2 ) に完全対応 使いやすさと実力は ? ・実用的なコンポーネントおよびコン クラスライブラリ集の方向性から判断 テナ すると , 実用性のあるクラスやメソッド ・ユーザインタフェイスの容易な設計 ・容易かつ自由なイベントの関連付け は十分に含まれており , Java のクラス ・開発コストの低減 ライブラリとしては多機能であろう。し ・ソースコードが添付 かし , 付属のドキュメント類は , クラス ・機能拡張の自由 やメソッドの簡単な説明だけでなく , も があげられている。 う少しわかりやすく拡充したほうがよい のではないかと思われる。 JBAL Screen Edition の特徴 不思議に思うのは , インストール環境 として公式にあげられているのが , なぜ , 画面設計を支援するクラスライブラリ (Fig. 1 ) 。おもなユーザインタフェイス Windows だけなのだろうかということだ。 ( 井上嶋渉 ) ◎ URL http://www.vertex-s.co.jp/ 第物第ー ・タづ、第を・第・第すぎ 犬ン、を : ( ま k アーチ第ックされました・ 、′ 0 しれ・ ( 0 ー 00 ・ d 新・ b ・朝第製物第 ( 0 一 0 0 0J0 ~ 0 ・ 了第第し リト 価格 法人向けパッケージ版 フルセット 100 , 000 円 75 , 000 円 Screen Edition 25 , 000 円 TabIe Edition 個人向けパッケージ版 1 0 , 000 円 フルセット ソースなし 3 , 000 円 ※このほか , Web 販売やポリュー ム販売によるディスカウント価 格がある 動作環境 Java2 (JDKI .2.2 ) 環境 Windows 95 / 98 / NT4.0 問い合わせ先 ( 株 ) ヴァーテクス・ソフトウェア TEL : 03-5339-6142 FAX : 03-5339-6148 E-MaiI : jbal@vertex-s.co ・ jp MONTHLY HEADLINE 157

4. 月刊 C MAGAZINE 2000年7月号

標準ェラーに出ています。 Windows/DOS は標準ェラーをファイルにリダイレクトでき ないので , この 2 行はわたくしが手書きで書 き加えたものであります。ああ , 情けなや ( 付録 CD - ROM 収録の ER. C を参照して下さ い ) 。ソースファイル群の構成ではなくて , 個々のソースファイルの内容・・・・・・どこをど う書き換えたか・・・・・・を把握するためには , cvs のサプコマンド di Ⅱを使用します : cvs diff d ⅲサプコマンドの出力は List1 のとおり です。この d の出力の読み方の " 初歩 " を解 説しましよう。行頭の・く ' は削除された行を 表します。逆にゞは新たに加わった行です。 そしてたとえば 6 行目の 7a8 , 11 は「 7 行目以 降に 8 ~ 11 行目の計 4 行が加えられた ( add さ れた ) 」という意味です。 a は add , c は change ( 変更 ) , d は削除 (delete) を表します。 Hash tabIeWithSorter.java のようなサポート的な クラスは , ファイル冒頭のコメントをわず かに書き加えただけですからご覧のような 簡単な d 沮出力になっています。 11 行目以下が , 肝心の JIndex.java に対す る変史箇所を報告している部分です。 17 ~ 20 行目は新たに加わったコメント , 22 行目 は新設の JIndexUtiIs.java へ移したために削 除した変数宣言です。 23 ~ 26 行までは変更 箇所 : 。 ~ ' で区切ることにより「変史前」と 「変更後」を教えています。 30C33 は , 「旧 30 行が現 33 行に変わった」という意味です。 こでの変更はご覧のように , boole タイプ のフラグ変数に volatile という修飾子を加え ただけです。その意味は , 本稿前回のドジ 物語に詳しく々々々書かれておりますから こでは略します ( その結果 , この di Ⅱ出力 の 40 行目に見られるように , while 節の実 行文としての空文・ ; ' が復活しております・・・ ・・・そして n 叩 ( ) メソッドを削除 ) 。 今回は JIndex そのものの説明がほとんど お留守になってしまいましたが , CVS はプ ログラミングをする者ほば全員にとっての 強力な情報ツールです。次回はさらに本格 的に , CVS の上でのソフトウェア開発を試 42 : 147 , 150d150 M JIndex. java M Hashtab ー eWithSorter. java Fig. 10 update の出力 (1 ) ? JIndexUtils . class ? JIndexUtiIs. java ? test. セXセ ? MyJavaSwingApp$CloseFrame. class ? MyJavaSwingApp. c lass ? ReaderCmp. class ? JIndexLoc . class ? JIndexLocVector. class ? JIndexValue. class ? JIndex . class ? JapCharUti lities. class ? Ecmp. class ? Hashtab ー eWithSorter. c ー ass ? lities. java M MyJavaSwingApp. java Fig. 11 update の出力 (2) CVS. EXE update: use 'CVS. EXE add' tO create an entry for JIndexUtils. java CVS. EXE update: use 'CVS. EXE add' to create an entry fo て JapCharUtilities. java M MyJavaSwingApp ・ java M JIndex. java M Hashtab IeWithSorter. java 31 : 96C99 , 100 JIndexUtiIs. initJIndexUtiIs( / / reset flags inWord = gotNO = gOtTO = gotSpace = fal se; 27 : 37C40 26 : > vo ねセ e boolean doneAWord, itsNewWord, wordModified; 24 : く bo 引 e doneAWord, itsNewWord, wordModified; 23 : 30C33 く boolean inword, go に NO , go し TO , gotSpace; 21 : 20d23 19 : > Version 1.0 . 4 18 : 〉 CVSed 29 Apr. 2000 16 : 7a8 , 11 15 : diff - て 1.1.1.1 JIndex. java retrieving revision 1.1.1.1 13 : RCS fi le: C:%winCVS%CVSREPOS%JIndex%JIndex. java,v lndex: JIndex. java 9 : > nothing altered since 102 8 : > 1.0.4 fO て first CVSed srcs, 29 Apr. 2000 6 : 7a8 , 11 5 : diff - rl. 1.1.1 HashtableWithSorter. java retrieving revlsion 1.1.1.1 3 : RCS fi le: C:%winCVS%CVSREPOS%JIndex%HashtableWithSorter. java,v lndex: HashtableWithSorter. java diff サブコマンドの出力 1 List 1 : 2 : 4 : 10 : 11 : 12 : 14 : 17 : 20 : 22 : 25 : 28 : 29 : 30 : 32 : 33 : 34 : 35 : 37 : 39 : 40 : 41 : 43 : 44 : 46 : 48 : 51 : 52 : 53 : / / display current paragraph on a sub-frame 36 : 138 , 139C142 , 143 nop( / / C language's simple doesn't work: ??JLS 14.5 / / use fO て do-nothing op void nop( ) { / / 104 doneAWord is now volatile, no need fo て nop( ) く = = 中略 ( メソッド n 叩 ( ) が削除された ) ー く 47 : 184 , 198d183 く / / reader for katakana is automatically hiragana 49 : く static final char KKdiff = ( ' ア ' - ' あー 50 : く String katakanaToHiragana( String word ) { = 中略 ( メソッド katakanaToHiragana( ) が削除された ) = = 以下約 200 行略 = = 行していきましよう 156 C MAGAZINE 0 2000 7

5. 月刊 C MAGAZINE 2000年7月号

以上 , CVS のインストールは実行ファイ ルのあるディレクトリを PATH に設定する だけという簡単なものです。 次に , CVS の初期化が必要です。それは CVS のためのメインのディレクトリを設定 してやる作業です・・・・・このディレクトリの 中に今後の CVS の管理データ , 管理ファイ ル等がすべて収まります。このメインティ レクトリのことを CVS の " リポジトリ " と呼 びます。リポジトリを設定することが , CVS の初期化作業です。いわば「 CVS 城の本丸」 を作ってやる作業ですね。 初期化は , Windows の MS-DOS プロンプ トではこのようなコマンドを発行します。私 の場合はリポジトリを , 上で PATH を通し た C:YwinCVS ディレクトリの中に CVSREP OS という名前で設けることにしました。 Fig. 4 で , cvs の init サプコマンドの前にあ る -d arg は , arg を CVS のリポジトリとして 指定するという意味になります。 Windows の場合は , 頭の : 10 : は必須です。 CVS の故 郷である UNIX 国ではファイルシステムに ドライプ " という概念がないので , ディレ クトリだけを指定するとその冒頭の c : をネッ トワーク上のホストの名前と解釈してしま うのです。 上のⅲ it コマンドを発行すると , 確かに CV SREPOS というディレクトリが作られてい ます。その中の CVSROOT サプディレクトリ の中に , われわれ初心者にとっては " ? ? " なさまざまなファイル ( CVS の管理用ファイ ル群 ) が置かれています。 UNIX/Linux の場合は , 上のような cvs -d で始まる init サプコマンドを発行してもよいし , あるいは Fig. 5 のような方法でも OK です。 W1ndows では autoexec. bat の中 , UNIX/L ⅲでは何らかの初期化スクリプト ( 典型的 には . bashrc) の中で , CVS リポジトリのある ディレクトリを環境変数 CVSROOT にセット しておきます。 なお , ネットワークと CVS の関係ですが , Windows の上の CVS はネットワークの上で CVS のクライアント ( 共同開発に参加する一 プログラマの立場 ) として振る舞うことはで 154 C MAGAZINE 20 7 いち Fig. 5 CVS の初期化 ( 2 ) export CVSROOT=/usr/sha 「 e/CVSREPOS CVS init CVS の初期化 ( 1 ) cvs -d init プロジェクトを CVS に登録する = プロジェクトの初期化 ( 1 ) プロジェクトの今後の進行の起点となるソースファイル群 ( および Makef ⅱ e など ) を適当なディレ クトリに集める ( 問題がなければ , 現在作業をしているソースディレクトリそのままでもよい ) ( 2 ) 上で作ったソースファイル群があるディレクトリへ行く ( cd する ) ( 3 ) プロジェクトの名前を決める ( 私の場合は JIndex) ( 4 ) そしてプロジェクトとそのソースを CVS に登録する cvs import Jlndex hiwa v103 Fig. 7 ログメッセージの指定 cvs import -m my first CVS use Jlndex hiwa v103 きますが , CVS のホストサーバとなってネ ットワークからアクセス可能なリポジトリ を設定 / 運営することはできません。今回 はスタンドアロンの一人開発で CVS を使お うとしていますから , この制約はとくに問 題にはなりません。 こうやって , init サプコマンドにより , CV S のリポジトリを作れば , CVS の初期化は完 了です。次は , CVS に対してプロジェクト の初期化をしなければなりません。私の場 合は , Java プログラム JIndex というプロジ ェクトを CVS から管理できる状態を作って やらなければなりません。 プロジェクトの初期化は , CVS の import サプコマンドで行います ( Fig. 6 ) 。 Fig. 6 の ( 4 ) でプロジェクト名に続く二つの引数は , べンダ名 ( ないしデベロッパ名やプログラマ 名 ) と現時点でのリリース識別子を指定しま す。日 g. 6 の例はあくまでも , 今回の私の場 合です。この impo れサプコマンドを実行す るとエデイタ (UNIX ではⅵ, Windows では n 。 tepad ( メモ帳 ) ) が立ち上がり , ログメッ セージの入力を促されます。使用するエデ イタは , 環境変数 CVSEDITOR で指定でき ます一一一できるはずです一一一が , Windows の上ではだめでした。 import サプコマンドの m オプションで短 いログメッセージを指定すると , このエデ イタ立ち上げという局面はなくなります。 Fig. 7 の impo れサプコマンドの実行により , CVS リポジトリ ( 私の場合は C:}winCVS}CV SREPOS) の中にプロジェクト名 (JIndex) と同名のサプディレクトリが作られ , その 中にソースファイルが収まっています。た だし各ソースファイルの頭と末尾には CVS のための若干の管理データが挿入され , フ ァイル名の末尾には、 , v' が付けられます。 応 0. c というソースファイルは , CVS リポジトリ の中では応 0. c , v というファイルになります。 CVS の下での開発を スタートする 以上で , 「プロジェクトのソースファイル 群が CVS の管理下に人った」という状態が確 立しました。そうすると今度は , 個々のデ べロッパ ( プログラマ ) は , ℃ V 兼からソー スファイルを交付してもらう " という形で , 今後の自分の作業基盤を作らなければなり

6. 月刊 C MAGAZINE 2000年7月号

含まれていなければ , . bashrc ファイルな も十分に実用になります。ただし当然なが ら , 一人で CVS を使うときには「他人の修正 結果を自分のソースに取り込む」とか「同じ ソースファイルの同じ箇所の修正に関して他 人と衝突した・・・・・・調整が必要である」といっ た他人が絡む現象は起きません。だからと いって , CVS の利用価値が半減するという ほどのデメリットはありませんが。 最初に , 一人開発において CVS を使うと 何ができるのか・ ( 1 ) 開発の複数バージョン化があまり混 乱なく行える ( たとえばある時点のソー スを基に , 新しい考え方で開発の枝分 かれをしてみる。枝分かれしたほうが 気に入ってしまい , それまで追ってい た流れは要らないという結論になった ら , それらを消し去る = 並列的パージ ョンの本数を減らしてもよい ) ( 2 ) ソースファイルの構成の履歴を正しく 把握できる ( たとえばバージョン m から n にかけては新たに b00. c と pee. c が加わ り , IOO. c は姿を消している。 IOO. c はあ のとき捨てたんだ。なーるほど ! ) ( 3 ) 個々のソースファイルの変更箇所を把 握し , またその情報を基に旧バージョ ンに対するパッチも作成できるにれは UNIX の diff コマンドの高機能版を CVS のサブコマンドである di 幵によって行い ます。そーか ! あそこを書き換えた ことを忘れていた ! ) ( 4 ) ソースファイル本体の情報だけではな く CVS の機能によっても , 開発履歴 / 開 発経過を知ることができる ( CVS のサブ コマンド history, log, status などを活 用する。そーか ! 4 月 1 日には別の枝 分かれも試みていたんだ , すっかり忘 れていた ! ) 「ファイルの集合というオプジェクトを実 現するためのクラス」という大きな課題に直 接取り組む前に , そんな重要なクラスの開 発の試行を今後やりやすいように , 現在の JIndex.java をできるだけ身軽にすることを 考えました。文字種の判別のようなサポー ト的な機能は , JIndex 本体の改変と並行し 152 C MAGAZINE 2000 7 て変更する機会は非常に少ないと考えて差 し支えありません。仮に今後「文字種判別ア ルゴリズムの抜本的改良を図る」という課題 が芽生えたとしても , それはそれでやはり その機能を実現するクラスが JIndex 本体から 分かれていたほうが作業がやりやすいはず です。 JIndex.java を身軽にするために , 現状 ( 3 月上旬現在の version 1.0.3 ) から切り離して 別立てにしたいのは , ( 1 ) 日本語の文字種の 判別に係わる汎用的 / 普遍的な機能部分 , (2)JIndex 固有のユーティリティ的部分 ( た とえば索引語を構成する文字を判定する部 分 ) , ( 3 ) 索引や索引の個々の項目を構成す るデータ構造クラス , ( 4 ) 索引項目をソート するための Comparator クラスなどです 今回はとりあえず CVS 入門の初日というこ とで , ( 1 ) と②を JIndex.java から切り離す CVS の入手方法 ことを考えましよう。 echo $PATH トリが PATH に含まれているか調べます : cvs がすでにあれば , それがあるディレク 利です ) 。 mount もシェルスクリプト化しておくと便 を umount しておきます。これらの umount/ へん , というときには , CD-ROM と /windows トリまで調べられると時間がかかってたい マンドで CD-ROM の上や /windows ディレク ェルスクリプトにしておくと便利です ( このコ く使いますから , findf などという名前のシ コマンドは ( 少なくとも私の場合 ) 非常によ この血 d /-name $ 1-P1int という形式の nd find / -name cvs -print ます : が出たら , まず cvs があるかどうかを確認し なコマンドはない」というエラーメッセージ で CVS が立ち上がれば OK です。「そのよう CVS cvs プログラムがあるはずです。コマンド , はディストリビーションの C レ ROM の上に ) I 血皿や FreeBSD の上なら , 最初から ( また どの , export PATH= ような人間が , 必要に迫られてときどきは もともと KDE をそんなに好きでない私の るもの ) の登場を待ちましよう。 使用するウインドウマネージャを指定でき はやめて , 十分に成熟した製品 ( できれば だ未熟な製品のようです。深く追及するの えない , jit コンパイラがないなど , まだま いのです。この JDK は , native threads が使 している KDE / VM の上でも正常に動かな ghtenment の上では動かないし , Sun が指定 連部分 (Swing 関連部分 ) が , GNOME/Enli ードした JDK 1.2.2 for Linux のとくに GUI 関 私のこの春の現状では , Sun からダウンロ いう前提の話です。ところが残念なことに 以上はすべて , Ⅱ n 皿の上で CVS を使うと 名前のファイルを見てください。 方は , 解凍したソース中の INST. 用 .. L という こでの説明は略します。やり ますから , します。こういう状況は滅多にないと思い ぶん v. 1.10.8 ) をダウンロードしてコンパイル load.cyclic.com/pub/から最新のソース ( た CD-ROM の上にもないときは http://down M) を使ってインストールします。 プログラムや RPM ツール ( たとえば GNORP められていますね。そうすると当然 , RPM フトウェアはすべて . 叩 m ファイルとして収 Red Hat Linux や TURBOLINUX などではソ ってインストールしてください。たとえば ぞれのディストリビューションの方式に従 CVS が CD-ROM の上にある場合は , それ /profile の中 ) で PATH 指定されています。 11 などがどこか別のところ ( たとえば / etc Linux の立ち上げ時に /bin , /sbin , /usr/local までの PATH 指定のすべて " を意味します。 上の行で , 最初の $ PAIH という指定は " それ local/bin/Wnn4 bin:/usr/local/games:/usr/ bin:/usr/local/bin/metamata/ export PATH=$PATH:/root/jdk1.2.2 / 合はこんなです : の行に追記してください。ちなみに私の場

7. 月刊 C MAGAZINE 2000年7月号

ョン努力が関係しています。ソースの複数 また大規模な企業ューザ等向けには有料サ 公開する , 他人の手に渡すときの形式につ のバージョンは無事に存在するのですが , 各 ポートも提供されています。 いても , 最初の段階から意識するように心 バージョン間の違いを人間のか弱い脳が完 がけます。最初の最初だけ「それらの環境が Concurrent Versions System の Concurrent 全正確に把握しないという問題です。ソー なくてソースだけ書いたらどうなるか」とい は " 並行的 " , Ve 爲 ions は " 複数のバージョン " スファイルの冒頭のコメントに「今回は何を という意味です。 " 複数のバージョンが並行 う経験をしてもいいでしようが・・ どう変えた」なんていうドキュメントを書き 三本柱の内 , 最後の「配付形式管理」は今 的である " = " 並立している " とは , ひとつのソ ますし , またソース中にも , たとえばバージ 後の重要な話題としてとっておくことにし , フトウェア , たとえば JIndex なら JIndex に ョン 1.2 の段階で新たに追加した行ならば : 今回はいちばん上の「開発環境 / 過程管理」 関して , それぞれ機能性や利用目的が異な を話題にしたいと思います。ただし , 最初 るキヾージョンと B'S—ションと C バージョン f00. ba 「 = null; / / added 1 .2 のようなコメントを書きます。 に釘を刺しておくべきでしよう : バージョ というように複数のバージョンの開発が ン管理のためのシステム等の導入は , 人間の 同時進行している状態です。 CVS は , このよ プログラミングの 手によるドキュメンテーション作業 ( コメン うな複数並行開発状態を管理できます。 最低限の規律は「三本柱」だ ト書きなど ) を「代替』してくれるものでは CVS の " 並行的 " にはもうひとつの意味が しかしプログラムがやや複雑大規模にな なくて , 人間の努力の及ばない部分を『補 あり , 現実的にはこちらのほうが重要かも ってくると , このような人為的な努力に基 完』してくれるものです。したがって開発 しれません。それは「複数のプログラマによ づいて今後の改版を正しく進めることは困 が三本柱になったからといって , やはり依 る共同開発を並行的に進められる」という 難になってきます。概念的には一言で説明 然として / もしくはそれ以上に , ドキュメン 意味です。ただし , その物理的な状態とし できる変更内容でも実際のソースの上では テーションは重要です。 ての意味は , 上の A バージョン , B バージョ いろんな箇所が変わっています。この前は , 今回の本稿の内容は具体的にはく CVS 入門〉 ン等の並立と同じです・・・・・・すなわち , やはり 具体的にどこをどう書き換えただろうか ? です。 CVS は ConcurentVersions System の頭 同じく複数の異なるバージョンの同時並行 他人が絡んでいない完全に自分一人の作品 字語です Apache, GNOME, Free D など , 進行です。 CVS の前身の RCS は , この並行・ であっても , 変更箇所と変更内容を完全に 有名なフリー & オープンソースのソフトウ 並立ということが不可能だったんです。 RCS 正確に漏れなく思い出すことは困難です。 ェアの多くが , 開発過程管理 ~ バージョン の下で共同開発を行うときには目的とする あるいは , 概念的に 言で説明できる変 管理のために CVS を使っています。 UNIX 上 ソースファイルをいちいちロックして , ほ 更の実現のために , 実際は 12 箇所の正しい の ( そして GNU の ) バージョン管理システム かの人がそのファイルには同時には触れな 書き換えが必要だが 11 箇所しか書き換えな は , SCCSSurce Code ControI System, ソー いようにしてから , 書き換え作業等を行っ スコード管理システム ) → RCS(Revision Cont かった。あと 1 箇所が放置された = " バグの卵 " ていたのです。非常に不便な開発状態であ rolSystem, 改版管理システム ) , そして→ ることが , この短い説明からも想像できる が密かに置かれてしまった。こういった問 この CVS へと進化を遂げています。もっと 題はすべて , 人間の記憶力の限界とドキュ でしよう。 以上説明したように , 「並行する複数のバ 新しい , CVS よりも良いとされるバージョ メンテーション努力の限界から生じていま ージョン」は , それらが複数者による開発で す。そこで非常に遅まきながら , 20 世紀の ン管理ソフトウェアもいくつかあるようで あっても , 特定の一人による開発であって 最後の最後 , ギリチョンになって , プログ すが , 今日圧倒的に広く使われているのが も , 物理的羽としては同じですから , CVS は ラミングやソフトウェア開発全般に関する CVS です。そして CVS は , それ自身がフリ 共同開発ばかりではなく個人の開発管理に 重要な提案をここでさせていただきたいと ー & オープンソースなソフトウェアです。 思います。すなわちプログラミングないし ソフトウェア開発とは Fig. 1 下のように Fig. 1 プログラミングの三本柱 本柱の営みであるべきです。重要なのは , x ・狭義のプログラム制作 ( 分析・設計・コーティング・構築・試験デバッグ ) プログラミングの学習過程 / 教育過程におい て“最初からこの三本柱を実践的に学ぶこ ・開発環境 / 過程管理 ( バージョン管理 , ソフトウェア構成管理 ( SCM ) ) と”です。 Hello world プログラムの段階か 十 ら , そのソースプログラムを書いてコンパ 〇 ・狭義のプログラム制作 ( 分析・設計・コーディング・構築・試験デバッグ ) イルして実行するだけでなく , デバッグや 十 書き換え過程を一定の管理環境の中で行う ・配付形式管理 ( インストール形式の管理 ) ( プラットホーム間差異の吸収措置の自動化 ) ようにします。またプログラムを世に出す , ム フ

8. 月刊 C MAGAZINE 2000年7月号

の時代には , とくに理工系 ~ 理科学系の職 場では当然の慣行でした。しかし , パソコ ンが事務系の職場に浸透していく時代環境 の中では文科系ューザによるある程度のユ ーザプログラミングが普及してもおかしく ないです。そういった可能性の芽を圧殺し てしまった , Microso れ独占製品とその単な る消費者群という今日までの姿は , 王様 & 貴族層と文盲無学な農民たちという , やは り単純な社会構造の中世封建主義の時代と 類似しています。 ところで , 秋葉原の LAOX The Comput er 館に代表されるようなかなり大規模なコ ンピュータ書籍売り場の最新の現象 , 数年 前までは絶対になかった現象は , 若い女性 の姿をちらほらと見かけることです。ホー ムページ作り = HTML ページの作成という , ある種のプログラミング行為がこのような 人たちの間にさえ普及しつつあるのです。 ホームページも凝りだすと PerI や Java など による本格的なプログラミングに手を出さ ざるをえませんから , これをもって中世か ら近世への移行の始まりと見なしてよろし いのでしようか ? でも本当の近世というのは , ご存じのよ うに地方豪族の台頭です。これは 20 世紀末 ~ 21 世紀初頭のパーソナルコンピューティ ングの世界においては , さまざまな Linux VAR—Linux SE 業の台頭に相当します。 Li nux/X W1ndow System の上で W1ndows の APIs や , 主要な Windows アプリケーションを実 装できるようになると , 農民たちの意識も 脱中世 ( 脱 Microsoft) するわけです。ローカ ルなシステムコンサルたちとのコミュニケ ーションの中で農民たちも少しずつ学問を 身につけていきます・・・・・・江戸時代末期に似 てくる。 かん その間 , 各地の IinuxVAR/SE たちは自分 の顧客 ( 個人や企業 ) のために毎日 , まとしたプログラミング作業に明け暮れな ければなりません。プログラミングといっ てもコンフィギュレーションファイルやシ ェルスクリプトの執筆のようなものから , ア プリケーションの顧客ユーザ向けカスタマ 150 C MAGAZINE 20 側 7 イズまでいろんなレベルがあります。彼 / 彼女は毎日のそういった雑多な " 開発 " 業務 をどのような方法で管理していくでしよう か。開発業務とそれを取り巻くコミュニケ ーションの営みをすっきり整理整頓して管 理しないと , " プログラミングのバグ " よりも もっと深刻な " 管理のミス " によって , 顧客 のシステムに甚大な被害が及びます。 従来 , プログラミングの教科書の内容は もつばら , プログラミング言語の書き方 / 使い方に終始していました。もちろんプロ グラムを作るためにはプログラミング言語 の習得が必要です。 V1sua ト nantoka のような ビジュアルツールを使って GUI を配置して いく方法でも , そのプログラムの中心とな る処理ロジックはプログラマがプログラミ ング言語を使って書きます。 プログラミング言語 ( C , C++, Java, Perl, Python, etc. ) を使ってプログラムを書き それをコンパイルすればコンピュータの上 で実行できるプログラム , すなわちソフト ウェアがとりあえずできあがります。しか しプログラムの制作行為は , それで終わり ではありません。ひとつのプログラムは , 今 後のデバッグや改良によって成長していき ます。ひとつのプログラムのこの成長変化 という局面は , 正しく管理しないとそのプ ログラムの順調な成長変化を阻害するばか りか , 管理ミスによる重大なバグがソフト ウェアに持ち込まれたりします。 私個人のドジ体験を述べますと , 昔々は プログラミングの制作進行の管理がいい加 減だったために途中で放棄した個人プロジ ェクトが数多くあります。 A なら A というプ ログラムソフトを ( 当時はもつばら C 言語 + 少々のアセンプリ言語でしたが ) 次々と " 改 良 " していきますね。すると , プログラム のソースファイル , f00. c とか bar. c などなど が次々と書き換えられていきます。この原 始的な方法では常に , 手元には f00. c , bar. c 等の最新バージョンと , それらのつい数分 ~ 数十分前の . BAK ファイルしかありません。 ですからたとえば , かなり逆上って「 3 か月 前のあの状態から今とは違う考え方で改良 を進めたい」と思っても , その 3 か月前のソー スはどこにもありませんし , 現状の f00. c , bar. c 等からそれらの 3 か月前の姿を再現す るのは至難です ( というより事実上不可能 ) 。 それで , 面倒臭くなって自分のプロジェク トを途中放棄してしまうのです。 その後もうすこし賢くなった ( ? ) 私は , 最 初に完成した段階のプログラムのソースフ ァイルを 1 枚のフロッピーにまとめます。そ して , 次の改良に取り組むときには新しい フロッピーに前段階のソースをコピーし , そ の新しいフロッピー上でソースの書き換え 作業を進めます。その改良がまあまあ成功 して自分でも納得したら , さらにその次の 改良やデバッグ作業はさらにまた新しいフ ロッピーの上に最新のソースをコピーし , そ の新品フロッピーに対して書き換え作業を 進めます。 ードディスクのサイズが数ギガバイト というまるで夢のような今日においては , フ ロッピーを次々増やすのではなく , ハ ディスクの上のディレクトリ (Windows 語 ではフォルダ ) を増やすことによって上と 同じ作業が行えます。このところ本稿で話 題にしている JIndex という Java プログラム も , この方法でこれまで作ってきました。 最初の完成段階のソース ( や関連ファイル ) は JIndex1 という名前のディレクトリに収め ています。次の改良時点では , JIndex1 ディ レクトリの中のソースを JIndex2 という新し いディレクトリにコピーし , この JIndex2 の 中でソースの書き換え作業等を進めます。 このようにして 3 月上旬という最新時点 ( = " ファイル集合 " オプジェクトの問題・・ 前号参照・・・・・・で一時的に頓挫する直前の時 点 ) では , 最新ソースが JIndex8 という名前 のディレクトリに収まっています。 このようにフロッピーやディレクトリを どんどん増やしていく方法は , 「結果的にま ったく書き換えなかったソース = 前回や前々 回と同じ内容のソースが複数個ある」という 無駄な状況が生じます。でもこれはまあ , 大した問題ではありません。もっと重要な 問題は , 人間の記憶力やドキュメンテーシ

9. 月刊 C MAGAZINE 2000年7月号

耳むずかしな力ドジりました 第朝回 CVS 入門の入門 宏 石合 な市場競争のある製品に共通しているのは , 備投資を要しますが , ソフトウェア産業の 素っ裸のプログラミングから 製品の規格の共通化および公共化です。各 市場競争への参入は南アジアやアフリカな 卒業 社とも , 同じ製品規格の上で競争をする。 どなどの超貧乏国の人々にも十分に可能で Micros 社の分割が仮に実現したとして 規格が共通しているからこそ , 競争もあり す。しかしそれが実際に可能であるために も , 独占という状態は解消されませんよね。 える。パソコンのソフトウェア業界に活況 は , OS をはじめとする主要ソフトウェアの 規格の公共化 = 独占の打破が必要です。 この最も肝心と思われる問題を法廷やマス をもたらすためには OS としての Windows , コミ等が無視しているのは , アメリカでは および主要実務ソフトとしての Word , Exc パソコンのハードウェアの面では , 日米の 有名大企業の製品の中身はほとんど台湾製 独占そのものは違法ではないからだそうで el , Access , lnternet Explorer あたりの仕様 規格が公共化される必要があります。 ですが , ソフトウェア的にもいろんな国の す。反トラスト法は , 独占そのものではな 異なる規格の乱立は , 消費者の不利であ ・・・ Microso れ独占時代に比べると随分安い く独占という立場を利用して行う競争妨害 行為を禁止しています。ずば抜けて最大の り労働者の不利であり産業界一般の不利で ・・・製品がバンドルされるようになるとお す。ですから , OS である Windows だけでは もしろいし , 超貧乏国の経済の底上げに寄 競争妨害行為が独占ではないか , と私なんか なく , OS の独占という立場をベースに築か 与していきます。 常識人の常識の一環として思うんですけど。 れてきた主要実務ソフトにおける実質的な そうやってソフトウェア産業の全世界的 今はアメリカでも日本でも , パソコン雑 な多様化競争化活況化が進めば , 本誌に代 独占 = たまたま確立してしまったデファクト 誌に中 ~ 上級誌というものがすっかり姿を 表されるようなプログラミング技術誌なん スタンダードに関しても , それらのソフト 消しました。先年の BYTE 誌の廃刊は , 中 かの部数は飛躍的に伸びますね。英語版や ウェアの規格が公共化されることによって , 級誌としてのメジャーな雑誌だっただけに スワヒリ語版やベルシャ語版の C MAGAZI 彳的でした。今書店で建在なのは Windows, 独占の打破 = 競争状態の導入が図られる必 NE を作って , どんどん輸出する必要があり 要があるのです。 Microsoft 社も , 「独占者」 iMac , Microsoft Word , 同 ExceI , 同 Acc ますね。アメリカのプログラミング誌はい から他と互角な「競争者」へと一変しなけれ ess などの初歩的な使い方を教える初級誌の ばなりません。それでやっとわれわれも , 初 くつかの "Microsoftå, 支術誌 " を除いてはほと みです。これがたとえば「ワープロソフト : んど廃刊になっていますから , 本誌などに めて , すっきりした気分になれるでしよう ! M ⅳ 09 Word と BorI d Word と Lotus Word 各社の製品がすべて公共化された共通規 チャンス ? いやいや , そうなると BYI 、 E 誌 の三強を比較する」というテーマなら中級誌 格を完全に実装している ( その実装技術に優 の記事になりえるし , またこれら競争状態 なども墓場から元気に蘇ったりしますから , 劣の差が生じる ) と共に , 各社独自の " 付加的 楽観は禁物です。 にある企業からの広告が雑誌の経営を支え 機能 " を売り物にしてもよいと思います。忙 BYTE 誌のような中級誌は , 個人がコン ます。 BYTE 誌等の廃刊は , 中級誌として しい労働者ューザはたぶん共通規格の部分 ビュータを使うこと ( " パーソナルコンピュ の話題も広告源もなくなったことによる " 枯 ーティング " ) の中にはある程度のプログラ の機能しか使わないと思いますが・・・ 死 " です。 ミングも含まれるという考えを前提として 自動車や半導体製品のようなハードウェ テレビなどの家電製品 , 自動車 , パソコ いました。これはパソコンの前のミニコン アは , そういう産業を興すために巨額な設 ンのハードウェア (Mac 系を除く ) など , 健全 C 言語フォーラム 149

10. 月刊 C MAGAZINE 2000年7月号

真紀俊男の ローテク講座 どれがその理念を実現するための " 仕掛け " C + + の string がその見本である。ただし , である。 " 実装 " であるかをハッキリさせておかない そのおかげで文字列に関する演算は , ほ 最近の C + + コンパイラなら string は必す とマズいと強く感じる。 とんどそろっているし , へたな商用ライ 使えるし , これさえ使えればわざわざ char [ 4 ] 複雑にしようと思えば , いくらでも複 プラリの文字列クラスを使うよりも便利 配列で文字列を操作する必然性は , あま 雑にできる である。また , 移植性という点でも有利 りないだろう。 List 4 外部に公開するヘッダ ( p ー st 「 ing. h より抜粋 ) / * 長さ * / / * 取得 * / const char *p—string—gettext(const p—string *inObj ) return ( NULL = = inObj ->mBuffer ) ? : inObj->mBuffer; / * 長さ * / int p—string—getl ength ( const p—st て ing *inObj ) return inObj ->mLength ー 入得算灯較 * 代″取加”比” / * 加算 * / VOid p—string—append(p—string *inObj,const char *inText) int theLength = strIen(inText); if(0 ! = theLength) { if(0 = = inObj → mLength) { p—string—assign(inObj ,inText); )else{ char* theTemp = realloc(inObj->mBuffer,inObj->mLength 十 theLength 十 1 memcpy(theTemp 十 inObj->mLength,inText,theLength 十 1 inObj->mBuffer = theTemp; inObj ->mLength 十 = theLength; 疑似オブジェクトを追加 ( p ー st 「 ing. h より抜粋 ) / * 疑似オブジェクトの作成 * / / * 疑似オブジェクトの解放 * / p-st 「 ing. h の使用例 (test. c より抜粋 ) void p—string—append2(p—string *inObj,const p—string *inOb2) p—string—append ( inObj , p—string—gettext( inOb2 ) / * 比較 * / bO 引 p—string—isequal (const p—string *inObj ,const char *inText) = strcmp(inObj->mBuffer,inText); return 0 #include "p—string. h" int main ( void ) p—string *thePS1 = p—string—new( p—string *thePS2 = p—string—new2( "Byen p—string—assign(thePS1, "Hello ” p—string—assign2(thePS2,thePS1); printf ( ”宅 s%n", p—string_gettext ( thePSI ) printf("%d%n",p—string—getlength(thePS1) p—string—append(thePS2 , "and "); p—string—append2 ( thePS2 , thePS1 if(p-string-isequaI(thePS1,"HeIlo ” ) ) { printf( "thePS1 = = Hello n ” }else{ printf( "thePS1 ! = Hello n ”房 p—string—delete(thePS1); p—string—deIete(thePS2); bO 引 p—string—isequa12(const p—string *inObj ,const p—string *inOb2) return p—string—isequal(inObj ,p—string—gettext(inOb2) / * 疑似オブジェクトの作成 * / p—string *p—string—new ( void ) p—string *theAns = malloc(sizeof(p—string) theAns->mBuffer = NULL; theAns->mLength = return theAns ー p—string *p—string—new2(const char *inText) p—string * theAns = p—string_new ( p—string—assign(theAns,inText)i return theAns ー ー S p-string 関数群の実装 (p-string. c) p—string *p—string—new3(const p—string *inOrig) p—string * theAns = p—string—new ( p-string—assign2(theAns,inOrig); return theAns ー / * 疑似オブジェクトの解放 * / void p—string—delete(p—string *inObj ) free( inObj->mBuffer); free ( inObj / * 代入 * / VOid p—string—assign(p—string *inObj ,const char *inText) int theLength = strl en ( inText char* theTemp = realloc(inObj->mBuffer,theLength 十 1 memcpy ( theTemp , inText , theLength 十 1 inObj->mBuffer = theTemp; inObj->mLength = theLength; VOid p—string—assign2(p—string *inObj ,const p—string *inOb2) p—string—assign(inObj ,p—string—gettext( inOb2) 148 C MAGAZINE 2000 7