MOSA Multi-OS Software Artists

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

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

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

2008-10-14

目次

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

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

  〜「iPhone構成ユーティリティ」編〜

 今回は少し話題を変えて、ようやくNDAも解禁になろうとしているiPhoneについて取り上げてみます。といいましても開発ネタではなくiPhoneの運用に関するお話です。
 システム管理の観点から考えますと、なにか新しい製品を購入した場合、初期設定などの作業を行ってから配置するといった作業が必要になります。Macならばユーザ登録をしたり、アプリケーションをインストールしたりといった作業が考えられますが、これはiPhoneも同様です。
 iPhoneのような高機能な携帯端末はもはや超小型のパソコンといってもいいくらいですが、実際に使用するとなるとWi-Fiの設定やMailアカウントの設定、パスコードの設定やVPNの設定など様々な設定項目があります。
 個人でiPhoneを利用する場合、こういった設定は通常各ユーザごとに行うわけですが、今後企業での大量導入が進んだりするとあらかじめ設定を行ってから社員に配布するといったことが考えられます。このとき、1台1台iPhone上で設定を行っていてはとても手間がかかります。そこでこういった作業を効率よく行うための設定ツールがAppleよりリリースされています。

◇iPhone構成ユーティリティ
「iPhone構成ユーティリティ」というのが設定ツールの名称ですが、最近少しバージョンアップした1.0.1がリリースされました。このツールはMac OS X上で動作し、無料で使用することができます。また、iPhoneの設定だけではなくiPod Touchの設定を行うこともできます。

・iPhone Configuration Utility 1.0.1 for Mac OS X
http://www.apple.com/jp/ftp-info/reference/iphoneconfigurationutility101formacosx.html

 このツールをダウンロードしてインストールすると、「/アプリケーション/ユーティリティ」にインストールされます。
 iPhone/iPod touchの設定を行うには、このツールを使って構成プロファイルの作成を行います。左側のリストから「構成プロファイル」を選択しツールバーの「新規」ボタンをクリックしてプロファイルを新しく作成します。
 プロファイルは複数作成することもでき、それぞれ次のような項目を設定できます。

・一般
  プロファイルの名前や識別子、プロファイルの署名などの設定
・パスコード
  パスコードのポリシーを設定
・Wi-Fi
  アクセスポイントのSSIDやセキュリティの設定、複数設定可
・VPN
  VPN接続のための設定、複数設定可
・メール
  メールアカウントの設定、複数設定可
・Exchange
  Exchange ActiveSyncに関する設定
・資格情報
  デバイスにインストールする証明書の設定
・詳細
  キャリアのアクセスポイントに関する設定

 パスコードの設定では、通常は数字4桁のパスコードをアルファベットも使用可能にしたり、パスコードの長さや有効期限などの設定もできますので、個人使用の場合でもよりセキュリティを高めたい場合などには有効です。

・パスコードの設定
http://www.htabata.com/img/iPhone/iPCU/iPCU_03.png

◇構成プロファイルの配布
 プロファイルの準備が整ったら次はプロファイルをiPhoneやiPod touchのデバイスに配布します。配布の方法はE-mailとWebの2つが用意されています。
E-mailを使用する場合には「iPhone構成ユーティリティ」から「Mail」アプリケーションを呼び出して、プロファイルの添付書類付きメールを作成することができます。あとはメールを送信してデバイス側で受信します。メール経由で設定を配布するということは、あらかじめデバイス側でメールが受信可能な状態になっている必要があります。
 もう1つの方法はWebサーバ経由での配布です。「iPhone構成ユーティリティ」からプロファイルを書き出して、書き出したファイルをWebサーバ経由でアクセスできるようにします。書き出したファイルの拡張子には.mobileconfigを使用し、デバイス側でこのファイルを正しく認識させるには、あらかじめWebサーバ側で以下のMIMEタイプの設定を行っておく必要があります。

 拡張子:mobileconfig
 MIMEタイプ:application/x-apple-aspen-config

 WebサーバがMac OS X Server v10.5.3以降であればこのMIMEタイプの設定はあらかじめ行われていますので、Webサーバでの追加の設定は必要ありません。

 E-mailでもWebでもプロファイルを取得するにはデバイスがネットワークに接続できる必要があります。つまり、「iPhone構成ユーティリティ」を使って設定をするには、あらかじめデバイスをネットワークに接続できる状態にしておく必要があるということです。
 ちなみに、プロファイルはXML形式のテキストファイルです。暗号化されたり圧縮されたりはしていません。

◇構成プロファイルの適用
 E-mailまたはWeb経由でデバイスにプロファイルをダウンロードしたら、いよいよプロファイルのインストールです。たとえばSafariでプロファイルのURLにアクセスすると、プロファイルのインストール画面が表示されます。

・プロファイルのインストール
http://www.htabata.com/img/iPhone/Profile/profile_01.png

 プロファイル作成時にプロファイルの署名が設定できますが、これは必須ではありません。もしプロファイルに署名が設定されていなければインストール画面に「符号なし」と表示さます。ちょっと分かりにくい日本語になっていますがこれはプロファイルが署名されていないことを表しています。また、署名がない場合インストール時に警告が表示されますが、インストールはできます。
 インストール画面で「インストール」ボタンをクリックすればプロファイルをデバイスに適用できます。このとき、プロファイルでパスコードのポリシーを設定していればパスコードの入力が、Wi-Fiの設定をおこなっていればアクセスポイントのパスワードの入力が求められます。

 いったんインストールしたプロファイルを削除したい場合には「設定」>「一般」>「プロファイル」から削除することができます。

・インストール済みのプロファイル
http://www.htabata.com/img/iPhone/Profile/profile_03.png

 今回はMac OS X上で動作する「iPhone構成ユーティリティ」について説明しましたが、Webブラウザ上で設定を行う「Web Utility」も用意されており、こちらはMac版だけでなくWindows版も用意されています。

・Web Utility Mac版
http://www.apple.com/support/downloads/iphoneconfigurationwebutility10formac.html
・Web Utility Windows版
http://www.apple.com/support/downloads/iphoneconfigurationwebutility10forwindows.html

 また、「iPhone構成ユーティリティ」はアプリケーションの配布にも使用することができます。こちらについてはまた機会があればご紹介したいと思いますが、より詳しい情報については「エンタープライズ運用ガイド」を参照してください。

・エンタープライズ運用ガイド
http://www.apple.com/jp/support/iphone/enterprise/
次回へつづく                             

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

〜 得られたファイルの種類を調べる 〜

今回は、 エイリアスファイルに関わる処理をするresolveAlias()ルーチンや、パス名で示されたファイルがImageBrowserで扱える画像かどうかを判断しているchkImageFile:クラスメソッドを中心に解説します。

まずは、ファイル操作関連のドキュメントから紹介したいと思います。Mac OS Xのファイルシステムに関しての総論については以下のドキュメントを参照します。

「File System Overview」

http://developer.apple.com/documentation/MacOSX/Conceptual/BPFileSystem/BPFileSystem.html

次はCocoaアプリケーションでのファイル処理についての解説です。以下のドキュメントには、オープン・パネル(Carbonのファイル選択ダイアログ)やセーブ・パネルなどの利用方法が解説されています。

「Application File Management」

http://developer.apple.com/documentation/Cocoa/Conceptual/AppFileMgmt/AppFileMgmt.html

こちらは、Cocoaアプリケーションで確保したオブジェクトをアーカイブとしてファイル保存するための方法が解説されています。

「Archives and Serializations Programming Guide for Cocoa」

http://developer.apple.com/documentation/Cocoa/Conceptual/Archiving/Archiving.html

次のドキュメントは基本的なファイル操作(作成、オープン、リード、ライトなど)についての解説です。NSFileManagerやNSFileHandleクラスのメソッド紹介が中心ですが、今回取り上げる「エイリアス解析」についても、21ページからの「Resolving Aliases」において解説されています。

「Low-Level File Management Programming Topics」

http://developer.apple.com/documentation/Cocoa/Conceptual/LowLevelFileMgmt/LowLevelFileMgmt.html

Mac OS Xのファイルシステムでは、ファイルの種類(JPEGなのかTIFFなのか等)を判別するために「UTI」(Uniform Type Identifiers)が導入されています。これは、Mac OS X 9までのファイルタイプ(半角4文字)による判別や、拡張子(.textなど)による判別に取って代わる仕組みです。以下のドキュメントは、そのUTIについての解説です。

「Uniform Type Identifiers Overview」

http://developer.apple.com/documentation/Carbon/Conceptual/understanding_utis/understand_utis_intro/chapter_1_section_1.html

今回の話で取り上げるchkImageFile:メソッドでは、UTIを調べることで、ImageBrowserで扱える画像ファイル(ムービーとQuartz Composerファイルも登録可能)かどうかを判断することになります。

まずはエイリアスの中身を解析して、その実体ファイルの保存場所(パス名)を得るためのresolveAlias()ルーチンです。これはCルーチンとして提供されています。Objectiv-Cのクラス内では、Cルーチンも問題なく記述することができます。そうしたルーチン内でObjectiv-Cのメソッドを利用することも可能ですが、そのクラスのインスタンス変数にはアクセスできませんので注意してください。CocoaのFoundation FrameworkとCore Foundation Frameworkで取り
扱うオブジェクト(例えばNSStringとCFStringRef)には互換性がありますので、お互いに対応するAPIをうまく利用すれば、CarbonとCocoaで共通利用できるユーティリティルーチンが作成できます。

NSString *resolveAlias( CFStringRef path )
{
   CFStringRef    respath=NULL;  // 実体が得られない場合はNULLが返る
   Boolean        folder, alias;
   CFURLRef       url,resurl;
   FSRef          fref;
   OSErr          err;

   if( url=CFURLCreateWithFileSystemPath( kCFAllocatorDefault,path,
                                       kCFURLPOSIXPathStyle,FALSE ) )
   {                                   // パス名からCFURLRefを得る
       if( CFURLGetFSRef( url,&fref ) )  // CFURLRefからFSRefを得る
       {
           err=FSResolveAliasFile( &fref,true,&folder,&alias ); // エイリアス解析
           if(err==noErr && alias )  // エイリアスであれば実体のFSRefを得る
           {
               if( resurl=CFURLCreateFromFSRef( kCFAllocatorDefault, &fref ))
               {                    // 解析されたFSRefからCFURLRefを得る
                   respath=CFURLCopyFileSystemPath( resurl,
                                                   kCFURLPOSIXPathStyle );
                                   // CFURLRefから実体ファイルのパス名を得る
                   CFRelease( resurl );
               }
           }
       }
       CFRelease(url);
   }
   return (NSString *)respath; // 実体ファイルのパス名が得られればそれが返る
}


Core Foundationで確保したオブジェクトはAutoReleaseされませんので、不用なものはCFRelease()で解放することを忘れないでください。次は、chkImageFile:クラスメソッドです。こちらはメソッド内でCore FoundationのAPIを多用する例です。呼び出し方は、MyDocumentクラスのクラスメソッドですので…

[MyDocument chkImageFile:path];

という感じになります。メッセージのpathにはファイルパス名を設定します。こちらもresolveAlias()と同様にCルーチンとして記述しても構いませんが、比較のためにクラスメソッドとして用意してみました。

得られたファイルのパス名からCFURLRefを得て、それをLSCopyItemInfoForURL()に渡すことでLSItemInfoRecord構造体を得ています。
構造体メンバーに含まれているファイル情報(拡張子とファイルタイプ)を、UTTypeCreatePreferredIdentifierForTag()やUTTypeCreatePreferredIdentifierForTag()に渡してUTI情報を得ています。最終的には、それがCoreGraphicsでサポートしている画像種類に含まれるかどうかを比較して調べます。未サポートであれば、最後に、それがムービーファイ
ルか?Quartz Composerファイルか?を再調査し、そうであればImageBrowserへの登録対象と判断します。

+ (NSString *)chkImageFile:(NSString*)path
{
   CFStringRef        cc,type,comf=nil;
   CFStringRef        uti=nil;
   CFArrayRef         suport;
   LSItemInfoRecord   info;
   CFIndex            i,ct;
   CFURLRef           url;

   if( url=CFURLCreateWithFileSystemPath( kCFAllocatorDefault,
               (CFStringRef)path,kCFURLPOSIXPathStyle,FALSE ) )
   {                              // パス名からCFURLRefを得る
       if( ! LSCopyItemInfoForURL( url,kLSRequestExtension | 
                                   kLSRequestTypeCreator,&info ) )
       {                           // CFURLRefからLSItemInfoRecordを得る
           if( info.extension )    // 拡張子が付いていればそこからUTIを得る
           {
               uti=UTTypeCreatePreferredIdentifierForTag( 
                 kUTTagClassFilenameExtension,info.extension,kUTTypeData );
               CFRelease(info.extension);
           }
           if( ! uti )  // 拡張子は付いていなかった
           { 
               if( type=UTCreateStringForOSType( info.filetype ) )
               {    // その場合はファイルタイプからUTIを得る
                   uti=UTTypeCreatePreferredIdentifierForTag( 
                                   kUTTagClassOSType,type,kUTTypeData );
                   CFRelease( type );
               }
           }
           if( uti )  // UTIを得ることができた
           {
               suport=CGImageSourceCopyTypeIdentifiers();
                   // CoreGraphicでサポートする画像情報を得る
               ct=CFArrayGetCount( suport );
               for( i=0;i


ここでのLSCopyItemInfoForURL()やUTTypeCreatePreferredIdentifierForTag()などは「LaunchServices Framework」に所属するAPIです。定義されているヘッダファイルはLaunchServices.hとUTType.hですので、APIや構造体の詳細についてはそちらを参照してみてください。

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

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

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

 コマンドはできれば使いたくない、Terminalを起動しても何をすればいいかわからない……CUIが苦手だ、という方からよく聞くコメントです。洗練されたGUIを誇るMacのこと、MPW(Macintosh Programmer's Workshop)などの例外を除けば、CUIに縁がなかったことも事実。会員からコマンド/ターミナル初心者向けの読み物を望む声が多いと聞き、しばらくの間ご要望にお応えしようと考えた次第です。

・「コマンド」を知る
 最初に、「コマンド」について説明してみましょう。コマンドとは、ある処理を行う実行形式のファイル、すなわちアプリケーションです。なんらかの処理を行うという意味では、DockやApplicationsフォルダに並んだアプリケーション(.app)と変わりません。Finderからダブルクリックする形でも、コマンドを実行することは可能です。
 ただし、GUIのアプリケーションとは処理を開始するときのスタイルが異なります。1つは、処理を開始するにあたり、なんらかの「動作条件」を与えること。その条件が、「オプション」や「引数」です。オプションや引数を指定してコマンド(オプションや引数を含め「コマンドライン」と呼びます)を実行するために、その専用環境として「ターミナル」を利用するわけです。

・「ターミナル」と「シェル」の関係
 ターミナルはコマンドを実行するための専用環境と書きましたが、実際にその役目を司るのは「シェル」と呼ばれるプログラムです。ターミナルの前に、シェルについて説明しておきましょう。
 シェルとは、システムの中核(カーネル)に命令を伝えるためのユーザインターフェイスの一種です。キャラクタベースのアプリケーションで、キーボードなどのデバイスから入力した情報(コマンドライン)を解釈し、カーネルに伝える役割を果たします。プロンプトを表示してコマンド入力待ちの状態を知らせたり、カーソルキーでコマンドラインを編集したりする機能は、シェルに
より提供されます。
 そのシェルも実行形式のファイルであり、コマンド/アプリケーションですが、人間と情報をやり取りするために文字の描画を必要とします。その機能を提供するのがターミナルソフト(仮想端末/ターミナルエミュレータ)で、かつてVAXなどミニコンの時代に確立された端末画面を模したものです(いまどきの高解像度モニタで80×24字を全画面表示する必要はありませんから)。Mac OS Xを含む現在のUNIX系OSにおいて、シェルとターミナルソフトは事実上不可分な状態にあります。
 Mac OS Xに標準装備の「ターミナル」は、このターミナルソフトの一種です。ターミナルを起動すると、あらかじめ指定しておいたシェル(初期値では「bash」)が起動されコマンド入力待ちになりますが、ターミナルとシェルは別物だということは理解しておくべきでしょう。

・まずは「シェル」を理解しよう
 以上を要約すると、ターミナルというアプリケーションは表示用の器で、コマンドを実行するという処理の核心部分では「ユーザインターフェイスであるシェル」と「コマンドライン」こそが重要ということになります。コマンドを自在に使えるようになるためには、シェルの機能を知ることが不可欠です。
 それでは、ターミナルを起動してみましょう。なにも設定されていない状態であれば、「MBPro:~ shinobu$」といった具合に、「コンピュータ名:~ ユーザ名$」の形式でコマンド入力待ちを知らせるプロンプトが表示されているはずです。
 このプロンプトは、キーボードから文字入力を受け付け解釈するために、シェルによって表示されているものです。それでは試しに、このプロンプトをより使いやすく設定してみましょう。以下の文字列をコピーし、プロンプトのところへペースト後に実行(行末でenter)してください。

- - - - -
export PS1=' [ e[34m ] @  [ e[33m ] u@ h  [ e[32m ] w e[0m n $ '
- - - - -


 どうでしょう? プロンプトが、「09:45 AM shinobu@MBPro ~」(時刻とユーザ名/コンピュータ名は環境により異なる)と「$」の2行で表示されたはずです。しかも時刻と「shinobu@MBPro ~」の部分はカラー。シェル(bash)のプロンプト表示スタイルを司る環境変数「PS1」にルールに沿った設定を施し、プロンプトをカスタマイズしたに過ぎませんが、シェルの働きの一端を知ることができたはずです。なお、この設定はターミナル(正確にはシェル)を
終了すれば失われ、元の状態に戻ります。

 それでは最後にもう1つ。プロンプトが表示されているとき、[control]-[p]を押してみてください。前述の例でいえば、「export PS1= …」が表示されたはずです。これは「コマンド履歴(ヒストリ)」というbashに用意された機能で、これまで実行したコマンドラインを時間を遡る(下ることも可)ように呼び出すことができます。Finderに喩えれば、「最近使った項目」といったところでしょうか。

 次回からは、代表的なコマンドの使い方を絡めつつ、シェルの使い方を体系的に解説したいと思います。

◇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.