MOSA Multi-OS Software Artists

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

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

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.