JavaOne 2012 San Francisco 1日目
JavaOne 2012に参加するため、昨日からサンフランシスコに滞在しています。本格的なスタートは明日からで、今日はStrategy KeynoteとTechnical Keynoteが行われました。
残念ながら大きなサプライズはありませんでしたが、来年のJavaSE 8 / JavaEE 7のリリースへ向けて地道な作業が続けられているようでした。以下Keynoteの内容から、個人的に良く覚えているところをまとめます。(興味のない所、よくわからない所多数だったので、これが全てではないです念のため><)
- Java SE
- SE8の内容からもれてしまったJigsawですが、デモをRaspberry Pi上で行っていました。jmod ls で現在インストールされているモジュールの一覧を参照、jmod install hoge で新しいモジュールをインストール。SEの最小構成では10MB程度だとのことで、小さいデバイスへの組み込み用途として期待できますでデモは、JavaOne 2012のコンテンツカタログをRaspberry Pi上で動作させる内容でしたが、ログインしようとしてアプリがクラッシュしてしまい、発表していたスペックリードのMark Reinholdは苦笑い、でも会場は大盛り上がり。みんなの盛り上がるツボがエンジニアだなぁと思いましたw
- Java FX
- Java EE
- マルチテナンシー対応という大きなテーマが先送りされてしまったので、Java EE7の内容は、4つの新機能と細かな改良のみとなりました。
- 新機能の1つ、Batchフレームワークの標準化は、Reader、Processor、Writerをまとめたchunkと呼ばれる処理のかたまりをXMLで定義するという方式で、個人的に一番楽しみにしていただけに、SpringBatchとあまり変わらない内容でちょっとがっかりでした。写真
- デモは、HTML5への対応を行うProject Avatarの内容でした。WebSocketを使ってサーバプッシュでクライアント内容が変わるデモに加えて、小さなサプライズとして、NetBeansからGoogle chromeのエクステンション経由でデバッグを行える、というProject Easelのデモがありました。NetBeansで加えた変更がリアルタイムにchromeの表示に反映されるというもので、開発には便利そうです。ただ今のところ対象のブラウザはchromeだけのようなので、ブラウザの差異に悩まされないかが心配です。
Keynoteの後は、Oracle Open WorldのイベントのひとつであるMacy Grayのライブで楽しみました。ライブは飲み放題食べ放題。Oracleはお金持ちだなぁ。
明日から個別のセッションが開始、JPAなどセッションを取る予定です。
BigDecimalのsetScale、メソッド名がいまいち
BigDecimalを使って「1000×0.01=10」を表現したかったんです。
初めに書いたコードがこれ。
BigDecimal a = new BigDecimal("1000"); BigDecimal b = new BigDecimal("0.01"); BigDecimal c = a.multiply(b); System.out.println(a + " * " + b + " = " + c);
結果は、
1000 * 0.01 = 10.00
10.00じゃなくて、10なんだよなー、と思い、次のように書き換えました。
BigDecimal a = new BigDecimal("1000"); BigDecimal b = new BigDecimal("0.01"); BigDecimal c = a.multiply(b); c.setScale(0, BigDecimal.ROUND_DOWN);
小数点以下は切り捨てでよかったので、setScaleでそのように指定。
しかし結果は、
1000 * 0.01 = 10.00
小数点以下の精度を設定したのに、なんで変わらないの・・・
頭がパニクって、わからん!とツイートしたら、こうしたらできるよ、と教えてもらいました。
BigDecimal a = new BigDecimal("1000"); BigDecimal b = new BigDecimal("0.01"); BigDecimal c = a.multiply(b).setScale(0, BigDecimal.ROUND_DOWN); System.out.println(a + " * " + b + " = " + c);
1000 * 0.01 = 10
おお!できた!
・・・んー・・何で1行でsetScaleすると大丈夫で、2行かけてsetScaleするとだめなの??
さらに頭が混乱してきました。
改めて setScaleのJavadoc を見ると、戻り値がBigDecimalになっている!
set〜〜とかいうメソッド名のせいで、戻り値はvoidか、あってもbooleanだろうと勝手に思い込んでしまってました。
(落ち着いて考えれば、戻りがvoidなら、1行で書いた時に左辺のcに何も入らず、コンパイルエラーになります。。)
Javadocの先頭を読むと、「変更が不可能な、任意精度の符号付き小数です。」とあるので、BigDecimalのインスタンスは不変オブジェクトなんですね。
だから、いったんインスタンスを作ってからの、scaleの変更などはできず、setScaleというメソッド名ながら、scaleを設定した新たなインスタンスを返すような仕様だったようです。
・・・だったら、名前もgetScaledInstanceとかにして欲しかったな〜
長いか。
GlassFish勉強会に参加してきました
会社帰りにオラクル青山で行われたGlassFish勉強会に参加してきました。
春先からJPAを使うようになり、JavaEEに関する様々な情報に触れていたのですが、今日は、断片化していた知識の隙間を埋めるような情報が多くあり、非常に有意義な勉強会でした。
以下、簡単なまとめと、思ったこと。
@den2snさん「GlassFishを4年間使ってきて思う事」
今まで、管理コンソールからあーしてこーしてと、環境構築手順書を書いていたけど、asadminコマンドを使って設定スクリプトを書いておいた方がスマートだったな、と気づきました。
FullProfileより起動が速いWebProfileを使わない理由は、という質問への答えで、APサーバは容易に置き換えられないので、WebProfileにない機能を使いたくなった時のために、FullProfileにしておきたい、という意見が。その発想はなかったなぁ。
@megascusさん「JavaEE6 First Application」
JSFになじみがないので、ちょっとついていけませんでしたが、NetBeansがIDEとしてだけでなく、コードジェネレータとしても機能豊富なのは十分に感じました。あと、デモでは使わなかったけれど、NetBeansのフレームワークのテンプレに、SpringMVCがあったのには驚き。
JSPは後方互換性のためにJavaEEに残っているとのこと。と言われても、そもそもの概念に違いがあるので、いつの日かJSFへ移行せよ、となっても難しそう…。
@sugarlifeさん「Glassfishと他の (OSS) APP Server の取り巻く状況の比較」
- 「触ってみる」の前に、コミュニティの観点から比較してみる
- GlassFish
- JBoss
- 同期間で、1252issue/1157solved
- 商用のEAP版が出ると、更新がほぼ停止しセキュリティパッチ等出にくくなる
- 有償サポートはパッチ等も出て手厚い
- Geronimo
- Apache TomEE
- 78issue/67solved
- 他がチケットの6割がバグなのに対し、TomEEは3割程度(他は新機能等)
- 先日の1.0.0リリースの際に、多くのチケットが一斉クローズされた跡が見られる
- Apache Tomcat
- 153issue/130solved (Tomcat7)
- 52issue/35solved (Tomcat6)
- 他が3〜6ヶ月周期のリリースであるのに対し、Tomcatはほぼ毎月
- まとめ
issueやsolvedの数を比較することで、コミュニティの盛り上がりを比較する手法が斬新で、興味深かったです。
以前、リリース頻度やバージョン番号でプロダクトの信頼性を計ろうとしたことがあったのですが、それよりもはるかに説得力のある指標だなと感じました。
#そもそもリリース頻度やバージョンなんか何の役にも立たないな、と今更ながら思う。。chromeなんて、もはやバージョン20だしw
@btnrougeさん「GlassFishユーザー認証ワンポイントレッスン」
- 認証 Authentication (atn) :サーバにアクセスしてきたユーザが本当にそのユーザかを確かめること
- 認可 Authorization (atz) :認証したユーザに対して、そのユーザができることできないことを設定すること
- レルム Realm 認証を行う仕組み一式
- おすすめ・・・ファイル/JDBC/LDAP
- 項目が多いけど、間違えづらい
- おすすめしない・・・PAM/カスタム
- 他はGlassFishの中で閉じるが、PAMはOSに依存するため、ハマるとどこが悪いかわかりづらい
- カスタムはJAASで標準化されているが、将来バージョンアップした時に動作の保証ができない
- 認可、ユーザロールマッピングは、下記のファイルで行う
PAMがおすすめされない理由が、関心事がGlassFishだけに収まらずOSまで広がるので良くないという話で、この前まで自分自身でも、アプリが動かない理由がAPサーバの設定なのかフレームワークの設定なのかわからずにハマってしまったので、関心事を限定するように設計するのは大事だなと、改めて感じました。
@makingさん「Pure Java EE or Spring?」
- Spring vs EE6 は、感情論・宗教論になりつつある
- 各種長所、短所、対抗技術
- いずれも、甲乙つけがたい
- 使い慣れた技術を使えばいいじゃない
- 一貫性が取れるなら、混ぜて使うも良し
最近、SpringMVC+JPAで開発していて、Springがいいのか、EE6がいいのか、悩むことも多かったのですが、どちらも一長一短で、その時々の最適なスタンダードを選択していけばいいのかな、と思いました。
ところで、今回のスピーカーの方の何名かは、社内フレームワーク作成が仕事、と仰っていました。以前どこかで「日本はフレームワークを作り込む、アメリカは転職社会だから標準を強く意識する」と聞いた事があったのですが、割と本当みたいです。
#…と言ってる自分も、ついついフレームワークの作り込みに走ってしまうけど。
どれも勉強になりましたが、特にissueによるAPサーバの比較や、SpringとEEの比較は興味深かったです。
ありがとうございました!
鹿駆動勉強会に参加してきました
4/29に奈良の新公会堂・能楽堂で行われた、鹿駆動勉強会に参加してきました。
10時半に奈良駅に到着、13時の開場まで奈良公園を観光することにしました。鹿を横目に、南大門、東大寺の大仏、お昼の釜飯・・・雲一つない晴天で初夏の陽気だった中、一眼レフと替えのレンズ、Macを背負って歩き回った後は、当然汗だく。。飲食禁止というおごそかな能楽堂に、こんな状態で行ってしまってごめんなさい。
今回の勉強会は、特にテーマは絞らないLT大会でした。どの方のトークも面白かったのですが、20人全部は書ききれないので(汗)、いくつか心に残ったものを挙げてみようと思います。
・JavaFX @skrbさん
Dukeの形をしたウクレレ(Dukelele)を片手に、変わらぬ笑顔と安心の安定感には、毎度のことながら癒されました。SceneBuilderのβ版はJavaOneTokyoの時にベータ版が発表されたとのこと。JavaOneの基調講演で、会場が同時通訳に聞き入る中、Nandhiniさんの英語にタイムラグなく@skrbさんが拍手されて、連られて会場が拍手したアレは、その発表のことだったんだと、今ごろ気づきました(汗)。
・JavaFXでJavaScriptのテスト @mike_neckさん
JavaFXにWebViewが追加されたので、型安全のJavaの中でJSのテストができるんじゃないか、というお話。残念ながら、それ以上の話を聞くことはできませんでしたが、とても興味深い話で、またどこかで聞ける機会があればいいなと思いました。
・システムアーキテクトになる前に覚えておきたいこと @s_kozakeさん
技術で盛り上がってきた中堅が、「いつまでPGやってんの?製造単価に見合わないんだよ」という会社の意向で設計や管理職になっていき、開発はオフショアに投げられるようになる…だから、システムアーキテクトが育たないし、そのせいで例えばJavaのシステムをCOBOLで書き直すようなおかしな開発があったりする・・・というお話で、かなり衝撃的でした。もちろん、技術だけでなく、マネージメントも業務知識も大事で、バランスが大切とのこと。とても心に響きました。
・新卒エンジニアが1年目を振り返る @kuchitamaさん
1年目は自分のコードに自信がないので、先輩はしっかりコードレビューしてあげて下さい、というお話。私が以前、研修中の新人全員に「自分のコードが読まれるのが恥ずかしい人は?」と聞いたら、ほぼ全員が手を挙げたことがありました。プログラムは、人のコードを読まないとどう書けば良いのかわからないし、読まれて評価されないと良くない点には気づかない、ということは私自身も身をもって感じています。@kuchitamaさんは、2年目なりたてとのことでしたが、大勢の前でしっかりと話ができていて、かつ1年目ならではの視点をしっかり主張していて素晴らしかったです。
・イノベーションについて @dproject21さん
イノベーションには継続的イノベーションと破壊的イノベーションの2種類があって、全く新しい破壊的イノベーションを起こす天才にはなれなくても、継続的イノベーションも大事なんだよ、とのこと。また、イノベーションには3つの”ソウ”(空想・構想・実装)が大事で、妄想で終わってはいけないとのお話でした。こんなのあったらいいよねーという話はよくしますが、それを行動に移す力が自分には足りてないな、と奮い立たせられました。
・MongoDBで全文検索 @kiy0takaさん
Java製の全文検索はApacheSolrより、elasticSearchが使いやすいですよ、という紹介&デモ。JavaOneTokyoでのLTでも大爆笑をさらった@kiy0takaさんは、今回も心の声が漏れていたりで、面白かったです。
・PHPフレームワークkohanaについて @nakauさん
現在仕事でkohanaをがっつり使って開発を行っていたので、個人的に注目の話のひとつでした。@nakauさんによると、日本のコミュニティを作って活動を始めているので参加して下さい、とのこと。kohanaを仕事で使ってみて、バージョンアップの敷居が高かったり、日本語ドキュメントが少なかったりとつらかったですが、コミュニティが盛り上がっていって、そういう声が取り入れられて、いいプロダクトになればいいなと期待しています。
・勉強会で話そう @irofさん
atndなどのツールができ、2年前とは勉強会というものが大きく変わって、話せるチャンスは大きく増えた、スピーカーで話すと得られるものはとても大きいので、LTなど敷居の低いものからどんどん話してみよう、というお話でした。私自身もよく参加するようになったのは昨年からで、TwitterやUstreamなどが勉強会を盛り上げるツールとして使われていて、とても楽しく参加させてもらってます。いつかLTぐらいはしゃべれるようになりたいなぁ。
ところで、”鹿駆動”とはなんぞや、とみんなからも聞かれたし、私自身もわかりませんでした。いろいろ予想した結果、「こうなったら能楽堂でLTやるシカ」のサブタイトルからして、これは、”勉強やるしかない!やるしかない!やるシカ!”的な熱い意気込みなんだ、人間切羽詰まらないとやる気がしないからな、いいネーミングだな、と勝手に一人テンション上がってたのですが、前回の勉強会が”やきに駆動勉強会”(焼肉)だったというのを聞いて、”あっ、特に意味はなく、単に奈良だから、なのね”と悟りましたw そういう意味のないゆるい感じも、それはそれで好きです。
これまでもいくつも勉強会に参加してきましたが、LTのみの勉強会は今回が初めてでした。なにか一つのテーマについて深く学ぶことを目的とするなら、それについての勉強会が最適ですが、今回のLTだけの勉強会というのも、ひとつの視点、言語、技術にとらわれず、幅広い知識を得ることができて、また違った面白さがあることがわかりました。鹿駆動勉強会のスピーカー、スタッフの皆様、ありがとうございました!
GlassFish3.1.2+Hibernate4.1.1+JPAでハマったメモ
参考にしたサイトはここ。
Hibernate Community • View topic - GlassFish 3.1.2 + Hibernate 4.1.1 + JPA = NullPointer
JPA(Hibernate)経由でGlassFishからEntityManagerを取得するときに、下記のエラーでハマったのでメモ。
警告: StandardWrapperValve[appServlet]: PWC1406: Servlet.service() for servlet appServlet threw exception java.lang.NullPointerException at org.hibernate.engine.transaction.internal.jta.JtaStatusHelper.getStatus(JtaStatusHelper.java:73)
GlassFishからJTAが取得できずにNPE。
その時のソースはこんな感じ。
・persistence.xml
<?xml version="1.0" encoding="UTF-8"?> <persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" version="2.0"> <persistence-unit name="persistenceUnit" transaction-type="JTA"> <provider>org.hibernate.ejb.HibernatePersistence</provider> <jta-data-source>jdbc/dataSource</jta-data-source> <properties> <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" /> </properties> </persistence-unit> </persistence>
・web.xml
<persistence-context-ref> <persistence-context-ref-name>myPersistenceUnit</persistence-context-ref-name> <persistence-unit-name>persistenceUnit</persistence-unit-name> </persistence-context-ref>
・root-context.xml
<context:annotation-config/> <tx:annotation-driven /> <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="persistenceUnitName" value="persistenceUnit" /> <property name="loadTimeWeaver" ref="loadTimeWeaver" /> <property name="jpaVendorAdapter"> <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"></bean> </property> </bean> <bean id="loadTimeWeaver" class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver" /> <jee:jndi-lookup id="dataSource" jndi-name="jdbc/dataSource" /> <bean id="txManager" class="org.springframework.transaction.jta.JtaTransactionManager" />
上のフォーラムによって、persistence.xmlの
<property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.SunOneJtaPlatform" />
HibernateのJavadocを見ると、このSunOneJtaPlatformの親である抽象クラスAbstractJtaPlatformの実装が他にもたくさんあるので、
使用するアプリケーションサーバによってこの内容を変えないといけないようです。
GlassFishの場合は、SunOneJtaPlatformでした。
また、これは現時点でドキュメント化されていないらしく、JIRAに報告されていました。
https://hibernate.onjira.com/browse/HHH-7110
Hadoopハンズオンセミナーに参加してきました
4月14日に新横浜のAcroquest Technology社で開催された、第2回 初心者向け Hadoop ハンズオンセミナーに参加してきました。
第2回 初心者向け Hadoop ハンズオンセミナー : ATND
初心者向けと銘打っているだけあって、Hadoop環境の構築手順から当日のセミナー内容まで丁寧でわかりやすく、とても勉強になりました。
普段の業務ではRDBMSばかり相手にしているため、Hadoopについての知識はほとんどありませんでした。
そのため、多くの新しい概念を学びました。
1. 入出力データはファイルベース、置く場所はHDFS
Hadoopでは、HDFSと呼ばれる、通常とは異なるファイルシステムを使います。
このファイルシステムの上に、処理したいデータ(ログファイルなどの巨大なファイル)を配置します。
HDFSを扱うには、下記のようにhadoopコマンドを使います。
$ hadoop fs -mkdir /sample
$ hadoop fs -copyFromLocal ファイル名 /sample
ここでの /sample は、HDFS上のパスで、ローカルのパス体系とは別の空間にあります。
HDFSは、大量の安価なサーバでクラスタを組めるようにするため、いつどのサーバが故障してもデータの損失がないように、コピーをいくつも作って保持します。
この時、ディスクを効率的に使うため、ある程度の一定の大きさ(デフォルトだと64MB)に小分けにして保持するとのことでした。
元ファイルやコピーの場所は、すべてNameNodeと呼ばれるマスターサーバが管理しているそうです。
ちなみに、データ自体が置かれるスレーブサーバはDataNodeと呼ばれます。
HDFSという名前は聞いたことがあった程度でしたが、ローカルのパス体系とは別の空間に入力データをつっこむ、というのが新しい感覚でした。
2. Mapはファイル1行からKey-Valueを生み出す処理、ReduceはKeyに紐づくValueのリストをどうにかする処理
Hadoopは、MapとReduceという処理を繰り返すことにより、目的の処理を行います。
Mapとは、ファイルを読み込んでHadoopの処理系につっこむ処理を指し、Reduceとは、Hadoopの処理系から渡された結果をファイルに書き出す処理を指します。
セミナーでは、ある期間に発生した地震の、日時とマグニチュードが記載されているCSVファイルを読み込んで、日付ごとの地震の回数や、マグニチュードの平均値を出す、という課題が与えられました。
この課題を解くために作成したMapとReduceの処理は次の通りです。
・Map
ファイル1行が引数として渡されるので、それをカンマで分割し、1カラム目にある日付と4カラム目にあるマグニチュードを、それぞれKeyとValueにしてHadoopの処理系に書き出す。
・Reduce
Hadoopの処理系が同じKeyに紐付くValueをリストにして渡してくれるので、地震の数を数えたいならリストの長さ、マグニチュードの平均値を出したいなら全てを足して個数で割った数値を、Keyとともに書き出す。
つまり、”Hadoop”を端的に言うと、”大量に与えられるKey-ValueをKeyごとにまとめ、同じKeyに紐づくValueを集めてリストにして返す”といったところでしょうか。
それを実現するのは非常に難しいのでしょうが、目的は至ってシンプルでした。
MapReduceという単語は何度も聞いていましたが、MapとReduceがそれぞれどういう処理を指すのか、今まではイメージが湧きませんでした。
しかし、課題で実際にコードを書いてみて、はっきりとイメージがつかむことができました。
能書きを読むだけでなく、サンプルやチュートリアルを動かしてみる、写経する、ということの大事さを改めて感じました。
3. プログラムのある所にデータを持ってくるのはなく、データのある所にプログラムを持っていく
普段はRDBMSを扱っているので、処理サーバからDBにアクセスし、データを取ってきて処理する、というのは当たり前でした。
しかし、Hadoopが相手にするデータはPB(ペタバイト)級のビッグデータ。
これを全部読み込むのはおろか、データを持ってくることさえも、かなり大変な作業です。
Hadoopでは、上で書いたMapとReduceの一連の処理を”ジョブ”と呼び、それをクラスタのサーバにばらまいて処理します。
これが、従来のシステムとHadoopが大きく異なる概念ではないでしょうか。
セミナーでも、考え方を変えないと理解が難しい所だ、と仰っていました。
他にも、MapReduceという処理の仕方をしないといけないのはビッグデータを扱うための制約だと考えること、とか、Hadoopの処理をしなくても巨大なファイルを単にHDFS上に置いておいて使い道は後で考えるのも良し、など、新しい感覚をたくさん学びました。
年初に、2012年のキーワード10個のひとつにビッグデータの文字があったのを記憶しています。
今回、Hadoopについて丁寧に説明して頂いた上、実際に課題でコードを書いてみることで、頭の中のイメージがとてもクリアになりました。
非常に有意義なセミナーに参加できました。
セミナーを開催して下さった関係者の皆様、ありがとうございました。
JavaOne Tokyo 2012 に参加してきました
4月4日、5日に、六本木ヒルズで行われた、JavaOne Tokyo 2012に参加してきました。
昨年のサンフランシスコのJavaOneにもちょっとだけ参加したのですが、この東京のは、規模は小さいものの雰囲気がそっくりで、テンション上がりっぱなしでした。
2日間とも朝イチから最後までセッションを取り続け、どれも勉強になるものばかりでしたが、特に心に残った3つのセッションだけ、感想を書いてみます。
- JSR 353: Java API for JSON Processing (http://togetter.com/li/283806)
- トラブルシューターの頭の中身 〜7年間のJavaトラブルシュートサービスから
他にも、1日目の夜のライトニングトーク大会で腹筋崩壊したり、2日目の夜のJJUG night partyで多くのすごい人とお話させて頂くことができたりと、本当に貴重な楽しい2日間でした。
ぜひまた来年も、再来年も、同じようなイベントが開催されることを切に願います。
余談ですが、この記事が約9ヶ月ぶりの更新、これからはマメに書くようにします;;