エンターテイメント!!

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

【翻訳・要約】Javascript vs Typescript

参考サイト

dev.to

経緯

typescriptよく使っているので、改めて違いを把握しておきたく読んだ

内容の超要約

  • JavaScriptとは?

  • Typescriptとは?

    • すべてのJavaScriptライブラリおよびフレームワークと互換性あり
    • コードの複雑さが増すにつれて、JavaScriptOOP要件を満たす必要があり、それを書いけするためにTypescriptが開発された
    • コード開発の高速化に役立つ

個人的見解

Typescriptのメリットは、前述してあるとおり、OOPの概念を理解していれば、使いやすい点。
Java触ってたら、学習コストは、幾分か少なくなる。

ただ、パフォーマンス解析するときは、Typescriptだと苦労した経験がある。

あと、互換性があるというが、全部互換があるわけではない。
一部、有名なFWでも、メンテがされてないと、クラス定義ファイルがなくて苦労するケースがあった記憶がある。

ただ、開発が早くなるのは、実感としてある。
クラス定義ファイルをちゃんと作りながら開発すること前提ではあるが、

2022/04/11週 気づきと振り返り JSPで発狂しそう

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

Java

共通部品は利用者の想定を裏切らないようにする

なんか、名前から連想する期待値と結果が違うと、すごく萎える。。。

名前は、最小限の範囲になるようにネーミングしておいてほしいと感じる。

JSPのエラーは分かりづらい

JSPで画面出力しているのだが、html生成でヌルポ発生しているのは分かったのだが、原因が全くわからない事象によく遭遇する。。。
それが発生するのは、カスタムタグであることが多い。
俺の技術力が足りないのか?と思ってしまうが、大抵、ちゃんとエラーハンドリングしてないカスタムタグ作成者が悪いと思うんだよね。

最終的に、コード見直して原因分かったけど、カスタムタグでの例外は、トレーサビリティが低いのでtry-catchで全例外をラッピングするようにして欲しいと思いました

SpringBootで定期処理の実装

経緯

RSSリーダーを作ったのだが、フィードの更新が手動なので、自動更新にしたく、いろいろ調べた

実装

@Scheduled で指定できる。

自分は、cronで1時間毎に起動したかったので、下記の通りに実装
コードに下手書きは、流石にないわぁーと思ったので、設定ファイル(application.properties)に記述

@Component
public class AutoUpdateTask {

  @Scheduled(cron = "${update.scheduler.cron}")
  public void allUpdate() {
    // ・・・
  }
}
update.scheduler.cron=0 0 * * * *

設定内容は、0分0秒時に起動するように定義。
そうすることで、1時間毎に起動するはず。

あとは、mainクラス(SpringApplication.runを実行しているクラス)に、@EnableSchedulingをつけるだけ。
最初、起動しないから、定義を何回も見直したけど、スケジューリングが有効になってないことに気づいて台パンした。

感想・雑記

久しぶりにcron書いた気がする。
普段、全く使わないからな。。。

そういえば、実際の開発でも、1回しか使ったこと無いな。。。

この定義したのはいいのだが、確認方法が難しい。。。
実際に動かして試してるんだけど、他に確認方法ないのか?
ユニットテストで確認したいのだが、検索した感じ、見つけられなかった。

参考リンク

https://reasonable-code.com/spring-boot-scheduling-tasks/

Spring Boot @Scheduled アノテーションで定期実行 - 公式サンプルコード

スケジュール機能を使ってみよう編|SpringBootに入門するための助走本(Zenn改訂版)

1時間置きに実行する|cronの設定・書き方🕒

「GAFAエンジニアはどれぐらいタイピングが速いのか?」の感想

視聴した動画

www.youtube.com

感想・ポエム

タイピングが業務の大半を締めないのは、実際の業務すると分かる。
考える時間の方が長い。
だけど、外部の人は、それが分からんのです。。。
考える時間を軽視している感じがする。
特に日本は、製造業が強いせいか、考える時間を考慮されない感がする。
海外では、どのように考えられているのか気になる。
実際のコーディングだと、タイピングより、どれだけコード補完をうまく使えるかの方が重要そうな気がする。

タイピングが生きるのは、コードレビューとかの対面時だと思う。
今、teamsで画面共有して話すことがあるのだが、そのときにタイピングが遅いと、イライラする事がある。
遅いままでいいと思うのは、ダメ。ある程度のタイピングスピードは必要

自分の中での結論

  • 業務でタイピングは、それほど重要ではない
    • コード補完をうまく使う方が大事
    • タイピング時間 < 考える時間
    • ソフトウェア開発は知的生産性が重要
  • 遅いと人を苛つかせることがある

気になった記事の感想:コードレビューで嫌われる人の特徴7選

記事を書くに至った経緯

記事を読んでいて感化されたのと、個人的な考えを書き出したくなったため

リンク

コードレビューで嫌われる人の特徴7選 - Qiita

思ったこと

レビューを受ける人(レビューイ)

人とのやり取りだから、人格攻撃がやっぱりダメだよね。
受ける人の行動も重要だと思う。
指摘を受けた結果、どう動くのかも重要。言われたまま素直に直していると、たぶん、実力は伸びないと思う。なぜそうするのか、なぜ今の実装ではダメなのかまで考えないと、力にならないと思う。

やっぱり、気持ちがマイナスになる人が多々いるようだな。。。
人間関係に影響が出てくるのが、今のレビューの問題な気がする。
レビューのシステム化は、人間関係に影響しないから、有効ではなかろうかと再認識できる。
sonarやlintは、これからも伸びていくだろうなと思う。
個人的な考えとしては、指摘事項をボカロとかが読み上げてくれると、やる気が出る。見た目がいいものだと尚良。
おっさんに指摘されるより、2次元の美少女に指摘される方がやる気が出ると思うんだよね。
ちなみに、自分は男女平等を重んじるので、↑でいっている「おっさん」は、おばさんも含む

コードレビューを「行う」人(レビューア)

最近は、こっちの立場でやることが多い。
レビューイもそうだが、レビューアも人格攻撃しちゃダメだよね。
口調や呼気、文脈に注意を払わなければいけないのが、結構辛たん。。。

特に、指摘するときは、理由とセットで説明するのは必須。
理由がなければ、同じことを繰り返す可能性高いからな。
レビューイの成長につながらないってのもある。

アクションプランが、見ていて面白かった。
なんというか、小学校の宿題で、先生がコメントする感じっぽいなぁ~と思った。
小学校のころは、指摘だけじゃなくて、褒めも適度に入れてくるからな。
レビューアは、小学校の先生になったつもりでやればいいのではないか?と思いました。
※舐めプ的なことは、しちゃダメ

レビューは、人間関係に影響が少なからずでるのが面倒くさい。
もう、2次元の代理人を立てたほうがいいんじゃなかろうかと思ってる。
レビューア・レビューイに2次元キャラを間に挟めれば、マイルドになると思うんだけど、俺だけかな?

参考リンク

https://wa3.i-3-i.info/diff108review.html

2022/03/21週 気づきと振り返り 身が入らない

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

Java

内部クラスをリフレクションで生成する場合、デフォルトコンストラクタでも引数がいる

掲題の通りなのだが、最初、それが分からなくて、かなり迷った。

Javaの実装だと、x.new A()ってやるのだが、実際は、裏ではnew A(x)って形でインスタンスが生成されているらしい。
そういえば、OCJPの勉強したとき、そんなことを見たことあるなぁ~と思いつつ、下の階の人が苦情入れない程度に地団駄を踏んだ。

ちなみに、僕はOCJP 8 Goldですけどね。(自慢)

参考サイト

[https://www.ne.jp/asahi/hishidama/home/tech/java/reflection.html#h3_member_class:title]

製造

実装ルール

ルールは少なくしたほうがいい。
はっきり言って、全部守れは、無理がある。
javaにはjavaの、jspにはjspの、cssにはcssのルールがあるってのは、マジで無理。
ちゃんとやれって言う方は簡単だけど、やる方は厳しい。
ルールを作るのなら、それを維持する方法も合わせて考えてほしいもんだぜ。。。
もしくは、人が覚えられるように簡素化して欲しい。

俺が覚えられるルールは7つまでだ。
それでチクチク言われるのは、マジでストレス半端ねぇ
心を無にする術を学びたいわぁ。。。

思ってる不満
  • ネーミング規約がファイルごとに異なるのは、きつい
  • ちゃんと守れって言うのは楽でいいよね
  • 守れてないと俺が不真面目に実装しているように言われるのは腹立たしい
  • お前がやってみろよって感じる

カバレッジ100%

かなりキツイのだが。。。
これを達成するために、頭をかなり使う。。。

バグは取れるんだけど、工数と見合ってない気がするのは、俺だけ??

もしくは、テストしやすいコードを作れていない気がしないでもない。

その他雑記

メンタル

最近、なんか身に入らないんだよね。。。
何をするにしても。

そういう時期と思ったほうが良いのだろうか?

最近、なぜ生まれてきたのだろうと考え始めるようになったのが、かなりヤバいのではないかと思い始めている。

Java18

そういえば、3月リリースだったな。。。
いつもなら、ちゃんとリリース前に調べているのだが、そんな余裕はなかった。。。

調べた内容は、下記のリンク参照

suzaku-tec.hatenadiary.jp

ストロング系

ストロング系の酒をたまに飲むのだが、悪い酔いするってことが最近分かった。
たしかに、手軽に酔えるんだけど、翌日、ものすごい頭が痛い。
体に合わないのだろうか?
いまのところ、軽めのチューハイ、日本酒(ちょびっと)、焼酎なんかを飲めることは分かっている。
ビールもダメじゃないけど、美味いと思ったことがないんだよね。。。
あと、ワインはダメだった。飲めないことはないんだけど、翌日、気持ち悪くなるんだよね。。。
ハイボールは、まぁまぁ飲めるけど、ビールと同じで、美味いと思ったことがない。

もしかして、俺の舌って、おこちゃま?

【Java】Java18 リリース内容調査

公式サイト

https://openjdk.java.net/projects/jdk/18/

リリース内容

  • 400: UTF-8 by Default
  • 408: Simple Web Server
  • 413: Code Snippets in Java API Documentation
  • 416: Reimplement Core Reflection with Method Handles
  • 417: Vector API (Third Incubator)
  • 418: Internet-Address Resolution SPI
  • 419: Foreign Function & Memory API (Second Incubator)
  • 420: Pattern Matching for switch (Second Preview)
  • 421: Deprecate Finalization for Removal

環境構築

過去記事参照

suzaku-tec.hatenadiary.jp

JEP内容調査

400: UTF-8 by Default

JEP 400: UTF-8 by Default

google翻訳

Specify UTF-8 as the default charset of the standard Java APIs. With this change, APIs that depend upon the default charset will behave consistently across all implementations, operating systems, locales, and configurations.

標準のJavaAPIのデフォルトの文字セットとしてUTF-8を指定します。 この変更により、デフォルトの文字セットに依存するAPIは、すべての実装、オペレーティングシステム、ロケール、および構成にわたって一貫して動作します。

内容に対する所感

結構、大きな変更。
ファイル入出力周りが、結構インパクトある気がする。
なので、LTS前には、ファイルのエンコードを指定して出力するように直しておく必要がある。
今まで自分がいた現場は、ファイル入出力はエンコード必須だったから、おそらく、現在動いているシステムの影響は少ない気がするが、個人で開発したりするときや新規で開発するときは、エンコードを気にしたほうがいい。

408: Simple Web Server

JEP 408: Simple Web Server

google翻訳

Provide a command-line tool to start a minimal web server that serves static files only. No CGI or servlet-like functionality is available. This tool will be useful for prototyping, ad-hoc coding, and testing purposes, particularly in educational contexts.

静的ファイルのみを提供する最小限のWebサーバーを起動するためのコマンドラインツールを提供します。 CGIまたはサーブレットのような機能は使用できません。 このツールは、特に教育のコンテキストで、プロトタイピング、アドホックコーディング、およびテストの目的で役立ちます。 

実験・検証

下記のコマンドでサーバー起動可

$ jwebserver -p {ポート番号}

下記のindex.htmlを起動した場所と同じところに置くと、上記コマンドで表示されたURLにアクセスすると、index.htmlの内容が表示できる。

<h1>hello Java18</h1>

自分は、8000番を個人開発しているサイトとバッティングするので、9000番で試した

$ jwebserver -p 9000
Binding to loopback by default. For all interfaces use "-b 0.0.0.0" or "-b ::".
Serving E:\dev\java\18 and subdirectories on 127.0.0.1 port 9000
URL http://127.0.0.1:9000/

内容に対する所感

起動は、軽快だった。
用途としては、簡易webサーバーとしても使えそう。
もしかすると、テストサーバー的な役割もできそうな気がしないでもない。
軽量サーバーっぽいので、複雑なことはできなさそう。

今までだと、自分は、node.jsで色々やることが多かったけど、Javaも選択肢に入るようにはなったかな?
※たぶん、node.js使う気がするが。。。

413: Code Snippets in Java API Documentation

JEP 413: Code Snippets in Java API Documentation

google翻訳

Introduce an @snippet tag for JavaDoc's Standard Doclet, to simplify the inclusion of example source code in API documentation.

JavaDocの標準ドックレットに@snippetタグを導入して、APIドキュメントにサンプルソースコードを含めるのを簡素化します。 

実験・検証

サンプルそのまま乗せる。
時間がないので、検証はまた今度。。。

/**
 * The following code shows how to use {@code Optional.isPresent}:
 * {@snippet :
 * if (v.isPresent()) {
 *     System.out.println("v: " + v.get());
 * }
 * }
 */

内容に対する所感

利用用途は、メソッドのJavadocに書いて、それの使い方のサンプルを書く感じだろうか?
おそらく、wiki的な役割を持たせたいのだろうなと感じている。

416: Reimplement Core Reflection with Method Handles

JEP 416: Reimplement Core Reflection with Method Handles

google翻訳

Reimplement java.lang.reflect.Method, Constructor, and Field on top of java.lang.invoke method handles. Making method handles the underlying mechanism for reflection will reduce the maintenance and development cost of both the java.lang.reflect and java.lang.invoke APIs.

java.lang.invokeメソッドハンドルの上にjava.lang.reflect.Method、Constructor、およびFieldを再実装します。 メソッドにリフレクションの基礎となるメカニズムを処理させると、java.lang.reflectAPIとjava.lang.invokeAPIの両方の保守と開発のコストが削減されます。 

内容に対する所感

リフレクションの内部の実装を変更するだけっぽいな。
処理を置き換えることで、保守コストの削減、パフォーマンスの向上が期待できるって、詳細の内容で言ってました。

417: Vector API (Third Incubator)

google翻訳

Introduce an API to express vector computations that reliably compile at runtime to optimal vector instructions on supported CPU architectures, thus achieving performance superior to equivalent scalar computations.

サポートされているCPUアーキテクチャで実行時に最適なベクトル命令に確実にコンパイルされるベクトル計算を表現するAPIを導入し、同等のスカラー計算よりも優れたパフォーマンスを実現します。 

内容に対する所感

あんまり詳しく理解できてないけど、CPUに最適なAPIで計算されるって理解でOK?
本リリース前に理解しておきたいが、じっくり調べる時間がない

418: Internet-Address Resolution SPI

JEP 418: Internet-Address Resolution SPI

google翻訳

Define a service-provider interface (SPI) for host name and address resolution, so that java.net.InetAddress can make use of resolvers other than the platform's built-in resolver.

java.net.InetAddressがプラットフォームの組み込みリゾルバー以外のリゾルバーを利用できるように、ホスト名とアドレスの解決のためにサービスプロバイダーインターフェイス(SPI)を定義します。 

内容に対する所感

ネットワーク周りの話はよく分からないんだよね。。。
ネットワークスペシャリストとろうと思っている身分だけど。

419: Foreign Function & Memory API (Second Incubator)

JEP 419: Foreign Function & Memory API (Second Incubator)

DeepL翻訳

google翻訳の精度にイラッとしてきたので変更

Introduce an API by which Java programs can interoperate with code and data outside of the Java runtime. By efficiently invoking foreign functions (i.e., code outside the JVM), and by safely accessing foreign memory (i.e., memory not managed by the JVM), the API enables Java programs to call native libraries and process native data without the brittleness and danger of JNI.

Javaプログラムが、Javaランタイム外のコードやデータと相互運用するためのAPIを導入する。外部関数(JVM外のコード)を効率的に呼び出したり、外部メモリ(JVMが管理していないメモリ)に安全にアクセスすることで、JavaプログラムはJNIの脆さや危険性なしに、ネイティブライブラリの呼び出しやネイティブデータの処理を可能にするAPIを提供する。

内容に対する所感

JNIを使った外部APIの呼び出しを楽にするのかな?
前に、C++で作られたライブラリ呼び出す処理を仕事で書いたことがあるのだが、結構煩雑だったのと、処理のエラーハンドリングや時間がかかってた印象。
時間があれば、もう少し調べたい。

420: Pattern Matching for switch (Second Preview)

JEP 420: Pattern Matching for switch (Second Preview)

DeepL翻訳

Enhance the Java programming language with pattern matching for switch expressions and statements, along with extensions to the language of patterns. Extending pattern matching to switch allows an expression to be tested against a number of patterns, each with a specific action, so that complex data-oriented queries can be expressed concisely and safely. This is a preview language feature in JDK 18.

Java プログラミング言語において、switch 式およびステートメントのパターンマッチングと、パターン言語の拡張を行います。switchにパターンマッチングを拡張することで、式を複数のパターンに対してテストすることができ、それぞれが特定のアクションを持つため、複雑なデータ指向のクエリを簡潔かつ安全に表現することができる。これは、JDK 18のプレビュー言語機能です。

内容に対する所感

switchアンチ民なんだけど、追ったほうが良い???

421: Deprecate Finalization for Removal

JEP 421: Deprecate Finalization for Removal

DeepL翻訳

Deprecate finalization for removal in a future release. Finalization remains enabled by default for now, but can be disabled to facilitate early testing. In a future release it will be disabled by default, and in a later release it will be removed. Maintainers of libraries and applications that rely upon finalization should consider migrating to other resource management techniques such as the try-with-resources statement and cleaners.

将来のリリースで削除するため、ファイナライズを非推奨としました。Finalizationは今のところデフォルトで有効のままですが、早期テストを容易にするために無効にすることができます。将来のリリースでは、デフォルトで無効化され、後のリリースでは削除される予定です。Finalization に依存しているライブラリやアプリケーションの管理者は、try-with-resources 文やクリーナーなど、他のリソース管理技術への移行を検討する必要があります。

内容に対する所感

finalizeが後々削除されるそうな。
finalize使っても、メモリ回収タイミングは操作できないから、使ったことないので、削除されても問題ない。

参考サイト

Java 18新機能まとめ - Qiita

Java 18正式リリース。デフォルトのCharsetが「UTF-8」に、シンプルWebサーバ搭載など新機能 - Publickey

オラクル、Java 18を発表|日本オラクル株式会社のプレスリリース

Oracle、UTF-8が標準になった「Java 18」を発表 ~簡易Webサーバーも装備(Impress Watch) - Yahoo!ニュース

Oracle、UTF-8が標準になった「Java 18」を発表 ~簡易Webサーバーも装備 - 窓の杜

Java 18リリース、デフォルトの文字コードがUTF-8に | TECH+

オラクルが「Java 18」提供開始、9つのJDK Enhancement Proposalsで改良:EnterpriseZine(エンタープライズジン)

雑記

仕事忙しすぎて、アップデートがあるのをすっかり忘れてしまった。。。

いくつか記事を見たけど、デフォルトエンコードUTF-8になるのが、大きめに取り上げられている印象。
もっと詳しく調べたいけど、直近でOCJP v11 Gold移行の試験、ネットワークスペシャリストの試験、現場の稼働高がキツイ。。。

DeepL翻訳、google翻訳と比べると、かなり精度がいいな。