@thorikiriのてょりっき

@thorikiriがWebとかAndroidとかの技術ネタや本を読んだブログです

JJUC CCC 2012 Fall #jjug に行ってきました。

午後から行きました。メモったものを投下しておきますね。

R1-1 今さら Coin、されど Coin

資料 → (R1-1) いまさら Coin, されど Coin @ JJUG CCC 2012 Fall
Blog → JJUG CCC 2012 Fall で "Coin" の話をしました。 Java etc.../ウェブリブログ

  • StringのSwitch-Case文
    • CaseにStringが使える。式も書ける。
      • 定数の式であれば良いが、変数が含まれる場合はNG
    • IDEでもチェック出来ない場合もある
      • 式がnullになるものはNG
    • Switchにnullを入れるとNullPointerExceptionが発生する
      • 事前にnullチェックしておく必要がある
      • IntegerなどのAutoBoxingでやっている時も、nullチェックが必要
    • 文字列と定数を混ぜた時に、同じになるものはコンパイルエラー
    • JavaVMがどうやって動くのか。
      • 2つのSwitc文になります。
      • 1つはハッシュで順番付けします。2つ目は順番に処理が書かれるようになります。
      • ハッシュなので、たまに違う文字列でも同じになってしまうことがあります。
      • そういう場合は、caseの中でif文で分岐されます。
      • デバッグしやすいために2つに分解している。
  • 数値のアンダーバーなど
    • 二進数が使えるようになっています。
    • 2進数になると、見難くなるので、アンダーバーで区切れるようにしました。
      • これは、10進でも16進でも使えるようになっています。
    • 区切りはどこでも構いません。
    • 整数だけではなく、浮動小数点でも利用が可能です。
    • 2進数で32bit超えるときは、lまたはL最後につけること。
    • アンダーバーは先頭と末尾には入れられない。
      • 指数部のeやpの前後も入れられない。
    • 10進の場合、先頭がアンダーバーだと、変数だと思われてます。
      • 変数名の先頭に数値は許可されませんが、アンダーバーは許可されているためです。
    • 文字列にアンダーバーを入れて、ParseIntとかすると実行時エラーになってしまいます。
  • 例外
    • 複数の例外をキャッチする場合。
    • 今までは、親であるExceptionをキャッチしてサボっていましたが、|で区切って記述することで複数書けるようになりました。
    • Exceptionをキャッチして、スローした時に、6までは、throwsにExceptionを書かなければいけなかったが、7からは、実体のthrowsでよくなりました。
      • 今後は、throws句を親の例外で丸めるのではなく、ちゃんと書くようにしたほうが良いかも知れません。
    • リフレクション系の例外は、RefrectiveOperationExceptionが追加されたので1つで済むようになっています。
    • 複数定義した場合、キャッチした例外に別の例外を代入するとコンパイルエラーになります。
      • e = new IOException(); など
      • final変数として認識するためです
    • 複数例外で、例外クラスの親子関係があるとコンパイルエラーになってしまう。
      • FileNotFoundExceptionとIOExceptionを並べることが出来ません。
    • VMでは
      • tryもcatchも今までと変わりません。
      • 例外とハンドリングのテーブル情報が変わるだけです。
      • バイトコードは変わらないので、性能に影響は出ません。
  • ダイヤモンド
    • 楽しましょう。Genericsの省略が出来るようになっただけです。
    • ただし、型推論の結果がイマイチなこともあります。
    • newでしか使えません。
      • Castの時は使えません。コンパイルエラーになります。
    • バイトコードは書いても書かなくても変わりません。
    • ダイヤモンドの中のスペースは無視されます。
  • 自動リソース管理
    • finallyでクローズしましょうが、楽になりました。
    • 書かなくて良くなったのではなくて、書けなくなりました。書きたくても書けない。
    • クローズ以外は書かなくてはいけません。
    • catchの中でstreamはスコープに無いので、使えません。
    • 今まではCauseを使って居ましたけれど、その逆になります。addSuppressedが用意されました。
    • 再代入も出来ません。
    • AutoClosableを実装している必要があります。
    • closeされるのは、リソース部分に定義したものだけで、tryの中で定義したものは自動で閉じてくれません。
  • @SafeVarargsアノテーション
    • ノイズ的な警告を抑制するためのものです。
      • 警告メッセージを出さなくするためのものです。
      • コーダーにムダな警告メッセージを見せないためのものです。
    • 利用者側からは嬉しい。
    • ライブラリを作っている側からすると、出さなくて良いということをコンパイラに伝えるためのものです。
  • まとめ
    • 各々、出来ることと出来ないことがあります。
    • 実行時例外となるところには要注意です。

R2-2 クラウド時代のSpring Frameworkの新たな試み。〜Spring Dataの全貌〜

資料 → Spring Data for JJUG for Cross Conference Fall

  • Spring Dataとは?
    • NoSQLとかやったことある?MongoDBとかね。Neo4Jは?
    • RDBが圧倒的に多いが、NoSQLを触る機会が増えた。
    • アプリケーションが変わってきているので、Springもそこに対応していかないといけない。
    • トランザクションを増やすには、スケールアウトとスケールアップがある。
    • なかなかきちんとNoSQLにマッチする箇所を見付け出して採用するってのが難しい。
  • ビッグデータ
    • 今まではRDBを中心に考えてきました。
    • Bigdata:ビッグデータを扱う機会が増えてきていると思います。
    • FastData:アクセスパターンの多様化、モバイルとかアプリが急増している。
      • DBを見るだけでなくて、キャッシュを使うなどのニーズも増えてきている。
    • FlexibleData:非構造データや構造が変わりやすいデータ。
    • Cloud:仮想化や、XaaSとして、Backendなどか。
    • 今までのやりかたというのが合わなくなってきている。
  • Spring Data
    • 色々なサブプロジェクトがあります。
      • RDB用のもの:JPAJDBC Extensions
      • DataGrid:GemFire
      • DocumentStores:MongoDB
    • 慣れ親しんだ一貫したSpringベースのプログラミングモデルで、各種のデータを扱う
      • 違いを新たに学ばなくて済むように。
  • 慣れ親しんだSpringベースのプログラミングモデルとは?
  • SpringFrameworkの特徴
  • リポジトリ
    • SpringやWebのレイヤー構造はMVC
      • UI → Controller → DomainObject → DataAccess(HibernateJPA)→SQL DB
    • この考え方は基本的には変わらない。
      • NoSQLになってもこの考え方は変わらない。変える必要はない。
      • KeyValueStoreでも、RelationalDatabaseでも、Documentでも、GraphDBでも。
    • 今までDataAccessレイヤーでやっていたこと。
      • それぞれをDAOとして定義していました。DAOの中でそれぞれの実装を使い分けていた。
      • しかしながら、下のレイヤを意識したプログラミングをしなければならなかった。
    • Spring Dataでは統一化して、シンプルで一貫性のあるものにした。
    • それが、Spring Data Repositoryになります。
      • Repositoryを使えば、統一感を持って開発が出来る。
    • Repositoryとは何か?
    • 基本は、リポジトリのインタフェースです。
      • Repository、CrudRepository、PagingRepository。
    • 今まではリポジトリのインタフェースの実装は実装しなければならなかった。
      • しかしながら、Spring Dataを使えば、アノテーションを使うことで、実装しなくてもよい。
      • インタフェースを定義するだけでよくなります。
      • @NamedQueryアノテーションで、クエリを書くと、MongoDB等に検索を行うことが出来る。
      • これはXMLや、JavaConfigでかけます。
    • まとめ
      • 共通のインタフェースで対応出来る
      • お決まりごとのコードを書かなくていい
      • クエリをアノテーションで設定出来る
  • ドメインマッピング
    • 基本はPOJO
    • Spring Dataはもちろんやってくれる。
      • RDBだけでなくて、NoSQLでもやってくれると嬉しい。
      • ただし、データ構造が違うので、共通したインタフェースを持つことは出来ない
    • アノテーションをうまく使う
      • RDBでは、@Entity, @Table, @Id, @Column, @OneToManyで定義します
      • MongoDBの場合は、@Document, @Id, @Fieldになります。JOINの考え方はありませんね。
      • SQLと違って若干アノテーションの使い方は異なります。
      • グラフDB Neo4Jでは、@NodeEntiry, @GraphId, @RelatedTo
    • 生でやろうとすると、タイプセーフじゃないので、間違いに気づきにくい。
      • Neo4Jの場合には、ほとんどがSpring Dataを使っている
      • 実は、Spring DataはNeo4Jから発展して、JPA版が出た
    • まとめ
      • POJOセントリックなプログラミングが可能
      • データ構造が違うところは、共通したインタフェースを持てない
      • アノテーションを使って違いをカバーする
  • テンプレート
    • JPAJPA
    • MongoDBやNeo4Jでは、Templateがある
      • それぞれのドライバの使い方を覚えなくても使えるようにします。
      • 例外ハンドリングや、リソースマネージメントとかをテンプレート化してくれる
      • MongoTemplate、Neo4JTemplateなど。
  • まとめ。
    • 一貫したSpringベースのプログラミングモデルを提供する。
    • Springの特徴を活かしたPOJOセントリックなデータアクセスモデル
  • 宣伝

Spring3入門 ――Javaフレームワーク・より良い設計とアーキテクチャ

Spring3入門 ――Javaフレームワーク・より良い設計とアーキテクチャ

R3-3 テストコードのリファクタリング

資料 → テストコードのリファクタリング
Blog → JJUG CCC 2012 fall で登壇してきました #jjug #jjug_r33 - やさしいデスマーチ
Githubshuji/demo-refactering-unittest · GitHub
Togetterテストコードのリファクタリング #jjug_r33 - Togetterまとめ

  • 導入
  • なんのためにテストするんだ?
    • 昔ながらの単体テストユニットテストを何でやるのか?
    • 不安とか、経験不足、仕様変更の解消である。
    • 直接品質を改善するためのものではない
    • 開発者が自分たちのためにやるもの
    • 人間は不完全なもの。ミスをしがち
    • 動くか動かないかわからないものをリリースするのでなくて、動く安心を持ってリリースするためのもの。
  • ユニットテストとは?
    • 最小部品のテスト、主にクラスやメソッドが対象である。
    • 1つの機能を複数のクラスでやる
    • 対象が期待される振る舞いをするかを検証する
    • テストの4象限モデル。
      • UTは左下ですよ。
      • チームを支援して、技術面をサポートする。
    • チームを支援するとは?
      • 自分のコードへの自身:出来たと言える、出来る人ほど自身を持てないこともある
      • 積極的なリファクタリング:自分が書いたコードじゃないものも変更できる
      • 安心出来るリリース。
      • 技術面のテスト:プログラマが行う。プロダクションコードの作成を支援する
  • セーフネットである。
    • 品質は?
      • 直接的な関係はありません。
      • 形上は上がります。
    • ユニットテストを書くことによって、技術的負債が減る。そこが一番。
      • よって、結果的に品質が上がる
    • 品質の向上は受け入れテストなどが別途必要
  • ユニットテストは難しいか? YES!!
    • 習得するには、それなりに書く必要がある
    • テスト技法を学ぶ必要がある
    • テストを書くプロジェクトに参加する必要がある
    • チーム全体の意識改革が必要
  • ユニットテストは簡単ですか? YES!!
    • パターン化されている
  • ユニットテストは有効? YES!!
  • ユニットテストは開発の基盤である。
  • 学習のコツは?
    • たくさん書く。
    • 書いて整理する。
    • なんでも自動化する。
  • 増えるテストコードへの対応
    • テストコードは増える。どうするか?
    • DRY原則
      • 重複は悪
      • コピペはバグの温床
    • ただし、DRY原則はプロダクションコードであればそうである。
      • テストコードでは、そうとも言えない。
  • テストコードの特徴。
    • 似たようなコードが多くなる。
      • パラメータが異なるものをテストするために、前提条件だけが違う場合が多い。
      • リファクタリングしまくると、どこで何をやっているかわからない。
    • 効率よくテスト増やしたい。テストを追加したい。
      • 増やすのが楽でないとダメ
  • どうやんの?
    • 重複を排除しすぎると可読性が落ちる
    • テストケースごとに独立させる
  • 勝利の鍵
    • カスタムMatcherや、カスタムルール
      • 比較部分を共通化することが出来る
    • 構造化テスト、パラメータ化テストをする
  • デモ : ArrayListのテスト
    • 状態を持たないテストは簡単。常に同じ値を返すから。
    • 状態を持つと難しくなる。
    • voidも難しい。
      • 戻り値以外で別の方法で検証しなければならないから。
  • @Enclosedをしましょうか。
    • @RunWithアノテーションでEnclosed.classを指定する
    • 内部クラスを作っていきます。
      • 色々な状態が混ざってしまうので、初期状態のテストをまとめましょう。
      • 初期化処理をセットアップにまとめることが出来ます。つまり、コンテキストをまとめることが出来る
      • 初期化処理のコードも、テストコード自体も減らすことが出来る
      • 同じ階層で管理しないこと。デスクトップにファイルを並べるのと同じことです。
  • デモ : 消費税計算
    • パラメータ化のテストです。
    • @Parameterizedと@Theoriesの2パターンある。
    • @Parameterizedはコンストラクタでパラメータを指定する。
    • @Theoriesはメソッドの引数で指定する。
    • @RunWithアノテーションでTheories.classを指定する
    • @Theoryを@Testの代わりに使う。
    • パラメータを内部クラスを作る、Fixture
    • @DataPointsのstaticフィールドかstaticメソッドを書く
      • 配列を定義するか、もしくは配列を返すメソッドを定義する
    • パラメータをいくらでも増やしても可読性を損なうことがありません。
    • パラメータを増やすのが簡単
      • 多くのパターンでテストする場合には有効
  • 複雑な条件のテスト
    • @Cucumberを使う
    • JUnitでは書きにくいのでCucumberで書く
    • ステップ定義をする。
      • 前提と、もし、と、ならばを定義していく。
  • オールペア法。
    • 2項で組み合わせれば9割型カバーされる
      • それ以上は費用対効果が薄い。
  • QA

JUnit実践入門 ~体系的に学ぶユニットテストの技法 (WEB+DB PRESS plus)

JUnit実践入門 ~体系的に学ぶユニットテストの技法 (WEB+DB PRESS plus)

R3-4 WGPによるHadoopの可視化ソフトウェアをオープンソースで公開しました

  • Acroquest Technology,Hadoop/HBaseの内部動作を可視化する「halook」をオープンソースとして公開,WGP1.0βおよびENdoSnipe5.0βを同時リリース:ニュースリリース|gihyo.jp … 技術評論社
  • Halook
    • Hadoop、HBASEの内部動作を可視化するOSS
    • HDFS使用量や、MapRreduceのJob、HBaseを可視化
    • Hadoopって流行ってますよね。
  • Hadoop
    • Googleが論文出してYahooが作ったものです。
    • 輝かしい成功事例が多数ありますが、トラブルも結構あります。
      • 分散処理で、分散したけど、データが偏って分散しないとか、HBaseの1箇所に書き込みが集中したりなど
      • 数10代、数千台のものを束ねることでの難しさがある。
      • 仕組みを説明するだけで大きな話
      • 把握するだけでも大変
  • HDFS View
    • 使用状況を人目で確認したい。
      • 円周上にViewを配置すれば、増えても一目で見れる
    • ネットワーク上の距離も表現可能
  • MapReduce
    • 付属のツールでも見れるが、結構不便
    • Jobをガントチャート形式で表現。
      • 同時に動いているものがわかる。
    • JobはMap TaskとReduce Taskに分かれる
      • それぞれをどれだけ動いているのかがわかる
    • Jobの特性をバブルチャートで表現することも出来る。
      • 時系列だと沢山のTaskがあるときに、原因のTaskを特定するのが困難。
    • Hadoopのログファイルを直接解析するのは結構大変だった
      • ログを捜すだけでも大変
    • 横軸が複数のタスクがいつ開始したか、縦軸が実行時間
  • HBase
    • データを管理する単位のリージョン数の推移を表示
    • 結構HBaseは管理するのが大変である。
      • 熟練していないと性能を引き出すことが出来ない。
    • リージョンがどの様にに増えていくのか、その推移を表現します。
    • コンパクション発生もグラフ上に表現
  • デモ
    • 同時に動かせるJobには限りがあるので、時間がかかっているところを見れば良い。
    • そのタイミングで他のJobが動いていると、止められる。
    • 実際の動きを確認出来るので、トラブルを解析出来るし、回避も出来る。
  • Taskの投機的実行
    • 失敗した場合には、別のノードで実行する。
    • 失敗しても良いように、別のノードであらかじめやっておくことが可能。
    • 勝手に動いて欲しくない場合もある。
    • リソースが余っていると、勝手に動かしてくれるけれど、確認が難しい。
    • 裏で投機的に動いているのも可視化してくれる。
    • 設定がどこにあるかはログを見ていかないとダメ。そこを分かりやすくしてくれる。
  • Jobが失敗した場合も見れる。
    • Reduceが失敗したので、Reduceが再実行されたのか。
    • それとも、Mapからやり直したのか。
  • リージョン分割
    • データはリージョンに分割して管理、保存される。
    • リージョンのサイズが大きくなると、自動的に分割される。
    • データは行キーでソートして格納される。
    • 自動Splitに任せると、一定速度でデータを投入しても、グラグは直線的にはならない。
    • あるタイミングでドワッとくる。
      • なので、自動ではなくて、手動でやることも可能。
    • 何故かと言えば、キーの分布が一様ではないから、さらにバラつきが出来る。
    • タイムスタンプをキーにしていると、最後だけが増えていく。それはそれで問題になる。1つに負荷が集中する。
  • EndoSnipeWGPをベースにしてHalookは作られている。
    • EndoSnipeのJavelinを適用する、マスターサーバに入れる。
    • EndoSnipeのDataCollectorでデータを集めて、DBに入れ、リアルタイム通知を行う。
    • バイトコードを解析しているので、JMXやログ以上に詳細な情報を引き出すことが可能になる。
    • 今後、もっと充実させていく。
  • WGP Web Graphical Platform
  • Halookで、Hadoop、HBaseを可視化しよう
    • 実際の挙動を確認することで、分散アプリケーションを使おう!
    • 是非使ってみてください。

BOF1-1 Twitter4Jのプロモーション戦略

資料 → Twitter4Jのプロモーション戦略 - たくさん使ってもらうためにしたこと #jjug_b11

  • Twitter4J
    • 開発は2007年5月から
    • オープンソースで、たくさん使ってもらいたい。
      • 営利目的ではありません。
    • プロモーション戦略、つまり、沢山使ってもらうためにしたこと。
  • プロモーションって?
    • プロモーションとは、活動のこと
    • 手段として一般的なものは、広告とか、インセンティブとか、営業活動、口コミとか。
    • 目的としては、知名度を上げる、ブランド向上、売上最大化。ユーザ増加。
    • 活動として、プロモーション、ユーザ層を広げる、安心して使える、簡単に使える。
  • その為の手段として・・・・
    • とにかく知ってもらう
      • ブログに書く。拡散するためにはTwitterは有効だけど。
      • Twitterはアップデート出たよとか、そういうのに使っている。News用のもの。
      • News系サイトに投稿する。JavaNews.jpとか。今はアップデートされてないけど、1年くらいは更新ない。
      • TheServerSide.com 海外サイトですが。5年前10年前は知名度あったけど、今はあんまりない。
      • 原価をかけずにプロモーションが可能。
      • みつけてもらうために、名前を分かりやすくする。TwitterJavaでTwitter4J。高いググらビリティ。
  • その他工夫していること
    • ユーザ層を広げる
    • 言語やプラットフォーム。
  • プラットフォームを増やせ
    • Java1.4サポートの難しさ。
      • Java5で開発して-target jsr14のコンパイルオプションを付けている。
      • 拡張for文や、Genericsアノテーションはこのオプションで対応出来る。
      • StringBuilderとEnumについては、使わないように努力している。
      • しかしながら、java7が入ってくると、オプションが使えないので、Version3では見捨てようと考えている
    • AppEngineやAndroidにも対応!
      • とは言え、多分動くだろうから、使ってもらって不具合対応をするくらい。
      • AndroidJavaじゃないので、それはそれで大変。
  • 安心して使える
    • 10年前まではOSSってだけ利用出来ない事もあった。
      • 今は大丈夫・・・なはず。
  • 自分だったら、どういうものを使うのか?
    • 一般的なライセンスであること
      • OSI公式ライセンス、ゆるめ(感染性がない)、BSD、ApacheLicence2.0
    • 開発がアクティブ
      • JIRAで課題を管理する。有償製品だが、OSS向けは無料で利用可能
    • コミュニティがアクティブ
      • ggrks禁止。
    • ロードマップが明確
      • リリース時期は明記しないが、ロードマップを公開して、次に何をしようとしているのかを把握出来るようにする。
      • ちゃんと取り組んでいる姿がわかる
    • プロジェクトに設定しやすい
  • 簡単に使える
    • サンプルコード
    • ドキュメント
      • 記述のコストが大変なので、対象を絞る。読むほうも大変。
      • 簡単なサンプルコード例。設定方法。
      • 注目が集まってきたら、開発に参加する方法や、ルールなど。
    • ライブラリ、依存関係
      • 極力減らして、クラスパスがわからない人にも使えるように
      • OAuthやBase64エンコード、HttpClientなども実装してしまう
    • シンプルなパッケージ
      • internalパッケージなどを利用して、ユーザが見なくても良いように。
    • トラブルシュートを楽に
      • スタックトレースにライブラリのバージョン番号を含める
      • エラーコードを入れる。
      • エラーコードでググれるURLを含めておくと、2回目以降の人はググれる。

Twitter API ポケットリファレンス (POCKET REFERENCE)

Twitter API ポケットリファレンス (POCKET REFERENCE)

BOF1-2 作って学ぶデータベース 〜まずスモールデータから始めよう〜

元ネタ → かわいいリレーショナルデータベース作った - きしだのはてな

  • ビッグデータが大流行
    • とはいえ、一つ一つのデータをきちんと扱わなくてはならない
    • なので、スモールデータの時代。
  • リレーショナルモデル
    • RDBのモデルの説明
    • リレーション、テーブル、タプル、カラム
    • 演算→選択(where)、射影(select)、結合(join)、和(union)
  • インデックス
    • ツリーインデックスとハッシュインデックスがある
    • インデックスもRelationを継承
  • ユニオン
    • 使わなくない?でもORの計算がある
    • Index張ってあれば、内部的にはORはUNIONとも言える
  • MVCC
    • Contextを用意
    • Contextに対して、into(insert)などを行うようにする
    • 他のContextからとは、見えるものが異なるようになる
  • 全体像の話
    • SQLパーサー、実行計画(論理実行計画と物理実行計画)、実行エンジン、バッファ管理、ストレージ管理
  • まとめ
    • 全体像の実行エンジン以降については、NoSQLでも重要になってくる

RDBMS解剖学 よくわかるリレーショナルデータベースの仕組み (DB Magazine SELECTION)

RDBMS解剖学 よくわかるリレーショナルデータベースの仕組み (DB Magazine SELECTION)