必要 - みる会図書館


検索対象: 月刊 C MAGAZINE 2001年6月号
124件見つかりました。

1. 月刊 C MAGAZINE 2001年6月号

1 Borland C + + Builder 5 1 名 2 Turb01inux Workstation 日本 3 名 語版 6.0 リミテッドエディション 提供ターポリナックス ジャパン ( 株 ) URL http://www.tu 「 bolinux. CO. jp/ Ljmited 山 on 日 6. ロ RKSTATi ロ LINUX リ R 日 A 提供ポーランド ( 株 ) TEL 03 ( 5350 ) 9380 High ・ performance ANSI c + visual development With 0 訓曲 3 記 and e Ⅷ Tools 使いすいどジ 1 アル問発宿晴 ・に 0 以上のコン一プント ・・そりバグを強トするいを 0 ぃ 、インターネ彎ト対 ・多第なデ - み、一ス峻を ・既打聳資産の再当 第的」第性を、多なニにえる 0 いで実現されたビジアル開発ツを ~ もⅶ 0 5 . NET ボールペン 8 名 提供マイクロソフト ( 株 ) TEL 03 ( 5454 ) 2300 コンパクトな構成を持つ LinuxOS 。 プログラミングなどさまざまなシー ンに対応する 【モニタ募集要項】 規格に対応したビジュアル開発環境 グ機能を強化し , 最新の A 曰や ANSI BorIand C + + Bu ⅱ der の最新版。テパッ MSDN を記念して作成された Micros oft . NET のロゴが書かれている首か らかけられるポールペン 3 名 B i アプリの作り方 NTTDOCOMO DoJa 編 提供ソフトバンクバブリッ シング ( 株 ) TEL 03 ( 5549 ) 1200 を NTT DoCoMo DoJa 編 た書籍 て i アプリを作成する方法を解説し NTT ドコモが公開した SDK を使用し バックナンバー情報 03-5549-1200 ( 2 1 年 4 月 24 日現在の在庫状況です。品切れの際はご容赦願います ) ◇応募資格 : プログラミング経験者 , およ びプログラミング学習者。 ◇モニタ期間 : 商品受領より 3 か月間 ( モ ニタ商品によっては発送に日時を要する ものがあることをご了承ください ) 。 ◇モニタレポート : モニタ期間中に最低 2 回のモニタレポートを提出していただき ます。レポートはテキストファイルとし , フロッピーティスクにて「 READERS ' モニタ応募の注意 ROOM モニタ係」宛に投函いただくか , あるいは e - ma ⅱアドレス宛に電子メール を送信ください。 ◇レポート発表 : 提出いただいたレポート は , 編集部到着月日から 2 か月後に発売 する本誌上 , または付録 CD - ROM にて 掲載収録する予定です。 ◇選考発表 : この号のモニタ選考結果は 2001 年 10 月号にて発表いたします。 ◇綴じ込みのはがきに必要事項を明記のうえご応 募ください。 ◇記入もれやモニタ番号が複数記入されている場 合 , 綴じ込みはがき以外でのご応募は無効とさ せていただきます。 ◇締め切りは 6 月 18 日必着です。 読者プレゼント応募の注意 ◇綴じ込みのはがきに必要事項を明記のうえご応 募ください。 ◇雑誌公正競争規約の定めにより , 懸賞当選者 , モニタ該当者はこの号のほかの懸賞に応募でき ない場合があります。 ◇締め切りは 6 月 18 日必着です。当選結果は 2001 年 10 月号にて発表いたします。 READERS'ROOM ではみなさ まのご意見・ご感想をお待ちして おります。ほかにも , コンピュー タをめぐるさまざまなこと , 何で もけっこうです。質問もどしどし お寄せください。 投稿原稿 , 自作ソフトも受け付 けております。採用ぶんには弊社 規定の薄謝を進呈いたします。お 送りいただいた原稿・ソフトは , 原則として返却いたしません。ま 2001 年 2 月号 モニタ選考発表 ( 敬称略 ) ( 1 ) Borland C + + Builder 5 早川毅 ( 大阪府 ) 2001 年 2 月号 プレゼント当選者発表 ( 敬称略 ) (A) Borland DeIphiJf ッグ 中川龍ー ( 神奈川県 ) 密井政直 ( 福岡県 ) ほか 3 名 (B) Exce12000 VBA の応用 80 例 井口善文 ( 神奈川県 ) 大栢良介 ( 千葉県 ) (C)VisuaI C + + 6.0 プログラミング入門編 若林大輔 ( 群馬県 ) 安田浩人 ( 愛知県 ) た , 原文を手直しさせていただく 場合もあります。ご了承ください。 〒 107 ー 0052 東京都港区赤坂 4 ー 13 ー 13 ソフトバンクバブリッシング ( 株 ) c マガジン編集部「 R & R 」係 [e-mailfi 先 ] cmaga@softbank.co.jp [Web ページ ] http://cmaga.zdnet. CO. jp/ [ 宛先 ] 1 月号 2 月号 4 月号 5 月号 3 月号 〇 〇 〇 〇 2001 年 特集 1 「 C # 言語仕様とプログラミング」 特集 2 「 Wave 回の新アルゴリズム」 . NET Framework SDK 版 , Borland JBuilder 4 Foundation 日本語版ほか 特集 1 「 XML 入門」 特集 2 「 Di 「 ec Ⅸ 8 の徹底解説」 特集 3 「最新の DirectMusic を使う」 新連載「 E 可 oy perl Programming 」ほか 特集「実力チェックプログラミング期末試験 C/C + + /Java/Perl/Ruby 」 レビュー「 C + + Test 」ほか 「恒例 ! 新人応援モニタ大会」 特集「プログラミング入門プログラミング事始め , C ℃ + + レポート「 Ky ⅱ x 事前テストプログラム」ほか 特集 2 「チャレンジ ! i アプリプログラミング」 特集 1 「プログラマ必見ハードウェア入門」 特別記事日 T の森を育てる」ほか /Java/DOS/ テータベース入門」 0 ・・在庫あり , △・・・在庫僅少 , X ・・・在庫なし ※ lnside Windows の在庫については , 上記の電話番号までご連絡ください。 綴じ込みはがき裏面の記事評価アンケートには 下記の数字をご記入ください。 ①特集 1 「使いやすいユーザインタフ ェイスを求めて」 ②特集 2 「 MacOSX アプリケーショ ン開発ガイド」 @Get to C WorId C 言語入門講座 ④実践 C + + ゼミナール ⑤スタートアップ Java ⑥プログラミング相談室 ØStandard C ℃ + + ⑧どて″クのオブジェクト工房 ⑨ E 可 oy PerI Programming ⑩ Ruby マスターへの道 ⑩アルゴリズム入門プログラミン グの宝箱 ⑩アルゴリズムラボ ー j3E 猷 e 「 The 3D Programming ⑩ネットワークプログラミングのア トリエ 0_9Linux Programming Tips $Windows Programming Tips OJava Programming Tips ⑩ローテク講座 ⑩特別記事「 i アプリの作成」 最新開発環境レポート「 Fo e fo 「 Java 2.0 」 OMONTHLY H EADLIN E @C MAGA Bookends 学問のススメ あつばれご意見番 $C マガ電脳クラブ $READERS' ROOM READERS' ROOM 1 刀

2. 月刊 C MAGAZINE 2001年6月号

特集 2 Mac 05X アフリケーション開発ガイド TabIe 1 つづき D 「 a Mana Scra Mana er Human lnterface T00 旧 ox ・・・・・・ユー A ea 「 ance Mana e 「 ControI Manage 「 Dialo Mana er に on Services and Utilities F ⅱ es ・・・・・・ファイル操作に関するサービスを提供 ウインドウの生成 , 表示 , 管理に関するマネージャ メニューに関するサービスを提供するマネージャ するマネージャ List と呼んでいるスプレッドシート状テープルのサービスを提供 アイコンの操作と描画に関するサービスとユーティリティ アラートやダイアログボックスのサービスを提供するマネージャ けてプログラムに指示をするオプジェクト ブッシュボタン , ポップアップメ二ューなどのユーザの操作を受 コントロールに関するサービスを提供する。コントロールとは , A Hel,Ca 「 bon Hel Mana e 「ヘルプ情報のサービスを提供 Mac OS 8 以降に登場した GUI 部品に関するマネージャ サインタフェイスに関するサービスを提供 コピー & ペースト機能のサービスを提供するマネージャ ドラッグ & ドロップ操作のサービスを提供するマネージャ Translation Manager Resou 「 ce Manage 「 Navigation Services FO 旧 e 「 Manage 「 File Manage 「 AIias Manage 「 Wind0\./V ′ Mana er Menu Mana 「 List Manage 「 電源の取り扱いや節電に関するサービスを提供 ビスを提供 から内容が格納されている形式の文字列 ) の取り扱いに関するサー Pasca 反字列 ( 1 バイト目に文字列の長さがあり , 2 バイト目以降 算術計算 , 論理計算のサービスを提供 She 「 lock の「内容で検索」機能に関係するサービスを提供 デバッグに便利なサービスを提供 関するサービスを提供 ces で出てきたコレクションオブジェクトとは別物 ) の取り扱いに を格納できるオブジェクト。 Core Foundation の Collection Servi コレクションオブジェクト (Collection object : さまざまなテータ XML 文書の読み書きに関するサービスを提供 Co 「 e Foundation をサポートするさまざまなサービスを提供 供 U 日 L で指定されたオブジェクトのアクセスに関するサービスを提 ているため , Unicode のサポートがある 文字列の取り扱いに関するサービスを提供する。国際化を意識し 供 たり読み出すことができるもの ) の取り扱いに関するサービスを提 プロバティリスト (prope 「 ty list : テータを XML 文書として保存し 更されている 各ユーザの -/Library/Prefe 「 encesi ィレクトリに記録するよう変 ファイル ) は初期設定フォルダに記録していたが , Mac OS X では OS ではプリファレンス ( アプリケーションの環境設定を記録する プリファレンスに関するサービスを提供する。なお , 従来の Mac いうところの OLE.COM に相当するようなサービスの提供 ) プラグインアーキテクチャに関するサービスを提供 ( Windows で サービスを提供 クト , C + + の STL でいうところのコンテナのようなもの ) に関する レクションオブジェクト ( 複数のオブジェクトを格納するオブジェ 配列 (CFA 「「 (y) , 辞書 (CFDictionary) , セット (CFSet) などのコ バンドルに関するサービスを提供 Co 「 e Foundation のサービスに必要な基本データや基本関数を提供 co 「 eFoundation ・・・・・・クロスプラットホーム , ローカライズを意識した低レベルサービスを提供 するためのマネージャ 別アプリケーションによって作成されたファイルを開いたり変換 格納されるデータ は通常データとは別の保存場所 ( リソースフォークと呼ばれる ) に リソースに関するマネージャ。ここでいうリソース ( 「 esou 「 ce ) と ジャ ファイルのオープン , 保存で利用するダイアログに関するマネー ージャ フォルダの探索などのフォルダに関するサービスを提供するマネ ヤ ファイルやフォルダへのアクセスのサービスを提供するマネージ ヤ 工イリアスの作成と解決 ( reso ⅳ e ) のサービスを提供するマネージ p 「 efe 「 ence Se 「 vices PIug-ln Services Debu e 「 Services CoIIection Manage 「 Ut ⅲ ties ・・・・・・さまざまなサービスを提供 XML Services Utili Services URL Services St 「 ing Services P 「 ope 「 ty List Services Collection Services Bundle Services Base Services PO Ⅶ・ e 「 Mana e 「 PascaI String Utilities Mathematical and Lo ical Utilities Find B Content/SherIock 既存ソースの Ca 「 bon 化 過去に作成したアプリケーションを Mac OS X ネイテイプで動作させたい , あるいは Mac OS 8.1 ~ 9 でも動作するアプリケーシ ョンを作りたいという場合は , 必然的に Ca rbon を選ばざるをえません。 Carbon 化の準備 過去に作成したものを Carbon 化するにし ても大幅な変更はあまりないはずですが 細かい変更や開発ツールの問題 [ 注 8 ] によっ て , 手持ちのソースをそのまま Carbon 化す るのに支障が出る場合があります。また , 師 ple はヘッダファイルや API の名称変更 , ちゅうちょ データ型の定義の変更をわりあい躊躇せず に行います。具体的な例として , 従来はウ インドウを示すポインタを W1ndowPtr で表 現していたのに , 最新のものではウインド ウの参照という考えに切り替えて WindowR ef に変更しています。 過去に作成したアプリケーションを Carb on 化する場合 , 一見遠回りしているように 感じるかもしれませんが , まず , 現時点で Carbon 化に使える開発ツール (CodeWarrio r など ) を用いて T001b0X (CIassic API) を使 った Mac OS 9 用アプリケーションを作成で きるソースやプロジェクトに変換し , そこ から Carbon 化するというアプローチをとる といいでしよう [ 注 9 ] 。 また , Carbon 化できるのは PowerPC で動 作するプログラムだけだということにも注 意が必要です。したがって , 68 脈 0 用のプ ログラムの場合 , さらに PowerPC 対応のソ ースに書き換えるというステップも必要で す。 なるべく最短距離で Carbon 化をしたい気 持ちはわからないわけではありませんが , 古いソースを直接 , Carbon 化しようとする と , どこから手をつけてよいかわからなく なるほど大量のエラーメッセージに頭を抱 えることになります。着実に 1 ステップず つ作業を進めたほうがいいでしよう。 特集 2 MacOSX アプリケーション開発ガイド 39

3. 月刊 C MAGAZINE 2001年6月号

特集 2 Mac 05X アフリケーション開発ガイド ウポートが別になったため , SetPort ではな く , SetPortWmdowPort でウインドウポー トの指定をします ( List2- ( 6 ) ) 。 ◆ MyProcMouseDownEvent carbon では , SystemClick が廃止されま した。 qd というグローバル変数が消えたた め , 必要な情報は専用のアクセッサ関数で 取得するよう変更します (List 2- ⑦ ) 。 MacOSX アプリケーション開発ガイド 古いソースだと必須 AppIe イベントの対 応ができていない場合がありますが , これ は Carbon では不都合を起こします。たとえ ば [ 終了 ] メニューが選ばれた場合 , アプリ ケーション終了の AppIe イベントが送られ ることになっているので , これにきちんと 対応していないと終了できなくなります。 できれば , この Apple イベントの対応は Carb on 化作業の準備段階で行い , Mac OS 9 上 できちんと動作することを確認しておくべ NewAEEventHandIerUPP は Apple イベン トハンドラ用の Universal Procedure Pointer ( 略して UPP) を動的に確保するマクロです。 UPP はコールバック関数の指定で API から 要求される構造体を指すものですが , 実は PowerPC 特有のものです。 68 脈 0 用ソース の場合 , この UPP 対応が必要になります。 また UPP の静的確保が Toolbox では認めら れていましたが , Carbon では認めておらず , すべて動的になることにも注意してくださ ◆ main きです。 List 2 / * アップデートイベント処理の開始 * / static void inWinRef) アップデートイベント処理 thesp = "*pBefor Mac OS } 引 se { e = "*PMac OS ・ if(RunningOncarbonx( ) ) ( StringPtr theSp ー )else{ #if TARGET—API—MAC—CARBON PaintRect ( &kPaintArea )else{ paintOval ( &kPaintArea 土 f ( e = = RGBPoreColor(&kRedColor); EraseRect(&kPaintArea); #endif SetPort ( inWinRef #e lse SetPo てセ W 土 ndo 響 PO て日 inWinRef #if TARGET-API-MAC—CARBON 迂 ( e = = 1 Ⅱ gTest = = / * 最後に押されたボタンに応じた中身の表示を行う * / BegintWte ( inWinRef リ EndtWte(inwinRef); / * アップデートイベント処理の終了 * / DrawControls(inwinRef); / * コントロールの再描画 * / #endif イベント処理 ( 全体 ) DrawString(theSp); MoveTo ( 80 , 80 SetPortWindowport(inWinRef); break; MyProcMenuSelect(MenuKey(inEvent->message & charC0deMask) if( (inEvent->modifiers & ! = 0 ) ( cage autoKey: cage keyDown: / * キーダウンイベント処理 * / AEProcessAppleEvent(inEvent); case 地 h も e 引 ent : / * ハイレベルイベント処理 * / break; MyProctWteEvent( (WindowRef)inEvent->message); cage / * アップデートイベント処理 * / 鯊 y 00M0u8e8 ent ( E nt case mou 日 eDo : / * マウスダウン処理 * / switch(inEvent->what){ Btatic void MyProcEvent(congt EventRecord *inEvent) ヨ List 2 #pragma unused(inAE,outRepIy,i0Refcon) *outRepIy,UInt32 ioRefcon) sta ヒ土 0 80 引 OS 立て MyOpenAppI(const AppleEvent *inAE,AppleEvent AppIe イベントハンドラ return no て・ static 80 引 OS て MyQuitAppl(const AppleEvent *inAE,AppleEvent *outReply,UInt32 ioRefcon) / * メニューバーのハンドル * / #pragma unused(inAE,outRepIy,i0Refcon) MyInitTooIbox( / * To 引初期化 * / MenuBarHandle theMenuBar; int main ( void ) メイン関数 return noErr ・ g も 00P = FALSE ・ / * App 厄イベントハンドラの登録 * / if(WaitNextEvent(everyEvent,&theEvent,kMaxSleepTime,NULL) ) { EventRecord theEvent; fo て ( gLoop = 駅ー g も 00 店 ) ( if(gWinRef NULL & & theMenuBar ! = NULL) ( / * イベントループに突入する * / gTestButton[1] = GetNewContr01(kTest2ButtonID,gWinRef); gTestButton[01 = GetNewContr01(kTest1ButtonID,gwinRef); if(gwinRef ! = も ) { / * メインウインドウにコントロールを乗せる * / gWinRef = / * メインウインドウを開く * / theMenuBar = MyMenuInit( / * メニューバーの初期化 * / NewAEEventHandIerUPP(MuitAppI) ,O,PALSE); AEInstallEventHandler(kCoreEventCIass,kAQuitAppIication, ,O,FALSE); AEInstaIIEventHandler(kCoreEventCIass,kAEOpenApplication, / * メインウインドウを閉じる * / MyProcEvent(&theEvent); D posew 土 nd0 響 ( gWinRef return 0 ー 特集 2 イ 3

4. 月刊 C MAGAZINE 2001年6月号

アルゴリズム た書類は卓上の山の 1 番上に放り投げてお ひとつ , おもしろい工夫を紹介しましよう。 てきたリニアサーチとバイナリサーチの 2 くだけです。すると不思議なことに , 上の たとえば , ずばらな人の仕事場の机 ( 学 つが中心になります。バイナリサーチを用 生ならば勉強机 ) を考えてみましよう。こ ほうによく使う書類がたまっていきます。 いれば検索はとても高速になりますが , そ 書類は上から探すので , 書類を整理してい の人はずばらなので , 机の上を整理するこ の代わりに前もって配列をソートしておく とはありません。自然と机には書類 ( 学生 ないにもかかわらず , 比較的早く目的の書 必要があります。 なら参考書やプリント ) が積まれていくこ 十分洗練されたアルゴリズムでは一般的 類が見つかることになります。めったに使 とでしよう。仕事中に書類が必要になった に , 処理の高速化には何らかの代償が必要 わない書類を探すのには時間がかかります ら , 山と積まれた書類の中から目的の書類 になります。メモリを多く消費したり , デ が , そのこと自体がめったに起こらないこ を探し出すことになります。しかし , 「ある となのでさほど気にはしません。いわゆる ータに何らかの構造上の特徴が必要であっ 「超整理法」に近い ( ? ) やり方です (Fig. 5 ) 。 たり , その条件はさまざまです。逆に何か 仕事中には同じ書類を頻繁に必要とするこ しらの条件が前もって与えられていれば , とがよくある」ものです。この人も , 何度も この例では , 「ある仕事中には同じ書類を頻繁に必 その条件を利用して処理を高速化すること 何度も書類の山の中から同じ書類を探すこ 要とすることがよくある」 が可能な場合も多々あります。ここでもう とになります。不精なこの人 , 使い終わっ 蔵書検索プログラム ( C + + 版 ) 0 / / く c + + 版蔵書検索 > ー〃※インクルードファイルや in ( ) 関数は c 言語版と同じ 〃蔵書クラス cl ass public: char * t 土目 char *author ・ 土 n し bookl / * 貸し出し中なら 0 、そうでなければ 1 * / int ava 土ね / / 比較演算子のオーバーロード 引 0 て a し 0 てく ( CB00k & ok ) / / so て t 0k ( ) の中で CB00k 同士を比較 return mokID く ok. okl 引 0 て a セ 0 て > ( 88k & 20k ) / / 同上 return bNkID > 20k. okl 男 / / 土 nt 型へのキャストをオーバーロード 08 て at0 て int( ) return List 6 / * 蔵書データのメモリを解放 * / void cleanup3ata( ) int n; fo て ( n = n く十十 n ) delete bookarray[nl; / * 本のデータを okID の順に昇順でクイックソートする。 void sor&ok(int bottom, int top) int lNer,upper; CBook *div, *temp; if ( 忱 > = top ) d 土 v = ok 矼て a ⅵ忱 om / * 適当な基準値を選択 * / / / オブジェクトの大小を直接比較 while(*bookarraytlower]<*div) 十十一 owe て一 〃同上 while(*bookarraytupperl>*div) if (lower«upper) / * データ ( へのポインタ ) の順番を入れ替える * / temiNn0karray[lowerl; H)0karray[upper]=temp; 十十一 owe て一 / / searchbook( ) 中で k と bookID を比較 #define N 5 / * 蔵書データのポインタの配列 * / CBook*b00karray[N]; / * 蔵書のデータを初期化する * / void initdata( ) int n ・ for(nå; n<N; 十十 n ) SO て t Ok ( upper); so て t ok ( upper 十 1, t 叩 = new CBOO ok ray [ 0 ト > 巨目 e = ” 20k0 ”・ >title = ″ 0k1 ! ・ 20k 矼て a ⅵ 1 ト >tit ー e = ″ 0k2 ”・ ok ra ⅵ 2 ト ok て ay [ 3 ト乳土 e = ” 0k3 ”・ ok 矼て ay [ 4 ト北辻厄 = ” 0k4 ”・ "author0 ” ok 矼て ay [ 0 ト >author = nauthorl" ok 矼 ray [ 1 ト >author = author2" bookarray[2] —>author = 加0k矼raⅵ3 ト >author ー % utho て 3 ” ” autho て 4 ” ok ra ⅵ 4 ト >author = ok て a ⅵ 0 ト〉 l»okID = 100 ->mokID = 50 ok 矼て ay [ 2 ト >bookID = 73 b00karray[3 ト >b00kID = 62 0ka てて ay [ 4 ト > 0kID = b00karrayt0 ト >available = 20k 矼て ay [ 1 ] ->available = の 0ka てて ay [ 2 ] → ava 土ね b 厄 = の (x)0karray[3 ト >available = bookarray[4 ト >available = ー / * oks の中から okID が k と一致するデータをバイナリサーチで 検索して、その添え字を返す。見つからなければ -1 を返す。 * / int searchh)0k(CB00k ] を int int key) int f mid, right; left=0; て地 h レ s 土 z while(left<right) mid=(left 十 right)/2; left=mid 十 e lse て i t 剛 i if(Qn)ks[Ieft]==key) return 厄 f return -1 ー / / oook の okID と k を比較 〃同上 / * 見つからなかった場合 * / 0 103 プログラミングの宝箱

5. 月刊 C MAGAZINE 2001年6月号

的には , 以下の 2 つの作業が必要になりま す。 ・「 JRE(Java Runtime Environment) 」と 「 Java PIug-in 」を SunMicrosystems( 以 下 Sun と略 ) の Web ページなどから入手 して , アプレットを動かしたいコンピ タイマ版アニメーションアプレット (TimerAnim. java) ュータにインストールする E と HTML Converter は , Sun の同じ WebAt ・入手した「 Java P 旧 g - in 」に対応した「 H ージからダウンロードすることができます。 TML Converter 」を Sun の WebA—ジな 本稿の執筆時点では , どから入手して , アプレットの HTML http://java.sun.com/products/ ファイルを変換する plugin/index 」 a. html Java Plug-in は JRE に含まれています。 JR からダウンロードできました。バージョン は 1.3.0 ー 01 です。 JDK は JRE も含んでいるので , JDK をイン ストール済みならば , J を改めて導入す る必要はありません。 HTML Converter だ けが必要になります。 JRE は 7.6M バイト程 度のサイズがあるので , ダウンロードする よりも雑誌の付録 CD - ROM などを利用する ほうが簡単かもしれません。 以下 , HTML Converter のインストール から HTML ファイルの変換までの手順を説 明します。 手順 1 : 圧縮ファイルの展開 HTML Converter のサイズは 150K バイト 程度です。とくにインストーラは付属して いないので , 圧縮ファイルを適当なフォル ダに手動で展開します。圧縮ファイルの中 に converter フォルダと META-INF フォルダ がありますが , このうち展開が必要なのは converter フォルダだけです 手順 2 : HTML Conve e 「の起動 たとえば「 C : \ 」に展開した場合 , 「 C:Ycon verterYcIassesYHTMLConverter. bat 」を実行 すると , Fig. 2 のような HTML Converter が 起動します。 なお HTML Converter 自体も Java で作ら れているので , JDK/JRE などの Java 実行環 Fig. 2 HTML Conve 「 te 「の起動画面 クアイル報第ヘルプ オルダ病のすでのラ ) イル : C:tworkAnim ップイル律 html.*htm. •.asp サプフォルダを含める バックアップファイル用のブオルダ : C•Abak テンプレートつ。アイル : WlndOWS Solaris List ータイマーを用いたアニメーションアプレット import java. awt. *ー import Java. awt. event. *ー import Javax. swing. *ー - アプレットのクラス Timer ー AnimComponent animcomp; double theta=O. 0 , omega=O. の ーアプレットの初期化 public void init( ) { / / アプレットの Contentpane Container cp=getContentpane ( JPaneI p=new JPaneI( / / ボタン配置用のパネル 〃操作用のボタン JButton btnLeft , btnStop , btnRight ー / / レイアウトと背景色の設定 cp. setLayout(new BorderLayout( ) cp. setBackground(CoIor. white); / / アニメーション用コンポーネントの作成と配置 / / 画像ファイルは HT ファイルの AP 乳齲タグから取得 animcomp=new AnimComponent ( getImage(getDocumentBase( ) , ~ getparameter("image つ ) cp. add(animcomp, BO て de ても ayou し CEN で新、リ / / 操作用ボタンの作成と配置 p. setLayout(new GridLayout(1 ) p. add(btnLeft =new JButton( ”くく Left" ) p. add(btnStop =new JButton(" stop ” ) 馮 p.add(btnRight=new JButton( "Right > > つ cp. add(), BorderLayout.SOUTH); 〃操作用ボタンのイベント定義 btnLeft . addActionListener(new ActionListener( ) public void actionPerformed(ActionEvent e) { / / 左回りに加速 omega - = 0.0 btnStop . addActionListener(new ActionListener( ) public VOid actionPerformed(ActionEvent e) { / / 停止 omega = 0. btnRight. addActionListener(new ActionListener( ) pub lic VOid actionperformed ( ActionEvent e ) { / / 右回りに加速 omega 十 = 0.0 / / タイマー / / アニメーション用のコンポーネント / / 画像の角度と角速度 0 / / タイマーの作成 ±imersnew 衄 me てぐ 〃 30msec おきにイベント発生 を 30 , new ActionListener( ) { public void actionperformed(AetionEvent e) ( / / 画像を回転させる theta 十 =omega ー animcomp. rotate(theta); ノ / 画像の再描画 animcomp ・ repaint(); 一」第 ( ド ) P 朝 ) ト「、 M [ 0 Ⅳ e 日 第回ロ ーアプレットの開始 public void start( ) { timet,gtart()• - アプレットの停止 public void stop( ) { ()E N g 引 00 のみ 1 イ 0 c MAGAZINE 2 冊 1 6

6. 月刊 C MAGAZINE 2001年6月号

使いやすい 求めて 00 ① ユ = た ージをテサインしていけばいいのかを紹介します とのようなことに注意を払ってアプリケーションや web ペ の特集では , 使いやすいユーザインタフェイスを求めて , 使い勝手が悪くては , その価値は下がってしまいます 題でありませんとんなに優れたアプリケーションでも , スが必要てす。ユーザインタフェイスは , 見栄えたけの問 アプリケーションや web ペーシには , ユーザインタフェイ フィンローダ アプリケーションと Web ページのテサイン みなさんは , " ユーザインタフェイス ' と いう言葉はもちろんのこと , GUI という言 葉は当然ご存じでしよう。 GUI とは , Gr 叩 hical User lnterface の頭文字をとったもの で , 文字どおりグラフィカルなユーザイン タフェイスのことを意味します。 Macintosh が世の中に出て , そして Windows が普及し た現在 , GUI という言葉が以前にも増して よく使われるようになりました。 Mac OS や Wmdows のユーザがアプリケ ーションを操作する場合 , 画面上に表示さ 1 2 C MAGMINE 2001 6 ユーザインタフェイスの定義 れたグラフィックを見て , それに応じたア クションを起こします。それに応じて , シ ステムは定められた処理を行います。この ように , ユーザとシステム ( 機械 ) との間に は , 指示を行うための橋渡しとなる部分が 必要になります。この橋渡しとなる部分の こと , もしくは , それを実現したものを指 す表現がユーザインタフェイス (UserInterf ace , 以下 (I) です。インタフェイスは「界 面」とか「接点」と言い換えることができま す。 Ui という表現はユーザに接触している 「機械」が表現上は隠れていますが , あえて それを表現したい場合にはヒューマンマシ ンインタフェイス (Human Machine lnterfac e : HMI) といった言葉が使われることもあ ります。 同義語がいくつかありますが じです。 具体的にはどんなもの ? UI がどのようなものかをイメージするに 意味は同 のボタン , ドアのノブ , 携帯電話のボタン , たとえば , ビデオのリモコン , エレベータ 活で数多くの機械を操作しているからです。 道です。 21 世紀の現在 , みなさんは日常生 は , 具体的なものにあてはめてみるのが近 自動車のハンドルやペダルなど・・ これ らは , ューザが何らかの操作を機械に命令 するために使われる装置なので , まさに UI

7. 月刊 C MAGAZINE 2001年6月号

またアクアメニューバーであるのかどうか の判断も同様に Ges ね lt で行えます (List 2- ② ) 。 ◆ MyMenuInit く , 別になっているため , tPo れでウイン Carbon アプリケーションでは , AppIe メ ドウポートを指定できません。強制アップ ニューの構築が不要になります。アクアメ デートの API が InvalRect ではなく , InvalWi ニューバーには [ 終了 ] メニューが必ず用意 ndowRect に変更されています (List 2- ⑤ ) 。 ◆ MyInitToo ox されているため , [ File ] メニューに [ 終了 ] Carbon アプリケーションの場合 , T001b0 メニューを用意する必然性がありません ( Li ◆ MyProcMenuSeIect x のようにマネージャの初期化は , ほとん st 2- ( 4 ) ) 。 Carbon では , Apple メニューの下半分の ど不要になります。そこで , TARGLT_API サポートが不要になりました。 MAC_CARBON を参照して , Carbon 対応 ◆ MyProcTestMenu でない場合のみマネージャの初期化処理を ◆ MyProcWinContent Carbon では , T001b0X のようにグラフポ 行っています ( List2- ( 3 ) ) 。 ートとウインドウポートが同一位置ではな 前述したようにグラフポートとウインド List 2 #e lge SetPort(inwinRef); iendif 引 0 0L00 引 (&inpt); / * ボタンにマウスダウンしたかを判断する * / thepart = FindControl(inPt,inWinRef,&theControl if(thepart ! = kControINoPart){ thePart = TrackControl(theControl,inPt,NULL); if(thepart = = kControlButtonPart) { if(thecontrol = = gTestButton[0]) { / * 日 tl ボタンを押した場合 * / MyProcTestMenu(kTest11temNo); )else if(theContr01 = = estB 忱 on [ (l) { / * Test2 ボタンを押した場合 * / MyProcTestMenu(kTest21temN0); List 2 #endif メニューバーの処理 1 日セ at 土 0 void MyProcMenuSeIect(long inMenuSelect) 8h0 て t theMenu,theItem; theltem = LoWord(inMenuSelect); ヨ theMenu = Hiword(inMenuSelect); switch(theMenu) ( cage kAppleMenuID: / * Apple メニューの処理 * / if(theltem = = kAboutItemNO){ / * アバウトメニューの処理 * / NULL); }else{ / * その他の App 厄メニューの処理 * / #if TARGET—API—MAC—CARBON / * C n では App 厄メニューのサポートは不要 * / #e lse St て 255 theName; MenuHandle theMenuHandle = GetMenuHandle(theMenu); GetMenuItemText(theMenuHandle,theItem,theName); OpenDeskAcc(theName); が」」 d = で駅印 迂 ( est ! = inltem){ gTest = inltem; / * 再描画を行わせる * / SetPort(gWinRef); InvalRect(&kPaintArea); マウスダウンイベント処理 北 a 0 void MyProcMouseDownEvent(const EventRecord *inEvent) ヨ WindowRef thewinRef; / * マウスダウンをしたウインドウの参照値 * / WindowPartCode thepart; / * マウスダウンした部品の種類 * / 物 thepart = FindWindow(inEvent->where,&thewinRef); switch(thepart){ iif TARGET—API-MAC-CARBON / * ca て n では emc は ck は廃止された * / #e lse 日 e sysw 加 do 響 : / * ( システム 6 までなら有効だった項目 ) * / SystemCIick(inEvent,theWinRef); #endif ウインドウ内部へのマウスダウン 8 に a セ土 0 void MyProcWinContent(Point inPt,WindowRef inwinRef) 3 第 / * マウスダウンしたコントロールの参照値 * / ControlRef theControl; / * マウスダウンした部品の種類 * / thePart; / * マウスダウン座標をグローバル座標からローカル座標へ * / #endif case inMenuBar: / * メニューバーへのマウスダウン * / MyProcMenuSelect(MenuSelect(inEvent → where) ); break; case inDrag : / * ウインドウのドラッグ箇所へのマウスダウン * / 飛 G 師 .- AP 工 -. 鯊 :. ノ * c れではがない。 8.80 て ee 址 8 に相当する情報は専用のアクセッ 関数で得る。ー * BitMap screenBits; 地ー 8S0 て ee れ B 土 ts ( & 日 0 て ee B 土 tB わ DragWindow(theWinRef,inEvent->where,&screenBits.bounds); DragWindow(theWinRef,inEvent->where,&qd. screenBits. 跖鬮nd8嶹 break; case incontent: / * ウインドウ内部へのマウスダウン * / MyProcwincontent(inEvent->where,theWinRef); break; case kFileMenuID: / * File メニューの処理 * / if(theltem = = . tItemN0) { / * Qu 土 t メニューの処理 * / g も 00P = FALSE ・ ( 7 ) break; ーの処理 * / case kTeBtMenuID: / * Test メニュ MyProcTestMenu(theItem); break; HiliteMenu(O); ielse #endif イ 2 C MAGAZINE 2 開 1 6

8. 月刊 C MAGAZINE 2001年6月号

スタートアッフ Ja a 1 a v a 言語事始 データ型と演算子 毛呂宗夫 ロ 前回はクラスとオブジェクトについて解説しました。 今回は Java のデータ型と演算子の話をします。 データはメモリにそれぞれに合った形式で 使う必要がある場合は普通この型を使いま C と C 十 + と Java 格納されます。これらの形式のことを型と す。 b e や sho れよりもメモリを必要とするの いいます。 ですが , CPU が計算をするときはメモリが 前回お話した「クラス」も型です。型の中 Java は C 言語・ C + + 言語をベースに設計 少ないとかえって効率が悪いことがあるの です。「入る値は 100 以下だから b e で間に されています。とくに , 制御構造や式など , でも基本的なものがいくつかあります。数 値を記憶する型 , 文字を記憶する型 , 「判 合うかな・・・・・」などと考えずに int を使って プログラミング言語一般に共通する部分 断」を記憶する型・・・・・・。 Java の場合 , それ は , C 言語とほば同じになっています。 ください。 今回はデータ型と演算子について話しま らは 8 種類あって , プリミティプ型あるい char は character ( 文字 ) の略です。 Java プ す。データ型には C と似たものがあります。 は基本型と呼ばれています。 ログラム内部では文字は ( 漢字も含めて ) , プリミテイプ型は大きく分けて「 boolean 演算子もそうで , たとえば四則演算などの 0 ~ 65535 の数値で表されています。 char は 型 ( 論理型 ) 」と「数値型」に分かれます。数 演算子は基本的に C 言語と同じです。本誌 主にそれを記憶するのに使います。ただし の「 c 言語入門講座」の第 1 回 ( 4 月号 ) には , 値型はさらに「整数型」と「浮動小数点型」 数値型の一種なので , 計算に使うことも可 データ型と演算子についての説明がありま に分かれます。整数型には byte , short, 能です。 す。そちらも見て参考にしてください。 int, long, char 型があり , 浮動小数点型に 浮動小数点型は , 表せる数値の範囲が非 Java は簡単だといわれています。まあ C は float, double 型があります。 常に広いのですが , 完全に正確に表せるわ + + に比べれば文法的には簡単ですが , ラ これらはそれぞれ表せる範囲が違います けではありません。 float の場合だと先頭か イプラリが膨大なので話すべきことは多く , ( 使用するメモリの量も違います ) 。表にし ら 6 ~ 7 桁しか正確ではありません。キャス 全部を説明するのはキツイのです。 C と共 ておきましよう (TabIe 1 ) 。 ト ( 後述 ) によって long 型をⅡ oat にしてまた 通する部分はあまり詳しくはやりません。 long に戻すと , 値が変わってしまうことが かいつまんで説明します。まず int につ 悪しからず。また次回解説する予定の「制 いて。これはⅲ teger ( 整数 ) の略で , 整数を あります。 List 1 (Precision. java) はその実 御構造」なんかも同じです。 TabIe 1 プリミティプ型 種類 表せる範囲 型 プリミティプ型 -128 ~ 127 -32768 ~ 32767 -2147483648 ~ 2147483647 -9223372036854775808 ~ 92233720368 図 775807 0 L 0 ~ 65535 ( 文字リテラルでは ' \ u0000 ' =yuffff' と表記 ) -3.4X1038 ~ + 3.4X1038 ( 有効桁数は 6 ~ 7 ) -1 .7XIO% ~ + 1.7X1 ( 有効桁数は 14 ~ 15 ) t 「 ue , f 引 se の 2 種類 byte short int long Cha 「 float double boolean コンピュータは computer( 計算するもの ) というくらいで , 計算することが本職です。 「計算」をするためには , まず数値データ を受け取り , それを記憶しておかなければ なりません。 また , 文字データを記憶することや , 「状 態」や「判断」を記憶することも必要です。 整数型 数値型 浮動小数点型 boolean 型 65 スタートアップ Java

9. 月刊 C MAGAZINE 2001年6月号

のと , 自分自身のアプリケーション内にか TabIe 2 設定できるフックのタイプ WH CALLWNDPROC システムが目的のウインドウブロシージャへ送信したメッセージを監視 WH_CALLWNDPROCRET 目的のウインドウブロシージャが処理したばかりのメッセージを監視 コンピュータを利用したトレーニングアプリケーションに有用な通知を受け取る WH CBT WH_DEBUG ほかのフックプロシージャのデバッグ WH_FOREGROUNDIDLE アプリケーションのフォアグラウンドスレッドがアイドル状態になるのを監視 WH_G ETM ESSAG E メッセ - ジキューへボストされたメッセージを監視 WH_JOURNALPLAYBACK フックプロシージャがすでに記録したメッセージをボスト WH_JOURNALRECORD システムメッセージキューへポストされた入力メッセージを記録 WH_KEYBOARD キーストロークメッセ - ジを監視 WH MOUSE マウスメッセージを監視 WH_MSGFILTER ダイアログボックスなどの入力イベントの結果として生成されたメッセージを監視 WH_SHELL シェルアプリケーションにとって有用な通知の監視 WH_SYSMSGFILTER ダイアログボックスなどの入力イベントの結果として生成されたメッセ - ジを監視 List フックに必要な DLL のソース けるものの 2 通りを選択できます。 サンプルプログラムの動作 今回のサンプルプログラムで行っている フックはマウスフックで , システム全体に フックをかけています。マウスフックを使 うと , マウスの右クリックを強制的に左ク リックに変えてしまうなどの芸当が可能に なります。 マウスメッセージにどのようなものがあ るか , TabIe 1 にあげておきます。 サンプルプログラムは , マウスの位置を 常に監視して , 動きがあった場合にメッセ ージをクライアントアプリケーションに送 信しています。送信されたメッセージをト リガに , マウス位置を表示します。 Fig. 2, 3 はサンプルプログラムの動作画面です。 Fig. 3 では自身がアクテイプなウインドウで はないときでも動作しているのがわかりま す。 / フックに必要な DLL システム全体へのフックを実現するには , DLL を作成する必要があります。 List 2 は Fig. 2 サンプルプログラムの動作画面① フックについて 1 Mouse hook dll #define STRICT #include く windows. h> #define MY—NOTIFYICON HINSTANCE hInstDLL; p て ag 血宿記 a e に。て証 4 HWND hWndtgt=NULL; H 00K h00 に 洋 p a da ( * DllMain (hModule,cbHeap,lpchCmdLine) int WINAPI DllMain( HINSTANCE hInstance,DWORD dwNotification, LPVOID IpReserved) UNREFERENCED_PARAMETER(hInstance); UNREFERENCED—PARAMETER(I pReserved hInstDLL = hlnstance ー て eturn TRUE ー * mouse hOOk LRESULT CALLBACK mousehookproc( で hc,WPARAM wParam,LPARAM IParam) if ()c = = HC—ACTION)( ÆendMessage(hWndtgt,MY—NOTIFYICON,wParam, lParam); return CaIlNextH00kEx(hhook, hc, wparam, lParam); tetu てル Ca 日 Nex H00kbc ( れれ 00k = れ 0 ” - て a 第いは pa て am み、に フック ON 土 n セ makehook(HWND hWnd) hWndtgt = hWnd; 06k 言 se 鈿 d 。 w OO x ( ユ 0 び 9 ROC ) 血 ou hookp 加朝ゆ ) , 迂 ( 櫛 00k = 阯 ) { return 0 ー return 1 ー フック OFF void unhook(void) UnhookWindowsHookEx(hhook) : ン ス ン ス 0 ン の : , MAGAZINE フック P 1 マウス X 座標 マウス Y 座標 日 7 フック OFF Close Fig. 3 サンプルプログラムの動作画面② ~ 、フツ、ク P 謝 1 マウス、座標 418 99 ・・① ラク問始 フック F 方イル第書 0 へフ のアプリケーションがアクテイプでも 表示が変わるのを確認して下さい 134 C MAGAZINE 2001 6

10. 月刊 C MAGAZINE 2001年6月号

ということがひとつの条件と考えられます。 プログラミング風に言い換えれば「全体の 中で一部のデータだけを何度も繰り返し参 照する可能性が高い ( 参照局所性が高い ) 」 ということになります。このような条件が ある場合には , まさに「超整理法」と同じ方 法で探索を効率化することが可能です。 List7 を見てください。サーチの結果何か しらのデータが見つかるごとに , そのデー タの位置を 1 つ前に持っていきます。同じ データが何度も探索されるに従って , その データは先頭付近に移動してくるので , 結 果として逐次探索の早い段階で見つかるよ うになっていくのです。たとえば , かな漢 字変換ソフトで , よく使う単語を変換候補 辞書の前のほうに登録しておくと変換効率 がよくなるのと同じです。 こで紹介した方法は「自己組織化探索」 と呼ばれており , 理屈上の計算量オーダー は 0 ( N ) でリニアサーチと変わりませんが , 全体の中で一部の値だけが何度も検索され る場合には " 実際的に " 効果が期待できます。 自己組織化探索では本来ならば , 一度見 次回予告 int organization—search(int X'int* a は北 mm) ( 10 ) #define N #define NOT ーを 0 [ の ( -1 ) 社 n 面 e く me. #include <stdlib. #inc ⅳ <stdio. 自己組織化探索 てしまえれば理想的です ( そうすれば次か つかったデータを一気に先頭に持っていっ 104 C MAGMINE 2001 6 0 return NC - FO ( 發・ て et Ⅱてれ n; return n-l; a[n-l]=atn]; t = a [ 1 土 f ( n 〉 0 ) / * ーっ前と入れ替える * / if(n<num) while(n«num & & atnl!=x) int れ = の Fig. 5 不精な人の机 書類の山 必要な書類を取り出 し , 使い終わったら 山の上に重る アルゴリズム うに集まる が山の上のほ よく使う書類 昔使用 最近使用 ※同じ書類を何度も使う場合 , 上から順に探していくだけで比較的早く見つけられる らは真っ先に見つかるのですから ) 。とこ ろが , 配列でそれを行おうとすると先頭に そのデータを挿入したぶんだけ全体のデー タをひとつひとつ後ろにずらしていく必要 があり , それだけで 0 ( N ) の計算量が必要 になってしまいます。サーチを速く行おう としているのに , これでは本末転倒です。 こで「配列」ではなく , 次回紹介する「リ スト ( リンクリスト ) 」という構造を使うと , かかわらず常に一定時間 , 要するに・一瞬 " ) この先頭への移動処理を 0 ( 1 ) ( データ量に List 7 int main(void) i,r,array(N]; int は頻繁に増えたり減ったりするデータを容 易に扱ったり , データ列の先頭 , 末尾 , 中 間など場所を選ばずに追加データを瞬時に 挿入できるなど , 非常に強力な ( そして扱 いやすく簡単な ) 特徴を持っています。ど んなプログラムを作るのにもとても有意義 な「リスト構造」 , ぜひお見逃がしなく ! 本連載に関する , 問い合わせ , ご意見・ ご質問などは , algo@teamswift.com までお 気軽にお寄せください。お待ちしています。 で行うことができます。さらに , 「リスト」 srand((unsigned 土北 ) い ( ) / * 適当な配列を作る * / for ( 辷の i<N 十十 ) arrayti]=rand( 滝 2 の fo て ( ) printf("array fo ヨ i=0 十十 ) printf("[%dl:*d をは , て ay [ 幻 i 北 f ( 、 n 何を探しますか ( -1 で終了 ) : リ if(i==-l) 田塒 r=organization-search(i,array,N)i if 仕 = = で -. FO D ) printf("%d は見つかりません跏 % i printf("%d は宅 d 番目です”は , て else return EXIT—SUCCESS;