エンターテイメント!!

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

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

Vue.jsをvue-cliで試してみる

きっかけ

UI周りの実装が楽にならないか探して、vue.jsを知ったので試してみる。
react.jsも試したことはあるんだけど、覚えることが多くて辞めた。

環境

バージョン: 1.33.1 (system setup)
コミット: 51b0b28134d51361cf996d2f0a1c698247aeabd8
日付: 2019-04-11T08:27:14.102Z
Electron: 3.1.6
Chrome: 66.0.3359.181
Node.js: 10.2.0
V8: 6.6.346.32
OS: Windows_NT x64 10.0.17763

詳細

nodeはインストールした前提で始める。

Vue cliのインストール

とりあえず、公式にあるとおりにインストール。

npm install -g @vue/cli

グローバルに入れるのは、プロジェクト作成のツールであるため。
vue create my-project とすると、my-projectの中にnpmのプロジェクトができるので、自分で作ってローカルにインストールすると、二重にできてしまうから。

プロジェクト用意

先に書いてしまったが、下記のコマンドで用意

vue create my-project

結構、長い。。。
気長に待つ、

とりあえず実行

インストールが終わると、npm run serve で起動できるらしいので、作られたmy-project配下に移動して、コマンドを叩く。

 $ cd my-project
 $ npm run serve

serveって、serverのことかな?

http://localhost:8080/で起動したよ的なメッセージが出てきたので、ブラウザでアクセスしてみる。
そうすると、vueのサンプルページが見えるはず。

バインディング

App.vue と HelloWorld.vueの連携はわかったんだけど、index.htmlとApp.vueの連携がよく分からなかったので調べた。

紐付をしているのは、main.jsの下記の実装

new Vue({
  render: h => h(App),
}).$mount('#app')

appにApp.vueを設定している。

下記の記述と同価

new Vue({
  el: "#app",
  render: h => h(App),
})

render関数は、業が深そうなので、こうすると描画されるんだ程度で辞めとく。

感想

vueファイルとあるが、内部は、css/html/jsだから、素直に読めるのがいいと思った。
イベントハンドリングや文字列の埋め込みは、別の機会に。

Mahoutでレコメンドを試し実装

きっかけ

Spartの動きがなんとなく分かったので、次の機械学習へ。

環境

IntelliJ IDEA 2019.1 (Community Edition)
Build #IC-191.6183.87, built on March 27, 2019
JRE: 11.0.2+9-b159.30 amd64
JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
Windows 10 10.0

intellijって、開発環境を簡単に出せるのか。。。
知らなかった。
メニューバーの HelpAbout で表示できる。

いっつも、コマンド打って転記してたけど、今度からこれでやったほうが早いな。

実験

build.graldeと実行ソース、データセットを晒しておけば十分かな?

build.gradle

plugins {
    id 'java'
}

group 'rssCollector'
version '1.0-SNAPSHOT'

sourceCompatibility = 11

repositories {
    mavenCentral()
}

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.12'
    // https://mvnrepository.com/artifact/org.apache.mahout/mahout-core
    compile group: 'org.apache.mahout', name: 'mahout-core', version: '0.9'

}

data.csv

1,1243,3.3
1,1240,0.3
1,1242,1.2
2,1242,1.3
2,1243,1.9
2,1241,2.8
2,1245,4.3
3,1240,0.6
3,1242,1.0
3,1241,2.3
3,1245,3.0

sample

本当は、先頭大文字にすべきだけど、多めにみて。。。

import org.apache.mahout.cf.taste.common.TasteException;
import org.apache.mahout.cf.taste.impl.model.file.FileDataModel;
import org.apache.mahout.cf.taste.impl.neighborhood.NearestNUserNeighborhood;
import org.apache.mahout.cf.taste.impl.recommender.GenericUserBasedRecommender;
import org.apache.mahout.cf.taste.impl.similarity.PearsonCorrelationSimilarity;
import org.apache.mahout.cf.taste.model.DataModel;
import org.apache.mahout.cf.taste.neighborhood.UserNeighborhood;
import org.apache.mahout.cf.taste.recommender.RecommendedItem;
import org.apache.mahout.cf.taste.recommender.Recommender;
import org.apache.mahout.cf.taste.similarity.UserSimilarity;

import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.List;

public class sample {
    public static void main(String[] args) throws IOException, TasteException, URISyntaxException {


        URL url = ClassLoader.getSystemResource("data.csv");
        DataModel model = new FileDataModel(new File(url.toURI()));

        UserSimilarity similarity = new PearsonCorrelationSimilarity(model);

        UserNeighborhood neighborhood = new NearestNUserNeighborhood(2, similarity, model);
        Recommender recommender = new GenericUserBasedRecommender(model, neighborhood, similarity);

        // ユーザID:1の人に3件レコメンド
        List<RecommendedItem> recommendations = recommender.recommend(1, 3);

        recommendations.forEach(System.out::println);
    }
}

実行

実行すると、下記みたいなのがでるはず。

RecommendedItem[item:1245, value:3.65]
RecommendedItem[item:1241, value:2.55]

3件指定したけど、2件しか出てこないのは、データが少なすぎるせいらしい。

感想

sparkなくても、レコメンドとかできるのか。。。。
すごく楽にレコメンドとか実装できてしまって、hadoopの実行環境作るのに悩んでいたのは何だったんだと思いたくなる。

他のサイト見ていたけど、 UserSimilarity similarity = new PearsonCorrelationSimilarity(model); のところで、 PearsonCorrelationSimilarity 以外のアルゴリズムを適用させて、いろいろ分析方法を返るみたい。
当然、後続で利用するクラスも変わるわけだが。。。
利用するアルゴリズムは、統計学の知識がないと、よく分からなかった。
体系的に統計学を学ばないと、ググって調べた程度の知識量では、汎用的に使うのが難しそう。。。

あと、調べてると、やたらとscalaが出てくる。
時期的に見ると、Java8リリース前だから、JVM言語が出始めてきた頃だな。
Java8リリース前は、JVM言語の方が盛り上がってた印象がある。
Scalaは、なんとなく読めるけど、やっぱり、違和感はある。

そういえば、機械学習とかするときって、前処理が大変とよく聞くが、アルゴリズムを適用させるために、決まったデータフォーマットにするために大変ってことだろうか?

課題

参考サイト

Mahoutでレコメンドを作ってみよう! | Atlas Developers Blog

mahout をとりあえず動かしてレコメンドしてみる(動作確認程度) - Qiita

低スペックな頭の僕がJavaの機械学習ライブラリmahoutを動かしてみる。 - regtan’s TechNote

2019/04/015週 気づきと振り返り

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

週次リリースの廃止

週次リリースが廃止されてからしばらくたつが、なんか、メリハリがなくなった感がする。
どうも、ダラダラ開発してしまう。

危機感が、少し必要なのかも知れない。

JNINativeMethod

JavaC++のつなぎで使う。
ふつうに呼び出そうとすると、C++側のメソッド名が長くなりすぎるので、JavaC++のメソッド名のヒモ付をしたほうが良い。

雑記

最近、他言語をつなげることばっかりしてる気がする。

JavaJavaScriptJavaC++。。。

つなぎ目を作っていて思うことは、冗長化しやすいなって感じる。。。

2019/04/08週 気づきと振り返り

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

printデバッグ

たしかに回避するべきだが、デバック起動でパフォーマンスが落ちて、動作確認に時間がかかっては意味が無い。
printしたほうが早いのなら、prinデバッグで良いのでは?と最近思い始めた。

戦略と作戦と戦術と兵站

やることが無くて、戦略とか作戦について、自分は仕事の中でどうするべきか、思いを馳せてみた。

戦略

最上位概念。戦わずして勝つやり方を考える。

敗者から見て、卑怯といわれる方法が戦略?

仕事の中では、開発の古典(デザインパターンとか、原理原則)を学ぶことが戦略に該当すると思う。
ただ、戦術面での下積みがないと、戦略は使いこなせない気がする。
デザインパターンも、いきなり教わるのではなく、開発で悩んだ結果、デザインパターンを知ることで、よりよく使えると思う。

作戦

戦いを作る。どうせ戦いが始まるのなら、有利な状況で戦いを作る。

仕事のうえでは、言語の先取り学習とか、情報収集、アンテナ張りかな?
危険な仕事の気配を感じたら、擦り付け先を考えるのを良くする。だけど、やりたくない泥臭い仕事は、高確率で俺のところに来るから、処世術が下手なのかもしれない。。。。

言語の先取り学習は、たぶん、即座に現場に活かせることはないと思う。
どちらかというと、投資の意味合いが強い気がする。
Javaなら早期ビルドのころから追ったほうが、確実に有利。
覚えるのが、出てからよりも、よく覚えられる気がする。
たぶん、情報が出ていないから、自分で情報を取りに行くため、不明点が明確になって覚えやすいのだろうと思う。

戦術

戦う術。

仕事のうえなら、リーダブルコードを書く、UMLで意思疎通を計るなどかな?

兵站

戦略・作戦・戦術を長く続けるためのリソース確保。
疎かにすると、戦略レベルで崩れて、戦わずして負ける。

マインド(学習意欲)を強くする、快適な学習環境が、そうだろうか?
ブログを書くのも、長く学習するうえで必要かもな。
あとは、検証環境を迅速に作れるdockerをマスターしたり、webサービスを高速に作れるSpringBoot覚えたりが、そうだろうか?

雑記

メガネ

作業するときはメガネをしているのだが、たまたま忘れた。。。

画面がぜんぜん見えないから、作業にならない。。。

メガネがないとダメなんだ。。。
メガネがないと。。。

プリン

プリンは飲み物
分類するなら汁物。俺の中では、味噌汁と同じ分類。

マナーを気にするところでは、スプーン使うけど、家の中ではすすって食べる。

2019/04/01週 気づきと振り返り

業務こなしての問題

Java native

Android開発をするようになって、C++と連携しているソースを初めてみた。

nativeってワードを今まで見たことなかったが、初めて見た気がする。
今まで開発したなかで、見た記憶はない。

用途を確認したら、C++等のネイティブな実装を呼び出すときにだけ使うらしい。
そりゃ、見ませんよね。。。

どこかで、C++との連携する試し実装をしてみたい。

Android で Service連携

Serviceを実装したクラスが連携。
onBind()で返されるStubの実装が、処理の代理、もしくは振り分けを実施する。

CRAFT BOSS

初めて飲んだが、コーヒー嫌いな俺でも飲めた。
甘めなのが、個人的には不満だったかな?

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

業務こなしての問題

サムスン製モニタ

現場で発煙があったらしく、リスク回避のため、取り替えるらしい。
こういう話を聞くと、やっぱり、怖くて手が出せないよね。。。

個人では、モニタは、PHILIPSiiyamaを使ってる。
やっぱり、使うとしたら2択になってしまう。

デザインパターンの必要性

どこかのサイトで、不要・必要みたいなことが書いてあったので、改めて考えた。

個人的には、デザインパターンの考えは必要。
特にFWを作る場合は。
使う側が不要と感じるのは、それだけうまく状態管理とかをFW側が隠してくれてるからだと思う。
最近だと、SubjectとObserverパターンは、よく使うんじゃないかな?
Reactiveプログラミングだと必須だと思うのだが、使わないものなのだろうか?

古典的なプログラミング作法を知らないのは、かなりの遠回りをするような気がしてならない。
苦労してデザインパターンを自分で見つけてもいいかも知れないが、たぶん、その頃には、現役でいられるか怪しい気がする。

個人的には、一回問題にぶつかって、モヤモヤ悩んだあと、デザインパターンを知るべきだと思う。
最初っからデザインパターンを知ってしまったら、過度な適用や、誤ったパターンの適用をしてしまいそうな気がする。
一度、自分で熟考するのが大切だと思うな。
その方が、プログラミング能力は向上すると思う。

Gerritのnew UI

バージョンが新しくなったらしく、新規のUIで操作できるリンクができてた。
ただ、new UIで書いたコメントが、古いUIで見れないっぽい。。。

windowsの管理者権限と環境変数

管理者権限剥奪されてるアカウントで環境変数dosからコマンド操作で変えられるのは、OKなのだろうか?
変わってるのは、ユーザ環境変数だから、OKなのかな?

AndroidでJava8

target1.8にしただけでは、streamは使えない。
APIのバージョンも合わせる必要がある。

やってみたいこと

JavaC++の連携を試す

Androidで、ネイティブ層の実装とJavaの実装の連携方法を見ているのだが、さっぱり分からない。。。
なんとなく、ポインタ取得して同じところをみている感じがするのは、感覚的に分かった。
いろいろ実験してみないと、本当に推察が正しいのか判断できない。