Home > RubyCocoa

RubyCocoa Archive

ManagedObjectを最初からあるキーでソートしてTableViewに表示する

  • Posted by: hiroe
  • 2007年12月 5日 21:50
  • RubyCocoa

絶対Bindingで出来ると思いつつも、とりあえず回避してた標記問題なのですが、漸く解決して嬉しいので、自分用メモとして書いてしまいます。「そんな遠回りな方法じゃなくても・・・」という方、是非コメントお願いします。

Modelは前にも使ったようなやつで、こんな感じ。

model.jpg

そしてTableViewには日付順(pubDate順)に表示させようと思ってました。一体どこで制御するんだと思っていたら、TableViewとModelの間にあるControllerを使えばよかったんですね。コントローラーの設定画面で、Controller Content ParametersのSort Descriptersに、AppDelegateのキー(ここではdateSortという名前にしてみました)をバインディング

sortDescriptor.jpg

で、AppDelegateに以下のメソッド(?)を記述

def dateSort
sort = OSX::NSSortDescriptor.alloc.initWithKey_ascending("pubDate", false)
return OSX::NSArray.arrayWithObject(sort)

end

pubDateを別のアトリビュートにすれば、その属性でソートしてくれます。

(12/6追記)

あーこれだけだと、ソフトウェアを起ち上げてから、別の属性を選択したりすると落ちることに気づいてしまいました。。。kvc_accessor :dateSortを追加するとOKでしたが、他の属性を選択したときに変更が効きません。うーん、きっと何か方法があるはず。もう少し考えます。

RubyCocoa 0.13.0がリリースされたそうです

  • Posted by: hiroe
  • 2007年11月25日 22:36
  • RubyCocoa

RubyCocoa 0.13.0 リリース(きりかノート)

私もさっそくダウンロードしてインストール。今作りかけているソフトウェアを再ビルドしてみましたが、問題なく動きました。

RubyのハッシュをCoreDataのデータにする

  • Posted by: hiroe
  • 2007年11月25日 20:32
  • RubyCocoa

RubyのハッシュをCoreDataのエンティティにする(って言い方で良いのかなあ、要するにデータのひとつにするってことなんですが)方法をいろいろ考えたのですが、結局のところeachでセットしていくしか思いつきませんでした。。。

Bookという名前のエンティティをつくって、isbn, title, author, publisher, pubDateというプロパティを作りました。

一方、AWSからISBNを使ってデータを取り込み、{isbn => "ISBN", title=> "タイトル", author=>"著者名", publisher => "出版社", pubDate => "NSDate形式の出版年"}というハッシュを作成します。それをBookエンティティの一オブジェクトとして挿入。

item_bib = OSX::NSEntityDescription.insertNewObjectForEntityForName_inManagedObjectContext("Book", @managedObjectContext)

bib = Hash.new

#bibにAWSからデータを取り込み処理(外部にrubyのClassを作ってそれで処理しました)

bib.each{|x,y|
item_bib.setValue_forKey(y, x)
}
@managedObjectContext.processPendingChanges

一応できたんですけどね(前に作ったモノの1/10くらいの記述になった)。ハッシュをそのままオブジェクトとして入れるとか出来ないのかなあ。CoreDataのオブジェクトってハッシュみたいな感じだし。

RubyCocoa Leopard版 つまづいた・・・

  • Posted by: hiroe
  • 2007年11月19日 21:38
  • RubyCocoa

普通にX+Y = Zという形の計算機をつくって、おーできたできた、と思うところまでは良かったんですが・・・。

じゃあ次はCoreDataだと思って、一番簡単なモデルつくってドラッグアンドドロップで表を作るのをやって、ビルドしてみると・・・なんかこけるんです。

/Users/***/Documents/xcode_edu/TestCored/build/Release/TestCored.app/Contents/Resources/TestCoredAppDelegate.rb:9: undefined method `require_framework' for main:Object (NoMethodError)

どうもrequire_frameworkがうまくいってないみたいなんですが・・・。Xcodeをターミナルからアンインストールして、再度インストールしてみたりしたのですが同じ症状。うーん。自分で作った奴だからかとおもって、Examplesの中のStikiesをビルドしてみたのですが、再びエラー。

/Library/Frameworks/RubyCocoa.framework/Resources/ruby/osx/objc/oc_wrapper.rb:17:in `ocm_send': StickiesAppDelegate#ib:action: - methodSignature is nil.

分からない・・・。ExamplesのRubyCocoaじゃないStikiesはOKだったんですけどね。要はObjective-Cを使えってことなのでしょうか・・・。

どなたかアドバイスありましたらよろしくおねがいします。

(11/21追記)

自己解決。というか、2ちゃんねる新・Mac板のRubyCocoaスレ様々。同じようなエラーを誰かが報告していて、それに対して/System・・・じゃなくて/Library・・・になってるから、Tigerの頃からRubyCocoaをインストールしてて、それが悪さしてるのでは?とレスしてて、私もさっそく/Library/framework以下のRubyCocoaを全削除したら、今までなんか大量に出ていたエラーがウソのように消えました。

また、ModelからIBに対してドラッグ&ドロップしただけで前はすぐに出来ていたように思うのですが、Cannot perform operation without a managed object contextというエラーが出るので、再度IBを確認したところ、自動生成したArrayにManaged object contextをバインドしなければならなかったのでした
(以下の画像参照)。ちょっと不親切?

managed.jpg

ZDNet JapanでRubyCocoa指南

既にOS X 10.5にアップグレードした方もいらっしゃるでしょうか。どんな感じですか?

今回のアップグレードで私が期待してた機能のひとつが、開発環境の大幅改訂。特にRubyCocoaが正式に搭載されるのがとても楽しみだったのです。以前は何しろ情報が乏しくて、Rubyはいじれるけど、Cocoaはさっぱり、という人間は、暗号解読に近いものがありました。

今日、こんな記事を発見!
Leopard解体新書--第1回:RubyCocoaでWebページ表示

これからはどんどん日本語ソースも増えてくるかもしれないですね。Rubyなら使えるという人も多いでしょうし、正式版はかなり作り込まれているようですので、何か作ってみようかなーと思ってます。

RubyCocoaでウェブ接続してみる

  • Posted by: hiroe
  • 2006年11月12日 21:34
  • RubyCocoa

椰子の実通信のトップと新刊案内で使っている新刊ウォッチャー用ソフトですが、詳しい内容をAmazonで見るために、ウェブ接続できるようにすると面白いかなと思って拡張してみました。

webconnect.jpg

web_connectというactionと、webviewというoutletを作成して、それぞれ接続。

def web_connect
enum = @objects.selectedObjects.to_a 
if enum.length > 1
#複数選択不可
elsif enum.length == 0
#何か選べと警告
else
url = enum[0].valueForKey("url")
if url
@webview.setValue(url, :forKey, "mainFrameURL")
end
end

end

こんな感じ。すごい簡単なんですね。また、ついでにProgressバーと、ストップボタンも作ってみました。その辺りはバインディングって何なのさ(Cocoaはやっぱり!)を参考にしました。ありがとうございます。

Amazonを検索してファイルを作るver.2

  • Posted by: hiroe
  • 2006年10月15日 20:42
  • RubyCocoa

椰子の実通信のトップページと新刊ファイルは、自作ソフトウェアで生成・アップロードしているのですが、何故かそれが突然使えなくなってしまいました(Amazon側の仕様変更と思われる)。ので、CoreData化も含めてヴァージョンアップしてみました。こんな感じ。

aws_2.jpg

WebserviceでISBNをキーにItemLookupして、XMLをREXMLで解析、必要な書誌事項だけ取り出してエンティティに埋めてます。ファイルを作成するときは日付でソートして書誌事項が空のもの以外をFetchして全リストを作成、同時に選択した項目のみでトップページ用のファイルを作成しています。選択したオブジェクトをどう拾うのか迷ったのですが、

テーブルにバインドしているArrayControllerを、delegateのアウトレット(@objects)として接続、

objects_array = @objects.selectedObjects.to_a

で配列として取り出せばOKでした。もうちっとスマートな方法がありそうですが・・・。

余裕が無くて放ってある小遣い帳も、そろそろまた手をつけよう。

RubyCocoaが次期OSに搭載

  • Posted by: hiroe
  • 2006年8月15日 13:43
  • RubyCocoa

RubyCocoa is bundled with Leopard(ひ日誌)

すごーい。Rubyそのものが今注目されてるし、利用者も多いから、また一歩Xcodeへの敷居が低くなったと思います。新しいOS自体も楽しみな機能がいくつもついていて、今からわくわく。

Mac OS X Leopard先行プレビュー

Mac OS X Leopard Sneak Peek(英語版。こっちのほうが映像もついて、新機能が詳しく紹介されてる)

特にTime MachineとSpacesはすごいなーと思ったのですが、RubyCocoaも乗るって、もう買うしかない、みたいな感じですね。今までこんなに新OSを楽しみにしたことって無いなぁ。

あとは大学(職場)のPCがMacになってくれると・・・(笑)。

[Core Data]プロパティの中の値にアクセス

  • Posted by: hiroe
  • 2006年7月 8日 21:34
  • RubyCocoa

なんとなく分かってきたような・・・とりあえずデータを入力する枠組みを作ったら、データをいじるのはFetchとコードで、ってことなのかしらん。

データをいじるために、データベースから値の配列を取り出す方法

1. ManagedObjectContextからエンティティごと取り出す。
2. エンティティからオブジェクトを次々取り出し、
3. キーでプロパティにアクセス

#モデルは先日のものと同じです。

entity = OSX::NSEntityDescription.entityForName("Classification", :inManagedObjectContext, @managedObjectContext)
request = OSX::NSFetchRequest.alloc.init
request.setEntity(entity)

className = @managedObjectContext.executeFetchRequest(request, :error, nil)
enum = className.objectEnumerator.to_a

for i in 0..enum.length - 1
className = enum[i].valueForKey("name").to_s
#あとは名前で何かをするならここにコードを

end

何かデータを与えるのであれば、

enum[i].setValue(データ, :forKey, "name")

みたい。

Popupボタンで表示を絞り込む

  • Posted by: hiroe
  • 2006年6月18日 18:45
  • RubyCocoa

自分用メモ。せっかくできても、書いておかないと忘れるので。

まず、こんなモデルを作りました。

モデル例

で、別画面でPopupボタンで、表示するものを絞り込む場合。

絞り込み例

試行錯誤した結果、以下のようにしたらできました・・・。
・PopupボタンのcontentにclassificationのArrayControllerのarrangedObjectをバインド
・同じくcontentValuesにclassificationのArrayContollerのarrangedObject.nameをバインド
・selectedValueに、"popup"をバインド
・AppDelegateに、BookのArrayControllerをoutletとして接続
・TableViewにはColumnごとにBookのArrayControllerをバインド

AppDelegateに以下を追加

kvc_accessor: popup
ib_outlets :book_arr

def popup=(value)
@search_name = value.to_s
variables = OSX::NSDictionary.dictionaryWithObject(@search_name, :forKey, "CLS")
temp = OSX::NSPredicate.predicateWithFormat("classification.name == $CLS")
pred = temp.predicateWithSubstitutionVariables(variables)
book_arr.setFilterPredicate(pred)
end

なんで3ペインのテーブルビューと同じようにできないのかさんざん悩みましたが、Selectedなんちゃらで返ってくるものがPopupとテーブルビューでは違うからなのですね。うー難しい。

[CoreData]PredicateとFetchの違い

  • Posted by: hiroe
  • 2006年6月18日 10:37
  • RubyCocoa

日本語訳はわけわからないし、英単語としても意味不明のFilterPredicate(述語フィルタ)とFetchRequest(受信要求)の違いを解読するのに、とても時間がかかりました。ビューによっては、その違いが全く出ないんですもの。

メモ。間違っているかもしれないので、お気をつけを。
NSFetchRequest
・ManagedObjectContextを出口から絞る。
・そのため、別口でManagedObjectが修正(追加)されると、即座に反映される
・モデルに受信要求テンプレートを作っておくと楽。

FilterPredicate
・コントローラーからビューの段階で、データを絞る。
・そのため、別コントローラーで行った追加・修正は、再度フィルタをかける動作をしないと、変更が反映されない。
・逆にコントローラーごとに別の絞り込みをすることが可能。
・コントローラーにコードを記入

受信済みプロパティ(スマートプレイリストみたいなもの)は、FetchRequestを別の箱に作っておいて、全部に影響される不便さを軽減するってことなのかなー。

CoreDataのお勉強

  • Posted by: hiroe
  • 2006年6月 3日 09:19
  • RubyCocoa

Happy Macintosh Developing Time Third Edition Cocoaプログラマのための技術解説書

著者:木下 誠

発売日:2006/05

価格: ¥ 3,990

ISBN: 4861003806


日本初のCoreData詳細解説を含むという上の図書が発行されたので、さっそくCoreData部分を読んでます。前に見た解説書では、エンティティとプロパティを作って、nibにドラッグアンドドロップで簡単に入力画面までできる!とだけしか書いておらず、それじゃーデータをいじりたいとき(たとえば小計の欄を足したい)とかはどうすりゃいいの?と思ってたんですよね。

手探りですが、すこーし分かったような気がします。p.282のiTunes Music Libraryを読み込むimportメソッドを、RubyCocoaバージョンにしてみました。

def import
path = "/Users/[ユーザ名]/Music/iTunes/iTunes Music Library.xml"
dict = OSX::NSDictionary.dictionaryWithContentsOfFile(path)
if (dict==nil)
return
end

entity = OSX::NSEntityDescription.entityForName("Track", :inManagedObjectContext, @managedObjectContext)

                   @managedObjectContext.undoManager.disableUndoRegistration

request = OSX::NSFetchRequest.alloc.init
request.setEntity(entity)

managedTracks = @managedObjectContext.executeFetchRequest(request, :error, nil)
enum = managedTracks.objectEnumerator.to_a
for i in 0..enum.length - 1
@managedObjectContext.deleteObject(enum[i])
end

#request.release
#requestのリリースは不要(禁止)

tracks = dict.objectForKey("Tracks")
enumerator = tracks.keyEnumerator
key = enumerator.to_a

for i in 0..key.length - 1
track = tracks.objectForKey(key[i])
trackObject = OSX::NSEntityDescription.insertNewObjectForEntityForName("Track", :inManagedObjectContext, @managedObjectContext)

title = track.objectForKey("Name")
trackObject.setValue(title, :forKey, "title") if title

album = track.objectForKey("Album")
trackObject.setValue(album, :forKey, "album") if album

artist = track.objectForKey("Artist")
trackObject.setValue(artist, :forKey, "artist") if artist

year = track.objectForKey("Year")
trackObject.setValue(year, :forKey, "year") if year

end

@managedObjectContext.processPendingChanges
@managedObjectContext.enableUndoRegistration

end

ちょっとはまったのが、NSEntityDescription。仕様書みてもそれをどうRubyで書けばいいかわかんなくて、ググりまくり。またNSFetchRequestって、rubyではrelaseしなくていいのかな。releaseしちゃうと1回目は問題ないのですが、もう一度importボタンを押すと、デバッガが立ち上がって、なにやら暗号をはき出してくれるのでした。コメントアウトしたら起きなくなったから、おそらくこの所為だなあと思って。NSDictionaryをhashにできる、とRubyCocoaの説明に書いてあったので、今度はそれを手さぐりしてみます。

ついでにBindingも学ぼうと思ったら、Bindingは前版を見てくれと「はじめに」に書いてありました。orz これって3rd ed.とかなってるけど、実はv. 3だったのでした。また、初めてCocoa使うんだけど、という人には向いてないですね。1から説明してくれてるわけじゃないので。

NSStepperの使い方?

  • Posted by: hiroe
  • 2006年5月 3日 23:48
  • RubyCocoa

stepper.jpg

小遣い帳(というか、銀行口座とカードの管理ソフト。支払い口座と給料口座を別々にしているせいで、たまに口座にお金が無くて引き落としできない!とかあるから)も、徐々に出来はじめてるのですが、せっかくなので用意されてるインターフェースを使いながら、その利用法を探りつつ作る、ということをしております。

今日はNSStepperとNSTextFieldを使って、今後の支払い予定のうち、表示する範囲(2ヶ月先、3ヶ月先までなど)を決める、というのをやってみようとしたのです。ここで問題。stepperで月数を変化させたときに、当然Tableの内容も合わせて変わって欲しいわけですが、それをするにはどうしたらいいのか、ということ。NSStepperでNSTextFieldに数字(1〜12)を表示させるところまでは非常に簡単だったのです。StepperからTextFieldに線を繋げて、takeIntValueと接続すればいいだけ。でもこれじゃ数字を変えたときにTableを変える、ということが出来なくて・・・controlTextDidChangeとか使うのかな〜と思ったのですが、結局分からず。

で、いろいろ検索するうち、こういう解決方法を載せてる人がいました(元はObjective-C用に書かれており、言語は英語なので、適当に訳してあります)。

1. stepperとtextfieldを作成し、Controllerのoutletにmystepper、mytextfieldを作成してそれぞれ接続
2. Controllerに変化したときに起動させるaction(たとえばchange_rangeとする)を作成し、stepper, textfield両方から接続。
3. Controllerに以下のようにコードを記入

def change_range(sender)
value = sender.intValue.to_i
@mystepper.setIntValue(value)
@mytextfield.setIntValue(value)
(ここにtableを表示するためのコードを書く)
end

とりあえず実装は出来たのですが、もっと良い方法はあるのでしょうか。

delegateとNSTabView

  • Posted by: hiroe
  • 2006年4月20日 06:12
  • RubyCocoa

どーしても理解できないので避けて通っていたdelegate。しかしTabViewを使うにはそのdelegateとやらを使わなくてはならないようで、がっくり。Tabが変更されたことを通知するには、TabViewからコントローラーへoutletのdelegateと接続し(なんか日本語になってない)ておいて、コントローラー(rb)ファイルに、tabView_didSelectTabViewItemというメソッドを作る模様。すると、TabViewが変更されたときにそのメソッドが起動されるらしいです。

def tabView_didSelectTabViewItem(tabView, tabViewItem)
ここに変わったときに行われる内容を書けばいい。
end

TableViewのときはdataSourceにリンクしましたし、PopUpButtonの場合はActionにリンクすればOKでした。。。うーん、分からないなりに分かったような、いや分かってないような。。手探りで進行中。

ポップアップボタンで選択を変更すると、テーブルの表示も変わる

  • Posted by: hiroe
  • 2006年4月17日 06:21
  • RubyCocoa

CocoaDev: HowCanITellIfNSPopupButtonHasChanged

昨日ひっかかってたのが、NSPopUpButtonで選択をAからBへ変更すると、それに合わせてテーブルに表示されている内容も変更されるにはどうしたらいいかということ。NSPopUpButtonが変わったら起動してくれるアクションがあれば良いんだろうけど・・・。いよいよbindingとか、真剣に解読しなければならないのか、と思ってたところで見つけたのが上の書き込み。

すごく簡単でした。質問者のお礼回答に親近感を抱いてしまいました。IB側だけでほぼ実装できました。Contorollerにpopup_changedとか適当な名前でactionを付け足して、それとPopUpButtonをconnectすればいいだけ。それでそのactionの定義をすればOK・・・

次行ってみよう・・・

Amazonを検索して、ファイルを作る

  • Posted by: hiroe
  • 2006年4月16日 17:14
  • RubyCocoa

amazon_new.png

「椰子の実通信」のページでトップの新刊情報だったところがちょっと変わったのですが、少しづつ作っていたソフトウェアができたからなのです。今までISBNのリストを作っておいて、それをターミナル上からrubyでAmazon検索してファイルを作成し、最後はFTPソフトでアップロードして作っていた新刊情報とトップの新刊案内ですが、それにインターフェースを付けてみました。画面に情報が出る分、もう少しいろいろできたので、自分で選んだ数件をトップのファイルにし、FTPするところまでソフトウェアでやってもらうことに。ファイル作成ボタンにFTP機能まで付けるか迷ったのですが、のちのちアップロード先(サーバー)を選べる機能とか付けてみたかったので、とりあえず別のボタンに。いかにも素人臭くて、あかぬけないインターフェースなのですが、とりあえずできたからよし。FTP機能が思ったより簡単についたのが驚き。これならFTPクライアントも簡単にできそう?

次はキーチェーン対応かな。。。

各値がハッシュの配列をハッシュのある値でソート

  • Posted by: hiroe
  • 2006年4月12日 12:10
  • RubyCocoa

TableViewに値を埋め込む場合、列名をキーにしたハッシュを配列にすると簡単にできるのでそうしているのですが、
ここで引っかかったのが、ある列の値でソートをすること。

@files = [{date => "2006/04/12", title => "A"}, {date => "2005/12/10", title => "B"}, {date => "2006/03/01" title => "C"}]

という配列があった場合、日付(date)でソートして、

[{date => "2005/12/10", title => "B"}, {date => "2006/03/01" title => "C"},{date => "2006/04/12" title => "A"}]

にするには?ということです。

結局解決方法は簡単でした。

@files.sort{|a, b|
 a['date'] <=> b['date']
}

昇順の場合。降順は、b['date'] <=> a['date']

a, b に配列のインデックスが入るのかと勘違いしていろいろ試した私は、最終的にむりやりaの値をprintさせてみたら、「なんだ、配列の値(ハッシュそのもの)が入ってるじゃん」(よく考えたら当たり前)と、なんか頭に電灯が点った気分。検索してもPerlのやり方(しかも結構複雑だったり)しか出てこないし、案外質問してる人もいるので、メモとして書いておきます。

文字コードはここでも問題に

  • Posted by: hiroe
  • 2006年4月10日 07:00
  • RubyCocoa

「椰子の実通信」のトップと新刊情報で使っているHTML(トップの表示にはPHPを使用)は、予め新刊情報などから得たISBNをリスト化しておき、rubyを使ってAmazonに検索に行かせ、24時間以内になった時点で既刊、それまでのは予約として整形する方法で生成しています。Mac OS Xには最初からrubyがついてて、しかもnet/httpもOKなヴァージョンだったので、Windowsで使っていたrubyファイルをそのままMacに移植。フォルダ名だけいじってほぼいけるか、と思ったのですが、ひっかかったのが文字コード。というか、Uconv。

コンパイルできないんです。

ネットを検索してもよくわかんないし、しかもintelMacときたからさらに情報少ない。仕方なくrbuconvを持ってきて使うことにしました。

で、それにXcodeとRubyCocoaでインターフェースをつけようと、小遣い帳とは別に作っているのです。ruby自体にもftpがついているし、Xcodeからシェル?機能を使うこともできるらしいから、ワンクリックでFTPまでできるといいなーと思ってるのですが、またしても最初にひっかかるのが文字コード。コードはUnicodeで書いてるし、Macの入力コードもUnicode、XMLは基本的にUnicodeなはずなので、問題ないかと思いきや、何故か表示はUnicodeのままじゃ出来ず、rbuconvをrequireしてu8tosjisしたら表示できるのです(単純にrequireしたらuconv変換テーブルが相対パスでは通らず、rbuconvのソースをいじって、フルパス指定にしちゃいました。もう少しスマートに出来るようにちょっと考えよう・・・)。どうしてなんだろう。

うーん、日本語って難しい。。。見た目が違うわけじゃないから余計に。

NSDatePickerでつまづく

  • Posted by: hiroe
  • 2006年4月 8日 10:28
  • RubyCocoa

nyuryoku.png

この解説のおかげで、Tableへの表示方法とか、更新方法とかわかったので、そこまでは良いとして、とりあえず上のような入力画面を作ってみました(ここまではドラッグアンドドロップだけで作れる。すごい)。ここではまったのが、NSDatePicker。比較的新しい機能らしく、カレンダーとか簡単に表示できるのですが、ここにディフォルトで今日の日付を表示させる、ところでつまづいたのです。

NSDatePickerには、setDateValueというメソッド?があるようで、これでいけるかと思って、

date = Time.now
@date.setDateValue(date)

としても何も入れてくれない。dateの部分に"2006-04-01 00:00:00 +0900"とかしてもダメ。NSDatePickerのドキュメントを見ると、NSDateオブジェクトを入れろ、とあるので、Time.now使ってるじゃん、とかやつあたり。

今度はRubyCocoaのドキュメントを見ると・・・

Cocoa派生クラスのインスタンスをRubyスクリプト中で生成する必要がある場 合には、既存のCocoaクラスの場合と同様に

AppController.alloc.init # use this

のように書きます。

と書いてあって、あーこれかーと思いました。そうだよ、NSDateオブジェクトとrubyのTimeオブジェクトは全く別物なんだよキミ。NSDateオブジェクトを生成するには、NSDate.initを使う必要があったのでした。

というわけで、awakeFromNibのところに

date = NSDate.init.date
@Date.setDateValue(date)

としたら、ばっちり。バンザーイ。dateじゃなくてdateWithStringとかも使えるので、思った日付を表示できそうです。

XcodeとrubyCocoa

  • Posted by: hiroe
  • 2006年4月 8日 10:01
  • RubyCocoa

何がきっかけだったか、MacにはCocoaという開発環境?みたいなものがあって、それを使えば簡単なソフトウェアなら自分で作れる、と知ったのです。さっそく検索してみて

Cocoaでいこう!Macらしく

というページを発見。WindowsでいうAccessの豪華版という感じで、確かに簡単にできそうな雰囲気。いろいろ検索した結果、私が使っているMac OSXにはXcode2.2という最新版の統合開発環境が入っていて(ディフォルトではインストールされないので、付属DVD-ROMから追加インストールする)、それを使えばいいということがわかりました。ただ、シェアの圧倒的に少ないMacのさらに開発環境ということで、日本語で解説しているページは少なく、そういう意味で学ぶのは壁が高そう。英語で解説書があるようですが、開発環境自体のアップデートに追いついていないようで、古いものが多いのです。そしてコードを書くための言語はObjective-C。何それ?C言語と違うの?と思ったのですが、Macで使われるC言語の変異版のようで、これまた解説書が少ない・・・。いくつか見てみましたが、C言語入門の入門くらいのレベル程度の知識しかない私としては、序文に「C言語の知識がある程度あることを前提として」と書かれた時点で門前払いです。

どうにかならないかといろいろ回っているとRubyCocoaというrubyでCocoaプログラミングができるようにしてくれているフレームワーク?を発見しました。ここでまたUBの壁があったりしたのですが、開発者(日本人!)の方が出しているベータ版のUB版を拾ってきてインストール(人柱だから)。そっちだとちゃんとExampleも動くし、いまのところ問題なさそう。そして

An Introduction to RubyCocoa, partI

というの見ながら、実際にどういう動きをするのかを確認。ちなみに上記記事は、最終的にはtarその他のアーカイバができ上がるようになってるので、とっても便利ですよ。ある程度知識のあるRubyで書かれていれば、Objective-Cの使われ方も分かってきて、おーなるほどーという面もいくつかあり。

とりあえずBindingとか、CoreDataは後回しにして、Rubyで書いたコードにインターフェースを付ける、というところまでガンバローと少しづついじっています。それに、いろいろ落としてきた家計簿の中で、「あなたの家計簿」だったか、データをテキストタブ区切りで持っているソフトがあったんですよね。この方式までなら私もどうにかなるか、と思って、ちまちま書いてます。実行してみて落ちては、エラーを読んでその部分を直す、という危険な?方法を使うので、いつかぶっ壊れるのではないかと不安はあるのですが(笑)。

このrubyCocoaカテゴリは、そんな私の奮闘メモです。。。Objective-Cという言葉自体を初めて聞いたレベルの初心者ですので、何か勘違いしてる点があったら、是非教えていただけるとありがたいのです。

参照:RubyCocoa

More...

Home > RubyCocoa

Search
Feeds

Page Top