エンターテイメント!!

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

SpringBootCLI + Groovy で "Hello Saga!"

きっかけ

安かったので買ってみたSpringBootの本に、Groovyで動かしている内容を見て、興味が湧いたので真似てみた。

実験

環境

OS

$sw_vers
ProductName:    Mac OS X
ProductVersion: 10.14.2
BuildVersion:   18C54

Spring Boot CLI

$spring --version
Spring CLI v2.1.2.RELEASE

homebrewで入れようとしたんだが、xcodeのバージョンが古いからダメですと言われて、かなり萎えた。。。
xcodeって、サイズが大きいから、アップデートするのシンドいんだよね。。。

ちなみに、homebrewでの入れ方は、下記。

$ brew tap pivotal/tap
$ brew install springboot

Groovy

Groovy Version: 2.5.5 JVM: 11.0.1 Vendor: Oracle Corporation OS: Mac OS X

実装

作るのは1クラスだけ。

@RestController
class App {
  @RequestMapping("/")
  def saga() {
    "Hello Saga!"
  }
}

Groovyだと、直後にメソッドから抜けることが確定してる式は、returnを省略できるので、"Hello Saga!"だけでいい。

実行は、spring run app.groovyでOK
しばらくすると、お馴染みのSpringBoot起動のコンソールが流れるはず。

俺の環境では、実行までにかなり時間がかかった。
こんなに遅かったか?と思って、Javaで書いたのを実行したら、ものすごい速かった。
groovyファイルをコンパイルするにしては長かった。
メッセージの内容をみていると、依存関係の解決が長かったので、groovyのコンパイルにひきづられて、何かの依存関係の解決もやり直しになってるんだろうなって推測。
詳しく調べるとハゲそうなので、とりあえず保留。

実行して、ブラウザでアクセスすると、Hello Saga!って出るはず。

ちなみにJavaで書いた時の記述

App.java 
@RestController
class App {
  @RequestMapping("/")
  public String saga() {
    return "Hello Saga!"
  }
}

groovyは、java特有の宣言記述が省略されてるのがよくわかる。

参考サイト

Spring Boot CLI と Groovy 7行で Hello, world! してみる - Qiita

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

業務こなしての問題

Androidのprogaurd

年を跨いで対応していたが、いろいろひどい目にあった。

いじっていたが、何がダメなのか、袋小路に入って、ひたすら悩んでいた。
progaurdが無効のまま、progaurd.proに修正入れても反映されないでいろいろ悩んでいたりした。

もう、今となっては些細な問題だと思う。
仕組みをなんとなく覚えられたので、もう同じ轍を踏むことはないと信じたい。

package.jsonのdependenciyの削除

uninstallで消しましょう。
記述を削除すると、インストール済みのものが残ったままになり、間違って使ってしまって、他人がビルドしたとき、もしくは、CIかかったときに慌てるハメになる。

前にも書いた気がするな。。。

Androidのログ

タグは、パッケージ名を参考にしたほうがいいのではないかと思いました。
なぜなら、フィルタリングが楽になると思うから。

現場のタグ名が、クラス名になっているのだが、実装したクラスのログすべてをフィルタリングしたいってときに、どうすればいいのかかなり迷った。
結局、いい方法が思いつかなかったので、全出力で皿目で見るという作業になってしまった。

マジでタグ名をどうするかは、真剣に考えたほうがいい。

getter/setterの価値

俺は必要ないと思う派。

それなら、ただのpublicフィールドでいいじゃんって感じる。

カプセル化って言う人をたまに見るが、「ロジックが必要ない箇所に適用して、何か意味があるの?」って思う。
ロジックがないなら、普通にそのフィールドにアクセスしているのとなんら変わらないじゃんって思うんですよ。

JavaだとLombokが一時期話題になっていたが、そもそも単純getter/setterは必要ないと思っていたので、熱は早めに冷めた。

無力感

1ヶ月くらい、成果物を作ってない気がするのだが。。。
調査した結果、対応を見送る、難易度高すぎて諦めたタスクがいっぱいある。。。

存在意義とか、自分の能力を疑いたくなっちゃうよね。。。
他の人はタスクこなしているのに、俺だけ取れ高ゼロだもんな。。。

個人的に思いついた名言

  • 俺は組織の爆弾になる。潤滑油になどなるものか!
  • やればできる子なんだ。今はやらないだけなんだ。

intellij idea で micronaut + spring jdbc + sqliteのサンプル

きっかけ

年始が暇だから、何か作ろうと思い立った。
springbootでちゃっちゃと作ろうと思ったが、micronautで挫折したことを思い出し、再度チャレンジ。
とりあえず、動いたので、まとめる。

挫折したらそのままってのが、いつものパターンだったが、ゾンビランドサガを全話通して見て、再度チャレンジしたくなった。

まとめ

環境

OS

$sw_vers
ProductName:    Mac OS X
ProductVersion: 10.14.2
BuildVersion:   18C54

Java

$java -version
openjdk version "11.0.1" 2018-10-16
OpenJDK Runtime Environment 18.9 (build 11.0.1+13)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.1+13, mixed mode)

Intellij IDEA

Intellij IDEA 2018.2.6 Community Edition

お金ないっす。。。
金がなくても、開発はできる。ちょっと手間が増えるだけ。

micronaut

$mn -V
| Micronaut Version: 1.0.2
| JVM Version: 11.0.1

インストールは、sdkmanを利用。
sdkmanは、Java関連の開発環境を用意するためのツール。
macのhomebrewみたいなもの。
前に調べたもののリンクを貼っておく。

suzaku-tec.hatenadiary.jp

インストールは、sdk install micronaut

sqlite

$sqlite3 -version
3.24.0 2018-06-04 14:10:15 95fbac39baaab1c3a84fdfc82ccb7f42398b2e92f18a2a57bce1d4a713cbaapl

sqlite関連

SqliteManager Version 4.8.1

まとめ

流れ

  1. micronaut初期化
  2. intellij にインポート
  3. とりあえずgoodmorning Saga!
  4. Sqliteにアクセスしてみる
    1. テストデータ用意
    2. spring jdbc + sqliteを追加
    3. ファクトリクラスの実装
    4. データアクセスサービスの実装
    5. コントローラクラスからDBアクセス
    6. 起動

micronaut初期化

まずは、micronautのプロジェクト作成から。

コマンドは、下記の通り

mn create-app {プロジェクト名}

このコマンドを打つと、カレントディレクトリにプロジェクト名のディレクトリが掘られて、gradle関連のソースが格納される。

今回は、mn create-app murakumoで作成

叢雲を選んだのは、個人のセンスです。

intellij にインポート

intellij を起動して、初期画面から import Project を選択してインポート。
インポートする際は、gradleのプロジェクトとしてインポートさせる。

じゃないと、いろいろエラーが出て挫折する。
たぶん、前回は、next連打してたから、気づかなかったのかも。。。
もしかしたら、import じゃなくて、openを選んで開いていたのかもしれない。

とりあえずgoodmorning Saga!

まずは、作ったら、goodmorning Saga!でしょ。
Hello Worldは、古い。

実装

package murakumo.controller;

import io.micronaut.http.annotation.Controller;
import io.micronaut.http.annotation.Get;

@Controller("/hello")
public class HelloController {

    @Get("/")
    public String index() {
        return "Goodmorning Saga!!";
    }
}

動作確認

下記コマンドで動かす。

$ ./gradlew run

そうすると、なんかビルドして動き出すはず。
自分の環境では、進捗が75%で止まるのだが、75%で localhost:8080/hello でアクセスすると、Goodmorning Saga!!が表示されるはず。
たぶんだが、75%のやつは、描画が更新されてないだけで、100%なんじゃなかろうか?

Sqliteにアクセスしてみる

今回は、いろいろORマッパーを探したけど、良さげなのがなかったので、Spring jdbcを使う。
本当は、脱springでやりたかったのだが、しょうがない。

テストデータ用意

まずは、DBの用意。
Sqliteは、DB作ると同時にtableも作らないとダメなので、ちょっとやっかい。

sqlite3 murakumo.db

カレントディレクトリは、murakumo直下

打つと、sqliteCLIに入るので、テーブルを作成する。 適当に、下create table sample(id, name)で、sampleテーブルを作る。
きちんとできているか確認するため、.tableを打つ。
そうすると、sampleって表示されるはず。

そしたら、一旦、sqliteCLIを抜けるため、.exitを打つ。
テーブルへのテストデータ投入は、sqlitemangerからやる。
sql文を打つのが早い人は、そっちでもいい。

spring jdbc + sqliteを追加

テストデータは用意できたので、今度はsqliteを利用するためのライブラリを追加する。

build.gradleのdependenciesに下記を追加。

    compile "io.micronaut.configuration:micronaut-jdbc-tomcat"
    compile 'org.springframework:org.springframework.jdbc:3.2.2.RELEASE'
    compile "io.micronaut:micronaut-spring"
    compile group: 'org.xerial', name: 'sqlite-jdbc', version: '3.25.2'

保存したら、勝手にライブラリのダウンロードが走るはず。

そしたら、今度は、jdbc接続用の設定を、application.ymlに追加する。
datasourcesが、今回追加した箇所。

micronaut:
    application:
        name: murakumo

datasources:
    default:
        url: jdbc:sqlite:murakumo.db
        driverClassName: org.sqlite.JDBC

ファクトリクラスの実装

今度は、jdbcアクセスようのDatasourceを生成するクラスを書く。
俺はよく知らないが、spring-jdbcは、こうやるものらしい。

package murakumo.factory;

import io.micronaut.context.annotation.Factory;
import org.springframework.context.annotation.Bean;
import org.springframework.jdbc.core.JdbcTemplate;

import javax.inject.Inject;
import javax.inject.Singleton;
import javax.sql.DataSource;

@Factory
public class JdbcTemplateFactory {

    @Inject
    DataSource dataSource;

    @Bean
    @Singleton
    JdbcTemplate jdbcTemplate() {
        return new JdbcTemplate(dataSource);
    }
}

JdbcTemplateを生成して返すだけ。

データアクセスサービスの実装

今度は、テーブルからデータを引っこ抜いてくるクラスを作る。

package murakumo.service;

import io.micronaut.context.annotation.Requires;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.transaction.annotation.Transactional;

import javax.inject.Singleton;

@Singleton
@Requires(beans = JdbcTemplate.class)
public class TestService {

    private final JdbcTemplate jdbcTemplate;

    public TestService(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    @Transactional
    public void printSampleTable() {
        jdbcTemplate.query("select * from sample", (rs) -> {
            System.out.println(rs.getString("id"));
            System.out.println(rs.getString("name"));
        });
    }

}

printSampleTableが実際にDBアクセスしている箇所。
ResultSetをLambda使って処理できるのは、今っぽい。
昔だと、resultSet取ってきたら、ぐるぐる回して結果を見るのが多かった。

コントローラクラスからDBアクセス

当然、アクセスは、DIしたものを使ってやる。
アノテーションは、@Injection でできるらしい。
Springは、たしか、@Autowired だったかな?
@Controllerや@Getは、Springに近い動きをするので、なんとなくわかる。

package murakumo.controller;

import io.micronaut.http.annotation.Controller;
import io.micronaut.http.annotation.Get;
import murakumo.service.TestService;

import javax.inject.Inject;

@Controller("/hello")
public class HelloController {

    @Inject
    private TestService testService;

    @Get("/")
    public String index() {
        testService.printSampleTable();
        return "Goodmorning Saga!!";
    }
}

TestServiceをDIして、indexで使ってるだけ。

起動

./gradlew run で起動して、localhost:8080/helloにアクセス。

すると、ターミナルに、登録したデータが表示されるはず。

感想

なんでだ。。。
何に苦戦してたんだ、俺は。
すんなりできすぎて、逆に怖いんですけど。

あとは、spring-jdbcの知識がつけば、いろいろできそう。

組み込み系のDBは、もうsqlite一択な気がしてきたな。
mysqlやpostgressも考えたけど、環境準備するのが面倒くさいんだよね。
手軽に永続化できるのが、魅力だと思う。
docker使えば、mysqlとかの準備も楽そうな気もするが、dockerの習熟度がまだ足りない。

参考サイト

javaからsqliteに素早く書き込みたい - Qiita

Using Spring's JDBCTemplate with Micronaut

Spring Boot - Spring Boot MavenでSQLite3に接続したい。|teratail

データベースの作成と接続 - SQLite入門

java.lang.reflect.Proxyクラスを試してみる

きっかけ

JavaのAdvent Callendar で、Proxyクラスについて触れている記事があった。
そういえば、試したことが無かったので、暇な年始に試してみた。

実験

環境

java

$java -version
openjdk version "11.0.1" 2018-10-16
OpenJDK Runtime Environment 18.9 (build 11.0.1+13)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.1+13, mixed mode)

os

$sw_vers
ProductName:    Mac OS X
ProductVersion: 10.14.2
BuildVersion:   18C54

実装

今回、結構てこずった。。。。
何にてこずったかと言うと、必要となるクラスが思ったより多かったので、それの役割を理解するのが辛かった。。。
Javaのリフレクションの動きは分かっていたが、クラスが増えると、意外と混乱する。
あと、Javaから離れていたせいか、staticメソッドの制約を忘れていて、ドツボにハマった。。。

まずは、必要となるクラスの説明から

  • Main:実験用に呼び出すクラス
  • IFの定義(interface):今回のテスト対象のクラスのIF定義。なくてもいい気もするが、実装の隠蔽のためのプロキシなので、実際に使われる際の状況を意識するために用意
  • 呼び出すクラス:IF定義を実装したクラス。こいつを呼び出す。
  • Proxy:代理呼び出しの実装をするクラス。
  • Handler:呼び出すクラスとプロキシの間を中継するクラス。

では、実際に実装へ

IF定義

public interface Driveintori {
  public String getStoreName();
}

みんな大好き、ドラ鳥をテーマに実装していきます。
ドラ鳥ってなんだ?って思った人は、「ドライブイン鳥」、もしくは、「ゾンビランドサガ ドラ鳥」で検索してね。

呼び出すクラス

public class DriveintoriImpl implements Driveintori {
  @Override
  public String getStoreName() {
    return "ドライブイン鳥 伊万里店";
  }
}

伊万里店として実装。

Proxy & Handler

ここが一番重要。

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class DriveintoriProxy {
  private Driveintori store;
  private Object proxy;

  private DriveintoriProxy(Driveintori store) {
    this.store = store;
    this.proxy = Proxy.newProxyInstance(Driveintori.class.getClassLoader(), new Class[] { Driveintori.class },
        new DriveintoriHandler());
  }

  public static Driveintori createProxy(Driveintori store) {
    DriveintoriProxy dp = new DriveintoriProxy(store);
    return Driveintori.class.cast(dp.proxy);
  }

  /**
   * Proxyのメソッド呼び出しハンドラ.
   */
  private class DriveintoriHandler implements InvocationHandler {
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
      System.out.println("Let's go Doratori!!");
      Object o = method.invoke(store, args);
      System.out.println("comming agein Doratori!");
      Class type = method.getReturnType();
      return type.cast(o);
    }
  }
}

DriveintoriProxyのコンストラクタで、Proxy.newProxyInstanceしているのが実際のプロキシの生成処理。
一番厄介なのは、Objectで返すところ。
本当は、引数で指定したclassの型を返して欲しいのだが、何か理由があってこういう実装になったのだろうか?
汎用性を意識しすぎて、使いにくい気がしないでもない。 使う側としては、DroiveintoriのIF定義で返して欲しいので、createProxy内でキャストして返してる。

Handlerクラスというのは、DriveintoriHandlerが該当する。
実際に、生成したProxyクラスでメソッド呼び出しをすると、DriveintoriHandlerのinvokeを経由して、Driveintoriの実装クラスであるDriveintoriImplが呼び出される。

Mainクラス

public class Main {
  public static void main(String[] args) {
    System.out.println("start");
    Driveintori proxy = DriveintoriProxy.createProxy(new DriveintoriImpl());
    var name = proxy.getStoreName();
    System.out.println("name:" + name);
    System.out.println("end");
  }
}

各クラスを繋ぎ合わせて実験。

実行結果

実際に実行してみる。

start
Let's go Doratori!!
comming agein Doratori!
name:ドライブイン鳥 伊万里店
end

ドラ鳥の伊万里店が表示されました。

所感

やっぱり、クラス多くなるのがネック。
クラス図描いていかないと、実際の業務で利用するってなった時に、結構迷いそう。

気になったのは、実際にリフレクションするのと、Proxy使うのとで、アクセス時間に差がでるのかが気になった。

使われそうな箇所としては、ログ周りかなと思う。
あとは、DB接続とかの前処理・後処理が必要となる箇所。
切替が必要そうな箇所は、だいたい適用できるのではないかと思う。
ただ、本当に適用が必要なのかは、よくよく考える必要があるとは思うが。

参考サイト

Proxy (Java Platform SE 8)

java.lang.reflect.Proxyの使い方(1) - Qiita

Advent Calendar 2018 JavaScriptまとめ

JavaScript Advent Calendar 2018 - Qiita

JavaScript2 Advent Calendar 2018 - Qiita

感想・まとめ・メモ

12月1日

JavaScript

JavaScript Standard Styleのススメ - Qiita

JSって、そんなに厳格なルールなのか?

個人的には、文字列はダブルクォートじゃないと無理派。
もともとJava屋だったので、文字列は無意識にダブルクォートにしてしまう。

ESLintは、デファクトスタンダードなのかな?
現場でも使っていたけど、Prettierに移行した

JavaScript2

JavaScript で forEach を使うのは最終手段 - Qiita

俺も、foreachは、あんまり使わないな。
だいたいmapで済むことが多いし。
古い言語形態だと、for文が頻出するので、その考えから抜け出せないと、streamチックな考え方ができないのだろうって思う。
僕がそうでしたから。

forEach は戻り値を持たないので、意味のある処理を実現しようとすると副作用をもたせることが前提となり ↑の内容には、激しく同意。
別のところを変えたら、なぜかfor文でエラーが出たとか、ちょくちょくある。
改修コストがかさむ。
それが許可できるレベルなのか考えずに安易に使うのは、危険だと思うんだよね。
for文使う際は、よくよく考えるべきだ。

12月2日

JavaScript

ESLintとPrettierをどう扱うべきかの考察(2018年12月版) - Qiita

うちの現場は、prettier使ってるな。
問題ありそうな箇所は、レビューで落とす方針。

ESLintは、まだ使ったことないので、バグを生みやすいコードの癖を直しておきたい。

JavaScript2

switch文が実はもう少し使える子だった? - Qiita

う~ん。。。
Switch文を見ると発狂してしまうので、使う気には、やっぱりなれないかな。

12月3日

JavaScript

CoffeeScriptからJavaScriptに移行する - Qiita

CoffeeScriptを辞めた理由が気になる。

JavaScript2

JavaScriptの基礎知識【初心者向け】 - Qiita

変数宣言は、基本的にconstしか使ってない。
プログラミングしてると、大体はconstで事足りてしまう。

基礎知識いっぱい詰め込んであるな。。。
これ、教科書レベルや。。。
書くの大変だっただろうな。

12月4日

JavaScript

JavaScriptの概念たち (前編) - Qiita

そりゃ、使ってる言語がオワコンなんて言われたら悲しいよね。。。

かなり気合入ってる記事だな。
だいたい網羅されてるんじゃないかな?
教科書レベルでガッツリ書いてある。

JavaScript2

ファンタジー・ランドの保護地区をゆく Part 1 --- Functor · wshito's diary

Functorのメリットがよく分からなかった。
配列で良くない?って思ってしまう。

12月5日

JavaScript

簡単な Webpack plugin を作成して Webpack と仲良くなる (ビルド時情報を console.log に表示する)

webpackは現場で利用している。
プラグインは既存のもので十分なので、とくに自作はしてない。
簡単にできるようなら、冬休みの間に覚えてしまおうかな?

JavaScript2

👻globalThis👻と🌏global🌏と🌝this🌝 - Qiita

globalThisなんて初めて聞いた。
this以外にも、怪しげなのがあるんだな。。。

globalThisを使ったら、スパゲッティが出来上がりそうな気がするのだが、どうなるんですかね?
現状、Google Chromだけで使えるみたいだが、node.jsとかが追随しても、使いこなせる人が少ない気がするな。

12月6日

JavaScript

JavaScriptでスタイリッシュなCLIプロンプトを作成できるEnquirer - Crieit

Enquirerってライブラリ、かなりイケてるな。
状態操作系のコマンドは、これ使えるんじゃなかろうか?

JavaScript2

JestでプレーンJS/Vue.jsのTDDを行う - Qiita

今の現場の環境もJestだ。
前はKarma使ってたけど、新規プロジェクトやるときに、レポーティングツールが充実してたjestに乗り換えたんだっけな?

12月7日

JavaScript

WebpackによるDynamic Import(実践編) - Qiita

webpackにDynamic Importなんてものがあるのか。。。
動的にimport使いたいケースが思いつかないが、発生してしまったら相当やっかいなケースだと思う。
黒魔術っぽいイメージしか沸かない。。。
ブラック・マジシャン使いだった頃があるけど、IT分野で黒魔術は、マジ勘弁だわ。。。
なるべく発生しないように気をつけて設計せんといかんね。

JavaScript2

Javascriptの判定って、たまに厄介よね。

配列が空かどうかは、一瞬 if(!arr) とかでもできる気がしてしまうのが厄介。

やっぱり、numberじゃもたなくなってきているのか。。。
デカい数字を使ったりするのは、だいたいPythonに行ってしまっているような気がするな。

12月8日

JavaScript

技術ブログ: 30分でわかるJavaScriptプログラマのためのモナド入門

結局、モナドとは何?
30分で見るには、根気が必要ですな。。。

JavaScript2

Webpack は、他ブラウザ対応で現場で使った。
loaderは、たしか、何か使っていた気するが、何だったっけな?

loader作ろうと思ったことはなかったが、かなり厄介そうだな。。。
アロー関数使えないとか、知らなかったらハマっていただろう。

試しにloader一個作ってみようかな?

12月9日

JavaScript

Hexoテーマ作成のためのデータ構造概説 - Qiita

Hexoって何?って思ったら、markdown特化のブログみたいなもんか?
読みがよく分からん。
ヘクソ?
下品なんですが。。。屁とうんこを思い出しちゃいました。。。

どんなもんか、触ってみたい。

JavaScript2

JavaScript中級者向けHelloWorld - Qiita

いや、分からんがな。。。

どうやって作ったんだ?
ゴールから徐々に演算子を増やしていったのだろうか?

12月10日

JavaScript

演算子の実行順 - Qiita

読もうと思えば読めるけど、進んで読みたいとは思わないな。。。
演算子はいいんだけど、変数が何なのか分からないケースのほうが痛い。

JavaScript2

MSを偲び、ここにIE6対応SPAの作り方を記す - Qiita

うちの現場は、IE見捨ててるからな。
IE6は、鬼門だっていろんな人が言ってた。
俺が本格的にweb系をやり始めたのは、IE6から抜け出す過渡期だった気がする。

12月11日

JavaScript

JavaScript: f( array ) よりも f( [...array] ) がいいとき? - Qiita

そこまで深く考えたことはなかったな。
ここまでする必要があるのかは、若干疑問。

JavaScript2

PureScriptで関数型プログラミングに挑戦した - Qiita

AltJSって、結構乱立しているよね。。。
個人的には、TypeScriptがベストだと思っている。
どんなもんか調べてみたが、 {} がないのね。。。
Javaやってきた人間からすると、違和感を覚えてしまう。
Haskellにインスパイアされた言語っぽい。

12月12日

JavaScript

JavascriptでIoTをやる方法 - Qiita

IoTって言われると、ラズパイかArduinoしか思いつかなかったが、obinzなんてものもあるのか。
ネット越しの制御に特化しているのだろうか?

JavaScript2

Google ChartsをQuickにStartする - クモのようにコツコツと

Googleドキュメントって、マイクロソフトのofficeの正当進化だよね。
MSは、officeを進化しそこねた感がある。

全部を用意せず、データ処理をJSで、描画関連をGoogleスプレッドシートと棲み分けしている感じなのかな?

12月13日

JavaScript

WebUSBを使ってブラウザのJavaScriptからArduinoを制御してみよう! - Qiita

Arduinoは、web経由で操作するのは見かけるけど、USB経由か。。。
最近のweb系は、ハードウェア操作の機能が増えてきたな。。。
ハードウェア機器は、APIを提供することが重要性が増している。

JavaScript2

イマドキのnpmでは何を配布すべきか - Qiita

npmでの配布は、package.jsonがしっかりしていればOKくらいの認識。

12月14日

JavaScript

スプレッド演算子と分割代入 - Qiita

スプレッド演算子は、知らない人が見ると、全くわからないからな。。。
Javaから来たものだが、最初見たときは意味分からんかった。
今でも、「?」ってなる。

JavaScript2

JavaScriptでカレンダーを自作したら勉強になった - Qiita

12月15日

JavaScript

Gulpfileをナウく書きたい | Simple is Best

最近のgulpって、プレーンなJavaScriptっぽく書けるんだな。
ちょっと前のgulpを使っていたけど、なんか、むちゃくちゃネストが深くなりやすい印象がある。
あと、タスクが異常に増えるんだよね、gulp。
どうにかならんのかな?

JavaScript2

前世紀の圧縮ライブラリに畏怖した話 - Qiita

バイナリって、扱いが面倒なイメージ。
でも、高速化を考えたら、使わざるを得ない。
zlibは使ったことないから、試しに使ってみよう。

12月16日

JavaScript

「人間はJavaScriptにいずれ負ける」ことを実感するツールを作った - Qiita

玉の動きが最適化されてないのは、場所が分かってないからか。。。
勝負してる感はある。
ゲームのNPCって、スコアを叩き出して動かしているのだろうか?

JavaScript2

太古に3hで作ったシンプルゲームを眺めるの巻 - Qiita

やっぱり、JavaScriptにクラスの概念は必要なんだ。

12月17日

JavaScript

ES2019で追加される(かもな)最新機能ピックアップ - Qiita

BigIntとNumberの棲み分けはどうなるんだろう?

flatMap見てると、Javaのstreamを思い出す。
あれ、かなり苦戦して使った記憶がある。

JavaScript2

[JavaScript] パフォーマンス改善(その1) - Qiita

FireFoxchromeの速さは、流石だな。
Safariはどうなんだろうって思いました。

12月18日

JavaScript

関数型プログラミングの世界からやってきた Pipeline Operator - Qiita

関数言語のパラダイムは、やっぱり、まだ分からん。
来年は、関数言語の取得をしてみようかな?

JavaScript2

ユーザーが画面内のコンテンツを見たかどうかを判定する一歩上の仕組み、サービスでの活用事例 - Qiita

広告系のサービスを展開しているところは、入れたい機能だろうな。 Intersection Observer APIは、あとで試してみよう。

12月19日

JavaScript

AsyncIteratorとPromiseによるObservablePromise抽象 - falsandtruのメモ帳

ObservablePromiseって、聞いたことないな。
あとでちゃんと調べよう。

JavaScript2

ファンタジー・ランドの保護地区をゆく Part 2 --- Maybe モナド · wshito's diary

モナドの実装って、いろんなところで聞く。
あんまりモナドがよく分かってないのだが、ちゃんと調べないとイケないのかもな。

12月20日

JavaScript

JavaScriptの書き方をアップデート - Qiita

Spread syntax知ってるけど、毎回、調べることが多い。
最近、配列の要素を展開するだけなんだなって分かった。

JavaScript2

JavaScriptのプロパティ列挙の3原則 - Qiita

プロパティの列挙は、Object.keysを使う派。

12月21日

JavaScript

Babel 7 の主な変更点まとめ - Qiita

変化が早いな、JavaScript界隈は。
Babel6使い始めたと思ったら、もう7か。。。

webpack使ってると、必ずbabelもセットで使うことになるからな。
最近、ビルド周りや環境関連の作業が多くなってきた気がする。
yearly presetsを使っていたので、非推奨になったのは、驚きだった。

JavaScript2

document.hidden時のrequestAnimationFrameの挙動 - Qiita

requestAnimationFrameなんて使ったことなかった。
たぶん、ブラウザゲームは必要になるのかな?
ブラウザ毎に挙動が違うのは、もう、しょうがない。
次元が違うのだ。

12月22日

JavaScript

技術ブログ: JavaScriptプログラマのための2019年の機械学習と関数型プログラミング

python使ったほうがいいよってこと?
たしかに、JavaScriptだとパフォーマンスが出ないとは思うが。

JavaScript2

Web MIDI APIとWeb Audio APIを使って缶たたき音源をつくりました | TripArts Music

今どきのブラウザは、すごい。
ハードウェア操作系のライブラリが、使用策定されて、どんどん追加されて言っている。
そのうち、見境がなくなるんじゃないかと思う。

12月23日

JavaScript

特定のユーザーのQiita新規投稿を定時でチャットに流す - Qiita

サービス連携って、ワードだけ聞くと簡単そうなんだけど、実際にやるとツラい。
規約・制約の網の目を縫っていく根気強さが必要なんだろうなと見てて思った。

JavaScript2

「型」がないからJavaScriptはイケてないとかって言ってるヤツが本当にイケてない件 - Qiita

静的型付けも、たまに不便なときはある。
型の定義をしなければいけないのは、不便。
でも、そのおかげで規律のあるプログラミングが自然とできるのではないかとも思う。
JavaScriptは、静的型付けがないので、規律は、プログラマー任せな感覚がある。
静的型付けがないために、融通が利くプログラミングができるのは事実だと思う。
ハック的な実装は、JavaScriptの方がやりやすい。
命名回避は、結構、難しいとろこがあると思う。
組織で共通認識があればいいけど、そういうのは難しい。
個人的な認識だが、JavaScriptは、少数精鋭のチームだと力を発揮するイメージ。

12月24日

JavaScript

円と円の当たり判定を使った簡単なシューティング - Qiita

結局のところ、プログラミングって数学分かれば何でもできますよね。
原理がわからなくても、最悪、数式さえわかればいい。

JavaScript2

JavaScriptで画面に触れずにページをスクロール! - Qiita

手でやったほうが早いんじゃ?って思うけど、こういった箇所に情熱を注ぐのは、嫌いではない。

12月25日

JavaScript

Yearly Node.js 2018 - from scratch

llhttpってのに興味が湧いた。
話には、ついていくのがやっとくらいのレベル感に自分はいるんだなって思った。

JavaScript2

Slime と Swank-js でサクサク JavaScript 開発 · wshito's diary

Emacs使いではないのです。
eclipse che みたいなもんだろうか?
最近、オンラインで開発するような環境が整いつつあると感じている。

タスク

  • webpackのloaderを作る
  • webpackのプラグインを作る
  • ESLint使ってみる
  • zlibを使ってみる
  • Hexo使ってみる
  • ObservablePromiseを調べる
  • 関数言語を覚えてみる
  • Intersection Observer APIを試す
  • モナドを調べる

Advent Calendar 2018 Javaまとめ

感想・まとめ・メモ

12月1日

JEP 320の悪夢 – JDK 11は史上最悪のJDKかもしれない – My Note

後方互換が崩れたって意味で言っているのかな?
だとしたら、問題は、声を挙げなかった方な気がするのだが。。。

12月2日

ゼロから始めるJava生活 - Qiita

最近は、intellij起動することが多い。
JS使うことのほうが多いので、intellijよりもvscodeが更に多いかな。

Javaのプログラミングは、まずテキストエディタからってのは、どこも一緒か。。。
俺も、Javaを最初に習っていた頃は、tera pad 使ってプログラミングしてた記憶がある。

Effective Java とかは、書いて、いろんな問題にぶち当たるようになってから読むこと推奨。
いきなり読むと、変な勘違いが起きるか、本来、問題にぶち当たっていろいろ考えて知恵をだす機会をなくしてしまう気がするな。
きちんと問題にぶつかることの方が大事だと思う。

12月3日

Arrays.asList(T... a) は、なぜ add や remove ができないのか? - Qiita

そうだったのか。。。
Arrays.asList って、てっきり配列をリストのオブジェクトに変換してくれているとばかり思っていたが、ただラップしているだけか。。
それ聞いただけで、タイトルの意味が全部分かりましたわ。

12月4日

Doma2 でログ出力を制御する - Qiita

Domaって、結構柔軟にログの設定ができるのね。
ログ周りって、煩雑で覚えにくい印象が、どうしても拭えない。

12月5日

Retrofitの仕組みを知ろう - 絵描きエンジニアの日常

アノテーションの裏側って、やっぱり、黒魔術感が抜けないな。。。
もっと泥臭くやっている現場もある気がする。

一度、Proxy使ったサンプルを作って、アノテーションを提供できる能力を身につけないといけないかも。

12月6日

Asakusa Frameworkと次世代データ処理基盤技術 - ひしだまの変更履歴

バッチは、FWに頼るほどのことをしないから、FW不要ってところが多いのではなかろうか?
実際にやるのは、メール配信とかDB更新とかぐらいしかしたことがない気がする。
だから、行き着く先は、高速化・並列化ってのは、なんとなく予想ができる。

12月7日

AWS Lambda のカスタムランタイムにて Java のカスタムランタイムで関数を動かす - mike-neckのブログ

独自のランタイム作って、AWSで動かす話か。。。
そういえば、Javaのカスタムランタイムは、作ろうと思っていて間延びしていたな。。
話の内容自体は理解できる。
問題は、それが個人の力でできるかどうかだな。
冬休みに、Javaのカスタムランタイムを作るくらいのことはしたいな。

12月8日

クラウド関連の話か。。。
クラウド系の知識がまったくないから、ライブラリ関連の知識くらいしか追いつけなかったな。。。

Micronaut が気になった。
Springbootと似たようなもんで、現代技術でフルスクラッチで作ったから、起動が速いってのがいいなと思った。
冬休みに試してみようと思う。
Micronaut 調べるついでにSDKMANを知ったのもデカかったかな?
試すのは楽そう。

12月9日

いまふたたびのJDBC - Qiita

ずいぶんと懐かしいコード。
そういえば、うちの会社のJavaコードが、似たような感じだったな。

ただ、この原理原則を知っているのは重要。
ORマッパーの動きを理解するが早くなるから。
ベースの知識として、学び直してもいいかも知れない。

12月10日

絵で理解するリスト処理 - java8 stream / javaslang - - Qiita

javaのstreamは、完璧に覚えたので大丈夫。
reduceが怪しいくらい。
reduceって、なんでこんなに複雑になったんだろうか?
JavaScriptのreduceみたいなので良かった気がする。

12月11日

JavaでわかるJavaScript入門 - Qiita

JavaJavaScriptは、全然違う。
型の扱いもそうだが、個人的には、環境面が大きい気がする。
Node.jsとか、ある程度分かってないとダメだと思う。
JavaでNode.jsみたいなものはないから、Node.jsの概念や動きを掴むのに苦労した。

12月12日

肥満な物語でJavaのDIを解説する - Qiita

DIの最大のメリットは、テストの促進。
どこいってもこの結論を述べている人が多いので、この結論は正しいのだろう。

12月13日

概説 pom.xml – My Note

最近は、gradle使うことが多いかな?
Androidやるときにgradleだから、なるべくgradle使って、動きを覚えようとしているのが、現在。

maven使い始めた当初は、環境構築に利便性を感じていた。

12月14日

3分で分かった気になれるJDK12 - Qiita

Switch文は、もう使わないから、あんまり興味はなかった。
気になたのは、もう一方。
JEP326は、いいね。
Javaエスケープしたりするのは、かなり苦痛。
ちょっとしたプログラミングして、使いたいときに、固定でパスを埋め込もうとすると、かなりしんどくなる。
煩わしさが減るのは、welcomである。

そういえば、Java12は、3月だな。
そろそろ予習をしておこうかな?
ealy buildが提供されているのだろうか?
されているのなら、冬休み中に試す。

12月16日

「JJUG CCC 2018 Fall」に参加してきた。 - 怒Mは思いつきでモノを言う

俺は、声出すのが嫌だから、声出すような役割は回避行動してしまう。
盛り上げ役とか、死んでも嫌。
ボランティアは、あんまりやりたいとは感じないんだよね、悲しいことに。
声を出さなくていい仕事だったら、率先してやるのだが。

12月17日

JJUG CCC 2018 Fall で発表しました - Taste of Tech Topics

自動テストの基本的な内容をまとめた感じ。

12月18日

ツール比較しながら語るO/RマッパーとDBマイグレーション(JJUG-CCC 2018 Fall 登壇記)

テストデータ投入だったら、O/Rマッパーは、手軽なほうがいいと思う。

動的にSQL生成するORマッパーって、本番運用に向くものなのだろうか?
チューニングができないんじゃないか?って不安が払拭できない。

12月19日

Java 9で作成したJavaFXアプリケーションをOpenJDK 11+OpenJFX 11用にアップデートする - ひらおかゆみのなげやりブログ

そういえば、JavaFXは、Java8出た頃以降、触ってないな。

やっぱり、ネックはJava9のモジュール化か。
それ以降は、問題になることが少ないみたいだね。

12月20日

Jibを使用したCircleCI上でのテストフロー構築 - Qiita

とうとうdockerイメージを操作するまで来たか。
環境設定の簡略化が加速しそう。

早いうちにキャッチアップしときたい。

12月21日

段階的に理解する Java 例外処理 - Qiita

やっちゃいけないことの1つに、あと、例外情報を入れ忘れるってのがある。
補足した例外を、別の例外クラスでラップする際に、よく忘れがち。
例外情報が積まれてないと、どこで何が起こったのか、ログみる側は途方に暮れるんだよね。。。
ログ見る側をやってきたから、俺はもう忘れないと思うが、初めの頃は、結構忘れていたかも知れない。

12月22日

JFR APIを使ってメソッドの実行時間をタイムラインレポートにしてみる - Qiita

JFRって何だ?って思ったら、Java Flight Recorderの略か。
レポート機能は、一から作って出力したときの現物をみたら、やる気出るだろうな。

12月23日

Javaの新しいデプロイツールを作ってみた - Qiita

今どきは、dockerで作ったりもするのか。。。

12月24日

Java Advent Calendar 2018, Day 24 – My Note

Maven Centralへ登録したことはなかったが、やっぱり、署名が必要になるのか。。。
署名と聞くと、アレルギー反応が出るものです。
認証とかプロキシを作ったりしていると、アレルギー反対が加速する。

12月25日

【Java11】javacでコンパイルせずにJavaを実行してみた - Qiita

コンパイルせずに実行できるのは、すでに知ってた。
やっぱり、学生時代/新人研修のときのつらい経験を思い出す人が多いのね。

タスク

  • Micronaut 試す
  • Javaのカスタムランタイムを作る
  • Proxy つかったアノテーションサンプルを作る
  • Java12試す
  • JDBCドライバを復習(12/09)
  • jibを使ってみる

JJUG CCC 2018 Fall 参加報告

公式サイト

JJUG CCC 2018 Fall

参加セッション

  • JJUG基調講演】Javaの未来を考えよう
  • 【ランチセッション】俺が好きなのはJavaだけどJavaじゃない 〜虎の穴でのJava活用について〜(株式会社虎の穴)
  • Project Helidon: Java Libraries for Microservices(David Delabassee)
  • 複雑なドメインに泥臭く立ち向かう
  • (株式会社エスエムエス)
  • もう参照渡しとは言わせない - 2018 冬(武田豊史)
  • 普通のJavaエンジニアが、なぜ技術書を出版するに至ったか?(渡邉 一夫)
  • アンカンファレンス(16:45~17:30)
  • GCを発生させないJVMとコーディングスタイル(数村憲治)

感想・まとメモ

JJUG基調講演】Javaの未来を考えよう

コミュニティの活発さが、javaの生命線だな。
人がいなくなれば、自然と衰退するだろう。

無償は、AdoptOpenJDK AmazonCorretto。
Amazon公開しているんだ。。。
Amazonは、情報分野でも存在感が増している。

Javaチャンピオン増えたな。
いつの間に増えたんだ?

動的型付け言語もJVMで動くような方向になっているらしい。
プロジェクトメトロポリスってのが、気になった。
JVMJavaで実装するらしい。
実装するに至ったのは、C++で書かれているJVMがメンテしづらいから。

micronautが、結構話題にあがってた。
SpringBootをフルスクラッチで開発したようなものだから、実行が速いらしい。
試したが、IntelliJで謎のエラーが出るから、断念した。。。
viでいろいろいじればいいんだけど、僕はvimerじゃないんですよ。。。
サンプルは動かしたけど、違いはよく分からんな。
そういえば、ネイティブコンパイルで動かしたなかったが、それが原因かな?

デプロイ単位が短くなって、ウォームアップ時間を短縮しようという流れになっている。
それは、クラウド上で動かす際に、ウォームアップが長いと、パフォーマンスが出せないから。

【ランチセッション】俺が好きなのはJavaだけどJavaじゃない 〜虎の穴でのJava活用について〜(株式会社虎の穴)

内製化の動きが多いな。。。
思うんだけど、内製化が主流になってくると、IT業界の問題だった下請け構造は、減ると思うんだよね。
いい傾向ではあると同時に、それを見越して、経営方針を変えていかないとダメなんじゃないかなって思った。※下請け側の方が
大手のSIerは、どうするんだろうな?
たぶん、政府システムに従事するくらいしか仕事がなくなるんじゃなかろうか?

Javaを選んだ理由は、安定性・JVM・エンジニア数。
新規でやるなら、やっぱり安定性とエンジニア数は、省けないだろうな。

全員にmac支給か。。。
windowsは、使い慣れているけど、ちょっとしたバッチを書くのには向かないからな。。。
batファイルの実装とか、かなり面倒くさい。
VBAにしても、どうしても違和感がある。

Kotlinで連想するものは、のんのんびよりの宮内れんげだな。
どっちかと言うと、中の人つながりで思い出してしまう。
Kotlin → ことり → 小岩井ことり → 宮内れんげ

別なことりを思い出す人は、たぶん、ほどんどがラブライバーじゃなかろうか?

Project Helidon: Java Libraries for Microservices(David Delabassee)

nodeのexpressみたいなやつかな?
今expressを弄ってるから、記述がよく似てる。

すいません。。。
英語でも大丈夫だろうと思ってイキって出たのだが、ほとんど聞き取れませんでした。。。

複雑なドメインに泥臭く立ち向かう

保険制度、かなり複雑だな。。。

  • 複雑さは排除して、シンプルを目指す。
  • 複雑なものを複雑なまま受け取ると、考えを広められない。

どちらかというと、リスクヘッジ的な考えでシステム開発をしているらしい。
変化することを当たり前化して開発に取り組んでいるそうな。

  • カスタマーの人は、ゼロから覚えていっているので、仲良くしておいて損はない。

  • 課題管理は、思いついたらすくに登録

  • 考えるのを中断したことがわかるようにしておく
  • いいプログラマー→人間がわかるように書く
  • 実行するプログラムを作るのは、誰でもできる。 たまに、いるんだよな、書いて満足するやつが。
    あと、コメント全く書かないのが至高みたいな人も。
    リーダブルコードを読めと言いたくなる。

  • 人間が理解しやすい→間違いを見つけやすい

  • 付箋とホワイトボードの使い方

    • 書いて話す

ギャグ、ちょっと寒かったね。。。

情報のカテゴライズの問題なんだろうか?
企業文化によって変わりそうだな。
一貫性は、チームでの合意が重要なのだろうな。

  • モブプロをすることで、ソロプロするよりベストを尽くせる。
  • モブ史上主義は、相手を無意識に信頼してしまい、質・効率を落とすこともある。

  • ドキュメントの図=旅行の写真

  • 議論内容を思い出せることが大事

  • 判断がしにくかったり、やってみないとわからなかったいするので、やるなら短いサイクルでやる。

    • リスクが発覚しても、挽回しやすい
  • モデルを最初から完璧にしない。

  • 育てて完成させる

もう参照渡しとは言わせない - 2018 冬(武田豊史)

Javaは参照渡しもあるじゃないかな?
printf書くあたり、元々Cのプログラマーっぽいな。
Javaプログラマーで、printf利用している人は、ほぼいないと思う。

あぁ、俺は参照渡しの定義が違っていたのかな?
引数で渡されているのは、オブジェクトのポインタってことね。
だから、オブジェクトの参照渡しではない。
参照渡しと参照の値渡しがごっちゃになっているわけか。
学生時代にCやっていたが、ポインタのポインタ渡しとかでかなり悩んだ記憶。

他の言語もやってるから、ごっちゃになっているひとがいるのではなかろうか?
俺は、たぶん、Cやったときにごっちゃになった気がする。
他の大多数の人もそうなんじゃないかな?
一つの言語に習熟する前に、他の言語の考えが入ってきて、ごっちゃになったまま成長してしまうという感じだと思う。

普通のJavaエンジニアが、なぜ技術書を出版するに至ったか?(渡邉 一夫)

依頼が来て、いきなりかけるものではないのだな。

本を書く場合、ツテがないと、かなり厳しいんだな。。。
イベントで登壇して編集者に見つけてもらうのが重要そう。

補償金額率は、初めて聞いた。
部数が上がらないと、儲けるには厳しい業界だな。。。
アルバイト代金くらいが限度な気がする。
本を出すことで、お金が入ってくるようになるってことか。
ただ、多忙になってしまうと。

電子書籍だとどうなんだろう?

アンカンファレンス(16:45~17:30)

内容は、以下

  • 勉強方法
  • 会社の人をコミュニティに参加させる
  • 英語の習得
  • Javaチャンピオンになるには?

英語の習得

  • 環境に浸かるしかない。
  • 翻訳アプリは、会話のキャッチボールができない
  • 文法は気にしない。それでも意味は通じる。会話は、投げることが重要。だから、ボキャブラリーの量が大切

こりゃ、海外語訳されたアニメを見るしかないな。

思うんだけど、日本にいるのなら、英語話さなくてもよくない?
日本にいて、英語で喋りかけられたら、日本語しゃべれや!って言い返すけど。
だいたい、おかしいだろう。なぜ日本に来たのに、英語で話すのか?
少なくとも日本語でしゃべる努力をするべきだろう。
習得するのなら、目的がないと無理かもな。。。

会社の人をコミュニティに参加させる

別に来なくていいんじゃないかな?
差別化ができなくなるから、俺は行けとは死んでも言わない。 なぜなら、俺が他と差別化できなくなるから。

現状は、慢性的に継続してくる人がいないのね。
新しい人が毎回いる割に、参加者数が伸び悩んでいるのが、その証拠というわけか。

あれれ?
おっかしいな~。
一人で来ている人には優しくみたいな雰囲気だったけど、僕は毎回一人で来ているが、誰ともしゃべらないね。

たぶん、来ても何かするってのがないんじゃないかな?
俺は、ブログのネタをくれたり、知らないことを見つけるきっかけとして来るけど、継続しない人は、来ただけで終わってる気がする。
だから、行けというより、ブログ書けとか、アウトプットさせる習慣を作ればいいんじゃないかな?
そうすると、ネタを求めてイベントに来るようになるんじゃないかな?ってのが、個人的な考え。

Javaチャンピオンになるには?

政治力

GCを発生させないJVMとコーディングスタイル(数村憲治)

実はたいしたことない?
健康診断シンドローム

頑張って話についていこうと思ったが、途中で萎えてしまいました。。。