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

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

antlr4のC++パーサーの実用性を検証してみた

# 概要
この記事は、ANTLRを応用してC++のパーサーを検討した際にわかったことをまとめたものです。誰かの役に立つことを期待して、記事を公開します。
結果は最後の方にあるので、お急ぎの方は最後の方だけ見てください。

# ANTLRはパーサージェネレータ
ソースコードなどの構造化されたテキストをデータとして処理するのに便利な、ANTLR(ANother Tool for Language Recognition)をご存知でしょうか。
構造化されたテキストデータを、構造を持ったものとしてコンピュータに理解させる処理は、パース(構文解析)と呼ばれます。
通常、テキストの構造はプログラミング言語毎に異なるので、構文解析はその言語の文法に特化する形で作る必要があります。
その構文解析の作成のハードルを少し下げてくれるのが、ANTLRです。
(だいぶ端折りますが)ANTLRは、EBNF記法に似た独自のプログラミング言語(ANTLR4向けの拡張子はg4)で構造を定義し、指定の実装(実行?)言語向けに構文解析を行うソースコードを生成することもあって、パーサージェネレータと呼ばれます。
なお、AN

元記事を表示

LeetCode 1 解答

# n^2の解法

“`Java
public int[] twoSum(int[] nums, int target) {
long targetLong = target;

int[] ans = new int[2];

for (int i = 0; i < nums.length-1; i++) { for (int j = i + 1; j < nums.length; j++) { if(nums[i] + nums[j] == targetLong) { ans[0] = i; ans[1] = j; } } } return ans; } ``` # nの解法 今回のように(同一配列の)二つの要素を組み合わせるにはHashMapがいいのかもしれない。 ```Java public int[] twoSum(int[] nums, int target) { Map hash = new HashMap<>();

for (int

元記事を表示

AppletをJSに変換してみる 後編

これは後編です。[前編](https://qiita.com/noty2008/items/c90820db35e2f7feabcb)をまだ読んでいない方は、まずそちらからお読み下さい。
# クラスメソッドの最適化
[前編](https://qiita.com/noty2008/items/c90820db35e2f7feabcb)の最後に、「アプリケーションのパフォーマンスを低下させる」と言いましたが、まずはその理由と対策をご紹介します。

## 原因
パフォーマンスを低下させる状況として、「同じクラスのインスタンスを大量に使用する場合」があります。例えば、次のようなJavaScriptのコードを考えてみましょう。
“`
function Hoge()
{
this.a = 0; this.b = 0;
this.setAandB = function(a, b) //・・・(*)
{
this.a = a;
this.b = b;
}
this.sum = function() //・・・(*)

元記事を表示

WIP: Oracle JDK は Java 17 以降も本番環境では有償の可能性あり

:::note alert
**この記事は、誤った内容を含む可能性があります。**
2022/05/14 時点での作者個人の見解に基づいて記載されており、作者の所属組織の見解や、作者が Oracle 社に直接確認した情報を表すものではありません。

この記事は、確定的な情報を提供することはできませんが、そもそも懸念があることにすら気付けていない人への注意喚起になればと思って公開します。願わくば、今後誤解が起きづらい状態に何かしらのアップデートがあることを期待します。
:::

Java 17 のリリースとともにアナウンスされた Oracle JDK の [NFTC (Oracle No-Fee Terms and Conditions) ライセンス](https://www.oracle.com/downloads/licenses/no-fee-license.html) により、乱立する JDK ディストリビューション問題に決着をつけ、今後は Oracle JDK でいけると思った人も多いのではないでしょうか。

Webでもこのライセンス変更が大きく取り上げられたことは、記憶に新

元記事を表示

Javaのvar変数のうまい使い方

Java8のエンジニアだった筆者がJava11の案件に参画し、varの変数のうまいなーと思う使い方があったので紹介したい。

# Javaのvar変数の特徴
Javaでvar変数はJava8では使えなかったが、Java11では使えるようになった。ただし、Javaのvar変数の使用に関しては以下のような制約を含んでいる。

* 左辺でvar変数の宣言をした場合、右辺でどの型の指定をしなくてはいけない。
* var変数としては処理しておらず(JavScriptのように)、結局右側で提示した変数の処理として処理される。

上記2つの制約を守れば、Javaでvar変数を使用することはできるわけではある。
しかし、特段変数宣言を左右で行う従来の宣言と何が違うのか分からなかったのが、従来の思想であった。

# こんな使い方

感心させられた使い方はこんな使い方である。
ただし、実際に書いてあるソースコードとは違うもので、大体同じような構成になっていたと考えてよい。

“`
import java.util.*;

public class Main {
public static voi

元記事を表示

AtCoderで茶色になったから書いた記事

## はじめに
入茶記事を書いている人を見かけて自分も書いた方が良いかなと思って書きました。
茶色になったのは一ヶ月半程前なので、曖昧なところもありますが、それなりに思い出しながら書きます。誰かが「あぁ、こんなやつでも茶色になれるんだな」と思って競プロを始めるきっかけになったらいいなぁと思ってます。

## 入茶したとき
入茶したのはABC245 (2022/3/26)のときでした(401というギリギリのレートでした)。
![スクリーンショット 2022-05-13 182557.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2664889/2d4e4fbc-0dde-7706-4ff4-076a26e161b9.jpeg)
それまでコンテストには計6回参加していたので、まぁ自分の実力を考えれば良い方なんじゃないかなと感じています。自惚れかもしれませんが。
ちなみに、画像からもわかる通り、次のコンテストで灰色に戻りました。
(10回目のコンテストでまた茶色に戻ったからヨシ!)

## 一応の自己紹介

元記事を表示

SpringBootアプリケーションをCodePipelineを用いてBeanstalkに自動デプロイ

## 概要

[SpringBootアプリケーションをCodePipelineを用いてEC2インスタンスに自動デプロイ](https://qiita.com/tatsuakimitani/items/86258d80326ddc8091d9)
があったので、
[CodePipelineでSpringBoot on BeanstalkのCD/CIパイプラインを構築する](
https://springhack.com/codebuild-codedeploy-codepiplne%e3%81%a7springboot%e3%81%aecd-ci%e3%83%91%e3%82%a4%e3%83%97%e3%83%a9%e3%82%a4%e3%83%b3%e3%82%92%e6%a7%8b%e7%af%89%e3%81%99%e3%82%8b/)に倣ってBeanstalkに自動デプロイしました。

## 手順1 Githubにソースをコミットしておく
[spring initializr](https://start.spring.io/)でspringbootプロジェクトを作成し、

元記事を表示

「Javaの基本のk」を書籍と動画で学び直して、改めて理解が深まったことをまとめる

## 参考書籍

本記事では、主な参考書籍1冊を先に記述する。
– 中川清喬/国元大悟.**『スッキリわかるJava入門 第2版』**

:::note
この記事はJavaの初学者が、本人が忘れがちな語彙や文法事項を、学習内容定着とさらなる理解を深めるためにまとめたものです。
なにか新しい情報を提示する論文的記事ではないので、ご容赦ください。
:::

## 文法

– **代入時の自動変換**
– 「大は小を兼ねる」的な代入ができる。  e.g.)short型の値をlong型の変数に代入。
– 例外として、intをbyteやshortに入るもんなら入れることもできる。
– **キャスト変換**
– 大は小を兼ねないのに、無理矢理ぶち込むための手法。
– `int a = (int) 3.5;`のように表記すると、入らない部分は切り取って無理矢理代入できる。
– が、できないこともあるし不具合の原因にもなるし、よっぽどじゃない限り使わないのが◎
– **演算時の自動変換**
– 演算子の左右のオペランドの型も、基本揃えないといけない。

元記事を表示

リフレクションの基本の使い方について

servletをjunitでテストするにあたってprotectedにアクセスする必要が出た。
調べたらリフレクションを使えばアクセスができるっぽい。
備忘録として記載。

# 【目標】 Q.リフレクションとは??

:参考記事達:
・リフレクションについて
https://qiita.com/suke_masa/items/0df3bb92bcb69f4a95d1
↑個人的にすごくわかりやすかった。

・ジェネリクスの\について
https://qiita.com/pebblip/items/1206f866980f2ff91e77
↑たまにでてくる\について

・junitでリフレクションのやり方
https://qiita.com/11295/items/b632850389831041b987
https://www.sejuku.net/blog/33252#:~:text=%E3%81%97%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82-,private%E3%83%95%E3%82%A3%E3%83%BC%E3%83%

元記事を表示

Dockerでサクッと試すローコード開発 -「iPLAss」

本記事では、Dockerで「iPLAss」をインストールし、簡単に機能を試すまでの手順をまとめます。
近年開発手法として注目される「ノーコード開発」や「ローコード開発」ですが、iPLAssが提供するローコード開発の形をDockerでサクッと体験してみてください!

# iPLAssとは

「iPLAss」は、オープンソースのローコード開発プラットフォームです(OSS版のライセンスは、`AGPL v3`になります)。

以下のような特徴を持ちます。

– **ノーコード開発**
GUI操作によるノンプログラミングでのデータ定義やその他の各種定義(認証ポリシーや画面表示に関する設定など)を行うことでアプリケーションの構築が可能です。また、データ定義を行うことで自動的に当該データのCRUD(登録/参照/更新/削除)機能を持った汎用管理画面を構成します。
▼ `Admin Console` という管理者向けのWebコンソールで各種定義が行えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.co

元記事を表示

【Servlet・JDBC】executeUpdata()とexecuteUpdata(String sql)の違いについて <忘備録>

DB操作の時に使用するexecuteUpdate()とexecuteUpdate(String sql)の違いについての忘備録

調べたことや実行したものをまとめたものなので、間違ってる部分があるかもです。

## 実行環境
・Eclipse 4.23.0
・Java 17
・Apache Tomcat 9.0
・Servlet 4.0

## executeUpdateとは
一言で表すと『SQLを実行するやつ』

もう少し細かく説明すると、
・SQL文を実行する
・[INSERT, DELETE, UPDATE]のSQL文を実行可能
・更新行数が戻り値として返される

こんな感じになる。
二つ目については、MERGEも実行できるらしい。
自分はMERGE文を使ったことが無いため、実際に実行できるかどうかは不明。

## executeUpdate()とexecuteUpdate(String sql)の違い
では、引数の有無の違いでどのような違いがあるのか。

パッと見、引数の有無の違いしか分からないが、調べてみると異なる点がまぁまぁあるらしい。
簡単にまとめると、
* execut

元記事を表示

SpringSecurity(ステートレス)Jwt認証

## 前提条件
以下URLのプログラムを元にJwt認証用(ステートレス)に変更します。

https://qiita.com/nmaolks/items/92edd19b3b606fad82f9

## クラスの説明
以下の6つのクラスを改修、追加します。

### ◇設定ファイル
 〇WebSecurityConfigクラス(設定)

### ◇認証(トークン取得)
 〇WebUsernamePasswordAuthenticationFilterクラス(認証)
 〇WebAuthenticationProviderクラス(検証)
 〇SuccessHandlerクラス(認証検証成功時)
 〇FailureHandlerクラス(認証検証失敗時)

### ◇認可(トークン認可)
 〇JwtAuthorizationFilterクラス(認可)

## プログラムの流れ
◇JWTトークン取得する場合
ユーザがトークン取得APIを実行時

認証(トークン取得)が動く

◇その他API

【Java】StreamAPIを用いた階乗(n!)・順列(nPr)・組み合わせ(nCr)の計算記述方法(サンプルコード・計算時間の性能比較有)

# 概要
 本記事はJava8より追加されたStreamAPIを使用した場合と使用していない場合の階乗・順列・組み合わせの記述方法と性能比較について説明します。
 StreamAPIの理解やサンプルコードの流用等でご利用ください。
 また、それぞれの計算は静的メソッドにて、int型の入力、BigIntegerの出力で実装してます。
 本記事に記載されているサンプルコードはJava8以降で実行できます。
 サンプルコードは静的メソッドで記載してますので、クラス内に記載するだけで簡単に流用することができます。

# 階乗計算(n!)
 $n!$の階乗計算をします。
 $n!$は$1$から自然数$n$までの連続する$n$個の自然数の積を計算します。
 例えば、$4!$は自然数$1$から$4$までの$4$個の積、つまり$4!=1\times2\times3\times4=24$です。
 従来通りの実装方法のサンプルコードは以下のものです。
“`Java:StreamAPIを用いない場合の階乗計算の静的メソッド
/**
* 階乗計算
* n!の計算を行う
* @param n 入

【Java】フィールド変数とローカル変数

フィールド変数とローカル変数についてまとめる。

フィールド変数
クラス内に定義される変数のこと。
フィールド変数はクラス内のメソッドから参照可能な変数となる。

ローカル変数
メソッド内にて宣言された変数のこと。
※メソッド内の範囲でしか参照できない変数。
※if文/for文/while文等にて宣言されている変数もローカル変数に含まれる。

フィールド変数の実例
“`java:fieldSample.java
public class fieldSample {
private String name = “Jony”;

public void name() {
System.out.println(name); // 実行結果:Jony
}
}
“`
ローカル変数の実例
“`java:localSample.java
public class localSample {
public void sample() {
String name = “Jony”;
int age = 30;
}

public static void main(Strin

【Java】可変長引数

可変長引数についてまとめる。

**可変長引数**
Java SE 5から引数の個数が不定(可変)なメソッドを定義できるようになった。

##### 可変長引数の使用方法
下記のように引数の型の直後にピリオドを3つつけて宣言する必要がある。
注意点:可変長引数は2つ以上同時に宣言できない。
    可変長引数は最後の引数として宣言する必要がある。
“`java:sample.java
// sample1
void sample1(int… num) {
for (int i = 0; i < num.length; i++) { System.out.println(num[i]); } } // sample2 void sample2(int value, int... num) { // do something } ``` 可変長引数を宣言する際の注意点が2つある。 注意点: ①可変長引数は2つ以上同時に宣言できない。 ②可変長引数は最後の引数として宣言する必要がある。 ```java:ngsample.java // sample1 void sample1

進化についていくのは大変

プログラム言語ってたくさんあって
私がやってきたのはjava、C#、swift、javascriptあたりがメインなんですが
ずーーっと思っているのが『進化しすぎてません?』


 Struts便利だなー
 ⇒DIっていうのが次来るらしい
 ⇒seaser便利
 ⇒えっseaser古いの?世界的にはspringなの?
 ⇒spring便利
 ⇒えっspringbootが簡単?
 ⇒springboot便利

こんな感じで、
とにかくいろんな技術が次から次へと出てきては進化が続いてて
java⇒kotlin
javascript⇒typescript
みたいに派生していった言語もあるし。

各言語のフレームワークも山盛りあって、
例えば画面周りはいつの間にか
「え?jspでゴリゴリ動的に作る時代終わったの?」
「SPA??react?vue?Angular?javascriptでゴリゴリ書くのが主流なの?」
「え!javascriptじゃない!?typescriptで書くの!?」
「tsをコンパイルしてjsにしてnodeで実行!?」

5年前までバリバリコーディングしてたけど昇進し

SpringBootでDBUnit 〜@ExpectedDatabase〜

SpringBootでDBのテストを書いています。
アノテーションの属性の意味を忘れないようにメモ。

# @ExpectedDatabase
## value
結果検証用のファイルのパスを記入する。

## assertionMode
DBと結果検証用のファイルを比較のしかたを指定する属性。
##### DEFAULT(または指定なし)
全てのテーブルとカラムの一致を比較する。
そのため、CSV等を用意したテーブル以外も調査対象となる。

このまま使うと、
“`
junit.framework.ComparisonFailure: table count expected:<[3]> but was:<[47]>
“`
と言った感じのスタックトレースが出力されてしまう。DB上の全てのテーブルが見られていることがわかる。
そのため、単体テストで用いる場合は以下の2つのどちらかを指定する必要がある。

##### NON_STRICT
結果検証用のファイルに存在しないテーブル、カラムがあっても無視する。

##### NON_STRICT_UNORDERED

【新卒SE】Java入門 ~Singleton(シングルトン)とはなんぞや~

 今日、研修でJavaの問題演習に取り組んでいた際に初めて知った概念?で、正直まだ理解が曖昧ですが、後学のために間違っていても良いので現状の考えを残そうと思い、アウトプットします(間違ってたら教えてくださいm(__)m)。

## シングルトンとは
一言でいうと、
**「1つのクラスからは1つのオブジェクト(インスタンス)しか作れないよ~」**
ってことです。
通常、クラスから複数のオブジェクトを生成できると思います。例えば、以下の図のように
「Car クラス→TESLA・TOYOTA・BMW」と言ったように、複数のオブジェクトを通常は生成できます。
しかし、シングルトンの場合は、オブジェクトの生成の処理が一度しか行われないため、下図のようの1つのオブジェクトしか生成されません。なので、「このクラスからはオブジェクトを一つしか作りたくない!」というような時にシングルトンを使用します。
![スクリーンショット 2022-05-11 21.56.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65804

【Java】型変換の不思議:データ型(byte ~ long) ⇔ char型

データ型からchar型にcastについてまとめる。

#### データ型(プリミティブ型)について
※byte ~ long & charまでを紹介する。
| データ型 | 値の種類 | ビット数 | 格納できる範囲|
|:——–|:——–:|:——-:|:-:|
|byte |整数値 |8ビット |-128 ~ 127 |
|short |整数値 |18ビット |-32,768 ~ 32,767 |
|int |整数値 |32ビット |-2,147,483,648 ~ 2,147,483,647 |
|long |整数値 |64ビット |-9,223,372,036,854,775,808 ~
9,223,372,036,854,775,807|
|char |文字  |16ビット |0 ~ 65,535
※Unicode文字、\u0000~\uffff|

#### castの実例
“`java:castSample.java

【Java】Stringクラス①:length

Stringクラスにてよく使用するメソッドの詳細について
パート毎に内容をまとめていく。
今回はlengthについて下記の通りまとめる。

###### lengthの働き
length():文字列の長さ(文字数)を取得(return)する。
length :配列の長さ(要素数)を取得(return)する。

###### lengthの使用例
“`java:sample.java
String sample1 = “Hello”;
String sample2 = “Hello World”;
String[] str = new String[5];

System.out.println(sample1.length()); // 5 ※文字数をカウント
System.out.println(sample2.length()); // 11 ※スペースも1文字としてカウントされる。
System.out.println(str.length); // 5 ※要素数にてカウントされる。
System.out.prin