2006-04-04
目次
「WebObjects Dev Report」 第45回 田畑 英和
今年の3/28でWebObjects 1.0がリリースされてから10周年のようです。10年の間に会社がNeXTからAppleへと変わり、言語がObjective-CからJavaへと変わり、値段もとても高価なものから今となっては無償(開発版のみ)に変わりました。コンピュータ業界で10年といえばとてつもなく長い時間になりますが、よくここまで生き残ったものです。はたして10年後はどうなっているのでしょうか。
・WebObjectsの歴史
http://en.wikipedia.org/wiki/WebObjects
さて、今回はこれまで紹介してきたプロジェクトを実際に動かす手順をご紹介しておきます。昨年の湘南ミーティングの時点で一度プロジェクト一式を公開していましたが、その後最低限のエラー処理などを少し加えてあります。まずはプロジェクトのダウンロード先から。
□プロジェクトダウンロード
・プロジェクト
http://210.175.246.197/WebObjects/mosa/MOSAJobMatch_0330.zip
・ビルド済アプリケーション本体
http://210.175.246.197/WebObjects/mosa/0330.zip
・ビルド済WebServerResources
http://210.175.246.197/WebObjects/mosa/MOSAJobMatch.woa.zip
・データベース(OpenBase ASCIIバックアップ)
http://210.175.246.197/WebObjects/mosa/JobMatch_ASCIIBackup0330.bck.zip
WebブラウザでダウンロードしやすいようにすべてFinder上でzip圧縮をかけてあります。ソースコードを確認したい方はプロジェクトをダウンロードしてください。運用環境で実際に動作させてみたいという方は、ビルド済のアプリケーション本体とWebServerResourcesをダウンロードしてください。ビルド済のアプリケーションのインストール先は以下のパスになります。zipファイルをこのパスで解凍してください。
□インストールパス
・ビルド済アプリケーション本体(別のパスでも可)
/Library/WebObjects/Applications/
・ビルド済WebServerResources
/Library/WebServer/Documents/WebObjects/
Xcodeから起動する場合も、アプリケーションをインストールして運用環境で起動する場合もデータベースが必要になります。すぐにアプリケーションを起動できるようにサンプルデータ入りのデータベースバックアップファイル(JobMatch_ASCIIBackup0330.bck.zip)を用意してあります。
データベースにはOpenBaseを使用していますが、OpenBaseのセットアップはあらかじめ行っておく必要があります。OpenBaseがセットアップできましたらOpenBase Managerで新規にデータベースを作成して、バックアップファイルをリストアします。データベースをリストアするには、あらかじめデータベースを起動しておく必要があります。データベースを新規に作成するときは以下の条件で作成します。
□新規データベースのパラメータ
データベース名:JobMatch
データベースエンコーディング:UNICODE UTF-8
内部のソート基準:other(なにも指定せず)
これでアプリケーションを起動する準備が整いました。このプロジェクトではWebObjects標準のフレームワークしか使用していませんので、ほかにインストールが必要なものはありません。
アプリケーションを起動すると「閲覧」と「登録」メニューがありますが、「登録」を行うには、ユーザ情報を登録するアカウントでのユーザ認証が必要になります。ユーザ認証にはMOSA IDとメールアドレスが必要になります。サンプルデータベースにはあらかじめ4名分のアカウントが登録してあり、認証に必要な値はそれぞれ以下のようになっています。
□サンプルユーザ(MOSA ID/メールアドレス)
test1/test1@mosa.gr.jp
test2/test2@mosa.gr.jp
test3/test3@mosa.gr.jp
test4/test4@mosa.gr.jp
※アプリケーションに新規ユーザを登録する機能はありません。
本プロジェクトの開発環境ですが、次のように少し古い環境で作成してあります。動作確認はしてありませんが、これよりも新しいバージョンであれば問題なく動作するものと思われます。より新しいバージョンのXcodeでプロジェクトを開くと、プロジェクトファイルの形式を新しいものに変換することがあります。
□開発環境
・Xcode 1.1
・WebObjects 5.2.3
・OpenBase 8.0.4(b20)
・Mac OS X 10.3.9
最後に、運用中のアプリケーションを入れ替える方法について解説しておきます。まず新しいバージョンのアプリケーションをインストールする必要がありますが、インストールパスをバージョンごとにサブディレクトリに分けておけば、既存のバージョンを残したまま新しいバージョンをインストールすることができます。別のパス上にアプリケーションをインストールした場合には、Monitorで起動スクリプトのパスを変更する必要があります。
パスの変更を行っておけば、あとは稼働中のインスタンスを停止してから起動すれば、新しいバージョンの運用を始めることができます。インスタンスを停止するときは、Monitor上でセッション数を確認してください。セッション数が0でなければ使用中のユーザが存在するというとになりますので、そのままインスタンスを停止するとメモリ上のデータは失われてしまいます。
インスタンスが複数ある場合には、1つずつ停止&起動を繰り返して行けばシステム全体としては停止せずにアプリケーションの入れ替えを行うことができます。また、インスタンスが1つだけの場合でも、インスタンスを1つ追加して起動を確認してから、古いインスタンスを停止することでシステム全体を停止することなく入れ替えを行うことができます。
ほかにも、場合によってはアプリケーションの入れ替え時にデータベースの更新や運用のパラメータ変更が必要になることも考えられます。
藤本裕之のプログラミング夜話 #88
こないだふと思いついてこの原稿のバックナンバーを読み返したら、このNSWindowの項目が始まったのは昨年の9月、なんだかんだでもう半年以上やっているのである。読者諸兄もそうかもしれないがなにより書いているオレが少々飽きてきた。ちうわけで、ここらでちょっとスピードアップし、今回でNSWindowの話を終えてしまいたいと思う。
Interface Builderで設定できる属性、残るは4つ。まずは「Has shadow」というスイッチだがこれは説明不要だろう。メソッド setHasShadow に直結していてそのウインドウが影を持つか否かを指定する。普段あんまり影を持たないウインドウというのは見かけないが、またぞろそれを探し始めると長くなってしまうので「世の中には影を持ちたくないウインドウもある、ウインドウいろいろ、人生いろいろ」と為政者風に端折って次に行く。
「Display tooltips when app is inactive」というスイッチは……あっとその前にここで言っている tooltips ってわかるよね? ウインドウそのものには指定できないが、その上に配置されるボタンやテキストフィールドなどの各種コントロールを選択してインスペクタ上部のポップアップメニューから「Help」を選ぶと1行分のヘルプメッセージを入力できる。ここに入力された文字列は、マウスカーソルがそのコントロールの上にとどまっていると黄色い(これ、色変更できるのかな?)小さなウインドウが出てきてそこに表示される。通常あれは、そのウインドウを出しているアプリケーションがアクティブなときしか表示されないんだが、このスイッチをオンにしておけば、それが表示されるようになる、と。この機能がどんなときに便利かというと、フォアグラウンドにあるファインダからファイルなんかのドラッグ&ドロップを待っているときとかですね。ドラッグ&ドロップを受け付けるNSViewのサブクラスが、アプリケーションがアクティブぢゃない時でも「ここにドロップしてちょうだい」というメッセージを出せれば親切でしょ?
さて次が問題の(前回の最後の話、覚えてる? このスイッチが実はあれに絡んでいるのである)「Unified title toolbar look」、これもまた、Borderless や Textureと同様、ウインドウ作成のときに使われる StyleMaskで指定されるのでウインドウを作ってしまってからでは変更できない。で、その効果……というか、これをオンにするとどうなるかというと、読んで字のごとく、タイトルバーとツールバーの境目がなくなって一体化しちゃうのである。当然ながらツールバーの部分を「持って」ウインドウをドラッグすることも可能になる。
ワタシの手持ちのアプリケーションでこれを使っているのは「Mail.app」「Xcode」のプロジェクトウインドウ(他のはなぜか違う)、「Jedit X」のバージョン1.33……。え? 効能はわかったがそのスイッチをオンにできないって? そうなのだ、オレもどうしてそうしてあるのかさっぱり解らないのだが、Interface Builderのインスペクタにあるスイッチ、インスタンスがNSPanel の時にしか有効にならない。別にパネルに限る理由もないように思えるし、前に出てきた2つと違って「panel only」とかいう断りもないので、もしかしたら単なるバグではないかと思っているのだがどうですか。まぁ、NSPanel は NSWindow のサブクラスであって逆ではないので、NSPanel としてインスタンスを作っておけば別に支障はないんだけどね(ほんのわずかメモリを余計に食うだけ)。
そして、最後に残ったのが「Auto recalcurate key view loop」。プログラムの都合でウインドウ内にあるテキストフィールドを実行中に追加したり逆に減らしたりしたいことがある。以前のシステムではこういうことをやると、それらkeyViewの持つ nextKeyView の連鎖を自分でメンテナンスしてやらなければならなかった。が、Tigerではそれを一発でやってくれるメソッド、recalcurateKeyViewLoop と、それを使うのさえ面倒だというものぐさなひとのためにこの属性が用意された。つまりこれをオンにしておくと……どこをフックしてるのかな? とにかくkeyViewにあたるオブジェクトの追加・削除のおりに、自動的にその連鎖をチェックしてくれる、とこういうわけである。
はぁはぁ、最後はちと急ぎ足になったが、これでNSWindowの話は一応終わりとしたい。次回から何をやろうかな。編集長と相談しよう(実はまだ何も決めてない)。
(2006_03_31)
高橋真人の「プログラミング指南」第86回
〜Perlについて(32)〜
こんにちは、高橋真人です。早速続きを始めましょう。
今回はPerlにおけるソートについてがテーマです。Perlでは他の演算子と同じようにデフォルトの挙動であれば記述は極めて単純です。前回に使用した
print sort (5, 3, 7, 2, 6, 1);
というコードは、リスト(カッコで囲まれた数値の羅列)がsort演算子に渡され、さらにprint演算子に渡された結果、
1234567
という出力結果が得られるわけです。
蛇足ながら、この出力結果がなぜこのような形になるかを説明しましょう。
print演算子は、意外にもリストコンテキストを要求しますので、sort演算子が返した値は数値のリストとして渡され、そのまま「結合されて」出力されます。(ちなみに、PerlではC言語とは違って、数値と文字列の区別が柔軟にできているため、print演算子に渡された数値のリストは、文字列のリストとして処理されます)
こういうわけで、例えば以下のようなコード、
print
において、INに割り当てられているファイルの中身は、丸ごと標準出力に送られることになります。大切なのは、裏側ではリストのやり取りがなされていることを意識することです。漠然と「ファイルの中身が出力された」と考えていると、対象となるファイルが巨大な場合にメモリ不足に陥っても何が起こったか分からずに戸惑うことになります。
また、リストの各要素が「改行も含んだ」状態であることを忘れると、print演算子に渡されたリストが自動的に改行で連結されると勘違いしたり、スカラーコンテキストで
ちなみに、printに渡したリストの各要素の結合の際に区切り文字を入れたい場合はjoin演算子を使うことも覚えておくといいでしょう。
さて、本題のソートです。そもそもソートというものは、よほど単純なデータの集まりでもない限りデフォルトの並び順、つまり文字のコード順による並び替えで済むことはありませんから、ソートにはほとんどの場合比較ルーチンが付き物です。
Perlではこんなときにブロックを使います。ブロックというのはおなじみの{}で囲まれた単文または複文です。デフォルトのソート処理をあえてブロックを使った形で表現すると、以下のようになります。
@list = qw(s d w a f z);
@list = sort { $a cmp $b } @list;
cmpという演算子は、+ とか * と同じく二項演算子で、左側が右側より小さい場合には-1を、逆の場合には+1を、そして左右が同じ場合には0を返します。ANSI Cのライブラリ関数のstrcmp()と同じだと考えれば分かりやすいでしょう。
また、以上のことから類推できるように、sort演算子におけるブロックの評価値はANSI Cライブラリのqsort()が要求する比較関数の場合と同じです。ブロックの評価値ということに関してですが、Perlではreturnなどを使って明示的に表記することなく、「最後の文の評価値」がそのままブロック全体の値として評価されます。
ところで、上記のブロックにおいて突然出てきた$aと$bって何? と思われた方も少なくないことでしょう。これも私がPerlに対して感じる「違和感」の一つなのですが、何とこの変数は決め打ちです。つまり、sortの比較処理ブロックにおける比較対象を表す変数名は必ず$aと$bに「固定されて」います。任意の変数名を使うことは許されないのです。
もっとも、このビックリな仕様のおかげで、いわゆる降順ソートを書く場合には、単に左右を入れ替えて以下のように書けばよいのです。
sort { $b cmp $a } @list;
もっとも、逆順ソートをするだけならば、以下のように書いた方がPerlらしいですが(笑)。
reverse sort @list;
ところでcmpという比較演算子ですが、これはあくまで「文字列比較のため」の演算子なので、今回の冒頭に出てきたような数値の比較では問題があります。たまたま今回の例ではすべての数値は一ケタなので、結果的に問題なしですが、二ケタになってくるとcmpではまずいのです。
@list = sort { $a cmp $b } (5, 3, 7, 20, 6, 12);
print join ', ', @list;
このコードの出力結果は、12, 20, 3, 5, 6, 7となってしまいます。
そこで、文字列比較のためのcmp演算子とは別に数値比較のために<=>という演算子が用意されています。この演算子を使うと、要素は意図した通りに(?)並んでくれます。
さて、前回の最後の例の処理ですが、大文字と小文字を区別しない並び順をどうするかという答えは、以下のようになります。
@list = qw(f D c N m L b s Z p);
print sort { lc($a) cmp lc($b) } @list;
lcという演算子は、lower caseつまり、文字列を「すべて小文字に」変換します。もちろんupper caseのuc演算子を使用しても構いません。
ところで、sortで一つ注意する必要があることですが、$aと$bの値を変えてはいけません。これをやると並べ替えているデータそのものが変わってしまいます。例えば以下のようなやり方はダメです。
※やってはいけない例
@list = qw(f D c N m L b s Z p);
print sort {
$a = lc $a;
$b = lc $b;
$a cmp $b
} @list;
どうしてもこのように変換した値を変数に一度格納したい場合には、必ず別の変数を使うようにしてください。
ニュース・解説
今週の解説担当:小池邦人
● Carbon ドキュメント & サンプル & SDK ナビゲーション(2005/03/31)
【開発環境】
Intel CPU版 iMacやMac mini、MacBook ProでWindows XPが起動したという話題に注目が集まる中、今度は、Apple社がWindowsのベンチマーク・テストを開発している標準化団体「BAPCo」(http://www.bapco.com/)に加盟したと言うニュースが飛び込んで来ました。この加盟は、いったい何を意味するのでしょうか?
Mac OS X 10.5(Leopard)には、Intel CPUに搭載されている機能を用いたOSのバーチャライズソフトウェアが搭載されるという噂があります。まあ、あくまでも噂の段階なのですが、Mac OS X、Linux、Windows のトリプルブートだけではなく、Mac OS XからLinuxやWindowsの制御ができるようになれば(Virtual PCのように)、世の中大変面白いことになります。何せ、Mac OS Xを起動できるパソコンは世界で唯一Macintoshだけですから、Webアプリケーション開発者などには大受けするかもしれません。
ところで、Apple社は4月1日に創業30年を迎えます。私のAppleとの付き合いも、なんと26年目に突入します。我ながら良く付き合ってきたものです(笑)。さて、4月1日には噂に上がっているような(Intel CPU版のiBookとか)発表があるのでしょうか? この日がエイプリールフールというのが若干気になりますが(笑)、技術的なトピックスについては8月のWWDCまで静かな日々が続きそうです…。
【テクニカルドキュメント】
前回から3月31日の期間中、Apple社のDocumentationサイトには新規ドキュメントがひとつも登録されませんでしたが、デベロッパ向け読み物が3つ登録されています。このうち「ADC Video Tutorial Series: Building a Sample Core Data Application」は、Cocoaから活用できるCore Dataの利用方法をQuickTime Movieの映像で解説しています(とても分かり易い)。こういう映像資料についても、ぜひ日本語吹き替えが欲しいところです。「Intuit Enhances QuickBooks for Mac: Leveraging Tiger Features and .Mac」については、前号の木下さんの記事も参考にしてみてください。
「Intuit Enhances QuickBooks for Mac: Leveraging Tiger Features and .Mac」
http://developer.apple.com/business/macmarket/quickbooks.html
「Building a JNI Universal Application with Xcode」
http://developer.apple.com/java/jniuniversal.html
「ADC Video Tutorial Series: Building a Sample Core Data Application」
http://developer.apple.com/cocoa/coredatatutorial/index.html
前回から3月31日の期間中、新規テクニカルノートはひとつ登録され、新規テクニカルQ&Aの方は2つ登録されました。QA1464については、前号の木下さんの記事も参考にしてください。
TN2065「do shell script in AppleScript 」
http://developer.apple.com/technicalnotes/index-rev-date.html
QA1464「ColorSync Color Matching on Intel-based Macs」(初版)
QA1242「Developing for VFS 」
http://developer.apple.com/technicalqas/index-rev-date.html
【サンプルソースコード】
前回から3月31日期間中、Apple社のSample Codeサイトには、新しいサンプルソースコードが2つ登録されました。どちらも新規登録となります。
「DragItemAround」(Cocoa関連)(初版)
「SpecialPictureProtocol」(Cocoa関連)(初版)
http://developer.apple.com/samplecode/index-rev-date.html
【デベロップメント SDK】
前回から3月31日の期間中、Apple社のSDKサイトには新しいSDKがひとつも登録されませんでした。
http://developer.apple.com/sdk/
◇MOSAからのお知らせと編集後記は割愛します◇