特定非営利活動法人MOSA

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

  • iPhone/iPod touch アプリ紹介
  • MOSA掲示板
  • 活動履歴
  • About MOSA(English)
  • BIZMATCH
  • メールマガジン好評配信中

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

2007-04-10 

目次

  • 「りんご味Ruby」       第1回  藤本 尚邦 ★新連載★
  • 藤本裕之のプログラミング夜話   #112
  • 高橋真人の「プログラミング指南」  第110回
  • 書籍紹介 木下 誠 著 Happy Macintosh Developing Time

「りんご味Ruby」   第1回  藤本 尚邦

Rubyというプログラミング言語をご存知でしょうか? この連載では、世界的に注目されている日本発のオブジェクト指向スクリプト言語Ruby(まつもとゆきひろさん作)について、Macユーザの皆さんにむけて、実践的な内容を織り交ぜながら、Rubyプログラミングの手軽さ・強力さ・心地よさを紹介していきたいと思います。

(注: 基本的に、本連載で紹介するRubyプログラムは、Tiger以降のMac OS Xに付属しているRubyを前提とします。詳細については「補足 –Rubyのバージョンについて」をご覧ください)

■ はじめの一歩 — RSSリーダー

新しいプログラミング言語について紹介するとき、最初に書くプログラムはhello,worldの印字、というのが「プログラミング言語C」(通称K&R本)第一版以来の伝統ですが、今は21世紀になって7年目、インターネット花盛りの時代ですから、それにふさわしく、簡単なRSSリーダーのプログラムで、はじめの一歩を踏み出します。

  

require 'rss/2.0'
  require 'open-uri'
  url = 'http://www.mosa.gr.jp/?feed=rss2'
  rss = open(url) { |io| RSS::Parser.parse(io.read, false) }
  puts "-- #{rss.channel.title} (#{rss.items.size} entries) --"
  puts
  rss.items.each { |item| puts item.title }

このRubyプログラムは

  ・RSS解析ライブラリとhttpアクセスライブラリをロードして — 1-2行目
  ・MOSAのWebサイトのRSS情報を取得し                      – 3-4行目
  ・チャンネルと各エントリのタイトルを(標準出力に)印字    – 5-7行目

しています。それでは、さっそくこのプログラムを実行してみましょう。

■ Rubyプログラムの実行その1 — rubyコマンド

Rubyプログラムを実行するには様々な方法があるのですが、まずは最も基本的なrubyコマンドを使います。ターミナル(Terminal.app)を起動して、シェルのプロンプト(ここでは`$’とします)が表示されたら、rubyと入力してリターンキーを入力します。

  

$ /usr/bin/ruby

それに続いて、上のRubyプログラム(全7行)をペーストしてください。7行目の改行も含めることをお忘れなく! 最後に、コントロールキーを押しながら`d’を入力します。

すると

 

 -- 特定非営利活動法人MOSA (10 entries) --
  WWDC2007参加ツアーのお知らせ
  リピートセミナー:ネットワークプログラミング入門講座・基本編
  (以下省略)


のような内容(各エントリのタイトルは異なるかもしれません)が印字されるはずです。

もちろん、Rubyプログラムをファイルに保存しておいて、それを実行することもできます。上のプログラムをprint_mosa_rss.rbというの名前のファイルに保存しておき

 

 $ /usr/bin/ruby print_mosa_rss.rb

とすると、同じように結果が印字されます。

いかがでしたか? うまくいかなかった方、ごめんなさい。ネットワークつながってますか? 動いたけど文字化けした方は、ターミナルの「情報を見る/ディスプレイ」の文字セットエンコーディングのところがUnicode(UTF-8) になっているかご確認ください。

■ Rubyプログラムの実行その2 — CocoaRepl

次は、拙作のCocoaReplを使って、RSSリーダを実行してみます。CocoaReplは、対話的にRubyプログラムを実行するためのCocoaアプリケーションです。後述のURLからダウンロードすることができます。ターミナルが苦手な方には、こちらの方が気楽かもしれません。

CocoaReplを起動するとウィンドウが開きます。上側がRubyプログラムを書き込むためのテキストビューになっています。そこに、先ほどのRubyプログラム(全7行)をペーストして、Rubyメニューの一番上にあるEvalコマンドを実行します。すると、ウィンドウの下側にrubyコマンドのときと同じ結果が印字されるはずです。

■ まとめ

さて、今回紹介したRubyプログラムを見て、皆さんはどんな印象をお持ちになったでしょうか? 「短いなぁ」「だけど、そんなに暗号っぽくはないなぁ」というような印象を持っていただけたとすれば、私にとっては大成功です。「何だかよくわからないなぁ」と思われた方もどうぞご安心ください。何しろ、まだほとんど何も説明していないのですから無理もありません。

わずか7行の短いプログラムながら、ここにはRubyのポイントとも言える要素がいくつか含まれています。

  ・添付ライブラリの使用
  ・文字列の式展開
  ・オブジェクトの生成
  ・メソッド呼び出し
  ・ブロック付きメソッド呼び出し

次回以降、このプログラムをとっかかりに、Rubyについて丁寧かつ実践的に説明していくつもりです。また、このプログラムを応用して、コマンド・CGIプログラム・Cocoaアプリケーション・Webアプリケーションなどを作ってみましょう。

■ 自己紹介

今回よりモサ伝にてRubyについて記事を書かせていただくことになりましたRubyCocoa作者の藤本尚邦といいます。

はるか昔、Think C/Pascal, MPW C/Pascal, CodeWarrior C++/PowerPlantなどを使って、Mac周辺機器用の各種プログラム、Photoshopプラグインやプリンタドライバ(PDEFリソース)などを書いたりしていました。10年ほど前にRubyに出会って以来、Lisp系言語などに浮気?しつつも、Rubyプログラミングの手軽さ・強力さ・心地よさに魅了され続けています。

Mac界隈で「藤本」といえば何といっても藤本裕之さん。昔から数々の素晴らしい記事などをお書きになられていますが(MacJapanなどの記事をよく読ませていただいていました)、私も少しでも皆さんの役に立つような記事を書ければと思います。どうぞよろしくお願いします。

■ 参考URL

RubyのWebサイト
http://www.ruby-lang.org/

Rubyリファレンスマニュアル
http://www.ruby-lang.org/ja/man/

RubyCocoa
http://rubycocoa.sourceforge.net/

CocoaRepl
http://rubycocoa.sourceforge.net/hisa/files/CocoaRepl.app.zip

■ 補足 — Rubyのバージョンについて

本記事で紹介していくRubyプログラムは、Tiger以降のMac OS Xに付属してくるRuby(Tigerの場合にはRuby 1.8.2)を前提としています。Tigerよりも前のMac OS Xを使っている方や、自分で、あるいはMacPortsなどでインストールしたRubyを使っている場合、記事の内容と若干食い違っている可能性があります。その点、ご了承ください。

◇ Mac OS X Panther (10.3.x)をお使いの方へ

PantherについてくるRubyは、バージョンが古くて(1.6)今となっては不便なことが多いので、できれば、現時点で最新のRuby 1.8.6 をインストールしてください。他にRubyを使っていないのであれば、付属していたRubyを上書きしてしまうのが単純でよいと思います(ただし結果の責任は持てませんのでご了承ください)。

◇ Mac OS X 10.3(Panther)のRubyを最新の1.8.6に上書き更新する方法

  

・RubyのWebサイトからruby-1.8.6.tar.gzをダウンロード
  ・Terminal.appを起動
  ・ruby-1.8.6.tar.gzファイルを展開
       $ cd /tmp
       $ tar zxf ruby-1.8.6.tar.gz
  ・Rubyを作る
       $ cd ruby-1.8.6
       $ ./configure --prefix=/usr --enable-shared --enable-pthread
       $ make && make test
  ・Rubyをインストール
       $ sudo make install

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

 再び問う。実現したいサービスはお決まりだろうか。いや何を隠そうサンプルにどんなサービスを提供することにしようかオレ自身も迷っているのだ。つか、このサービスという機能は通常、(1)既に何かアプリケーションがあって、(2)そのアプリケーションが持つ機能を手軽にアプリケーション外から利用できるようにする、もんなんであって、サービスを実現するためにアプリケーションを作るというのは本末転倒星から本末転倒で作った宇宙船に乗って地球まで本末転倒を広めに来ましたみたいな話では、ある。
 が、やっぱり一応なんか例をだして説明をしなくてはならないので、ここはひとつ想像してください。天国なんかないと…ぢゃなくて、あなたはそこに自分で書いたとっても高機能のWebブラウザを持っています、と。で、Safariにある「Googleで検索」というサービスの真似をして、このブラウザから「Yahoo! で検索」という新サービスを提供しちゃおうと、考えてる。

 ある文字列 String を「Yahoo! で検索」するのは簡単だ。早い話が自分のブラウザで以下のURLを叩けばいい。実際にはこれにやれエンコードはどれだとかあれはなにだとかなにのほうはいずれなにしてその節ゆっくりだとかいろいろオプションがつくが、基本はこれ。

http://search.yahoo.co.jp/search?p=String

オプションの方はその節ゆっくり勉強して対応してもらうとして、当面の問題はサービス・リクエスターからこの文字列 String をどうやって受け取るか、だけである。

 ここで前回の話を思い出していただきたい。サービス・プロバイダとなるアプリケーションの「info.plist」に「NSMessage」というキーでアプリケーションが受け取るメッセージを記述した。しましたね? あのメッセージ、このアプリケーション内のどのオブジェクトが受け取るのであろうか。ちうか、例えばここに SearcherByYahoo というクラスのインスタンス searcher があり、そいつがシステムから送られてくるメッセージを ……おっとこれを書きわすれてた、実際にはこのメッセージは以下のようなパラメータを引き連れてくる(searchThisStringByYahooつうのは今適当にでっちあげた名前)。

(void) searchThisStringByYahoo:(NSPasteboard*) pboard
                       userData:(NSString*) userData
                           error:(NSString**) error


pboard にサービスメニューが選ばれたときにサービス・リクエスタから受け取ったパラメータが、userData に info.plist で指定したオプション・データが入っており、なにかエラーが発生したらメッセージを error にセットする。このメッセージ(メソッドといったほうが分かりやすい?)を上で書いたように SearcherByYahooクラスのインスタンス searcher が受け取って処理するとする。と、問題はどういう仕組みでこのメッセージがこのオブジェクトに飛んでくるのか、だよね。

 実はそれをセットするためのメッセージが NSApplication にある。こんな風に使う。

SearcherByYahoo* searcher = [[SearcherByYahoo alloc] init];
[NSApp setServiceProvider:searcher];

 これを見れば判るように、複数のサービスメッセージを受けて違った処理をする場合でも受け手のオブジェクトは1個である。FinderがなんというオブジェクトをsetServiceProviderにセットしているか知らないが、そのオブジェクトはFinderのinfo.plist に書かれている3つの処理、「情報を見る」、「手前に表示」、「開く」のメッセージを処理できなくてはならない。さて、めでたしめでたし、これで世界は一つになり戦争はなくなる。……あ、その歌ぢゃありませんでしたね。
                            (2007_04_05)

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

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

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

 こんにちは。高橋真人です。早速続きを始めます。
 今回は、ごく簡単なPowerPlant Xアプリケーションを作成し、動作の確認をします。

◆プロジェクトの作成
 XcodeでCarbon C++ Applicationの新規プロジェクトを起こします。名前は、PPxForXcode01と付けましょう。
 次に、Finderでホームフォルダの中に出来たPPxForXcode01フォルダを開き、中のHIFrameworkという名のフォルダを捨てます。
 Xcodeに戻り、「グループとファイル」ペインのSources(以下、単に「Sourcesグループ」と表記します)を展開して、HIFrameworkという名の黄色いフォルダを選択して、deleteキーを押して削除します(今捨てたフォルダに入っていたソースファイルをプロジェクトから削除するわけです)。
 プリコンパイルヘッダ(PPxForXcode01_Prefix.pch)を開き、以下の3行を取り除きます。

#include "HIFramework.h"
#include "TApplication.h"
#include "TWindow.h"


つまり、

#include 


のみを残すのです。
 閉じて、保存します。
 Sourcesグループ(上記参照)を選び、メニュー「プロジェクト→プロジェクトに追加…」を選びます。
 ファイル選択ダイアログで/Libraryに行き、PowerPlantXを選択して「追加」ボタンをクリックします。この時、追加のための設定シートダイアログが出るので、以下のように設定します。

フォルダに項目をコピーのチェック→外したまま参照タイプ→デフォルトエンコーディング→日本語(Mac OS)ラジオボタン→再帰的にグループを作成の方を選択

◆検索パスの追加
 メニュー「プロジェクト→プロジェクト設定を編集」を選択し、設定ダイアログを開きます。
 「ビルド」タブを選んで、「ヘッダ検索パス」のところに、

/Library/PowerPlantX


と入力します。

◆ソースコードの編集
 ソースコード、main.cpを以下に書き換えます。

#include 

int main()
{
    PPx::Application app;
    app.Run();

    return 0;
}


 ビルドします。
 警告が50近く出ますが、ビルドは成功するはずです。
 では、試しに走らせてみましょう。
 アプリケーションメニューが出るだけで、あとはウインドウもメニューもありませんが、ちゃんとアプリケーションとして起動しています。メニューから「終了」を選んでも、コマンド+Qででも終了させることができます。

 以上で、PowerPlantXアプリケーションが動くところまで漕ぎ着けました。もし、ビルドができないようなら、ここまでの手順を再度見直してください。
 これだけで終わってしまうのも寂しいので(笑)、ビルド時にたくさん表示された警告を表示させないようにしておきましょう。
 以前も説明しましたように、ここで表示されている警告のほとんどは現在のOSにおいて使用が推奨されないAPI、つまりDeprecatedなAPIについてのものと、「未使用の変数」に関するものです。
 まずDeprecatedなAPIの方ですが、これは将来にわたって「いずれは使えなくなる」ことをほのめかしているだけで、すぐにどうこうということではありません。特に、PPxは最初からPanther(Mac OS X 10.3.x)をターゲットに作られたので、そんなに古いAPIが使われていることはないのです。
 よって、この連載ではこれらの根本的な解決を行うことはいたしません。ただ、目障りでもあるし、他にもっと重要度の高い警告やエラーが出た場合にそれらが目立ちにくくなるので、「表示させなく」します。
 それから、後者の未使用変数ですが、CodeWarrior(以下CW)においても未使用の変数は警告が出るのが標準でしたので、PPxの出荷状態においても、当然これらの処置はされていたはずです。
 ところが、以前のバージョンではかなり警告のレベルの低かったGCCが現在のMac OS X 10.4.x標準の4.0からは格段にチェックが厳しくなって、CWよりも厳格なチェックをするようになりました。「未使用」という意味のとらえ方が、CodeWarriorでは「定義しても使われていない」だったのに対して、GCC4.0(以下GCC4)では「定義して、何らかの値が代入されていても、それが使われていない」場合も含めて「未使用」と見なすようになっているようなのです。
 つまり、

int a;

と書いてあるだけで、以降そのスコープ内でaが登場しない場合は、CWもGCC4も「未使用」と見なします。しかし、

int a = 0;

というように、aに(それがたとえ初期化であっても)何らかの値が代入された場合、CWではこれを未使用とは見なしませんが、GCC4では未使用と見なすわけです。

 さてそれでは、実際に作業をしてみましょう。
 プロジェクトメニューから、「アクティブなターゲット’PPxForXcode01′を編集」を選び、開いたダイアログで「ビルド」タブを選択します。
 「コレクション」のポップアップメニューから「警告」を選んで、中ほどの「未使用静的変数の警告」と下から2番目の「推奨されない関数についての警告」のチェックを外します。
 これで、OKなはずです。ビルドをし直して警告が一つも出なくなったら成功です。

書籍紹介 木下 誠 著 Happy Macintosh Developing Time [Second Edition]

 解説担当:高橋政明

Happy Macintosh Developing Time [Second Edition]
木下 誠著
株式会社ビー・エヌ・エヌ新社 ISBN4-86100-124-2 ¥3,780 (税込)

 広範囲に解説されているCocoaプログラマ必携の書です。著者はモサ伝でニュース解説を担当していただいていた木下さんです。
Cocoaではシンプルなプログラムであってもいろいろなクラスを使います。このため網羅する範囲の広いこのような本が必要です。
 このSecond EditionはMac OS X 10.3に対応しています。もちろん現在でも役立つ情報です。
 Third Editionもあり、10.4の新機能が解説されていますがSecond Editionの内容と重複する部分はありません。Second EditionとThird Editionはまったく独立した内容なので購入の際にはご注意ください。

 下記出版社のwebなどで目次を見るとわかりますが実際のソフトウェアで頻繁に使う様々なクラスが載っています。単なるクラスやメソッドの羅列だけでなく、シンプルで具体的な利用例があるのでプログラミング中に調べる時も助かります。

 2004年に出た本で、残念ながら完売し2006年末時点で増刷の予定無しだそうです。
http://hmdt.jp/archives/2006_12.html
(「本が半額のお店」などであれば見つかるかもしれません)

▼出版社のweb
http://www.bnn.co.jp/books/title_index/mac/happy_macintosh_developing_timesecond_edition_xcod.html

▼著者のweb (ソースコ−ドのダウンロードサービスあり)
http://hmdt.jp/books/hmdtSecond/index.html

▼著者による初版解説(当然初版は古く、Xcodeが出る前に出版されました)
http://homepage.mac.com/mkino2/books/hmdt.html

 さてCocoaの本を三冊連続でご紹介してきました。Cocoaは開発効率を高めることのできる強力なツールです。しかし大規模であるためたくさんの情報が必要で手強いことも事実です。まだ『これ一冊でCocoaは完璧』と言える決定版の書籍はありません。
 これからCocoaをはじめる方はこれまでご紹介した三冊を手始めに取り組んでみてください。疑問点の相談にはMOSAの掲示板MOSAdeBBをご活用ください。
http://www.mosa.gr.jp/mosadebb/modules/newbb/

◇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.