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

JAVA関連のことを調べてみた2021年09月27日
目次

Javaでニュースサイトの記事を取得する

こんにちは。前回はランダムに単語が表示される単語学習アプリを作りましたが、今回も自分の外国語学習に役立てようという魂胆で、外国語ニュースサイトの記事を取得してくる機能を作ってみます。

この記事では[NHK World News](https://www3.nhk.or.jp/nhkworld/)のニュース記事を取得する方法を紹介していますが、少し修正すれば基本的にはどのようなサイトの文章も取得することができます。

前提条件

– IntelliJ IDEA: 2021.1.2 (Community Edition)
– JDK:16.0.1
– MacOS:Version 11.1

## 1.今回やることの整理

今回行うのは主に以下の処理です。

– 記事を取得したいニュースサイトのURLの入力を受け取る。
– http接続でニュースサイトのHTMLを取得する。
– 取得したHTMLをテキストファイルに書き出す。
– HTMLの余分な部分を取り除き、ニュース本文のみをコンソールに表示させる。

取得したHTMLを一度テキストファイルに書き出す必要はなく直接コンソールに表示させて

元記事を表示

OpenTelemetry InstrumentationとSpring Cloud GCPのログ機能を連携する

現在GCP(Google Cloud Platform)を使う案件に携わっており「[OpenTelemetry Instrumentation for Java](https://github.com/open-telemetry/opentelemetry-java-instrumentation)」を利用してトレース情報をCloud Traceへ連携する仕組みになっているのですが・・・TraceIDとSpanIDがCloud Loggingへ正しく連携できていないことが判明しました :scream:
一応・・・ログの中にはTraceIDとSpanIDの値が設定されている項目はあるのですが、Cloud Loggingの機能で求められている項目として連携できていませんでした :sweat:

# どのように連携されていたのか?

[Cloud Logginの構造化ロギング](https://cloud.google.com/logging/docs/structured-logging)のLogEntryフィールドでいうところの「jsonPayload」の中の「trace_id」と「s

元記事を表示

【Java】例外処理の基本の復習

#目的

* Javaの例外処理を学んだので、復習のためにアウトプットする

#実際の手順と実例
###1. 例外処理とは

例外 == エラーのこと。
例外が発生したときに実行する処理を例外処理という。

###2.例外処理の基本

ここではカリキュラムの問題を再度実行して復習していきます。

その前の前提知識として、例外処理の基本構文から

**try-catch文(try-catch-finally文)**

““java
try {
tryブロック(例外が発生する可能性がある処理)
} catch (例外クラス 変数名) {
catchブロック(例外が発生した時に実行する処理)
} catch (例外クラス 変数名) {
catchブロック(例外が発生した時に実行する処理)
} finally {
finallyブロック(例外発生の有無にかかわらず必ず実行する処理)
}

““

**throw文**

意図的に例外を発生させたい場合に使用する(スローする)。

““java
// 例外インスタンスをスロー
throw 例外インスタ

元記事を表示

WebSphere Liberty/Open Libertyで,サーバーとアプリを異なるMavenプロジェクトに分けて構築する

Libertyでは,[Maven向けにプラグイン](https://github.com/OpenLiberty/ci.maven)が公開されており,アプリケーションのWARやEARをビルドするのと同時に,テスト用のLibertyをダウンロード・導入して,アプリケーションをデプロイしてテストしたり,アプリ+構成+Libertyをまとめたインストール用のZIPファイルを作成したりできます。これにより,アプリケーションとそれを動かすサーバー環境の構成を,一元的にGitなどで管理することができるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60041/e1813057-5c62-3b68-4f81-1cc13e9b15b7.png)

ただ,多くの企業ではアプリケーションとサーバー構成は異なるチームが管理していたり,また同じサーバーに異なるチームの開発するアプリケーションが同居していたりすることがあります。このような場合は,アプリケーションをビルドするMavenプロジェクトと

元記事を表示

【Java初心者】初心者用語まとめ1

#初心者に必要であると考えられる用語をまとめてみた。

用語と説明

・JRE(Java Runtime Enviroment)

 Javaのプログラムを動かすために必要なソフトウェアのこと。
 
 コンパイルはできないのだが、.classファイルを読み込むことができる。 

・JavaSE(Java Standard Edition)

 JREの機能に加えてJavaのAPIやパッケージなどソフトウェア開発するのに必要な基本機能が集まったもの

・JavaEE(Java Enterprise Edition)

 JavaSEに拡張機能を追加したもの。

 企業向けのシステムやWebサイトなどを開発するのに必要なAPIが集まったもの

・結合テスト

 複数のモジュールを結合させて動作をさせた時、設計書どおりに動作するかを確認するテスト。

・JSON(JavaScript Ob

Spring Bootで簡易バッチ(CLI)アプリケーションを作る!!

Spring Bootで簡易的なバッチアプリケーション(CLIアプリケーション)を作る方法を紹介してみたいと思います。SpringにはSpring Batchというバッチアプリケーション向けのフレームワークが用意されておりSpring Boot上で使うこともできますが、ちょっとしたバッチ処理を作るには少し敷居が高い(重厚な仕組み)と感じることもあるのではないでしょうか?
そういった場合は、本エントリーで紹介するSpring Bootの`ApplicationRunner`の仕組みを使うことを検討してみても良いと思います。

# 検証バージョン

* Spring Boot 2.5.5

# 検証コード

* https://github.com/kazuki43zoo/spring-boot-cli-demo

# ApplicationRunnerの実装クラスを作る

Spring Bootにはアプリケーションの初期化処理終了後に、コマンドライン引数を受け取って任意の処理を実行することができる仕組みがあり、この仕組みは`ApplicationRunner`の実装クラスを作成してDIコ

再帰とループの速度を比較してみた

##はじめに

最近再帰を覚えたのですが、繰り返し処理を実装するときにループと再帰をどう使い分けたら良いのか疑問に思いました。
調べると可読性によって書き分けたりするなど出てくるのですが、メモリ効率ではどうなのか気になったので実際に書き比べてみました。

自分の書ける言語がSwift, Java, C#だけなのでこの3つで測定した結果とコードを載せています。
内容としては1〜nまでの総和を求める関数を、forループ、末尾再帰、ヘッド再帰の3通りで書き分けて、それぞれの早さを出力するようにしました。

末尾再帰は再帰呼び出しのみを関数の戻り値とするもので、末尾呼び出し最適化とも呼ばれているようです。
こちらはヘッド再帰(末尾再帰以外の再帰)に対してコールスタックが積み上げられることがないので、スタックオーバーフローを回避できるメリットがあります。

##実行環境

###macOS 11.6 (Apple M1, 16GB)

####Swift
+ Xcode12.5.1
+ Swift 5.4.2

####Java
+ openjdk 11.0.10

###Windows 1

NLP4J – Java で 英語の構文解析結果のルールのパターンマッチを適用してキーワードを抽出する

#やりたいこと

英文の構文解析結果に対して「こういう構文(係り受け)があればキーワードとして抽出しなさい」というルールを定義しておき、ルールの適用結果を利用したい。
例えば「主語 … 動詞 … 目的語」の関係を抽出できれば、何がどうなっているのかの関係をきれいに抽出することができ、テキストマイニングなどに応用することができる。

#構文解析結果の確認

そもそも構文解析の結果がどういうものになっていないのかを知らないと抽出ルールを定義できないので、まずは確認してみます。

構文解析の表現方法は統一されたものが無い(はず)ですが、NLP4Jでは各実装の結果を統一的なフォーマットにしています。

日本語でも英語でも、Stanford NLPでも Caobocha でも GiNZAでも同じ形式で構文解析結果を表示します。各実装ごとにライブラリを用意しています。

“`java
String text = “I eat sushi with chopsticks.”;
// Document
Document doc = new DefaultDocument();
doc.p

JUnit4とJUnit5の比較(便利な機能編)

## 概要
JUnit4の便利な機能が
JUnit5でどのように実装されているか、確かめてみました。
古いテストケースをJUnit5に移すときの自分用備忘録。
諸々の説明は[JUnit5公式ドキュメント](https://junit.org/junit5/docs/current/user-guide/)を参照してください。

## 検証環境
検証環境は次の通りです。
OS : Windows 7 Home Edition 64bit
Java : JavaSE 15
IDE : STS 4.10.0
その他 : Spring Boot 2.5.5
JUnit4, 5用に別々にプロジェクトを作成

### 注意事項
Spring Bootをウィザードで作った場合、
そのままだとJUnit4が使えません。
対策としてプロジェクトを作ってから、
pom.xmlからJUnit4を追加、
spring-boot-starter-testへの依存関係を
コメントアウトしました。

## 新旧比較する機能

– 一時フォルダ作成
– テスト中メソッド名取得
– エラーが出ても全ケースを実施

JavaFx使ってみた~初級編~

### はじめに

Javaで簡単にGUI作成したいなって思ったことがあった。。

JavaでのGUI作成はSwingとかAWTとかJavaFxがあるみたいだが、
Java8以降はSwingよりもJavaFxだぜ的な記載mの見かけたので、最近はJavaFxなんだろうと思う。笑

筆者は安易なので、最近の流れにそってJavaFxを使用します!笑

今回はJavaFxをインストール~簡単なGUI作成(Hello World!!)までの初級編として執筆する。

### 必要なもの

– eclipse
– Scene Builder
– JavaFxSDK

### インストール

まずは、eclipseのマーケットプレースから`e(fx)clipse`をインストール。
![WS000000.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250217/92d5ae8b-9fdb-2e70-330f-0766ae3fb433.jpeg)

eclipseの再起動を促されるので従って再起動。

続いて、`Sce

エンドロールムービーをprocessingで作る #1 【連番画像作成・アニメーション】

**Processing**と**ffmpeg**を用いて簡単な結婚式風エンドロールムービーを作成しました。
**Processingで連番の画像を作成**し、**ffmpegによりその連番画像を動画に変換**しています。
動画作成方法を数回に分けて紹介していきたいと思います。

# 動作環境
Windows 10
Processing 3.5.3

# 今回作成した動画
![out_3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1873853/930a8b16-204e-9ec0-f6a3-2c5ba66445f5.gif)

# 動画の作成方法
**Processing**でのプログラミングと、**ffmpeg**での動画作成に分けて説明を行います。

## Processingプログラミング内容説明
今回の動画を作成するにあたって使用した関数など、プログラミング内容を説明していきます。

### 連番画像の作成
連番画像の作成は**saveFrame()**という関数を使用して行います。試しに

JKS形式のキーストアをPKCS12形式に変換する

最近のWebSphere LibertyまたはOpen Libertyでは、キーストアの形式がJKSからPKCS12に変更になっています。JKS形式も引き続き使用できますが、server.xmlでタイプを指定する必要があることと、将来廃止になる可能性があります。

“`server.xml

“`

今後のために、JKS形式のキーストアを使っている場合はPKCS12形式に変換することをお勧めします。

例えば、LinuxのJDKで使用しているJKSを変換するためには、下記のコマンドを実行します。

“`
$ keytool -importkeystore -srckeystore /etc/pki/java/cacerts -srcstoretype jks -srcstorepass changeit -destkeystore key.p12 -deststoretype pkcs12 -deststorepass new

Java PDFからテキストを抽出

今回は、Spire.PDF for Javaという素晴らしいライブラリを使って、PDFからテキストを抽出する方法を紹介したいと思います。

Spire.PDF for Javaとは?

Spire.PDF for Java is a PDF API that enables Java applications to read, write and save PDF documents without using Adobe Acrobat.

英語が苦手な方への翻訳:

SpringBoot で共通エラーハンドリング 【@RestControllerAdvise】

## はじめに
ついつい、個人で開発していると正常系の処理ばかり書いてエラーハンドリングの知識が身につかないと感じたので
今回はSpringBootでエラーハンドリングの実装に挑戦してみた。

今回はモノシリックなアプリではなく、RestApi形式で例外が発生した際にはエラー情報を格納したレスポンスを返す。

## 環境
言語: Java SDK 1.8
FW: Springboot 2.5
IDE: Intellij Idea

## 実装

### 通常の処理を行うコントローラを実装

下記実装では `/{bloodType}` にリクエストを投げた際に `bloodType` を
メソッド `isBloodType` で血液型なのか判定しています。
もし血液型[ A, B, AB, O ]に当てはまらない場合、独自に実装したエラークラス `BadBloodTypeException` を呼ぶ。

“`main.java

package com.example.demo.controller;

import com.example.demo.common.BadBloodTy

Apache Beamで実装したストリーム処理をKinesis Data AnalyticsとDataFlowで実行する

Amazon Kinesis Data Analytics(以降、KDAと記載)がApache Beam(以降、Beamと記載)のサポートを開始したこと、また、最近触り始めたGCPのDataflowがBeamによる実装を前提としていることを知りました。
そこで、比較的小さい学習コストで、KDAとDataflowの両方のストリーム処理に加え、並列分散バッチ処理まで実装できるようになったり、プラットフォームをまたいでコードを再利用できるようになることを期待し、Beamの学習を始めてみました。

学習開始にあたり、KDAおよびDataflowで動作させる際の違いを確認するため、KDAとDataflowそれぞれのドキュメントで提供されているチュートリアルから始めました。
次に、ストリーム処理のロジック部分と、入出力や実行環境に依存する部分を切り離し、KDAとDataflowのどちらでも実行できるサンプルコードを作成してみました。
なお、各チュートリアル実施やサンプルコード作成ではJava,Mavenを使用しています。

“`bash
$ java -version
openjdk versi

Kinesis Data AnalyticsのApache Beamチュートリアルをやってみた

以下のチュートリアルをやってみた際、主に依存ライブラリのバージョンの問題で、提供されているサンプルコードがそのままではうまく動作しなかったので、正常動作させるにあたり変更した部分をメモしておきます。

https://docs.aws.amazon.com/kinesisanalytics/latest/java/examples-beam.html

## 動作環境
“`
IntelliJ IDEA 2021.2 (Community Edition)
Build #IC-212.4746.92, built on July 27, 2021
“`

“`sh
$ java -version
openjdk version “11.0.12” 2021-07-20
OpenJDK Runtime Environment Homebrew (build 11.0.12+0)
OpenJDK 64-Bit Server VM Homebrew (build 11.0.12+0, mixed mode)

$ mvn -version
Apache Maven 3.6.3 (cece

ログイン中のユーザー情報のアップデートとセッションの中身の更新

# 詰まった内容

– 独自のログインページを実装した際、ユーザーのトップ画面でログインしたユーザーの名前をセッション上から取得し表示するようにした。
– 別のページからユーザーの名前を変更すると、DBのみ更新され画面上の名前を変わらなかった。
– 一度ログアウトして再度ログインし直すことで正しく表示されるので、DB上は変更できているが、ログイン中のセッション内の情報が更新できていない。

### ユーザー情報の更新の際、セッション内の情報も一緒に更新が必要

この状態の解決にハマったので、備忘録として記録しておきます。
今回はログイン時にユーザーネームでログインし、その名前をログイン中に変更した場合の動きです。

# 結論

### @AuthenticationPrincipalアノテーションを使う

– このアノテーションで**Principal内の情報をgetしたりset**したりできる。
– **コントローラ上で認証したセッション情報の更新**を行う。アップデート処理のサービスクラスやMapperに関しては変更不要。
– **SecurityContextHolderクラス内

【Java】クラスとメソッドを理解の復習

#はじめに

スクールのJavaのカリキュラムで、
クラスとメソッドの理解があまりできていないと感じたので、
確認問題を通して、復習していきます。

#目的

* Javaのクラスとメソッドを理解すること

#1.クラスとメソッドとは

###1. クラスとメソッド

基本構文は以下の通り

““`Java
修飾子 class クラス名 {
修飾子 コンストラクタ(引数) {
// 初期化処理
}
}
“““

コンストラクタに関しては

> オブジェクトを作った時に勝手にデフォルト値に初期化されるメンバ変数を、勝手に初期化させるのではなく、自分で値を決めて初期化する為に使うのが、コンストラクタ

【Java】 コンストラクタって何? this( )の意味

このように書いてありましたがまだ良くわかりません。
例で確認していきます。

###2. メソッド

基本構文は下記の通りです。

“`java
修飾子 戻り値の型 メソッド名(引数) {
// 処理
return 戻り値;
}
““

独自ログイン機能の実装(Config編)

実装の際にかなりハマったので、備忘録としてのまとめ

# ログイン設定のConfigクラス

WebSecurityConfgurerAdapterクラスを継承したSecurityConigクラスを作成。

ここに認証の設定などを追加していく。

クラスに@EnableWebSecurity,@Configurationアノテーションをつける。

“`java
package io.post.novel.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
im

独自ログイン機能(UserDetailsService編)

独自のログイン機能でユーザー情報を取得するための実装です。かなりハマりましたので備忘録としての記録。

O/R mapperとしてMyBatisを利用しております。

Configurer設定についてはこちら→

# UserDetailsServiceインターフェースを継承したクラスを作成

“`java
package io.post.novel.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.ste