Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

LT at JavaOne2012 JVM language BoF #jt12_b101

1,056 views

Published on

Published in: Technology, Art & Photos
  • Be the first to comment

  • Be the first to like this

LT at JavaOne2012 JVM language BoF #jt12_b101

  1. 1. JRubyでDSL作ってみた2012/04/04 akimatter
  2. 2. 自己紹介秋間武志@akimatterJava10年、Ruby6年Ruby Business Commons運営委員株式会社グルーヴノーツテクニカルプロデューサー/プログラマ
  3. 3. ゲーム開発やってます http://www.groovenauts.jp/ https://twitter.com/Groovenauts http://www.facebook.com/Groovenauts.Inc
  4. 4. 秋間の視点だとこんな感じ イーシー・ワン クラウド事業部 ノーチラス・テクノロジーズ 福岡 グルーヴノーツ 福岡
  5. 5. 2008/04イーシー・ワンで2008/07に出版するべく「JRuby徹底入門」を執筆開始。 秋間は原案のソースコードを書いただけ http://www.amazon.co.jp/JRuby-徹底入門- 株式会社イーシー・ワン/dp/4881666452
  6. 6. 2008/062008/05 Sunの粋な計らいで、福岡でのJRuby勉強会にJRuby開発者のCharles NutterとThomas Eneboが来てくれることが決定ちょっと頑張っちゃおうかなと決意SwingをRubyっぽく書けたら面白そうRubeusと命名される
  7. 7. Rubeus
  8. 8. Rubeusの狙ったところRubeus provides you an easy access to Java objectsfrom Ruby scripts on JRubyJavaをRuby色に染めちゃえJRubyでも十分Rubyだけど、もっとRubyっぽくするためのDSLを提供しよう
  9. 9. in Javaimport java.awt.*;import java.awt.event.*;import javax.swing.*;public class JavaSwingExample01 {    public static void main(String[] args) {        JFrame frame = new JFrame("Rubeus Swing Example 01");        frame.setLayout(new BoxLayout(frame.getContentPane(), BoxLayout.Y_AXIS));        JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT);        frame.add(splitPane);        JPanel panel = new JPanel();        splitPane.setTopComponent(panel);        panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS));        final JTextField textField = new JTextField();        panel.add(textField);        final JTextPane textPane = new JTextPane();        textField.addKeyListener(new KeyAdapter() {                public void keyPressed(KeyEvent event) {                    if (event.getKeyCode() == 10) {                        textPane.setText(textPane.getText() + textField.getText() + "n");                        textField.setText("");                    }                }            });        JButton button = new JButton("append");        panel.add(button);        button.addActionListener(new ActionListener(){                public void actionPerformed(ActionEvent event) {                    textPane.setText(textPane.getText() + textField.getText() + "n");                    textField.setText("");                }            });        JScrollPane scrollPane = new JScrollPane(textPane);        splitPane.setBottomComponent(scrollPane);        scrollPane.setPreferredSize(new Dimension(400, 250));        frame.setSize(400, 300);        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);        frame.setVisible(true);    }}
  10. 10. require rubygemsrequire "rubeus" in JRuby with RubeusRubeus::Swing.irbJFrame.new("Rubeus Swing Example 01") do |frame|  frame.layout = BoxLayout.new(:Y_AXIS)  JSplitPane.new(JSplitPane::VERTICAL_SPLIT) do    JPanel.new do |panel|      panel.layout = BoxLayout.new(:X_AXIS)      @text_field = JTextField.new do |event|        if event.key_code == 10 # RETURN          @textpane.text += @text_field.text + "n"          @text_field.text =         end      end      JButton.new("append") do        @textpane.text += @text_field.text        @text_field.text =       end    end    JScrollPane.new(:preferred_size => [400, 250]) do |pane|      @textpane = JTextPane.new    end  end  frame.visible = trueend
  11. 11. 思い切ったDSLの設計JButtonのイベントハンドラなんて、クリックされた場合しかほとんど使わないんだからコンストラクタにブロックで指定すればいいじゃんJButton.new("append") do  @textpane.text += @text_field.text  @text_field.text = end
  12. 12. JDBC with Rubeusrequire rubygemsrequire rubeusRubeus::Jdbc.irbDriverManager.connect("jdbc:derby:test_db") do |conn| conn.query("SELECT * FROM TEST ORDER BY ID") do |rs| rs.each do |row| puts row.to_a.join(",") end endend
  13. 13. easy installJava をインストールrvm をインストールrvm install jrubygem install rubeus
  14. 14. getting started with irb$ irb> require ‘rubygems’> require ‘rubeus’> Rubeus::Swing.irb> f = JFrame.new> f.visible = true> f.title = “foo”
  15. 15. Charlesに見せた時の反応JRubyの勉強会で見せたんですが、“Oh, looks great.” の一言。だよねー、 使いどころあんまり無いし英語も通じてない? (́・ω・`)
  16. 16. なのでもうすっかり忘れていたわけですよ。しかし2年後
  17. 17. Thomasからのメール Howdy,Can someone look at and apply files/patches submitted in Issues 13 and 14? Also I am demoing Rubeus in a book and thesefixes also need to be put into a new Rubeus release.Can you also release a new version of Rubeus withthese changes?-Tom https://groups.google.com/forum/?hl=ja&fromgroups#!topic/rubeus/Y7CsIojnZaQ
  18. 18. うわーお、でもマジ?本業が忙しすぎて全然メンテしきらんとですよ > <なのでちょっと振ってみた
  19. 19. Thomasへの返事 Thank you, Tom.Are you writing a book !? Its great! Im looking forward to read your book.I applied your patch and released rubeus-0.0.9 just now. So it will be publishedin a few hours.And I created a repository for rubeus in githubhttp://github.com/akm/rubeusIf you wish, I append your account as acollaborator.Takeshi https://groups.google.com/forum/?hl=ja&fromgroups#!topic/rubeus/Y7CsIojnZaQ
  20. 20. Thomasをコミッターにしちゃえ申し訳ないけど、それが一番手っ取り早いw
  21. 21. Thomasからの返事 Thanks for doing this. Yes, several JRuby people are writing a JRuby book:http://pragprog.com/titles/jruby/using-jrubyOne section in our GUI chapter will be covering Rubeus. We are very happy topromote Rubeus in our book.Thanks for adding me to your repository ongithub. I will help provide fixes if I find any otherproblems.-Tom https://groups.google.com/forum/?hl=ja&fromgroups#!topic/rubeus/Y7CsIojnZaQ
  22. 22. 本当にコミットしてくれてるし
  23. 23. 本当に載っちゃうし http://pragprog.com/book/ jruby/using-jruby
  24. 24. まとめRubeusは思い切った割り切りが良かったっぽいrubyにまつわるツールが便利 rubygemsで簡単にインストール irbで簡単に試せる
  25. 25. http://rubybizcommons.jp/ja/articles/2010/07/28/2010727-rubydays-2010/

×