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

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

Javaを使用してバッチでWordの空白の段落を削除する方法

##テストドキュメント、期待される目標ドキュメントの効果

テストに使用されたWord文書を以下のように示します。含まれている空白の段落は、記事の全体的なレイアウトと美的な効果に影響を与えます。
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/d5b7da9b-03c9-8adc-3428-77c739d12e2a.png)
**目標ドキュメントの効果**
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/200bae8c-205e-0fc7-6d70-462bd212eac3.png)
##補助ツール
クラスライブラリを使用する:**[Free Spire.Doc for Java](https://www.e-iceblue.com/Download/doc-for-java-free.html)**(無料版)
クラスライブラリjarファイルのインポート(参照用の2つのインポ

元記事を表示

AtCoder001をやった(Java)

AtCoder001をやった。
URL張り付けてて思ったけど、昔ってAtCoderの各問題の末尾は**abcxxx_[数字]**なんですね。。

##[A](https://atcoder.jp/contests/abc001/tasks/abc001_1)
引き算によって積雪を求める問題。
単純に1つ目の入力値から2つ目の入力値をひいてあげればよい

“`
import java.util.*;

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

while (scan.hasNextLine()) {
String str = scan.nextLin

元記事を表示

【Java】クラス変数につけるprivate static finalについて

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

こんにちは、シアトルコンサルティングの 羽田野 と申します。
この度、弊社 シアトルコンサルティング株式会社 でAdvent Calendarに参加することになりました。

TeamTech Move the WorldをMissionに掲げ、日々全力で業務に取り組んでおります!
少しでも興味を持って頂けたら下記のサイトを覗いてみてください!

コーポレートサイト

ホーム


Wantedly
https://www.wantedly.com/companies/seattleconsulting
よろしくお願い致します!

## はじめに ~クラス内の定数にstaticいるの?~

今まで何も考えずにJavaのクラス定数の修飾子をprivate static finalとしていたけど、
クラス内

元記事を表示

【Android】ストレージ系を簡単にまとめる

株式会社パーソンリンクアドベントカレンダー14日目です!?
本日12/14は、南極の日だそうです。
> 1911(明治44)年のこの日、ノルウェーの探検家・アムンゼンと4人の隊員が人類で初めて南極点に到達した。
よろしくお願いします。

## はじめに
Anroidアプリでファイルや画像を保存する時に、
保存ディレクトリを取得することがあるのですが、どこに保存すれば良いのか、どんな違いがあるのか、すごくややこしいので簡潔にまとめます。

## その前に
Androidはメジャーバージョンが年に1回上がるらしいです。
Android9.0からAndroid10.0へ みたいな
バージョンが上がると非推奨になるメソッドや処理が当然ながら出てきますが、
今回は非推奨になっているものも含んで紹介します。
スマホ業界は、プライバシーを守るため、セキュリティの向上のために、バージョンを上げて対応していきますが、アプリ開発者はその対応に必死です。
→場合によってはこれに対応しないとリリースできないよーってなるみたいです。

## 内部ストレージ系
端末ストレージに保存する内部ストレージ系
Andr

元記事を表示

jOOλ で Java の Stream 記述は楽になるよ!(ものぐさな人向けな Stream ライブラリ)

## jOOλ とは
jOOQ シリーズの一部として提供されている
Java の lambda や Stream まわりを使いやすく+強化してくれるライブラリ
jOOQ とは独立して単体で利用可能

## jOOλ の概要
https://github.com/jOOQ/jOOL
https://www.baeldung.com/jool

## jOOλ の構成
– org.jooq.lambda.function → Function を 1~16 用意
Java は Function, BiFunction だけ
– org.jooq.lambda.tuple → Tuple1~16 を用意
Java には Tuple がない(原則としてはクラス定義しろ)のに対して、Tuple があると複数の任意の型のオブジェクトを保持できる型を定義することができる。Stream の途中や結果等で一時的にしか使わないデータ格納用クラスとして重宝
– org.jooq.lambda.Seq → 他の関数型言語を参考にして Java の Stream を強化して便利にした!
– org.j

元記事を表示

【java】スレッドセーフではないHashMap

#概要
以前マルチスレッド環境における「java.util.HashMap」に対し、複数のアプリがアクセスした際、応答が帰ってこなかっり、HashMapの値が入れ替るなどの事象がありました。
その原因や対応など備忘録的に以下を記載しようと思います。

#原因
とても単純で、「java.util.HashMap」は複数のスレッドから同時にputやgetが実行されると何が応答されるか保障されないことを理解していなかったり、排他制御をしないで使用していたからです。
この事象について調べてみると、昔からいろいろなサイトに記載されていることがわかります。

**■何が応答されるかわからない**
どうやらHashMap.putを実行すると、HashMap内のデータ構造が再構築されるみたいです。
この最中にgetが実行されると、指定されたキー情報を元に対象を検索しに行きますが、再構築中のため延々と検索したりして何を応答するのか予想がつかないみたいです。
これは、よく言われるputとgetが同時実行された際に起こる、無限ループやデータ構造が破壊される事象です。

**■HashMapの値が入れ替る**

元記事を表示

defaultString

# defaultString
**変換対象の文字列がNULLの場合、空文字に変換する。**

nullがわたる可能性がある箇所で、空文字を渡したかったので以下のように実装していたのですが、こういったメソッドがあるということを知ったので投稿します。
以下自分が書いた感じのコード

“`java
while (rs.next()) {
String number = “”;
String cumulative = “”;
String sNumber = “”;
String sCumulative = “”;
String nNumber = “”;
String nCumulative = “”;

cumulative = rs.getString(“TOTALCUMULATIVE”);
sNumber = rs.getStrin

元記事を表示

プログラミング未経験者がコードを書きながら楽しく無料で独習する際の最初の10時間の使い方:Java編

## はじめに

はやいものでJavaを使い初めてから14年目になる開発者です。

この記事では以下を目的としてまとめたものです。

「プログラミング未経験者が10時間以内に動く小さなJavaアプリケーションの実装を無料で独習し、楽しむ」

自身が初学者の時に結構つまずいたので、こういう風なスタートを切れば良かったなという経験をもとに書いています。同じようにプログラミングにつまずいてしまった人やこれから勉強を始めたい人の役に立てば幸いです。

当記事の後に初学者向けの記事や動画、本などを読むとキャッチアップがよりスムーズにできるのではないかと思っています。

記事内で紹介させていただいている記事や動画は2021年12月12日現在無料のものです。

## 想定読者
– プログラム・Java未経験者
– 躓いてしまったJava初学者

##記事の内容を実践して達成できること
– Javaの基本の構文が理解できる
– 開発環境のセットアップができる
– 小さいコンソールアプリをつくって動かす体験ができる
– 小さいデスクトップアプリををつくって動かす体験ができる

元記事を表示

Java: Mavenプロジェクトの依存ライブラリを確認する(dependency:tree)

Javaプロジェクトが利用しているライブラリは、どのように確認すればよいのでしょうか。

単純に直接依存しているライブラリを確認するだけでは不十分です。たとえば、ある依存ライブラリがさらに別のライブラリに依存しているという関係性(推移的依存)があるからです。ほかにも、単純にwarファイルを展開して含まれているjarの名称を確認するだけでは、[fat jar(uber-jar)](https://qiita.com/seijikohara/items/ba259aedddff726d995a#fat-jaruber-jar-%E3%82%92%E4%BD%9C%E6%88%90) の存在をカバーすることができません。

誤った方法で確認してしまうと、調査漏れが発生してしまう危険性があります。このため、本記事では比較的容易かつ確実性の高い方法を紹介します。

# 前提

下記の両方を満たしていることが必要です。

– 調査対象がMavenプロジェクトとして構成されていること
– 作業端末において、Mavenにパスが通っていること (参考: [WindowsへのMavenインストール](ht

元記事を表示

Log4Shell 脆弱性の対策をした話

# Log4Shell 脆弱性(CVE-2021-44228)の対策をした話

## Log4Shell 脆弱性?
Java製のアプリケーション・ミドルウェアで幅広くつかわれている Log4j2 で、任意のコードを実行できる脆弱性が 2021/12/10(金) に発見され、Log4Shell という名前が付けられたようです。
ログに出力されるであろう箇所(ユーザ名やパスなど)に、jndi lookup を行う文字列を埋め込むだけで実行してしまうもので、容易に当該脆弱性をつけ、危険度の高い(各スコアで最高スコア)状態にあります。

週末ではありましたが、この土日緊急メンテナンスに入るサイトもいくつか見受けられ、業界が素早く対応していました。

脆弱性の内容については、[12/12のサイオスさんの記事](https://security.sios.com/vulnerability/misc-security-vulnerability-20211212.html)がわかりやすかったです。

## 自社の状況

自社では、社内で利用するためにいくつかのサービスを運営しています。
当然その中

元記事を表示

Android Javaアプリケーション開発に、NoSQLドキュメント指向モバイルデータベースCouchbase Liteを使ってみる

## はじめに

本稿では、Android Javaアプリケーション開発に、NoSQLドキュメント指向モバイルデータベース Couchbase Liteを使うための具体的な方法について解説します。

本稿では、Couchbase Lite 3.0.0ベータ版をAndroid Javaアプリケーションで利用する際の動作確認までを行います。

Couchbaseをモバイルアプリケーションで利用する意義については、以下の記事をご参考ください。

https://qiita.com/yoshiyuki_kono/items/3abd5e32801060a449d2

### 確認環境

– macOS Catalina Version 10.15.7
– Android Studio 4.1.3

## 実行手順

### プロジェクト作成・Couchbase Liteインストール

Android Studioで新しい「Empty Activity(空のアクティビティ)」プロジェクトを作成します。

「Language」として「Java」を選択します。

また、「Minimum SDK」と

元記事を表示

Log4Shellの脆弱性が公開されました:Version 2.15.0にアップデートしてLog4j RCEを防ぐ

本記事は2021年12月10日に公開した英語ブログ[Log4Shell vulnerability disclosed: Prevent Log4j RCE by updating to version 2.15.0](https://snyk.io/blog/log4j-rce-log4shell-vulnerability-cve-2021-4428/)の日本語版です。

![logo-solid-background.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2216557/07433fa4-f0a8-d437-cbe3-8448837570ce.png)

本日(2021年12月10日)、新たに重大な[Log4j](https://logging.apache.org/log4j/2.x/)の脆弱性が公開されました。[Log4Shell](https://techcrunch.com/2021/12/10/apple-icloud-twitter-and-minecraft-vulnerab

元記事を表示

AtCoder230をやった(Java)

AtCoder230をやった。
※諸事情でリアルタイム参加できなかったから、、泣

##[A](https://atcoder.jp/contests/abc230/tasks/abc230_a)
文字列を出力する問題
与えられた数字が
1~9だと、**AGC00x**と表示
10~41だと、**AGC0xx**と表示
42~54だと、基盤となる数字に1を足して、**AGC0xx**と表示
※ソースはクソです。多分もっといい書き方あります

“`
import java.util.*;

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

list.add(scan.nex

元記事を表示

lombok こう使ってます!

## lombok とは
Java の主にクラス記述上記述が必要だけどめんどくさい細々とした定番コード(いわゆるボイラープレートコード)を、アノテーションを元にして自動生成してくれるライブラリです。

Java のコンパイラーでは、Pluggable Annotation Processing API として仕様が定義されているアノテーションプロセッサを追加することが出来ます。
Annotation Processing では、Java のアノテーションをコンパイラに対する指示として扱って、コンパイル途中に割り込んで追加のコード生成ができるようになっています。
(アノテーションプロセッサは既存のコード自体を書き換えることはできません)

一般的には元となるソースコードとは別に新しいソースコードを生成して、それも含めてコンパイル対象にするような処理がされます。

公式では次のように図示されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397251/8955452a-4f8b

元記事を表示

[JNI] nativeからJavaのStreamの消費とパフォーマンス

現在従事しているプロジェクトのプロダクトはJava製ですが、一部の実装にnative (C++)実装を含んでおり、JNIでJava-nativeコミュニケーションを実装しています。
今回は少し前にnativeに計算させるデータの渡し方を修正したので、改めてその実装のパフォーマンスを計ってみようという記事です。

## array実装版
とりあえず修正前の実装と同様のサンプルコードです。
(計測に使った最終的なコードは[こちら](https://github.com/kikuchi-m/ac2021-jni-sample)。)

nativeに渡すデータは、複数の`long`のセットのコレクションです。array版ではすべてをいったん`long[][]`にして一度に渡します。

“`java:Application.java
package jp.co.atware.ac2021.jni.app;

public class Application {

public static void main(String… args) {
System.

元記事を表示

難読化について

不具合解析するにもソースがないから[リバースエンジニアリング](https://atmarkit.itmedia.co.jp/ait/articles/0401/01/news051.html)して実施した。

といった話を最近聞く機会があり、過去にリバースエンジニアリング対策で難読化を実施したなと思ったのが本記事を書こうと思ったきっかけです。実施したのが結構前で覚えていない部分が多いので、実際に試しながら見ていきたいと思います。

難読化とは

そもそも難読化とは

>ソフトウェアにおける難読化とは、コンピュータプログラムの動作を変えずに、プログラムコードの内部的なサブルーチンの内容・構造・データなどを、人間にとって読み取りにくくなるように改変・加工すること。

引用(https://ja.wikipedia.org/wiki/難読化_(ソフトウェア))

難読化する目的は悪用されないよう、読みにくくすることで解析しずらくすること。実際にどのようになるのか、試していきます。

試してみた(Java)

下記環境で実施(括

元記事を表示

GraphQLのPOSTをするときに馬鹿をやらかした話

#はじめに
Heroku Postgreに対して外部から(Herokuアプリ外のサービスから)データを挿入したいという状況の時、
Hasuraはとても役に立ちます。
今回は、そのPOST操作(SQLのINSERT操作)を行おうとしたときに出会った魑魅魍魎を紹介しようと思います。

##Hasuraってなに?
この記事に丸投げします。私はここから学びました。
https://qiita.com/maaz118/items/9e198ea91ad8fc624491

また、HasuraはHerokuに対して強力なサポートをしており、
ワンクリックでHeroku Postgreを利用したGraphQLサーバーを立ち上げてくれます。
https://hasura.io/learn/ja/graphql/hasura/setup/

##今回実装したかった事
AndroidアプリケーションからHeroku Postgreに対してデータの挿入を行いたい
それなら、GraphQLのmutationを利用して挿入しようじゃないか

##おっと
今回発行するGraphQL Queryは以下のような感じだ

元記事を表示

Javaアプリをより高速化したくてReadWriteLockパターンを利用してみたところ

# ◆Javaでの ReadWriteLock サンプルプログラム(改善版)  【notifyAll() の実行はCPUパワーをかなり消費し、実行速度が低下します】

– ReadWriteLockを利用して少しでもRead処理の高速化を図るつもりが、私の利用環境&CPUパワーの少ないマシンでは、シンプルにsynchoronizedでアクセス毎に該当オブジェクトをロックしてアクセスする方が明らかに高速だったりしました。

– readLock()&readUnlock() しか実行していないのに遅すぎるため原因を探ったところ、参考にしたプログラムでは無駄にnotifyAll() が実行されることによって速度が低下していました。そこで、notifyAll() が不要な場合は実行しないように改善してみたのが下記です。これによって無用な処理速度の低下が防止できます。**キモはnotifyAll()の前に判定処理を入れたところです。**

#下記は、writeLock() が優先される作り(writeLock呼び出しが続くとreadLockが取得できない)となっています。

~~~java
f

元記事を表示

AtCoder231をやった(Java)

AtCoder231をやった。
懲りずにjavaで実装。

##[A](https://atcoder.jp/contests/abc231/tasks/abc231_a)
基本的には、double型で変数を宣言して、格納されたデータを割ればよいです。

“`
import java.util.*;

public class Main {
public static void main(String[] args) throws Exception {
Scanner scan = new Scanner(System.in);
ArrayList list = new ArrayList();

String str = scan.nextLine();
list.add(str);

double d = Double.parseDouble(list.get(0)) / 100;

System

元記事を表示

【Java】Specificationでデータ取得を行う

データベースから取得する際、Specificationやカスタムクエリの存在が欠かせません。
1つや2つのみの検索条件だとカスタムクエリで楽に取得出来るのですが、大規模な開発で多数の検索条件が絡んでくるとカスタムクエリとは言えない・・・
そのような時はSpecificationを使い、Java側で検索条件を指定することでスタイリッシュにデータを取得することができます。(SQLのWHERE句のようなもの)

今回は私が業務でよく使用するSpecificationをまとめてみました。
もし間違い等ございましたら、ご指摘いただけると幸いです:bow_tone1:

前提としてUserテーブル構成はこのようなものをイメージしていただければと思います。

|Id|name|from_name|time|start_date|end_date|
|:–|:-:|:-:|:-:|:-:|–:|
|1|田中|福岡|2021-10-01 10:00:00|2021-10-01 10:00:00|2021-10-31 10:00:00|
|2|佐藤|東京|2021-11-01 11:00:00|20

元記事を表示

OTHERカテゴリの最新記事