JavaでJavaScript

JavaScriptをJavaで実行するプログラムは簡単に作れるので、ちょっと用意してみた。Java6ではRhinoが同梱されていますが、その挙動を確認するのに便利です。直接書き込む方法と、a.jsというファイルを用意して読み込む方法と、両方用意してみました。

import javax.script.*;
import java.io.*;

public class Script {
 public static void main(String[] args) throws Exception {
  Script app = new Script();
  app.run1();
  app.run2();
 }
 public void run1() throws Exception {
  ScriptEngineManager m = new ScriptEngineManager();
  ScriptEngine engine = m.getEngineByName("JavaScript");
  try {
    engine.eval("print(‘Hello, world!’)");
  } catch (ScriptException e) {
    e.printStackTrace();
  }
 }
 public void run2() throws Exception {
  ScriptEngineManager m = new ScriptEngineManager();
  ScriptEngine engine = m.getEngineByName("ECMAScript");
  InputStream is =
      this.getClass().getResourceAsStream("a.js");
  try {
    Reader reader = new InputStreamReader(is);
    engine.eval(reader);
  } catch (ScriptException e) {
    e.printStackTrace();
  }
 }
}

ちなみに、a.js の内容は次のような感じの内容。

print("\nhello\n");
var itemTitle = "&abc&def&";
re1 = new RegExp("&", "g");
itemTitle = itemTitle.replace(re1, "&");
print(itemTitle);

正規表現で文字列を抜き出す

Javaで正規表現を使って文字列を抜き出すには、次のようなプログラムを用意すればいい。正規表現についての詳しい説明は省略。便利と言えば便利。ただ、ネストした構造とか場合分けが多い構造の文章に対して適用するのは結構大変ので、そういった場合は独自にParserを実装した方がいい。Interpreterパターンとか使えばバグも少なく実装できるはず。ただ、言語定義ができない人には難しいので、コンパイラ技術とか勉強することになるはず。

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class App {
  private String regexp1 = "<div class=target>(.*)<div class=target2>(.*)</div></div>";
  private String regexp2 = "href=\"(.+?)\"";
  private String target1 = "<div class=target>abc<div class=target2>def</div></div>";
  private String target2 = "<a href=\"index.html\">トップへ</a><a href=\"index1.html\">トップ1へ</a>";

  public void sample() {
    Pattern pattern = Pattern.compile(regexp1);
    Matcher matcher = pattern.matcher(target1);
    while (matcher.find()) {
      System.out.println("一致: " + matcher.group(2));
    }
    // URL抜き出し
    pattern = Pattern.compile(regexp2);
    matcher = pattern.matcher(target2);
    while (matcher.find()) {
      System.out.println(matcher.group(1));
    }
  }

  public static void main(String[] args) {
    App app = new App();
    app.sample();
  }
}

実行結果は次の通り

一致: def
index.html
index1.html

JRuby徹底入門のサンプルコードがダウンロードできない件について

hiro345 ストア – JRuby 徹底入門」について、いまさら気がついたのですが、記載されているサンプルコードのダウンロードが見当たりませんでした。どこかで公開されているのでしょうか。まぁ、これぐらいの分量なら、なくてもかまいませんが。

本書は、Rubyの入門書を読んでからの方が理解しやすいのではないかと思います。RailsをJavaのコンテナで動かすあたりの話も参考になりますし、JavaプログラムをRubyプログラムに書き換えるところの説明も良いのですが、Rubyに関する前提知識なしで読むのはちょっと大変かもしれません。

Ruby入門

Rubyプログラムを勉強してみたいと思っているJavaプログラマは結構いるのではないかと思う。しかし、ターゲットが限定されるので、Javaプログラマ向けのRuby入門書というのは、なかなか書籍として実現されることは難しいのではないかと思い込んでいました。

しかし、チャレンジする人というのは世の中にはいるもので、「hiro345 ストア – JavaプログラマのためのRuby入門」という書籍が発売されていたので、おもわず購入してしまいました。

さっそく、ざっと読んでみているのですが、Javaとの対比が面白いので、単純にRubyの文法書を読むよりは、楽しく読めます。これは、なかなか、いい本です。JRubyの話もでていますから、Javaエンジニアにとっては嬉しいはずです。

マルチリンガルな人は、どこの世界でも重宝されますから、興味を持って、いろいろなプログラミング言語に接してみたいところです。