MOSA Multi-OS Software Artists

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

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

MOSA Developer News[MOSADeN=モサ伝]第318号

2008-11-04

目次

  • 「Wonderful Server Life」    第80回   田畑 英和
  • 小池邦人のCarbon視点でCocoa探求
  • ターミナルの向こうから      第35回  海上 忍 

「Wonderful Server Life」  第80回  田畑 英和

  〜「iCalサーバ」編〜

 Leopardがリリースされてから1年になります。そろそろLeopard Serverの導入も増えてきているかと思いますが、せっかくLeopard Serverを使うのでしたら新サービスにもチャレンジしてみたいところです。
 そこで今回からLeopard Serverで新しく追加されたサービスについて解説していきます。まずはiCalサービスから解説いたします。

◇iCalサービス
 そもそもiCalサービスとはなにかということですが、iCalサービスを利用すれば、Mac OS Xに標準でインストールされている「iCal」を使って作成したスケジュール情報を、サーバに保存して一元管理することができます。
 もちろん複数のユーザをサポートしていますし、制約はありますが他のユーザのスケジュールも確認することもできます。つまりユーザごとのスケジュールをサーバ上で一元管理するわけですが、iCalサービスはOpen Directoryと統合されていますので、Open Directory上に登録したユーザであればiCalサービスを利用することができます。

◇iCalサービスのセットアップ
 iCalサービスを動かす方法は非常に簡単です。まずサーバが標準構成であればシステムをセットアップするだけで自動的にiCalサービスが起動します。
 また、実際にiCalサービスを利用するにはユーザごとの設定も必要になりますが、標準構成の場合は「サーバ環境設定」でユーザを登録するだけで自動的に必要な設定が行われます。もっともこれはユーザ登録時にiCalサービスが起動していることが前提となります。もしユーザ登録時にiCalサービスを停止していた場合には、「サーバ環境設定」のユーザ管理画面のサービスの設定でiCalサービスを有効にすれば自動的にiCal関連の設定が行われます。

 次にサーバが詳細構成だった場合です。少し手間は増えますがかといって特に難しいわけではありません。まず「サーバ管理」でiCalサービスを開始します。設定可能なオプションがいくつかありますがとりあえず起動するだけなら、デフォルトの設定のままサービスを開始するだけです。セキュリティを高める場合はSSLを有効にするといったこともできます。iCalはWebDAVをベースとしたCalDAVというプロトコルを使っていますが、デフォルトでは8008番ポートを、SSLを有効にした場合には8443番ポートで通信を行います。
 サーバが詳細構成の場合はさらにユーザごとの設定も必要になります。ユーザを登録した後に「ワークグループマネージャ」の「詳細」設定画面で使用するカレンダーホストの設定を行います。iCalサービスを起動していればカレンダーホストのリストに自動的に適切な候補が表示されます。

・カレンダーホストの設定
http://www.htabata.com/img/MXS105/iCal/WGM_01.png

 この設定項目がちょっと分かりにくく、日本語環境では「スケジュール管理を有効にするメンバー」という名前の設定項目になっています。ところが英語環境での表示をみてみると「Enable calendaring」となっています。いったいどう翻訳すればこうなるのでしょうか。とにかくユーザごとの設定も必要になるということです。これはサーバが標準構成の場合でも、「ワークグループマネージャ」でユーザを追加した場合にはやはり手動での設定が必要になります。また、標準構成の場合はデフォルトでサービスのACLが有効になっていますので注意が必要になります。標準構成の場合はとにかく「サーバ環境設定」で設定をしたほうがなにかとお手軽です。

◇iCalサービスへのアクセス
 サーバ側の準備が整ったら次はクライアント側のセットアップです。まずクライアントをOpen Directoryのサーバにバインドします。サーバが標準構成であればこのときにiCalのアカウント設定も自動的に行うことができますが、今回は手動での設定方法をみておきましょう。
 まず「iCal」を起動して環境設定の「アカウント」画面を表示します。ウインドウの左下にある「+」ボタンをクリックしてあらかじめOpen Directory上に登録しておいたユーザのユーザ名とパスワードを入力します。デフォルトの状態ではこのときセキュリティに関する警告が表示されますが、SSLを有効にしたりKerberos認証を使用することによってセキュリティを高めることができます。

・アカウントの登録
http://www.htabata.com/img/MXS105/iCal/iCal_01.png

 アカウントの設定が完了すれば、ローカルのカレンダーに加えiCalサービスを利用してサーバ上のカレンダーも使えるようになります。サーバ上のカレンダーとしてはデフォルトで「calendar」という名前のカレンダーが用意されています。名称を変更したりサーバ上のカレンダーを追加することもできます。

 とうわけで今回はiCalサービスのセットアップについて解説しました。次回も引き続きiCalサービスについて解説する予定です。
次回へつづく                             

小池邦人のCarbon視点でCocoa探求(2008/10/24)

 〜 起動時とドラッグ&ドロップでの登録 〜

今回は、ImageBrowserへの画像登録の「別の道筋」である「アプリ・アイコンへのドロップで新規ウィンドウを開き画像を登録」と「ドラッグ&ドロップでウィンドウに画像を追加登録」について解説いたします。

まず最初は「アプリ・アイコンへのドロップで新規ウィンドウを開き画像を登録」についてです。この処理の実行には、NSApplicationのデリゲート(NSApplicationDelegate)であるapplication:openFiles:メソッドを実装します。ユーザが、画像ファイルやフォルダをアプリ(もしくはドッグ)アイコン上にドラッグ&ドロップすると、このメソッドが呼ばれるわけです。
NSApplicationにどのようなデリゲート・メソッドが存在しているかは、NSApplication.hを参照してみてください。

- (void)application:(NSApplication *)sender openFiles:(NSArray *)filenames
{
   MyDocument        *mydoc=nil;
   NSMutableArray    *files=nil;
   NSError           *err=nil;
   NSString          *path;
   int               i,ct;
   BOOL              dir;

   ct=[filenames count]; // 情報にいくつのパス名が含まれているのか?
   for( i=0;i


この場合、アイコンにドロップされるファイルは画像ファイルやそれを含んだフォルダだけではなく、「しんぶんし 3.0」自身のドキュメントファイルである可能性もありますので注意してください。その場合には、通常のドキュメント・オープン処理となります。

続いて「ドラッグ&ドロップでウィンドウに画像を追加登録」する方です。Cocoaアプリケーションで「ドラッグ&ドロップ」を実現するには、ドロップ先のオブジェクト(例えばNSViewなど)に、以下の6つのメソッド(NSDraggingDestinationプロトコル)を実装します。ちなみに、Mac OS X 10.5以降では1つ増えて7つになったようです。

- (NSDragOperation)draggingEntered:(id )sender;
// ドラッグがエリアに入った場合
- (NSDragOperation)draggingUpdated:(id )sender; 
// エリア内にいる場合
- (void)draggingExited:(id )sender;
// エリアから出た場合
- (BOOL)prepareForDragOperation:(id )sender;
// 受け入れ処理がOKかどうか
- (BOOL)performDragOperation:(id )sender;
// 受け入れ処理を実行
- (void)concludeDragOperation:(id )sender;
// 処理が終了した
- (void)draggingEnded:(id )sender;
// Mac OS X 10.5以降のみ


Carbonでドラッグ&ドロップを経験されている方は、どのメソッドがどんな処理を担当するのか、そのメソッド名からほぼ理解できると思います(笑)。ImageBrowser上へのドラッグ&ドロップに関しては、このうちの3つだけを、デリゲートとして用意したオブジェクトに実装すればOKです。デリゲートは、MyDocumentクラスのawakeFromNibメソッドにおいて
setDraggingDestinationDelegate:メソッドを使いセットします。今回のセット先は自分自身(self)です。

- (void)awakeFromNib
{
   [imageBrowser setDraggingDestinationDelegate:self]; // デリゲートをセット
   [imageBrowser setAllowsMultipleSelection:NO]; 
   [imageBrowser setAllowsEmptySelection:NO];
   [imageBrowser setZoomValue:0.5];
}


以下が、実装しなければいけない3つのメソッドですが、そのうち2つの実装は簡単でして、単純にNSDragOperationCopy(定数)を返すだけです。

- (NSDragOperation)draggingEntered:(id )sender
{
   return NSDragOperationCopy;
}

- (NSDragOperation)draggingUpdated:(id )sender
{
   return NSDragOperationCopy;
}


最後のperformDragOperation:メソッドに実際の画像登録処理を記述します。このメソッドでNOを返すと、ドロップしたアイコンが元の場所へ戻っていくアニメーションが実行されるわけです。

- (BOOL)performDragOperation:(id )sender
{
   BOOL            ret=NO;
   NSArray         *paths;
   NSData          *data;
   NSString        *err;
   NSPasteboard    *pb;

   pb=[sender draggingPasteboard]; // 渡されたペーストボード・オブジェクト
   if ([[pb types] containsObject:NSFilenamesPboardType] )  // ファイル名ある?
   {
       if( data=[pb dataForType:NSFilenamesPboardType] ) // そのデータを抽出
       {
           paths=[NSPropertyListSerialization propertyListFromData:data
                   mutabilityOption:kCFPropertyListImmutable format:nil 
                                                 errorDescription:&err];
                                               // 対象となるパス名を得る
           [self addImagesPaths:paths]; // パス名を使い画像の登録を行う
           ret=YES; // ドラッグ&ドロップ処理は正しく実行された
       }
   }
   return ret;
}


次回は「ImageBrowserで選択した画像をいかに対称表示させるのか?」についてCore Graphics APIに関する解説をしたいと思います。が、ここからの話は少しCocoaから離れてしまいいますので、iPhone SDKのNDAも解除されたことですし、ひょっとすると連載そのもを方向転換するかもしれません(笑)。

ターミナルの向こうから      第35回  海上 忍

〜 いま敢えて学ぶTerminalのイロハ(2) 〜

・シェルのお約束

 ターミナルを起動すると、コンピュータ名に続いて「$」が表示され、カーソルが点滅するコマンド入力待ちの状態となります。キーボードからの情報を受け付け、必要であればdeleteキーやカーソルキーなどを利用した編集を行い、プロンプト横に表示したうえでコマンドとして実行する、という一連の流れはシェルの機能によるものです。
 ここで理解しておきたいのは、シェルは基本的に「スクリーンエディットに非対応」ということです。たとえば、適当な文字列を入力し、その途中から編集を行おうとマウスでクリックしても、その位置へカーソルを移動することはできません。
これは、シェル(bash)がCocoa/CarbonのAPIを使用しないためであり、行編集機能を依存するGNU readlineライブラリの操作体系に従う必要があります。
 ターミナルの画面にコピー&ペーストできるが? と疑問を持つ方もいらっしゃるかもしれませんが、ターミナルは(テキスト情報の)表示を担当するに過ぎません。その意味で、シェルはIME(Input Method Editor)的な役割を担うプログラムであり、IMEとしてのシェルの機能を理解することがターミナルに慣れる最初の一歩、ということができます。

・bash/readlineの編集機能(1)

 それでは、シェルの編集機能を具体的に説明してみましょう。前述のとおり、bashはGNU readlineの機能を利用するため、正確にはreadlineの使い方であることをあらかじめお断りしておきます。
 例として、「mosaden」と入力してください。「n」の右横でカーソルが点滅/入力待ちの状態になると思います。ここでControl-a(以下、Controlキーは「C」と省略)を押すと……カーソルは、行頭の「m」の上に移動するはずです。これは、readlineの持つ編集機能の1つです。同様に、C-e(行末への移動)、C-b(1文字後退)、C-f(1文字前進)など、カーソルの移動にはショートカットキーを利用できます。
 それら編集機能は、キーを押下しreadlineの内部コマンドを発生することにより処理されています。C-aでカーソルを行頭へ移動する処理は、実際にはreadlineの「beginning-of-line」という内部コマンドを実行しています。1文字前進は「forward-char」、1文字後退は「backward-char」です。それら内部コマンドが、bash/readlineの初期設定にしたがい、C-aやC-bなどのキーコンビネーションが割り当てられた(キーバインディング)うえで呼び出されているにすぎません。
 それらキーバインディングを一覧することもできます。次に示すbashの内部コマンド「bind」に、オプションの「-p」を与えて実行すれば、450行前後の設定情報が表示されるはずです。

- - - - -
$ bind -p
- - - - -


・bash/readlineの編集機能(2)

 シェルの基本機能は、入力された文字列を解釈しコマンドとして実行する「コマンドインタープリタ」ですが、GUIがない/洗練されていない時代はシェルが主要なユーザインターフェイスとして利用されていたこともあり、ユーザビリティ向上のために多くの支援機能が追加されてきました。
 実行したコマンドラインを記憶しておく「ヒストリ(履歴)機能」は、数ある支援機能のなかでも覚えておきたいものの1つです。試しに適当なコマンドを実行し、C-pを押してください。直前に実行したコマンドラインがプロンプト横に現れ、enterキーを押下するだけで実行可能な状態にお膳立てしてくれます。この機能を使えば、長くなりがちなコマンドラインを何度も入力せずに
済みます。
 ヒストリ機能は、bash/readlineが実行したコマンドを、ホームフォルダ直下の「.bash_history」というファイル(~/.bash_history)に保存しておき、「previous-history」という内部コマンドを使い参照することにより実現されています。前述の「bind -p」で調べるとわかりますが、上方向のカーソルキー(↑)を押すことでも、まったく同じ操作が可能です。

・機能を組み合わせると……
 最後に、編集機能とヒストリ機能を使った「合わせ技」を紹介してみましょう。GUIと目指すところは異なりますが、シェルの操作性に洗練を感じることができると思います。
 たとえば、「docs.zip」というZIPファイルを(unzipコマンドで)内容確認し、安全と判断したうえで解凍する状況を考えてみましょう。素直に作業すれば、以下のコマンドラインを1文字ずつ入力しなければならないはずです(「-t」は書庫ファイルの内容を確認するためのオプション)。

- - - - -
$ unzip -t docs.tgz [enter]
$ unzip docs.tgz [enter]
- - - - -


 このコマンドラインを見ると、「unzip」と「docs.tgz」という文字列が完全に重複していることがわかります。そこで利用するのが、bash/readlineのヒストリ機能と編集機能です。以下のコマンドラインを見てください。かなり効率化されたことがわかります。例ではファイル名が短めでしたが、長い場合にはさらに作業時間を短縮できると思います。

- - - - -
$ unzip -t docs.tgz [enter]
 [C-p]  ←直前に実行したコマンドラインを呼び出す
$ unzip -t docs.tgz  ←履歴が現れる
 [C-b]を何度か押し、カーソルを「-」の上へ移動
 [delete]を2回押す
$ unzip docs.tgz [enter]  ←履歴を編集した
- - - - -

◇MOSAからのお知らせと編集後記は割愛します◇

 

 MOSA Developer News   略称[MOSADeN=モサ伝]
        配信停止 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.