2007-12-11
目次
りんご味Ruby 第15回 藤本 尚邦
Leopardでは、RubyCocoaで書かれたアプリケーションやスクリプトのサンプルプログラムやプロジェクトが /Developer/Examples/Ruby/RubyCocoa に入っています。中をのぞいて見るとたくさんのフォルダがあります。
これらの多くはアプリケーションのサンプルです。ターミナルで以下のように入力すると、アプリケーションのサンプルをまとめてビルドすることができます。でき上がったアプリケーションは/Developer/Examples/Ruby/RubyCocoa/apps の中に置かれます。
$ cd /Developer/Examples/Ruby/RubyCocoa
$ ruby buildall.rb apps # ほぼ全てのアプリをビルド
$ open apps # Finderでappフォルダを開く
さて、この /Developer/Examples/Ruby/RubyCocoa フォルダの中は、開発初期のサンプルから最近のものまでごちゃ混ぜになっていて、ちょっとわかりにくいかもしれません。ここで主立ったものの概要を上げておきます。
まずは、この連載でも何回かとりあげている対話型Rubyインタープリタアプリケーションの CocoaRepl.app があります。CocoaReplは、RubyプログラミングやCocoaプログラミングをする上で何かと便利なので、ビルドしたらぜひともアプリケーションフォルダあたりにコピーしておいてください。
以下は、Cocoa以降に登場したフレームワークを使用しているサンプルアプリ
ケーションです:
・ABPresence – AddressBook, InstantMessage
・CGPDFViewer – CoreGraphics
・CocoaGL – OpenGL
・MiniBrowser – WebKit
・PDFKitViewer – PDFKit
・QTKitSimpleDocument — QTKit
・RSSPhotoViewer – ImageKitを使ったflickrビューア
・CITransitionSelectorSample,
CIBevelSample,
CIExposureSample,
CIMicroPaint, – CoreImage (QuartzCore)
MailDemoは、3pane構成(メールボックスリスト、メールリスト、メール本文)のアプリケーション(本物のメーラではない)のサンプルを3種類のスタイルで書いたものです。MailDemoActiveRecordBindings は、データベースのバックエンドにRuby on RailsのORマッパである ActiveRecord を使っているところがポイントです。
・MailDemoSimple
・MailDemoBindings – CocoaBindingを使用
・MailDemoActiveRecordBindings — ActiveRecord/sqlite3
その他、TypingTutorとRaiseManは、アーロン・ヒレガスの「Mac OS X Cocoaプログラミング」に出てくるアプリケーションをRubyで書いてみたものです。CurrencyConverterは、Key-Valueコーディングの簡単なサンプルをRubyで書いたものです。RoundTransparentWindow と RubyRocks は、RubyCocoaResources
(http://rubycocoa.com/) のチュートリアルにあるサンプルアプリケーションです。
■ 互いに影響しあう動的型付け系言語の世界
おしまいに余談をひとつ。前述の RubyCocoa Resources の記事を書いたTimBurksさんは、最近、Objective-Cランタイムシステム上で動く、NuというLisp風プログラミング言語を開発しています。
もともと、CやPascalでプログラミングしていた私が、Rubyにどっぷりはまった結果として、Lispにたいへん心惹かれるようになりました。また、世の中には「なぜRubyは満足できるLispなのか?」(Why Ruby is an acceptable LISP)というタイトルでブログエントリを書いた人もいたりします。
私は、JavaScriptというプログラミング言語もそこそこ気に入っています。なぜかというと、表面上はCやJavaのような感じですが、その中身がLispくささ濃厚だからのような気がします。prototype.jsというJavaScriptのライブラリをご存知でしょうか? ソースや名前の付け方などを眺めると、どう見てもRubyからの影響を受けまくっているようです。JavaScriptも、Rubyとは違う方向で”acceptable LISP” と言えるかもしれません。
また、Objectve-C 2.0のproperty構文などは、Rubyの影響なんじゃないかと推測できなくもありません。Objective-Cでは構文として言語仕様を改良して導入するしか手のなかったpropertyのようなものを、目的・問題に応じた疑似構文(DSL Domain Specific Language)としてささっと手軽にプログラミングできるのはRubyの強みです。
プログラミング言語の世界は、Lispを軸にして、動的型付け系のプログラミング言語が相互に影響しあい中々おもしろい状況になっているようです。
次回はもっと手を動かす内容にしたいと思います。
[参考URL]
RubyCocoa Resources
http://rubycocoa.com/
Porgramming Nu
http://programming.nu/
Prototype
http://www.prototypejs.org/
Why Ruby is an acceptable LISP
http://www.randomhacks.net/articles/2005/12/03/why-ruby-is-an-acceptable-lisp
藤本裕之のプログラミング夜話 #128
やれやれあっという間に今年も師走である。年が明けるとサンフランシスコでMacWORLD EXPO。噂の超小型MacBookつうのはホントに出るんですかね。
ともあれ前回の続き。ツールバーを表示しているウインドウがユーザーによってリサイズされ、その全部を表示できない幅にまで狭められると「>>」みたいな形のアイコンが表示され、それをクリックするとツールバーアイテムがポップアップメニューと、必要ならサブメニューで選択可能になる。が、我々が作成中のツールバーの右端に位置する「Align Text」ではそのサブメニューが出てこない。♪こりゃあどういうわけだ、世の中間違っとるよ(往年のクレージーキャッツの唄です、ご存知ですか?)と思うかも知れないけどこれは世の中が間違ってるんではなく、我々の準備が足りないんである。これが出るようにするには以下のようにする。
まず、MyApplication.hに以下のアウトレット宣言を追加する。
IBOutlet NSPopUpButton* alignPopUpButton;
これはつまりsampleViewの中にあるあの「Left、Center、Right」のポップアップボタンである。なぜこれが必要かというと、こいつからメニューを引っ張り出して「ウインドウ幅が足りないときに出るメニューのサブメニュー」として使うためですな。もちろんsampleViewのアウトレットが既にあるので、こいつに subViews: を送って返ってきた配列から引っ張り出してもいいんだけど、ここで宣言しておけばその処理にクロックを使わなくて済むからね。
上の宣言をしたらInterfaceBuilderでMainMenu.nibを開き、このヘッダーをドラッグ&ドロップしてMyApplicationオブジェクトにこのアウトレットを追加。これを「Align Text」のポップアップボタンと連結するわけ。
済んだらMainMenu.nibをセーブし、MyApplication.m の finishLaunching、
alignPopというNSToolBarItemを作っている部分に以下のコードを追加する。
NSMenuItem* alignPopItem = [[[NSMenuItem alloc] init] autorelease];
[alignPopItem setSubmenu:[alignPopUpButton menu]];
[alignPopItem setTitle:@"Align Text"];
[alignPop setMenuFormRepresentation:alignPopItem];
1行目で作っているNSMenuItemは、ツールバーの「>>」をクリックしたときに表示されるメニューに追加するためのものである。こいつにさっき連結したalignPopUpButtonからmenuをひっぱりだしてサブメニューとしてセットするのが2行目。3行目はそのタイトル。そして問題は4行目である。
setMenuFormRepresentation: というメッセージは読んで字のごとく、このツールバーアイテムの「メニュー形式での表現」を設定するもの。これはmenuFormRepresentation というメッセージで読み出すことができるが、初期値は nil である。で、これを読み出してみて nil の場合、そのアイテムの中身がポップアップボタンだろうがなんだろうが、ツールバーは構わずデフォルトのメニューアイテムを用意する。すなわち名前が見えるだけで右も左も真ん中も選べないあのメニューが表示されるんですな。まぁたとえば「Cat」のように、ただクリックされた(メニューにあっては選ばれた)ことだけわかればいいアイテムはその初期値のままでいいのである。
ちなみに上のコードを実行するとちゃんとメニューは出るが、もとのポップアップボタンにアイコンがないのでそのアイテムの左にアイコンが表示されない(隣の「Print」は使われているアイコンが小さく表示される)。なんか表示させたいアイコンがある場合には、alignPopItem に対して setImage: でセットすればいい。ただし自動的に小さく表示してくれるわけではないのでサイズは自分で調整すること。
次回はツールバーの表示モードについて説明して今年の締めくくりとしたい。それでは皆さん風邪などひかぬようご自愛くだされ。
(2007_12_08)
高橋真人の「プログラミング指南」第126回
〜XcodeによるPowerPlant X入門(17)〜
こんにちは、高橋真人です。
早速、PPx::BaseViewを使ったHIViewの作り方の説明を始めましょう。
新規にプロジェクトを作成しますが、前回作ったPPxForXcode04は実験用のためのイレギュラーなプログラムでしたので、PPxForXcode03の方を複製して、PPxForXcode05というプロジェクトを作ります。
各所の03を05に書き換えるための手順は、以前の記事を参考にしてください。
さて、今回の方針ですが、新規に作成したウインドウの上に動的に(つまり、Nibファイルを使わずに)Viewを作成してみます。
Viewの作成を行うことのできる個所はいくつかありますが、今回は、アプリケーション側のWindowを生成しているコードのところで一緒に行います。もちろん、このWindowはPPx::Windowをサブクラスした独自のクラスですから、このクラス自体にViewを生成されるようにすることもできるのですが、今回はそのアプローチは取りません。
それでは、コードに手を入れていきましょう。MyApplication.cpの
DoSpecificCommand()の中で、
if (theWindow) {
という行がありますので、その直後に以下を加えます。(インデントは適宜合わせてください)
PPx::View *contentView = theWindow->GetContentView();
HIRect frame = { 40.0, 150.0, 280.0, 130.0 };
PPx::BaseView *view = PPx::CreateView
とりあえずはこれでOKですが、ソースの冒頭に以下のinclude文を加える必要があります。
#include
それでは、実行してみましょう。FileメニューからNewを選んでウインドウを作成すると、ウインドウ上にViewが張り付いているのが分かりますね?
え? 「そんなものは、ない」ですって? いえいえ、決してそんなことはありません。
実は、ちゃんとViewは存在しているのですが、BaseViewは何も描画を行わないため、目には見えないものになっているのです。
これでは面白くありませんし、何しろ確認できないので不満が残りますよ
ね。ですので、次にBaseViewからサブクラスを起こして、ちゃんと目に見えるものにしたいと思います。
まず、Xcodeで新規のC++クラスをプロジェクトに追加してください。やり方は分かりますね? 分からない方は以前の記事を参考にしてください。あ、クラスの名前はMyViewとしておきましょう。
以下にコードを掲載します。
====================== MyView.h =========================
#include
では、早速実行してみましょう。あ、その前にMyApplication.cpの先頭に先ほど加えたinclude文の、
#include
#include “MyView.h”と変えておいてくださいね。
さて、どうでしょう? 今度はちゃんとウインドウ上に黒いViewがあるのがご覧になれたでしょうか?
◇MOSAからのお知らせと編集後記は割愛します◇