JAVA関連のことを調べてみた2022年12月09日

JAVA関連のことを調べてみた2022年12月09日

Spring Boot 3.0 で入った RFC7807 サポートを色々試す

先日、Spring Boot 3.0 が[GA](https://spring.io/blog/2022/11/24/spring-boot-3-0-goes-ga)になりました。実に5年ぶりのメジャーバージョンアップだったようです。めでたいですね。
Java17&Java EE9やGraalVMによるnativeイメージサポートなど大きな機能強化以外にも様々な新機能が入っています。
この記事では、CHANGELOGで見つけたちょっと変わり種n機能 RFC7807サポートについて試した結果を紹介します。

## RFC7807 とは?
[RFC 7807 Probrem Detail for HTTP APIs](https://www.rfc-editor.org/rfc/rfc7807)

HTTP APIのエラーレスポンス形式を標準化したRFCです。REST APIを作るたびにエラー形式考えるのがめんどくさい人のための標準仕様になります。 “`application/problem+json“` で以下のようなレスポンスを返却します。
“`json
{
“ty

元記事を表示

ChatGPTにMinecraftのMODを作ってもらう(後編)

ChatGPTにMODを作ってもらおうと思います。前編はChatGPTに任せきりにしてめちゃめちゃだったので、後編では人力で手直ししていこうと思います。結論から申し上げますと動くようにはなりましたが工業要素はゼロです。

# IronGeneratorTileEntityの実装
ChatGPTは`IronGeneratorTileEntity`クラスを`IronGenerator`クラスの内部クラスとして実装してくれました。そのままでも支障は特にありません。
Forgeを導入した開発環境ではデコンパイルし難読化解除した(確か)Minecraftのコードを読むことができます。Minecraftの内部実装では`TileEntity`の子クラスや孫クラスは内部クラスとして実装されてはいませんでした。何となく統一した方が良いような気がしたので、内部クラスとして実装するのはやめることにします。

“`java:IronGeneratorTileEntity.java
public class IronGeneratorTileEntity extends TileEntityLockable

元記事を表示

Java製のバリデーションライブラリYAVI(ヤバイ)を使ってみた[応用編]

この記事は筆者の[ソロ Advent Calender 2022](https://qiita.com/advent-calendar/2022/panda) 9日目の記事です。

前回Java製のバリデーションライブラリであるYAVI(ヤバイ)の基本的な使い方を紹介しましたが、今回はもう少しYAVIで用意されている機能を紹介していきます。

前回の記事は[こちら](https://qiita.com/JY8752/private/e72d228eb49a42c3cbb0)

今回までの成果物はこちらです

https://github.com/JY8752/YAVI-demo

# バリデーション結果の結合(Combining validation results)
YAVIはApplicative Functorと呼ばれる関数型プログラミングの概念をサポートしています。筆者は関数型のプログラミング言語の経験がないのでここら辺の詳しい概念は今回は説明いたしませんが、YAVIでは一連の検証処理の一部または全部が失敗したとしても全ての検証結果(ConstraintViolation)を蓄

元記事を表示

IntelliJの実行構成をいじってアプリ起動前に息抜きする

## 初めに

突然ですが、ビルドしてアプリが実行されるまでって暇ですよね、、、?
その間にいろんな情報を得たい
息抜きしたい…
僕のようなエンジニアに向けて書いています。

## 起動バナー
これは普通のSpring Boot。
![スクリーンショット 2022-12-08 23.33.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408705/3a1b4b4e-96ba-46ef-b96e-2b915ee41208.png)

## 今回やるバナー
起動時に今現在の天気を出力してみる。。。(京都旅行したい。。。)
![スクリーンショット 2022-12-08 23.33.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408705/5b3d7c54-be29-2111-f3f1-7a856eb2f4c4.png)

見切れてるけど毎回違うモンスターの画像を出力したり。。。
![スクリーンショット 20

元記事を表示

Javaで何か作ってみる(2022/12/8 Day49)

## 今日やった事
– オブジェクト指向の動画教材を見た。(**J2-03_カプセル化** まで見た。)
## 参考にしたもの
– [Spring 入門 ~ SpringBoot 2 を使ってお問い合わせアプリとToDoアプリを作る ~](https://www.udemy.com/course/java_spring_beginner/)
– [【超初心者も必見】Javaプログラミングの「オブジェクト指向」が絶対理解できる講座【プロ講師が丁寧解説】](https://www.udemy.com/course/uz-java-obj/)
## 所感
– private、protected、publicを意識するの、久しぶりだなと思った。
– C#をやってた頃は、privateを多用していた気がする。
– アクセス制御は、適切に出来るようになりたいなと思った。
## 明日の予定
– 引き続き、動画教材を進めていく。

元記事を表示

JettyでmTLSを使う

本記事は[FOLIO Advent Calendar 2022](https://adventar.org/calendars/7813)の8日目です

# mTLSとは?

mTLS(mutual tls,相互TLS)とは、サーバーだけでなくクライアントについても証明書による検証を行う通信方式。
一般的なWebサイトではクライアントの正当性を証明する必要性は少ないが、エンタープライズレベルのセキュリティーが必要とされるケースなどで使用される。とくにゼロトラストなどのバズワードと一緒に使うと効果が大きい。

# 使用するツール

* Java
* OpenSSL
* Jetty
* Google HTTP Client

# 証明書の作成

サーバー・クライアント双方にオレオレ証明書を作成する。
Javaを使う場合一般的にはkeytoolで直接証明書を作成することが多いが、筆者はkeytoolが嫌いなためopensslを使用する(そのほうが応用も効くと思う)。

## CA証明書の作成

“`
openssl req \
-new \
-x509 \
-new

元記事を表示

Java Bronzeをオンラインで受験してみた

# Java Bronzeをオンラインで受験してみました
Java Bronzeは、SilverやGoldとは違い、唯一オンラインでも受験可能な試験です。

試験前にJava Bronzeについて色々調べてみましたが多くの記事には「__オンライン受験はできるが、英語での試験になる__」と書かれていました。

英語での試験でも特に抵抗はなかったのでオンライン受験を選びました。(__実際はしっかり日本語でも対応していましたのでご安心ください__)

## 受験準備
私は受験しよう!と決めた日の前日に準備し始めました。

試験チケットのようなものがメールで発行されて、チケット番号を入れると試験が受けられる、という流れでした。

いざチケットを買って送られてきたメールを見ると、英語で「もしかしたらチケット発行まで3日かかるかも⭐︎」と書かれていて「え…明日受けられないかもしれない泣」と落ち込みましたが、1時間後くらいにちゃんとチケット発行のメールが届きました?

## いざ受験!…とその前に
オンライン試験は、時間も指定できますのでお好きな時間に受けちゃってください!

でもその前に、、、カン

元記事を表示

POSTリクエストのパラメータの話

# 背景
こんなAPIのControllerがあった。
(Java/Spring Boot)

“`java
@PostMapping(“/hoge”)
public ResponseEntity postHoge(@RequestParam(“fuga”) String fuga) {
// ~~~
}
“`

それに対してフロントエンドから`axios`を使ってこんなリクエストをした。

“`typescript
const requestHoge = async (fuga: string): Promise => {
await axios.post(‘/hoge’, { fuga: fuga })
}
“`

すると、`400 Bad Request`が返ってきた。

# 原因
APIはパラメータを`リクエストパラメータ`(フォームデータ)で待っていたのに対し、
フロントエンドは`リクエストボディ`で送ってしまっていた。

# 対処
axiosのPOSTリクエストでフォームデータを送るには、
一旦`FormData`インスタ

元記事を表示

9. Palindrome Number

https://leetcode.com/problems/palindrome-number/

## アプローチ
### Brute force

“`java
class Solution {
public boolean isPalindrome(int x) {
if (x < 0) { return false; } String a = String.valueOf(x); StringBuilder b = new StringBuilder(); for (int i = a.length() - 1; i >= 0; i–) {
b.append(a.charAt(i));
}
return b.toString().equals(a);
}
}
“`

元記事を表示

Leetcode 872. Leaf-Similar Trees

# 872. Leaf-Similar Trees

https://leetcode.com/problems/leaf-similar-trees/

## 難易度
### Easy

## アプローチ
### DFS

“`java
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {

元記事を表示

試しにインタフェースクラスでプログラミングをしてみる。

# はじめに
lombokのアノテーションの意味を理解をしていることを前提として記事を書いています。
解説はしない。メモ用だ。

# 簡単な setter/getter

二通りの設計がある。
* 従来のメソッド
* チェーンメソッド

前者は、一行/一メソッドである。可読性重視コーディング方法、メソッドを細かくまとめたメソッドを書いていくことによって解消される。

後者は、一行/複数メソッドである。適切なフォーマットをしなければ可読性が下がってしまう。それとチェーンメソッドの設計( Builder クラス)がとんでもなく難しい。
これにパラメータの型を使用しているクラス(Map, Supplierなど)とかを使うと難易度、爆上がりか?

後者のチェーンメソッドで設計する。

## 従来のメソッド
古いライブラリ や 初心者向け などで見かけるコーディング設計
“`Java
@Data
public class Test implements ITest{
public int num;

public void testcode(){
// p

元記事を表示

ChatGPTにMinecraftのMODを作ってもらう(前編)

ChatGPTにMODを作ってもらおうと思います。前編はChatGPTに任せきりにして、後編で手直ししていこうと思います。結論から申し上げますとあまりうまくいきませんでした。

# はじめに
ChatGPTを使ってUnityでゲームを作っている記事を読んだので、それならMineraftのMODも作れるではないかと思いました。

Forgeを導入する手順をすっ飛ばしている気がしますが、このように丁寧に教えてくれます。
私はIntelliJの方が慣れているので、IntelliJでのやり方を聞いてみましょう。

Java8で16進数の論理和を計算するのだ。

# いきさつ
– 仕事で論理和のコードを書くことになったのだけれど、完全に忘れていたので調査した次第なのだ。

# 論理和とは
– 一つでも正しかったらOK、全部ダメだったらNG
– 要するに「OR」
– 参考:https://wa3.i-3-i.info/word11663.html

# 書いてみた
“`java:main.java
public static void calcOr(){
Integer num1 = Integer.decode(“0x007F”);
Integer num2 = Integer.decode(“0x0030”);

Integer or = num1 | num2;
System.out.println(“OR(Decimal) : ” + or); // OR(Decimal) : 127
System.out.println(“OR(Hex) : ” + Integer.toHexString(or)); // OR(Hex) : 7f
}
“`

元記事を表示

Javaで何か作ってみる(2022/12/7 Day48)

## 今日やった事
– オブジェクト指向の動画教材を見た。(**J2-02_コンストラクタ** まで見た。)
## 参考にしたもの
– [Spring 入門 ~ SpringBoot 2 を使ってお問い合わせアプリとToDoアプリを作る ~](https://www.udemy.com/course/java_spring_beginner/)
– [【超初心者も必見】Javaプログラミングの「オブジェクト指向」が絶対理解できる講座【プロ講師が丁寧解説】](https://www.udemy.com/course/uz-java-obj/)
## 所感
– thisの使い方について、理解出来た。
– ただ、thisは便利な反面、「どのthisなのか」を把握した上で使わないとバグに繋がるので気を付けたいと思った。
## 明日の予定
– 引き続き、動画教材を進めていく。

元記事を表示

JVM系统运行时内存分析工具-MAT

工欲善其事必先利其器!只有对Java服务应用的内存使用情况充分了解,才能保持其健壮性。Java对象的内存分布情况可以通过JDK自带的工具`jmap`获取,对内存情况的分析JDK也提供了相应的工具`jhat`。由于`jhat`使用起来并不友好,更多的时候用的是更为强大且直观的内存分析神器`MAT`。

* 基本用法
* 真实案例分享
* 总结

## 基本用法

1. 下载[MAT](https://www.eclipse.org/mat/downloads.php)。
2. 获取内存dump文件。
3. 运行`MAT`分析文件。

下载安装MAT是相当简单的,这里就不过多描述。至于如何获取内存的dump文件?一般有三种方式:其一我们可以通过`jmap`去获取当前Java进程的堆内存信息:

“`shell
# 1. 直接查看对象分布
$ jmap -histo ${PID}

# 2. 使用jmap生成堆内存转储快照
# format=b:二进制 dump.hprof:文件名
$ jmap -dump:live,format=b,file=dump.hprof $

元記事を表示

Java Memery Model

要想在日常开发中写出高性能高可靠的Java服务,熟练掌握并发编必不可少的。要想熟练掌握并发编程的技巧,就得先厘清一些和并发相关的基础理论知识,而JMM就是Java并发的核心基础。下面是是本文将描述的几个核心问题:

* JMM是什么?
* 重排序
* happens-before
* 内存屏障
* Java相关
* 总结

## JMM是什么?

Java内存模型[以下称JMM]是什么?先看看什么是内存模型.现在的多核处理器系统中[^JOA],处理器通过多级缓存来加快数据访问,提高了性能的同时也面临了一个挑战:当两个及以上处理器同时查看同一个内存位置(比如更新同一个变量)的时候会怎么样,能看到相同的值吗?这个问题对初学者来说很抽象,观察同一个内存位置难道看到的值会不一样吗?答案是可能不一样,因为程序在运行的时候所读取的数据是来自缓存(先看一级缓存有没有,没有再去二级缓存拿,如果所有缓存都没有就会去主存加载),可见程序使用的变量值是内存的一份拷贝,如果在程序计算的过程中主存中的值发成变化了,那么当前处理器就无法感知了。

这个时候内存模型就派上用场了。**内存模型定义了一个处理器如何才能

元記事を表示

DUBBO 扩展点加载机制

Dubbo扩展点[SPI]加载机制使整个框架接口和具体实现完全解耦,使得Dubbo具有良好的扩展性,比如注册中心可以使用Zookeeper、Nacos等,只需要在配置文件中设置就可灵活切换。Dubbo SPI功能上借鉴了JDK SPI,并在其基础上做了一些性能方面的改进。Dubbo SPI是整个框架实现的基石,这里主要探究其实现原理及所用到的设计思想,内容包括:

* Dubbo SPI vs JDK SPI
* 扩展点注解:@SPI、@Adaptive和@Activity
* 动态编译
* IoC & AOP
* 设计模式

## DUBBO SPI VS JDK SPI

*JDK SPI*

JDK SPI使用了策略模式,一个接口多种实现。使用起来非常简单:首先定义一个接口,然后写实现类,接着是在资源文件中配置需要使用的实现类,最后用在代码中使用`ServiceLoader`进行加载使用。下面用一个加解密SPI的例子来说明其使用方式及原理:

1. 定义个加解密的接口。
“`java
package com.joeycoding.spi;
public

元記事を表示

分布式锁之Redis实现

`redisson 3.16.7`

Redisson作为Redis的Java框架,通过Redis实现了一套相对完整的分布式锁的解决方案。这里主要通过其源码分析分布式锁实现的细节。接下来的内容包括:

– Redis简单介绍
– Redis分布式锁实现的理论基础
– 锁的核心概念实现细节
– 总结

## Redis简单介绍

传统的Java锁机制在单体应用中能解决并发访问的问题,但在如今分布式、微服务技术下应用部署都是集群的方式,传统的Java锁无法跨`JVM`使用,这样分布式锁就应运而生了。通俗的讲锁的核心概念是:当前线程去获取一个锁[资源],能拿到就执行操作,不能拿到就等待[一些锁可设置等待时间]…。

**数据库的方式实现分布式锁**

根据锁的概念,可通过传统关系型数据库[如MySQL]的`SELECT … FOR UPDATE`语义实现分布式锁,这也就是行锁的方式。[这里就不描述细节了]。这种解决方案的缺点是:首先需要封装一套完整的并发锁解决方案处理锁互斥、重入、超时等各种细节;其次行锁性能消耗大,高并发下容易出现性能瓶颈,对应用系统来说是致命的。

Redis作为

元記事を表示

分布式锁之Zookeeper实现

`curator-recipes 5.1.0`

Curator作为分布式协调系统Zookeeper的Java框架,通过Zookeeper实现了另一种分布式锁的解决方案[[Redis的实现方案](https://qiita.com/joey1108/items/3aad95412b35ed711178)]。这里主要通过Curator源码分析其分布式锁实现的细节。接下来的内容包括:

– Zookeeper实现分布式锁图解
– Zookeeper分布式锁实现的理论基础
– 锁的核心概念实现细节
– 总结

## Zookeeper实现分布式锁图解

![Zookeeper_分布式锁.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228534/ebe6318b-4b5a-4e5a-04bc-b65925ea0353.png)

分布式锁解决的是传统的Java锁无法跨`JVM`使用的问题。如图所示,多个客户端【Clinet】相当于不同`JVM`进程,它们同时去获取锁,每个获取锁的线程在没有获取到锁时会进入等待

元記事を表示

Eureka 注册中心源码分析

`eureka version:2.x`

这篇文章不讨论Eureka如何使用,只分析Eureka作为注册中心是如何实现高可用的服务注册、服务续约、故障感知和自我保护等功能的。

– 核心功能模块
– 核心数据及其处理组件
– 服务实例核心功能及算法[重点]
– 总结

## 核心功能模块

![Eureka_功能模块.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228534/58f848f4-3bfa-55dd-a59e-e4f35378288e.png)

Eureka注册中心是通过HTTP协议进行服务实例数据传输的。**eureka-server**是整个注册中心CS模型的服务端,它通过各种 properties 文件及 web.xml 创建了一个处理HTTP网络请求的WEB应用。

**eureka-client-jersey2**:封装了RESTful风格的网络框架[Jersey](https://eclipse-ee4j.github.io/jersey/),用来处理 eureka-cl

元記事を表示

OTHERカテゴリの最新記事