안녕, UI! 작전명: 창을 띄워라
August 27th, 2008
이전 연습: 유쾌한 점퍼 (Jolly Jumper)
문제
고작 세 문제뿐이 안 풀었지만, 이쯤에서 살짝 쉬어가는 단계를 만들기로 했다.
갑자기 정말 간단한 GUI 프로그램이 만들고 싶어졌다. Factor나 얼랭으로 GUI 프로그래밍을 처음하므로 화면에 버튼 한개를 그리고 그 반응으로 메시지를 출력하는 매우 초보적인 Hello world 수준의 예제를 만들어보기로 했다. 이른바, 수단 방법 가리지 말고 창을 띄워보자~!
풀이
루비는 GUI 바인딩이 썩 좋은 편은 아니었다. 언젠가 마소에 GUI를 루비의 단점으로 꼽은적도 있었을 정도다. 하지만, 이것도 시간이 많은 부분 해결해주었다. 최근 주목받고 있는 shoes를 이용하면 정말 간단하고, 루비스러운 코드로 대부분의 플랫폼에서 동작하는 GUI를 만들 수 있다. 맥에서는 깔끔하게 코코아로 동작하는 모습을 볼 수 있다.
- Shoes.app(:width => 100, :height => 70) do
background "#EFC"
border "#BE8", :strokewidth => 6
stack(:margin => 10) {
button("Hello!") { alert("I'm Shoes") }
}
end
자신감 충만한(?) 루비에는 좋은 무기가 하나 더 있다. 전에도 소개한 적 있는 맥루비의 신무기, HotCocoa다. 오래 걸리지 않을테니 HotCocoa로도 한번 만들어보았다.
- alert = Proc.new {
NSAlert.alertWithMessageText("I'm MacRuby",
defaultButton: "OK",
alternateButton: "Cancel",
otherButton: nil,
informativeTextWithFormat: "HotCocoa").
runModal
}
application do |app|
window :frame => [100, 100, 100, 60], :title => "MacRuby!" do |win|
win << button(:title => "Hello!", :on_action => alert)
end
end
Factor IDE를 보면 (OpenGL을 잘 활용할 수 있는) UI 프레임워크가 잘 갖춰져있는 모습이다. cocoa 바인딩도 있지만, 이번에는 Gadget 기반의 UI 프레임워크를 사용해봤다. 은근히 없는게 없는 Factor다.
- : open-label-window ( -- )
<pile> 1 >>fill
"Factor Widget" <label> 20 <border> add-gadget
"OK" [ close-window ] <bevel-button> add-gadget
"Alert" open-window ;
: open-hello-window ( -- )
"Hello!" [ open-label-window ] <bevel-button>
"Factor" open-window ;
: hello ( -- )
[ open-hello-window ] with-ui ;
얼랭에는 Graphics System이 있다. 역시나 플랫폼 독립적인 라이브러리다. 맥에서는 Tk를 기반 시스템으로 사용한다. 얼랭은 서버 역할에 충실하고, GUI 클라이언트를 외부 시스템으로 만드는 느낌으로 접근하면 좋을 것 같다.
- start() ->
S = gs:start(),
Win = gs:window(S,[{title,"Erlang"},{width,150},{height,100}]),
gs:create(button,hello,Win,[{y,30},{x,50},{width,50},
{label,{text,"Hello!"}}]),
gs:config(Win,{map,true}),
loop().
hello() ->
S = gs:start(),
Message = gs:window(S,[{title,"Hello"},{width,250},{height,70}]),
gs:create(label,text,Message,[{y,0},{x,0},{width,250},
{label,{text,"Erlang Graphics System"}}]),
gs:create(button,hellook,Message,[{y,30},{x,100},{width,50},
{label,{text,"OK"}}]),
gs:config(Message,{map,true}).
loop() ->
receive
{gs,hello,_,_,_} -> hello();
{gs,hellook,_,_,_} -> exit(normal)
end,
loop().
후기
- 약간씩 어설픈 결과물이지만, 다들 자주 사용하지 않는 시스템들이어서 찾아서 뭔가 만드는 재미가 꽤 좋았다.
- 개발을 하면서 느끼는 주관적인 감정들이라 딱히 설명하기는 힘들지만 각 언어마다 만들어주는 분위기가 있어서, 같은걸 만들겠다고 시작해도 어떤 언어를 이용하냐에 따라 결과물은 조금씩 달라질 수 있겠다.
- 클라이언트 사이드의 UI는 점점 더 풍부하고 미려함을 추구하고 있는데, 위 언어들은 어느 정도에 와 있는걸까?
- 다음 쉬어가는 페이지는 웹 애플리케이션에 도전할 생각이다.
- 이제 자야지.




August 28th, 2008 at 01:24 PM 저는 Ruby의 .NET DLR인 IronRuby로 한 번 구현해 보았습니다. <br/>닷넷 2.0이 설치 되어 있어야 하며, <br/>IronRuby는 http://rubyforge.org/projects/ironruby 에서 다운로드 가능합니다. ^^ <br/> <br/> <br/> <br/>require 'C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Windows.Forms.dll' <br/> <br/>forms = System::Windows::Forms <br/>box = forms::MessageBox <br/> <br/>box.show
August 28th, 2008 at 01:36 PM 내용이 길이 제한이 있군요. ㅡ,.ㅡ;; <br/>거기다 수정도 안돼고.. ㅎㅎ <br/>이쪽에 완전한 내용이 있습니다. <br/>http://lambda.springnote.com/pages/1682194
August 28th, 2008 at 01:39 PM 람다// ㅎㅎ 미투데이를 연동하다보니 조금 제약이 있네요 ^^
August 28th, 2008 at 01:47 PM 람다// IronRuby 코드 예쁘고 좋네요~
August 28th, 2008 at 02:57 PM 최고의 루비스트이시면서도 공부를 게을리하지 않으시는군요;; 대단하세요;;
August 28th, 2008 at 03:18 PM 틈틈히 올려주시는 놀라운 코딩 신공~~ 잘 보고 배우고 있습니다.
August 29th, 2008 at 02:46 AM 역시.. 얼랭은 넘 후지군요. ㅠ
August 29th, 2008 at 02:49 AM hey// 얼랭이 잘하는건 따로 있는거니까 그런거겠죠? ^^
August 29th, 2008 at 02:49 AM http://code.google.com/p/erlycairo/ <br/> <br/>오잉! 이런 게..
August 29th, 2008 at 02:49 AM jjin// 으아. 과찬이십니다
August 29th, 2008 at 02:49 AM thinkr// 저도 thinkr님이 올려주시는 놀라운 글들 잘 보고 있습니다.
August 29th, 2008 at 08:38 PM Just FYI, using MacRuby trunk you can now do: <br/> <br/>application do |app| <br/> window :size =
August 29th, 2008 at 08:41 PM Just FYI, using MacRuby trunk you can now do: <br/> <br/>application do |app| <br/> window :size =
August 30th, 2008 at 06:57 AM 재미있어 보입니다
September 3rd, 2008 at 11:06 AM 제가 여기서 얼마나 많은 정보를 얻고 있는지 모른답니다^^ 너무 고마운 정보 매일 감사하게 받고 있습니다. 자주 들릴께요^^
September 4th, 2008 at 05:51 AM codingbakery// 감사합니다 ^^