맥루비의 신무기, HotCocoa
July 28th, 2008
지난 글에서 맥루비(MacRuby)를 소개했었다. 현재 맥루비는 0.2 버전이 공개되었고, RubyConf 즈음 발표될 0.3 버전은 첫 안정버전이 될 예정이다. 그런데 0.3 버전에 포함될 기능 중 눈에 띄는 것이 하나 있다. 바로 HotCocoa다(개발버전 trunk에서 사용할 수 있다). 뜨거운 루비가 아니라 뜨거운 코코아 ^^
HotCocoa는 Rucola처럼 루비스럽게 코코아를 사용하기 위한 DSL이다. 하지만 프레임워크보다는 API의 접근 방식을 취했다. 코코아 자체가 훌륭한 프레임워크이니까 이게 더 자연스러운 느낌이다.
누구냐 넌!
이 글을 통해 HotCocoa를 처음 접한다면, '도대체 뭐에 쓰는 물건인고?'라는 반응이 당연할 것이다. 아래 코드를 보자.
- win = NSWindow.alloc.initWithContentRect [10,20,300,300],
:styleMask => (NSTitledWindowMask | NSClosableWindowMask | NSMiniaturizableWindowMask | NSResizableWindowMask)
NSWindow를 하나 만드는 코드인데, 그리 예쁘지않다. 흉직하다는 표현이 어울릴지도 모르겠다. HotCocoa는 이 문제를 해결하려고 한다. 이런 식으로 말이다.
- win = window :frame => [10,20,300,300]
적당한 이름의 DSL과 상황에 맞는 기본값(위의 styleMask처럼)이 제공해 군더더기 코드를 빼자는 것이 HotCocoa의 목적이다. 보다 루비스러운 코코아 API를 만드는 것이다.
그리고 아래 코드처럼 이벤트 처리에는 루비의 블럭 문법을 잘 활용한다.
- window :frame => [200, 800, 300, 120], :title => "HotCocoa!" do |win|
win.did_move do
puts "Window moved to #{win.frame.inspect}!"
end
end
HotCocoa로 만드는 SpeakLine 예제
HotCocoa를 이용하면 인터페이스 빌더 없이도 간편하게 루비로 간단한 UI를 가진 코코아 애플리케이션을 개발할 수 있다.
02 컨트롤 다루기 - 한줄 말하기 애플리케이션에서 루비 코코아로 만들었고, 맥루비(MacRuby) - 루비 코코아의 새로운 도전에서 맥루비로 만들었던 애플리케이션을 이번에는 HotCocoa로 다시 만들어보자.
코드는 아래가 전부다. 따로 NIB 파일이 필요하지도 않다. 마치 무거운 레일스 애플리케이션 대신 Sinatra로 가볍게 애플리케이션을 만드는 느낌이다.
- require 'hotcocoa'
include HotCocoa
def say_it
voice = NSSpeechSynthesizer.availableVoices[@combo.indexOfSelectedItem]
NSSpeechSynthesizer.new.initWithVoice(voice).startSpeakingString(@text.stringValue)
end
application do |app|
window :frame => [200, 200, 400, 110], :title => 'SpeakLine with HotCocoa' do |win|
win << layout_view(:mode => :horizontal, :frame => [30, 0, 350, 40]) do |view|
view << (@combo = combo_box(:frame => [0, 0, 200, 25], :data => NSSpeechSynthesizer.availableVoices))
view << button(:title => 'Say It!', :on_action => Proc.new{say_it})
end
win << (@text = text_field(:frame => [25, 0, 350, 25]))
end
@combo.selectItemAtIndex(0)
end
API가 더 늘어나 좀 더 유창한 루비(?)를 구사할 수 있다면, 꽤 재미있어질 것 같다. 그리고 Nib2HotCocoa와 같은 변환기도 하나 있으면 좋겠다.
참고 자료




Leave a Reply