月曜日 6 09, 2008

Ruby/JRuby関連イベント

今月はRuby会議 2008がある、ということもあってRuby/JRuby関連のイベントが盛りだくさんです。
Web
いっぱいあるのでカレンダーにまとめてみました。無駄にイラレで描いてみたんですが、flickrに載せるとjpgになってしまうこともあって色とかぐだぐだです。結局カレンダーにしてもわかりやすくなかったので、ちゃんと文字で載せておきます (\^\^ゞ

今月の2時間で学ぶJava Hot Topicセミナー 6月号

いつもの通り、Sun用賀本社にて18:30よりスタートします。今回 JRubyでは高井さん、もう一つのトピックはSIPサーブレットとProject SailFinについて寺田さんより。暮しの手帖シリーズと並んで、〜〜パワーアップがシリーズ化されるかも密かに期待です。参加は無料ですが登録制となっておりますので、イベントページよりご登録ください。

JRuby が俺にもっと輝けと囁いている —— JRuby と DSL で Java をパワーアップ!

伊藤忠テクノソリューション株式会社 高井 直人 (たかい なおと)
JRuby に興味はあるけど、なかなか手が出せないという方も多いのではないでしょうか。JRuby は Web アプリケーションばかりではなく、開発のさまざまな場面で役に立つツールとして活用できます。今回は、開発ターゲットに合わせた DSL (ドメイン固有言語)を JRuby を使って作成し、Java による開発に役立てる手法を紹介します。

GlassFish の新星 SailFin —— Java で通信系のサービスもパワーアップ!

Java エバンジェリスト 寺田 佳央(てらだ よしお)
IP 電話やインスタントメッセージなどの通信系のアプリケーションを作ってみませんか。HTTP プロトコルに類似した SIP を使うと、Web アプリケーションのアナロジーで通信系のアプリケーションが開発できます。このときに重要な働きをするのが SIP サーブレットのコンテナ。このセッションでは GlassFish のサブプロジェクトで人気急上昇中のコンテナ SailFin についてデモを交えながら熱く語ります。

JRuby の最新動向と NetBeans, GlassFish, Solaris on Sun サーバ

こちらは、JRubyの最新動向はもちろん、その周辺ツール、アプリケーションサーバ、SolarisとSunサーバと、実行スタックの上からしたまでずずいと紹介しようと言う欲張りなセミナーです。こちらも参加は無料ですが、登録制となっていますので下記イベントページよりご登録のうえご参加ください。ちなみにこのセミナーでは岡崎もGlassFishとRubyの関係についてご紹介しますが、資料はこれから作りますので (\^\^ゞ
リクエストをこのブログエントリのコメント欄なんかに書いていただければ最大限取り入れるようにしようと思います。なにかGlassFish + Rubyでのトピックで気になるところがあれば。

NetBeans 6.1 で加速する Ruby on Rails 開発

JRuby エバンジェリスト 野澤 智(のざわ とも)
Java の開発環境としてだけではなく、(J)Ruby の開発環境としても有効な NetBeans 6.1。Ruby on Rails の開発での gem やプラグインの管理、rake タスクの実行、デバッグ、スニペットなど、NetBeans6.1 の特徴をご紹介いたします。NetBeans 6.1 を使うことでよりアジャイルに開発を加速します。

GlassFish で安心、エンタープライズ Ruby

Java エバンジェリスト 岡崎 隆之(おかざき たかゆき)
GlassFish は Java EE だけのアプリケーションサーバだと思っていませんか?実は GlassFish では JRuby を使って Ruby on Rails 実行環境を構築できるだけでなく、クラスタ環境などへの配備もサポートしています。ミッションクリティカル環境で使われている GlassFish の安心感をエンタープライズ Ruby でもご堪能ください。

JRuby 最新動向

米国サン・マイクロシステムズ社 Charles Nutter, Thomas Enebo

(J)Ruby on Rails Tuning Tips

Solaris エバンジェリスト 河原 一哉(かわはら かずや)
(J)Ruby on Rails でアプリケーションを構築する際の Tuning Tips をご紹介いたします。Web サーバの設定、データベースサーバの設定、OS のチューニング、アプリケーションのボトルネック解析など、さまざまな角度からチューニングを行うノウハウをご紹介いたします。

木曜日 5 22, 2008

RAILS OF RUBY ON RAILSを買ってきた

Nozawaさんのブログを見て思い出しました。前から買おうと思っていたのに忘れていた本、「 Rails of Ruby on Rails ~Case of LOCUSANDWONDERS.COM~」をさっき買ってきました。ぱっと見ではRubyの本だ!とは気づかないようなカッコイイデザイン。これがプログラマー向けの本の場合、Railsの使い方に終始して、サンプルアプリが幾つかある。というパターンが典型的ですが、この本ではブログの作り方とか、ショッピングカートの作り方のようにサイトをデザインする際に必要なユースケースごとに説明があることです。
Rubyは今までもコマンドラインでテキスト整形などに使っていましたが、実はRailsってほとんど触ったことがありません。ほとんど、というか、Scaffoldさえ触っていません・・。NetBeansのRuby/Rails機能を使っているのでそんなRails初心者の僕にうってつけの本です。

木曜日 4 17, 2008

ホットトピックセミナー 2008年4月号のストリーミング配信

昨日行われました毎月恒例のJava Hot Topicセミナー4月号を収録したストリーミング配信のご案内です。資料はまた準備ができ次第Javaエバンジェリストブログにて公開させていただきます。

初心者のための実践 JRuby on Rails 講座 〜 RSS リーダを GlassFish で動かそう 〜

野澤 智(のざわ とも)

Javaパズラーズ

大渕 雅子(おおふち まさこ)片貝 正紀(かたかい まさき)
その1

その2

Sun のオープンソース 暮らしの手帖 - OpenSSO 編

岩片 靖(いわかた やすし)

月曜日 2 25, 2008

JRubyでJMX

ずいぶん前の話ですが、IdMセミナーより: Identity ManagerをJMXで監視するというエントリでJMXによるアプリケーションサーバ監視をJRubyからやる。というのをご紹介しました。そのときに、JRuby開発者Thomas Eneboにこんなモジュールを作ってもらいました。ずっと前から紹介しようと思っていたのに、今頃気づきました・・・。すいません・・・。
include Java

import javax.management.DynamicMBean
import javax.management.MBeanInfo
import javax.management.ObjectName
import javax.management.remote.JMXServiceURL
import javax.management.remote.JMXConnectorServerFactory

module JMX
  class MBeanServerConnector
    def initialize(location, server)
      @url = JMXServiceURL.new location
      @server = JMXConnectorServerFactory.newJMXConnectorServer @url, nil, server.server

      if block_given?
    start; yield; stop
      end
    end

    def active?; @server.isActive; end
    def start; @server.start; end
    def stop; @server.stop if active?; end
  end

  # Represents both MBeanServer and MBeanServerConnection
  class MBeanServer
    import javax.management.remote.JMXConnectorFactory
    import javax.management.MBeanServerFactory
    import javax.management.Attribute

    attr_accessor :server
    @@classes = {}

    def initialize(location=nil, username=nil, password=nil)
      if (location)
    url = JMXServiceURL.new location
        if (username)
          credentials = java.lang.String[2].new
          credentials[0], credentials[1] = username, password
          env = {"jmx.remote.credentials" => credentials}
        else
          env = nil
        end
    @server =JMXConnectorFactory.connect(url, env).getMBeanServerConnection
      else
    @server = MBeanServerFactory.createMBeanServer
      end
    end

    def get_mbean(object_name)
      name = ObjectName.new object_name

      raise NoSuchBeanError.new("No name: #{object_name}") unless @server.isRegistered(name)
      @server.getObjectInstance name
      generate_proxy(name)
    end

    def create_mbean(class_name, object_name)
      name = ObjectName.new object_name
      @server.createMBean class_name, name, nil, nil
      generate_proxy(name)
    end

    def default_domain; @server.getDefaultDomain; end
    def domains; @server.domains; end
    def mbean_count; @server.getMBeanCount; end

    def query_names(name=nil, query=nil)
      name = ObjectName.new name
      @server.queryNames(name, query)
    end

    def register_mbean(object, object_name)
      name = ObjectName.new object_name

      @server.registerMBean(object, name)
      generate_proxy(name)
    end

    def generate_proxy(object_name)
      info = @server.getMBeanInfo object_name
      class_name = info.className

      return @@classes[class_name].new if @@classes[class_name]

      # Make local so closure capturage.
      server = @server
      proxy = Class.new
      # Attributes are supported using aref/aset syntax
      proxy.class_eval do
        define_method(:[]) do |name|
          server.getAttribute object_name, name
        end

        define_method(:[]=) do |name, value|
          server.setAttribute object_name, Attribute.new(attr.name, value)
        end
      end

      # Operations get method names (collision potential)
      info.operations.each do |op|     proxy.class_eval do
      define_method(op.name) do |\*args|
        args_array = JMX::MBeanServer.args_array(args)
        signature_array = JMX::MBeanServer.signature_array(args_array)
        server.invoke object_name, op.name, args_array, signature_array
      end
    end
      end

      # Add notification listener methods
      proxy.class_eval do
    define_method(:add_notification_listener) do |listener,\*rest|
      filter, handback = \*rest
      server.addNotificationListener object_name, listener, filter, handback
    end

    define_method(:remove_notification_listener) do |listener|
      server.removeNotificationListener object_name, listener
    end

    define_method(:method_missing) do |method_name, \*args|
      args_array = JMX::MBeanServer.args_array(args)
      signature_array = JMX::MBeanServer.signature_array(args_array)
      server.invoke object_name, method_name.to_s, args_array, signature_array
    end
      end

      @@classes[info.className] = proxy

      proxy.new
    end

    class << self
      def args_array(params)
    return nil if params.nil?

    array = java.lang.String[params.length].new
    params.each_with_index { |parm, i| array[i] = parm }

    array
      end

      def signature_array(params)
    return nil if params.nil?

    array = java.lang.String[params.length].new
    params.each_with_index do |parm, i|       array[i] = Java.ruby_to_java(parm).java_class.name
    end
    array
      end
    end
  end

  class NoSuchBeanError < RuntimeError
  end
end

class RubyDynamicMBean   import DynamicMBean

  def initialize(name, description)
    @info = MBeanInfo.new name, description, nil, nil, nil, nil
    @name, @description = name, description
  end

  def getAttribute(attribute); $stderr.puts "getAttribute"; end
  def getAttributes(attributes); $stderr.puts "getAttributes"; end
  def getMBeanInfo; $stderr.puts "getMBeanInfo"; @info; end
  def invoke(actionName, params=nil, signature=nil);     send(actionName, \*params)
  end
  def setAttribute(attribute); $stderr.puts "setAttribute"; end
  def setAttributes(attributes); $stderr.puts "setAttributes";  end
  def to_s; "#@name: #@description"; end
  def inspect; "#@name: #@description"; end
  def toString; "#@name: #@description"; end
end
これを使うと、JRubyからJMXを使うときにこんな感じでプログラムを書けます。
require 'jmx'

username = "admin"
password = "adminadmin"
url      = "service:jmx:rmi:///jndi/rmi://localhost:8686/jmxrmi"
server   = JMX::MBeanServer.new url, username, password
listener = server.get_mbean "com.sun.appserv:name=server,type=virtual-server,category=monitor,server=server"

puts "Server started at: #{Time.new(listener["hosts-starttime"])}"
こんな感じで、ほんの数行。JMXの手続きとかは知らなくても大丈夫。

水曜日 6 13, 2007

第7回デベロッパーズ・ラウンジ

昨日はもう第7回目を数えるデベロッパーズラウンジに行ってきました。このデベロッパーズラウンジはオープンソース・コミュニティーをリードされている方々を招き、コミュニティー間のコミュニケーションをもっと親密にしていこうというような趣旨の集まりです。
R0015909.JPG
なので、どんどん積極的にコミュニケーションすることが必須とされています。また、前の方ではプレゼンが行われるのですが、そのアジェンダも自分でホワイトボードにどんどん書き込んでいくという形式です。
R0015919.JPG
今回はちょうど来日されているTim Brayさんのプレゼンテーションも。
R0015915.JPG
最近はすこし概要的なお話を見聞きする機会が多かったように思いますが、今回はバリバリテクニカルなお話で、Atomのお話でした。
R0015921.JPG
ただし、プレゼンテーションといっても、全員がきちんと座って聞くのではなく、全員勝手にコミュニケーションをとる!という感じで、全然形式張っていなくて楽しいです。
また、今回は時期的にRuby会議直後であることと、JRubyのコア開発者 Tomas Eneboさん、Charles Nutterさんもこのデベロッパーズラウンジに来られていたのでRuby関連の話題が多かったように思います。
R0015942.JPG
橋本さんによるNetBeans Ruby IDEの紹介や、
R0015976.JPG
Charlesさん、TomasさんによるJRubyの実演デモなど。
R0016043.JPG
今回はJRuby Tシャツを頂きました(しかもCharles、Tomasにサインしてもらいました)

火曜日 6 12, 2007

日替わり実験室: JRubyとグラフィックス

JRubyのデモでは多くの場合、Javaとの親和性をデモンストレーションするためにSwingとの連携が披露されますが、実際にやってみると、JavaでSwingを書くのと同じ記述量が必要なのであまりうまみを感じません・・・。たぶん、フレームの作成とか、パネルの配置とかはJavaでNetBeansなりを使って書いて、スクリプトで書きたい一部分だけをJSR-223を使って呼び出すのが賢いやり方なのでしょう。
しかしながら、それでも負けずにコンソールからJRubyだけを使ってグラフィックスを使ってみることにしました。Swingだけだとおもしろくないので、今回はTimingFrameworkも使っています。
Java標準以外のライブラリをJRuby実行時に指定するには環境変数CLASSPATHにそれを入れておけばよいだけのようです。
$ export CLASSPATH=$CLASSPATH:~/Library/Java/timingframework/TimingFramework-0.54.jar
なお、Java SE 6のAPIを一部使っていますので、Java SE 6が使われるようJAVA_HOME環境変数を設定しておきましょう。Macなら次のような感じです (Java SE 6はApple Developer Conenctionからユーザ登録をして事前にインストールしておきます)。
$ export JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home 
こんな感じで指定すればよいでしょう。ではいきなりですがコーディングです。
#!/usr/bin/env jruby

require 'java'

include_class 'java.awt.Color'
include_class 'java.awt.Graphics'
include_class 'java.awt.geom.Path2D'
include_class 'javax.swing.JPanel'
include_class 'javax.swing.JFrame'
include_class 'org.jdesktop.animation.timing.TimingTargetAdapter'
include_class 'org.jdesktop.animation.timing.Animator'

def draw_suncurve(g, w, h, c)
  s = Path2D::Float.new
  s.move_to(0, 0)
  s.line_to(w, 0)
  s.curve_to(w, 0, w - h / 10, h / 4, w, h / 2)
  s.curve_to(w, h / 2, w + h / 10, h \* 3 / 4, w, h)
  s.line_to(0, h)
  s.line_to(0, 0)
  g.set_color(c)
  g.fill(s)
  s
end

class SunCurveAnimator < TimingTargetAdapter
  attr_accessor :panel

  def begin
    g = @panel.get_graphics
    g.set_color(Color::WHITE)
    g.fill_rect(0, 0, @panel.get_width, @panel.get_height)
  end

  def timingEvent(f)
    draw_suncurve(@panel.get_graphics,
       (@panel.get_width - @panel.get_height / 10) \* f,
       @panel.get_height, Color.new(231, 111, 0))
  end
end

class FrameExecutor 
  include java.lang.Runnable
  def run
    panel = JPanel.new
    frame = JFrame.new('Sun Curve')
    frame.set_default_close_operation javax.swing.WindowConstants::EXIT_ON_CLOSE
    frame.set_size 800, 600
    frame.get_content_pane.add panel
    frame.set_visible true

    sca = SunCurveAnimator.new
    sca.panel = panel

    a = Animator.new(2000, sca)
    a.set_acceleration(0.2)
    a.set_deceleration(0.2)
    a.start
  end
end

javax.swing.SwingUtilities.invoke_later FrameExecutor.new

では実行です。
Drawing Sun Curve
はい、実行されました。なお、JRubyのデモンストレーションでは手間を省くために、しばしばJFrameをメインスレッドから起動していますが、Swingのスレッド扱いの流儀からSwingUtilities#invokeLaterを使うのが本筋でしょう。

日替わり実験室: JRubyとGEM

この間の土日に行われたRuby会議2007で見聞きしたことを早速手元で試そうと、最近、いろいろとRubyをさわっているところなのですが、Javaとの連携も試したいのでJRubyを中心にさわっています。Ruby会議で興味を持ったのは朴 芝印さんが発表されたHpricotというHTMLパーサです。
これを使うと、Webスクラッピングなんかも簡単にできるとのこと。今までPerlを使ってちょっとしたHTMLの整形とかをやっていたのでこれには興味津々です。早速、JRubyで使ってみよう!、ということで gem (JRubyには最初からgemがついています)でHpricotをインストール・・・。と、思ったのですが早速つまずいてしまいました。インストールに失敗してしまいます。
最終的には片貝さんからにたまごほうれん草: JRubyでgemという日記に解決策が載っているということを教えていただきインストール完了です。
では早速、あるWebページからリンクだけ取ってくるというスクリプトを作ってみます。
#!/usr/bin/ruby

require 'rubygems'
require 'hpricot'
require 'open-uri'

events = Hpricot(open('http://jp.sun.com/company/events/').read)
(events/'a[@href]').each { |a| p a.attributes['href'] }
こんな感じですね。だいぶ楽ちん。

月曜日 6 11, 2007

Ruby会議2007, 2日目の日曜日

Jimさんも大絶賛のRuby会議2007の二日目の様子です。二日目は初日に比べればやや空席が目立ちましたがそれでも会場の熱気と一体感は一日目以上でした。
R0015663.JPG
個人的に一番注目していたのはNaoto TAKAIさんによるJRubyのお話です。そういえば前日の懇親会でCharles NutterTomas Eneboも高井さんの話は聞きたいと話していました。
R0015671.JPG
この会議ではIRCを使ってリアルタイムにセッションに参加できる、というおもしろい形式 (先月のCommunity Oneでも似たようなことをやっていましたが)をとっていましたが、会場からのつっこみによって様々なキーワードがピックアップされました。

この中で特にピックアップすると「愛」でしょうね。このRuby会議に参加していてどのセッションからも感じられたのはRubyへの愛です。愛と書くと大げさなような気がしますが、たとえば愛着があるか?と聞かれれば、必ずYesになるでしょう。
R0015760.JPG
今回のRubyKaigiは最後のDaveさんによるキーノートがうますぎた(?)ということもあり、IT系のイベントでは少なくともここ6年以上の中ではもっとも、感動的なイベントでした。Daveさんのプレゼンテーションの後にはスタンディングオベーションも。
R0015794.JPG
このパワーには本当に圧倒されるだけでなく、見習いたいところが本当にたくさんたくさんありました。

さて、話は変わって晩ご飯は今回、Tim Brayさん、Charles Nutterさん、Tomas Eneboさんらとしゃぶしゃぶを食べに行きました。

R0015827.JPG
うーん、さすが。皆さんよく食べます。ところで、Timさんは電気屋でカメラをいろいろみてきたそうで、しかもRICOHのGR DIGITALとCaplio GX100が気になっていたとのこと。
R0015832.JPG
(Photo by Tim Bray, by using Okazaki's GX100)

日曜日 6 10, 2007

Ruby会議2007, 1日目の土曜日

Ruby会議2007の一日目が終わりました。Ruby会議の内容は速報ログが随時更新されているようで、詳細な内容はそちらを参照していただくとして、個人的な感想をいくつか。
R0015484.JPG

とても活気がある

400人はいる会場がいっぱいになるほどの人で、画面にはIRCのログが映し出されていて会場(あるいは会場外から)のつっこみがリアルタイムではいるという感じでした。

年齢層が若い

年齢層も、Javaやそれ以外のイベントよりもかなり若いという印象がありました。若いから活気があるのか、活気があるから若いのかはよくわかりませんが。

どなたもプレゼンがうまい

どのプレゼンを見てもユーモア感たっぷりで、しかも、要点がわかりやすい。また、IRCからのつっこみにもうまく対応されているということで、技術系のイベントのなかでもかなりレベルの高いセミナーだったと思います。
R0015625.JPG
セミナーの後は懇親会が行われました。
R0015660.JPG
ミーハーなのでTim Brayさんと写真を撮ってもらいました。

木曜日 6 07, 2007

Ruby会議2007

今週末に行われるRuby会議2007に行けることになりました。Rubyというと、7〜8年前に何かの雑誌で見て、お!?これは!!と思っていましたがこれほどまでに盛り上がってくるとは予想もしていませんでした。当時、すでにPerlに手を染めていたのでもったいないことにRubyistになれませんでしたが、最近はちょっとしたスクリプトを書くときにもなるべくRubyを使うようにしています。
こういうちょっとしたスクリプトは1日ひとつぐらいは書くので、この調子で続けていけば3ヶ月ぐらいすればなんとか文法も身についてきそうです(まだ2〜3週間しか続けていませんが)。

水曜日 12 06, 2006

GlassFish/AS9上でのJRubyのサポート


GlassFishのメーリングリストで、JRuby support in GlassFishというアナウンスがありました。これは、Takai Naotoさんによるものです。JRuby on RailsをGlassFishに載せる方法も載っています。
個人的にはこれでいよいよRubyもきちんと勉強しないといけない状況になってきたなあという気がしています。Rubyの言語自体は好きなんですが、時間がないことを言い訳になかなか勉強が進んでいません。そもそも流行のRuby on Railsでさえ手をつけてない状況ですからなんだか乗り遅れている気がしています。年末年始、冬休みの宿題はこれかなあ。
About

okazaki

Search

Archives
« 4月 2014
  
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
   
       
今日