イマドキの現場で使えるjavaライブラリ事情
DESCRIPTION
2012/09/26(Wed) JJUG Night Seminar at Oracle Japan, TokyoTRANSCRIPT
イマドキの現場で使えるJavaライブラリ事情
NTTデータ先端技術
竹添直樹 @takezoen
自己紹介
� 竹添直樹
� NTTデータ先端技術� Scala、アジャイル
� オープンソース� Project Amateras
� The Seasar Project
� Apache Click
� 執筆� イマドキのIDE事情(マイナビニュース)
� Seasar2徹底入門(翔泳社)
Scala逆引きレシピ
� 「仕事で「仕事で「仕事で「仕事でScalaを使う」を使う」を使う」を使う」ことを前提としたレシピ集� Scalaの基礎からユニットテスト、Play2、Akkaなどのフレームワークやビルドツールsbtまでカバー
竹添直樹 / 島本多可子
出版社 :翔泳社発売 :2011/7/3ページ数:632ページ価格 :¥3,360
Scala = Javaよりも安全 + LLのように簡潔な記述
現場で使える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ライブラリを紹介!ライブラリを紹介!ライブラリを紹介!ライブラリを紹介!
執筆の経緯
� Javaには膨大なOSSライブラリが存在する
� 言語やフレームワークの本は出ているけどライブラリの本や記事は最近みかけない
� ずっとJavaをやってきた人には当たり前だけど、新しいJavaプログラマの人はどれを使っていいかわからない
定番のJavaライブラリのカタログ的な書籍があるとよいのでは?
発売から一年D
� 執筆時はJDK 1.4でも利用できるものが多かったが、JDK 1.5以降への対応が進んだ
� Githubで開発されているものが増えてきた� ロギングライブラリはLog4jからLogback / SLF4Jが主流に
� SeleniumやDroolsなど活発に開発が行われているものもあるが、大部分のライブラリはメンテナンスフェーズに入っている
� ASFで開発されているもの、企業がバックについているものは継続的にメンテナンスが行われている
� Javaでは定番のライブラリやフレームワークが完全に確立している状態
というわけで
�書籍では取り上げることができなかった便利なライブラリを紹介します。
JSONライブラリ
�書籍で紹介したJSONIC以外にもいくつかの選択肢があります
� Jackson
� http://jackson.codehaus.org/
� Gson
� http://code.google.com/p/google-gson/
� JsonPullParser
� https://github.com/vvakame/JsonPullParser
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 -
各JSONライブラリの性能特性
� Jacksonがシリアライズ、デシリアライズ共に安定して高速
� Gsonはパースは高速だがシリアライズが遅め
� JSONICは健闘しているが、JacksonやGsonには及ばない。特にBeanへのデシリアライズが飛びぬけて遅い
� JsonPullParserは単純なパースは高速だがシリアライズが遅い。使い勝手の面でもやや難がある
総合的にはJacksonがおすすめ
Thymeleaf
� XMLベースのテンプレートエンジン
�特殊な属性を埋め込んだプレーンなXMLファイルをテンプレートとして使用可能
� Tapestry、Mayaa、Wicket、Facelets等と同じアプローチ
�式言語にはOGNLを採用している
� Webアプリケーションで使用するためのResolverやContextが予め提供されている
http://www.thymeleaf.org/
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>
Clione-SQL
�軽量なDBアクセスライブラリ�実行可能なSQL(2waySQL)をテンプレートとして使用することができる
� S2Dao、S2JDBCなどの外出しSQLファイルと同じアプローチ(ただし記法は違います)
�行やインデントに意味を持たせることでテンプレートをシンプルに記述できる
�パラメータの型に応じて自動的に演算子を置換するなどの便利機能もあり
� ドキュメントが不足している
http://code.google.com/p/clione-sql/
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) );
RESTEasy
� JBossで使用されているJAX-RS実装
�非同期処理も可能
� クライアントライブラリが便利
https://www.jboss.org/resteasy/
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");
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との相互運用が可能
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/
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);
jMagick
� JavaからImageMagickを呼び出すためのラッパ
�サムネイルやデバイス毎にリサイズした画像の作成などに便利
� Java標準のAPIだと縮小時の画像品質が悪かったり、メモリ消費が問題になったりD
�動作にはImageMagikが必要
� JNI経由でImageMagickを呼び出すため、共有ライブラリを配置する必要がある
http://www.jmagick.org/
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());
Byteman
� javaagentを使用して任意のクラス、メソッドに処理を挿入する
� プログラムの動作を一時的に変えたり
� ログを出力するコードを埋め込んだり
�例外を投げるコードを埋め込んで異常系のテストを自動化したり
� BMUnitというJUnit4と組み合わせて使用するためのモジュールも提供されている
https://www.jboss.org/byteman
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とルールファイルを指定
ルールファイルの例
どこにルールを適用するか
挿入する処理
ルールの実行条件
jqPlot
� JavaScriptでグラフを描画するjQueryプラグイン
� Javaライブラリではありませんが、Javaライブラリの代替品ということでD
�棒グラフ、折れ線グラフ、円グラフ、バブルチャートなどを描画可能
�ブラウザ上でグラフを描画するのでサーバに負荷がかからない点がメリット
http://www.jqplot.com/
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>
JGit
� JavaからGitにアクセスするためのライブラリ
� EGit(Eclipse用のGitプラグイン)で使用されており、現在はEclipse Foundationで開発されている
� Pure Javaで実装されているため別途Gitをインストールする必要がない
� Antタスクとしても利用可能(一部のコマンドだけ?)
� Gitと連携していろいろな処理を自動化するのに使えるかも?
http://www.eclipse.org/jgit/
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();
執筆に関すること
執筆環境
� 基本的にリモートで作業� 4人での共著
� はじめて全員で顔をあわせたのは執筆完了後
� 基本的に無料のツールを使用� 原稿はOpenOfficeで執筆
� MLはGoogleグループを使用
� サンプルコード等はBitBucketで共有
� PDFで校正
� 最近はWikiで原稿を書いています� スマートフォン、WiMAXでいつでも・どこでも作業できる
苦労したこと
� どこまで書くか?� 全ての機能は書ききれない
� 基本的な部分+あまり情報がない部分
� ライブラリのバグ、バージョンアップ� HSQLDB
� Drools
� サイトがなくなっていたり、過去のバージョンの扱いが微妙だったり� java.netにホスティングされているプロジェクト
� SiteMesh
技術書の難しいところ
�出版までの時差
� オンラインメディア、ブログ等に勝てない
�情報の寿命
� あまりに陳腐化の早いものは書籍には適さない
書籍に適しているもの
�最新情報よりもある程度固定化されたもの
�技術的なものではなく、手法や考え方など読み物として読めるもの
�すでに定番化している技術の入門・解説やリファレンス的なもの
「現場で使えるJavaライブラリ」はこれらの条件を満たしているはず!
失敗したかもD
� ライブラリ名で検索しても引っかからない
別のアプローチもあります
� 執筆中の書籍をダウンロード販売
� ManningのEarly Access Programが有名
� 完成版を購入するよりも安価
� できている部分をPDFでダウンロードでき、アップデートされると通知が届く
� 最終的にはデザインも入った完成版が提供される
� 著者、読者双方にメリット
� 最新情報を部分的にであってもいち早く読める
� 読者からのフィードバックを書籍に反映できる
でも、完成しなかったらどうなるの?
�完成しなかったら読者には返金されるの?
�著者とはどういう契約になっているのだろう?
�完成前に売れ行きの予想がついてしまう
� Early Access Programでの購入者が少なかっ
たら著者のモチベーションダウンで執筆が遅れるのでは?
ご清聴ありがとうございました
「「「「Scala逆引きレシピ」逆引きレシピ」逆引きレシピ」逆引きレシピ」好評発売中です!好評発売中です!好評発売中です!好評発売中です!
大事なことなのでもう一度D
サンプルコード
�今日紹介したライブラリのサンプルコードはGithubで公開しています
� https://github.com/takezoe/jjug-javalib