2007-02-20
目次
「Wonderful Server Life」 第38回 田畑 英和
〜アクセス権編〜
これまでACLのアクセス権について解説してきましたが、そのしめくくりとして、コマンドラインからのACLのアクセス権の管理方法について解説したいと思います。もちろん「ワークグループマネージャ」を使えばACLのアクセス権は管理できるのですが、コマンドライン上での管理ができればより応用の幅が広がります。
◇アクセス権の確認
それではまず「ワークグループマネージャ」で設定した既存のアクセス権をコマンドラインを使って確認してみます。次のように設定されたアクセス権をコマンドライン上で確認してみます。
・フォルダ名
Sample
・POSIXのアクセス権
オーナー:admin > 読み出し/書き込み
グループ:admin > 読み出し専用
全員: > 読み出し専用
・ACLのアクセス権
ユーザ:test > 読み出し関連のアクセス権をすべて許可
まずPOSIXのアクセス権を確認してみましょう。lsコマンドの-lオプションを使うことによりPOSIXのアクセス権を確認することができます。
$ ls -l
total 0
drwxr-xr-x + 2 admin admin 68 Feb 16 15:00 Sample
アクセス権が”rwxr-xr-x”と表示され、最初の3文字でオーナーは「読み出し/書き込み」、真ん中と最後の3文字で、それぞれグループと全員が「読み出し専用」に設定されていることが確認できます。
では次にACLのアクセス権を確認します。ACLのアクセス権を確認するには-lオプションにeオプションを追加します。
$ ls -le
total 0
drwxr-xr-x + 2 admin admin 68 Feb 16 15:00 Sample
0: user:test allow list,search,readattr,readextattr,readsecurity,
file_inherit,directory_inherit
さきほどのコマンドの実行結果にACLのアクセス権の表示が加わったことが確認できます。この出力結果から”test”ユーザに対していくつかのACLのアクセス件が設定されていることが確認できます。
コマンドライン上で表示されているアクセス権の名前と「ワークグループマネージャ」上で表示されるアクセス権の対応関係は次のようになります。これら以外にも、継承に関する設定が出力結果に表示されていることが確認できます。
・アクセス権の名前の対応関係
readattr:属性を読み込む
readextattr:拡張属性を読み込む
list:フォルダの内容を一覧表示/データを読み込む
search:フォルダをスキャン/ファイルを実行
readsecurity:アクセス権を読み込み
◇アクセス権の設定
では次にアクセス権を設定してみましょう。さきほどアクセス権を確認し「Sample」フォルダに新たにACLのアクセス権を追加してみます。ACLのアクセス権の設定には、POSIXのアクセス権の設定にも使用するchmodコマンドを使います。それでは、”test2″ユーザに対して”list”のアクセス権を許可してみます。
$ chmod +a "test2 allow list" Sample
$ ls -le
total 0
drwxr-xr-x + 2 admin admin 68 Feb 16 15:00 Sample
0: user:test2 allow list
1: user:test allow list,search,readattr,readextattr,readsecurity,
file_inherit,directory_inherit
アクセス権の設定後に、再度アクセス権を確認するとACLのエントリーが1つ追加されていることが分ります。ACLのエントリーには番号が割り振られていますが、この番号の若い順にアクセス権が処理されます。
既存のACLのアクセス権を削除することもできます。アクセス権の設定にはchmodコマンドの+aオプションを使用しましたが、削除を行うには-aオプションを使い、削除したいエントリーの番号を指定します。
$ chmod -a# 1 Sample
$ ls -le
total 0
drwxr-xr-x + 2 admin admin 68 Feb 16 15:00 Sample
0: user:test2 allow list
これで任意のアクセス権のエントリーを削除することができます。
◇ACLのアクセス権の有効化
lsやchmodコマンドを使ったACLのアクセス権の管理は、Mac OS X Serverだけでなく、Mac OS X上でも行うことができます。ただし、ACLを使用するにはボリュームに対してACLが有効に設定されている必要があります。
ルートボリュームに対してACLを有効にしたり無効にするにはfsaclctlコマンドを使用します。
・ACLを有効に設定
$ sudo fsaclctl -p / -e
・ACLを無効に設定
$ sudo fsaclctl -p / -d
ACLが有効化されていなボリュームでchmodコマンドを使ってACLのアクセス権を設定しようとすると次のようなエラーメッセージが表示されます。
$ chmod +a "tabata allow list" hoge
chmod: Failed to set ACL on file hoge: Operation not supported
つづく
小池邦人のCarbon API 徒然草(2007/02/16)
〜 Carbonモダンアプリケーションへの道(その10) 〜
今回は、CoreGraphics APIに頼らないテキスト描画を試してみます。処理が複雑になりがちなMLTE(Multilingual Text Engine)やATS(Apple TypeServices)のAPIを使うのではなく、割と簡単な操作でテキスト描画を実現できるAPIを探してみます。
まずは話の流れとして、MLTE(Multilingual Text Engine)の方を調べてみることにします。Carbon Frameworkの一部であるMLTEは、ある程度複雑なテキスト処理を実現したい時に用いられ、アプリケーション内に小規模のテキストエディタを実装することも可能です。関連するAPIや定数が定義されているヘッダファイルは、MacTextEditor.hでして、旧TextEdit APIのTETextBox()に相当するAPIなども準備されています。例えば、矩形領域にUnicode文字列やCFString文字列(CFStringRefで参照)を表示するAPIは以下の2つです。
OSStatus TXNDrawUnicodeTextBox(
const UniChar iText[], // 描画するUnicode文字列
UniCharCount iLen, // 文字列の長さ
Rect * ioBox, // 描画矩形領域
ATSUStyle iStyle, // フォント種類、サイズ、スタイ
ル
const TXNTextBoxOptionsData * iOptions ); // 描画時のオプション
OSStatus TXNDrawCFStringTextBox(
CFStringRef iText, // 描画するCFString文字列
Rect * ioBox, // 描画矩形領域
ATSUStyle iStyle, // フォント種類、サイズ、スタイ
ル
const TXNTextBoxOptionsData * iOptions ); // 描画時のオプション
TXNDrawUnicodeTextBox()はUnicode文字列の描画を行い、TXNDrawCFStringTextBox()ではCFString文字列の描画を行います。引数のiOptionsで参照するTXNTextBoxOptionsData構造体は、以下のように定義されています。
struct TXNTextBoxOptionsData
{
TXNTextBoxOptions optionTags; // オプションビット
Fract flushness; // テキスト描画方向
Fract justification; // ジャスティフィケーション
Fixed rotation; // 矩形領域の回転
void * options; // リザーブ(NULL指定)
};
このTXNTextBoxOptionsData構造体を設定すれば、かなり複雑なテキスト描画にも対応していることが分かります。しかし両者の引数を見ると、描画用矩形領域の指示にはRect構造体が利用されており、描画座標系もQuickDraw環境のままです。これらの点から推測しても、完全にモダンなAPIとは言い難いようです(笑)。また、フォント情報等を指定するための引数であるiStyleにはATSUStyleオブジェクトを渡す必要があり、こちらについてはATS(Apple TypeServices)の方のヘッダファイル(ATSUnicodeTypes.h)の定義を色々と参照する必要があります。
また、ATSUStyleオブジェクトを作成するのには、ATS APIであるATSUCreateStyle()(ヘッダファイルはATSUnicodeObjects.h)などを利用する必要があり、面倒な手続きをふまないと最終的なテキスト描画まで到達しません。APIとしては高機能なのですが、ウィンドウにちょっとしたテキストを描画したい目的には、少々複雑すぎる気がします。
まあ、フォントの種類やサイズにあまり頓着しないような簡単なテキスト描画であれば、ウィンドウの描画位置にあらかじめStatic Textコントロールを貼り付けておき、そこに以前に紹介したsetUnicodeControl()などのルーチンで、Unicode文字列を描画してやることも可能です。
void setUnicodeControl( ControlRef chd,HFSUniStr255 *ustr )
{
CFStringRef cfstr;
if( ! unicodeToCFString( ustr,&cfstr ) ) // UnicodeをCFString文字列に変
換
{
setCFStringControl( chd,cfstr ); // Static Textコントロールに表
示
CFRelease( cfstr ); // ControlRefをリリース
}
}
OSErr unicodeToCFString( HFSUniStr255 *ustr,CFStringRef *cfstr )
{
short err=1;
if( *cfstr=CFStringCreateWithCharacters( NULL,ustr->unicode,ustr->length
) )
err=noErr; // Unicode文字列ををCFString文字列に変換
return( err );
}
void setCFStringControl( ControlRef chd,CFStringRef cfstr )
{
if( cfstr )
{
SetControlData( chd,kControlNoPart,kControlEditTextCFStringTag,
sizeof(CFStringRef),&cfstr );
DrawOneControl( chd ); // コントロール(エキスと)描画
}
}
多くのケースはこれで事足りるかもしれませんが、さすがにこれだけでは機能が貧弱で汎用的には使えません。そこで、文字の回転などは必要ありませんから、もう少し簡単で便利なテキスト描画用APIはないものかと探してみると、ヘッダファイルのAppearance.hの中に目的のAPIを発見しました。それが、以下のDrawThemeTextBox()です。つまり「コントロール描画でテキスト描画を担当している汎用APIを直接使う」というアイデアです。
OSStatus DrawThemeTextBox(
CFStringRef inString, // 描画CFString文字列
ThemeFontID inFontID, // フォントID
ThemeDrawState inState, // 描画モード
Boolean inWrapToWidth, // 領域端で折返しをするか
const Rect * inBoundingBox, // 描画矩形領域
SInt16 inJust, // ジャスティフィケーション
void * inContext ); // CoreGraphicsのCGContextRef
DrawThemeTextBox()は、ウィンドウなどのカレントポート(Current Port)にテキストを描画します。このAPIも矩形領域指定にRect構造体を使いますので、やはりQuickDraw環境を引きずっている事は間違いありません。ただし、前記のTXNDrawCFStringTextBox()とは異なり、最後の引数でCoreGraphics環境のCGContextRefを指定することが可能ですので、CoreGraphicsの描画設定もそのまま引き継ぐことが可能です。つまり、描画する文字のカラーや形状等をCoreGraphics APIで指定できるわけです。
また、フォントIDにkThemeCurrentPortFontを指定すると、カレントポートのフォント設定でテキスト描画をします。つまり、描画する直前に行ったSetPortTextFont()などによるフォント設定が生きるわけです。QuickDrawのTextFont()、TextSize()、TextFace()などがすべてDEPRECATED指定で全滅したのにも関わらず、似たようなSetPortTextFont()、SetPortTextSize()、SetPortTextFace()が生き残っているのは、このAPIの存在が大きいのかもしれません(笑)。面白い機能としては、引数のinStateで、コントロール標準の描画モード(アクティブ、インアクティブ等)を複数の種類から選択可能です。
enum {
kThemeStateInactive = 0,
kThemeStateActive = 1,
kThemeStatePressed = 2,
kThemeStateRollover = 6,
kThemeStateUnavailable = 7,
kThemeStateUnavailableInactive = 8
};
例えば、描画文字列(CFStringRef)をcref、カレントポート(CGrafPort)をport、描画対象を(CGContextRef)ctxとして、(0,0,100,20)の矩形領域に12ポイント、角ゴ W3、ノーマル、中心合わせ、赤色でテキストを描画する場合は、以下の記述となります。
CGrafPort port;
CFStringRef cref;
CGContextRef ctx;
SetPortTextFont( port,-31551 ); // 角ゴ W3
SetPortTextSize( port,12 ); // 12ポイント
SetPortTextFace( normal ); // ノーマル
CGContextSetRGBFillColor( ctx,1.0,0.0,0.0,1.0); // 文字は赤色
SetRect( &drt,0,0,100,20 ); // 描画矩形領域
DrawThemeTextBox( cref,kThemeCurrentPortFont,kThemeStateActive,false,
&drt,teJustCenter,ctx );
筆者も、最近までテキスト描画用としてこのAPIを便利に使っていたのですが、自作アプリケーションをMac OS X 10.5(Leoperd)へ対応させる作業(さらなるモダン化)で幾つかの問題点に遭遇しました。次回はそのお話をしたいと思います。
つづく
SqueakではじめるSmalltalk入門 第79回 鷲見 正人
本連載では、Macと切っても切れない関係にあるSmalltalkについて、最近話題のSqueakシステムを使って紹介しています。
ここのところ、少々遠回りをしながら回数を割いて、簡易GUIビルダの作成をしてみました。一般の言語処理系(あるいは、Macを含めた一般のコンピュータシステム)における「編集-ビルド-デバッグ」サイクルとは異質の、ソフトを走らせながらでも開発を進めてゆくことができる…という、Smalltalkシステム(=暫定ダイナブックシステム)独自の「インクリメンタル」な開発スタイルを、ほんのさわりだけですが垣間見ていただけたことと思います。
いったんは完成にこぎつけたこの簡易GUIビルダですが、じつは、Smalltalkアプリとしては“うまくない仕組み”で動いています。具体的には、モデルとユーザーインターフェイス(ビュー及びコントローラ)の分離がきちんとできていないのですね。今後はこの点を、Smalltalk発祥でCocoaでもお馴染みのMVCライクなアーキテクチャを学びつつ、手直ししてゆくつもりです。
しかしその前に、近頃リリースされた新しいSqueakシステムのバージョンである「3.9」をご紹介がてら、Smalltalk環境の基本をおさらいすることにいたしましょう。この連載で使用するシステムも、この最新の3.9ベースに切り替えるので、連載を途中から読み始めて実際に環境を用意していなかった方も、この機会に以下の手順に従い、Squeakシステムのインストールとセットアップを試みてはいかがでしょうか。これからしばらく、すでにSqueakを使いこなしておられる方には冗長な内容になるかと思いますが、どうか我慢しておつきあいください。
▼Squeak3.9の入手と、その内容の簡単な解説
最新版を含むSqueakシステム(英語版)は、公式サイトであるsqueak.orgより入手可能です。ダウンロードページもありますが、トップページの右手にある「Downloads」枠にある「Mac」のリンクを利用する方が手っ取り早いでしょう。本稿執筆時点では、くだんのリンクは具体的には次のURLを指しています。
http://ftp.squeak.org/3.9/mac/Squeak3.9-7067mac%20vm%203.8.15beta1U.zip
ダウンロードが終わると、そのとき用いたソフト(たいていはSafariやFirefox)であらかじめ指定済みの場所に「Squeak3.9-7067mac vm3.8.15beta1U.zip」アイコンが現われるはずなので、それをダブルクリックで展開します。展開後に現われる「Squeak3.9-7067mac」フォルダには次の五つのファイルが収められています。「Squeak3.9-7067mac」フォルダは適宜「アプリケーション」フォルダやデスクトップなど、分かりやすい場所に移動しておいてください。
Squeak 3.8.15beta1U.app
Squeak3.9-final-7067.image
Squeak3.9-final-7067.changes
SqueakV39.sources
WelcomeSqueak39
Squeakシステムを動かすのに必須なのは「Squeak 3.8.15beta1U.app」と
「Squeak3.9-final-7067.image」の二つのファイルです。それぞれ「仮想マシン」「仮想イメージ」と呼ばれます。仮想マシンは「オブジェクトメモリ」と呼ばれるメモリとハードディスクの両方の特徴を併せ持つ特殊な仮想的記憶デバイスを、ホストOSであるOS Xが管理するメモリ空間内に作り出します。仮想マシンはさらに、指定された仮想イメージの内容をオブジェクトメモリ内に読み込ませ、Squeakシステムを動作させます。通常は、仮想イメージファイル(.image)を仮想マシンアプリ(.app)にドロップインすることで、以上の作業をいっぺんに済ませることが可能です。
SmalltalkシステムというのはALTOのOSだった時代からずっと、Macを含む通常のコンピュータシステムとは違った、かなり変わった方式で動いています。必要なときに補助記憶装置にあるファイルをメインメモリに読み込んでアプリを起動したり文書を開いたり…というお馴染みものではなく、扱うデータやプログラムはすべて「オブジェクト」としてオブジェクトメモリという仮想デバイス内に保持し、システムやアプリ(あるいはその文書)で必要なとき、必要なオブジェクト同士を構成要素として協働させ、機能させます。
ちなみにアラン・ケイは、Smalltalkシステムを「生命体」に、その唯一の構成要素で、互いに協働して機能するオブジェクトを「細胞」に、それぞれを例えることがあります。とかくALTOというとMacにとっての「GUIの始祖」とだけ連想しておしまいにされがちですが、暫定的な「ダイナブック」として見るならば、GUIよりはむしろこの特殊な“仕組み”とそれが実現する“メリット”(たとえば、冒頭に述べたソフトを走らせながらのインクリメンタルな開発手法が使える…とか)のほうがはるかに重要だったりします。
閑話休題。
残りの「Squeak3.9-final-7067.changes」と「SqueakV39.sources」は、仮想イメージ内のオブジェクトの定義を、それを記述したSmalltalkのソースコード片群として保持するテキストファイルで、それぞれ「チェンジ」「ソース」と呼ばれます。後者の「ソース」はごく初期のリリース時の仮想イメージの内容を反映していて“読み出し専用”なのに対し、前者の「チェンジ」はその後、システムに加えられた改変を逐次、追記し、記録するための“ログファイル”のように使われます。念のため、後者は「ソース」という名前がついていても、仮想マシンなどのソースコードファイルというわけではないので注意してください。また、チェンジやソースの内容は、仮想イメージ内のオブジェクトから参照されているので、テキストエディタで開いて読むことができるからといって、Squeak環境外で勝手に内容を書き換えてはいけません。
オブジェクトメモリ内の状況、すなわち、Squeak環境の“様子”は、好きなタイミングで仮想イメージとして保存することが可能で、この作業を「スナップショット」と呼ぶことがあります。情報は、起動時に用いた仮想イメージファイルに重ね書きすることも、別仮想イメージファイルを新たに作ってそこに保存することも可能です(当然ですが、重ね書きをすれば、以前の状態は永久に失われます)。新たに仮想イメージを作ったときは、同名のチェンジファイルも同時に作られます。なお、こうして作られた仮想イメージとチェンジは同名のものを常にペアで扱う必要があります(仮想イメージファイルの名前を変える必要があるときは、対応するチェンジファイルのリネームも同時に行なうことを忘れないようにしてください)。ソースファイルはひとつあれば、それを各ペアで共有できます。
▼Squeak環境の起動と終了
それでは、仮想イメージ「Squeak3.9-final-7067.image」を仮想マシン「Squeak 3.8.15beta1U.app」にドロップインしてSqueakシステムを起動しましょう。起動に成功するとホストOSであるOS Xの描くウインドウ内にSqueak環境のデスクトップが現われます。ちょうど、VMWareやVirtualPCなどのエミュレーションソフトが動作するときと似たような感じです。もし、仮想マシンに仮想イメージをドロップインしているにもかかわらず、仮想イメージを指定するようなダイアログが表示される場合は「Squeak3.9-7067mac」フォルダを日本語を含むフォルダに入れてしまっていないか確認してください。
動作しているSqueak環境を終了させるにはいくつかの方法があります。
●デスクトップメニューを使う
1. デスクトップをクリックして「デスクトップメニュー」をポップアップ。
2. 「quit」を選択して、「Save changes before quitting?」には「No」。
(ちなみにこのとき「Yes」を選べば、前述のスナップショットになります)
●ナビゲータフラップを使う
1. 右下の「Navigator」タブをクリックして“フラップ”を呼び出す。
2. 右端の「QUIT」ボタンをクリック。
3. 「Are you sure you want to Quit Squeak?」に「Yes」。
●ホストOSであるOS Xから終了の指示を出す
#(OS Xの)メニューバーの「File」から「Quit do not save」を選択。
最後のは環境内でデスクトップメニューやナビゲータフラップが使えないときの緊急時の終了のしかたで、通常のハードウエアでいうなら「リセット」、アプリケーションソフトなら「強制終了」に相当します。よって、通常は前二者のいずれかの方法で終了することをお薦めします。もっとも最後の方法でも、いきなり終了してしまうことで、作業中の内容を保存するタイミングを逸する可能性があることを除けば、さしたる支障はありませんが…。
次回は、日本語を扱うためのリソースの追加と、いつくかの設定を行ないます。
バックナンバー:
http://squab.no-ip.com:8080/mosaren/
ニュース・解説
今週の解説担当:木下 誠
———————————————————————-
DashboardでQuartz Composerを使う
———————————————————————-
Dashbaordの表現力を飛躍的に高めるためにQuartz Composerを使おう、という記事、「Enhance Your Dashboard Widgets with Quartz ComposerCompositions」が公開されています。
Quartz Composerは、Tiger登場当初はDashboardで使うことはできませんでしたが、10.4.7から可能になっています。また、JavaScriptを使って、QuartzComposerを細かく操作することもできます。
Enhance Your Dashboard Widgets with Quartz Composer Compositions
http://developer.apple.com/graphicsimaging/quartz/quartzcomposerfordashboard
.html
———————————————————————-
Java 10.4 Release 5が登場
———————————————————————-
Javaのアップデート、Java for Mac OS X v10.4 Release 5が登場しています。同時に、リリースノートも公開されています。
これには、夏時間(Day light saving)の変更に対する対応が含まれます。その他にも、多数の改良、バグ修正、が含まれます。詳しくは、リリースノートをご覧ください。
Java for Mac OS X 10.4 Release 5 Release Notes
http://developer.apple.com/releasenotes/Java/Java104R5RN/index.html
———————————————————————-
QuickTime Metadata APIのQA
———————————————————————-
QuickTimeのMetadata APIに関するQAが、2つ公開されています。このAPIを使う事で、メディアファイルに、アルバムのアートファイルや、アーティスト名といった情報を埋め込むことができます。
QA1508: Adding metadata to an iTunes file using the QuickTime Metadata APIs
http://developer.apple.com/qa/qa2007/qa1508.html
QA1515: Adding metadata to a QuickTime movie using the QuickTime MetaData
APIs
http://developer.apple.com/qa/qa2007/qa1515.html
———————————————————————-
BonjourのQA
———————————————————————-
Bonjourに関するQA、「Advertising a Bonjour service on a specific set of networking interfaces」が公開されています。
Bonjourを使うと、自分のマシンが提供しているサービスを、ローカルネットワーク上のすべてのデバイスにアピールできますが、それを特定のデバイスだけに限定する方法です。このようなことは可能ですが、NSNetServicesやCFNetServicesといったハイレベルAPIを使うのではなく、DNSServiceDsicoveryを使うことになります。
QA1513: Advertising a Bonjour service on a specific set of networking
interfaces
http://developer.apple.com/qa/qa2007/qa1513.html
◇MOSAからのお知らせと編集後記は割愛します◇