- 1. Javaの`Integer`クラスのキャッシュ機構とプリミティブ型の比較について
- 2. EclipseのJava実行時にjava.lang.UnsupportedClassVersionErrorが発生した場合の応急処置的対処法
- 3. json
- 4. レガシーコードにおける単体テストのハードルを乗り越える思考フロー(初心者向け)
- 5. [Google Maps Datasets API(V1)] Javaで地理空間データを利用する
- 6. (調査中)javaでhttpclientでファイルをレスポンスとして受け取る。ただし、ファイルはローカルに保存しないで別のところに渡す
- 7. Javaで「インクリメント演算子とデクリメント演算子」の動作を確認してみた
- 8. (調査中)Javaのkeytoolを使ったキーストアとトラストストアの処理(PKCSを使った例)
- 9. 直近の開発の課題と解決案(SQLとコードの一般論)
- 10. Javaのラッパークラスについて
- 11. (java gold)Set
- 12. (java gold)List
- 13. (java gold) Deque
- 14. (java gold) 並列処理
- 15. (java gold) ストリームAPIの生成
- 16. (java gold) Collector
- 17. (java gold) mapメソッド
- 18. (java gold) Comparableインタフェース
- 19. (java gold) Comparatorインターフェース
- 20. (java gold) Collectorsクラス
Javaの`Integer`クラスのキャッシュ機構とプリミティブ型の比較について
## はじめに
Javaプログラミングにおいて、`Integer`クラスのキャッシュ機構とプリミティブ型の比較は、パフォーマンスとメモリ効率に大きな影響を与える重要な概念です。本記事では、`Integer`クラスのキャッシュ機構、オートボクシング、プリミティブ型とラッパークラスの比較について見ていきます。
## コード例
以下のコードを例に、それぞれの動作を説明していきます。
“`java
class Main {
public static void main(String[] args) {
Integer a = 128;
Integer b = 128;
Integer c = 127;
Integer d = 127;
int e = 127;
int f = 127;System.out.println(a == b); // false
System.out.println(a.equals(b)); // true
EclipseのJava実行時にjava.lang.UnsupportedClassVersionErrorが発生した場合の応急処置的対処法
備忘録です。よしなに。
## はじめに
### 環境
・Pleiades (日本語化Eclipse)
### エラーメッセージ
`Exception in thread “main” java.lang.UnsupportedClassVersionError: SamplePackage/SampleClass has been compiled by a more recent version of the Java Runtime (class file version 65.0), this version of the Java Runtime only recognizes class file versions up to 52.0`### 原因
このエラーは、ビルド環境と実行環境の組み合わせの不都合によって起こるエラーです。### 解決法
Eclipseの設定内容を変更することで解消できます。## 設定
### ビルド環境の設定`ウィンドウ(W)` -> `設定(P)` の順に開いていくと、設定画面が表示されます。
設定画面左側メニューで、`J
json
“`
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.regex.*;public class Main {
public static void main(String[] args) throws Exception {
// JSON文字列の定義
String jsonString = “{\n” +
“\”apiVer1\”:\”$$(TEST_NO1)\”,\n” +
“\”apiver2\”:\”$$(
レガシーコードにおける単体テストのハードルを乗り越える思考フロー(初心者向け)
# はじめに
ついこの前、経験の浅いメンバー向けに単体テストを書きまくってもらう研修を実施したのですが、経験が浅いと「どうすれば単体テストを書ききれるか?」の見通しがうまく立てられないんだろうな~という印象を受けました。
なので、できるだけ体系立てて説明ができるように記事に残そうと思います。
# 想定読者
– 単体テスト経験の浅いメンバー(入社1~2年目くらい)
– レガシーコードの単体テストに苦手意識を持っている人# 大前提
– 前提1:とってもレガシーなコードである
– 前提2:「これでだいたいのテストは書ける、しかし良いテストかどうかは分かりません」20年物のレガシーコードなので、正直、難易度めっちゃ高いと思います。レガシーコードへの単体テストは特殊技能と言っても過言じゃないです。
また、最初から良いテストを目指さなくていいと考えています。良いテストなのかどうかを考えるのは、まず「なんでもテスト書けるぜ!」の状態を満たした後でよくて、というのはテストをいろいろ書いた経験がないとそのあとの議論が腹落ちしにくいと思うからです。
# もくじ
– [基本の思考フロ
[Google Maps Datasets API(V1)] Javaで地理空間データを利用する
Google Maps Datasets API(V1)をJavaで使ってみました。
今回の記事はAPIを利用するにあたり準備する必要があるものを記事にしました。***Maps Datasets APIとは***
独自の地理空間データをデータセットにアップロードし、
データ対象物にカスタムスタイル設定を適用して地図に表示できます。点、ポリライン、ポリゴンのジオメトリに基づいてデータを可視化したり、
データ対象物をクリックイベントに反応させたりできます。|No|||目次|
|—|—|—|—|
|1|||[Maps Datasets APIを使用するための準備](#1-maps-datasets-apiを使用するための準備)|
||1||[プロジェクトの作成](#11-プロジェクトの作成)|
||2||[Maps Datasets APIの設定](#12-maps-datasets-apiの設定)|
||3||[APIを使用するためのキー取得](#13-apiを使用するためのキー取得)|
|||1|[サービス アカウント](#131-サービス-アカウント)|
|
(調査中)javaでhttpclientでファイルをレスポンスとして受け取る。ただし、ファイルはローカルに保存しないで別のところに渡す
JavaでHttpClientを使用して、ファイルをレスポンスとして受け取り、ローカルに保存せずに別の場所(例えば別のURLにPOSTする)に渡すには、以下の手順を踏みます。具体的には、最初のリクエストで取得したレスポンスのバイトデータを直接次のリクエストに使用します。
以下に具体的なコード例を示します。
“`java
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.http.HttpRequest.BodyPublishers;
import java.io.IOException;
import java.nio.ByteBuffer;public class HttpClientRelayWithoutFile {
public static void main(String[] args) {
// 最初のリクエストの
Javaで「インクリメント演算子とデクリメント演算子」の動作を確認してみた
# 概要
Javaで「インクリメント演算子とデクリメント演算子」の動作を確認してみました。
以下のページを参考にしました。https://www.javadrive.jp/start/ope/index6.html
# 実装
以下のファイルを作成しました。
“`JSample6_1.java
class JSample6_1{
public static void main(String[] args){
int num = 5;num++;
System.out.println(num);num–;
System.out.println(num);++num;
System.out.println(num);–num;
System.out.println(num);
}
}
“`以下のコマンドを実行しました。
“`
$ java JSample6_1
6
5
6
5
“`# まとめ
何かの役に立てばと。
(調査中)Javaのkeytoolを使ったキーストアとトラストストアの処理(PKCSを使った例)
PKCS(Public-Key Cryptography Standards)を使用した例を見てみましょう。特に、PKCS#12フォーマットを使ってキーストアとトラストストアを管理し、JavaでのSSL通信に利用する方法を説明します。
## 基本概念
#### キーストア (Keystore):自分の証明書と秘密鍵を格納するための場所です。
クライアント認証を行う際に、自分自身を証明するために使用します。#### トラストストア (Truststore):
信頼できる証明書、特にサーバーの証明書や証明書を発行する認証局 (CA) の証明書を格納します。
サーバーとの通信を確立する際に、サーバーの証明書が信頼できるかどうかを検証するために使用します。
## PKCS#12のキーストアとトラストストアの作成#### 1. キーストアの作成
OpenSSLを使って秘密鍵と証明書を生成:“`sh
openssl req -newkey rsa:2048 -nodes -keyout client-key.pem -x509 -days 365 -out client-ce
直近の開発の課題と解決案(SQLとコードの一般論)
# 1. 前段
とあるIT企業に所属していて、Java(Springboot)+Mybatis+MySQLで新しいシステムを立ち上げました。私自身は、プロジェクトマネージャーで必要な業務要件を理解しつつ、コードも書けるタイプです。(ただし、Springbootのフレームワークはあまり詳しく無いため、詳しい人に助けてもらいながら開発してきました。)そして今現在、システム稼働から1年以上経過したところで、気づいたら技術負債がかなりたまってしまいました。
私としても失敗して初めて気づいたこともあったので、将来同じ失敗をしないために、ここにメモをします。なお、あまり特定の技術には偏っておらず、SQLとコードの一般的な内容ばかりです。もし気づいたことや意見があれば、コメントいただけると助かります!
# 2. 「とりあえず」で作ってしまったけど必要なかった
## (1) 削除フラグ(関連:SQLアンチパターン幻の第26章)
### 課題
参考のスライド内でもいろいろ書かれているが、私が困ったのは主に以下の2点。
– SELECT時に削除フラグをWHERE条件内に書き忘れる。結局、シス
Javaのラッパークラスについて
## はじめに
Javaのラッパークラスは、基本データ型(プリミティブ型)をオブジェクトとして扱うためのクラスです。これらのクラスは、Javaのコアライブラリで提供されており、プリミティブ型をオブジェクトとして使用する必要がある場合に役立ちます。この記事では、ラッパークラスの概要、各ラッパークラスの説明、使用方法、オートボクシングとアンボクシング、そしてラッパークラスの利点と欠点について見ていきます。## ラッパークラスの概要
Javaには、次の基本データ型があります:
– `byte`
– `short`
– `int`
– `long`
– `float`
– `double`
– `char`
– `boolean`これらの基本データ型には、それぞれ対応するラッパークラスがあります:
| プリミティブ型 | ラッパークラス |
| ————– | ————– |
| `byte` | `Byte` |
| `short` | `Short` |
| `int`
(java gold)Set
## Set
* 重複した要素を含むことができないコレクション
* 順序があるとは限らない* Setを継承したクラス
1. `HashSet`: 値の重複を許さない順不同の要素集合を扱います
2. `TreeSet`: 値の重複を許さないソートされた要素集合を扱いま## Setのメソッド
### 追加
| メソッド名 | 概要 |
|:–|:–|
set.add(o) | オブジェクト o を配列の末尾に追加する### 削除
| メソッド名 | 概要 |
|:–|:–|
set.remove(o) | オブジェクト o にマッチする要素を削除する
| set.clear() | 配列をクリアする |### 取得
:::note warn
メソッドは用意されていない
:::### 要素数
| メソッド名 | 概要 |
|:–|:–|
|`list.size()` | 要素の個数を得る|
(java gold)List
## List
* 順序付けられたコレクション。重複した要素を含むことができる、ユーザーは要素を挿入する場所やインデックスによって要素にアクセスすることを正確に制御できる
* Listはインターフェースなのでインスタンは生成できない
* Listのメリットはコレクション(データ型)に変更したい場合、宣言時に手を加えなくていい
* ListのデメリットはArrayListにしかメソッドがないときにキャストしなければならない
* Listは以下のクラスで実装されています
1. `ArrayList`: 配列を扱う一般的なクラス
2. `LinkedList`: 要素がどのように並んでいるか別で管理しているために要素を削除したり追加する場合にArrayListよりも高速に動作するが、要素を順にたどるため検索などはArrayListよりも遅くなる
3. `Vector` : ArrayList や LinkedList と同じように扱うことができますが、同期をとるためパフォーマンスが悪い(スレッドセーフ)
4. Stack
(java gold) Deque
## Deque
* 後に入れたデータを先に取り出す仕組みのLIFO(Last In First Out)を使うためのもの
* 先に入れたものを先に取り出す仕組みはキュー(Queue)、FIFO(First In First Out)と呼ばれます
* Dequeの実装クラスは
1. `ArrayDeque`: 挿入、削除、取得を両端でしか行わない場合、ArrayDequeのほうが高速に動作
1. `LinkedList`: 配列の中間にアクセスする場合(containsやindexOfなど)は、LinkedListのほうが速い### 追加
| メソッド名 | 概要 |
|:–|:–|
| queue.addFirst(o) | oをデックの先頭に追加する(エラー時は例外を返す)
| queue.addLast(o) | oをデックの最後に追加する(エラー時は例外を返す) |
queue.offerFirst(o) | oをデックの先頭に追加する(エラー時はfalseを返す)
queue.offerLast(o) | oをデックの最後に追加する(エラー時はfa
(java gold) 並列処理
## スレッド
* `スレッド`とはプログラムを実行した場合の最小単位
* プログラムの実行単位を複数のスレッドに分割して実行することを`マルチスレッド`
* スレッドの制御には`java.lang.Threadクラス`と`java.lang.Runnableインターフェース`を使用## スレッドの実行
* Runnable.run()メソッド
* Thread.start()メソッド
* start()メソッドの中ではオーバーライドしたrun()メソッドの呼び出しを行っている:::note warn
スレッド処理の開始はstart() メソッドだが
(run()メソッドを直接呼び出してもスレッドは開始されない)
:::## スレッドの優先度
* 優先度を取得・設定するメソッド| メソッド名 | 概要 |
|:–|:–|
| static Thread currentThread| 現在実行中のスレッドオブジェクトを取得する |
| final String getName() | スレッドの名前を返す |
| final int getPriority
(java gold) ストリームAPIの生成
## ストリームAPI(StreamAPI)
* 繰り返し処理をサポートするライブラリ
* コレクション、配列、ファイルなどのデータの集合(データソース)から要素を取り出し処理の流れ(Stream)に引き渡す。* `中間処理` : 戻り値はStream
* `終端処理` : 終端処理のタイミングでうとりーむ一連の処理が実行される
* メソッドチェーン : ストリーム生成から中間処理/終端演算子.演算子で連結できる## リスト・マップ
“`java
//リスト
var list = new ArrayList(
Arrays.asList(“ant”, “elephant”, “hamster”));
list.stream()
.forEach(System.out::println);
// 並列処理
list.parallelStream().forEach(System.out::println);//マップ
var map = new
(java gold) Collector
## Collector
ストリームのリダクション操作のためのインターフェースであり、処理途中のオブジェクトを適切に扱うことができる。
“`java
public interface Collector{
Supplier supplier();
BiConsumer accumulator();
BinaryOperator combiner();
Function finisher();
Setcharacteristics();
}
“`
* T : ストリームないの要素の型
* A : 処理途中の値を保持するためのオブジェクト
* R : 最終結果の型
* supplier() : 処理途中の値を保持するためのオブジェクトを生成する
* accumulator() : 具体的に実行したい処理を記述したBiConsumer型のラムダ式を返す
* combiner() : 二つの部分結果を結合する(並行処理時に使用される)
* finisher
(java gold) mapメソッド
## map
* ストリーム内の要素を別の値に変更する際に使用
* 基本的な構文は以下の通りである“`java
stream.map(function)
“`* stream : 元のストリームを表す
* map()メソッド : Function型の引数を受け取る
* function : 各要素を変更するための関数“`java
Listnumbers = Arrays.asList(1, 2, 3, 4, 5);
ListdoubledNumbers = numbers.stream()
.map(number -> number * 2)
.collect(Collectors.toList());
“`numbersという整数のリストを作成し、mapメソッドを使って各要素を2倍に変換している。この場合、ラムダ式number -> number * 2がFunctio
(java gold) Comparableインタフェース
## Comparableインターフェースとは
下記はAPIドキュメント
>public interface Comparable
このインタフェースを実装する各クラスのオブジェクトに全体順序付けを強制します。この順序付けはクラスの自然順序付けと呼ばれ、このクラスのcompareToメソッドは自然比較メソッドと呼ばれますJavaのクラスが自然な順序付けをサポートするために実装するインタフェースである。自然な順序付けとは、オブジェクト間の大小関係を定義することを意味する。
位置付けとしてはクラス(オブジェクト)の共通メソッドであるがequalsやtoStringなどと違い、他と違ってComparableはObjectには宣言されていない。
必要に応じてクラス作成時に実装し、抽象メソッドであるcompareTo()メソッドをオーバーライドしなければならない。このメソッドは、自身のオブジェクトと引数として与えられた他のオブジェクトとの比較結果を返す
:::note warn
Comparableを実装せずに自然順序付けに従ってソート実行しようとすると”ClassCastExcep
(java gold) Comparatorインターフェース
## Comparator
APIドキュメントより
>オブジェクトのコレクションで全体順序付けを行う比較関数です。コンパレータ(Comparator)をソート・メソッド(Collections.sortやArrays.sortなど)に渡すと、ソート順を正確に制御できます。また、コンパレータを使用すると、sorted sets (ソート・セット)やsorted maps (ソート・マップ)などの特定のデータ構造の順序を制御したり、natural ordering (自然順序付け)を持たないオブジェクトのコレクションに順序付けを提供したりすることもできます。Javaのクラスがオブジェクトの比較方法をカスタマイズするために実装するインタフェースである。主な目的は、自然な順序付けが定義されていないクラスのオブジェクトを比較するために使用される。
### Compararのメソッド* compare(T o1, T o2)
順序付けのために2つの引数を比較します。* 負の整数:
o1 は o2 よりも小さいと判断される。
* 0:
o1 と o2 は等しいと判断される。
(java gold) Collectorsクラス
# Collectorsについて
下記APIリファレンスより
>要素をコレクションに蓄積したり、さまざまな条件に従って要素を要約するなど、有用な各種リダクション操作を実装したCollector実装。# 主なメソッド
* 集約
| メソッド名 | 概要 |
|:–|:–|
|toList()|要素をリストに集約する|
|toSet() |要素をセットに集約する|
|toMap()|キーと値のペアに要素を集約する|* グループ化
| メソッド名 | 概要 |
|:–|:–|
|groupingBy()|指定したキーで要素をグループ化する|
|partitioningBy()|指定した条件に基づいて要素をパーティション分割する|* 変換
| メソッド名 | 概要 |
|:–|:–|
|mapping() | 要素を指定した関数によって変換する|
|reducing()|要素をリダクション(まとめる)操作によって変換する|* 統計
| メソッド名 | 概要 |
|:–|:–|
|summarizingXxx()|指定した数値型の統計情報を収集|
|av