MOSA Developer News[MOSADeN=モサ伝]第310号
2008-08-26
目次
- WWDC初参加レポート
- 「「Wonderful Server Life」 第76回 田畑 英和
- 小池邦人のCarbon視点でCocoa探求
- ターミナルの向こうから 第31回 海上 忍
「
Wonderful Server Life」 第76回 田畑 英和
〜「サーバ管理」編〜
今回は共有ポイントの設定について解説します。ファイルサービスを運用するにはサービスの管理だけでなく共有ポイントの管理も必要になります。また、Tiger Serverのころは「ワークグループマネージャ」を使って共有ポイントの管理を行っていましたが、Leopard Serverからは「サーバ管理」を使用するように変更になりました。こういった違いにも注意しましょう。
◇共有ポイントの設定
共有ポイントを管理するには「サーバ管理」でサーバに接続し、左側のリストからサーバを選択した状態でツールバーの「ファイル共有」ボタンをクリックします。
ファイル共有の設定画面では、ツールバーのすぐ下に「ボリューム」「共有ポイント」「リスト」「ブラウズ」の4つのボタンが表示されます。まず左の2つですが、「ボリューム」をクリックするとサーバ上のボリュームの一覧が表示され、「共有ポイント」をクリックすると共有ポイントの一覧が表示されます。
右の2つのボタンですが「リスト」をクリックするとディスクの使用状況とともにボリュームもしくは共有ポイントの一覧を表示し、ブラウズをクリックすると各ボリュームまたは共有ポイントの中身をブラウズすることができます。新規に共有ポイントを作成するときには「ボリューム」と「ブラウズ」を組み合わせるのがよいでしょう。
・「ファイル共有」設定画面
http://www.htabata.com/img/MXS105/afp/sharing_01.png
画面下半分にはアクセス権の設定エリアが表示されます。ここではPOSIXのアクセス権だけではなく10.4から導入されたACLのアクセス権も設定できます。10.4ではACLには対応していたもののデフォルトでは無効になっていましたが、Leopardからはデフォルトで有効になりましたので、いつでもACLを設定することができます。
またアクセス権の設定だけではなくボリュームを表示しているときには「クオータ」の設定/確認画面が、共有ポイントを表示しているときには「共有ポイント」の設定画面が表示されます。
◇共有ポイントの作成
新規に共有ポイントを作成する場合は、まずツールバーのすぐ下のボタンで「ボリューム」と「ブラウズ」ボタンをクリックし、目的のフォルダを選択します。次に左上の「共有」ボタンをクリックし右下の「保存」ボタンをクリックすれば、新しい共有ポイントを作成できます。「サーバ管理」からサーバ上に新規にフォルダを作成することもできます。ただし「サーバ管理」からは、
フォルダの名前を変更したり削除することはできません。
共有ポイントを作成すると自動的に共有ポイントの設定エリアが表示されます。ここでは以下の4つの設定ができます。
・自動マウント
・Spotlight検索
・Time Machine
・プロトコルオプション
ネットワークホームなどを用いるときには自動マウントの設定が必要になります。Spotlightの設定は、ネットワークを経由したSpotlight検索を有効にする設定です。共有ポイントを作成すると自動的にSpotlight検索が有効になります。
ネットワーク経由でTime Machineのバックアップを行うには、共有ポイントをTime Machineのバックアップ先として設定します。Time Machineの設定をおこなった共有ポイントには「.com.apple.timemachine.supported」という空のファイルが作成されます。
プロトコルオプションでは、共有ポイントに対するプロトコルごとの設定をおこないます。
・「共有ポイント」設定画面
http://www.htabata.com/img/MXS105/afp/sharing_02.png
◇プロトコルオプション
共有ポイントごとに「AFP」「SMB」「FTP」「NFS」に関する設定ができます。共有ポイントを新規に作成するとデフォルトでは「AFP」「SMB」「FTP」の3つのプロトコルでの共有が可能になります。実際に各プロトコルでアクセスするにはサービスが起動している必要があります。
プロトコルオプションではまずプロトコルごとの共有のOn/Offが設定できます。ですので例えば「AFP」のみで共有するとか、「SMB」と「FTP」で共有するといった設定が可能です。基本的には使用していないサービスの共有はOffにしておきましょう。またサービスを起動したのにアクセスできない場合は、共有ポイントの設定を確認するようにしましょう。
また「AFP」「SMB」「FTP」ではゲストアクセスのOn/Offも設定できます。ただし、実際にゲストアクセスを可能にするには、サービスの設定でもゲストアクセスが有効になっている必要があります。つまりゲストアクセスを有効にするには共有ポイントとサービスでの2段階の設定が必要になるということです。FTPではゲストアクセスのことをanonymousアクセスとも呼んでいます。
「AFP」のプロトコルオプションの設定では、他にもカスタムAFP名の設定があります。これはサーバ上の実際のフォルダ名とは別の名前でクライアントに共有ポイントを公開する設定になります。カスタム名の設定は「SMB」と「FTP」にもありますので、プロトコルごとに異なる名前で共有ポイントを公開するような設定も可能です。
Tiger Serverでは「AFP」のプロトコルオプションで、デフォルトのアクセス権に関する設定がありましたが、Leopard Serverの「サーバ管理」では設定がなくなりました。これはデフォルトでACLが有効になっているためと思われます。ACLでは親フォルダのアクセス権が継承されます。
・「プロトコルオプション(AFP)」設定画面
http://www.htabata.com/img/MXS105/afp/sharing_03.png
それでは、次回も引き続き「サーバ管理」について解説をしていきます。
次回へつづく
小池邦人のCarbon視点でCocoa探求(2008/08/22)
〜 様々な画像ファイル取り込み方法 〜
画像さえ登録してしまえば、ImageBrowserの扱いは簡単そうに見えます。しかし、その画像登録に色々なパタンが存在するので注意が必要です。今回は「しんぶんし3」でのドキュメントファイルや画像ファイルの取り扱いを復習しながら、登録ボタンで画像を追加していく処理を解説したいと思います。
ここで、もう一度「しんぶんし 3」のドキュメントファイルや画像ファイルの取り扱い処理の一覧を示してみます。
・ドキュメントファイルの場合
(1)ファイルメニューの「開く…」でファイルを読み込み内容をウィンドウに表示
(2)ファイルメニューの「保存」で内容をファイルへ書き出す
(3)ファイルメニューの「別名で保存…」で名称を変えてファイルへ書き出す
(4)ファイルメニューの「最後に保存した状態に戻す」で編集をキャンセルする
(5)未保存の編集済みウィンドウを閉じた時には「保存」処理を実行する
(6)終了時に未保存の編集済みウィンドウに対して「保存」処理を実行する
(7)アプリ・アイコンへのドロップで起動と内容を表示したウィンドウを開く
(8)新規や登録済みウィンドウにドロップすることでその内容を追加登録する
(9)ドキュメントのエイリアスファイルでも上記同等の処理を行えるようにする
・画像ファイルの場合
(1)画像追加ボタンでウィンドウに画像を追加登録
(2)ドラッグ&ドロップでウィンドウに画像を追加登録
(3)アプリ・アイコンへのドロップで新規ウィンドウを開き画像を登録
(4)画像ファイルが含まれたフォルダについても上記と同等の処理を行う
(5)画像ファイルのエイリアスファイルについても上記と同等の処理を行う
ドキュメントファイルの(1)から(7)までの処理は、Info.plistに対象ドキュメントのタイプや拡張子を正しく記載しておけば、NSDocumentクラスが、そのほとんどを自動処理します。(8)や(9)の一部、画像ファイルの(1)から(5)までの処理はすべて自分で実装します。また「ドキュメントファイルへの保存」に関する(2)(3)(5)(6)については、とりあえず画像取り
込みとは直接関係ないので、まずは、それ以外の処理(ImageBrowserへの画像の登録に関わる処理)を順次実装して行きます。 順番としては(1)の「画像追加ボタンでウィンドウに画像を追加登録」から実装することにしましょう。
ユーザが画像追加ボタンをクリックすると、Interface Builderでリンクしておいたアクションメソッドが呼び出されます。今回の場合には、addImage:メソッドがそれに相当します。以下が、そのaddImage:メソッドです。最初に、NSOpenPanelクラスを用いてファイル選択用ダイアログを表示します。画像ファイルを選択できるようにするだけでなく、フォルダ(ディレクトリ)も
選択可能に設定しておきます。ユーザが、ファイルやフォルダを選択しOKボタンをクリックしたら、そのパス名(NSString)を返してきます。
- (IBAction)addImage:(id)sender
{
NSArray *paths; // パス名が保存される
NSOpenPanel *panel;
panel=[NSOpenPanel openPanel]; // NSOPnePanleオブジェクトを得る
[panel setCanChooseDirectories:YES]; // フォルダを選択可能に
[panel setCanChooseFiles:YES]; // ファイルを選択可能に
[panel setAllowsMultipleSelection:YES]; // 複数ファイルが選択可能に
if( [panel runModalForTypes: [NSImage
imageUnfilteredTypes]]==NSOKButton) // OKボタンをクリック
{
if( paths=[panel filenames] ) // 選択ファイルやフォルダのパスを得る
[self addImagesPaths:paths]; // 実際の画像登録作業へ
}
}
対象となるのは画像ファイルだけなので、それのみをダイアログに表示(選択可能に)するようにする必要があります。そのため、NSImageクラスのimageUnfilteredTypes:メソッドを使い、NSImageクラスで取り扱う事が可能な画像ファイルのUTI(Uniform Type Identifiers)情報の配列を得てNSOpenPanelに渡します。Carbonの場合には、スタンダードファイルダイアログを表示する時に、対象ファイルのファイルタイプの配列を渡していましたが、それとまったく同じ仕組みです。UTIについては、Apple社のデベロッパーサイトからダウンロードできる「Uniform Type Identifiers Overview」というドキュメントが参考になりますので、そちらを参照してみてください。
実際の画像登録作業ですが、大量の画像ファイルを登録する場合には、処理がかなり長時間となることが予想されます。ImageKit用に提供されているサンプルソースコードを見てみると、画像登録中にユーザが何も操作できなくなるのを避けるために、そうした処理を別スレッドで実行していました。「しんぶんし3」もそれを見習って、addImagesPaths: メソッドで実行する画像登録処理を別スレッドとします。Cocoaでのマルチスレッド処理は、NSThreadクラスを使うことで簡単に実現できます。
- (void)addImagesPaths:(NSArray*)paths
{
if( [paths count] ) // 配列個数を調べる
[NSThread detachNewThreadSelector:@selector(addImagesThread:)
toTarget:self withObject:paths];
}
まず、得られたパス(NSString)の配列個数を調べ、それがゼロならば何も実行しません。もしパスが得られていたら、detachNewThreadSelector:toTarget:withObject:メソッドを使い、別スレッドとして起動するメソッドを指定します。この処理で作成されたスレッドは最初からデタッチされており、処理は終了してもメイン(親)スレッドとは合流しません。今回の場合、メソッドの実装先オブジェクトは自分自身(self)そしてメソッド名はaddImagesThread:とします。また、ユーザ情報オブジェクトとしてパス名の配列(paths)を対象スレッドへ渡しています。以下が、別スレッドとして起動するaddImagesThread:メソッドです。
- (void)addImagesThread:(NSArray*)paths
{
NSAutoreleasePool *pool;
NSInteger i,ct;
pool=[[NSAutoreleasePool alloc] init]; // NSAutoreleasePoolを用意
ct=[paths count]; // パスの個数を得る
for( i=0;i
マルチスレッド処理で注意することは、スレッド内でスレッドセーフでないメソッドやルーチンを使用しない(もしくはNSLockクラスなどを使い制御して使用する)ことです。また、メインイベントから切り離されていますので、autorelease処理も単独で用意しなければいけません。ですから、入り口で NSAutoreleasePoolオブジェクトを作成し、スレッドを抜ける時にそれを
releaseします。メインスレッドから渡されたユーザ情報オブジェクト(今回はNSArray)は、スレッドに入る時に自動時にretainされ、抜ける時にreleaseされますので、こちらも取り扱いに注意してください。
ユーザインターフェース制御などには多数の「スレッドセーフでない」クラスが関わりますので、別スレッドからそうしたクラスを利用する時には注意が必要です。加えて、メインスレッドで使っているメソッドをそのまま呼びたい場合も多々あります。そんな時には、performSelectorOnMainThread:withObject:waitUntilDone:メソッドを利用すると便利です。このメソッドを使い、メインスレッドのメソッド(スレッドセーフでなくてもOK)を呼び出します。今回、この仕組みにより呼び出されているのは 後処理を担当するupdateDatasourceメソッドです。
- (void)updateDatasource
{
if( [temp count] ) // テンポラリ配列の要素があるか?
{
[list addObjectsFromArray:temp]; // テンポラリ配列をlistに追加する
[temp removeAllObjects]; // テンポラリ配列の要素を削除する
[imageBrowser reloadData]; // ImageBrowserを再描画
[self updateChangeCount:NSChangeDone]; // ドキュメントを編集済みに
}
}
次回は、 addImagesThread:のループ内から呼ばれている addImagesPathメソッドのソースコードを提示し解説することから画像登録処理の話を続けたいと思います。
つづく
ターミナルの向こうから 第31回 海上 忍
〜 PDFを活用する(2)〜
・PDF、なぜYet Anotherな方法が必要か
OSネイティブでPDF生成機能を備えているMac OS Xの場合、他のOSと比較してPDFの生成は容易です。描画命令はAppKitフレームワークを使えばPDFに変換できますし、表示目的にはPDF Kitが用意されています。Yet anotherな解法(そればかりと言われますが)を提示することが主旨の本連載では、敢えて取り上げる必要もないでしょう。
そこで、スクリプト言語を利用したPDFの生成を検討してみたいと思います。確かにMac OS XにはPDF生成機能が標準装備されていますが、あらゆるニーズに応えられるわけではないからです。
その1つが、「日本語フォントを埋め込まないPDF」の生成です。Leopardに搭載されたPDFエンジン(Quartz PDFContext)は、デフォルトでv1.3(Acrobat 4.x相当)のPDFを生成しますが、日本語の文字列はCIDフォントを埋め込むことでしか対応できず、環境の違いに関係なく同一のフォントで表示される環境非依存のPDFとなりますが、一方ではファイルサイズの肥大化というデメリットが生じます。
ちなみに、PostScriptの時代から、和文フォントにはリュウミンL-KLと中ゴシックBBBがデフォルトで使用されます。フォントを埋め込まない形式の日本語PDFでは、この2つのフォントが利用され、Adobe Readerなどのビューアにより代替のフォントが割り当てられます。環境によってフォントデザインは変わってしまいますが、ファイルサイズは抑えられます。
もう1つは、差し込み印刷的な処理が難しいことでしょうか。世の中には、電子文書として保存できるようPDFとしてオンデマンドで各種帳票を作成したい、というニーズがありますが、これをCocoaで実装しようとなると一苦労です。しかし、スクリプト言語からフリーなPDFライブラリの機能にアクセスするスタイルであれば、その手の機能を実現することは比較的容易です。
・PDFJを導入する
上記の問題を解決する答えの1つが、中島靖氏が開発したPerlモジュール
「PDFJ」です。横/縦書きはもちろんルビに添え字、下線・傍線、禁則処理や行の詰め伸ばしなど、JIS X 4051に既定された組版ルールに準拠しているため、凝ったレイアウトの日本語文書を作成できます。JPEG/PNG画像やベジェ曲線を含む線画にも対応、スクリプトベースながらワープロ文書並みの仕上がりを期待できることがポイントです。
PDFJのダウンロードおよびインストールの手順は、以下に示すとおりです。各行をターミナルへコピー&ペーストのうえ、実行してください。
- - - - -
$ curl -O http://hp1.jonex.ne.jp/~nakajima.yasushi/archives/PDFJ-0.90.zip
$ unzip PDFJ-0.90.zip
$ perl Makefile.PL
$ make
$ sudo make install
- - - - -
・PDFJを試す
PDFJを利用する場合、Perlスクリプト冒頭に「use PDFJ」の記述を加えます。引数に「EUC」や「UTF8」などの文字コードを指定すると、日本語エンコーディング形式を変更できます(デフォルトは「SJIS」)。
PDFの作成は、文書を構成する各種オブジェクトを並べることで進行します。表示可能なオブジェクトには、テキスト(PDFJ::Text)、段落(PDFJ::Paragraph)、画像(PDFJ::Image)などがあります。基本的な情報は、付属の文書(doc/PDFJ.jp.pdf)が参考になるはずです。
以下に示すリストは、クリップボード(ペーストボード)の内容をPDFとして出力します。適当なファイル名で保存し、ターミナルから「perl XXXX.pl」として実行すると、「MOSAtest.pdf」というPDFが生成されるはずです。
このスクリプトでは、クリップボードからテキストを取得し、和文フォントをリュウミンL-KL/フォントサイズを12ポイントとして、A4サイズの大きさにレイアウトしたうえでPDFに出力しています。クリップボードの内容の取得にpbpasteコマンドを使用したことを除けば、ごく単純なHelloWorldノリの内容となっているので、これをベースにレイアウトを工夫してみてもいいでしょう。
- - - - -
#!/usr/bin/perl
use strict;
use warnings;
use PDFJ 'SJIS';
my $pdfversion = 1.6;
my $paperwidth = 595;
my $paperheight = 842;
my $doc = PDFJ::Doc->new($pdfversion, $paperwidth, $paperheight);
my $font = $doc->new_font("Ryumin-Light", '90ms-RKSJ-H');
my $fontSize = 12;
my $textStyle = TStyle(font => $font, fontsize => $fontSize);
my $page = $doc->new_page();
my $text = `pbpaste`;
$text =~ s/ x80/ /g;
my $contents = Text($text, $textStyle);
my $para = Paragraph($contents, PStyle(size => 500, align => 'b', linefeed => '120%'));
$para->show($page, 50, $paperheight - 100);
$doc->print("MOSAtest.pdf");
- - - - -
次回は、このPDFJを利用して、差し込み印刷ならぬ「差し込みPDF生成」に挑戦する予定です。
◇MOSAからのお知らせと編集後記は割愛します◇
配信停止 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.