エンターテイメント!!

遊戯王好きのJavaエンジニアのブログ。バーニングソウルを会得する特訓中。

JJUGナイトセミナー「JDK 11リリース記念:今知っておくべきJDK 11の重要ポイント 参加報告

公式サイト

【東京】JJUGナイトセミナー「JDK 11リリース記念:今知っておくべきJDK 11の重要ポイント」 - 日本Javaユーザーグループ/Japan Java User Group | Doorkeeper

まとめ・メモ

OracleJDK

  • ソース&バイナリをオラクルが提供
  • 用途によって有償

OpenJDK

- 無償

参考サイト

JDK 11リリース記念:今知っておくべきJDK 11の重要ポイントの個人メモ

JavaFX

同梱されなくなっただけ。
開発はされている。

JEP 330

JEP 330: Launch Single-File Source-Code Programs

javaコマンドだけでJavaファイルを実行可能。

制約

  • 1ファイルで完結している必要がある。
  • トップレベルクラスがmainを持っている必要がある。

仕組み

SourceLancherが起動してコンパイル実行している。

JEP 328

JEP 328: Flight Recorder

プロファイラ。情報収集を行うだけで、可視化は別途用意する必要がある。

JEP 181

JEP 181: Nest-Based Access Control

コンパイルされたときに、余計なクラスがなくなる。

JEP 320

JEP 320: Remove the Java EE and CORBA Modules

JavaEE/CORBAが削除された。

JEP 321

JEP 321: HTTP Client (Standard)

HTTPクライアントの実装。
HTTP2, Reactiveに対応。

sendAsync→非同期
send→同期

API追加

Null I/O

linux/dev/null と同じような動きをする。
何もしないクラス。

Rredicate.not

今までのラムダで書けなかった、条件の反転ができる。

感想

JEP 330のやつは、てっきりコンパイル&実行を勝手にしてくれているのだと思ったら、1個間に挟んでいるのか。。。
意外と制約が多かった。
普通に使うには気にならないと思うが。

Null I/Oは、テストで使うのかな?
それ以外の用途が全然分からない。

2018/10/01に覚えたこと Object.assign/責務分担/npm install

Object.assign

Object.assign() - JavaScript | MDN

他の人が書いたソースを見てて、何をやっているのか分からなかったから調べた。

やってくれることは、オブジェクトのマージ。

とりあえずサンプル

const object1 = {
  a: 1,
  b: 2,
  c: 3
};

const object2 = Object.assign({c: 4, d: 5}, object1);
console.log(object2);

実行結果
> Object { c: 3, d: 5, a: 1, b: 2 }

一番最初の引数に、上書きしていってくれるところ。
いいと思ったことは、Object1がnullだった場合でも、エラーになることなく処理を実行してくれること

const object2 = Object.assign({c: 4, d: 5}, null);

console.log(object2);
// > Object { c: 4, d: 5 }

一番最初の引数がnullだったらダメだけど、2番目以降は、null許容してくれる。
面倒くさいif文のnullチェックが不要になるのは、可読性も上がるし、いいと感じました。

他人のソース見てると、たまに発見があるから、なるべく見たほうが良い。
特に、自分より上位と思われるエンジニアが書いたソースは、要チェック。

責務分担

mainクラスは、ライブラリを使うだけにする。
機能の実装は、別クラスに追いやり、機能をつなぐだけにしておくと、全体像が見通せて、理解がしやすいはず。

気づかぬうちに、mainクラスになんでも突っ込んでしまうのが、いつものことなので、もうちょっと注意したい。

責務分担の定石って、どこかにまとまっていないものなのだろうか?

npm install

問題になったのは、linux環境でnpm installしたものをwindowsで動作させようとして動かなかったこと。

原因は、もちろん、npm installを別環境でしたから。
node_modules\.bin 配下にwindows用にコマンドを叩くためのcmdファイルがなかったため、npm startで使っていたがnpmモジュールが見つからなかったのが原因。
cmdファイルの中身を見たら、node.exe使って何かしようとしていたので、そうなんだろうなと推測。
公式ドキュメント見てないから、本当かどうかは、若干怪しいが。。。

何かの開発環境のときに、同じことしていたのを覚えていたので、気づくのが早かった。

結局、実行する環境でnpm install するに落ち着いた。

たぶん、別環境でnpm installしたものを持ってくるって人は、そうそう居ないので、ためになるかは微妙かも知れない。

Java11の新機能まとめと試し実行

公式サイト

JDK 11

JDK 11 GA Release

新機能まとめ

試してみる

環境は、win10、Javaは、もちろん、09/25リリースのJava11

手頃そうなものを、とりあえず試す。

ファイルからの即時Java実行

テスト用のJavaファイルの用意

まずは、実行するファイルの用意から。
恒例にしたがって、hello world の出力だけする簡単なもの

public class SampleJava11 {
    public static void main(String args[]) throws Exception{
        System.out.println("hello world");
    }
}

ファイル名は、SampleJava11.java で保存。

実行

コンパイルしたふぁいるを実行するときと同じように実行。

$ java SampleJava11.java
hello world

難なく実行できる。
学生時代は、コンパイルして実行を習ったが、今は手軽にできる。
たぶん、コンパイルは習うと思うけど、覚えたらただの手間だから、学習速度は向上しそう。
なんというか、スクリプト言語に近い感じで、即座に確認できるのがいいと思いました。

ラムダ式でも利用できるようになったvarによる型推論

テスト用ファイルの用意

import java.util.List;
public class SampleJava11 {
  public static void main(String args[]) throws Exception{
    List.of("はな", "さあや", "ほまれ", "エミル", "ルールー").stream().forEach((var s) -> {
        System.out.println(s);
    });
  }
}

趣味全開でサンプルを書いてみた。

実行

コンパイルが面倒くさいので、さっき覚えた即時Javaファイル実行で実行

$ java LambdaVar.java
はな
さあや
ほまれ
エミル
ルールー

動く。
Javaを最近使ってないからなんとも言えないが、型情報を書くのが面倒なときに使う感じだろうか?
特に、クラス名が長いのは、見てて苦痛だからね。

クラス名を書かなくて済むのなら、書かないほうが無難そう。
var自体は、Java10で入ったので、特に、大きな違和感なく受け入れられたし、事前学習はできている。
LTSだけ学習していればいいかとも思ったけど、最新バージョンを追っていたほうが、学習範囲が狭くて覚えやすい気がした。

HTTP Client API

今、node使った開発をしている。
提供されたAPIは、nodeで提供されているものがJavaっぽくなった感じの印象を受けた。

JSR & HTTP Client API doc

JEP 321: HTTP Client (Standard)

HttpClient (Java SE 11 & JDK 11 )

テストファイル

import java.net.http.*;
import java.net.URI;
public class SampleHttpClient {
  public static void main(String args[]) throws Exception{
    HttpClient client = HttpClient.newHttpClient();
    HttpRequest getRequest = HttpRequest.newBuilder()
      .uri(URI.create("https://www.google.co.jp/"))
      .build();
    HttpResponse<String> response = client.send(getRequest, HttpResponse.BodyHandlers.ofString());
    System.out.println(response.statusCode());
    System.out.println(response.body());
  }
}

もっとも有名な、Googleさんにアクセスしてみる。

実行

もちろん、即時Javaファイル実行

$ java SampleHttpClient.java
200
<!doctype html><html itemscope="" itemtype="http://schema.org/WebPage" lang="ja"><head><meta content="世界中のあらゆる情報を検索するためのツールを提供しています。さまざまな検索機能を活用して、お探しの情報を見つけてください。" name="description">
・・・
;google.jsc && google.jsc.m(m);})();</script></div></body></html>

難なく取れる。

最初、URLをhttps://google.co.jp/ って書いてしまい、ステータスが301で帰ってきて、マジで焦った。。。
ブラウザでgoogle.co.jp って打ってもアクセスできる弊害がここに出てくるとは思わなかった。

手軽にWebAPI試したりできたりするのが、便利かな?
curlで済ましてしまいそうな気がしないでもないけど。
Apatch のHttp Clientからの移行が増えそうな気がする。

雑記

Typescript & Javascript + node で開発しているが、なんなく理解できた。

スクリプト言語の特徴が取り込まれつつある気がする。
今後、nodeで使われているようなAPIが増えていくのだろうか?
Promiseとかは、面白いと思う。
今だと、async-awaitかな?
Javaは、マルチスレッドだから必要ないかも知れないけどね。。。

参考サイト

Java 11の変更点を押さえよう! 標準機能になったHTTP Client API (1/3):CodeZine(コードジン)

Java 11正式版がリリース、本バージョンからOracle JDKのサポートは有償に。OpenJDKで無償の長期サポート提供は現時点で期待薄 - Publickey

Java 11正式版がリリース、本バージョンから「Oracle JDK」のサポートは有償に (1/4) - ITmedia エンタープライズ

Java 11正式版リリース、3年の長期サポート対応のLTSバージョンが4年半ぶりに更新 - GIGAZINE

2018/09/10週 気づきと振り返り

やったこと

  • サーバーとの疎通確認

気づき

superagent

withCreadentials() → Cookie送ってくれるやつ。
Access-Controll-Allow-Originが * のときは機能しない。

tsconfig

es5 → es2018
targetだけじゃなく、libも変える必要がある。

chromeのSet-Cookie

アクセスしているサーバーと別ドメインのサーバーからSet-Cookieが来た場合、ChromeのDevToolのNetworkタブでは見えない。

ただ、実際には設定されている。

見る方法はない。

振り返り

ChromeのSet-Cookie

疎通確認でマジ困った。
あるはずのSet-Cookieがなんでないの?って2日くらい悩んだ。
結局、Cookieは正しく設定されていて、その他がおかしかっただけだった。

Chromeで開発する場合は、Set-Cookieは最後に疑う。
そうじゃないと無駄な時間を過ごす。

もしくは、他ブラウザで試してみる。

その他雑記

ChromeのSet-Cookieで悩んだ1週間だった。。。

年を1つ取ったが、このままでいいのかにも悩んでる。

メンタルが殺られそう。
今は、購買欲で誤魔化した。
あそびあそばせ」って漫画の電子書籍買ったけど、無茶苦茶面白い。
久々に笑った気がする。
俺が最後に笑ったの、いつだっただろうか?

今は、27日の無双OROCHI3が楽しみ。
もう、それくらいしか楽しみがない。

javaコマンドでjava.dllが見つからないって言われる

現象

Error: could not find java.dll
Error: could not find Java SE Runtime ENvironment.

原因

システム環境変数に、オラクルのインストーラーで入れたときのパスが入っていて、自分で入れたやつと競合してたから。

最初は、参考サイトのSystem32の設定を見に行ってたからかな?って思ったけど、違って迷宮入りするところだった。。。
ラクルのJavaパスは、インストーラーで入れるのをすっかり忘れてた。
たしかに、前に入れたっきりなにもしてなかった気がする。
今もまだ有効なのかな?
インストーラーで勝手にパス設定するのは、そろそろ辞めたほうがいいと思いました。

参考サイト

javaコマンドでjava.dllがどうこうってエラーが出た

2018/08/27週 気づきと振り返り

やったこと

  • jest環境構築
  • 使用言語:typescript
  • jest使ったユニットテスト作成
  • superagent-mockをテスト環境に入れ込む

気づき

jestでカバレッジ

jest --coverage で見ることができる。

レポートは予想以上にキレイに出てくる。
テストがきちんと動いていることを対外的に示すのにも有効。

カバレッジとテスト

100%を目指すよりは、足りてないテストが何なのかを見極めるために、カバレッジを使ったほうがいい。

100%を目指した場合、リファクタリングを阻害する可能性があるのと、機能追加が難しくなる。

という、結論を現場で出した。
足りてないケースを見極めて、そこにコストかけるのかを判断したほうが、100%目指すよりは安上がりだと思う。
かけるコストとパフォーマンスを考慮することを考えれば、あえて100%を目指さないほうが、判断の基準ができる気がした。
100%だと、コスト度外視して盲目的にOKにしがちな気もする。
もうちょい、考慮の余地はありそう。

振り返り

テストデータとロジック

テストデータにロジックを含めてはならない。
特に、モックを使う時は注意が必要。
知らぬ間にロジックを含めてしまい、テストのためのテストを書いてしまうことがある。
テストの理解も困難化する。
ロジックがあることを明確化して、共通処理として抜き出すなどを考慮したほうが良い。

その他雑記

日頃の楽しみが、ランチくらいしかないことに気づいた。
現場の社食が、女子大生考案のレシピだから、喜んで食べてる。
女子大生を身近に感じるって素晴らしいことだな。

遊戯王デュエルリンクス初めたけど、ジェム貯まりづらい。。。

ネットワークスペシャリストの資格試験を受けるのだが、受かる気がしない。。。
受かればそれなりのリターンがあるけど、ダルい。。。
もっとやる気を出す方法はないものか?

もしかして、闇落ちしてる?

最近、生きる意味をよく考えるようになった。
もう、三十路を超え、たいしたスキルがないのに、このままでいいのかということをよく考える。
仕事も常に同じことの繰り返し。定時退社できているけど、スキルが付く/能力が上がったという実感はない。
その結果、生きることに意味を見出だせないのだが、他の人はどう思っているのだろうか?

特に夜がヤバイ。
いろんな不安が、寝る前に一気に押し寄せてくる。
たまに眠れない夜がある。
社会から隔離されているような感覚が、たまにある。

不安に打ち勝つには、考えないようにするしかないって最近分かった。
だけど、それって何の解決にもなってないんだよね。。。

これが、俗に言う闇落ちか。。。
昔は、そんなこと考えもしなかったのにな。。。

何がそうさせているのか?
年齢が大きなウエイトを占めている気もするが、周囲の環境も一因としてあるかもしれない。
解決の糸口が全く思いつかない。
解決するには、逃げるしかない気がする。
「逃げちゃダメだ」なんてアホなセリフ吐いたキャラがいるらしいが、「逃げちゃダメ」ってことはないと思う。

解決の糸口が見つかるまで、もう、考えないようにする。

なんか、すごく女々しいことを書いた気がする。。。
何か趣味を初めたほうがいいのかもね。。。
思いつくのは、ゲームかイラスト書くくらい。
ローグライク系のゲームでもしようかな?