MOSA Multi-OS Software Artists

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

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

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

2007-02-27 

目次

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

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

■  〜アクセス権編〜

 アクセス権の解説は今回でひとまず区切りをつけますが、最後にアクセス権の管理と密接な関係にあるユーザ認証についてお話しておきましょう。ちなみにユーザ認証は英語で”Authentication”、アクセス権の判定は”Authorization”と呼ばれています。
 よく似た単語ではありますが、これらの処理はそれぞれ独立した異なる処理になっています。ユーザ認証(Authentication)は、ユーザ名やパスワードなどの情報に基づいてシステムを使用するユーザを認証する処理、アクセス権の判定(Authorization)は、ユーザ認証によって特定されたアカウントがシステム上でアクセス可能なリソースを判定する処理になります。
 つまりアクセス権の判定を行うにはあらかじめユーザ認証がおこなわれ、アカウントが特定されている必要があります。

◇ユーザ認証
 では、ユーザ認証がどのようにして行われるかをみてみましょう。ユーザ認証の代表な例としては、ログインウインドウでの認証があります。ログインウインドウでは、ログインするユーザの「名前」と「パスワード」を入力することにより認証を行います。つまり「名前」を使ってシステム上に存在するアカウントを特定するわけです。
 アカウントを登録するときには、「名前」のほかに「ユーザ名」の登録も行いますがログインウインドウでは「名前」だけではなく「ユーザ名」を使って認証を行うこともできます。つまり「名前」もしくは「ユーザ名」が分ればアカウントを特定することができるわけです。ではここでアカウントの「名前」と「ユーザ名」の仕様を再確認しておきましょう。それぞれ以下のような仕様になっています。

・名前
  最大長は255byte、ロングネームとも呼ばれる
  1byte文字の場合は255文字、3byte文字の場合は85文字まで
  フォーマット:UTF-8
・ユーザ名
  最大長は255byte、ショートネームとも呼ばれる
  最大16個登録可能(最低1つは必要)
  1つ目のフォーマット:A〜Z、a〜z、0〜9、_、-
  2つ目以降のフォーマット:UTF-8

 「名前」は1ユーザにつき1つのみ設定可能です。一方「ユーザ名」は、1ユーザにつき複数登録することが可能です。Mac OS Xのログインウインドウには「名前」と表示されていますので、ログイン時にいつも「名前」を入力している方をときどきみかけますが、「ユーザ名」を使ってもユーザの認証を行うことができます。一般的に「名前」にはフルネームで日本語を入力することが多いかと思いますので、ログインには英数字(および一部の記号)で構成される「ユーザ名」を使ったほうが便利でしょう。

◇アクセス権の判定
 「名前」または「ユーザ名」と、「パスワード」を使ってユーザ認証に成功したとしましょう。そうするとシステムを使用中のユーザが特定できたことになります。
 ユーザが特定できれば、あらかじめ設定しておいたアクセス権の情報に基づいて、ファイルやフォルダへのアクセスが制御されます。ファイルやフォルダにはオーナーやグループが設定されていますが、「ターミナル」、「ワークグループマネージャ」、「Finder」でオーナーを確認すると、オーナーは「ユーザ名」や「名前」で表示されます。
 ですが、POSIXのアクセス権を使用する場合、オーナーは内部的にはユーザID(UID)を使って管理されています。UIDはユーザ登録時に自動的に割り当てられ、idコマンドを使って簡単に調べることができます。UIDは次のような仕様になっています。

・UID
  500〜2,147,483,648の数値、100未満はシステム用に予約
  フォーマット:32ビットの数値


 UIDは単純な数値ですので、マシンが異なれば別ユーザに対して重複したUIDが割り当てられる場合があります。つまり「ユーザ名」や「名前」が違っていたとしても、マシン間でUIDが重複する場合があり、UIDが重複していればアクセス権が正しく守られないケースが出てきます。
 もちろんディレクトリサービスを利用してユーザをサーバ上で一元管理すれば、ユーザIDも一元管理することができます。しかしそれでもサーバ上のユーザとローカルマシン上のユーザとでユーザIDが重複することまでは防げません。

 一方、ACLのアクセス権を使用した場合にはUIDではなく、GloballyUniqueIdentifier(GUID)が使用されます。GUIDはMACアドレスとユーザを作成した日時に基づいて作成される128bitの文字列であり、マシンが異なってもユニークなIDが発行されるようになっています。ですのでUIDよりもGUIDを使ったほうが、ユーザを厳密に特定することができます。

・GUIDの一例
EB95D2CE-EBE3-12D8-9CD4-010391C630B0

つづく                               

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

 ご存知の方もいると思うが、「Yの悲劇」などで有名なアメリカの推理作家、エラリー・クイーンのいくつかの小説には「読者への挑戦状」というのが出てくる。「ここまでで事件の犯人を特定するために探偵が使う手がかりはすべて読者に提示されている。だから我と思わん読者は論理的に犯人を推定してみたまえ」というのだ。かっこいいねぇ。
 で、オレも「読者への挑戦状」というのをやってみようと思った。いやべつにこの連載で突然推理小説を書き始めようってんぢゃなくて、「いままで何ヶ月間かかけてCocoaにおけるドラッグ&ドロップの実現方法をみてきたわけだが、ほんぢゃこういう場合はどうやるのだろう、わかるかねアケチ君、ふはははは」というのを書こうと目論んだわけだ。

 Mac OS X 10.3以降の Cocoa には ObjectController のクラスが各種用意され、バインディングという技術を使うことで従来よりモデルとコントローラに関わるコーディングを大幅に減らせるようになった。オレも全部使ってみたわけぢゃないが、シェアウエアとして公開した xRadio (http://xemem.com からダウンロードできます、どうぞよろしく)では NSArrayController を使ってる。
 手順は簡単だ。Interface Builderのパレットから NSArrayControllerをドラッグしてきてインスタンシエイトし、こいつにモデルである Array をバインドする。具体的にはインスペクタのポップアップメニューから「Bindings」を選び、上から2番目「Controller Content」のところの「contentArray」に、そのArrayを参照するアクセスパス(どのオブジェクトにどんなメッセージを送ればその Array を獲得できるか)を記載する。これでArrayに対するアクションメソッド、insert: とかremove: 、fetch: などが使える。
 次にこれをビューにつなげる。まず、NSArrayControllerの「Attribute」インスペクタで、このArrayのメンバのクラス名を入力し(やってみるだけならNSDictionaryをお勧めする。簡単だから)、適当なキーを設定する。例えば「testData」にしますか。これがどういう意味かというと、Array の各メンバに対して objectForKey:@”testData” というメッセージを送ればなんか nil以外の値が返ってくるということね。そしたら新たに NSTableView を作り、NSTableColumn のインスペクタから「Bindings」を選ぶ。一番上の「Value」のところで上の NSArrayController へのバインドを設定、Model Key Path には当然 「testData」を指定する。ここまでやったら、contentArray として例
えば下のような Array を用意しよう。

NSMutableArray*     contentArray = [[NSMutableArray alloc] initWithObjects:
     [NSDictionary dictionaryWithObject:@"AppleScript"forKey:@"testData"],
     [NSDictionary dictionaryWithObject:@"Audio" forKey:@"testData"],
     [NSDictionary dictionaryWithObject:@"Carbon" forKey:@"testData"],
     [NSDictionary dictionaryWithObject:@"Cocoa" forKey:@"testData"],
     [NSDictionary dictionaryWithObject:@"Darwin" forKey:@"testData"],
     [NSDictionary dictionaryWithObject:@"Games" forKey:@"testData"],
     [NSDictionary dictionaryWithObject:@"Tools" forKey:@"testData"], nil];

 NSArrayController からの要求に応じてこれを返すようにしておくだけであら不思議、従来 NSTableDataSource Protocol に従って一所懸命書いてたコードのほとんどが不要になっちゃう。あんまり楽過ぎてだまされたみたいである。バインディング万歳。
 ところが問題はこっからなのだ。このやり方をするとこの NSTableView のdataSource アウトレットはnil のまま(嘘だと思ったら確かめてくれ)。なので、NSTableDataSource Protocol の一部であった TableView に関するドラッグ&ドロップのメッセージはどこにも来ない。つまり、前回までオレが解説したTableView 上のドラッグ&ドロップ・コードは使えない。ではどうするか。……これが「読者への挑戦状」である。

 と、言えたら良かったんだけどねぇ(笑)。
 白状すると、これを「挑戦状」とするべく一所懸命解決案を探したのだが見つからなかったのだ。どうも今のところ「オブジェクト・バインディングを使ってArrayの中身をテーブルに表示している場合、そのテープルのメンバに対するドラッグ&ドロップをサポートするのはとってもめんどくさい(NSTableView をサブクラスして、NSView上でのドラッグ&ドロップのように書けばできるんぢゃないかと思う。とっても面倒そうなのでやってみてないけど)ということらしい。「挑戦状」は撤回して「お知恵拝借」にするので、こうすればできるぢゃん、という人がいたらメールください。さて、次回からの
ネタを考えなくちゃ。
                            (2007_02_22)

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

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

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

 こんにちは、高橋真人です。
 前回からの続きですが、これからPowerPlant Xというアプリケーションフレームワークを借りて、オブジェクト指向と非オブジェクト指向の実装の違いについて見ていきます。ただ、PowerPlant Xを持ち出すからと言って、ここでPowerPlant Xの使い方についての解説を展開しようなどという大それたことを考えているわけではありません。それから、PowerPlant Xという「Carbon用のフレームワーク」を例に使うからと言ってCocoaを無視しようと考えているわけでもありません。
 むしろ私としてはCocoaに取り組み始めた、またはこれから取り組もうとしている人にも是非ともこれからの解説記事を読んでほしいと思っているのです。Cocoaはオブジェクト指向の技術を利用した優れた開発環境です。開発効率も柔軟性も、既存のオブジェクト指向開発環境の中でもトップクラスに位置するのではないかとすら思っています。その昔「使って天国、作って地獄」などと言われていたGUIアプリケーションを「気軽に構築できる」ようにしたその貢献度はかなりのものでしょう。
 しかし同時に、その気軽さゆえにCocoa自体に対しても気軽に取り組もうとする人が多い気がします。気軽に取り組むこと自体は必ずしも悪いことではないとは思いますが、せっかくCocoaという優れた開発環境を使えるのだから、見よう見まねで表面的に真似るのではなく、Cocoaの持つ真のパワーを可能な限り引き出してほしいと思うのです。そのためにはやはりどうしてもオブジェクト指向に対する理解が不可欠です。
 Cocoaの源流は、オブジェクト指向技術の中でも老舗級のものですので、Cocoaの各所にオブジェクト指向技術が使われています。よって、オブジェクト指向技術を学ぶことによってこそ、Cocoaの仕組みを効果的にかつ効率的に使うことができるのだと思います。

 それではなぜ解説にCocoaを使わないのかと言いますと、それはCocoa自体がMac OS Xと非常に高い親和性を持っているため、言語と開発環境を切り離して解説することが難しいのです(単に私の能力の問題かもしれませんが)。
 それに対してCarbonはもともとC言語で使われることを想定して構築されたフレームワークですから、ただのCから使う場合と、PowerPlant XというC++で書かれたオブジェクト指向開発環境から使う場合の違いを並べて比較することが容易です。これが今回の説明にCarbonを使う理由です。

 それでは早速GUIアプリケーションの構造についてのお話をしていきましょう。まずはイベントループというものについてです。
 私が最初にMacのプログラミングに取り組んだ時、イベントループというものはMac独自のものかと思っていました。結果的に言えば、この私の理解は間違っていたのですが、その当時の私の身の回りにあったシステムにイベントループを持ったものがなかったことも事実です。たとえば、少しだけ仕事で書いたNECのPC9800シリーズのプログラムはMS-DOS上で動作していましたから、これもイベントループという概念とは無縁でした。
 では、そんなイベントループとはどういうものでしょうか?

 コンピュータがプログラムを動かす場合、そのプログラム自体は「指示書」であると言えます。コンピュータはこの指示書を読んでプログラムを起動させ、走らせるわけですが、特に何かの理由でもない限りコンピュータは黙々と指示書に書かれている手順を順に休みなく処理していきます。そして指示書の最後まで到達すると、コンピュータはプログラムをそこで終了させます。
 今、「黙々と」という表現を使いましたが、コンピュータの処理は人間の感覚から見るととても速いので、印象としてはまさに「一目散に駆け抜ける」という感じです。例えば文字列を5つ、順に表示するようなプログラムを書いた場合、コードを書く人間の側にとっては「文字列を、一つずつ」という感覚であったとしても、それがプログラムになって走る場合は、5つの文字列全部がいっぺんに書き出される感覚です。
 皆さんには以下のような経験はないでしょうか?
 私が最初にGUIアプリケーションにチャレンジした時に、「とりあえず、まずはウインドウを一つ表示してみよう」というわけで、見よう見まねでシステムの初期化のコードを書き、メニューの構築をし、ウインドウを作成し、表示するところまでをやっとの思いで書き上げ、「さあ!」と走らせてみたところ、画面には何の変化も起こらずに「あれ?」となったのです。「どこかコードを書き間違えたかな?」と何度も確認して試してみても結果は変わりませ
ん。
 これはまあ、初心者の多くが最初に経験する勘違いの一つですが、実はウインドウはちゃんと表示されています(プログラム的には)。しかし、表示された直後にプログラム自体が終了してしまっているため、ウインドウは表示されるやいなや閉じられ、始末されてしまったのです。
 こんな時、特にANSI CのHello world!を経てからここに到達している人の場合、この状況がすぐに飲み込めません。「Hello world!は、ちゃんと消えずに残っているのに、何でウインドウは消えちゃうの?」と。しかし、普通でないのは実はHello worldの方なのです。
 よぉーく考えてみてください。その文字列を表示しているプログラムはどのプログラムですか? それはあなたの書いたプログラムなんでしょうか?
 printf(“Hello world!\n”);のすぐ次にreturn 0;と書いて、そこでプログラムが終了していることは分かっているのに、Hello worldという文字列を表示しているのが自分のプログラムだと漠然と誤解している人が案外多いような気がします(私もそうでした)。
 プログラムをどのような環境から起動したかにもよりますが、例えばXcodeからHello worldプログラムを起動したとしますと、その文字列を表示したままにしてくれているのは、Xcodeなわけです。考えてみれば当然ですよね。
 あなたのプログラムは、printf()という関数を使って、Xcodeに対して(間接的にですが)「この文字列、表示しといてねっ」と言ったと思うや、とっとと走り去っていってしまうのです。
 そういうわけで、先のウインドウを表示するプログラムの場合、ウインドウを開いたままにしていてくれる人(?)は誰もいませんから、プログラムの終了と同時にウインドウ自体も消滅してしまったわけなのです。
 このように、プログラムというのはとてもせっかちな動き方をします。特別なことをしなければ、そこに止まって、人間の指示を待ってくれるようなことはしないのです。
 そこでプログラムを「終了させてしまわないための仕組み」が必要になるのですが、この時に使うのが、ループです。whileとかforとかいう例のアレです。
 「とりあえずその辺を回ってて」と、同じところをグルグル空回りさせておいて、用事ができたらそこで指示を出して処理をさせます。これがイベントループです。
 かなり擬人化した説明になってしまいましたが、何となくイメージは湧きましたでしょうか? 次回はもう少しシステム的な説明をしたいと思います。

ニュース・解説

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

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

【開発環境】

Apple社のウェブサイトで、WWDC2007における大まかなセッショントラックが発表になりました。ただし細かなセッション内容はまだ不明です。それぞれのトラックについて「Learn more…」をクリックし詳細を見ても、今まで発表があった範囲以内の技術内容であり、あまり目新しい点はありません。

http://developer.apple.com/wwdc/tracks/

6つのトラックが用意されるようですが、やはり一番の注目は「LeopardInnovations」でしょう。WWDC2006以降、Leopardに関する大きな発表は無いのですが(SF Expoでも完全に無視された)、WWDC2007では、Leopard(Mac OS X10.5)はとっくの昔にデベロッパの手元にあり、皆がそれを操作しながらセッションを聞くことが可能であると信じたいところです(笑)。

また、良くある質問(Q&A)を掲載した「Frequently Asked Questions」サイトと、学生向けの奨学金制度を説明した「WWDC Student ScholarshipProgram」サイトもオープンしています。学生の方で奨学金制度に興味のある方は覗いてみてください。

http://developer.apple.com/wwdc/faq/

http://developer.apple.com/wwdc/students/

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

前回から2月23日の期間中、Apple社のGuidesとReferenceサイトにはドキュメントがひとつも登録されませんでした。ただし、リリースノートがひとつだけ登録されています。つい最近アップデートされた「Java for Mac OS X 10.4Release 5」に関するものです。また、デベロッパ向け読み物も3つ登録されています。

リリースノート

「Java for Mac OS X 10.4 Release 5 Release Notes」

http://developer.apple.com/releasenotes/

「ADC Developer Pavilion at Macworld 2007」(読み物)
http://developer.apple.com/business/pavilion/2007/index.html

「Lineform: From Student Project to Retail Distribution」(読み物)
http://developer.apple.com/business/macmarket/lineform.html

「Enhance Your Dashboard Widgets with Quartz Composer Compositions」(読み物)
http://developer.apple.com/graphicsimaging/quartz/quartzcomposerfordashboard
.html

前回から2月23日の期間中、新規テクニカルノートはひとつも登録されません
でしたが、新規テクニカルQ&Aの方は4つ登録されました。QuickTime関連が多
いようです。

QA1508「Adding metadata to an iTunes file using the QuickTime Metadata APIs」
(初版)
QA1512「Video Digitizers – Adding Clean Aperture and Pixel Aspect Ratio
Information」(初版)
QA1513「Advertising a Bonjour service on a specific set of networking
interfaces」(初版)
QA1515「Adding metadata to a QuickTime movie using the QuickTime MetaData
APIs」(初版)

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

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

前回から2月23日の期間中、Apple社のSample Codeサイトには、サンプルソースコードが2つ登録されました。両方とも新版ではなく改良版としての再登録です。

「UIElementInspector」(Accessibility関連)
「SoftVDigX」(QuickTime関連)

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

【デベロップメント SDK】

前回から2月23日の期間中、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/?page_id=850
Apple、Mac OSは米国アップル社の登録商標です。またそのほかの各製品名等
はそれぞれ各社の商標ならびに登録商標です。
このメールの再配信、および掲載された記事の無断転載を禁じます。
特定非営利活動法人MOSA  http://www.mosa.gr.jp/
Copyright (C)2007 MOSA. All rights reserved.