MOSA Multi-OS Software Artists

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

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

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

MOSADenバックナンバー 2005年5月発行分

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

    2005-05-31

    目次

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

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

     いよいよWWDCも目前となってきました。ここ数年は、WebObjects関連のセッションが減少傾向にあり、残念ながら新しい発表も特にありませんでしたがはたして今年はどうなることでしょうか。Mac OS X ServerやXserve/Xserve RAIDの登場によりサーバ環境は充実してきているのですが、WebObjectsも頑張ってもらいたいものです。

    モデルファイル

     さて今回はモデルの作成について取り上げてみたいと思います。前回解説しましたようにモデルファイルとはオブジェクトとデータベースとのマッピングを定義するファイルですが、このファイルによりアプリケーション(プログラム)側からみるとデータベースを抽象化することができます。
     通常WebObjectsではデータベースアクセスをおこなうさいに、直接SQLを記述するようなことはいたしません。(*1) プログラム上でオブジェクトの操作をおこなえば、自動的にその操作に対応するSQL文が生成され、データベースアクセスが自動化されます。基本的には以下のような組み合わせで自動化がおこなれます。

    ・オブジェクトの操作と対応するSQL
    オブジェクトの作成 -> insert
    オブジェクトの変更 -> update
    オブジェクトの削除 -> delete
    オブジェクトの検索 -> select

    *1 ただし、直接SQLを記述することも可能

     例えば、プログラム上でオブジェクトが新たに生成されれば、そのオブジェクトをデータベースに格納するために自動的にinsert文の生成がおこなわれることになります。
     このデータベースアクセスを実現しているのがEOF(Enterprise Objects Framework)と呼ばれているフレームワークですが、実際にデータベースアクセスを実行するには、プログラム上のオブジェクトとデータベースをマッピングさせる必要があります。具体的には次のようなマッピングを定義します。

    ・マッピングの関係
    テーブル名 <-> クラス名
    カラム名/データベース上での型 <-> アトリビュート名/Java上での型(クラス)

     このようなマッピングをモデルファイルに登録しておくことによりEOFは実行時に、各オブジェクトをデータベース上のテーブルへとマッピングし、オブジェクト上のデータをテーブル上の各カラムへとマッピングすることができるわけです。またデータベース上での型とプログラム(Java)上での型はそれぞれ異なりますし、使用するデータベースによっても型の定義は異なっている場合がありますので、モデル上ではデータベースとJavaの型情報もマッピング情報として定義しておきます。
     このモデルファイルにより、データベースに依存する部分が吸収されるため、プログラム側はデータベース固有の情報からは独立し、モデルファイルのマッピング情報を変更することにより、接続先のデータベースを変更するといったことも可能になっています。

    接続情報

     マッピンング情報のほかにデータベースに依存する情報として、データベースへの接続情報があります。WebObjects5.2.xではデータベース(RDB)への接続方式としてJDBCをサポートしており、標準では以下のデータベースをサポートしています。

    ・標準サポートのデータベース
     - Microsoft SQL Server 2000
     - MySQL 3.23.51
     - OpenBase 7.0.8
     - Oracle 8.1.7 and 9.2.0.1
     - Sybase ASE 12.5

     つまりこれらのデータベースはJDBCに対応しているわけですが、実際にJDBCによる接続をおこなうにはそれぞれのデータベース用のJDBCドライバが必要になります。またモデルファイルでは接続先のデータベースを指定するJDBCの接続情報を指定する必要があります。基本的にはURL形式で接続先のデータベースを指定すればよいのですが、データベースにパスワードが設定してある場合はURLといっしょにユーザ名やパスワードも接続情報として指定する必要があります。
     指定するURLの形式は使用するデータベースによってパラメータが異なっていますが、TILで各種データベースへの接続情報の指定方法が解説されています。たとえばローカルマシン上で稼働しているOpenBase上にある「JobMatch」という名前のデータベースに接続するには次のようなURLになります。

    ・URLサンプル
    jdbc:openbase://127.0.0.1/JobMatch
    ・WebObjects 5.xからの各種データベースへの接続
    http://til.info.apple.co.jp/techinfo/100473

    まとめ

     今回はモデルファイルの概要について解説しました。モデルファイルは特定のプロジェクトだけで使用するのではなく、フレームワーク化することにより、複数のプロジェクトから共有することも出来ます。
     実際にモデルファイルを作成するにはEOModelerというツールを用いることになりますが、次回はEOModelerについてレポートしたいと思います。

    小池邦人の「Carbon API 徒然草」(2005/05/27)

    ドラッグ&ドロップの活用(その4)

    今回から数回に分け、ドラッグ&ドロップにおけるSend処理を紹介します。ウィンドウ上のオブジェクト(画像、テキスト、ファイル情報など)をドラッグし、Finderなどの別アプリケーションにドロップする仕組みを解説します。

    Receive処理とは異なり、Send処理ではデータを受け渡し用ルーチンを「コールバックルーチン」として実装しておく必要はありません。ドラッグしたいデータの表示範囲でマウスクリックが発生した時点で、逐次必要な処理を実行していく形となります。ただし、少々特別なケースに対応するため、データ受け渡し用コールバックルーチンを用いる場合もありますが、それについては別の機会に詳しく解説したいと思います。また残念ながら、本サンプルアプリケーションにはSend処理は実装されていませんので、これから紹介するルーチンは「仮想的な処理」に対するサンプルソースコードとなります。ご了承ください。

    先ほど、ドロップするターゲットとして「Finderなどの別アプリケーション」と記述しましたが、当然ターゲットは自分自身でもかまいません。例えば、あるオブジェクトを同じウィンドウや別ウィンドウ内の特定の場所へ移動したりする場合などです。Finderであれば、アイコンをドラッグ&ドロップで別のフォルダへ移動、複製する処理に相当します。結局、Send処理のターゲットとしては以下の3種類を念頭に置けばよいでしょう。当然、Finderも別アプリケーションのひとつなのですが(笑)、システムと密接に関係しているということで、今回はあえて区別をしてみました。

    (1)自分自身(Send処理をしているアプリケーション)
    (2)別アプリケーション(Adobe Photoshopなど…)
    (3)Finder(システム関連…)

    基本的には、ウィンドウ上にドラッグ対象オブジェクトが表示されているとすると、その上でマウスクリックが起こる時点でSend処理へと入ります。最初に、そのSend処理への入り口を紹介しておきます。ここでは、あるコントロールにドラッグ画像(PICTやICON)が表示されており、それをユーザがマウスクリックしたと仮定します。この場合には、コントロール自体にイベントハンドラ(Carbon Event Handler)を実装しておき、そこでマウスクリックの発生を感知するのが便利です。以下が、対象コントロールにイベントハンドラを実装するsetupMyControlEvent()ルーチンです。受け取り対象となるイベントの種類は「kEventControlHit」のみとなります。

    void setupMyControlEvent( ControlRef chd )
    {
        EventTypeSpec    list[]={
                                     { kEventClassControl,kEventControlHit }
                                };
    
        InstallControlEventHandler( chd,myControlEventHandler,
                                  GetEventTypeCount(list),list,(void *)chd,NULL );
    }
    


    次に紹介するのが、コントロール上のマウスクリックに対処するためのイベントハンドラmyControlEventHandler()ルーチンです。イベントクラスが「kEventClassControl」で、イベント種類が「kEventControlHit」の場合にのみ、ConvertEventRefToEventRecord()でEventRefの内容をEventRecord(旧イベントループで用いた構造体)へと変換し、それを対象ウィンドウのWindowRefと対象コントロールのControlRefと共にstartMyDrag()に渡しています。

    pascal OSStatus myControlEventHandler( EventHandlerCallRef myHandler,
                                                   EventRef event,void* userData )
    {
        short            ret=eventNotHandledErr;
        unsigned long    ekind;
        EventRecord      evrec;
        WindowRef        wptr;
        ControlRef       chd;
        long             cls;
    
        cls=GetEventClass( event );   // イベントのクラス名を得る
        ekind=GetEventKind( event );  // イベントの種類を得る
        chd=(ControlRef)userData;     // 対象コントロールのControlRefを得る
        wptr=GetControlOwner( chd );  // 対象ウィンドウのWindowRefを得る
    
        if( cls==kEventClassControl  && ekind==kEventControlHit )
        {
            if( ! ConvertEventRefToEventRecord( event,&evrec ) )
                               // Carbon EventからEventRecord構造体を作成する
                ret=startMyDrag( wptr,chd,&evrec ); // ドラッグ&ドロップ実行
        }
        return( ret );
    }
    


    実際にドラッグ&ドロップのSend処理を担当しているのがstartMyDrag()ルーチンです。本ソースコードでは、先頭が大文字のルーチンがDrag Manager APIであり、先頭が小文字のルーチンは自作ルーチンですので御注意ください。まず最初に、WaitMouseMoved()を実行します。このAPIはクリックされたマウスカーソルが動き出す(ドラッグされる)かどうかを監視しています。もし、マウスが初期位置から許容範囲外(縦横数ピクセル)へ動くと実際のSend処理へ入ります。このように、マウスドラッグへ入るまでに「数ピクセルの遊び」があるのは、ユーザインターフェース的にとても優れた仕様です(Finderで試してみると分かる)。別環境で「マウス操作がとても難しい!」と感じたならば、この「遊び」の存在をぜひ思い出してください(笑)。

    short startMyDrag( WindowRef window,ControlRef chd,EventRecord *event )
    {
        short                    chk1,chk2,ret=eventNotHandledErr;
        RgnHandle                rgn1,rgn2;
        GWorldPtr                gptr=NULL;
        DragReference            dref;
        DragSendDataUPP          fptr;
        DragAttributes           att;
        StandardDropLocation     loc;
    
        if( WaitMouseMoved( event->where ) )  // マウスが範囲外へ動くまで待つ
        {
            if( NewDrag( &dref ) ) // 新規のDragReferenceを得る(セッション開始)
                return( 1 );
    
            if( createDataMyDrag( window,chd,dref ) ) // ドラッグ用データを設定する
            {
                DisposeMyDrag( dref );
                return( 1 );
            }
            chk1=chk2=1;
            if( rgn1=NewRgn() )
                chk1=createRegionMyDrag( window,chd,rgn1 ); // ドラッグ枠を作成
            if( rgn2=NewRgn() )
                chk2=createImageMyDrag( window,chd,dref,rgn2,&gptr );
                                                            // 半透明画像を作成
            if( chk1==noErr && chk2==noErr )
            {
                fptr=NewDragSendDataUPP( (DragSendDataProcPtr)sendDataMyDrag );
                ret=SetDragSendProc( dref,fptr,0 ) );
                                        // データ受け渡し用のコールバックUPPを実装
                if( ret==noErr )
                    TrackDrag( dref,event,rgn1 );   // ドラッグ&ドロップの開始
                DisposeDragSendDataUPP( fptr );     // コールバックUPPを削除
                if( ret==noErr )
                {
                    GetDragAttributes( dref,&att ); // ドラッグアトリビュートを得る
                    if( (att&kDragInsideSenderApplication)==0 )
                                                    // 別アプリへドロップされたか?
                    {
                        if( ! GetStandardDropLocation( dref,&loc ) )
                        {
                            if( loc==kDragStandardDropLocationTrash )
                                deleteDataMyDrag( window,chd );
                        }   // オブジェクトがゴミ箱へドロップされた場合の処理
                    }
                }
            }
            if( rgn1 )
                DisposeRgn( rgn1 );     // ドロップ枠用のRegionを削除
            if( rgn2 )
                DisposeRgn( rgn2 );     // ドロップ画像用のRegionを削除
            if( gptr )
                DisposeGWorld( gptr );  // ドロップ画像用のGworldを削除
            DisposeDrag( dref );
        }
        return( ret );
    }
    


    WaitMouseMoved()によりマウスドラッグが感知されると、だいたい以下の手順でSend処理が進んで行きます。「オプション」の記述がある番号は、ケースによっては実装しなくても全体の処理に影響がない行程です。

    (1)NewDrag()で新規DragReferenceを得てセッションを開始する
    (2)ドラッグ&ドロップしたいデータをセッションに登録する
    (3)ドラッグするオブジェクトのグレイ枠(Region)を作成する
    (4)ドラッグ中表示される半透明の画像を作成する(オプション)
    (5)データ受け渡し用コールバックルーチンを登録する(オプション)
    (6)TrackDrag()でドラッグ&ドロップのSend処理を開始する
    (7)セッションの後処理を実行する(オプション)

    次回は、上記の処理を手順を追って説明して行きます。まずは、startMyDrag()内で実行されているcreateDataMyDrag()ルーチンを解説します。ドラッグされるデータ種類を色々と変えることで処理ルーチンがどう変わるかを、例題を上げて紹介したいと思います。

    つづく

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

     本連載では、名前は知っていてもなかなか触れる機会のないSmalltalkについて、最近話題のSqueakシステムを使って紹介しています。今回は、つい先頃、メジャーバージョンアップしてリリースされた日本語版Squeak「SqueakNihongo7」のSmalltalk言語における日本語文字列の扱いをみてみます。

     じつのところ、SqueakNihongo7で日本語の文字列を扱うにあたり、すでにお馴染みの文字列オブジェクト(Stringのインスタンス。a String)との違いをユーザーが意識する必要はほとんどありません。これまでと同じようにシングルクオーテーションで括って新しい文字列を作り、これまでと変わらない方法でメッセージを送ることができます。

    ‘日本語の文字列’ size ” => 7 ”
    ‘日本語の文字列’ reverse ” => ‘列字文の語本日’ ”

     文字列オブジェクトの要素である文字オブジェクトについても同じです。リテラル表現には、今まで通り、文字の前に「$」を付けます。

    ‘日本語の文字列’ at: 3 ” => $語 ”
    ‘日本語の文字列’ at: 3 put: $文 ” => ‘日本文の文字列’ ”

     しかし、日本語の文字列および文字オブジェクトが属するのは、それぞれStringやCharacterとは別の新しく設けられたクラスです。これは、メッセージ「class」を送信すれば簡単に調べられます。

    ‘single byte’ class = ‘single byte, too’ class ” => true ”
    ‘single byte’ class = ‘マルチバイト’ class ” => false ”

    ‘This is a pen.’ class ” => String ”
    ‘日本語の文字列’ class ” => MultiString”
    $a class ” => Character ”
    $あ class ” => MultiCharacter ”

     日本語を含めたマルチバイト文字列を扱えるようにするためのクラスを追加するにあたって、文字列クラスが属するコレクションクラス群の構成にも若干手が加えられています。すでに解説を加えたとおり、公式版 3.7 では、

    Collection
     SequenceableCollection
      ArrayedCollection
       String
        Symbol

    というように、StringやSymbolは抽象クラスのArrayedCollection直下のサブクラスでしたが、SqueakNihongo7の仮想イメージでは、

    Collection
     SequenceableCollection
      ArrayedCollection
       AbstractString  ←
        String
         Symbol
        MultiString  ←
         MultiSymbol ←

    というように、新しくAbstractStringという文字列を束ねる抽象クラスが設けられ、改めてそのサブクラスとしてStringやSymbol、そして新しいMultiString、MultiSymbolが定義されています。

     a Stringがa Characterのみを要素とすることができる特殊なan ArrayedCollectionであるのに対し、a MultiStringはa Characterの他に、a MultiCharacterを要素に含めることができる文字列として定義されています。なお、a MultiCharacterにはUnicodeに独自の情報を付加した内部表現が用いられています。

    $a asciiValue radix: 16 ” => ’16r61′ ”
    $あ asciiValue radix: 16 ” => ’16r1403042′ ”

     AbstractStringは、シングルバイト文字列、マルチバイト文字列の双方で共通して使用できるメソッドを収めるために設けられました。つまりこのことは、これまでStringだけに定義されていたメソッドが、AbstractStringとString(あるいはMultiString)に分割して定義されていることを意味します。従来、文字列オブジェクトに特徴的な挙動を調べたいときに、Stringだけのブラウズで済んだものが、SqueakNihongo7ではAbstractStringとString(あるいはMultiString)を同時に調べなければならなくなっている点に注意する必要があるでしょう。

     ところで、通常のブラウザでブラウズできるのは、指定したクラスに定義されたメソッドのみです。StringとそのスーパークラスのAbstractStringの両方に定義されたメソッドを一挙にブラウズするようなことはできません。こうした用途には「プロトコルブラウザ」というものが用意されているのでこれを通常のブラウザの代わりに使用します。プロトコルブラウザは、デスクトップメニューの「開く…」(英語版ではopen…)からではなく、ブラウザのクラスペインの黄ボタンメニューにある「browse protocol」を選択して起動します。

    [fig.A]Stringを選択したブラウザで「browse protocol」を選択
    http://squab.no-ip.com:8080/mosaren/uploads/40a.png

    [fig.B]起動直後のプロトコルブラウザ
    http://squab.no-ip.com:8080/mosaren/uploads/40b.png

     起動直後の初期状態では、Objectクラスからのスーパークラス群に定義された全メソッドを表示してしまっています。これでは情報量が多すぎるので、ウインドウ中央左寄りにある「Only through Object」ボタンをクリックして、ポップアップするメニューから一挙にブラウズしたいスーパークラス(たとえばAbstractString)の範囲を指定します。この操作で、表示するメソッドを限定することが可能です。

    [fig.B]スーパークラスの範囲を指定するためのポップアップ
    http://squab.no-ip.com:8080/mosaren/uploads/40c.png

     あとは、普通のブラウザと同じように扱えます。少し違うのは、メソッドのリストにメソッド名に加え、それが定義されているクラス名も括弧でくくって表示されていることです。なお、注目するクラス(この場合、String)に定義されたメソッドはリスト中太字で示されます。

    [fig.B]プロトコルブラウザでのメソッドのブラウズ
    http://squab.no-ip.com:8080/mosaren/uploads/40d.png

     プロトコルブラウザはクラスの定義を行なう作業には向きませんが、注目するクラスのインスタンスが起動することが可能なメソッドを調べたいときなどにはたいへん重宝するツールです。ぜひ覚えて大いに活用してください。

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

    ニュース・解説

    今週の解説担当:木下 誠

    ———————————————————————-
    Core Imageで使うプロセッサを指定する方法
    ———————————————————————-

    Tigerで導入されたCore Imageでは、描画にGPUを活用することが出来ます。それと同時に、CPUだけで描画する方法も提供されています。この、GPUとCPUの利用はどのようにして決定されるのか、またはプログラムから利用するプロセッサを指定する方法を解説した、「QA1416: QA1416: Specifying if the CPU or the GPU should be used for rendering.」が公開されました。

    プロセッサの選択は、基本的にGPUがARBフラグメントを使えるかどうかによります。また、プロセッサの選択には、Core ImageのCIContextクラスを使います。

    QA1416: Specifying if the CPU or the GPU should be used for rendering.
    http://developer.apple.com/qa/qa2005/qa1416.html

    ———————————————————————-
    Javaのサンプル3つ
    ———————————————————————-

    Javaのサンプルが3つ公開されました。1つは、Javaからコマンドラインのvmmapを呼び出すサンプルです。他の2つは、グラフィックパフォーマンスを上げるためのものです。

    HelloVMMap
    http://developer.apple.com/samplecode/HelloVMMap/HelloVMMap.html
    GraphicsPerfomanceDemo2
    http://developer.apple.com/samplecode/GraphicsPerformanceDemo2/GraphicsPerformanceDemo2.html
    GraphicsPerfomanceDemo3
    http://developer.apple.com/samplecode/GraphicsPerformanceDemo3/GraphicsPerformanceDemo3.html

    ———————————————————————-
    Quartz Composerのチュートリアル
    ———————————————————————-

    MYCOM PC WEBで、Tigerについてくるグラフィックプログラミング環境であるQuartz Composerのチュートリアル記事、「Quartz Composerによるビジュアルフロープログラミング」が掲載されました。

    Quartz Composerは、パッチと呼ばれる小さいモジュールをグラフィカルにつなぐことで、グラフィックモジュールを作り上げるためのプログラミング環境です。すべての処理がリアルタイムで行なわれるため、非常に使いやすく、楽しい環境です。

    また、ここで作ったファイルは、Quartz Composerフレームワークを利用することで、自分のアプリケーションで再生することも出来ます。いろいろな使い方が考えられるでしょう。ちなみに、この記事は私、木下が書かせていただきました。

    Quartz Composerによるビジュアルフロープログラミング
    http://pcweb.mycom.co.jp/articles/2005/05/26/qc/

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

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

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

    2005-05-24

    目次

    • 「WebObjects Dev Report」     第7回  田畑 英和
    • 藤本裕之のプログラミング夜話 #69
    • ニュース・解説               小池 邦人

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

    Tigerに合わせてWebObjects 5.2.4がリリースされたことは前々回にレポートしましたが、Mac OS X版から少し遅れてWindows版もリリースされました。
    ですが、いったんWeb上で公開された5.2.4のJavaDoc(5.2.3からの変更点含む)がなぜかすぐに参照できなくなり、現在も参照できない状態が続いています。どういういきさつでこのようなことになったのかは分かりませんが、正確な情報を適切なタイミングで提供してもらいたいものです。

    プロジェクトの概要

     さて、本題に戻りまして、今回はプロジェクトの大まかな方針をレポートしておきたいと思います。WebObjectsでアプリケーションの開発をおこなう場合は、いくつかの種類のファイルを作成していくことになりますが、まずはプロジェクトの構成と、各種開発ツールについて確認しておきたいと思います。プロジェクトを構成する主なファイルと、それぞれのファイルを扱う開発ツールとの関連づけは以下のようになっています。他にもWebObjectsが扱うファイルやツールが何種類かありますが、基本的なものはこの3種類になります。

    ・Xcode(Project Builder, WOLips/Eclipse)
      -> Javaファイル、プロジェクトファイル
    ・WebObjects Builder
      -> WOコンポーネント
    ・EOModeler
      -> モデルファイル

    Javaファイル

     Javaファイルに実際のコードを実装していくわけですが、Javaファイルは用途別に何種類かに分類できます。

    ・プロジェクト生成時に自動生成されるファイル
      -> Application.java, Session.java, DirectAction.java, Main.java
    WebObjectsアプリケーションの基本となるクラス
    ・DirectAction(WODirectActionのサブクラス)
      -> セッションレスの処理を実装、DirectAction.javaはこのタイプ
    ・WOComponent(WOComponentクラスのサブクラス)
      -> 各Web画面の状態とふるまいを実装
    ・カスタムEO(EOGenericRecordのサブクラス)
      -> データ操作のロジック、データの正当性検証処理などを実装
    ・その他のJavaクラス
      -> 任意のJavaクラス、ユーティリティクラスなど

     WebObjectsはフレームワークに基づいており、データベースアクセスを含めWebアプリケーションに必要な基本的な機能はすでにフレームワーク側で実装されています。あとは必要に応じてWebObjectsが提供するクラスを継承したサブクラスを作成し、そこにアプリケーション独自の処理を組み込んでいくことにより、実際のアプリケーションを開発することができます。WebObjectsは完全にJava化されていますので、もちろん任意のJavaクラスを組み合わせて使用することもできます。

    WOコンポーネント

     Webアプリケーションでは実行時にWebページを動的に作成することになりますが、動的に生成するWebページをWOコンポーネントとして実装します。WOコンポーネントは複数のファイルから構成されており、その構成は以下のとおりです。

    ・APIファイル
      -> 再利用可能なコンポーネントの場合に使用
    他のコンポーネントとデータをやりとりするインターフェイスを定義
    ・WOファイル
      -> 動的に生成するHTMLのテンプレート
    さらに複数のファイルから構成される
    ・Javaファイル
      -> WOファイルと1対1に作成し、Web画面の状態とふるまいを実装

     このようにWOコンポーネントを実装するには複数のファイルを扱うことになりますが、WebObjectsの開発環境に含まれるツール「WebObjects Builder」を用いることにより、ファイルの構造をあまり意識せず、HTMLのテンプレートはGUI上で作成することができます。
     また、WebObjectsのテンプレートは標準的なHTMLを用いて作成しますが、動的に処理をおこなう部分については独自タグ(タグ、独自タグはこの1種類)を使用します。ですので他のWebオーサリングツールなどでHTMLをデザインする場合、この独自タグをどのように扱うかがポイントになります。

    モデルファイル

     最後にモデルファイルですが、WebObjectsはEOF(Enterprise Objects Frame work)と呼ばれるオブジェクト永続化フレームワーク(ORマッパー)を搭載しています。このようなフレームワークでは通常オブジェクトとデータベースとをマッピングすることになりますが、WebObjectsではモデルファイルでマッピング情報を定義していきます。
     モデルファイルを作成するツールにEOModelerを用いますが、モデルファイルの作成には2つのアプローチがあります。1つ目はまずデータベースを先に構築しておき、そこからEOModelerを用いてモデルファイルを自動生成させるやり方です。自動生成したモデルファイルは必要に応じてカスタマイズすることもできます。
     2つ目の方法としては、まずモデルファイルを作成しておき、EOModelerにモデル情報に基づいてSQL文を自動生成させ、データベース上にテーブルを自動作成することもできます。実際にどちらのアプローチをとるかは状況次第ですが、データベースとモデルファイルを両方構築した後、どちらかに変更を加えた場合、それぞれの内容は同期をとる必要もでてきます。

    まとめ

     以上WebObjectsでのプロジェクトの構成を簡単に説明しましたが、この連載で紹介するプロジェクトではまずモデルファイルから作成を始めていきたいと思います。おおまかな手順としては、まずアプリケーション(業務)で必要となるデータを分析してモデリングし、その結果をもとにモデルファイルの作成をおこなっていきたいと思います。そして、そのモデルファイルを用いてまずはデータのメンテナンス用のアプリケーション作成を最初の目標にしたいと思います。というわけで次回はモデルファイルの作成方法についてレポートいたします。

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

     NSViewの話3回目。前回は、NSViewがそれ自身入れ子にできる構造で、大本はそれが所属するウィンドウのコンテンツ・ビューであるというトコロまでであった。このスーパービューとサブビューに絡んでは、リサイズやアクティベーションなどいろいろ興味深い仕組みがあるんだが、まぁそれは置いておき今回は drawRect: の話をしたい。前々回も指摘した通り、Interface BuilderでNSViewのサブクラスを作ってソースファイルを生成させると自動的に宣言されるという、NSViewの屋台骨というか大黒柱的存在、ヒトに例えれば……まぁ例えなくてもいいか(笑)。

    -(void) drawRect:(NSRect) rect;

     その機能は読んで字のごとく、自身(NSView)内の指定された矩形領域を描画することである。が、ではこいつがどういうタイミングでコールされるのか、ということに関して正確に知っているヒトは意外と少ない。オレも昔そうだったからわかるんだが(あはは)、これ知らないとやたらコードの中に[self display]; とか [self setNeedsDisplay:YES]; とかが増えるんだよね。実は簡単な仕組みなんで、この機会にしっかり理解していただきたい。

     ここに一個のNSViewがある……、NSViewぢゃあんまりトリトメもないんでそのサブクラスのNSButtonにしよう。ダイアログボックスとかに普通に出てくるあの「OK」とかのボタンである。あ、「OK」ボタンはたいていデフォルトになってて色がついてるな。「キャンセル」ボタン……うーん、「キャンセル」ボタンでも押されるとそれでウィンドウが閉じてしまうか。よし、話を簡単にするためにチェックボックスにしよう(クラスは同じNSButtonである)。ここに、

    「□ モサ伝の原稿を書き終わった。」

    というチェックボックスがある、あります、いいですね?

     ユーザーが「□」の上にマウスカーソルを持ってきてマウスのボタンをクリックすると、□の色が青く変わってそこに……機種依存文字にしかないけどあのお馴染みの「レ」に似たあれが表示される。そこまでの処理を時間的に微分してみようというわけだ。まずユーザーがマウスボタンを押す、と……これはNSViewのスーパークラスであるNSResponderの領域だけど、mouseDown: というメッセージが NSButtonに届く。NSButtonは自分のタイプがチェックボックス型であり(ここ、いろいろと細かいアトリビュートがごちょごちょあるんだけど割愛する。つまりはInterface BuiderでNSButtonを作ると情報ウィンドウに表示されるあれこれを斟酌するわけだ)現在の状態がオフであることを認知、状態をオンにして、[self setNeedsDisplay:YES]; を呼ぶ。そのココロは「ワシは描き直される必要があるからね」であり、ここまででこいつのmouseDown: はおしまいである。

     呼び出し側(この場合、それはいわゆる「イベント・ディスパッチャー」であり、Cocoaの世界では隠蔽されている)は、マウスクリックによって発生した mouseDown: から制御が戻ると、その対象になったオブジェクト(mouseDown: はNSResponderのメソッドだが、実際にこいつに応えるのはNSViewあるいはNSCellとそのサブクラスのみである)に対してメッセージdisplayIfNeeded を送る。オブジェクトは自身が再描画を必要としているかどうかをチェックし、その必要があれば、lockFocus、drawRect: 、unlockFocusを呼び出す。ここで初めてチェックボックスは青くなりチェックマークがつくわけね。……次回はこのあたりをもっと詳しく追ってみたい。さてこれでワタシも「□ モサ伝の原稿を書き終わった。」をオンにできる、と(笑)。
    (2005_05_21)

    ニュース・解説

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

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

    【開発環境】

    Tiger(Mac OS X 10.4)販売開始から2週間ほどしか経っていませんが、もう10.4.1へのアップデータが登場しました。いくつもの大きなバグがフィックスされているようですが、皆さんのマシン環境での調子はいかがでしょうか? まだまだバグは沢山残っているようですが、少しはましになったようですね。ところで、10.4.1から利用できるようになるのではないかと期待されていた「Quartz 2D Extreme」という新機能があります。

    Mac OS X 10.2から搭載されているQuartz Extremeと名称が似ているのですが、Quartz 2D Extremeの方は、Quartz 2D APIによるライン、矩形、円、ベジェ曲線などの描画をビデオカードのGPUの能力を使い高速化してやろうという機能です。仕組み的には「Core Image」と大変よく似ています。機能自体は10.4の時点ですでに搭載されていたようですが、何らかの理由(まだバグがあるのでしょう…)でOFFの状態のままでした。そして残念なことに、期待に反して10.4.1でもQuartz 2D ExtremeはOFFのままです(涙)。

    この機能、Terminalからコマンドを打ち込み強制的にONにすることも可能なのですが、試してみる一番簡単な方法は、Xcode Toolsをインストールすると利用できる「Quartz Debug」でONにすることです(/Developer/Applications/Paformance Tools/)。アプリケーションを終了すると自動でOFFになってしまいますが、ONの状態にしたまま描画テストを実行し、その性能を調べることができます。うちのPowerMac G5で試してみたところ、図形描画の速度がほぼ2倍になることを確認することができました。図形描画が高速になると言うことは、そのAPIを多用しているユーザインターフェース描画なども高速になるわけでして、ユーザの体感速度の向上に大きな効果があることが理解できます。

    マシンの種類によっては画面表示に問題が発生するようですので、確認は自己責任でお願いします。まあ、本当はTiger登場時に完成しているはずの機能だったと思われますが…正式に利用できるようになるまでもう少し待つ必要があるようです。Quartz 2D Extremeに関しては、以下のサイトに詳しい技術的な解説が載っていますので、興味ある方は参考にしてみてください。

    http://arstechnica.com/reviews/os/macosx-10.4.ars/14

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

    前回から5月20日の期間中、Apple社のDocumentationサイトには新規ドキュメントがひとつも登録されませんでした。前回、Tiger関連のドキュメントが大量に登録された反動でしょうね。やはり休暇も必要です(笑)。

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

    前回から5月20日の期間中、テクニカルノートは2つ登録されました。TN2113の方は新版ですが、TN2065の方は、解説内容をMac OS X 10.4に対応させるための改訂版です。新規テクニカルQ&Aの方はひとつだけ登録されています。 内容は、Interface Builderで「HIMovieView」を作成してHIViewFindByID ()で呼び出しても、HIMovieViewCreate()でダイレクトで作成しようとしても、APIからエラーが返りうまくいかないというものです。これはQuickTime 7のバグだそうで、その回避方法がソースコード付きで解説されています。それにしても低レベルなひどいバグが残っているものです…(涙)。

    TN2113「Using AudioDeviceRead in Mac OS 10.4」(新版)
    TN2065「do shell script in AppleScript」(10.4用改訂版)

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

    QA1417「How to work around HIMovieViewCreate failing」

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

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

    前回から5月20日の期間中、Apple社のSample Codeサイトには、新しいサンプルソースコードが3つ登録されました。3つともJava関連のサンプルソースコードです。

    「SwapLAF」(Java関連)
    「HelpHook」(Java関連)
    「BrideOfMungGrab」(QuickTime&Sequence Grabber関連)

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

    【デベロップメント SDK】

    前回から5月20日の期間中、Apple社のSDKサイトには新しいSDKが3つ登録されました。最初の2つは、Apple自社製品の「Motion」と「Final Cut Pro」の拡張用SDKです。詳しくは、前号の木下さんの解説を参考にしてみてください。
    「Kernel Debug Kit 10.4.1」
    は、最近登場したMac OS X 10.4.1に対応したバージョンとなっています。

    「FxPlug SDK (DMG)」
    「Final Cut Pro XML Interchange Format DTDs」

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

    「Kernel Debug Kit 10.4.1」

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

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

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

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

    2005-05-17

    目次

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

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

     前回は予定を変更してTiger関連のレポートをおこないましたが、前々回にご紹介しましたEclipse上でのWebObjectsの開発方法の続きを解説したいと思います。

    プロジェクトの作成

     Eclipse上でWebObjectsの開発を支援するプラグイン「WOLips」をインストールすると、まずWebObjects用のパースペクティブが利用できるようになります。Eclipseでは作業内容に応じて画面構成を切り替えられるようになっていますが、この画面構成のことをパースペクティブと呼んでいます。例えばJavaプログラミング用のパースペクティブやデバッグ用のパースペクティブなどがあらかじめ用意されており、必要に応じてパースペクティブを切り替えながら開発をおこなっていくことになります。
     WOLips用のパースペクティブに切り替えるには、次のメニューを選択してください。

    ・WOLipsパースペクティブ
    「Window」->「Open Perspective」->「Other…」から「WOLips」を選択

     次に「File」->「New」->「Projects…」メニューから(またはツールバーから)プロジェクトを作成することができます。WOLipsではWebObjects用のプロジェクトとして以下のものが用意されており、プロジェクト名を入力すれば簡単にプロジェクトを新規作成できるようになっています。

    ・プロジェクトタイプ
      - WOApplication
      - WOFramework
      - D2WApplication
      - Jar Project

     WOApplicationタイプのプロジェクトを新規に作成すると以下のソースコードが自動的に作成されます。ちょうどXcode上でプロジェクトを新規に作成したのと同じようになります。さらにXcode用のプロジェクトファイルも自動生成されますので、必要に応じてXcode上での作業をおこなうこともできます。

    ・自動作成されるファイル
      - Applicaiton.java
      - DirectAction.java
      - Main.java(およびMain.wo)
      - Session.java

    アプリケーションの開発

     WOLipsではプロジェクトの作成だけではなくWOComponentの作成なども可能です。こちらもプロジェクトの作成と同様にコンポーネント名を指定するだけでWOComponentを新規に作成することができます。
     ですが、WOLips上でJavaプログラミングはできても、*.woの編集はできません(ソースを直接編集するという方法はありますが)。そこで*.woの編集に関しては別途WebObjects Builderを併用して開発を進めていくのがよいでしょう。
     しかし、Mac OS X上で開発をおこなっている場合ここで1つ問題があります。Eclipse上からWebObjects Builderを起動することはできるのですが、この場合ちょうどXcodeでプロジェクトを開いていない状態で、Finder上から直接*.woファイルを開いたときと同じになります。つまりWebObjects Builderの下半分のオブジェクトブラウザになにも表示されない状態になってしまいます。これではバインドやWebObjects Builder上でのKeyやActionの追加ができません。
     そこでEclipse上で開発をおこなう場合でも別途Xcodeでプロジェクトを開いた状態(さきほど解説しましたようにWOLipsがXcode用のプロジェクトファイルも自動生成してくれます)で作業をおこなうのがよいでしょう。

     Eclipseではコードを編集すると自動的にコンパイルをかけてくれますので、コンパイルが成功していれば、Eclipse上からアプリケーションを実行できるようになります。またWOLipsではWebObjectsアプリケーションの実行に関するパラメータの指定をおこなうこともできます。

    まとめ

     以上簡単ではありますが、Eclipse + WOLipsでのWebObjectsの開発について解説しました。より詳しい情報に関してはWOLipsをリリースしていますObject StyleのWebサイトを参照するか、EclipseのHelpからWOLipsのドキュメントを参照してください。

    ・ObjectStyle Webサイト
    http://www.objectstyle.org/woproject/
    ・WOLips User Guide
    「Help」->「Help Contents」メニューから「WOLips User Guide」を参照

     さて、開発環境を整えるにはまだソースコード管理ですとかテスティングの準備などもあるわけですが、機会があればまた取り上げるとして、今後は実際にプロジェクトの開発をおこなっていく過程をレポートしていきたいと思います。
     プロジェクトを開発するといいましてもWebObjectsのプロジェクトは、ソースコード、WOComponent、モデル、各種リソースファイル、など様々な要素から構成されています。またフレームワークを活用することによりプロジェクトを分割したり、プロジェクト間で再利用可能なコンポーネントを共有することもできます。
     どのようなスタイルで開発を始めていくかはプロジェクトの方針にもよるでしょうし、開発チームの構成によっては平行して開発を進めていく場合も考えられますが、本連載ではまず大まかな方針と最初の目標を決めて開発を進めていきたいと思います。

    小池邦人の「Carbon API 徒然草」(2005/05/13)

    ドラッグ&ドロップの活用(その3)

    今回は、ドラッグ&ドロップとは直接関係ありませんが、reciveCatalogWindow()の中から呼ばれている自作ルーチンについて解説します。Recive処理の最終目的を達成させるための一例として参考にしてみてください。

    以下が、前回紹介したreciveCatalogWindow()から呼ばれているaddImageFile()ルーチンです。このルーチンは、データブラウザにドロップされたアイコンがQuickTimeで表示可能な「画像ファイル」の場合にのみ実行されます(前回のケース1)。

    #define MAX_FILE    1000  // データブラウザに登録できる最大ファイル数
    
    short addImageFile( WindowRef window,unsigned long ct,OSType type[],
                                                                FSSpec fsc[] )
    {
        short            ret=1;
        ObjectPtr        optr;
        unsigned long    i,nn;
    
        myCursor( 4 );              // カーソルを時計表示に変える
        getWObjCount( window,&nn ); // 現在登録されているファイル数を得ておく
        for( i=0;i<ct;i++ )         // 引数で渡された個数分ループを実行
        {
            if( nn++==MAX_FILE )   // 最大登録数は1000ファイル
            {
                doErrAlert( 4 );   // これ以上ファイルを登録できないとエラー表示
                break;             // 処理を抜ける
            }
            else
            {
                if( ! newObject( window,type[i],&fsc[i],&optr ) ) // ファイル登録
                    ret=0;
            }
        }
        if( ret==0 )
            mainteAddImageFile( window ); // ボタンやブラウザにメンテナンスを行う
        myCursor( 0 );                    // カーソルを矢印表示に戻す
        return( ret );
    }
    


    画像ファイルのデータブラウザへの登録処理は非常に簡単です。newObject()ルーチンに対象ファイルのファイルタイプとFSSpecを渡し、ドロップされたアイコンの個数分だけObject構造体を確保します。登録後のボタン表示の変更(メンテナンス)や、データブラウザの一覧表示の更新などについては、以下のmainteAddImageFile()が担当しています。この中で実行されているaddItemDataBrowser()とmainteCatalogWindow()の2つのルーチンについては既に解説済みですので、そちらを再度参照してみてください。

    void mainteAddImageFile( WindowRef window )
    {
        SetWindowModified( window,1 ); // 何らかの編集が実行されたことを記録
        addItemDataBrowser( window );  // データブラウザの一覧表示を更新
        mainteCatalogWindow( window ); // ウィンドウ上のボタン表示を更新
    }
    

    次は、同じくreciveCatalogWindow()から呼ばれているaddImageFolder()ルーチンです。このルーチンは、データブラウザにドロップされたアイコンが「フォルダ」の場合にのみ実行されます(前回のケース3)。

    short addImageFolder( WindowRef window,FSSpec *fsc )
    {
        short            ret=1;
        OSType           type;
        ObjectPtr        optr;
        short            nb=1;
        CInfoPBRec       crec;
        Str255           name;
        FSSpec           fsc1;
        unsigned long    ct;
    
        fsc1=*fsc;
        myCursor( 4 );              // カーソルを時計表示に変える
        getWObjCount( window,&ct ); // 現在登録されているファイル数を得ておく
        while( 1 )
        {
            crec.hFileInfo.ioCompletion=0L;
            crec.hFileInfo.ioNamePtr=(StringPtr)name; // ファイル名が返る
            crec.hFileInfo.ioVRefNum=fsc->vRefNum;    // ボリュームリファレンス番号
            crec.hFileInfo.ioFVersNum=0;
            crec.hFileInfo.ioFDirIndex=nb++;          // インデックスを順次増やす
            crec.dirInfo.ioDrDirID=fsc->parID;        // ディレクトリID
    
            if( PBGetCatInfo( &crec,0 ) )   // フォルダ内のカタログから項目を得る
                break;                      // 個数を超えたらループから抜ける
            if( (crec.hFileInfo.ioFlAttrib&0x10)==0 &&
                             (crec.hFileInfo.ioFlFndrInfo.fdFlags&fInvisible)==0 )
                             // フォルダと不可視ファイルは登録対象から除外する
            {
                type=crec.hFileInfo.ioFlFndrInfo.fdType;
                navCheckImportExtention( name,&type ); // 拡張子チェック
                if( ! navImportCheckTypeList( type ) ) // 登録可能画像ファイルか?
                {
                    if( ct++==MAX_FILE )  // 最大登録数は1000ファイル
                    {
                        doErrAlert( 4 );  // これ以上登録できないとエラー表示
                        break;            // 処理を抜ける
                    }
                    copyString( name,fsc1.name ); // FSSpecのファイル名を差し替える
                    if( ! newObject( window,type,&fsc1,&optr ) ) // ファイル登録
                        ret=0;
                    else
                        break;
                }
            }
        }
        if( ret==0 )
            mainteAddImageFile( window ); // ボタンやブラウザにメンテナンスを行う
        myCursor( 0 );                    // カーソルを矢印表示に戻す
        return( ret );
    }
    


    フォルダアイコンがブラウザへドロップされた場合には、そのフォルダに含まれているすべての画像ファイルを登録することになります。そのため、先んじて対象フォルダ内に保存されているファイルのカタログリスト(一覧)が必要となります。こうしたファイル(当然フォルダも含まれる)の一覧を得るには、File Managerに属するPBGetCatInfo()を利用します。まず最初に、CInfoPBRec構造体に対象フォルダのボリュームリファレンス番号(fsc->vRefNum)、ディレクトリID(fsc->parID)、加えてリスト内のインデックス番号を(1から始まるので注意)を代入しておきます。続いて、そのCInfoPBRec構造体をPBGetCatInfo()に渡して実行すれば、指定インデックス番号のファイル(もしくはフォルダ)の名称を得ることができます。

    渡したインデックス番号がリストの個数より多い場合には、PBGetCatInfo()はエラーを返しますので、処理ループから抜けて作業を終了します。また、登録対象にはならないフォルダや不可視ファイルについては、先んじてカタログのアトリビュート(ioFlAttri)やファインダフラグ(fdFlags)をチェックして登録対象から除外しておきます。ちなみに不可視ファイルとしては、フォルダアイコンなどが含まれます。続いて、Navigation Serviceの解説時に紹介したnavCheckImportExtention()とnavImportCheckTypeList()を使い、QuickTimeで表示できる画像ファイルかどうかを調べてから、対象となるファイルのみをnewObject()で登録します。この時のファイル名は、crec.hFileInfo.ioNamePtrに代入しておいたパスカルストリングス(name)に返されますので、それを参照します。

    最後は、データブラウザにドロップされたアイコンが「ドキュメント」の場合にのみ実行されるloadObjectFile()ルーチンです(前回のケース2)。

    short loadObjectFile( WindowRef window,FSSpec *fsc )
    {
        long        len1,len2,i,nn;
        short       fref,ret=1;
        ObjectPtr   optr;
        Object      obj;
    
        getWObjCount( window,&nn );   // 現在登録されているファイル数を得ておく
        len1=sizeof( Object );        // Object構造体のサイズ
        len2=sizeof( unsigned long ); // unsigned long変数のサイズ
        if( ! FSpOpenDF( fsc,fsRdPerm,&fref ) ) // ドキュメントファイルをオープン
        {
            if( ! FSRead( fref,&len2,&ct ) )    // 登録個数を読み込む
            {
                for( i=0;i<ct;i++ )             // 個数分だけループを実行する
                {
                    if( FSRead( fref,&len1,&obj ) ) // Object構造体を読み込む
                        break;
                    else
                    {
                       if( nn++==MAX_FILE )  // 最大登録数は1000ファイル
                       {
                           doErrAlert( 4 );  // これ以上登録できないとエラー表示
                           break;            // 処理を抜ける
                       }
                        if( ! newObject( window,obj.o_type,&obj.o_fsc,&optr ) )
                            ret=0; // データブラウザにファイル登録
                    }
                }
            }
            FSClose( fref ); // ドキュメントファイルをクローズ
        }
        return( ret );
    }
    


    loadObjectFile()ルーチンでは、ドキュメントファイルから個数分のファイル登録情報(Object構造体)を読み込み、その内容を順次newObject()で登録して行きます。指定ドキュメントファイルに幾つのファイル情報が含まれているのかは、ファイルの先頭に保存されている個数(unsigned long値)を読み込むことで判断することが可能です。

    次回は、ドラッグ&ドロップにおけるSend処理を紹介します。ウィンドウ上のオブジェクト(画像やテキスト)をドラッグし、相手(もしくは自分自身)に渡す(ドロップする)方法を解説したいと思います。

    つづく

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

     本連載では、名前は知っていてもなかなか触れる機会のないSmalltalkについて、最近話題のSqueakシステムを使って紹介しています。今回は、つい先頃、メジャーバージョンアップしてリリースされた日本語版Squeakを取りあげます。

     この連載で紹介し使用してきた“公式版”と呼ばれるSqueak(現在のバージョン3.7)でもまだ、日本語をはじめとする、いわゆるマルチバイト文字列を扱うことができません【註】。しかし、これまでご紹介してきたとおりSqueakシステムは通常のOSと異なり限りなくオープンで、かつ、ほとんどすべてがSmalltalk言語で記述されている均一なシステムであるため、自由な改変が比較的容易な柔軟な作りになっています。したがって日本語化を含む多言語化についても必要とあらば、エンドユーザーレベルでの機能追加も可能で、実際、Squeakシステムの多国語化は1999年から、当時まだ、東京工業大学の学生だった大島芳樹氏の手により、Squeak 2.3をベースにして始まりました。

    http://www.akademia.co.jp/Smalltalk/SML/archives/SRA.archives/1999-April/003457.html

     Squeak 2.4への対応後、開発は途中休止しますが、それまでVisualWorksで仕事をしてこられたベテランSmalltalkerの阿部和広氏にいったん引き継がれ、Squeak 2.7から再び動くようになります。

    http://www.akademia.co.jp/Smalltalk/SML/archives/SRA.archives/2000-July/004313.html

     当初は多国化を扱うための最小限の機能を提供するにとどまり、また、公式版の仮想イメージに差分情報を読み込ませるインストール作業が必要でした。そこで、Smalltalkシステムの作法に馴染みのない人への便宜をはかるために、一連の、簡単ではありますが知らない人には難しく思われる作業を済ませた、インストール済みの仮想イメージが用意されました。これを「SqueakNihongo」という名称で配布するようになったのが“日本語版Sqeuak”で、その最新版が、今年の三月に公開された「SqueakNihongo7」です。

    http://www.smalltalk.jp/pipermail/squeak-ja/2005-March/002389.html
    http://d.hatena.ne.jp/squeaker/20050321#p2

     ひとつ前のバージョンであるSqueakNihongo6.1までのリリース経緯については、阿部氏の「日本語版Sqeuakを使おう」ページの<日本語版Squeakの歴史>を参照ください。

    http://squeak.hp.infoseek.co.jp/nihongo.htm

     さて、SqueakNihongo7ですが、先の大島氏のSqueak-jaメーリングリストでのアナウンスにもあるように、現在、次の場所で入手可能です。

    http://squeakland.jp/developer/

     OS Xの場合「Squeakバーチャルマシン」は、Squeak 3.8.6Beta6.app.sitをダウンロードし、必要ならStuffIt Expanderなどを用いて“解凍”します。「ソースファイル」はSqueakV3.sources.zipをダウンドローしても構いませんが、この連載で使用中のSqueak 3.7フォルダにあるSqueakV3.sourcesをコピーしても使えます。もちろん、肝心の「開発者版Squeakイメージファイルとチェンジファイル」のSqueakNihongo7.zipも忘れずダウンロードしましょう。SqueakNihongo7.zipは、解凍されるとフォルダが作られるはずなので、ここにすでに入手済みのバーチャルマシンとソースファイルを入れれば作業用のフォルダが出来上がります。

    [fig.A]SqueakNihongo7作業用フォルダの中身
    http://squab.no-ip.com:8080/mosaren/uploads/39a.png

     仮想イメージである「SqueakNihongo7.image」をバーチャルマシン「Squeak 3.8.6Beta6.app」にドロップインすれば“日本語版”のSqueakシステムを起動できます。なお、Finder上では、仮想イメージファイルはバーチャルマシンの文書ファイルとして扱われますので、関連づけさえきちんとできていれば仮想イメージのダブルクリックで起動することも可能です。ただ、複数のバージョンのSqueakバーチャルマシンが同時に存在し使い分けているときは、どの仮想イメージをどのバーチャルマシンで起動するかを明示的にするためにドロップインのほうが安全で確実だと思います。

    [fig.B]SqueakNihongo7起動後の画面
    http://squab.no-ip.com:8080/mosaren/uploads/39b.png

     SqueakNihongo7では、メニュー項目やヘルプメッセージのたぐい、eToysのフレーズなどが日本語化されています。ただ、すべての項目が日本語化されているわけではないことに注意してください。また、残念ながら現状では、Macでの日本語変換時のインライン入力には未対応です。

    [fig.B]日本語化されたデスクトップメニュー
    http://squab.no-ip.com:8080/mosaren/uploads/39c.png

     次回は、このSqueakNihongo7を用いて、Smalltalk言語で日本語をどのように扱えるようになっているのかを確認してみましょう。

    註:次の公式リリースである3.8より、SqueakNihongoで培われた多国語化機構が採用されるようです。

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

    ニュース・解説

    今週の解説担当:木下 誠

    ———————————————————————-
    Tiger用開発ドキュメントが多数公開
    ———————————————————————-

    ついに、Mac OS X 10.4 “Tiger”が発表されましたね。それに伴い、ADC(Apple Developer Connection)でも、Tigerに関する開発ドキュメントが多数公開されています。もうすでに、目を通している方も多くおられるでしょう。

    ドキュメントの入り口は、ADCの”Reference Library”になります。また、開発環境をインストールすると同時にドキュメントも入れられますが、TigerでバージョンアップしたXcode 2.0では、ドキュメントの自動更新機能が付いています。この機能を使うことで、つねにドキュメントを最新のものと同期させておけるでしょう。

    Reference Library
    http://developer.apple.com/referencelibrary/

    ———————————————————————-
    FxPlug SDK for Motionが公開
    ———————————————————————-

    Motion 2.0のリリースに合わせて、FxPlug SDK for Motionが公開されました。これは、GPUによるアクセラレーションを利用できる、フィルタやジェネレータといったプラグインを作成するためのSDKです。最初のホストアプリケーションは、Motion 2.0になります。ドキュメントを見る限り、Motion専用ではない、といったニュアンスを受けますが、他にホストアプリケーションが現れるかどうかは不明です。

    現在、FxPlugのためのセッションが2つ(”FxPlug Overview”、”FxPlug in Depth”)、WWDCで行われるということが発表されています。

    また、Final Cut Proのための、XML DTDも公開されています。これにより、Final Cut Proのデータを、他のアプリケーションでも利用できるようになります。

    Tigerでは、ビデオ機能が強化されるとともに、それをサードパーティのアプリケーションで利用できる環境が整ってきたように感じます。これらの応用例としては、QuickTimeによるビデオ再生、MotionのようなリアルタイムフィードバックGUI、Dashboardのようなエフェクト、QuartzComposerを使ったプレゼンテーション、などが考えられるでしょう。

    FxPlug for Motion Released
    http://developer.apple.com/appleapplications/fxplugsdk.html

    Final Cut Pro XML Interchange Format DTDs
    Apple Applications – Downloads
    http://developer.apple.com/appleapplications/download/

    ———————————————————————-
    Core Dataのチュートリアル
    ———————————————————————-

    Cocoa Dev Centralで、Core Dataのためのチュートリアル記事、”Build a Core Data Application”が公開されています。Core Dataを使ったサンプルアプリケーションの作り方を、ステップ・バイ・ステップで説明しています。

    簡潔な説明と、豊富で分かりやすい図のおかげで、非常に追いかけやすい記事となっています。

    Cocoa Dev Central: Build a Core Data Application
    http://cocoadevcentral.com/articles/000085.php

    ———————————————————————-
    Dashboardウィジェットのチュートリアル
    ———————————————————————-

    MacDevCenterで、Dashboardウィジェットを作成するためのチュートリアル、”Build a Dashboard Widget”が公開されています。UNIXコマンドを実行し、その結果を表示するウィジェットのサンプルのようです。

    MacDevCenter.com: Build a Dashboard Widget
    http://www.macdevcenter.com/pub/a/mac/2005/05/06/dashboard.html

    ———————————————————————-
    QuickTime Kitの紹介記事
    ———————————————————————-

    MYCOM PC WEBで、QuickTime Kitを利用したプログラミングを紹介する、「QuickTime Kit – CocoaでQuickTimeプログラミング」が公開されています。QuickTime Kitを使って、ムービーを再生するためのCocoaアプリケーションを、ステップ・バイ・ステップで紹介する記事になっています。

    QuickTime Kitの登場で、CocoaアプリケーションからQuickTimeを利用するための敷居が、グッと低くなりました。Pantherでも使えるところがうれしいところです。ちなみに、この記事は、私木下が書かせていただきました。

    QuickTime Kit – CocoaでQuickTimeプログラミング
    http://pcweb.mycom.co.jp/articles/2005/05/06/qtkit/index.html

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

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

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

    2005-05-10

    目次

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

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

    Tigerがやってきた!!

     さてさて、いよいよTigerがリリースされました。各地のAppleStoreも盛り上がったようですが、銀座店ではすっかり恒例になった行列が今回も出現していました。GW中のリリースだったこともあり、もうたっぷりとTigerの世界を満喫された方もいらっしゃるかと思いますが、WebObjects関連でもいくつかUp dateがありましたので、今回は予定を変更してそちらのレポートをおこないたいと思います。

    Mac OS X Server v10.4

     まずはMac OS X Serverですが、これまでと同様にWebObjectsのDeploymentが付属しています。v10.3からはそれまで別CD-ROMで提供されていたものがOS本体に含まれるようになったため、その存在が見逃されがちでしたが、v10.4でもOS本体にあらかじめDeployment一式が含まれています。ですのでMac OS X Server v10.4を新規にインストールすればそれだけでWebObjectsのDeployment環境を構築することができます。
     WebObjectsのバージョンも若干アップデートされ、Mac OS X Server v10.4にはWebObjects 5.2.4のDeployment環境が付属しており、動作環境は以下のようになっています。

    ・WebObjects 5.2.4 Deployment動作環境
    OS : Mac OS X Server 10.4以降
    Java : JDK 1.4.2

     v10.3のころは実際にDeployment環境を起動するには設定ファイルを手動で編集する必要がありましたが、v10.4からはようやく「サーバ管理」ツール上で手軽に設定/起動ができるようになりました。以前からJBoss用のサービスは存在したのですが、v10.4になりようやくWebObjectsもサービスとして追加され、「サーバ管理」からwotaskdとMonitorの設定/起動ができるようになっています。
     といいましてもあまり細かな設定はおこなえず、wotaskdとMonitorそれぞれの起動/停止とポート番号の設定ができるだけです。「サーバ管理」ツール上で設定した情報は以下のファイルに保存されます。

    ・wotaskd
    /System/Library/LaunchDaemons/com.apple.wotaskd.plist
    ・Monitor
    /System/Library/LaunchDaemons/com.apple.womonitor.plist

     さらに、プロセスの起動方法がv10.4では変更になっています。v10.3まではStartupItems経由でwotaskd(およびMonitor)を起動しており、システム起動時にwotaskdを起動させるには設定ファイルを手動で編集する必要がありました。
     正確にはStartupItemsから起動された”javawoservice.sh”がwotaskdを起動していましたが、v10.4では新たに導入された”launchd”経由でwotaskdが起動されるように変更になっています。

    WebObjects 5.2.4 Developer

     Mac OS X Server v10.4にはWebObjects 5.2.4 Deploymentが付属していますが、5.2.4 Developerがどうなっているかといいますと、すでにアップデートがリリースされています。まず5.2.4 Developerの動作環境ですが以下のようになっています。

    ・WebObjects 5.2.4 Developer動作環境
    OS : Mac OS X 10.4以降
    Developer tools : Xcode 2.0
    Java : JDK 1.4.2

     すでにTiger用のJava 2 SE 5.0(ちなみにこちらの名前もTiger)がリリースされていますが、WebObjects 5.2.4では5.2.3と同じくJDK 1.4.2がサポート対象となっています。ですので5.2.4の主なアップデート内容はMac OS X 10.4とXcode 2.0対応ということになります。新規にWebObjects 5.2.4の環境を構築する場合は以下の手順になります。

    (1) Mac OS X 10.4をインストール
    (2) Xcode 2.0をインストール
    (3) WebObjects 5.2 Developerをインストール
    (4) WebObjects 5.2.4 Developerをインストール

     (3)のインストールが完了しOSを再起動すると、再起動後にパーミッション関連の警告メッセージが表示されますが、この問題は(4)で5.2.4のアップデートをインストールすることにより解消されます。5.2.4のアップデートはソフトウェアアップデート経由でも配布されています。
     他にも5.2.4ではフレームワークのバグフィックスやWebObjects Builderなどの開発ツールの改良もおこなわれています。

    ・WebObjects 5.2.4について
    http://www.info.apple.com/kbnum/n301410

     Panther時代のころはWebObjectsの最新環境を構築するにはアップデートを何度もあてないといけなかったのでかなり手間がかかりましたが、Tigerからは以前と比べて楽に環境を構築できるようになりました。またこれまではOSやDeveloper ToolsがバージョンアップしてもなかなかWebObjectsが対応してくれませんでしたが、今回は以外と素早い対応でした。
     今後もこういった迅速な対応と、なによりも将来のロードマップを明らかにしてもらいたいものです。今年のWWDCあたりでなにか発表がないか懲りずに期待したいものです。

     さて次回は本題に戻りますが、ビジネスマッチングの開発はまだPanther上でおこなっていく予定です。時期を見計らってTigerに移行していこうかと思いますが、Tigerでのトピックについては機会があればそのつど取り上げていく予定です。

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

     さて、皆さん連休はいかがでしたか。海、山、海外、故郷、はたまた愛・地球博だのに行ってきましたか。……なんでまた突然似合いもせぬ時候の挨拶めいたことを書いているかと言えばお察しの通り、他でもないオレがその間ずっと家にコモって仕事をしていたからだ。まぁ要するにひかんでいるんである。しかもこの後も休みの予定はないのだ。ううう……。

     本題に入ろう、NSViewの話、2回目である。前回予告した通り、まずはNSViewにおける「スーパークラスであるNSResponderから継承したのではない部分」から見て行こうと思う。

     Interface BuilderなどでNSViewのサブクラスを独自に定義して、ソースのスケルトンを作成してすぐ気がつくのは、IBActionとして定義したものとは別に、以下のメソッドの定義が自動的に生成されていることだろう。

    - (id)initWithFrame:(NSRect)frameRect
    {
         if ((self = [super initWithFrame:frameRect]) != nil) {
              // Add initialization code here
         }
         return self;
    }
    
    - (void)drawRect:(NSRect)rect
    {
    }
    


     ご存知のようにInterface Builderというプログラムはあんまり親切でなく、時としてどう考えてもあった方がいいだろうと思われるもモノさえ生成してくれない横着者である。……Xcodeのメニューから「New」を選んでソースファイルを作ればその先頭にくっついてくるファイル名や作成日などが書かれたヘッダーコメントをInterface Builderも作ってくれないか、と何年も思ってるんだけどなぁ。……あ、とにかく、その横着者でさえこの2つのメソッドを自動生成する。ちうことはそんだけ、この2つがNSViewというクラスの根幹に関わっているとゆーこと。早い話がNSViewは矩形領域によって初期化され(initWithFrame:)、その内部を描画する(drawRect:)クラスなのだ。簡単に言って、Cocoaを使って画面に何か描画しているなら、その処理には必ずNSViewが一枚噛んでいると思っていい。

     Cocoaの世界観では(前にも書いたような気がするがクラスライブラリというのはつまるところ世界観の表出である)、すべてのNSViewはNSWindowの内部(見た目でいう内部である。ウィンドウのインスタンス変数であるとか、あるいはサブクラスであるという意味で言ってるんではないことに注意)に配置される。まずはNSWindowが存在し、それはその内部を完全にカバーするコンテンツ・ビューというのを保持している(これはNSWindowのインスタンス変数で、ウィンドウのインスタンスにcontentView というメッセージを送ることで参照できる)。通常我々がInterface Builderを使ってウィンドウ上に配置するボタンやNSViewのサブクラスは、このコンテンツ・ビューのサブビューになっている。これらの関係を参照するメッセージを以下に列挙しておく。

    -(NSWindow*) window; // そのViewが乗っかっているウィンドウを返す。

    -(NSView*) superview; // そのViewが乗っかっている親のViewを返す。

    -(NSArray*) subviews; // そのViewに乗っかっているサブビューのArrayを返す。

     ここでネコを殺す好奇心、View連中の一番上にいるウィンドウのコンテンツ・ビューにsuperviewを送ったら何が帰ってくるか。早速やってみた。あるViewのdrawRect:に以下のコードを書いてコンソールを見る。

    NSLog(@"contentView's superView = %@",
                [[[self window] contentView] superview]);

     正直言ってオレ、(null) が表示されると思ってたんだけど、意外な結果でした。まだまだCocoaにはオレの知らない秘密があるんだな。ではまた次回。

    (2005_05_06)

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

    UNIXとしてのMac OS X

    〜Perlについて(13)〜

     こんにちは、高橋真人です。
     さて、今回から何回かにわたって正規表現についてのお話をしたいと思います。正規表現(せいきひょうげん)は、Perlに特有の技術ではありませんが、かつて「Perlでの実装が最も高機能」と言われていたこともあって、「Perlと言えば正規表現」と連想されることが多くありました。
     もっとも、昨今では「Perlと言えばCGI」と思う人が多くなり、さらにはRubyなどのスクリプト言語も「Perlと同等の正規表現」を掲げて登場してきたりと、特段Perlのウリは正規表現と言われることは少なくなったような気もします。もちろん、もともと正規表現というのはUNIXにおいて日常的に用いられてきていた技術であり、決してPerlの専売特許というわけではありません。ただ、Perlの得意とする文字列処理において正規表現を抜きに語ることはできませんので、ほんの入門程度ではありますが、この連載でも紹介をしたいと思います。
     ところで、UNIXはもとよりDOS/Windowsのプログラマに比して、Macプログラマで正規表現を使わない人が多い気がしているのは私だけでしょうか? ま、Windowsからプログラミングを始めた人は別として、コマンドベースで扱うOSを使う人にとって、ワイルドカードの延長線上にある正規表現は比較的身近なものであるという気もしないではありません。
     事実、私の場合もPerlをやるまでは正規表現という言葉の意味すらよく分からない状態でしたし。
     ともあれMacのOSがUNIXベースとなった今、正規表現を使えるケースはたくさんあります。Terminalからファイル操作をする場合やソースコードの編集など、使えるようになっておくと得をする場面が少なからずあるはずです。もしまだ正規表現をお使いになったことがなければ、この機会にちょっと興味を持たれてはいかがでしょうか。
     もちろん正規表現の技術もかなり奥深いものがありますから、詳しい説明をすればラクに一冊の本ぐらいは書けてしまうわけで、ここはあくまでもこの連載らしく「都合のいい部分だけをつまみ食い」の精神で行きたいと思います。ちなみに、Perlを徹底的に勉強しようと思う方には以下の本が一推しです。

    詳説 正規表現 第2版
    Jeffrey E. F. Friedl著
    オライリージャパン 5670円
    http://www.oreilly.co.jp/books/4873111307/

     厚さの割には価格が高い気もしますが、正規表現を極めようと思うならばこの本しかないと巷間では言われており、ある程度正規表現に自信のある人にとっても、なかなか読み応えがあると思います。

     さて、今までずっと正規表現という言葉を使ってきましたが、初めてこの言葉を目にした人は決まって「いったい、何?」と感じるようです。私もそうでした。
     正規表現という言葉自体は英語のRegular Expressionの直訳のようで、日本語としてはあまりこなれていないという印象がありますから、慣れないうちは言葉のイメージが実体となかなか結び付きません。
     正規表現を簡単に言い表すと「特定の文字列を表す方法」ということになりましょうか。これだけでもピンとは来ないでしょう。なぜ「特定の」かということはこれから徐々に明らかにしていきます。

     正規表現の使われるのは圧倒的に文字列検索が多いです。ほとんど検索のために使われる技術だと思っても間違いないくらいです。ですから、しばらくはPerlを離れて普通のテキストエディタで文字列検索をする例を使って説明をしていきます。
     Macに標準で備わっているテキストエディットは残念ながら正規表現に対応していません。Terminal上で動作するemacsやviなどの定番UNIXエディタはもちろん、Xcodeなども正規表現には対応しているのですが、使い方その他でいくらかの前提条件が必要になるので、ここはMacintosh環境ならば(Mac OS 9以前でも)使うことのできるフリーのテキストエディタであるmi(http://www.mimikaki.net/)を使うことにします。
     このエディタはドキュメントに、正規表現に関しては「Perlの仕様にあわせたつもり」とあるので、この連載で説明する範囲はほぼカバーすると思われます。正規表現が初めての方は、実際に試されながら読み勧められると理解がより深まるでしょう。
     では、いよいよ次回から正規表現の解説に入っていきますので、mi(最新版の2.1.5を基準とします)をダウンロードして使えるようにしておいてください。

    ニュース・解説

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

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

    【開発環境】

    皆さん、もうMac OS X 10.4(Tiger)をインストールしましたか? 筆者は4月29日に入手後テスト用サブマシンへインストールし、自作アプリケーションや開発ツール関連の動作確認を日々行ってきました。しかし、Metrowerks社からTigerに対応した「CodeWarrior Development Studio for Mac OS, Version 9.5 Update」が発表されたのを機に、一気にメインマシンへのインストールを断行することにしました。以下のサイトの「Updates and Patches」一覧から「CodeWarrior for Mac OS 9」を選択すると、「v9.5 Update」をダウンロードできるページに切り替わります。

    「CodeWarrior Development Studio for Mac OS, Version 9.5 Update」

    http://www.metrowerks.com/MW/download/default.asp

    「CodeWarrior for Mac OS 9」とは少々分かりにくいカテゴリー名ですが(笑)、Mac OS 9用という意味ではなく、Mac OS用のバージョン9という意味です。アップデート後、数多くの既存プロジェクトに対してMakeを実行してみましたが、ほとんど問題ありませんでした。しかし、ただひとつ「Accelerate.framework」に属するvecLib内にあるヘッダファイル「vForce.h」がコンパイルを通らない問題に遭遇してしまいました(未解決)。vForceって何でしょうか?詳しくはWWDC 2005のセッションで説明されるようですが?

    筆者のハードディスクには、開発環境に関連するソースファイルやドキュメントが大量に保存されているため(加えて増設HDもある)、Spotlightの索引作成に恐ろしく時間がかかり、ちょっと閉口しました。また、.Macサービスで提供されていたアンチ・ウイルスソフトのVirex 7.5.1がTigerに対応しておらず、Tigerインストール前に削除(アンインストール)しておかないと、Tigerを起動後に継続してCPUパワーを使い切ってしまうという不都合が発生します。Virex 7.5.1のパッケージ内に「Virex Uninstall.command」というコマンドがありますので、これを起動して削除しておきます。Apple社が自社サービスで配布したソフトなのですから、こうした情報は事前に流しておいて欲しいところです…。

    それから、以前紹介した「Part 1」に引き続き、IBMサイトに「Unrolling AltiVec, Part 2: Optimize code for SIMD processing」が登録されました。AltiVecに興味ある方は一度覗いてみてください。

    「Unrolling AltiVec, Part 2: Optimize code for SIMD processing」

    http://www-128.ibm.com/developerworks/power/library/pa-unrollav2/index.html?ca=dgr-mw01Altivec2

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

    前回から5月6日の期間中、Apple社のDocumentationサイトにはTigerに関する新規ドキュメントが100以上登録されました。また、新規ではありませんが、Tigerに対応するため内容が改訂されたドキュメントも大量に再登録されています。あまりにもその数が多いので、この場で一覧を記載することは止めますが、まずは以下のリリースノートを参考にして、興味あるドキュメントをピックアップしてみてはいかがでしょうか?

    「Developer Documentation Release Notes for Mac OS X v10.4」

    http://developer.apple.com/releasenotes/DeveloperTools/Documentation.html

    Tiger関連以外では、新しく発表されたハードウェア3機種の仕様ドキュメントが登録されています。また、デベロッパー向けに以下の4つの読み物が登録されています。「Getting Going with Tiger: Guide to ADC Resources」には、Tigerで実装された新機能のガイダンス(PDFあり)や、その他関連リソースへのアクセス方法などがまとめて紹介されています。WWDC2005へ参加される方は、興味があるセッションの「予習」として、関連ドキュメントに目を通しておきましょう!「Nice Surprise for CompuTech:Porting From Windows in Days Instead of Months」については、前号の木下さんの解説を参考にしてください。

    「iMac G5 Developer Note」HW(PDFあり)
    「eMac Developer Note」HW(PDFあり)
    「Power Mac G5 Developer Note」HW(PDFあり)

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

    「Nice Surprise for CompuTech: Porting From Windows in Days Instead of Months」(読み物)
    http://developer.apple.com/business/macmarket/electronicbluebook.html

    「Tiger Early Adopter: Bare Bones Embraces Automator」(読み物)
    http://developer.apple.com/business/macmarket/bbedit.html

    「Exploring Tiger Server」(読み物)
    http://developer.apple.com/server/tigerserver.html

    「Getting Going with Tiger: Guide to ADC Resources」(読み物)
    http://developer.apple.com/macosx/resources.html

    前回から5月6日の期間中、新規のテクニカルノートは5つ登録されました。また、新規テクニカルQ&Aの方は3つ登録されています。TN2139には、「Dashboard Widget」の開発中に発生した問題点やエラーを発見&解決(Debugging)するための一連の作業が説明されています。TN2140では、最新(モダン)QuickTime APIを用いる方法をサンプルソースコード付きで解説しています。こちらにについては、前号の木下さんの解説も参考にしてください。また、TN2110とTN2125は再登録なのですが、不思議なことに今回の変更点の履歴内容が記載されていません(記載ミス)?

    TN2110「Identifying Java on Mac OS X」
    TN2125「Thread-safe programming in QuickTime」
    TN2139「Debugging Dashboard Widgets」
    TN2104「Handling Audio Unit Events」
    TN2140「Modernizing QuickTime Applications Part I」

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

    QA1428「Why is libstdc++.a missing in my Xcode project on Mac OS X v10.4 ?」
    QA1426「Why is my Control/HIView not accepting drops on Mac OS X v10.4 ?」
    QA1419「Customizing Process Stack Size」

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

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

    前回から5月6日の期間中、Apple社のSample Codeサイトには、サンプルソースコードが12登録されました。そのうち新規のサンプルソースコードは6つのみですが、「Fade」と「Scroller」と「Stretcher」の3つは、Tigerで実装された新機能「Dashboard Widget」を開発するためのサンプルです。

    「ASCIIMoviePlayerSample」(QuickTime関連)
    「ASCIIMoviePlayerSample for Windows」(QuickTime関連)新規
    「ComboBoxPrefs」(Carbon関連)新規
    「ComplexPlayThru」(Audio関連)
    「Fade」(Widget関連)新規
    「HackTV Carbon」QuickTime関連)
    「HIObjectThreadController」Carbon関連)
    「HISimpleList」Carbon関連)
    「ProfileSystem」Carbon関連)新規
    「Scroller」(Widget関連)新規
    「Stretcher」(Widget関連)新規
    「BrideOfMungGrab」(QuickTime関連)

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

    【デベロップメント SDK】

    前回から5月6日の期間中、Apple社のSDKサイトには新しいSDKが3つ登録されました。「QuickTime 7 SDK」は、Mac OS X 10.3.9環境にQuickTime 7をインストールした後に、ソフトウェア・アップデート経由でインストールすることもできます。Mac OS X 10.4(Tiger)環境で「Xcode Tools」を使っていれば、QuickTime 7関連のSDKはそちらに含まれていますので、再度インストールする必要はありません。

    「QuickTime 7 SDK」
    「Kernel Debug Kit 10.4」
    「CoreAudio SDK v1.3.5」(10.2x~10.3x用)

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

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

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