2009-03-24
目次
「Wonderful Server Life」 第89回 田畑 英和
iPhone OS 3.0の発表がありましたが、さっそくこの発表会の模様を収録したムービーが第85回の連載で紹介したPodcast番組でも配信されています。映像のフォーマットを確認してみると640×360のサイズでH.264を使用していることが分かります。収録時間は1時間27分、データサイズは786.7MBとなっています。
・Apple Keynotes
http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewPodcast?id=275834665
さて、前回まででPodcastを制作するためのサーバ側の準備は完了しましたので、いよいよコンテンツの収録を行ってみたいと思います。コンテンツの収録には「Podcast キャプチャ」を使用します。
◇「Podcast キャプチャ」による収録
第86回の連載でも説明したように「アプリケーション」>「ユーティリティ」フォルダには「Podcast キャプチャ」がインストールされています。このツールはサーバ上のPodcastプロデューサーと連携して動作し、クライアント上で収録したコンテンツをネットワークを経由してサーバにアップロードすることができます。「Podcast キャプチャ」はクライアントとサーバの両方にあらかじめインストールされていますが、Podcastの収録には通常はクライアントのMac OS Xを用いることになるでしょう。
「Podcast キャプチャ」を起動するとまずログイン画面が表示されます。ここでは、「サーバ」にPodcastサーバが稼働しているサーバのアドレスを入力し、さらにサーバ上のユーザで認証を行います。前回サーバ側の設定を行ったときにpcastuserユーザを登録していますので、今回はこのユーザで認証を行うことにします。必ずしもpcastuserユーザを使う必要はありませんので、必要に応じて新しくサーバ上に追加したユーザ(あるいは既存のユーザ)を使ってもかまいません。
・「Podcast キャプチャ」の起動画面(認証)
http://www.htabata.com/img/MXS105/podcast/Capture_02.png
ログイン認証に成功すると次にPodcastのタイプを選択する画面が表示されます。ここでは4つのタイプを選択することができ、それぞれ異なるタイプのPodcastを制作することができます。選択可能なタイプは次のとおりです。
・ビデオ
・オーディオ
・スクリーン
・ファイル
・タイプの選択
http://www.htabata.com/img/MXS105/podcast/Capture_03.png
「ビデオ」では、Macに内蔵されているカメラを使って動画をキャプチャすることができます。内蔵カメラだけではなく外付けのカメラを使用することもできます。「オーディオ」は音声のみのPodcastを制作する場合に使用します。
「スクリーン」はMacの画面をそのままキャプチャします。例えばKeynoteなどであらかじめスライドを作成しておき、フルスクリーンでスライドショーを再生しながら画面をキャプチャするといったことができます。このとき音声も同時に録音することができます。最後の「ファイル」ですがあらかじめなんらかの方法で制作しておいたムービーファイルがあれば、そのムービーファイル
を指定してPodcastプロデューサーにアップロードすることができます。
いずれかのタイプを選択するといよいよキャプチャです。キャプチャを開始するとカウントダウンが始まり収録が行われます。キャプチャですが「ビデオ」と「オーディオ」の場合は、リモートのカメラを使用することもできます。たとえば学校の教室で授業の様子をキャプチャするとします。このとき教室にあらかじめ収録用のMacを設置しPodcastプロデューサーに登録しておきます。すると講師は、自分のMac上で動作する「Podcast キャプチャ」から収録用のMacに内蔵(あるいは接続)されたカメラを指定することができます。教室のように常に同じ場所で収録するような場合には便利でしょう。
Podcastプロデューサーへのカメラの登録にも「Podcast キャプチャ」を使用します。カメラを登録するには「Podcast キャプチャ」>「ローカルカメラ設定」メニューを選択し、画面左下のアイコンをクリックしてロックを解除します。そして「カメラ名」にカメラの名前を自由に入力し、「サーバ」にPodcastプロデューサーが稼働しているサーバのアドレスを入力して「バインド」ボタンをクリックします。「バインド」ボタンをクリックすると、サーバの管理者としての認証を求められます。
登録済みのカメラは「サーバ管理」を使って確認できます。このときカメラにアクセス可能なユーザ/グループを制限することもできます。
・ローカルカメラ設定
http://www.htabata.com/img/MXS105/podcast/Capture_04.png
・Podcastプロデューサーに登録したカメラ
http://www.htabata.com/img/MXS105/podcast/pdcast_admin03.png
◇Podcastの公開
キャプチャが完了したら「Podcast キャプチャ」のウインドウで「公開」ボタンをクリックし、キャプチャしたデータをPodcastプロデューサーに転送します。このときワークフローを選択してタイトルと説明(省略可)を入力します。あらかじめいくつかのワークフローが用意されており、選択したワークフローによっては、イントロやウォータマークを追加することもできます。また
ストリーミング用のワークフローも用意されています。実際にストリーミングを公開するには、あらかじめサーバ上でQuickTime Streamingサービスを開始しておきます。
・ワークフローの選択
http://www.htabata.com/img/MXS105/podcast/Capture_05.png
Podcastプロデューサーに転送されたデータはXgridを利用してエンコーディング処理が行われます。このとき「Xgrid Admin」を使用すれば処理状況を確認できます。エンコーディング処理が完了すると、pcastuserやpcastadminにE-mailで通知が届きます。pcastadminにはXgridでの処理状況もE-mailによる通知が送られます。場合によってはエンコーディング処理に失敗することもありますが、そんなときはXgridの処理状況をメールで確認することで原因を特定することができます。
Mac OS X Serverでブログを使用している場合には、エンコーディング済みのデータが自動的にポストされます。ブログへのリンクは結果通知のE-mailに埋め込まれており、他にもiTunesでの購読用のリンクや、ダウンロード用のリンクが埋め込まれています。通知メールはデフォルトでは英語になっていますが、設定をカスタマイズすることで日本語の通知メールを送信することもできます。
・メールでの通知
http://www.htabata.com/img/MXS105/podcast/mail_01.png
・ブログに自動ポストされたPodcast
http://www.htabata.com/img/MXS105/podcast/blog_01.png
以上がPodcastプロデューサーを利用したPodcastの制作方法です。Xgridを用意したりと他のサービスとの連携もありますので、なかなか簡単にはいかないところもありますが、設定を1つ1つ確実に行って行けば必ず成功するはずです。また、Mac OS X Server Snow Leopardでは2つの入力ソースをサポートするなどさらに機能が強化されたPodcast Producer 2が搭載される予定になっています。
最後に実際にPodcastプロデューサーを使って作成したムービーを下記のURLにアップしておきました。このムービーでは最初にイントロムービーとタイトルが追加され、ムービーの本編にはQuartz Composer Filterを使ったエフェクト(アスキーアート)が適用されています。さらに画面右下には、アップルのロゴがウォータマークとして入っており、最後にExitムービーが追加されています。
音声にはノイズのような音が入っていますが、これはサーバで別のムービーのエンコーディング処理の真っ最中にキャプチャをおこなったので、そのときのサーバのファンの音をひろってしまったものです。エンコーディング中はかなりCPUパワーを消費し処理には時間もかかりますので、その点は注意が必要です。
・Podcastプロデューサーで作成したムービー
http://www.htabata.com/img/MXS105/podcast/089.mov
次回へつづく
小池邦人のCarbon視点でiPhone探求(2009/03/20)
今回は、Modelオブジェクトのドキュメントファイルへの書き出しと読み込み処理を実装してみます。また、「しんぶんし 3」で、どのように画像ファイルを取り扱うのかも考えてみます。
まずは、Modelオブジェクトのドキュメント処理のために、新しくDocumentクラスを定義します。Documentクラスのおもな仕事は、以下の3つとなります。
・新規でModelオブジェクト用の配列(NSMutableArray)を作成しておく。
・ファイルをアンアーカイブ(デコード)してModelオブジェクトへ代入する。
・全てのModelオブジェクトをアーカイブ(エンコード)しファイルへ保存する。
つまり、ドキュメントの作成、ロード、セーブの3つの処理を担当するわけです。以下がDocumentクラスの定義(Document.h)となります。
#import
インスタンス変数は、ドキュメントのファイルパス(保存場所)を保存しておくためのNSString *do_pathと、複数のModelオブジェクトを保存しておくための配列であるNSMutableArray *do_arrayの2つをとりあえず用意します。両方ともretainプロパティとして定義しておきます。これによりアクセッサメソッドを作成しなくともドット(.)演算子経由でアクセスすることができます。メソッドは create、load、saveの3つと、ドキュメントのファイルパスを得るためのpathの4つです。最後のgetDocumentPath()は、iPhoneアプリ固有のファイル保存場所(Documentディレクトリ)を返すCルーチンです。
Mac OS X用の一般的なCocoaアプリケーション(Documentタイプ)では、ドキュメントウィンドウをオープンするたびに、それに対応したDocumentオブジェクトがひとつ作成されます。そのため、複数のDocumentオブジェクトの管理を受け持つDocument Controllerクラスなどが別途用意されていました。しかしiPhone版の「しんぶんし3」では、ドキュメントはひとつしか扱いませんので、Document Controllerクラスを作ることはせず、その役割はSymmetryAppDelegateクラス(アプリケーション・デリゲート)に担ってもらうことにします。
まずは、SymmetryAppDelegateのクラス定義(SymmetryAppDelegate.h)にインスタンス変数Document *ap_documentを追加ます。
@class Document; // 先んじてクラス宣言しておかないとエラーになる
@interface SymmetryAppDelegate : NSObject
アプリケーション起動時に呼ばれるapplicationDidFinishLaunching:メソッドに、ドキュメントオブジェクトの作成とファイルの読み込み処理(アンアーカイブ)を追加します。対象となるソースファイルは、SymmetryAppDelegate.mです。ドキュメントの保存については、アプリケーション終了時に呼ばれるapplicationWillTerminate: メソッドに記述します。どちらもUIApplicationのデリゲートです。
- (void)applicationDidFinishLaunching:(UIApplication *)application // 起動時
{
if( ap_document=[[Document alloc] init] ) // ドキュメント作成
{
if( [ap_document load]==NO ) // ドキュメント読み込み
{
// ファイルの作成や読み込みに失敗した場合(エラー処理)
}
}
[window addSubview:[navigationController view]];
[window makeKeyAndVisible];
}
- (void)applicationWillTerminate:(UIApplication *)application // 終了時
{
[ap_document save]; // ドキュメントファイル保存
}
続いてDocumentクラスの実装(Document.m)です。ドキュメントの作成、ロード、セーブの3つのメソッドと、ひとつのCルーチンを記述します。ドキュメントファイルの名称は「Symmetry.archive」で固定します。
#import "Document.h"
@implementation Document
@synthesize do_path,do_array;
- (BOOL)create // ドキュメントの新規作成
{
BOOL ret=NO;
if( do_array=[[NSMutableArray alloc] init] ) // モデル配列を作成
ret=YES;
return ret;
}
- (BOOL)load // ドキュメントファイルの読み込み
{
BOOL ret=YES;
NSString *path;
path=[self pathDocument]; // Symmetry.archiveファイルのパスを得る
if( [[NSFileManager defaultManager] fileExistsAtPath:path]==YES )
{ // ファイルが存在しているか?
do_array=[[NSKeyedUnarchiver unarchiveObjectWithFile:path] retain];
// ファイルからdo_arrayt配列から読み込む
if( ! do_array ) // ファイル読み込み失敗
ret=NO;
}
else
ret=[self create]; // ファイルが存在しない場合はドキュメント新規作成
return ret;
}
- (BOOL)save // ドキュメントファイルへの書き出し
{
BOOL ret=NO;
if( do_array )
ret=[NSKeyedArchiver archiveRootObject:do_array toFile:[self path]];
// do_array配列をアカーブ化しSymmetry.archiveファイルへ保存
return ret;
}
- (NSString *)path // 保存用のドキュメントファイルのパスを返す
{
if( ! do_path ) // 既に設定済みならそのまま返す
self.do_path=getDocumentPath( @"Symmetry.archive" );
// ドキュメントファイル(Symmetry.archive)のパスを得る
return do_path;
}
最後はドキュメントディレクトリ経由のパス名を得るためのgetDocumentPath()ルーチンです。このルーチンは画像ファイルのロードやセーブでも利用する予定ですので、pathメソッドから分離して用意しておきます。こうした処理において、インスタンス変数を扱わないのであれば、Cルーチンとして用意しておくと、どのオブジェクトからも呼び出し可能で便利です。
NSString *getDocumentPath( NSString *name )
{
NSString *path=nil;
NSArray *paths;
NSString *dir;
paths=NSSearchPathForDirectoriesInDomains(
NSDocumentDirectory,NSUserDomainMask,YES );
// ドキュメントディレクトリーを含むリスト配列
if( [paths count] > 0 )
{
dir=[paths objectAtIndex:0]; // ドキュメントディレクトリそのもの
path=[dir stringByAppendingPathComponent:name];
// ファイルパス名の作成(名前を追加)
}
return path;
}
次回は、画像ファイルの話です。画像ファイルは、Modelオブジェクトのドキュメントからは分離して別に保存します。登録一覧(UITableView)に画像を表示するためには、画像ファイルから小サイズ画像(UIImage)を作る必要もあります。
ターミナルの向こうから 第44回 海上 忍
・シェルスクリプトをFinderから実行する
これまでシェルスクリプトについて紹介してきましたが、1つ肝心なことを失念していました。作成したシェルスクリプトをどのように実行するか、Mac OS Xらしく実行するにはどうすればいいか、ということです。シェルスクリプトに関する知識のないユーザに配布する可能性を考慮し、いくつかのシチュエーションに分けて考えてみたいと思います。
まず、Finderでの利用について。ファイルをダブルクリックすれば実行開始ということは、敢えて説明するまでもないMacユーザ共通の約束事ですが、シェルスクリプトは3つの条件をクリアしなければダブルクリックでは実行できません。
1つは、ファイルの拡張子が「.command」であることです。この拡張子に変更しなければ、ダブルクリックでターミナルに処理を受け渡すことはできず、ターミナルが起動していない場合は起動後に実行、という処理もできません。
もう1つは、改行コードです。Macintoshでは伝統的に、テキストファイルの改行コードを「CR」としますが、UNIXでは「LF」、Windowsでは「CR+LF」です。Terminal(正確にはインタープリタであるシェルの「bash」)は、改行コード「CR」と「LF」のファイルは正しく解釈できますが、「CR+LF」はエラーになります。シェルスクリプトを実行したとき、
「/bin/sh^M: bad interpreter:」
というエラーメッセージが表示された場合には、テキストエディタの改行コードが「CR」または「LF」に設定されているかどうか確認しましょう。
・chmodコマンドで実行権限を与える
以上の作業により、シェルスクリプトをダブルクリックで実行できるようになりますが、「ファイル”XXX.command”は、適切なアクセス権がないため実行することができません」とエラーメッセージが表示されることがあります。この場合は、ファイルに「実行権限」を与える必要がありますが、エラーメッセージの指図通りFinderの「情報」ウインドウから実行権限を与えようとしても、期待どおりにはなりません。
シェルスクリプトに実行権限を与えるには、Terminalから「chmod」コマンドを利用します。基本的な書式は以下のとおりで、オプション「+x」に続けて、シェルスクリプトのファイル名を引数として与えればOKです。これで、適切なアクセス権がない、と実行を拒否されることはなくなるはずです。
- - - - -
$ chmod +x filename.command
- - - - -
・実行権限とは
chmodコマンドの話が出ましたので、ファイルの「実行権限」についても説明しておきましょう。なお、ここでいう実行権限とは、TigerからサポートされたACL(Access Control List)レベルの話ではなく、Darwinの原型となったBSD UNIX時代から続く(POSIX標準の)ファイルアクセス権限に関する話ですので、念のため。
ほとんどすべてのUNIX互換OSが採用するPOSIX準拠のファイルシステムでは、ファイル/フォルダには個別に「パーミッション」と呼ばれる情報が割り当てられます。このパーミッション情報は八進数で表現されますが、直感的にわかりにくいため、chmodなどのコマンドでは読み取り権限(r)、書き込み権限(w)、実行権限(x)という記号で表現されます。
この情報は、Terminalから「ls」コマンドに「-l」オプションを付けた「ls -l」で確認できます。実行権限の有無は属性項目に「x」があるかどうか、つまり「x」があればシェルスクリプトとして実行でき、なければ実行できない、ということになります。
前述の「chmod +x」は、引数に与えたファイルに実行権限を与えることを意味します。ちなみに、実行権限を剥奪したければ、オプションは「-x」です。読み取り権限(r)と書き込み権限(w)についても、同様に「+」と「-」で変更できます。ただし、自分が所有者でないファイルは作業対象にできないため、sudoコマンドを使い管理者の権限でchmodコマンドを実行(sudo chmod 〜)しなければなりません。
- - - - -
$ ls -l test.command
-rwxr-xr-x 1 shinobu staff 38 3 21 16:13 test.command
- - - - -
- - - - - -
表:chmodコマンドで使うパーミッション関連の記号
8進数 記号 意味
= = = = = = = = = = = = = = = =
0400 u+r 所有者に読み取りを許可する
0200 u+w 所有者に書き込みを許可する
0100 u+x 所有者に実行/検索を許可する
0040 g+r 同一グループのユーザに読み取りを許可する
0020 g+w 同一グループのユーザに書き込みを許可する
0010 g+x 同一グループのユーザに実行/検索を許可する
0004 o+r その他のユーザに読み取りを許可する
0002 o+w その他のユーザに書き込みを許可する
0001 o+x その他のユーザに実行/検索を許可する
- - - - - -
◇MOSAからのお知らせと編集後記は割愛します◇