JAVA関連のことを調べてみた2022年12月11日

JAVA関連のことを調べてみた2022年12月11日

特に必要性はないけどAstroとSpringBootをつなげてみた

# はじめに

業務で学んだSpringBootと興味で学んでいるAstroを組み合わせただけのラフな記事です。

以下記事のオマージュになるので、ご了承ください

# 今回メインの参考記事
https://qiita.com/curry__30/items/c91d489551de68adb759#%E5%89%8D%E6%8F%90

https://qiita.com/Haru_3/items/d1644226682dfbc3a9a3

# SpringBootとAstro

### SpringBoot
・Javaを便利に使えるやつ
・カプセル化だったり、色々な周辺技術を少ない力で実装できる非常に便利なフレームワーク

https://spring.pleiades.io/spring-boot/docs/current/reference/html/getting-started.html

### Astro
・SSR重視のMPA設計や、コンポーネントレベルでインタラクティブ性を付与する、アイランドコンポーネントを利用した、高速静的サイトを生成するフレームワーク
・Reac

元記事を表示

Spring FrameworkのDI

この記事はレコチョク [Advent Calendar 2022](https://qiita.com/advent-calendar/2022/recochoku)の11日目の記事となります。

はじめまして、レコチョク新卒入社2年目の早坂と申します。

現在バックエンドシステムの構築に携わっており、Javaのフレームワークである、Spring Frameworkを用いた開発を行っています。
その中で、DIを勉強する機会があったので勉強した内容を記事にしました。

# 本記事の位置づけ
1. オブジェクト指向プログラミングを経験したはあるが、DIがよくわかっていない
2. Spring Frameworkを使って機能を実装しているけどDIをなんとなく使っている

といった方がDIの仕組みや実装を理解するための一助となるような記事になればと思います。
なお、上記1.の方は記事前半(“なぜDIをするのか”まで)、2.の方は記事後半(“Spring FrameworkにおけるDIの実現方法”から)を中心に読んでいただくと良いかと思います。

# DI(Dependency Injectio

元記事を表示

Kotestで書くデータ駆動テスト(Data Driven Testing)

この記事は筆者の[ソロ Advent Calender 2022](https://qiita.com/advent-calendar/2022/panda) 11日目の記事です。

今回はKotlin製のテスティングフレームワークであるKotestのデータ駆動テスト(Data Driven Testing)について紹介いたします!

# Kotestとは
Javaでは古くからJUnitでテストを書かれることが多く、KotlinでもJUnitでテストを書くことは可能ですが純正Kotlinで実装されたテスティングフレームワークがKotestです。詳しくは公式がかなり読みやすく作られているので公式を見ていただければと思いますが大きな特徴としては10種類のSpecと呼ばれるクラスが用意されており好きなSpecを選択してテストを書くことができます。Specはそれぞれ様々な言語、テスティングフレームワークの影響を受けて作られており他言語からKotlinを始めた人は自分の母国語のテストSpecを選択できるでしょう。

他にも実験的な機能も含めて多くの機能、アサーション、エクステンションが用意されて

元記事を表示

【備忘録】”API” “REST” “JSON”についてまとめ

## はじめに
### 前提
超駆け出しエンジニアが勉強したことをアウトプットして知識の定着を図る為に始めたQiita投稿の第一弾です。

私のテスト案件現場では何かバグが起こるたびに”API”やら”JSON”やら色々難しい言葉が飛び交う毎日。。

バグはそれらが要因で発生している事が多いからよく耳に入るんでしょうが、
「一体何のこっちゃかよく分からん、、、勉強しなければ、、、」
って事で勉強した事をまとめました。

### 大まかな流れ
今回の勉強内容の重要なキーワードは”API”,”REST”,”JSON”の3つ。

◯インプット : “API”, “REST”, “JSON”とは何?

◯アウトプット : 実際にAPIを作って理解を深める

◯まとめ

### ゴール
インプットした内容を備忘録としてアウトプットすることで知識の整理を整理する!

## 勉強内容
### ◯インプット
#### API(Application Programming

実践JavaでSSH接続

# はじめに

Javaでリモート接続してコマンド実行したり、リモート環境とのファイル転送をしたい用途があったので、ライブラリを使って試してみました。

# 使用したライブラリ

`JSch`

http://www.jcraft.com/jsch/

https://mvnrepository.com/artifact/com.jcraft/jsch

# 基本的な使い方

リモート接続して下記を実施する方法を紹介します。

– コマンド実行
– ファイル転送

## 接続方法

共通の接続方法についてです。
sshのコマンドとしては下記と同等です。
“`shell
ssh -p 22 root@192.168.1.1
“`

“`java
String user = “root”;
String host = “192.168.1.1”;
String port = “22”;

JSch jsch = new JSch();
Session session = jsch.getSession(user, host, port);
session.setConfig(

【J】「JavaScriptとJavaは別物」は全人類の共通認識ではない

全人類の認識になれと100億年前から言ってる

## 正しい認識

– JavaもJavaScriptも「プログラミング言語の名前」
– この2つは**別のプログラミング言語**
– **JavaScriptは「JavaのScript」ではない**

## Javaとは?

– 汎用プログラミング言語。
– “Javaが動く仮想マシン”で動作する仕組みなのでいろんな機械で共通のプログラムを動かせる
– 例えば、Windows実行ファイルの.exeはMacでは基本的に動かないが、JavaのプログラムはWindowsで動くJavaの仮想マシン・Macで動くJavaの仮想マシンの両方で動くのでWindowsでもMacでも動くと言える
– なんならカーナビとかでも動いた覚えがあるぞ?

## JavaScriptとは?

– webサイトでよく動いてるプログラミング言語。
– ブラウザ上で処理されるのでまあ「いろんな機械で共通のプログラムを動かせる」という共通点があるかもしれない。

## なんでJavaScriptに”Java”がついているの?

**Javaの勢いに乗じよう

Java製のバリデーションライブラリYAVI(ヤバイ)を使ってみた[API導入編]

この記事は筆者の[ソロ Advent Calender 2022](https://qiita.com/advent-calendar/2022/panda) 10日目の記事です。

前回までにJava製のバリデーションライブラリであるYAVI(ヤバイ)の使い方を紹介しましたが、せっかくなのでもう少し実践的に簡単なAPIを作成してみましたのでその紹介です。

前回の記事は[こちら](https://qiita.com/JY8752/private/d59c76c2574d2782088b)

今回までの成果物はこちらです

https://github.com/JY8752/YAVI-demo

# 準備
今回はSpringを使用しますのでSpring Initializerでプロジェクトを作成します。
全体的な構成は以下のようなものを作っていこうと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551753/a936f365-cb70-5bdc-24e1-da7975191

【Kotlin】動的プロキシでsuspend関数を実装する

この記事はKotlin Advent Calendar 2022の5日目の記事になりました。

https://qiita.com/advent-calendar/2022/kotlin

# TL;DR
– インターフェース定義が`suspend`関数かつ`InvocationHandler.invoke`関数内でも`suspend`関数を呼び出したい場合、素直に書くと`invoke`関数が非`suspend`関数なためコンパイルエラーになる
– `suspend () -> …`が`(Continuation<*>) -> …`にキャストでき、`Continuation`も`args`から取得できることを利用すれば、この問題は回避できる

# 前置き
動的プロキシを知っている方は読み飛ばして頂いて大丈夫です。

## 動的プロキシとは
動的プロキシとは、指定されたインタフェースを実行時に実装するような機能です。

例えば以下のようなことができます。

“`kotlin
interface Foo {
fun foo(): String
}

object FooP

SpringBoot + MySQLで作成したTodoリストに「完了」「未完了」ボタンを実装する!

# はじめに
SpringBoot + MySQLで作成したTodoリストアプリケーションに、Todoの状態を完了、未完了に切り替える機能を実装していく。(初学者なので備忘録)

ゴールは、**リストのtrue/falseを変更し、データベースを更新する**こと。

参考にさせていただいた記事では1度完了にしたTodoは未完了にはできなかったので、完了・未完了を切り替えられるように実装した。
参考にさせていただいた記事:https://qiita.com/morioheisei/items/52d722eeee919f3a1552

# 開発環境
“`
OS:macOS Ventura 13.0.1
“`
“`
openjdk version “11.0.16” 2022-07-19 LTS
OpenJDK Runtime Environment (build 11.0.16+8-LTS)
OpenJDK 64-Bit Server VM (build 11.0.16+8-LTS, mixed mode)
“`
“`
mysql Ver 14.14 Distrib 5.6.

GitHub Actionを利用して、リリースタグを作成した後自動的にGoogle Cloud App Engineデプロイする

## はじめに
株式会社ピーアールオー(あったらいいな!を作ります) Advent Calendar 2022の10日目になります。
前日は「[Salesforce]問い合わせページにWeb-to-リードを設定する 」でした。
さらに7日目は「SpringBoot MVCで簡単なWEBアプリを実装してみる」でしたので、今回は実際作ったWEBアプリをGoogle Cloud App Engineにデプロイしようと思っています。

## 事前準備
まずはJavaベースのWEBアプリを用意する必要があります。今回はSpringBootのかわりに、[Quarkus](https://quarkus.io)を利用します。
Quarkusコマンドを利用するので、[Quarkusコマンドのインストール方法](https://quarkus.io/guides/cli-tooling)はこちらになります。

Quarkusコマンドをインストール完了後、`quarkus create app`のコマンドでアプリを作成します。

“`bash
quarkus create app medium-demo

Javaオーバーロード 型は数で認識されるのか順番で認識されるのか

# はじめに
スクールでメソッドやコンストラクタを呼び出す際、引数名と型が違えば同名のメソッドやコンストラクタを定義して呼び出せる`オーバーロード`を学習しました。その際に出てきた疑問を整理して以下の例題で検証してみました。

“`java
public class Overload {
//引数なし
public void sayHello() {
System.out.println(“こんにちは!”);
}
//引数name
public void sayHello(String name) {
System.out.println(“こんにちは!私の名前は” + name + “です。”);
}
//引数name, hobby
public void sayHello(String name, String hobby) {
System.out.println(“こんにちは!私の名前は” + name + “です。趣味は” + hobby + “です。”);
}

public static void main(String[] args) {
//Overload

Jakarta EE10でもUberJarでお気軽開発をする〜Payara編〜

# はじめに

本記事はMDC Advent Calendar 2022の10日目の記事です。

https://qiita.com/advent-calendar/2022/mdc

Jakarta EE10でもUberJarを使って開発するぞ、ということで前回はOpen Libertyをターゲットに動作確認しました。

https://qiita.com/omix222/items/b748df83ae9a652719f2

今回は前回使ったソースコードをベースに修正していくことでPayaraに対応していきたいと思います。

# Payaraとは

Payaraは、GlassFish Serverのオープンソース版から派生したJava EE、Jakarta EE準拠のアプリケーションサーバーです。OSS版、エンタープライズ版がありますが、今回はOSS版を使っていきます。

日本ではサムライズムさんが代理店対応を行っています。

Payara Server & Payara Micro

# Open Liberty → Payara対応

まず、PayaraでJakartaEE1

JavaとgRPCで2Dバーチャルオフィスっぽい何かを作る ②gRPC bidirectional streaming

:::note info
この記事は [TLB Enjoy Developers Advent Calendar 2022](https://qiita.com/advent-calendar/2022/tlb-enjoy) 9日目の記事です。
:::

## 概要
前回に引き続き、2Dバーチャルオフィスっぽいツールを作っていきます。
[JavaとgRPCで2Dバーチャルオフィスっぽい何かを作る ①概要編](https://qiita.com/kdr250/items/7a82ceaea3ae4a0ec917)

## 今回の目的
今回はgRPCの双方向通信を用いてプレイヤー同士が位置を共有する方法について書きます。
調べたところ同期方式にもいくつかの選択肢があるようですが、今回は**非同期でクライアントからサーバーに位置を送信する**ような方式を選択しました。多人数が接続する上に対戦する訳ではないので、厳密な同期は不要と判断したからです。

また同期間隔について、多人数参加型のオンラインゲームなどでは1フレーム事に同期を取っているわけではなく、数フレームごとに同期を取ることでわずかな

Jakarta EE10でもUberJarでお気軽開発をする〜Open Liberty編〜

# はじめに

本記事はMDC Advent Calendar 2022の9日目の記事です。

https://qiita.com/advent-calendar/2022/mdc

SpringBootでのアプリケーション開発ではビルド後に java -jarで簡単にアプリ起動することができますが、Jakarta EE(JavaEE)ではそのようには出来ません。

アプリケーションサーバーの準備不要で、java -jar実行でまるっと起動させる仕組みをUberJarと呼びます。前にはWildflyでUberJarする方法を取り上げました。

https://qiita.com/omix222/items/8d9a5411d6c1228ab3f1

今回は先日リリースされたJakarta EE10記念として、Jakarta EE10に対応したアプリケーションサーバーでのUberJar化の方法を紹介したいと思います。

各種アプリケーションサーバーで違いをみながら説明するのが面白いと思ったのですが、下記始めるとかなり長くなってしまったので、シリーズ化します。初回はOpen Liberty

緊急退避:見かけたjarファイルをOpenShift にデプロイする

『アプリケーションをOpenShiftで動かす』事について、より理解を深めていかなくてはと課題を感じている今日この頃。
勉強して分かったことを記事にして共有したいなと思い準備していたのですが、想像していた以上に奥が深かったことに気がついきました。

深く踏み込むにも、OpenShiftへのアプリケーションのデプロイって、色々な内部処理がされていて、それがはたしてアプリケーション実行環境やフレームワークの機能なのか、OpenShiftが提供する機能なのか、そのどちらによって、実現されているのかがとらえきれず、今回は、ちゃんとした事はかけないと挫けました(汗)

もともとは、javaのソースコードの状態から、OpenShiftへコンテナをローンチするプロセスをしっかり理解したかったのですが、、、
興味のポイントとしては、java言語で書かれたコードの場合、javaのコンパイルが必要となるので、コンテナをビルドをする前に、javaのコード達はどういう状態になってなくてはならないのか。加えて、コンテナ化するために、どういったファイルや設定を用意しなくてはならないのかというのが気になっていました

JavaでPDFからPDFA、PDFAからPDFに変換する方法

PDF/A(Portable Document Format Archivable)は、保存用のファイル形式です。文書の保存期間に関わらず、文書の詳細を保存し、まったく同じように再現することができます。時には、長期的な文書アーカイブの目的で、PDFをPDF/Aに変換する必要があるかもしれません。この記事では、無料の[Free Spire.PDF for Java](https://jp.e-iceblue.com/introduce/free-spire-pdf-for-java.html)を使用して**PDFをPDF/Aに、またはPDF/AをPDFに変換する方法**を説明します。

– **[PDFをPDF/Aに変換する](#pdfをpdfaに変換する)**
– **[PDF/AをPDFに変換する](#pdfaをpdfに変換する)**

## 【依存関係の追加】
この方法は、無料のFree Spire.PDF for Javaが必要ですので、先にjarファイルをインポートしてください。

### 1. Maven
Maven を使用している場合、プロジェクトの pom.xml ファイ

JavaでPDFの添付ファイルを追加、抽出、削除する方法

PDFは汎用的なファイル形式です。そのページ上に表示される内容に加えて、保存容器としても使用することができます。他のファイルを添付して、後で取り出すことができます。外部リンクを使用するよりもPDFにファイルを添付することの利点は、PDFを別の場所に移動しても添付ファイルが一緒に移動することです。今回は、無料の[Free Spire.PDF for Java](https://jp.e-iceblue.com/introduce/free-spire-pdf-for-java.html)を使って、Javaで**PDF文書に添付ファイルを追加、抽出、削除する方法**を紹介します。

– **[PDFに添付ファイルを追加する](#pdfに添付ファイルを追加する)**
– **[PDFから添付ファイルを抽出する](#pdfから添付ファイルを抽出する)**
– **[PDFの添付ファイルを削除する](#pdfの添付ファイルを削除する)**

## 【依存関係の追加】
この方法は、無料のFree Spire.PDF for Javaが必要ですので、先にjarファイルをインポートしてください。

#

Spring Boot 3.0 で入った RFC7807 サポートを色々試す

先日、Spring Boot 3.0 が[GA](https://spring.io/blog/2022/11/24/spring-boot-3-0-goes-ga)になりました。実に5年ぶりのメジャーバージョンアップだったようです。めでたいですね。
Java17&Java EE9やGraalVMによるnativeイメージサポートなど大きな機能強化以外にも様々な新機能が入っています。
この記事では、CHANGELOGで見つけたちょっと変わり種n機能 RFC7807サポートについて試した結果を紹介します。

## RFC7807 とは?
[RFC 7807 Probrem Detail for HTTP APIs](https://www.rfc-editor.org/rfc/rfc7807)

HTTP APIのエラーレスポンス形式を標準化したRFCです。REST APIを作るたびにエラー形式考えるのがめんどくさい人のための標準仕様になります。 “`application/problem+json“` で以下のようなレスポンスを返却します。
“`json
{
“ty

ChatGPTにMinecraftのMODを作ってもらう(後編)

ChatGPTにMODを作ってもらおうと思います。[前編](https://qiita.com/zawanume/items/506976a4ba97415b77ac)はChatGPTに任せきりにしてめちゃめちゃだったので、後編では人力で手直ししていこうと思います。結論から申し上げますと動くようにはなりましたが工業要素はゼロです。

# IronGeneratorTileEntityの実装
ChatGPTは`IronGeneratorTileEntity`クラスを`IronGenerator`クラスの内部クラスとして実装してくれました。そのままでも支障は特にありません。
Forgeを導入した開発環境ではデコンパイルし難読化解除した(確か)Minecraftのコードを読むことができます。Minecraftの内部実装では`TileEntity`の子クラスや孫クラスは内部クラスとして実装されてはいませんでした。何となく統一した方が良いような気がしたので、内部クラスとして実装するのはやめることにします。

“`java:IronGeneratorTileEntity.java
public

Kotlin エンジニアが Java を書き直して感じたことまとめ

【完走賞】MxShun ひとりマラソン ? Advent Calendar 2022 毎週金曜日は Kotlin の記事を書こう!2記事目です。

1年あまりサーバサイド Kotlin を書いていましたが、この度の転職で Java8 時代のシステム保守も行うようになりました。
Kotlin エンジニアのバックグラウンドを持つ私が、改めて Java を書き始めて感じたことをまとめます。

### 1. 基本ミュータブルで怖い + 都度 `final` を付けるの面倒
Kotlin のクラス・関数・変数はデフォルトで `final`、つまり不変で継承不可です。スコープは最小限でイミュータブルに保つという思想から来ているのでしょうか。コードの見通しのたてやすさから私もこの思想を好みます。

他方、Java は気にしないとミュータブルで継承可能です。都度 `final` を付ける必要があるので書くのも面倒ですし、かなり冗長です。
って言うか、型宣言や末尾の `;` がないのも改めて素敵ですね。

“`kotlin
// in Kotlin
companion object {
pri