MOSA Multi-OS Software Artists

MOSAはソフトウェア開発者を支援します

プログラマーに興味がある方なら誰でも入会いただけます。
MOSA Multi-OS Software Artists
===SINCE 1995===

  • iPhone/iPod touch アプリ紹介
  • MOSA掲示板
  • 活動履歴
  • About MOSA(English)

MOSADenバックナンバー 2007年3月発行分

  • MOSA Developer News[MOSADeN=モサ伝]第245号

    2007-03-27

    目次

    • 「Wonderful Server Life」       第43回  田畑 英和
    • 藤本裕之のプログラミング夜話   #111
    • 高橋真人の「プログラミング指南」  第109回

    Wonderful Server Life」  第43回  田畑 英和

      〜OpenDirectory DHCPクライアント編〜

     Mac OS X Server(およびMac OS X)のアップデートがリリースされました。今回リリースされたアップデートでバージョンがv10.4.9になりました。Tiger向けのアップデートがまだリリースされるかどうかは分りませんが、Leopardのリリースも控えていることから、最終アップデートとなるかもしれません。
     リリースされたアップデートですが、まずPowerPC版とUniversal版に分かれています。Mac OS XはPowerPC版とIntel版の2つに分かれており、アーキテクチャごとにアップデートも分かれていますが、Mac OS X Serverはv10.4.7から、PowerPCとIntelの両方に対応したUniversal版が存在します。
     前回のアップデート(v10.4.7)で、Universal版のアップデートは直前のバージョンからのアップデートだけでした。今回のアップデート(v10.4.8)からは、PowerPC版とUniversal版の両方で、直前のバージョンからのアップデートと、v10.4.0以降のどのバージョンからもアップデートできるComboアップデートがリリースされています。
     ここで注意が必要なことがあるのですが、たとえPowerPC搭載のMacを使用していたとしても、そこにUniversal版のMac OS X Serverをインストールしている場合、アップデートはPowerPC版ではなくUniversal版をインストールする必要があります。つまり、どのアーキテクチャのCPUを使用しているかではなく、どのOSをインストールしているかで、使用するアップデートが決まります。ソフトウェア・アップデートが利用できる環境では、適切なアップデートが自動的に選択されますので、ソフトウェア・アップデートを使ったアップデートが確実でしょう。
     今回のアップデートでは様々な修正が行われていますが、Xsan関連の修正なども含まれています。また、単体でもリリースされていた夏時間に関する変更が含まれていたり、セキュリティに関する修正も行われています。Panther向けにはセキュリティの修正のみのアップデートも公開されました。

    ・Mac OS X Server 10.4.9 Combo Update (PPC)
    http://www.apple.com/jp/ftp-info/reference/macosxserver1049comboupdateppc.html
    ・Mac OS X Server 10.4.9 Combo Update (Universal)
    http://www.apple.com/jp/ftp-info/reference/macosxserver1049comboupdateuniversal.html
    ・Mac OS X Server 10.4.9 Update (PPC)
    http://www.apple.com/jp/ftp-info/reference/macosxserver1049updateppc.html
    ・Mac OS X Server 10.4.9 Update (Universal)
    http://www.apple.com/jp/ftp-info/reference/macosxserver1049updateuniversal.html
    ・Security Update 2007-003 (10.3.9 Server)
    http://www.apple.com/jp/ftp-info/reference/securityupdate20070031039server.html
    ・Security Update 2007-003 (10.3.9 Client)
    http://www.apple.com/jp/ftp-info/reference/securityupdate20070031039client.html

    ◇LDAP設定

     今回は、クライアント側でのLDAPの設定について解説します。LDAPの基本的な設定方法については、第24回の連載ですでに解説済みですが、今回はDHCPを利用したLDAPの設定について解説したいと思います。
     第24回で解説した方法では「ディレクトリアクセス」を使ってLDAP(つまり
    OpenDirectory)のサーバのアドレスを手動で設定しました。この方法ですと、ディレクトリサービスを利用するすべてのクライアントで、同様の設定を繰り返す必要があります。ですが、前回解説しましたDHCPの機能を使えば、サーバ側だけでLDAPの設定を行い、クライアントの設定を自動化することができます。

    ・「ディレクトリアクセス」でのLDAPの設定
    http://homepage.mac.com/htabata/MXS10.3/img/DA/DA_06.png

     DHCPであらかじめLDAPのサーバアドレスを設定しておいた場合、クライアント側では手動で「ディレクトリアクセス」を設定することなく、自動的にLDAPの設定が行われます。つまり、LDAPサーバのアドレスを自動的に検出することができるわけです。
     この機能を使えばわざわざ、各クライアントコンピュータ上で手動で設定をする必要がなくなり、設定作業がかなり楽になります。ただし、DHCPを使ってLDAPの設定を行う場合注意が必要な点があります。

     DHCPでLDAPのサーバのアドレスを取得したとしても、ディレクトリサービスの機能をすべて利用できるわけではありません。LDAPサーバのアドレスを取得することにより、LDAPによるサーバへのアクセスはできるようになるのですが、認証を行うことができないのです。具体的には、ネットワークユーザの認証ができないことになります。
     DHCPでLDAPの設定をしつつ、ネットワークユーザの認証も有効にするには、クライアント側での追加の設定が必要になります。「ディレクトリアクセス」のLDAPの設定画面に「DHCPから割り当てられたLDAPサーバを自動検索ポリシーに追加する」というチェックボックスがありますが、このチェックを入れることでネットワークユーザの認証が可能になります。
     DHCPでLDAPのサーバのアドレスを提供している場合、「ディレクトリアクセス」のDHCPのチェックが入ってるかいないかにかかわらず、LDAPサーバのアドレスを自動検出することによってLDAPサーバへのアクセスはできるようになります。ですが、認証を行う場合には追加の設定が必要になるということです。
    認証が出来なくても、クライアントコンピュータからサーバ上のネットワークユーザのレコードにアクセスはできますが、レコードにアクセスできることと、認証ができるかどうかは個別の設定になりますので注意が必要です。
     DHCPの環境でディレクトリサービスを利用している場合、ネットワークユーザの認証に問題がある場合には「ディレクトリアクセス」の設定を確認してみてください。

    つづく                               

    藤本裕之のプログラミング夜話 #111

     承前。実現したいサービスはお決まりだろうか。オレはヒトにサービスされるのは好きだがするのは嫌いだ? まぁそういうご仁もいるかもしれぬがここはそういう場ではないので無視して進める。

     前回具体的に使ってみてもらったのでお分かりと思うがこのサービスという機能、確かにそのサービスを提供するのはこちらだが、受付窓口は外部委託である。つまりあの「サービスメニュー」というのはどう考えてもサービス・プロバイダーたるアプリケーションの一部ではない(だってアプリケーションが起動してなくても出てるもんね)。喩えて言えばあれはそのぉ、ぺーいち兄さんが出しているタウンページの広告みたいなもんであり、ある決まった約束事に従ってあそこに自分行きのメニューを載っけてもらうわけである。以下その約束事……。
     
     まず第一に、アプリケーションの「info.plist」の中に「NSService」というプロパティを作る。タイプは Dictionary の Array、Dictionary には以下のキーとそれに対応したデータを設定する。

     キー:NSMenuItem
     データ:Dictionary、サービスメニューに追加するメニューアイテム(後述)。
     キー:NSKeyEquivalent
     データ:Dictionary、短縮キーの指定(これも後述)。
     キー:NSMessage
     データ:String、このメニューが選ばれたときアプリケーションが受け取るメッセージ。
     キー:NSPortName
     データ:String、このリクエストを受けとるポート……普通はアプリケーションの名前。
     キー:NSSendTypes
     データ:Array、このサービスが受け取るペーストボードのタイプ。複数指定可。
     キー:NSReturnTypes
     データ:Array、このサービスが返すペーストボードのタイプ。複数指定可。
     キー:NSUserData
     データ:String、上のNSMessage のパラメータとして受け取れるオプションデータ。
     キー:NSTimeout
     データ:String、サービスのレスポンスを待つ時間、指定しないと30秒。

     上に「(後述)」と書いた部分を解説する。NSMenuItem、NSKeyEquivalentの内容であるDictionaryの中身はそれぞれ1つだけ。どちらも “default” というキーで、NSMenuItemの方はメニューの文字列を、NSKeyEquivalent の方は短縮キーに使う1文字(モディファイヤは Command + Shift に固定)を指定する。
     また、これらのローカライズには、言語環境ごとに「ServicesMenu.strings」というファイルを作る。中身はアプリケーション本体で使う「Localizable.strings」と同じ。

    “defaultで指定した文字列” = “ローカライズのために置き換える文字列”;

    という具合。短縮キーの1文字もローカライズできるわけだ。……あんまりお勧めはできないけどね。
     なお、「Finder」みたいに階層メニューを作りたい場合は、NSMenuItemの指定の際に下の階層との間を「/」で区切って書く。「Finder/Open」とかね。……やってみたことは無いけどたぶん三段階層はできない。できないよな?
     もちろんそのサービスが「プロセッサー型」(前回出てきた言葉、覚えてますか?)である場合には NSReturnTypes とかは指定しないでOK。

     さて、これでぺーいち兄さんはめでたくタウンページに広告を出すことができました。広告だけ出しておいて実際に注文が来てもサービスを提供できないと困るので、次回はそっちをやります。ほんぢゃまた。
                                (2007_03_23)

    高橋真人の「プログラミング指南」第109回

    プログラマのためのオブジェクト指向再入門(17)

    〜XcodeによるPowerPlant X入門(1)〜

     こんにちは、高橋真人です。
     いきなりテーマの変わって、もしかしたら驚いた方もいらっしゃるかもしれませんが、あくまでオブジェクト指向と非オブジェクト指向における実装の仕方の違いを説明する過程の一部です。
     オブジェクト指向を理解するという過程において、市販の入門書やWebなどの情報だけで理解できる人はいいのですが、私自身もそうだったように、具体的なコードを示されないと、さらには実際に自分自身でプログラムを動かしながら確認しないと今ひとつピンと来ないという人がいます。
     この「プログラミング指南」を書く上で私が読者層と想定しているのもそういう類いの人たちですから、ここは手っ取り早くPowerPlant X(以下PPx)を実際に動かしてもらう方が得策と考えたわけです。
     今回、実際に私が試してみたところ、予想以上に簡単にXcode上でPPxを動かすことができることが分かりました。
     特にお伝えしたいことは、PPxは言ってみればただのC++ソースの集合体でしかありませんから、PPxのインストールによってシステムを汚してしまうことは全くありませんし、試してみて必要ないと判断すれば、単にフォルダごと消去すればよいだけの話です。
     また、PPxはオリジナルPowerPlantから引き継いだ設計思想として「コンパクトで独立したクラス構造」を持っていますから、いわゆるPPxアプリでなくとも、PPxのクラスライブラリを部分的に利用することが可能です。まだ試していないので想像ですが、Cocoaアプリからですら利用できるのではないかと踏んでいます。
     何度もお話ししているように、PPxは実際に開発されていた期間が短かったため、備えている機能は余り豊富ではありません。ただ、最初からMach-O形式を対象にしていますし、最終リリース(つまり、オープンソース化されたもの)においてはCarbon用のNibファイルを利用する形になっています。
     ですから、Carbon APIを利用するためのクラスライブラリという見方でPPxを見てくださってもそれはそれで構わないわけです。
     とにかく、少しのディスクスペースと少しの時間がありさえすれば、現在Macの開発をしている方ならば誰でも気軽に試すことができますので、この連載を目にされているすべての方に試していただけたらと思っています。
     それでは、早速手順の解説を始めましょう。

    ☆以下の作業は、管理者権限を持つユーザーでログインした状態で行ってください。

     前提とする作業環境ですが、現時点での最新のもの(Mac OS X10.4.9、Xcode 2.4.1)とします。PPx自体はPantherに向けて開発がスタートしたので、Panther上でもできないことはないかもしれませんが、私が少し試した感じではちょっといくつか調整が必要な印象です。
     また、推奨環境としてIntel Macをお勧めします。PPxはC++のテンプレートをかなり積極的に使用しているため、CodeWarriorでの経験では、PowerMac G5などを使ってもビルドにはかなりの時間を要しました。対して、私の手元のMacBookで試したところ、「感動的に速く」(笑)ビルドできたので、IntelMacを推奨とします。

    ◆PowerPlant Xの入手
     まずは、PowerPlant Xを入手します。
     CodeWarrior Mac版の開発終了に伴い、オープンソースになりましたので、入手先はSourceForgeです。

     入手先には以下の二通りがありますが、後者の方がおすすめです。

    入手法1: dmgファイルのダウンロード

    SourceForgeのopen-powerplantのサイト
    http://sourceforge.net/projects/open-powerplant
    に行き、PowerPlant.dmgをダウンロードします。(リンクをいくつかたどる必要がある)
     dmgマウントの際に「システムを壊すかもしれない」とのメッセージが出る場合があります。単に、中からフォルダを一つ取り出す(コピーする)だけなので、問題ないと思いますが、責任は取れません。
     入手法2がどうしてもできない場合に限り、こちらを選んでください。

    入手法2: Subversionのレポジトリの取得
     入手先は、同じくSourceForgeのサイトです。Subversion(コマンド名はsvn)というのは、ソースコードのバージョン管理のためのシステム(cvsよりも新しい。もちろん高機能)で、現在のopen-powerplantの開発にもSubversionが使われていますので、ソースコードも最新のものを取得できます。
     お使いのMac OS XにSubversionがインストールされていない場合もありますので、以下の手順で行ってください。(ちなみに、既にSubversionをインストールしてある方はそれをお使いになっても構いませんが、Subversionのバージョンによって、以下のレポジトリの取得がうまく行かない例が報告されています。ご参考まで)

    ・Subversionの取得
    http://metissian.com/projects/macosx/subversion/
    から、
    1.3 stable UB
    http://metissian.com/downloads/macosx/subversion/subversion-client-1.3.1.dmg
    を落とし、インストールします。

    echo $PATH
    で、/usr/local/binがコマンドサーチパスに入っていることを確認します。この項が理解できない場合、これはMac OS Xに限らずUNIXの一般的な話ですので、Webなり書籍なりを調べてください。
    (このステップを省略したい場合、以下のコマンドsvnの前に/usr/local/bin/を付加すれば、とりあえず実行はできます)

    ・レポジトリからソースコードツリーを取得
     ターミナルを起動して、以下のコマンドを実行します。
    svn co https://open-powerplant.svn.sourceforge.net/svnroot/open-powerplant/trunk open-powerplant

     以下のようにサーバー認証関係のエラーなどが出て、対処法を聞いてきますので、

    MacBook:~ someone$ svn co https://open-powerplant.svn.sourceforge.net/svnroot/open-powerplant/trunk open-powerplant
    Error validating server certificate for 'https://open- powerplant.svn.sourceforge.net:443':
    - The certificate is not issued by a trusted authority. Use the
       fingerprint to validate the certificate manually!
    Certificate information:
    - Hostname: *.svn.sourceforge.net
    - Valid: from Oct 27 12:05:58 2006 GMT until Oct 28 13:05:58 2007 GMT
    - Issuer: Equifax Secure Certificate Authority, Equifax, US
    - Fingerprint: f2:6c:fe:bb:82:92:30:09:72:dd:1c:b3:e7:56:69:c7:7a:df:67:3e
    (R)eject, accept (t)emporarily or accept (p)ermanently?
    


    とりあえずtで答えてやればいいでしょう。

     あとは、いろんな出力が出て、ほぼ数分で終了します。(ネットワーク経由でデータを取ってくるので、当然ネットワークにマシンがつながっている必要があります)
     取得が成功すれば、ホームにopen-powerplantというフォルダができているはずです。この中のPowerPlantXというフォルダが今回必要なものです。

    ◆PowerPlant Xのインストール
     上記の手順で入手したPowerPlantXという名のフォルダを/Libraryにコピーします。(決して、/System/Libraryに入れないように)

    ◆MoreFilesXのインストール
     続いて、PowerPlant Xが利用するAppleのファイル処理用のサンプルコードを入手します。

    http://developer.apple.com/samplecode/MoreFilesX/index.html

     .zipファイルをダウンロードし、解凍されたフォルダを上記でコピーしたPowerPlantXフォルダの中にコピーしてください。

     以上で、インストール作業は完了です。
     先ほど取得したopen-powerplantフォルダの中には、解説のドキュメントも入っていますので、興味のある方は覗いてみてください。

    書籍紹介             Objective-C MacOS X プログラミング
     
    解説担当:高橋政明

    Objective-C MacOS X プログラミング
    荻原 剛志著
    ソフトバンククリエイティブ ISBN4-7973-3334-0 ¥4,410(税込)

     Objective-Cの日本語リファレンスとして貴重な一冊です。
     カテゴリ、プロトコル、スレッド処理、分散オブジェクトなどについての説明も詳しく載っています。残念ながらUI関係や描画等の解説は少ないためこれ一冊でCocoaのすべてをカバーするわけではありませんが、Cocoaでの開発になくてはならない資料のひとつです。C言語に関する基本的な知識のある読者を想定しているそうです。

     この本は2006年に、Mac OS X 10.4のドキュメントに基づいて新たな内容を盛り込み書き直したものだそうです。原本は2001年に(株)広文社から出ていました。2006年版には「アプリケーションの構造」と「キー値コーディング」の章が追加され、Appendix Bに「コーディングの指針」も追加されました。
    ※参考:Cocoaコーディングガイドライン(英文)
    http://developer.apple.com/documentation/Cocoa/Conceptual/CodingGuidelines/index.html

    webでは目次が参照できないようですので章だけ列挙します。
    01 オブジェクトに基づくソフトウェアの作成 02 Objective-Cのプログラム03 継承とクラス 04 オブジェクトの型と動的結合 05 メモリ管理とオーナーシップ06NSObjectクラスとランタイムシステム 07 Foundationフレームワークの重要なクラス 08 カテゴリ 09 抽象クラスとクラスクラスタ 10 プロトコル 11 オブジェクトのコピーと保存 12 デリゲートと通知 13 アプリケーションの構造 14 例題:簡易画像ビューア 15 例外とエラー16 スレッド 17 分散オブジェクト 18 キー値コーディング

    ▼出版社のweb (ソースコ−ドのダウンロードサービスあり)
    http://www.sbcr.jp/books/products/detail.asp?sku=4797333340

    ◇MOSAからのお知らせと編集後記は割愛します◇

       

     MOSA Developer News   略称[MOSADeN=モサ伝]
            配信停止 mailto:mosaden-ml@mosa.gr.jp
     記事内容に関するご意見 mailto:mosaden-toukou@mosa.gr.jp
          記事投稿受付 http://www.mosa.gr.jp/?page_id=850
    Apple、Mac OSは米国アップル社の登録商標です。またそのほかの各製品名等
    はそれぞれ各社の商標ならびに登録商標です。
    このメールの再配信、および掲載された記事の無断転載を禁じます。
    特定非営利活動法人MOSA  http://www.mosa.gr.jp/
    Copyright (C)2007 MOSA. All rights reserved.

  • MOSA Developer News[MOSADeN=モサ伝]第244号

    2007-03-20 

    目次

    • 「「Wonderful Server Life」    第42回   田畑 英和
    • 小池邦人の「Carbon API 徒然草」
    • SqueakではじめるSmalltalk入門  第81回   鷲見 正人

    「Wonderful Server Life」  第42回  田畑 英和

    〜DHCP編〜

     先週に引き続きMac OS X ServerのDHCPサービスについて解説します。サブネットの基本的な設定ができれば「サーバ管理」のツールバーから「サービスを開始」ボタンをクリックしてDHCPサービスを開始します。なお前回も説明しましたが、サブネットの一覧画面で「使用可能」にチェックを入れるのを忘れないように注意してください。

    ◇サービスの監視
     DHCPサービスを開始すれば、同一ネットワーク上のコンピュータに、ネットワーク設定を提供できるようになります。クライアント側からはどのサーバからDHCPによるネットワーク設定を受け取るかを選択することはできませんので、混乱のないように同一ネットワーク内でのDHCPサービスは1台のサーバだけで運用するようにしましょう。
     「サーバ管理」を使えば現在どのコンピュータに対してネットワーク設定を提供しているかが確認できます。DHCPサービスの「クライアント」画面を表示すると、DHCPでネットワーク設定を受け取っている各コンピュータについて、次の情報が一覧表示されます。

    ・コンピュータ名
    ・ハードウェア・アドレス
    ・クライアントID
    ・残りのリース時間

     ハードウェア・アドレスとはMACアドレスのことです。このアドレスにより、どのコンピュータに対してどのIPアドレスを提供しているかが分ります。ただし、MACアドレスではコンピュータを特定するのに手間がかかる場合もありますので、コンピュータの特定をやりやすくしたい場合にはクライアントIDを設定しておくと便利です。
     クライアントIDは、クライアントコンピュータ上の「システム環境設定」で設定します。「システム環境設定」の「ネットワーク」であらかじめ「DHCPクライアントID」を設定しておくと、クライアントで設定したクライアントIDが「サーバ管理」上に表示されます。

    ・「クライアント」
    http://homepage.mac.com/htabata/MXS10.3/img/DHCP/DHCP_ADMIN_06.png
    ・「システム環境設定」>「ネットワーク」
    http://homepage.mac.com/htabata/MXS10.3/img/DHCP/PREF_NETWORK_01.png

    ◇LDAP
     Mac OS X ServerのDHCPサービスでは、これまで説明してきたIPアドレスやDNSの設定に加え、LDAPの設定を行うこともできます。LDAPとはディレクトリサービスのためのプロトコルですが、Open Directoryを利用するにはクライアント側でLDAPの設定を手動で行う必要があります。
     ですが、DHCPサービスでLDAPの情報もあわせて提供すれば、クライアント側での設定を自動化することができます。Open Directoryのクライアント側の設定については次回以降詳しく説明したいと思います。
     DHCPでLDAPの設定を行うには最低限「サーバ名」と「検索ベース」を設定する必要があります。サーバ名はサーバのDNS上での名前を入力し、検索ベースはDNSの名前に基づいて設定します。検索ベースはOpen Directoryのマスターを設定するときに指定したものを使用します。「サーバ管理」でオープンディレクトリサービスの「設定」>「プロトコル」>「LDAPの設定」画面を表示すると、実際に使用されている「検索ベース」を確認できます。

     「ポート」はデフォルトのポート番号(389)を使うのであれば設定する必要はありません。LDAPの通信を暗号化するには「SSLを使ったLDAP」にチェックを入れます。もっとも実際にSSLを使用するには、サーバ側で「サーバ管理」を使って、LDAPのSSL設定を事前に行っておく必要があります。SSLを使った場合は、636ポートが使用されます。

    ・「設定」>「サブネット」>「LDAP」
    http://homepage.mac.com/htabata/MXS10.3/img/DHCP/DHCP_ADMIN_04.png

    ◇静的マップ
     DHCPでは、どのIPアドレスが割り当てられるかは割り当てられるまで分らないのが通常ですが、「静的マップ」の設定を行えば、DHCPを使って特定のコンピュータに固定のIPアドレスを割り当てることができます。
     静的マップの設定を行うには、「ハードウェア・アドレス(MACアドレス)」と「IPアドレス」のペアを設定します。このように設定しておけば、設定したハードウェア・アドレスをもつクライアントコンピュータのネットワークポートに、常に固定のIPアドレスを割り当てることができます。

    ・「設定」>「静的マップ」
    http://homepage.mac.com/htabata/MXS10.3/img/DHCP/DHCP_ADMIN_07.png

     というわけで、2回にわたってMac OS X ServerのDHCPサービスについて解説してきました。小規模なネットワークでDHCPサービスを利用するには、MacOS X Serverを使わなくても、例えばブロードバンドルータに備わっているDHCP機能を利用することなどが考えられますが、Mac OS X ServerのDHCPにはLDAPの設定ができるなどのユニークな面もあります。
     それでは次回ですが、今回も少し説明しましたクライアント側でのLDAPの設定について詳しく解説したいと思います。
    つづく
                                   

    小池邦人のCarbon API 徒然草(2007/03/16)

    〜 Carbonモダンアプリケーションへの道(その12) 〜

    前回紹介したHIThemeOrientation()は、Compositing指定されたウィンドウやコントロール(HIView)のテキスト描画を担当しています。今回は、HIThemeTextInfo構造体の内容をさらに詳しく調べ、このAPIを用いたテキスト描画にチャレンジしてみます。

    HIThemeTextInfo構造体は、3番目の引数としてHIThemeOrientation()に渡します。その内部には以下のような9つのメンバが定義されています。

    truct HIThemeTextInfo {
    
     UInt32                      version;               // ゼロを代入
     ThemeDrawState              state;                 // 描画状態
     ThemeFontID                 fontID;                // フォント種別ID
     HIThemeTextHorizontalFlush  horizontalFlushness;   // 左右表示位置
     HIThemeTextVerticalFlush    verticalFlushness;     // 上下表示位置
     HIThemeTextBoxOptions       options;               // 矩形枠オプション
     HIThemeTextTruncation       truncationPosition;    // 文字の切り捨て方法
     UInt32                      truncationMaxLines;    // 最大表示行数
     Boolean                     truncationHappened;    // 切り捨てられたかどうか
    };
    


    今のところversionにはゼロを代入するよう指示されています。次のThemeDrawStateですが、Appearance.hを調べてみると以下のような定数が定義されています。

    num {
     kThemeStateInactive           = 0,
     kThemeStateActive             = 1,
     kThemeStatePressed            = 2,  // ハイライト表示のこと
     kThemeStateRollover           = 6,
     kThemeStateUnavailable        = 7,
     kThemeStateUnavailableInactive = 8
    };
    
    enum {
     kThemeStateDisabled           = 0   // Inactiveと同じ(別の呼び方)
    };
    
    enum {
     kThemeStatePressedUp          = 2,  // カウンターボタン用(上向き)
     kThemeStatePressedDown        = 3   // カウンターボタン用(下向き)
    };
    
    typedef UInt32        ThemeDrawState;
    
    


    これだけを見ると、コントロールの各状態に準じて(例えばInactiveなら薄く)テキストを描画をしてくれそうな感じなのですが、実際にはstateにどの定数を代入しても描画状態に変化はありません。現状では機能が実装されていないのか? 指定するフォント種類によって違うのか? それとも継承して間接的に使うパラメータなのか? その理由は不明なのですが、とりあえずはkThemeStateActiveを代入しておけば問題なさそうです。3番目のThemeFontIDは、同じくAppearance.hにおいて以下の様に定義されています。

    enum {
    
     kThemeSystemFont              = 0,
     kThemeSmallSystemFont         = 1,
     kThemeSmallEmphasizedSystemFont = 2,
     kThemeViewsFont               = 3,
     kThemeEmphasizedSystemFont    = 4,
     kThemeApplicationFont         = 5,
     kThemeLabelFont               = 6,
     kThemeMenuTitleFont           = 100,
     kThemeMenuItemFont            = 101,
     kThemeMenuItemMarkFont        = 102,
     kThemeMenuItemCmdKeyFont      = 103,
     kThemeWindowTitleFont         = 104,
     kThemePushButtonFont          = 105,
     kThemeUtilityWindowTitleFont  = 106,
     kThemeAlertHeaderFont         = 107,
     kThemeSystemFontDetail        = 7,
     kThemeSystemFontDetailEmphasized = 8,
     kThemeCurrentPortFont         = 200,
     kThemeToolbarFont             = 108,
     kThemeMiniSystemFont          = 109
    };
    
    typedef UInt16        ThemeFontID;
    


    かなり種類が多いので、個々の定数がどういう意味を持つのかを説明することは省略します。それぞれの違いを理解するには、ヘッダファイルに記載されているコメントを参照するのが近道です。例えば、kThemeSmallSystemFontは、Smallサイズのコントロールのテキストを描画する時に用いられるフォントで、kThemeMiniSystemFontだと、Mac OS X 10.3から採用されたMiniサイズのコントロールのテキストを描画する時に用いられるフォントを指示します。

    注意すべき点は、ThemeFontIDはダイレクトにフォントの種類を設定するパラメータではないと言うことです。例えば、fontID=-28671のように「ヒラギノ明朝 W3」のフォント番号をダイレクトに代入しても正しくテキストは描画はされません(何も表示されない)。描画用フォントに「ヒラギノ明朝 W3」の
    「24ポイント」を使いたい場合には、fontIDにはkThemeCurrentPortFontを代入しておき、描画対象となるCGrafPort(port)に対し、以下のような指定をすればOKです。

    SetPortTextFont( port,-28671 );  // ヒラギノ明朝 W3
    SetPortTextSize( port,24 );      // 24ポイント
    


    このThemeFontIDですが、「Interface Builder」を使うと、ウィンドウに配置
    したコントロールに対して個別に設定することが可能です。対象となるコントロールのInspectorウィンドウを開き、上部のポップアップメニューで「Control」を選択します。すると、真ん中あたりに「Font Style」というポップアップメニューが表示されますので、そのメニュー項目を見ると、先ほど紹介したThemeFontIDの種類がすべて並んでいることが分かります。

    HIThemeTextHorizontalFlushは、テキストを矩形枠の左右か中心のどちらに揃えて描画するのかを決定します。同様に、HIThemeTextVerticalFlushの方は、テキストを矩形枠の上下か中心のどちらに揃えて描画するのかを決定します。

    enum {
    
     kHIThemeTextHorizontalFlushLeft = 0,     // 左揃え
     kHIThemeTextHorizontalFlushCenter = 1,   // 中心揃え
     kHIThemeTextHorizontalFlushRight = 2     // 右揃え
    };
    
    typedef UInt32         HIThemeTextHorizontalFlush;
    
    enum {
    
     kHIThemeTextVerticalFlushTop  = 0,     // 上揃え
     kHIThemeTextVerticalFlushCenter = 1,   // 中心揃え
     kHIThemeTextVerticalFlushBottom = 2    // 下揃え
    };
    
    typedef UInt32         HIThemeTextVerticalFlush;
    


    次のHIThemeTextBoxOptionsは、現状では一種類のみ定義されていますが、このオプションを設定しても描画状態に変化は起こりません? こちらも機能未実装なのでしょうか? ThemeDrawState同様に謎のパラメータです(どなたか効果を御教授ください)。

    enum {
     kHIThemeTextBoxOptionNone     = 0,
     kHIThemeTextBoxOptionStronglyVertical = (1 << 1)
    };
    


    HIThemeTextTruncationは、テキストが矩形内に表示しきれなかった場合の処理を指示します。Finderのファイル名表示でファイル名が長すぎると、途中に省略していることを示す「...」が表示されますが、その印を付けるかどうかの指定ができます。この時、次のtruncationMaxLinesにより表示するテキスト最大行数を指定しておく必要があります。またテキストの切り捨て(全部表示できなかった)が発生した時には、truncationHappenedにtrueが返りますので、何らかの対策を実行するかどうかの判断が可能となります。

    enum {
    
     kHIThemeTextTruncationNone    = 0, // 「...」を付けない
     kHIThemeTextTruncationMiddle  = 1, // 「...」を真ん中に付ける
     kHIThemeTextTruncationEnd     = 2  // 「...」を最後に付ける
    };
    
    typedef UInt32          HIThemeTextTruncation;
    


    上記の定数は、Appearance.hではなくHITheme.hの方に定義されていますので注意してください。HIThemeOrientation()に対してHIThemeTextInfo構造体の内容を全て設定して渡していると煩雑ですので、簡易的にテキストを1行だけ表示するルーチンの例を上げてみます。このルーチンでは、引数で渡すHIThemeTextInfo構造体のパラメータは、フォントIDと左右の描画位置の2種類のみとなっています。

    void drawCFString( CFStringRef cfstr,CGRect *crt,CGContextRef ctx,
                                ThemeFontID id,HIThemeTextHorizontalFlush pos )
    {
       HIThemeTextInfo    info;
    
       info.version=0;
       info.state=kThemeStateActive;           // 描画状態(固定)
       info.fontID=id;                         // フォントID(可変)
       info.horizontalFlushness=pos;           // 左右描画位置(可変)
       info.verticalFlushness=kHIThemeTextVerticalFlushCenter;
                                               // 上下描画位置は中心固定
       info.options=kHIThemeTextBoxOptionNone; // オプションは無し
       info.truncationPosition=kHIThemeTextTruncationEnd;
                                               // 「...」は最後に付ける
       info.truncationMaxLines=1;              // 1行のみの表示
       info.truncationHappened=0;              // 切り捨てが起こると1が返る
    
       HIThemeDrawTextBox( cfstr,crt,&info,ctx,kHIThemeOrientationInverted );
    }
    


    次回は、HIThemeOrientation()によるテキスト描画を印刷(プリントアウト)に利用てみたいと思います。印刷といっても、ウィンドウ上のテキスト描画とそれほど違いはないのですが、幾つか注意すべきポイントを解説したいと思います。
    つづく                                

    SqueakではじめるSmalltalk入門   第81回  鷲見 正人

    本連載では、Macと切っても切れない関係にあるSmalltalkについて、最近話題のSqueakシステムを使って紹介しています。前回はSqueakの最新版である3.9をインストールして、日本語を扱えるようにするセッティング方法を解説しました。これにからめて(連載のタイトルからはちょっと離れてしまいますが…)Squeak以外にもOS Xで使うことのできるSmalltalk処理系について触れてみたいと思います。

    ▼VisualWorks(Cincom Smalltalk)について

    Squeakは、Apple Smalltalkから派生させるかたちで、'90年代半ば、当時Appleフェローだったアラン・ケイらによって開発されました。ところで、このときもととなったApple Smalltalkは、'80年代初頭、XEROXから段階を経て供給される機能限定版の仮想イメージをLisaやMacできちんと動作させられるように、Appleの技術者(と申しましても、そこには、ラリー・テスラーらPARCからの移籍組=元Smalltalk開発者らが含まれていたわけですが…)が、専用の仮想マシンをしつらえるかたちで作られたものです。Smalltalkシステムというのは、仮想マシンよりは、仮想イメージの内容により強くその「特徴づけ」がなされるものなので、Apple Smalltalkはサブセットながらも純正Smalltalkシステムに近いものだと考えることできます(もちろん、後に、この仮想イメージにはApple独自の改良も加えられます)。

    このような、Appleを含む当時の主要ハードウエアメーカーに対するSmalltalk移植を促す働きかけとは別にXEROXは、ParcPlace Systemsという専門の子会社を立ち上げ、そこを通じて独自開発した製品版のSmalltalk-80処理系の開発・販売もしています。各種OS向けのものが用意され、Mac版ももちろんありました。ただとても高価だったため、APDAから安価に提供されていたAppleSmalltalkに比べると、こちらのParcPlace版Smalltalkを実際に動かしたり触った経験がある人は読者の皆様の中にもごくわずかでしょう。このParcPlace版Smalltalkが、FileMakerばりにいくつかの会社を経て現在に至ったのが「VisualWorks」です。Cincomという会社が開発・販売しているので、
    Cincom Smalltalkとも呼ばれます。

    http://smalltalk.cincom.jp/scripts/smalltalk.dll/index.ssp

    XEROX Smalltalk-80の仮想イメージ(さらに遡れば、ALTOを暫定的ダイナブックとして動作させていたGUI OSの実体)を受け継いだ「血筋」からすると、VisualWorksが“本家”、Squeakは“分家”といったかんじになりましょうか。いずれも名前から「Smalltalk」の文字が抜け落ちてしまったため、Smalltalkは滅びたものだと思いこんでおられる方が多いことが残念です。

    ▼VisualWorksの入手とインストール

    ソフトウエア製品としての「VisualWorks」は、今もあいかわらず高価なのですが、非商用にかぎって無償での入手や使用が認められています。オンラインでのお定まりのユーザー登録作業が必要ですが、いったんそれを済ませてしまえば、ネットインストーラを介して、あるいは必要なファイルがすべて収められたCD-ROMイメージを入手することで、お手元のMacにVisualWorksをインストールすることが可能です。

    http://smalltalk.cincom.jp/scripts/smalltalk.dll/visualworks/download.ssp

    また、ぽっと出のSqueak(長らくApple社内でApple Smalltalkとしてうち捨てられていたのちにSqueakとして再生された…)と違って、25年余にわたってプロのツールとして鍛え抜かれてきたVisualWorks向けには、良質なSmalltalk関連ドキュメントが充実しています。ただ長い歴史を持つものの常で、そうしたドキュメントの多く(特に'90年代のもの…)は古いバージョンのVisualWorks向けに書かれていることもあり、現行の7.xは内容の読み替えが難しいときがあります。そんなときは、3.xなどの古めのバージョンVisualWorksを使ったほうがよいでしょう。

    こうした以前のバージョンを含む、VisualWorksのインストール手順については、「じゅん」というマルチメディアライブラリの解説サイトが詳しいです。

    http://www.sra.co.jp/people/h-asaoka/study/VisualWorksInstall/index.html

    「じゅん」は、VisualWorksおよびJava(!?)向けに提供されており(残念ながらSqueak向けにはまだない…)、我々Macユーザーが身近なところではQuickTimeムービーの再生やその制御など、様々なマルチメディア情報をSmalltalkコード(じゅん for Javaの場合は、もちろんJavaの…)を介して行なうことを可能とするAPIを提供してくれます。

    http://www.srainc.com/Jun/Main.htm

    「じゅん」の主要開発者である青木淳氏は自他共に認めるスーパープログラマで、「じゅん」をはじめとするSmalltalkシステム向けソフトウエアはもちろん、多くのSmalltalk関連書籍や開発者向け雑誌の連載を著しておられることでも有名です。特に定番と名高い「Smalltalkイディオム」と「オブジェクト指向システム分析設計入門」については、在、Webで全文を読むことが可能ですので興味のあるかたにはご一読をお薦めします。

    http://www.sra.co.jp/people/aoki/
    http://www.sra.co.jp/people/aoki/SmalltalkIdioms/index.htm
    http://www.sra.co.jp/people/aoki/IntroductionToOOAOOD/index.htm

    ▼VisualWorksの操作と終了

    アラン・ケイが手を引いたあと、夢を追う「暫定ダイナブック環境」としてではなく堅実な「統合化開発環境」としての進化の道を辿ることになったSmalltalkの象徴的な存在であるVisualWorksは、古典的なSmalltalkやSqueakに見られる暫定ダイナブック然とした部分(その象徴は、独立したデスクトップと独自のGUIルック&フィールに現われている…)が排除されいて、ホストOSのアプリケーションソフト然として見せるような工夫がなされています。たとえば現行のVisualWorksは、OS Xで動かした場合、Aquaっぽい見た目で使うことが可能です。

    [fig.A]VisualWorks起動時の画面

    前述の通りSqueakでお馴染みの特徴的なデスクトップもデスクトップメニューもないので、各種開発用ツール類の起動はトランスクリプトウインドウ(「VisualWorks NonCommercial visualnc」とタイトルがついたウインドウ)に設けられたツールボタン、あるいは、トランスクリプトウインドウ内のメニューを介して行なうことになります。たとえば、クラスブラウザを起動したければ、気球(Smalltalkの象徴的存在)の下にメガネをあしらったアイコンをクリックします。ワークスペースなら右端のメモ帳のアイコンです。

    クラスブラウザはSqueakに比べて見栄えもよく便利で高機能になっていますが(同時に、ブラウズする対称であるクラス階層も名前空間など新しい言語仕様の導入により若干複雑化しています…)、基本は、Squeakと一緒です。Squeakで慣れていれば、簡単なチュートリアルを経ることで、自在に使いこなすことができるようになると思います。いずれにせよ、オブジェクト(たとえばこの場合「クラス」)に対してどんなメッセージを送って情報を引き出そうとしているのかを念頭に置く習慣さえ身に付けていれば、GUIのルック&フィールの違いなどは些細なことに思えてくるはずです(笑)。

    ワークスペースを含め、文字の入力できる場所なら原則としてどこでもSmalltalk式を評価できるのもSqueakと一緒です。たとえば、この連載でお馴染みの「Do it」や「Print it」などは(式を入力して選択後…)右クリックメニューからメニュー項目として選ぶか、Ctrl-D、もしくはCtr-Pとタイプして使うことができます。たとえばクラスブラウザは、前述のGUI操作でなくとも次の式の「Do it」で起動できます。

    Refactory.Browser.RefactoringBrowser open

    [fig.B]VisualWorksでの「Do it」

    終了時に仮想イメージを保存(トランスクリプトウインドウのFileメニューから、Exit VisualWorks...→Yes)すれば、次回から同じ状態で作業を再開できる点も、やはりSqueakと同様です。

    バックナンバー:
    http://squab.no-ip.com:8080/mosaren/

     

    ◇MOSAからのお知らせと編集後記は割愛します◇

     

    MOSA Developer News   略称[MOSADeN=モサ伝]
            配信停止 mailto:mosaden-ml@mosa.gr.jp
     記事内容に関するご意見 mailto:mosaden-toukou@mosa.gr.jp
          記事投稿受付 http://www.mosa.gr.jp/?page_id=850
    Apple、Mac OSは米国アップル社の登録商標です。またそのほかの各製品名等はそれぞれ各社の商標ならびに登録商標です。このメールの再配信、および掲載された記事の無断転載を禁じます。
    特定非営利活動法人MOSA  http://www.mosa.gr.jp/
    Copyright (C)2007 MOSA. All rights reserved.

  • MOSA Developer News[MOSADeN=モサ伝]第243号

    2007-03-13

    目次

    • 「Wonderful Server Life」       第41回  田畑 英和
    • 藤本裕之のプログラミング夜話   #110
    • 高橋真人の「プログラミング指南」  第108回

    「Wonderful Server Life」  第41回  田畑 英和

      〜DHCP編〜

     まずは前回の記事の補足から始めます。前回の記事で4Gbに対応した新しいFiber Channelのカードを紹介しました。新しいカードには2ポートと4ポートの2つのモデルがあります。カードに付属しているケーブルの本数について前回の記事では「ポート数にかかわらず新しいカードには2本ずつケーブルが付属しています。」と紹介しましたが、4ポートモデルにはケーブルが4本付属していることが分りました。
     ちなみにXserveですが、CTOを行えば2つある拡張スロットにそれぞれFiberChannelのカードを選択することが可能です。ただしCTOでは両方のスロットに4ポートのカードを選択することはできず、4ポートのカードが選択できるのは片方のスロットのみになっています。2ポートのカードであれば、両方のスロットで選択することが可能です。

    ◇DHCP
     さて、今回からMac OS X ServerのDHCPについて解説したいと思います。まずDHCPの役割ですが、DHCPを使えばコンピュータのネットワーク設定を自動化することができます。TCP/IPの通信を行うにはIPアドレスなどのパラメータを設定する必要がありますが、DHCPを利用することにより各コンピュータごとにネットワーク設定を手動で行う必要がなくなり、コンピュータをネットワークに接続すればDHCPによりネットワーク設定が自動的に行われるようになります。
     具体的にどのような設定が自動的に行われるかですが、基本的なパラメータとして以下の項目がDHCPにより提供されます。

    ・DHCPにより自動設定されるネットワーク設定の項目
      - IPアドレス
      - サブネットマスク
      - ルーター
      - デフォルトドメイン
      - ネームサーバ  
    ※これ以外にもDHCPで提供可能な項目があります。

     これらのパラメータはクライアントコンピュータ側の「システム環境設定」の「ネットワーク」で手動で設定できる項目ですが、DHCPを使えば自動的に設定が行われます。もっとも、クライアント側ではあらかじめDHCPを使用するように設定しておく必要がありますが、特に設定を変えなければ、Mac OS XはデフォルトでDHCPを参照するようになっています。

    ◇DHCPの設定
     Mac OS X ServerでのDHCPの設定方法ですが、他のサービスと同様に「サーバ管理」を使用します。「サーバ管理」でDHCPの設定画面を表示しますと、まずサブネットの一覧画面が表示されます。初期状態ではなにも登録されていませんが、DHCPは設定を複数登録することができ、各設定はサブネットと呼ばれています。設定画面ではまずサブネットのリストを管理することができます。
     登録したサブネットを実際に有効にするにはサブネットの一覧画面で「使用可能チェックボックスをチェックしておく必要があります。

    ・「設定」>「サブネット」
    http://homepage.mac.com/htabata/MXS10.3/img/DHCP/DHCP_ADMIN_01.png

    ◇「一般」設定
     新規にDHCPを設定する場合は、「サブネット」設定画面左下の「+」ボタンをクリックしてサブネットを追加します。サブネットを追加すると、サブネットの詳細画面が表示され、ここで様々なパラメータを登録していきます。サブネットの詳細画面はさらに「一般」「DNS」「LDAP」「WINS」の4つの画面から構成されています。
     「一般」画面から設定を始めることになりますが、ここではまず任意の「サブネット名」を入力します。そして、クライアントに配布する「IPアドレス」「サブネットマスク」「ルータ」などのパラメータを設定します。「IPアドレス」ですが、一般的にDHCPサーバは複数のクライアントにネットワーク情報を提供しますので、各コンピュータにIPアドレスが行き渡るように、十分な数のIPアドレスの範囲を指定します。もちろんここで指定するIPアドレスの範囲は他のところでは使用されていないアドレスを指定する必要があります。
     またDHCPのサブネットを複数設定する場合には、それぞれのサブネットで使用するIPアドレスの範囲が重複しないように注意してください。

     「一般」の設定画面では他にも「ネットワークインターフェイス」の設定ができます。複数のポートをもったサーバを使用している場合、どのポートからDHCPを提供するかを指定することができます。利用可能なポートは、自動的にポップアップメニューに表示されますのであとは適切なものを選択するだけです。
     あと「リース期間」という設定がありますが、DHCPではクライアントにネットワーク情報を一時的に貸し出します(つまりリース)。この貸出し期間をどの程度の長さにするのかという設定が「リース期間」です。実際にはリース期間が過ぎても引き続き使用中であればリースの延長がおこなわれますので、突然ネットワークが使えなくなるといったことはありません。

    ・「設定」>「一般」
    http://homepage.mac.com/htabata/MXS10.3/img/DHCP/DHCP_ADMIN_02.png

    ◇「DNS」設定
     「DNS」の設定画面では、クライアントコンピュータに設定するデフォルトの「ドメイン」および「ネームサーバ」の設定を行います。ネームサーバは複数設定することもできます。

    ・「設定」>「DNS」
    http://homepage.mac.com/htabata/MXS10.3/img/DHCP/DHCP_ADMIN_03.png

     それでは次回も引き続きDHCPについて解説いたします。

    つづく                               

    藤本裕之のプログラミング夜話 #110

     前回の件,NSTableView に対し,NSArraryController のバインディングを使ってデータを表示している場合,その個々の要素のドラッグ&ドロップはどう実現すればいいのか,という問題について未だメールは来ていない。これ,忘れたわけぢゃなくてオレも日々考えてるし(ちょっと誇張あり),見つかったらこの連載ででも他の方法ででもお知らせする所存であるので,皆さんも思いついたら意地悪しないで教えてくだされ。

     で,今回から新シリーズ。「サービス」をサポートしようという話。
     もしかすると知らない人もいるかもしれないが,Mac OS Xで稼働するアプリケーションのうち,ユーザインタフェースを備えたプログラムのアプリケーション・メニュー(普通アップルメニューとファイルメニューの間にある,そのアプリケーションの名前がタイトルになってるメニューのことね)の中に「サービス」という項目がある。
     ……開いてみた? あるでしょ? 例えばこの原稿のこのパラグラフを選択状態にして「スティッキーメモを作成」を選ぶと……ほら,スティッキーズが起動して選択された文字列を内容とする新しいメモができたでしょ? 「サービス」とは,こんな風に稼働中の他のアプリケーションから文字列などのパラメータを受け取ってなんらかの処理を実現するしくみなんである。
     もちろんサポートする処理はアプリケーションによって違う。スティッキーズは文字列を受け取って新しいメモを作るけど,Mail.app は選択範囲を送付先のメールアドレス,または内容として新規メールを作ってくれる。Apple 標準ぢゃないけど Jedit X のサービス機能は強力で,スティッキーズ同様新規書類を作ってくれるほか,選択部分の全角・半角文字を統一したり,選択部分から改行コードを抜いてくれたり,逆に強制改行でケタ揃えしてくれたりして,しかもそれをペーストボードに返してくれちゃう……。あなたのアプリケーションではどんなサービスが提供できるだろうか?

     具体的なインプリメント作業に入る前に,これがどんなしかけで動いているかを確認しよう。Jedit X がサービス結果の文字列をペーストボードに返してくれることでも判るように,基本的にはペーストボードを介してデータを受け渡すアプリケーション間通信である。
     まずサービスを要求する側のアプリケーション(サービス・リクエスターという)上でユーザがサービスメニューからなにかのサービスを選ぶ。するとリクエスターに対して「copy:」メッセージが送付され,選択部分がペーストボードに入る。選択部分がないときはどうなるって? 百聞は一見に如かず,やってごらんなさい。……やってみた? ごらんの通り,なにも選択されていないときはサービスメニュー自体が選択できない。
     次にサービスする側のアプリケーション(サービス・プロバイダーという。
    オレが乗る東急バスの運転手さんと同じだ)が,起動していなければ起動され,サービスしなさいというリクエストが渡る。
     プロバイダーはこれを受けてペーストボードから元データを読み,処理を行う。例えばさっきスティッキーズにやらせた新しいメモの作成みたいに,リクエスター側に返事をする必要がない場合はそれでおしまい。Jedit X みたいなケースだと,処理の結果をペーストボードに戻し,リクエスターに「お待ちどおさま,ご主人様」と,メッセージを送る。「ご注文のほう,これでよろしかったでしょうか」とは言わない。これ,日本語変だからね(そういう問題ぢゃないが)。
     で,細かい話をすると,スティッキーズのような返事の要らないサービスが「プロセッサー型」,Jedit X のような……って,Jedit X には「プロセッサー型」のサービスもあるんだけどね,処理の結果をペーストボード経由で戻すタイプを「プロバイダー型」のサービスということになっている。

     では次回から具体的に「サービス」のインプリメント方法を解説していくので,皆さんは自分のアプリケーションでどんなサービスを実現してやろうか,とあれこれ構想を練ったりしていていただきたい。ほんぢゃ。
                                (2007_03_07)

    高橋真人の「プログラミング指南」第108回

    プログラマのためのオブジェクト指向再入門(16)

    〜GUIアプリの基本構造(2)・イベントループ(続き)〜

     こんにちは、高橋真人です。早速続けます。
     イベントループという場合、当然ループが必要になるわけですが、単に空回りをしていればよいわけではもちろんありません。“イベント”ループというからには、イベントに対処するための仕組みが必要です。
     ちなみにイベントというのは、ユーザーがキーボードをタイプしたり、マウスをクリックしたり、それまで表示されていなかったウインドウが表に出てきたためにウインドウの中身を描画しなければならなくなった時などに、主に外部からアプリケーションに対して送られてくる処理要求をするための仕組みの一つです。
     「主に外部から」と書いたのは、アプリケーションが自分自身に対してイベントを送ることもできるからです。また、「仕組みの一つ」と書いたのは、イベント以外にもアプリケーションに対して処理要求をする仕組みはいくつかあるからなのですが、余りその辺を厳密にやると話が複雑になるのでアバウトにとらえておいてください。
     さてこの断続的かつ不定期に送られてくるイベントですが、原則としてこれらは「やってきた順に処理する」ことになっています。「順番に処理する」と言えば、ここは「キュー」の出番ですね。システムは、イベントキューというイベント専用の待ち行列の格納エリアを持っていて、イベントをやってきた順に並ばせます。
     Mac OS 9時代のToolboxでは、このイベントキューからデータを取り出すためにWaitNextEvent()というAPIを使っていました。これをループの中で一回以上呼び出すことで、イベントキューの先頭から順にイベントを取り出し、それを順に処理していたというわけです。
     このように、プログラムが自らイベントを取り出すということは、「どんなイベントがやってきているのか」をいちいち把握するためにはいいのかもしれませんが、そんなのが役に立つのはデバッグの時ぐらいのもので、むしろ自分に関係のないイベントに対してまでいちいち対処してやらなければならないのは、結構な手間でしたし、イベントの処理の扱いになれないと、このイベントループを止めてしまう(つまり、一つのイベントの処理にずっとかかりっきりになっている)ことで、プログラム全体の流れを止めてしまうことになったのです。
     それでも、Mac OS Xのようなプリエンティブなマルチタスクのシステムならば、その影響はあくまでプログラムの内部だけの話で済むことが多いわけですが、OS 9のシステムでは一つのイベントの処理を誤ったことで、マシン全体の動きを止めてしまうことにも容易になり得たため、それなりに深刻な問題でした。
     Carbonと共に登場してきたイベント方式である、その名もCarbonイベントモデルの場合は、イベントの処理は基本的にはシステムにお任せで行います。つまり、イベンキューからのイベントの取り出しをプログラムが行うことはいたしません。
     だとすると、どうやってプログラムはイベントを受けることができるかというと、ハンドラという仕組みを使うのです。イベントハンドラというものをインストールすると、システムの側から必要に応じて呼び出してくれる仕組みになっています。ハンドラは好きなだけいくつでも登録できますし、ハンドラごとに「どんなイベントが起こった時に呼び出してほしいか」という指定を一つ以上行うことができるようになっていますから、かなりきめ細かな制御をすることも可能です。
     ちなみに、イベントというものにどんな種類があるのかということについては、以下のヘッダファイル(かなり長いので折り返しています)を見てみるとよいでしょう。かなり多くのイベントが定義されているのを知って驚かれる方も多いと思います。

    /System/Library/Frameworks/Carbon.framework/Versions/Current/
    Frameworks/HIToolbox.framework/Versions/Current/Headers/
    CarbonEvents.h

     あくまでも上記はシステムが定義しているイベントということであって、これ以外にも自分で独自のイベントの種類を定義して使うことも可能です。

     さて、プログラムとしては「自分の関心のあるイベントに対してだけ」ハンドラを登録しておけばよい、ということですが、それは裏を返せば「自分に関心のないイベントの処理はシステムがやってくれる」ということになります。
     たとえばウインドウに関わるイベントの場合、ウインドウを生成するAPIであるCreateNewWindow()のパラメータにkWindowStandardHandlerAttributeという属性を指定してやることで、ウインドウの基本動作に関してはシステムにすべて任せてしまうことができるのです。さらにNibファイルでウインドウを作る場合に至っては、単にチェックボックスを一つ選択状態にしておくだけでいいのですから、実に簡単です。
     もっとも、Mac OS 9時代のプログラミング経験のない人や、Cocoaしかご存知のない方にとっては、何が簡単なのかがあんまりピンと来ないかもしれません。何しろOS 9のころは、ユーザーがウインドウを閉じるためにクローズボックスをクリックした時のような極めてありふれたケースですら、決まりきった処理コードをいちいち記述しなければならなかったわけですから。

     まあ、昔話はほどほどにして先に進めますが、通常、アプリケーションを作る場合、特にGUIアプリケーションであると起動時にやらなければならないことがいくつかあります。
     とは言えCarbonではOS 9時代に比べると、やることはそんなに多くありません。InitCursor()という何故かいまだに残っている初期化のためのAPIを除けば、メニューの構築、必要なウインドウの用意など、何のためにするのかが明確な初期化の処理を必要とするだけで、一見したところ「これは、何のために必要なの?」というようなものはまずありません。
     起動後のGUI部品の初期化が終われば、あとは必要に応じてハンドラのインストールをしておくだけ(まともなアプリの場合は、環境調査などの処理も必要に応じてやらねばならないでしょうが)。
     最後にRunApplicationEventLoop()を呼び出して、イベントループを走らせれば、残りはシステムがよきにはからってくれます。

    ◇MOSAからのお知らせと編集後記は割愛します◇

       

     MOSA Developer News   略称[MOSADeN=モサ伝]
            配信停止 mailto:mosaden-ml@mosa.gr.jp
     記事内容に関するご意見 mailto:mosaden-toukou@mosa.gr.jp
          記事投稿受付 http://www.mosa.gr.jp/?page_id=850
    Apple、Mac OSは米国アップル社の登録商標です。またそのほかの各製品名等
    はそれぞれ各社の商標ならびに登録商標です。
    このメールの再配信、および掲載された記事の無断転載を禁じます。
    特定非営利活動法人MOSA  http://www.mosa.gr.jp/
    Copyright (C)2007 MOSA. All rights reserved.

  • MOSA Developer News[MOSADeN=モサ伝]第242号

    2007-03-06

    目次

    • 「「Wonderful Server Life」    第40回   田畑 英和
    • 小池邦人の「Carbon API 徒然草」
    • SqueakではじめるSmalltalk入門  第80回   鷲見 正人

    「Wonderful Server Life」  第40回  田畑 英和

      〜Fiber Channel編〜

     WWDC 2007の告知が始まっていますが、WWDC前の大きなイベントとしては4月にラスベガスで開催されるNABがあります。NABは放送業界向けの展示会として毎年開催されているイベントです。放送業界では「Final Cut Pro」などのプが使われていますが、その他にもXserveやXserve RAIDといったサーバ系のハードウェアや、Xsanのような製品も使われています。
     これまでNABに合わせて製品のアップデートが行われてきておりますので、今年もなにか新しい発表があるかもしれません。Xserve RAIDのディスク容量が増加したことは以前レポートしましたが、NABへの布石でしょうか、他のストレージ関連の製品にも少し動きがありましたので、今回はこちらのレポートを行いたいと思います。

    ◇ホスト・バス・アダプタ
     Xserve RAIDとXserveやMac Proを接続するには、コンピュータ側にホスト・バス・アダプタが必要になります。AppleからはPCIカードのホスト・バス・アダプタが提供されていましたが、今回新しいカードがリリースされました。
     新しくリリースされたカードの説明をする前に、まずはXserve RAIDの接続方法について解説しておきます。Xserve RAIDは接続インターフェイスとしてファイバーチャネルを使用しています。ファイバーチャネルを用いると高速にデータを転送することができ、接続形態も1対1の接続や、ファイバーチャネルのネットワークを構成することができます。

     Xserve RAIDにはRAIDコントローラが2基内蔵されていますが、それぞれのコントローラにファイバーチャネルのポートが1基ずつ備わっています。このポートをファイバーチャネルのケーブルを使ってコンピュータに接続します。
     Xserve RAIDを接続するコンピュータには、PCIカードのホスト・バス・アダプタを装着する必要がありますので、対応する機種としてはXserveかMac Proということになります。Xserve RAIDにはホスト・バス・アダプタは付属していませんので別途購入する必要があります。
     今回新たにリリースされたカードは対応速度が高速化しています。ポート数も、これまでの2ポートから4ポートに増えたモデルがリリースされています。新たにリリースされたカードは次の2つです。

    ・新しくリリースされたホスト・バス・アダプタ
      - Apple Dual Channel 4Gb Fibre Channel PCI Express Card(2ポート)
      - Apple Quad Channel 4Gb Fibre Channel PCI Express Card(4ポート)

     これまでリリースされていたカードは対応速度が2Gbのモデルでしたが、今回リリースされたカードは新たに4Gbをサポートするようになりました。4GbになったといってもXserve RAID側はまだ2Gbのままなのですが、ひょっとすると次のモデルチェンジでXserve RAIDも4Gbに対応するのかもしれません。
     4ポートのカードがリリースされたことを考えると、次のモデルチェンジではXserve RAID側もポートも増設され、各RAIDコントローラへの接続を2重化して可用性を高めるのかなと想像してしまいますが、はたしてどうなることでしょう。
     カードにはファイバーチャネル用のケーブルも付属しています。ファイバーチャネルのケーブルには、Copperケーブルや、より長い距離での接続が可能な光ファイバーケーブルがあります。カードにはケーブルも付属しており、付属するケーブルはCopperを使用したものです。ポート数にかかわらず新しいカードには2本ずつケーブルが付属しています。ケーブルの長さは2.9mありますので、例えば同じラックの中にXserveとXserve RAIDをマウントしている場合には十分な長さといえるでしょう。
     ケーブルが足りない場合は、OnlineのAppleStoreでケーブル単体でも販売されています。新しいカードがリリースされたのにともない、ケーブルも4Gbに対応したものがリリースされました。さらに光ファイバーのケーブルやファイバーチャネルのネットワーク構築に使用するスイッチもApple Storeで販売されています。

    ◇Fiber Channel Utility 2.0
     「Apple Fiber Channel Card」を設定するソフトウェアとして「Fiber Channel
    Utility」がありますが、このソフトもアップデートしました。4Gbに対応したカードを設定するにはアップデートしたソフトを使う必要があります。最新の「Fiber Channel Utility」はアップルのWebサイトからダウンロードすることができます。

    ・Fiber Channel Utility 2.0
    http://www.apple.com/jp/ftp-info/reference/fibrechannelutility20.html

    つづく                              

    小池邦人のCarbon API 徒然草(2007/03/102)

    〜 Carbonモダンアプリケーションへの道(その11) 〜

    前回はテキスト描画用APIとしてDrawThemeTextBox()を紹介しました。筆者も、最近までこのAPIを便利に使っていましたが、自作アプリケーションをMacOS X 10.5(Leoperd)へ対応させる作業(さらなるモダン化)で幾つかの問題点に遭遇しました。今回からは、そのお話をします。

    Mac OS X 10.5で正式採用されるだろう(多分)機能の中に「レゾリューション・インディペンデント」と言うものがあります。これは、モニタ側のレゾリューションが何DPIであろうとも、そこに表示されるメニュー、ウィンドウ、コントロールなどのUIは、アプリケーション開発者やユーザの好みに合わせた解像度に調整できるという機能です。例えば、640×480ピクセルのウィンドウを30インチ・シネマディスプレーの画面いっぱいに表示しても、その美しさが損なわれない仕組みが提供されるわけです。

    確かに現状(Mac OS X 10.4)でも、30インチシネマディスプレーの解像度を640X480ピクセルに設定し、同サイズのウィンドウをオープンすれば画面いっぱいに表示されます。しかし、UIやその中の文字列に関しては単純にビットマップ拡大されるだけで、かなりぼやけた感じとなり、決して美しい表示とは言えません。「レゾリューション・インディペンデント」機能に対応させたアプリケーションであれば、UIで表示している文字や画像はくっきり・はっきり美しく表示させることが可能となります。

    筆者は歯科用データベースを開発しているのですが、ユーザから「データ入力や表示画面を大きなモニタになるべくいっぱいに表示したい(患者さんにプレゼンするにもその方が効果的)」という要望をしばしばもらいます。現状、30インチなどの大型ディスプレーを使うと、そこに表示される文字が小さすぎて操作し難いケースが多々あります。特に、私のような老眼のシニアには辛いものがあるわけです(笑)。「レゾリューション・インディペンデント」が当たり前になれば、こうした不平不満の大部分が解消されるでしょうから、Mac OSX 10.5から導入されるこの機能には大きな期待を持っています。

    ちまたではあまり知られていませんが、この機能、Mac OS X 10.4(Tiger)から導入準備が開始されています。具体例を上げてみましょう。まず、Interface Builder(v2.5.4)からNibファイルに登録されているウィンドウ・オブジェクトを選択し、Toolsメニューの「Show Inspector」で情報を表示をします。上部ポップアップメニューで「Attributes」を選択すると、そのウィンドウに関する各種アトリビュートを設定できるのですが、上から4番目に「Scaling:」というポップアップメニューがあるのが分かります。実は「レゾリューション・インディペンデント」に対応したウィンドウかどうかは、このメニューにより設定できるようになっています。

    「Scaling:」メニューから「Framework Scaled」を選択してNibファイルを保存し、自作アプリケーションからそのウィンドウをオープンしてやります。通常であれば、いつもとまったく代わり映えしないウィンドウがオープンします。そこで一旦アプリケーションを終了し、「Xcode Tools」をインストールすると一緒に保存される「Quartz Debug」というアプリケーションを起動します。このアプリケーションの保存場所は以下の通りです。

    /Developer/Applications/Performance Tools/Quartz Debug

    Quartz DebugのToolsメニューから「Show User Interface Resolution」を選択すると、倍率を変更するためのコントロールウィンドウがオープンします。
    例えば倍率を1.5に設定して再度自作アプリケーションを起動し、先ほどFramework Scaledアトリビュートを設定したウィンドウをオープンすると、今度は前回よりサイズが1.5倍の大きいウィンドウとして表示されることになります。この倍率設定は、Quartz Debugを終了するまで継続されています。

    Mac OS X 10.4では「レゾリューション・インディペンデント」機能の実装は不完全であり表示のバグも多い(多すぎる)ので、倍率指定したUIを完全な状態で表示することはできません。しかし、その雰囲気は十分に味わうことはできます。ちなみに、この機能に対応させるためには、描画用APIにも幾つかの制限があります。ウィンドウやコントロールなど、システム側で描画を受け持つオブジェクトは問題ないのですが、QuickDraw APIでの自前描画処理は、この機能にまったく対応していません。つまり、その部分だけ「レゾリューション・インディペンデント」で表示されないのです。

    前振りが長くなりましたが、実は前回紹介したDrawThemeTextBox()によるテキスト描画は、今まで説明してきた「レゾリューション・インディペンデント」に対応していません。API自体はDEPRECATED指定ではないですし、描画環境はCoreGraphicsのCGContextRefで指示できるのですが、描画処理の方はQuickDrawに大きく依存しているもようです。ひょっとして、正式版の10.5ではOKになるかもしれませんが、現時点ではそれも不透明ですので、将来を見据えて更にモダンなテキスト描画APIを探した方が良さそうです。

    そこで、またまたヘッダファイルのジャングルをさまよい歩いた結果(笑)HITheme.hで以下のようなAPIを発見しました。このAPIを用いたテキスト描画は、間違いなく「レゾリューション・インディペンデント」に対応しているもようです。例えば、テキスト描画矩形領域もRect構造体ではなく、CoreGraphicsのHIRect構造体指定であり、QuickDraw環境から完全に脱却していることが理解できます。

    OSStatus HIThemeDrawTextBox(
    
     CFStringRef          inString,        // 文字列
     const HIRect         *inBounds,       // 描画矩形領域
     HIThemeTextInfo      *inTextInfo,     // 描画情報
     CGContextRef         inContext,       // 描画対象
     HIThemeOrientation   inOrientation ); // 描画原点

    描画させたい文字列はCFStringRefで指定し、描画対象はCGContextRefで指定します。また描画方法の詳細については、以下のHIThemeTextInfo構造体で指示するようになっています。最後のHIThemeOrientationにより、描画原点を左上か左下のどちらかに設定できます。通常、CoreGraphics環境では左下原点ですが、ウィンドウに表示するコントロール(HIView)等は左上原点ですので、どちらの描画原点にも対応できるよう考慮されているようです。

    つづく
                                    

    SqueakではじめるSmalltalk入門   第80回  鷲見 正人

    本連載では、Macと切っても切れない関係にあるSmalltalkについて、最近話題のSqueakシステムを使って紹介しています。今回は、前回インストールして起動を確認したSqueak3.9に、日本語を扱うためのリソースの追加を行ないます。

    すでに第39回でもご紹介したとおり、Squeakシステムには現在、大島芳樹さんら日本人有志により開発された多言語化のしくみが公式バージョン(もともとは英語版)にも取り込まれた形でリリースされています。しかし、日本語を表示するためのグリフ(フォント)やメニューを日本語表示にするための情報は、適宜、別途インストールする必要があります。

    Squeakシステムには「SqueakMap」という、ユーザーが作成した拡張モジュールを集約して共有するためのサービスがあります。その中に前の3.8のときに登録された日本語の扱いに必要な情報をインストールするためのパッケージがあり、これが3.9でもそのまま使えるようです。

    http://map.squeak.org/
    http://map.squeak.org/package/5279e9cb-1a06-4ddb-8eca-48ca954790d3

    このようにSqueakMapのデータベースにはWebからのアクセスも可能ですが、登録されたパッケージを一覧したり、必要なものをダウンロードしてインストールするための機構やそのためのGUIは、Squeakシステム内に「SqueakMapパッケージローダ(Package Loader)」として備えられています。

    パッケージローダは、デスクトップメニュー → open… → SqueakMapPackage Loader から呼び出します。なお、当然のことながら、SqueakMapサーバーより情報を取得するため、SqueakのホストシステムであるOS Xはあらかじめインターネットに接続可能な状態にしておいてください。

    以下、SqueakMap経由で日本語のリソースを入手してインストールするための手順を示します。

    ▼ちょっとした不都合への対処
    現在公開されている3.9の仮想イメージ(Squeak3.9-final-7067.image)には、デフォルトの状態で日本語リソースをインストールすると、左下のナビゲータ(Navigator)フラップが使用できなくなってしまう不都合があります。ナビゲータフラップは、無くてもかまわないのですが、新しいプロジェクト(デスクトップ)の作成や、お絵かきツールの起動など、あればそれなりに便利なことも多いので、事前に対処しておくことにいたしましょう。

    とは言え、すべきこと自体は非常に単純で、プリファレンスの#showProjectNavigatorフラグをオンにしておくだけです。ワークスペースを開いて(デスクトップメニュー → open… → workspace。もしくは、デスクトップメニューをポップアップさせた状態でcmd + K)そこに次の式をコピー&ペーストした後、do it(cmd + D)するか、

    Preferences enable: #showProjectNavigator

    GUI操作のほうが安心ならば、プリファレンス(デスクトップメニュー →help… → preferences…)からmorphic → showProjectNavigatorを探して左側の□をクリックして■にする方法もあります。

    あるいはこの機会に、3.9から新しく備えられた「プリファレンスブラウザ(Preference Browser)」を試してみるのもよいかもしれません。プリファレンスブラウザは、デスクトップメニュー → Preferences & Services → 1.Preference Browser で起動できます。左側のカテゴリ(Categories)からmorphic → showProjectNavigatorと辿ってもいいですし、今回のように設定オプションの名前が分かっている場合は「Search preferences for:」欄に「showpr」などと入力して抽出してもよいでしょう。呼び出せたらenabledのところにある□をクリックして■にします。

    [fig.A]プリファレンスブラウザ

    これで準備はOKです。

    ▼日本語リソースのインストール
    SqueakMapパッケージローダを起動します(起動方法は前述)。左上の入力欄にマウスポインタを合わせてフォーカスした状態で、「jap」などと入力後returnキーを押下(あるいは、Squeakシステムの作法としてはaccept(cmd +S)をタイプ)することで「Japanese Environment Installer」というパッケージを選択できるはずです。続けて、パッケージローダのウインドウの左手、上から二番目の枠の“黄ボタンメニュー”から「install」を選択します。選択後、いくつか警告がポップアップしますが、すべて「Yes」で答えてください。

    [fig.B]パッケージローダから日本語環境のインストール

    念のため“黄ボタンメニュー”とは、Smalltalkのアプリケーションソフトが枠(ペイン)ごとに用意しているポップアップメニューのことで、スクロールバーの上端にある四角いボタンか、optionキーを押しながらマウスボタン、あるいはMighty Mouseやスクロールホイール付きマウスならスクロールボール(ホイール)ボタン…をクリックすることでポップアップできます。Windowsの右クリックメニュー、Macのコンテキストメニューに相当する機能ですが、その役割はMacのメニューバーのメニューに近いものです。

    暫定ダイナブック(ALTO+Smalltalk)には、当然のことながら、後にAppleが発明するプルダウンメニューやメニューバーはなかったので、操作はすべてこの“黄ボタンメニュー”により行なわれていました。Squeakにもその名残りとして同様の操作スタイルが受け継がれているわけです。なお「黄ボタン」というのは暫定ダイナブックにおける第二ボタンの呼び名で、ちなみに第一ボタン(Macでは通常のクリック)には「赤」、第三ボタン(Macではコマンドクリック、あるいはMighty Mouseなどでは右クリック)には「青」という“色”がそれぞれに割り振られていました。なお、Squeakでの「黄」と「青」のボタン割り振りはプリファレンスの#swapMouseButtonsオプションにより交換可能です。

    日本語リソースのインストールが無事完了すると「ReadMe.txt」というタイトルのワークスペースが現われます。各フラップやデスクトップメニューが日本語表示になっていることからも日本語化が行なわれたことが確認できるでしょう。ReadMe.txtなど、テキストを入力可能な場所で、日本語の入力や表示も正常に行なえることも確かめてみてください。残念ながらインライン変換はできないので、日本語入力用ウインドウを介しての入力になります。

    ▼メニューを英語に戻す
    せっかくの日本語メニューですが、ALTOの時代から長らく使われている伝統的な英語のコマンドやそれに割り振られたコマンドキーショートカットを連想しにくくなってしまう不都合があるので、英語アレルギーのかたには申し訳ないのですが、本連載では以後、英語メニューに戻して話を続けさせていただきます。

    メニューを英語に戻すには、ReadMe.txt内の次の二つの式を選択してdo it(日本語の黄ボタンメニューでは「式を評価」。cmd + D)します。

    Locale switchToID: (LocaleID isoLanguage: 'en').
    Locale currentPlatform: (Locale isoLanguage: 'ja').

    この操作で、メニューや表示されるメッセージは英語に戻ってしまいますが、テキストとしての日本語の入力や表示は変わらず行なえます。

    ▼次回起動時にも日本語を使えるようにする
    デスクトップメニューから「保存」を選ぶと起動時に使用した仮想イメージファイルが上書きされます。これで、次回起動時からも引き続き日本語を扱うことが可能です。

    もしオリジナルの仮想イメージ(日本語リソース抜き)の内容をとっておきたいのであれば、「保存」の代わりに「別名で保存…」か「新しい版として保存」を選びます(後者は、自動的に新しい名前が割り振られます)。新しい仮想イメージを作った場合は、次回からはそれを仮想マシンにドロップインします(当然ですが…)。なお、前回も触れたとおり、仮想イメージとチェンジファイルの移動や改名をするときは、同名のものを必ずペアで扱うようにしてください。

    バックナンバー:
    http://squab.no-ip.com:8080/mosaren/

     

    ◇MOSAからのお知らせと編集後記は割愛します◇

     

    MOSA Developer News   略称[MOSADeN=モサ伝]
            配信停止 mailto:mosaden-ml@mosa.gr.jp
     記事内容に関するご意見 mailto:mosaden-toukou@mosa.gr.jp
          記事投稿受付 http://www.mosa.gr.jp/?page_id=850
    Apple、Mac OSは米国アップル社の登録商標です。またそのほかの各製品名等はそれぞれ各社の商標ならびに登録商標です。このメールの再配信、および掲載された記事の無断転載を禁じます。
    特定非営利活動法人MOSA  http://www.mosa.gr.jp/
    Copyright (C)2007 MOSA. All rights reserved.