MOSA Multi-OS Software Artists

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

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

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

MOSADenバックナンバー 2008年6月発行分

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

    2008-06-24 

    目次

    • WWDC初参加レポート
    • 「「Wonderful Server Life」    第72回   田畑 英和
    • 小池邦人の『WWDC2008を思う』
    • ターミナルの向こうから      第27回  海上 忍 

    WWDC初参加レポート

    今回、WWDCの感想投稿について依頼を受け、WWDCへ行かれたことの無い方が、今後参加される際の参考になればと思い、投稿させていただきました。

    私は、今回初めてWWDCに参加してきました。

    サンフランシスコの天候は、日中は日差しが強くはありますがカラッとしていて、また涼しい風が時折吹くため、梅雨で蒸し暑い日本に帰るのが億劫になるほどとても過ごしやすい天候で、快適にすごすことができました。逆に朝・夜は結構冷え込んで、WWDC初日の長い列にならぶときや、木曜日の夜にあったWWDC Bashに半袖で参加してしまったのをとても後悔しています。今後参加されるかたには、私の失敗を活かして、上に羽織る長袖を何着か持っていくことをおすすめします。

    さて、WWDC初日のキーノートですが、内容は様々なメディアで紹介されていますので割愛させていただきますが、皆さんご存知の通りiPhone一色でした。とても残念だったのが、生で見ることを期待していた”One More Thing”が今回なかったことです。
    「初参加の今年に限ってなくさなくてもいいでは無いか」と、自己中な発言ではありますが文句を言いたくなります。やはり、Snow Leopardの情報が漏れていたせいで、ネタがなくなってしまったのでしょうか・・・それでも、「新しいiPhoneのリリースに合わせて、新しいiPod Touchもリリースします」ぐらいの発表がされて欲しかったと思います。

    iPhoneですが、ご周知の通り7月11日に日本で発売されます。皆さんはどうされるのでしょうか? まだソフトバンクより月額料金の発表がなされていませんが、料金体系によっては一部のユーザ層にしか受け入れられないのではないかとの懸念があります。Macアプリの開発者としては、月額料金を安くしていただいて、iPhoneが爆発的に売れることにより、Macというプラットフォームにもっと注目が集まることを期待しています。そこはソフトバンクの方の営業努力をできる限りお願いしたいと思います。

    話がそれてしまいましたが感想に戻ります。私にとってWWDCが初参加であり、またアメリカへの旅行も初めての経験でしたので、不安点が多々ありました。

    まず時差について。
    日本とサンフランシスコでは、6月のサマータイムの場合、時差が16時間あります。今回、近畿ツーリストのパッケージツアーに参加しまして、成田16時発-サンフランシスコ朝9時着の日程となっていました。到着日はWWDC開催日前日ではありましたが、日本での生活サイクルのまま移動してしまうと、かなりつらい目を見ることはあきらかでした。

    これを解決する方法として、私は出発前日に睡眠時間を普段の三分の一程度に抑えてみました。これが功を奏し、長いフライトの間に寝ることができたため、調子のいい状態で到着日の朝を迎えることができ、到着後フィッシャーマンズワーフを観光するなど、活発に活動することができました。出発前日に寝ないというのはさすがにつらいと思いますので、睡眠時間を少なくする方法はお勧めです。

    次に、一番大きな不安点であった、英語について。

    日本から参加される方で、不安に思われる方は多いと思います。ですが、パッケージツアーに参加することで、他の参加者の方や添乗員の方がいらっしゃいましたので、移動に関しては特に心配する必要がありませんでした。また、WWDCのセッションについても、スライドで何について話しているかは表示されますし、コードが表示される場合もありますので、全く内容がわからないということはありませんでした。

    一点だけ、自身の世界観や見聞を広げるために、海外の参加者の方とコミュニケーションを取りたかったのですが、私の英語レベルでは全くダメだったという問題がありました。
    海外の方から話かけられることが何回かありましたが、そのときにコミュニケーションをとろうと稚拙な英語で話そうとはするのですが、海外の方は面倒見がいいのかおせっかいなのか、別の海外の方が横から口をだしてきますので、結局会話を持つことができなかったことをとても残念に思っています。次回、WWDCに参加するまでに、英語レベルの向上は必須の課題だとわかりました・・・

    さて、ここまで不安点ばかり紹介してきたので、ここからはWWDCに参加するメリットについてご紹介します。

    まず、Mac開発者として、最新の開発情報を手に入れることができること。WWDCの内容はキーノート以外は非公開であるため、参加されていない方に先んじて、最新の開発情報を自身が開発しているアプリケーションに対して反映することができます。
    今回で言うとSnow LeopardのデベロッパプレビューがWWDC参加者に渡されましたので、Snow Leopard発売と同時に新機能を搭載したアプリをリリースできたり、いままで作成してきたアプリをSnow Leopardに対応させることも非参加者より先に行なえます(私としてはLeopard対応にとても苦労をさせられたので、後者を早めにできることが、とてもうれしく感じます)。

    また、開発情報の公開が許可される前までに内容をまとめておき、公開が許可された時点でプログラム本の出版を行なうといったことも可能なのではないでしょうか。

    次に、日本のMac開発者の方とコミュニケーションがとりやすいこと。

    普段日本で開発している場合にはあまりMac開発者の方に会う機会がありませんが、WWDCでは開催日前日にはApple Japan主催のレセプションがありましたし、開催期間の中頃にはMOSAのパーティがありました。またWWDC会場内でも休憩時間に話をすることもできます。私は、地方在住であり、Mac開発者としてもまだ経験が浅いため、他の日本人参加者に面識のある方はいなかったのですが、上記のレセプションやパーティを通じて、色々な方と会話をすることができました。本投稿についてもモサ伝編集長の高橋様とお話ができたことによりこの機会をいただくことができました。
    またApple Japanの方も参加されていますので、その方からいろいろ情報を聞くこともできます。
    英語があまり得意でない私にとって、まわりが英語ばかりで多少疲れを覚えたのですが、日本語で会話できる場所ではとても安らぐことができました。今後WWDCに参加される方にも、日本人参加者があつまるイベントにはぜひ参加することをおすすめします。

    MOSAのパーティについてですが、今年はかなり多くの方が参加されたらしく会場はギュウギュウでしたが、私にとっては近くにいらっしゃる方に話しかけやすかったため、逆によかった印象を持っています。MOSAの方々にあの場を提供してくださったことをお礼申し上げます。

    終わりに、WWDCに参加して自身の見聞の狭さなど足りないことが色々見えてきました。これからの目標を立てることもできましたし、総じて今回のWWDCの参加は大成功と言えます。

    稚拙な文章で申し訳ないですが、お役にたてましたでしょうか?それでは、これをもってWWDCの感想とさせていただきます。

    ◇モサ伝編集部より◇
    WWDC初参加のSさんにレポートをお願いしました。

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

    ◇WWDC – Snow Leopard
     E-ticketが売り切れこれまででもっとも多くの開発者が参加したWWDCも終わりました。NDAの適用外となっている基調講演はいつものようにストリーミングでも公開されていますので、WWDCに参加していない方でも、すでに内容をご覧になったかと思います。前評判どおりiPhoneに関する発表がほとんどで、基調講演では、次期Mac OS XとなるSnow Leopardに関してはその名前が発表された程度でした。

    ・WWDC 2008 Keynote
    http://events.apple.com.edgesuite.net/0806wdt546x/event/index.html

     それでもアップルのWebサイトをみると、すでに概要だけは公開されています。特にクライアント版のSnow Leopardでは、これまでのような大量の新機能の追加よりはOSの基盤部分の改良を行い、今後の拡張に備える方針になっています。
     サーバ版のSnow LeopardではLeopard Serverから新たに加わったiCal ServerやPodcast Producerがそれぞれバージョンアップしたり、新たにAddress Book Serverが加わります。またOSの基盤ではクライアント版と同様にマルチコアへのさらなる最適化や、64bitカーネル、GPUを使った汎用計算を行うOpenCLの採用が予定されています。またサーバではSunが開発したZFSへの対応も注目すべきところでしょう。
     リリースは約1年後となっていますので、来年のWWDCの時期にはリリースされるかもしれません。TigerからLeopardへのアップデートには時間がかかりましたが、今後OSのアップデートはサイクルが早まっていく可能性があります。

    ・Mac OS X Server Snow Leopard
    http://www.apple.com/server/macosx/snowleopard/

    ◇10.5.3アップデート
     WWDC前後にいくつかサーバ関連のアップデートがリリースされましたので、こちらを紹介しておきましょう。まずLeopard Serverのアップデートがリリースされバージョンが10.5.3になりました。10.5.2からのアップデートと10.5.0以降で使用できるコンボアップデートがリリースされています。

     今回のアップデートは容量も大きく、広範囲にわたって様々な修正が行われています。これまでLeopard Serverを運用していてなにか問題があった場合は今回のアップデートで修正が行われていないかまずは確認をしてみましょう。特にAFPサービスが正常に動作しないことがこれまで問題になっていましたが、この問題に関する修正も行われています。実際にはDirectoryServiceプロセスに問題があり、AFPサービスがその影響を受けていました。
     10.5.3のアップデートでは不具合の修正だけではなく機能追加も行われています。第68回の連載で他のディレクトリサーバ上のユーザを読み込んで作成するオーギュメント・ユーザ・レコードを紹介しましたが、これまではサーバをワークグループ構成にした場合でしかGUI上では設定ができませんでした。サー
    バを10.5.3にアップデートすると「ワークグループマネージャ」の「ファイル」メニューに「新規オーギュメント・ユーザ・レコード」メニューが追加され、ここからほかのディレクトリサーバ上のユーザを読み込んでオーギュメント・ユーザ・レコードが作成できるようになりました。この方法はサーバが詳細構成の場合でも利用することができます。

     また今回のアップデートではサーバの管理ツールもアップデートしました。サーバをアップデートすればサーバ上の管理ツールも同時にアップデートされます。別マシンからサーバ管理ツールを使ってリモート管理している場合には、事前に別マシン上のサーバ管理ツールもアップデートしておきましょう。サーバ管理ツール単体のアップデートもリリースされています。

    ・Mac OS X 10.5.3 Serverアップデートについて
    http://support.apple.com/kb/HT1142

    ◇Xserve EFI Firmwareアップデート
     XserveのEFI Firmwareアップデートもリリースされています。EFI Firmwareですので対象となるのはIntel CPUを搭載したXserveになります。アップデートのためのシステム条件は10.5.2以降となっています。

    ・Xserve EFI Firmware Update 1.1
    http://www.apple.com/jp/ftp-info/reference/xserveefifirmwareupdate11.html

    ◇Xsan 2.1
     XsanのアップデートVer 2.1がリリースされ、いくつかの問題が修正されています。Xsan 2.1のアップデートは、ファイルシステムのアップデートと管理ツールのアップデートが個別に用意されており、アンインストーラも別途用意されています。
     Xsanは動作条件が厳しく、システムの停止や起動にもルールがありますのであらかじめ動作条件やアップデートの手順を十分に確認してから計画的にアップデートを行う必要があります。

    ・Xsan Filesystem Update 2.1
    http://www.apple.com/jp/ftp-info/reference/xsanfilesystemupdate21.html
    ・Xsan 2.1 Admin Update
    http://www.apple.com/jp/ftp-info/reference/xsan21adminupdate.html
    ・Xsan 2.1 Uninstaller
    http://www.apple.com/jp/ftp-info/reference/xsan21uninstaller.html

     さて、今回は予定を変更してSnow Leopardおよび最近リリースされたアップデートについて解説しました。次回はからは「サーバ管理」を使ったLeopard Serverの各種サービスの管理について解説する予定です。
    次回へつづく                             

    小池邦人の『WWDC 2008に思う』(2008/06/20)

    6月9日(日本では6月10日の深夜)Steve Jobs CEOによる基調講演(キーノート)によりWWDC 2008が開幕しました。今年はキーノート(午前10時スタート)の待ち行列に午前6時から並びましたが(昨年より30分早く)、途中で謎のTシャツが投げ込まれたり、MacTechマガジンが配られたりと大変賑やかで、あまり退屈することもなく、昨年より待ち時間が短く感じられました。並んでいる参加者の多くは、既にiPhoneを所有しており、通話、音楽、ウェブ回覧、記念撮影と暇つぶしで忙しそうでしたが、我々日本人はiPod touchしか使うことができず、少々悔しい思いをしました。ですから、来年は絶対にiPhoneネイティブのネット対戦ゲーム(4人麻雀希望)で暇をつぶしてやろうと心に誓ったわけです(笑)。

    ところで、毎年WWDCではセッションスケジュールを記した小冊子が配布されるのですが、今回は無し! 環境に配慮したわけでもないでしょうが、Apple社の参加者サイトの最新スケジュールを参照する方式に変更されました。このサイト、ちゃんとiPhoneやiPod touch用も用意されており(良くできている)、参加者は会期中このサイトを見ながら会場を移動していました。筆者は、いつもはあまり外出しないので、常時インターネット接続のモバイルデバイスを試す機会がなかったのですが、今回の会場におけるサイト回覧やメール利用で、この種のデバイスがこうした状況で本当に有用であることを痛感いたしました。まあ、参加者の多くは同時にMacBook Proなども持ち歩いていたので、全体的にはiPhoneなどを使っている人は少なかったとは思うのですが…。

    さて、キーノートの会場に足を踏み入れて驚いたのは、その取材陣とテレビカメラの多さです。事前にiPhone 3G発表が確実視されていた事もありますが、WWDCがコンシューマ向けの展示会ではなく、MacやiPhone対象のデベロッパー会議であるという点を考えると異例のことです。そして会場は参加者で満杯! キーノート会場の収容人員は決まっていますので、余った人は強制的に
    オーバーフロールーム(映像のみ放映)へ回されてしまいます。Jobsから本年度の参加者は5,200人という発表がありましたが、チケットが売り切れていなかったら、もう1,000人ぐらいは集まったかもしれません。MOSAへも、売り切れ後に「チケット何とかならないか?」という問い合わせが相次いだそうですが、それは流石に無理(問い合わせ先が違う)と言うものです(笑)。

    ご存じのとおり、WWDCのセッション等で話された内容はNDA(秘密保持契約)扱いですので、それらの詳細を一般開示することはできません。ただしキーノートだけはNDAが適用されず、自身のコラムや記事等で自由に言及してもOKです。ですから、キーノートに関する情報や解説、そして各関係者の感想は、雑誌や関連ウェブサイトに氾濫しています。筆者としては「iPhone OS 2.0」「iPhone G3」「App Store」「Mobile Me」などについては、前々から聞いていた噂に近い内容でしたので、それほどの驚きはありませんでした。それより「Snow Leopard」に関しては、キーノート内で詳細を紹介してほしかったと思います。どう見ても時間切れのため午後からのセッション(キーノートの延長だった)に回された感が強く、結局、その内容の開示は不可となってしまいました(Apple社のウェブサイトに少し開示されている)。

    Apple社と四半世紀の間付き合ってきた筆者が、今回のキーノートで最も感慨深く眺めたのは「三本足のスツール(背もたれのない一人用腰掛)」のスライドでした。このスツールの三本足ですが、Jobsいわく、Apple社を支える3本柱のMac、Music、iPhoneだそうです。Apple社は、iPod登場以前の20年近くをMacintoshという「一本柱」だけで生き抜いて来ました。それも製品シェア数パーセントのビジネス環境で、です。よく考えると(考えなくてもか…)ビジネスの世界において、これは奇跡的な事かもしれません。途中で、この一本柱を削りもう一本の柱を立てようとして(クローン容認とOSライセンシング)あやうく本体が倒れそうになりましたが(笑)その柱がついに3本になったことを直接Jobsから聞ける時代が訪れようとは、ただただ感激です。

    ところで足が3本に増えたとは言え、スライドに映ったスツール、安心して座るのには少し不安定な感じが漂っていることにお気づきでしょうか(笑)。筆者が今回のWWDCに参加して感じたのは、「Apple社は、このスツールに新たな4本目の足を追加しようとしているのでは?」と言うことでした。そして、4本足をそれぞれ臍(ホゾ)で接ぎ(お互いに補強し)より丈夫で安心して座れるものを作ろうとしているように感じました。4本目の足が具体的に何なのかは、今のところは謎のままです。各足をハードウェアに例えるなら、Apple TVや噂になっているタブレット型Mac(iTouch?)なども候補かもしれません。
    しかし、Apple TVはMusicにまとめて「メディア」と呼べそうですし、タブレット型MacはiPhoneも含めて「モバイル」へと格上げできそうです。

    4本目の足は、Apple社が今のところまったく参入していない分野がターゲットとなる可能性が高いように感じます。今回のWWDCでは、それに対する幾つかのヒントが提示されていたのかもしれません。まず最大のキーワードは「ビジネス」と言う単語でしょうか? あちらこちらでプンプン臭っていましたね(笑)。iPhone OS 2.0は、Exchange対応を含めてビジネス分野のサポートが大きく強化されました。また、Snow LeopardでもExchangeがサポートされることが明言されています。「iPhone Developer Program」に参加している企業が、Fortune誌による500のトップ企業の中の35%をしめている点も強調され、Mobile Meに関しても、現在は「Exchange for the rest of us」だそうですが、状況によってはビジネス分野への展開や拡張もありそうな雰囲気です。

    iPhoneが関わる分野についてはまだ始まったばかり、これからが勝負であり、おのずとビジネス分野への参入準備を整えることができます。しかし、Mac(パソコン)に関しては、すでに存在している「別勢力」を大きく浸食する必要があります。逆に言えば、それだけ奪取できる大きなシェア(チャンス)が残されているという事にもなります。筆者は、Apple社は、こうしたビジネス
    分野へ進出するための「切り札」を持っていると考えています。それは「Mac OS Xのライセンシング」です。前にも書きましたが、この切り札は1本足の時に大失敗したビジネスモデルの再演となります。しかし現在、足は3本もあるわけでして(笑)1本に若干の悪影響が出たとしても、残りの2本でそれをカバーできる(逆に効果を得られる)だけの余裕もあるはずです。

    この場合、ライセンシングはすべての分野に及ぶ必要はなく、コンシューマ分野については、Macintoshというブランドを維持すれば良いわけです。つまり、ターゲットをビジネス分野のみに絞るという作戦です。例えば、パソコンを生産をしていないSunやIBMと提携して、Mac OS Xを搭載したマシンをビジネス分野へ販売してもらうと言うのはどうでしょうか? CPUをインテル x86へ切り替えたMacに、もはやハードウェア的制約はありません(どこでも簡単に作れる)。また、こうした企業は、ハードウェア販売による利益ではなく、システムインテグレートやそのサービスを含めたソフトにより収益をあげています。ですから、その末端ツール(クライアント)として、システムの能力を正当に引き出せ、ユーザ側にとっても管理しやすい優秀なOSが確保できるのであれば、何の文句も無いでしょう。

    Mac OS Xがライセンシングされれば、ひょっとするとDellやHPといたメーカも諸手を挙げて喜ぶかもしれません(笑)。Apple社にとっては、それが製品的には何ら面白みのない黒い箱の中で起動されようとも、Mac OS Xのシェア・アップが「4本足のエコシステム」の形成には重要なはずです。実際のところ、個人的にも「Mobile Me」や「App Store」のコンシューマ展開の方が面白
    そうですし、ビジネス分野(何をそう呼ぶかが問題ですが…)で使われるiPhone用アプリにもあまり興味がありません。また、Jobs自身も「ビジネスマシン」などという製品分野には、ほとんど興味が無いでしょう(彼がビジネス回りの話をする時、いつもちょっと嫌そうな雰囲気が漂う)。しかし、そこから得た利益や情報、経験、知識が、より良いコンシューマ製品(Apple社らしい)の開発へと反映されるのなら、小さな労力で大きな効果を上げられる戦略だと思います。

    筆者としては、Apple社がコンシューマの世界に新風を吹き込んでくれる画期的な製品を出し続けてくれるのが一番です。デベロッパーの一人として、そうした画期的な製品から刺激を得て、それを成長させるためにソフトウェア(アプリケーション)開発で貢献できれば、こんな楽しいことはありません。そのためには、新たな収益を求めてビジネス分野へ足を踏み込むことも必要だと考
    えます。会社自体が健全経営で収益を上げ、優秀な人材を確保し、適切な研究開発費を捻出できなければ、決して良いものは作れません。正直言って、1本足を削っていた時代のWWDCには暗い雰囲気が漂っていました。毎年技術チームのエンジニア(社員)は交代し、提示される技術内容も貧弱で魅力無く、デモする彼らからは自信のカケラも感じられませんでした。今回、各セッションを
    熱く堂々と仕切る若いエンジニア達を見ながら、そんな昔を思い出してしまいました。

    来年のWWDCのキーノートでは、美しきスツールのために「4本目の足」の話が中心となることを期待したいと思います。
                                     以上

    ターミナルの向こうから      第27回  海上 忍

    〜 プレインテキストで文書作成(1)〜

    ・プレインテキストが最強?
     文書フォーマットには、Wordや一太郎などプロプライエタリなものから、HTMLやODFなどオープンなものまで、さまざまな種類があります。開発用の文書は、後日のメンテナンスや普遍性を確保するためにも、「README」のようなものも含めオープンなフォーマットを選択したほうが無難なことは敢えて述べるまでもないでしょう。
     なかでも最強は「プレインテキスト」です。表組や図版などの要素を含めることはできませんが、文字コードの相違さえ注意すれば、万人が利用できる陳腐化の危険性がほとんどない文書となります。前述の「README」も、プレインテキストが相場ですよね?
     以前紹介したTeX / pLaTeX2eも、ファイルフォーマットとしてはプレインテキストに分類されます。しかし、内容はソースコードに近く、決められた文法・書式に従い書き進めなければなりません。美麗な文書を作成できますが、その手間も相当なものです。
     今回紹介する「plain2」(プレインツー)は、プレインテキストを解析してTeX / pLaTeX2eファイルに変換するというツールです。近年ではUNIXユーザの間でさえ話題になることも少なく、過去のものとして忘却された方も多いのではないかと思います。しかし、プレインテキストからTeX文書を生成する機能を持つツールは他に例がなく、いまだ高い利用価値を有しています。

    ・plain2をインストール
     内田昭宏さんが開発したplain2は、いわゆるオープンソースソフトウェアです。しかし、近年ではメンテナンスを行う方が不在なようで、plain2を収録するLinuxディストリビュータも減っています(未確認ですが、現在ではほとんど収録されていないはずです)。Mac OS Xで利用しているという話を耳にしたこともないので、Mac OS Xユーザを対象としたインストール手順の紹介は本邦初公開かもしれません。
     具体的な手順は、以下のとおりです。ターミナルを起動し、コマンドラインをコピー&ペーストし実行するだけですが、終盤「make」を実行する前、リスト1とリスト2のパッチを当ててください(当てなければMac OS Xではコンパイルが通りません)。また、pLaTeX2eの処理系が必要ですので、本連載のバックナンバーを参照するなどして、利用している環境に応じたパッケージをインストールしておきましょう。

    - - - - -
    $ curl -O http://http.debian.or.jp/debian-jp/pool/main/p/plain2/plain2_2.54p1.orig.tar.gz
    $ curl -O http://http.debian.or.jp/debian-jp/pool/main/p/plain2/plain2_2.54p1-4.2.diff.gz
    $ tar xzf plain2_2.54p1.orig.tar.gz
    $ cd plain2-2.54p1.orig
    $ gzcat ../plain2_2.54p1-4.2.diff.gz | patch -p1
    $ cd src
    (リスト1とリスト2のパッチを当てる)
    $ make
    $ sudo cp plain2 /usr/local/bin/
    - - - - -
    
    - - - - - - -
    リスト1:src/macro.c
    
    --- macro.orig  2008-06-19 08:27:48.000000000 +0900
    +++ macro.c 2008-06-19 08:53:50.000000000 +0900
    @@ -8,7 +8,7 @@
    
    #include 
    #include 
    -#include 
    +#include 
    #include "plain2.h"
    #include "macro.h"
    
    @@ -189,9 +189,7 @@
           buf++;
       }
    }
    -putMacro(macroNum, va_alist)
    -int    macroNum;
    -va_dcl
    +putMacro(int macroNum, ...)
    {
       va_list ap;
       union   macroArg {
    @@ -226,7 +224,7 @@
           }
           mip = mip->cmac_next;
       }
    -   va_start(ap);
    +   va_start(ap, macroNum);
       for (i = 1; i <= maxarg; i++) {
           switch(argtype[i]) {
               case ATYPE_VOID:
    - - - - - - -
    
    - - - - - - -
    リスト2:src/plain2.h
    
    --- plain2.h.orig   2008-06-19 08:47:49.000000000 +0900
    +++ plain2.h    2008-06-19 08:48:15.000000000 +0900
    @@ -342,7 +342,7 @@
    
    extern char    *malloc();
    
    -#define    INTERNAL_CODE   CODE_EUC
    +#define    INTERNAL_CODE   CODE_SJIS
    
    #ifdef BSD
    #include 
    - - - - - - -
    


    ・まずはかんたんなテストから
     plain2は、プレインテキストを日本語LaTeX(またはtroff形式)に変換する機能を持ちます。たとえば、カレントディレクトリに「plain.txt」というSJISエンコードのプレインテキストがあるとき、以下のとおりコマンドを実行すれば、「output.tex」という日本語LaTeXファイルが得られます。これをplatexコマンドでタイプセットし、生成されたDVIファイルをdvipdfmxコマンドでPDFに変換すれば、TeXで整形された文書の完成です。

    - - - -
    $ plain2 -tex plain.txt > output.tex
    - - - -
    


     プレインテキストの内容は、基本的には平文そのままで構いませんが、いくつかの約束事があります。特に重要なポイントとしては、以下のものが挙げられます。

    1. 空白行で段落行の区切りを示す。空白行を設けない場合、行詰めのうえ出力される。
    2. 行頭に「・」(中黒)や「-」(半角ダッシュ)を置くと、その行は項目型リストとして出力される。
    3. 行頭にアルファベット1字、またはローマ数字を置くと、その行は数値型リストして出力される。半角ドットまたは両側 / 右側にカッコが必要。
    4. 「-」や「+」、「=」などの記号で作成した表は、LaTeXのtabular環境として整形される。

     ごくかんたんな例ですが、以下のリストを適当なファイル名(文字コードはSJIS)で保存し、plain2とplatex、dvipdfmxで処理してください。ただのプレインテキストではない、整形されたPDFを得られるはずです。次回紹介予定の表組みテクニックを取り入れれば、さらに美麗な文書になるのではと思います。

    - - - - -
    吾輩(わがはい)は猫である。名前はまだ無い。
    
    どこで生れたかとんと見当(けんとう)がつかぬ。何でも薄暗いじめじめした
    所でニャーニャー泣いていた事だけは記憶している。
    
    - 夏目漱石
    - 吾輩は猫である
    
    a. 「ホトトギス」1905(明治38)年1月〜8月
    b. データは青空文庫より
    - - - - -
     


    - - - - -
    $ plain2 -tex test.txt > output.tex
    $ platex output.tex
    $ dvipdfmx output.dvi
    - - - - -
    

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

     

     MOSA Developer News   略称[MOSADeN=モサ伝]
            配信停止 mailto:mosaden-ml@mosa.gr.jp
     記事内容に関するご意見 mailto:mosaden-toukou@mosa.gr.jp
          記事投稿受付 http://www.mosa.gr.jp/?page_id=850
    Apple、Mac OSは米国アップル社の登録商標です。またそのほかの各製品名等
    はそれぞれ各社の商標ならびに登録商標です。
    このメールの再配信、および掲載された記事の無断転載を禁じます。
    特定非営利活動法人MOSA  http://www.mosa.gr.jp/
    Copyright (C)2007 MOSA. All rights reserved.

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

    2008-06-10 

    目次

    • りんご味Ruby         第26回  藤本 尚邦
    • 藤本裕之のプログラミング夜話   #139
    • 高橋真人の「プログラミング指南」  第137回

    りんご味Ruby   第26回  藤本 尚邦

    テストプログラム test-yahoo-honyaku.rb を実行すると top_page_opened? が実装されていないためにエラーとなりました。そこで今回は YahooHonyakuクラスのインスタンスメソッド top_page_opened? の実装から始めます。

    YahooHonyaku#top_page_opened? は、YahooHonyakuオブジェクトが「ヤフー翻訳のトップページをすでにGETしているかどうか?」の真偽値を返します。実装は以下のようになります:

    def top_page_opened?
      @top_page_opened ? true : false
    end
    


    3項演算子「?」を使って、インスタンス変数 @top_page_opened が真ならtrue を 偽なら false を返しています。

    ■ インスタンス変数

    Rubyでは、名前の先頭に「@」をつけることによりインスタンス変数を表します。@top_page_opened は YahooHonyakuクラスのインスタンス変数ということになります。インスタンス変数を宣言する必要はなく(そもそも変数を宣言するための特別な構文がありません)、上の @top_page_opened の様にいきなり使うことができます。初期値は nil です。

    オブジェクトの生成時にインスタンス変数に初期値を与えたい場合には、オブジェクト生成直後に必ず呼ばれるインスタンスメソッド initialize の中に実装するのが良いでしょう(例):

    def initialize
      @top_page_opened = false
    end
    


    インスタンス変数はオブジェクトの外に対して非公開(private)です。外からインスタンスの値にアクセスしたい場合はアクセッサとなる公開メソッドを用意する必要があります。

    ■ Rubyの真偽値

    if、unless、while、until、3項演算子の「?」など条件分岐のある式において、条件節の真偽は以下のように判定されます:

    偽 — false または nil
    真 — false でも nil でもない全ての値(つまり偽でない全ての値)

    もちろん0を含めて全ての数値も真となります。Cプログラマの方々、0は偽ではなく真ですよ、ご注意ください。

    ■ メソッド名の最後についている「?」は何?

    Rubyでは、メソッド名の最後に「?」と「!」を使うことができます。これは単にメソッドの名前に使えるという以上の意味は持ちません。慣習として、「?」で終わる名前は真偽値を返すメソッドに、「!」で終わる名前はオブジェクトの状態を変える破壊的メソッドによく使われます。しかし、これはあくまでも慣習であって、そのメソッドに特別な意味を与えたり振る舞いに影響したりするわけではありません。

    ■ メソッドの返す値

    メソッド実行時に最後に評価された結果の値がメソッド実行の結果となります。ですから top_page_opened? は、@top_page_opened の値の真偽により true または false を返します。

    ■ 補足 — returnについて

    ところで、C言語系統のプログラマの方は top_page_opened? の中で、returnが使われていないことにむず痒さを感じませんでしたか?

    def top_page_opened?
      return @top_page_opened ? true : false
    end
    


    あるいは

    def top_page_opened?
      if @top_page_opened
         return true
      else
         return false
      end
    end
    


    のように書きたいなど…この場合(単純なメソッド定義)に関しては、return を使おうが使うまいがおそらく期待したとおりに動きます。動くのですが、私の経験上、必要のないreturn式は使わないことをおすすめします。使う場合には、return式の仕様(C言語ほど単純にはすまない)をしっかりと理解していないとドツボに嵌まる可能性があります。

    Rubyを使い込んでくると、手続きオブジェクト(あるいはブロック)を値として扱う機会が増えてくるはずです。手続きオブジェクト(あるいはブロック)は、プログラムの部分を値として扱うというような意味を持ちます(Lispでのlambda式に相当)。

    手続きオブジェクト(あるいはブロック)の手続き本体が実行されるときに、その中で使っているreturn式が「何から」戻るのかというのを考えてみてください。その手続きから戻るのか? あるいは手続きを定義している外側のメソッドから戻るのか?そもそも戻りたいときに外側のメソッドは存在するのか? などなど…

    return式には、プログラマが無意識に期待する振る舞いと仕様(=処理系実装)との間に、気付きにくい違いが出てしまうことがあります(私自身が何度かはまっています)。Ruby処理系の開発チームでもこのことは気にしていて、どうすべきか思案していたようなので、Ruby 1.9 では何らかの変更が入っているかもしれません(未確認)。ですが、return 式の仕様をきっちり理解するまでは、必要なとき以外returnを使わないような習慣をつけておいた方がよさそうです。

    なんだか煙に巻くような説明になってしまいましたが、いずれ手続きオブジェクトの話を書く機会がきたら、そのときに、1.9の仕様を確認した上でもう少しきちんと説明したいと思います。

    ■ 今回のコードをテストしてみる

    説明が長くなってしまいましたが、今回書いたコードをテストしてみましょう。

    $ ruby test-yahoo-honyaku.rb
    (中略)
    1) Error:
    test_s_translate(TestYahooHonyaku):
    NotImplementedError: まだ実装してねぇ、誰か書いてくれ!
      ./yahoo-honyaku.rb:15:in `open_top_page'
    (中略)
    2 tests, 0 assertions, 0 failures, 2 errors
    


    となりました。ということで次回は open_top_page を実装することになりそうです。

    ■ まとめ

    ・先頭に「@」のついた名前がインスタンス変数を表す
    ・メソッド名の最後に「?」と「!」を使うことができる
    ・慣習として「?」で終わる名前は真偽を返すメソッド名に使われる
    ・慣習として「!」で終わる名前は破壊的なメソッド名に使われる
    ・不要なreturnは使わない習慣をつけよう

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

     前回、「バンドルソフト」というものの数々の利点、メリットを並べ立ててみたわけであるが、忌野清志郎が歌うように世の中「いいことばかりはありゃしねぇ」。光りあるところに影があるというか、広い目長い目にゃんこの目で観ると(にゃんこの目は関係ないか)それほど手放しで喜べることばかりではない、なかったというところを挙げてみたい。

     誰しもがまず考えつくであろう問題は「ハードのおまけのソフトは『おまけ』品質だと思われてしまう」ということだろう。われわれソフト業界の人間から見れば、ハードメーカーがあるソフトウエアを自社製品にバンドルしようと思うのは、その製品が他者の同種のソフトより勝っている(まぁそれが性能ではなく値引きその他の営業努力に負うものである場合があるとしても、だ)からだ、と思われる。思ってたでしょ?

     ところが世間一般のモノの見方というのは違うのである。というか、我々だって自分の業界を離れれば違う常識の中で生きているんだよね。例えば「グリコ」のおまけに入っているおもちゃはどう考えても店で単体で売ってるおもちゃと同等ではない。「りぼん」の付録のなんとかちゃんパスケースは、たしかにビニールで作ってあるオリジナル・デザインだけれども耐久性に乏しくすぐ破ける。小学館の学習雑誌の組立付録、「懐中電灯で楽しめるスライド幻灯機」は相当しっかり作らないと中にセットする懐中電灯の重みで自壊した。だって厚紙なんだもの(笑)。

     ワタシが子供のころカルビーがカードのおまけがついた「仮面ライダースナック」というのを流行らせて、そのカード欲しさにこれを買ってお菓子の方を食べない子供がいると問題になったことがあった。……たしかにあれは美味しくなかった。子供心に「これがえびせんだったら売り上げが倍増するだろうにカルビーはバカだ」と思ったのを覚えてる。けどさ、それでも店でカネを払ってカードだけ貰ってくる子供はいなかった。やっぱり「おまけはおまけ」なんですわ。

     総括する。すくなくとも20世紀後半から21世紀初頭、すなわち現在に至るまでの世間的常識では、なんかの商品を購入した場合に「おまけ」として添付されてくるものはそのためにわざわざ制作されたものであり、故に投下されているコストもおのずと知れている。すなわち結論として、それ単体で商品として流通するだけの価値を持たない品質だ、とこういうことになっているのである。

     ここでわれわれは当然、ソフトウエアの場合は全く違って、ただ流通している商品をコピーすればいいのであり、わざわざ品質の劣る「おまけ用」を作るほうがバージョン管理、ユーザサポートなどの面でコスト高なんである、と反論したくなるわけだが、それがまた落ち込んだ穴の中でさらに墓穴を掘るように作用してしまったのである。

    「ほら、奥さん。ソフトウエアはちゃうんです。このソフトは確かにおまけやけど、キレイな箱とか印刷されたマニュアルがないだけで、店で売ってるのと同じように使えますんや」
    「あらほんまやわ。そゆこと、なんで早う言うてくれんの。ソフト屋さんっていけずやわ」

     と、納得してくれるようなユーザは、「ソフトウエアっておまけでもちゃんとした商品」と思ってくれる代わりに「ソフトウエアっておまけに付いてくるやつで十分」と学習してしまう。これを難しい言葉で言うと(たまには難しい言葉を使わないとまじめな論考であると思ってもらえないからな)、こんな風にバンドルソフトというのは「市場におけるソフトウエアのハードウエアから
    の独立性を阻害する」という側面を持っていた、と言えるわけだ。
     
     しかもこの事態は、遠い昔、メインフレームやミニコンを企業に納入する際にその費用の内訳におけるハードとソフトの割合を調整したというたぐいの話ではない。ユーザーの側が、自分の払ったお金はすべて「コンピュータの対価」と思ってるのはあの頃と同じだが、今度の場合は文字通りホントにその通りなのである。下手をするとバンドルソフトの作り手への分け前は、「グリコ」のおまけを作ってる業者より少ないのではなかろうか。

     でもバージョンアップが美味しいんだからいいぢゃん、と前回本稿もお読みになったマメなあなたは言うかもしれない。確かにその筈でした。……でもそういう「損して得取れ」みたいな悠長な時代は20世紀と共に終わってしまったのである。しかもおそらくはこの業界の人が誰も予想しない(少なくとも予想していた人をオレは知らない)形で。では次回はその話。
                           (以下次回 2008_06_06)

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

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

    〜XcodeによるPowerPlant X入門(26)〜

     こんにちは、高橋真人です。
     さて、MyViewが継承しているPPx::PushButtonがどのようにしてボタンコントロールを描いていたかが分かったところで、MyViewの本来の目的であるPushButtonのカスタマイズに取りかかりましょう。
     まずは、今までやっていたことの延長線上ということで、見た目についてのカスタマイズをやってみます。せっかく、PushButtonが描いてくれるボタンの外見があるのですから、これを生かした形での拡張をしてみます。
     それでは、例によってコードを。プロジェクトは前のを複製してPPxForXcode08としてからやってください。今回の修正個所はわずかです。MyView.cpのDoControlDrawメンバ関数の実装のみです。以下の通りに書き換えます。

    OSStatus
    MyView::DoControlDraw(
      PPx::SysCarbonEvent&    ioEvent,
      ControlRef              inControl,
      ControlPartCode         inPartCode,
      RgnHandle               inClipRgn,
      CGContextRef            inContext)
    {
    #pragma unused (ioEvent, inControl, inPartCode, inClipRgn)
    
      ioEvent.CallNextHandler();
    
      PPx::CGContextSaver saver(inContext);
    
      if (IsControlHilited(inControl) and IsActive()) {
          CGContextSetBlendMode(inContext, kCGBlendModeColorDodge);
    
          HIRect frame;
          GetLocalFrame(frame);
    
          CGContextSetRGBFillColor(inContext, 1.0, 0.0, 0.0, 0.5);
          CGContextFillRect(inContext, CGRectInset(frame, -2.0, -2.0));
      }
    
      return noErr;
    }
    


     さっそく走らせてみましょう。ちなみに今回使用しているCGContextSetBlendMode()が10.4以降でしか使えないので、10.3では動かせません。
     さて、走らせてみてどうでしたか?
     ボタンをクリックした時に、通常青っぽくハイライトするはずが赤っぽくなるのが確認できましたでしょうか。
     簡単にコードを解説します。
     まず中ほどのif文ですが、この部分はコントロール(View)がハイライト状態になっているかどうかを判定して、もしハイライト状態であればボタンの上に赤い四角を描いています。CGContextSetBlendMode()という行をコメントアウトして走らせてみると、単純にボタンの上に透明な赤い四角が描かれているのが分かります。ColorDodgeというブレンドモード(表示を重ねた時の表現の仕方)にすることでボタンコントロールの表示部分(つまり、白くない部分)が赤い色の影響を受けて染められることになります。染まり方がちょっと怪しいですが(笑)、まあその辺は気にしないということで…
     それから、関数冒頭のioEvent.CallNextHandler()というのが、表示部分のポイントです。この部分が、正に前回の結果を受けて「ボタンコントロールの表示を“先に”行っている」部分です。
     前回までは関数の最後でeventNotHandledErrを返すことで、継続してドローイベントを後続のハンドラに渡していました。ですが、ハンドラの処理においては後続するハンドラを“先に”処理させたい場合があるわけです。正に今回のようなケースです。そういう場合のためにCarbonイベントには「次のハンドラを呼ぶ」というやり方があります。
     Carbonイベントのプログラミング経験のある方なら必ずイベントハンドラを一度は書いたことがあるはずでしょうが、このイベントハンドラの第一パラメータにあるCallEventHandlerRefというものが何なのかが気になったことはないでしょうか?
     このパラメータは、正にこのためだけに用意されていると言ってもよいものです。この引数を使ってCallNextEventHandler()という関数を呼び出すことで、通常は“後に”呼ばれるはずのイベントハンドラを“先に”呼び出すことができるのです。
     PPxの場合、イベント絡みの情報は処理する関数(今回はDoControlDraw)に直接渡されるのではなく、ioEventという名前のSysCarbonEventクラスのオブジェクトの中にまとめられた形で渡されてきます。ですから、このオブジェクトのCallNextHandler()というメンバ関数を呼び出すことで同様のことが行われる形になっています。
     ところで、最初に説明したコントロールがハイライト状態になっているかを判断するif文のところで「コントロールがアクティブであるか」を併せて判断しているのは、この条件判断を外してためしてみれば分かりますが、ボタンをクリックしてアラートが表示された際に、コントロールのハイライト状態が残ってしまうからです。(andというのは、C++における&&演算子の別名表記で
    す)

     次回からはさらに細かいカスタマイズに取り組んで行きたいと思います。

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

     

     MOSA Developer News   略称[MOSADeN=モサ伝]
            配信停止 mailto:mosaden-ml@mosa.gr.jp
     記事内容に関するご意見 mailto:mosaden-toukou@mosa.gr.jp
          記事投稿受付 http://www.mosa.gr.jp/?page_id=850
    Apple、Mac OSは米国アップル社の登録商標です。またそのほかの各製品名等
    はそれぞれ各社の商標ならびに登録商標です。
    このメールの再配信、および掲載された記事の無断転載を禁じます。
    特定非営利活動法人MOSA  http://www.mosa.gr.jp/
    Copyright (C)2007 MOSA. All rights reserved.

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

    2008-06-03

    目次

    • 「「Wonderful Server Life」    第71回   田畑 英和
    • 小池邦人のCarbon視点でCocoa探求
    • ターミナルの向こうから      第26回  海上 忍 

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

      〜Open Directory編〜

     前回までOpen Directoryへの接続方法や設定内容について解説してきましたが、今回はさらに掘り下げてどのような処理が内部的に行われているかをみていきたいと思います。いったいなにが行われているのかを理解しておくことはトラブルシューティングなどにも役に立ちます。

    ◇ユーザ認証
     「ディレクトリユーティリティ」でOpen Directoryへの接続を行う時にネットワークユーザとの関連付けおよびアプリケーションの自動設定を行うと、設定後にログアウトを求められます。
     アプリケーションの自動設定時にメール/iCal/iChatにアカウントが自動登録され、シングルサインオンを実現するKerberos認証が設定されることは前回解説しましたが、設定後に再ログインすると接続したOpen DirectoryサーバからKerberosのチケットを自動的に取得します。チケットとはKerberosにおける認証情報のことですが、「/システム/ライブラリ/CoreServices/Kerberos」を使って取得済みのチケットを確認できます。

    ・Kerberosのチケット(TGT)の確認
    http://www.htabata.com/Site/LeopardServer/Pages/DirectoryUtility.html#26

     このときKerberos認証は設定時に関連付けたネットワークユーザに対して、サーバ上で行われますが、関連付けたネットワークユーザのパスワードはローカルユーザのパスワードと同期していますので、ローカルユーザとしてログインすればKerberos認証が行われます。
     つまり、ローカルユーザでログインするだけでKerberosによるシングルサインオンが有効な状態になっているということです。シングルサインオンが有効になると、あらかじめKerberos認証を使うように自動設定されていたメール/iCal/iChatではパスワードを入力することなく各サービスを利用することができます。さらにサーバ上のAFPサービスもKerberos対応していますので、他のKerberos対応サービスでもシングルサインオンが可能になります。ファイルAFPサービスへのアクセスには関連付けたネットワークユーザが用いられます。他のユーザとしてアクセスしたい場合には、サイドバーからサーバに接続することで任意のユーザとしてアクセスできます。

    ・各サービスにアクセスしたときのKerberosチケット
    http://www.htabata.com/Site/LeopardServer/Pages/DirectoryUtility.html#27

    ◇ネットワークユーザとの関連付け
     ではなぜローカルユーザでログインすると、サーバ上のネットワークユーザでKerberos認証ができるのでしょうか。ローカルユーザのアカウントの情報を詳しくみてみるとその仕組みが分かります。
     ユーザアカウントにはユーザ名やユーザIDなど様々な属性がありますが、その中には認証方式を設定するための属性(AuthenticationAuthority)もあります。ローカルユーザはデフォルトの状態で認証方式としてシャドウパスワード(ShadowHash)が設定されており、認証はクライアント上で行われます。さらにLeopardからはサーバ上だけでなくクライアント上でもKerberosが用いられていますので、ローカルのKerberosも認証方式のユーザ属性として設定されています。

     ネットワークユーザとの関連付けを行うと、ローカルユーザの認証方式が自動的に変更され、サーバ上でのKerberos認証が可能になるのです。ネットワークユーザと関連付けたローカルユーザのユーザレコードを確認すると認証方式として、次の2つが設定されていることを確認できます。

    ・認証方式
      - LocalCachedUser
      - Kerberosv5
    


     まず1つ目のLocalCachedUserですが、この属性を参照すればサーバ上のどのユーザと関連付けを行ったかが分かります。そして2つ目のKerberosv5ではサーバ上のネットワークユーザによるKerberos認証が設定されています。

    ・認証方式(LocalCachedUser)のパラメータの例
    http://www.htabata.com/Site/LeopardServer/Pages/DirectoryUtility.html#4

     このようにローカルユーザの認証方式を変更することによってローカルユーザを使いつつ、サーバ上のネットワークユーザを使ったKerberosによるシングルサインオンを実現しているわけです。シングルサインオンを実現するのであれば、サーバ上のネットワークユーザを直接使用するという従来の方法ももちろんあるわけですが、この場合ネットワークホームの運用なども別途考慮しなければなりません。
     ところが、ネットワークユーザとの関連付けというLeopardでの新機能を使うことによって、今までどおり既存のローカルユーザを使いつつ、さらに簡単な設定を行うだけでサーバのサービスも効率的に使えるようになるというわけです。ユーザごとに使用する端末が固定しているような環境では有効な方法となるでしょう。

     さて、これまで主に基本構成のLeopard Serverを中心に解説をしてきましたが、次回はからは「サーバ管理」を使った各種サービスの管理について解説していく予定です。
    次回へつづく                             

    小池邦人のCarbon視点でCocoa探求(2008/05/30)

    〜 Image Kitで可能なことは何か? 〜

    前回では、TableViewの代わりに「Image Kit」のIKImageBrowserView(画像ブラウザ機能)クラスを使うことに決めました。ImageBrowserと名称が付いているわけですから、画像のリストアップには最適ではないかと思うのですが、さてどうなのでしょうか?

    ImageBrowserの機能を実際に使ってみる前に、せっかくですのでImage Kitを使うと何が可能なのかを調べてみましょう。まず注意すべきは、Image KitはLeopard(Mac OS X 10.5)以降でないと使用できない点です。今回開発しているアプリケーションの利用環境はMac OS X 10.5以上と設定しているので問題ありませんが、それより下位バージョンのMac OS Xも動作環境に想定されていると、残念ながらImage Kitを利用することはできません。Image Kitは「PDF
    Kit」や「QuartzComposer」と同様に、Quartz Frameworkに含まれています。そのクラス(ヘッダファイル)の先頭には「IK」という接頭語が付きますので、他のクラスと簡単に区別することができます。

    Cocoaで画像関連のアプリケーションを開発する場合、NSImageやNSBezierPathといったCocoaネイティブの描画機能に加え、Quartz 2D、OpenGL、ImageI/O、Core Image、Core Animation、QuartzComposerといった強力なグラフィックス関連のFrameworkを利用することができます。しかし、アプリケーションの目的に応じてこれらのAPIを使いこなす事は、数多くの技術習得という意味も含め、かなり大きな労力を必要とします。そこで、グラフィックス関連で頻繁に使われる典型的な機能(ユーザ操作)を、Cocoaアプリケーションで容易に実現するためにImage Kitが提供されています。これは、QuickTime技術の習得が大変困難なのをカバーするために、より簡易的でCocoaとの親和性が高い「QTKit」が用意されているのと同じ理由です。

    そう言う意味では、Image KitはMac OS Xのグラフィック能力を十二分に生かせるよう、よりローレベルのFrameworkの能力をフル活用してくれます。 Image Kitの基本的な利用方法を解説した技術ドキュメントは「Image Kit Programming Guide」です。 各クラスのメソッド等の一覧については「Image Kit Reference Collection」の方を参照してみてください。

    「Image Kit Programming Guide」

    http://developer.apple.com/documentation/GraphicsImaging/Conceptual/ImageKitProgrammingGuide/Introduction/chapter_1_section_1.html

    「Image Kit Reference Collection」

    http://developer.apple.com/documentation/GraphicsImaging/Reference/ImageKitReferenceCollection/ImageKitReferenceCollection.pdf

    Image Kitの各機能は対応するクラスに分かれ実装されていますので、まずはそれらを簡単に紹介したいと思います。各クラス定義は、Image Kitのヘッダファイルと一対一で対応していますので、その内容を参照すればさらに理解が深まると思います。

    ・ IKImageViewクラス

    IKImageViewはNSViewのサブクラスとして実装されており、画像イメージの表示とその編集を行うことができます。「プレビュー」アプリケーションで利用されている数多くの機能が取り込まれており、このクラスを用いることで簡単に画像ビューアを作成できます。サンプルソースコードとしては「IKImageViewDemo」というビューアのデモがあったのですが、幾つかのバグのためか、現在はデベロッパサイトから削除されています。

    ・ IKImageEditPanelクラス

    画像イメージのカラーやガンマ、エフェクトを編集するためのパネルを表示することができます。 このパネルは「プレビュー」アプリケーションで表示されるカラー調整パネルとよく似ています。

    ・ IKImageBrowserViewクラス

    「しんぶんし3」で実装する予定のクラスです。複数の画像を表示、選択するためのブラウザ機能を提供します。 Apple社のデベロッパーサイトに、サンプルソースコードとして「ImageBrowser」が用意されています。

    http://developer.apple.com/samplecode/ImageBrowser/

    ・IKSlideshowクラス

    「Quick Look」で実行できる画像スライドショーとまったく同じスライドショーを実行することが可能となります。Apple社のデベロッパーサイトに、サンプルソースコードとして「IKSlideshowDemo」が用意されています。

    http://developer.apple.com/samplecode/IKSlideshowDemo/

    ・ IKPictureTakerクラス

    iSightやデジタルカメラから画像(サムネイル)を取り込むことが可能です。画像にはエフェクトも加えられます。Apple社のデベロッパーサイトに、サンプルソースコードとして「PictureTaker」が用意されています。

    http://developer.apple.com/samplecode/PictureTaker/

    ・ IKSaveOptionsクラス

    IKImageEditPanelクラスと同時に用い、画像保存時にフォーマットとオプションの設定を行います。画像ファイルに対して保存用ダイアログ(シート)を表示した時に、ポップアップメニューから画像の種類とオプション(圧縮率や圧縮の種類など)を選択することが可能です。

    それ以外にも、Core Imageの機能を補完するための(Core Imageフィルタをさらに活用しやすくする)機能を幾つか有しています。Core Imageのフィルタ用ブラウザとしては IKFilterBrowserViewクラスとIKFilterBrowserPanelクラスが、フィルタのパラメータ編集用としてはIKFilterUIViewクラスが用意されています。

    例えば、アプリケーションパッケージ内のResourcesフォルダからimage.jpgファイルを読み込んでKImageViewに表示させるには、おおよそ以下のようなソースコードを記述すればOKです。

    IBOutlet IKImageView  *imageView;       //  Interface Builderから
    NSDictionary          *imageProperties;  //  インスタンス変数
    
    - (void)awakeFromNib 
    {
     CGImageRef   image=NULL    
     NSString      *path=[[NSBundle mainBundle] pathForResource: @"image" 
                                                               ofType: @"jpg"]; 
     NSURL        *url=[NSURL fileURLWithPath: path]; 
    
     image=CGImageSourceCreateImageAtIndex(isr, 0, NULL);  //画像を読み込み 
     imageProperties=(NSDictionary*)CGImageSourceCopyPropertiesAtIndex(isr,
                                         0,(CFDictionaryRef)imageProperties); 
     [imageView setImage: image imageProperties: _imageProperties]; 
                                         // 画像と画像のプロパティを設定 
     [imageView setDoubleClickOpensImageEditPanel: YES]; 
                                             // 色々なオプションを設定 
     [imageView setCurrentToolMode: IKToolModeMove]; 
     [imageView zoomImageToFit: self]; 
     [imageView setDelegate: self]; 
    }


    次は、 IKSlideshowクラスを用いてスライドショーを実行する場合です。スライドショーの開始ソースコードは、以下ような記述となります。

    - (IBAction)start: (id)sender 
    { 
     [[IKSlideshow sharedSlideshow] runSlideshowWithDataSource: 
                     (id)self 
                     inMode:IKSlideshowModeImages  options: NULL]; 
    } 
    


    後は、IKSlideshowDataSourceプロトコルに準拠したクラス(今回はself)を用意して slideshowItemAtIndex:メソッドで渡されるインデクス値(順番)で選択した指定オブジェクト(画像ファイルへのパスなど)を返せば、その内容を表示してくれます。

    -(id)slideshowItemAtIndex: (NSUInteger)index
    {
     NSString  *path;


     // ここでインデックス値(順番)に相当する画像ファイルのパスを得る
     

    return path;
    }
    


    スライドショーの終了ソースコードは、以下のような記述となります。

    (void)stopSlideshow: (id)sender
    {
     [[IKSlideshow sharedSlideshow] stopSlideshow: self]; 
    }
    


    上記の例のように 、Imege Kitを利用すれば、割と簡単な記述のみで画像ファイルに対する高度な操作が実装できることが理解できます。次回は、実際に「しんぶんし3」にIKImageBrowserViewクラスを実装してみることにしましょう。
    つづく                                

    ターミナルの向こうから      第26回  海上 忍

    〜  番外編(2):irbの環境整備〜

     前回は、マルチバイト文字対応のGNU readlineを利用するよう再コンパイルした「irb」をインストールしましたが、そのままではデフォルト(/usr/bin/irb)と挙動が異なります。それでは困る、というirb遣いの方もいらっしゃるはずですから、デフォルトと同じかそれ以上に使いやすいよう、日本語環境向けにカスタマイズする方法を紹介してみましょう。

    ・irbで日本語を扱うときの基本
     前回紹介した方法でインストールしたirbは、「ことえり」などのIMEを利用した日本語入力が可能です。従来どおりターミナルから「irb」と実行すれば、インタラクティブモードに移行しても文字化けすることなく、IMEを使い日本語を入力できます。
     しかし、そのままでは、変数や配列に日本語を含む文字列を代入した場合、バイト列として扱われ、非ASCII文字は8進数で表示されます。これはirbが結果出力にinspectメソッド(デバッグ用出力)を利用するためで、漢字コードが未設定のときにこのような結果となります。

    - - - - -
    $ irb
    irb(main):001:0> print ("モサ伝")
    モサ伝=> nil
    irb(main):002:0> moji = "モサ伝"
    => " 343 203 242 343 202 265 344 274 235"
    - - - - -
    


     このような結果を回避する方法はいくつかありますが、漢字コードを設定することが基本です。ターミナルの文字エンコーディング形式にあわせ、UTF-8を設定しておけばいいでしょう。UTF-8を漢字コードに設定する場合、「irb -Ku」として起動するか、環境変数RUBYOPTに「-Ku」をセットします。irb上で行う場合は、「KCODE=’u'」と実行すればいいでしょう。
     なお、「irb –noinspect」として起動すれば、値が文字列の場合にはそのまま、文字列以外の場合にはto_sメソッドで文字列に変換したうえで出力されます。

    - - - - -
    $ irb -Ku
    または
    $ export RUBYOPT=-Ku
    $ irb
    または(irb実行中に)
    irb(main):001:0> KCODE='u'
    - - - - -
    


     ターミナルを起動するたび環境変数を定義する手間を省きたい場合には、シェルのログインスクリプト(~/.bash_profileや~/.bashrcなど) に「export RUBYOPT=-Ku」の記述を追加します。LANG環境変数もUTF-8に一致させる必要があるので、最低限以下の内容があればいいでしょう。なお、先頭が「.」で始まるファイルは、Finderでは非表示属性となることをお忘れなく、

    - - - - -
    export PATH=/usr/local/bin:/usr/X11R6/bin:$PATH
    export LANG=ja_JP.UTF-8
    export RUBYOPT=-Ku
     ・
     ・
    - - - - -
    


     これで、支障なくirbで日本語を扱うことができるはずです。ファイルをオープンするときなど、irbで作業するときも日本語文字列を使う機会は少なくないため、意外に重宝するのではないかと思います。

    - - - - -
    $ irb
    irb(main):001:0> p "日本語"
    "日本語"
    => nil
    irb(main):002:0> dummy = ["モサ伝","原稿"]
    => ["モサ伝", "原稿"]
    - - - - -
    


    ・irbカスタマイズの基本
     irbは、起動時に初期化ファイルの有無を確認し、存在すれば読み込みます。確認の順序は以下のとおりで、存在しなければシステム標準の設定が適用されます。Mac OS Xの場合、1に挙げた「~/.irbrc」に設定を記述することが、もっともオーソドックスな方法です。

    - - - - -
    1. ~/.irbrc (ホームフォルダ上の「.irbrc」)
    2. .irbrc (カレントディレクトリ上の「.irbrc」)
    3. irb_rc
    4. _irbrc
    5. $irbrc (環境変数)
    - - - - -
    


     「~/.irbrc」には、irbコマンドのオプションに相当する情報を記述します。Rubyスクリプトですので、「require “****”」といったライブラリを読み込むための命令も記述しておくことができます。たとえば、以下の行を記述しておくと、デフォルトで入力補完機能が有効になり、TABキーを押すことで構文要素やメソッド、クラスの候補が画面に現れます。

    - - - - -
    require "irb/completion"
    - - - - -
    


     オプションを設定する場合は、以下の要領で記述を行います。この場合、irbで実行した命令の履歴(カーソルキーで遡ることができる)を最大100行に、自動インデント機能をONにしています。

    - - - - -
    IRB.conf[:SAVE_HISTORY] = 100
    IRB.conf[:AUTO_INDENT] = true
    - - - - -
    

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

     

     MOSA Developer News   略称[MOSADeN=モサ伝]
            配信停止 mailto:mosaden-ml@mosa.gr.jp
     記事内容に関するご意見 mailto:mosaden-toukou@mosa.gr.jp
          記事投稿受付 http://www.mosa.gr.jp/?page_id=850
    Apple、Mac OSは米国アップル社の登録商標です。またそのほかの各製品名等
    はそれぞれ各社の商標ならびに登録商標です。
    このメールの再配信、および掲載された記事の無断転載を禁じます。
    特定非営利活動法人MOSA  http://www.mosa.gr.jp/
    Copyright (C)2007 MOSA. All rights reserved.