JAVA関連のことを調べてみた2023年10月16日

JAVA関連のことを調べてみた2023年10月16日
目次

Integer型のおせっかいで死ぬほど沼った話

### 最初に

Integer型の比較で(==)を使ってはいけないことを知っていますでしょうか。私は前に聞いた時、「ほ~ん」で済ませていましたが先日その理由を体験しました。3日ほど悩みまくった挙句、人に聞いてやっと解決したので忘備録として残します。

### Integer型の比較

最初に、以下のコードをご覧ください

“` Main.java
public class Main {
public static void main(String[] args) throws Exception {
Integer sample = new Integer(1);
Integer sample2 = new Integer(1);

if(sample.equals(sample2)){
System.out.println(“true”);
}else {
System.out.println(“false”);
}

元記事を表示

log4j

## log4j

“`java:Main.java
package test;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.config.xml.XmlConfigurationFactory;

public class Main {
public static void main(String[] args) {
System.setProperty(XmlConfigurationFactory.CONFIGURATION_FILE_PROPERTY, “log4j2.xml”);

Logger logger = LogManager.getLogger(Main.class);
logger.trace(“TRACEレベルのログ”);
logger.debug(“DEBUGレベルのログ”);
logger.info(“INFOレベルのログ”);

元記事を表示

Struts2とMVC

# はじめに
Struts2が、どこでどう使用されているのかわからなかったので、Udemyのコースでわかりやすく説明されていた概要をまとめて記事にしました。なので、実際のコーディングなどの説明ではなく、MVCモデルと照らし合わせてStruts2がMVCのどこでどんな役割をしているのかを軽く触れた内容です。

## MVCモデルとは
プログラムの処理を「Model・View・Controller」の3つの役割に分けてコーディングを行うソフトウェア設計モデル
![MVC-Model.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3335514/a48d6233-c742-7a64-43c8-4cf8247a3e83.png)

### MVCの各役割

名前 説明
Medel データベ

Javaでフレームワーク(Httpサーバ)を作成してみる

#### Javaでフレームワークをなるべくスクラッチで作成してみました
フレームワーク自体を作成すれば、自由度が少しでも広がると思い作成してみました。

こちらが今回作成したコードになります。
https://github.com/yuki-yanagawa/FrameWorkTest

## 目次
[1. 概要](#概要)
[2. エントリポイント](#エントリポイント)
[3. レシーバの内容](#レシーバの内容)
[4. キューについて](#キューについて)
[5. タスクマネージャの内容](#タスクマネージャの内容)
[6. リクエストヘッダの解析](#リクエストヘッダの解析)
[7. 処理の実行](#処理の実行)
[8. 最後に](#最後に)

## 概要
大きな流れとしまして、「RecevierがHttpリクエストを受け取る -> QueueにHttpリクエストをためる -> TaskManagerがQueueからHttpリクエストを受け取り、処理を実行する」形になります。

リクエストヘッダを解析し、以下定義ファイルを元に実行する処理を決定します。
>メソッド[空白]

【Java】ファイルクローズ漏れ発生時の挙動確認とクローズ漏れ対策

### 【概要】
`close`メソッドの実装忘れや`try-with-resources`で実装していない場合、ファイルクローズ漏れとなります。
ファイルクローズ漏れを放置するとファイルディスクリプタの上限を超えてしまい、それ以上ファイルが作成できないエラーが発生することを確認します。

Spring BootでファイルアップロードできるWebAPIを起動し、実際にファイルアップロードして確認していきます。

### 【環境】
Windows11
Docker version 20.10.21, build baeda1f
Java 19
Spring Boot 3.1.4

### 【コード】

https://github.com/nobu12/file-close-leak

DemoController.java

“`java:DemoController.java
package com.example.demo.controller;

import org.springframework.web.bind.an

【Docker】eclipse-temurin:19-jdk-alpineのイメージを-dオプションありでコンテナ起動するとIOException: Unable to parse columnsが発生する

### 【概要】
eclipse-temurin:19-jdk-alpineのイメージを-dオプションありでコンテナ起動すると`IOException: Unable to parse columns`が発生します。
-dオプションなしだと問題なく起動します。

### 【環境】
“`terminal
C:\work>docker –version
Docker version 20.10.21, build baeda1f
“`

### 【準備】
下記Dockerfileを作成します。
本記事ではC:\workに配置しています。

“`docker:Dockerfile
FROM eclipse-temurin:19-jdk-alpine
“`

### 【コマンド実行結果】

#### Dockerイメージ作成

“`terminal
C:\work>docker build -t sample-image .
[+] Building 2.3s (5/5) FINISHED
=> [internal] load build definition from Dock

Javaの実行方法について迷っていませんか?


# Javaを実行するには?
javaをやっていて、「実行方法がわからない~!」と挫折しかけたことはありませんか?そこで、今回は、javaを実行する方法について解説していこうと思います。
## まず、正しいプログラムを書こう
Javaは一般に、オブジェクト指向だ(クラスで成り立っている)といわれています。なので、まずクラスを書かなければなりません(まあ、クラス無しで書く方法もありますが、ここでは割愛)
例えば、”Hello World!”を出力するプログラムを書くとします。
“`java
//期待する出力=>Hello World!

public class SayHello {
public static void main(String[] args) {
System.out.println(“Hello World!”);
}
}
“`
コードを解説します。まず、クラスを設定します。クラス名は”SayHello”としておきます。実際のコードは以下の通りです。
“`java
public clas

【make it easy】Javetを利用して、pdf-libとpdfmakeをefwに使ってみる

今回の記事は、以下の記事の続きです。

https://qiita.com/changkejun/items/bbb3c094c4c2e4a7a120

Javetについて、先日の記事をみてください。

https://qiita.com/changkejun/items/f08b1959fc7fd3f24a8f

# loadWithGlobalPool関数の改造
パラメータにengineとreturnVarを追加します。以下はサンプルです。
“`js
var pdfDataUri=loadWithGlobalPool({
name:”pdf-lib-javet”,
max:10,
initializer:initscript,
script:runscript,
context:{bytesIPAexgothic:bytesIPAexgothic,createdate:new Date().format(“mm:ss SSS”)},
engine:”javet”,
returnVar:”pdfDataUri”,
});

Javaで「区切り文字を別の値に設定する」の動作を確認してみた

# 概要

Javaで「区切り文字を別の値に設定する」の動作を確認してみました。以下のページを参考にしました。

https://www.javadrive.jp/start/scanner/index3.html

# 実装

以下のファイルを作成しました。
“`JSample3_2.java
import java.util.Scanner;
import java.util.regex.Pattern;

class JSample3_2{
public static void main(String[] args){
String regex = “:|;”;
var p = Pattern.compile(regex);

Scanner scanner = new Scanner(“Melon:Peach;Grapes:Orange”);
scanner.useDelimiter(p);

while (scanner.hasNext()){
String fruit = scanner.next();

デザインパターン Factoryパターン

# Factoryパターン
**Creational Design Pattern** の一つで、クライアントに対してインスタンスの生成を隠蔽するためのパターン。

具象クラスのインスタンス化を隠蔽またはカプセル化することで、クライアントは直接クラスを`new`演算子によってインスタンス化するのではなく、ファクトリーに生成を依頼するようになる。

これにより、クライアントコードから具象クラスがなくなり、「**変更に対しては閉じられているが、拡張に対しては開かれている**」状態となる。

Factoryパターンには以下の3種類が存在する。
+ Simple Factory
+ Factory Method
+ Abstract Factory

## Simple Factory
厳密にはGoF(Gang of Four)によって定義されるデザインパターンではないが、クライアントから具象クラスを分離させるための一つのスタイルである。

インスタンスを返却するメソッドがコンストラクタの役割を果たすことにより、具象クラスのインスタンス化をカプセル化する。

どの具象クラスをインスタンス化する

Javaで「スキャナの入力ストリームにまだ値が残っているか確認する」の動作を確認してみた

# 概要

Javaで「スキャナの入力ストリームにまだ値が残っているか確認する」の動作を確認してみました。以下のページを参考にしました。

https://www.javadrive.jp/start/scanner/index6.html

# 実装

以下のファイルを作成しました。
“`JSample6_5.java
import java.util.Scanner;
import java.util.regex.Pattern;

class JSample6_5{
public static void main(String[] args){
String regex = “[A-Z0-9]{2}”;
var p = Pattern.compile(regex);

Scanner scanner = new Scanner(“AB 7B DEB A5”);

while (scanner.hasNext(p)){
System.out.println(scanner.next());
}
}
}
“`

以下のコ

Spring Thymeleaf css/js No mapping for GET 404 対策メモ

## Spring Thymeleafでstatic以下のcss/jsが読めない場合

resouces/static など固定のパスを読めるようにする


“`java
@Configuration
public class CustomWebMvcConfigurationSupport extends WebMvcConfigurationSupport {

private static final String[] CLASSPATH_RESOURCE_LOCATIONS = {
“classpath:/META-INF/resources/”, “classpath:/resources/”,
“classpath:/static/”, “classpath:/public/” };

@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
if (!registry.hasMappingForPattern(“/webjars/*

[Java] コンストラクタって?

まず初めに、私はJava初心者であり、テキストなどで勉強をしたことをアウトプットするためにこの記事を書きました。

## コンストラクタってなに?
#### クラス名と同一名称で、インスタンス生成直後に自動的に実行されるメソッドのことである。

インスタンスを生成後、以下のように初期値をセットしている。
(newで生み出されたばかりのインスタンスフィールド(nameやhp)には何も入っていないため)
“`java:初期値セット
public class Main {
public static void main(String[] args) {
Hero h1 = new Hero();
h1.name = “タロウ”;
h1.hp = 100;

}
}
“`

実際の開発現場では複数人で開発することがほとんどであるため、1人ですべての開発を行うことはまずありえない。
そのためクラスを作るにあたっては、自分以外の開発者がこのクラスを利用することも考えておかなければいけない。
そして、それぞれ

PDF管理:Javaを使ってPDF文書を比較し、内容の違いを見つける

チームでの執筆でも、個人作業でも、PDF文書は何度も修正・更新されることが多い。 PDF文書の内容の変化をマスターすることは、文書の管理に非常に役立ちます。 PDF文書を比較することで、ユーザーはすぐに文書の追加、削除、内容の変更を見つけることができ、文書のプロセスの進化をよりよく理解し、簡単に文書を管理することができます。 この記事では、Javaプログラムを通じて[Spire.PDF for Java](https://jp.e-iceblue.com/introduce/spire-pdf-for-java.html)を使用し、**PDF文書を比較**し、文書間のコンテンツの違いを見つける方法を紹介します。

– **[JavaプログラムによるPDF文書全体の比較](#javaプログラムによるpdf文書全体の比較)**
– **[JavaプログラムによるPDF文書の指定ページの比較](#javaプログラムによるpdf文書の指定ページの比較)**

この記事で使用する方法は、Spire.PDF for Javaを必要とします。Spire.PDF for Javaは、[公式ウェブサイト

スッキリわかるJava入門 実践編 第3版 まとめ -part11-単体テストとアサーション

# はじめ
こんにちは ◤●ㅅ●◥ノ

今回は品質を意識しながら効率的に開発を行う手法、機能、ツールについて学びました!

## 第11章 単体テストとアサーション

### 1.不具合に対するアプローチ
開発の進み具合のこと __進捗__ 
開発すべき機能の範囲 __スコープ_

:star: 「完成」の基準
期待される「スコープ」と「品質」の両方を満たして、初めて完成
期待される「時間」内に完成して、初めて成功

品質のおおまかな段階
1.起動不能
2.強制終了
3.仕様非準拠
4.完成

何で品質を確認するか
→テストを行う

#### テストの種類
__単体テスト__
ある1つの部品について詳細なテストを行い、その部品単体では完成していることを検証する
1つのクラスのメソッドを呼び出し動作が正常であることを確認する
クラスの開発者が担当することも多く、ほとんどの不具合はこの段階で修正される

__結合テスト__
単体テストが完了している完成部品をいくつかつないで動作させ、
うまく連携して動作するかを確認する

__総合テスト(システムテスト)__
すべての部品を結合して行う最後

スッキリわかるJava入門 実践編 第3版 まとめ -part10-基本的な開発ツール

# はじめに
こんにちは ◤●ㅅ●◥ノ

今回はJDKに標準で添付されているツールとそれに関連する機能について学びました!

## 第10章 基本的な開発ツール

### 1.Javaが備える基本的なツール
実務…「限られた制約の中で、最高のソフトウェアを作る」
→実践的な開発で求められるのは開発効率

効率を上げるには3つの方法
1.個人の知識と技能を上げる
2.道具を使う
3.複数人で手分けをする

2,3を10章以降の所で学んでいく
10章では道具を使い効率を上げる方法を学ぶ

### 2.JDK
リリースされたJava標準使用を元に、さまざまな企業がその仕様に沿って動作する
JVMやコンパイラ、APIクラスなどを開発する
→それらを詰め合わせた開発者向け提供パッケージのことをJDKと呼ぶ

開発用途のツールを除き、実行専用のツールのみを含んだものをJREという
※昔から存在するが、近年ではJDKのみの提供も増えている

### 3.javadoc-仕様書の自動生成
複数人が協力してプログラムを作る一般的なプロジェクトでは、
プログラムに関する設計情報などを記述した __仕様

java勉強:J2V8とJavetの比較

V8はGoogleが開発するオープンソースのJavaScriptエンジンです。高速、最新ES適用など、いろいろほめられています。V8はC++のものですが、javaからV8から利用する場合、ラッパーが必要です。

– 一番有名なのは、J2V8です。だが更新が止まっているみたいで、windows向けのバージョンは2016年の4.6.0まで、async/awaitはサポートしていないです。詳細は以下のリンクから確認してください。

https://github.com/eclipsesource/J2V8

https://repo1.maven.org/maven2/com/eclipsesource/j2v8/j2v8_win32_x86_64/

– 2番めは、javetです。V8の2023年10月のv11.8.172.15、node.jsも9月v20.8.0を利用されています。認知度がJ2V8よりちょっと低いかもしれません。後発ですからJ2V8より使い勝手がいいです。

https://github.com/caoccao/Javet

“`xml

RESTクライアントはこんなに簡単に作れる

以下のライブラリが便利。

* google-http-client
* google-http-client-gson

Maven Repositoryを見て最新版を持ってくること。

# RESTクライアントを実装する上で必要な機能

* REST APIにHTTPでリクエストを送る
* レスポンスが返ってくるので受け取る
* 受け取ったレスポンスをJSONパーサで展開する

# ここまでの機能がこれだけで実現できる

“`java:Main.java (一部)
HttpTransport transport = new NetHttpTransport();
Response response = transport.createRequestFactory()
.buildGetRequest(url)
.setParser(new JsonObjectParser(new GsonFactory()))
.execute()
.parseAs(Response.class);
“`

“`java:Res

Javaで「文字列からの入力を行うスキャナを作成する」の動作を確認してみた

# 概要

Javaで「文字列からの入力を行うスキャナを作成する」の動作を確認してみました。以下のページを参考にしました。

https://www.javadrive.jp/start/scanner/index5.html

# 実装

以下のファイルを作成しました。
“`JSample5_1.java
import java.util.Scanner;

class JSample5_1{
public static void main(String[] args){
Scanner scanner = new Scanner(“120 78 92 46”);

while (scanner.hasNextInt()){
int num = scanner.nextInt();
System.out.println(num);
}
}
}
“`

以下のコマンドを実行しました。
“`
$ javac JSample5_1.java
$ java JSample5_1
120
78
92
46
“`

# まとめ

Spring Security5.8で非推奨になったantMatchersがrequestMatchersで置き換えられない件

# 最近結構書き方の変わったSpring Security
Spring Security5.4~あたりで、いろんなものが非推奨になったり、6.0以降では削除されたり、いろいろ変わりましたね。
WebSecurityConfigurerAdapterが使えなくなって、configureメソッド各種を`@Bean`アノテーションを付与し、Beanとして公開するように変更するのが一番大きな変更かな…と思ってます。
それで5.8~非推奨になったメソッドで、`antMatchers`と`mvcMatcher`があります。
Spring公式から出ているドキュメントでも、`requestMatchers`に置き換えられると記載してあります。

https://docs.spring.io/spring-security/reference/5.8/migration/servlet/config.html#use-new-requestmatchers

でも、確かにコンパイルエラーにはならないけど、起動するとエラーで画面表示できないんですよね…
いやもしかしたら`configure(HttpS