踟 mm 加 List 1 特殊ディレクトリのオープン こまで説明したようなシンプルなショ ートカットの場合 , 基本的に ShellExecute 関数を用いることで , そのファイルのオー プンや実行が可能です。ですが , ダイヤル アップネットワーク , プリンタ , コントロ ールバネルといったシステムに直結した特 殊なディレクトリについては , その引数の 設定に注意が必要です。 たとえばダイヤルアップネットワークの 場合 , List 1- ⑩のような記述をします。 の引数で指定されている「 : : { 20D04FE0 ~ } : : 」 の { } で囲まれた部分が , 前半で説明したク ラス修飾子 , CLSID です。 Windows では , ダイヤルアップネットワークのフォルダに はこの ID 番号が関連付けられているのです。 その情報を保持しているのは , これも前半 で説明したとおりレジストリです。プリン タフォルダも同じように指定 , 表示してい ます (List 1- ⑩ ) 。 なお , ほかにも下記のような C ID があ ります。 マイコンピュータ { 20D04FE0-3AEA -1069- A2D8-08002 B30309D } else { SendMessage(GetDIgItem(hDIg, IDC—LISTI) , LB—ADDSTRING, 0 , い ong 尸 Load 失敗つデ メールのオープン VOid openmaiI(HWND hDIg) ” m に 0 : tatsuya@exnetcom ・ eom?subject=TEST% NUIÄJi U もも , web のオープン Vöid openweb ( VOid ) s い u ( 部いい心い呷址セノ : ん、沺 e セ朝い痴もい ダイヤルアップフォルダのオープン void fol deropen ( void ) h 4 x c 沚 eÅ阯い当 63h ! / ーを宿 { 20D04FE0 ー 3AEA -1069 ー A2D8 ー 08002B30309D 当 : 992CFFA0 = を 557401 98 を 0 ー 000D010CCC48 戸 プリンタフォルダのオープン void fO lderopenprinter ( void) 取もしいド 08 い EXPLOR 良を ! : ( 20D04FE0 ー 3AE ト 106 A2D8-08002B30309D } ! 叔 2227A280 ー 3AE 1069- A2DE -08002B3030SP 戸 ネットワークコンピュータ { 208D2C60-3AEA -1069- A2D7-08002 TabIe 1 利用した主な A 曰 B30309D } HINSTANCE ShellExecute(HWND hwnd. LPCTSTRlpOperation, LPCTST 日 IpFiIe, 興味のある方は調べてみてください。 LPCTSTR lpParameters, LPCTSTR lpDirectory,INT nShowCmd); 説明指定されたファイルのオープン ( 表示 , 印刷 ) / 終わりに 親ウインドウのハンドルを指定する hwnd lpOpe 「 ation 実行する操作が入った NIJLL で終わる文字列へのポインタ F ⅱ e パラメータで指定したファイルをオープン open" 今回は ShellExecute 関数を使って , ショ F ⅱ e バラメータで指定したファイルを印刷 p 「 int" ートカットや特殊なアプリケーション , テ F ⅱ e バラメータで指定したフォルダを調べる "explO 「 e" 返り値成功すると 0 よりも大きな値 , 失敗すると 0 以下 ィレクトリの実行を解説しました。 HRESULT CoInitialize (LPVOID pvReserved) ・ 最近とくに需要が増えている Web へのア 説明コンポーネントオプジェクトライブラリの初期化 クセスは , ショートカットを作成するのも 引数 pv 日 eserved 予約済み。 NULL でなければならない 1 つの手ですが , プログラム内部で処理して しまうほうがメニューにも組み込みやすく うため , 今回は ShellExecute 関数で直接オ スをオープンする場合 , 方法は 2 通り考え なります。よぶんなファイルも作られずに られます。プログラム内部から直接起動す ープンする方法を採用します ( List1- ⑩ ) 。 すっきりするのではないでしようか。 る方法と , x . url のようなインターネット このように , ShellExecute 関数に URL ア 昨今ではメールや Web へのアクセスは必 のショートカットをいったん作成し , これ ドレスを記述することで , Web プラウザの 須事項になりつつあります。いろいろな方 を She Ⅱ Execute 関数で実行する方法です。 起動とともに目的の U Ⅲ , へ接続するという 法でアクセスを促すことで , 次へ向けた展 シンプルなインタフェイスが可能になりま 後者の url ファイルを使う方法もいいのです 開が見えてくるでしよう。 す。 が , 新たに別ファイルが必要になってしま 1 20 C MAGAZINE 2001 3 引数
トを作成するのでそのフルバス名を取得し 名を表示しています。 6 ) 各ポインタの解放 ています田 stl - ⑤ ) 。 次は , 特殊なディレクトリやアプリケー まず , 今回のサンプルプログラムでは , 次にこのフルバス名をショートカットに ションの実行です。まずメールを起動す ートカットの名称を自由に設定できま ンヨ 」ボタンをクリックしてみましよう。シス す。テキストボックスに名称を記述しない セットし , 成功したら , ショートカットの コメントを記述します (List 1- ⑥ ) 。このコ テムに登録してあるメーラを使って新規メ 場合は , 「 C マガ ( 電卓 ) . lnk 」になります (Li メントはショートカットのプロバティで確 ールの送信ウインドウが立ち上がります。 st 1- ① ) 。 こで , あらかじめ宛先 , 件名などを設定し こからが COM を利用する部分です。 C 認できます ておくこともできます (Fig. 3 ) 。 OM を利用する場合 , まずコンポーネント 最後に , これらの処理が終了し次第 , 各 引き続き , ーボタンです。 オプジェクトライプラリの初期化が必須で ポインタの解放を行います田 stl - ⑦ ) 。 す (List1- ② )。次に , アプリケーション間の こをクリックすると , 筆者勤務の Web サイ ショートカットのプロバティの取得 トが起動するでしよう (Fig. 4 ) 。 こで起 やり取りで利用するインタフェイスのポイ ンタを取得します田 stl - ③ ) 。これに成功 次は , 作成したショートカットのプロバ 動するプラウザは , Windows システムのデ ティの取得です。基本的な流れはショ フォルトプラウザです。 すれば , 引き続き IPersistFiIe インタフェイ 最後に , 特殊ディレクトリの 1 つである スのポインタを取得します (List 1- ④ ) 。 カットの作成と同じです。 こでは Windows 標準の電卓のショートカッ まず , コンポーネントオプジェクトライ Fig. 2 電卓のショートカット リックしてみます。 Fig. 5 , 6 のように , そ れぞれが起動する様子がわかるでしよう。 お知こ入り ) ツルヘルプせ ファイル編集匡 ) 表示 ちなみに W ⅲ d0WS2000 では「ダイヤルア 中戻る , 、山 0 検索フォ聴朝雇歴「年 X 幻ー , アドレス 0 ロ Release ップネットワーク」フォルダが存在しない ・ C ため工ラーが表示されます。 sample.±j sample.res TEST vc . i 曲 それでは , ソースコードを見ていきまし よう (List 1 ) 。 ショートカットの作成 ートカットを作成する場合 , 以下の 手順になります。 1 ) コンポーネントオブジェクトライプラ リの初期化 2 月 She Ⅱ Link インタフェイスのポインタを 取得 3 ) 旧 ersistF ⅱ e インタフェイスのポインタ の取得 4 ) Unicode 化 5 ) ショートカットのセーブ Fig. 5 「ダイヤルアップネットワーク」ディレクトリの起動 ファイルの編集 ( 印表示 OØお気に入り住 ) ツ , ル接続 0 へ” ←、ー山一 0 検索フォルダ朝履歴ーヨッー年〆 ' ' 」アドレス 0 タイヤルアップネットワーり NIFTY イヤルアップネットワ アイ甘不レ tn 日日州 , 上」 のオブジト を戸同 Release アイコンを択すると、そ肋、表 示す。 関項目 個のオ 1 ト マイコ死。ュータ KB Fig. 4 web ブラウザの起動 尹イル第第を〒、、おひ ~ = ップを = へ , ロ…ーにを 5 ~ , 0 = 奇 ッドレズ 0 h ″” , ~ 嶂 ) 。市 / ・ e 亜ー・①預 0 ① mm 聞 a ① Fig. 3 メールウインドウの起動 強表示物豊書式 ) - ツ : を円メージせヘルプ。亠こ = ~ - ファイ 新…ーみをチェ 1 「件名 TEST Fig. 6 「プリンタ」ディレクトリの起動 方イル ( 日編集表示 ( 辺お知こ入り (A) ツールヘルプ⑧ ←震る、→山 10 検索もフォルダ当履歴鳶年メ幻住 , アドレスンタ 列ンタの追加 1 E PSON EPSON 0 群 01 EPSON PM-770C (. 日、℃ -455J PM -82 〔 0 PM -77 ) 約ダイ切しアップネットワーり 物プリ第 しい接 ORT フ・リンタ このフォルダには、現在インストールさ れているプリンタおよび新し、列ンタ のインストールをお手伝いするウィサ三 個のオプジェりト 1 1 8 C MAGAZINE 2001 3
Enjoy PerI Programming モジュールを活用はう しかし , 実際の WebAt ージではユーザに DynaLoader は C ライプラリをダイナミ とができるわけですから , この CGI を使っ ックにロードするためのモジュールです。 入力させるのではなく , 固定文字列にして てメッセージを受け取った人は , メールア おくほうが便利な場合があります。たとえ すぐあとで bootstrap という関数が使われ ドレスをうのみにしないようにする必要が ば質問のページなら " [Q] " という表題 , プ ていますが , これは DynaLoader モジュー あります。 ルからインポートした関数です。直後の if 文 レスリリースのページなら " [PRESS] " と 参考リンク で , C ライプラリをロードできなかった場 いう表題にしておけば , 受け取ったメール 合の処理が書かれています。 の分類・振り分けが楽になるからです。 もしも C ライプラリをロードできなかっ そんなときは「隠しフィールド」を使うと 以下の Web ページでもメールの送信お た場合には , old_encode_base64 , old_dec よいでしよう。たとえば次のようにします。 よび送信 CGI について詳しく解説していま ode—base64 という関数 ( これは直後に perl すのでぜひ参考にしてください。 <input で書かれている ) を encode_base64, decod type= ” hidden ” ・ ActivePerl でメールを送る (HiPP02000 さん ) e ー base64 というシンポルに割り当てていま name= ” mysubject" http://member.nifty.ne.jp/hipp02000/ す。 value= ” [Q] ” > perltips/perlmail. htm これによって , もしも MIME::Base64 の このようなタグをフォームに含めておけ このページでは , CGI という形ではなく , C ライプラリがその Perl 処理系でインスト ば , 自動的に表題が " [ Q ] " という文字列に 通常のスクリプトとして ( とくに ActivePerl ールされていればそちらを使い , さもなく なってくれます。 で ) メールを送信する方法についてサンプ ば PerI で書かれたコードを利用する , とい ルスクリプトが示されています。 表題の自動修正 う機能を実現していることになります。 ・ホームページにメール送信機能を付けて もしも , 自分の PerI 処理系がどちらを使 上で述べた方法だと固定文字列になって みよう (INTERNET Watch 特集記事 ) っているのかを確かめたかったら , Base6 しまいますが , プログラムの中で , http://www.watch.impress. CO. jp/internet 4. pm を修正して , if 文の近辺に List 11 のよ $form {mysubject} = /www/article/1999 / 1 122/special.htm うにデバッグプリントを入れてみるとすぐ "[Q] $form {mysubject} " このページでは , sendmail プログラムが にわかります。 のようにすれば , ユーザが入力した文字列 使えない場合の 2 つの代替手段についても の前に自動的に " [ Q ] " という文字列を挿入 書かれています。 1 つはファイルとして保 最後の部分 することもできます。 存しておく方法 , もう 1 つは SendmaiI. pm encode_base64 を , MIME::Base64::enco という別のモジュールを使う方法です。 送受信の両方を指定できないほうがよい de という名前で使用できるようにするため 次回は「ファイル添付」 に Base64. pm の最後のほうには List 12 の 次節の参考リンク (INTERNET Watch 特 ような代入がなされています。 集記事 ) の中でも述べられていますが , メ 最後の 1 ; という部分は , このモジュール ール送信 CGI では , 送受信の両方を外部か 今回はメール送信 CGI を作ってみました。 が正しく読み込まれたことを表現していま ら指定できるようにするのは危険です。悪 いかがでしたか。次回は , メールにファイ す。 use や require では , 最後に評価した式 ルを添付する機能を考えてみましよう。 意を持った人が , From も To も自分以外の が偽だとエラーとみなされるので , このよ もしも , ご意見やご質問がありましたら , アドレスを指定してしまうと , 他人になり うに 1 ; という真の値を評価するようにする すまして第三者にメールを送れることにな 本誌綴じ込みの編集部へのハガキでお知ら のが普通です。 せくだされば幸いです。また , ご遠慮なく ってしまうからです。 もちろん今回の selfmail. cgi でも , myfro 結城浩くhyuki@hyuki.com/ へメールをお送 りください。本連載に関するメールには表 m に第三者のメールアドレスを指定するこ 題に CEP] という文字を含めてくださると MlME::Base64 モジュール (3) 助かります。 本連載に関する U 糺は , 1 : *encode = %&encode—base64 ー 2 : *decode %&decode—base64; http://www.hyuki.com/ep/ 3 : 4 : です。 修正のヒントと注意事項 隠しフィールドの利用 今回の selfmail. html では , メールの表題 ( Subject ) をユーザに入力させています。 List 80 C MAGAZINE 2001 3
ません。これらに対して C 言語のポインタ のような操作をしたければ , ラッパークラ スを作って行うことになります。たとえば 問題の ln Ⅳ alue のようなクラスで int 型をく るむ ( ラップする ) のです。 main の変数 x にん nc ( ) のなかで代入して も値は変わりませんが , クラス IntValue の オプジェクトである y は , ん nc ( ) のなかで値 を変えると呼び出した元でも変わってしま います。 ・解説 [ 問 2 」 ① X ②〇 ③ X ④〇 文法についての問題です。 中で指定するとエラーになります。ただし 装にかかわるものなので , インタフェイス ④ synchronized や native などの属性は実 2 版』 7.3 7.6 ) さか注意力に欠けます。 ( 『 Java 言語仕様第 ものがあるので , これを間違えた人はいさ 1 ファイル中に複数のクラスを書いている 述などに使うことができます。本稿でも , タ型や , ごく小さなアプリケーションの記 ば複数書くことが可能です。一時的なデー が多いのですが , public でないクラスなら ③通常は 1 ファイルに 1 クラスとすること ればなりません。 なります。また final なので初期化をしなけ きます。ただし自動的に public static final に 字列に限らず参照型の変数を書くことがで ②インタフェイスのフィールドには , 文 ava 言語仕様第 2 版』翳 9.4.1 ) ると , コンパイルエラーが起こります。 ( 『 J が同じで違う型を返すメソッドを持ってい 2 個以上のインタフェイスが , 名前と引数 問題は「任意の」というところにあります。 スの多重継承はできる」は正しいのですが スの多重継承はできないが , インタフェイ ①はひっかけ問題です。 Java では , 「クラ implement するときに指定できます。 ( 『 Java 言語仕様第 2 版』翳 9.4 ) [ 問 3 」 よってクラス Ernest のコンストラクタは , ラスのコンストラクタを起動するものです。 れます。これは引数をとらず , スーパーク は , デフォルトのコンストラクタが与えら ②コンストラクタを記述しないクラスで ます。 です。ただセミコロンだけを付けて宣言し 体を持てません。たとえ中身が空でもだめ ①インタフェイスでのメソッド宣言は実 ・解説 たら正解とします。 ァイルをコンバイルし , 工ラーが出なかっ たらもう 2 点です。自分が対策を加えたフ 間違いを指摘できたら 2 点。対策ができ 対策 : catch 節の順序を逆にする 節に到達する可能性がなくなっている にキャッチしているので , 2 番目の catch ④間違い : 親クラスである OzawaEx を先 対策 : protected を消す ワードが付いている ③間違い : クラス宣言に protected キー する ンストラクタが例外を投げないように 義する。あるいはスーバークラスのコ 対策 : きちんとコンストラクタを定 ままにしている ラスのコンストラクタをデフォルトの クタで例外を投げているのに , サブク ②間違い : スーバークラスのコンストラ 対策 : 目を消して ; を付ける る ①間違い : メソッド宣言に { } が付いてい super(); Ernest() { となります。しかしこれでは Ansermet のコ //Ansermet のコンストラクタ 特集 プログラミング 期末試験 ンストラクタが投げる可能性のある例外を , キャッチも宣言もしていません。このため 工ラーが発生します。この場合 , throws 節 を付けたコンストラクタを明示的に宣言し なければなりません。 また , フィールドの初期化が中途半端で 終わる危険性もあるので , コンストラクタ で例外を投げるのはなるべく避けたほうが よいといわれています。 ( 『 Java 言語仕様第 2 版』 8.8.7 ) ③普通 , クラスには protected は付きませ ん ( ただし内部クラスの場合は protected や p rivate になることがあります ) 。 ( 『 Java 言語 仕様第 2 版』 8.1.1 ) ④ Se ⅲ Ex は継承関係により OzawaEx でも あるので , 1 番目の catch 節によってキャッ チされます。その結果 , 2 番目の catch 節に いくことはありえず , ムダな文になってい ます。「ムダな文だけど , まあいいや」とい う気もしないでもないのですが , Java の場 合そのへんは厳しく , プログラム中に到達 不能文が含まれているとコンパイルエラー になります。 ( 『 Java 言語仕様第 2 版』 14.20 ) 「問 4 」 ①【 A 】で作られるテフォルトコンスト ラクタの属性は pub ⅱ c アクセスたが , 【 B 】ではデフォルトアクセスなので , バッケージの外でインスタンスを作 れない。 ② abc ( ) の返す値が se たった場合 , 【 A 】では xyz ( ) が起動されないが , 【 B 】では起動される。 ③ = = 演算子は , 両辺のオブジェクトが 実体として同じであるときにだけ true を返す。 equals() メソッドは , 2 つ のオブジェクトが意味的に同じであ るときにも true を返す ( 可能性がある ) 。 ・解説 ①明示的なコンストラクタが存在しない 特集実力チェックプログラミング期末試験 Java 編 39
モニタ募集 ゼノ 者 1 名 2 Applixware Office 2 名 A 初めての Perl 3 名 B FreeBSD コマンド 5 名 for Linux 5.0 スーバーリファレンス 提供ターポリナックスジャパン株 提供ソフトバンク / ヾプリッシング株 提供ソフトバンクバブリッシング税 TEL 03 ( 5766 ) 1660 TEL 03 ( 5549 ) 1200 TEL 03 ( 5549 ) 1200 初めての Perl FreeBSD Learning コマンド Perl スーパーリファレンス 国目連己 : 新第一 FreeBSD の各コマンドについて使 用される場面ごとに並べたリファレ ンス 1 Borland C + + Builder 5 提供ポーランド ( 株 ) TEL 03 ( 5350 ) 9380 ⅲ社 ow 、 h - 冊曲 ANSI ⅵ s 聞 ev 叩 me Ⅷⅲ 0 誂曲 2 市 師面 0 V 、を等 , 襯れ g 使いやれ卍ジアル問発環境 ・ 0 以上のコンポーネント ・メモリバグを出する c 。 0 い気 ・インダーネット対応 ・多影なデータベース機能 ・丘存の資産の物科用 な生常性を、多様なニ - 暑ズに応える てで実されたジュカ発ツーを B 面血 0 B ⅶ 5 第ま第 ンフト ^ ンっ物式ま社 PerI によるプログラミングを実践し ながらその内容を解説する初心者向 けに書かれた入門書 バックナンバー情報 03-5549-1200 ( 2001 年 1 月 24 日現在 ) 1999 年 特集「 MFC6.0 最新機能と活用テクニック」 ・ 2 月号 新連載「徹底解説画像と音のアルゴリズム」 提携翻訳「バランス型デイザリング技法」ほか 特集「アルゴリズム入門」 ・ 4 月号 レポート「 UN Ⅸサーバアプリケーションの WindowsNT への移植」 新連載「 C 言語入門」 , 「実践入門 c + + 」 , 「テザインパターン入門」 ほか 特集 1 「 STL 」 ・ 7 月号 特集 2 「組み込みプログラミング入門」 特別記事「 pc - UN Ⅸプログラミング開発環境ガイド」ほか 2000 年 特集 1 「 XML c / c + + による実用的な利用方法」 ・ 2 月号 特集 2 「 Windows 2000 でこう変わる ! 最新 Windows プログラミ ング」 レポート「 Windows2000 におけるテパイスドライバの開発」ほか 特集 1 「メモリ・ファイルの操作を極める」 ・ 8 月号 特集 2 「 Wonde 「 Witch 徹底解説」 特集 3 「 BeOS プログラミングへの招待」ほか 特集 1 「 3D 動きのアルゴリズム」 ・ 9 月号 特集 2 「 PDA プログラミングのコツ」 レポート「 Borland C + + Bu ⅱ de 「ヒジュアル開発のアーキテクチャ」 , 「 Tu 「 bo Debugger 5.5 入門」ほか 特集 1 「 TwinVQ 」 ・ 12 月号 特集 2 「インターネットプログラムの基礎知識」 レポート「インプライズ K ⅵⅸプロジェクトに迫る」ほか 2001 年 特集 1 「 XML 入門プログラミング基礎の基礎」 ・ 2 月号 特集 2 「 DirectX 8 の徹底解説」 特集 3 「最新の DirectMusic を使う」ほか Linux で動作するワープロ , 表計算 BorIand C + + BuiIder の最新版。テパッ グ機能を強化し , 最新の A 曰や ANSI ソフトなどを集めた製品。詳しくは 規格に対応したビジュアル開発環境 150 ページを参照のこと 【モニタ募集要項】 ◇応募資格 : プログラミング経験者 , お ADERS ' ROOM モニタ係」宛に投函い よびプログラミング学習者。 ただくか , あるいは E-mail アドレス宛 ◇モニタ期間 : 商品受領より 3 か月間 ( モ に電子メールを送信ください。 ニタ商品によっては発送に日時を要す ◇レポート発表 : 提出いただいたレポー るものがあることをご了承ください ) 。 トは当編集部到着月日から 2 か月後に ◇モニタレポート : モニタ期間中に最低 発売する本誌上 , または付録 CD-ROM にて掲載収録する予定です。 2 回のモニタレポートを提出していた ◇選考発表 : この号のモニタ選考結果は だきます。レポートはテキストファイ ルとし , フロッピーディスクにて「 RE 2001 年 7 月号にて発表いたします。 モニタ応募の注意 2000 年 1 1 月号 モニタ選考発表 ◇綴じ込みの葉書に必要事項を明記のうえご ( 敬称略 ) 応募ください。 ( 1 ) Borland C + + Builder 5 ◇記入もれやモニタ番号が複数記入されてい 佐藤弘之 ( 広島県 ) る場合 , 綴じ込み葉書以外でのご応募は無 ( 2 ) MSDN プロフェッショナルサブスクリプション 効とさせていただきます。 大久保顕信 ( 千葉県 ) ◇締め切りは 3 月 18 日必着です。 2000 年 1 1 月号 読者プレゼント応募の注意 プレセント当選者発表 ◇綴じ込みの葉書に必要事項を明記のうえご (A) マウスパッド 応募ください。 菊池翔 ( 宮城県 ) ◇雑誌公正競争規約の定めにより , 懸賞当選 香泉和寿 ( 大分県 ) ほか 8 名 者 , モニタ該当者はこの号のほかの懸賞に (B) DB2 ネックストラップ 応募できない場合があります。 今井勝正 ( 京都府 ) ◇締め切りは 3 月 18 日必着です。当選結果は 山下佳寿 ( 神奈川県 ) ほか 3 名 281 年 7 月号にて発表いたします。 原文を手直しさせていただく場合 READERS'ROOM ではみなさ まのご意見・ご感想をお待ちして もあります。ご了承ください。 [ 宛先 ] おります。ほかにも , コンピュー タをめぐるさまざまなこと , 何で 〒 107 ー 0052 もけっこうです。質問もどしどし 東京都港区赤坂 4 ー 13 ー 13 ソフトバンクバブリッシング ( 株 ) お寄せください。 C マガジン編集部「 R & R 」係 投稿原稿 , 自作ソフトも受け付 [ 電子メール宛先 ] けております。採用分には弊社規 定の薄謝を進呈いたします。お送 cmaga@softbank. CO. jp [WebRf ージ ] りいただいた原稿・ソフトは , 原 則として返却いたしません。また , http://cmaga.zdnet. CO. jp/ ( 敬称略 ) *lnside Windows の在庫については , 上記の電話番号までご連絡ください。 綴じ込み葉書裏面の記事評価アンケートには 下記の数字をご記入ください。 ①特集「実力チェックプログラミ ⑩ C 言語フォーラム ⑩最新開発環境レポート「 c + + Test 」 ング期末試験」 ②℃言語プログラミング学習塾 ÜMONTHLY HEADLINE ③プログラミング相談室 @)C MAGA Bookends ⑩学問のススメ 4 Standard C/C + + ⑤ Enjoy perl p 「 ogramming のあつばれご意見番 ⑥伝授 ! 極めよ Ruby 道 ④ C マガ電脳クラブ ⑦ Java プログラミングリファレンス @READERS'ROOM ⑧アルゴリズムラボ ⑨ Enter The 3D Programming ⑩ Linux Programming Tips OWindows Programming Tips @Java P 「 ogramming TIPS ⑩遊びのレシピ fo 「 WonderWitch ⑩ローテク講座 1 63 R EADERS' 日 00M
、 Bookends データベースに触れる データベースに関する書籍だ。 SQL 開発の源流といっていい mSQL という fMySQL&mSQLJ はその MySQL と , My いだろう。 に , かっ安心して使えるものだといってい 保存などを単純に利用したい場合に , 手軽 高速な検索・データ抽出性能や , データの べースとしての基礎的なメリット , つまり は , 激しい業務には使えないもののデータ のものだといえる。それに対して MySQL っかりとした , 大きな業務でも使える規模 MySQL があげられる。 PostgreSQL は , し 代表的なものとしては , PostgreSQL と 存在する。 のでない , フリーウェアのデータベースも たいへんだ。しかし , それほど大規模なも 必要に応じて手軽に実行するのもなかなか が高い。 OracIe や Microsoft SQL Server を ロジーだが , 利用するとなるとやはり敷居 データベースは便利で重要なキーテクノ MYSQL と mSQL るのではないだろうか。 のため , なんとなく気後れしている人もい れることが多いというイメージが強い。そ タープライズ」などと呼ばれる用途に使わ った , 癖のある技術が数多くある。「エン ースには単なる言語による開発とは少し違 ージャ , レプリケーションなど , データベ トランザクション処理やストアドプロシ あるという人はどのくらいいるのだろうか だが , 実際にデータベースを触ったことが 割を思う存分果たすようになったわけだ。 場所として , データベースはその本来の役 にデータベースがある。データを保存する Web の台頭に合わせて普及してきた技術 『 MySQL&mSQL 』 〃 ata 从アル盟物″← 5 に edO 4 に砒わな、をⅣ & 「 MySQL cvmSQL OR 日乢 Y ・ 第ラ引←ツ物レ ”。・ル ( 第ドを“紙れ物応物 物式会社ソフトエージまンシー監 高ま . を田美を子 Randy Jay Yarger,George Reese,Tim King 著 / 株式 会社ソフトエージェンシー監訳 , 高見禎成 , 寺田美穂子訳 556 ページ , 3 , 800 円 オライリー・ジャパン / オーム社 旧 BN4-87311-011-4 本書は 3 部構成になっている。 I 部はデー タベースそのものや MySQL , mSQL に関す る概念・設計・インストールなどの基本部 分の解説である。データベースの基礎は , なかなか学ぶ機会が少ないように思う。本 書では , あまり深くは掘り下げていないも のの , データベース設計の具体例を出しな がら解説している。もちろん , データベー スに欠かせない SQL の基本にも触れている ので , きちんと読めばひととおりのことは 把握できるはずだ。 Ⅱ部は , データベースを利用したアプリ ケーションのアーキテクチャや , Perl/Pyt hon/PHP/C/C + + /Java (JDBC) などの言語 でのプログラミングに関する解説がある。 各言語用の API やドライバが比較的しつか りと提供されているので , 好みの言語を利 用できる。これも , 実用性から考えれば大 きな強みだろう。 Ⅲ部は , 各種リファレンスとなっている。 SQL から始まり , PerI や Python, C, そして JDBC の API リファレンスだ。なおⅢ部には , 監訳者によって Ruby の MySQL モジュール の章が追加されている。また , 日本語処理 に関する付録も追加されており , 国内の事 情を反映したより使いやすい書籍に仕上が っている。もっとも , できればもう少しポ リュームがあるとよかったのだが。 なお , MySQL は , 3.23.19- beta 以降のノヾ ージョンからライセンスが GNU GPL に変 更になっている。このため , Windows ユ ーザでも GNU GPL の範囲内で自由に MyS QL を利用できるので , 興味のある方は試 してみるといいだろう ( もちろん Windows に関してもソースが公開されている。我こ そはと思う方は MySQL の開発に協力して ほしい ) 。 データベースへの第一歩として データベースの有用性がさまざまな場所 で叫ばれてから , もうずいぶんと長い年月 が経つ。そんななかで , MySQL や mSQL ( そしておそらく PostgreSQL も ) のように 自由に利用できるデータベースの存在は , とてもいいことではないだろうか。技術を 習得するためにはもちろん , それを実際に それもかなり実用的に利用することができ るのは素晴らしいことだろう。データベー スは , もっと手軽に使えるようになってい い技術のはずだ。 本書は , その最初の一歩を始めることが できる重要な書籍だ。導入はもちろん , デ ータベースの基礎的な概念を学び , さらに はそれを実用的に生かしていくための技術 も学ぶことができるのだ。 データベースという技術を知るうえで , 本書はかなり良質な入門書といえるだろう。 ・お問い合わせ ( 株 ) オライリー・シャパン TEL 03-3356-5227 http://www.oreilly.co.jp/ ( 株 ) オーム社 TEL 03-3233-0641 ( 代 ) http://www.ohmsha.co.jp/ cmaga Bookends 1 53
C + + を , 機能拡張された C 言語と捉えて使 うのも , 1 つの方向性でしよう。 イベント駆動型フログラム 最近の OS のインタフェイスは , GUI が標 準になっています。このため , GUI 上で動 作するウインドウアプリケーションを作り たいと考える人も多いと思います。 ANSIC は標準入出力をサポートしている ので , CUI 上で動作するプログラムを作成 することができます。ですが , GUI をサポー トする標準的な入出力の設定はないため , GUI 上で動作し , ポインティングデバイス ( マウスなど ) で操作できるプログラムを ANSIC の範囲内で作成することはできませ ん。 このため本連載では , Windows, Maci ntosh, X(UNIX のウインドウシステム ) でウ インドウを開き , その上にボタンなどを配 置し , マウスで操作するといったウインド ウブログラムの作り方について , まったく 言及してきませんでした。 割り込み処理 現在の一般的なウインドウ , すなわち GUI のプログラムは , OS にかかわらず , 実は同 じような骨組みで成り立っています。これ らは , イベント駆動型と呼ばれるタイプの プログラムです。イベント駆動型とは , 割 り込み処理の集合体で構成されるプログラ ムです。この「割り込み処理」とは , コンピ ュータが「ある状態になったときに実行さ れる処理」のことで , コンピュータのハー ドウェアとデータのやり取りを行う部分で よく使われています。 たとえば , キーポードからの入力を取得 する場合を考えてみましよう。まず考えら れるのは , 作成するプログラムの中で , とあるごとに何が押されたかキーポードを 監視する ( この手法はポーリングと呼ばれ る ) という方法があります。これは簡単で よさそうに見えるのですが , プログラムが 66 C MAGAZINE 2001 3 コラム 2 前回の演習問題の答え ・ゲームの作成 行っていても , キーポードの入力は履歴に ば , プログラム本体が時間のかかる処理を るシステムにするのです ( Fig. 2 ) 。こうすれ 文字列を取得する」プログラムで構成され み処理と , 「その履歴を利用して押された 押されたときに履歴を残す」という割り込 これを回避するために , 「キーポードが てしまうのです。 グラム側の都合で押していないことになっ ません。つまり , 押したはずのキーがプロ っていないときは押されたキーを検出でき ほかの計算などを行っていて監視状態にな 夫してみてください。 抑えることができるでしよう。いろいろ工 アの違い , 動作環境の違いによる悪影響を イミングを合わせたりすれば , ハードウェ ぶしではなく time ( ) を使ってより正確にタ うのが理想です。ループ処理による時間つ ち時間の調節をプログラム側で自動的に行 に大きなバラつきが考えられる場合は , 待 プラットホーム (OS) であっても動作環境 しなければなりません。このように , 同じ ってくるので , ほどよく遊べるように調節 よってループが回り切るまでの時間が変わ ムは , 実行するコンピュータの処理速度に 調節を行っています。このようなプログラ この ansl . c は , ループ処理で待ち時間の るでしよう。 ームプログラムを作成するうえで参考にな を行ったりしています。これらの手法はゲ 変わったり , ループによる動作時間の調節 とで , 動作させるたびに出題される問題が ansl . c では , 乱数の種を時間から得るこ きのような側面も持っています。 でキーを押すことを要求される , もぐら叩 ピングソフトです。ランダムなタイミング 収録しました。この ansl . c は , 一種のタイ VcmagaVCVans> ティレクトリに ansl . c を す。解答の一例として , 付録 CD ー ROM のく 簡単なゲームを作ってみようという問題で まず , 改行によるスクロールを利用した ・ラベルジャンプ 次に , ラベルジャンプを効率よく行うた めの方法です。これはたとえば , ラベルの インテックスを作成する方法や , ラベルを キャッシュする方法などを考えることがで きます。 ラベルのインテックスの作成をする方法 とは , あらかじめラベル名とそのラベルに fseek ( ) で到達するためのファイル先頭から の距離情報をセットにして準備することで す。プログラム起動時にすべてのラベルに ついて調べて情報を 1 回作成しておけば , 実際のラベルジャンプはこのテータを元に 行うことができます。 ラベルをキャッシュする方法も , 基本的 な考え方はインテックスと同じです。こち らは最初にまとまったテータを作らずに ラベル検索実行中に見つけたラベルに関し てそのつど記録していきます。 こで , シ ナリオファイルのどの位置までラベル検索 を行ったかも記憶しておきます。こうして おけば , ラベルジャンプの際には , まず記 憶しておいたラベル情報を調べてそこにラ ベル情報があればそれを使ってジャンプし , なかったらラベル検索を記憶した位置より 後ろで実施していきます。 この手法はインデックスの作成より複雑 ですが , 必要なときに必要なだけ検索する ので , 起動時にまとまった時間を取られず に済みます。 残っているので取りこばす心配がなくなり ます。一般的なコンヒ。ュータシステムでは , この割り込み処理の対象としてキーポード やマウス , 通信ポートやタイマなどを設定 できるようになっています。逆にいえば , 人力が取りこぼされると困るようなデバイ スは , 割り込み処理を設定する必要がある のです。 コンピュータサイエンスで習うタイムシ ェアリングによる並列処理も , タイマによ る一定時間ごとの割り込みによって実現さ れています。この場合の「ある状態」とは ,
Ⅵ Joseph の叩き台 [ , 。 b k -8142 ] 小技に関するまとめ (ruby-taIk-8142. 「 b ) 2 小技はやつばり小技なのですが , うまく # ! /usr/local/bin/ruby # Takes a list 0 て words, finds all anagrams in it 用いれば効果的な場合も案外少なくないで def find-anagrams(words) anagrams = { } しよう。しかし漫然と使ったのでは生かさ words. each d0 0 て引 word. chomp! れません。やはり , プロファイルなどを経 key = word. downcase. し0ーS. split( 冖 ) . SO て t anagrams[key] Ⅱ = Array. new て時間のかかっているところを探し , その anagrams[key] . push(word) end うえで使うのがベストです。もっとも , anagrams. values. each d0 い s puts t. j0in( ″つ if t. length > 1 れまでにあげた小技は常用してもかまわな end end いと思います。その中でもオプジェクトを words = $stdin find—anagrams(words); 作りすぎないというのは , Ruby に限らず ガべージコレクションを備えたインタブリ タにとってはいつも通用するものです。 いうのが課題になりました。多くの人は単 ところで , もしこれらの技を駆使しても 語集として /usr/share/dict/words ファイル 実用には速度が足りず , しかし Ruby で問題 ms の値だけからなる配列 values の各要素の を用いたようです。 FreeBSD の heir によれ うち 2 個以上の単語を含むものだけを空白 を征服したい場合は , 拡張ライプラリを書 ば , このファイルは common words からな くという方法があります。これは数値実験 る辞書ということになっていて , 具体的に で join して puts するわけです。 のように C で書くことでオプジェクト生成 は 1 行に 1 単語が辞書順に書かれたテキス [ 注 1 ] を抑えられる問題にはとくに有効な方法で トファイルです。 Cruby-talk:8142] のこと。以下同様。 す。 Ruby は拡張ライプラリがきわめて書き お祭りの幕開け やすい言語の 1 つなので , 機会があれば取 Benchma 「 k 合戦開始 り上げたい話題です。 コンべの発端は Joseph McDonald[8142] か らの質問でした [ 注 1 ] 。 Ben Tilly が「 perlmon さて , これに対して筆者がちょうどこの ケーススタディ : 己事を書いていることを手短に述べ , それ ks に書いたアナグラム探しを Ruby で書き アナグラム探し 直したのだけど , もっと速くするアイデア を実践してみせました [ 8145 ] 。しかしその実 践があまりに不十分だったため ( 笑 ) , Davi はありますか ? 」というものです 世紀の変わり目に英語のメーリングリス d AIan BIack [ 8152 ] と Dave Thomas 81 砌から小 ト ruby-talk でちょっとおもしろいコンべが Josheph McDonald のコードは List 2 のと おりです。このプログラムは次のように使 技を徹底した改善案が出されました。アル ありました。それは 1 週間で 80 通のメール ゴリズムは変わっていません。ただし Dave が飛び交ったなかなかホットなスレッドで います。 てんまっ は最後の出力の部分で Hash#vaIues を keys す。よい機会なので , ここでその顛末を紹 ruby find_anagramO. rb く で置き換えた繰り返しにしました (List 3 ) 。 介しますね。 /usr/share/dict/words values はわりと大きな配列を 1 つ生成する find—anagrams のアルゴリズムは次のよ 課題はアナグラム探しを高速化しようと ので , このコストを抑えたわけです。また , うなものです。 EnumerabIe な単語集オプジ いうものです。アナグラムとは , 文の文字 each を for で置き換えています。 こまで を並べ変えて作られる別の文のことです。 ェクトを引数 w 。 rds として渡すと最初に ea で , 最初の叩き台から比べると 3.6 倍ほど いちばん簡単な場合は単語の中の文字を並 ch を使って各要素 word を小文字にそろえて , べ変えて別の単語に仕立てるもので , 今回 1 文字ごとに分解した配列を作り , その配 速くなりました。 扱われたのもこの問題です。たとえば「と 列をソートした結果である key を使って単 もさかりえ」のアナグラムには「さかもとえ 語を anagrams というハッシュに格納しま り」があります。しかし , 何が単語で何が す。この key は作り方からわかるようにア 次のプームは , いちばん時間がかかって 単語でないかは難しい問題ですから , 与え ナグラムごとに一意になっています。そし いそうな , 一意なキーを作り出すところで られた単語集からアナグラムを抜き出すと てすべての単語の登録が終ったら , anagra 組み込み機能を活用するためのメソッド置 Ⅵ David と Dave の改良 ( 「 uby-taIk-81 60. 「 b ) 3 def fa6(words, out = STDOUT) anagrams = { } keys word, key = nil fo て word in words do word. chomp! word. downcase ! key ま word. split( ' key. sort ! key = key. j0in if anagrams[key] anagrams[key] くく word keys[key] = 1 anagrams[key] = [ word ] end fO て key in keys. keys out. puts anagrams[keyl . j0in( ' end end 一三ロ 0 組み込み機能の利用 8 / 極めよ Ruby 道 伝授 !
http://www perl.com/CPAN/ です。 perl そのものを配布しているサイトで有 名なのが , ActiveState です。 こは , Activ eperl という名前で perl を配布しています。 URL は , http://www.activestate.com/Products/ の値は「← > 」の判断に使われる左辺の値と プログラムも簡単に書けるということで , ActivePerl/index. html してそのまま使われることになります。 問題まで簡単になってしまいました。ハッ です。 シュの使い方を理解していればやさしいは Perl の情報は , W Ⅵハで非常に多く公開 これは『 EffectivePerl 』という本のなかで , されているので , WWW を使える環境が必 シャチ泳ぎ (Orcish Maneuver) と呼ばれて ずです。メールアドレスをキーにしてソー トするという条件から , 須であるといってもよいと思います。 いる手法です。同書には , さらに効率のい $ { メールアドレス } = 電話番号 い例として , List 22 のようなコードも紹介 $ { メールアドレス } = 名前 [ 問 31 」 されています。 という組み合わせの 2 つのハッシュを用意 「インデントはスペース 2 個にする」 [ 問 29 」 しておき , どちらか片方を使って順番にメ 「モジュールが使えるものはできるだけ ールアドレスを取り出せば , あとは p ⅱ n ばを 使う」 使って表示するだけです。 「 use strict vars; を使う」 順にメールアドレスを取り出す処理は , f 「 my が使えるところは使う」 oreach の行で行っています foreach $email ( SO は keys (%nlist) ) { など , 何でも OK 。 keys は , 連想配列を指定して , そこに含 ・解説 ・解説 まれているすべてのキーを要素とした通常 C 言語編の問 25 と同じ処理をするプログ の配列を返す処理です。したがって , 解答例は , 模範解答ではありません。そ には %nlist または % tlist を指定しなければな れなりの内容なら何でもかまいませんが ラムを PerI で書いた例です。文字列の処理 自分なりにすぐに思い浮かべるようなこと に関しては , Perl がもっとも得意とする分 りません。選択肢にあるのは % n ⅱ st だけなの があるかどうかがポイントです。プログラ 野の 1 つで , この例はまさに「 Perl の力」とい で , これが正解となります。 ムを実際に何度も書いていれば , 何かある った感じを見せつけてくれます。本当に同 その配列の要素 1 つずつを foreach で処理 する前に , so れで辞書順にソートします。 s はずです。実際に書けなくても , 何か思い じ結果になるのかと疑問を感じてしまうほ 浮かべることができたら正解としてくださ ど簡単に短く書けるので , とくにやつつけ 0 れは , このようにソートのサプルーチンを とくに指定しなければ辞書順のソートを行 い。 1 分以内に思いつかなかった場合は , 1 仕事②には非常に適していると思います。 分経過ごとに 1 点減点とします。 C 言語によるプログラムと同じく , これ います。 もデータの正当性はとくに考えていないコ ードになっているので , その点は注意が必 要です。データは「 # 」で始まるか , 空行か , あるいはタブで区切られた 3 つの部分から CPAN なることを想定しています。それ以外のデ ・解説 ータがやってきた場合にはどうなるかわか 言語とはまったく関係ない問題ですが りませんが , それでも , それなりの結果に perl を使うのならこれくらいはいくら何で なると思われます。もしかすると , 1 行が むちゃくちや長いデータを与えると , PerI も知っているだろう , ということでサービ ス問題です。 U 糺は , が死んでしまうかもしれません。 List 22 } €files; 引土 = map ( $ ーー 70 ] } 日 0 { $a → [1] く = 》 $b->[ll ) map { t$- ④④④ ①④① 52 C MAGAZINE 2g1 3
こで使われる構造 こで注意が必要なのは , 関数 semget() hore ( ) をクリティカルセクションの則後 のようになっており , で呼ぶようにします。これまで述べてきた では , 各セマフォ値は初期化されないこと 体 sembuf は , 拡張方法をすべて施したのが List 4 です。 struct sembuf { です。関数 semctl() で SE れ一はたは SETA これを sem. c などと名前を付けて , コンパ 乢する必要があります。 Short sem num; イル / 実行してみましよう ( Fig. 4 ) 。各プロ セマフォの使用が終わった場合 , 必ずセ short sem_op; セスが前述のルールに則って排他的に標準 マフォ集合を削除する必要があります。 short sem_flg, 出力をアクセスしていることを確認できる れは関数 semctl() に IPC-RMID を指定して として定義されています。前述のセマフォ と思います。 行います。 の使用例のときでは , 構造体 sembuf を 1 つ 関数 ( システムコール ) クリティカルセクションを保護する しか宣言していませんでしたが , 関数 sem semop の謎 ? 叩 ( ) では複数個指定することが可能にな とりあえずこの拡張で , セマフォを使用 っています。関数 sem 叩 ( ) は , semid で指 SystemV IPC のセマフォを理解する場合 する準備ができました。次にセマフォを操 定されたセマフォ集合のメンバすべてに対 セマフォ集合を操作する関数 sem 叩 ( ) の ( 謎 作し , クリティカルセクションを保護する して , 構造体 sembuf で指定された操作を めいた ? ) 挙動を理解することがキーポイ 関数を用意します。 List3 の関数 sem 叩 hore 行います ( Fig. 5 ) 。このように関数 sem 叩 ( ) ントになります。 ( ) では , 引数に P が指定されたときにクリ は指定された ns 叩 s 個のセマフォ操作を行 まず関数 sem 叩 ( ) の宣言は , ティカルセクションに入る操作をし , 引数 います。 に V が指定されたときにクリティカルセク int semop 次に構造体のメンノヾ sem_op , sem_flg ションから抜ける操作をします。関数 sem int semid, の設定値の違いによるセマフォ操作の挙動 叩の詳しい動作は , 後ほど説明します。 struct sembuf * sops, について , C ライクな簡易言語を使って説 あとはお察しのとおり , この関数 sem 叩 unsigned nsops List sem ー op く 0 のときの挙動 Fig. 5 関数 semop ( ) の仕組み if( semval 〉 = abs(sem-op) ) { semval - = abs(sem-op); if ( sem-f & SEM-UNDO ) add-undo(sem—op); return SUCESS ー } else if( sem-f & IPC—NOWAIT ) { e てて no = EAGAIN; return FAILURE ー ) 引 se { semncnt 十十一 sleep 聞 t ( semval>=abs(sem—op) Ⅱ isSemRemoved Ⅱ catchSigna ー if ( semva l>=abs ( sem—op ) ) { semcnt— semval ー = abs(sem—op); if( sem—f 垣 & SEM—UNDO ) add—undo(sem—op); return SUCESS; } else if( issemRemoved ) { e てて no = EIDRM; return FAILURE; } else if( catchSignal ) { semncnt— errno = EINTR ・ return FA ILURE ー 配列 セマフォ操作 sem—op[O] sem—op[l ] sem_op[2] セマフォ集合 semvaI[O] semval[l ] semvaI[2] semop sem—op[NI semval[N] List sem ー op > O のときの挙動 semval 十 = sem—op; ( sem—flg & SEM—UNDO ) add-undo(sem-op); 1 1 4 C MAGAZINE 2001 3