SpringBootのJarのサイズをめっちゃ小さくする!

SpringBootのJarのサイズを小さくするといえば、ぼぼさんのこれがあたまおかしくて有名ですが

qiita.com

今回はこういうのを作ってみました。

github.com

## demo-fat

の方は普通のSpringBootアプリです。

❯ cd demo-fat
❯ ./mvnw clean package
❯ ls -ahl target/demo-fat-0.0.1-SNAPSHOT.jar
-rw-rw-r — 1 bufferings bufferings 16M Sep 30 22:16 target/demo-fat-0.0.1-SNAPSHOT.jar

16MBあります。Fatですねぇ。もちろん普通に起動できます。

❯ java -jar target/demo-fat-0.0.1-SNAPSHOT.jar
…
2018–09–30 22:29:04.617 INFO 32639 — — [ main] com.example.demo.DemoApplication : Started DemoApplication in 3.852 seconds (JVM running for 4.464)
…

## demo-thin

こっちもアプリのソースはdemo-fatと同じです。だけど・・・

❯ cd demo-thin
❯ ./mvnw clean package
❯ ls -ahl target/demo-thin-0.0.1-SNAPSHOT.jar
-rw-rw-r — 1 bufferings bufferings 11K Sep 30 22:24 target/demo-thin-0.0.1-SNAPSHOT.jar

11KBです!(∩´∀`)∩ワーイ!チイサイー!!

もちろん起動できます。

❯ java -jar target/demo-thin-0.0.1-SNAPSHOT.jar
…
2018–09–30 22:30:51.689 INFO 1303 — — [ main] com.example.demo.DemoApplication : Started DemoApplication in 3.012 seconds (JVM running for 4.987)
…

起動時間もあんまり変わりません!種明かしは次回!おやすみなさい!

2018-10-02 追記

書いた

bufferings.hatenablog.com

CakePHP3のチュートリアルの前半から学んだこと

## CakePHP3のチュートリアル

チュートリアルと例 - 3.6

コードを書き写して動かしてみて面白かった。全然コード書いてないのに色々動いててびびる。

f:id:bufferings:20180923173633p:plain

## コード

github.com

docker-composeにmysqlの設定と初期化SQLを入れといたから、たぶん、docker-compose upしてcomposer installしてlocalhost:8000にアクセスしたら動くんちゃうかな。

以下、学んだことのメモ。

## Articlesまわり

### Model

Modelの中にTableとEntityがあって、役割の違いは何だろう?と思ったら、こういうことみたい。

  • Table: DBのテーブルにアクセスするためのもの
  • Entity: DBのレコードを表すもの

### ArticlesTable

### (Entity) Article

### ArticlesController

  • AppControllerを継承
  • loadComponentでロードしたコンポーネント$this->Paginatorみたいにして利用できるようになるみたい
  • Tableクラスには$this->Articles->find()みたいにアクセスしてるけど、デフォルトでArticles(Table)と紐付けられてるってことなんだろうな
  • $this->set()でViewにデータを渡してる
  • compact()は何だろう?と思って見てみた。なるほどー。

### (Template) index.ctp

  • テンプレートファイルは、名前の規約でコントローラーのクラス名とメソッド名から引っ張ってくる
  • slugってどういう意味なんだろう?と思って見てみた。なるほどー。

### ArticlesControllerのviewアクション

## 前半のメモはこれくらい

感想は

  • 規約
    • 規約に従ってやってたら色々裏側でいい感じにしてくれるので便利
    • なんだけど、裏側で何をしてるのかを把握しとかなきゃ想定外の穴があきそうで怖い
  • PhpStorm
    • 思ったよりサクサク書ける。Javaほどじゃないけど
    • 名前の規約を元にジャンプできるプラグインがあるといいなぁ
    • PHPCSとPHPMDの設定はちょっと考えたほうが良さそう。不要なのが出る
  • ドキュメント
    • を読むためのとっかかりのインデックスが自分の中にできてきたので良かった

後半は、また気が向いたら書こう。

## (おまけ)IDEAのショートカット

コピペじゃなくて実際に見ながら書いてた理由は、PhpStormで書く感触を知りたかったからで。1個覚えた。

  • 「あとは分かるやろ」って思ったときにCtrl + Shift + Enterを叩くといい感じにしてくれる

あとは、IdeaVimを入れてできるだけ矢印キーを使わずに頑張ってみた。まだ慣れない。

deleの最終回を見てて気になったコードが面白かった

ってつぶやいたら、みんなから「goだよ」って教えてもらったので。

へー。goかー。とか思いながら、とりあえず書き写してみてたんだけど、途中で見つけた。これか。

https://github.com/jgamblin/Mirai-Source-Code/blob/9779d439643b3f4ee5b0fad948927d74274436de/mirai/cnc/attack.go#L197-L208

これ、何のコードなんだろう?と思ったらMiraiボットネットってやつのコードだった。

www.atmarkit.co.jp

へー。面白いなー。続編あるといいなー。

パーフェクトPHPの「Part2 PHPの言語仕様」が楽しかった

パーフェクトPHPを読んでる。好きな感じ。やんくさん教えてくれてありがとう。

books.rakuten.co.jp

2010年12月に初版だからPHP5.3の頃なのかな。読み終わったあとは、PHPのその後の変更を追いかけとこう。

## Part2 PHPの言語仕様

とりあえず、今日までで「Part2 PHPの言語仕様」を読んだのでメモ。ポイントは

  • 普段はJavaエンジニアなのでJavaとの違いで把握
  • 隅っこの機能は興味なくて普通に使う機能だけでいい
  • IntelliJが教えてくれるだろうことはあんまり気にしない
  • フレームワークの動きを把握したい気持ちもあるので、これは使われてそうかもーってのは名前を覚えておきたい

## 2.2 変数

可変変数面白いな。アプリケーションのコードではあんまり出会いたくない気はするけど。

php > $var = 111;
php > $var_name = 'var';
php > echo $$var_name;
111
php > 

んで

globalキーワードとか、$GLOBALSにはあんまり関わらずにすごせたら嬉しいな。

## 2.3 定数

define関数とconstキーワードがあるのか。

php > define('SAMPLE', 'foobar');
php > echo SAMPLE;
foobar
php > const SAMPLE2 = 'barfoo';
php > echo SAMPLE2;
barfoo
  • 昔からのやつはdefineで定義してあって
  • 今だとネームスペース使いつつconstキーワード

なのかな。

文字列から定数を取得するにはconstants()が使えるって書いてるからやってみたら

php > $myconst = 'SAMPLE2';
php > echo constants($myconst);
PHP Warning:  Uncaught Error: Call to undefined function constants() in php shell code:1
Stack trace:
#0 {main}
  thrown in php shell code on line 1

Warning: Uncaught Error: Call to undefined function constants() in php shell code:1
Stack trace:
#0 {main}
  thrown in php shell code on line 1

php > echo constant($myconst);
barfoo

constant()やないか。最後のsいらん。ちゃんと手を動かしてるかを試されてるw

PHP: constant - Manual

それから

  • 定義済み定数と
  • マジック定数がある

定義済み定数はget_defined_constants()で確認できる。マジック定数はログ出すときに便利そう。

## 2.4 エラー

元々はエラーしかなくて、後から例外が追加されたんやね。

ということは

  • 昔からあるような関数はエラーを使ってて
  • 最近のフレームワークとかアプリケーションは例外を使ってるのかな

php.iniで

  • どのエラーをレポートするか
  • エラーを画面に表示するか
  • エラーをログに出力するか、そのログファイルのパス

を指定できる。本番では画面には出さずにログにだけ出すんよ。って感じだな。

## 3.1.2 整数

へー。整数はlongとかなくてintだけなのか。で、最大値に1足すとfloatになるの面白い。

php > echo PHP_VERSION;
7.2.9
php > echo PHP_INT_MAX;
9223372036854775807
php > var_dump(PHP_INT_MAX);
php shell code:1:
int(9223372036854775807)
php > var_dump(PHP_INT_MAX + 1);
php shell code:1:
double(9.2233720368548E+18)

## 3.1.3 浮動小数

こっちも、floatとdoubleとかなくて、floatだけ。だけど、実際にはdouble。か。

## 3.1.4 文字列

変数名の区切りが必要なときは括弧でくくる。

php > $age = 14;
php > echo "$ageyears old.";
 old.
php > echo "${age}years old.";
14years old.

そういえばこの前読んだ本は内側にダラーマークがあったなーと思って叩いてみたら動いた。どっちでもいいのか。

php > echo "{$age}years old.";
14years old.

外側にダラーマークがある方が好きだな。

2018-09-17 追記 Toyさんありがとうございます!

## 3.1.5 論理型

全体的にPHPのキャストには気をつけた方が良い雰囲気ある。

## 3.1.9 null

  • 変数が未定義
  • 変数が定義されてるけどnullが入ってる

の状態があるのかー。むむー。最初のうちは混乱しそう。

## 3.2 演算子

  • 文字列の連結はドット
  • 論理演算子は短絡評価される
  • 比較演算子===!==は安心。けどそれ以外はキャスト考慮つらそう。それとswitchも気をつけておいた方が良いのかな
  • Groovyでいうところのエルビス演算子がある
  • 演算子の優先順位に注意。テストを書くのと、括弧を書くのが良さそう
  • エラー制御演算子は自分では使わんやろな。どっかで使ってるのは見かけてしまうのかも
  • 実行演算子はあんまり見たくないなー
php > echo `ps`;
  PID TTY          TIME CMD
    1 pts/0    00:00:00 php
   20 pts/0    00:00:00 sh
   21 pts/0    00:00:00 ps

## 3.3 配列

  • 添字配列と連想配列のどっちも「配列」なのかー。で、順序が保証されてる
  • 複数の型が入り混じるような配列も作れるのか・・・やらんで欲しいな
  • キーを持たない要素と、キーを持つ要素を混ぜて定義することも可能です・・・か。やらんで欲しいな
  • 多次元配列も、あんまり使わない方が好きだな
  • 配列の演算か。結合の演算子は使うもんなのかなぁ?
php > $a = array(1,2,3);
php > $b = array(4,5,6);
php > $c = $a + $b;
php > $d = array_merge($a, $b);
php > print_r($a);
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
)
php > print_r($b);
Array
(
    [0] => 4
    [1] => 5
    [2] => 6
)
php > print_r($c);
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
)
php > print_r($d);
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
    [5] => 6
)

ほほー。そういう動作かー。・・・使うときは雰囲気でやらずに、ちゃんとドキュメント読んだり細かくユニットテスト書いたりしようと思った。

## 4.1 制御構造

  • elseifはelseとifが繋がってる
  • コロンとendxxxでブロックを表現することもできる。のは見かけるとしてもテンプレートくらいなのかな
  • require/require_onceとinclude/include_onceがある。でもCakePHPが良い感じにやってくれてそう
  • gotoはできれば会いたくない

## 4.2 関数

  • 引数にデフォルト値を与えることができる。定数値のみ。デフォルト値をもたない引数より後に定義する
  • タイプヒンティングある。特定のクラスか配列に限定可能
  • 可変関数もあるのかー。面白い
php > $var = 'sss';
php > echo $var;
sss
php > function sss() 
php > {
php { echo 'sss!!!';
php { }
php > $var();
sss!!!
  • call_user_func()call_user_func_array()は可変関数より高度な関数呼び出しができる
  • コールバック関数は文字列で渡すのか。へー。メソッド参照みたいなのはないのかな?
  • 参照による引数と返り値・・・。ライブラリーとかでは使うかもだけど、アプリケーションではたぶん使わないだろうな
  • 無名関数は使うと思う
  • クロージャ。んー。なんか色々広がりそうだけど、僕にはムズいな。でてきたら勉強しよっと
php > $my_pow = function($times) {
php { return function($v) use (&$times) { return pow($v, $times); };
php { };
php > $cube = $my_pow(3);
php > echo $cube(2);
8
  • get_defined_functions()で定義済みの関数が一覧できる。自分で定義したやつも含めて
php > print_r(get_defined_functions());                                                                                                                                                                
Array                                                                                                                                                                                                  
(                                                                                                                                                                                                      
    [internal] => Array                                                                                                                                                                                
        (                                                                                                                                                                                              
            [0] => zend_version                                                                                                                                                                        
            [1] => func_num_args                                                                                                                                                                       
            [2] => func_get_arg                                                                                                                                                                        
            [3] => func_get_args  

            (中略...)

            [1400] => cli_set_process_title
            [1401] => cli_get_process_title
        )

    [user] => Array
        (
            [0] => bar
            [1] => bar2
            [2] => bar3
            [3] => sss
        )

)
php >

## 5.1 クラス

  • ネームスペースがなかった時代は、モジュール名などをアンダースコア区切りで前につけてた
  • メソッドの呼び出しはアロー演算子
  • インスタンスを複製したい場合はcloneキーワードを使用する。んー。でもこれ、どこまで複製されるんか気になるな。使うときはちゃんと見とくか
$suzuki = clone $yamada;
  • クラス定義時に宣言していないプロパティへの読み書きも可能。へー
  • $thisはプロパティやメソッドにアクセスするときには常に使うっぽい。Javaと違うとこだな
  • staticある。メソッドも、プロパティも
  • finalはメソッドだけなんかな。プロパティの方には書いてないや
  • selfはstatic用の$thisっぽいな
  • コンストラクター__construct。古いやつだとクラス名と同じ名前がコンストラクターになってるみたい
  • デストラクターもあるけど、そっちは使わんやろな
  • 継承ある。多重継承はなし
  • 抽象クラスある

## 5.2 インターフェイス

## 5.3 クラスとオブジェクトの機能と特徴

  • マジックメソッド
    • オブジェクトに対する特定の操作に対するフック
    • アクセス不能なプロパティやメソッドが参照されたときの動きをオーバーロードすることが可能
    • CakePHPとかのフレームワークではいっぱい使われてそうだな
  • 遅延静的束縛
    • 名前がなんか必殺技みたいでかっこいい
    • 便利だけど使われてたらちょっと混乱しそうだな。僕が
  • オートロード

## 5.4 名前空間

  • バックスラッシュ区切り
  • 名前空間を定義したら、グローバルな関数やクラスは戦闘にバックスラッシュをつける(例:\Exception)
  • クラス、関数、constで定義した定数、が影響を受ける
  • 変数、defineで定義した定数、には適用されない
  • 1つのファイルに複数の名前空間を定義する。・・・んー。僕はしないと思う
  • インポートはuseで。名前空間まででも、クラス名まででもOK
  • asを使うと別名をつけられる

## 5.5 例外

  • Javaに似てる。Exceptionをthrowしてtry catchで捕まえる
  • フレームワークがエラーハンドラーでErrorExceptionを投げるようにしてないか気をつけて見とこうかな

## 5.6 参照

  • 参照は便利だけどアプリケーションを作るときにはあんまり使わないだろうなー
  • 循環参照をGCする機能はPHP5.3から入ったのか。それまでは大変だっただろうなー
  • コピーオンライトの動きはPHP7で変わったんだっけ

## メモ

  • 配列のマージをするときはちゃんと動作を確認する
  • クロージャ使うときは勉強する
  • clone使うときはちゃんと調べる

## 面白かったー!!

次は「Part 3 実践Webアプリケーション」だな。

ほどくながすもどす

ほどく

なんだか色んなモノがからまりあってこんがらがってるときは、それをひとつずつほどいてみる。これは、理想とのギャップ。これは、過去のしがらみから。これは、単に僕があの人のことを嫌いだから。これは、政治。これは、うーん、僕の自分をよく見せたいっていう見栄だな。とか。

ながす

そんな風にしてほどいたら、今、目の前の一歩を踏み出すために必要な部分を残して、他は、ながしてしまう。だいたいは、僕がうっすら気づいてはいたけど、向き合いたくないなぁって目を逸らしてたものだけが残って、あーやっぱりお前たちか。はいはい、ちゃんとやります。

もどす

ちゃんとやるから、ちょっとくらい自分のためのワガママもいっかな。ってながれてるやつから1個取ってもどしてみてから、はじめるのだった。

同期するのに時間がかかっちゃうなぁって感じ。

開発チームのリーダーから「なんか最近スピードがでないー」って相談されるときがあって。そんなときは、スケジュール表を見せてもらって「これ、並行して進めずにチームで1本にしてみたら良いよ」って話をしたりする。

効率良くしようとして個人個人に別々の案件をアサインして並行で進めたくなるんだけど、結局色んなものを同期するのに時間がかかっちゃうなぁって感じ。色々書こうとしたけどまとまんなかったや。

ほんのちょっとEnvoyに触れてみた

折角今週東京だからなーと思って申し込んだんだけど、開始時間の直前まで補欠だったから無理かなーって思ってたら、最後の最後で繰り上がったので急いで行ってきた。面白かった!

cloudnative.connpass.com

## なので、ほんのちょっとEnvoyに触れてみた。

www.envoyproxy.io

## Getting Started

Getting Started — envoy 1.8.0-dev-a3c744 documentation

に書いてある通りに

$ docker pull envoyproxy/envoy:latest
$ docker run --rm -d -p 10000:10000 envoyproxy/envoy:latest
$ curl -v localhost:10000

で、Googleが開くぞー(∩´∀`)∩ワーイ

ってなって。

## envoy.yaml

その下に

FROM envoyproxy/envoy:latest
COPY envoy.yaml /etc/envoy/envoy.yaml

こう書いてるから、/etc/envoy/envoy.yamlを見てみるかー。ってexecで入ってみてみたら、こんな感じになってた。ドキュメントに書いてあるのとちょこっとだけ違うなぁと思いつつ。

gist.github.com

## docker compose

じゃあ、これをこうやって

version: '3'
services:
  envoy:
    image: envoyproxy/envoy:latest
    ports:
      - "10000:10000"
    volumes:
      - "./envoy.yaml:/etc/envoy/envoy.yaml"

起動して

$ docker-compose up

Googleにつながったー(∩´∀`)∩ワーイ

## Yahoo

からのgoogle.comyahoo.co.jpにしてみて

f:id:bufferings:20180912084553p:plain

起動し直したら

f:id:bufferings:20180912084641p:plain

Yahooにつながったー(∩´∀`)∩ワーイ

※この変更が正しいかどうはかまだ知りません!雰囲気で触っただけなので。