이전 연습: 유쾌한 점퍼 (Jolly Jumper)

 

문제

고작 세 문제뿐이 안 풀었지만, 이쯤에서 살짝 쉬어가는 단계를 만들기로 했다.

 

갑자기 정말 간단한 GUI 프로그램이 만들고 싶어졌다. Factor나 얼랭으로 GUI 프로그래밍을 처음하므로 화면에 버튼 한개를 그리고 그 반응으로 메시지를 출력하는 매우 초보적인 Hello world 수준의 예제를 만들어보기로 했다. 이른바, 수단 방법 가리지 말고 창을 띄워보자~!

 

풀이

그림_4.png

루비는 GUI 바인딩이 썩 좋은 편은 아니었다. 언젠가 마소에 GUI를 루비의 단점으로 꼽은적도 있었을 정도다. 하지만, 이것도 시간이 많은 부분 해결해주었다. 최근 주목받고 있는 shoes를 이용하면 정말 간단하고, 루비스러운 코드로 대부분의 플랫폼에서 동작하는 GUI를 만들 수 있다. 맥에서는 깔끔하게 코코아로 동작하는 모습을 볼 수 있다.

 

그림_5.png

 

  1. 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로도 한번 만들어보았다.

 

그림_6.png

 

  1. 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

 

 

 

 

logo.png

Factor IDE를 보면 (OpenGL을 잘 활용할 수 있는) UI 프레임워크가 잘 갖춰져있는 모습이다. cocoa 바인딩도 있지만, 이번에는 Gadget 기반의 UI 프레임워크를 사용해봤다. 은근히 없는게 없는 Factor다.

 

그림_10.png

 

  1. : 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 ;

 

 

erlang.gif

얼랭에는 Graphics System이 있다. 역시나 플랫폼 독립적인 라이브러리다. 맥에서는 Tk를 기반 시스템으로 사용한다. 얼랭은 서버 역할에 충실하고, GUI 클라이언트를 외부 시스템으로 만드는 느낌으로 접근하면 좋을 것 같다.

 

그림_9.png

 

  1. 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는 점점 더 풍부하고 미려함을 추구하고 있는데, 위 언어들은 어느 정도에 와 있는걸까?
  • 다음 쉬어가는 페이지는 웹 애플리케이션에 도전할 생각이다.
  • 이제 자야지.

 

 

16 Responses to “안녕, UI! 작전명: 창을 띄워라”

  1. 스프링로그 Says:
    저는 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
  2. 람다 Says:
    내용이 길이 제한이 있군요. ㅡ,.ㅡ;; <br/>거기다 수정도 안돼고.. ㅎㅎ <br/>이쪽에 완전한 내용이 있습니다. <br/>http://lambda.springnote.com/pages/1682194
  3. deepblue Says:
    람다// ㅎㅎ 미투데이를 연동하다보니 조금 제약이 있네요 ^^
  4. deepblue Says:
    람다// IronRuby 코드 예쁘고 좋네요~
  5. jjin Says:
    최고의 루비스트이시면서도 공부를 게을리하지 않으시는군요;; 대단하세요;;
  6. thinkr Says:
    틈틈히 올려주시는 놀라운 코딩 신공~~ 잘 보고 배우고 있습니다.
  7. hey Says:
    역시.. 얼랭은 넘 후지군요. ㅠ
  8. deepblue Says:
    hey// 얼랭이 잘하는건 따로 있는거니까 그런거겠죠? ^^
  9. hey Says:
    http://code.google.com/p/erlycairo/ <br/> <br/>오잉! 이런 게..
  10. deepblue Says:
    jjin// 으아. 과찬이십니다
  11. deepblue Says:
    thinkr// 저도 thinkr님이 올려주시는 놀라운 글들 잘 보고 있습니다.
  12. 스프링로그 Says:
    Just FYI, using MacRuby trunk you can now do: <br/> <br/>application do |app| <br/> window :size =
  13. 스프링로그 Says:
    Just FYI, using MacRuby trunk you can now do: <br/> <br/>application do |app| <br/> window :size =
  14. 각혈염통2 Says:
    재미있어 보입니다
  15. codingbakery Says:
    제가 여기서 얼마나 많은 정보를 얻고 있는지 모른답니다^^ 너무 고마운 정보 매일 감사하게 받고 있습니다. 자주 들릴께요^^
  16. deepblue Says:
    codingbakery// 감사합니다 ^^

Leave a Reply

Website

Email