イマドキの現場で使えるjavaライブラリ事情

38
の現場で使え Java事情 NTT先端技術 竹添 直樹 @takezoen

Upload: takezoe

Post on 31-May-2015

23.140 views

Category:

Documents


0 download

DESCRIPTION

2012/09/26(Wed) JJUG Night Seminar at Oracle Japan, Tokyo

TRANSCRIPT

Page 1: イマドキの現場で使えるJavaライブラリ事情

イマドキの現場で使えるJavaライブラリ事情

NTTデータ先端技術

竹添直樹 @takezoen

Page 2: イマドキの現場で使えるJavaライブラリ事情

自己紹介

� 竹添直樹

� NTTデータ先端技術� Scala、アジャイル

� オープンソース� Project Amateras

� The Seasar Project

� Apache Click

� 執筆� イマドキのIDE事情(マイナビニュース)

� Seasar2徹底入門(翔泳社)

Page 3: イマドキの現場で使えるJavaライブラリ事情

Scala逆引きレシピ

� 「仕事で「仕事で「仕事で「仕事でScalaを使う」を使う」を使う」を使う」ことを前提としたレシピ集� Scalaの基礎からユニットテスト、Play2、Akkaなどのフレームワークやビルドツールsbtまでカバー

竹添直樹 / 島本多可子

出版社 :翔泳社発売 :2011/7/3ページ数:632ページ価格 :¥3,360

Scala = Javaよりも安全 + LLのように簡潔な記述

Page 4: イマドキの現場で使えるJavaライブラリ事情

現場で使えるJavaライブラリ

竹添直樹 / 島本多可子 / 小津美夕紀 / 亀井隆司

出版社 :翔泳社発売 :2011/7/16ページ数:624ページ価格 :¥3,780

Commons Lang、ICU4J、Commons IO、Joda Time、Holiday.java、Commons Compress、Commons Codec、Commons Configuration、Commons BeanUtils、S2Util、Guava、fastutil、log4j、Commons Logging、log5j、Logback、SLF4J、log4jdbc、Velocity、FreeMarker、JSTL、Java Standard EL Functions、Commons FileUpload、Url Rewrite Filter、SiteMesh、Kaptcha、HSQLDB、H2、Commons DbUtils、SX-DbUtils、Persist、Mirage、dom4j、Commons JXPath、ROME、NekoHTML、HttpClient、Commons Net、JSch、Commons Email、JAX-WS、Super CSV、POI、XLSBeans、jXLS、Jacob、iText、JasperReports、JODReports、JODCOnverter、JFreeChart、charts4j、QRCode for Java、JSONIC、MessagePack、JAXB、XStream、Mockito、JMockit、DBUnit、Mockrunner、Selenium、Ehcache、Java Memcached Client、jmemcached、Rhino、MVEL、Guice、OVal、Drools、args4j、Quartz、Javassist

全全全全73の定番・実用(の定番・実用(の定番・実用(の定番・実用(+ちょっと面白)ちょっと面白)ちょっと面白)ちょっと面白)Javaライブラリを紹介!ライブラリを紹介!ライブラリを紹介!ライブラリを紹介!

Page 5: イマドキの現場で使えるJavaライブラリ事情

執筆の経緯

� Javaには膨大なOSSライブラリが存在する

� 言語やフレームワークの本は出ているけどライブラリの本や記事は最近みかけない

� ずっとJavaをやってきた人には当たり前だけど、新しいJavaプログラマの人はどれを使っていいかわからない

定番のJavaライブラリのカタログ的な書籍があるとよいのでは?

Page 6: イマドキの現場で使えるJavaライブラリ事情

発売から一年D

� 執筆時はJDK 1.4でも利用できるものが多かったが、JDK 1.5以降への対応が進んだ

� Githubで開発されているものが増えてきた� ロギングライブラリはLog4jからLogback / SLF4Jが主流に

� SeleniumやDroolsなど活発に開発が行われているものもあるが、大部分のライブラリはメンテナンスフェーズに入っている

� ASFで開発されているもの、企業がバックについているものは継続的にメンテナンスが行われている

� Javaでは定番のライブラリやフレームワークが完全に確立している状態

Page 7: イマドキの現場で使えるJavaライブラリ事情

というわけで

�書籍では取り上げることができなかった便利なライブラリを紹介します。

Page 8: イマドキの現場で使えるJavaライブラリ事情

JSONライブラリ

�書籍で紹介したJSONIC以外にもいくつかの選択肢があります

� Jackson

� http://jackson.codehaus.org/

� Gson

� http://code.google.com/p/google-gson/

� JsonPullParser

� https://github.com/vvakame/JsonPullParser

Page 9: イマドキの現場で使えるJavaライブラリ事情

JSONライブラリの性能比較

� 50000回の変換結果(ミリ秒)

� JSON Pull Parserは単純なList、Mapを使用でき

ないため、代わりにライブラリが提供しているJsonArray、JsonHashを使用

FROM TO JSONIC Jackson gson JPPList<String> JSON 32.2 35 50.4 380.3Map<String,String> JSON 55.7 37.9 58.3 783.5List<SampleBean> JSON 487.5 210.5 598.9 6930Map<String,SampleBean> JSON 482.8 205.7 609.5 -JSON List<String> 59.5 25.7 23.4 34.7JSON Map<String,String> 110.3 133.6 42.4 76.7JSON List<SampleBean> 1769.4 238.4 369.2 547.6JSON Map<String,SampleBean> 1829 364.5 397.5 -

Page 10: イマドキの現場で使えるJavaライブラリ事情

各JSONライブラリの性能特性

� Jacksonがシリアライズ、デシリアライズ共に安定して高速

� Gsonはパースは高速だがシリアライズが遅め

� JSONICは健闘しているが、JacksonやGsonには及ばない。特にBeanへのデシリアライズが飛びぬけて遅い

� JsonPullParserは単純なパースは高速だがシリアライズが遅い。使い勝手の面でもやや難がある

総合的にはJacksonがおすすめ

Page 11: イマドキの現場で使えるJavaライブラリ事情

Thymeleaf

� XMLベースのテンプレートエンジン

�特殊な属性を埋め込んだプレーンなXMLファイルをテンプレートとして使用可能

� Tapestry、Mayaa、Wicket、Facelets等と同じアプローチ

�式言語にはOGNLを採用している

� Webアプリケーションで使用するためのResolverやContextが予め提供されている

http://www.thymeleaf.org/

Page 12: イマドキの現場で使えるJavaライブラリ事情

Thymeleafのサンプル<html><body>

<ul th:if="${books.size()} gt 0"><li th:each="book: ${books}">

<a th:href="${book.url}" th:text="${book.title}">title</a></li>

</ul><div th:if="${books.size()} == 0">書籍はありません。

</div></body></html>

TemplateEngine engine = new TemplateEngine();engine.setTemplateResolver(new ClassLoaderTemplateResolver());

List<Book> books = new ArrayList<Book>();DContext context = new Context();context.setVariable("books", books);

String result = engine.process("jp/sf/amateras/javalib/thymeleaf/ThymeleafSample.xhtml", context);

<html xmlns="http://www.w3.org/1999/xhtml"><body>

<ul><li><a shape="rect" href="http://www.amazon.co.jp/exec/obidos/ASIN/4798121509">Seasar2徹底入門</a></li><li><a shape="rect" href="http://www.amazon.co.jp/exec/obidos/ASIN/4798123366">現場で使えるJavaライブラリ</a></li><li><a shape="rect" href="http://www.amazon.co.jp/exec/obidos/ASIN/4798125415">Scala逆引きレシピ</a></li>

</ul></body></html>

Page 13: イマドキの現場で使えるJavaライブラリ事情

Clione-SQL

�軽量なDBアクセスライブラリ�実行可能なSQL(2waySQL)をテンプレートとして使用することができる

� S2Dao、S2JDBCなどの外出しSQLファイルと同じアプローチ(ただし記法は違います)

�行やインデントに意味を持たせることでテンプレートをシンプルに記述できる

�パラメータの型に応じて自動的に演算子を置換するなどの便利機能もあり

� ドキュメントが不足している

http://code.google.com/p/clione-sql/

Page 14: イマドキの現場で使えるJavaライブラリ事情

Clione-SQLのサンプル

SELECT * FROM BOOKSWHERE

PUBLISHER = /* $publisher */'TITLE' AND PRICE <= /* $price */10000

SELECT * FROM BOOKSWHERE

PRICE <= 3500

SELECT * FROM BOOKS

publisher=null、price=3500の場合: publisher=null、price=nullの場合:

パラメータがnullの場合、行が削除される(IF文などで分岐を記述する必要がない)

インデントされた行が全て削除されると親の行が削除される

Connection conn = DriverManager.getConnection("jdbc:hsqldb:mem:.", "sa", "");

List<Book> books = sqlManager(conn).useFile("jp/sf/amateras/javalib/clionesql/ClioneSQLSample.sql").findAll(Book.class, params("publisher", "翔泳社").$("price", 3500) );

Page 15: イマドキの現場で使えるJavaライブラリ事情

RESTEasy

� JBossで使用されているJAX-RS実装

�非同期処理も可能

� クライアントライブラリが便利

https://www.jboss.org/resteasy/

Page 16: イマドキの現場で使えるJavaライブラリ事情

RESTEasyのサンプル

@Path("hello")public interface HelloService {

@GET@Path("/{name}")@Produces("text/plain; charset=UTF-8")public String workd(@PathParam("name") String name);

}

サービスのインターフェース(サーバサイドはこのインターフェースを実装して作成)

クライアントからの呼び出し

RegisterBuiltin.register(ResteasyProviderFactory.getInstance());

// インターフェースからクライアントを動的に生成HelloService hello = ProxyFactory.create(HelloService.class, "http://localhost:8080/sample");String result = hello.world("Taro");

Page 17: イマドキの現場で使えるJavaライブラリ事情

Jsoup

� HTML5対応のHTMLパーサ

� jQueryのようにCSSセレクタを使用して要素の選択を行うことができる

� DOMの操作もjQuery風の流れるインターフェースで行うことができる

http://jsoup.org/

Document doc = Jsoup.connect("http://d.hatena.ne.jp/takezoe/").get();

Elements headlines = doc.select("div.section h3");for(int i=0; i < headlines.size(); i++){Element e = headlines.get(i);System.out.println(e.text());

}

似たライブラリとしてjOOX(https://github.com/jOOQ/jOOX )があるこちらはXMLしか扱うことができないが、JavaのDOM APIとの相互運用が可能

Page 18: イマドキの現場で使えるJavaライブラリ事情

Zip4j

�パスワード付きZIPファイルの生成・解凍が可能なライブラリ

� Java標準のAPIやCommons Compressはパスワード付きZIPファイルに非対応

�他にもいくつかの選択肢があります

� http://code.google.com/p/winzipaes/

� http://www.ne.jp/asahi/hishidama/home/tech/soft/java/zip.html

http://www.lingala.net/zip4j/

Page 19: イマドキの現場で使えるJavaライブラリ事情

Zip4jのサンプル

// パラメータを準備ZipParameters parameters = new ZipParameters();parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL); parameters.setEncryptFiles(true);parameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_AES);parameters.setAesKeyStrength(Zip4jConstants.AES_STRENGTH_256);parameters.setPassword("1234");

// zipファイルを作成してファイルを追加ZipFile zipFile = new ZipFile("sample.zip");zipFile.addFile(new File("contents/memo.txt"), parameters);

Page 20: イマドキの現場で使えるJavaライブラリ事情

jMagick

� JavaからImageMagickを呼び出すためのラッパ

�サムネイルやデバイス毎にリサイズした画像の作成などに便利

� Java標準のAPIだと縮小時の画像品質が悪かったり、メモリ消費が問題になったりD

�動作にはImageMagikが必要

� JNI経由でImageMagickを呼び出すため、共有ライブラリを配置する必要がある

http://www.jmagick.org/

Page 21: イマドキの現場で使えるJavaライブラリ事情

jMagickのサンプル

MagickImage image = new MagickImage(new ImageInfo("javalib.jpg"));

// 画像のサイズを半分に縮小int width = (int) image.getDimension().getWidth() / 2;int height = (int) image.getDimension().getHeight() / 2;MagickImage resized = image.scaleImage(width, height);

resized.setFileName("javalib_mini.jpg");resized.writeImage(new ImageInfo());

Page 22: イマドキの現場で使えるJavaライブラリ事情

Byteman

� javaagentを使用して任意のクラス、メソッドに処理を挿入する

� プログラムの動作を一時的に変えたり

� ログを出力するコードを埋め込んだり

�例外を投げるコードを埋め込んで異常系のテストを自動化したり

� BMUnitというJUnit4と組み合わせて使用するためのモジュールも提供されている

https://www.jboss.org/byteman

Page 23: イマドキの現場で使えるJavaライブラリ事情

Bytemanのサンプル

> java -javaagent:lib/byteman.jar=script:rule.btm jp.sf.amateras.javalib.byteman.BytemanSample

RULE Sample RuleCLASS jp.sf.amateras.javalib.byteman.BytemanSampleMETHOD helloAT ENTRYIF TRUEDO traceln($1)

ENDRULE

起動時にjavaagentとルールファイルを指定

ルールファイルの例

どこにルールを適用するか

挿入する処理

ルールの実行条件

Page 24: イマドキの現場で使えるJavaライブラリ事情

jqPlot

� JavaScriptでグラフを描画するjQueryプラグイン

� Javaライブラリではありませんが、Javaライブラリの代替品ということでD

�棒グラフ、折れ線グラフ、円グラフ、バブルチャートなどを描画可能

�ブラウザ上でグラフを描画するのでサーバに負荷がかからない点がメリット

http://www.jqplot.com/

Page 25: イマドキの現場で使えるJavaライブラリ事情

jqPlotのサンプル

<html><head><title>jqPlot</title><script language="javascript" type="text/javascript" src="jqplot/jquery.min.js"></script><!--[if lt IE 9]>

<script language="javascript" type="text/javascript" src="jqplot/excanvas.min.js"></script><![endif]--><script language="javascript" type="text/javascript" src="jqplot/jquery.jqplot.min.js"></script><link rel="stylesheet" type="text/css" href="jqplot/jquery.jqplot.min.css" /></head><body><div id="graph" style="height: 400; width: 600;"></div><script>jQuery( function() {

jQuery . jqplot('graph',

[[ [ 1, 20 ], [ 2, 100 ], [ 3, 10 ], [ 4, 30 ] ],[ [ 1, 50 ], [ 2, 80 ], [ 3, 30 ], [ 4, 80 ] ]

],{ title: '折れ線グラフのサンプル' }

);} );</script></body></html>

Page 26: イマドキの現場で使えるJavaライブラリ事情

JGit

� JavaからGitにアクセスするためのライブラリ

� EGit(Eclipse用のGitプラグイン)で使用されており、現在はEclipse Foundationで開発されている

� Pure Javaで実装されているため別途Gitをインストールする必要がない

� Antタスクとしても利用可能(一部のコマンドだけ?)

� Gitと連携していろいろな処理を自動化するのに使えるかも?

http://www.eclipse.org/jgit/

Page 27: イマドキの現場で使えるJavaライブラリ事情

JGitのサンプル

// リモートリポジトリをcloneGit.cloneRepository().setURI("https://github.com/takezoe/solr-scala-client.git").setDirectory(new File("git")).call();

// ログを取得して表示Iterable<RevCommit> logs = Git.open(new File("git")).log().call();for(RevCommit rev: logs){System.out.println(rev.getCommitterIdent().getEmailAddress() + " - " + rev.getCommitTime());System.out.println(rev.getFullMessage());System.out.println("--");

}

// diffを表示Git.open(new File("git")).diff().setOutputStream(System.out).call();

Page 28: イマドキの現場で使えるJavaライブラリ事情

執筆に関すること

Page 29: イマドキの現場で使えるJavaライブラリ事情

執筆環境

� 基本的にリモートで作業� 4人での共著

� はじめて全員で顔をあわせたのは執筆完了後

� 基本的に無料のツールを使用� 原稿はOpenOfficeで執筆

� MLはGoogleグループを使用

� サンプルコード等はBitBucketで共有

� PDFで校正

� 最近はWikiで原稿を書いています� スマートフォン、WiMAXでいつでも・どこでも作業できる

Page 30: イマドキの現場で使えるJavaライブラリ事情

苦労したこと

� どこまで書くか?� 全ての機能は書ききれない

� 基本的な部分+あまり情報がない部分

� ライブラリのバグ、バージョンアップ� HSQLDB

� Drools

� サイトがなくなっていたり、過去のバージョンの扱いが微妙だったり� java.netにホスティングされているプロジェクト

� SiteMesh

Page 31: イマドキの現場で使えるJavaライブラリ事情

技術書の難しいところ

�出版までの時差

� オンラインメディア、ブログ等に勝てない

�情報の寿命

� あまりに陳腐化の早いものは書籍には適さない

Page 32: イマドキの現場で使えるJavaライブラリ事情

書籍に適しているもの

�最新情報よりもある程度固定化されたもの

�技術的なものではなく、手法や考え方など読み物として読めるもの

�すでに定番化している技術の入門・解説やリファレンス的なもの

Page 33: イマドキの現場で使えるJavaライブラリ事情

「現場で使えるJavaライブラリ」はこれらの条件を満たしているはず!

Page 34: イマドキの現場で使えるJavaライブラリ事情

失敗したかもD

� ライブラリ名で検索しても引っかからない

Page 35: イマドキの現場で使えるJavaライブラリ事情

別のアプローチもあります

� 執筆中の書籍をダウンロード販売

� ManningのEarly Access Programが有名

� 完成版を購入するよりも安価

� できている部分をPDFでダウンロードでき、アップデートされると通知が届く

� 最終的にはデザインも入った完成版が提供される

� 著者、読者双方にメリット

� 最新情報を部分的にであってもいち早く読める

� 読者からのフィードバックを書籍に反映できる

Page 36: イマドキの現場で使えるJavaライブラリ事情

でも、完成しなかったらどうなるの?

�完成しなかったら読者には返金されるの?

�著者とはどういう契約になっているのだろう?

�完成前に売れ行きの予想がついてしまう

� Early Access Programでの購入者が少なかっ

たら著者のモチベーションダウンで執筆が遅れるのでは?

Page 37: イマドキの現場で使えるJavaライブラリ事情

ご清聴ありがとうございました

「「「「Scala逆引きレシピ」逆引きレシピ」逆引きレシピ」逆引きレシピ」好評発売中です!好評発売中です!好評発売中です!好評発売中です!

大事なことなのでもう一度D

Page 38: イマドキの現場で使えるJavaライブラリ事情

サンプルコード

�今日紹介したライブラリのサンプルコードはGithubで公開しています

� https://github.com/takezoe/jjug-javalib