- 1. サロゲートペアについて【Java】
- 2. Javaのパーマネント領域(PermGen)について
- 3. Javaで「単項マイナス演算子」の動作を確認してみた
- 4. Spring Boot において application.properties を環境ごとに切り替える
- 5. JSONAssertsを用いたJson比較、一部分だけ比較しないメモ
- 6. Spring Batchのフォールトトレランスで無限ループが発生する話
- 7. Amazon Cognitoの認証をSDKにより連携する
- 8. 同じJavaロジックなのに違う環境で違う動きがした話
- 9. ABC354A~Fの解答[Java]
- 10. ABC353A~E、Gの解答[Java]
- 11. ABC352A~Fの解答[Java]
- 12. コード内のエラー箇所特定のための、原因切り分け法のメモ
- 13. JavaでMarkdown形式をWord文書やPDF形式に変換する方法
- 14. [Google Address Validation API(V1)] Javaで住所を検証して結果をフィードバックする
- 15. JavaでLRUキャッシュの実装
- 16. Javaのスレッドモデル:グリーンスレッドモデル・ネイティブスレッドモデル・M:Nモデル
- 17. テストコードの書き方分からんくなったのでまとめてみる(概要,Repository)
- 18. [Google Address Validation API(V1)] Javaで住所を検証する
- 19. (調査中)HttpClientおよびWebClientを使用して、メソッドの引数でHTTPメソッドを切り替える例
- 20. Javaで「算術演算子」の動作を確認してみた
サロゲートペアについて【Java】
## はじめに
サロゲートペア(サロゲートペア文字、Surrogate Pair)は、Unicode文字を扱う際に重要な概念です。特に、多言語対応や絵文字の処理が必要な場合に知っておくべき知識です。
## Unicodeとサロゲートペアの基本
### Unicodeの基本
Unicodeは、世界中の文字や記号を一貫して表現するための標準です。各文字には一意のコードポイントが割り当てられており、通常は16ビット(2バイト)で表現されます。しかし、すべての文字を16ビットで表現するには限界があり、基本多言語面(BMP、Basic Multilingual Plane)に収まらない文字も存在します。
### サロゲートペアの必要性
BMPには、U+0000からU+FFFFまでの65,536個のコードポイントが含まれています。しかし、Unicodeにはそれを超えるコードポイントが必要です。そこで、U+10000からU+10FFFFまでのコードポイントを表現するために、サロゲートペアが導入されました。
サロゲートペアは、2つの16ビットのコードユニットを組み合わせて1つの文字を表現
Javaのパーマネント領域(PermGen)について
## はじめに
Javaのメモリ管理にはさまざまな領域があります。その中でも、パーマネント領域(Permanent Generation、通称PermGen)は特に重要です。
## PermGenの役割
パーマネント領域(PermGen)は、Javaヒープの一部で、以下のような永続的なデータを保存するために使用されます。
– **クラスメタデータ**: クラスのロード時にJVMによって生成されるメタデータ。クラスのバイトコード、メソッド情報、フィールド情報などが含まれます。
– **インターナの文字列プール**: `String`クラスのインターナ文字列(`interned strings`)。
– **静的変数**: クラスの静的変数もPermGenに保存されます。## PermGenの構造
PermGenはヒープ領域とは異なり、Garbage Collection(GC)による管理が複雑です。通常のヒープ領域が若い世代(Young Generation)と老いた世代(Old Generation)に分かれているのに対し、PermGenは以下の2つの領域で構成されます。
Javaで「単項マイナス演算子」の動作を確認してみた
# 概要
Javaで「単項マイナス演算子」の動作を確認してみました。
以下のページを参考にしました。https://www.javadrive.jp/start/ope/index2.html
# 実装
以下のファイルを作成しました。
“`JSample2_1.java
class JSample2_1{
public static void main(String[] args){
int num = 10;System.out.println(+num);
System.out.println(-num);
}
}
“`以下のコマンドを実行しました。
“`
$ javac JSample2_1.java
$ java JSample2_1
10
-10
“`# まとめ
何かの役に立てばと。
Spring Boot において application.properties を環境ごとに切り替える
## application.properties とは?
Java のフレームワークである Spring Boot で設定情報をキーバリュー形式で記載できるファイルのこと。__この設定情報は JVM のシステムプロパティとして設定される。__“`properties:application.properties
sample.properties=sample
“`
“`java:java sample
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;@Component
public class SampleApplication {
private final Environment env;
public DemoApplicationRunner(Environment env) {
this.env = env;
}public String sample() {
JSONAssertsを用いたJson比較、一部分だけ比較しないメモ
## JSONAssertsで遊ぶ
“` java
import org.json.JSONException;
import org.junit.jupiter.api.Test;
import org.skyscreamer.jsonassert.JSONAssert;
import org.skyscreamer.jsonassert.CustomComparator;
import org.skyscreamer.jsonassert.JSONCompareMode;
import org.skyscreamer.jsonassert.comparator.Customization;public class JsonComparisonTest {
@Test
void test_01() throws JSONException {
// language=json
String expect = “{ \”time\” : {\n” +
” \”insertTime\”: \”20
Spring Batchのフォールトトレランスで無限ループが発生する話
### 結論
以下のページの一番最後に記載がある通り、「ItemProcessorはべき等になるように実装する必要がある」という話です。https://spring.pleiades.io/spring-batch/reference/processor.html
### 起きたこと
Spring Batchで次のような実装をしたところ、無限ループが発生しました。※事象を再現するための簡略化した処理です
“`DemoBatchProcessor.java
@Component
public class DemoBatchProcessor implements ItemProcessor{ @Override
public MstUser process(MstUser item) throws Exception {
LocalDateTime now = LocalDateTime.now();
item.setExpireDate(now);
return item;
}}
“`
“`DemoBatch
Amazon Cognitoの認証をSDKにより連携する
# はじめに
Amazon Cognitoをアプリケーション側のSDKにより認証認可を実現する。
はじめてCognitoもSDKも実装するため不備があるかもしれませんが、少しでも参考になればと思います。# 自己紹介
私は、15年間航空自衛隊で働いた後にエンジニア転向した30代あちこち痛い系エンジニアです。SES企業に所属しています。主言語はJavaでバックエンドエンジニアとして働いています。AWSも少し業務で触れることが増えていますのでインフラの技術も習得したいと考えています。将来的にGolangを習得して、マイクロサービスの開発現場に入りたいと思っています。あとは、最近SPAのフロント技術にはまっています。暇さえあれば技術について調べることが趣味になっています。# 概要
最近、社内のプロジェクトでAWSを使用したインフラも含めた開発をすることになったため、勉強のために調べた内容等を一方的に共有したい。
Cognitoの技術は今回の投稿では完結できないほど奥が深いものとなっていますので限定的になりますがご容赦ください。# Amazon Cognitoとは
認証情報を登録、承
同じJavaロジックなのに違う環境で違う動きがした話
最近XML変換関連のJavaロジックを修正する時に、違う環境で違う動きをしたことがありました。
主に2つの問題に遭遇し、色々調査して結構勉強になりました。
この文章で問題解決した経緯を紹介したいと思います。# ケース1: TransformerFactory
## 事象
XML Documentをbytesやstringに変換するため、TransformerFactoryを使っています。
実装の中に以下の一文があります。“` Java
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
“`
こちらの1文は特に修正していませんが、環境が変わることによってXMLの結果の差異はありました。
修正後のXMLにstandalone=”no”が出るという差分です。## 調査
なんで?と思い、TransformerFactoryなどに何が入っているのか調べました
ABC354A~Fの解答[Java]
## はじめに
今回はコンテスト中にEまで、コンテスト後にFを解いたのでそれを載せようと思います。なお、僕のライブラリは[提出結果](https://atcoder.jp/contests/abc354/submissions?f.Task=&f.LanguageName=Java&f.Status=AC&f.User=viral)よりご確認ください。
では、見ていきましょう。## A – Exponential Plant
問題文は[こちら](https://atcoder.jp/contests/abc354/tasks/abc354_a)問題文の通りに愚直に求めました。
“`A.java
final class Main{
private static final boolean autoFlush = false;
private static final SimpleScanner sc = new SimpleScanner(System.in);
private static final SimpleWriter out = new SimpleWri
ABC353A~E、Gの解答[Java]
## はじめに
今回はコンテスト中にF以外を解けたので、それを載せようと思います。なお、僕のライブラリは[提出結果](https://atcoder.jp/contests/abc353/submissions?f.Task=&f.LanguageName=Java&f.Status=AC&f.User=viral)をご確認ください。
では、見ていきましょう。## A – Buildings
問題文は[こちら](https://atcoder.jp/contests/abc353/tasks/abc353_a)愚直にループを回して探しました。
“`A.java
final class Main{
private static final boolean autoFlush = false;
private static final SimpleScanner sc = new SimpleScanner(System.in);
private static final SimpleWriter out = new SimpleWriter(System.out,au
ABC352A~Fの解答[Java]
## はじめに
今回はコンテスト中にEまで、コンテスト後にFを解いたのでそれを載せようと思います。なお、僕のライブラリは[提出結果](https://atcoder.jp/contests/abc352/submissions?f.Task=&f.LanguageName=Java&f.Status=AC&f.User=viral)をご確認ください。
では、見ていきましょう。## A – AtCoder Line
問題文は[こちら](https://atcoder.jp/contests/abc352/tasks/abc352_a)条件を数式に落とし込むと$\min(X,Y)
コード内のエラー箇所特定のための、原因切り分け法のメモ
こんにちは、へっぽこエンジニア見習いです。
この記事は、自分が500エラー(internal サーバーエラー)に悩まされていた時に、部署内で一番伸びしろのある最若手の子が教えてくれたやり方をメモったものです。
あくまでもメモなのでめっちゃ短いです。
以下本文1,原因切り分けの方法の一つとして、いったんプロジェクト内の、
たとえばJavaファイルをパッケージごとバックアップとった上、
一旦削除、2,その後、「一つづつファイルを戻し、サーバ起動」を繰り返し、原因ファイルを特定する。
3,原因ファイルが特定出来たら、次は「ファイル内の怪しい部分(例えば@(アノテーション部))を一旦コメントアウトし、
サーバ起動できるかか確認」、を繰り返す。(→コメントアウトすると、正常に動く部分があれば、そこが原因と特定できる!)
JavaでMarkdown形式をWord文書やPDF形式に変換する方法
Markdownは、シンプルさと使いやすさから、プレーンテキストドキュメントの作成や編集に人気があります。しかし、ドキュメントをプロフェッショナルに共有したり、オフラインで使用するために印刷したりする場合など、より洗練されたプレゼンテーションが必要な場合があります。MarkdownをWordとPDF形式に変換することで、ユーザーは書式設定オプションを強化し、さまざまなプラットフォーム間での互換性を確保し、視覚的に魅力的でプロフェッショナルなドキュメントを作成することができます。この記事では、**Javaを使用してMarkdown形式をWordとPDFの両方の形式に変換する方法**について説明します。
– **[Javaを使用してMarkdownファイルをWordドキュメントに変換する](#javaを使用してmarkdownファイルをwordドキュメントに変換する)**
– **[Javaを使用してMarkdownファイルをPDFファイルに変換する](#javaを使用してmarkdownファイルをpdfファイルに変換する)**
– **[結果のドキュメントのページ設定をカスタマイズする
[Google Address Validation API(V1)] Javaで住所を検証して結果をフィードバックする
Google Address Validation API V2(Java)を使用して、
住所を検証する方法についてご紹介します。住所を検証後、検証した結果のフィードバックを送ります。
:::note info
APIを利用する環境の準備から始める場合や、コードを実行する際は、
[⧉[Google Address Validation API(V1)] Javaで住所を検証する](https://qiita.com/doran/items/dd61bae1e674e8958a97)
を参照ください。
:::|No||目次|
|—|—|—|
|1||[住所を検証](#1-住所を検証)|
||1|[スコープ](#11-スコープ)|
||2|[実行](#12-実行)|
||3|[レスポンスの内容](#13-レスポンスの内容)|
|2||[検証結果をフィードバック](#2-検証結果をフィードバック)|
||1|[スコープ](#21-スコープ)|
||2|[実行](#22-実行)|
||3|[レスポンスの内容](#23-レスポンスの内容)|## 1. 住所を検証
指定し
JavaでLRUキャッシュの実装
# LRUキャッシュの実装
LRU (Least Recently Used) キャッシュは、最近使用されていないデータを優先的に削除することでメモリの効率を高めるキャッシュアルゴリズムです。これは、高度なシステム設計において、メモリとディスクストレージの間でデータアクセスの速度差を埋めるために使用されます。
## メモリとストレージの基本
– **メモリ (RAM)**:
– **速い**: データアクセスが非常に高速
– **小さい**: 容量が限られている
– **高い**: コストが高い
– **揮発性**: 電源を切るとデータが消える– **ディスクストレージ (SSD)**:
– **大容量**: 容量が大きい
– **安い**: コストが低い
– **永続性**: 電源を切ってもデータが残る
– **遅い**: メモリに比べてデータアクセスが遅い### 速さの違い
– **メモリ**: 非常に高速、例:50ナノ秒
– **SSD**: メモリより遅い、例:50マイクロ秒(メモリの1000倍遅い)### キャッシュの必
Javaのスレッドモデル:グリーンスレッドモデル・ネイティブスレッドモデル・M:Nモデル
## 前提知識
– Javaのスレッド処理にはJavaスレッドとOSスレッドの二種類が存在する
– Javaスレッド
– JVM内で生成されるスレッド
– java.lang.Threadクラスで生成する
– Javaスレッド自体は処理を実行しない
– OSスレッド
– OSが管理するスレッド
– Javaスレッドとマッピングされ、Javaアプリの処理を実行する## グリーンスレッド
グリーンスレッドモデルでは、JavaスレッドとOSスレッドがN対1で紐づきます。
OS側が1なので、シングルコアCPUに適したモデルです。Java 1.0がリリースされた頃、CPUはシングルコアの時代でした。
CPUのコア数については以下記事が一番わかり易いと思ってます。
https://www.pc-koubou.jp/magazine/23926
CPUのコアを厨房のシェフに例えると、
– クロック数・・・シェフ1人あたりの仕事の速さ
– コア数・・・シェフの人数
– スレッド数・・・シェフ1人が利用するコンロ数と言えます。
## ネイテ
テストコードの書き方分からんくなったのでまとめてみる(概要,Repository)
# 背景
久方ぶりにJavaとSpringを触る機会がやってきて、基礎的な所を忘れているなぁとか分からんなぁと思いながら騙し騙しやっています。保守のしやすさを保つためにテストコード書けるのは必須だよなぁと思って勉強してたのですが、
まぁ色んな書き方のパターンがあって覚えきれないなぁと思ったのでこの際少しずつ勉強していこうかと思います。# 参考書籍
– テスト構造
– ユニットテスト
– Repositoryのテスト
– (飽きちゃったので続きはまたそのうち別の記事でも)# Springのテストサポート機能
Spring FrameworkやSpringBootではアプリケーションのテストをするときに役立つ機能(ユーティリティ,アノテーション)が用意されてます。
下記にあるように`spring-boot-starter-test`を導入すると様々なテスト系のライブラリを導入することができます。
https://spring.pleiades.io/spring-boot/docs/current
[Google Address Validation API(V1)] Javaで住所を検証する
Google Address Validation API(V1)をJavaで使ってみました。
今回の記事はAPIを利用するにあたり準備する必要があるものを記事にしました。***Address Validation APIとは***
デベロッパーは住所の正確性を検証できます。
住所が指定されると、解析された住所の各要素の正確性に関する情報、ジオコード、
解析された住所の配送可能判定の結果が返されます。残念ながら執筆時点では[日本の住所には対応していないようです。](#3-対応している地域国)
|No|||目次|
|—|—|—|—|
|1|||[Address Validation APIを使用するための準備](#1-address-validation-apiを使用するための準備)|
||1||[プロジェクトの作成](#11-プロジェクトの作成)|
||2||[Address Validation APIの設定](#12-address-validation-apiの設定)|
||3||[APIを使用するためのキー取得](#13-apiを使用するためのキー取得
(調査中)HttpClientおよびWebClientを使用して、メソッドの引数でHTTPメソッドを切り替える例
## HttpClientを使用した例
HttpMethodの引数で分岐する方法を示します。
“`java
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;public class HttpClientExample {
public static void main(String[] args) {
HttpHeaders headers = new HttpHeaders();
hea
Javaで「算術演算子」の動作を確認してみた
# 概要
Javaで「算術演算子」の動作を確認してみました。
以下のページを参考にしました。https://www.javadrive.jp/start/ope/index1.html
# 実装
以下のファイルを作成しました。
“`JSample1_1.java
class JSample1_1{
public static void main(String[] args){
System.out.println(“10 + 4 = ” + (10 + 4));
System.out.println(“9 – 2 = ” + (9 – 2));
System.out.println(“3 * 8 = ” + (3 * 8));
System.out.println(“7 / 3 = ” + (7 / 3));
System.out.println(“7 % 3 = ” + (7 % 3));System.out.println(“10.1 + 4.3 = ” + (10.1 + 4.3));
System.ou