読者です 読者をやめる 読者になる 読者になる

すがブロ

sugamasaoのhatenablogだよ

おまいらもMacRubyでMacアプリ作ろう

ruby

このエントリは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 (道場)に詳しく載っています。また、MacRubyXCodeのバージョンによってはうまくプロジェクトが作成できない場合もありますが、そこについてもきちんとケアされていますので、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にするのがきっとベストアンサー。

12/26 追記

SnowLeopardでは、MacRubyをインストールすればXCode4でプロジェクトを作成する時にMacRubyプロジェクトが出てくるのは確認した。四の五の言わずMacRubyをインストールすれば良い感じです。

MacRubyとは

あんまし馴染みがないと思うのですけれど、このMacRubyというのは、Cocoaフレームワークのラッパーとかではなくて、RubyObjective-Cを良い感じに悪魔合体させつつ、Ruby1.9とかなり互換性を持ってるプロジェクトです*4
MacRubyをインストールすると、macxxxというコマンド類がインストールされるので、既存のRuby関係のコマンドとは名前の衝突が起きないようになっています。macgemやmacirbとかがあります。
RubyObjective-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のままなので、慣れると結構ラク。

ドラッグ領域をXCodeで配置して、クラスと紐付ける

ボタンとかがあるGUI部品の中からCustomViewというコンポーネントを探して、メインのウィンドウにドラッグしよう。その後、領域をウィンドウ一杯まで広げる。

GUIの部品を置いたので、それをさっき作ったクラスと紐付ける……と言っても、スゲー簡単でCustomClassの部分にDragViewと入れるだけ。
ちょっとわかりにくいけれど、右側の Show The Identity inspector っていうタブ(?)にある。

ビルドしてみよう!!

ビルドボタンをズビッと押して、出てきたウィンドウにファイルをドロップしてみよう!!

こんな感じで、複数のファイルでも出力されるし、NSLogにもちゃんと出てるのが確認できるね。

さてアプリを作ったら

配布したいよね。他の人にドヤ顔で送りつけたいよね!!
きちんと手続きをすれば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

それでは

良い年末を!

*1:Wikipedia調べ

*2:だったと思う……

*3:アカウント登録だけじゃダメなのだ……

*4:100%なのかちょっとわからなかったけど、プロジェクトのゴールは100%互換を持つこと

*5:例がつまらないって?ハローワールドよりは発展性ありそうな気がするから多めに見てちょ

*6:メンゴメンゴ!

*7:この段になって、プロジェクトを作るときのcalendarの綴りを間違えている事に気がついたw