- 1. JacksonでJSONとListを相互変換する
- 2. AWS S3ライフサイクルによるObject削除
- 3. #4【実装編】分離に着目してみる
- 4. #3【型と実装編】分離に着目してみる
- 5. SonarQubeカスタムルールプラグインの開発方法
- 6. #2【パッケージ編】分離に着目してみる
- 7. #1【問題編】 分離に着目してみる
- 8. 【JavaGold】Setインタフェース
- 9. 【JavaGold】ArrayList、LinkedList、Vectorの違い
- 10. PostgreSQLにて「trailing junk after parameter at or near」なるエラーが発生する原因と解決法
- 11. 【JavaGold】下限境界ワイルドカード
- 12. MyBatisで悲観ロック用のSELECTを自動生成する
- 13. iteratorをstreamにする
- 14. MyBatisでVERSIONカラムを自動で更新する
- 15. 【Java/SQL】 データベースを使ったログイン処理 DAO/DTOパターン
- 16. MyBatisでExampleClassをカスタマイズする
- 17. [Java] VariableDeclaratorId
- 18. 【JavaGold】上限境界ワイルドカードと非境界ワイルドカード
- 19. サービス無停止でRedisを移行した話
- 20. 【JavaGold】ジェネリクスの型パラメータ
JacksonでJSONとListを相互変換する
## JSON文字列をListに変換する
“`Java
public staticList convertToList(String json, Class clazz) {
Listlist = null;
if (!StringUtils.isEmpty(json)) {
ObjectMapper mapper = new ObjectMapper();
final CollectionType jt = mapper.getTypeFactory().constructCollectionType(List.class, clazz);
try {
list = mapper.readValue(json, jt);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
}
return list;
}
“`
## Li
AWS S3ライフサイクルによるObject削除
# AWS S3ライフサイクルによるObject削除
特定のオブジェクトをFilterで削除するための方法をJava, Go, C#で残しておく。
## Java
以下はJavaを使用してAWS S3にファイルをアップロードする際にTTLを付与する方法。
### ライフサイクル設定のコード
“`java
import com.amazonaws.ClientConfiguration;
import com.amazonaws.auth.DefaultAWSCredentialsProviderChain;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.*;public class S3FileUploadExample {
public static void main(String[] args) {
String bucke
#4【実装編】分離に着目してみる
# 前回
[型と実装の分離](https://qiita.com/miyamiya_/items/3cb5a4ad0c30bfbd1b17)の続き。# 実際に書いてみる
前回の記事で分離したクラスを使用するアプリケーション層を書いていくよ。~~~java:TalkToGPTApplicationService.java
public class TalkToGPTApplicationService {
//ChatGPT型の変数を定義
public String getResponse(String text) {
chatGPT.getResponse(text);
}
}
~~~chatGPTという変数はChatGPT型という定義をしている(ChatGPTImple型ではない)ので、実装に何を使用しているのかを意識せずにコードを書き進めることができるよ。
##### あれっ?変数定義、どうやってるの?隠してない?
あっ、あの、隠してないです。
~~~java:TalkToGPTApplicationService.java
pu
#3【型と実装編】分離に着目してみる
# 前回
[パッケージの分離](https://qiita.com/miyamiya_/items/af2d68510ff2e5ec8864)の続き。# 依存の方向を考えてみる
#### そもそも依存って?
依存とは、あるクラスがあるクラスを __使っている__ 。
あるメソッドがあるメソッドを __使っている__ 。
つまり、簡潔に言うと使っていることを依存という。
AというクラスがBというクラスを使っているとき、 __AはBに依存している__ と言えるよ。
車はタイヤがないと存在できないけど、タイヤは車がなくても存在できる みたいなこと。じゃあ、ここで一度 パッケージの __依存の方向を確認__ してみよう。
プレゼンテーション層がデータを受け取ってアプリケーション層に調整を指示する。
アプリケーション層がドメイン層に業務の遂行を指示する。
ドメイン層がインフラストラクチャ層に永続化を指示する。[^1]
インフラストラクチャ層が永続化を行う。このように上から順に依存してしまっている。
じゃあ、OpenAiを使用するためのAPIが大幅に変わった場合、それに依存して
SonarQubeカスタムルールプラグインの開発方法
# はじめに
SonarQubeは、プログラムソースを分析する品質評価ツールで、SAST(Static Application Security Testing)というカテゴリでも語られることがあります。ソフトウェアのバグ、脆弱性、技術的負債等を摘出してくれるツールです。
全てのシステム開発に使用できますが、とりわけ大規模システムにおいて品質を均質にするために欠かせないツールになりつつあります。
デフォルトでついてくるルールに対応するだけでもかなり効果はありますが、各プロダクト・各プロジェクト独自のルールを追加したくなることもあるかと思います。
例えば、そのプロダクト独自の仕様により障害が発生し、今後、その障害を発生させないようにチェックリストに追加する、といった運用をしているチームもあるかと思います。ただ、それを人手で目検でやるとなると大変です。なるべくチェックを自動化する流れに持っていきたいですね。
ということで、本記事ではSonarQubeのカスタマイズルールや、カスタマイズプラグインの作り方についてご紹介致します。
尚、本記事ではSonarQubeとは?であったり
#2【パッケージ編】分離に着目してみる
# 前回
問題編は[こっち](https://qiita.com/miyamiya_/items/9ce1e572aee61985d055)。
# 前回のコードの問題点
全て __サーブレット__ にべた書きしていた。
つまり、__プラットフォームに依存__ するコードを書いていたため、移行がめんどくさかった。
コード量が増えるとよりめんどくさそう。かつ、追えなくなりそう。
# 分離に着目してみる
分離すると何がいいのか?
私は __変更容易性__ の向上にあると思う。前回のコードではサーブレットクラスにすべての処理を書いていた。
サーブレットの役割はいわゆるコントローラであり、その業務において __やりたいこと__ または、 __実現するべきこと__ を記述するべきではない。
私は主に「 __二つ__ 」の場面で分離している。
1. 責任が違うパッケージ
2. 型と実装この二つ。順に解説するよ。
# 責任が違うものをパッケージとして分離してみる
AIとのチャットアプリケーションの流れはこの通り。
>1. ブラウザからチャットを送信
>2. 敬語を使わないで!というルールの作
#1【問題編】 分離に着目してみる
# 今話題のAIを使ったアプリを作りたい
AI すごいですね。ChatGPT、すごい。
すごいけど、敬語ばっかり使うからなんだかよそよそしい…
敬語を使わないように事前に設定して話してくれるようにしたいなぁ# アプリの概要
1. ブラウザからチャットを送信
2. 敬語を使わないで!というルールの作成
3. OpenAiAPIにリクエストを送信
4. レスポンスの表示# サーブレットを使用して作ってみる
##### サーブレットクラスの作成
~~~java:TalkToGPTServlet.java
public class TalkToGPTServlet extends HttpServlet{
private static final long serialVersionUID = 1L;
//OpenAiAPIを使用するためのインスタンス作成
private OpenAiService openAiService = new OpenAiService(“your-openai-token”);
protected void doPos
【JavaGold】Setインタフェース
## 概要
重複する要素(`equals`メソッドによって等しいと判断される要素)を持たないことを保証するコレクションの機能を定義したインタフェース。Javaの`Set`インタフェースを実装するクラスに`HashSet`と`TreeSet`があるが、以下3つの観点で違いがある。
***
1. 要素の順序
2. 要素の格納方法
3. パフォーマンス#### 要素の順序
– `HashSet`:**要素の順序を保持しない**。要素の格納順序や挿入順序に依存しないため、要素の順序を重視しない場合に使用する。
– `TreeSet`:**要素の順序を保持する**。デフォルトでは要素は昇順に並ぶ。要素は**自然順序**(Comparableを実装している場合)または**コンパレータによって順序付けられる**。順序を保持し、要素のソートや範囲検索が必要な場合に使用する。#### 要素の格納方法
– `HashSet`:ハッシュテーブルを使用して要素を格納する。ハッシュ関数によって要素が格納位置が決定され、高速な検索が可能である。ただし、要素の格納順序は保証されない。
– `TreeS
【JavaGold】ArrayList、LinkedList、Vectorの違い
## 主な違い
`ArrayList`、`LinkedList`、`Vector`は、Javaの`List`インタフェースを実装するクラスであるが、主に以下3つの観点で違いがある。1. データの格納方法
2. スレッドセーフ性
3. パフォーマンス***
#### データの格納方法
– `ArrayList`:内部的には要素を**配列**として格納する。要素の追加や削除が頻繁に行われる場合は、要素の移動が必要になるため、効率が低下する可能性がある。
– `LinkedList`:内部的には要素を**双方向リンクリスト**として格納する。要素の追加や削除が頻繁に行われる場合は、要素のリンクの変更だけで済むため効率的である。
– `Vector`:内部的には要素を**配列**として格納する。ArrayListと同様の動作をするが、同期化されたメソッドを提供し、スレッドセーフである。#### スレッドセーフ性
– `ArrayList`:**スレッドセーフではない**。複数のスレッドから同時にアクセスする場合は、適切な同期化が必要である。
– `LinkedList`:**スレッ
PostgreSQLにて「trailing junk after parameter at or near」なるエラーが発生する原因と解決法
# はじめに
初投稿になります。
今年入社した一年目の新人エンジニアですので、誤字脱字や内容の誤りなど、お気づきの点は気軽にご指摘ください。
本稿は私の学習の備忘録的なものではありますが、同じ箇所でつまづいた方の手助けになれば幸いです。## JavaとPostgreSQL
今回私は、JavaによるJSPとサーブレットの仕組みを使用した簡単なWebアプリ開発を行っておりました。データベースシステムはPostgreSQLを使用しています。## 発生したエラー
サーブレットでデータベースにアクセスする際には、おそらくDAOパターンが用いられることが多いと思います。以下は今回使用したDAOパターンによるメソッドです。
初心者なのでコードの書き方などについて、厳しい指摘はご遠慮ください。。(もちろん、改善案などは歓迎いたします)“`Java:UserLoginDAO.java
public class LoginDAO {
protected static Connection conn;
// データベースとの接続情報
public LoginDAO (Connect
【JavaGold】下限境界ワイルドカード
## 概要
型パラメータとして受け取れる**最も具体的な型(下限)を制限し、それ以上の型であれば扱うことができる**。下限境界ワイルドカードの表記は `? super Type` である。ここで、`Type`は特定のクラス名やインターフェース名が入る。
上記のような型パラメータを与えると、非変であるジェネリクスの制限を緩和し、`Type`に指定したクラスもしくはより上位の型であれば型パラメータとして受け取ることができる。
##### 例
“`java
public void processElements(List super Integer> list) {
// Integerクラスまたはそのスーパータイプのリストを処理する
// 要素の追加も可能
list.add(42);
for (Object element : list) {
// 要素の処理
}
}
“`上記の例では、`List super Integer>` 型の引数を受け取る `processElements` メソッドがある。これは、`
MyBatisで悲観ロック用のSELECTを自動生成する
## PluginAdapterを拡張して設定する
今回は以下の内容で行う
– DBはSQL Server
– 既存のselectByExample、selectByPrimaryKeyを利用して、selectByExampleForUpdate、selectByPrimaryKeyForUpdateを自動生成する“`java:MyBatisPlugin
import java.util.ArrayList;
import java.util.List;import org.mybatis.generator.api.CommentGenerator;
import org.mybatis.generator.api.IntrospectedColumn;
import org.mybatis.generator.api.IntrospectedTable;
import org.mybatis.generator.api.PluginAdapter;
import org.mybatis.generator.api.dom.java.Field;
import o
iteratorをstreamにする
安全かは不明。。java17で動作確認。
“` java
public staticStream iterator2stram(Iterator iterator) {
Spliteratorspliterator = Spliterators.spliteratorUnknownSize(iterator, 0);
return StreamSupport.stream(spliterator, false);
}
“`# 参考
https://qiita.com/yoshi389111/items/7cd7883d1d838e95a9fa
MyBatisでVERSIONカラムを自動で更新する
## PluginAdapterを拡張して設定する
今回は以下の内容で行う
– UPDATEのとき、VERSIONカラムを1上げるようにする
– xmlにてVERSIONを更新している箇所があるので、これを+1に置き換える
– 対象は、updateByExampleSelective、updateByExample、updateByPrimaryKeySelective、updateByPrimaryKey“`java:MyBatisPlugin
import java.util.ArrayList;
import java.util.List;import org.mybatis.generator.api.CommentGenerator;
import org.mybatis.generator.api.IntrospectedColumn;
import org.mybatis.generator.api.IntrospectedTable;
import org.mybatis.generator.api.PluginAdapter;
import or
【Java/SQL】 データベースを使ったログイン処理 DAO/DTOパターン
# 目次
この記事は5分ほどで読めます。
[1. この記事のターゲット層](#1-この記事のターゲット層)
[2. 開発環境](#2-開発環境)
[3. ログイン処理の例](#3-ログイン処理の例)
[4. データベース設計手順](#4-データベース設計手順)
[5. 実行フェーズ](#5-実行フェーズ)# 1. この記事のターゲット層
「Java・sqlに関する基礎知識を持っているが、ログイン処理の書き方が思いつかない方/参考にしたい方」
「DAO・DTOクラスパターンを使って設計したい方」– 基本レベルの記事となります。
– 記事にあるコードを写経すれば、処理が成功するように丁寧に解説しております。
– わかりやすさを重視するため難解な要素は排除しております。# 2. 開発環境
JavaSE-17
Eclipse 4.24.0 M2
MySQL 8.0.29
MySQL Workbench 8.0.30# 3. ログイン処理の例
早速各クラスのご紹介をしていきます。
### 4. LoginProcessクラス
“`
package develop.appP
MyBatisでExampleClassをカスタマイズする
## 自動生成したExampleClassに追加の抽出条件を加える
テーブルを結合して他のテーブルのカラムを抽出条件とすることがある。この場合は、他のテーブルのExampleClassから該当の抽出条件を持ってきて、以下のように追加する。このとき、通常のものとエイリアスを付けるものを両方用意しておくと、複数人で開発するときなどに便利である。
“`Java
public class MTestExample {
/**
* This field was generated by MyBatis Generator. This field corresponds to the database table dbo.M_TEST
* @mbg.generated
*/
protected String orderByClause;
/**
* This field was generated by MyBatis Generator. This field corresponds to the database table dbo.M_TEST
* @mbg
[Java] VariableDeclaratorId
# はじめに
* VariableDeclaratorIdとは直訳すると「変数宣言子」# 原因
* 自分の場合はmainメソッドの定義をしていなかった
* メソッドの外でメソッド呼び出し# 解決策
* mainメソッドを定義する!!
* eclipseはクラス作成の時に設定でmainメソッドを自動で作成してくれるからそれをONにするといいかも
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2726212/cc796645-9660-b75c-cb65-d4111a5184b5.png)# おわり
* mainメソッドを定義することを忘れない
【JavaGold】上限境界ワイルドカードと非境界ワイルドカード
## ワイルドカード
ジェネリクスは非変であるため、使用するときには使う側と使われる側でどの型パラメータをやりとりするかを厳密に決めておかなければならない。そのため、汎用的にしたい場合は**ワイルドカード**を使用する。これにより、未知の型や特定の型の範囲を表現することができる。
## ワイルドカードの主な形式
ワイルドカードには主に以下の2つの形式がある。#### ①上限境界ワイルドカード
`? extends Type`と表される。`Type`は特定のクラスやインターフェースを指定し、どのクラスが型パラメータとして使用できるかを制限する。
読み取り専用として使用され、**特定の型の範囲を制限する**ために使用される。“`java
public void processList(List extends Number> list) {
// list内の要素に対する処理
}
“`上記の例では、`processList`メソッドは`Number`クラスまたはそのサブクラスのリストを受け取ることができる。具体的な型に依存しない処理を行う場合に役立つ。
サービス無停止でRedisを移行した話
# はじめに
自分の組織ではRedisのアップグレードに伴って、VPCを移行するニーズがありました。
アップグレードするためだけなら、色々方法はあります。
AWSが公式で推奨する方法は別にありますし、Redisの公式も別です。
この記事では、Redisをサービス無停止でのRedis移行に関してをまとめたいと思います。# この記事の想定読者
別のネットワークのRedisにリアルタイムで同期してサービス無停止で切り替えを行いたい人
つまり、
– AWSからオンプレミスへ
– AWSからGCPなど別のクラウドサービスへ
– NonManagedなRedisからElastiCacheのようなマネージドサービスへサービス無停止で切り替えができることと同義かとおもいます。
AWSが提供しているデータ同期サービスDMSは
AWS -> xxx のデータ同期ができないです。
なので、サービスで行いたい場合は参考になるかと思います。# きっかけ
自分が開発に関わっている組織ではRedis3系が使われていました。
AWSのElastiCacheのRedisのEOLが7月末に行われる
【JavaGold】ジェネリクスの型パラメータ
## ジェネリクスは非変
ジェネリクスにおいて、Javaでは基本的には非変である。
非変とは、異なる型の間での型の関係が維持され、互換性がないことを意味する。#### 具体的には
ジェネリクスを使用したクラスやインターフェースにおいて、異なる型引数が指定された場合、それらは**別々の型として扱われる。**
たとえ2つの異なるジェネリック型が同じ基本クラスを継承していても、それらは直接的な型の関係を持たない。##### 例
“`java
class Box{
private T contents;public void setContents(T contents) {
this.contents = contents;
}public T getContents() {
return contents;
}
}public class Main {
public static void main(String[] args) {
Boxstr