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

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

JVMが起動したときの Class ローディングと初期化について

# 概要

[HotSpot Runtime Overview](https://openjdk.java.net/groups/hotspot/docs/RuntimeOverview.html)にはこう書いています

> The VM loads core classes such as `java.lang.Object`, `java.lang.Thread`, etc. at JVM startup. Loading a class requires loading all superclasses and superinterfaces. And classfile verification, which is part of the linking phase, can require loading additional classes.

* JVMは起動したすぐ`java.lang.Object`、`java.lang.Thread`などの Class をロードする
* 依頼された super と interface は自動にロードする
* その他の Class は

元記事を表示

Javaで複数のスレッドからsynchronizedメソッドを呼び出してみる

#はじめに
前回、[Javaでファイルにログ出力](https://qiita.com/kimisyo/items/89be3d69a625ff04f670) という記事を書いた。そこでログ出力メソッドをsyncronizedメソッドにすることでログファイルに対して排他制御できそうだと書いたので、今回はそれを検証してみたい。

#検証方法
ログ出力メソッドを10000回呼び出すスレッドを10個並列に実行し、各スレッドで指示したログがもれなくログファイルに出力されているかを確認する。

#検証ソース
スレッドについては、いろんなサンプルがあるから、特に解説は不要だろう。
ログ出力メソッドはいろんなスレッドから呼び出せるように、LogWriterクラスのwriteLogメソッドに移動した。

“`LogWriterTest.java
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Calendar;
import java.io.*;

pub

元記事を表示

Javaでファイルにログ出力

#はじめに
定期的に発生するJavaネタ。ある情報をログ出力することになったが、データベースに出力するか、ファイルに出力するか検討した結果、ファイルにログを出力することにしたので事前に検討した時のメモ。前提はLinux。

#ファイル出力のメリット
観点は全くバラバラだが、思いつくままに列挙

– データベースに比べて格納領域のオーバヘッドが少ないため容量を食わない
– ログが大量になる場合に、データの分割を検討する必要があるが、データベースの場合はテーブルを作成する処理等の実装が面倒だが、ファイルであれば新たにファイルを作成するだけなのでプログラムが容易
– ログを参照する場合、データベースであればログインしてSQLを叩かないと見えないが、ファイルの場合はmore/lessで簡単に参照できる。
– データベースの場合、データベースのバックアップへの影響(処理時間等)を追加で検討する必要があるが、ファイルの場合はシステム全体のバックアップのみ考慮すればよい。

#ファイル出力のデメリット
– 排他処理を適切に行わないと、ファイルが壊れたりする。
– 検索を行う場合、インデックスがない

元記事を表示

java8をおさらい 〜ラムダ式〜

現場でほどんどjava8でコードを書いた事がないので、危機感を覚え学習したのでここにまとめます。

listの中身を数字に変換して出力するサンプルです。
まずはjava8以前の例。

“`java:java8じゃない.java

List suuzies = Arrays.asList(“1”, “2”, null, “3”);

for (String suuzi : suuzies) {
if (suuzi == null) {
continue;
}
System.out.println(Integer.parseInt(suuzi));
}

// 1 2 3
“`

次はjava8。

“`java:java8.java
List suuzies = Arrays.asList(“1”, “2”, null, “3”);

suuzies.stream().filter(s -> Objects.nonNull(s)).map(s -> Integer.pa

元記事を表示

Google ColaboratoryでJavaを使う

# はじめに
?(「Jupyter Notebookとかで共有しやすいからpython使って」と言われたけど、Jupyter NotebookでJavaって使えないのかな?)

?:[Windows10のWSLでJupyterLab+Javaを使う](https://qiita.com/toritorix/items/4b2e204d34350d3b98a9)

?(使えるな?)

?(Jupyter NotebookでJava使えるらしいけど、Google Colaboratoryでpython以外の言語使えないのかな?)

?:[多分間違えてるColaboratoryの使い方(Kotlinを試す)](https://qiita.com/kei0425/items/b9a374bd0f23934fc22b)

?(Kotlinがいけるなら同じJVM言語のJavaが使えない道理がないな?)

やってみた

※Jupyter用のKernel使うとかしてないので、変則的なやり方になっている気がする(そもそもcolabでjavaを使うこと自体が変則的という話はさておき)。

# Col

元記事を表示

初心者の単語No4(Javaコマンド、JVM)

**フィールド**
・クラスで宣言した変数名
・レコードを抗セする単位。
(その他の意味 分野・領域など)

#javaコマンド
Javaアプリを起動するコマンド。
(Javaプログラムを実行する)
##コマンドのオプション
| オプション | 概要 |
|———|—–|
| -classpath | 関連するclassファイルの検索先 |
| –module-path | モジュールの検索先 |
| -jar | jarファイルを実行 |
| -version | Javaバージョンを表示 |

**例:Test.jarを実行する例。パラメーターとして「太郎」を設定。**
> > java -jar Test.jar **”太郎”**

※その他コマンド系は、またそのうち纏めて記述します。

##JVM(Java Vitual Machine)
Javaのプログラムを動かすためのソフトウエア。
その他の言い方として、「Java仮想マシン」「JavaVM」

Javaは、どのマシンでもJavaが動作することを思想として作られた言語。

###JVMの仕組み
①Jav

元記事を表示

Javaのdouble型

###double型
double型は小数点以下を持つ数になります。
int型は整数で、1とか3とかです。
対してdouble型は1.2とか3.5とかの少数点以下に定義します。
####小数同士の計算
【例】

“`Main.java
class Main {
public static void main(String[] args) {
double number1 = 8.9;
double number2 = 1.2;
System.out.println(number1 + number2);
System.out.println(number1 – number2);

}
}
“`
上記の例だと結果は11.1と7.7になります。

元記事を表示

7日でJAVAを習得する方法

今日はTwitterであるものを見つけました


未経験からフリーランスエンジニアを目指すなら
最低1年は勉強しないと**ダメ**ですよね?
**いいえ、違います!**
プログラミング習得は
**7日**あれば**誰でも可能**です

よくあるプログラミングスクールの売り文句ですね

7日で本当にプログラミングを習得できるのか、僕がやってきたJavaの勉強方法を元に検証してみようと思います。

#前提
if文、for文くらいは学校で聞いたことあるけどいまいち覚えておらず、オブジェクト指向プログラミング(OOP)は知らないものとします
メンターのような人はおらず、すべて一人で勉強するものとします
インターネットを使え、必要な本は事前に入手しているものとします(ただし、Twitterで人に聞く、などはできないものとします)
Javaを勉強する7日間は仕事や用事などはないものとします
自分用のメモは取らないものとします(メモを取る時間の

元記事を表示

java(オーバーライド)

##オーバーライドを活用する

“`java:Hero.java
public class Hero {
String name = “勇者”;
int hp = 100;
//逃げる
public void run() {
System.out.println(this.name + “は逃げ出した!”);
}
}
“`

###SuperHeroクラスにrun()を再定義する

“`java:SuperHero.java
public class SuperHero extends Hero{
boolean flying;
//撤退する
public void run() { //Heroクラスにも定義してあるが、再定義(上書き)できる
System.out.println(this.name + “撤退した!”);
}
}
“`

###HeroとSuperHeroのrun()を呼び出す

“`java:Main.java
public class Main {
public static void ma

元記事を表示

【弊社新人に向けて】isXXX系メソッドについて

# isXXX系メソッドって例えば?
`File`クラスの`isFile`や`isDirectory`メソッドなどがあります。
[Fileクラス公式ドキュメント](https://docs.oracle.com/javase/jp/8/docs/api/java/io/File.html)

# 特徴は?
シンプルに`boolean`を返します。
`boolean`とは`true`や`false`といった真偽値を表すデータ型です。
`if文`の分岐条件や`while文`の継続条件として用いることができます。

# isXXX系メソッドのコード例
例として`isBlank`メソッドを作成してみます。

“`java:isBlank
// 指定された値が空文字かを判定する。
// 空文字であれば true。
// そうでなければ false を返す。
public boolean isBlank(String value) {
if (value.isEmpty()) {
return true;
}

return false;
}
“`

# 使い方は?
先程作

元記事を表示

[Firebase]アプリをアンインストールしてもFirebase AuthのcurrentUserがnullにならない問題

アプリをアンインストールしてもFirebase AuthのgetCurrentUser()の戻り値がnullにならなくて困ったので解決方法をここに記録します。

#解決した方法
調べたところ、この問題はandroidの自動バックアップ機能によるものらしいです。
マニフェストからこの機能のオフにしたら解決しました。
具体的には、manifest.xmlに以下のコードを追加しました。

“`xml:manifest.xml

元記事を表示

文字列リテラルとインスタンス

(新人エンジニアのふぎと君。
今日はJavaのコードをせっせと書いているみたい)

#Stringクラスのインスタンス

「…と、ほなそろそろStringクラスで文字列作るか」

~~~
String string1 = “Hello”;
String string2 = new String(“Hello”);
~~~

「遊び心を加えて書き方変えてみたで」
「これは先輩もくすっと笑ってくれるやろ!」

##先輩のもとへ

「先輩、コード書いたんで見てください」
「おもろいですやろ」
「んー、どれどれ・・・?」
「おん?」
「なあふぎと、お前この違いわかってへんのと違うか?」
「・・・?どの違いですか?」
「Stringクラスの初期化の仕方の違いや」
「違いって・・・どっちもStringクラスのインスタンスを
つくってるんと違うんですか」
「そうとも言えるし、そうやないとも言える」
「1つはリテラルで、もう1つはインスタンスや」

~~~
String string1 = “Hello”; //リテラル
String string2 = new String(“Hello”); //

元記事を表示

WSLでjupyter+Javaを使うときにClassPathを指定する

JupyterLab+Javaを使う場合にクラスパスを設定するぞ.

## 設定ファイルはどこだ
$ jupyter kernelspec list

“`console
java /path/to/jupyter/kernels/java
python3 /path/to/jupyter/kernels/python3
“`

## 通常のJavaとは違うjava-libというkernelを作るぞ
$ cd /home/user_name/.local/share/jupyter/kernels/
$ mkdir java-lib
$ cd java-lib
$ ln -s ../java/ijava-1.3.0.jar
$ cp ../java/kernel.json ./
$ vi kernel.json

“`kernel.json
{
“argv”: [
“java”,
“-Xmx8g”,
“-cp”,
“/path/to/lib/dir/*:/path/to/java-lib/i

元記事を表示

Chocolateyを使ったWindowsのJava環境最新化

[Chocolatey](https://chocolatey.org/)でWindows10 64bitのJava開発環境を最新化します。
[Chocolatey](https://chocolatey.org/)は、Ubuntu/Debian系のapt-getのWindows版といった感じのソフトです。
年に1度ほどする作業で、当然次にするときに忘れているので、メモしておきます。
[記事「Chocolateyを使った環境構築の時のメモ」](https://qiita.com/konta220/items/95b40b4647a737cb51aa)を参考にしています。

とあるチュートリアルに従ってChocolateyをインストールしてごく稀に使っているだけなので、素晴らしいソフトかまるで判断できないです。ただ、[リリースノート](https://chocolatey.org/docs/release-notes-choco-cli)があまりされていないのが気になります。

# 手順
まずは、Powershellを管理者権限で起動します。コマンドプロンプトだと警告でるのでやめました。

元記事を表示

Windows10のWSLでJupyterLab+Javaを使う

Windows10でJupyterLab+Javaを使いたかったので試してみた.
Jupyter Notebook上でJavaが動いたらなんか便利そうじゃない?

#インストール
## Jupyterインストール
$ sudo pip install jupyterlab widgetsnbextension
$ jupyter lab –generate-config
$ cd .jupyter/
$ emacs jupyter_notebook_config.py

“`jupyter_notebook_config.py
# c.NotebookApp.use_redirect_file = True
c.NotebookApp.use_redirect_file = False
“`

## Jupyter用JavaKernelのインストール
$ git clone https://github.com/SpencerPark/IJava.git
$ cd IJava/
$ ./gradlew installKernel

#実行
$ jupyter lab
または,Wi

元記事を表示

GradleでS3を使用する時にNoSuchFieldError:REQUIRES_LENGTHと出て困った話

#発生状況
AWS SDK for Java を使用してS3にファイルアップロードしようとしたら下記のようなエラーが発生した

“`
Exception in thread “main” com.amazonaws.AmazonClientException: Unable to complete transfer: REQUIRES_LENGTH
at com.amazonaws.services.s3.transfer.internal.AbstractTransfer.unwrapExecutionException(AbstractTransfer.java:286)
at com.amazonaws.services.s3.transfer.internal.AbstractTransfer.rethrowExecutionException(AbstractTransfer.java:265)
at com.amazonaws.services.s3.transfer.internal.AbstractTransfer.waitForCompletion(Abstr

元記事を表示

[AndroidStudio] ActionBarDrawerToggleのハンバーガーメニューの色変更

タイトルの通りです。
自分用メモ。

ハンバーガーメニューを白色にしたい場合

“` Java:MainActivity.java
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
this, drawer,toolbar,
R.string.drawer_open,
R.string.drawer_close);
/* ハンバーガーメニューのdrawableをtoggleから取得 */
DrawerArrowDrawable arrowDrawable = toggle.getDrawerArrowDrawable();
/* 色の変更 */
arrowDrawable.setColor(getResources().getColor(R.color.colorWhite));
     /* 色を変更したdrawableを再びセット */

元記事を表示

【Kotlin】内容の重複したファイルを削除する【Java】

# やりたいこと
あるディレクトリの中に内容の重複したファイルが大量に有る時、1つだけ残して重複したものを削除します。

## やり方
ファイル全体を比較すると処理コストが高くて大変です。

そこで今回はファイルのハッシュ(ダイジェスト)を比較することとし、以下の方針で実装しました。

1. ファイルのハッシュを取ってダイジェストを取得
2. ダイジェストが`Set`に既存かチェック
3. 存在していれば削除
4. 存在していなければ`Set`に`add`

# サンプルコード
とりあえず動くサンプルは以下の通りです。

“`kotlin
import java.io.File
import java.security.MessageDigest

val sha256 : MessageDigest = MessageDigest.getInstance(“SHA-256”)

fun getDigest(bytes: ByteArray): List = sha256.digest(bytes).toList()

fun getFiles(pathToDir: St

元記事を表示

【Java】Selenide+ChromeDriverでサクッと統合テスト入門<2020年5月更新>

#はじめに
アプリケーションの機能を開発したら他の機能とうまく連動するか、どんな挙動か調べるために**統合テスト(結合テスト)**やりますよね。
今回はJavaで開発したWebアプリケーションの簡単な統合テストを目視じゃなくて、自動化しちゃおう(当たり前か)ということで**[Selenide](https://selenide.org/)+[ChromeDriver](https://chromedriver.chromium.org)**を使ったハンズオンをやろうと思います。
![スクリーンショット 2020-05-22 0.38.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296645/d5573804-8df2-f4c8-1cb5-045366170775.png)

※本格的にテストやるならMockitoなど使ってMock呼んでテストする方がいいです。

#開発環境
macOS Catalina 10.15.4
IntelliJ IDEA 2018.3.6
Google Chrome

元記事を表示

JavaとJavaScriptでwebブラウザとのソケット通信②

# 背景

過去記事:https://qiita.com/take4eng/items/d0b009c48ee8c3fe420a

上記の過去記事に記述しているように、Javaでサーバープログラムを作成しソケット通信を実施。
⇒ HTTP通信をゴリ押しで解析しているため、無駄に複雑なコードになっている。

Java EEにはsocket通信に関するAPIが多数存在し、非常に簡単に実装することが可能。
既に多くの人がまとめてくれてはいるが、実装した内容をまとめておく。
>便利なAPIが用意されているのにゴリ押しで解析なんて誰もやらないよね
そりゃググってもなかなか出てこないわ…

# 実践内容
1. WebSocket API の使用方法
2. APIを使用したサーバープログラムを作成
3. 過去記事内のクライアントプログラムコードを編集しチャットアプリ作成

## WebSocket API の使用方法
基本的なWebSocket APIについて説明する。
ここで紹介するもの以外にも多数のAPIが存在するが、必要ならググると良い。

### Endpointクラスの作成

“`jav

元記事を表示

OTHERカテゴリの最新記事