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

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

単体テストのコード設計を考える

# 背景
テストコードはあってもどのようなケースを想定しているのかわからない。
少しでも頑張らなくて良くなるテストコードとなる様にはどうすれば良いかを検討している。
※これは検討中のメモです
※コードは適当です(動きません)

# 課題
1. どんなケースを想定したテストなのかがわからない
2. 十分なケースかわからない
3. 愚直過ぎて解析が辛い

# 解消案検討

## 1. どんなケースを想定したテストなのかがわからない

### 詳細
– テストケースの説明がない or 情報が不十分
– コードを解析しないといけない

### 検討案
– docにケースの説明を記載する
“`java
/**
* 説明: xxx
* 設定値: yyy
* 期待値: zzz
*/
@Test
public void testXXX() {}
“`

## 2. 十分なケースかわからない

### 詳細
– テストケースの全量がない
– 全てのケースを解析するしかない

### 検討案
– テストコード設計しましょう
**※方針は検討中**
– コード中にテストケー

元記事を表示

jlinkでカスタムJREを作成しコンテナ・サイズを65%削減 – Spring Boot

Spring Boot で作成したアプリケーションをコンテナ化する際、jlink コマンドを利用してカスタム JRE を作成し、軽量なベース・イメージを利用する事で、349MB から 122MB と大幅にコンテナのイメージ・サイズを削減する事ができます。今回はその方法を詳細に紹介します。

## 作成方法の手順

### サンプルプロジェクトの作成

Spring Starter を利用してサンプルのプロジェクトを作成します。

[Create Spring Boot App](https://start.spring.io/#!type=maven-project&language=java&platformVersion=2.7.3&packaging=jar&jvmVersion=17&groupId=com.yoshio3&artifactId=hello-sample&name=hello-sample&description=Demo%20project%20for%20Spring%20Boot&packageName=com.yoshio3&dependencies=w

元記事を表示

Java 19新機能まとめ

Java 19が2022/9/20にリリースされました。

https://mail.openjdk.org/pipermail/jdk-dev/2022-September/006933.html
今回、正式導入された機能がほとんどありませんが、Record PatternsやVirtual Threadは注目すべき機能です。

こちらの配信で解説しています。
[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228058/1601b660-d2f8-36f7-1cba-f852930261e1.png)](https://www.youtube.com/watch?v=-5zlmBnxmCU)

詳細はこちら
[JDK 19 Release Notes](https://jdk.java.net/19/release-notes)
[Java SE 19 Platform JSR 394](https://openjdk.java.net/projects/jdk/19/spec/)

元記事を表示

Oracle なぜセーブポイントは削除されるのか

# 疑問
>「ROLLBACK TO」文を使って特定のセーブポイントにロールバックした場合、そのセーブポイント以降に作成されたセーブポイントは削除される

というところで、

削除するって物理的に行が削除されるの?
なんで削除されるの?
削除されないとどうなるの?

とたくさんの疑問がわいてきたので、調べた内容を共有します

### どのように削除されるのか
「物理的にファイルからその行が削除される」のではなく、発行されたSQLによって設定された SAVEPOINT が論理消去されます。

### なんで削除されるのか?
SAVEPOINT まで ROLLBACK すると トランザクションが終了ます。すなわち、そこまでの処理は正常終了しているということです。したがってROLLBACK した SAVEPOINT 以降に設定された SAVEPOINT は不要になるためで消去されます。
削除されないと何か良くないというより、いらないものなので仕様上削除される。という認識です。(間違っていたら修正お願いします)

## まとめ
SQLって意外と奥が深いです。。。

Rails使っていた時

元記事を表示

Javaでメソッドをオーバーライドしたとき、オーバーライドされたメソッドを使用する親クラスで定義されたメソッドの挙動

確かめたかったことは以下のコードと結果が全てです。
`Parent`クラスの`greet()`メソッドでは内部で`say()`メソッドを呼び出しています。
`Child`クラスでは`say()`メソッドをオーバーライドしています。その結果`Child`クラスの`greet()`メソッドでは`Child`クラスの`say()`メソッドが使用されています。

これは`Parent childParent = child;`のようにして`Parent`クラスのインスタンスとして扱って` childParent.greet();`のように呼び出した場合も`Child`クラスの`say()`メソッドが使われます。(こっちは参照の流れを考えると当然な気もしてきた。)

`Parent`クラスのインスタンスだと思って`greet()`メソッドを呼び出したら、実は`Child`クラスの`say()`メソッドが裏で使われていたとなるとコードリーディングしづらくなりそうですね。

“`java
public class Main {
public static void main(String[]

元記事を表示

Springで@Transactionalを付与したメソッドを別のメソッドから呼んでみる。ロールバックされるか?されないか?

## 疑問
`@Transactional`アノテーションをつけたメソッドを同じクラス内の別のメソッドから呼び出した時に、途中で例外が発生した場合ロールバックされるのか?されないのか?気になったので調べてみました。

結論から言えという方はこちら

@Transactionalアノテーションをつけたとしても、同じクラスの別のメソッドからの呼び出された場合、@Transactionalアノテーションがない場合と全く同じ挙動になる。

## 手を動かしてみる

まず、公式チュートリアルからコードを拝借してきましょう。
チュートリアル完了後のコードをVSCodeで開いてみます。

“`
# コードをクローンしてくる
git clone https://github.com/spring-guides/gs-managing-transactions.git
# VSCodeでプロジェクトを開く
code ./gs-managing-transactions/co

元記事を表示

MultipartFileについてメモ

## はじめに
`MultipartFIle`について整理しておきたいので、自分用にメモ。

## about
・`form`から「`multipart/form-data形式`で送られてきたファイル」を受信した際の表現。

・データ内容は、メモリかディスクに保存される。

## チェーンできるメソッド一覧

・`getBytes()`
バイトの配列に変換できる

・`getContentType()`
ファイルのタイプを返してくれる

・`getInputStream()`
ファイルの内容を読み取る

・`getOriginalFileName()`
ファイル名を返してくれる

まだまだ色々とある。

[参考](https://spring.pleiades.io/spring-framework/docs/current/javadoc-api/org/springframework/web/multipart/MultipartFile.html)

元記事を表示

auカブコム証券のkabuステーションPUSH APIを受信してCSVファイルへ保存する(フラッシュ間隔を調整)

# はじめに

前記事
1. [auカブコム証券のkabuステーションREST APIをcurlで叩く](https://qiita.com/hiuchida/items/fcdd3d6ff921b386a37e)
2. [auカブコム証券のkabuステーションREST APIをjava(generated by the swagger code generator)で叩く](https://qiita.com/hiuchida/items/73b7fc846d4c9501ef2f)
3. [auカブコム証券のkabuステーションREST APIの残高照会をcurlとjavaで叩く](https://qiita.com/hiuchida/items/9eb5336755a3d1b1a3df)
4. [auカブコム証券のkabuステーションREST APIの残高照会から先物OPのdeltaを計算する](https://qiita.com/hiuchida/items/6e0d8d5114192bec1632)
5. [auカブコム証券のkabuステーションREST APIのテスト用モック

元記事を表示

try-with-resourceについて

try-with-resources 文は、1 つ以上のリソースを宣言する try 文である。
ここで言うリソースはプログラムで読み込みや書き込みなどを行った後に、閉じなければならないオブジェクトを指す。

try()の()の中に使用するオブジェクトを宣言することで書くことができる。
書き方の例として以下、オラクルのドキュメントの例を引用

“`例.java
static String readFirstLineFromFile(String path) throws IOException {
try (BufferedReader br = new BufferedReader(new FileReader(path))) {
return br.readLine();
}
}
“`

ちなみにオブジェクトは複数宣言可能みたいで、宣言する際は;で区切ることが必要である。
try文の()の中にリソース宣言して処理を書いていくことができ、処理終了後はリソースは自動的に閉じられる。

例を見ただけではなんなので、通常のtry文と比較してみた。

以下は、5分に1

元記事を表示

Struts2のOGNL式について

# Struts2のOGNL式について

## 概要
Struts2ではJSPやvalidation.xmlにOGNL式が記述できる。OGNL式は他にもstruts.xmlのresultにも記述できたり、JSPではJakartaEEのEL式、スクリプトレットと組み合わせて使用できる。
OGNL式、スクリプトレット、EL式の違い、組み合わせ、OGNL式のstrutsタグ以外での使用について述べる。

### 調査環境
– Ubuntu 22.04.1 LTS
– openjdk version “11.0.12” 2021-07-20 LTS
– struts-2.5.26
– Tomcat 9.0.64

## JSPにおけるOGNL式、スクリプトレット、EL式の解析タイミング
JPSではOGNL式、スクリプトレット、EL式が記述可能だが、それぞれ解析のタイミングが異なる。
### スクリプトレット
スクリプトレットはJSPの初回呼び出し時にJasperコンパイラによってJavaクラスにコンパイルされる。そしてJavaクラスのメソッド、コードの一部として実装される。
いつ解析する? J

元記事を表示

VSCodeでJava&PostgreSQLの環境を構築しようとした件

# 前提
1. プロキシ設定が必要
2. DBはPostgreSQL
3. VsCodeで以下の環境を構築
“`conf:構成 ※意外と躓いたので備忘録
・サーバーサイド:Java(SpringBoot)
・クライアントサイド:Node.js(Nuxt.js)
“`

# 手順
## 下準備
1. Dockerの設定にProxy設定を行う
ID、パスワードが必要な場合は以下を参考に設定
「http://[Proxy-ID]:[Proxy-Password]@[Proxy-URL]:8080/」
2. Gitに適当なリポジトリを作成
3. そのリポジトリをCloneしておく
4. コマンドプロンプトでCloneしたディレクトリに移動
5. VSCodeを起動
“`code .“`と入力すれば、カレントディレクトリを開いて起動してくれる

## 開発用コンテナとPostgreSQLコンテナを準備
1. 「.devcontainer」フォルダを作成し、その中に
「devcontainer.json」「docker-compose.yml」を作成
“`json:devcontaine

元記事を表示

【Spigotプラグイン】公式の様なTab補完機能を作る

# Tab補完機能とは

↑の様な、文字を入力したら候補が表示され、Tabを押すと補完してくれる機能のことです。
(上の動画のものは入力された文字に対してリアルタイムで反応するタイプ)

# 普通のTab補完機能を作る
いきなりリアルタイムで入力された文字に反応するタイプを作るのは難しいので、入力された文字列に関わらず決められた候補を表示するTab補完機能から作ってみましょう。

## TabCompleterの実装
 Tab補完機能はCommandExecuterやListenerを実装するときのようにimplementsに`implements TabCompleter`と記載します。
コマンドと別のClassに実装しても良いですが、共通化させる予定がないようでしたらCommandExecuterを実装したクラスに追加で実装するのが得策だと思います。

Tab補完機能はonTabCompleteインターフェースに記載

元記事を表示

pg_auto_failoverによるPostgreSQLサーバの冗長構成をさわってみた

PostgreSQLサーバの冗長構成を検討することになりました。

AWSなどのクラウドサービスで運用するなら、そのようなPaaSが提供されているので、ほぼ、それ一択なんでしょうが、今のところVPSを使う案件が中心なので、候補の対象外です。

また約5年前に、Pacemakerを使ったPostgreSQLサーバの評価に関わったことがあるのですが、PacemakerがいろいろなMWの制御ができるだけに、覚えることも多かったので、今回はちょっと敬遠。

そして見つかったのが[pg_auto_failover](https://github.com/citusdata/pg_auto_failover)でした。

* 以下の内容は多分に推測が混ざってますので、ご注意ください。

# 評価環境の準備

まずは簡単に動作を確認したいので、リポジトリにある docker-compose.yml を使います。
そのままの設定だと、
* PostgreSQLサーバのコンテナ3台 (以下、DBノード1, DBノード2のように表記)
* PostgreSQLクラスタを監視するコンテナ1台 (以下、監視ノー

元記事を表示

ABC269A~Eの解答[Java]

## はじめに
今回は初の5完でしたので、Eまで載せようと思います。

では、見ていきましょう。

## A – Anyway Takahashi
問題文は[こちら](https://atcoder.jp/contests/abc269/tasks/abc269_a)

問題文そのままですね。
“`A.java
class Main{

static Library System = new Library(java.lang.System.in,java.lang.System.out);

public static void main(String[] args)throws IOException{

//各値の受け取り
int a = System.in.nextInt();
int b = System.in.nextInt();
int c = System.in.nextInt();
int d = System.in.nextInt();

//計算結果の出力
System.out.println((a+b)*(c-d));

元記事を表示

リアルタイムにテクニカル指標を計算する

# はじめに

前記事
1. [auカブコム証券のkabuステーションREST APIをcurlで叩く](https://qiita.com/hiuchida/items/fcdd3d6ff921b386a37e)
2. [auカブコム証券のkabuステーションREST APIをjava(generated by the swagger code generator)で叩く](https://qiita.com/hiuchida/items/73b7fc846d4c9501ef2f)
3. [auカブコム証券のkabuステーションREST APIの残高照会をcurlとjavaで叩く](https://qiita.com/hiuchida/items/9eb5336755a3d1b1a3df)
4. [auカブコム証券のkabuステーションREST APIの残高照会から先物OPのdeltaを計算する](https://qiita.com/hiuchida/items/6e0d8d5114192bec1632)
5. [auカブコム証券のkabuステーションREST APIのテスト用モック

元記事を表示

複数の分足のテクニカル指標を計算する

はじめに

前記事
1. [auカブコム証券のkabuステーションREST APIをcurlで叩く](https://qiita.com/hiuchida/items/fcdd3d6ff921b386a37e)
2. [auカブコム証券のkabuステーションREST APIをjava(generated by the swagger code generator)で叩く](https://qiita.com/hiuchida/items/73b7fc846d4c9501ef2f)
3. [auカブコム証券のkabuステーションREST APIの残高照会をcurlとjavaで叩く](https://qiita.com/hiuchida/items/9eb5336755a3d1b1a3df)
4. [auカブコム証券のkabuステーションREST APIの残高照会から先物OPのdeltaを計算する](https://qiita.com/hiuchida/items/6e0d8d5114192bec1632)
5. [auカブコム証券のkabuステーションREST APIのテスト用モックサー

元記事を表示

リアルタイムに4本値とチャートデータをマージするツール

はじめに

前記事
1. [auカブコム証券のkabuステーションREST APIをcurlで叩く](https://qiita.com/hiuchida/items/fcdd3d6ff921b386a37e)
2. [auカブコム証券のkabuステーションREST APIをjava(generated by the swagger code generator)で叩く](https://qiita.com/hiuchida/items/73b7fc846d4c9501ef2f)
3. [auカブコム証券のkabuステーションREST APIの残高照会をcurlとjavaで叩く](https://qiita.com/hiuchida/items/9eb5336755a3d1b1a3df)
4. [auカブコム証券のkabuステーションREST APIの残高照会から先物OPのdeltaを計算する](https://qiita.com/hiuchida/items/6e0d8d5114192bec1632)
5. [auカブコム証券のkabuステーションREST APIのテスト用モックサー

元記事を表示

複数の分足の4本値とチャートデータをマージするツール

はじめに

前記事
1. [auカブコム証券のkabuステーションREST APIをcurlで叩く](https://qiita.com/hiuchida/items/fcdd3d6ff921b386a37e)
2. [auカブコム証券のkabuステーションREST APIをjava(generated by the swagger code generator)で叩く](https://qiita.com/hiuchida/items/73b7fc846d4c9501ef2f)
3. [auカブコム証券のkabuステーションREST APIの残高照会をcurlとjavaで叩く](https://qiita.com/hiuchida/items/9eb5336755a3d1b1a3df)
4. [auカブコム証券のkabuステーションREST APIの残高照会から先物OPのdeltaを計算する](https://qiita.com/hiuchida/items/6e0d8d5114192bec1632)
5. [auカブコム証券のkabuステーションREST APIのテスト用モックサー

元記事を表示

CalcIndicatorクラスの依存性を切る

# はじめに

前記事
1. [auカブコム証券のkabuステーションREST APIをcurlで叩く](https://qiita.com/hiuchida/items/fcdd3d6ff921b386a37e)
2. [auカブコム証券のkabuステーションREST APIをjava(generated by the swagger code generator)で叩く](https://qiita.com/hiuchida/items/73b7fc846d4c9501ef2f)
3. [auカブコム証券のkabuステーションREST APIの残高照会をcurlとjavaで叩く](https://qiita.com/hiuchida/items/9eb5336755a3d1b1a3df)
4. [auカブコム証券のkabuステーションREST APIの残高照会から先物OPのdeltaを計算する](https://qiita.com/hiuchida/items/6e0d8d5114192bec1632)
5. [auカブコム証券のkabuステーションREST APIのテスト用モック

元記事を表示

Facadeパターンでの開発

開発の初案件が終わったので、何回かに分けてアウトプットします。
今回はFacadeパターンでの実装の流れについてです。
以下のような前提で開発をしました。
ファイル名やクラス名は実際のものと変えています。

## Facadeパターン
複数のクラスが集まってできたプログラムは、様々なクラスのメソッドを呼ぶので処理が複雑になります。
このような場合に処理を依頼する側から見た際に窓口となるファイルを用意するのがFacadeパターン。
Facadeに当たるファイルには実際の処理は書かず、メソッドの呼び出しをメインにします。
今回は携帯電話の支払い履歴を閲覧するような処理を実装しました。
処理としては電話番号とIDで顧客情報照会をした後、顧客情報に紐づく履歴情報を取得するという流れです。
中身の処理は今回は省略します。
WB0_01が窓口となるFacadeにあたり、顧客情報照会をするクラスがClient、履歴情報を取得するクラスがPaymentHistoryとします。![スクリーンショット 2022-09-17 17.35.02.png](https://qiita-image-store.s

元記事を表示

OTHERカテゴリの最新記事