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

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

Kotlinについて徹底的に客観的に分析してみた

先日開催されたJJUG CCC 2021 Fallにて『Kotlinを研究する』というタイトルで発表しました。
その中でいくつか面白さを感じていただけそうな部分をピックアップして紹介していきたいと思います。

# 元発表

**スライド**
https://speakerdeck.com/doyaaaaaken/kotlinwoyan-jiu-suru

**動画**

# 内容概要

現状のKotlinについて徹底的に客観的に分析した内容になります(そういった背景から”研究する”というタイトルにしました)。
基本的には発表は個人的な見解として行うものですが(例:『Kotlinの拡張関数という機能はイケてる!』)、世の中の公開データを元に2021年末現在のKotlinについてなるべく主観を排除して分析してみたら有用な知見になりそうだと感じこのテーマにしました。

# ピックアップポイント

## 1. Kotlinは2016年にv1リリースされた若い言語

他のモダンな言語であるRustやGoよりも後発。
[Goは2012年](

元記事を表示

Kotlinのコンストラクタ仕様を、Javaと比べながら復習する

本記事は、[Kotlin Advent Calendar 2021](https://qiita.com/advent-calendar/2021/kotlin)の12月21日付の記事です。

## Javaの知識が使えるなら、うろ覚えでKotlinのコードを書いてもいい

Kotlinが登場して10年だそうですが、現在はKotlinの先祖であるJavaのプログラマがKotlinに進出したパターンがまだまだ主流なのではないかと思います。Kotlinを使いこなす上でJavaの知識と経験は大きなアドバンテージです。しかし、それにしてもJavaからKotlinになってかなりの部分が変化しており、Java経験者でも覚えることは少なくありません。特にコンストラクタの仕様をJavaと見比べながら本稿でまとめてみると、結構な長さになってしまいました。

ここで筆者が主に書きたいことは、Kotlinのコンストラクタは色々ややこしいが、まぁ何とかなりますよ、ということです。本稿を飽きずに最後まで読み進めるのはかなり大変と思いますので、適当に切り上げて頭の片隅にだけ置いていただき、いざコンストラクタを書い

元記事を表示

はじめて学ぶJava Remote Method Invocation(RMI)

# 前書き

技術名を聞いた時には、全くピンとこなかったのですが
調べてみたら面白かったです。

備忘がてら、概要と動向を纏めます。

# 概要

### この技術なに?

* Java Remote Method Invocation(RMI)とは、
異なるJVM上のインスタンス(RemoteObject)に設けたメソッドを呼び出す為の機能。
* RepogitoryからRemoteObject取得後、普段どおりJavaコーディングする。
* RESTのように「Httpリクエスト投げて…」等と通信を意識する必要は無い。
* 実装例は[ひしだま](https://www.ne.jp/asahi/hishidama/home/tech/java/j2ee/rmi.html)さんが詳しい。
* Java 1.1で導入。
* java.rmiパッケージ配下に、ServerやClientの関連classとinterfaceが有る。

### 興味深い点

* JVMコンテキストでメソッド呼び出せる。
* 分散ガベージコレクション機構を備える。

元記事を表示

Androidネイティブの実装をFlutterでリプレースしたらコード量がすごく減った話

# はじめに
この記事を書くことになった経緯としては、最初にJavaで実装を進めていました。
ですが、開発途中で宣言的UIのフレームワークの良さや凄さを知る機会があり、それによりFlutterを勉強してFlutteで実装したいと思い始めました。
そこで、今作っているものをFlutterで書いたらどうなるのかと思い立ちFlutterでの実装も進めました。
結果として、同じ機能をFlutterで実装してみたところ驚くほど少ないコード量で実装できたので、せっかくだと思い記事にまとめることにしました。
# 紹介する実装の部分
__「Firestoreから取得したデータをGridViewで表示する実装」__
の部分について紹介していきたいと思います。
Androidネイティブの方の実装ではMVVMモデルでクラス分けをした実装になっていますが、Flutterの方はまだ勉強して日が浅いためアーキテクチャモデルまで意識した作りにはなっていなかったりします。
なので実装をするアーキテクチャの前提は違うかもしれませんが、同じ機能を実現しようとした時にどんな感じで実装が出来るのかという視点で見てもらえれば良

元記事を表示

Java レイジー エバリュエーション

[Javaのカレンダー | Advent Calendar 2021](https://qiita.com/advent-calendar/2021/java)の16日目の記事です

_I will always choose a lazy person to do a difficult job. Because he will find an easy way to do it_ – Bill Gates

※ 私はいつも難しい仕事は怠け者にやってもらいます。なぜなら、怠け者は楽なやり方を見つけてくれるからです。 – ビル・ゲイツ

# 概要

Java の遅延評価(lazy evaluation)を Stream API 経由で実行した場合の性能を見てみます

[Java ストリーム](https://qiita.com/gosshys/items/8ff46625f46ed4214de1) で検証したように、1000件以上のオブジェクトを処理してみます

結果は、大雑把に表現するとヒープも処理速度も10倍以上、 Stream API を利用したほうが良いと思いました(感想)

元記事を表示

【Java】いろいろな方法でMapをループさせてみる

# まえがき
Mapのループを忘れがちなので書き残しておきます。
こんな感じのMapをループさせてみます。

“`java
Map map = new HashMap<>();
map.put(“apple”, “りんご”);
map.put(“strawberry”, “いちご”);
map.put(“grape”, “ぶどう”);
“`

# 拡張for文を使ったループ
“`java
for (String key : map.keySet()) {
System.out.println(key + ” は ” + map.get(key) + ” です”);
}
“`

“`
apple は りんご です
strawberry は いちご です
grape は ぶどう です
“`

# ラムダ式を使ったループ
“`java
map.forEach((key, value) -> System.out.println(key + ” は ” + value + ” です”));
“`

“`
apple は りんご です
s

元記事を表示

SpringBoot × MyBatis 中間テーブルへ登録する方法

#はじめに
今回は、自作している学習用チャットアプリで中間テーブルを実装したところ、かなり詰まったので、中間テーブルへの登録方法を備忘録として残そうと思います。
同じように悩んでいる方がいたら参考にしてみてください。

#アプリ概要
ログインユーザーが他の登録ユーザーを選択してチャットを開始するという、DMのようなものが主機能のアプリです。

– リレーション
![test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/879778/860b56c9-08e9-dcbd-0e13-d14d881e41b9.png)

usersテーブルとroomsテーブルが多対多の関係性のため、N+1問題が懸念されるので、中間テーブルとしてroom_usersテーブルを作成しました。

#環境

– Spring2.5.5
– gradle
– MyBatis2.2.0
– MySQL

#中間テーブルへのinsertを実装
今回の実装では、

①チャットルーム作成時に、roomsテーブルにチャットルーム情報を登録する

元記事を表示

Javaを使用してExcelをPDFに変換する方法

##Javaを使用してExcelをPDFに変換する方法

この記事では、ExcelワークブックをJavaプログラムでPDFドキュメントに変換する方法を紹介します。今回は以下の二つの変換について詳細に説明します。

###1. Excelワークブック全体をPDFに変換する
###2. 指定されたExcelワークシートをPDFに変換する

使用ツール:Free Spire.XLS for Java(無料版)

Jarファイルのダウンロードとインポート

公式ウェブサイトから**[ダウンロード](https://www.e-iceblue.com/Download/xls-for-java-free.html)**します。ダウンロード後、ファイルを解凍し、libフォルダー内のSpire.Xls.jarファイルをJavaプログラムにインポートします。結果は以下のようになります。
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/67daec72-43a7-1ba3-549a-11c686

元記事を表示

Elasticsearch + Cloud Run で検索 API を作る

# はじめに

![elastic-search-logo-color-horizontal.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265024/c0683074-fe20-4a0d-ce57-109c6f8618ed.png)

この記事は ZOZO Advent Calendar 2021 24日目の記事です。

この記事では全文検索エンジンの一つである [Elasticsearch](https://www.elastic.co/jp/elasticsearch/) を [Cloud Run](https://cloud.google.com/run) にデプロイして検索APIを作ります。
メルカリさんのテックブログを見たことがある方にはわかるかと思いますが、以下の記事に大きく影響を受けています。

https://engineering.mercari.com/blog/entry/20210906-46976c788c/

上記記事では [Apache Solr](https://

元記事を表示

Effective Java[第3版] 学習のまとめ

# [項目1]コンストラクタの代わりにstaticファクトリメソッドを検討する
クラスのインスタンスを提供するにはコンストラクタを使用するのが一般的と考えられているかが、その他にstaticファクトリメソッドというものがある。
それぞれにメリットデメリットがあるため、場合によってどちらを使うかを検討する必要があり、無意識にコンストラクタを使用することは避けるべきである。

## staticファクトリメソッドとは
**クラスのインスタンスを返す単なるstaticメソッド**

“`java
public static Boolean valueOf(boolean b) {
return b ? Boolean.TRUE : Boolean.FALSE;
}
“`

## staticファクトリメソッドの長所
**1.名前を持つことができる**
例えば確率的素数(probable prime) のBigIntegerを返す場合

**コンストラクタ**
BigInteger(int, int, Random)

**staticファクトリメソッド**
BigInteger

元記事を表示

AtCoder Beginner Contest 010をやった(Java)

AtCoder Beginner Contest 010をやった。
たぶんC問題解けるからのちに追加予定。

##[A](https://atcoder.jp/contests/abc010/tasks/abc010_1)
あだ名をどう求めるかです。

“`Java
import java.util.*;

public class Main {
public static void main(String[] args) throws Exception {
// Your code here!
Scanner scan = new Scanner(System.in);
System.out.println(scan.nextLine().concat(“pp”));
}
}
“`

##[B](https://atcoder.jp/contests/abc010/tasks/abc010_2)
いい方法ないかなーと思ったけど、実践的に考えたら「1 <= 入力値 <= 9」らしいので、パターンで判定した ```

元記事を表示

Java ストリーム

[Javaのカレンダー | Advent Calendar 2021](https://qiita.com/advent-calendar/2021/java)の15日目の記事です

※ 少し呑んでます

# 概要

Java の Stream と List(等) で1000件くらいのオブジェクトを扱ったときのヒープ(メモリ)の使用量がどのように変わるかを確認しました

結果は、Stream の方が List よりも 1/4 のヒープで動いてそうです。これだけでも、Stream を使うメリットを感じられるのではないでしょうか?

:::note warn
大量のデータを扱うようなシーンでは、Stream API よりも Spring Batch などの専用のフレームワークを利用すべしとあるので、あくまでも比較的件数が限られているものの用途に向いてそうです
:::

# 比較したコード

コードは適当なオブジェクトを 1000回分生成してリストに詰める(Stream から List に変換)するものです。

## Stream を使う場合

“`java
void useSt

元記事を表示

Java13〜17 振り返り

アドベントカレンダーに18日に予定入れていたのだが、ダラダラして遅くなってしまった(汗)
以前[この記事](https://qiita.com/yk0807/items/ea2d4b54545c7af37a89)でJava8〜12までの流れをものすごくざっくりと紹介していたので、それから2年9ヶ月の間にJavaがどのように進化していったかを思いっきりざっくりと書き連ねてみる。
ちなみに、Java9からはずっと半年ごとにバージョンが更新されています。

2019年9月 Java13 テキストブロック、switch式など
2020年3月 Java14 Recordクラスなど
2020年9月 Java15 Sealedクラスなど
2021年3月 Java16 VectorAPIなど
2021年9月 Java17(**LTS**) switchのパターンマッチングなど、Javaアプレット廃止

この中だと、Recordクラス、Sealedクラスはうまく使えばプログラミングの幅が広がりそうですね。後、Javaのswitch文は若干使いづらいと感じていたので、これで使いやすくなるかなという期待はあ

元記事を表示

メモリに乗り切らない巨大配列のシリアライズにCBORフォーマットを採用した

## TL;DR

– 要素数が分からず、メモリに乗り切らない可能性がある配列をシリアライズする必要があったので、フォーマットとして CBOR を採用した。
– Protocol Buffers[^protobuf] や Ion, MessagePack, BSON などの主要なバイナリフォーマットで配列を扱う場合、要素数またはバイト長を先頭などに記述する必要があるため、メモリに乗り切らず要素数が簡単には分からない配列を(単純には)シリアライズすることができない
– CBORは要素数不明の配列を表現する手段が[ある](https://www.rfc-editor.org/rfc/rfc8949.html#name-indefinite-length-arrays-an)
– Java/Kotlinの場合、jackson の [jackson-dataformats-binary](https://github.com/FasterXML/jackson-dataformats-binary)を利用してストリームパーサ等を実装することにより、データすべてをメモリに乗せずにシリアライズ・

元記事を表示

JavaのSEがRubyを書くためのまとめ(編集中)

#目的
・Rubyの基本を理解し、他人のコードを読めるレベルに到達する。
・基本を整理しつつ、Javaとの違いを関連付けをしたい。
(・Qiitaデビュー)

#動確環境
**OS**: Mac
**Version**: 2.6.8p205

#基礎知識
##全てがオブジェクト
文字列、配列はJava同様にオブジェクト。
さらには、数値、真偽値、nil(Javaではnull)、正規表現等もオブジェクト。

なので以下のように、それぞれに対してto_sメソッドでオブジェクトから文字列化することも可能。

“`
true.to_s
nil.to_s
“`
##分の区切り
基本的に文の区切りにセミコロン不要、改行でよい。
1行に複数の文を記述したい場合に明示的に;で区切ることは可能。

##コメント
◯1行コメント
Java: //
Ruby: #

◯複数行コメント

“`Java
/*
Javaコメント
*/
“`

“`ruby
=begin
Rubyコメント
=end
“`
##変数
###型定義
動的型付け言語なので、宣言時のデータ型記述は不要。
(慣れないうちはコーデ

元記事を表示

Spring Bootアプリケーションのコンテナ化を試してみた

この記事は[ZOZO Advent Calendar 2021](https://qiita.com/advent-calendar/2021/zozo) #5 23日目の記事になります。

# はじめに
Spring Bootアプリケーションのコンテナ化をしてみました。

またSpring BootではSpring Boot2.3からCloud Native Buildpacksに対応しているため、
Dockerfileを使ったパターンとCloud Native Buildpacksの2パターンでコンテナ化を行ってみました。

# コンテナとは
仮想化技術の一つでアプリケーションの実行環境も含めてコンテナとすることで
環境に依存せずアプリケーションを実行することができる技術です。

# Dockerとは
コンテナ仮想化を用いてアプリケーションを開発・配置・実行するためのオープンプラットフォームです。

# Cloud Native Buildpacksとは
Cloud Native Buildpacksはアプリケーションのソースコードから任意のクラウドで実行できるイメージに変換してく

元記事を表示

[Java]ArrayListとLinkedListの違いについて

この記事は、[シアトルコンサルティング株式会社 Advent Calendar 2021](https://qiita.com/advent-calendar/2021/seattleconsulting)の24日目の記事です。
こんにちは、シアトルコンサルティングの小泉です。

##はじめに
今回はJavaのコレクションフレームワークであるListについて調べてみました。
その中でもArrayListとLinkedListのそれぞれの特徴について説明します。

##ゴール
ArrayListとLinkedListの違いについて理解する。

##はじめに
JavaのコレクションフレームワークであるListについて説明します。

## Listクラス
java.util.ArrayList
・配列型のリスト
・指定位置の要素の取得が速い
・要素の挿入、削除が遅い

java.util.LinkedList
・線形リスト型のリスト
・指定位置の要素の取得が遅い
・要素の挿入、削除が速い

## ArrayList
Listインタフェースを実装したコレ

元記事を表示

Log4Shellデモ(実証〜検出〜修正)を公開しました

#Log4Shellデモ(実証〜検出〜修正)
世間を騒がせている重大な脆弱性Log4Shellを、実際に体験して、修正するところまでを見ることができる動画を公開しました。ぜひご覧ください。

#参考リンク
* [記事『Log4Shellの脆弱性が公開されました:Version 2.17.0にアップデートしてLog4j RCEを防ぐ』] (https://qiita.com/SnykSec/items/fccc10bd25cd5de0b56f)
* [Proof of Concept 用アプリ

元記事を表示

AtCoder Beginner Contest 009 をやった(Java)

AtCoder Beginner Contest 009をやった。

##[A](https://atcoder.jp/contests/abc009/tasks/abc009_1)
3個の段ボールだとして両手で持った時何回往復が必要かを実装してください

“`Java
import java.util.*;

public class Main {
public static void main(String[] args) throws Exception {
// Your code here!
Scanner scan = new Scanner(System.in);
int N = scan.nextInt();

if(N == 1 || N == 2){
System.out.println(1);
} else {
if(N % 2 == 0){
System.out.prin

元記事を表示

Stream API の裏を覗いてみた

この記事は [セゾン情報システムズ Advent Calendar 2021](https://qiita.com/advent-calendar/2021/sisco) の 23 日目の記事です。

※ 注意:本記事は **Stream API の使い方を説明するものではありません**。

# Java の Stream API を使ってますか?

Java 開発者のみなさん、Stream API を使っていますか?もちろん、使っていますよね。(反論は認めません)

Stream API をうまく使うと表現力の豊かなソースコードを書けるから、 Java 開発者なら学ばない理由はないでしょう。

もし Stream API の使い方にまだ自信持っていないなら、Java 8 以降を対象とする入門書籍なら必ず取り上げているので、ぜひご自分の好みに合う一冊を見つけて熟読して身につけましょう。

そんな普段何気になく使っている Stream API ですが、今日はその裏にあるものを覗いてみたいと思います。

なお、この記事では以下のような用語の使い分けを意識しています。

* `Stream`

元記事を表示

OTHERカテゴリの最新記事