Hatena::ブログ(Diary)

Fly me to the Juno! このページをアンテナに追加 RSSフィード

2012-10-30

RSpecでGZipされたファイルのopenをmockするメモ

require 'open-uri'
binary = open(filepath,'rb')
read = mock('open')
read.stub(:readpartial).and_return{|length| 
  binary.readpartial(length)
}
if (defined? content_encoding).nil? or content_encoding.nil?
  read.stub(:content_encoding).and_return([])     
else                               
  read.stub(:content_encoding).and_return(content_encoding)
end            

2008-02-23

WidgetにListenerを登録するには

なんて書いてみたけれども、『Listenerを登録する』という概念がGlimmerには存在しません。どういうことかっていうと次のコードを見てみてください。

@show_button = button {
  text "表示"
  on_widget_selected {
    @practice.visible true            
  }
  on_focus_gained{
     puts "focus_gained"
  }
  on_focus_lost{
    puts "focus_lost"
  }
}

なんかイベントハンドラみたいに書けるんですけど!登録できるリスナの呼び出し先のメソッド名がそのままハンドラ名になってるようです。これでややこしいリスナクラスを覚えなくても色々ごにょごにょできる。っていうか、この呼び出し方法ってセンスがいいとおもう。すげーなー。

2008-02-22

Glimmer使ってアジャイルプラクティスを表示するランチャを作ってみた。

やばい。かわいいよ。Glimmer。かわいいよ。

と、かいてみたもののやっぱりSWTのくせを感じずにはいられない。Shellの大きさを指定してもその通りにならない。内部のCompositeによるみたい。GridLayoutなどには対応している模様なので、Shellに設定するテキストタイトルが長いような場合を除いてはいい感じだと思った。LLはお手軽なのがいいですね。

require File.dirname(__FILE__) + "/../src/swt"

class PracticeFortune
  def todays_practice
    practices = [
    '成果をあげるのが仕事',
    # ...中略
    'みんなに知らせる'
    ];
    number = rand(practices.size)
    return "No:" << number.to_s << " " << practices[number]
  end
  include_package 'org.eclipse.swt'
  include_package 'org.eclipse.swt.layout'
  
  include Glimmer

  def launch
    @shell = shell {
      composite {
        label { 
          text "本日のアジャイルプラクティス"
        }
        label { 
          text todays_practice 
        }
      }
    }
    @shell.open
  end

end

puts PracticeFortune.new.launch

layoutを指定したい場合は

composite {
  # この部分
  layout GridLayout.new(2,true)
  label { 
    text "本日のアジャイルプラクティス"
  }
  label { 
    text todays_practice 
  }
}

と言う感じで指定します。

2008-02-21

JRuby on Eclipse RCPに一歩近づくGlimmer絶賛開発中

InfoQ本家より、Rubyを使ってSWT/JFaceのGUIを書けるGlimmerというライブラリが絶賛開発中。Eclipse Foundationにも申請中のプロジェクトらしい。ちょっと振り返ってみたら、昨年12月に見つけたプロジェクトが順調に育っているものみたい。

hello_world.rbを転載しますね。

# Copyright (C) 2007-2008 Annas Al Maleh
# Licensed under the LGPL. See /COPYING.LGPL for more details.

require "java"
require File.dirname(__FILE__) + "/../src/swt"

class HelloWorld
  include_package 'org.eclipse.swt'
  include_package 'org.eclipse.swt.layout'

  include Glimmer

  def launch
    @shell = shell {
      text "SWT"
      composite {
        label { 
          text "Hello World!" 
        }
      }
    }
    @shell.open
  end
end

HelloWorld.new.launch

compositeとかをRuby DSLで書けるのが最大の特徴らしい。どうやってListenerを登録して行くのかが興味深い。せっかくなので、環境を整えてサンプルを動かしてみました。

  1. そもそもJRubyを落としていなかったので、配布サイトから最新版のJRuby1.0.3を落とし、解凍($JRUBY_HOMEとする)
  2. $JRUBY_HOME/binにパスを通す
  3. $JRUBY_HOME/lib以下にSWTのJarを入れる(もちろんフラグメントのJarも入れる)
  4. Glimmerは中でfacetsというライブラリを使っているので、rubygemsを使って取得した。コマンドはgem install facets
  5. Glimmerのサンプルフォルダへ移動して、jruby -rubygems hello_world.rbで動きました。

JFaceも動くんで、こんなビューも作れます。結構いい感じ。

f:id:kompiro:20080222002444p:image

正直Rubyが書けるというだけの人には、SWT特有のLayoutクラスに悩まされる気がします。なのでSWT自体が万人受けはしなさそうだと思ってます。(他のGUI Widgetを知らないので、この意見は微妙かもですね。)でもJavaでほげほげクラスのインスタンスを作ってはどーだこーだやるよりはかなりよさそうです。

no title

2007-12-14

JRuby on RCP

来年のEclipseCon2008にてJRuby on RCPってな感じでRCPアプリケーションをJRubyで実装するという話が講演されるようです。

https://eclipsecon.greenmeetingsystems.com/submissions/view/2

まぁ、RCPに使えるんだったらPluginにも使うよねぇ。っていうか、絶対そういう話でるよなぁ。やってみようかな。どうしようかなと思ってたらカンファレンスで取り上げられるくらいホットなトピックスになるとは。Ruby/SWT(表記まつがってない?)を使って実装するらしい。もちろんJFaceも使えるよ。ふーん。