2007-02-13
目次
「Wonderful Server Life」 第37回 田畑 英和
〜アクセス権編〜
今回はACLのアクセス権の設定方法について解説します。ACLのアクセス権を使用するにはまずボリュームごとにACLのアクセス権の有効/無効を設定します。
ボリュームごとの設定には、「ワークグループマネージャ」を使用します。ツールバーの「共有」をクリックし、左側のリストから「すべて」を選択し、ACLを有効にしたいボリュームを選択します。次に、画面右側で「一般」をクリックし、「このボリュームでアクセス制御リストを有効にする」を選択し、画面右下の「保存」ボタンをクリックします。
これで、設定したボリューム上でACLのアクセス権が有効になります。
・「ワークグループマネージャ」でACLを有効に設定
http://homepage.mac.com/htabata/MXS10.3/img/WGM_Sharing/WGM_10.png
ACLのアクセス権を有効にしたボリューム上では、「ワークブループマネージャ」を使って任意のフォルダにACLのアクセス権が設定できるようになります。「ワークグループマネージャ」ではフォルダに対してしか直接ACLのアクセス権を設定することができません。ACLを使ってファイルのアクセス権を管理するには、前回説明した継承の機能を使って管理します。
ACLのアクセス権を設定するには、画面左側のリストでアクセス権を設定するフォルダを選択し、「ユーザとグループ」ボタンをクリックして「ユーザとグループ」パネルを表示します。「ユーザとグループ」パネルは、ローカルドメインのリストと共有ドメインのリストを切り替えて表示できるため、現在どのドメインのアカウントを表示しているのかを意識しながら作業を行うようにしましょう。表示するドメインは、パネル上部のポップアップメニューから切り替えることができます。
・「ユーザとグループ」パネル
http://homepage.mac.com/htabata/MXS10.3/img/WGM_Sharing/WGM_06.png
次に、「ユーザとグループ」パネルからACLのアクセス権を設定したいユーザもしくはグループを選択して、「アクセス制御リスト」にドラッグ&ドロップします。ACLのアクセス権では複数のユーザおよびブループに対してアクセス権を設定することができます。
ACLには13種類のアクセス権があると前回解説しましたが、フォルダに対して設定した複数のユーザおよびグループに対して、個別に13種類のアクセス権を設定できます。また、アクセス権には「許可」と「拒否」の2種類のタイプがあります。アクセス許可を与えたい場合には「タイプ」を「許可」に設定し、許可したいアクセス権を指定します。逆に「タイプ」を「拒否」に設定すれば、アクセスを許可しないアクセス権を指定することができます。
ACLのアクセス権は順番に意味があり、「許可」のアクセス権を設定していた場合には、上から順番にリスト上のアクセス権が判定され、関連するアクセス権がすべて足し合わされた結果がユーザに適用されます。一方「拒否」のアクセス権を設定した場合、リスト上でそれ以降に設定した「許可」のアクセス権よりも優先されます。
・アクセス制御リストの設定
http://homepage.mac.com/htabata/MXS10.3/img/WGM_Sharing/WGM_11.png
リスト上で選択可能なアクセス権は「フルコントロール」、「読み出し/書き込み」「読み出し」「書き込み」となっており、大まかな設定しかできませんが、「カスタム」を選択すると13種類あるすべての種類のアクセス権を設定することができます。「カスタム」の設定ではアクセス権のタイプの設定に加えて、継承の設定なども可能です。
・カスタム設定画面
http://homepage.mac.com/htabata/MXS10.3/img/WGM_Sharing/WGM_12.png
リストでは他にも継承の有無や、継承の適用先を確認することができます。上位のフォルダからアクセス権を継承していれば、継承したアクセス権が表示されます。継承したアクセス権を直接変更することはできませんが、もし継承しているアクセス権を取り除きたい場合には、取り除きたいアクセス権をリスト上で選択し、画面右下のアクションメニューから「継承したエントリを取り除く」を選択すると取り除くことができます。
既存のアクセス権が特定のユーザに対してどのように適用されるかを確認するにはアクションメニューから「有効なアクセス権インスペクタを表示」を選択し、表示されたインスペクタに「ユーザとグループ」パネルからアクセス権を確認したいアカウントをドラッグ&ドロップします。
・アクションメニュー
http://homepage.mac.com/htabata/MXS10.3/img/WGM_Sharing/WGM_13.png
・有効なアクセス権インスペクタ
http://homepage.mac.com/htabata/MXS10.3/img/WGM_Sharing/WGM_14.png
つづく
藤本裕之のプログラミング夜話 #108
指折り数えてなんと連載108回目である。私の子供のころ、星一徹は息子の飛雄馬に「野球のボールにある108つの縫い目は人間の煩悩だ」と言ったが(言ったっけ? そんな気がするだけかな?)、メジャーリーグで使ってるボールも縫い目の数は同じなんだろうか? もしそうなら、アメリカ人に「野球のボールの縫い目の数は108で、これは東洋思想で人間が生涯に直面する葛藤(煩悩っても通じないだろからね)の数と言われているんだ」とか言うと受けそうな気がするんだが(しませんか)。
さて、そんなことより前回の続き。NSTableView のアイテムをドラッグ&ドロップし、その表示順を変更しようという処理の最後は、そのドロップを受け取るこのメソッドである。
- (BOOL)tableView:(NSTableView *)aTableView
acceptDrop:(id
これの中身をだらだら書くと分かりにくいので、何をするか、しなければならないかを順を追って見ていくことにしよう。
1)引数 info から draggingPasteboard を獲得し、中に格納されている(つうかドラッグ開始のときに自分で格納した)NSIndexSet を復元する。復元するには以下のように NSUnarchiver を使えばいい。
NSIndexSet* indexSet = [NSUnarchiver unarchiveObjectWithData:
[pb dataForType:PXLibOrderPboardType]];
2)この indexSet を走査して、選択されているインデックスのアイテムをデータソースから抜き出し、別の配列にセットする。この際、もし抜き出すインデックスが最終的にこれらをインサートする場所(引数 row )より小さければ、row を減算する。これ、分かりにくいかな。例えば NSTableView に現在10個のアイテムがあり、そこから0番目、3番目、7番目を選んで(commandキーを押しながらマウスクリックするとこういう選択が行える)ドラッグを始め、2番目のアイテムの上にドロップしたとすると row には「2」が入ってくるんだけど、実際に挿入を行うときにはその前にある0番目のアイテムが無く
なっているので、挿入するべき位置はその時点で1番目のアイテムの上になるわけ。いいですか? ここだけコードを書くとこんな感じかな。
unsigned int loc;
NSMutableArray* moveArray = [NSMutableArray arrayWithCapacity:0];
unsigned int indexToMove = [indexSet firstIndex];
while(indexToMove != NSNotFound){
[moveArray addObject:[sourceArray objectAtIndex:indexToMove]];
if(indexToMove < row){
--row;
}
indexToMove = [indexSet indexGreaterThanIndex:indexToMove];
}
[sourceArray removeObjectsInArray:moveArray];
3)最後に抜き出したアイテムを挿入位置にインサートする。まぁこれは以下のごとく簡単な処理なんだけど(なんで reverseObjectEnumerator を使ってるかはわかるよね)、
NSEnumerator* bEm = [moveArray reverseObjectEnumerator];
id item;
while( item = [bEm nextObject]){
[sourceArray insertObject:item atIndex:row];
}
なんでこの時に、2で使った removeObjectsInArray: みたいに Array の中身全部を一度にインサートしちゃうメソッドがないのであろうか。Mac OS X10.4では、NSMutableArray に
- (void)insertObjects:(NSArray *)objects atIndexes:(NSIndexSet *)indexes
というのが追加されたのだが、これも objects の中身の数だけ indexes の方も用意しなくちゃならず、あんまり面倒さが軽減しないん気がするんだよね。
NSRange indexRange = NSMakeRange( row, [moveArray count] );
NSIndexSet* indexSet =
[NSIndexSet indexSetWithIndexesInRange:indexRange];
[sourceArray insertObjects:moveArray atIndexes:indexSet];
ね、そう思いませんか?
(2006_02_09)
高橋真人の「プログラミング指南」第106回
〜再利用化について(2)〜
こんにちは、高橋真人です。
さて前回の最後に「次回はオブジェクト指向が再利用化をどのように実現しているのかを見ていきたい」と書きました。この段階で私の頭には「何らかのサンプルコードを使い、CとC++での違いを解説しよう」という考えがあったのですが、その後いろいろ考えてみた結果、実際にそれを行うことがどうもそんなに簡単ではないという結論に至りました。
既存のサンプルを引き合いに出すにも、なかなか適したものが見つからないし、かといって自分でイチから仕立て上げても具合の良いものができそうにも思えません。そんなわけで、説明のためのサンプルを使うことは諦め、最初から実用のために設計されたものを使って解説することにしました。
具体的にはPowerPlant XというC++で書かれているCarbon用のフレームワークを取り上げます。PowerPlant Xと言えば、実用のために作られたオブジェクト指向のフレームワークですから、実例としてはこれほど適したものはないと思う部分もないではありませんが、PowerPlant X特有のクセというか設計方針のために、かえって説明が厄介になる部分も出てきそうな気がしないでもありません。
もっとも、これはPowerPlant Xに限った話ではなく、実用のために作られたシステムというのは多かれ少なかれ何らかの「辻褄合わせ」があるものです。この世は決して理想だけで成り立っているわけではありませんから、個々の仕組みごとにそれぞれの「事情」は当然あるわけです。
余談ですが、メーカーがこれらのシステムを語る場合、ほとんどその「裏側の事情」を隠すのが常です。まさに宣伝文句に乗せられて、買ったり導入したりしてみたものの、肝心なところになって「げ、これってこんなこともできなかったの?!」なんて叫び声を上げることは、実は世間では珍しくないことなのです。
さてそんなわけで、これからPowerPlant Xを材料にして、非オブジェクト指向とオブジェクト指向でのアプローチの違いについて解説していくことになるわけですが、この連載は主要読者層は「GUIアプリケーション未経験者」(もちろんプログラミング対象としての)です(知らなかった人は憶えておいてくださいね)。なので、いきなり「PowerPlant XがCarbonアプリケーションをどのように実現しているのか」という方向に切り込むと読者が付いてこれなくなる危険性が大きいので、GUIアプリケーションの基本的な構造を解説するところから始めてゆっくりと話を進めて行きたいと思います。
とはいえ、ここから具体的な話に踏み込んで行くにはちょっと中途半端なので、今回の残りの部分では、PowerPlant Xの基礎知識とでもいうべきところについてをお話しします。
PowerPlant Xは、今までも何度か話題にしてきたPowerPlantの後継のフレームワークです。設計者は、Think Class Libraryというオブジェクト指向フレームワーク(Symantec社から出されていたThink Cという開発ツールに付属していた)を作った後に、MetrowerksでPowerPlantを手がけた人ですので、その意味でPowerPlant Xは「過去の経験を存分に生かした」設計になっていると言うことができます。
PowerPlantも、アプリケーションフレームワークとしてはかなり柔軟性が高いと評価されていましたから、その経験を踏まえたPowerPlant Xがさらによいものになっていると考えるのは自然なことです(もちろん、「必然」ではありませんが)。
PowerPlant Xでは、ターゲットをMac OS Xのみに絞り、Mac OS 9との互換性、つまりCarbonLibを切り捨てました。よって、イベントモデルも最初からCarbonイベントモデルになっています。
ところで、オリジナルのPowerPlantが登場したのは1993年ごろのようですが、C++の世界では97年に大きな規格の拡張がありました。このときに正式にC++の機能の一部なったテンプレートという仕組みは、言語の設計者が予想していたよりはるかに多角的な活用をされるに至り、今やC++にとってなくてはならない機能となっています(ある意味テンプレートの導入により別の言語になってしまったとすら言えるくらいです)。
そんな背景もあって、PowerPlant XはPowerPlantとは全く設計が異なり、このテンプレート機能を積極的に取り入れています。
このように、「新しい時代のフレームワーク」として、絶大な期待(をしたのは、私だけ?)と共に登場したPowerPlant Xですが、ご存知のように「時代の流れ」に勝つことはできずに不運な運命をたどることになってしまいました。今でもオープンソース*として生き続けてはいるものの、お世辞にも活発に利用されているとは言い難いのが現状です。私の知る限り日本で使っている人は私以外に聞いたことがない、という悲しい状況なのもさらに涙を誘います。
*注:http://sourceforge.net/projects/open-powerplant
まあ、そんなこんなでPowerPlant Xを使ってこれからお話をしていくわけですが、できればXcode上で動かせるように私もちょっとチャレンジしてみようと思っています。(たぶん、既にやっている人はいるはずなんですが)
ニュース・解説
今週の解説担当:小池邦人
● Carbon ドキュメント & サンプル & SDK ナビゲーション(2006/02/09)
【開発環境】
WWDC2007の日程が発表されました。6/11-6/15(サンフランシスコ)だそうです。
http://developer.apple.com/wwdc/
開催期間が例年通りの季節に戻りました。昨年のように渡航費と宿泊費がピークの8月ではなくてなによりです。6月がカルフォルニアでは春なのかどうかは人によって意見が分かれるところですが、Leopard(Mac OS X 10.5)の発売開始日は、この開催日程に合わされるかもしれませんね。そして注目度ナンバーワンのiPhoneも同じく...。
昨年の参加者は4700人だったそうですが、もしそうだとすると、今年はもっと参加者が増えるかもしれません(会場のキャパは大丈夫か?)。参加者締め切りなどと言う前代未聞の事態が起こらないともかぎりませんから、今年は早めに参加手続きをしておいた方が良いかもしれません。そして、さらにランチが不味くなるような嫌な予感がするのは私だけでしょうか(笑)。
【テクニカルドキュメント】
前回から2月9日の期間中、Apple社のGuidesとReferenceサイトには月例の更新により数多くのドキュメントが登録されました。しかし、その中で内容が大きく更新されたのはたったひとつだけでした。「Resource Programming Guide」では、CocoaやCarbonアプリケーションにおけるリソース(Nibファイル、アイコンファイル、ローカライズテキストなど)の取り扱いが詳しく解説されています。また、デベロッパ向け読み物もひとつだけ登録されています。
「Resource Programming Guide」(PDFあり)
http://developer.apple.com/documentation/index-rev-date.html
http://developer.apple.com/reference/index-rev-date.html
「Kerberos: Highly Secure Single Sign On Authentication in Mac OS X」(読み
物)
http://developer.apple.com/opensource/kerberosintro.html
前回から2月9日の期間中、新規テクニカルノートはひとつも登録されませんでしたが、新規テクニカルQ&Aの方は3つ登録されました。alut.hはOpenAL frameworkから外されてしまったようですね(10.4.7から)。
QA1504「The header file 'alut.h' is missing from the OpenAL framework」(初
版)
QA1360「Describing the kSecTrustResult- Unspecified」(初版)
QA1468「NSOpenPanel - Choosing any file and ignoring packages」(初版)
http://developer.apple.com/technicalqas/index-rev-date.html
【サンプルソースコード】
前回から2月9日の期間中、Apple社のSample Codeサイトには、サンプルソースコードがひとつだけ登録されました。これは以前からあったサンプルの再登録なのですが、CocoaをCarbonやC++ルーチンと併用する簡単な例題を示しています。
「Cocoa_With_Carbon_or_CPP 」(Carbon&Cocoa関連)
http://developer.apple.com/samplecode/index-rev-date.html
【デベロップメント SDK】
前回から2月9日の期間中、Apple社のSDKサイトには新しいSDKがひとつも登録されませんでした。
http://developer.apple.com/sdk/
◇MOSAからのお知らせと編集後記は割愛します◇