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

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

RxJavaでFlowableを使って流量制限

RxJava の Flowable を使った流量制限(Backpressure)の方法について調べる機会があったので、その時に分かったことをまとめる。
(意外と欲しい日本語情報少なかったので)

## Observable と Flowable

RxJavaでは上流と下流で分けて考え、
Java8に導入された Stream の終端操作とそれ以外の処理のような形で書くことができる。
例えば並列実行で使用する Observable は以下のような感じで記載できる。

“`java
final Observable observable = Observable.create(emitter -> {
try {
for (int i = 0; i < 10; i++) { emitter.onNext(i); } emitter.onComplete(); } catch (Throwable t) { emitter.onError(t); } }); observable.forEach(System.ou

元記事を表示

GraalVMでネイティブイメージを作成 on Windows

# 概要
GraalVMを使うとJavaアプリケーションをネイティブイメージ化できます。(JVM不要で実行できる)
パフォーマンスなどJVMで実行するのとかなり異なる特性を持ちますが、ここでは触れません。
Windowsでビルドを試したので、その手順だけ書きます。

# 環境
* Windows 11
* Java 17
* Gradle 7.4(Kotlin DSL)

# 手順

## Javaアプリケーションを書く
もちろんビルド対象のアプリケーションを書く必要があります。試すだけならHello worldでいいですが、私は(機能限定版ですが)tailコマンドを作ってみました。

https://github.com/dhirabayashi/mytail

## Visual Studioをインストールする
ネイティブイメージ化はGraalVMからC++のコンパイラを呼んで実行されるようです。なのでそのためのコンパイラが必要です。
コンパイラはいくつかあると思いますが、Visual Studioをインストールするのがいいようです。

現時点で最新版のVisual Studio

元記事を表示

JUnit 単体テストの概要

# はじめに
業務で使用しているJUnitについて備忘録も兼ね、まとめていきたいと思います。
内容が多いため、何章かに分けてまとめていく予定です。
今回は、まずJUuitの内容に入る前に単体テストについてまとめていきたいと思います。

# JUnitシリーズ 項目表

| NO     | タイトル |
| —- | ——————- |
| その1 | [JUnit 単体テストの概要](https://qiita.com/ryo0527/items/70550e0a556975a593f5) |
| その2 | JUnit 環境の準備 (現在執筆中)          |

※ 新しい記事が作成できましたら、表は更新します。

# 単体テストとは
テストには、単体テストや結合テスト、総合テストなど様々なフェーズがあります。
各テストにおいて、目的や役割がそれぞれ定められています。
今回は、その中でも単体テストに焦点を当て、まとめていきたいと思います。

単体テストとは、モジュール(部品)単位でプログラムが正常に動作するかを検証する

元記事を表示

SpringBootのお勉強

# 概要

以前、業務でSpring Bootを触る機会があったため、社内wikiに備忘録的にメモを残していました。
オープンな場に残しておこうと思い、ここに書いておきます。

## Spring Bootとは

* Spring Framework一族のひとり
* 簡単な設定で使えるSpring
* Webコンテナを内包する
* Webコンテナをjarに含めるので、jar単体でWebアプリとして成立する(スタンドアロン)

## 環境構築

* Eclipse or IntelliJ IDEA Community EditionにSTS(Spring tool suite)のプラグインを入れる
* Spring Starter Projectを作成する
* ウィザードに従う
* とりあえずweb -> Spring webを入れておけばおk

## 実践

### AutoConfigure

* Bean定義自動設定
* `@SpringBootApplication`
* ↑のアノテーションに`@SpringBootConfiguratio

元記事を表示

static修飾子の使い方(Java)

【目的】
staticについて理解を深めるための投稿。

【この記事でやりたいこと】
staticを利用して、Sample2クラスで定義したnameという変数(“hello”)をSample1クラスで使いたい。

【事前知識(そもそもstaticとは?)】
クラスをインスタンス化せずに、直接的にメソッドや変数にアクセスするために必要なもの。

【利用するクラス】
○Sample1クラス
○Sample2クラス

【検証】
Sample1クラス
“`Java
public class Sample1 {
public static void main(String[] args) {
//①static String name = “hello”を利用した場合(※今回の目的)
System.out.println(Sample2.name);

//②String name = “hello”を利用した場合 
Sample2 sample2 = new Sample2();
System.out.prin

元記事を表示

org.thymeleaf.exceptions.TemplateInputException: Error resolving template, template might not exist or might not be accessible by any of the configured Template Resolvers

Spring bootでプログラムを書いていてハマったメモ。

プログラムを実行し、入り口URLにアクセスしたところ、表題のエラーメッセージが表示された。
コントローラーのソースを見ても、

return “uploadForm”;

おかしな値は返していない。

src/main/resources/templatesフォルダを作成し、その中に、ちゃんとHTMLファイルを置いている。ファイル名はuploadForm.htm 。

uploadForm.htm …

**そこだ!**

uploadForm.html

とリネームすると、期待した動作となった。

今時、拡張子をhtmとするやつなどいない。**加齢臭あふれる間違い**だった。

以上。

元記事を表示

【Java】Spring Data JPAでN+1問題が起きないコーディングをしよう。

# N+1問題とは
**1対多**の関係にある2テーブルの情報を紐づけて取得する際に、必要以上にSQLが実行されてしまうこと。
  
  対象テーブル(School)
  関連テーブル(Student)

具体的には、対象テーブル(School)に紐づく**関連テーブル(Student)を取得するSQL**が必要以上の回数で実行されてしまう。

# SQLでN+1問題を解説

1つのSchoolに対して、複数のStudentが紐づく。
|Schoolテーブル|
|—-|
|id|
|name|

|Studentテーブル|
|—-|
|id|
|name|
|school_id ****|

JOINを使えば、全Schoolとそれに紐づくStudentを1つのSQLで取得できる?
“`sql
SELECT * FROM School sc JOIN Student st ON sc.id = st.school_id;
“`
これで話は終わり…ではなく、N+1問題の場合はどういうSQLになるかというと、次のようなSQLとなる。
“`sql
— 最初に、全

元記事を表示

アノテーションベースの MyBatis で one-to-one / one-to-many のテーブルを1クエリでとってくる方法

積年の疑問が晴れた。が、だいぶゴツい。

## サマリ

– one-to-many のときは、@One アノテーションに columnPrefix / resultMap を使う
– many-to-many のときは、@Many アノテーションでおなじようにすればできるはず(未検証)

## 背景

### 過去、アノテーションベースでは N+1 問題が回避不可だった

https://qiita.com/d-yosh/items/a2bec9718bccfe15a6ae#one-many

> しかし、@Oneや@Manyでは上記と同じことを実現できず、必ず他の select を実行するしかありません。
select を利用する方法は N+1 問題が起きてしまうのが嫌で、個人的にはあまり使っていなかったので、ここはちょっとデメリットかなと思いました。

## mybatis-3.5.5 で解消した模様
mybatis-3.5.5 で `@One` `@Many` に columnPrefix を指定できるようになった。
これにより、N + 1 問題を発生させずに、1クエリで on

元記事を表示

HottyDB(検索エンジン+レコメンドエンジン+RDBMS)を個人開発するために読んだ書籍紹介!

# この記事の概要
筆者は、HottyDBという検索エンジンとレコメンドエンジンの機能を搭載したRDBMS(リレーショナルデータベース)を個人開発しています。
この記事では、HottyDBを開発するにあたって勉強した書籍を紹介したいと思います!

ちなみに、HottyDBについて詳しく解説した記事もアップしていますので、こちらもあわせてご覧ください!

https://qiita.com/toru1055/items/0fe400989373823e9c78

# 読んだ本を紹介

## ざっくり分類すると、
読んだ本をざっくりと分類するとこんな感じになります。

| 分類 | 説明 |
| — | — |
| データベースの基礎 | データベースの実装方法の大枠を掴む |
| データベースの実装 | データベースの実装方法の詳細 |
| コンパイラ系 | データベースはSQLで操作するので、SQLを解釈するためにコンパイラの知識も必要 |
| Java | Javaによるマルチスレッドプログラミングやネットワークプログラミングの方法を勉強|
| アルゴリズムとデータ構造 |

元記事を表示

Eclipseで構築したサーバーが起動しないときの対処法

古い環境で需要のある内容ではないですが、かなりハマったので残しておきます。

# 開発環境
macOS Monterey 12.3.1
Eclipse 2019-12 (4.14.0)
Tomcat v8.0

# 概要
環境構築中、Eclipseでサーバーを構築し、起動させるとすぐにエラーメッセージがコンソール上に表示されました。
“`text:コンソール
重大: Begin event threw exception [火 7 05 15:48:49 JST 2022]
警告: Catalina.start using conf/server.xml: Error at (21, 76) : org.apache.catalina.startup.VersionLoggerListener [火 7 05 15:48:49 JST 2022]
重大: Begin event threw exception [火 7 05 15:48:49 JST 2022]
警告: Catalina.start using conf/server.xml: Error at (21, 76) :

元記事を表示

JUnit5の@BeforeEachと@AfterEachが実行されない

# 問題
JUnit5でテスト実行時に`@BeforeEach`アノテーションと`@AfterEach`アノテーションのついたメソッドが実行されないことがあった。

# 解決策
下記リンクの回答で解決。

https://stackoverflow.com/questions/49441049/junit-5-does-not-execute-method-annotated-with-beforeeach

>Your init() method is not invoked because you have not instructed Maven Surefire to use the JUnit Platform Surefire Provider.
>Thus, surprisingly your test is not even being run with JUnit. Instead, it is being run with Maven Surefire’s support for what they call POJO Tests.
>Adding the foll

元記事を表示

LDAP再認証

概要 : SOS用ユーザのLDAP認証が失敗した際に認証を救済する。

処理概要: 1. LDAP検索用ユーザが認証したユーザの組織情報の検索を行う。
      2. 検索結果により、正しい組織情報を用いて再度認証を行う。

前提条件: LDAP検索用ユーザがLDAPサーバ側に用意されている事。

※ 戻り値によりエラー内容を識別しているため、当処理は必ず例外処理内に記述してください。

※ LDAPサーバのURI,ポート,ドメイン,組織情報等については各自設定をお願いいたします。

※ FRONT_SGはxmlファイルです。
  xmlファイルのタグ参照は必須ではないため、
  各プロパティに直接値を設定してください。

・ LDAP認証プロパティ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339882/67759b5d-713b-4f71-10eb-e9501fca71f4.png)

・ソース

public static int authenticationLD

元記事を表示

JavaによるSwingを用いたオセロゲームの作成

## 環境
Eclipse IDE 2022-03 (4.23.0)
MacBook Pro 2020
macOS Monterey バージョン12.4

## 使用技術
Java (11.0.14.1)
Swing

## プログラムの概要
ローカルのPC上で動作するオセロゲームアプリケーション。
プログラムで動作するコンピュータが相手となる。

## 機能
– オセロゲームの基本的なアクション。(コマの配置、パス)
– 難易度の選択

## 工夫した点
#### コンピュータがコマを置く場所を探索する際の動き
##### ①最初に考えたプログラム
自分の駒が置いてあるマスの周りにある敵の駒を探し、敵の駒があればその場所から再度周りの敵のコマ探す
##### ②工夫したプログラム
自分の駒が置いてあるマスの座標を取得し、周囲に敵の駒があった場合にその方向のマスの座標を連続してリストとして取得し最終地点に空きマスがあるか判定する

①の場合、コードを見たときに直感的にわかりにくくバグの確認などが難しくなる可能性があったため、工夫をしました。

元記事を表示

個人開発で、検索エンジン+レコメンド機能つきRDBMS:「HottyDB(α版)」を開発しました!

# この記事の概要
個人開発で **HottyDB** という検索エンジンとレコメンドエンジンの機能を搭載したRDBMSを開発し、α版を公開しました!

#### [>> HottyDBの公式サイト](https://hottydb.gitlab.io/site/)
https://hottydb.gitlab.io/site/

ので、この記事では**HottyDB**の特徴的な機能やその使い方について紹介したいと思います!

# HottyDBとは?
![logo](https://hottydb.gitlab.io/site/facebook_cover_photo_2.png)
HottyDBとは、検索エンジンとレコメンドエンジンの機能を搭載したRDBMS(リレーショナルデータベース)です。
SQLを用いた通常のデータ操作に加え、文書の全文検索や検索結果の機械学習ランキング(MLR)・アイテムレコメンデーションのロジックなどを全て1つのソフトウェアで担います。
1つのソフトウェアでこれらを実現することで、面倒なデータ伝送システムの構築を一切不要にし、利用者は機械学習などの知

元記事を表示

springのRequestBodyにswaggerでexampleを付与

たとえば、下記のようにStringに “`@RequestBody“` を付与してswagger-uiで参照すると入力例があまりユーザフレンドリーでない画面になる。

“`java
@RestController
public class SampleRestController {
@PostMapping(“/sample”)
public String sample(@RequestBody String body) {

“`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31934/0ef96b17-27c4-dc6a-fecc-7b3328f662eb.png)

なので、サンプルとなる適当なjsonなどをデフォルトで表示したい。

適当に“`build.gradle“`を作る。

“`gradle
plugins {
id ‘org.springframework.boot’ version ‘2.7.1’
id ‘io.spr

元記事を表示

現場で役立つシステム設計の原則を読んで

[現場で役立つシステム設計の原則 〜変更を楽で安全にするオブジェクト指向の実践技法](https://www.amazon.co.jp/%E7%8F%BE%E5%A0%B4%E3%81%A7%E5%BD%B9%E7%AB%8B%E3%81%A4%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E8%A8%AD%E8%A8%88%E3%81%AE%E5%8E%9F%E5%89%87-%E3%80%9C%E5%A4%89%E6%9B%B4%E3%82%92%E6%A5%BD%E3%81%A7%E5%AE%89%E5%85%A8%E3%81%AB%E3%81%99%E3%82%8B%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91%E3%81%AE%E5%AE%9F%E8%B7%B5%E6%8A%80%E6%B3%95-%E5%A2%97%E7%94%B0-%E4%BA%A8-ebook/dp/B073GSDBGT/ref=sr_1_1?__mk_ja_JP=%E3%82%A

元記事を表示

[Java] コレクション List Map Setについて

### はじめに
Java学習中にでてきたコレクションについてまとめました

### コレクションAPI
オブジェクトの集合を管理、操作するJava標準のAPI
オブジェクトの集合 → コレクション
コレクションの集合 → 要素

よく使うAPI(予め要素の追加・削除などのメソッドが用意されている)
– List
– Map
– Set

### List
配列同様インデックス番号順序に要素を管理するコレクション、要素の重複ok
List自体はインターフェースなのでListを実装している`ArrayList`や`LinkedList`などを使用(import)する必要がある
(`import java.util.ArrayList;`)
##### 配列との違い
配列:要素数の指定が必要
List:要素数の指定が必要なく要素の追加・削除するたびにサイズが増減

##### 基本形
“`java
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

// ArrayListを生成

元記事を表示

opensource COBOL 4J はじめの一歩

# はじめに
COBOLをお持ちのIT部門の方より、現在のCOBOL資産をJavaに移行したいという相談をよく聞きます。この記事では、そのような検討をしているご担当者様向けに、オープンソースソフトウェア(以下、OSS)の **opensource COBOL 4J** による COBOL to Java 変換を試す手順をご紹介します。

https://github.com/opensourcecobol/opensourcecobol4j

# opensource COBOL 4Jとは
[opensource COBOL 4J](https://github.com/opensourcecobol/opensourcecobol4j) は、[OSSコンソーシアム](https://www.osscons.jp/)が開発して Github で公開しているOSSのCOBOLコンパイラです。COBOLコンパイルの過程で、COBOLを中間Javaソースに変換し、Javaコンパイラでバイトコードを生成する仕組みです。処理の流れは下図のとおりです。
![image.png](https://q

元記事を表示

SpringBootにおけるバッチ処理

https://qiita.com/kazuki43zoo/items/47ed3b15077773f02448
上記記事を参考にさせていただきました

SpringBootで何らかのバッチ処理を作る際に高機能でジョブを制御する仕組みがあるSpringBatchを使いたくないようなケースがあります(例えばジョブスケジューラーなどを利用していてジョブは実行するだけにしたい場合など)。その場合はJavaコマンド実行してリターンコードで結果を返すようなシンプルな構造にしたい。

## やりたいこと
・SpringBootでコマンド実行して指定した処理を動かす
・機能ごとにクラスを分けてどの機能を動かすか?は引数で指定する
・ジョブの成功/失敗はコマンド実行のリターンコードで判断する

### 構成

実行コマンドイメージ

“`sh
java exec:<実行したいクラス名> -jar filename.jar
“`

コマンド実行した際の最初にコールするクラス

“`Java:Application.java
package com.example.springboot;

imp

元記事を表示

【Spring Boot+JPA】レコードの作成・更新日時を扱う

Spring Bootを使ってTODOアプリを作成している際に日付の登録や表示で少し詰まったので記録。

# 環境
* Java 11
* Spring Boot 2.7.0
* Maven 4.0.0
* MySQL 8.0.23

# やりたいこと
Spring Data JPAを用いてEntityの保存時に自動で作成、更新日時が入るようにしたい

# MySQLの設定確認
* todos table
“`
mysql> desc todos;
+————–+————–+——+—–+———+—————-+
| Field | Type | Null | Key | Default | Extra |
+————–+————–+——+—–+———+—————-+
| id | int | NO | PRI | NULL |

元記事を表示

OTHERカテゴリの最新記事