MOSA Multi-OS Software Artists

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

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

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

2009-03-10

目次

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

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

〜「Podcast プロデューサー」編〜

 前回はPodcastプロデューサーを稼働させるためにXgridの設定を行いました。今回はいよいよPodcastプロデューサーを稼働させてみたいと思いますが、あといくつかサーバ上で必要な設定がありますのでその手順を説明していきましょう。Xgridが設定済みの場合、残りの手順は次のようになります。

1. メールサービスの設定
2. ユーザ登録
3. Webサービスの設定
4. グループの設定
5. Podcastプロデューサーの設定

 またサーバ上ではOpen Directoryのマスターが稼働しKerberosが利用可能な状態にあるものとします。Open Directoryのマスターを正しく構築するには、あらかじめDNSの正引きと逆引きができるようになっている必要があります。それでは手順を1つ1つみていきましょう。今回の設定はすべて1台のサーバ上で行うものとします。設定には「サーバ管理」を使用し次のサービスを利用します。

・Podcastプロデューサーに必要なサービス
DNS、Open Directory、Podcastプロデューサー、Web、Xgrid
※QuickTime Streamingサービスを組み合わせる場合も考えられます

◇メールサービスの設定
 Podcastプロデューサーはサーバ上での処理が完了するとメールで通知を行いますので、まずはメールサービスを設定します。実際にメールサービスを運用するとなると設定可能な項目は色々とありますが、最低限必要な設定はSMTPの許可です。あとはデフォルトの設定のままでもとりあえず動作確認は可能になります。
 SMTPを許可するには「サーバ管理」でサーバに接続し、コンピュータとサービスのリストから「メール」を選択し、「設定」>「一般」から「SMTPを許可する」をチェックして設定を保存します。あとは画面左下の「メールを開始」ボタンをクリックすればメールサービスが起動します。

・メールサービスの設定
http://www.htabata.com/img/MXS105/podcast/mail_admin01.png

◇ユーザ登録
 「ワークグループマネージャ」を使用してPodcastプロデューサーで使用する以下の3つのユーザをOpen Directory上に登録します。

・Podcastプロデューサー用のユーザ
 pcastadmin(管理者)
 pcastuser
 pcastxgrid

 pcastadminは管理用のユーザ、pcastuserは「Podcastキャプチャ」を操作するときに使用するユーザです。またPodcastプロデューサーからXgridにアクセスするためのユーザとしてpcastxgirdユーザを登録します。
 メールでの通知を受け付けるために、pcastadminとpcastuserではメールを有効にしておきます。

・Podcastプロデューサー用のユーザ
http://www.htabata.com/img/MXS105/podcast/users_wgm01.png

◇Webサービスの設定
 作成したPodcastを公開するためにWebサービスの設定を行います。ここではブログでPodcastを公開するための設定も行ってみます。
 まず「サーバ管理」で「Web」サービスを選択してツールバーの「サイト」をクリックしデフォルトのサイトを選択します。次に「Webサービス」を選択してグループのサービスから「Wikiとブログ」をチェックし設定を保存します。あとは画面左下の「Webを開始」をクリックすればWebサービスの設定は完了です。

・Webサービスの設定
http://www.htabata.com/img/MXS105/podcast/web_admin01.png

◇グループの設定
 グループは「ワークグループマネージャ」でも設定できますが、Leopardで新しく追加された「ディレクトリ」(iCalサービスで使用しましたね)を使って設定をしてみましょう。サーバ上で直接設定してもかまいませんし、クライアントからネットワーク経由で設定することもできます。この「ディレクトリ」はデフォルトでKerberos認証を使用しますが、「環境設定」メニューから認証方式を変更することもできます。Open Directory上のデータを編集しますので、ディレクトリ管理者として認証します。
 「ディレクトリ」を起動したら、あらかじめ登録したPodcastプロデューサー用のユーザが表示されていることを確認します。次に画面左下の「+」ボタンをクリックして「新規グループ」を選択し、「Podcasts」という名前のグループを作成します。グループのメンバーにはpcastadminとpcastuserを登録します。「所有者」画面ではpcastadminをオーナーとして設定し、「サービス」画面では「Wikiとブログ」を選択して保存します。

・Podcastsグループの設定
http://www.htabata.com/img/MXS105/podcast/group_directory01.png
http://www.htabata.com/img/MXS105/podcast/group_directory02.png
http://www.htabata.com/img/MXS105/podcast/group_directory03.png

 グループの設定が完了したらPodcastブログの設定も行っておきましょう。Webブラウザを使ってhttp://<サーバのアドレス>/groups/podcastsにアクセスしpcastadminユーザでログインします。画面右側のメニューから「管理機能」>「設定」をクリックし編集(鉛筆のアイコン)ボタンをクリックしてPodcastブログを選択し、iTunesカテゴリにカテゴリ名を入力して保存します。

・ブログの設定
http://www.htabata.com/img/MXS105/podcast/blog01.png

◇Podcastプロデューサーの設定
 いよいよPodcastプロデューサーの設定です。「サーバ管理」で「Podcastプロデューサー」サービスを選択し「設定」>「一般」画面を表示します。作業用のフォルダとして「共有ファイルシステム」を設定します。ここで指定したフォルダはPodcastキャプチャやXgridがファイルをアップロードするのに使用します。指定したフォルダにはさらにサブフォルダが自動作成されますので、なにか専用のフォルダを作成しておくのがよいでしょう。
 次に「Xgirdコントローラ」にXgridコントローラのアドレス(今回の場合は同一サーバ)を入力し、Xgirdのユーザとしてpcastxgridを指定しpcastxgridのパスワードを入力して設定を保存します。
 「一般」の設定の次は「プロパティ」の設定になります。「プロパティ」の設定画面では次のパラメータを設定します。

・プロパティ設定
Administrator Short Name:pcastadmin
Group Short Name:pocasts
Group Administrator User:pcastadmin
Group Administrator Password:pcastadminのパスワード

 またApproval Email List、Audience Email Listにそれぞれ通知を受け取るメールアドレスを入力しておきます。

・Podcastプロデューサーの設定
http://www.htabata.com/img/MXS105/podcast/pdcast_admin01.png
http://www.htabata.com/img/MXS105/podcast/pdcast_admin02.png

 これらの設定が完了すれば設定を保存し、画面右下の「Podcastプロデューサーを開始」ボタンをクリックすればすべての設定が完了します。今回紹介した手順はPodcastプロデューサーのマニュアルをもとにしていますが、使用するユーザやグループの名前などは自由に変更してもよいでしょう。

・Podcastプロデューサーのマニュアル
http://images.apple.com/server/macosx/docs/Podcast_Producer_Admin_v10.5.pdf

それでは次回はPodcastプロデューサーを使って実際にPodcastを制作してみたいと思います。
次回へつづく                             

小池邦人のCarbon視点でiPhone探求(2009/03/06)

〜 iPhoneでもNSCodingプロトコルのお世話に 〜

今回から本格的にモデルコントローラクラスを実装していきます。まずは、モデルのアーカイブ化を行うために、NSCodingプロトコルに準拠したencodeWithCoder:とinitWithCoder:の2つのメソッドを用意することから始めましょう。

以前に定義したModelクラスをもう一度見てみます。スーパークラスとして定義されているNSObjectのさらに右側に と表記されていますが、これが、このクラスがNSCodingプロトコルに準拠していることを示しています。

@interface Model : NSObject 
{
   NSString        *md_name;
   NSString        *md_type;
   UIImage         *md_image;
   CGRect          md_rt;
   NSUInteger      md_flag;
   NSInteger       md_kind;
   NSInteger       md_para;
}


NSCodingプロトコルに準拠させるためには、ModelクラスにencodeWithCoder:とinitWithCoder:の両メソッドを実装する必要があります。これは、Mac OS X用のCocoaアプリケーションとまったく同じです。具体的には、ModelオブジェクトからNSDataへ変換するアーカイブ処理(エンコード)と、NSDataからModelオブジェクトへ戻すアンアーカイブ処理(デコード)の両方を実現することになります。

まず最初は、encodeWithCoder:メソッドです。Modelクラスのインスタンス変数それぞれに対してエンコード処理を行い、6つすべてに実行すれば処理は終了となります。エンコード対象のクラスにNSCodingプロトコルが実装されていれば、NSCoderクラスのencodeObject:メソッドを使うことができ、対象オブジェクトのencodeWithCoder:メソッドをが呼び出されることで処理が芋ズル式に進みます。この処理は、ドキュメント(ファイル)を外部記憶装置に保存する時に実行します。つまり、NSMutableArrayに保存されているModelオブジェクトがアーカイブ化される時に、このメソッドが逐次呼び出されるわけです。

- (void)encodeWithCoder:(NSCoder *)coder
{
   [coder encodeObject:md_name];
   [coder encodeObject:md_type];
   [coder encodeValueOfObjCType:@encode(CGRect) at:&md_rt];
   [coder encodeValueOfObjCType:@encode(NSUInteger) at:&md_flag];
   [coder encodeValueOfObjCType:@encode(NSInteger) at:&md_kind];
   [coder encodeValueOfObjCType:@encode(NSInteger) at:&md_para];
}


ここで注意しなければいけない点は、UIImageオブジェクトはエンコードしていないことです。今回インスタンス変数のUIImage *md_imageは、UITableViewへ画像サムネイル(小画像)を表示するために用意したものです。しかし、それを一緒にドキュメントへ保存することはしません。ドキュメントをロードした時点で、別の個別ファイルから逐次サムネイルを読み込む仕組みにします。どちらにしろ、UIImageクラスはNSCodingプロトコルに準拠していないので、この方法でUIImageオブジェクトをアーカイブ化することは無理なのです。

あるクラスがNSCodingプロトコルに準拠しているかどうかを判断するには、そのクラスが定義されているヘッダファイル(UIImage.h)を見てみます。すると、クラス定義の@interface行に、対応しているプロトコル名が列記されていることが分かります。例えば、NSString.hであれば…

@interface NSString : NSObject 


と記載されています。しかし、UIImage.hの方は以下の様になっています。

@interface UIImage : NSObject

つまりNSStringクラスには、NSCopying、NSMutableCopying、NSCodingの3つのプロトコルが実装されていますが、UIImageクラスの方には、対応プロトコルがひとつも無いことを示しています。

整数(NSIntegerやNSUInteger)や構造体(CGRect)などの非オブジェクトのエンコードには、encodeValueOfObjCType:at:メソッドを使います。メッセージとして渡す@encode()は、エンコードされた内容(種類)をC文字列で返すコンパイラ指示子です。例えば、@encode(NSInteger)なら”i”に、@encode(float)なら”f”となります。構造体の@encode(CGRect)の場合には、”{?=ffff}”(4つの浮動小数点)というC文字列となります。@encodeには、sizeof()演算子の引数として使用できる任意の型を指定できるわけです。

続いて、デコードのためのinitWithCoder:メソッドです。 こちらも、NSCodingプロトコル準拠のオブジェクト(NSStringなど)については、NSCoderクラスのdecodeObject:メソッドを使います。そうでない整数等は、decodeValueOfObjCType:at:メソッドを使いデコードを実現します。

- (id)initWithCoder:(NSCoder *)coder
{
   if( self=[super init] )
   {
       self.md_name=[coder decodeObject];
       self.md_type=[coder decodeObject];
       [coder decodeValueOfObjCType:@encode(CGRect) at:&md_rt];
       [coder decodeValueOfObjCType:@encode(NSUInteger) at:&md_flag];
       [coder decodeValueOfObjCType:@encode(NSInteger) at:&md_kind];
       [coder decodeValueOfObjCType:@encode(NSInteger) at:&md_para];

       if( [md_name length] )
       {
           //  ここで画像をサムネイルへ読み込む処理がを行う。
       }
   }
   return self;
}


この時、デコード順序がエンコード順序と違ってしまうと処理は正しく行われませんので、くれぐれも注意しましょう。ドキュメント読み込み時に同時に実行したい逐次処理は、このルーチン内で行うと便利です(エラー処理は少々難ありですが…)。今回の場合であれば、画像フィルを読み込みサムネイル用のUIImageを作成する処理がそうです。

今回の方法でドキュメントのセーブとロードを実行すると、後からドキュメントフォーマットを変更するのが難しくなります。そうした事態を考慮し、先んじてModelオブジェクトのインスタンス変数に将来利用しそうなオプションパラメータ(リザーブ)を用意しておくのも手です。また、ドキュメントフォーマットがバージョンアップされることを考慮し、どこか別ファイル(環境設定
ファイルなど)にドキュメントのバージョン番号も保持しておいた方が良いでしょう。

ところで、Modelクラスのインスタンス変数はプロパティ宣言されています。プロパティの「属性」が(retain)であるmd_nameとmd_typeのデコード値の代入は、以下の様にselfにドット演算子でつなげて記述します。

self.md_name=[coder decodeObject];
self.md_type=[coder decodeObject];


これにより、コンパイラが用意したアクセッサメソッド経由で値を代入したのと同じ意味となります。 これを以下の様にダイレクトに代入してしまうと、得られたNSStringがautoreleaseされますので、ある時点でエラーが発生しアプリケーションが落ちます。この記述の場合には自分でretainすることが必要です。くれぐれも注意いたしましょう!

md_name=[coder decodeObject];
md_type=[coder decodeObject];


また、ModelクラスのスーパークラスはNSObjectなので、先んじて以下の様な処理を実行していますが…

 if( self=[super init] )

もし、このスーパークラスがNSObjectではなくNSCodingプロトコルに準拠した別のクラスであれば、上記の部分は以下のように書き換える必要があります。こちらも注意が必要です。

 if( self=[super initWithCoder:coder] )

次回は、Modelオブジェクトのドキュメント(ファイル)への書き出しと読み込み処理を実装してみます。また、「しんぶんし 3」で、どのように画像ファイルを取り扱うのかも考えてみたいと思います。

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

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

・お勧め書籍はコレ
 シェルスクリプトの使い方は、前回説明した程度の対症療法的な知識で足りますが、自分で書こうとなると体系的な知識が必要です。Web上にそのようなリソースがあるかもと思い、方々探し回りましたが、見つかるのは書籍の内容のコピーばかりで、量的にも満足できるものは見当たりませんでした。
 こういった場面では、やはり書籍の力に頼らざるをえません。以下に挙げる書籍は、bashの機能およびBシェル(sh/bash)のシェルスクリプトについて、体系的に学習するに十分な内容を持っています。必ずしもMac OS Xをターゲットにしてはいないため、システム関連の話(/etcディレクトリ以下にある設定ファイルの話など)を自力で置き換えられる程度の知識は必要ですが、当て処もなくWebを彷徨うよりは時間の節約になること請け合いです。

1. UNIXシェルスクリプトコマンドブック
山下哲典 著
発売:ソフトバンククリエイティブ
ISBN:978-4-7973-3063-2
税込2,310円(税抜2,200円)

 シェルスクリプトのリファレンスとして有用な1冊です。480というページ数もさりながら、項目ごとに豊富なサンプルが掲載されているので、目的の処理にすばやくたどりつくことができます。解説も懇切丁寧、bashよりも「sh」をターゲットにしているため、普遍的なシェルスクリプトの文法/知識が身につきます。この内容とボリュームで税込2,310円は、かなり買い得感があるのではと思います。

2. bashクックブック
Carl Albing他著/クイープ 訳
発売:オライリー・ジャパン、オーム社
ISBN:978-4-87311-3760
税込4,410円(税抜4,200円)

 640ページにもわたる大著ですが、実例が豊富に掲載されています。どのようなプログラミング言語でも、他人が書いたサンプルコードというものは参考になるものですが、この書籍も同様に「習うより慣れろ」とでもいわんばかりに、これでもかという量の「レシピ」が掲載されています。「パイプラインでの検索」や「数値のリストの合計」、「多数のファイル名の変更」などのオーソドックスなものから、「データファイルからCSVへの変換」といった実用性の高いものまで、価格に見合う価値はあるのではないでしょうか。

3. 入門bash 第3版
Cameron Newham 著/クイープ 訳
発売:オライリー・ジャパン、オーム社
ISBN:978-4-87311-254-1
税込2,940円(税抜2,800円)

 bash解説本の定番「入門bash」の第3版です。bash 3.xのシェルとしての機能、シェルスクリプトインタープリタとしての機能について、体系立って解説されています。今年2月にbash 4.0がリリースされたため、バージョンとしては1つ前になりましたが、Mac OS X Leopardに収録されているbash(v3.2.17)には十分です。基本的な操作方法から各種カスタマイズ、さらにはシェルスクリプトの書き方も1冊でカバーしているという意味で、最初に選ぶ1冊としてはちょうどいいかもしれません。

 それでも書籍の購入に躊躇してしまう場合には、こちらのサイトがお勧めです。どちらも、大学の教材として作成されたドキュメントのようですが、それだけに平易に書かれているため理解しやすいと思います。書籍を購入する前に一読する価値はあるはずです。

1. /bin/shプログラミング入門
http://freebooks.info.nara-k.ac.jp/archive/ShellProgramming/index.html

2. Bシェルのスクリプト
http://www.wakhok.ac.jp/~maruyama/Unix92/shell2/shell2.html

・手始めに「変数」を理解する
 RubyやPythonのようにモダンな機能は備えていませんが、シェルスクリプトは体系立った文法を持つプログラミング言語です。なにか書こうと思い立ったときには、やはり基本構文の理解から始めることが王道でしょう。となると、最初にマスターすべきは「変数」と「ファイル」、「条件式」と「ループ処理」の扱い方になるでしょうか。順を追って話を進めるとして、まずは変数から始めてみます。
 シェルにおける変数は、「シェル変数」と「環境変数」の2種類があります。どちらもシェルおよびシェルスクリプトで設定/参照できますが、シェル上でのタスク(ジョブ)が終了した時点で内容が消えてしまう前者に対し、後者は終了後もシェル上に存在します(その環境変数を定義したプロセスが終了されれば消えます)。ローカル変数とグローバル変数の関係に似ていますが、プログラムが実行されているかどうかにかかわらず内容が保持されるという意味で、環境変数はよりシステムに近い存在といえるでしょう。
 シェル変数を定義する方法ですが、Bシェル(sh/bash)では以下の要領で記述します。たとえば、シェル変数「dummy」に「MOSA」という文字列を代入し、dummyの内容を標準出(ターミナルの画面)へ書き出すスクリプトは以下のとおりです。

- - - - -
#!/bin/sh
dummy="MOSA"
echo $dummy
- - - - -

 この場合、シェル変数として定義していますから、シェルスクリプトの終了と同時に「dummy」の内容は失われます。シェルスクリプト実行後に、シェルから直接「echo $dummy」と実行しても、なにも表示されないはずです。

 次回は、今回説明しなかった変数の参照方法と、環境変数の使い方について説明する予定です。

◇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)2009 MOSA. All rights reserved.