月曜日 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 26, 2008

OpenOffice.orgのODFDOM v0.6.1を試す

自分のブログでどういった話題が人気なのかを調べてみたところ、今月はダントツでMac OS X版のOpenOffice.org 3.0ベータを試すという3月に書いた記事でした。この頃のビルドがいくつだったかは覚えていませんが、5月7日にはベータテストが開始されたこともあって一気に注目が高まったのかもしれません。さて、個人的にはこの辺りのネタも気になるところですが、個人的には5月8日のブログOUT NOW!! - The first public version of ODFDOM.. (GullFOSS)が断然気になっていました。このODFDOMはOpenDocument Formatの文書を扱うためのJava APIです。OpenOffice.orgがなくとも単体で動作するのが魅力的です。早速ダウンロードして試そうと思ったら、Java 5 implementationと書いてあるのに、中身を見たら思いっきりJava SE 6でコンパイルされていて読み込めないし、ソースをダウンロードしてJDK 5.0でコンパイルしようとおもったらJava SE 6のAPI使っててコンパイルできないし・・・。おいおい・・・。ということで、Java SE 6が使えない自宅PCではあきらめて、別の環境で。
OpenOffice.org and ODFDOM with JRuby
まずはテストデータを作っておきます。一番いじりたそうなスプレッドシートのドキュメントを作って、適当にいくつかデータを入れておきます。
OpenOffice.org and ODFDOM with JRuby
次にこの手のドキュメントもRubyから扱えたら素敵なので、jirbからインタラクティブに試します。CLASSPATHにはこのodfdom-v0_6_1.jarと、xercesImpl.jarを別途ダウンロードして入れておきましょう。
include Java
import org.openoffice.odf.doc.OdfDocument
d = OdfDocument.load('./test.odf')
c = d.get_content
という感じでインタラクティブにうちこむとその結果が取得できます。はい、結果は見るからにDOMですね。このOdfDocumentで読み込んで、getContentで得られるDOMをXPath等で取り出したりして、いじっていけばコンテンツをいろいろいじることができます。OdfDocumentクラスを通してDOMをファイルに保存することもできますし、画像ファイルの追加なんかもできます。まだバージョンもv0.6.1と早熟な感じなのでしょうがないところですが、ドキュメント自体をもう少しODFに特化した形のJavaクラスを用意しておいてほしいところですね。
まだほとんどDOMをそのまま生で触っているのと感覚が同じです。とはいえ、ようやくODFを扱うためのまともなAPIが出てき始めているのはとても楽しみです。今後の発展に期待しましょう。

木曜日 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の手続きとかは知らなくても大丈夫。

金曜日 8 31, 2007

Monitoring Identity Manager by JMX

I believe this is the first entry written in English :). So, I translated presentation material which used yesterdays Advanced Identity Manager seminar, in Tokyo. This presentation introduces JMX feature of Identity Manager which introduced from Identity Manager 7.0. And this preso introduces how to monitor Identity Manager in command line, by using JRuby. I believe, scripting languages which running on Java are very powerful in monitoring and management area.

木曜日 8 30, 2007

IdMセミナーより: Identity ManagerをJMXで監視する

本日用賀にてIdMパートナー様向けに「半歩先行く上級 IDM エンジニアのためのモア・アドバンスト・セミナー」を実施させていただきました。この中で岡崎が紹介しました、「JMX による Identity Manager システムの監視」の内容をすこしご紹介しようと思います。スライドは例によってSlideshareにおきました。

さて、この中でもご紹介したのですがちょっと面白いのがコマンドラインから監視をする方法としてJRubyを使った方法のご紹介です。この方法は西ケ谷さんが以前ブログに書かれていた をかなりパクって参考にしています。今回はかなりIdentity Managerに特化したスクリプトを紹介しているのですが、ActiveSyncの状態を取得するスクリプトというものです。
#!/usr/bin/env jruby 

include Java 
include_class 'javax.management.ObjectName' 
include_class 'javax.management.remote.JMXConnectorFactory' 
include_class 'javax.management.remote.JMXServiceURL' 

jmxurl = 'service:jmx:rmi:///jndi/rmi://idm1:8686/jmxrmi' 
username, password = 'admin', 'adminadmin' 

svcurl = JMXServiceURL.new(jmxurl) 
cred = java.lang.String[2].new 
cred[0], cred[1] = username, password 
env = {'jmx.remote.credentials' => cred} 
conn = JMXConnectorFactory.connect(svcurl, env).getMBeanServerConnection 
names = conn.query_names(ObjectName.new( 
  'IDM:type=Cluster,service=Synchronization,component=ActiveSync,\*'), nil) 

names.each do |name| 
  cname = name.get_canonical_name 
  if /name="(.+?)",resType="(.+?)"/ =~ cname 
    puts "Resource Type: #{$2}, Name: #{$1}, ” 
         + “Status: #{conn.get_attribute(name, 'StateString')}" 
  end 
end 
こんな感じのスクリプトを実行すると、
Resource Type: FlatFileActiveSync, Name: My FlatFile, Status: down 
Resource Type: LDAP, Name: SPE End-User Directory, Status: down 
こういう具合で情報が得られます。

水曜日 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'] }
こんな感じですね。だいぶ楽ちん。
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
   
       
今日