MOSA Multi-OS Software Artists

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

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

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

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

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

    2007-01-30

    目次

    • 「Wonderful Server Life」       第35回  田畑 英和
    • 藤本裕之のプログラミング夜話  #107
    • 高橋真人の「プログラミング指南」  第105回
    • ニュース・解説                小池 邦人

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

      〜アクセス権編〜

     今回は「ワークグループマネージャ」を使用したPOSIXのアクセス権の設定方法を解説します。「ワークグループマネージャ」はネットワークに対応していますので、ネットワーク上のMacからリモートでアクセス権の設定が可能です。他にリモートでアクセス権を設定する方法としてはsshで接続してコマンドライン上でアクセス権を設定することもできます。sshを使用する場合は、Mac以外のプラットホームからでも設定が可能です。

    ◇サーバ上のファイル/フォルダのブラウズ
     「ワークグループマネージャ」を起動して目的のサーバに接続したら、まずツールバーから「共有」をクリックします。画面左側の「共有ポイント」リストにはすでに共有が設定済みのフォルダの一覧が表示されています。
     サーバ上の任意のファイル/フォルダに対してアクセス権を設定するには、「共有ポイント」の右側の「すべて」をクリックします。「すべて」にはサーバ上のボリュームが表示され、ここからボリューム内のファイル/フォルダをブラウズすることができます。

    ・「共有ポイント」
    http://homepage.mac.com/htabata/MXS10.3/img/WGM_Sharing/WGM_01.png
    ・「すべて」
    http://homepage.mac.com/htabata/MXS10.3/img/WGM_Sharing/WGM_02.png

    ◇アクセス権の確認
     目的のファイル/フォルダを選択し、次に画面右側に並んでいるボタンから「アクセス」をクリックします。POSIXのアクセス権はすべてのフォルダ/ファイルに対して必ず設定しますので、まずは既存のアクセス権を確認することができます。Finder上で確認したときと同様に「オーナー」「グループ」「全員」に対するアクセス権が確認できます。Finderでは「その他」と表記されていたところが、「ワークグループマネージャ」で「全員」と表記されています。これは同じことを意味しています。
     「ワークグループマネージャ」で設定可能なPOSIXのアクセス権は、Finder上で設定可能なアクセス権と基本的に同じです。Finderではフォルダとファイルで設定可能なアクセス権が異なりましたが、「ワークグループマネージャ」ではフォルダにもファイルにも同一のアクセス権を設定することができます。アクセス権の種類の表記がFinderと少し異なりますが、たんに用語が異なるだけです。「ターミナル」上でコマンドラインを使ってアクセス権を確認すれば、それぞれどのようなアクセス権が設定されているかが確実に確認できます。

    ・アクセス権の確認
    http://homepage.mac.com/htabata/MXS10.3/img/WGM_Sharing/WGM_04.png

    ・ワークグループマネージャ上で設定可能なPOSIXのアクセス権の種類
     ・読み出し/書き込み(Finderでは読み/書き)
     ・読み出し専用(Finderでは読み出しのみ)
     ・書き込み専用(Finderでは書き込みのみ)
     ・なし(Finderではアクセス不可)

    ◇アクセス権の設定
     アクセス権を変更するには「オーナー」「グループ」を変更する場合と、アクセス権の種類を変更する場合があります。アクセス権の種類を変更するだけであれば、右側の3つのポップアップメニューから目的のアクセス権を選択するだけです。設定を変更したら最後に必ず画面右下の「保存」ボタンをクリックしてください。

    ・アクセス権の種類の変更
    http://homepage.mac.com/htabata/MXS10.3/img/WGM_Sharing/WGM_05.png

     「オーナー」や「グループ」を変更する場合は、既存の設定を直接書き換えることができます。ここにはユーザ名(ショートネーム)を入力すればよいのですが、ドラッグ&ドロップで設定する方法もあります。直接入力しなければ打ち間違えることもありませんので、慣れないうちはドラッグ&ドロップで設定するのがよいでしょう。
     画面の下ある「ユーザとグループ」をクリックすれば、ウインドウの右か左端にユーザとグループのリストが表示されます。

    ・ユーザのリスト
    http://homepage.mac.com/htabata/MXS10.3/img/WGM_Sharing/WGM_06.png
    ・グループのリスト
    http://homepage.mac.com/htabata/MXS10.3/img/WGM_Sharing/WGM_07.png

     あとはリストから目的のユーザ/グループを選択して、「オーナー」や「グループ」にドラッグ&ドロップすれば適切なパラメータが自動的に入力されます。 
    OpenDirectoryのマスターを使用している場合には、サーバ上にはNetInfoで管理するローカルドメインとLDAPで管理する共有ドメインが存在しています。アカウントはドメインごとに存在しますが、アクセス先のドメインを変更するにはユーザとグループのリストの上にあるポップアップメニューを使用します。

    ・ドメインの選択
    http://homepage.mac.com/htabata/MXS10.3/img/WGM_Sharing/WGM_08.png

     共有ドメインにアクセスするには「/LDAPv3/127.0.0.1」を、ローカルドメインにアクセスするには「ローカル」を選択します。「検索パス」を選択すれば共有ドメイン上とローカルドメイン上の両方のアカウントをまとめて表示することができます。

    つづく                               

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

     前回の続き。NSArchiverによってアーカイブされたNSIndexSetを受け取る側の話である。これを受け取るための仕組みも、書き出しに使ったメソッド、
    tableView:writeRowsWithIndexes:toPasteboard: と同様、NSTableDataSource
    protocolに定義されているので、対象テーブルの datasource になっているオブジェクトにインプリメントする。まずは(長ったらしいが)、

    -

     (NSDragOperation) tableView:(NSTableView*)tableView
                     validateDrop:(id )info
                      proposedRow:(int)row
            proposedDropOperation:(NSTableViewDropOperation)operation;

    このメソッド、簡単に言えばテーブル上にドラッグされてきたデータを調べ、受け取って処理できるものであれば、そのオペレーションの種別を返すもの。オペレーションは以下のようにNSDragging.h に定義されている。

    enum {
        NSDragOperationNone = 0,
        NSDragOperationCopy = 1,
        NSDragOperationLink = 2,
        NSDragOperationGeneric = 4,
        NSDragOperationPrivate = 8,
        NSDragOperationAll_Obsolete = 15,
        NSDragOperationMove = 16,
        NSDragOperationDelete = 32,
        NSDragOperationEvery = UINT_MAX
    };
    


    今回我々はテーブルのアイテムの位置を移動しようというわけなので、パラメータ info の中身を調べてそれが移動のための情報であればNSDragOperationMove を、そうでなければNSDragOperationNone を返せばいい。こんな感じ……。

    - (NSDragOperation) tableView:(NSTableView*)tableView
                     validateDrop:(id )info
                      proposedRow:(int)row
            proposedDropOperation:(NSTableViewDropOperation)operation {
         if([[info draggingPasteboard] availableTypeFromArray:
              [NSArray arrayWithObject:@"DraggingIndexSet"]] != nil) {
                   [tableView setDropRow: row
    dropOperation:NSTableViewDropAbove];
                        return NSDragOperationMove;
                   }
              }
         }
         return NSDragOperationNone;
    }
    


     上のコードで NSTableView に対して送っているメッセージ、setDropRow:dropOperation: は、ドロップの行き先がアイテムとアイテムの間であること(NSTableViewDropAbove)を通知している。意味判るよね? iTunesを起動してもらうと分かりやすいんだけど、何かプレイリストを作って一番左にある番号のカラムを選択すると(他のカラムではそのデータ順でソートされてしまうので順番を変えられない)、トラックをひっつかんで曲順を変更できるよね。そんときドラッグ先はアイテムではなくてアイテムとアイテムの間になるでしょ。
     対して、つかんだトラックを左の方の他のプレイリスト(スマートプレイリストだとダメ、理由は自明ですね)のところへドラッグするとそのプレイリストそのものがドロップの対象になる。Finderでファイルやフォルダを他のフォルダの上にドラッグしたときと同じ。こういうことをやりたい場合はNSTableViewDropAbove の代わりにNSTableViewDropOn を指定するわけ。
     そしてそれがドロップされた時に送られてくるメッセージが、これ。

    - (BOOL)tableView:(NSTableView *)aTableView
           acceptDrop:(id )info
                  row:(int)row
        dropOperation:(NSTableViewDropOperation)operation;
    


     これについては次回の説明とさせていただく。
                                (2006_01_25)

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

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

    〜再利用化について(1)〜

     こんにちは、高橋真人です。
     さて前回MLTEとPowerPlantの具体的な例から、カスタマイズということについてお話をいたしました。今回は、話をもう少し抽象的なレベルに移し、オブジェクト指向と非オブジェクト指向でカスタマイズの仕方にどのような違いが出るのかを話してみたいと思います。

     オブジェクト指向は再利用化のための技術だ、と言われます。しかし再利用化ということ自体はオブジェクト指向の専売特許というわけではありません。たとえば、ANSI Cで書かれたCライブラリはまさに「何度も利用されることを目的に構築されて」いる枠組みです。このことから言えば「Cライブラリは再利用化のための技術だ」と言えなくもないわけです。
     では、何が違うんでしょう?
     この辺は微妙なので、説明するのはかなり難しいことです。というのも、この、オブジェクト指向はどのように再利用化を促進するかということは、オブジェクト指向の本質的な部分とも言えるからです。そのため、昔から数多くの入門書や解説記事などで、いろいろな人がさまざまな切り口でこのことについて語っています。 書籍や記事でオブジェクト指向を題材に取り上げる時点で、ほぼ間違いなくオブジェクト指向を肯定的にとらえているわけですから、当然読者に対しては「いかにオブジェクト指向はよいものか」を分かってもらおうとします。(ごくまれに否定的な記事を見ることもないわけではありませんが)
     しかし、先ほども言ったように再利用という点について言えば、これは必ずしもオブジェクト指向特有のメリットというわけでもありません。
     最も代表的な機能にしてですらこのような状態なので、その他の機能に関しても、それが「オブジェクト指向だけにある」というふうにはなかなかならないわけです。確かに違いがあるのは明らかなのですが、いざ未経験者に説明しようとするとなかなか機能面での際立った違いを見せることが難しいのです。 そこで話を「考え方」という部分に振ってしまって「オブジェクトとは、つまりはモノだ」という毎度おなじみの解説が展開されるわけです。さらには動物を引き合いに出して継承の概念やら何やらを解説していくと。
     まあ、この「オブジェクトを動物になぞらえて解説する」なんてのは今や古典とすら言えるもので、これ以外にも、工業の世界、建築の世界、料理の世界、交通の世界と、この世のありとあらゆるものを引き合いに出してきてオブジェクト指向を説明しようと試みているのですね。

     しかしいくらそんな話をたくさん読んでも、「言っていることは分かるんだけど、何となくピンと来ない」という人は必ずいます。というか、そういう人の方が多いのかもしれません。なので、もしかしたら今これを読んでおいでのあなたもそんな人の一人なのかもしれませんね。
     残念ながら、「これからあなたの疑問をきれいさっぱり氷解させてあげましょう」などと言うことは当然私にもできません。そもそも私自身が何かの本を読んで「一気にオブジェクト指向が理解できた」なんて経験をしていないわけで。(もし、そんな経験があれば、「ズバリこの本を読め」と推薦するだけで済ませちゃいます)
     だとしたら、私がどうやってオブジェクト指向という技術を理解するに至ったかと言いますと、これはもう「経験」に尽きます。
     もしあなたが現在プログラマーとして日常を送られている方なら、自分がプログラミングという技術をどうやって理解し、身に付けたのかを思い出してもらえれば分かるでしょう。それと同じなんです。結局、詰まるところ経験の積み重ね以外にはないのです。

     ですから、もしこの連載を読めば「オブジェクト指向が理解できるかも」と淡い期待を抱いている人がいるとしたら、悪いことは言いませんから、なるべく早く何らかのオブジェクト指向言語を選んでプログラムを書くことをやってみるべきです。特に、今まで例えばCで書いたようなプログラム(ある程度の規模があることが理想です)をオブジェクト指向言語で書き直してみるのがお勧めです。
     もちろん、最初からうまく行くことはないでしょう。
     特に、C++のようなオブジェクト指向言語「としても」使うことのできる言語だと、よほどオブジェクト指向で書くことを強く意識して取り組まないと、今までのものと何の違いもないものになり兼ねません。
     お勧めなのは、既に出来上がっているフレームワークに少しずつ手を加えながら変更していくことです。もともとオブジェクト指向で動作している枠組みを、できればソースコードも含めた部分を観察してなるべくその流儀を崩さないように意識しながら徐々に手を加えていくのです。
     流儀の維持よりも機能を実現しようという気持ちが強くなればなるほど、出来上がってみたら「全然、オブジェクト指向っぽくない」と感じるものになってしまうはずです。しかし、そこでくじけずに何度もチャレンジしてみてください。オブジェクト指向っぽく書こうと常に意識し続けることが大切です。
     こういう経験を何度も繰り返していくことで、知らず知らずのうちに体の中にオブジェクト指向っぽさがしみ込んでいきます。
     「ソースコードのあるもの」と言いましたが、ソースコードの提供されているフレームワークも最近ではオープンソースの影響で増えてきたものの、そんなに多くあるとは言えないかもしれません。(ソースコードを変更しながら、という点では鷲見さんが連載されているSqueakなんかは最適のような気がします)
     まあ、話をかなり理想化してしまったので、「現実にはそんなもの、あり得ない」というケースがほとんどでしょう。もともと動いている枠組みで、あなたの過去に書いたものと似たものが見つけられたら、かなり幸運だと思ってもよいかもしれませんね。
     で、不幸にして運に恵まれないほとんどの人には「デザインパターン」という技術をひも解いてみることをお勧めします。デザインパターンでは、多くのプログラムが書かれる際に頻繁に使われる実現方法を、抽象化した形でカタログ化してまとめてありますので、部分的にであれ、あなたのやりたいことのオブジェクト指向的なアプローチのヒントが見つけられる可能性はずっと高いはずです。

     話がかなり逸れてしまいました。次回は、オブジェクト指向が再利用化をどのように実現しているのかという部分について見ていきたいと思います。

    ニュース・解説

     今週の解説担当:小池邦人

    ● Carbon ドキュメント & サンプル & SDK ナビゲーション(2007/01/26)

    【開発環境】

    Apple社(US)のデベロッパーサポートから「君がBug Reporterに上げてくれたバグを取ったから動作確認してみてね。」という趣旨のメールが届きました。内容を見てみると、対象OSがLeoperd(Mac OS X 10.5)となっています。ADCメンバーのデベロッパーの方ならご存じだと思いますが、開発中の製品のSeedingにおいては、Apple社に対して遭遇したバグの報告をすることができます。まあ、それがSeedingの主な目的ですから、大量のバグレポートが届けば届くほど、Apple社にとっては大変に有り難いわけです。

    しかし、私はSeeding中のLeoperdに対して、まだバグを報告した記憶はありませんでした。「おかしいな?」と思いメールを再確認したところ、何とこいつはTigerのSeedingの時に報告したバグではありませんか(笑)。私が報告したバグは結局一世代の間寝かされていた事になります。さて、報告されたバグのうち、どれを取りどれを寝かしておくのかは、どうやって誰が決めるのでしょうか(多数決?)。私としては、結構みっともないバグだったので、すぐに取ってもらえると思ったのですが? 考えが甘かったですね…。

    【テクニカルドキュメント】

    前回から1月26日の期間中、Apple社のGuidesサイトには10のドキュメントが登録されました。新型Xserveのハードウェア仕様書が登録された関係で、すべての「Developer Note」(ハードウェア関連)の内容が更新されています。また、デベロッパー向け読み物が2つ登録されています。そのうち「Using Pythonand Quartz on Mac OS X」については、前号の木下さんの記事も参考にしてください。

    「AirPort Developer Note」
    「Audio Developer Note」
    「Bluetooth Developer Note」
    「Ethernet Developer Note」
    「FireWire Developer Note」
    「PCI Developer Note」
    「RAM Expansion Developer Note」
    「Universal Serial Bus Developer Note」
    「Video Developer Note」
    「Xserve Developer Note」(初版)

    http://developer.apple.com/documentation/index-rev-date.html

    「Built on Apple Technologies, iSale is Intuitive and Powerful」(読み物)
    http://developer.apple.com/business/macmarket/isale.html

    「Using Python and Quartz on Mac OS X」(読み物)
    http://developer.apple.com/graphicsimaging/pythonandquartz.html

    前回から1月26日の期間中、新規テクニカルノートが4つ、新規テクニカルQ&Aが3つ登録されました。「Creating an About Panel in Your Cocoa Application」がテクニカルノートになってしまうのが面白いですね(笑)。ディフォルト・アバウトの画像やテキスト内容の変更方法が中心ですが、独自デザインのウィンドウを開いてしまえば一発のような気もしますが…。

    TN2185「C++ Tips and Tricks for Mac OS X」(初版)
    TN2179「Creating an About Panel in Your Cocoa Application」(初版)
    TN2165「Frequently Asked Questions about the X Window System (X11) for Mac
    OS X」(初版)
    TN2124「Mac OS X Debugging Magic」

    http://developer.apple.com/technicalnotes/index-rev-date.html

    QA1503「Preventing column reordering in NSTableView」(初版)
    QA1501「Core Video – Available Pixel Formats」(初版)
    QA1284「Creating install packages from the command line」

    http://developer.apple.com/technicalqas/index-rev-date.html

    【サンプルソースコード】

    前回から1月26日の期間中、Apple社のSample Codeサイトには、サンプルソースコードがひとつだけ登録されました。Cocoaのカーソル表示用APIをCarbonアプリケーションから利用するためのサンプルです。しかし、この程度のAPIはCarbon側にも用意しておいて欲しいところです(涙)。

    「CarbonCocoa_PictureCursor 」(Carbon&Cocoa関連)

    http://developer.apple.com/samplecode/index-rev-date.html

    【デベロップメント SDK】

    前回から1月26日の期間中、Apple社のSDKサイトには新しいSDKがひとつも登録されませんでした。

    http://developer.apple.com/sdk/

     

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

     

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

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

    2007-01-23 

    目次

    • 「「Wonderful Server Life」   第34回   田畑 英和
    • 小池邦人の「Carbon API 徒然草」
    • SqueakではじめるSmalltalk入門  第77回   鷲見 正人
    • ニュース・解説               木下 誠

    Wonderful Server Life」  第34回  田畑 英和

      〜アクセス権編〜

     ファイルシステムのアクセス権にはPOSIXとACLの2種類があることを前回説明しましたが、まずはアクセス権の基本となるPOSIXのアクセス権から解説していきたいと思います。
     Mac OS X ServerではPOSIXのアクセス権が標準で用いられていますが、これはMac OS Xでも同様です。ですので、アクセス権としては基本中の基本といえるでしょう。

    ◇POSIXのアクセス権
     アクセス権の種類を確認するために、まずはFinderでアクセス権を確認してみましょう。Finder上で任意のフォルダ/ファイルを選択し、「ファイル」メニューから「情報を見る」を選択するとアクセス権を確認することができます。

    ・Finderの「情報を見る」で確認したアクセス権
    http://homepage.mac.com/htabata/MXS10.3/img/Permission/Finder_01.png

     POSIXのアクセス権は「オーナー」「グループ」「その他」の3段階で判定が行われます。すべてのフォルダ/ファイルには1人のユーザがオーナーとして設定されることになり、基本的にはファイルを作成したユーザがオーナーとなります。またグループも1つだけ設定することができます。
     アクセス権を判定するには、まずアクセスしているユーザがオーナーであるかどうかを判定し、オーナーでなければ次にグループのメンバーであるかどうかを判定します。オーナーであれば、あらかじめオーナーに対して設定しておいたアクセス権を、グループのメンバーであればあらかじめグループのメンバーに対して設定しておいたアクセス権が適用されます。オーナーでもグループのメンバーでもなければ「その他」に対して設定しておいたアクセス権が適用されます。

     次にアクセス権の種類ですが、Finderでは次のようにフォルダに対して4種類のアクセス権を、ファイルに対しては3種類のアクセス権を設定できます。

    【フォルダのアクセス権】
    ・読み/書き
    ・読み出しのみ
    ・書き込みのみ
    ・アクセス不可
    【ファイルのアクセス権】
    ・読み/書き
    ・読み出しのみ
    ・アクセス不可

     つまり、「読み出し」と「書き込み」の組み合わせでアクセス権が設定でき
    るということです。同じファイルのアクセス権をFinderではなく「ターミナル」
    上でlsコマンド(オプション-lを使用)を使って確認すると次のようになります。

    % ls -l
    -rw-r-----    1 appserve  admin  16225 Jan 19 01:39 iPhoneSpec.pdf

     先頭のアルファベットの組み合わせがアクセス権を表しています。最初の1文字(“-”)は「iPhoneSpec.pdf」がファイルであることを表しています。次の3文字(“rw-”)は「オーナー」のアクセス権を表しており、”r”が「読み出し」、”w”が「書き込み」を意味します。ですので”rw-”は「読み/書き」のアクセス権ということになります。
     あとはさらに続けて次の3文字”r–”が「グループ」のアクセス権、最後の3文字”—”が「その他」のアクセス権となります。「その他」にはなにもアクセス権が設定されていませんので、Finder上では「アクセス不可」と表示されます。
     ファイルではなく、フォルダ(ディレクトリ)のアクセス権を「ターミナル」上で確認してみると次のようになります。

    % ls -l
    drwxr-xr-x   11 appserve    admin    374 Dec  8 07:46 directory

     ファイルは先頭が”-”で始まっていましたが、ディレクトリの場合は”d”になります。そしてアクセス権を確認すると”r”、”w”以外にも”x”が使われていることが分かります。この”x”は「実行」のアクセス権を表しており、ディレクトリの場合はこの”x”のアクセス権がないとディレクトリの中に移動することができません。またファイルの場合でもシェルスクリプトなどのプログラムを実行するにはこの”x”のアクセス権が必要になりす。”x”はFinder上では確認や変更ができず、”x”も含めてすべてのアクセス権の管理をするには「ターミナル」を使用する必要があります。
     「ターミナル」上でアクセス権を設定するコマンドとしてchmodコマンドが用意されています。chmodコマンドを使えば「オーナー」「グループ」「その他」に対して読み出し(r)、書き込み(w)、実行(x)のすべてのアクセス権を設定することができます。chmodコマンドの詳しい使い方についてはmanコマンドやUNIXの入門書などで確認してください。

     以上がPOSIXのアクセス権の基本になります。他にもあといくつかアクセス権の種類があるのですが、今回解説した範囲で基本的な部分はカバーすることができます。それでは次回は「ワークグループマネージャー」を使ったアクセス権の設定方法について解説したいと思います。
                                   
    つづく

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

    本連載では、名前は知っていてもなかなか触れる機会のないSmalltalkについて、最近話題のSqueakシステムを使って紹介しています。今回は、前回の最後にソースを提示しただけで終わってしまったメソッド「GuiBuilder >> #generateScriptOf:」の解説をします。念のため、次のリンク先に当該メソッドのソースコードを示しておきますので、前回のメールがお手元にない場合はこちらを参照してください。

    ▼ウィジェット生成用コードのカタログ化
    すでに第75回の「扱うことができるウィジェットの種類を動的に得る」という項目で、カテゴリ’widget types’に分類してあるメソッド名の一覧を得る方法には触れました。

    GuiBuilder allMethodsInCategory: 'widget types'

    こうして得られたウィジェット生成のためのメソッド名(セレクタ)を手がかりにして、まず、それぞれに対応するメソッドの実体(すなわち、オブジェクトとしてのメソッド)を取得します。

    Objective-Cも、クラスをはじめ意外なものがオブジェクトなので、慣れない当初はいろいろと驚かされた方も多いと思います。しかし、SmalltalkではObjective-Cの比ではない規模であらゆるものがオブジェクトとして表現されています。メソッドもその一つです。コンパイルされたメソッドはりっぱなオブジェクトで、メッセージを受けることができ、あらかじめ定められた「振る舞い」をします。

    オブジェクトとしてのメソッドを得るには、クラスに対して「compiledMethodAt: selectorSymbol」というメッセージを送ります。

    GuiBuilder compiledMethodAt: #field

    Squeakでは、#compiledMethodAt:のエイリアス(別名)として#>>が定義されているので、次のようにメソッドを指すのに使う慣用的な表記を、そのままSmalltalk式として評価することも可能です。

    GuiBuilder >> #field

    さて。オブジェクトとしてのメソッド(a CompiledMethod)は、正体こそ単なるバイト列に過ぎないのですが、実にいろいろなことを知っています。どんなことを知っていて教えてくれるのかについては、CompiledMethodをbrowse it(cmd + B)してブラウザを開き、accessingとかliterals、source code managementといったカテゴリに属するメソッドを眺めてみるとよいでしょう。

    たとえば、自らのソースコード中にどんなオブジェクトが現われたかという情報については、literalsというメッセージを送ることで引き出すことが可能です#generateScriptOf:メソッドでは、ウィジェット生成用メソッドのソースに現われたオブジェクトの中から「#Pluggable」で始まるものについて、それが当該メソッドの生成しようとするウィジェットが属するクラスであると判断しピックアップしています。

    また、自身がコンパイルして生成される際に用いられたソースコードそれ自体にアクセスする方法も心得ています。getSourceFromFileというメッセージを送ることで、ちょうどブラウザのコードペインに入力した内容そのままを得ることが可能です。ただ今回の目的(ウィジェット生成用のコードを得る)にはメソッドのソースコードの一行目にあるメッセージパターンやコード冒頭のリターン「^」は邪魔なので、それらを省く文字列処理(#indexOf:、#allButFirst:)を行ない、ウィジェットを作るための式のみを抽出しています。

    こうして得られたウィジェットのクラスを「キー」に、そのウィジェットを生成するためのコードを「値」にして、あらかじめ用意したsourceCodesという辞書のエントリーとして登録(#at:put:)しておく…という手続きが、#generateScriptOf:の前半に行なわれている作業の内容です。

    ▼レイアウト情報のソースコード化とその出力
    まず、自動生成するソースをはき出すためのテキストファイルを開き、fileという名前でアクセスできるように関連づけしています。

    file := FileStream newFileNamed: 'mywindow.st'.

    ファイルストリーム「file」に対しては、「nextPutAll: aString」というメッセージを送ることで、パラメータとして添えたテキスト(aString)を追記してゆくことができます。なお、メッセージ「cr」は整形のための改行の追加を意味します。

    #generateScriptOf:で自動生成しているコードはおおよそ次のような内容のものです。

    1. 一時変数としてmodel、windowを宣言(| model window |)
    2. 適当なモデルをmodelに関連付け(model := …)
    3. システムウインドウを生成(#labelled:)し、windowに関連付け(window := …)
    4. windowにウィジェットを追加(#addMorph:frame:)
    5. windowを表示(#openInWorld)

    この中で(4)の部分は、GUIビルダウインドウに配置したウィジェットから情報を得て動的に記述する必要があります。そのための処理を行なっているのが次の部分です。

    window paneMorphs do: [:morph |
       file nextPutAll: 'window addMorph: ('.
       file nextPutAll: (sourceCodes at: morph class).
       file nextPutAll: ') frame: ('.
       frame := morph layoutFrame.
       file nextPutAll: (
          frame leftFraction @ frame topFraction
             corner: frame rightFraction @ frame bottomFraction) printString.
       file nextPutAll: ').'; cr].

    GUIビルダウインドウのpaneMorphs変数から、同ウインドウにレイアウト済みウィジェットについての情報を得て、各ウィジェットをmorphという変数に関連付けしながら#do:で二行目から最終行までの処理を繰り返しています。

    ウィジェットを生成するための式は、前半でカタログ化したものを参照。辞書ではウィジェットのクラスがキーになっているので、単純に#at:でアクセスするだけです。得られたコードをそのまま#nextPutAll:しています。配置のための情報は、まず、ウィジェットのlayoutFrame情報を得て、そこからウインドウ内での相対座標情報を#@や#corner:を使って矩形(a Rectangle)情報として再構成。あらためてprintStringメッセージを送ることで、文字列化後、fileへ出力しています。

    すべてのコード出力作業を終えると、fileにeditというメッセージが送られ、出力済みのファイル内容が新しいウインドウに表示されます。

    以上、#generateScriptOf:は少々長めで、一見、複雑なメソッドに見えますが、メソッドオブジェクトの存在やファイル出力の方法について知ってしまえば、いたって単純な作業内容のメソッドであることがおわかりいただけたと思います。次回は、出力されたスクリプトを改変し、適当なモデルと結びつけることで、実際にGUIとして動作するかどうかを確認してみましょう。

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

    ニュース・解説

     今週の解説担当:木下 誠

    ———————————————————————-
    PythonでQuartzプログラミング
    ———————————————————————-

    オブジェクト指向スクリプト言語Pythonを使って、2Dグラフィックス環境であるQuartzのプログラミングを紹介する記事、「Using Python with Quartz 2Don Mac OS X」が公開されています。

    Pythonには、Quartz 2D環境のAPIを叩くための、Python Quartz Bindingが提供されています。これを使って、図形を描画したり、PDFを操作したり、という例が紹介されています。特に、サーバ環境などで、PDFファイルを処理したいときなどに、威力を発揮するでしょう。

    Mac OS Xでは、PythonやRubyといったスクリプト言語の環境が標準で搭載されています。これらの言語は、動的なオブジェクト指向を目指しているので、同様の傾向を持つObjective-Cと非常に親和性が高いです。そのため、CocoaやObjective-Cとのブリッジは、早い段階で登場していました。

    さらに、Quartzも、そのAPIはCで提供されていますが、オブジェクト指向的な考えをベースに設計しているため、これらの言語とも相性がいいです。この辺りに、Mac OS Xの「筋の良さ」を感じます。

    Using Python with Quartz 2D on Mac OS X
    http://developer.apple.com/graphicsimaging/pythonandquartz.html

    ———————————————————————-
    Carbonから、ラッパーを使ってNSCursorを呼び出す
    ———————————————————————-

    Carbonから、画像を指定してカーソルを作るために、NSCursorを呼び出すサンプル、「CarbonCocoa_PictureCursor」が公開されています。

    Objective-CでNSCursorを呼び出すためのC言語ラッパー関数を作り、それをCarbon側から呼び出しています。

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

    ———————————————————————-
    XserveのDeveloper Note
    ———————————————————————-

    XserveのDeveloper Noteが公開されています。去年の8月に登場した、IntelXeonプロセッサを搭載したモデルのものです。

    それに伴い、他のDeveloper Noteも更新されました。Xserveモデルに関する情報の追加となっています。

    Xserve Developer Note
    http://developer.apple.com/documentation/HardwareDrivers/Conceptual/Xserve_0
    608/index.html

     

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

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

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

    2007-01-16

    目次

    • Macworld Conference & Expo San Francisco 2007 レポート  堀口 幹城
    • 「Wonderful Server Life」       第33回  田畑 英和
    • 藤本裕之のプログラミング夜話  #106
    • 高橋真人の「プログラミング指南」  第104回
    • ニュース・解説                小池 邦人

    Macworld Conference & Expo San Francisco 2007 レポート  堀口 幹城

     MOSA会員の皆様、こんにちは。
     バックスクラチャイープランオフィスの堀口です。今回初めて、モサ伝にレポートを書く事になりました。文章表現のいたらないことがあると思いますが、お許しください。

     今年もMacworld Conference & Expo San Francisco(MacExpoSF)に行ってきました。MacExpoSFは、一昨年、去年と、今回で3回目です。

     さて、今回の感想ですが、基調講演の内容については、すでにインターネット上のサイトで報告されていますので、そちらにおまかせして、展示会場についての報告を述べたいと思います。今回の展示会場は、SouthとNorthの一部が使われ、展示会場が広くなっていました。(昔から来ている人に言わせるともとに戻ったらしい)

     Appleブースについて、展示会場の開場直後に展示会場に入ったのですが、Southホール中央のAppleブースで最初に見たのがブース手前中央に並んでいる、“Apple TV”。
     大画面液晶TVに接続された、“Apple TV”が何台も並んでいる。当然、今回発表された製品であるため、人だかりがすごい状態。説明員の方々も大忙しって感じです。それでも何とか写真を撮ったりはできました。それからブース内には2つの巨大モニターがあり、一つは“iPhone”、もう一つは“Apple TV”の説明をしていました。(基調講演時とほぼ同じ内容)こちらも視聴している人が多く通り抜けるの大変な状態です。ブースの両端にショーケースに入った“iPhone”が展示されて、(それも、ちょっと高い位置に)ここも人だかりだが、ショーケース脇に警備員がいてショーケースに触れると怒られます。

     Appleブースの他の展示として、“iLife06”、“iWork06”、“iTunes+iPod”、“Final Cut Studio”等がブースの両脇にあったが、こちらは今回真新しいものがなかった為、あまり人気がなく説明員も暇そうにしていました。尚、今回発表のあった“AirMac Extremeベースステーション”の展示は見られませんでした。

    Apple以外のブースについて、まずはApple以外のブースについて報告を述べる前に、過去2年のMacExpoSFの傾向について。2005年がMac Expoと言うよりはiPod Expoと言う感じの展示がメインだった。2006年はiPod周辺機器メーカ(ほとんどがiPodのケースを扱っていたメーカ)が淘汰され、少しずつではあるがOSXのデベロッパが元気になり始めた感じがした。で、今年のMacExpoSFですが、

    1.iPodの周辺機器が再び多数出展されている。
     特に、iPodのケース関係が多数出展。2年前に出展されているケースとは違い、材質やデザインに趣向をこらしたものが多くなってきています。中には、日本の携帯電話でもあった、直接ペインティングしたものもありました。それと、iPod用のスピーカ関係、こちらも各出展者がデザインをこらしたものが多数出展されています。(小さいものから、大型のものまで各種あり)
    かわったものでは、高さが1mほどのジュークボックスで、iPodの接続とCDプレーヤ、ラジオが使用できるようになっておりました。
    また、トイレットペーパホルダーにiPodの接続とアンプ&スピーカをセットしたものまでありました。
    2.バッグ関係
     過去2年の出展にくらべ、今回はバッグ類を扱う出展者が多くなっており、デザインや機能が各メーカいろいろ趣向をこらしたものが多数出展されています。私も、17inch用にいいのがあったので、つい購入してしまいました。ちょっとかわったバッグの出展として、上記iPod周辺機器ともいえるデイバッグがありました。表面にはスピーカがありバッグ内にアンプとバッテリ−が格納されていてるものとか、バッグ表面に太陽電池を備えたものまでありました。
    3.その他
     今回は会場が広くなった為、(広くなった分、出展数も多くなった感じもしますが)デベロッパー関係の出展会場もスペースがあり、見学するのもゆったり見学できました。

    以上が簡単ですが、現地での報告です。

     最近は、MacExpoもここサンフランシスコでしか行われなくなってきていますし、Appleの新製品の発表だけでなく、商品開発や販売をしている方にとっては、他社の扱う製品の傾向や動向等を知る上でも、MacExpoSFは貴重な情報収集の場となると思いますので、来年のMacExpoSFを見学を是非、検討されてはと思います。ちなみに来年の開催は、2008年1月14−18日です。都合がつけば、また来年も来てみたいと思っています。

    ■プロフィール
    堀口幹城(ほりぐち もとくに)
    1962年生まれ 群馬県高崎市出身
    1984年より日立マイクロコピュータエンジアリングにて、高速SRAMの設計、評価、量産立ち上げに従事。その後、1994年退社後フリーにて活動。
    活動実績として、デジタル系回路設計、基板設計、ASIC設計、半導体評価、顧客要素技術を使用した商品企画及び試作評価等MOSA入会年は、2003年。WWDC参加回数 4回

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

      〜アクセス権編〜

     サンフランシスコで開催されたMacWorldでは、iPhoneやらApple TVが華々しくお披露目されました。Leopard/Leopard Serverはすっかり話題をもっていかれたような気がしますが、リリース日もまだ発表されていないことですし本連載は引き続きTiger Serverを中心に解説を行って行きます。

     これまでインストール、DNS、Open Directory、AFP(ネットワークホーム)と解説を行ってきましたが、AFPの次はファイルのアクセス権について解説したいと思います。
     アクセス権というと、どちらかといえば地味な話になりますが、アクセス権についての仕組みを正しく理解していないと、ファイルサーバにファイルが書き込めなかったり、ファイルを他のユーザに勝手に削除されるといったことが発生してしまいます。そこで適切にファイルサーバを運用できるように、アクセス権の仕組みをじっくりと解説していきたいと思います。

    ◇POSIXとACLのアクセス権
     それではまずアクセス権の概要から解説を始めていきます。ファイルシステムのアクセス権としては、Mac OS X Server v10.3まではUNIXの世界で古くから使われてきたPOSIXのアクセス権しかサポートされていませんでした。
     Mac OS X Server v10.4からはあらたに、より細かな種類のアクセス権が設定できるACLのアクセス権がサポートされるようになりました。ですのでアクセス権の種類としてはPOSIXとACLの2つが存在することになります。
     ちなみにMac OS X Server v10.4ではファイルシステムのACLの他に、サービスのACLという機能もサポートされています。

     POSIXのアクセス権はいつでも有効になっていますが、ACLのアクセス権はボリュームごとに有効/無効を設定することができます。つまりこれまでどおりにPOSIXのアクセス権のみで運用するということもできます。また、POSIXのアクセス権とACLのアクセス権の両方が設定されている場合にはACLのアクセス権が優先されるというルールになっています。
     Mac OS X Serverのファイルサービスは何種類かのプロトコルをサポートしていますが、ACLのアクセス権が適用されるのはAFPとSMBの2種類になります。

    ◇アクセス権の設定方法

     アクセス権を設定するには、大きく分けて次の3つの方法があります。

    【ワークグループマネージャ】
     「ワークグループマネージャ」を使えば、接続先のサーバの任意のフォルダおよびファイルのアクセス権を設定することができます。POSIXおよびACLのアクセス権の両方を設定することができ、ボリュームごとにACLのアクセス権の有効/無効を設定することもできます。
     また、アクセス権の設定ではありませんが、「ワークグループマネージャ」からサーバ上に新規にフォルダを作成することもできます。

    【Finder】
     Finderでもアクセス権を設定できますが、FinderではPOSIXのアクセス権のみが設定可能で、ACLのアクセス権は設定することができません。またPOSIXのアクセス権も一部のアクセス権は設定することができませんが、これは「ワークグループマネージャ」を使用した時も同様です。

    【ターミナル】
     「ターミナル」からはPOSIXおよびACLの両方のアクセス権を設定することができます。ローカル上の任意のフォルダ/ファイルのアクセス権を設定できることはもちろん、sshを使ってリモートのサーバ上のアクセス権を設定することもできます。
     また、「ワークグループマネージャ」やFinderでは設定できないアクセス権もありますが、「ターミナル」を使えばすべてのアクセス権を設定することができます。
     ボリュームごとにACLのアクセス権の有効/無効も設定でき、「ターミナル」を使えばMac OS X ServerだけではなくMac OS X上でもACLのアクセス権を設定することができます。

     というわけで、まずはアクセス権の概要から説明を始めました。以前からサポートされていたPOSIXのアクセス権に加え、Mac OS X Server v10.4からはACLのアクセス権もサポートされるようになりましたので、両方のアクセス権を使用する場合はそれぞれの仕組みをしっかりと把握しておく必要があります。 それでは次回からは「ワークグループマネージャ」を用いた設定を中心に、アクセス権の解説を続けていきます。

     つづく

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

     御慶。……去年も同じ挨拶をしたが、これは「ぎょけい」と読んで、落語「御慶」で富くじに当たった八五郎が金持ちになったからにはってんで紋付き袴をあつらえ、近所中に新年の挨拶に行くためにご隠居に教わる「最も短くて覚えやすい新年の挨拶」なんである。そこは落語のことだから、似合わない紋付き姿の八五郎にいきなり「ぎょ、ぎょけい!」と怒鳴られて長屋の連中はその意味が判らず、一悶着も二悶着も起きるんだけど、それはまた別の話。

     こちらの話題は昨年の続き、NSTableView におけるドラッグ&ドロップである。もちろん NSTableView からでもこれまで見てきたのと同じように、他のアプリケーションに向けて選択されているセルの中身……例えば文字列などをドラッグすることはできるのだが、それについては昨年の解説を応用してもらうとして、ここでは NSTableView からそれ自身に選択したセルをドラッグ&ドロップすることによってセルに入っているデータの順番を変更する方法を説明したい。
     まずドラッグの始まりだが、これは NSTableView の dataSource(NSTableViewとその dataSource に関する説明は割愛するので各自「NSTableDataSource protocol」とかのドキュメントをひもといてくだされ)になっているオブジェクトで、

    - (BOOL)tableView:(NSTableView*)tableView
            writeRowsWithIndexes:(NSIndexSet*)rowIndexes
            toPasteboard:(NSPasteboard*)pboard;

    というメソッドをインプリメントすることで実現する。これ、OS X 10.3.9までは

    - (BOOL) tableView:(NSTableView*)tableView
            writeRows:(NSArray*)rows
            toPasteboard:(NSPasteboard*)pboard;

    だったんだけど、新しい方だけ解説するので古いほうについては類推+確認よろしく。
     このメソッドには現時点で選択状態にある Row のインデックスがNSIndexSetというオブジェクトの形で渡される。例えば10個のデータがエントリされているテーブルがあるとして、その上でコマンドキーを押しながら、1個目、3個目、5個目をセレクトする(……あ、この記述は言うまでもなくallowsMultipleSelection がYESのときね)と、それらが NSIndexSet に格納されてくるわけである。要はこの NSIndexSet をそのまんまドラッグ用のペーストボードに入れて送り出してやればいい。あとは受け取った側の話だからね。
     さて、ここで問題になるのは、NSPasteboard は NSString や NSData などは受け取るけれども NSIndexSet なんてオブジェクトを受け取ってくれないということである。つまりこいつにデータをセットするメソッドは、

    - (BOOL)setPropertyList:(id)propertyList forType:(NSString *)dataType
    - (BOOL)setData:(NSData *)data forType:(NSString *)dataType
    - (BOOL)setString:(NSString *)string forType:(NSString *)dataType

    の3つしかないのね。なので我々は(と、突然「共犯者用語」を使うけど)
    NSIndexSet をあじゃこじゃしてこれらのどれかを使える形にしなければなら
    ない。
     結論から言うと、ここで NSArchiver と NSUnarchiver というとっても便利なNSCoder のサブクラスを使う。こいつらの機能は、簡単に言えばあるオブジェクトを梱包して NSData の形にする、NSData になってるそれを荷ほどきして元のオブジェクトに戻す、というもの。早い話がこれを使えばNSIndexSet をNSData に化けさせて上の setData:forType でペーストボードに渡せるのである。そのコードは以下の通り。

    NSData* indexData = [NSArchiver archivedDataWithRootObject:rowIndexes];
    [pboard declareTypes:[NSArray arrayWithObject:@"DraggingIndexSet"]
    owner:self];
    BOOL result = [pboard setData:indexData forType:@"DraggingIndexSet"];
    


     上のコードで @”DraggingIndexSet” というのは今即席でねつ造したこのデータを受け渡すためのタイプ識別子。これを例えば(中身と合ってないけど)NSStringPboardType みたいなアリモノにしちゃうと他のアプリケーションとかがドロップされたとき受け取っちゃって始末に困るでしょ? もちろんその NSTableView が自身以外へのドラッグ&ドロップをサポートしない場合には、前回のケースで「無くても支障がないけど?」と書いた

    - (unsigned int)draggingSourceOperationMaskForLocal:(BOOL)isLocal;

    を使ってローカルでないドラッグを無効にしてしまえばいいんだけど、それでも混乱を避けるためこういうのはちゃんと区別がつくようにしておくに越したことはない。よね?
     と、いうわけで無事に選択状態にある Row のインデックスを送り出せた。
    次回はこれを受け取ってその順番を変更するほうを解説したい。(2007_01_11)
                                

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

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

    〜カプセル化について(3)〜

     こんにちは、高橋真人です。
     さて年を越してしまいましたが前回の続きです。
     前回のお話で私がお伝えしたかったのは、使い方を簡単にするために作られたオブジェクト指向の仕組みが、かえってカスタマイズの邪魔をすることがある、ということでした。
     これはどういうことかというと、クラスの設計の仕方によってはクラスの柔軟性を奪うことになるということです。
     例として取り上げているMLTEは、かなり大掛かりな仕組みとして提供されているため、随分といろんなオプションが用意されています。しかし、機能が多彩であることと引き換えに、使うためにはそれなりの手順や手間がかかることがある場合も少なくありません。

     たとえば文字サイズを変更したいとしましょう。MLTEでは、単に文字のサイズを変更するだけでも以下のようなコードが必要となります。

    Fixed    textSize;
    TXNTypeAttribute    attributes[1];
    attributes[0].tag = kTXNQDFontSizeAttribute;
    attributes[0].size = kTXNFontSizeAttributeSize;
    attributes[0].data.dataValue = (UInt32)textSize;
    ItemCount attrSize = sizeof(attributes) / sizeof(TXNTypeAttribute);
    TXNSetTypeAttributes(mlteObject, attrSize, attributes,
         kTXNUseCurrentSelection, kTXNUseCurrentSelection);

    初めて見る人にはかなり複雑に見えるでしょう。簡単に解説します。

    ・属性のための構造体を用意
    ・構造体の各メンバに文字サイズ変更に必要な各値を設定
    ・適用範囲をしてして、TXNSetTypeAttributes()を呼ぶ

     上記のコードは、こんな感じのことをやっています。なぜ、文字サイズを指定するだけなのにこんな大仰なやり方が必要かと言えば、これは正に「多彩さ」のためなのです。
     何となく想像の付く方もおいでと思いますが、TXNTypeAttributeという構造体は、MLTEの文字属性を指定するためのインターフェースです。つまり、ここにさまざまな値を設定することで、文字サイズに留まらない実に多くの文字属性を変更できる仕組みになっているわけです。
     しかし、「ただ文字サイズを変えたいだけ」の人にとってはそんなことは「余計なこと」ですから、迷惑な話です。だからと言ってそれでMLTEを使うことをやめられるならいいのですが、テキスト編集の仕組みを自力で組めないような人であれば余計に、MLTEはなかなかに捨てがたい魅力的な機能をたくさん備えているのです。

     そこでPowerPlantです。前回もご紹介したPowerPlantのLMLTEPaneというクラスでは、SetFontSize()というメンバ関数に文字サイズを与えて呼び出すだけで、上記の処理を代行してくれます。言ってみれば、「MLTEの多彩さを隠して簡単に呼び出せる仕組みを提供した」ということです。
     ですが、「簡単に呼び出せるインターフェース」と「多彩な機能」は基本的には相反するものです。
     LMLTEPaneの用意した文字サイズ変更の仕組みがユーザーの目的に完全に合致するならばよいのですが、LMLTEPaneのSetFontSize()は現在の選択範囲に対してしか指定した文字サイズを適用してくれません。それが微妙にニーズと異なる場合もあるでしょう。
     そんな時、何らかのコードを書き足したり、書き換えたりすることが必要になるわけですが、できることなら「既存の仕組みをできるだけ生かしたい」と思うのではないでしょうか? 前々回お話ししたケースですが、私は単にMLTEがユーザーのドラッグ&ド
    ロップを受け付けた時にだけ、ドロップされたテキストデータをちょっと変更したかっただけなのです。しかし、それを実現するためにはMLTEの用意しているドラッグ&ドロップの仕組みのほとんどすべてを諦めなければなりませんでした。
     こういうのは解せませんよね。なかなか思うように動いてくれないコードをデバッグしながら、何度「MLTEつかうのやめちゃおうかなぁ」と思ったことか(笑)。こういうときに、「もしMLTEがオブジェクト指向で作られていたらなぁ」と思ったりするわけです。
     PowerPlantのように実装コードが付属していれば言うことはないのですが、それは無理でも元々の挙動を極力生かしつつ、自分のニーズに合うように必要なところだけを変更する。これができれば、言うことはないんですよね。
     巧妙に設計されたクラスでは、この辺が絶妙です。自分が変更したいと思っていた部分に適したインターフェースがそれこそ「かゆいところに手が届く」ような感じで用意されていたりするのです。(まあ、かなり理想化しているとは思いますが・笑)

     ところで、PowerPlantの名誉のために一言加えますが、前にもお話ししたようにLMLTEPaneはPowerPlantの末期に加えられたクラスです。そのため他のクラスに比べて作り込みがあまりされていないのです。
     PowerPlantの他のクラスはオブジェクト指向フレームワークの中でも設計の良さで知られるものが少なくありません。
     例えばPowerPlantを使う人なら必ず使うと言ってもよいLPane、LView、LWindow。これらのクラスはかなり巧妙に設計されていて、例えば私の場合などは、ウインドウの動作を制御するために自力でちまちまと書き込んだコードをデバッグしていて、ふと「げ、LWindowにこんなメンバ関数があったのかよぉ」と、自分が何時間もかけて書いたコードと同等またはより高機能な仕組みがとっくに備わっていたことに気付くことも珍しくありませんでした。

    ニュース・解説

     今週の解説担当:小池邦人

    ● Carbon ドキュメント & サンプル & SDK ナビゲーション(2007/01/12)

    【開発環境】

    先週のサンフランシスコのExpoで待望の「iPhone」が発表されました。まだ商標関連でゴタゴタしているようですが、USでの発売開始が6月なので、それまでには何とかなるでしょう。さっさと違う名前にすればイイような気もしますが、きっと大将がガンとして譲らないのでしょうね(笑)。ただ残念なことに、携帯電話として日本でちゃんと使えるようになるのには、まだ相当に時間が掛かりそうです。加えて、Apple社はiPhoneをクローズド環境(iPodと同じ)として取り扱うようでして、デベロッパに対して搭載アプリケーション開発用のSDKなどを配布する予定はないようです。

    Macintoshを中心に置いたソリューションを構築する時、Macintoshと親和性の高いデタ入力用の小型携帯端末が必要となるケースが多々あります。筆者が開発している歯科用データベースでも、フットワークの面から検査データの入力にPalmを利用しています。ちなみに、以前はNewtonを使っていたのですが(笑)ご存じの通りApple社が開発を止めてしまったため、やむを得ずPalm OS製品に切り替えたわけです。その後、メーカをIBM にしたら販売終了…Sonyに代えた途端に販売終了…と、結局日本語を正式にサポートしたPalm OS製品は消えてしまいました(今回の件でPalm自体もやばい?)。

    そんなわけで、Apple社が出す(それもOS X搭載)この手の製品は喉から手が出るほど欲しかったわけです。まあ、iPod同様にちゃんと契約したデベロッパには何らかの開発環境が提供されるのかもしれませんが、それより、iPhoneから携帯電話機能を外したバージョン(タッチパネルを持った小型Mac)を販売して欲しいところです。こちらについては日本で即座に販売可能なわけですし、アプリケーション開発も自由にできます。個人の活用だけでなく、先ほどのようなMacintoshとコラボするケースでも大いに活躍することができると思うのですが…さて、どうでしょうか?

    【テクニカルドキュメント】

    前回から1月12日の期間中、Apple社のGuidesとReferenceサイトには幾つかドキュメントが登録されました。しかし、そのほとんどがマイナーチェンジの改訂版です。Guidesサイトに登録された2つと、Referenceサイトに登録された3つのみが、新版もしくは内容が更新されたドキュメントです。また、デベロッパ向けの読み物も2つ登録されています。「Introducing Dashcode」は、Widget開発環境であるDashcodeの紹介ですDashcodeで作成したWidgetが、直ちに自分のiPhoneに転送できて使えたら最高なのにねぇ…。やはり、Apple社はiPhoneのクローズド環境を再考すべきです。

    「Aperture 1.5.1 SDK Overview」(PDFあり)
    「Universal Binary Programming Guidelines, Second Edition」(PDFあり)

    http://developer.apple.com/documentation/index-rev-date.html

    「Aperture 1.5.1 SDK Reference」
    「Core Audio Data Types Reference」(初版)(PDFあり)
    「Core Audio Glossary」(初版)(PDFあり)

    http://developer.apple.com/reference/index-rev-date.html

    「Leopard Technology Series: Introducing Dashcode」(読み物)

    http://developer.apple.com/leopard/overview/dashcode.html

    「Making modo a Great Mac App: Luxology Uses Xcode, Quartz, OpenGL」(読み物)

    http://developer.apple.com/business/macmarket/modo.html

    前回から1月12日の期間中、新規テクニカルノートはひとつも登録されませんでしたが、新規テクニカルQ&Aの方は3つ登録されています。

    QA1498「AuthorizationCreate- FromExternalForm 100022 Error Explained」(初版)
    QA1491「Volumes Not Showing Up On The Desktop」(初版)
    QA1391「How can I determine the order of the languages set by the user
        in the Language tab of the International preference pane?」(初版)

    http://developer.apple.com/technicalqas/index-rev-date.html

    【サンプルソースコード】

    前回から1月12日の期間中、Apple社のSample Codeサイトには、サンプルソースコードが2つ登録されました。「DTSCarbonShell」は、モダンCarbonアプリケーションの雛形です。Carbonを使い簡単なアプリケーションを開発しようと考えている方は、このソースコードを参考にすると良いでしょう。編集メニューの「特殊文字…」は、メニューコマンドに’chrp’を割り振るだけなんですね。知らなかった(笑)。

    「KauthORama」(Kernel Authorization関連)
    「DTSCarbonShell」(Carbon関連)(初版)

    http://developer.apple.com/samplecode/index-rev-date.html

    【デベロップメント SDK】

    前回から1月12日の期間中、Apple社のSDKサイトには新しいSDKがひとつも登録されませんでした。

    http://developer.apple.com/sdk/

     

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

     

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

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

    2008-01-15

    目次

    • 「「Wonderful Server Life」    第62回   田畑 英和
    • 小池邦人のCarbon視点でCocoa探求
    • ターミナルの向こうから      第17回  海上 忍 

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

    ■  〜Leopard Server新機能紹介〜

     Leopard Serverが発売されてからは、まずインストールとセットアップについての解説をいち早くお届けしてきました。ここであらためてLeopard Serverの新機能について取り上げてみたいと思います。
     Leopard Serverでは、クライアント版のLeopardに追加された新機能も利用できますが、それら以外にもサーバ向けの新機能が追加されています。これまで存在していたサービスに改良が加えられただけでなく、新しいサービスも利用可能になっています。そこで今回は、Leopadr Serverで新たに追加された3つのサービスについての概要を紹介します。

    ◇iCal Server
     Macにはこれまでもスケジュール管理用のソフトウェアとして「iCal」が標準搭載されていましたが、スケジュールをサーバ上で一元管理することはできませんでした。.Macなどのサーバを使って各個人のスケジュールを公開することはできましたが、これはあくまでもクライアント上で作成したスケジュールデータをサーバにアップロードするための仕組みです。
     Leopard Serverで追加されたiCal Serverを使用すれば、最初からサーバ上でスケジュールデータを一元管理することができます。サーバ上で各ユーザのスケジュールを一元管理することで、例えば打ち合わせの予定を追加するさいに、他の出席者の空きスケジュールを確認するといった使い方ができるようになります。
     iCal Serverはオープンソースとして開発され、ソースコードはMac OS forgeのサイトで公開されています。iCal ServerはPythonを使って実装されており、CalDAVというプロトコルを採用しています。
     このサービスは標準またはワークグループ構成のサーバでも使用することができます。クライアント側ではLeopardに搭載されているiCal 3などCalDAVに対応したソフトウェアを使用する必要があります。

    ・Mac OS forge「Calendar Server」
    http://trac.calendarserver.org/projects/calendarserver
    ・CalDAV
    http://ietf.osafoundation.org/caldav/index.html

    ◇Wiki Server
     Webブラウザ上でWebページを編集できるシステムのことをWikiといいますが、Wikiの実装としてはPHPを使ったPukiWikiなどがあり、これまでもあとからMacにインストールして運用することは出来ました。
     Leopard Serverでは最初からシステムにWikiが組み込まれており、標準およびワークグループ構成であれば、「サーバ環境設定」を使って「Webサービス」を設定することにより使用できるようになります。
     Wikiでは通常専用のマークアップ構文を使用してページを編集したりしますが、Leopard ServerのWikiではこういったマークアップ構文を使用することなく、テキストエディタやワープロソフトで文章を作成するような感覚でページを編集することができます。編集したページはサーバ上で履歴が管理されていますので、いつでも過去のデータを呼び出すことができます。
     グループごとにWikiが使えるようになっており、この機能を利用してグループ内での情報共有に役立てることができます。さらに、Web上でグループカレンダーを利用したり、グループ宛のメールのアーカイブを参照することもできます。

    ◇Podcast Producer
     様々な分野のPadcast番組が制作されており、なかにはMac専門のPodcastもあります。実際にPodcastを制作しようとすると、最終的なデータをサーバにアップするまで収録やエンコーディングなど色々と作業が必要になってきますのでなにかと大変です。
     Leopard Serverに追加されたPodcast Producerを使えば、一連の処理を自動化してPodcast制作を行うことができます。まずクライアント版のLeopardにも付属する「Podcastキャプチャ」(「/アプリケーション/ユーティリティ」にインストールされている)を使用することにより、Macを使ってPodcastの収録を行うことができます。FireWire接続のカメラ、iSightなどから映像や音声を取り込むことができます。
     収録が完了するとデータはサーバ上のPodcast Producerにアップロードされ、H.264など最終的に公開するフォーマットへのエンコーディング処理がおこなわれます。大規模な制作を行う場合は、分散処理を実現するXgridと組み合わせることにより、複数台のサーバでエンコーディング処理を実施することもできます。

     Leopard Serverには他にも様々な機能が追加されていますが、次回以降ひとつずつ詳しく紹介していきたいと思います。
                                 次回へつづく

    小池邦人のCarbon視点でCocoa探求(2008/01/11)

    〜 Interface Builder 3の操作に慣れる 〜

    今回は、Interface BuilderでMainMenu.nibとAbout.nibを編集し、その後にソースコードを記述してクラスを実装してみます。Leopard(Mac OS X 10.5)付属の「Xcode Tools」に付属している「Interface Builder 3」は、以前のバージョンから操作体系が大幅に変更されていますので、作業にはいくらか注意が必要となります。

    「しんぶんし v3.0」で使うモデル、ビュー、コントローラの各オブジェクトは、すべてをMainMenu.nibに詰め込むことはしません。オブジェクトは関連するグループに分けて、別々のnibファイルにまとめる予定です。まず最初に、MainMenu.nibにはアプリケーション自身のコントローラ・オブジェクトである「ApplicationController」を登録します。そして続いて「About.nib」ファイルを作成し、そちらにアバウトウィンドウや、そのコントローラである「AboutController」を登録します。

    XcodeのShinbunShi3プロジェクトを起動し、登録されているMainMenu.nibをダブルクリックしてInterface Builderを立ち上げます。表示された「ライブラリ」ウィンドウ(何故かここだけ日本語表記?)にある「NSObject」(青い立方体アイコン)をドラッグ&ドロップでMainMenu.nibへ登録します。その名称をObjectからApplicationControllerに変更したら、インスペクタ(Inspector)ウィンドウをオープンし、IdentityパネルのClassカラムににもApplicationConrollerと代入します。この作業により、アプリケーション起動時に、自動的にApplicationConrollerオブジェクトのインスタンスが生成され
    ることになります。

    ここまでの作業を行うことで、Interface BuilderがXcodeプロジェクトのクラス定義(ApplicationController.hファイルの内容)との同期を取り、自動的にIBActionである「openAboutWindow:」がClass Actionsのリストに追加されます(これは便利!)。この時、もし対象クラスにIBOutletが存在していれば、それについても、すぐ下のClass Outletsのリストに登録されます。ところで、旧バージョンのInterface Builderであれば、XcodeプロジェクトのApplicationConroller.hをMainMenu.nibウィンドウ上へドラッッグ&ドロップすれば、そのクラスのインスタンス・オブジェクトを作成してくれたのですが、何故だか本バージョンでは何も起こりません?

    この機能は削除されてしまったのかと思い「Interface Builder User Guide」を調べてみると、そこにはちゃんと可能であると明記されています。その証拠に、Fileメニューにも「Read Class Files…」がありますので、機能自体が無くなったわけではなさそうです。ならばと、メニューを選択してApplicationConroller.hファイルを読み込んでみましたが、やはり何も起こりません? 同時に、Fileメニューの「Write Class Files…」も試してみましたが、こちらの方は、ちゃんとApplicationConroller.hとApplicationConroller.mの両ファイルを書き出してくれます。これはバグでしょうか?それとも当方の環境だけで起こる現象でしょうか? 謎のままです。

    そもそもInterface Builder 3には「Classes」メニューがありません。つまり、旧バージョンで行っていたように、Classesタブを使い先んじて指定クラス(例えばNSObjectなど)のサブクラスを作成しておき、そこから「Classes」メニューの「Instantiate」によりインスタンス・オブジェクトを作成するという作業ができません。またインスペクタにはスーパークラスを指定する箇所がないので、Interface Builder側で作成したインスタンスをファイルへ書き出すと、スーパークラスの表記ができず、ヘッダファイルには以下の様な注意書きが付きます(笑)。

    @interface MyObject : /* Specify a superclass (eg: NSObject or NSView) */ {
    
    }
    
    @end
    


    つまり、Interface Builder側でクラスを作成し、それからソースファイル(クラス定義と実装の雛形)を書き出すという従来の流れは推奨されていないようです。これからは、先んじてクラス定義のヘッダファイルを作成し、nibファイルに対応インスタンス・オブジェクトを登録してから、それと同期させるという作業の流れになりそうです。ソースコードに新規のClass ActionやOutletを追加した時も、Interface Builderがすぐさま同期させてnibファイル側にも反映させてくれますので、この流れの方が分かり易いと思います。ただし、昔からの Interface Builderの使い手は、最初は少々戸惑うかもしれませんね。

    次にAbout.nibファイルの方です。こちらでは、アバウト表示用のウィンドウ(ビュー・オブジェクト)とアバウト用のコントローラ・オブジェクトを編集します。nibファイルを新規作成するには、Fileメニューから「New…」を選びます。表示されたダイアログの「Window」を選択し、できあがったnibファイルを「About.nib」という名称で保存した後にXcodeプロジェクトに登録しておきます。この時、nibファイル内のウィンドウ名称もAboutと変更しておきます。ウィンドウ上には「OK」ボタンや画像を配置することになりますが、その作業の解説は次回にまわします。また、Interface Builderでのコントローラ
    とビューのリンクについても次回に解説したいと思います。

    アバウトウィンドウ用のAboutControllerについては、ApplicationConrollerのようにライブラリからNSObjectアイコンを登録する必要はありません。
    About.nibの「File’s Owner」アイコンを選択してインスペクタをオープンし、IdentityパネルのClassカラムにAboutControllerと代入します。後は、AboutControllerオブジェクトのインスタンスを作成する時に、このnibファイルを読みむように処理すればOKです。また、プロジェクトのクラス定義(AboutController.hファイル)とも同期が取られ、IBActionの「closeAbout:」がClass Actionsリストに、IBOutletの「_okButton」がClass Outletsリストの方に表示されます。

    続いてクラスの実装ですが、とりあえず以下の様にソースコードで記述してみました。前回、各クラスのインスタンス変数は、ローカル変数と区別しやすくするためにアンダーバーを含むように表記しましたが、アンダーバーは先頭にあった方が良さそうなので(後々のことを考えると)そう変更してあります。

    まずは、ApplicationConroller.mです。

    #import "ApplicationConroller.h"
    
    @implementation ApplicationConroller
    
    - (IBAction)openAboutWindow:(id)sender
    {
       if( ! _aboutController )
           _aboutController=[[AboutController alloc] init];
       [[_aboutController window] center];
       [_aboutController showWindow:self];
    }
    
    - (void)dealloc
    {
       [_aboutController release];
       [super dealloc];
    }
    
    @end
    


    続いて、AboutController.mの方です。

    #import "AboutController.h"
    
    @implementation AboutController
    
    - (id)init
    {
       self=[super initWithWindowNibName:@"About"];
       return self;
    }
    
    - (IBAction)closeAbout:(id)sender
    {
       [self close];
    }
    
    @end
    


    次回は、ウィンドウへのボタンや画像の配置、コントロールとビューのリンク、上記ソースコードの詳しい解説を行います。また、練習用に追加した不要なコード部分を外す処理もします。本連載で作成したプロジェクトファイルは、MOSA Exchangeに順次アップロードされています。今回分の名称は「ShinbunShi3_08_01_11.zip」です。
    つづく                                

    ターミナルの向こうから      第17回  海上 忍

    〜 Yet Anotherなテキスト処理系を考える (1)〜

     ここしばらくGraphiz / DOT言語関連の記事が続いていましたが、そろそろ新しいトピックに移りましょう。今回は、LaTeXユーザ必携のPostScript互換インタープリタ「GhostScript」について解説します。

    ・GhostScriptが必要な理由

     GhostScriptは、オープンソースによるPostScript互換インタープリタです。PostScriptはAdobe Systemsが開発したページ記述言語で、プリンタへの出力などに現在も用いられています。しかしライセンス料が高額なため、それを回避するためにもフリーな実装を必要としたユーザ層が — 特にPC-UNIXの分野で — 存在したこと、またPostScriptデータ(以下、PSデータ)をディスプレイでプレビューしたいという需要もあったことから、GhostScriptの開発がスタートしたと聞きます。
     現在GhostScriptは、UNIX系OSやWindowsなどさまざまなOSへ移植されています。PSデータをレンダリングし、LIPSやESC/Pageなどの各種プリンタ記述言語へ変換、非PostScriptプリンタで印刷するためのフィルタとして主に利用されますが、各種画像フォーマットやPDFに変換することも可能です。
     このGhostScript、決してMac OS Xと無縁ではありません。Leopardでプリンタをセットアップするとき、ドライバを手動で指定しようとすると、「Gutenprint」という名前を目にすることと思います。このGutenprintは、旧称を「Gimp-Print」という“プリンタドライバ集的ソフトウェアパッケージ”ですが、GhostScriptをプリンタ出力用のインターフェイスとして活用することができます。GhostScriptは、サポートの終了した旧機種もサポートしている(ドライバを同梱している)ため、メーカーがドライバを提供していない機種を使いたい、というニーズに応えることもできます。
     なにが言いたいかというと、印刷の処理系ではPostScriptが依然現役であること、GhostScriptを使えば非PostScriptプリンタへPSデータを出力できること、メーカー純正ドライバのない機種に印刷できる(かもしれない)こと、PostScript互換のフリーな実装への需要からGhostScriptが必要とされていること、の4点です。

    ・いくつかあるGhostScript

     GhostScriptのソースコードは公開されていますから、Cコンパイラ(GCC)など開発環境一式があればMac OS X上でもビルドできます。しかし、諸事情からいくつかの配布プロジェクトが存在していますので、その解説から始めてみましょう。
     GhostScriptには、2つのライセンス体系が存在します。Aladdin FreePublic License(AFPL)版とGPL版で、いずれもソースコードは公開され無償利用が可能ですが、前者は商用目的での利用には制限が設けられています。以前は、AFPL版が先行して開発され、同じものが約1年遅れでGPL版として公開されるというパターンでしたが、方針転換により2年ほど前からGPL版がリーディングエッジな役割を担っています。
     また、GPL版GhostScriptにも、通常版(GPL GhostScript)とESPGhostScriptの2つが存在します。後者は、Mac OS Xの印刷制御システムに採用されている「CUPS」向けの機能が追加されたもので、Mac OS Xユーザは主にこちらを利用してきました。現在ではGPL GhostScriptに統合されたため、これから(最新バージョンを)入手する場合には、GPL GhostScriptを選択すればいいことになります。

    ・GhostScriptを入手する

     現時点におけるGPL GhostScriptの最新版(v8.61)は、以下のURLから入手できます。ビルドの手順は割愛しますが、Linuxなど他のPC-UNIXと基本的に同様なので、自力でインストールしたい場合には他プラットフォーム向けの文書を参考にしてください。

    http://mirror.cs.wisc.edu/pub/mirrors/ghost/GPL/current/

     しかし、GhostScriptのビルドには手間がかかります。本体とは別配布されているフォント集をインストールしなければならず、LIPSやESC/Pageなど各種プリンタ向けのGhostScript用ドライバも用意しておく必要があります。Finkなど、ビルド時にパッケージ間の依存関係を自動処理してくれるユーティリティを使うことが現実的でしょう。
     少し前のバージョンで構わなければ、有志ユーザが公開しているビルド済パッケージを利用させていただく手もあります。以下のURLでは、GPL/ESPGhostscript 8.15.4のLeopardおよびTiger向けのパッケージが公開されています。声を大にして言うほどの最新バージョンとの機能差はないため、はじめてGhostScriptを利用するには最適です。

    http://www2.kumagaku.ac.jp/teacher/herogw/index.html

     今回はGhostScriptの概要説明と導入方法に終始してしまいましたが、次回はどのようなことができるか、LaTeXなどのテキスト処理系でどのような役割を果たすかについて説明する予定です。

    ニュース解説   MOSAic

    ★★★ 開発関連のニュースはwebに掲載中 ★★★
    http://www.mosa.gr.jp/?page_id=1017

    ・12月のニュース
    http://www.mosa.gr.jp/?p=1476

    ◇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.