2006-03-14
目次
「WebObjects Dev Report」 第43回 田畑 英和
今回はWebObjectsアプリケーションのインストールについて解説します。プロジェクトが完成し、運用を開始するにはまずインストールを行います。このときあらかじめ開発機上でインストール用のビルドを行い、その後運用機にビルド済のファイル一式を移動するという手順になります。
◇インストール用のビルド
ビルドを行う前に、いったんプロジェクトをクリーニングした状態から正常にビルドができるかどうかを確認しておくのがよいでしょう。問題なくビルドできれば、さっそくインストール用のビルドです。前回Split Installの話をしましたが、Web Server Resourcesとそれ以外の部分を分割してインストールする必要があるため、ビルドも分割して行います。Xcodeにはビルドを実行するためのコマンドxcodebuildが用意されていますので、このコマンドを使ったやり方を紹介しましょう。
xcodebuildはバージョンによってオプションが異なりますが、以下のようなコマンドを実行します。このコマンドは「ターミナル」を使って、プロジェクトが存在するディレクトリに移動してから実行します。
・Xcode 2.0以前の場合
xcodebuild install -buildstyle Deployment DSTROOT=/
xcodebuild install -buildstyle WebServer DSTROOT=/
・Xcode 2.1以降の場合
xcodebuild install -configuration Deployment DSTROOT=/
xcodebuild install -configuration WebServer DSTROOT=/
Xcode 2.0までは-buildstyleと指定していたオプションがXcode 2.1からは-configurationに変わっています。このオプションのパラメータでビルドの形式を指定しますが、”WebServer”と指定するのがWeb Server Resources用のビルド形式になり、”Deployment”と指定するのがそれ以外のファイル用のビルド形式になります。
ビルドを実行すると、アプリケーションの場合はデフォルトで次のパスにビルド済のファイルがインストールされます。
・Deployment
/Library/WebObjects/Applications
・WebServer
/Library/WebServer/Documents/WebObjects
インストール先は自由に変更することができます。Xcodeでプロジェクトを開いて、ターゲットの設定で「インストール先」を変更します。このとき設定をおこなうターゲットは、アプリケーション名がついたターゲットを設定します。
フレームワーク用のプロジェクトをインストールする場合もビルド方法は同じですが、インストール場所が異なります。フレームワークの場合はデフォルトで次のパスにビルド済のファイルがインストールされます。
・Deployment
/Library/Frameworks
・WebServer
/Library/WebServer/Documents/WebObjects/Frameworks
フレームワークはアプリケーションから参照されますので、手順としてはまずフレームワークをビルドしてから次にアプリケーションをビルドすることになります。
つまりアプリケーションをビルドする時点では、すでにフレームワークはビルドされて/Library/Frameworksにインストールされています。アプリケーションのプロジェクトに登録したフレームワークが、インストール後の正しいパスを参照していることを確認してから、アプリケーションのビルドを行うよう注意が必要です。
◇運用機へのインストール
開発機上でのビルドが終われば、次はビルド済のファイルを運用機上に移動します。ようするに運用機上にファイルが転送できればよいのですが、ファイルの転送には「Apple Remote Desktop(以下ARD)」がお勧めです。ARDはマシンをリモートで操作するためのソフトですが、ファイルを転送するための機能も備えています。
ARDを使用するためにはあらかじめ、転送先のマシンでARDを有効にしておく必要があります。「システム環境設定」の「共有」からARDを有効にすることができます。このときARDでのアクセスを許可するユーザを指定します。
ファイルの転送時には転送元のパスと同じ場所に転送することができますので、開発機上でインストールしたファイルがそのまま運用機上にも同じパスで転送することができます。
「ARD」は別売のソフトですが、こちらを利用できない場合はAFPでファイルを転送したり、なんらかのメディアを経由して運用機上にファイルをコピーします。
◇その他の準備
アプリケーションがフレームワークだけでなくjarファイルなどを参照している場合は、それらのファイルもあらかじめ運用機上に準備しておく必要があります。またデータベースに関してもあらかじめ適切なセットアップを行っておく必要があります。
アプリケーションサーバとデータベースサーバを別マシンで運用する場合には、運用環境でのデータベースの接続先が開発機上とは異なる場合がありますので、このような場合にはモデルファイルに設定したJDBCのURLに注意する必要があります。
また実際にアプリケーションの運用を始める前に、コマンドラインから直接アプリケーションを起動して、正常に起動するかどうかを確認しておきましょう。こうすることでサーバ設置時のミスを防止することができます。コマンドラインからアプリケーションを実行するには、「ターミナル」を使ってアプリケーションがインストールされているディレクトリに移動し、プロジェクト名と同じ名前のファイルを実行します。このファイルはアプリケーションの起動用スクリプトになっています。
藤本裕之のプログラミング夜話 #87
さて、前回までのややこしいアトリビュートが片づき、今回のネタは「Has texture」。もうこれは「読んで字の如しであります、以上おわり」で次に行ってもいいような項目だ、と思うでしょう? ところが調べてみるとなかなかどうしてそうでもないのであった。
まずはちょうど10回前、本連載第77回から数回に渡って説明したNSWindowの初期化メッセージを思い出してくだされ。
-(id) initWithContentRect:(NSRect)contentRect
styleMask:(unsigned int)aStyle
backing:(NSBackingStoreType)bufferingType
defer:(BOOL)flag;
あのとき私は、これの2番目のパラメータ、styleMaskについて、NSWindow.hに以下のような定義があると書いた。
enum {
NSBorderlessWindowMask = 0,
NSTitledWindowMask = 1 << 0,
NSClosableWindowMask = 1 << 1,
NSMiniaturizableWindowMask = 1 << 2,
NSResizableWindowMask = 1 << 3
};
そして、Interface Builderでは一番上のNSBorderlessWindowMaskをセットすることはできないので、タイトルバーのないウインドウを作りたいときには、initWithContentRect:styleMask:backing:defer: をプログラムから呼び出すしかないという説明をしたのである。覚えてますか。
説明がややこしくなるのであんときは割愛したのだが(つうか、なにを隠そう今回のために虎視眈々タンカラリンととっておいたのだが)、NSWindow.hの上の定義のすぐ下に、実は次のような追加がある。
#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_2
/* Specifies a window with textured background (eg. metal)
*/
enum {
NSTexturedBackgroundWindowMask = 1 << 8
};
#endif
そうなのだ。Interface Builderでは別建てだが、実は今回のテーマ「Has texture」アトリビュートは、あの styleMask で指定されるものであり、したがって、styleMask他のビットと同様、いったんウィンドウを作っちゃったらプログラムから『あ、やっぱテクスチャやめます』とかいうことはできないのである。びっくりしましたか。
なお、テクスチャを持つウインドウと通常のウインドウの違いに、前者はタイトルバーだけでなくウインドウのバックグラウンド部分を「掴んで」ドラッグすることが出来る、というのがあるが、この機能は実はテクスチャとは独立で、setMovableByWindowBackground: というメッセージで変更することができる。これで「NO」をセットすれば、テクスチャ・ウインドウでもタイトルバー以外のところを「掴んで」ドラッグできなくすることが可能だし、逆もまた真、普通のウインドウを「そこらを持ってドラッグできる」ようにも出来るのだ。
もうひとつ「なお」、注意深いヒトは上の追加定義の下に、Tigerになってからの追加があと2つあることに気付いたと思う。が、これについても「フジモトめ、出てきたときに『実はまだあったのである』とやるつもりだな」と察して、今は見て見ぬふりをしてくれるような大人のヒトがオレは好きである。ではまた次回。
(2006_03_10)
高橋真人の「プログラミング指南」第85回
〜Perlについて(31)〜
こんにちは、高橋真人です。
さて前回ご紹介した、私が実際に仕事で使ったスクリプトを解説して行くわけですが、このスクリプトで私が処理したのは辞書用の登録データです。余り細かくは触れませんが、このデータはMacの世界ではよく見るタブ区切りのテキストで、1レコードが1行、各項目をタブで区切ってあるというフォーマットになっています。
そんな形のテキストデータを処理するために私が書いた先のスクリプトですが、大まかに見ると以下のような処理の流れとなります。
1. 入力ファイル名の末尾に".sort"と付けたものを出力ファイル名とする
2. 出力ファイルを開く(なかったら作成)
3. 出力ファイルのクリエータ・タイプをYooEditのテキストに
4. データ処理、書き出し
5. メッセージダイアログを表示、終了
スクリプトの行数の割に処理内容が少ないと思われるかもしれません。実はこのスクリプトのキモはほとんどが4.にあり、それ以外はおまけです。そして、4.の部分に該当するのは、実は全体の30行を占める「1つの文」です。
ちなみに、3.と5.に関しては頭にMacPerl::と付いていることからも分かるように、MacPerlによる独自の拡張です。今でこそ、BSDのレイヤーからもMac OS Xの独自の部分のいくつかにはアクセスできるようになっていますが、当時は純然たるUNIX文化のPerlとMac独自の部分を融合することは決して容易なことではなかったので、これらのMacPerl拡張には重宝しました。
もっとも、MacPerlが備えていた独自拡張はこの程度のものではなく、Toolboxの各種マネジャーにもアクセスできるようになっていたはずです。ただ、当時の私の技術力では残念ながらこれらの機能を生かすことはできなかったのですが。
さて、話を戻します。Perlではセミコロンが付いたところで文が終わることになっていますので、このスクリプトは実はたった7つの文からなっているということが言えるのです。
「え?! セミコロンはもっといっぱいあるけど?...」なんて声も聞こえてきそうですが、この7つの文というのはあくまで「複文も1つの文」と見なしてのことです。つまり、{} によって囲まれているのは、複数の文がまとめられて一つの文になっているという見方です。
もちろん「文の数が少ない方が偉い」などという価値観でお話ししているわけではありません。注目してほしいのは、どうして行数にして30行近くあるこれだけの処理内容をあえて1行で書くのかというところです。確かに変数などを新たに設けることによって、複数の文に分けることはもちろん可能です。しかし、ここはあえて1つの文で書く方が合理的なのだということです。
実は私がPerlの勉強を進めて行っていちばん衝撃を受けたのがこのことです。ここをメインに少し掘り下げてみましょう。
この「1文」の構造の概略を示すと、以下のようになります。
map {} sort {} map {} grep {} map {} <>;
{} の中、つまり複文の中に書いてあるこまごました処理を省略するとこのような流れが見えてきます。map、sort、grepなどの演算子が並んでいますが、{} で囲まれた複文の部分は、これらの演算子を修飾していると見てください。
先頭から見ると、mapはsortの結果を受け、sortはmapの結果を受け、mapはgrepの結果を受け...、という具合になるわけですが、ここはそうやって前から見て行くのではなく、後ろから読んで行くのです。
まず、<>によってstdin(MacPerlでは、ドロップしたファイルがここに割り当てられる)からデータを読み込んできますが、ここはリストコンテキストなので、結果としてファイルの各行が要素となったリストが返されます。
なぜ、リストコンテキストなのかというと、次にデータが渡される、1つ前の演算子であるmapがリストを要求するからです。ちなみに、今までの連載でご理解いただけた方もいらっしゃると思いますが、map、sort、grepの各演算子はいずれもリストコンテキストを要求するものとなっています。
実は、正にこここそが、今回説明する形式の処理でのポイントとなります。演算子が順番に並んでいますが、データはリストの形で後ろから前に順番に処理されて行きます。
実は連載の61回目でもこのやり方に少し触れていますが、今回はもう少し分析的に解説してみましょう。
まず、sort演算子を例にとります。sortはリストを受け、それを並べ替えてリストにして返します。例えばこんな感じです。
@list = (5, 3, 7, 2, 6, 1);
@list = sort @list;
print @list;
【出力結果】
123567
説明を簡略にするために出力体裁などに手を抜いていますが、@listに渡されたリストがsort演算子によって並べ替えられることがお分かりいただけると思います。(ここでは分かりやすさのために変数を使って複数の文に分けていますが、もちろん print sort (5, 3, 7, 2, 6, 1);という1行だけでも同じです)
では、次にsort演算子に比較のオプションを与えてみます。今度は、アルファベットをリストの中に格納してソートしますが、大文字小文字をごちゃまぜにします。
@list = qw(f D c N m L b s Z p);
qw()というのは初めて出てきましたが、これは "quote words" の略で、('f', 'D', 'c', 'N', 'm', 'L', 'b', 's', 'Z', 'p');と同じことです。書きやすさのためによく使われます。
さてこのリストを先ほどのスクリプトで並べ替えると、'DLNZbcfmps'という結果が出力されます。コード順で大文字が小文字よりも先にくるためにこうなりますが、これをちゃんと、つまり大文字と小文字に関係なく、アルファベット順に並べるにはどうしたらいいのか、ということです。
といったところで、続きは次回。
ニュース・解説
今週の解説担当:小池邦人
● Carbon ドキュメント & サンプル & SDK ナビゲーション(2005/03/10)
【開発環境】
Apple社からWWDC2006の開催日程が発表になりました。今年は8/7から8/11までサンフランシスコで開催されます。例年と比べて、やけに時期が遅いですね!Mac Proに搭載する予定のインテル版CPUの発表に合わせたのか、Leopard(Mac OS X 10.5)のプレビュー版提供が、その時期でないと間に合わないのか? 色々と勘ぐりたくなります(笑)
http://developer.apple.com/wwdc/
レジストレーションの早期割引の締め切りは6/23ですので、参加を予定されている方は忘れないように注意いたしましょう。また、ADCのセレクトメンバーを継続したい方は「WWDC 2006 E-ticket and ADC Select Membership」を選択すれば$400割引となりますので、こちらもお忘れなく!
MOSAでは、アップル社協力のもと、アップル社側の和訳がなかなか追いつかないテクニカルドキュメントの要約を行っています。今回は、Cocoaテキスト関連テクニカルドキュメントが中心です。完訳ではありませんが、Cocoaプログラムに挑戦しようと考えている方には、少なからずお役に立てると思います。ご活用ください。
http://www.mosa.gr.jp/htmdocs/article/document-2005oct.php
【テクニカルドキュメント】
前回から3月10日の期間中、Apple社のDocumentationサイトには数多くのドキュメントが登録されました。ただし、大部分は今までの内容のマイナーチェンジです。今回は、その中で初版と内容が大幅変更になったドキュメントだけをピックアップしました。Cocoaプログラミングに役立つドキュメントが大量に登場しています。また、デベロッパ向け読み物もひとつ登録されました。「Using Ruby on Rails for Web Development on Mac OS X」については、前号の木下さんの記事が参考になります。加えて、日本のアップルデベロッパサイトにウェブ技術関連の和訳ドキュメントが2つ登録されました。
「Cocoa Drawing Guide」(PDFあり)(初版)
「Cocoa Fundamentals Guide」(PDFあり)(初版)
「Cocoa Scripting Guide」(PDFあり)
「Document-Based Applications Overview」(PDFあり)
「Quartz 2D Reference」
「Scroll View Programming Guide for Cocoa」(PDFあり)(初版)
「View Programming Guide for Cocoa」(PDFあり)(初版)
http://developer.apple.com/documentation/index-rev-date.html
「Using Ruby on Rails for Web Development on Mac OS X」(読み物)
http://developer.apple.com/tools/rubyonrails.html
「Safari FAQ」(日本語訳)
http://developer.apple.com/jp/internet/safari/faq.html
「Web開発のベストプラクティス」(日本語訳)
http://developer.apple.com/jp/internet/webcontent/bestwebdev.html
前回から3月10日の期間中、新規テクニカルノートは2つ登録され、新規テクニカルQ&Aも2つ登録されました。テクニカルノートの方は両方とも改訂版としての再登録となります。QA1370については、前号の木下さんの記事も参考にしてください。
TN2146「Making the most of Cocoa bindings in Quartz Composer」
TN2123「CrashReporter」
http://developer.apple.com/technicalnotes/index-rev-date.html
QA1465「Movie Export From Procedures - Providing k2vuyPixelFormat da to
MovieExportGetDataProc」
QA1370「Common QA and Roadmap for USB Software Development on Mac OS X 」
http://developer.apple.com/technicalqas/index-rev-date.html
【サンプルソースコード】
前回から3月10日期間中、Apple社のSample Codeサイトには、新しいサンプルソースコードが2つ登録されました。どちらも新作ですが、「QTSetMovieAudioDevice」の方は「QuickTime 7 for Windows」用ですので御注意ください。
「QTSetMovieAudioDevice」(QuickTime関連)
「iTunes Controller」( Carbon関連)
http://developer.apple.com/samplecode/index-rev-date.html
【デベロップメント SDK】
前回から3月10日の期間中、Apple社のSDKサイトには新しいSDKがひとつも登録されませんでした。
http://developer.apple.com/sdk/
MOSAからのお知らせと編集後記は割愛します