MOSA Multi-OS Software Artists

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

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

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

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

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

    2006-07-25
     

    目次

    • MOSA理事コラム          第3回   佐藤 徹
    • 「「Wonderful Server Life」   第12回  田畑 英和
    • 小池邦人の「Carbon API 徒然草」
    • SqueakではじめるSmalltalk入門  第66回  鷲見 正人
    • ニュース・解説               木下 誠

    MOSA理事コラム   第3回

             佐藤 徹 有限会社ガラパゴス・システムズ

    MOSA会員のみなさま、暑い夏いかがお過ごしでしょうか? 休日に外に出る方は、熱中症予防に気をつけましょう。

    さて、MOSA幹事持ち回りのコラムを今回担当いたしますが、WWDC直前ということで、WWDC2006のセッション内容などを含めてアップルの今後の動きを予想してみたいと思います。

    1. WWDC2006のセッション
     [Cocoaのセッションが多い]
     今回、Cocoaのセッションの数が非常に多くなっていますが、これは、いよいよTiger以降は新しく追加された機能はCocoaへの機能追加ということになっているので、Tiger以降の新機能に関するセッションは結局Cocoaのセッションということになっているためです。Carbonは無くなるかといえば、現在はCarbonがCore Foundationの上に実装されていますので、Carbon自体はなくならず、今後はどの機能もCarbonとCocoa両方から使えるということになります。
     Cocoaは全く新しいアプリケーションを創る場合にもっとも力を発揮するわけですが、日々の業務をこなしつついままでの顧客をしっかりサポートしようとするサードパーティーは、なかなか大胆な新規アプリケーション開発に取り掛かれず、まだまだCarbonによる既存アプリケーションのアップグレードの方が多いのが現実です。でも、Carbonでもちゃんとユニバーサルバイナリーアプリケーションをリリースできるので、ご安心を。

     [Webに関して]
     Webに関するセッションはプログラミングとIT、その他のセッションにまたがって関連するものが多くなっています。そもそもWorld Wide WebはMac OS Xの前身であるNeXTSTEP上で開発されたので、Mac OS Xは最も古いWebサポートプラットフォームとも言えるでしょう。話題のWeb2.0はiTunes Music StoreをはじめとするアップルのWebサービスで実践されています。今後、さらに発展するWebですが、来るべき超広帯域ブロードバンド利用(アメリカはかなり先になる可能性がありますが)を見据えて、テキストによる情報発信から映像による情報発信への準備へ入るのでしょう。映像へのタグつけの有効な方法のひとつとしてGPSによる画像撮影位置情報がありますが、MacにGPS受信機を内蔵することができれば、将来、お互いにその日一日の様子を画像でアップロードするようになるとどこかで(たとえば山手線で)隣に座った人がどんな人だったかわかるかもしれないですねえ。
     推薦図書 「Web進化論」梅田望夫 著(ちくま新書)、「Web2.0でビジネ
    スが変わる」神田敏晶 著(ソフトバンク新書)

    2. Windowsとの対決
     Tigerの発表の時から、アップルはマイクロソフトとまた激しく対立しようとしているように感じられます。Leopardでは、Vistaと真っ向勝負するのかもしれません。Tigerの発表の時に、「レッドモンドの皆さん、コピーの用意はいいですか?」という挑戦的なメッセージを出したけど、レッドモンドはコピーした上にちゃんと他の対抗手段をOfficeとWebアプリケーションサービスで組み込んできたようです。Vistaと前後して発表されるOffice 2007の目玉はGrooveというコラボレーションツールで、P2Pを使ったグループウエアです。
    しかも、Office Liveというサービスを通じてオンラインでアプリケーションを使えます。アップルもこのGrooveに対向できるものを出してくるのだと思いますが、Office 2007がMac OS Xでサポートされなくなってしまうとかなり困りますねえ。そうなってしまったら、いっそのこと、DarwinにWin32 API移植プロジェクトのWINEを入れてしまって、Windowsアプリケーションがスムーズに移植できるようにしてしまった方がいいかもしれないですね。WINEはゲームプログラムで使われるDirect3Dなんかもサポートしており、かなり強力な武器になる可能性を持っています。

    3. 新しいMac
     Intel Macが出て6ヶ月以上たったわけですが、マシンを見ていると、PowerPCの時代と違って、もはやアップルは筐体デザインくらいしかやっていなくて、本体の設計はほとんど他社に任せていますねえ。エンクロージャーデザインとごく小さな部分の追加だけで、蓋を開けてみると(発売当日に必ず『バラす』人がいるわけですが)オリジナルはマザーボードのアップルのレジストだけってこともあるかもしれません。でも、それでいいんです。欲しいのはMac OS Xの環境なわけですから。でも、そうなると、他社のマシンでも良いってことになりますねえ。。。。。

    4. 新しい市場
     私は最近中国の合弁企業と仕事をしています。巨大な生産工場であり、巨大な消費市場でもある中国は新しい市場です。残念ながらアップル製品は製造(組立)はしているけどほとんど売れていないという状態が続いていますが、インターネットユーザが急速に拡大(最近の統計によるとBlogを持っている人の数が1億2千万人近くいる)しているし、高い経済成長に低いインフレ率(2004年は10%成長にインフレ3.9%、2005年は10%成長に1.8%のインフレ)を保っているここ数年の間にますます発展するのでしょう。コネが無いとなにも話が進まないし、日本とはずいぶん違う中国の商習慣で、困惑もしますが、国に勢いがあるというのはやはりすごいことです。中国で一つ驚いたのは、テレビのCMです。中国では各行政区毎にチャンネルを持っていて、全国ネットワークがほとんど無いのですが、アメリカのケーブルテレビと同じようにCMがひっきりなしに流れます。しかもアメリカと同じ、商品名とその売りの特徴の連呼型(実際は詳しい内容はわからないけど)です。本当にこれから近代的な先進国になろうとしている国ですので、テレビ・インターネットなどメディアでのビジネスもこれから急速に伸びていくのでしょう。このようなコンテンツを作るのに最適なMacをこれから買ってくれるのかもしれません。
     中国では、日本向けのソフトウエア産業も急速に大きくなっています。ビジネス向けのアプリケーション開発を日本語で請け負う会社がたくさん出来つつあるそうです。彼らは大学で日本語でコンピュータサイエンスやソフトウエアエンジニアリングを勉強するのです。単価が日本の1/10~1/7程度なので、すごい勢いで伸びていくのでしょう。我々は彼らに負けないよう、そして協力して開発できるような体制を整えていく必要があります。WWDCでそういう出会いがあるとよいのですが。

    いろいろ新しいことがありそうな、今年の夏、8月のWWDC2006への参加、とても楽しみにしています。なお、MOSAのメンバーでWWDC2006に参加される方に、現地でのMOSA主催のささやかなパーティーを企画しています。単独開催ですので、ちょっと参加費が高くなるかもしれませんが、意見交換といつもの仲間との楽しい時間をお過ごしいただけるよう、鋭意企画中です。

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

     まずは前回の記事の訂正から始めます。IPアドレスの変更を補助するコマンドの”changeip”を解説しましたが、コマンドの使用方法の表記が間違えておりましたので訂正しておきます。

    誤)
    $ changeip [directory-node | -)] old-ip new-ip [old-hostname new-hostname]
    
    正)
    $ changeip [directory-node | -] old-ip new-ip [old-hostname new-hostname]
    


    □サーバのアップデート
     初期設定後に設定をひととおり確認したら、次にシステムのアップデートを行いましょう。市販されているMac OS X Serverのパッケージはv10.4.0だったりしますので、本格的な運用を始める前に最新版にアップデートしておきます。原稿執筆時点でのMac OS X Serverの最新版はMac OS Xと同様v10.4.7です。
     システムのアップデート時には再起動が必要になります。通常は常時稼働させておくサーバの場合いつでも再起動できるとは限りませんので、利用可能なアップデートは運用を開始する前にインストールしておきましょう。サーバであってもiPodのアップデートなどが利用可能ですが、インストールする必要がないアップデートは使用を停止することができます。
     また、Mac OS X Server v10.4からはソフトウェア・アップデート・サービスが利用可能になりましたので、ローカルのアップデートサーバを構築することも可能です。アップデートサーバを構築しておけば他のマシンにアップデートを提供することができます。
     Panther Server(v10.3)のころは10.3.9までアップデートされましたので、Tiger Server(v10.4)もあと数回はアップデートがリリースされるのではないかと予想されます。

    □Admin Tools
     それでは次に、サーバ上にインストールされた管理ツールを確認しておきましょう。管理ツールのインストール先ですが、Mac OS X Serverをインストールすれば「/アプリケーション/サーバ」に管理ツールがインストールされます。
     ネットワーク上の別マシンからMac OS X Serverをリモートで管理する場合は、アップルのWebサイトから「Server Admin Tools 10.4」をダウンロードしてインストールすることができますが、この場合はインストールされないツールがいくつかあります。
     それでは、Mac OS X Serverをインストールしたときにどういった管理ツールが利用可能なのなのかを解説します。

    ・AppleShare IP マイグレーション
     Mac OS Xがリリースされる以前に「AppleShare IP」というサーバソフトがありましたが、こちらで管理していたデータを移行するためのツールです。

    ・FiberChannel ユーティリティ
     ハードウェアRAIDのXserve RAIDは、FiberChannel経由でXserveやPower Macに接続します。このとき使用するFiberChannelカードの情報を確認したり、設定を行うためのツールです。

    ・MySQL マネージャ
     Mac OS X Serverに搭載されているデータベースソフトのMySQLを管理するためのツールです。といいましても極めて最低限の管理機能しかありませんのでこのツールだけでMySQLが管理できるわけではありません。

    ・QTSS Publisher
     Mac OS X Serverには、ストリーミングを行うQuickTime Streaming Server(QTSS)が搭載されています。QTSS PublisherはQTSSで配信するデータを管理するためのツールです。ムービーファイルをストリーミング用のファイルに変換する機能があります。

    ・RAID Admin
     Xserve RAIDの管理ツールです。Xserve/Power MacからXserve RAID上のデータにアクセスするにはFiberChannelを使用しますが、Xserve RAIDの管理は別途Ethernet経由で行います。Xserve RAIDにはFiberChannelのインターフェイスと、管理用のEthernetインターフェイスが装備されています。

    ・Xgrid Admin
     Xgridとは複数のコンピュータ上でグリッドを作成し、複雑な処理を分散して実行するためのテクノロジーです。Xgrid AdminはXgridの管理ツールです。

    ・ゲートウェイ設定アシスタント
     Macをゲートウェイとして使用するさいに利用する各種サービスを一括して設定するためのツールです。具体的にはNAT、FireWall、VPN、DHCP、DNSの設定を行います。このツールは各サービスの既存の設定を上書きするため、サーバを構築する初期段階で使用するのがよいでしょう。

    ・サーバアシスタント
     具体的な使い方についてはすでに解説済みですが、Mac OS X Serverのインストールおよび初期設定をリモートで実行するためのツールです。

    あといくつか紹介していない管理ツールがありますが、それらは次回解説したいと思います。

    つづく

    小池邦人のCarbon API 徒然草(2006/07/21)

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

    今回は、AltiVecからSSE/SSE2へのコード変換における実作業についてお話します。例題を取り上げることでコード変換作業(少々やっかい)について解説します。

    以前にも紹介しましたが、Universal Binary化においてAltiVecコードをSSE/SSE2コードに変換する作業を行う場合には、まず以下のドキュメントを参照してください。

    「AltiVec/SSE Migration Guide」「Accelerate_sse_migration.pdf」(PDF 44ページ)

    現在のSSE/SSE2はAltiVecよりも命令数が少なく、その処理速度もかなり低速です。次世代のIntel版CPU(Core 2 Duo)では、SSE/SSE2に新たな命令が追加され(SSE4と呼ばれる?)、演算ユニット自体の処理速度も向上すると言われています。しかし、実機が存在しない現段階では何とも判断できません。よって、変換後のソースコードの記述が下手だと、PowerPCではAltiVecを利用することで高速化していた整数処理が、SSE/SSE2に書き換えた途端に、CPU自身の整数処理を使うより遅くなってしまう可能性もあります。大規模なコード書き換えの前に、まずは小規模なコードを書き換えて、処理速度の詳細な比較を行うことが肝要でしょう。

    XcodeプロジェクトでSSE/SSE2コードを利用するには、Accelerate.frameworkをリンクし、ソースファイルの最初にヘッダファイルとしてAccelerate.hを定義します。

    #include 

    SSE/SSE2に関する様々な定義はAccelerate.hが間接的に参照している以下のヘッダファイルに記述されています。

    ・SSEについては「xmmintrin.h」
    ・SSE2については「emmintrin.h」
    ・SSE3については「pmmintrin.h」

    また、上記ファイルはDeveloperフォルダの以下の場所に保存されています。

    /Developer/SDKs/MacOSX10.4u.sdk/usr/lib/gcc/i686-apple-darwin8/4.0.1/include/

    上記3つのファイルに加えてMMX用(懐かしい)のヘッダファイルとしてmmintrin.hがありますが、MMXについてはSSE/SSE2の登場で時代遅れになってしまいましたので、今後使用を検討する必要はありません。SSE/SSE2で用いるルーチン名は、上記ヘッダーファイルにアゼンブラコードをインライン展開する形式で定義されています。例えば4つの浮動小数点2ペアーをかけ算するルーチンは、ソースファイル上には_mm_mul_ps()と記述することになります。これは、xmmintrin.hにおいて以下の様に定義されています。

    static __inline __m128 __attribute__((__always_inline__, __nodebug__))
    _mm_mul_ps (__m128 __A, __m128 __B)
    {
      return (__m128) __builtin_ia32_mulps ((__v4sf)__A, (__v4sf)__B);
    }

    SSE/SSE2のアゼンブラコードは__builtin_ia32_mulpsですが、それをC言語の関数風に記述できるよう考慮されているわけです。次にベクトル化した数値データ(変数や引数)の記述方法です。こちらは、AltiVecとSSE/SSE2でそれぞれ異なる形式として定義されています。しかし、VecLib.hから呼ばれているvecLibTypes.hでは、両方の定義の差異を吸収するための再定義がされており、利用者の便宜を図っています。例えば、128bitのレジスタに4つのfloat値(32bit)を代入したい場合には、AltiVecではvector floatと定義するのに対してSSE/SSE2では__m128(先頭のアンダーラインは2本…よく間違える)と定義しますが、以下のtypedefを利用していれば、どちらもvFloatと記述できるわけです。

    まずは、Altivecの場合….

    typedef vector unsigned char    vUInt8;
    typedef vector signed char      vSInt8;
    typedef vector unsigned short   vUInt16;
    typedef vector signed short     vSInt16;
    typedef vector unsigned int     vUInt32;
    typedef vector signed int       vSInt32;
    typedef vector float            vFloat;
    typedef vector bool int         vBool32;
    


    続いて、SSE/SSE2の場合…

    typedef __m128i                 vUInt8;
    typedef __m128i                 vSInt8;
    typedef __m128i                 vUInt16;
    typedef __m128i                 vSInt16;
    typedef __m128i                 vUInt32;
    typedef __m128i                 vSInt32;
    typedef __m128i                 vBool32;
    typedef __m128                  vFloat;
    typedef __m128i                 vUInt64;
    typedef __m128i                 vSInt64;
    typedef __m128d                 vDouble;
    


    この定義を用いれば、Universal Binary化において#ifや#endifなどを使いソースコードを切り分ける必要がなくなりますので非常に便利です。上記定義を見ると、SSE/SSE2ではユニット内でlong long値(64bit)やdouble値(64bit)同士の演算が可能だと言うことが理解できます。残念ながら、AltiVecでは64bit長の数値は取り扱うことができません。

    以下は、原点(0,0)からある座標(x,y)までの距離を、4座標まとめて同時に計算するルーチンです。最初は、AltiVec用ルーチンです。

    vFloat vecDistAltiVec( vFloat x,vFloat y )
    {
        vFloat    x2,dd1,dd2;
    
        x2=vec_madd( x,x,(vFloat)(-0.0f) );   // X*X
        dd1=vec_madd( y,y,x2 );               // Y*Y+X2
        dd2=vsqrtf( dd1 );                    // √
        return( dd2 );
    }
    


    AltiVecには単純に2ペアーをかけ算するルーチンはありません。その代わり、vec_madd()は一発で「A*B+C」という演算を行います。そのため、最初のvec_madd()では3番目の引数に0.0を渡してかけ算のみの実行としています。次が、SSE/SSE2用ルーチンです。

    vFloat vecDistSSE( vFloat x,vFloat y )
    {
        vFloat    x2,dd1,dd2;
    
        x2=_mm_mul_ps( x,x );                   // X*X
        dd1=_mm_add_ps( _mm_mul_ps( y,y ),x2 ); // Y*Y+X2
        dd2=vsqrtf( dd1 );                      // √
        return( dd2 );
    }
    


    AltiVecと異なり、SSE/SSE2には「A*B+C」という演算を一発でこなす命令はありません。よって、この部分はかけ算_mm_mul_ps()と足し算_mm_add_ps()を併用します。また、最後にvsqrtf()を用いてルート値を得ていますが、この関数はAccelerate.frameworkに定義されており、AltiVecとSSE/SSE2共通で利用できます。また、Accelerate.frameworkを用いることで、単純な演算であれば以下のような「ごく普通」の表記をすることも可能です。この表記は、AltiVecとSSE/SSE2共通で利用できますので、やはり#ifや#endifでソースコードを切り分ける必要がなくなり大変便利です。

    vFloat vecDistBoth( vFloat x,vFloat y )
    {
        return vsqrtf( x*x+y*y );
    }
    


    今回をもって、長らく続けてきた「アプリケーションのUniversal Binary化」についての話を終了したいと思います。次回からは、新しいテーマにそったCarbon API関連の最新の話題を取り上げていきたいと考えています。お楽しみに!

    つづく

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

    本連載では、名前は知っていてもなかなか触れる機会のないSmalltalkについて、最近話題のSqueakシステムを使って紹介しています。今は、簡単なGUIビルダを構築することを目指して、そのために必要なテクニックや知識を整理しているところです。

    前回は最後に、a PluggableTextMorphで黄ボタンメニューを機能させることが可能な、次のような短めのコードを示しました。

    | field |
    field := PluggableTextMorph
       on: Workspace new
       text: nil
       accept: nil
       readSelection: nil
       menu: #codePaneMenu:shifted:.
    field bounds: Rectangle fromUser.
    field openInWorld
    


    今回は、このように記述するとなぜ、黄ボタンクリックなどでメニューを呼び出すことができるようになるのか、そのしくみを調べてみましょう。

    そもそも、クラス「PluggableTextMorph」に「on: Workspace new text: nil accept: nil readSelection: nil menu: #codePaneMenu:shifted:」というメッセージを送ることで起動されるメソッド「#on:text:accept:readSelection:menu:」は、いったい何をしているのでしょうか。この手の疑問が生じたとき、すぐにソースを確認してみることができるのがSmalltalkシステムのよいところです。

    このメールの「on:text:accept:readSelection:menu:」をコピー&ペーストで持ってゆくか、あるいはワークスペースなどで「on:t」までタイプしてからcmd + Qを二度タイプすることで補完した後に、browse it(cmd + B)すると、当該メソッドのソースをブラウズできます。ブラウザには異なるクラスに定義された四つの#on:text:accept:readSelection:menu:が上のリストペインに列挙されますが、今、我々が興味があるのは上から二番目のクラスメソッド「PluggableTextMorph class >> #on:text:accept:readSelection:menu:」です。

    PluggableTextMorph class >> on: anObject text: getTextSel
    accept: setTextSel readSelection: getSelectionSel menu: getMenuSel
    
       ^ self new on: anObject
          text: getTextSel
          accept: setTextSel
          readSelection: getSelectionSel
          menu: getMenuSel

    self、つまりPluggableTextMorphにnewを送ってインスタンスを作り、それに対してあらためて「on: anObject text: getTextSel accept: setTextSel readSelection: getSelectionSel menu: getMenuSel」というメッセージを送っていますね。これはnewの送信を省略するためによくあるパターンです。
    では、そうして起動される同名のインスタンスメソッド「PluggableTextMorph>> #on:text:accept:readSelection:menu:」のほう(リストの一番目)の定義はどうなっているかというと、

    PluggableTextMorph >>on: anObject text: getTextSel
    accept: setTextSel readSelection: getSelectionSel menu: getMenuSel
    
       self model: anObject.
       getTextSelector := getTextSel.
       setTextSelector := setTextSel.
       getSelectionSelector := getSelectionSel.
       getMenuSelector := getMenuSel.
       self borderWidth: 1.
       self setText: self getText.
       self setSelection: self getSelection

    というような記述であることが分かります。ほとんどはインスタンス変数への対応するパラーメータの代入(束縛)です。冒頭のスクリプトで最後のパラメータ(menu:キーワードのところ)であるところの、シンボル「#codePaneMenu:shifted:」は、getMenuSelを介して、getMenuSelectorというインスタンス変数に束縛されることも分かります。

    では、このgetMenuSelectorというインスタンス変数は、PluggableTextMorphとそのスーパークラスに定義された他のどのメソッドでどのように使われているのでしょうか。こうした情報についても、ブラウザ中央の「inst vars」ボタンをクリックしてポップアップするメニューから「getMenuSelector」を選択することで簡単に調べることができます。

    [fig.A]インスタンス変数に関与しているメソッドを探すためのボタン

    結果、#on:text:accept:readSelection:menu:以外では、#hasYellowButtonMenuと#getMenu:という二つのメソッドで参照されていることが分かります。それぞれの内容をざっと確認すると、どうやら後者が黄ボタンメニューのポップアップを司るメソッドであるようです。

    [fig.B]getMenuSelectorにアクセスしているメソッド一覧とそのソース

    手続きの流れをざっと見ると、getMenuSelectorにメッセージ「numArgs」を送信してパラメータの数を得、その結果によって条件分岐をしていますね。冒頭のスクリプトの流れでは、getMenuSelectorには#codePaneMenu:shifted:が束縛されているので、実際にnumArgsを調べてみましょう。

    #codePaneMenu:shifted: numArgs   " => 2 "

    この式をprint it(cmd + P)するとパラメータが二つであることを意味する「2」を返してくるはずです。もっとも、Objective-C同様、Smalltalkのセレクタは、原則として、コロンの数が引数の数と一致するので、あらためてnumArgsを送ってみるまでもないのですが…。

    さて。では改めて「getMenuSelector numArgs = 2」のところで何をしているか見てみると、

    model perform: getMenuSelector with: menu with: shiftKeyState

    という式が見つかります。#perform:with:with:は、第一パラメータをセレクタに含むメッセージをレシーバに送るメソッドなので、結果的に、次の式を評価するのと同じことになります。

    model codePaneMenu: menu shifted: shiftKeyState

    この際の作業について詳しくは、StringHolder >> #codePaneMenu:shifted:の定義を見ていただくとして、端的には、モデルに対して、黄ボタンメニューを作って返してくるよう“丸投げ”しているわけです。専門用語では「委譲」というテクニックですね。

    a PluggableTextMorphを作る際、モデルと、そこにあらかじめ定義した黄ボタンメニューを返すメソッド名(セレクタ)を第一および第五パラメータとして添える必要があるのはこうした理由からです。どんなメニューをポップアップするかは、a PluggableTextMorph自身は関知せず、すべてモデル次第…というわけです。

    同時にこのことは、クラス「PluggableTextMorph」の定義を変えずに、そのインスタンスの挙動を変化させるしくみが働いていることを意味します。PluggableTextMorphが、その名に“Pluggable”を冠している理由が、ちょっと分かったような気がしてきませんか?

    バックナンバー:

    ニュース・解説

     今週の解説担当:木下 誠

    ———————————————————————-
    オーディオ系アプリのUniversal Binary移行
    ———————————————————————-

    オーディオ系アプリケーションの開発者に、Universal Binaryへの移行についてインタビューした、「Going Universal: Audio Developers Catch the Wave」が公開されています。

    Ableton、Bias、Metric Halo、Native Instruments、Rolandといったデベロッパがインタビューに答えています。それぞれ、Universal Binaryの利点、移行のためのアドバイス、Universalバージョンの開発、といった項目について、述べています。現場の声が垣間見えて、読み込むと面白いです。

    Going Universal: Audio Developers Catch the Wave
    http://developer.apple.com/audio/audiodevinterviews.html

    ———————————————————————-
    CoreAudioとOpenGL Shading Languageのサンプル
    ———————————————————————-

    ADCのサイトに、サンプルが2つ登録されています。

    1つは、CoreAudioのものです。AUHALを作って、音声をAACでファイルに録音していくデモになります。

    もう1つは、OpenGL Shading Languageのデモを行う、GLSLShowpiece。これは、Developer Toolsにも付属しているサンプルですが、このたび2.0のリリースになったようです。アニメーションとともに様々なテクスチャを表示するShading Languageのパワーを見せつけてくれるアプリケーションです。

    RecordAudioToFile
    http://developer.apple.com/samplecode/RecordAudioToFile/index.html

    GLSLShowpiece
    http://developer.apple.com/samplecode/GLSLShowpiece/index.html

    ———————————————————————-
    キーイベントとMovieAudioExtractionのQA
    ———————————————————————-

    QAも2つ公開されています。

    1つは、Carbonでのキーイベントを取り扱うときの問題について。修飾キーとともに送られてくるキーイベントの変化について説明されています。特に、コントロールキーを押したときに、キャラクタコードが変化してしまう問題の理由と解決方法が述べられています。

    もう1つは、QuickTimeについて。MovieAudioExtractionを使ったときに、オーディオファイルの終わりの方で、オーディオサンプルが失われることがある問題を説明しています。

    QA1446: Losing the character code when using the control key
    http://developer.apple.com/qa/qa2005/qa1446.html

    QA1481: MovieAudioExtraction – Extracting all available audio samples
    http://developer.apple.com/qa/qa2006/qa1481.html

     

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

     

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

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

    2006-07-18

    目次

    • 「Wonderful Server Life」      第11回  田畑 英和
    • 藤本裕之のプログラミング夜話 #95
    • 高橋真人の「プログラミング指南」  第93回
    • ニュース・解説                小池 邦人

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

     さて、インストール〜初期設定の解説が終わり、いよいよ本格的なサーバ構築の解説を始めて行きたいと思います。前回解説した初期設定の自動化のために保存する設定情報ですが、設定情報の中にはMac OS X Serverのシリアル番号や管理者アカウントのパスワードなども保存されますので、保存した設定情報の扱いについてはくれぐれもご注意ください。

    □ホスト名の確認
     初期設定が終わりますとサーバが再起動し、ログインウインドウが表示されます。Mac OS Xの場合にはデフォルトで自動ログインの設定が有効になっていますが、Mac OS X Serverの場合には最初からログインウインドウが表示されます。また、この時点ですでにrootユーザでのログインも出来る(Mac OS Xの場合はデフォルトでは出来ない)ようになっています。このようにMac OS XとMac OS X Serverではデフォルの設定が違う部分もあります。
     初期設定後の再起動が完了したら、さっそくログインしてまずは設定の確認を行いましょう。リモートでサーバを操作する場合にはsshによるログインが可能です。Mac OS X Serverではデフォルトでsshが有効になっていますので、最初からsshによるリモートログインが可能です。sshでサーバにアクセスするには「ターミナル」上で次のようなコマンドを入力します。

    ・ssh
    $ ssh 管理者アカウントのユーザ名@サーバのアドレス
    あるいは
    $ ssh サーバのアドレス -l 管理者のユーザ名
    例:$ ssh admin@192.168.0.10 あるいは ssh 192.168.0.10 -l admin
    ※管理者アカウントのユーザ名:admin サーバのアドレス:192.168.0.10

     初期設定時にサーバ側で「Apple Remote Desktop(ARD)」を開始するように設定してあればARDでアクセスする(この場合、別売の管理ツールが必要)のもよいでしょう。
     サーバにログインしたらまずはネットワークの設定(IPアドレス、サブネットマスク、ルーター、DNSサーバなど)を確認しましょう。リモートで設定を行い、入力ミスなどの原因でネットワークの設定に失敗した場合にはサーバにネットワーク接続できないかもしれません。そのときはサーバ機本体を直接操作して設定を確認し、ネットワークの再設定を行います。ただしヘッドレスでリモート設定を行った場合にはちょっと厄介です。本体を直接操作できないうえにネットワーク接続もできない状態ですからちょっとお手上げ状態になります。あらかじめ記録しておいた設定情報を手がかりに復旧を試みるか、どうしてもサーバを操作できない場合は、頑張って再インストールしてください:-)。

    ネットワークの設定に問題がなければ次にサーバ機のホスト名を確認します。第7回の記事で解説しましたが、Mac OS X Server v10.4はDNSサーバを参照してホスト名を動的に設定します。ですので、正しいホスト名が設定されているかどうかを確認します。ホスト名を確認するには「ターミナル」で”hostname”コマンドを実行します。

    ・hostnameコマンドの実行例
    $ hostname
    tigerserver.example.com

     このようにFQDN形式のホスト名が表示さるかどうかを確認します。設定に問題がなければ、hostnameコマンドの実行結果にはあらかじめDNSサーバ上に設定しておいたホスト名が表示されます。

    □IPアドレス/ホスト名の変更
     サーバを構築した直後にIPアドレスやホスト名を変更することはあまりないかと思いますが、間違ったパラメータを設定してしまった場合も考えられますので、変更方法を解説しておきましょう。IPアドレスの変更なら「システム環境設定」の「ネットワーク」パネルで簡単に変更できますが、Mac OS X Serverの場合にはいきなりIPアドレスを変更すると問題になる場合があります。各種サービスの設定がIPアドレス/ホスト名に依存していたりしますので、いきなり設定を変更するとサービスがうまく動かなくなってしまう可能性があります。
     そこでIPアドレスの変更を補助するコマンドとして”changeip”コマンドが用意されています(Mac OS Xにこのコマンドはありません)。変更の手順は以下のようになります。

    ・サーバのIPアドレス変更手順
    (1)changeipコマンドを実行
    (2)実際にIPアドレスを変更
    (3)サーバを再起動
    


     changeipコマンドでは変更前と後のIPアドレス、変更前と後のホスト名を入力します。changeipコマンドの詳しい使い方はmanページを参照してください。また、パラメータなしでchangeipコマンドを実行するとコマンドの使用例が表示されます。Mac OS X Server v10.4.6以降でchangeipコマンドを実行する場合にはホスト名をFQDNで指定する必要があります。

    ・changeipの使用方法
    $ changeip [directory-node | -)] old-ip new-ip [old-hostname new-hostname]
    ・TIL「changeip に対しては、完全指定のドメイン名が必要となる」


    http://docs.info.apple.com/jarticle.html?artnum=303495

    つづく

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

     つうことで約束どおり今回から「マウスカーソルの形を位置と状況に応じて変える仕掛け」について書く。そんなの知ってるぞというヒトもなかにはいると思うが、この手の小技ってのは「やる気になればちょいちょいと出来るさ」と思ってわざわざそのプログラミングのために時間とかを取っておかず、納品間際のせっぱ詰まった時になって、あ、そう言えばマウスポインタの形を変えるんだっけ、どこを見ればやり方が書かれているんだ?」と探すのに大苦労したりするもんなので(これはオレの実体験ではない。為念)、一応この連載で取り上げておく価値があろうと、考えたのである。

    まず基本から。マウスカーソルの形を扱うのは NSCursor というクラスである。使い方は NSColor と似ている。例えばよく見かける「開いた手」のカーソルをセットするには

     [[NSCursor openHandCursor] set];

    と、これでいい。NSColorの

     [[NSColor redColor] set];

    つうのと同じでしょ? 簡単である。最もこういう風にティピカルなカーソルシェイプがクラスメソッドで生成できるようになったのはMac OS X10.3以降のことで、それ以前は自分でカーソルシェイプのイメージファイルを用意し、initWithImage:hotSpot: とかでカーソルを作って持ってなくちゃいけなかったんだけどね。

    さて、上に「マウスカーソルの形を位置と状況に応じて変える」と書いたが、この「位置」というのはつまり「そのアプリケーションに含まれる何らかのビューの上」を意味する。具体的な例を挙げよう。Safariの画面だ。Safariを起動してMOSAのページ(http://www.mosa.gr.jp/)を開き、あちこちカーソルを動かしてみてほしい。場所によってカーソルが「デフォルトの矢印型(arrowCursor)」から「人さし指だけ伸ばした手の形(pointingHandCursor)」や「文字入力のキャレット型(IBeamCursor)」とかに変わるはずである。

    これを実現するため、NSViewに resetCursorRects というメソッドが用意されている。これ、デフォルトでは何にもしない。awakeFromNib とかと同じで、サブクラスによってオーバーライドするためのもの。これをオーバーライドして何をするかというと、「この四角形の中に入ったらマウスカーソルはこのシェイプになるんだかんな」ということを指定するのである。例えば:

    -(void) resetCursorRects {
         [self addCursorRect:NSMakeRect(10, 10, 100, 100)
                        cursor:[NSCursor openHandCursor]];
         [self addCursorRect:NSMakeRect( 120, 120, 100, 100)
                        cursor:[NSCursor pointingHandCursor]];
    }

    とすれば、(10,10)を基点とする縦横100の四角形の中にカーソルが入ると自動的にそのシェイプは openHandCursor になってくれる。(120, 120) を基点とする同じ大きさの四角形の中に入れば pointingHandCursor になってくれる。便利でしょ?

    でもこれだけでは、上で見たSafari のように、そこに表示されるものによってカーソルの形を変えることはできない。例えばこのビュー上で、上の2つの四角形をドラッグできるようにする。一度ドラッグして位置が変わったらその新しい位置でカーソルが変わらなくちゃ変である。それをどう実現するか、次回はそれを見ていこう。

    (2006_07_13)

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

    プログラマのためのオブジェクト指向再入門(1)

     こんにちは、高橋真人です。
     かねて予告していましたように、前回の連載でPerlに関してのお話は終了したわけですが、これを機会にこのところずっと続けてきた「UNIXとしてのMac OS X」についても一旦区切りを付けたいと思います。とはいえ、Mac OS XのUNIX的な側面に関して書きたいことはまだいくらでもあるので、これで完全に終わりにするつもりはありませんが。

     さて、新しい話題としてスタートするのはオブジェクト指向です。
     この連載をずっと読んでくださっている方は「またオブジェクト指向か」と思われるかもしれません。確かに、連載の第15回から49回までオブジェクト指向をテーマにお話しいたしました。ですが、あれから2年ほどが過ぎようとしている今、私の中ではオブジェクト指向技術の必要性がさらに高まったような気がしています。
     もっとも世間では、2年前とあまり変わることなくオブジェクト指向は花盛りです。むしろ、今ではオブジェクト指向が当たり前になり過ぎて、あえて殊更にオブジェクト指向をうたうことすらしないケースも出てきた感があります。こんな状況を見るにつけ、私は「本当に皆が当たり前のようにオブジェクト指向を使いこなせているのだろうか?」と疑問を持ってしまうのです。オブジェクト指向が盛んになったからといって、技術そのものが学びやすくなったとは思えないし、それどころか関連技術は増える一方なので、初学者にとっては取っ付きにくさはさらに倍増!といった感じなのです。

    Mac OSでのCocoaにおいても見られるように、今や主要なOSのネイティブ開発のメインはオブジェクト指向技術であるようです。C#(Windows)、Java(Linux)と、決してCやアセンブラが使われていないわけでもないのに、一見すると「オブジェクト指向以外の技術は不要になった」とでも言わんばかりの勢いです。
     OSのネイティブな開発環境以上にオブジェクト指向が盛んなのがWeb開発の世界。日本発のRubyを今や世界的に大ブームにさせているRuby on Railsに代表されるRapid開発系のWebアプリケーションに勢いを得て、「手軽に、素早く」が要求されるWebの開発においては、オブジェクト指向を使わない方が珍しいぐらいの印象すら受けます。

    私がMOSAでやらしていただいている「硬派のためのプログラミング道場」という講座では、「プログラミングの基礎力としてのC言語」ということで1年間にわたってCのみを勉強します。それくらい時間と手間をかけても、講座終了までにCをマスターする人はまれです。しかし、最後まで講座に付いてきてくださった方は例外なく「基礎的な技術がいかに重要であるか」を理解されています。
     実際、私の実感でも、どんなに人間寄りのオブジェクト指向技術が盛んになろうがCやアセンブラなどのコンピューター寄りの開発ツールが重要であることに変わりはなく、仮にオブジェクト指向技術だけで完結している仕事においても、これらの基礎技術があるかどうかで、結果にも効率にも大きな違いが出てくるのは疑いないところです。

    そうは言っても、わざわざ長い時間をかけてCを学習しても、それだけで「いまどきのMacプログラム」が作れるようにならないのはつらいところです。私の講座を受講された人のほとんどが「Macのプログラム一つ作れるようになるのにこんなに時間がかかるものだとは思ってもみなかった」と感想を漏らされます。
     Cから始めてひとつずつ技術を積み上げてきて、ようやく何とかグラフィックインターフェースの入り口まで来れた人からすれば、この先さらにオブジェクト指向などという難しそうな技術を習得し、自在に使いこなすだなんてことは「夢のまた夢」なのではないかと思ったとしてもおかしくはありません。
     しかし、オブジェクト指向を日常的に技術として使っている私の実観から言うと、「確かにオブジェクト指向は奥深い広大な技術ではあるものの、決してとっつきにくいものではない」のも正直なところなのです。
     そもそも、オブジェクト指向という言葉そのものが、ともすれば「プログラムの中で独立した複数の実体が動き回る」という印象を与え過ぎ、それがかえって現実への理解を邪魔している面もあるような気がします。
     たとえば、私が日常的に書いているC++コードを見ても、部分的にはCで書いたコードと余り違いが分からない場合もあるくらいで、ましてや「オブジェクトがメッセージをやり取りしながら動いている」ところなど、見えるはずもありません(笑)。

     ただその一方で、何年もオブジェクト指向の技術を使って仕事をしているのに、「未だにオブジェクト指向と言われてもピンと来ない」と漏らす人も少なくないのです。
     かつて「Javaで書くと嫌でもオブジェクト指向になってしまう」などと言われたこともありましたが、今になってみれば「Javaで書いても全然オブジェクト指向っぽくない」コードはさほど珍しいものでもなかったりします。

    こういう状況下で、私は、どうすればもっと多くの人、とりわけ日常的にコードを書いているプログラマの人々にオブジェクト指向を理解し使いこなしてもらうにはどうしたらよいのだろうかとよく考えます。
     そこで、この連載であえてもう一度オブジェクト指向というテーマに取り組んでみようと思ったわけです。もちろん、私自身は今までに数多くのオブジェクト指向の本、特に入門書の類いを目にしていますが、こんな観点から見た場合、私が満足できる本はそんなに多くはなかったのです。
     たとえば、オブジェクト指向の全容を伝えようとするあまりに、かえって初心者にとってオブジェクト指向を必要以上に難しいものに見せてしまったり、正確さを期する余り、本質的な部分をかえって見えづらくしてしまったりと、なかなか効果を上げられていないのです。
     確かにオブジェクト指向の応用範囲は広く、今でもその活用範囲は拡張し続けていますから、それを伝えることは簡単ではありません。

    でも、そんな時に「いい加減でもいいので、日常的にコードを書いている立場からオブジェクト指向を主観的に語ることがあってもいいのでは」と思って、今回再度このテーマに取り組むことにしたのです。
     ですから、一般に行きわたっている「オブジェクト指向講座」とは毛色の違った切り口で、多分に正確さを欠いて、一見オブジェクト指向とは見えないような話が展開される可能性も充分にあり得ます。
     ですが、この連載を読んでくださる方の中に一つでもオブジェクト指向に対する新たな視点が芽生えてくれれば私の試みは成功です。

    ニュース・解説

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

    ● Carbon ドキュメント & サンプル & SDK ナビゲーション(2006/07/14)

    【開発環境】

    昔から大変不思議に思うのですが、日本のアップル社には営業やマーケッティングの担当重役はいても、開発や技術系の担当重役は存在しません。日本ではMacintoshの売上が少ないため、その重要度からして必要無いという判断なのでしょうか?しかし、世界的に見ても、日本にはApple社と関係しそうな大手技術系メーカが数多く存在しています。日本に何らかの技術部隊とその担当重役を置くという戦略は、日本市場単独のためではなく、世界的な戦略の一環として考慮すべき事項ではないでしょうか?まあ、大将はそう考えていないのでしょうね…誰か尋ねてみてくれませんか(笑)。

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

    前回から7月14日の期間中、Apple社のGuidesサイトには新規ドキュメントが10登録されましたが、Referenceのサイトには新規登録はありませんでした。
    Apple社が教育機関用に販売を開始した廉価版iMacのハード仕様ドキュメントが登録されたため、それに関連するハードがらみのDeveloper Noteがすべて更新されています。また、Apple Scriptに関するリリースノートとデベロッパ向け読み物がそれぞれひとつずつ登録されています。最近のデベロッパ向け読み物はしぶくて(笑)有用な内容が多いですので、すぐさま日本語訳ドキュメントも登録して欲しいところです…。

    「17-inch iMac for Education Developer Note」(初版)
    「AirPort Developer Note」
    「Audio Developer Note」
    「Bluetooth Developer Note」
    「Ethernet Developer Note」
    「FireWire Developer Note」
    「PCI Developer Note」
    「RAM Expansion Developer Note」
    「Universal Serial Bus Developer Note」
    「Video Developer Note」

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

    リリースノート

    「AppleScript Release Notes」(改訂)

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

    「Improving Your Software with Xcode and Static Code Analysis Techniques」
    (読み物)

    http://developer.apple.com/tools/xcode/staticanalysis.html

    前回から7月14日の期間中、新規テクニカルノートはひとつも登録されませんでしたが、新規テクニカルQ&Aの方はひとつだけ登録されました。

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

    QA1438「How do I use asserts while debugging?」(初版)

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

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

    前回から7月14日の期間中、Apple社のSample Codeサイトには、新しいサンプルソースコードが5つ登録されました。すべてJavaとQuickTime関連のサンプルであり、改訂版としての再登録となります。

    「AddTextMovie」(Java&QuickTime関連)
    「ImageFile」(Java&QuickTime関連)
    「QTSimpleApple」(Java&QuickTime関連)
    「QTStreamingApple」(Java&QuickTime関連)
    「TimeCode」(Java&QuickTime関連)

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

    【デベロップメント SDK】

    前回から7月14日の期間中、Apple社のSDKサイトには新しいSDKがひとつも登録されませんでした。

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

     

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

     

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

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

    2006-07-11
     

    目次

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

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

     これまでMac OS X Serverのインストールや初期設定について解説してきましたが、今回は初期設定についての補足です。前回は初期設定を自動化する方法をご紹介しましたが、初期設定のデータの扱いで注意が必要な部分があります。
     どのような注意が必要かといいますと、設定情報に日本語のデータが含まれた場合に注意が必要になります。サーバの自動設定の流れをまとめますと以下のような流れになります。

    ・サーバの自動設定手順
    1)サーバ機とは別のMac上で「サーバアシスタント」を起動
    2)「サーバアシスタント」でサーバの設定情報を入力して保存
    3)サーバをインストール
    4)あらかじめ保存しておいた設定情報をもとにサーバを自動設定
    ※3)を1)2)の前に行うこともできます。

     このとき手順2)で保存するサーバの設定情報ですが、設定情報に日本語のパラメータが含まれていた場合、手順4)の自動設定で正常に認識されなくなります。しかし、日本語のパラメータが含まれていた場合でも自動設定は実行されますので、問題点に気付きにくいという欠点があります。あくまでも、日本語のパラメータが含まれていた部分の設定だけが無視され、それ以外の設定は正常に扱われます。
     具体的にどのような設定で日本語のパラメータが含まれることになるかですが、実際に保存した設定情報を見てみることにしましょう。自動設定のための設定情報はXML形式で保存され以下のような形式になっています。

    ・日本語が含まれる設定情報(一部のみ抜粋)

           ResName
              ことえり
    ...中略...
                   PortName
                   内蔵 Ethernet
    


     このようにパラメータの一部に日本語が含まれていますが、この例ではキーボード(ことえり)とネットワークインターフェイス(内蔵 Ethernet)の設定で日本語のパラメータが使用されています。日本語のパラメータが設定情報に含まれたままサーバの自動設定を行ってしまいますと、該当する部分の設定が無視された状態でサーバを設定してしまうことになります。つまり一部の設定が抜け落ちた状態になってしまいます。
     キーボードの設定などはあとから改めて設定することもできてしまいますが、ネットワークインターフェイスの設定に失敗してしまいますと大変なことになります。リモートでサーバを管理しているような場合には、サーバへのネットワーク接続ができなくなってしまいますので、注意が必要です。

    ではどのようにすればこの問題を解消できるかですが、設定情報には日本語のパラメータを含まないようにする必要があります。例えばネットワークインターフェイスの設定をするときには、インターフェイスを追加するさいに、デフォルトではポート名が「内蔵 Ethernet」となりますが、ここを手動で書き換えて「Built-in Ethernet」と設定します。このように手動で設定できるパラメータの場合には日本語を使用しないといった対策が必要になります。
     しかし、キーボード設定などはパラメータを手入力するわけではなく、画面上に表示されるリストから選択するだけですので、どうしても自動的に日本語のパラメータが設定されてしまいます。この場合は対策としては2つの方法があります。
     1つ目はとりあえず日本語のまま設定してしまって、設定情報を保存した後に日本語のパラメータを直接書き換えてしまう方法があります。キーボートの設定の場合は「ことえり」を使用する場合「Kotoeri」とパラメータを書き換えます。
     この方法はちょっと手間がかかりますが、もう1つの方法として言語環境を「English」に変更して「サーバアシスタント」を起動して設定するという方法があります。こうしておけば最初から英語のパラメータが設定情報に保存されます。ただし「サーバアシスタント」の画面上の表示もすべて英語になってしまいます。言語環境の「English」への変更ですが、「サーバアシスタント」を起動するマシン上の言語環境を変更してください。「サーバアシスタント」で設定を行うときに言語の設定を行いますが、こちらはこれから設定をおこなうサーバ上で使用する言語の設定になりますので、勘違いしないよう注意が必要です。
     あるいは、キーボードの設定であれば後から設定してしまえばよいので、とりあえず日本語のまま設定を実行してしまってもよいでしょう。そもそもサーバの管理をリモートで行う場合には、サーバ側のキーボードの設定などは直接影響しないことになります。ちなみに、言語環境を「English」にして設定情報を保存した場合には以下のようなデータが保存されます。

    ・英語環境で保存した設定情報(一部のみ抜粋)

            ResName
              Kotoeri
    ...中略...
                   PortName
                   Built-in Ethernet
    


     さて、インストールおよび初期設定の解説はそろそろ終わりにしたいと思います。インストールでは新規インストール以外にも、以前のバージョンからのアップデートなどもありますが、そろそろ次の話題にうつっていきましょう。次回は初期設定が完了した直後に必要となる作業について解説する予定です。

    つづく

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

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

    今回は、前回紹介した幾つかのトピックスのうち、画像フィルタ処理などに活用することができるvImage.frameworkのルーチンを、例題を示しながら解説してみます。PowerPCのAltiVecコードをIntel CPUのSSE/SSE2コードに変換する作業とは直接関係ありませんが、vImageルーチン(API)を使うことは処理速度の向上において重要なテクニックです。

    前回も紹介しましたが、vImage.frameworkの詳細については、以下のドキュメントを参照してください。

    「Optimizing Image Processing With vImage」「vImage.pdf」(PDF 366ページ)

    http://developer.apple.com/documentation/Performance/Conceptual/vImage/index.html

    ドキュメントのタイトル通り、vImage.frameworkは各種画像処理に関係するルーチンを提供しています。各ルーチンはPowerPC版であればAltiVecコードを、Intel CPU版であればSSE/SSE2コードを最大限用いることで最適化されています。よって、vImage.frameworkを上手に活用すれば、かなり特殊なケースを除き、自分自身でAltiVecやSSE/SSE2を使うことなく多くの画像処理を高速化することが可能となります。

    vImage.frameworkには200近いルーチンが存在しているのですが、それぞれのルーチンは用途別に以下の7つのグループに分類されています。

    (1)Convolution
    (2)Morphological Operations
    (3)Geometric Operations
    (4)Histogram Operations
    (5)Alpha Compositing Operations
    (6)ImageTransformation Operations
    (7)Conversion Operations

    Convolutionは畳み込み演算のことでして、ぼかし、シャープネス、エッジ強調といった画像に対して各種フィルタ処理を実行できます。入力画像の全ピクセルに対し、そのピクセルを中心としたピクセル領域(3×3とか5×5など)とカーネル係数との掛け合わせを行います。Morphological Operationsは、グレースケール画像に対し画像の細線化や膨らまし処理を実行します。
    Geometric Operationsは、画像領域に対してAffine変換を実行することで、画像の回転、反転、歪みなどを実現します。Histogram Operationsでは、ヒストグラム処理により、階調やコントラストなどを制御することが可能です。
    Alpha Compositing Operationsはα値(透明度)による画像合成を行い、ImageTransformation Operationsでは画像のガンマ値調整などが行えます。最後のConversion Operationsは、画像タイプの各種変換(ARGBからグレースケールなど)に利用します。

    vImageルーチンが画像に対してどのような効果を発揮するのか?また、どのようなソースコードを記述をすれば最適なのかは、Developerフォルダの以下の場所に「Tableau」というサンプル(Xcodeプロジェクト)がありますので、これを参照してください。vImageルーチンによる画像処理の速度と、その効果を一通り確認することが可能です。

    /Developer/Examples/Accelerate/vImage/Tableau

    vImageで利用できる画像タイプは以下の4種類です。

    typedef uint8_t Pixel_8; // 1ピクセル8bitのグレースケール
    typedef float Pixel_F; // 1ピクセル1浮動小数点値のグレースケール
    typedef uint8_t Pixel_8888[4]; // 1ピクセル4*8bitのARGBカラー
    typedef float Pixel_FFFF[4]; // 1ピクセル4浮動小数点値のARGBカラー

    また、vImageルーチンで利用する画像バッファはvImage_Buffer構造体として以下のように定義されています。vImagePixelCountとsize_tは、両方ともunsigned longです。

    typedef struct vImage_Buffer
    {
        void            *data;    // 画像バッファの先頭ポインタ
        vImagePixelCount height;  // 画像バッファの高さ(ピクセル数)
        vImagePixelCount width;   // 画像バッファの幅(ピクセル数)
        size_t          rowBytes; // 画像バッファの幅(バイト数)
    
    } vImage_Buffer;
    


    以下に、vImage_Buffer用メモリ領域を確保するルーチンと解放する簡単なルーチンを紹介しておきます。ちなみに、ルーチン内のmalloc()とfree()は、NewPtr()とDisposePtr()に差し替えても問題ありません。

    OSErr newImageBuffer( vImage_Buffer *buf,long hh,long ww,size_t psize )
     {
        short     err=1;
        size_t    row;
    
        row=ww*psize;        // ARGB画像ならpsizeは4となる
        row=(row+15)/16*16;  // 最適化のためrowBytesを16の倍数に合わせる
        buf->height=hh;
        buf->width=ww;
        buf->rowBytes=row;
        if( buf->data=malloc( row*hh ) )  // 画像バッファ用のメモリ領域を確保
         err=noErr;
        return( err );
     }
    
     void disposeImageBuffer( vImage_Buffer *buf )
     {
        if( buf && buf->data )
            free( buf->data );   // 画像バッファ用のメモリ領域を破棄
     }
    


    以下のsharpnessCGImage()は、フルカラーバッファ(ARGB)に保存されたグレースケール画像を浮動小数点グレースケール画像まで変換し、シャープネスを調整してから、再度フルカラーバッファに戻すサンプルルーチンです。各バッファのメモリ領域やRowByte値は処理する直前にvImage_Bufferに確保し、そのポインタの配列を引数で渡しています。

    typedef vImage_Buffer   * vImage_Buffer_Ptr;
    
    void sharpnessCGImage( long val,vImage_Buffer_Ptr buf[] )
    {
        float   flev,k[9],f=255.0;
        long    i;
    
        flev=(float)val;
        flev/=100;
        for( i=0;i<9;i++ ) // カーネル用3x3マトリックスを作成
            k[i]=-flev;
        k[4]=1.0+flev*8.0;
    
        vImageConvert_ARGB8888toPlanar8( buf[0],buf[1],buf[1],buf[1],buf[1],0 );
        vImageConvert_Planar8toPlanarF( &buf[1],buf[2],255.0,0.0,0 );
        vImageConvolve_PlanarF( buf[2],buf[3],NULL,0,0,k,3,3,f,kvImageCopyInPlace );
        vImageConvert_PlanarFtoPlanar8 ( buf[3],buf[1],255.0,0.0,0 );
        vImageConvert_Planar8toARGB8888( buf[1],buf[1],buf[1],buf[1],buf[0],0 );
    }
    


    vImageのルーチンはすべてスレッド・セーフですので、目的の画像処理ルーチンをマルチプロセッサに対応させれば、処理をさらに高速化することが可能です。具体的に言えば、ある画像の矩形領域をプロセッサ数(2つなら上下半分)に分けて、それぞれに対して別スレッドでvImagekルーチンを用います。そうすれば、単純計算で2倍(実際はもう少し遅くなりますが)の処理速度を得ることができるわけです。

    次回は、本格的にAltiVecからSSE/SSE2コードへの変換作業の話となります。幾つかの例題を取り上げて、やっかいなコード変換作業について解説する予定です。

    つづく

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

    本連載では、名前は知っていてもなかなか触れる機会のないSmalltalkについて、最近話題のSqueakシステムを使って紹介しています。今は、簡単なGUIビルダを構築することを目指して、そのために必要なテクニックや知識を整理しているところです。

    前回は「fromUser」というメッセージを、座標や矩形を表現するクラスに送信することで、直後のマウス操作から情報をオブジェクトとして情報を引き出すことが可能であることを確認しました。たとえば、RectangleクラスにfromUserメッセージを送れば、「Rectangle class >> #formUser」というメソッドが起動し、直前のマウスドラッグ操作で描いた矩形の座標を得ることができます。この方法で、位置や大きさをあらかじめ指定して、新しいウィジェットを設置する操作が実現できそうです。さっそく試してみましょう。

    | field |
    field := PluggableTextMorph new.
    field editString: ''.
    field bounds: Rectangle fromUser.
    field openInWorld

    とりあえず、このスクリプトの全体を選択し、do it(cmd + D)で実行してみてください。マウスポインタが十字(クロスヘア)に変化するので、画面の任意の位置でドラッグして矩形を描くと、ぴったりその位置にテキスト編集用のフィールドが現れます。

    [fig.A,B]Rectangle fromUserの位置にテキストフィールドを生成

    念のため、スクリプトの内容を順を追って解説してみましょう。まず最初は、テンポラリ変数「field」の宣言文。続けて、PluggableTextMorphのインスタンス(a PluggableTextMorph)を作り、その変数「field」に束縛しています。

    fieldに束縛されたa PluggableTextMorphの初期化のために、メッセージ「editString: ''」を送った後、くだんのRectangle fromUserを使って得た矩形情報(a Rectangle)をパラメータに添えて、#bounds:というメソッドを起動しています。この#bounds:メソッドはMorphに定義されていて、モーフの位置と大きさを一発で決めることができます。つまり、

    | morph |
    morph := Morph new.
    morph bounds: (100@100 extent: 100@100).
    morph openInWorld

    は、

    | morph |
    morph := Morph new.
    morph position: 100@100.
    morph extent: 100@100.
    morph openInWorld
    


    と同じことをします。

    位置と大きさを決められたa PluggableTextMorphは、最後にopenInWorldメッセージを受け取って、我々の前にその姿を現わします。ただ、実際のシステムウインドウに埋め込む作業には、#add:frame:を起動するだけでよいので、#bounds:以下は、軽く流していただいて結構です。

    さて、このように単に作られただけのテキストフィールド(a PluggableTextMorph)は、テキストの入力などの基本的な機能こそ正常ですが、モデルに依存する黄ボタンメニューを出すことができません。第62回のときは“魂”を欠いた状態などと抽象的に表現していましたが、実装的には、どんなことが起こっているのかを探ってみることにします。

    とりあえずは、黄ボタンメニューを出すことだけを考えてみます。まず手始めに、手本となったワークスペースでテキストフィールドを作っているときのメッセージをそのまま真似てみることにしましょう。

    PluggableTextMorphを選択して、cmd + shift + Nとタイプすると、そのクラスを含むメソッドの一覧をブラウズできるので、その中から、StringHolder >> #openAsMorphLabel:inWorld:というメソッドを探して定義を見ると、次のようなワークスペースのウインドウを構築する記述が見つかります(改行の位置はわかりやすいように変えました)。

    window
       addMorph: (
          PluggableTextMorph
             on: self
             text: #contents
             accept: #acceptContents:
             readSelection: nil
             menu: #codePaneMenu:shifted:)
       frame: (0@0 corner: 1@1).

    ここで、#on:text:accept:readSelection:menu:を起動する際に添えられているパラメータを、そのまま真似ればよいのですが、他のパラメータと違い、第一パラメータのselfだけは文脈に依存する擬変数なので、別のものに置き換えなければいけません。

    ワークスペースが作られるときの文脈では、このメソッド(StringHolder >>#openAsMorphLabel:inWorld:)を起動したワークスペースのインスタンス(a Workspace)がselfに束縛されていることになりますから、このことを考慮して、冒頭のスクリプトを書き換えると次のようになります。

    | field |
    field := PluggableTextMorph
       on: Workspace new
       text: #contents
       accept: #acceptContents:
       readSelection: nil
       menu: #codePaneMenu:shifted:.
    field bounds: Rectangle fromUser.
    field openInWorld

    改めてスクリプト全体を選択してdo it(cmd + D)すると、今度のテキストフィールドは、黄ボタンメニューも使えるようになっていることが確認できるはずです。

    [fig.C]黄ボタンメニューをポップアップさせたところ

    じつは、セレクタのキーワードから想像できるように、黄ボタンメニューを出すだけなら、最初と最後のパラメータだけをきちんと渡せば、あとはnilでも目的を果たすことができます。

    | field |
    field := PluggableTextMorph
       on: Workspace new
       text: nil
       accept: nil
       readSelection: nil
       menu: #codePaneMenu:shifted:.
    field bounds: Rectangle fromUser.
    field openInWorld
    


    このことを手がかりに、次回、黄ボタンメニューがどのように呼び出されているのかを、もう少し掘り下げて調べてみることにします。

    バックナンバー:

    ニュース・解説

     今週の解説担当:木下 誠

    ----------------------------------------------------------------------
    日本語訳「Cocoa基礎ガイド」
    ----------------------------------------------------------------------

    開発者に対してCocoaの基礎的なオーバービューを与えるドキュメント、「Cocoa Fundamentals Guide」の日本語訳が公開されていました。タイトルは、「Cocoa基礎ガイド」となっています。

    Cocoaの設計思想や歴史から始まり、XcodeとInterface Builderといった開発環境の話や、ターゲット・アクションやバインディングのような高度な話まで、幅広くカバーしているドキュメントです。初学者の方はもちろん、既にCocoaをバリバリ使っている方も、一読すると新しい発見がありそうです。

    Cooca基礎ガイド
    http://developer.apple.com/jp/documentation/Cocoa/Conceptual/CocoaFundamentals/index.html

    ----------------------------------------------------------------------
    教育機関向けiMacの発表とDeveloper Note
    ----------------------------------------------------------------------

    7月6日に、突如「17-inch iMac for educaion/1.83GHz」が発表されました。eMacの後継となる、教育機関のみに販売される、低価格モデルです。

    そのモデルの、Developer Noteも公開されました。GPUはIntel GMA950、光学ドライブはComboドライブとなっており、低価格化が計られているようです。

    17-inch iMac for Education Developer Note
    http://developer.apple.com/documentation/HardwareDrivers/Conceptual/iMac_17inchEdu/index.html

    ----------------------------------------------------------------------
    Cocoaセミナー中級編開催
    ----------------------------------------------------------------------

    アップルから、5月に行われたCocoaセミナー初級編に引き続き、「Coocaセミナー中級編」を開催する事が発表されました。7月11日と、8月1日の、13:00から17:00の開催となります。ADCに登録している方なら、参加できます。Onlineの方も含みます。講師は、私木下が担当します。

    中級編では、実用的なアプリケーション作成を始める手がかりとなるように、できるだけたくさんのCocoaのクラスを使う事を目標とします。具体的には、NSDocument、NSTextView、NSTextField、NSXMLDocument、NSXMLNode、NSArray、NSSplitView、NSTabView、NSTableView、NSOutlineViewといったクラスが登場します。興味のある方は、ぜひご登録ください。

    Cocoaセミナー中級編
    http://developer.apple.com/jp/briefing/cocoa2/

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

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

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

    2006-07-04

    目次

    • 「Wonderful Server Life」      第9回  田畑 英和
    • 藤本裕之のプログラミング夜話 #94
    • 高橋真人の「プログラミング指南」  第92回
    • ニュース・解説                小池 邦人

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

     前回はMac OS X Serverの初期設定をリモートで実行する方法を解説しました。今回はそのほかの初期設定の方法を解説いたします。ほかの方法としてはまず、サーバ上で直接操作をおこなう方法がありますが、こちらはリモートで行った操作をローカルマシン上で直接実行するだけです。
     ちなみにインストールだけやっておいて、初期設定を後で行いたい場合は、初期設定の画面でコマンドキー+Qキーを押せばシステム終了することができます。

    □サーバの自動設定
     それでは、もう1つの初期設定方法をご紹介しましょう。それはサーバの自動設定です。ある特定の場所に初期設定の情報をあらかじめ保存しておけば、インストールが完了したMac OS X Serverはその初期設定情報を自動的に認識して読み込み、自動的に初期設定を行います。
     この方法を使いますと、複数台のサーバの初期設定を効率化することができますし、サーバマシンがまだ調達できていない場合でも先に初期設定だけを完了させておくことができます。また、同じ設定でサーバを繰り返し構築するような場合にも役に立ちます。

    □自動設定の保存場所
     初期設定情報の保存場所ですが、以下の2種類の保存場所が使用できます。

    ・ファイルに保存する
    ・ディレクトリサーバに保存する

     ファイルに保存する場合ですが、保存する場所があらかじめ決められています。サーバはマウントしている各ボリュームの「/Auto Server Setup/」内に設定ファイルが保存されているかどうかを確認します。ですので、たとえば外付けのハードディスク(iPodでもかまいません)の最上位にAuto Server Setupという名前のフォルダを作成し、その中に設定ファイルを保存してサーバに接続すれば自動設定を行うことができます。
     このとき設定ファイルのファイル名は何通りかの命名規則があるのですが、特定のサーバ用の設定ファイルを作成する場合はMACアドレス(IPアドレスなどでも可)をファイル名に使用します。MACアドレスをもとにファイルを作成する場合にはコロンを省略してファイル名に用います。

    設定ファイルの例)
    ・Setupという名前の外付けHDに保存
    ・サーバのMACアドレスは00:30:65:4d:bc:ef
    設定ファイルのパス:
    /Volumes/Setup/Auto Server Setup/0030654dbcef.plist

     ディレクトリサーバに保存する場合ですが、この方法では設定ファイルを保存するためのディレクトリサーバが1台必要になります。ディレクトリサーバとはネットワーク上で様々なデータを一元管理するためのサーバのことです。Mac OS X Serverをディレクトリサーバとして使用することができます。
     初期設定を行うサーバはDHCPを利用してネットワーク上のディレクトリサーバを自動的に検出し、ディレクトリサーバ上に該当する設定レコードが保存されていれば、その設定レコードを読み込んで自動的に設定を行います。
     Mac OS X Serverをディレクトリサーバとして使用している場合には、自動設定のための設定レコードを保存する場所(スキーマ)があらかじめ用意されています。

    □設定情報の保存
     自動設定のための情報を保存するには、リモートで初期設定を行ったときと同様に「サーバアシスタント」を使用します。「サーバアシスタント」を起動すると「ようこそ」画面が表示されますので、ここから「ファイルまたはディレクトリレコードに設定情報を保存する」を選択して、設定情報を入力していきます。設定情報の入力はリモートで初期設定を行ったときと同様です。ただし、リモートでの初期設定のときとは違い、サーバ機が稼働している必要はありません。また、設定を始めるときにサーバを選択する必要もありません。

    設定が一通り完了すると、最後に設定の確認画面が表示されますが、ここで画面左下の「別名で保存」ボタンをクリックします。保存の形式が選択できますので、ファイルに保存する場合には「設定ファイル」を、ディレクトリサーバに保存する場合には「ディレクトリレコード」を選択します。どちらの形式を選択した場合でも設定内容を暗号化することができますが、暗号化しないのであれば暗号化の指定は外しておきます。
     ファイルに保存する場合には、先ほど解説しましたようにファイル名にMACアドレスを使用します。
     ディレクトリサーバに保存する場合は、「サーバアシスタント」を実行しているマシンからディレクトリサーバが参照できる必要があります。ディレクトリサーバの場所はDHCPを利用することにより自動的に設定することができます。ディレクトリサーバが参照できていれば「ディレクトリノード」の一覧に自動的に表示されますのでそこから設定レコードを保存するサーバを選択します。このときレコード名を指定する必要がありますが、特定のサーバ用の設定レコードを保存する場合には、レコード名にMACアドレス(このときコロンは省略)を入力します。また、ディレクトリサーバに設定レコードを保存するにはディレクトリの管理者として認証を行う必要があります。

    このようにして設定情報を保存しておけば、あとはMac OS X Serverをインストールするだけで、インストール後に自動的に初期設定が始まります。もしサーバを再構築する場合には自動設定の情報が残っているかどうかを確認してください。異なる設定でサーバを構築する場合、もし自動設定の情報が残っているとインストール後に自動設定が始まってしまい、また最初から作業をやり直すことになってしまいます。
     もちろん同じ設定でサーバを再構築する場合には、初期設定の情報を残しておけば、同じ設定でサーバを構築することができます。

    つづく

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

     さて、待ってた人はお待ちかねの、そうでもない人はそれなりの「ふじもと.txt」行方不明事件の解決編である。まず問題を復讐して……巌窟王してどうする、復習しておこう。セーブパネルをひらいてユーザにファイル名を入力させ、その名前でテキストファイルを作る。作ったファイルが含まれるディレクトリのファイル名リストを取り、これに対して containsObject: で作ったときのファイル名があるかどうかを聞くと、「こいけ.txt」は YES だが 「ふじもと.txt」は NO なのであった。……細かな点は端折ったが、おおむねよろしいか?
     前回もちらと書いたがこの奇っ怪至極な現象、実は Mac OS X というかHFS+ の仕様なのである。タカハシ編集長に指摘され、なんとオレもその文章を読んだことがあることに気がついたのだが SystemOverviewJ.pdf(http://developer.apple.com/jp/documentation/pdf/SystemOverviewJ.pdf)の176ページにこういう記述があったのだ。

    「……ファイル名に使用されるエンコーディングはファイルシステムによって異なります。Mac OS拡張(HFS+)では、Unicodeのある特定の形式、つまり、UTF-16形式(16ビットコードのシーケンス)の、正規分解された(canonical decomposition)Unicode2.1をファイル名に使用します。」

    この記述は10.2.xまでの話で、10.3からはUnicode 3.2になっているのだが、話の要点はそこではなく、「UTF-16の正規分解されたUnicode」というところにある。実はこの、正規分解ってのがクセモノなのである。このドキュメントでは例としてUTF-8のしかも 0x00E9(eの上に´が乗ってるヤツ)が「e」(0×0065)+「´」(0×0301)と表現される例しか挙げてないのだが、日本語の濁音半濁音もこれと同じ扱いで、「こいけ」はそのままだが「ふじもと」は「ふし濁音もと」と表現されてしまうのである。
     先週作ったプログラムで検証してみよう。修正するところは2ヶ所。まずアクションメソッド execT1: のファイル名表示のところを以下のように変え、指定したファイル名の長さも表示するようにする。

      [self displayMessage:[NSString stringWithFormat:
              @"We had saved a file as %@ (%d).\n", filename, [filename length]]];
    
     次に execT2: でディレクトリの中身をダンプしている部分、forループの中を次のようにしてやっぱりファイル名の長さを表示するようにする。
    
         for(index = 0; index < fileCount; index++){
              NSString* item = [filesArray objectAtIndex:index];
              [self displayMessage:[NSString stringWithFormat:
                   @"%@ (%d) \n", item, [item length] ]];
         }
    


     これを実行して「ふじもと」というファイルを作ると出力は次のようになった。

      We had saved a file as ふじもと.txt (8).
         This directory contains 3 files.
      (中略)
         ふじもと.txt (9)

     ね、ファイルを作った時の「ふじもと.txt」は8文字(これは見た通りである)なのに、directoryContentsAtPath: で持ってくるとこれは9文字で濁音の分が1文字増えちゃってる。おなじ「ふじもと」でも中身が違うんである。これぢゃコンペアはうまくいかないのが当然だ。
     ほんぢゃどうすればいいのか、アップルのドキュメントにはNSString のfileSystemRepresentationメソッドを使えば正規化されたUTF8が得られ、UTF8Stringメソッド を使えば正規化されてないUTF8の文字列が得られるとか書かれているが、こいつらはつまり char* を返すわけだから NSString と比較するには手間をかけて全部この形にしてやらねばならぬ。いや、実際ワタシはそうしてこの問題に対処したんだが(バグぢゃなかったが対策は正しかったわけだ)、これはいかにも泥臭い。
     ……というわけで、HFS+ファイルシステムを直に、パス名で指定する各種メソッドは10.4で「Deprecated」となり、ローカルのファイルでも URL で指定することが推奨されるようになったらしい。当然ながらURLでは上記の正規化は起こらないのである。なんだかだまされたような気がするがそういうことなのだ。

    なお、Unicode 正規化については以下のページがとても詳しい。ご参考まで。
     http://homepage1.nifty.com/nomenclator/unicode/normalization.htm

    (2006_06_29)

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

    UNIXとしてのMac OS X

    〜Perlについて(38)〜

     こんにちは、高橋真人です。
     早速前回の残りから始めます。

    <<1>>:
    {
         print(OUT join("\t", $_->[0], $_->[1], $_->[2],
              $_->[3], $_->[4], $_->[5]), "\n");
    }

     処理の最後です。各要素をファイルに書き出します。0〜5番めの要素をタブで結合し、最後に改行を付け足しています。
     join演算子の中で、スカラー変数を羅列していますが、ここは以下のように書けばスライスとして書くことができます。(今の私ならそう書いたでしょう)

    { print(OUT join('\t', @$_[0..5]), "\n") }

     スライスというのは、配列の要素を選択的に指定して、リストを生成する方法です。既に触れていたと思ったのですが、ちゃんとした説明をしていなかったので、少し説明します。

    @list1 = (1, 2, 3, 4, 5);

    とある場合、

    @list2 = ($list1[0], $list1[4]);

    とする代わりに、

    @list2 = @list2[0, 4];

    と書くことができます。つまり、配列の要素をインデックスを使って選択的に指定して新たなリストにすることをスライスと呼びますが、このスライスは代入式の右側に書けるだけではなく、左側にも書くことができます。
     たとえば上記の続きで、

    @list2[0, 3] = @list2[3, 0];

    とすると、0番目と3番めの項目が入れ替わります。全く同じことを以下のようにも書けます。

    @list2[3, 0] = @list2[0, 3];

     要素を指定するブラケットの中はカンマで区切っていくつでも書くことができますし、範囲演算子(..)を使うこともできます。従って、

    @list2 = @list2[4..0];

    と書くと、配列の要素が逆順に並び変わります。もちろん、配列を逆順にするだけならば、reverseという演算子がありますので、

    @list2 = reverse @list2;

    と書いても、結果は同じになります。
     ところで、スライスについてですが、Perlを始めたうちは、スカラーとスライスの書き分けに混乱する人が多いと思います。
     上記例の@list2の最初の要素を取り出す場合に、つい、

    $first_item = @list2[0];

    などという書き方をしてしまうことが多いのです。
     配列から要素を取り出した場合、その要素自体はあくまでもスカラーなので、$で始めなければなりません。@で始めてしまうと、これはスライスになりますから、結果、「要素が一つのリスト」を表すこととなります。

    ■最後に
     さて、38回にわたってお届けしてきたPerlの解説も今回で終わりです。
     前にも書きましたように、私がPerlを始めた頃はまだインターネットも一般に普及していなかったので、「PerlといえばCGI」ということはなく、私にとってのPerlの印象は「テキスト処理の得意なスクリプト言語」というものでした。現在では、あえてPerlをやらなくても、純日本産のRubyという人気のスクリプト言語もありますし、ちょっと毛色の変わった(?)ところではPythonなどというものもあります。国産のRubyは別としても、概してこのようなUNIX系のスクリプト言語は日本語の扱いに難があるケースが少なくなかったのですが、これもunicode系の文字コード体系が一般的になっていけば、徐々に解消されるのではないでしょうか(希望的観測・笑)。
     実は、こうやってPerlの記事を書いてきた私も、日常の業務でPerlを使うことはほとんどなくなってしまいました。強いて言うなら、他人のCGIの仕事を手伝う時にちょこっと書くぐらいです。
     まあ、そうは言っても、CGIに関して言えば、恐らく圧倒的に普及しているのはPerlで、まだPythonやRubyでCGIを使える環境はそんなに多くないでしょうから、レンタルサーバーなどで自分の権限で環境を変更できないケースなどのことを考えるとCGIを書くためにはPerlを覚えておくことのメリットは充分あるはずです。
     今回この連載で紹介したのは、あくまでPerlの「おいしいとこだけのつまみ食い」なので、これをきっかけにPerlに興味を持っていただけた方がおいでであれば、以前、連載の53回目で紹介した「プログラミングPerl」や「初めてのPerl」などの本でもっと体系的に学ぶことができるでしょう。
     また、少しはPerlの経験があった人でも今回の私の紹介したいくつかのテクニックを知って興味を持たれたら、是非以下の本を読んでみることをお勧めします。

    Effective Perl
    Joseph N. Hall著
    ASCII刊、2940円
    http://www.ascii.co.jp/books/books/detail/4-7561-3057-7.shtml

     決して入門向けの本ではありませんが、Perlの奥深さを知って、Perlに対する見方が変わること、請け合いです。

    ニュース・解説

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

    ● Carbon ドキュメント & サンプル & SDK ナビゲーション(2006/06/30)

    【開発環境】

    WWDC2006参加費用の早期割引の締め切りが7月7日まで延びました。まあ、良くあるケースなのですが、参加しようかどうかをギリギリまで判断しかねている人(もしくは会社)にとっては朗報です。今年は、開催日程が6月から8月へと変更になった関係で、毎年参加している私の知り合いの中にも参加を見合わせる人が沢山出てしまいました。日本からの参加者は減少するかもしれませんね。欧州やUS国内からの参加者への影響はどうなのでしょうか?

    Apple社からMac OS X 10.4.7が発表されました。色々なモジュールにおいてバグの修正が行われているようですが、10.4のアップデートはこれで打ち止めなのでしょうか? 私が報告したバグで、まだ未対応のものもあるのですが、これらの修正は10.5を待つしかないかもしれません...。

    以下のMacworldサイトに、Leopardに望む23の項目という記事がアップされています。

    http://www.macworld.com/2006/06/firstlooks/leopardwishlist/index.php

    非常に的を得ていると思いますので、皆さんもぜひ一読してみてください。

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

    前回から6月30日の期間中、Apple社のGuidesとReferenceのサイトには大量のドキュメントが登録されました。ただし、大部分は今までの内容のマイナーチェンジです。今回は、その中で初版と内容が大幅変更になったドキュメントだけをピックアップしました。サンプルソースも記述されている「Quartz Display Services」に関するドキュメントが登場しました。また、「Disc Recording」に関する新規リファレンスも2つ登録されています。

    「Core Image Programming Guide」(PDFあり)
    「Quartz Display Services Programming Topics」(初版)(PDFあり)
    「RAM Expansion Developer Note」

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

    「Core Image Filter Reference」(初版)(PDFあり)
    「Core Image Kernel Language Reference」(初版)(PDFあり)
    「Disc Recording Framework Reference」(初版)
    「Disc Recording UI Framework Reference」(初版)
    「HIGeometry Reference」(初版)(PDFあり)
    「NSString Application Kit Additions Referenc」(PDFあり)

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

    加えて、新規リリースノートがひとつ、デベロッパ向け読み物が2つ登録されています。「Building Customized User Client Drivers for USB Devices」の方は、珍しいことにUSBドライバ開発についての解説です(笑)。

    リリースノート

    「AppleScript Terminology and Apple Event Codes Reference」(初版)

    http://developer.apple.com/releasenotes/

    「Building Customized User Client Drivers for USB Devices」(読み物)

    http://developer.apple.com/hardwaredrivers/customusbdrivers.html

    「Using the QTKit Framework」(読み物)

    http://developer.apple.com/quicktime/qtkit.html

    前回から6月30日の期間中、新規テクニカルノートと新規テクニカルQ&Aはひとつも登録されませんでした。

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

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

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

    前回から6月30日期間中、Apple社のSample Codeサイトには、新しいサンプルソースコードはひとつも登録されませんでした。今頃関係者は、Mac OS X 10.5用のサンプル作りで大忙しなのでしょう。

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

    【デベロップメント SDK】

    前回から6月30日の期間中、Apple社のSDKサイトには新しいSDKがひとつ登録されました。Mac OS X 10.4.7対応「Kernel Debug Kit」(PowerPC版とIntel版あり)です。また、プロ用アプリケーション「Shake」の新版が発表されたことに合わせて「Shake 4.1 SDK」の新版も登録されています。

    「Kernel Debug Kit 10.4.7 - PowerPC」
    「Kernel Debug Kit 10.4.7 - Intel」

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

    「Shake 4.1 SDK」

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

     

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

     

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