エンターテイメント!!

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

JavaからTypeScript、そしてJavaScriptへ…

書くに至ったきっかけ

最近、JavaScript書くようになって、Javaやってた頃より読めるようになったので、自分の中の考えを吐き出したくなったから

Javaエンジニアだったころ

JavaScriptは、触ってはいたが、本格的にイジったりはしてなかった。

何というか、なんで動いているのかよく分からなかった。。。
調べながら追えば分かったのだが、そうとう時間を使っていた気がする。

何というか、文法が分かりづらかった印象がある。

TypeScriptエンジニアだったころ

型を使っているので、Javaで学んだ古典的な方法が役立った。
デザインパターンとか、何をしたいのかが分かりやすかった。
Promiseとか、型がなかったら理解するのに相当かかったと思う。
JavaScriptのエンジニアって、どういうデータが渡ってくるのか、どうやって理解しているのだろうか?
まさか、覚えている?
僕は、脳のメモリが少ないので、無理そう。。。
3日前に書いたコードの内容すら覚えてられない。

前はネックだった文法が、簡単に分かり、node.jsを理解する時間に当てることができた。
俺が分からなかったのは、nodeもだったのかと、改めて分かったわ。。。

JavaScriptやるようになって

TypeScriptをやっていたときに、node.jsを学べたことが大きい。

JavaからJavaScriptに来てたらダメだったかも知れない。
Javaやってたときに分からなかったのは、たぶん、文法だけじゃなくて、nodeとかが絡んできていて、結局、何が分からなかったのかが明確になっていなかったら、手が付けられない状態だったんだろうな。。。

今なら、知識幅が広くなったから、問題には対処しやすくなってる。

得たこと

全般的な知識を得られれば、プログラミング言語は、思ったより簡単に習得できる。
問題は、全般的な知識をどうやって覚えるか。。。
全般的な知識がまとまった良書やサイトに出会うことが、大切なんじゃなかろうかと思う次第です。

あとは、今まで覚えた知識に近いところから始めるとかかな?
Java→TypeScript→JavaScriptって来たから良かったけど、JavaJavaScriptだったら、詰んだかも知れない。

実際に業務で使ってみるのも、習得への近道な気がする。

三項演算子について考え直した

きっかけ

現場でああだこうだ言っていたので、自分の考えをまとめる。

思うんだけど、現場の人間と挨拶以外に話さない日が多い気がするんだが、これは普通のことだよね?

前提

Java10

三項演算子

class Test {
  public static void main(String args[]) {
    int a = 0;
    int answer = a == 0 ? 10 : 11;

    System.out.println(answer);
  }
}

当然、出力は 10

if文で書くとどうなるか?

class Test {
  public static void main(String args[]) {
    int a = 0;
    int answer;
    if (a == 0) {
      answer = 10;
    } else {
      answer = 11;
    }

    System.out.println(answer);
  }
}

冗長記述になる。
answerがまどろっこしいくらいに出てくる。

三項演算子のメリット

  • 冗長性を回避できる
  • 記述量を削減できる

三項演算子のデメリット

メリットあれば、当然デメリットもある。

複数項

三項で済めばいいけど、四項・五項になってくると、意味がわからなくなる。

class Test {
  public static void main(String args[]) {
    int a = 0;
    int answer = a == 1 ? 10 : a == 0 ? 11 : 12;

    System.out.println(answer);
  }
}

answerには 11 が設定されるのだが、 条件が複数になった時点で、人間の処理能力を越えると思う。

演算子の優先順位

class Test {
  public static void main(String args[]) {
    int a = 0;
    int answer = a++ == 1 ? 10 : a == 0 ? 11 : 12;

    System.out.println(answer);
  }
}

これは、 12 が正解だが、パット見、10と答えたくもなる。
三項演算子は、演算子が連続して記述される可能性が高くなるため、なるべく演算子を途中で利用するのは避けるべき

三項演算子でやっちゃいけないこと

  • 項が複数に成らないようにする
  • 演算子を混ぜない

上記のどれかに合致してしまう場合、使わない方がいい。

あと、下記の理由で使うのも辞めるべき

  • ワンライナーで書きたい。
  • 俺、頭いいでしょって見せびらかしたい。
  • 記述量を減らしたい

本来は、簡素な記述で分かりやすくあるべきもの。
本来の意図を見失って、自己陶酔に走ったりするのは、ナンセンス。
たまにワンライナー至上主義みたいなエンジニアがいるが、個人的な見解を言うと、頭おかしい人だから、あんまり真に受けないほうがいい。
ワンライナーで書いても問題ないところは、書くこと推奨だが、他者の理解を著しく妨げるものは、辞めたほうがいい。

三項演算子を使うべきパターン

class Test {
  public static void main(String args[]) {
    System.out.println(Test.isNegativeNumber(-1));
  }

  static String isNegativeNumber(int target) {
    return target < 0 ? "yes. it's negative!" : "no!";
  }
}

2パターンにしか成らない返り値の場合とかが最有力だと思う。
それ以外は、使用を控えるべき。
目的に沿って使うことが重要。
複数個を返す可能性があったりするものは、if文でやるほうが無難だと思う。

ちなみに、negativeってワードを選んだのには、他意はない。
整数だとintegerで紛らわしいから。だったらpositiveでいいじゃんってのは、作ったあとに思った。

気をつけること

ワンライナー教は、マジで厄介。
レビューで指摘すると反発してくることがよくある。
だけど、可読性を著しく下げるものは、許容できないので、根気強く説得するしかない。

簿記の勉強を始めて。。。

最近、簿記3級の勉強を実施して、問題集をやり始めたのだが、問題文に怒りを感じる。

すごく気を使って読まないと、引っ掛け問題に引っかかる。
それが、どうしても納得いかない。

例えば、

以下の取引について仕訳しない。

・・・・

先週末に賭けで仕入れた商品50個(@¥6,000)のうち、本日、5分の1を返品し、代金は掛け代金から控除した。

普通に読んだら、先週末からの仕訳だと思うのだが、本日分の仕訳だけ書くのが正解らしい。
もっと分りやすい問題文は書けないのか?と、ものすごい憤りを感じる。
本日分の仕訳をしろと明記がなければ、普通に、先週末からすると思うのだが、違うのだろうか?

問題集を読んでいると、ものすごくストレスが溜まる。
これを読んで試験を受けているのだから、簿記3級合格者って、ストレスへの耐性が強そう。

2018/11/05週 気づきと振り返り

業務こなして思ったこと

順次実行はPromise

JavaScriptやるようになって半年。Typescript含めれば、1年。
順次実行したいものを実装したい場合は、自前でキューみたいなものを用意するより、Promiseで処理を積んだ方が、簡単に実装できる。

git log --decorate

ログ内容にHEAD、ブランチ名、タグ情報が付与される。

タグ付けしたさいの確認は、これを使ったほうがいい。

gitで未プッシュの差分を見る

git log origin/{ブランチ名}..{ブランチ名}

プッシュしたか分からないときに使う。 sourcetree使えばいいと、最初のときは思っていたが、細かいことをしたいってなると、コマンド打つしかなくなる。

だから、CLIには、なれたほうがいい。

今は、どっちも使っている。
ステージに上げるのは、差分見ながらやれるsourcetreeの方が良い。
CLIだと、何がなんだか分かりにくいんだよね。。。
差分をもっと簡単に表示させる方法はないのだろうか?
上下に出てると分からないから、左右で見比べられるようにできないだろうか?

個人的に思いついた名言

責任は果たすものじゃない。なすりつけるものだ。

汚い大人の社会は、だいたいこうです。
大手のSIerは、この考えで動く人が多い。

人の名前よりポケモンの名前を覚えるほうが楽。

現場の人間の名前は、ほとんど覚えてない。
仕事上、関係なければ覚える必要ないと思うんだよね。

2018/10/29週 気づきと振り返り

Chromeのコンソールログ

Devtoolの設定で、Presrvelogにチェックを入れると、画面遷移が起こってもコンソールログの内容がクリアされない。

複数画面をまたぐ場合のデバックに有効

Windowsのスクリーンセイバーのバブル

現場のPCは、windows8.1で、スクリーンセイバーにバブルを設定している。

極稀に、バブルがものすごい勢いで動くことがある。
これは、ラッキーな現象なのだろうか?
それとも、バグ??

キーボード

C, N, M, > がすり減って文字が見えなくなってる。

特に > が見えないのは辛い。
文字は、普段ブラインドタッチしているから問題ないんだけど、記号は、場所を覚えてないのよ。。。
毎回 < か ? と打ち間違える。

たぶん、これらのキーが減ったのは、JavaScriptやってるせい。
Cは、コピーだろうな。
M/Nは、なんでだろう?

は、アロー関数使うからだと思う。

GerritのUI

現場のGerritのバージョンがあがった。
UIが、大幅に変わってる。
慣れるまで時間がかかったが、前よりは使いやすくなった。

Gerrit使ってて思うんだけど、 +1/+2の概念の違いが分からない。
+1を複数押せば、+2になるんじゃねぇーのかよ!って毎回ツッコみたくなる。

2018/10/22週 気づきと振り返り

OAuth2.0

認証機能を作っているのだが、全く動きが覚えられない。
毎回言われるがままにやってきたことのツケが来た感。
動きが全く覚えられないのだが、どうやって覚えればいいのか?
しかも、リクエスト/レスポンスで使っている値が、それぞれどういう意味を持つのかもサッパリ。
分かりやすく説明しているサイトないかな?

体臭

会社で別の案件に参加している人の話を聞いたのだが、体臭がキツイやつがいたそうな。
臭いが原因で、切られる直前までいったらしい。

臭いがキツイのなら、電車はどうやって使ってるんだろうって感じた。
周囲は誰もよってこないのかな?

俺も、臭いには気をつけよう。。。

ネットワークスペシャリストの試験

やっと試験が終わった。
取り敢えず、午前Ⅱまで突破していることを確認できた。
午前問題は、たまに新規の問題が入ってくるからビビる。

問題は午後問題だな。。。
最初のフォワード/リダイレクトプロキシを順番逆にしたような気がする。。。
そろそろネットワークスペシャリストには合格して、次のステップに進みたい。

直近の目標は、簿記3級の合格。

睡眠

だいぶ寒くなって来たので、暖かくして寝るようにしたら、物凄い寝付きが良くなった。
体温を上げるのは、睡眠に有効なのかも知れない。

最近寝るときは、水中に浮かぶことをイメージして寝ると寝やすいということに気づいた。
他の人は、眠る際には何を考えているんだろうか?

その他

無双OROCHI3にハマってたけど、もうやり尽くした感がある。
というか、オーディン強すぎだろう。
時を止めるのは、アクション系だとチートだと思う。
逆に、呂布は使いづらい。
技の出が遅いし、通常神術が当てづらい。

JJUGナイトセミナー「JDK 11リリース記念:今知っておくべきJDK 11の重要ポイント 参加報告

公式サイト

【東京】JJUGナイトセミナー「JDK 11リリース記念:今知っておくべきJDK 11の重要ポイント」 - 日本Javaユーザーグループ/Japan Java User Group | Doorkeeper

まとめ・メモ

OracleJDK

  • ソース&バイナリをオラクルが提供
  • 用途によって有償

OpenJDK

- 無償

参考サイト

JDK 11リリース記念:今知っておくべきJDK 11の重要ポイントの個人メモ

JavaFX

同梱されなくなっただけ。
開発はされている。

JEP 330

JEP 330: Launch Single-File Source-Code Programs

javaコマンドだけでJavaファイルを実行可能。

制約

  • 1ファイルで完結している必要がある。
  • トップレベルクラスがmainを持っている必要がある。

仕組み

SourceLancherが起動してコンパイル実行している。

JEP 328

JEP 328: Flight Recorder

プロファイラ。情報収集を行うだけで、可視化は別途用意する必要がある。

JEP 181

JEP 181: Nest-Based Access Control

コンパイルされたときに、余計なクラスがなくなる。

JEP 320

JEP 320: Remove the Java EE and CORBA Modules

JavaEE/CORBAが削除された。

JEP 321

JEP 321: HTTP Client (Standard)

HTTPクライアントの実装。
HTTP2, Reactiveに対応。

sendAsync→非同期
send→同期

API追加

Null I/O

linux/dev/null と同じような動きをする。
何もしないクラス。

Rredicate.not

今までのラムダで書けなかった、条件の反転ができる。

感想

JEP 330のやつは、てっきりコンパイル&実行を勝手にしてくれているのだと思ったら、1個間に挟んでいるのか。。。
意外と制約が多かった。
普通に使うには気にならないと思うが。

Null I/Oは、テストで使うのかな?
それ以外の用途が全然分からない。