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

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

Microprofile Fault Toleranceの機能と独自に用意したInterceptor間の実行順序を制御する

## 環境

* Java 8
* CDI 2.0
* Microprofile Fault Tolerance 2.0

## 事象

[Microprofile Fault Tolerance 2.0 Circuit Breaker](https://download.eclipse.org/microprofile/microprofile-fault-tolerance-2.0/microprofile-fault-tolerance-spec.html#circuitbreaker)のアノテーションと、独自に用意した `FooInterceptor` を実行するアノテーションを併用した場合、サーキットブレーカが意図せず発動する事象に遭遇しました。

“`java:FooInterceptor
@Interceptor
@Dependent
@Foo
@Priority(Interceptor.Priority.APPLICATION)
public class FooInterceptor {

@AroundInvoke
public Object invok

元記事を表示

【非同期処理】スレッドセーフって何?

業務で非同期処理を書いたときに「そのクラス、スレッドセーフですか?」と指摘を受けることが複数回ありました。
そこで、「そもそもスレッドセーフって何よ」「スレッドセーフじゃないと何が困るのよ」ということを勉強しました。本記事はそのまとめとなってます。

##参考図書

この本は思考させる系の練習問題がついてて、良い気がします。
自分もまだ読破で

元記事を表示

Fabricのソースコード非公開Modの難読化を解除する方法

# はじめに
Modを改造したい、そう思ったときにソースコードが公開されていないことはよくあります。
Modをパクリたいとき、改造したいとき、パッチを作りたいとき色々ありますが、
常に難読化の壁に阻まれることになります。

[Forgeの難読化を解除する方法](https://ci.tterrag.com/job/BON2/)はありますが、Fabricの難読化を解除する方法についての情報がなかったので記事を書きます。

# 1. 前提知識

https://fabricmc.net/wiki/tutorial:migratemappings?s%5B%5D=gradlew&s%5B%5D=migrate

https://fabricmc.net/wiki/tutorial:setup

https://fabricmc.net/versions.html

https://qiita.com/noriokun4649/items/35763e6e35b80c976dfd

# 2. Modを準備する

デコンパイルするFabricで製作されたModを用意します。

今回は例として [

元記事を表示

Java Excelでドキュメントのプロパティを追加

はじめに

Excelでは、作成者、タイトル、サブタイトル、キーワードのプロパティなど、といったプロパティを追加することで、ファイル管理を効率化したり、エクセルをカスタマイズしたりできます。今回は、Spire.XLS for Javaというライブラリを活用して、Excelでドキュメントのプロパティを追加する方法を紹介していきます。この記事で、少しでもお役に立てたのであればと思いますね。

Spire.XLS for Javaとは?

Spire.XLS for Javaは、開発者がJavaプラットホームでExcelの文書ファイルを迅速かつ高品質でAsciidoctor Maven Pluginを使って良い感じにPlantUML図をHTMLファイルに埋め込む

### この記事のゴール
・Asciidoctor Maven Pluginを使って良い感じにPlantUML図をHTMLファイルに埋め込む。


### 作業の流れ
1. プロジェクトフォルダ作成(所要時間:10秒)
2. pom.xmlの設定(所要時間:30秒)
3. adoc形式ファイル作成(所要時間:30秒)
4. ビルド【adoc形式ファイル → HTMLファイルに変換】(所要時間:30秒)


### 1. プロジェクトフォルダ作成

・フォルダ「asciidoc-practice」作成


### 2. pom.xmlの設定

・asciidoc-practiceフォルダ配下にpom.xml作成
・下記をpom.xmlにコピペ

“` 【Java】Spring JDBCで登録機能の実装

今回はJava SpringFWを用いて登録・更新・削除機能を実装してみました。
バリデーションについては、JPAではなくJDBCtemplateを使用しております。
以下はそれぞれに分けて解説をしておりますので、よければ参考にしてください!!

• 【更新】[Spring JDBCで更新機能の実装]()(作成中)
• 【削除】[Spring JDBCで削除機能の実装]()(作成中)
• 【まとめ】[Spring JDBCで登録・更新・削除]()(作成中)
• 【エラー解消】[Spring JDBCでエラーメッセージが消えない!?]()(作成中)

0, 目次

1, 完成品
2, 環境
3, 関連ソースコード  
  ① Form と entity
  ② Controller
  ③ Service
  ④ Impl と Custom と Repository
  ⑤ HTML と JavaScript
  ⑥ messages.properties と ValidationMessages.properties
  ⑦ pom.xml

4, 参考にしたサイト

Couchbase Lite機能解説:データベースの使い方

## はじめに

Couchbase Liteの利用に資するために、下記のドキュメントの内容(英語)を整理します。

https://docs.couchbase.com/couchbase-lite/current/java/database.html

## 初期化

APIを使用する最初のステップは、イニシャライザーを呼び出すことです。
初期化前に他のAPIメソッドが呼び出されると、例外が発生します。

例1.データベース初期化

“`java
// Initialize the Couchbase Lite system
CouchbaseLite.init();
“`

## データベース作成/オープン

`Database`クラスを使用して、新しいデータベースを作成したり、既存のデータベースをオープンすることができます。
データベース名とオプションで`DatabaseConfiguration`を渡します。

注意すべき点は次のとおりです。

– データベースのオープン/作成は非同期プロセスです
– 指定されたデータベースが指定された場所またはデフォルトの場所に存在しな

元記事を表示

Java 17新機能まとめ

Java 17が2021/9/14にリリースされました。

http://mail.openjdk.java.net/pipermail/jdk-dev/2021-September/006037.html

機能的に多くのプログラマに関係ありそうな変更はApple Siliconに対応したくらいですが、LTSであるということが大きいと思います。

詳細はこちら
[Oracle Releases Java 17](https://www.oracle.com/news/announcement/oracle-releases-java-17-2021-09-14/)
[Java SE 17 Platform JSR 392](https://openjdk.java.net/projects/jdk/17/spec/)
[JDK 17 GA Release](https://jdk.java.net/17/)

APIドキュメントはこちら
[Overview (Java SE 17)](https://cr.openjdk.java.net/~iris/se/17/build/late

元記事を表示

opencsvのCSV書き出し(CSVWriter)で囲み文字をなくす

# 結論

CSVWriterの引数多いほうのコンストラクタにICSVWriter.NO_QUOTE_CHARACTERを渡す。
char型で定義されているので`¥u0000`を渡してもいいはず。

# 実例

“`java
Path p = Paths.of(‘xxx’);
try (
BufferedWriter bw = Files.newBufferedWriter(p, StandardCharsets.UTF_8);
CSVWriter writer = new CSVWriter(writer
, CSVWriter.DEFAULT_SEPARATOR
, CSVWriter.NO_QUOTE_CHARACTER
, CSVWriter.DEFAULT_ESCAPE_CHARACTER
, CSVWriter.DEFAULT_LINE_END) {
// …
}
“`

# 参考

http://opencsv.sourceforge.net/apidocs/com/opencsv/CSVWriter.html#CSVWr

元記事を表示

SpringBootの@Transactionalが効かない!

# 結論

### DIでインジェクトしたクラスのpublicメソッドじゃないとだめ。

# それまでの流れとか

SpringBootのCommandLineRunnerを使ってバッチ処理を作っていました。
もともと入力のCSVから別形式のCSVへの変換だったのですが、仕様変更で急遽DB操作を行うことになり大慌てで対応することに。
今後改修もないようなちょっとしたバッチ処理なので`JDBCTemplate`で実装することにしました。

1ステップ処理でワークテーブルをdelete-insertで洗い替えするだけなので、トランザクション不要でExitコードがエラーなら後続バッチを動かさなきゃいいかな、と考えていたのですが運用上ロールバック欲しいらしいので後付けで対応。

## publicメソッドにしか@Transactionalをつけてもだめ。

publicメソッドにしか@Transactionalつけられなかったはず、と考えながら実装しても機能せず:0

https://docs.spring.io/spring-framework/docs/4.2.x/spring-frame

元記事を表示

Javaのequalsメソッドについて

“`equalsSample.java

//(~省略~)

// 正しい例
private final String 定数1 = “hogehoge”;
private String 変数1 = null;

if(定数1.equals(変数1)){
System.out.println(“同じ値です”);
}else{
System.out.println(“違う値です”);
}

// nullPointExceptionは発生せずに、「違う値です」が出力される。

// 悪い例
private final String 定数1 = “hogehoge”;
private String 変数1 = null;

if(変数1.equals(定数1)){
System.out.println(“同じ値です”);
}else{
System.out.println(“違う値です”);
}

// nullPointExceptionが発生する。

“`

上記のように、equalsメソッドで定数と変数を比較する場合は、定数を先頭に記述すると良い。

元記事を表示

【Spring】@Transactional関連メモ

#### ① ロールバックするタイミングは「非検査例外が発生したときのみ」
  → rollbackForプロパティで指定した検査例外はロールバック対象とすることができる

“`
@Transactional(rollbackFor=Exception.class)
“`


#### ② @Transactionalはpublicメソッドにつけた時のみロールバック有効


#### ③ @Transactionalを付けたpublicメソッドは別クラスからの呼び出し時のみロールバック有効


#### ④ 外部トランザクションが開始している場合はそのトランザクションを利用する
  → propagationプロパティで制御。デフォルト値(PROPAGATION_REQUIRED)が外部トランザクションをそのまま利用する設定となっている


#### ⑤ @Transactionalをつけなかった場合、トランザクションは発生しない?

##### 前提
・Spring Data JPAを利用している
・RepositoryクラスはCrudRepositor

元記事を表示

Android enumではなくIntDefを使ってdata classを組み立てる

# 環境
Android Studio Arctic Fox | 2020.3.1 Patch 2
Kotlin 1.5.31

# 概要

列挙型の値を使うときに、`@IntDef`を生かしてdata classを組み立ててみます。

# なぜenumではなくIntDefを使うのか

Google I/O 19で、`Build apps for the next billion users` という動画があります。

この中の、`Reduce your app size`に挙げている項目で、`

元記事を表示

Base64.getUrlEncoderとBase64エンコード+URLエンコードは違う

## はじめに

Webシステム間で文字列をやり取りする際に、URLクエリストリングで受け渡すことにした。
その際に、受け渡し文字列を暗号化+エンコードする以下のような設計を行った。

インタフェース項目全体を1~3の順序で暗号化とエンコードを行う
1. AESで暗号化
2. Base64エンコード
3. URLエンコード

自分たちのシステムは1~3の処理がされた文字列を受け取って、デコードと複合を行う側だった。

## 発生した問題

システムテストの段階で暗号化+エンコードされた文字列を受け取ったが、デコード+複合の処理が上手くいかなかった。
具体的には、デコードで失敗していた。

## 問題発生時の実装内容

先方は、エンコード仕様の2.と3.を以下の処理で実装していた。

“`Java
Base64.getUrlEncoder().withoutPadding().encodeToString(文字列)
“`
これで出てきた文字列を受け取っていたが、当方のデコードではうまく処理できなかった。

暗号化やエンコード処理の知識も大してなく、Javaの具体的な言語仕様を把握

元記事を表示

JavaとPythonの比較

ごくごく簡単なまとめですが、JavaとPythonを比較してみました。

|項目|Java|Python|
|:———–|:———– |:———– |
| クラス | 必ず必要 | 書かなくてもいきなり処理のベタ書きでも良い |
| 変数定義時の型指定 | 必要 | 不要(動的型付け) |
| long型 | あり | なし(整数値はすべてint型でOK) |
| 複数戻り値 | 不可 | 可 |
| インデント | 任意 | 強制 |
| 空のオブジェクト | null | None |
|多重継承| 不可| 可 |
| switch文 | あり | なし |
| 定数定義構文 | あり | なし |
| if文での変数スコープ | if文内でスコープ形成する | if

元記事を表示

Java基礎編

# Java基礎編

————————————————————

## プリミティブ型
– byte型:8ビット整数 -128~127
– short型:16ビット整数 -32,768~32,767
– int型:32ビット整数 -2,147,483,648~2,147,483,647
– long型:64ビット整数 -9,223,372,036,854,775,808~9,223,372,036,854,775,807
– float型:32ビット単精度浮動小数点数
– double型:64ビット倍精度浮動小数点数
– boolean型:true or false
– char型:16ビットUnicode文字 \u0000~\uFFFF

————————————————————

## 参照型
– Object型:すべてのクラスは暗黙的にこのクラスを継承して作られる
– Byte型:8ビット整数 -128~127
– Sho

元記事を表示

2021年Spring設定備忘録

初期設定はたまにしかしないから、よく忘れる。

# Database作る
仮にdebian系でPostgreSQLを使うものとする。

“`
sudo apt install postgresql
sudo -u postgres psql
CREATE DATABASE demodb;
ALTER ROLE postgres WITH PASSWORD ‘postgres’;
“`

マイグレーションツールを使うにしてもデータベースの設定は自分でやる。

# STSを持ってきて展開する
Spring Tool Suite を https://spring.io/tools からダウンロード。
/optあたりに置くのがよいかも。

# STSを起動してプロジェクトを作る
File -> New -> Spring Starter Project
デフォルトは Maven だけど Gradle のほうが好きだ。
Jar ではなく War を選ぶとよいかも。
ミニマムだと依存関係は以下のようなものか。

– JDBC API
– Spring Data JPA
– Flyway Mig

元記事を表示

汎用デシジョンテーブルIMSが新たに追加になりました。

#はじめに
ifLinkマイクロサービスを開発している八教と申します。
新たにデシジョンテーブルにより判定して結果を送信するフィルターIMS
「汎用デシジョンテーブルIMS」が追加されましたので、紹介させていただきます。

#ifLinkとは
https://iflink.jp/

#汎用デシジョンテーブルIMSについて
IMSのデータがデシジョンテーブルに合致するか判定し、
最初に合致したデシジョンテーブルの結果を返却します。

デシジョンテーブルってなに?という方は以下参照
https://medium-company.com/%E6%B1%BA%E5%AE%9A%E8%A1%A8/

例えば入力に乗車駅、降車駅、支払いを出力するIMSがあった場合、
それらの入力を受け取ってデシジョンテーブルより運賃を算出。
算出結果をトーストに表示することができます。

IF-THEN のイメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1780474/f5ea05a6-b607-e1ff-

元記事を表示

java:5: エラー: この文字(0x98)は、エンコーディングwindows-31jにマップできません

#はじめに
はじめまして。
駆け出しJavaエンジニアです。
研修中初歩的なところで躓きまくっているので、アウトプットとして駆け出しエンジニアの方々のお力になれたらうれしいです。
環境はwindowsで、

#今回のエラーと直し方
java:5: エラー: この文字(0x98)は、エンコーディングwindows-31jにマップできません
というコンパイルエラーが発生しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1302414/7dca4bd2-f3b1-c290-e46e-9118a6484c14.png)

結論を言ってしまうとサクラエディタの文字コードが間違っておりました。
右下の文字コードのところクリックで他の文字コードに変えることができます。
デフォルト設定がUTF-8で、その部分をSJISにしたら無事コンパイルされました。

以下の@HachiwareWorks様が書いた記事のやり方でも無事コンパイルできたので、参考として張らせていただきます。

#参考にしたサイ

元記事を表示

続・GradleでCodeArtifact自動化

結論だけ読みたい人は[こっち](#利用例)

## はじめに
一応、[前回](https://qiita.com/TAC_yacht/items/eb4ca035491dc9a2b77f)それなりにコピペで済むようにはしたものの、冗長であると言わざるを得ない。
そこでプラグインにした。

## プラグインの設定

“`groovy:build.gradle
plugins {
id “io.github.tac-yacht.codeartifact-repository” version “0.1”
}
“`
ほかのプラグインも使ってるときは真ん中の行だけ追加
※“`settings.gradle“`で“`pluginManagement.repositories“`を設定してる時は“`gradlePluginPortal()“`の追加を忘れずに

ポータルで各種プラグインごとに例示されてるのと同じではある

## レポジトリの設定
3種類から選べる。

### style A
“`aws codeartifact get-repository-endpoint`

元記事を表示

OTHERカテゴリの最新記事