おまいらもMacRubyでMacアプリ作ろう
このエントリはRuby AdventCalender 2011の企画です
Ruby Advent Calendar の25日目の記事です。24日目は@kwappaさんのHappy Xmas, Rubyists! | Kwappa研究開発室でした。
ちなみに、12/25と言うと、バカボンのパパや銭形のとっつぁんの誕生日として知られていますね*1。
26日はid:tackunさんのSinatraを使って、RESTFulなWeb-APIを作ってみたい - tackun noteです。
補足 2012/05/30 追記
MacRubyの情報は目次 - MacRuby DoJo (道場)に詳しく載っています。また、MacRubyとXCodeのバージョンによってはうまくプロジェクトが作成できない場合もありますが、そこについてもきちんとケアされていますので、MacRuby の環境を構築しよう - MacRuby DoJo (道場)を見ながら環境構築を行うのが良いと思います。
MacRubyを使うと、XCodeで普通のMacアプリが作れる
XCode4系*2からは、XCodeの新規プロジェクトでMacRubyを使ったアプリケーションが作れます。3系はテンプレートを手動で追加すればできた気がします。
MacRuby自体はLionだったら最初からインストールされているという噂です。私の環境はSnowLeopardなのですが、気がついたら入ってました。たぶん手動でインストールした気がするけれど、よく覚えてないw
このエントリは下記の環境での結果です
- Mac OSX 10.6.8
- XCode4.2
- MacRuby 0.10
MacRubyがインストールされているかは下記で確認できます。なければ MacRuby本家サイトからインストールしましょう。
sugamasao@GRAM% which macruby /usr/local/bin/macruby sugamasao@GRAM% macruby -v MacRuby 0.10 (ruby 1.9.2) [universal-darwin10.0, x86_64]
SnowLeopardでのXCodeを使った開発っていうのは結構オワコンになっているので、手軽には開発環境を整えられない可能性があります。AppStoreでインストールできるのはLion用のXCodeで、SnowLeopard用XCode4.2のバイナリは Apple Developer でデベロッパー登録をしてライセンス料を払っているとDLできる*3。もしくは、Lionが出る前にXCode4系を手に入れてる人くらいな気がします。なので、素直にLionにするのがきっとベストアンサー。
MacRubyとは
あんまし馴染みがないと思うのですけれど、このMacRubyというのは、Cocoaフレームワークのラッパーとかではなくて、RubyとObjective-Cを良い感じに悪魔合体させつつ、Ruby1.9とかなり互換性を持ってるプロジェクトです*4。
MacRubyをインストールすると、macxxxというコマンド類がインストールされるので、既存のRuby関係のコマンドとは名前の衝突が起きないようになっています。macgemやmacirbとかがあります。
RubyとObjective-Cの悪魔合体っぷりとかは、普通の組み込みクラスをancestorsすると垣間見れたりする。
irb(main):001:0> Fixnum.ancestors => [Fixnum, Precision, Integer, Precision, Numeric, Comparable, NSNumber, NSValue, NSObject, PP::ObjectMixin, Kernel]
NSナンチャラクラスが組み込まれてたりするのだ。
このままでもcocoaフレームワークを叩くことができるので面白いのだけど、XCodeを使ったほうが見た目が派手だからそっちについて書くよ。
XCodeでアプリを作ろう
プロジェクトを作ろう
まぁ、特に気をつける事とかないです。普通にMacRubyプロジェクトを作るだけです。
Create Document-Based Applicationはちゃんと試してないけれど、ちょっとコツが必要みたいなことがStackOverFlowに載っていたがURL忘れたw
ビルドすると、普通にウィンドウが動いているのが確認できると思います。すばらしい!!
でもこれだけじゃ面白くない
というわけでウィンドウにドラッグするとそのファイルのフルパスを表示するアプリケーションを作ってみよう!!*5
ドラッグイベントを扱うクラスを作ろう
New File... から新しいRubyファイルを作成する。名前は "DragView.rb" として、以下のような内容にしておく。
キモはNSViewを継承することと、ドロップされた時のイベントとかを実装するところ。ココら辺は通常のObjective-Cとほぼ同じのはず。実装するメソッド名とかは同じだけれど、実装方法はほぼRubyでいける。型宣言も不要だし、classとかdefとかの構文もRuby。もちろん、ヘッダーファイルとかも不要。
# # DragView.rb # advent_calender_2011 # # Created by on 11/12/24. # Copyright 2011 __MyCompanyName__. All rights reserved. # class DragView < NSView # ドラッグイベントを受け取るファイル種別を追加する def initWithFrame(frame) registerForDraggedTypes(NSArray.arrayWithObjects(NSTIFFPboardType, NSFilenamesPboardType, nil)) super(frame) end # ドラッグされたオブジェクトがウィンドウ領域に入ってきた時のイベント。戻り値でそのオブジェクトを許可するかが選択できる def draggingEntered(sender) NSLog("draggingEntered") return NSDragOperationGeneric end # ドロップイベント def performDragOperation(sender) zPasteboard = sender.draggingPasteboard files = zPasteboard.propertyListForType('NSFilenamesPboardType') NSLog("sender=#{sender}") files.each do |file| NSLog(file) end alert = NSAlert.new alert.setMessageText(files.join("\n")) alert.runModal() return true end end
よく見るとわかるかもしれないけれど、普通にNSLogとかNSAlertとかも使える。扱うノリはRubyのままなので、慣れると結構ラク。
さてアプリを作ったら
配布したいよね。他の人にドヤ顔で送りつけたいよね!!
きちんと手続きをすればAppStoreに載せるような登録もできるんだけど、残念ながらAppStoreへ登録するようなアカウントは持っていないので、.appファイルを作って知り合いに送りつけるのが関の山です*6。
MacRubyランタイムを同梱する
実はデフォルトだとランタイムの同梱がされていないので、他人の環境にmacrubyが入ってないと動かないのであった。
同梱する手順としてはProduct => Edit Scheme を選択して、Build時のオプションを変更する。
"+"ボタンを押して、Deploymentを追加する。
普段のBuildの時は同梱するメリットは無いと思うので、Archiveの時だけ同梱するようにチェックボックスを外す。
.appを作ろう!!
XCodeのメニューから Product => Archive という項目を選択しよう。そうすると、改めてアプリケーションのBuildが行われる。
Organizerというウィンドウが立ち上がるので、Buildされた項目を選択して、"Share"ボタンを押そう。
そうすると、どのような形式で出力するかというダイアログがでるので、Applicationを選択する。あとは作ったappの置き場所を選択するだけ。
おめでとう
これであなたのMacアプリがRubyで作れました!!
ちなみに、MacRubyが同梱されているかどうかは作成されたアプリケーションのファイルサイズで確認できる。今回作ったアプリの場合は29MBになった。同梱しない場合は70KBとかなので、大きく違うから見れば気がつくと思います。
作った結果のプロジェクトファイルはgithubに上げておきました*7。
それでは
良い年末を!