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

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

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

【自分用メモ】Mavenのスコープについて

### 参考
やはり英語ドキュメントの方が分かりやすかった。
https://howtodoinjava.com/maven/maven-dependency-scopes


### スコープとは
> Maven dependency scope attribute is used to __specify the visibility of a dependency__, relative to the different lifecycle phases (build, test, runtime etc). Maven provides six scopes i.e. compile, provided, runtime, test, system, and import.

「visibility of a dependency(__依存性の可視性__)」を設定するための属性。

もうちょい砕くと

「JUnitは__テスト実行時のみ使える(見える)ように__しよう」
「DBドライバは__アプリ実行時のみ使える(見える)ように__しよう」

みたいな感じ。


#

AndroidでIR(赤外線通信)

#Androidで赤外線送信を行います。

受信は取り扱いません。(私の端末が非対応)
Androidには赤外線通信対応している端末と、していない端末があるので注意してください。

ConsumerIrManagerクラスを使用するだけで簡単に実装できます。
このクラスはandrod.hardwareパッケージに入っていますが、このパッケージにはカメラとかセンサとか扱う系のやつが入っていて面白そうです。

android端末が赤外線通信に対応しているか

“`Java

ConsumerIrManager irM = (ConsumerIrManager) getSystemService(CONSUMER_IR_SERVICE);
((TextView) findViewById(R.id.text)).setText(irM.hasIrEmitter() ? “この端末で使用できます” : “この端末では使用できません”);
//hasIrEmitter()は赤外線が使用できるならtrue,そうでなければf

Java Silver対策

#第一章 Javaの基本
###**クラス宣言に含めるもの**
– フィールド
– メソッド
– コンストラクタ

###**パッケージ**
####**パッケージの目的**
– 名前空間を提供し、名前の衝突を避ける
– パッケージ名は慣習的にドメイン名を逆にしたもの
– アクセス修飾子と組み合わせてアクセス制御機能を提供する
– クラスの分類を可能にする
####**パッケージのルール**
– パッケージに属さないクラスは存在しない
– パッケージは必ずソースコードの先頭行に記述する(コメントはOK)
– 明示的にパッケージ宣言したクラスから、無名パッケージに属するクラスにアクセスしようとするとコンパイルエラーになる

###**インポート**
####**インポートの目的**
– パッケージ名を省略してクラス名だけで記述できるようにする

####**インポートのルール**
– java.langパッケージは、インポート宣言を省略できる
– 同じパッケージに属す

JDBCとDAOパターンについて説明してみた

#データベース
データの保存先など、テーブルの入れ物。
データベースのデータ管理がDBMS(データベース管理システム)。
DBMSに指示をする専門言語がSQL
eclipse1ではH2Databaseを使うことが多い。

H2Databaseは、Javaで作成されており、本体は一つのJarファイルで構成されている。Jarファイルwpクラスパスに追加するだけで使用できるので、導入が簡単。

#JDBCドライバ
Javaプログラムでデータベースを利用するには、プログラムからデータベースにSQLを送信して結果を取得する。
それをするのはJava.sqlパッケージに含まれるクラスやインタフェース達。
1.**DriverManager**:DBMSへの接続準備など
2.**Connection**:DBMSへの接続や切断
3.**PreparedStatement**:SQLの送信を運ぶ車
4.**ResultSet**:DBMSから検索結果を受け取る入れ物
5.**SQLException**:DBからのエラー情報を提供。

これらに加えて**JDBCドライバ**と呼ばれるライブラリが必要。

新人SEが知っておくべき単語一覧

開発でよく出てくる単語をまとめました。新人SEの方は是非保存してください。

#Tomcat
サーブレットコンテナのひとつ。
Javaサーブレットとは、**Webサーバで動くJavaプログラム**のことであり、サーブレットコンテナによって動かされる。

HTTPリクエストなどがサーブレット宛てに依頼されると、まずサーブレットコンテナが受け取って、サーブレットコンテナからサーブレットに命令される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1651134/75bd9794-9f7c-971d-c676-7ed1b77b242f.png)

#Seaser
Java EEによる大規模開発を効率的に行なうためのフレームワーク

#Doma
S2Daoのスタイル(DAOパターンや2 Way SQL)を踏襲したJava6(JDBC4.0)対応のO/Rマッパー

##O/Rマッパー
オブジェクト指向プログラミング言語におけるオブジェクト(Object)とリレーショナルデータベース(RDB)

【Java】実行されるのは型・インスタンスのメソッドのどっちだっけ??となったとき

##初めに
実行されるのは型・インスタンスのメソッドのどっちだっけ??となったので簡単に実験してみる

##やってみる

“`java:A
package test;

public class A {
public void method1() {
System.out.println(“Aのmethod1だよ”);
}
}
“`

Aを継承したBを用意
BでAのメソッドをオーバーライド+Aにはないメソッドを用意

“`java:B
package test;

public class B extends A {

@Override
public void method1() {
System.out.println(“Bのmethod1だよ”);
}

public void method2() {
System.out.println(“Bのmethod2だよ”);
}
}
“`

“`java:Test
package test;

public class Test {
public static voi

Java 17 の Sealed Classes の書き方

Java 17 で Sealed Classes[^jep409] が正式版になりました。Pattern Matching for switch が Preview 版[^jep406]のため積極的に利用する価値に乏しいせいか、詳しい記述方法の解説が見当たらなかったので、[JEP 409: Sealed Classes](https://openjdk.java.net/jeps/409) で確認しました。この記事では JEP の内容を私なりにご紹介しますが、その前に簡単な使い方と、私の Sealed Classes への期待を述べたいと思います。

# はじめに簡単な使い方

Sealed Classes を使う場合、同時に Records を使いたいことが多いと思います。そのためには sealed class ではなく sealed interface を使います。

以下はガンダム、ガンキャノン、ガンタンク以外の連邦軍MSは認めたくない場合の例で、各クラスは public なのでそれぞれ別のファイルに記述されているものとします。

“`java
sealed interface

[paiza]スキルチェック見本問題 Java 指定要素があるかの判定 ・要素の種類数 continueとは (paizaランク D 相当)

初めに

今回以下の2つの問題に挑戦しました。

https://paiza.jp/works/mondai/array_utilization_primer/array_utilization_primer__exist

https://paiza.jp/works/mondai/array_utilization_primer/array_utilization_primer__kind

数日スキルチェック問題に取り組んでいないと、なんだか鈍るというか、
どういう道筋で解くのか浮かばなくなります:frowning2:

今回も躓きつつも、学びがありました!

①指定要素があるかの判定

https://paiza.jp/works/mondai/array_utilization_primer/array_utilization_primer__exist

“`
配列 A の要素数 N と整数 K , 配列 A の各要素
A_1, A_2, …, A_N が与えられるので、A に K が 1 つでも含まれている場合は
Yes を、含

Spring GraphQLを試してみた

## 概要
Spring BootでGraphQLのQueryを
試してみたときの記録です。
Spring GraphQLを遅ればせながらのお試し。

GraphQLの説明は[本家](https://graphql.org/)を参照してください。

# 開発環境
OS : Windows 7 Home Edition 64bit
Java : Java 11
STS : 4.10.0

# 確認手順の概要
– Spring Bootプロジェクトを作る
– GraphQL周りを設定する
– サーブレットをGraphQL経由で実行する

## Spring Bootプロジェクトを作る
Spring Bootのバージョン2.1.9でプロジェクト作成、
依存関係は以下の通りです。DB周りは個々の環境に
合わせてください。

– Lombok
– Spring Data JPA
– Oracle Driver
– Oracle Database XE

## GraphQL関連
### 要注意事項
– Spring Bootのバージョン
– GraphQL単体で使うことについ

フリーランスエンジニアとして働くならJavaはおすすめ?

## はじめに
– フリーランスエンジニアとして働くためにJavaはおすすめなの?
– Javaの将来性は?案件は多いの?

フリーランスエンジニアとして、Javaを習得するのはありでしょうか?

ここでは、フリーランスエンジニアとして働くならJavaはおすすめできるのか?習得するために必要なことを解説していきます。

## そもそもJavaとは?
Javaは1995年に登場して以来、**数あるプログラミング言語の中でも人気が高い**です。国内外問わずJavaの使用人口も多く、多くの企業でも採用されています。

プログラミング言語の人気ランキングを発表している[TIOBE Index](https://www.tiobe.com/tiobe-index/)でも2位となっています。

なぜこれだけ人気が高いのかと言うと、JavaはOSに依存しないマルチプラットフォームな言語で、汎用性が高くなんでも作れるからです。

たとえばAndroid向けのアプリやWebサービス、規模の大きな業務システムまで幅広い開発でJavaが使われています。

つまり、**Javaさえ覚えておけば、さまざまな開

サイボウズのインターンに参加してきました

## はじめに

8/23~8/27の5日間で、サイボウズのサマーインターンに参加してきました。
サマーインターンへの参加は初めてで、すごく緊張していたのですが、
楽しくて、会社の雰囲気も知れて、学びもあって、(5日で10万貰えて、)全部最高でした!

今回は、そんなサイボウズのインターンについて書いていこうと思います!

## 概要

https://cybozu.co.jp/company/job/recruitment/intern/2021/webservice.html
> サイボウズが提供するkintoneを題材として、新機能のプロトタイプを開発します。既存の要望リストの中から課題を選び、仕様検討や実装、テストの自動化にチャレンジしてもらいます。プロトタイプはkintoneチームが実践しているプロセスに沿って、モブプログラミングで開発します。kintoneチームのエンジニアがメンターとして指導やコードレビューを担当し、大規模なWebサービス開発の現場を体験することができます。 (サイボウズのインターン募集ページの概要からです)

今年のサイボウズのサマーインターンには9つも

Java silver 6章 継承とポリモフィズム②

#オブジェクト指向の三要素
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601137/186636fd-77b2-8026-52b8-a4cdf55a2ff8.png)

## カプセル化
オブジェクトの安全性を高めるために、オブジェクトのメンバーを保護すること
※メンバ = オブジェクトのメソッド及び変数
この性質を理解し、影響範囲の小さく疎なプログラミングを心がけることが、大規模で安全なシステム構築に繋がる。

他クラスから直接フィールドを操作せず、メソッドを通し間接的に操作する

## 継承
あるクラスを引き継いで新しいクラスを定義する

クラスの共通部分はスーパークラスで管理し、サブクラスで個別の処理を定義する

## ポリモーフィズム(多態性)
オーバライドやオーバロードによって、メソッドを状況によって使い分けることができること
※ オーバライド: 親クラスのメソッドを子クラスで上書きすること
※ オーバロード: 同一クラス内で引数の違いによってメソッドの呼び分けること