Kotlin 1.1.60 周辺ライブラリの導入

November 13, 2017 に Kotlin 1.1.60 がリリースされました。 だからって訳ではないですが、以下について最初の一歩として簡単な導入部分を見ていきます。 kotlin-dsl によるGradle プロジェクトのビルド Kotlin でサーブレット Kotlin の SQLライブラリ Exp…

Java におけるタイプセーフとジェネリクスの微妙な関係

ジェネリクスの 不変・共変・反変 といった話は、なんとなく分かった気になって流してしまう方が多いのではないでしょうか? Java に限った話ではないですが、実際、ジェネリクスが絡んだタイプセーフ性の話題は混乱しやすく、理解しにくいものだと思います…

知らなくても困らない Javaクラスのバイトコードの読み方

普段使いでは困ることはないですが、昨今はバイトコードマニピュレーションによる黒魔術が謳歌しているため、知っていると役に立つ場合もあるバイトコードの最低限の読み方を説明します。 クラスファイルの中身 以下のような簡単なソースコードを考えましょ…

Java8 lambda の裏舞台は、きっとあなたが考えているより強かだ

前回、Stream の裏舞台について見てみました。 etc9.hatenablog.com ついでなので、今回は Lambda 式の裏舞台について見てみましょう。 はじめに 有名な話ではありますが、以下の匿名クラスを含むコードをコンパイルすると、2つのクラスファイルが生成されま…

Java8 Stream の裏舞台は、きっとあなたが考えているより忙しない

Java9 も出た昨今でいまさらですが、Stream パイプラインが裏でどのように動いているのかをコードを交えて紹介します。 以下の単純な例を元に、内部処理を追っていきましょう。 Arrays.asList("a", "b", "c") .stream() // (1) Stream の生成 .filter(String…

JavaEE Code探索 その3 〜 トランザクション属性 〜

前回はEJBにおけるトランザクションの開始と終了の流れを見てきました。 etc9.hatenablog.com 今回は、トランザクション属性による動作を少しだけみてみましょう。 はじめに TransactionAttributeType.REQUIRED のEJBメソッドから、TransactionAttributeType…

JavaEE Code探索 その2 〜 トランザクション 〜

前回は Glassfish 4.1.2 のソースコードを元にして EJB のメソッド呼び出しの概要を見ました。 etc9.hatenablog.com 今回は、この流れの中でトランザクションの開始と終了について見ていきます。 前回と同様に今回の説明のために不要な箇所は大幅に省略また…

JavaEE Code探索 その1 〜 EJB コール 〜

Glassfish のソースコードを元に、リモートEJBコールがどのように処理されていくかを説明します。 トラブルシュートにはどうしてもソースコードを読む必要がありますし、設定の問題なのかバグなのかの切り分けも容易になります。手っ取り早いし確実です。 そ…

Rust の初期環境構築 【2017年版】

Rust のインストール brew 使う場合は以下。 $ brew install rust ただ、公式通り rustup を使った方が複数バージョンの管理できたりするので、以下でインストールする。 $ curl https://sh.rustup.rs -sSf | sh 以下のように表示される。 Welcome to Rust! …

Kotlin を Gradle でビルドする minimal サンプル

Gradle プロジェクトの準備 init タスクでプロジェクト準備します(gradle は導入済みの前提)。 $ mkdir kotlin-example $ cd kotlin-example $ gradle init kotlin-gradle-plugin を使うよう build.gradle を編集します。 plugins { id "org.jetbrains.kotli…

【Gradle 4.0 版】プロジェクト作成時に便利な Build Init Plugin

Gradle 4.0 向けに以下の記事の更新版です。 etc9.hatenablog.com 試験的な提供なので将来が計画されていますが、Gradle 4.0 時点でどのようなになるかメモしておきます。 Build Init Plugin Build Init Plugin を使うと Gradle build プロジェクトの作成を…

Java によるいろいろなカンマ区切り変換(または OpenJDKで提供されるJMH を利用したマイクロベンチマーク測定のやり方)

List<String> list = Arrays.asList("A", "B", "C", "D", "E", "F", "G", "H", "I"); カンマ区切りの文字列に変換 A, B, C, D, E, F, G, H, I いろいろなやり方がある 文字列結合 String result = ""; for (String s : list) result += result.isEmpty() ? s : ", " </string>…

Markdown エディタ Typora が好きになる7つの理由

みなさんは Markdown エディタは何を使っているでしょうか? Atom や Visual Studio Code のプラグインでプレビュー表示していたり、Windows だったらMarkdownPad 、Mac だったら MacDown などの専用エディタを使っている方が多いのではないでしょうか。 そ…

2017年夏 Siera クリーンインストール直後の作業

etc9.hatenablog.com ということで、クリーンインストール直後の作業をメモしておく。 キーリピート システム環境設定の最速では遅すぎるので変更。 現在値の表示 defaults read -g KeyRepeat defaults read -g InitialKeyRepeat 設定変更 defaults write -g…

MacBook Air (Mid 2012[13]) の SSD がふたたび逝った

はじまりは ログイン画面でキーボード入力を受け付けなくなった。 しばらく触っていると、レインボーカーソルが回りだした。 電源ボタン押して再起動するも、アップルマークの起動画面で進捗バーが進まない。 MacBook Air (Mid 2012[13]) は、その昔 SSDが壊…

Glassfish や Payara の embedded サーバではログイン認証は動きません(そのままでは)

payara-embedded や payara-micro では普通にログイン認証作っても動きません。 login.conf を明示的に指定しないといけません。 embedded サーバを使うには payara-embedded-all (や glassfish-embedded-all) で Java EE をサクッと動かすのはとても簡単で…

Java のログ出力がローカライズされて鬱陶しい

例えば JUL のログレベルや、H2 database や Glassfish などのログメッセージなどローカライズされていて鬱陶しい。 エンコーディングが違ったりすると読めないし。 ログ内容で検索しても国外の情報拾えないし。 起動時のシステムプロパティで変更する 起動…

Gradle で評価時の依存を定義するには evaluationDependsOn を使う

Gradle のマルチプロジェクトで、ビルドスクリプトの評価順序を定義するには evaluationDependsOn を使う。 ビルド成果物の依存は dependencies settings.gradle で以下のようにマルチモジュールプロジェクトを定義していたとする。 include 'war', 'app' ビ…

10年の長きに渡り Java の可変長引数を過信していた話

可変長引数のループで ヌルポ発生 先日とあるプロジェクトで、可変長引数を for - each している箇所でヌルポになっていた。 実際にはずっと複雑だが、簡単に書くと以下のような for ループでのヌルポ。 public void method(String... args) { for (String s…

かけ足で学ぶ Golang その5 〜Webサーバからデータベース操作〜

前回はデータベースの操作方法を見てきました。 etc9.hatenablog.com 今回はWebサーバで受けた情報をデータベースに保存します。 POST でデータ保存 POSTで受けたリクエストボディの Json 文字列をデコードし、データベースにインサートしてみます。 func us…

かけ足で学ぶ Golang その4 〜データベース操作〜

前回は H2 データベースの準備を行いました。 etc9.hatenablog.com 今回はデータベース操作を行っていきます。 ドライバのインポート postgres のドライバはいろいろありますが、ここでは github.com/lib/pq を使います。 go get しましょう。 $ cd $GOPATH …

かけ足で学ぶ Golang その3 〜データベースの準備〜

前回は Go で簡単なWebサーバを作成しました。 etc9.hatenablog.com 今回からはデータベース操作を行っていきます。 データベースの準備 今回はデータベースサーバに H2 を使います。 H2 は postgres プロトコル互換モードがあるので、postgres 用のドライバ…

かけ足で学ぶ Golang その2 〜HTTPサーバでHelloWorld〜

前回、 etc9.hatenablog.com の続きです。 Hello, World on HTTP Go には簡易な Http サーバのパッケージがバンドルされています。 net/http をインポートするだけで簡単に Http サーバを動かすことができます。 package main import ( "fmt" "log" "net/htt…

かけ足で学ぶ Golang その1 〜環境構築編〜

インストール Homebrew 更新 $ brew update $ brew info go インストール & バージョン確認 $ brew install go $ go version go version go1.8 darwin/amd64 ワークスペースの作成 Go では任意のディレクトリをワークスペースとして指定し、ワークスペースの…

Hibernate in Action における DTO についての考察

もう10年以上前の本、Hibernate in Action に書かれている DTO についての考察です。 HIBERNATE イン アクション作者: Christain Bauer,Gavin Ki,倉橋央,勝嶌和彦出版社/メーカー: ソフトバンク クリエイティブ発売日: 2005/12/28メディア: 大型本購入: 3人 …

MacOS Sierra アップグレード後にJavaアプリケーションの起動がノキナミ遅い

例えば H2 database を以下のように起動するとめっぽう遅い java -cp h2.jar org.h2.tools.Server H2 database に限らず、Tomcat だったり Logback だったり、あらゆるものが遅い 以下にあるように InetAddress.getLocalHost() から呼ばれる DNS Lookup に原…

Collectors.toMap() は第3引数を意識してください

リストからマップを作る時に使う以下のコード Map<String, String> phoneBook = people.stream() .collect(Collectors.toMap(Person::getName, Person::getAddress); なつかしい以下のコードとは挙動が異なります。 Map<String, String> phoneBook = new HashMap<>(); for (Person p : people</string,></string,>…

Arrays.asList() は単なる配列のラッパを返すだけなので、要素の追加も削除もできません

いつまでたっても間違いが無くなりません。 以下のようにListの初期化で多用するArrays.asList()。 List<String> stooges = Arrays.asList("Larry", "Moe", "Curly"); Arrays.asList() が返すインスタンスは、java.util.Arrays$ArrayList であって、java.util.ArrayL</string>…

Spring Petclinic を JavaEE MVC 1.0 (JSR-371) で作る 〜 その2 〜

前回 etc9.hatenablog.com の続きです。 TemplateEngineProducer Ozark で Thymeleaf を使えるように org.thymeleaf.TemplateEngine の Producer を作成します。 @Dependent public class DefaultTemplateEngineProducer { @Produces @ViewEngineConfig publ…

Spring Petclinic を JavaEE MVC 1.0 (JSR-371) で作る 〜 その1 〜

はじめに Spring MVC ベースのサンプル・アプリケーション Spring Petclinic を JavaEE MVC 1.0 に移植してみます。 MVC 1.0 は Early Draft 段階ではありますが、JavaEE 7 環境でもそれなりに動かすことができます。ここでは、なるべく JavaEE 標準機能をそ…