エンターテイメント!!

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

Java14事前調査 JEP 359: Records (Preview)

環境

$ java -version
openjdk version "14-ea" 2020-03-17
OpenJDK Runtime Environment (build 14-ea+34-1452)
OpenJDK 64-Bit Server VM (build 14-ea+34-1452, mixed mode, sharing)

eary accessのページからダウンロードしたやつだと、recordsがまだ入ってないやつっぽい。。。
recordsを試すなら、sdkmanから最新のバージョンを落としてくるのが良さげ。

JDK 14 Release Candidate Builds

それに気づくのにだいぶ遅れて、少し前のバージョンでビルドが通らずに四苦八苦してた。。。

$ VER
Microsoft Windows [Version 10.0.18362.592]

JDK14

JDK 14

JEP 359: Records (Preview)

JEP 359: Records (Preview)

概要(超要約)

データ保持用のクラス定義方法を追加
かなり乱暴に言うと、構造体みたいなものを追加した感じ。

テストコード

public class JEP359 {

  public static void main(String[] args) {
    Range record = new Range(3, 10);
    System.out.println(record);
  }

}

record Range(int lo, int hi) {
  public Range {
    if (lo > hi)  /* referring here to the implicit constructor parameters */
      throw new IllegalArgumentException(String.format("(%d,%d)", lo, hi));
  }
}

JEP359にあるサンプルを流用。

実行

$ javac --enable-preview -source 14 JEP359.java 
$ java --enable-preview JEP359
Range[lo=3, hi=10]

想定通りの結果。

追加補足

public class JEP359 {

  public static void main(String[] args) {
    Range record = new Range(3, 10);
    System.out.println(record);
    System.out.println(record.lo());
  }
}

生成されたインスタンスの値を取得したい場合、record.lo()のようにアクセスする。
個人的には、プロパティ的な立ち位置なので、record.loでアクセスしたい。。。

IllegalArgumentExceptionを起こすテストコード

public class JEP359 {

  public static void main(String[] args) {
    Range record = new Range(3, 1);
    System.out.println(record);
  }
}

record Range(int lo, int hi) {
  public Range {
    if (lo > hi)  /* referring here to the implicit constructor parameters */
      throw new IllegalArgumentException(String.format("(%d,%d)", lo, hi));
  }
}

実行

$ javac --enable-preview -source 14 JEP359.java 
$ java --enable-preview JEP359
Exception in thread "main" java.lang.IllegalArgumentException: (3,1)
        at Range.<init>(JEP359.java:15)
        at JEP359.main(JEP359.java:5)

補足

  public Range {
    if (lo > hi)  /* referring here to the implicit constructor parameters */
      throw new IllegalArgumentException(String.format("(%d,%d)", lo, hi));
  }

上記部分がコンストラクタのような動きをする。
これがあることで、不安定状態(値の整合性が取れてない)のインスタンスが作れないようにできる。

感想

変数へのアクセス方法が、個人的に不満
役割が明確なら、メソッドアクセスじゃなく、変数アクセスっぽいほうが好き。

無駄にコード量が増えるのを抑制できるのは、評価したい。

2020/02/03週 気づきと振り返り

業務こなしての問題・気づき

根を詰めすぎは良くない

バグの原因が分からなくて、かなり残業してしまった日があったが、翌日に出社したら、あっさり解決してしまった。。。
根を詰めるのは否定しないが、見えるものが見えてないときがあることを自覚する必要がある。

自己を過信するのは良くないが、自分の状態を知っておくことも、大切だと思った。

バグの原因が、クロージャの循環参照によるメモリリークで、コンソール上のログ見ただけだと、原因が全くわからないのは、きつかったわ。。。
単純そうだけど、作り込みの段階で気づきたかった。。。

[Swift] 画面間の値渡し

画面間の値渡しが、かなり苦痛なのだが、いい方法ないものだろうか。
よくやるのは、prepareで遷移先の画面のインスタンスに値を入れ込むのだが、その変数の公開範囲が広すぎて問題になるのでは?って、いっつも思う。

雑記

今週は精神不安定だったわ。。。
バグが解消できない状態って、かなり精神的にキツイ。。
今週は、たぶんハゲ化が進行した気がする。
ポケモンのランクまで負けまくったのも、ハゲ化を助長してそう。

2019年の振り返りと今後のブログ運営

振り返り

買ってよかったもの

任天堂 Nintendo ポケットモンスター シールド [Nintendo Switchソフト]

ブラック・ホワイト以降、ポケモンからは離れていたが、久しぶりに買って見てものすごくハマった。
ランクマやってると、永遠に時間が潰せそうな気がする。
お気に入りは、トゲキッス
こいつのおかげで勝てた試合が結構ある。あと、サザンドラとか。

個人的には、一部リストラは、肯定的に見てる。
無限にメモリにデータを詰め込めるわけじゃないから、いつか限界は来る。
新しいことにできなくなって、衰退していくだけだから、苦渋の決断だとは思うが、いい結果になると個人的には感じる。
追加コンテンツ方式採用も、評価してる。
環境調整のタイミングが短い周期になるのと、追加発売で同じようなストーリーをやらされるより、新しい冒険が加わる方が、楽しめると思う。

2020年は、ポケモンにどっぷり浸かりそう。

アップル Apple MUUQ2J/A [iPad Air 10.5インチ Wi-Fi 256GB スペースグレイ]

電子書籍ように購入。
Fireタブレットにしようかと思ったが、プライム会員じゃないので選択肢から外した。

電子書籍以外にも、ポケモンのダメージ計算とかによく使うかな?
画面も大きいから、操作しやすい。

PHILIPS フィリップス 436M6VBPAB/11 [液晶ディスプレイ 42.5型/MVA/4K対応/5年間フル保証/HDR1000]

ゲーム用のディスプレイとして購入。
ついでにテレビを捨てた。

遅延ないし、画面が大きくてきれいなのがいい。
ただ、音量調節ができないのが、ダメだわ。
安物のスピーカーで対応できるようにした。
全体的にみると満足なんだが、音量調節できないのは不満だ。

ブログ運営について

週次に書くように心がけたが、踏み込んだが記事が書けなくなってしまったと感じる。 月末に深堀り記事を書くようにしたほうがいいかもしれない。

雑記

去年のうちにやっとけよって思うが、ポケモンにハマってしまって、なかなか手がつかなかった。。。

願望

副業がしたいって、最近思うようになってきた。
子ども向けのワン・オン・ワンに近いプログラミング塾って需要あるかな?

2020/01/27週 気づきと振り返り

業務こなしての問題・気づき

【Swift】'weak' cannot be applied to non-class type ~ の対応

protocol A{}

weak var myValue: A?

delegateがclassプロトコルに準拠してない場合に発生する。
なぜエラーになるのかは、調べたけどよく分からなかった。。。

【Swift】位置調整はUIEdgeInsets

キーボード出したときに、場所を変えたいときとかのビューの位置調整に使う。

雑記

情報処理技術者試験データベーススペシャリストに申し込んだ。
午前免除が切れてしまったから、全部受けなければならない。
そろそろマジで合格しないとダメだな~とは感じているのだが、世間的にはどれだけのステータスになるんだろうか?

Java11のオラクル試験が出てきたけど、移行試験の対策本って出てるのかな?
資格対策は、電子書籍じゃなくて実物の本が欲しいのだが、書店探してもないんだよね。。。
売られてないのかな?

今週は引きこもってた。
土日は、家でポケモンのランクマしてた。
勝率5割の壁が厚い。
なかなか5割突破ではない。
ブリムオンへの入れ替えマジックミラーで、やどりぎのタネ、ステロが跳ね返されて負けるのが、すごいストレスが溜まったわ。
あと、カバルドンの対オーロンゲ対面で、ステロ読まれて挑発とかもストレス溜まる。
逆に、相手のダイマエースを潰したときは、マジで快感。

Java14事前調査 JEP 358: Helpful NullPointerExceptions

きっかけ

そろそろJava14のリリース時期が近づいて来たので、調査。

ボリュームが多そうなので、とりあえず1個ずつ記事にまとめる。
全部一辺にやろうと思ったけど、ダレちゃいそうなので辞めた。。。

環境

$ java -version
openjdk version "14-ea" 2020-03-17
OpenJDK Runtime Environment (build 14-ea+24-1107)
OpenJDK 64-Bit Server VM (build 14-ea+24-1107, mixed mode, sharing)
$ VER
Microsoft Windows [Version 10.0.18362.592]

JDK14

JDK 14

JEP358

JEP 358: Helpful NullPointerExceptions

概要(超要約)

ヌルポのメッセージを分かりやすくしたよ

テストコード

public class JEP358 {
  public static void main(String[] args) {
    String msg = null;

    System.out.println(msg.length());
  }
}

13での実行結果

実行時にフラグ(-XX:+ShowCodeDetailsInExceptionMessages)を立てないと、以前と同じような出力になるそうなので、フラグを立てないで実行してみる。

$ javac --enable-preview -source 14 JEP358.java
$ java --enable-preview JEP358
Exception in thread "main" java.lang.NullPointerException
        at JEP358.main(JEP358.java:5)

分かるのは、5行目でヌルポになるってことだけ。
情報量が少ないため、下手するとコード読んでも分からない可能性がある。
開発者だと、そういうケースによく会うと思う。
自分も、たまにヌルポ沼にハマって抜け出せない事がある。

14での実行結果

$ javac --enable-preview -source 14 JEP358.java
$ java --enable-preview -XX:+ShowCodeDetailsInExceptionMessages JEP358
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "String.length()" because "<local1>" is null
        at JEP358.main(JEP358.java:5)

5行目の"String.length()"を使ってるところでエラーになったってのが分かる。

2020/02/09 追記

$ javac -g -source 14 JEP358.java
$ java --enable-preview -XX:+ShowCodeDetailsInExceptionM
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "String.length()" because "msg" is null
        at JEP358.main(JEP358.java:5)

上記の通り、コンパイル時に-gを付与することで、実行時にどの変数がnullで落ちたのか分かるようになる。
-gを付与することでデバック情報が付与されたクラスファイルができるらしい。

javac - Java プログラミング言語コンパイラ

感想

ヌルポには頭を悩ませることが多々あったので、この提案はすぐに入ってほしい。
そして、Java使ってる現場は、なるはやでこのバージョンに上げてほしい。
多くの開発者がハゲるのを防止してくれると思う。

WindowsでJavaのバージョン管理を楽にする

きっかけ

Javaの最新バージョンの検証をする際に、切り替えが面倒だったので、いろいろ調べた結果をまとめる。

環境

dosで確認

>ver

Microsoft Windows [Version 10.0.18362.592]

先に結論

調査した結果、一番手軽にやれるのは、環境変数JAVA_HOME作って切り替えるのが一番早い。
jEnv使うとかもあったけど、インストールの段階でpowershellで結構悩む。。。

シンボリックリンクの選択肢もあるけど、問題は、シンボリックリンクの作成が面倒という感じ。
ただ、きれいに管理するなら、シンボリックリンクが分かりやすいかもね。
目的別に作るのは、良さそう。
例えば、最新バージョンならlatest、earyアクセス版限定ならearyとかのシンボリックリンク作れば、分かりやすいのではないかと思う。

やること(やったこと)

  1. ユーザー環境変数JAVA_HOMEを作る。
  2. アクセスするのがwin10だと大変。win10より前のOSだと楽にアクセスできたけど、win10は場所が分からない。。。
  3. 検索してアクセスが早い
    1. ホームボタンを右クリックして、検索を選ぶ
    2. 環境変数で検索して、システム環境変数を編集を選択
    3. 環境変数ボタンを押下
  4. JAVA_HOMEに対象となるJavaのバージョンのフォルダのパスを追加する
  5. 追加するフォルダのパスは、binlibがあるフォルダにする
  6. ユーザー環境変数Pathに、%JAVA_HOME%%JAVA_HOME%\binを追加する

確認

java -versionで想定通りのバージョンが表示されたら成功。
以後は、JAVA_HOMEを変えれば切り替わるはず。

感想

いろいろ考えたけど、シンプルにやるのが一番楽。
もっと楽にやる方法を覚えるために、他の知識を詰め込む必要があるのが、結構しんどい。
俺の脳みその記憶容量は、そんなにないんだな。。。って感じた。

参考サイト

qiita.com

jEnvでJavaのバージョン管理ができるらしい、Windowsでも? - ts0818のブログ

2020/01/13週 気づきと振り返り

業務こなしての問題・気づき

gstreamerのCould not multiplex stream

muxerのpad追加が遅い。
muxerの処理を最初に持ってくれば解決する。

雑記

なんか、成長している感覚がない。。。
ほぼ何もできずに終わった気がする。。。

最近、脱力感がすごいわ。。。

家でポケモンやることしかやる気が起きない。