- 1. 1.背景
- 2. 2.環境
- 3. 3.Maven / Gradleの記述例
- 3.1. Maven
- 3.2. ResourceBundleのキー存在チェック
- 3.3. 【Spring Boot】【Java】入力フォームに良く登場する項目のバリデーションを実装付きで紹介
- 3.4. Java経験者向けKotlin入門ガイド
- 3.5. Java(Spring Boot)の単体テストはどのアノテーションを使えばいいか整理してみる
- 3.6. スレッドセーフを知って安全なアプリを安全にしよう!
- 3.7. JavaのSwitchについて
- 3.8. ゼロからJavaのWebアプリを作ってRenderで公開する
- 3.9. 【Spring Boot入門】#8 削除機能を作成する
- 3.10. ソートを利用したアルゴリズム問題解決
- 3.11. 最近のレビュー指摘の備忘録1(Java系)
- 3.12. java初学者の学習メモ-Part2-
- 3.13. JVMを意図的にクラッシュさせる方法
- 3.14. 休憩催促通知機能を作ってみた
2024/11/15 Spring MVC DoS脆弱性 (CVE-2024-38828)
# Spring MVCで発生するサービス拒否(DoS)脆弱性。
https://spring.io/security/cve-2024-38828
– 韓国人として、日本語とコンピュータの勉強を同時に行うために、ここに文章を書いています
– 翻訳ツールを利用しているため、不自然な表現があるかもしれません。
– 内容が正確でない可能性があります。ご意見をいただけると幸いです## 問題の状況
– `@RequestBody`と`byte[]`パラメーターを使用するコントローラーメソッドがDoS(サービス拒否)攻撃にさらされる可能性があります> DoS(Denial-of-Service attack)とは?
– 攻撃者が特定のマシン、ネットワーク、またはホストに過剰なトラフィックを発生させたり、脆弱性を悪用したりして、サービスが正常に動作しなくなるようにするサイバー攻撃https://en.wikipedia.org/wiki/Denial-of-service_attack
## 脆弱性
– Spring MVCが`byte[]`でリクエストボディを逆シリア
build.gradleのbuildscriptとpluginsの違い
# 背景
Gradleの`build.gradle`には様々な記法があります。その中でも`buildscript`と`plugins`の違いがわからなかったので調べてみました。
`build.gradle`の記述言語はGroovyを使用しますが、Kotlinでも本質は同じです。
# `buildscript`
`buildscript`では`build.gradle`の中で使用するプラグインなどを指定します。
– 社内でリポジトリを運用していて、そこでGradleプラグインを管理しているような場合は`repository`の中に追記します。
– `dependancies`には`build.gradle`の中で使いたいプラグインのclasspathを指定します。
– ここで指定するのはあくまで`build.gradle`の中で使いたいプラグインを指定するのであって、アプリケーション内で使いたいライブラリ (たとえばAWS SDKなど)はここに書きません。
– `dependancies`に追加したプラグインは`apply plugin`で適用します。プラグインでないライブラリの
Javaファイル群の複雑度を定量化するツールをつくった
# やりたいこと
– Javaファイル群の複雑度を定量化したい
– ファイル単体の複雑度のみでなく、群として複雑度を定量化したい### なぜやりたい?
– INPUT:仕様書、OUTPUT:Javaコードを生成するLLMタスクの難易度を定量的に把握したいから
– 複雑な問題を先に解くことはできない
– 複雑な問題であることを認識し、迂回策やMVPの定義を考えることに頭を使いたいから– 「これつくりたい」って無邪気に言ってくる人に複雑さをどうにかして伝えたい
# ツールをつくってみた
– tkinterを使ってGUIで動かせるようにしてみた
– ディレクトリを選んで分析ボタンを押すだけ
– 各種メトリクスが表示される
– 総合複雑度のスコアはメトリクスに重みづけた自作指標## 動作イメージ
– ディレクトリを選んで分析ボタンを押す
– 全体の複雑度の表示
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348593
DAOについて
※この記事はChatGPTで検索した内容を元に作成しています。
—
DAO(Data Access Object)パターンは、データベースや永続化されたデータに対するアクセスを抽象化し、データ操作を行うためのインタフェースを提供するデザインパターンです。このパターンを使うことで、データベースに直接アクセスするコードをビジネスロジックから分離し、データ操作に関するコードの変更が必要になった場合にも、ビジネスロジックに影響を与えずに変更を行うことができます。
—
### DAOの目的
DAOパターンの主な目的は、アプリケーションのビジネスロジックとデータアクセスロジックを分離することです。これにより、次のような利点が得られます。1. **メンテナンス性の向上**
– データベースとのやり取りに関するコードが一箇所に集約されるため、データベースの変更(例えば、SQL文の修正やデータベースの種類の変更)をDAOクラスのみで行えるようになります。2. **テストの容易さ**
– ビジネスロジックからデータアクセス部分が独立しているため、モックを使ってDA
セキュリティの構成と対応についてまとめてみる
## はじめに
実務で脆弱性対応を行ったのですが、脆弱性?(セキュリティ)の種類や一般的な対応方法が自分の中で理解しきれていないと感じたのでざっくりまとめました。開発環境としては、AWS・Java(Spring Boot)を前提にしています。
フロントでも対策できる部分はありますが、ツールで編集できたりするので今回は統一性を意識して無効と考えています。※個人でまとめたものになるので、誤りがある可能性は十分にあります。
## 参考
– 徳丸 浩 (2018/6/21) 「体系的に学ぶ 安全なWebアプリケーションの作り方 第2版 脆弱性が生まれる原理と対策の実践」
– 松本 照吾, 桐谷 彰一, 畠中 亮, 前田 駿介 (2023/2/10) 「AWSではじめるクラウドセキュリティ クラウドで学ぶセキュリティ設計/実装」
– 齋藤 孝道 (2022/6/24) 「マスタリングTCP/IP 情報セキュリティ編 (第2版)」
– 株式会社一創 (2024/06/12) 「Spring Securityとは何か?その基本と重要性を解説」 https://www.issoh.co.jp
SpiringBootでThymeleafが動かないエラーの解消方法
## はじめに
SpringBootでの画面描画のためThymeleafを使い始めたのですが、早速動かず詰まったので解消方法を記述しておきます。### 環境
– OS: Windows11
– IDE: IntelliJ IDEA 2024.2.4 (Community Edition)
– Java: “21.0.5” 2024-10-15 LTS
– SpringBoot: “3.3.5”
– Thymeleaf: “3.3.5”## 問題
Thymeleafが動かない。
具体的には以下のような状態でした。
– HTMLタグの以下の記述に対して、エラーが出る
– `xmlns:th=”http://www.thymeleaf.org”`
– エラー文:URI が未登録です (設定 | 言語 & フレームワーク | スキーマと DTD)
– 保存時のアクション:コードの整形を有効にしているが、保存時に`xmlns:th=”http://www.thymeleaf.org”`が自動で削除される
– `th:text`などの補完が効かない## 解決方法
### Int
【Java】QRコードジェネレータ
1.背景
身近なテーマで何か作りたかったため。
Javaにしたのは何となくです。2.環境
Windows 11 22H2
Eclipse 2022-06 (4.24.0)
openjdk 17.0.33.Maven / Gradleの記述例
Maven
“`markdown:pom.xml
com.google.zxing
core
3.5.2
com.google.zxing
javase
3.5.2
“`
ResourceBundleのキー存在チェック
## 例
実務では、プロパティファイルの読み込みとプロパティキーのキーチェックは、メソッド化して引数渡して汎用的に使えるようにしておいた方がよいと思います。
“`java
import java.util.MissingResourceException;
import java.util.ResourceBundle;public class Sample {
private final String SEND_PORT = “send.port”;
public void testMethod() {
String sendPort = “”;
ResourceBundle bundle;
try {
ResourceBundle bundle = ResourceBundle.getBundle(“config”);
} catch (MissingResourceException e) {
// プロパティファイルが無かった時にMissingResourceExceptionがスローされる
【Spring Boot】【Java】入力フォームに良く登場する項目のバリデーションを実装付きで紹介
# はじめに
入力フォームで良く登場する項目を題材にそれぞれアノテーションを用いたバリデーションを紹介します。# 前提
– SpringBootを使ったRESTful APIベースで作成してますがSSRでもほぼ流用可能です
– 日付(生年月日)や数値を入力する項目は、型宣言で不正な値を防ぎましょう
“`Java
private LocalDate birthDay;
“`
– 性別や住所(都道府県)など、値が限定される項目はEnumで不正な値を防ぎましょう
“`Java
private PrefectureEnum prefectureCode;
// PrefectureEnumは独自Enum
“`# 紹介する項目
– 「全角」のみ
– 「全角ひらがな」のみ
– 「全角カタカナ」のみ
– 「半角」のみ
– 「メールアドレス」
– 「パスワード」
– 「郵便番号(ハイフンあり)」
– 「携帯電話番号(ハイフンあり)」※基本的に型宣言やEnumで不正な値を防げます。
# 用意するもの
– build.gradle
– spring-boot-starter-
Java経験者向けKotlin入門ガイド
**KotlinはJavaをベースに開発されたモダンなプログラミング言語です。Javaと完全な互換性を持ち、Android開発など多くの分野で人気が高まっています。このガイドでは、Javaの経験を活かしながら、Kotlinの基礎を学べるように解説していきます。**
# Kotlinの基本的な特徴
**簡潔性**: KotlinのコードはJavaに比べて短く、読みやすくなります。
**Null安全**: KotlinはNullPointerExceptionを防ぐための仕組みを備えており、Null安全を保証します。
**相互運用性**: Javaと完全に互換性があり、同じプロジェクト内でJavaとKotlinを共存させることが可能です。
# 基本的な構文の違い
**変数の宣言**
**Kotlinでは、変数をval(不変)またはvar(可変)で宣言します。**
Java:
“`Java
String name = “John”;
int age = 25;
“`Kotlin:
“`Java
val name: String = “John” // 不変(変更不
Java(Spring Boot)の単体テストはどのアノテーションを使えばいいか整理してみる
## はじめに
Spring Bootの単体テストを行う際、PJ先によって異なるな~と思ったので
どのテストパターン(アノテーション)で作成することが推奨されているのか整理してみました。– 環境
– 言語:Java
– フレームワーク:Spring boot、JUnit、Mockito
– 対象
– コントローラ
– サービス
– リポジトリ## 結論
[公式ドキュメント](https://spring.pleiades.io/spring-boot/reference/testing/spring-boot-applications.html “公式ドキュメント”)に全て書いてました。ざっくり整理すると以下になります。
– コントローラ → @WebMvcTest
– サービス → @MockBean
– リポジトリ → @DataJpaTest@SpringBootTestでいいのでは?とも思ったのですが、一応SpringBootTestは”統合(結合)テスト”に分類されるものなので、PJや人によっては使い分けた方がいいとい
スレッドセーフを知って安全なアプリを安全にしよう!
## 概要
今回はスレッドセーフについて説明します。スレッドセーフなコードは、
予期しない動作やデータの不整合を発生させないように設計されています。本記事ではJavaを例に、スレッドセーフについて知っていただき
サンプルコードを紹介したいと思います!## 前提知識
前提知識として、スレッド・マルチスレッドについて軽く触れます。### スレッド・マルチスレッド
– スレッド:プログラム内で独立して実行される軽量なプロセスの一部のこと
– マルチスレッド:スレッドを複数同時に実行すること。これにより処理の効率化、高速化の実現が可能になります!ざっと以下のようなイメージです。
![スクリーンショット 2024-11-11 1.09.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/945342/43339498-88b9-2fe4-7829-f81d999d8893.png)
## スレッドセーフとは
いよいよスレッドセーフについて説明していきます。:::note info
#
JavaのSwitchについて
Java 17と21(LTE)で switch が大きく変わったが、意外と罠がある & うまく使うと便利なので情報をまとめてみた
## Java 17での変更
Java 17 から switch の新しい記法と switch式が導入された
従来の Java の switch文は書く分岐で処理を完了する場合、break の指定が必要だった
あえて break を使わずに条件によって複数の処理を行わせる効率的な書き方もできたが、あまり可読性は高くなく、break の指定漏れによるミスの方が多かった
そのためか、Java 以降に登場したメジャーな言語の複数分岐では基本的にそれぞれの条件が独立しているのが多かった
Java 17 から追加された switch はその流れを汲んでおり、break なしで記載することができる“`
jshell> switch (i) {
…> case 1 -> System.out.println(“one”);
…> case 2 -> System.out.println(“two”);
…>
ゼロからJavaのWebアプリを作ってRenderで公開する
# ゼロからJavaのWebアプリを作ってRenderで公開する
## はじめに
JavaでWebアプリを作って,それを公開するまでの手順をまとめてみました.
とりあえず,動かせるものを作る!という方向けです.実際に動いたのを確認した後に色々考えたりできることもあると思うので,とりあえず作る方法をまとめてみました.
## 作成手順
### 1. プロジェクトの概要を決める
まずは,どんなWebアプリを作るのかを決めます.
今回は単純なゲームを作成したかったので,とりあえず数あてゲームを作成することにしました.
### 2. プロジェクトの作成
必要なファイルを作成します.
render.comではdockerに対応しているので,Dockerfileを作成します.“`Dockerfile
FROM openjdk:11-slim# 作業ディレクトリを設定
WORKDIR /app# Javaファイルをコピー
COPY Main.java /app# Javaファイルをコンパイル
RUN javac Main.java# ポート8080を公開
EX
【Spring Boot入門】#8 削除機能を作成する
## はじめに
自身の知識のアウトプットも兼ねて、新人研修用に作成した記事となります。Spring Bootを学び始めた方を対象とした内容になっています。更新機能の作成については、前回の記事を参照ください。
https://qiita.com/ioaio/items/1cef44733731a287b1dc
## 概要
企業情報一覧画面の「削除」リンクを押下した時に、特定の企業に関する情報を削除できるようにします。また、削除結果(成功 or エラー)が企業一覧画面へ表示されるようにします。#### 完成イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3917178/46bd6efd-4a7b-f9a3-d6ca-b2b909400601.png)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3917178/f7fe2571-5b9b-1412-959b-c17c15
ソートを利用したアルゴリズム問題解決
### アルゴリズムの主要なプロセス
1. **2進数の1の個数を数える**:
– 与えられた配列 `nums` の各整数について、その数を2進数に変換したときの1の個数を数えます。
– `cur` 変数を用いて各整数を2進数に変換し、ループを通して1の個数(`cnt`)をカウントします。2. **優先度キューに追加**:
– 各整数(`num`)とその数の1の個数(`cnt`)を `Node` オブジェクトとして作成し、優先度キュー `pq` に追加します。
– `PriorityQueue` は `Node` オブジェクトの `compareTo` メソッドを使用してソートされます。`compareTo` メソッドは次の基準に従ってノードをソートします:
– 1の個数(`cnt`)が少ない順に昇順でソート。
– 1の個数が同じ場合は、整数の値(`val`)が小さい順にソート。3. **ソート結果を配列として返す**:
– 優先度キューからノードを一つずつ取り出し、`answer` 配列に格納します。
–
最近のレビュー指摘の備忘録1(Java系)
## 0.背景
最近レビュー指摘で言われたよく忘れることをメモします。
3つほどあります。## 1.Javaにおいてのloggerによるログ出力
以下のように、メッセージと一覧として記載することが多かったのですが、
“`java:test1.java
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;void Test1()
{
protected final static Logger logger = LoggerFactory.getLogger(LogUtils.class);String str= null;
int length = 0;
try
{
length = str.length();
logger.info(“OK”);
}
// 指摘該当箇所
catch (NullPointerException e)
{
e.printStackTrace();
java初学者の学習メモ-Part2-
## 概要
今回はjavaで基礎学習用のコードを書いてみました。
これから少しずつjavaの学習記録を残してまいります。
学習のメモ程度に記述していますのでご承知ください。## 実行環境
・windows:Windows11Pro 23H2
・java:22.0.1
・統合開発環境:Eclipse## ソースコード
“`Sample.java
package helloworld;public class Sample {
public static void main(String[] args) {
int item_num;
final int NOT_SET = 0;
Ref ref = new Ref();
ref.set_item_num();
item_num =ref.get_item_num();
if (item_num != NOT_SET) {
System.out.println(“item_num >>>” + item_num);
}else {
System.out.println(“item_n
JVMを意図的にクラッシュさせる方法
# はじめに
「JVMをクラッシュさせるとしたらどんな手段を取りますか?」この質問に答えることができるでしょうか?私はできませんでした。
私は業務でJavaを利用し始めておよそ5年以上経過します。毎日使っているプログラミング言語の仮想マシンのことなので、これはエンジニアとして知っておくべきだなあと思い、色々試してみました。その過程と結果を記事にまとめます。# Unsafeクラスを使って不正なメモリアクセスを実行
ピュアJavaでJVMクラッシュを再現する場合、sun.misc.Unsafeクラスを使って不正なメモリ操作を実行することでクラッシュが可能です。
“`java
import sun.misc.Unsafe;public class CrashUnsafe {
public static void main(String[] args) throws Exception {
var field = Unsafe.class.getDeclaredField(“theUnsafe”);
field.setAccessible(true)
休憩催促通知機能を作ってみた
# 休憩催促通知
## ・はじめに
日常生活の中で仕事や家で長時間PCと睨めっこをしている人は多いだろう。長時間画面を見続けると目も疲れるし体もずっと固定されたままなので疲労が溜まり生活に支障が出てしまう。そこで私は長時間使用し続けると休憩の催促がくる機能を作成した。## 実行画面ショット
![chacha.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658530/a60a6a48-edfc-9b6c-ab3e-6a97de381b00.png)## ・構成
このプロジェクトは2つのJavaファイルから構成される。
1. **sendNotification.java**: 通知を表示するためのクラス。
2. **timerPreference.java**: 指定された時間後に通知表示を発火するクラス。## ・ファイル説明
### sendNotification.java
主な機能
– **notificationDisplay()**:
– システムトレイに