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

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

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

元記事を表示

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

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

今回はJava製のバリデーションライブラリであるYAVI(ヤバイ)の基本的な使い方を紹介します。

# YAVIとは??
https://github.com/making/yavi

Javaでバリデーション実装する際にはよくBeanValidationが使用されると思いますが、BeanValidationはアノテーションベースのライブラリになります。YAVIはアノテーションベースではなく、ラムダ式でバリデーション実装をし、グループやカスタマイズ機能なども備えた型安全なバリデーションライブラリです!

もともとどこかの勉強会で知り、興味があったのと以前業務でBeanValidationを使用したバリデーション処理に非常に苦労したことがあったため今回記事を書いてみることにしました。

# Getting Started
以下の依存関係を追加するだけ。準備が簡単でヤバイ。

“`kotlin:build.g

元記事を表示

インスタンスの使用方法(コンストラクタ含む)を演習

# 問題
Humanクラスをインスタンス化してmanを作り、自己紹介メソッドsayHalloを実行してください。

“`java
public class Human {
String name; //インスタンス変数を定義
int age;

public Human(String name, int age) { // コンストラクタを追加
this.name = name; //インスタンス化した時に受け取ったnameとageを
this.age = age; //インスタンス変数に代入し初期化する。
}

//インスタンスメソッドsayHelloを追加
public void sayHello() {
System.out.println(“私の名前は” + this.name + “です。” + this.age + “歳です。”);
}

// 動作確認用メソッド
public static void main(String[] args) {
//Humanクラス

元記事を表示

Leetcode 268. Missing Number

# 268. Missing Number

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

## 難易度
### Easy

## アプローチ
### Hashmap

“`java
class Solution {
public int missingNumber(int[] nums) {

HashMap hashmap = new HashMap<>();

for(int i = 0 ; i <= nums.length ; i++){ hashmap.put(i, false); } Arrays.stream(nums).forEach(obj -> {
hashmap.put(obj, true);
});

return hashmap.entrySet().stream()
.filter(obj ->

元記事を表示

Leetcode 938. Range Sum of BST

# 938. Range Sum of BST

https://leetcode.com/problems/range-sum-of-bst/

## 難易度
### Easy

## アプローチ
### DFS

“`java
package com.leetcode.easy;

public class RangeSumOfBST938 {
public static void main(String[] args) {
TreeNode938 treeNode938 = new TreeNode938();
treeNode938.val = 10;

treeNode938.left = new TreeNode938();
treeNode938.left.val = 5;

treeNode938.right = new TreeNode938();
treeNode938.right.val = 15;

treeNode938.left.left

元記事を表示

【AWS Java SDK 1 & 2】LocalStackを使ってS3にファイルを保存する

投稿時点でAWS for Java SDK 2の情報が少なく感じたのでjavaでコードを書いてみました。v1と大差ないしメリットも少ないようなのでv1で運用してる方が多いのかな。いずれにしてもv2が主流になりそうなので、まずはjavaでお試し。

# LocalStackについて
AWSサービスをローカルで使うことが出来るエミュレーションサービスです。無料版と有料版がありますが無料でも十分AWSをローカル環境で開発、テスト可能です。とりあえずAWSに触れてみたい方にはオススメのサービスです。serverlessなサービスなら無料でほとんど利用できます。(S3、lamdba、SQS、DynamoDBなど)
dockerの知識がある方、DockerDesktop等をPCに環境構築できる方が前提となります。
[LocalStack公式サイト](https://localstack.cloud/)
[Docker Desktop公式サイト](https://www.docker.com/products/docker-desktop/)

# AWS for Java SDK 1
v1ではp

元記事を表示

AndroidスマホとOBD2アダプターを使って車の内部情報を取得するのに「obd2-lib」を活用

# はじめに

bluetooth対応のOBD2アダプターを車のOBD(故障診断)コネクターと接続し、車の内部情報を取得するAndroidスマホアプリを作りたいと思います。類似のアプリは多数ありますが、自分なりに確認したり点や、改造したいところがあったので、自作を考えました。

OBD2アダプターの多くは「ELM327」というチップを使っているようで、車の内部情報を取得するにはOBD2アダプターに、[「ELM327 datasheet」](https://www.elmelectronics.com/wp-content/uploads/2016/07/ELM327DSF.pdf)にあるような手順でATコマンドを送信し、プロトコルの設定や車側の対応の有無のチェックし、対応している情報をリクエスト、データ受信、物理的な値に変換すればよさそうです。

OBD2に関するライブラリーも多くあるようですが、google検索でたまたま見つけた[「obd2-lib」](https://android.googlesource.com/platform/packages/services/Car/+

元記事を表示

CDIされたBeanについて、@PostConstructor, @PreDestroyの呼ばれるタイミングを確認

CDIのBeanについて@PostConstructor, @PreDestroyの呼ばれる順番を
確認する。
コンソールに吐き出したログを確認。

“`Bb.java
@Named
@RequestScoped
//@SessionScoped
public class Bb implements Serializable{
private String text;
static {
System.out.println(” bb static initializerがコールされた”);
}
{
System.out.println(“bb initializerがコールされた”);
}

public Bb() {
System.out.println(“bb constructがコールされた”);
}
@PostConstruct
public void pconstruc1() {
System.out.println(“bb pos

元記事を表示

SpringBoot MVCで簡単なWEBアプリを実装してみる

## はじめに
[株式会社ピーアールオー(あったらいいな!を作ります) Advent Calendar 2022](https://qiita.com/advent-calendar/2022/pro-japan1) の7日目になります。
前日は[[AWS]SAMでTypeScriptがサポートされたので5分でAPIを作成する](https://qiita.com/hf7777hi/items/6d2b093d6ed7271cf81b)でした。

前に[Spring Boot + RemoteContainer](https://qiita.com/tajima_haru/items/d4e5082e6ba68ef4e960)の環境構築をしてHelloWorldまで表示させたので、SpringMVCの機能を利用して簡単なWebアプリケーションを作ります。

## build.gradle
build.gradleファイルのdependenciesにThymeleafなど定義します。
[spring initializr](https://start.spring.io/)で設定するで

元記事を表示

Javaのローカル変数の冗長について調べてみる

# はじめに
こんにちは、こんばんは、ココネ株式会社のサーバーを担当しています。
本ページではJavaを書いていてスタイルチェッカーで指摘されるローカル変数の冗長化について調べてみたことを書きます。

# Javaコード
以下のコードをまずは見てみます。
単に足し算するだけのaddtion methodがあるシンプルなコードです。

“`Java
public class Calculation {
public static void main(String[] args) {
int x = 1;
int y = 2;

int answer = addition(x, y);
System.out.println(answer);
}

public static int addition(int x, int y) {
int answer = x + y;
return answer;
}
}
“`

# コードチェッカーにローカル変数が冗長と注

元記事を表示

Spring BootでElasticache for Memcachedのキャッシュ操作をしてみた

この記事は [アイスタイル Advent Calendar 2022](https://qiita.com/advent-calendar/2022/istyle) 7日目の記事です。

こんにちは。アイスタイルにて会員基盤の運用保守や機能改修を担当しているyukawacです。

[Spring Boot](https://spring.io/projects/spring-boot)で[Elasticache for Memcached](https://aws.amazon.com/jp/elasticache/memcached/)のキャッシュ操作をする機会があったので、
キャッシュ操作するまでに実施したことやコード例を書きます。

⚠️注意⚠️
※本記事ではElasticache for Memcachedへ疎通するためのネットワーク周りの設定については記載しません。
※ローカル環境にて、JavaとDockerの実行環境は構築済みとします。
※ElastiCache for Memcachedクラスターは作成済みとします。

## 一連の流れ
1. ローカル環

元記事を表示

RecyclerViewでConcatAdapter利用におけるonBindViewHolderのposition

# はじめに
RecyclerViewでConcatAdapter利用におけるonBindViewHolderのpositionは何のpositionなのかわかったので自分メモです。
# 結論
ConcatAdapterを使うには複数のAdapterを作るが、それぞれのAdapterの表示位置を返している。
それぞれのAdapterのViewHolderごとにpositionを振っているから当たり前といえば当たり前なんだけども…
ViewModelにObjectじゃなくてpositionを送ってたら、Adapter1のposition–>1を選択してるつもりが全部のAdapterのposition–>1を選択してしまうというミスをしていたから一応メモしておこうかと…
![position.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110765/8a8f825a-9f22-0813-b86f-9f6b35a15502.png)
# Code
“`java:ConcatAdapter.java

元記事を表示

マイクラサーバーを動かす

# 初めに

この記事ではminecraft serverを使用してワールドを生成するまでの流れを説明します.
この記事にほしい情報がなくても,マイクラサーバーを構築する方法は検索すればたくさん出てくるので,いろんな記事やサイトを見てください.

また,使用OSはLinux系を想定しています.私の環境だとWSLのUbuntu 22.04.1です.ただ,OSに大きく依存するようなことはしていないはずです.そのため,WindowsやMacでも問題ないかと思います.ただ,java17以降が必要になりますので,特にWindowsはPATHの設定をする必要があるかと思います.このあたりの話は触れませんので,ご自身でどうにか頑張ってください.ともかく,java17以降が使えれば問題ないです.

# minecraft server

## 概要

minecraft serverとは,[minecraft](https://www.minecraft.net/ja-jp/about-minecraft)をマルチプレイ,複数人で同時に同じワールドで遊ぶことができるものです.なので,お友達と一緒にマ

元記事を表示

【Cloud9 Advent Calendar Day2】ガチで作業が捗るIntelliJのおすすめプラグイン7選

この記事はCloud9 Advent CalendarのDay2です。

**こんにちは!Cloud9サーバーサイドエンジニアの折原です!**

アドベントカレンダーをやってみると言い出したはいいものの、他の社員が業務に忙殺されていて執筆の時間が取れないため、昨日に引き続き私がDay2の記事を書かせていただきます。

思い返すといつもいつもやることが唐突で行き当たりばったりの人間なんですが。
毎回付き合ってくれる社員の皆様には本当に感謝しております。

というわけでDay2行ってみましょう!

## Javaエンジニアが選ぶ!ガチで作業が捗るIntelliJのおすすめプラグイン7選

今回も〇選!系の記事になります。
実は私、今まで現場でEclipseしか使ったことなくて、今のプロジェクトに入って初めてIntelliJを触ったんです。プライベートの開発では使ったことはあったんですが、仕事で使うのは初めてです。

**強力なコード補完機能、検索機能のほか、MavenだけでなくGradleプロジェクト等の各種ビルドツールにも対応していて拡張性がかなり高く、それでいてEclipseよりも軽

元記事を表示

OTHERカテゴリの最新記事