エンターテイメント!!

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

2019/06/17週 気づきと振り返り

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

AndroidのUIスレッド

メインスレッド以外でUIを変更しようとすると、CalledFromWronThreadExceptionが発生する。

どうしてもやりたい場合は、メインスレッドでやるように明示的に処理を書く必要がある。

mActivity.runOnUiThread(new Runnable() {
  @Override
  public void run() {
    // UI処理
  }
}

もっと短く書くと、以下。

mActivity.runOnUiThread(() -> /** UI 処理*/);

雑記

悩んでた問題が、休み明けだとスラスラ解ける現象は、何なの?
一旦、忘れてから、再度、取り組んだほうが解決する。
余分な考えや、先入観で、問題が正しく見えてなかったのかも知れないな。。。

Java13のText Blocks (Preview)を試す

きっかけ

なんか気になっちゃったから。
学生時代、クラスで好きな女子が気になっちゃう的な感じ。

開発環境

Visual Studio Code

バージョン: 1.35.1 (system setup)
コミット: c7d83e57cd18f18026a8162d042843bda1bcf21f
日付: 2019-06-12T14:30:02.622Z
Electron: 3.1.8
Chrome: 66.0.3359.181
Node.js: 10.2.0
V8: 6.6.346.32
OS: Windows_NT x64 10.0.17763

Java

$ java -version
openjdk version "13-ea" 2019-09-17
OpenJDK Runtime Environment (build 13-ea+25)
OpenJDK 64-Bit Server VM (build 13-ea+25, mixed mode, sharing)

実験用のソース

今回は、Java13の機能を試すときに悩んだので、そのまま、そのソースを利用。

public class test {
  public static void main(String[] args) {

    String text = """
    <html>
      <body>
        <p>Hello, world</p>
      </body>
    </html>
    """;
    
    System.out.println(text);
  }
}

実行

preview機能なので、過去に書いたpreview機能の試し方を参考に実行

suzaku-tec.hatenadiary.jp

実行すると、下記のような結果になる。

<html>
  <body>
    <p>Hello, world</p>
  </body>
</html>

見たままでやれるので、より直感的になると思う。

参考サイト

JEP 355: Text Blocks (Preview)

Javaでpreview機能を試すやり方

きっかけ

Java13の機能を試そうとしたら、--enable-previewを付けてコンパイルしろやアホって言われて、ちょっと苦戦したので晒す。

開発環境

Visual Studio Code

バージョン: 1.35.1 (system setup)
コミット: c7d83e57cd18f18026a8162d042843bda1bcf21f
日付: 2019-06-12T14:30:02.622Z
Electron: 3.1.8
Chrome: 66.0.3359.181
Node.js: 10.2.0
V8: 6.6.346.32
OS: Windows_NT x64 10.0.17763

Java

$ java -version
openjdk version "13-ea" 2019-09-17
OpenJDK Runtime Environment (build 13-ea+25)
OpenJDK 64-Bit Server VM (build 13-ea+25, mixed mode, sharing)

実験用のソース

今回は、Java13の機能を試すときに悩んだので、そのまま、そのソースを利用。

public class test {
  public static void main(String[] args) {

    String text = """
    <html>
      <body>
        <p>Hello, world</p>
      </body>
    </html>
    """;
    
    System.out.println(text);
  }
}

最近、jsばっかりやるせいで、クラスを小文字から書いても抵抗がない。
Javaやってたころは、かなり違和感あったかもな。。。

本題

コンパイル

下記のコマンドでできる。 $ javac --enable-preview -source 13 test.java

コンパイルすると、警告が出てくるが、問題はない。
--enable-previewpreview機能を有効化する。
こいつを使う場合は、-source-releaseオプションが必須。
なぜなら、どの時点のプレビュー機能を使うのか判断できないから(だと思う)
今回は、Java13を使うので、13を指定

ちなみに、releaseでやると、下記の感じになる。
$ javac --enable-preview -release 13 test.java

実行

$ java --enable-preview test

最初に実行したときは、-source を付けてしまい、怒られた。。。
同じことした人は、たぶん、多いと思うんだけど、どうかな?

理屈としては、コンパイル時に対象のバージョンを指定したから、バイトコードでは不要なんだろうなと思う。
だったら、enable-previewもなくていいじゃんって、思ってしまうけどな。。。

感想・雑記

本質とは違うところで悩んでしまったが、今後、early-access版を試すときに必須になりそうなので、覚えたほうが良さそう。

IDEは、リリース済みのJDKなら、IntelliJ使うんだけど、未リリースの奴は、vscode使うことが多い。
あまり制約が無いのと、日本語表記があるから、未知のことをやる場合は、vscodeが多くなる感じかなと思う。

参考サイト

ずんだの縦読み問題 Java 12 Early-Access 版 - Qiita

2019/06/03週 気づきと振り返り

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

なし

というか、ほとんど作業してない。
むしろ、こっそり寝てるかゲームしてた時間が長いと思う。

その他

業務と関係ない場所でコード書いていたが、npmのFile systemでexistって非推奨だったんだな。。。

File System | Node.js v12.4.0 Documentation

名称を見て使っていたが、statに置き換えた。

これは、いつから非推奨になったんだろう?
長いことDeprecatedにしたままだと、JavaのDeprecatedと同じことになりそうだが、どっかで削除するのかな?

雑記

簿記3級って、難易度高くない?
独学だと、全然点数取れない。数字が合わないと、かなり焦る。

受験場所が明治大学だったのだが、明治大学の空調、かなりヤバイ。
たぶん、空調にホコリが大量にあると思う。
きっと、掃除してないと思うわ。
試験中、くしゃみと鼻水が止まらなかった。
試験は、なるべく明治大学以外がいいな。

2019/05/27週 気づきと振り返り

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

androidでJSエンジン

webviewは、レイアウト配置しなくても使える。
インスタンス保持だけで使えた。

JSエンジンとして活用することができる。
なので、JSでwebアプリを開発したら、そのままAndroidでwebviewに乗せるだけとかでもできる。
見た目は、unityで作りたいとかでも、内部の実装だけ流用ができるのに、最近気づいた。

Androidでコード読むときに迷子にならない方法

無茶苦茶クラス数が多いアプリを見てたりすると、クラスを飛びすぎて迷子になる。
脳の一時記憶が持たないので、かなりしんどい。

何かないかと探したら、ブックマーク機能ってのがあるのに気づいた。

IntelliJのブックマーク機能 - 無理しない感じ

vscode使っているときに、ブックマークの拡張機能があったので、IntelliJAndroid Studio)にもあるだろうと探したら、案の定、あった。
多少は、ソース追うのは改善したけど、でも、やっぱり、これは何だったっけ?ってのはなくならない。。。
メモもついでに残せないとダメかもしれない。

AndroidのFragment

使っているライブラリがFragmentを使っていたが、理解するまで時間がかかった。
最初見たとき、どこでボタンが追加されているのか、全然分からなかった。

はっきり言って、viewの実装を分断するのは、良くないと思う。
なるべく、一元化すべきだと感じる。
代わりに、内部の実装を提供するのがベターだと思う。

雑記

今週、ほとんど何もしてないや。。。
たぶん、就業時間中は、ゲームしてた時間の方が長いんじゃないかな?

ここからは、ほぼ愚痴。

周囲に無茶苦茶キーボード音がうるさい人がいるのだが、ストレスでも抱えているのかな?
エンターキーがデカいならまだ分かるが、すべての音がうるさいというのが、俺にとってストレス。
どうやったらキーボード音がうるさいって伝わるだろうか?
舌打ちしておけば、おさまるかな?
話したくないので、直接伝えるのは辞めたい。

【読書ノート】才能の正体

きっかけ

安売りしてたから

感想

「才能」とは何か?

才能=能力ではない。
能力が高まっていくと、やがて、才能として認められる。

メモ :つまり、才能=能力では?いきなり矛盾しているように見えたのだが、俺の気のせいかな?思うんだけど、才能とか天才とかって、そう呼ばれる人たちの鍛錬を想像できない人が使いがちな言葉だと感じてる。写輪眼とか、あきらかに努力で手に入れなれないものを持っているなら分かるけど、現実には、そんなものないからな。

才能がある人達=全員努力している。
すべての人が、優秀と言われる可能性を、もともと持っている。

周囲の評価は、結果だけをみて評価する。
人は、結果からしか判断ができない。
結果がでると、過去の記憶は、改ざんされてしまう。

メモ :何かの能力使いみたいだな。記憶の改ざんは、意外と簡単に起きるのかもしれない。

人は、結果から遡って物語を作ろうとする。
結果を作る物語の大きな要員になっているものが、才能。

メモ :才能ですべて丸く納めてるってことか。歴代の英雄たちは、それに近いかもな。。。

人は、認知で行動が変わる。
自分にもできそうなことなら、行動する。
逆に高すぎるハードルは、諦めてしまう。

メモ :認知って言われると、ペルソナ5を思い出してしまう。

「やればできる」は、結果至上主義。結果が出せないと分かった瞬間、やることそのものを辞める。
正しくは、「やれば伸びる」。

物事を分析する手法として、Why型/How型がある。
Why型:結果から、理由を作る。→ 能力が伸びない
How型:過程での変化を見る → 動機付けが向上しやすい=やれば伸びる

メモ :激しく同意。IT業界って、よく、なぜなぜ分析しろと言われるが、何かがおかしいと思っていたが、やっと理由が分かった。結果しか見てないから、糾弾みたいになったり、変な方向に議論が波及していくと思う。犯人探しをしたいんじゃないって言うけど、「なぜ?」の時点で、結果ベースで物事見ているから、犯人いる前提だろうって思う。

人間=何歳になっても後悔しているもの。
後悔を断ち切るには、「やらなかった」を失くしていくしかない。

メモ :やっちまって後悔するパターンは、いいんですかね?オナラを出そうとしたら、実が出ちゃったとかは、やってしまった後悔だと思うんですけど、トイレに行くことをしなかった後悔になるんですかね?

才能ある人=結果を出せる人=洞察力が高い人
先の展開を予想できた方が、結果をコントロールしやすい。

能力を才能へ

守破離を意識してスキルを磨く。
このとき、できる人を師にしてはいけない。なぜなら、助言をもらっても、難易度が高すぎることが多い。
当たり前のようにこなしていることが、実は難しいこともある。
やるなら、行動を真似る。

どんなに優秀でも、継続しないと伸びない。
他人が努力しているときは、邪魔せずに見守る気概が必要。

続けるには、自分にあったやり方を見るけるしかない。
教師/上司が、成功体験をもとにアドバイスしてきても、必ずしも適用できるとは限らない。
なぜなら、その人固有の成功談であるから。たまたま合ってしまう場合もある。
鵜呑みにせず、それが自分にあてはまるのか、よく考えて適用する必要がある。

技:詰め込み。
術:考え方を覚える。
スキルアップしないのは、技と術が混同しており、使い分けができていない。

成功体験は、不要。
それをこれから作り出す。

「才能」のマネジメント

人に伝えるには、前提の共有と概要が大事。
どちらも、話に惹きつけるために必要になる。

フィードバック=無意識に改善したくなるもの。
改善意欲を削ぐフィードバックは、間違ったフィードバックをしてしまっている証拠。
フィードバックをする際は、中立的なものを行う。
中立的なものは、なるべく事実をベースにするといい。
相手をコントロールしようとしたり、威圧的に価値観や感情を伝えるのはメリットなし。

チームは、目的と、目的を達成するためにもっとも効率的な作戦は、何かを考えて動ける。

JJUG CCC 2019 Spring 参加報告

公式サイト

JJUG CCC 2019 Spring - 日本Javaユーザーグループ/Japan Java User Group | Doorkeeper

参加セッション

  • Oracle Keynote Valhalla, updates and future
  • Catch up Java 12 and Java 13
  • ドメイン管理サービスにおけるJava活用のご紹介
  • 入門: 末尾呼び出し最適化
  • ソフトウェア設計の教育工学的な分析と育成へのアイデア
  • Project Loom - 限定継続と軽量スレッド
  • Functional Spring Cookbook

感想・まとメモ

Oracle Keynote Valhalla, updates and future

  • 内部クラス -> JVM上では別クラス
  • JEPの名前は、変わることもある
  • 二仕様物語は、笑うところ
    • たぶん、笑わないのは元ネタが分からないから。二都物語とかけているらしいが、読みが似ているだけで、内容が揶揄しているのか、よく分からなかった。。。
  • Java11より前は、内部クラスから外部クラスを呼ぶときにBridgeMethodを経由して呼ばれる
    • 開発者は作ってないが、スタック上に出力されてしまう。。。
    • やろうと思えば、外部からBridgeMethodにアクセス可能
    • Java11でなくなった
  • ValueTypes
    • Minimal Value Types プロジェクト(MVT)
      • タイプの種類
        • LQRU
          • なんか、エヴァのタイトルに出てきそうな英字だな。。。

BridgeMethodは、一回、試してみたい。
確かに、Java8使っているときに、見覚えのないメソッドがスタックトレースに出てきた経験がある。

Catch up Java 12 and Java 13

www.slideshare.net

Java12

lts のあとなので、大きな変更はない。
とはいえ、ツールとか入ってきた。

JEP 189

  • GCが7種類に
  • Shenandoahは、一回の GC は一定だが、頻度が変わる。

ShenandoahのJEPのサマリを見たときは、「そんな、バカな!」と思ったけど、やっと意味が分かった。
最初見たときは、一回のGCで全部回収して、実行時間も一定みたいな意味合いに見えてしまったが、違うのね。
参照の切り替えで済むから一定で、頻度は違うかもってわけか。。。
思ったんだけど、これの発生タイミングが重複してしまったら、どうなるんだろう?

JEP346

  • Java がメモリを返すようになった
  • これが可能になることで、常駐プロセスが作りやすくなったはず。
  • GC 改善は続いている。

JEP325

  • switch -> preview
    • 即使うのは待った

イマイチ、これは、便利になったのか?って疑問符が湧く。
switch文が嫌いなのだが、JDKのコミッターにswitch文好きがいるのかな?
それとも、デカい回収のための何かなのだろうか?

JEP341

  • 起動時間の短縮

JEP334

  • 定数の遅延処理

String#transform

  • ラムダ式でアクセスの逆順で書けるようになる。

かなり便利そう。
これは、Stringだけなのかな?
他のオブジェクトでも使いたいケースがありそうな予感。
内部の仕組みを確認しておきたい。

java13

  • socket 一新される
  • Loomは桜庭さんのセッション参照

かなり駆け足だった。
45分で振り返るのは、無理があったのだろうな。。。
興味持ったところだけしか、メモは取れなかったが、コンパイラの話は、かなりスッキリした。
あとは、String#transformが、かなり気になる。

ドメイン管理サービスにおけるJava活用のご紹介

  • TLD -> top level domain
  • ドメインはオークションで落札する必要がある。そこから色んな会社を経由して利用者に渡る
  • ドメインの最高落札額は、150億円くらい

ICANNと聞いて、最初にICANを連想してしまった。。。
ICANNって、ビジネス的にウハウハなんじゃないかな?って思ってしまった。

入門: 末尾呼び出し最適化

speakerdeck.com

末尾呼び出し最適化ってのは、後続の処理がないことに目を付けているわけね。
処理をスタックトレースに積まないことで、メモリ消費を抑えていると。
後々、疑問に思ったが、問題が発生したときにトレースできなくなるのでは?と思ったが、どうなんだろう?
同じ処理の繰り返しだから、スタックトレースは不要という考えなのかな?
分岐があったら死にそう。。。

あと、スタックってのは、遊戯王で言うところのチェーンを積んだ状態と一緒だなって思った。

ソフトウェア設計の教育工学的な分析と育成へのアイデア

speakerdeck.com

やっぱり、現場に出てない講師もいるんだ。。。
なんか、セミナーとかは、現場に出てないやつが出ているのではないかという疑惑が心の中にあったが、やっぱり、ものによっては、現場から追い出されたやつが講師しているケースもあるのね。。。

分からない箇所が本人の説明と違う箇所にあるってのは、よくある話。
俺も、新人の頃は、分からない箇所を教えてもらっても、しっくりこないことがよくあった。
それを理解して接してあげないと、精神攻撃になってしまうから、教える側は注意が必要かもね。

Project Loom - 限定継続と軽量スレッド

t.co

  • safe habor statement -> 信じるなの意
  • 並列/並行処理=難しい
  • 並列処理がスケールしない= CPU が遊んでる

待ちを譲るって聞くと、js の Promise だな。
JavaでjsのPromiseをやるには、スレッドを上手く使うしかないと思う。
wait-notifyAllでも実現はできるのか。。。

どうも、スレッド周りの話は、難しい。
ExecutorServiceが理解できてないせいかもしれない。
時間を見つけて、本腰入れて勉強する必要があるかも。
できれば、Fiberが来る前にやっておきたい。

Functional Spring Cookbook

docs.google.com

Spring Fu???
eclipse cheにインスパイアされてそうな命名に感じる。
ただ、FuはFunctionであることは、なんとなく予想できる。

Springにも関数型の概念が入ってきているのか。
Spring webfluxを早めにキャッチアップしておきたい。

全体通して

やっぱり、人が多い。女性の割合がかなり増えた印象がある。
あと、初参加者は、毎回、一定数いるんだなって感じた。

主流はmacだが、サーフェス使いも増えてきた気がする。

String#transform が、かなり気になった。
最初にやりたいことが、一番最後に記述するはめになるのを、どうにかならないものかと考えていたので、とても画期的に思えた。
応用が効くのか、試したい。

タスク・課題

  • String#transformの確認
  • BridgeMethod
  • ExecutorServiceを調査する
  • Spring webflux