Javaのnullチェックでif文を使いたくない(個人的には解決)

nullチェックの実装で悩んでいた。

Javaのnullチェックでif文を使いたくない(解決せず) - ikhrのブログ

OpenJDKのソースを見ていてふとjava.util.Objectsの存在を知る。

java.util.ObjectsはJava 7に追加されたクラス。

試してみた。

       // ----- ここから -----
        // 何らかの処理の戻りにnullが含まれていると仮定
        ParentBean parentBean = new ParentBean();
        parentBean.setChildBean(null);
        // 実利用ではアノテーションでメソッド処理のタイミングでnullだったらExceptionをthrowする。みたいな実装にしたい。
        try {
            validateDeepNull(parentBean);
        } catch (ExtendedException e) {
            // "java.lang.NullPointerException: "がMessageに含まれている。
            throw e;
        }
        // ----- ここまでは隠したい実装 -----

        // 本処理
        System.out.println(parentBean.getChildBean().getGrandChildBean().getName());
   /**
    * ObjectとObject内のフィールドのnullチェックを行います。<br/>
    * ※リフレクションは個々の実装での使用は控えましょう。
    *
    * @param obj
    *            Object
    * @throws ExtendedException
    *             Object、Object内のフィールドでnullを検知した場合throwする
    */
    private static void validateDeepNull(Object obj) throws ExtendedException {
        // objのnullチェック
        try {
            Objects.requireNonNull(obj, "obj is null!");
        } catch (NullPointerException e) {
            throw new ExtendedException(e);
        }

        // obj内のフィールドのnullチェック
        Class<? extends Object> clazz = obj.getClass();
        Field[] fields = clazz.getDeclaredFields();
        for (Field field : fields) {
            field.setAccessible(true);
            try {
                Objects.requireNonNull(field.get(obj), field.getName() + " is null!!");
            } catch (IllegalArgumentException | IllegalAccessException e) {
                e.printStackTrace();
            } catch (NullPointerException e) {
                throw new ExtendedException(e);
            }
        }
    }

Exceptionイメージ

TestNull$ExtendedException: java.lang.NullPointerException: obj is null!
    at TestNull.validateDeepNull(TestNull.java:114)
    at TestNull.example3(TestNull.java:69)
    at TestNull.main(TestNull.java:14)
Caused by: java.lang.NullPointerException: obj is null!
    at java.util.Objects.requireNonNull(Objects.java:228)
    at TestNull.validateDeepNull(TestNull.java:112)
    ... 2 more
TestNull$ExtendedException: java.lang.NullPointerException: childBean is null!!
    at TestNull.validateDeepNull(TestNull.java:127)
    at TestNull.example4(TestNull.java:83)
    at TestNull.main(TestNull.java:21)
Caused by: java.lang.NullPointerException: childBean is null!!
    at java.util.Objects.requireNonNull(Objects.java:228)
    at TestNull.validateDeepNull(TestNull.java:123)
    ... 2 more

補足

まずは動かしてみたかったので、きちんと動くかの確認は不十分です。。

文字列を指定の文字数で分割(split)して結合(join)する

X.509証明書から取得した拇印(Thumbprint)をブラウザで表示している形式のように半角スペース区切りで表示させたかった。
2文字ずつ区切る場合。

Groovy

('c1ad8dcbf4d558b8a451ac36a5ac921cd7d9fab9' =~ /.{2}/).collect{str -> str}.join(' ')

結果
c1 ad 8d cb f4 d5 58 b8 a4 51 ac 36 a5 ac 92 1c d7 d9 fa b9

JJUG CCC 2018 Spring

5/26にJJUG CCCへ行ってきました。
聞いたセッションは次の通り。

  • JavaWebサービスを作り続けるための戦略と戦術
  • SpotBugs 3.1.xの現状と内部実装が抱える問題
  • LINE LIVEのチャットが 30,000+/min のコメント投稿を捌けるようになるまで
  • 如何に “データが壊れない ” 管理 画面を作るか - 管理画面開発裏側
  • 古いフレームワークでもマイクロ サービスアーキテクチャにしたい
  • 秒間16万リクエストをさばく広告入札システムにおける、gRPC活用

    セッション資料はJJUG CCCのGitHubにてまとめていただいているようです。
    github.com

今は自分の中で整理しておきたいキーワードを列挙するだけで、参加したことの表明をしておきます。

JavaWebサービスを作り続けるための戦略と戦術

  • 開発環境ですらOracleVirtualBox上に構築
  • Dockerfileはアプリエンジニアの領域
  • Jenkins1→2移行後、Maven→Gradle移行という順序を踏んだ
  • プルリクに対して検証環境が1つ自動構築される(理想)。
  • XMLよりもJavaConfig
  • 銀の弾丸はない。金(かね)の弾丸はある。


LINE LIVEのチャットが 30,000+/min のコメント投稿を捌けるようになるまで

  • Google Guava Cache ... GoogleJavaライブラリ。※Cache以外もある。
  • Akka Actor Model ... 高速な並列処理、スレッドセーフ、高い耐障害性。※利用シーンの理解を深めたい。
  • Akka ... ライブラリ
  • Actor Model ... アーキテクチャ


秒間16万リクエストをさばく広告入札システムにおける、gRPC活用

  • アドフラウド情報 ... BOTリクエストに対して入札しないようにする為の情報
  • gRPC Clientはメモリ30GB/台
  • gRPC Serverはメモリ128GB/台
  • HTTP/2の用途に対し、rocketで十分では。とのtweetあり。
  • 元々ClientとServerが同一筐体に載っていたものをサーバ分割してgRPCでくっつけた。
  • Server側のDB技術は秘密。※2016年の「Apache Apexとインメモリー最適化による超高速処理の世界」というセッションが関係してないだろうか。と邪推した。


用語メモ

Backlog ... プロジェクト管理、コラボレーション
Ciecle CI ... Jenkinsのクラウド版?ymlで定義
Confluence ... チームコラボレーション
Crucible ... コードレビューツール
Fisheye ... バージョン管理システムのアクティビティをトレース
Re:dash ... いろいろなデータソースからダッシュボードを作る
Redis ... NoSQLキーバリュー型
Rundeck ... ジョブスケジューラ
Trello ... カンバン的にタスク管理

「学力」の経済学

「学力」の経済学

「学力」の経済学

書評をするにあたって、どこまで内容に触れて良いか悩みましたが、 amazonの出版社からのコメントに今回お伝えしたかった事の1つが書かれていました。

・ご褒美で釣っても「よい」
・ほめ育てはしては「いけない」
・ゲームをしても「暴力的にはならない」

この本ではランダム化比較試験と呼ばれるランダムに選ばれた処置群と対象群に分けて、それぞれどのような効果が出たのかを紹介しています。
上記の結論に関する試験結果、解説を読んで、いずれも、なるほどなぁ。と思う内容でした。

新たな発見として、「非認知能力」という言葉を知りました。

これは、IQや学力テストで計測される認知能力とは違い、「忍耐力がある」とか、「社会性がある」とか、「意欲的である」といった、人間の気質や性格的な特徴のようなものを指します。

「人生の成功において極めて重要」とも述べられており、最近部下の教育をしている身として、大きく共感出来る部分でありました。
また、この能力は大人になっても鍛える事が可能と紹介されており、私自身、「自制心」、「メタ認知ストラテジー」といった能力は社会人になった後で鍛えられたものと感じました。

元々、子育てをする前に読んでおこうと思って手にした本でしたが、部下の教育をする際の視野を広げる事が出来ました。
「教育」という点で興味があれば、手に取ってみてはいかがでしょうか。

db2pdコマンド

何かと問題が起きた時に使うコマンド。
色々できてとっつきにくい印象がありましたが、次のマニュアルに使い方がまとまっています。
ありがとうございます。

db2pd コマンドを使用したモニターおよびトラブルシューティング

主にロックの情報を参照する機会が多く、例1のコマンドを使う機会が多くありました。
これについて補足したいことがあります。
例1のコマンドではトランザクション毎に、保持しているロック、トランザクションログのスペース、最後に実行したステートメント、接続元ホスト名等がわかります。

db2pd -db databasename -locks -transactions -applications -dynamic

しかし、「いつ実行したものか」がわからず困った事がありました。
(snapshotを併せて取っていればわかったのでしょうけど、トラブル対応中でテンパっていました。。)
後々、-apiを付ければわかる事を知りました。
その為、基本的に次のコマンドで情報を取っておくと、何が起きたのか把握しやすくなると思います。

db2pd -db databasename -locks -transactions -applications -dynamic -api

記憶ですが、例4の-apinfoの出力結果に近かったと思います。

※db2pdコマンドの構文には-apiは存在しませんね。。。
db2pd

最後に、db2pd等、DB2のコマンドの出力結果は整形されており、扱いにくい印象を持っていましたが、awkで処理する事で、その印象も払拭できました。

ブログのヒートマップ解析

以前からヒートマップが気になってました

www.ptengine.jp

はてなブログのユーザーさんなら 専用プランが無料で利用できます!

ありがたいことです。

ヒートマップ

f:id:gatd90:20180321113031p:plain

所感

カスタムイベントを作成することで特定要素のイベント数の集計も出来るそうです。
色々すごい。