MOSA Multi-OS Software Artists

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

プログラマーに興味がある方なら誰でも入会いただけます。
MOSA Multi-OS Software Artists
===SINCE 1995===

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

MOSADenバックナンバー 2006年2月発行分

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

    2006-02-28  

    目次

    • 「WebObjects Dev Report」    第41回  田畑 英和
    • 藤本裕之のプログラミング夜話 #86
    • 高橋真人の「プログラミング指南」  第84回
    • ニュース・解説               小池 邦人

    「WebObjects Dev Report」  第41回  田畑 英和

     前回に引き続きValidation処理を解説いたします。今回はカスタムEOに独自のValidation処理を組み込む方法をご紹介いたします。EOFはモデルに定義した情報(Allows NullやWidth)に基づいて自動的にある程度のValidation処理を行ってくれますが、より複雑な処理を行いたい場合はカスタムEOに独自の処理を組み込むことができます。

    ◇プロパティレベルでのValidation
     「ビジネスマッチングシステム」ではユーザのProfile情報を管理しています。”MOSAUserData”という名前のEntityでユーザのProfile情報を管理し、このEntityには「自己アピール」文を入力するための”apeal”というプロパティがあります。この”apeal”というプロパティへの入力チェックを行いたい場合にはカスタムEOのMOSAUserData.javaに次のようなメソッドを実装します。

    ・プロパティレベルでのvalidateメソッド
         public Object validateApeal(Object apealValue)
                                 throws NSValidation.ValidationException {
             if(((String)apealValue).length() > 100) {
                 throw new NSValidation.ValidationException("Too long!!");
             }
    
             return apealValue;
         }
    
    


     このようなメソッドを準備しておくと、”apeal”へのデータ入力が行われるときに自動的にvalidateApealメソッドが呼び出されて入力値のチェックを実行できます。
     このようなメソッドを実装するにはメソッド名を”validate” + Key名として実装します。”apeal”用のvalidateメソッドの場合はvalidateApealという名前のメソッドを実装します。
     メソッド内での処理ですが、まずvalidateメソッドでは引数でユーザが入力した値が渡ってきます。ですのでこの値に対して任意のValidation処理を実施することができます。今回の例では、入力された文字列の文字数をチェックしています。EOFはモデルで定義した情報をもとに文字列のサイズをチェックしますが、バイト単位でチェックしますので、ここでは文字数でチェックする処理を例にしてみました。
     文字数をチェックして、長過ぎる場合は例外を生成してthrowしています。このようなメソッドを実装した場合、実行時に実際に例外が発生すると前回ご紹介したvalidationFailedWithExceptionで例外を検出することができます。
     Validation処理を行った結果なにも問題がなければ、そのまま引数で渡ってきた値をreturnしています。

    ◇EOレベルでのvalidateメソッド
     EOに対して特定の操作を行ったときにEOレベルでのvalidation処理を行うこともできます。EOレベルでのvalidatation処理を行うには次のようなメソッドをオーバーライドします。

    ・保存時のvalidateメソッド
    public void validateForSave() throws NSValidation.ValidationException
    ・追加時のvalidateメソッド
    public void validateForInsert() throws NSValidation.ValidationException
    ・更新時のvalidateメソッド
    public void validateForUpdate() throws NSValidation.ValidationException
    ・削除時のvalidateメソッド
    public void validateForDelete() throws NSValidation.ValidationException
    


     これらのメソッドが、EOに対してそれぞれの操作を行ったときに呼び出されます。メソッドをオーバーライドするときには、まずスーパークラスのメソッドを呼び出してから、独自の処理を組み込むようにします。例えば次のようなコードを実装します。

    ・EOレベルでのvalidateメソッド
         public void validateForSave()
                               throws NSValidation.ValidationException {
             super.validateForSave();
    
             if(Validationチェック) {
                 throw new NSValidation.ValidationException("Error!!");
             }
         }
    


     このようなメソッドをカスタムEOに実装しておくと、EOの保存時に自動的に呼び出され、EOの正当性を検証することができます。プロパティレベルでのValidateメソッドと同様に独自のValidation処理を行った結果問題があれば例外を生成してthrowします。
     また、このメソッドからはプロパティレベルのvalidateメソッドも呼び出されます。
     EOの保存時に自動的に呼び出されるということは、EditingContextに対してsaveChangesメソッドを実行したときに呼び出されます。任意のタイミングでEOレベルでのValidation処理を行いたい場合はEOのvalidateメソッドを直接呼び出すこともできます。

    ◇エラーメッセージ
     validateメソッドでthrowしている例外のメッセージですが、今回はあくまでもサンプルコードとして単純な例を紹介してあります。実際にはメッセージの部分をリソースとして切り出しておいて、別途管理したほうがメンテナンスが楽になるでしょう。
     例えばPropertiesファイルにエラーメッセージを書き出しておけば、次のようなコードでエラーメッセージを読み込んで例外に設定することができます。

    ・例外へのエラーメッセージの設定
    String error = System.getProperty(“ERROR_MESSAGE”);
    throw new NSValidation.ValidationException(error);

    ・Propertiesファイル
    ERROR_MESSAGE=エラーが発生しました。

     このようにプロパティレベルやEOレベルでのvalidateメソッドをカスタムEOに実装しておくことにより、任意のデータチェックを行い、データベースに問題のあるデータが保存されることを防ぐことができます。

    藤本裕之のプログラミング夜話 #86

     2週間のご無沙汰である。今回の話はややこしいので前置き抜きでサクサク行くぞ。Interface BuilderでNSPanelのインスタンスに設定できる「Non activating panel (panel only)」というアトリビュートはいったいどういう意味かという話である。前回のラストで用意していただいたNibファイルを閉じ……別にコードをなんか書く必要はないが、そのプロジェクトをコンパイル、リンクして実行してもらえば……、一目瞭然とはいかないのでややこしいんだが。
     実を言うと、特定の手順にしたがっていただかないとこのアトリビュートの意味はわからないのだ。とにかくここはオレを信じて(笑)以下のような操作を行ってみていただきたい。あ、横着をしてInterface Builderの「Test Interface」で済ませようと思うヒトもいるかも知れないが、あれだと以下のようには動かない。プロセス管理の問題がからむので一概にバグとも言い切れないが、なんの説明もないのは困ったことでは、あるね。

    1)このNibファイルを含むプロジェクトをリンクして実行する。前回本稿で解説した通り作っていれば同じようにNSTextFieldを一個擁するNSWindowとNSPanelのインスタンスが画面に現れる。
    2)さぁ話はこっからである。何か他のアプリケーション(以下の例ではFinderにしておく)をフォアグラウンドに移動し、テストプログラムをバックグラウンドに追いやる。当然ながらメニューバーはFinderのものに変わる。
    3)この状態でNSPanel(このパネルは「Non activating panel」がオンに設定されている)をクリックすると、パネルもウインドウも前面に来て、パネルのNSTextFieldがアクティブになるけど、メニューバーはFinderのままである。
    4)再びこいつらをバックグラウンドに追いやる。
    5)今度はNSWindowのインスタンスをクリックしてみる。と、こっちの場合はちゃんとメニューバーもろともこのテストプログラムに切り替わる。

     対照実験としてNSPanelの「Non activating panel」をオフにして同じことをしてみると、そのインスタンスの振る舞いは上のNSWindowと同じになる。結論としてこのアトリビュートは「そのパネルを出しているプロセスがバックグラウンドにあるとき、それをフォアグラウンドに持って来ることなしにアクティベートされてキーウインドウになれる」ということになる。ガッテンしていただけましたか?
     では、ガッテンしていただいたところで次に……行くわけにはいかない。読者諸兄がガッテンしてもオレは納得がいかない。ほら、空を見上げれば「ほんぢゃこのアトリビュートはいったい何の役に立つのだ、実際にどっかで使われてるのか?」ちう疑問がぽっかり浮かんでしまうでしょうが。あの名作、フェリーニの「道」でキ印の男が言うように「どんなものでも何かの役に立ってる」はずなのだ、特にプログラミングの世界では、役に立ってない仕掛けがあったらそれは設計ミスである(まぁ稀に「歴史的理由により」ってのもあるけどね)。
     そこで貴重な数時間を使い、このアトリビュートをオンにしていそうなプログラムを探してみた。が、残念ながらこのテストプログラムそのまんま、という状態で使われているものは見つからなかった。例えばOSに付属している「文字パレット」(こいつを出しているアプリケーション本体は、「/System/Library/Compnents」にある「CharacterPalette.component」パッケージの中の「SharedSupport」にある)のパネルは確かにこのアトリビュートがオンなんだが、やってみればわかる通りただアクティベートしただけではキーウインドウにはならない(検索用のNSTextFieldがあるが、それ自体をクリックしないとフォーカスされない)。
     とにかくこのアトリビュートは、これとかフォントパネル、カラーパレットみたいなプログラムのためにあるようである。……ここ、突っ込んでくと面白そうだけどそれは各自でやっていただく、とゆーことで次回は次のアトリビュートへ。
    (2006_02_23)

    高橋真人の「プログラミング指南」第84回

    UNIXとしてのMac OS X

    〜Perlについて(30)〜

     こんにちは、高橋真人です。
     さて、この連載でのPerl話も30回を数えることとなりました。前回予告したように、今回から「リストコンテキストを利用したファイル処理」のお話をするわけですが、これでPerlの話題は一区切りとしたいと思います。
     もちろん、語り尽くせない部分は多々ありますが、Perlの主立った部分には、つまみ食い的にではありますが、ほぼ触れてきたのではないかと思っています。
     「え! まだあの話だって残っているじゃないか」と思われる方もおいででしょうが、そこは私自身のPerlの経験の浅さによるものだということでご甘受いただければと思います。
     とはいえ、私としても「まだ、あれも残っているな」と感じるトピックのうちで代表的なものとしては、pack、サブルーチン、オブジェクト指向などがあります。
     packというのは、フォーマット指定によってデータ変換をする仕組みです。かなり強力なもので、C言語のprintfのバイナリ対応版とでも言えるでしょうか。
     サブルーチンは、Perlでもある程度の規模のスクリプトを書こうとすると必要になってくる仕組みです。ただPerlの場合、変数のスコープが原則的にはグローバルであり、ローカル変数を使おうとするとちょっとやっかいな制約がいくつかあるため、入門者向きのトピックではないような気もします。(私自身も余り使いません。というか、そこまでの規模が必要になってきた場合にはPerl以外の言語を使うでしょう)
     オブジェクト指向に関しては、過去の連載(第61回)で触れた通りです。もっとも、かなり前から噂されているPerlの次のバージョンでは、Perl自体の実装言語もCからC++に変えているそうですし、ひょっとしたらもっとまともなオブジェクト指向の仕組みが備わるのかもしれません。

    さて、最後のトピックとして説明するためのネタとして、私のハードディスクを漁って拾い出してきたMacPerl向けに書いたテキスト処理のスクリプトを取り上げます。これは、実際に過去の仕事で使ったものです。MacPerlのために書いたスクリプトなので、それに特化した部分もありますが、今回のテーマである「リストコンテキストによる処理」と、さらに「リファレンス」というテクニックも使っています。これらはPerlの技術の中では決して初心者向きのものではないので、コード例を解説するためにはそれなりに説明が必要になるはずです。
     まずはコードをご覧いただきましょう。

    #0: 管理ID
    #1: 基本語
    #2: よみ
    #3: 品詞
    #4: ルール種別
    #5: 対象語
    #6: 使わない
    
    $file = $ARGV[0];
    $file .= ".sort";
    
    open OUT, ">$file" or die;
    MacPerl::SetFileInfo('YoED', 'TEXT', $file);
    
    map { print(OUT join("¥t", $_->[0], $_->[1], $_->[2], $_->[3], $_->[4], $_->[5]), "¥n"); }
    sort {
         if ($a->[6] ne $b->[6]) {
              $a->[6] cmp $b->[6];
         } elsif ($a->[8] ne $b->[8]) {
              $a->[8] <=> $b->[8];
         } elsif ($a->[8] == 1 and $b->[8] == 1) {
              $a->[2] cmp $b->[2];
         } else {
              $a->[5] cmp $b->[5];
         }
    }
    map {
         $_->[6] = substr($_->[0], 0, 2);
         $_->[7] = $_->[5];
         $_->[7] =~ tr/亜-熙//d;
         if (length($_->[7]) < 1) {
              $_->[8] = 1;
         } elsif ($_->[7] =~ /A-Z/) {
              $_->[8] = 2;
         } else {
              $_->[8] = 3;
         }
         $_ ;
    }
    grep { $_->[6] =~ /False/ }
    map { [(split /¥t/)] }
    <>;
    
    MacPerl::Answer("Done");
    MacPerl::Quit(2);
    


     とりあえず、私が仕事で使ったスクリプトを1バイトの変更もなく載せてみました。まあ、過去に書いたものなので所々気に入らない書き方の部分がありますが、そこは次回からの解説で併せて触れつつ修正したいと思います。
     ところで、今回改めて自分の過去に書いたこのスクリプトを見てみて思うのは、大体この連載で触れたPerlについての集大成と言ってもよいものかな、ということです。
     逆に言えば「私のPerlの技術はこの程度のものです」ということでもあるのですが(笑)。

    ニュース・解説

     今週の解説担当:小池邦人

    ● Carbon ドキュメント & サンプル & SDK ナビゲーション(2005/02/24)

    【開発環境】

    自作アプリケーションで用いているPPCのAltiVecコードをx86のSSE/SSE2コードに書き換える作業を行ってみました。「浮動小数点処理5%+OpenGL処理5%+整数処理90%」といった処理内容です。画像フィルタのように100%SIMD向きの処理ではなく、少々無茶な使い方なのですが(笑)それでもPowerMac G5でAltiVecに書き換えたところ、かなり処理速度が向上したので、SSE/SSE2にも期待していました。ところが結果は…

    PowerMac G5 2GHz Dual (Normal) 53秒
    PowerMac G5 2GHz Dual (AltiVec) 38秒

    iMac Core Duo 1.83GHz (Normal) 20秒
    iMac Core Duo 1.83GHz (SSE/SSE2) 30秒

    という感じで、SSE/SSE2を用いた方が遅くなってしまいました(涙)。まあ、Core Duo搭載のiMacはSSE/SSE2を使わなくても整数処理が大変高速なので、結果的にはまったく問題ないのですが(笑)、SSE/SSE2はAltiVecよりも使いどころを考慮しないといけないようですね。

    AltiVecからSSE/SSE2への書き換えについては「Universal Binary化の実践」というセミナを開催して詳しく解説する予定です。興味ある方は是非ご参加ください。

    http://www.mosa.gr.jp/htmdocs/article/seminar-180407.php

    インテル社のウェブサイトには、以下のMac OS X向け開発ツールのβ版リリースが登録されています。これらMac OS X用ツールに関して、インテル社の担当にお話しを聞く機会に恵まれました。現在商品版を開発中であり近々発売時期を発表できるそうです。その時点でβ版のダウンロードはストップされるそうなので、興味ある方は今のうちにダウンロードして試してみましょう!

    「インテル(R) C++コンパイラ 9.0」
    「インテル(R) Fortranコンパイラ 9.0」
    「インテル(R) MKL( Math Kernel Library)ライブラリ 8.0」
    「インテル(R) IPP( Integrated Performance Primitives)ライブラリ 4.1」

    http://www.intel.com/cd/software/products/asmo-na/eng/227389.htm

    gcc以外の本家本元コンパイラが入手できるようになるのは、デベロッパとしても頼もしいかぎりです。これら商品の日本での販売はエクセルソフト株式会社が行い、1年間無料サポート(日本語Q&AもOK)が受けられるそうです。また上記ツール以外にも、インテル社製の「アナライザ(VTune)」「スレッド化ツール」「クラスタ・ツール」などもありますので、これらについてもMac OS X対応に期待したいと思います。

    また、インテル社は4月6日と7日に、東京プリンスホテル パークタワーで「インテル・デベロッパー・フォーラム Japan 2006」を開催します。興味がある方は参加してみてはいかがでしょうか?

    http://www.intel.co.jp/jp/idf/

    【テクニカルドキュメント】

    前回から2月24日の期間中、Apple社のDocumentationサイトには新規ドキュメントがひとつも登録されませんでした。その代わり、デベロッパ向け読み物は2つ登録されています。「Working with Quartz Composer」の方については、前号の木下さんの記事も参考にしてみてください。

    「Taking Advantage of PDF Kit in Your Cocoa Application」(読み物)

    http://developer.apple.com/cocoa/pdfkit.html

    「Working with Quartz Composer」(読み物)

    http://developer.apple.com/graphicsimaging/quartz/quartzcomposer.html

    前回から2月24日の期間中、新規テクニカルノートは2つ登録されましたが、新規テクニカルQ&Aの方はひとつも登録されませんでした。テクニカルノートの方は、両方とも内容の改訂です。TN2125の方は、Windows用QuickTimeに関する記述が追加されています。

    TN2118「Kernel Core Dumps 」
    TN2125「Thread-safe programming in QuickTime 」

    http://developer.apple.com/technicalnotes/index-rev-date.html

    【サンプルソースコード】

    前回から2月24日の期間中、Apple社のSample Codeサイトには、新しいサンプルソースコードがひとつだけ登録されました。Core Imageのフィルタを用いてQuickTime Movieを再生するCarbonアプリケーションです。Core Imageに関する機能はCocoa APIですので、CarbonアプリケーションモデルからObjective-Cで記述したルーチンを呼ぶことになります。QuickTime Movieの表示先には、AGLでコンテキストを設定したOpenGLの環境を使用しています。

    「QTCarbonCoreImage101」(QuickTime関連)(初版)

    http://developer.apple.com/samplecode/index-rev-date.html

    【デベロップメント SDK】

    前回から2月24日の期間中、Apple社のSDKサイトには新しいSDKが2つ登録されました。Mac OS X 10.4.5対応「Kernel Debug Kit」(PowerPC版とIntel版あり)です。

    「Kernel Debug Kit 10.4.5 (Intel)」
    「Kernel Debug Kit 10.4.5 (PowerPC)」

    http://developer.apple.com/sdk/

    また「Darwin Source Code」サイトに、Mac OS X 10.4.5に対応したPPC用とx86用のソースコードが登録されました。

    「Mac OS X 10.4.5 (Darwin 8.5) for PPC」

    http://www.opensource.apple.com/darwinsource/10.4.5.ppc/

    「Mac OS X 10.4.5 (Darwin 8.5) for x86」

    http://www.opensource.apple.com/darwinsource/10.4.5.x86/

    MOSAからのお知らせと編集後記は割愛します

    MOSA Developer News   略称[MOSADeN=モサ伝]
    Apple、Mac OSは米国アップルコンピュータ社の登録商標です。またそのほかの各製品名等はそれぞれ各社の商標ならびに登録商標です。
    このメールの再配信、および掲載された記事の無断転載を禁じます。
    特定非営利活動法人MOSA
    Copyright (C)2006 MOSA. All rights reserved.

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

    2006-02-21

    目次

    • 「WebObjects Dev Report」    第40回  田畑 英和
    • 小池邦人の「Carbon API 徒然草」
    • SqueakではじめるSmalltalk入門  第56回  鷲見 正人
    • ニュース・解説               木下 誠

    「WebObjects Dev Report」  第40回  田畑 英和

     まずは告知から。2/25(土)の19:00からApple Store Shinsaibashiにて開発者向けのイベント「Kansai Developer’s Night」が開催されます。WOの紹介も予定されていますので、お近くのかたはぜひご参加ください。

    ・Kansai Developer’s Night
    http://www.apple.com/jp/retail/shinsaibashi/week/20060219.html
    http://developer.apple.com/jp/

     さて、今回はValidation処理について解説いたします。Validationは正当性検証などと訳されることもありますが、ようするに入力したデータが正しいものであるかどうかを判定する処理になります。
     例えば年齢のデータに負の数が入力されていないかとか、文字列の長さが長過ぎないかといったチェックになります。

    ◇Webブラウザ側でのチェック
     入力する文字列の文字数を制限したい場合は、あらかじめテキストフィールド(1行のテキストフィールド)へ入力できる文字数を制限するようにHTMLをコーディングすることができます。具体的にはmaxlength属性を使って文字数の上限値を設定します。

    ・入力できる文字数を制限したHTML
    <input maxlength=”10″ type=text name=”0.4.3.11″>

     これでブラウザ上で入力できる文字の文字数が限定されますので、あらかじめデータベースで定義しておいた文字列のサイズを超えてデータが入力されることを防ぐことができます。ただし、このとき設定をおこなっている値が「文字数」なのか、あるいは「バイト数」なのか注意する必要があります。また使用するエンコーディングによっては1文字あたりのバイト数も異なってきますので、データベース側でどようなエンコーディングを使用しているかも注意する必要があります。
     この設定をWebObjects Builder上で行う方法ですが、WOTextFieldを選択した状態でStatic Inspectorを表示し、Maximum Lengthを設定します。ここで設定した値はAttribute “maxlength”として追加され、Dynamic Inspectorでも値を設定することができます。

    ◇サーバ側でのチェック
     1行だけのテキストフィールドの場合はmaxlengthを設定するだけで簡単に入力制限をかけることができましたが、では複数行のテキスト(textareatタグ)を使用した場合はどうでしょうか。複数行のテキストではmaxlengthを使うことはできません。JavaScriptを駆使して、入力中の文字をカウントするという方法も考えられますが、ここではデータを一度サーバ側に送り込んでからサーバ側でチェックする方法を紹介します。
     といいましても、実はWebObjectsではモデルで定義した情報に基づいて自動的に文字列のサイズチェックが行われます。EOのattributeを直接Formの項目にバインドしていた場合、FormをSubmitしたときにデータがモデルで定義していた文字列のサイズに収まらないと、EOに対してデータの更新はおこなわれず、データの入力は失敗します。
     モデルでの文字列サイズの指定ですが、Attributeの設定でWidthを用いて、文字列の上限値(バイト数)を設定します。

    ◇エラー処理
     自動的にValidation処理が行われるのはよいのですが、デフォルトの挙動ではただデータの入力に失敗するだけですので、このままではユーザはなにがおこったのかよく分かりません。そこで次のWOComponentのメソッドをオーバーライドして、エラー処理を行います。

    public void validationFailedWithException(Throwable t,
    Object value,
    String keyPath)

     まず引数の説明ですが第一引数の”t”はValidation処理で発生したExceptionになります。第二引数のvalueにはValidationの対象になったデータが格納され、最後の第三引数にはValidationの対象になった項目の名前が格納されています。
     よって、このメソッドをオーバーライドすることにより、どの項目に入力したどのデータが、どのようなexceptionを発生させたかが分かります。例えば次のようなコードで、Validation処理で発生したExceptionのメッセージと項目の名前を取得することができます。

    ・サンプルコード
         public String keyPath;
         public String errMessage;
    
         public void validationFailedWithException(Throwable exception,
                                                  Object value,
                                                  String key) {
              keyPath = key;
              errMessage = exception.getMessage();
         }
    
    ・keyPathの例
         session.loginUser.mosaUserdata.apeal
    ・Exceptionのメッセージ例
         The apeal property of MOSAUserData exceeds maximum
                                              length of 4096 characters
    


     後はメッセージを画面上に表示すればユーザへのフィードバックになるのですが、デフォルトのメッセージは英文になっているため、このまま使用するには厳しいものがあります。エラーの表示については別途工夫が必要になります。
     また、Validation処理のチェックにひっかかった場合にはまた同じページを表示するように処理するなどの対応も必要になってきます。それでは今回はここまでにして、次回はカスタムEOに独自のValidation処理を組み込む方法をご紹介いたします。

    小池邦人のCarbon API 徒然草(2006/02/17)

    〜 アプリケーションのUniversal Binary化(その3) 〜

    今回は、MWC用プロジェクトの移植作業において、Xcode側でしなければいけない追加処理について解説します。Info.plistやMOSA_Prefix.pchファイルのプロジェクトへの登録、SDKの種類の選択、コンパイルやリンクオプションの設定を行います。

    前回は、Xcodeのファイルメニューにある「プロジェクトの読み込み…」機能を利用して、開発プロジェクトをMWC用からXcode用へ移植しました。たとえMWC用のプロジェクトが完全だとしても、移植後のXcode用プロジェクトでは、Resourcesフォルダ内の以下のファイルが未登録のままであることも指摘しました。

    1.English.lprojフォルダとその中身のInfoPlist.stringsテキストファイル
    2.Japanese.lprojフォルダとその中身のInfoPlist.stringsテキストファイル
    3.MosA.icnsアイコンファイル
    4.MosD.icnsアイコンファイル

    アプリケーションパッケージのResourcesフォルダに保存するファイルについては、Xcodeのプロジェクトウィンドの「グループとファイル」に表示されている、Resources(フォルダの形をした小アイコン)に登録しておく必要があります。

    3と4のアイコンファイルはドラッグ&ドロップで、そのままResources内に登録すればOKです。ところが、1と2のEnglish.lprojとJapanese.lprojフォルダは、そのままドラッグ&ドロップで登録しても、アプリケーション作成(Make)後にパッケージ内に保存されません。何と!フォルダではなく、InfoPlist.stringsファイル自身をドラッグ&ドロップして登録します。まずは、English.lprojフォルダ内のInfoPlist.stringsを登録します。続いてJapanese.lprojフォルダ内のInfoPlist.stringsを登録します。すると、Resources内に表示されているInfoPlist.stringsの左側に三角アイコンが付き、それをクリックすることで「English」と「Japanese」という表示が現れます。これにより、2種類(2言語対応)のInfoPlist.stringsがちゃんと登録されていることが判断できます。

    筆者は、このInfoPlist.stringsの登録方法を発見するまで、かなり長い間苦しみました(涙)。どう考えてもおかしなユーザインターフェースだと思うのですが?ひょっとすると何か別のアプローチがあるのかもしれません。また、今回のプロジェクトでは用意していませんが、English.lprojやJapanese.lprojフォルダに個別に保存しておいた各言語用(ローカライズした)nibファイルやリソースファイルなども、InfoPlist.stringsと同様に、各ファイル自身をResourcesへとドラッグ&ドロップすることで登録可能です。

    次に、「グループとファイル」からプロジェクトアイコン(今回の名称はMOSA)を選択し、ツールバーの「i」ボタンをクリックします(ダブルクリックやファイルメニューからの「情報を見る」でもよい)。すると「”プロジェクト”MOSA”"の情報」というウィンドウがオープンします。上部の「一般」タブを選択し、「ターゲットSDKを使用したクロス開発」メニューで「Mac OS X 10.4(Universal)」を選択します。続いてタブを「ビルド」に切り換え、「コレクション」メニューから「アーキテクチャ」を選択し、下に表示されている「アーキテクチャ」をダブルクリックします。この時に表示されたダイアログで「PowerPC」と「Intel」の両方をチェックしておけば、このプロジェクトの対象アプリケーションは、Universal BinaryとしてMakeされることになります。

    今度は、アプリケーションに関する情報が設定されているInfo.plistファイルをプロジェクトに登録します。この登録を行わないと、Makeされたアプリケーションパッケージは不完全のままであり起動することはできません。まず、Info.plistをプロジェクトファイル(MOSA.xcodeproj)と同階層に保存します。そして、「グループとファイル」の「ターゲット」をオープンし、その中のアプリケーション名(MOSA)を選択して、ツールバーの「i」ボタンをクリックします(ダブルクリックやファイルメニューの「情報を見る」でもよい)。すると「”ターゲット”MOSA”"の情報」というウィンドウがオープンします。「ビルド」タブの「コレクション」メニューから「パッケージング」を選び、表示された項目一覧の中から「Info.plistファイル」をダブルクリックします。するとファイル名を入力するためのダイアログがオープンしますので、そこにInfo.plist」と入力すれば登録は完了です。

    最後はプレフィックスヘッダファイルの登録です。こちらの名称は「MOSA_Prefix.pch」と付け、やはりプロジェクトファイルと同階層に保存しておきます。先ほどと同様な操作で「コレクション」メニューから「言語」を選び、オプション項目の一覧で「プレフィックスヘッダ」をダブルクリックして「MOSA_Prefix.pch」と入力します。続いて、すぐ下の「プレフィックスヘッダをプリコンパイルする」にチェックを入れると登録完了となります。これにより、プレフィックスヘッダ内に記述されているQuickTime.h(Carbon.hも含まれる)がプリコンパイルされるので、アプリケーションのMake時間を大幅に短縮することが可能となります。

    その他のオプションも「”ターゲット”MOSA”"の情報」の「ビルド」において設定します。こうしたオプションは、「”プロジェクト”MOSA”"の情報」の「ビルド」の方でも設定できますが、設定内容はターゲットが優先されますので、混乱を避けるために、ターゲットの方でまとめて設定しておくのが良いでしょう。ちなみに、ディフォルトから変更されているオプション項目は、太文字でリスト表示されています。変更されたオプションをまとめて確認したい場合には、「コレクション」メニューから「カスタマイズされた設定」を選択することで一覧することが可能です。MWC用プロジェクトから移植した場合には、そちらで設定されていたオプションがすべて(完全一致ではない)継続設定されています。

    コンパイルやリンクのオプションですが、「コード生成」カテゴリーの「デバッグシンボルの生成」「最適化レベル」「関数プロトタイプの不在」等、加えて「リンク」カテゴリーの「ゼロリンク」「標準ライブラリにリンク」などのON/OFFに注意してください。これらの設定は、開発行程の段階によって逐次切り換える必要があるかもしれません。ちなみに「警告」カテゴリーの「推奨されない関数についての警告」ですが、これをONにすると、QuickDrawなどの古いAPIがソースコード内で呼ばれる度に警告が表示されます。すべてモダンなAPIに切り換えてしまった人にとっては弊害は無いのですが、現実的には非常にうっとおしいので、筆者はこのチェックだけは外しています(笑)。

    次回は、PowerPC用のソースコードをUniversal Binary化する時に、一般的に注意すべき点をピックアップして解説したいと思います。最大の関門は、PowerPCとIntel CPUのエンディアンの違いを克服することです。

    つづく

    SqueakではじめるSmalltalk入門   第56回  鷲見 正人

     本連載では、名前は知っていてもなかなか触れる機会のないSmalltalkについて、最近話題のSqueakシステムを使って紹介しています。今回は、ウインドウやメニューなどのGUIウィジェットの成り立ちを理解するうえで欠かせない「サブモーフ化」についてです。

    ▼サブモーフ化とは
     サブモーフ化というのは、簡単に言ってしまえば、あるモーフに別のモーフをくっつけて一緒に移動できるようにすることです。イメージとしては、ドロー系ソフトのオブジェクトのグループ化に似ています。ただ、登録する側、される側…というようにいわゆる“親子関係”がはっきりしている点で異なります。“子”に当たるモーフを「サブモーフ(submorph)」と呼び、逆にサブモーフに対して“親”にあたるモーフのことは「オーナー(owner)」といいます。

    ▼GUI操作でのサブモーフ化
     まずサブモーフ化という概念を具体的にイメージしやすいように、GUI操作を使ってサブモーフ化を実際に試してみましょう。

     ここでは、四角形モーフ(a RectangleMorph)と楕円モーフ(an EllipseMorph)を用意し、楕円を四角形のサブモーフにしてみます。四角形モーフと楕円モーフはそれぞれ次の式をdo it(cmd + D)して作ることができます。

    RectangleMorph new openInHand

    EllipseMorph new openInHand

     これらのモーフは、GUI操作で画面右下の「部品」フラップから取り出すことも可能です。「部品」タブをクリックしたりドラッグしてフラップ(引き出し)を開き、デスクトップにドラッグ&ドロップします。

    [fig.A]四角形モーフと楕円モーフ
    http://squab.no-ip.com:8080/mosaren/uploads/56a.png

     サブモーフ化にあたり、まず、サブモーフ化したいモーフのオーナーに対する位置を決めておおきます。今は、四角形の中心よりほんの少しだけ右下に置くことにしましょう。楕円モーフはクリックでピックアップすることが出来るので、この操作により持ち上げて、ねらった位置でクリックしてそこに置いてください。なお一部の例外を除き、サブモーフ化したいモーフは、原則としてオーナーの手前になければいけません。

    [fig.B]楕円モーフをねらった位置へ
    http://squab.no-ip.com:8080/mosaren/uploads/56b.png

     次に楕円モーフをコマンドクリック(コマンドキーを押しながらクリック。ブルーボタンクリックとも呼びます)で選択し、現れた赤色ハローをクリックしてポップアップする「埋め込む先…」サブメニューを呼び出します。そのメニューには「ワールド」と「四角形」があるはずなので「四角形」のほうを選びます。これでサブモーフ化の作業は完了です。

    [fig.C]楕円を四角形のサブモーフにする
    http://squab.no-ip.com:8080/mosaren/uploads/56c.png

     ちなみに「ワールド」とはモーフとしてのデスクトップのことです。Smalltalk言語を通じてアクセスする場合は、ActiveWorldとかWorldというグローバル変数に束縛されているので、いつでも参照可能です。これは後に出てくるスクリプトでも使っています。

    ▼サブモーフ化されたモーフの選択のしかた
     いったんサブモーフ化されると、通常、そのモーフはオーナーと一体化します。つまりこの場合、楕円部分をクリックしてピックアップしようとしても、オーナーの四角形ごとピックアップされてしまい、楕円単体でピックアップすることができなくなります。同様にコマンドクリックによる選択もオーナーの選択に代えられてしまいます。

    改めてサブモーフのみを選択するには、楕円をいったんコマンドクリックしてオーナーである四角形が選択されるのを確認したあと、もう一度、楕円をコマンドクリックします。なお、この操作のショートカットとして、シフトキーを押しながらコマンドクリックすることでねらったサブモーフを一発で選択する方法も用意されています。

    [fig.D]サブモーフを選択
    http://squab.no-ip.com:8080/mosaren/uploads/56D.png

     余談ですが、この楕円のようにサブモーフ化されたモーフを扱う際に、黒色ハローと茶色ハロー差がはっきりします。もしこの局面で、楕円の黒色ハローをクリックしてしまうと、楕円のサブモーフ化は解除されてしまいます。サブモーフ化を解除せずに楕円のオーナーとの位置関係を変えたい場合は、茶色ハローをドラッグする必要があります。

    ▼スクリプトでサブモーフ化
     サブモーフ化のイメージをつかめたところで、まったく同じ作業をSmalltalkのコードで表現してみましょう。ざっと書き下すと、次のような感じになります。

    | rectangle ellipse |
    rectangle := RectangleMorph new.
    rectangle center: ActiveWorld center.
    ellipse := EllipseMorph new.
    ellipse center: rectangle center + 10 asPoint.
    rectangle addMorph: ellipse.
    rectangle openInWorld
    
    


     メッセージ「center: ポイント」は、モーフの中心の位置を決めるためのものです。先に述べたようにActiveWorldはモーフとしてのデスクトップを束縛しています。他方で、メッセージ「center」はモーフの中心の座標を得るためのものです。これらをまとめると、「rectangle center: ActiveWorld center」という式は、rectangleを画面の中心に据えることを意味していることがわかります。

    サブモーフ化には「addMorph: サブモーフ化したいモーフ」というメッセージをオーナーとなるモーフに送ります。「openInWorld」はモーフを画面上に表示するためのメッセージです。

    ワークスペースなど文字を入力できる場所で、上のようにタイプするか、このメールからコピー&ペーストして、全体を選択したのちdo it(cmd + D)してみましょう。画面中央に先ほどGUI操作でこしらえたのとほぼ同じ、楕円がサブモーフ化された四角形が現れるはずです。

    [fig.E]四角形に楕円をサブモーフ化するスクリプトと評価結果
    http://squab.no-ip.com:8080/mosaren/uploads/56e.png

    バックナンバー:
    http://squab.no-ip.com:8080/mosaren/

    ニュース・解説

    今週の解説担当:木下 誠

    ———————————————————————-
    Quartz Composerの説明ドキュメント
    ———————————————————————-

    Mac OS Xのグラフィックス環境は、10.4においては、Cooca、Quartz 2D、Core Image、Open GL、QuickTimeと多岐にわたるようになりました。これらをすべて利用した、グラフィックスのためのプログラミング環境が、Quartz Composerです。このQuartz Composerを紹介するドキュメント、「Working with Quartz Composer」が公開されています。

    Quartz Composerは、「パッチ」と呼ばれるコンポーネントを接続しながらプログラミングしていきます。このドキュメントでは、ハンズオンでパッチの使い方を説明しています。また、出来上がったファイルはスクリーンセーバとしても利用できますので、その方法も説明しています。

    Working with Quartz Composer
    http://developer.apple.com/graphicsimaging/quartz/quartzcomposer.html

    ———————————————————————-
    10.4.5用のKernel Debug Kit
    ———————————————————————-

    Mac OS X 10.4.5のリリースにともなって、新しいKernel Debug Kitが公開されています。Kernel Debug Kit 10.4.5です。Intel版とPower PC版が提供されています。

    Kernel Debug Kit 10.4.5
    http://developer.apple.com/sdk/index.html

    MOSAからのお知らせと編集後記は割愛します

    MOSA Developer News   略称[MOSADeN=モサ伝]
    Apple、Mac OSは米国アップルコンピュータ社の登録商標です。またそのほかの各製品名等はそれぞれ各社の商標ならびに登録商標です。
    このメールの再配信、および掲載された記事の無断転載を禁じます。
    特定非営利活動法人MOSA
    Copyright (C)2006 MOSA. All rights reserved.

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

    2006-02-14

    目次

    • 「WebObjects Dev Report」    第39回  田畑 英和
    • 藤本裕之のプログラミング夜話 #85
    • 高橋真人の「プログラミング指南」  第83回
    • ニュース・解説               小池 邦人

    「WebObjects Dev Report」  第39回  田畑 英和

     前回に引き続き「ビジネスマッチングシステム」で実際に使用している、小ワザをいくつか紹介いたします。

    ■テーブルの背景色
     テーブルを表示するとき、各行を識別しやすくするために1行ずつ交互に背景色を変更するような場合があります。あらかじめ静的なHTMLでテーブルを組めるような場合はよいのですが、WORepetitionを用いてテーブルを動的に生成するような場合はあらかじめ行の背景色を静的に指定しておくことはできません。つまり背景色も動的に指定する必要があるわけです。
     そこでまず、1、3、5…のような奇数行の背景色と、2、4、6…のような偶数行の背景色を返すメソッドを用意しておきます。

    ・背景色を返すメソッド

         public static final String oddLine = "oddLine";
         public static final String evenLine = "evenLine";
         private boolean rowFlag;
    
         public String lineClass() {
             rowFlag = !rowFlag;
             if(rowFlag) {
                 return oddLine;
             } else {
                 return evenLine;
             }
         }
    


     ここでは、boolean型のrowFlagを用いて奇数 > 偶数 > 奇数といった状態を交互に表現し、状態に応じて異なる背景色をreturnするようにしています。
     実際にテーブルの各行の背景色を指定する方法ですが、WebObjects Builder上でWORepetitionで繰り返しているテーブルの行を選択して、Inspectorの左下の「Make Dynamic」ボタンをクリックします。
     すると<TR>タグがWOGenericContainerに変化しますので、ここにlineClassメソッドをバインドします。バインド先ですが、今回はCSSを利用して行の背景色を指定していますので”class” Attributeを追加してlineClassメソッドをバインドします。背景色はCSSで次のように指定してあります。

    ・CSSで指定した背景色
    .oddLine { font-size:11pt; background-color:white; }
    .evenLine { font-size:11pt; background-color:#DDD; }

     lineClassメソッドを実装する場所ですが、セッションを用いた処理の場合はSession.javaを利用することができます。DirectActionを用いてセッションが存在しない場合は、テーブルを表示するコンポーネントで実装することができます。

    ■シリアライズデータの変換
     ArrayやDictionary形式のデータは文字列と相互変換することができます。例えばつぎのような文字列はArrayを文字列に変換したものです。

    ・文字列に変換したArrayデータ
    ( “0″, “1″, “2″, “3″ )

     NSPropertyListSerializationクラスを用いればこういったデータの変換が実現できます。ここでは、文字列をArrayに変換する方法をご紹介します。

    ・文字列からArrayへの変換

         public NSArray values() {
             return NSPropertyListSerialization.arrayForString(
                                                          levelValues());
         }
    


     まず、levelValues()は文字列に変換されているデータを返すメソッドです。その文字列をスタティックメソッドarrayForStringで処理するとNSArrayに変換されたデータを取得することができます。
     NSPropertyListSerializationでは他にも変換用のメソッドが提供されており、文字列からDictionaryに変換するにはdictionaryForStringメソッドを用います。

    ■文字列からNSTimestampへの変換
     文字列から日時データ(NSTimestamp)を生成する方法を紹介します。例えば次のような文字列があったとしましょう。

    ・文字列で表現された日時
    “1973/12/12″

     NSTimestampFormatterクラスを利用すればこのような文字列をNSTimestampに変換することができます。変換のコードは次のようになります。
    ・文字列からNSTimestampへの変換

         String dateString = "1973/12/12";
         NSTimestampFormatter dateFormatter =
                                     new NSTimestampFormatter("%Y/%m/%d");
         NSTimestamp date =
            (NSTimestamp)dateFormatter.parseObject(dateString);
    
    

     まずNSTimestampFormatterクラスを用いて文字列の書式(“%Y/%m/%d”)を指定します。そしてparseObjectメソッドを使って文字列をNSTimestampへと変換します。

    ■NSTimestampから文字列への変換
     それでは最後にさきほどとは逆のパターンを紹介しましょう。NSTimestampのデータを文字列に変換する方法です。ここでは年、月、日をそれぞれバラバラに文字列へと変換する方法を紹介します。まずコードですが次のようになります。dateはNSTimestampのデータとします。

    ・NSTimestampから文字列への変換

         NSTimestampFormatter yearFormatter =
                                  new NSTimestampFormatter("%Y");
         NSTimestampFormatter monthFormatter =
                                  new NSTimestampFormatter("%m");
         NSTimestampFormatter dayFormatter =
                                  new NSTimestampFormatter("%d");
    
         String year = yearFormatter.format(date);
         String month = monthFormatter.format(date);
         String day = dayFormatter.format(date);
    


     今度はNSTimestampFormatterのformatメソッドを使ってNSTimestampを文字列に変換しています。このように処理すればNSTimestampを年、月、日ごとに文字列へと変換することができます。

    藤本裕之のプログラミング夜話 #85

     前回はInterface Builderの(つうかCocoaの、だな)「One shot」という表現に対する文句で終わったわけだが、あとでふと、あの「shot」はつまり「スクリーンショット」とかいうときの「shot」であるのだな、と気付いた。辞書をあたってみると「shot」には写真とか映画の一場面という意味があるので、Cocoaいうところの「One shot」はなんちうか「長い映画の一場面にしか出てこない登場人物」みたいなニュアンスなのかな、と思う。…これでどんだけ解りやすくなったかは疑問だが。

    新しい話題に移る。NSWindowのインスペクタで「One shot」の次にあるチェックボックスは「Utility window (panel only)」、その下にある「Non activating panel (panel only)」と共に、世に名高いpanel onlyコンビを組んでいるわけだが(別に名高くないか)、こいつらの意味と役割を見ていこう。まず言わずもがなのことをわざわざ書いて字数稼ぎをしておくと、こいつらのいう「panel」とはNSWindowのサブクラスであるNSPanel(およびそのサブクラス、というのが正確だがいちいち面倒なのでこれ以降はNSPanelだけで済ませる。神経質な人はこの文章に対して「s/NSPanel/NSPanel(およびそのサブクラス)/」を実行してから読むとよろしい)のことである。

    では百聞は一見に如かず、Interface Builderを起動してテキトーなnibファイルを開き、NSPanelのインスタンスを一個作ってみよう。作った当初はタイトルバーの文字が「Panel」となっているだけ、他の部分はNSWindowと変わらない。ただインスペクタにある panel onlyコンビが両方とも設定可能になっている。まずは上の「Utility window (panel only)」をONにしてみる、と、タイトルバーが細くなりタイトルの文字も小さくなったはずである。
     それだけぢゃない、今作ったNSPanelのこのスイッチをオンにしておき、ついでに「Visible at launch time」もオンにする。もう一個、これはNSWindowを作って同じように「Visible at launch time」をオンにし、command+Rを押して「Test interface」を実行してみて欲しい。ほらね。このスイッチをオンにされたパネルは自動的にフローティング・ウィンドウになって普通のNSWindowに隠されないのである。というわけで、つまりはこれが Utility Window なんだが、ではこれと同じやつを身近で探してみよう。

    この原稿を書いているJeditではフォントパネル、それから文字色を選ぶ時に出てくる「カラーパネル」がそうである。他には入力メニューから選べる(選ぶためにはシステム環境設定の「言語環境」でそいつをオンにしておく必要があるが)「キーボードビューア」、「文字パレット」など…。とにかくこのチェックボックスはウィンドウの形状・レヴェルが変わるという珍しくも解りやすいスイッチであることが解った。
     次なるはコンビのもう一方、「Non activating panel (panel only)」。これの意味するところは読んで字のごとし…Activateされないパネルなんだよ、と言うと解ったような気がするが、これがなかなか難しいのだ。

    こちらもまずは実験と行こう。さっき作ったパネルの「Utility window(panel only)」を外し、「Non activating panel (panel only)」がオンになってるNSPanel(でもUtility Windowぢゃないから見た目は変わらない)と「Non activating panel (panel only)」がオンになってない(つうかできないんだけど)だけで後のスイッチは全部パネルと同じ普通のNSWindowを作る。あ、最初から2つのウィンドウが見えていないと実験にならないので「Visible at launch time」はオンのままね。
     で、問題はこっから。騙されたと思ってそれぞれのウィンドウに一個ずつNSTextFieldを配置してほしい。ご存知のように、ウィンドウに唯一のNSTextFieldは、そのウィンドウがActivateされるとハイライトされる。つまりこれが「ウィンドウがActivateされたかどうかのインディケータになるわけね。ではいよいよ…というところでちょうど時間となりました、ぢゃない、ちょうど字数が尽きました。ではこの実験については次回ということで、よろしく。
    (2006_02_09)

    高橋真人の「プログラミング指南」第83回

    UNIXとしてのMac OS X

    〜Perlについて(29)〜

     こんにちは、高橋真人です。
     前回の記事までの連載でファイルを開いて処理する基本についての説明を行いました。さて私が最初にPerlを使ったころ、Perlの使い方はこのような形でのテキスト処理が中心でした。
     MacPerlの場合、標準出力へのプリントは専用のウインドウを開いて表示してくれますので、あえて新規ファイルを作って書き出さなくても、出力ウインドウのテキストをコピーしてエディタに張り付ければ用は足りたのです。
     何度かお話ししてきたようにMacPerlでは簡単にドロップレットが作成できましたから、目の前に処理したいテキストファイルがある時には、MacPerlを起動してスクリプトを書き、それをドロップレット形式で保存するだけで準備は完了でした。あとはテキストファイルをドロップしては、出力ウインドウに表示される結果を見ながら、少しずつスクリプトを目的の形に近づけていけばよかったのです。

    ところでUNIXの世界では、すべてのファイルはテキストファイルであることになっていますから、テキスト処理というものはファイル処理の中心となります。もちろんテキストと言ってもすべてが可視文字とは限りませんし、画像ファイルなどは当然バイナリデータです。
     しかし私自身、最近ではネットワークプログラミングなども手がけるようになって改めて、UNIXという文化がテキストというものを常にベースにしてきたことを認識しました。
     昨今のビジネス絡みのシステムでも、必ずしもUNIXばかりではないにも関わらず、テキストのメリットが再認識されています。XMLなどは正にその典型的な例でしょう。MicrosoftがOfficeのデータ形式をXMLにするなどと言っていますが、Windowsが主流と思われている世界でも結局はテキストに回帰したわけですから、その意味でもUNIXの考え方は正しかったのだなと思います。
     ところでUNIXには「Keep it simple, Stupid」、略してKISSという流儀があります。日本語にすれば、「シンプルにしとけよ、バカもん」とでもなるのでしょうか。このKISSという考え方は、ツールを作る上での指標となっています。

    UNIXのプログラミング入門書としてお薦めできる本に「Linuxプログラミング〜例題で学ぶUNIXプログラミング環境のすべて〜(改訂第2版、ソフトバンク刊)」という本がありますが、この本はC言語によるUNIXプログラミングの入門書で全715ページという労作ですが、第1章で導入と併せてUNIXの哲学についても解説していますが、その次の第2章でいきなりシェルプログラミングが80ページ余にわたって解説されています。
     シェルプログラミングというのは、シェルスクリプティングとも言い、手作業で行う処理をまとめて自動化するための仕組みです。実体はただのテキストファイルですが、コマンドラインに打ち込むコマンドを羅列したり、条件による分岐や繰り返し処理なども加えることが可能で、これをシェルが解釈することで実行ファイルのように動かすことができるのです。
     MS-DOSをご存知の方なら、「バッチファイルのようなもの」と考えていただければそんなに違わないと思います。

     で、何でUNIXのプログラミング入門書(この本も他のUNIXプログラミング入門書とたがわずCでプログラミングを書くことが前提)であえてこんなにページを割いてシェルスクリプティングの解説をしているかと言えば、UNIXでは「車輪の再発明をするな」ということが言われるからです。つまり、「既にあるものはそれを利用せよ。なければ作れ」ということです。
     しかし、作る場合には決して複雑なものを作るのではなく、極力単純にせよ、と。そうすればバグも発生しにくくなるというわけです。つまり、KISSの発想には「単機能の仕組みを作って、それらを組み合わせて使え」ということが含まれているのです。
     この思想を実践するための一つとしてUNIXには極めて単機能なソフトがたくさんコマンドとして用意されています。例えばheadなどというコマンドは、指定したファイルの先頭の10行だけを標準出力に表示するだけの機能です。オプションもないことはないのですが、単にデフォルトの10行を変更できるだけなのです。
     こんな単機能のコマンドがいったい何の役に立つのかと思われる方もおいででしょう。しかし、一つ一つは単純な機能でもそれらを組み合わせたり、シェルスクリプトによって制御することで、何倍もの効果を生み出すことになるのです。
     例えばあるディレクトリに数百単位のテキストファイルがあり、それぞれのファイル名は単に通番が付いているだけだったような場合、それらをいちいち開いて中身を確認するのはかなり大変です。こんなときに、シェルスクリプトでディレクトリ内のすべてのファイルに対してheadコマンドを実行すれば、簡単な一覧リストを作ることができます。

    このように、UNIXには標準でシンプルなテキスト処理のコマンドがたくさん備わっているわけで、そういった文化の中から生まれてきたPerlだけにそれなりの「必然性」を持っているのです。つまり、Perlにおいてもテキスト処理の機能はある意味中心であると考えることもできるわけです。
     ところで、これらテキスト処理において「行」という概念はとても重要です。多くのテキスト処理コマンド(これをよく「テキストフィルタ」と呼びます)の処理対象は概して「行指向のテキスト」であることがほとんどです。
     で、Perlにおいても行指向のテキストが極めてオーソドックスに処理できることは今までも見てきた通りです。しかし、「やり方はいくつもある」はPerlの文化ですから、当然行指向のテキスト処理にももっと別のやり方があります。
     以前、<>というファイルから1行読み込んでくる演算子に関して、リストコンテキストで使用すると「すべての行を項目としたリストを返す」ということを説明したことがありました。
     次回に紹介するやり方はこのケースでの処理となります。map、grep、foreachといった演算子を使ってファイルの各行を処理する方法を見てみたいと思います。

    ニュース・解説

     今週の解説担当:小池邦人

    ● Carbon ドキュメント & サンプル & SDK ナビゲーション(2005/02/10)

    【開発環境】

    「DTK Exchange Program」で予約しておいたIntel Core Duo版 iMacがついに到着しました! このマシンはスゴク良いですね。設置スペースは液晶モニターと同等だし、液晶画面のクオリティも十分です。それから、とても静かなのにビックリ! ファンが回っているのにうちのオールドCubeより静かです(笑)。内蔵のビデオカメラは、ビデオ関連ソフトの動作確認に重宝しますし、付属のFront Rowを初めて操作してみましたが、ちょっとだけ未来を感じさせてくれました。

    そして、整数処理が中心でマルチスレッドに対応したコードの実行は、G5版より本当に2倍ぐらい高速です(浮動小数点処理はそうでもない…)。CPUのキャッシュサイズが大きいのが利いてるかもしれませんが、Xcodeのコンパイル&リンク処理も高速です。まったく同じプロジェクトで比較してみると(PPC用のMake)…

     2GHz Dual PowerMac G5

     ・MWC v9.6    30秒
     ・Xcode 2.2   21秒

     1.83GHz Core Duo iMac

     ・Xcode 2.2   12秒

    将来的には、ほとんどのアプリケーションがUniversal Binary化されることを考えれば、G5版よりこちらのiMacを購入されることをお勧めします。デベロッパの方なら、なおさらですね。MacBook Proの販売開始も近いようで、こちらも大変楽しみです。

    【テクニカルドキュメント】

    前回から2月10日の期間中、Apple社のDocumentationサイトには数多くのドキュメントが登録されました。ただし、大部分は今までの内容のマイナーチェンジです。今回は、その中で初版と内容が大幅変更になったドキュメントだけをピックアップしました。そのうち、「CFNetwork Programming Guide」は、日本語訳の要望が強いのではないでしょうか? デベロッパ向け読み物も2つ登録されています。「Optimizing Your Application with System Trace in Shark 4」については、前号の木下さんの記事も参照してください。

    「CFNetwork Programming Guide」(PDFあり)
    「CFNetwork Reference」(初版)
    「Segmented Controls Programming Guide for Cocoa」(PDFあり)
    「Universal Access Reference」(初版)

    http://developer.apple.com/documentation/index-rev-date.html

    「imeem Finds a Creative Solution for Cross-Platform Development」(読み物)

    http://developer.apple.com/business/macmarket/imeem.html

    「Optimizing Your Application with System Trace in Shark 4」(読み物)

    http://developer.apple.com/tools/performance/optimizingwithsystemtrace.html

    前回から2月10日の期間中、新規テクニカルノートはひとつだけ登録され、新規テクニカルQ&Aの方は2つ登録されました。TN2163については、前号の木下さんの記事も参考にしてみてください。

    TN2163「Building Universal I/O Kit Drivers」(初版)

    http://developer.apple.com/technicalnotes/index-rev-date.html

    QA1463「Integrating the QuickTime for Windows 7.0.3 Installer into your
    Application Installer」(初版)
    QA1459「QuickTime Audio – Easy Frequency Level Metering with MovieAudio
    APIs」(初版)

    http://developer.apple.com/technicalqas/index-rev-date.html

    【サンプルソースコード】

    前回から2月10日期間中、Apple社のSample Codeサイトには、新しいサンプルソースコードが4つ登録されました。「CheckExecutableArchitecture」は、アプリケーションの実行環境(CPUの種類など)をチェックするためのサンプルソースコードです。

    「CheckExecutableArchitecture」(Core Foundation関連)(初版)
    「CDROMSample」(CD-ROM関連)
    「ExtractMovieAudioToAIFF」(QuickTime関連)(初版)
    「SillyFrequencyLevels 」(QuickTime関連)(初版)

    http://developer.apple.com/samplecode/index-rev-date.html

    【デベロップメント SDK】

    前回から2月10日の期間中、Apple社のSDKサイトには新しいSDKがひとつだけ登録されました。また、CHUDの最新バージョンv4.3.2も登録されています。

    「FireWire SDK 21 for Mac OS X」

    http://developer.apple.com/sdk/

    「Computer Hardware Understanding Development (CHUD) Tools Version 4.3.2」

    http://developer.apple.com/tools/download/

    MOSAからのお知らせと編集後記は割愛します

    MOSA Developer News   略称[MOSADeN=モサ伝]
    Apple、Mac OSは米国アップルコンピュータ社の登録商標です。またそのほかの各製品名等はそれぞれ各社の商標ならびに登録商標です。
    このメールの再配信、および掲載された記事の無断転載を禁じます。
    特定非営利活動法人MOSA
    Copyright (C)2006 MOSA. All rights reserved.

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

    2006-02-07

    目次

    • 「WebObjects Dev Report」    第38回  田畑 英和
    • 小池邦人の「Carbon API 徒然草」
    • SqueakではじめるSmalltalk入門  第55回  鷲見 正人
    • ニュース・解説               木下 誠

    「WebObjects Dev Report」  第38回  田畑 英和

     今回は「ビジネスマッチングシステム」で実際に使用している、小ワザをいくつか紹介したいと思います。

    ■改行の表示
     「ビジネスマッチングシステム」ではユーザの情報を複数行のテキストで入力するような箇所がありますが、複数行のテキストを表示する場合は注意が必要です。
     複数行のテキストを単純にWOStringにバインドして表示しようとしても改行が無視されてWebブラウザ上に表示されてしまいます。WOTextを利用して表示してもよいのですが、ここでは改行付きの文字列をWOStringに表示する方法を紹介します。

    ・文字列の改行を
    タグに変換するコード

       public static String stringWithBR(String value) {
         if (value != null) {
           value = WOMessage.stringByEscapingHTMLAttributeValue(value);
           value = NSArray.componentsSeparatedByString(
                 value, "
    ").componentsJoinedByString("<BR>");
           }
    
           return value;
       }
    
    

     
    このコードでは引数に指定した文字列(value)に含まれる改行コードを、
    タグに変換しています。まずWOMessageのメソッドを利用して制御コードや記号をエスケープした文字列に変換しています。
     このとき改行コードは” ”という文字列にエスケープされます。そして次に” ”を<BR>に置き換えています。<BR>グへの置き換えにはNSArrayのメソッドを用いています。いったん文字列を” ”で区切ってArrayに変換してから、今度は<BR>タグでArrayを1つの文字列に連結しています。
     このようにすれば最終的には改行が<BR>に変換された文字列を取得することができます。つまり、次のような変換が行われます。

    ・変関例
    MOSA -> MOSA WebObjects -> MOSA<BR>WebObjects
    WebObjects

     このような変換をおこなった文字列をWOStringにバインドするとWebブラウザ上に複数行の文字列が表示されます。このときWOStringのescapeHTMLアトリビュートはfalseに設定するのを忘れないでください。

    ■プライマリーキーの取得
     モデルの定義でEntityのプライマリーキーをPropertyとして指定しなかった場合は、直接プライマリーキーの値を取得することはできません。もちろん、Propertyとして指定するという方法もありますが、EOFではプライマリーキーの管理は自動的に行われますので、通常はPropertyには指定しません。
     それでも、プライマリーキーの値を取得したい場合は次のようなコードで取得することができます。

    ・プライマリーキーを取得するコード

         public Number primaryKey() {
             NSDictionary primaryDict = EOUtilities.primaryKeyForObject(
                                                   editingContext(), this);
    
             if(primaryDict != null) {
                 return (Number)primaryDict.objectForKey("mosaUserId");
             }
    
             return null;
         }
    


     このコードはカスタムEOのクラスファイルに実装してあります。他の方法でもプライマリーキーを取得することができますが、ここではEOUtilitiesを用いたコーディングを行っています。
     まず、プライマリーキーを取得するEOが属しているEditingContextと、EOをprimaryKeyForObject()メソッドに渡してNSDictionaryを取得しています。このDictionaryの中にプライマリーキーが格納されています。プライマリーキーはEntity内に1つだけとは限らないため、このような形式になっています。
     Dictionaryから実際のプライマリーキーを取得するには、プライマリーキーのアトリビュート名(この場合はmosaUserId)を指定して値を取り出しています。
     今回紹介した方法ではEOUtilitiesクラスを使用していますので、eoaccessパッケージをimportするのを忘れないでください。また確定したプライマリーキーを取得するには、あらかじめEOがデータベースに保存されている必要があります。

    ■EOEntityのUserInfoの取得
     EOModelerでモデルを作成するときに各EntityにUserInfoを設定することができます。任意のEntityを選択してInspectorを開き、Inspectorの一番右側のボタンでEOEntityのUserInfoを設定できます。
     EOModeler上で設定したUserInfoはプログラムからアクセスすることができます。

    ・EOEntityのUserInfoを取得するコード

         public Object userInfoValueForKey(String key) {
             EOEntity entity = EOUtilities.entityForObject(
                                                editingContext(), this)
             NSDictionary userInfo = entity.userInfo();
             return userInfo .valueForKey(key);
         }

     このコードもカスタムEOクラスでの実装になります。まずEOUtilitiesクラスのentityForObject()メソッドでEntityを取得します。次に、EOEntityクラスのuserInfo()メソッドを用いてUserInfoを取得します。
     UserInfoはDictionary形式になっていますので、あとはNSDictionaryのメソッドを使ってkeyを指定することによりUserInfoの値を取得することができます。これでモデル上で設定しておいた値をプログラムから利用できるようになります。

    小池邦人のCarbon API 徒然草(2006/01/20)

    アプリケーションのUniversal Binary化(その2)

    前回から、本サンプルアプリケーションのUniversal Binary化(Intel x86 CPU対応)について解説していますが、今回は、開発環境の移行作業についての話です。サンプルアプリケーションの開発用プロジェクトを、Metrowerks CodeWarrior 9.6からXcode 2.2へと移植してみます。

    記述を短くするため、これからは、Metrowerks CodeWarrior 9.6をMWCと、Xcode 2.2をXcodeと記載します。なにゆえ最新のMWC 10でなく9.6を使うかと言うと、それにはあまり深い意味はありません(笑)。筆者が、今でも9.6を使い続けており、まだ10への移行をしていないためです(所有はしていますが…)。たぶん、現状で大きなトラブルが発生しないかぎりは、筆者はMWC 9.6を使い続けるでしょう。残念ながら、これが実用の最終版ですね。ただし、これからする話は、10に対しても有効だと思われますので、MWC 10を利用しているユーザの方も参考にしてください。

    もちろん、開発プロジェクトをMWC用からXcode用へ移植する作業を、すべて手作業で実行しても問題はありませんが、Xcodeのファイルメニューにある「プロジェクトの読み込み…」機能を利用するのが一番簡単で便利でしょう。手順は以下の様になります。

    1.Xcodeファイルメニューから「プロジェクトの読み込み…」を選択
    2.一覧リストから「CodeWarriorプロジェクトの読み込み」を選択
    3.「次へ」ボタンをクリックで画面を切り換える
    4.右上にある「選択…」ボタンをクリック
    5.ファイル選択ダイアログで対象となるMWCプロジェクトファイル(.mcp)を選択
    6.空だったカラムにCodeWarriorプロジェクトのパスと名称が設定される
    7.「CodeWarriorから”グローバル・ソースツリー”を読み込む」をチェック
    8.「参照プロジェクトを読み込む」をチェック
    9.「完了」ボタンをクリック
    10.AppleScriptによる制御でCodeWarrior IDEが起動され移植作業が開始される
    11.MWCプロジェクトファイルと同階層に.xcodeprojファイルが作成される

    この作業の大前提は、先んじてMWC側でアプリケーションをコンパイル&リンク(Make)可能なプロジェクトを正しく作成しておくことです。ちなみに、7と8の行程で行うチェックボックスの選択は、プロジェクトの移植方法によってはオプション操作となります。

    上記移植処理には、CodeWarrior IDEに実装されているAppleScript機能を使いますので、IDEが起動できない環境では(MWCを所有していないと)実行できません。こうして完成したXcode用プロジェクトですが、最小の追加処理ですぐに使えるように、先んじてMWC用プロジェクトの方で準備しておく作業が幾つかあります。まあ、これについてはユーザの考え方や好みも関係するのですが、筆者の場合には、以下の処理を事前に実行しています。

    まず最初に、nibファイル、リソースファイル、アイコンファイルなど、アプリケーションパッケージのResourcesフォルダに入るファイル類は、プロジェクトファイル(.mcp)と同階層にResourcesフォルダを作り、あらかじめその中にまとめて入れておきます。また、Info.plistファイルの構築に.plcファイルを使うのは止め、単独ファイルとして作成し、プロジェクトファイルと同階層に保存しておきます。そして最後に、Xcodeのプレフィックスヘッダ用として、以下内容を記述したテキストファイルを作っておきます。

    #include <QuickTime/QuickTime.h>

    例えば、MWC用プロジェクト名が「MOSA.mcp」ならば、プレフィックスヘッダファイルの名称は「MOSA_Prefix.pch」とし、プロジェクトファイルと同階層に保存します。

    今回の作業でMWC用プロジェクトから移植したXcode用プロジェクトは、以下のサイトに「MOSA_10.4_UB.zip」という名称で登録されています(MWCとXcodeどちらからでもMake可能)。MWC用プロジェクトの設定内容と、フォルダ内に保存されているファイル構成については、こちらもぜひ参照してください。

    http://www.ottimo.co.jp/library/index.html

    移植処理を完了すると、MWC用プロジェクトに登録されているソースファイル、ヘッダファイル、nibファイル、リソースファイル、LibraryやFrameworkなどは、すべて自動的にXcode用プロジェクトに登録されます。ところが、IDEのPackageタブで設定しておいたアプリケーションパッケージの中身は、リソースファイルとnibファイルを除いて、まったく移動してくれません。例えば、今回のサンプルアプリケーションでは、以下の4つのファイルやフォルダが移動されません。

    1.English.lprojフォルダとその中身のInfoPlist.stringsテキストファイル
    2.Japanese.lprojフォルダとその中身のInfoPlist.stringsテキストファイル
    3.MosA.icnsアイコンファイル
    4.MosD.icnsアイコンファイル

    また、せっかく作成し保存しておいたInfo.plistファイルも、Xcode側では有効となるように設定されていませんので注意してください。加えて、プレフィックスヘッダファイルのMOSA_Prefix.pchについても、Xcode側で登録作業をしないと有効になりません。

    次回は、MWC用プロジェクトの移植作業において、Xcode側でしなければいけない追加処理について解説したいと思います。Info.plistやMOSA_Prefix.pchのプロジェクトへの登録や、SDKの種類の選択、コンパイルオプションの設定などを行います。

    つづく

    SqueakではじめるSmalltalk入門   第55回  鷲見 正人

     本連載では、名前は知っていてもなかなか触れる機会のないSmalltalkについて、最近話題のSqueakシステムを使って紹介しています。SqueakのMorphic GUIでは、ウインドウやメニューなど目に見えるものはすべて「モーフ」と呼ばれるオブジェクトで構成されています。今回は、身近なウインドウとメニューについて、たしかにこれらがモーフであることを、前回のモーフの共通操作の復習をかねて確認してみましょう。

    ▼ウインドウをモーフとして扱う
     SqueakシステムのMorphic GUIにおいてウインドウは、タイトルバーのドラッグによる移動や、クローズボタンよる「閉じる」操作など、Macライクな操作が可能なように作り込まれています。しかし一方で、ウインドウはモーフでもあるので、コマンドクリックによる選択やハローによる属性の変更といった、前回のMorphのインスタンスと同様の操作も受け付けます。

    Morph allSubclasses includes: SystemWindow ” => true ”
    SystemWindow allSuperclasses includes: Morph ” => true ”

     デスクトップメニュー → 開く… → ワークスペースなどの操作で、適当なウインドウを開き、まず、ウインドウ内の適当な場所で、コマンドキーを押しながらドラッグしてみてください。ウインドウはモーフとして選択され(自分用のハローを表示)、マウスポインタの動きに追従するはずです。タイトルバーを使わずともこうしてモーフであるウインドウを移動することができます。

    [fig.A]モーフとして選択されたウインドウ
    http://squab.no-ip.com:8080/mosaren/uploads/55a.png

     「コマンドドラッグ」といえば、OS 9以前からあって、OS Xでも使えるTIPSのひとつに「ウインドウのタイトルバーをドラッグする際にコマンドキーを押しておくと、そのウインドウをアクティベートせずに移動できる」という操作があるのをご存じでしょうか。Morphic GUIにおけるコマンドドラッグによるモーフの移動は、他のモーフとの前後の位置関係を変えないので、ウインドウに用いたならば、くだんのTIPSと似た効果が期待できそうですね。

    選択時にモーフを囲むように現れるハローの機能も見てみましょう。左上の×印(ピンク色)ハローは、ウインドウをモーフとしてゴミ箱に移動します。他のモーフと同様に、ゴミ箱から取り出すことも可能です(ゴミ箱をダブルクリック)。Squeakシステムの設定が「モーフをゴミ箱に移動せずにただちに削除する」モードに設定(Preferences disable: #preserveTrash、または、ヘルプ… → プリファレンス → morphic → preserveTrash のチェックをオフ)されている場合は、ピンク色ハローは、ウインドウのクローズボックスとまったく同じ働きをします。

    黄色ハローについても、ウインドウの右下隅をドラッグして行なうサイズ変更と同じ働きをします。もちろんウインドウには、四隅と上下左右の境界のドラッグという、もっと柔軟なサイズ変更のためのUIが作り込まれているので、わざわざこの黄色ハローを使う必要はありません。ここでは、他のモーフと同様に大きさを変えることも可能であることを確認できればよいと思います。右上の緑色ハローは、ウインドウをモーフとして同じものを複製します。

    それがどんな役に立つのかは不明ながらも、見ていてとても楽しい機能が青色ハローによるウインドウの回転です。ウインドウは回転した後も、文字の入力や編集を通常どおり行なえます。ペイント系に対する、ドロー系の図形オブジェクトの特徴として「回転操作を行なうことができる」点を挙げることがありますが、ウインドウの回転は、まさにドロー系オブジェクトであるモーフにより作られたウィジェットならではの「お遊び」ではないでしょうか。

    [fig.B]モーフとして回転させたウインドウ
    http://squab.no-ip.com:8080/mosaren/uploads/55b.png

    ▼ポップアップメニューとメニュー項目をモーフとして扱う
     ポップアップメニューもウインドウ同様、自身もモーフであり、かつ、さらにメニュー項目といった「部分」もモーフにより構成されています。たとえば、デスクトップをクリックしてポップアップするお馴染みの「デスクトップメニュー」(別名「ワールドメニュー」)も、ポップアップ後、メニュー項目を選択する代わりに、コマンドドラッグによる移動が可能です。

    [fig.C]モーフとして選択、移動中のメニュー
    http://squab.no-ip.com:8080/mosaren/uploads/55c.png

     青色ハローによる回転も可能です。ウインドウ同様、回転してもメニューとして機能し続けます。

    [fig.D]モーフとして回転しても機能し続けるメニュー
    http://squab.no-ip.com:8080/mosaren/uploads/55d.png

     メニューを選択してからさらに、適当なメニュー項目を改めてコマンドクリックすると、その項目をモーフとして選択できます。

    [fig.E]モーフとして選択されたメニュー項目
    http://squab.no-ip.com:8080/mosaren/uploads/55e.png

     この状態で、たとえば黒色ハローでピックアップしたり、緑色ハローで複製を作って特定のメニュー項目を独立して取り出すことが可能です。こうして取り出したメニュー項目は、たいてい、もとのメニューで選択したときと同じ挙動を保持していますから、たとえばデスクトップメニューの「開く…」のように、頻繁に使用するメニュー項目があれば、その複製を作ってデスクトップに置いておくのもよいかもしれません。

    [fig.F]取り出した「開く…」メニュー項目
    http://squab.no-ip.com:8080/mosaren/uploads/55f.png

     この「メニュー項目」モーフに限らず、ウインドウのタイトルバーやスクロールバー、さらにその中にあるパーツ類もすべてはより細分化されたモーフで構成されています。このように、他のモーフに組み込まれて、その部品として機能するモーフのことを「サブモーフ(submorph)」と呼びます。次回はこのサブモーフ化という機構について、もうすこし掘り下げてみましょう。

    バックナンバー:
    http://squab.no-ip.com:8080/mosaren/

    ニュース・解説

    今週の解説担当:木下 誠

    ———————————————————————-
    Shark 4の紹介
    ———————————————————————-

    Developer Toolsをインストールすると、XcodeとInterface Builderに加えて、色々な開発用ユーティリティも付いてきます。その中にあるSharkをご存知でしょうか? 鮫のアイコンが怖いですが、アプリケーションのパフォーマンスを最適化するためのツールです。CPUの使用状態、メソッド呼び出しのトレース、仮想メモリの状態など、様々な項目の確認ができる、非常に高機能なソフトです。

    そんなSharkの機能の一部を紹介するドキュメントが公開されています。「Optimizing Your Application with System Trace in Shark 4」です。このドキュメントでは、システムコールの呼び出しや仮想メモリのフォールトの頻度をチェックするための機能「System Trace」と、任意のポイントでイベントを記録するための「Sign Posts」を解説しています。

    Sharkは非常に高機能なので、使ったことが無い方は、ぜひ一度試してみてください。

    Optimizing Your Application with System Trace in Shark 4
    http://developer.apple.com/tools/performance/optimizingwithsystemtrace.html

    ———————————————————————-
    FireWire SDK 21が登場
    ———————————————————————-

    FireWire SDK 21が登場しています。紹介文によると、Universal Binaryへの移行を助けるための改良が含まれるそうです。

    Development Kits
    http://developer.apple.com/sdk/

    ———————————————————————-
    ドライバのためのUniversal Binary化設定
    ———————————————————————-

    これもドライバ周りの話題になります。I/O Kitのカーネルドライバに向けた、XcodeでのUniversal Binaryのための設定を解説したドキュメントが公開されています。「TN2163: Building Universal I/O Kit Drivers」です。

    Xcodeでの、ターゲットアーキテクチャ、使用するSDK、コンパイラのバージョンの設定などが解説されています。ドライバ開発者ではない方でも、10.4以前のMac OS X向けのXcodeの設定など、参考になるところがあります。

    TN2163: Building Universal I/O Kit Drivers
    http://developer.apple.com/technotes/tn2006/tn2163.html

    ———————————————————————-
    QuickTime Audio APIのドキュメント、サンプル
    ———————————————————————-

    このところ非常に力の入っているQuickTime関連のドキュメントやサンプルの公開ですが、今週もあります。QAが1つと、サンプルが2つ、公開されました。今週は、Audio APIの強化週間のようです(?)

    QA1459: QuickTime Audio – Easy Frequency Level Metering with
    MovieAudio APIs
    http://developer.apple.com/qa/qa2005/qa1459.html

    ExtractMovieAudioToAIFF
    http://developer.apple.com/samplecode/ExtractMovieAudioToAIFF/ExtractMovieAudioToAIFF.html

    SillyFrequencyLevels
    http://developer.apple.com/samplecode/SillyFrequencyLevels/SillyFrequencyLevels.html

    MOSAからのお知らせと編集後記は割愛します

    MOSA Developer News   略称[MOSADeN=モサ伝]
    Apple、Mac OSは米国アップルコンピュータ社の登録商標です。またそのほかの各製品名等はそれぞれ各社の商標ならびに登録商標です。
    このメールの再配信、および掲載された記事の無断転載を禁じます。
    特定非営利活動法人MOSA
    Copyright (C)2006 MOSA. All rights reserved.