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

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

正規表現の可読性を上げたい

## はじめに
記事本編は[通常の正規表現](#通常の正規表現)からです。最初が長いので興味ない方は飛ばしてください。

Javaでアプリを開発しています。
その際に, コマンド的なものを実装しようと思いました。

“`
COMMAND
“`
的な感じです。
この時に構文解析を行うために, 正規表現を用いようと思いました。

Javaも正規表現もたいして触ってないのでなにか訂正補足等してもらえるとありがたいです。

## どうして正規表現なのか

個人的には過去に構文解析器をC++で実装したことがあるので, これでも全然よかったのですが,

– コマンド機能はたいして重要な機能ではなく, 文法も簡単なので, そこまで時間をかけたくない。
– 学校友達と開発するので, できるだけ慣れ親しんだ技術にしたい。

以上の理由から今回は正規表現で実装することにしました.

## 正規表現の難点

正規表現ですが, とにかく読みにくいです。例えば,
“`
(\\d{4})-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])T([01

元記事を表示

【JavaGold】ReentrantLockクラス

## 概要
[`synchronized`](https://qiita.com/knmbpc/items/48bdab0f3c8e7b070ec1)による排他制御や[`atomic`パッケージのクラス](https://qiita.com/knmbpc/items/e06ff3e81e77d65647fd)では実現できない、複数のメソッドにまたがる排他制御を実現できる。

## 特徴

– スレッドセーフであり、複数のスレッドから同時にアクセスされても、正しくロックを制御する。
– 排他的なロック(獲得できるのは1つのスレッドだけ)を提供する。ロックを獲得したスレッドだけが保持し、他のスレッドはロックの解放を待つ必要がある。
– 同じスレッドがロックを再帰的に獲得(スレッドがすでにロックを保持している場合、再度ロックを獲得)することができる。

## 主なメソッド

– `lock()`:ロックを獲得する。
他のスレッドが既にロックを保持している場合は、呼び出し元のスレッドはロックの解放を待機する。同じスレッドが再帰的にロックを獲得することも可能。

– `unlock()`:ロック

元記事を表示

【JavaGold】CopyOnWriteArrayListクラス

## 概要
`java.util.concurrent`パッケージに含まれるクラスであり、スレッドセーフ[^1]なコレクションである。
[^1]:正しく排他制御され、複数のスレッドから同時に利用されても競合やデッドロックなどが起こらないこと。

#### 特徴

このリストは、他のスレッドが要素を変更しても、読み取り操作を行うスレッドには影響を与えない。要素の追加、削除、および更新が必要な場合、新しいコピーが作成され、変更が行われる。
このため、読み取りと書き出しを同時に行なっても、`ConcurrentModificationException`が発生することはない。

##### 例

“`java
import java.util.concurrent.CopyOnWriteArrayList;

public class CopyOnWriteArrayListExample {
public static void main(String[] args) {
CopyOnWriteArrayList list = new CopyOn

元記事を表示

【JavaGold】atomicパッケージのクラス

## 主なクラス
`java.util.concurrent.atomic`パッケージには主に以下のクラスが含まれている。

– `AtomicBoolean`:`boolean`型の値の操作を提供するクラス
– `AtomicInteger`:`int`型の操作を提供するクラス
– `AtomicLong`:`long`型の操作を提供するクラス
– `AtomicReference`:オブジェクト参照の操作を提供するクラス

これらのクラスは、複数のスレッドが同時にアクセスする可能性があるデータを扱う際に使用される。それぞれのクラスは、値の読み書きの原子性[^1]を保証するためのメソッドや操作を提供し、スレッドセーフな状態でのデータの更新を可能にする。

[^1]:分離できない(してはいけない)性質のこと。一連の処理が完全に終わるか、全く実行されないかのどちらかになるよう結果が保証されていなければならない性質を表す。

## 各クラスの主な共通メソッド
– `get()`:値を取得する。
– `set()`:値を設定する。
– `compareAndSet()`:現在の値と指定した期

元記事を表示

JavaでCSVファイルを読み込む(気象庁のデータから最高気温を記録した日を調べる)

### 前置き
暑すぎる毎日たまーに風が吹くと天に向かって感謝します。

今回は前回の続きで読み込んだデータから最高気温を記録した日付と最高気温をコンソール出力してみました!
※JavaGoldの資格範囲からちょっぴり脱線します。

### 取得したデータを再確認
取得方法は前回投稿した通りです。
1~6行目までは列名など不要なデータです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3484672/1558ffe4-3603-122a-4f99-921cf8b6982d.png)

今回はデータの中で名古屋に絞って最高気温を記録した日を出力してみました。

「え、岡崎もやれよって?」

「すいません、忙しいからさぼりました(´;ω;`)」

### プログラム
前回から特に変わったことはしていません。
今頭の中にある知識だけでソース組んでみました。

「きっと世の中にはもっとティピカルな方法があるんだろうなー…」
(最近、会社のすごい人がティピカルってよく使うから使ってみた笑)

元記事を表示

Nullをなくし、エラーから解放されよう

Nullを返すか、あるいはNullを受け取ることがどれほど危険であるかはよく知られています。Nullに関するエラー、Javaにおける最も一般的なエラーの一つであり、コードを混乱させ、バグを引き起こし、デバッグに時間を奪います。だからこそ、Nullの問題を解決し、Null安全なコードを書くべきです。

## 1. Null安全の重要性

Null安全はプログラムの信頼性と保守性を向上させます。Nullを許容すると、エラーがコードのどこかで発生しやすくなり、それを特定するのが難しくなります。Null安全を実現することで、これらのエラーが発生する可能性を大幅に減らすことができます。

## 2. Nullを返す、渡す処理の避け方

Nullを返すメソッドやNullを渡す呼び出しを使用すると、それを呼び出すコードは常にNullチェックを行わなければならず、コードが複雑になります。その代わりにJava 8から導入された`Optional`クラスを利用することで、Nullを明示的に扱うことができます。

`Optional`クラスは、存在しない可能性のある値をモデル化するためのコンテナです。それ

元記事を表示

GitHub Copilot検証 詳細

サブライムコンサルティングの大塚です。
本記事は以下の記事の一部となっています。
[GitHub Copilot検証](https://qiita.com/sublime_otsuka/items/fb27bb3a882673b97745)

検証の目的や対象範囲、開発環境、言語/フレームワークなどについては上記を参照ください。

# 検証概要

GitHub Copilotを使って、WebAPIサーバアプリケーションの開発が効率化できる検証します。

## 構築するアプリ

今回開発するアプリの仕様は以下の通りです。

* 商品情報を管理するシステムのAPIサーバ
* 開発するAPIは以下の一つのみ
– リクエストとしてIDを受け取り、商品情報を管理するテーブルからIDをキーに商品データを1件取得して、商品名をレスポンスとして返却
– 商品情報を管理するテーブルは商品マスタ(m_item)
– メソッドはGET
– パスは/api/item/(商品ID)
– 異常系は考慮しない

商品マスタの定義は以下の通り。

| カラム名

元記事を表示

GitHub Copilotの概要

サブライムコンサルティングの大塚です。
今回はGitHub Copilotの概要についてまとめてみました。

# GitHub Copilotとは

GitHub Copilotは、AIを使用してプログラミングを支援してくれるツールです。自然言語で指示を出して、ソースコードを提案してくれます。

GitHub CopilotはChatGPT等で有名なOpenAIによって作成された生成的AIモデル`Codex`を使用しています。
`Codex`はGitHubをはじめ一般に公開されているソースコードや自然言語テキストを入力して事前に学習されたコーディングに特化したモデルです。
GitHub Copilotはクラウド上にある`Codex`に対してユーザーから受け取った自然言語による指示を送信し、指示に従ったソースコードを受信して、ユーザーに提案します。

ただし、`Codex`は`GPT-3`をベースとしており、少し古いモデルです。
`Codex`の[公式サイト](https://platform.openai.com/docs/guides/code)でも`De

元記事を表示

GitHub Copilot検証

# はじめに

サブライムコンサルティングの大塚です。

弊社[サブライムコンサルティング](https://www.sublimecons.com/)では、ITコンサルティングに加えて、受託開発、サービス開発を行っています。

受託開発、サービス開発事業においてより品質の高いサービスを提供するために、システム開発の生産性や品質を向上するための施策を定常的に行っています。
具体的な取り組みとして、自社フレームワークの作成や社内開発標準の策定などを行っています。

上記施策の一環として、生成系AIを導入することによりシステム開発の生産性を向上できるか検証しています。
導入当初は期待した結果が得らませんでしたが、他の生成系AI同様、AIモデルにどのような指示を与えるのか、つまりプロンプトエンジニアリングが重要であることが分かってきました。
少しずつですが、知見が溜まってきたので紹介したいと思います。

# GitHub Copilot

AIツールとして、**GitHub Copilot**を採用しました。
競合製品も存在しますが、GitHub Copilo

元記事を表示

JavaでMapの存在チェック

# Mapの存在チェック
こんにちは。島根と言えば出雲蕎麦ですが、15時くらいには閉まるので行かれる方はお昼がおすすめです。

さて、今日は自分的に 結構良いんじゃないかなあ!? と思う処理を思いついたので、どっかで使うためにおいておきます。
使い所はよくわかってません。

# コード
普通?というか単純な私がぱっと思いつくのはこんなコードです。
“`java
public static void main(String[] args) {
Map map = new HashMap<>();
map.put(“thx”, “Thank you”);
map.put(“azs”, “Azasu”);

System.out.println(mapCheck(map));
}

private static Boolean mapCheck(Map map) {
Boolean exist = true;

if (!map.containsKey(“thx”)) {
exist = f

元記事を表示

JavaでXML風のテキストを整形するツール

## JavaでXML風のテキストを整形するツール
1行で記載されたXML風のテキストを整形する

## やりたいことのイメージ
1行で記載されたXMLを整形する。
“`
aaaaaaaaaaaaaaaaaa
“`
これを↓のように整形する。
“`


aaa
aaa

aaa
aaa

aaa
aaa

“`

## 前提
XMLとしてのチェッ

元記事を表示

Javaのリテラルの動作を確認してみた

# 概要
Javaのリテラルの動作を確認してみました。以下のページを参考にしました。

リテラル

https://www.javadrive.jp/start/num/

文字リテラルと文字コード

https://www.javadrive.jp/start/num/index1.html

文字列リテラル

https://www.javadrive.jp/start/num/index3.html

エスケープシーケンスを使った特殊な文字の表現

https://www.javadrive.jp/start/num/index4.html

整数リテラル

https://www.javadrive.jp/start/num/index5.html

浮動小数点数リテラル

https://www.javadrive.jp/start/num/index7.html

数値リテラルにサフィックスを付けて型を指定する

https://www.javadrive.jp/start/num/index8.html

数値リテラルに桁区切り文字を記述する

https://www.j

元記事を表示

Spring BootでをPostgreSQL使ってアプリを作成してみた【CRUD App】

## 1.プロジェクトを作成する

公式:[spring initializr](https://start.spring.io/)

① ブラウザを開き、(https://start.spring.io/) を入力し、開く
② 下記を入力し、Dependenciesで下記を選択し、『GENERATE』ボタンを押す

– Project: Maven
– Language: Java
– SpringBoot: 3.1.1

– Group: com.postgresql
– Artifact: crud
– Name : crud
– Description: Demo projects for Spring Boot with Postgresql
– Package name: com.postgresql.crud

Dependencies
– Spring Boot Starter jdbc
– Spring Boot Starter Web
– Spring Boot DevTools
– boostrap
– Jquery
– Spring Data JPA
– Pos

元記事を表示

[Java] シングルトン

# シングルトンとは
* javaのデザインパターンの一種
* 「あるクラスのインスタンスが常にたった1つしか存在していない」を実現するのに使用
* クラスのインスタンスが必ず1つなことを保証する
# シングルトンの使い方
“`java:シングルトン
public class Singleton {
private static Singleton instance = new Singleton();

// プライベートコンストラクタ
// インスタンスの生成を制限するため、外部からのインスタンス化を防ぐ
private Singleton() {};

// インスタンスを取得するためのメソッド
public static Singleton getInstance() {
return instance;
}
}

class Main {
public static void main(String[] args) {
Singleton single = Si

元記事を表示

【JavaGold】synchronizedキーワード

## 概要
複数のスレッドで1つのインスタンスを共有することで発生する競合[^1]を解決(排他制御)するためのもの。
[^1]:ここでの「競合」は、あるスレッドが共有されているインスタンスのフィールドの値を読み出してから変化するまでの間に、別のスレッドが変更してしまうことをいう。

このキーワードは以下の2通りの使い方がある。
– メソッド宣言に使う場合
– メソッド内の一部の処理だけを対象に使う場合

#### メソッド宣言に使う場合
`synchronized`をメソッド宣言に使うと、そのメソッドは「`synchronized`メソッド」と呼ばれる。

##### 例
“`java
public class SynchronizedExample {
private int count = 0;

public synchronized void increment() {
count++;
}

public synchronized int getCount() {
return count;
}
}

元記事を表示

Javaでcsvファイルを読む

## 前置き
「最近暑すぎる…」

自宅で勉強しようとしても
(母)「電気代がもったいないっでしょ!」
と言われ、汗だらだらで勉強しる田舎者SEです。

今日はJava Goldの資格勉強もかねて
「csvファイルからデータを読みこんでコンソールに出力する」というのをやってみたいと思います。
使用するCSVデータは気象庁の過去の気象データです。
データを取得する部分から一緒にやってみりん!

##1 ①「気象庁のサイトでデータを取得するぞー!」
まずは、下記のリンクから気象庁のサイトに入ってください。

https://www.data.jma.go.jp/gmd/risk/obsdl/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3484672/559e5740-b6ff-cda8-8aa5-80869b3ff018.png)

この画面で自分のお好みの条件を指定して「CSVファイルをダウンロード」ボタンを押したらCSVがダウンロードできます。

今回私は以下のように設定してみ

元記事を表示

【Java,SpringBoot】顧客情報登録webアプリを作る

使用ツール
SpringBoot

codeダウンロード
https://drive.google.com/drive/folders/1h4nyNx4SeFfiDmiSB5xPv1Y1aTSYycML?usp=sharing

Page1
登録情報入力
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2220659/ce6c0291-ca65-ade2-f139-e2c3c35bcfa0.png)

Page2
登録情報の登録
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2220659/a033d3b9-cb5e-7887-c6e2-dd0deac72ac5.png)

Page3
データベースに出力
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2220659/559644cd-9a3c-a03b-87f1-2

元記事を表示

Javaのエンコーディングに関する設定について動作を確認してみた

# 概要
Javaのエンコーディングに関する設定について動作を確認してみました。以下のページを参考にしました。

Javaのエンコーディングに関する設定

https://www.javadrive.jp/start/encoding/

デフォルトエンコーディングを確認する

https://www.javadrive.jp/start/encoding/index1.html

ソースファイルのエンコーディングを指定してコンパイルする

https://www.javadrive.jp/start/encoding/index2.html

実行環境のエンコーディングに合わせてプログラムを実行する

https://www.javadrive.jp/start/encoding/index4.html

# エンコーディングを確認
以下のファイルを作成しました。
“`JSample1_1.java
class JSample1_1{
public static void main(String[] args){
System.out.println(System.ge

元記事を表示

【JavaGold】CyclicBarrierクラス

## 概要
複数のスレッドが特定のポイントまで到達するのを待機できるようにする同期化支援機能を提供するクラスである。

スレッド間の同期を実現するための仕組みであり、主にマルチスレッドプログラミングで使用される。
バリアー[^1]に全てのスレッドが到達するとバリアーアクションと呼ばれる処理を実行する。
[^1]:複数のスレッドが待ち合わせる待機ポイントのこと。

`CyclicBarrier`は以下のように定義されている。

“`java
public CyclicBarrier(int parties, Runnable barrierAction)
“`

##### 引数について
– `parties`:バリアーで待機するスレッドの数(到達する必要があるスレッドの数)を指定する。
– `barrierAction`:全てのスレッドがバリアーに到達した時に実行されるタスク(`Runnable`)を指定する。この引数はオプションであり、必要な場合は`null`を指定することもできる。

## 使い方

1. `CyclicBarrier`オブジェクトを作成し、待機するスレッドの数

元記事を表示

【JavaGold】Callableインタフェース

## 概要
処理結果を戻したり必要に応じて例外をスローするマルチスレッドのタスクを定義するためのインタフェースである。

`Callable`インタフェースは以下のように定義されている。

“`java
@FunctionalInterface
public interface Callable {
V call() throws Exception;
}
“`

`Callable`インタフェースは`V`というジェネリック型を持つ`call()`メソッドのみ定義されている。
戻り値型は`Callable`のインスタンスを取得する際に指定する型パラメータとなる。

##### 例①:処理結果を取得

“`java
import java.util.concurrent.*;

public class CallableExample {

public static void main(String[] args) throws InterruptedException, ExecutionException {
ExecutorServic

元記事を表示

OTHERカテゴリの最新記事