2008-09-09
目次
「Wonderful Server Life」 第77回 田畑 英和
〜「サーバ管理」編〜
これまで「サーバ管理」を使った共有ポイントの作成やAFPサービスの設定方法について解説してきました。Mac OS X Serverでファイルサービスを実現する場合、クライアントがMacのみの場合はAFPサービスを利用するのが最も効果的ですが、Windowsクライアントなども混在している場合には他のサービスも利用する必要があります。
これはクライアントのOSによってサポートしているファイルサービスのプロトコルが異なるためです。Mac OS X Serverではファイルサービスとして次のようなプロトコルを使用することができます。
AFP:Mac向け
SMB:Windows向け
NFS:Unix向け
FTP、WebDAV:マルチプラットフォーム向け
それでは今回は「サーバ管理」を使ったSMBサービスの設定について解説していきましょう。大まかな設定手順はAFPの場合と同様です。まずは共有ポイントを作成し、次にサービスの設定を行います。
◇SMB共有ポイントの作成
共有ポイントの作成はプロトコルには依存しませんので、AFPのときと同様に「サーバ管理」を使って共有ポイントを作成します。ただし、プロトコルオプションはプロトコルごとの設定になります。
SMBでもAFPと同様に、共有ポイントごとにゲストアクセスを許可したり、カスタム名を設定することができます。またロックの設定としてoplockとstrict lockingの2種類の設定があります。ただしLeopard Serverではstrict lockingを有効にすることができません。
また、デフォルトのアクセス権の設定があり、上位のアクセス権を継承したり、特定のアクセス権を設定できたりするのですが、Tiger ServerのころはACLのアクセス権を有効にしていた場合、SMBのデフォルトのアクセス権は設定できませんでした。ところがLeopard ServerではデフォルトでACLのアクセス権が有効であるにもかかわらず、SMBのプロトコルオプションではデフォルトのアクセス権が設定できてしまいます。
ただし、デフォルトで特定のアクセス権を設定するようにしても実際には反映されないようです。どうもLeopard ServerではSMBのプロトコルオプションの設定がいまいち整備されていません。
・「プロトコルオプション(SMB)」設定画面
http://www.htabata.com/img/MXS105/smb/sharing_01.png
◇SMBサービスの設定
SMBサービスの設定項目はTiger Serverと同じですので、Tiger Serverでの管理経験があれば設定は簡単でしょう。ですが、AFPと同様にデフォルトの状態でもサービスを開始すればすぐにSMBのファイルサービスを提供することができます。設定は「一般」「アクセス」「ログ」「詳細」の4画面から構成されています。
・「一般」設定画面
http://www.htabata.com/img/MXS105/smb/smb_admin_01.png
ここでは「役割」の設定がありますが、たんにファイルサービスとして使用する場合にはデフォルトの「スタントアロンサーバ」のままでかまいません。
・「アクセス」設定画面
http://www.htabata.com/img/MXS105/smb/smb_admin_02.png
サービスの設定としてゲストアクセスの設定があります。これもAFPと同様に、実際にゲストアクセスを許可するには共有ポイントごとにゲストアクセスが有効になっている必要があります。
・「ログ」設定画面
http://www.htabata.com/img/MXS105/smb/smb_admin_03.png
出力するログのレベルを低/中/高の3段階で設定できます。ログは「サーバ管理」から参照することができ、保存場所は「/var/log/samba/log.smbd」です。
・「詳細」設定画面
http://www.htabata.com/img/MXS105/smb/smb_admin_04.png
ブラウズやWINSに関する設定を行います。このあたりの設定を正しく理解するにはWindowsネットワークに関する知識も必要になってきます。またコードページ(エンコーディング)に関する設定もあるのですが、Leopard Serverではいくら設定を変更しても、デフォルトの「ラテンUS」に戻ってしまいます。プロトコルオプションの設定といい、なんだかLeopard ServerのSMBは不可解な部分がみうけられます。
次回へつづく
小池邦人のCarbon視点でCocoa探求(2008/09/05)
〜 ディレクトリなのか? 画像ファイルなのか? 〜
今回は、addImagesThread:のループ内から呼ばれているaddImagesPath:メソッドのソースコードを解説することからImageBrowserへの画像登録処理の話を続けたいと思います。以下が addImagesPath:メソッドです。
- (void)addImagesPath:(NSString*)path
{
NSArray *content;
NSInteger i,ct;
BOOL dir;
[[NSFileManager defaultManager] fileExistsAtPath:path isDirectory:&dir];
if( dir ) // パス名はディレクトリを指す
{
if( [[NSWorkspace sharedWorkspace]
isFilePackageAtPath:path]==NO )
{ // パス名がパッケージではない場合はその内容を得る
content=[[NSFileManager defaultManager]
directoryContentsAtPath:path];
ct=[content count]; // 配列個数を得る
for( i=0;i
このメソッドの役割は、ユーザがファイル選択ダイアログで選んだパス名(複数選ぶことも可能)が、ディレクトリ(フォルダ)なのか? 単独の画像ファイルなのか? を判断して処理を切り分けることです。CocoaのFundationフレームワークでファイル処理を実行する場合には、NSFileManagerクラスを用います。実際には、NSFileManagerオブジェクトをその都度確保するのではなく、defaultManagerクラスメソッドを呼び出して、その結果得られたオブジェクトに対してファイル処理用のメッセージを送ります。
先頭のfileExistsAtPath:isDirectory:メソッドにより、渡されたパス名(NSString)がディレクトリを指すのか? 単独ファイルを指すのか? を判断しています。パス名が単独ファイルであれば、処理をそのままaddImageOne:メソッドへ引き継ぎます。そうではなくパス名がディレクトリを指している場合には、isFilePackageAtPath:メソッドにより、そのディレクトリがパッケー
ジ構造(Mac OS Xのアプリケーションなど)なのかどうかを確認しています。この判断を怠ると、パッケージ内の画像ファイルもすべて抽出して登録してしまうことになりますので注意してください。
純粋なディレクトリの場合にだけ、directoryContentsAtPath:メソッドを利用して、その内容をNSArray配列に格納します。この時に得られる内容とはディレクトリか単独ファイルのパス名ですので、配列個数分を再びaddImagesPath:メソッドに渡して再帰処理(リカーシブ処理)を行います。これにより、選択されたディレクトリより下の階層に含まれてる画像ファイルがすべてサーチされ、そのままImageBrowserへと登録されることになります。例えばルートディレクトリを選べば、その下階層の全画像ファイルがサーチされることになりますので、登録できる画像数には何らかの制限(最大数)を付けておいた方が良いかもしれません。
最終的には、すべての単独ファイルのパス名が抽出されて、以下のaddImageOne:メソッドへと処理が渡ります。
- (BOOL)addImageOne:(NSString*)path
{
NSString *path1,*comf;
BOOL ret=NO;
ImageFile *imagef;
NSMutableArray *arry;
NSFileHandle *fhd;
if( path1=resolveAlias( (CFStringRef)path ) ) // エイリアスファイルかどうか?
path=[path1 autorelease]; // エイリアスからのパスを再代入
if( comf=[MyDocument isImageFile:path] ) // 画像ファイルかどうか?
{
if( imagef=[[ImageFile alloc] init] ) // 画像ファイルの場合ImageFileを作成
{
imagef.path=path; // パス名を登録
imagef.type=comf; // ファイル情報を登録
[temp addObject:imagef]; // ImageFileをtemp配列に追加
[imagef release];
ret=YES;
}
}
else // それ以外のファイルでは「しんぶんし 3」のドキュメントかどうか判断
{
if( fhd=[NSFileHandle fileHandleForReadingAtPath:path] ) // そうである!
{
if( arry=[NSUnarchiver unarchiveObjectWithData:
[fhd availableData]] )
{ // ドキュメント読み込む
[temp addObjectsFromArray:arry]; // 内容をtemp配列に追加
ret=YES;
}
}
}
return ret;
}
addImageOne:メソッドが最初に実行することは、resolveAlias()ルーチンで対象がエイリアスファイルかどうかを調べ、もしそうであれば、それを解析してエイリアスが指している真のパス名を得ることです。残念ながら(何故か今でも)エイリアス処理に関してはCocoaのNSFileManagerクラスでは対応できません。エイリアス関連の処理を行う場合には、懐かしのCarbon Alias Managerを利用します(笑)。ちなみに、今回はフォルダのエイリアスについては無視しています(永久ループに陥る可能性があるため)。
続いて、そのファイルがImageBrowserに登録できる画像ファイルかどうかを判断します。それに用いているのがisImageFile:メソッドです。もし画像ファイルだと判断されれば、本アプリのモデルオブジェクトであるImageFileを作成して、そこにパス名やファイル情報を登録し、一時的にデータを確保しているtemp配列(NSMutableArray)へ追加します。そして最後に、対象画像ファイルではないと判断されたファイルの中から「しんぶんし3」のドキュメントファイルを見つけ出し、そこに登録されている画像ファイル情報(ImageFileオブジェクト)を抽出してすべてをtemp配列へ追加します。
次回は、エイリアスファイルに関わる処理をするresolveAlias()ルーチンや、パス名で示されたファイルがImageBrowserで扱える画像かどうかを判断しているisImageFile:メソッドを中心に解説したいと思います。それにしてもゴールは遠いですね(笑)
つづく
ターミナルの向こうから 第32回 海上 忍
〜 PDFを活用する(3)〜
前回は、Perlモジュール「PDFJ」のかんたんな紹介を行いました。今回は、PDFJを利用したPDF文書作成の基本テクニックを解説します。
・前回の補足
PDFJで欧文を含むテキストを扱う場合は、ハイフネーション処理のために「TeX::Hyphen」モジュールが必要となります。また、フォントや画像をPDFに埋め込むとき「Compress::Zlib」モジュールを使用するため、あわせて入手しておくといいでしょう。Terminalから以下のとおりコマンドを実行すれば、ダウンロードとインストールを一括処理できます。
- - - - -
$ sudo -H cpan
cpan> force install TeX::Hyphen
cpan> force install Compress::Zlib
- - - - -
・文書オブジェクトの作成
PDFJでは、モジュールをロードするとき文書に使用する文字コードを指定します。デフォルトはシフトJIS(SJIS)ですが、日本語EUC(EUC)やUTF-8(UTF8)も利用できます。以降使用する文字列やフォントのエンコーディングは、このとき指定した文字コードに従います。
次に、「PDFJ::Doc」を利用して文書オブジェクトを作成します。必要な引数はPDFのバージョンと、ページの幅/高さの3つです。幅/高さの単位には、ポイント(1ポイント=1/72インチ)を使用します。このとき、PDFのバージョンにはAcrobat 3相当のv1.2から、Acrobat 7相当のv1.6までを指定できます。OpenTypeフォントを使用する場合は、PDF 1.6以降を指定しなければなりません。
- - - - -
#!/usr/bin/perl
use utf8;
use strict;
use PDFJ qw[utf8];
my $pdfversion = 1.6;
my $paperwidth = 595;
my $paperheight = 842;
my $doc = PDFJ::Doc->new($pdfversion, $paperwidth, $paperheight);
- - - - -
・フォントの定義
テキストオブジェクトは、後述するTextサブルーチンで作成しますが、あらかじめTStyleサブルーチンでフォントの定義を行ったほうがすっきりと記述できます。そしてTStyleで必須の要素が、「font」と「fontsize」です。
使用するフォントは、文書オブジェクトからnew_fontメソッドを使い、フォントオブジェクトとして生成します。使用するフォントとそのエンコーディング形式を1対で指定することが基本形ですが、現在ではかな・漢字とアルファベットが混在した文書が一般的なため、日本語・英語それぞれのベースフォント名とエンコーディングが対になる形で定義します(和文と欧文を組にする場
合、欧文はエンコーディング形式を省略可)。以下の例では、和文ベースフォントが「Ryumin-Light」でエンコーディングが「UniJIS-UCS2-HW-H」(Unicode横書き)、欧文フォントには「Times-Roman」を使用しています。
- - - - -
my $font = $doc->new_font('Ryumin-Light', 'UniJIS-UCS2-HW-H', 'Times-Roman');
my $fontSize = 12;
my $textStyle = TStyle(font => $font, fontsize => $fontSize);
- - - - -
・ページの作成
PDFの各ページは、文書オブジェクトからnew_pageメソッドを使い生成されます。引数にページの幅と高さを与えることができますが、省略すると文書オブジェクト作成時の値が適用されるため、通常は省略します。
- - - - -
my $page = $doc->new_page();
- - - - -
・オブジェクトの配置とテキストの流し込み
PDFJでは、テキストや段落などのオブジェクトを配置することで文章を構成します。以下の記述例では、Textサブルーチンを使用してテキストオブジェクトを生成し、それをParagraphサブルーチンで段落オブジェクトに入れ、その中でPStyleサブルーチンを使い段落スタイルを決定しています。なお、段落オブジェクトとの"入れ子"にせず、テキストオブジェクトをそのまま描画してしまうと、文字が多い場合ページからはみ出してしまいます。
以下のPStyleサブルーチンでは、必須とされる「size」と「linefeed」、「align」を定義しています。sizeでは段落の行方向のサイズ、alignでは揃えの方向(ex. b=行頭)、linefeedでは行送りをフォントサイズに対する比率で指定しています。
仕上げとして、showメソッドを使いページオブジェクトをレイアウトしています。表示位置の座標は、ページの左下隅を原点(0,0)として、x座標、y座標の順に指定します。
- - - - -
my $text = Text("色は匂へど 散りぬるを 我が世誰そ 常ならむ 有為の奥山 今日越えて 浅き夢見じ 酔ひもせず irohanihoheto chirinuruwo wakayotareso tsunenaramu uinookuyama kefukoete asakiyumemishi yohimosesunn", $textStyle);
my $para = Paragraph($text, PStyle(size => 500, align => 'b', linefeed => '120%'));
$para->show($page, 50, $paperheight - 100);
- - - - -
次回は、画像など他のオブジェクトの扱い方について紹介する予定です。
◇MOSAからのお知らせと編集後記は割愛します◇