20200601のJavaに関する記事は11件です。

Javaのクラスメソッド

クラスメソッド

クラスに属するメソッドのことです。
クラスメソッドの定義は、「public static 戻り値の型 メソッド名()」です。
クラスメソッドはインスタンスを生成しない状態でも呼び出せます。
【例】Personクラスとします

Person.java
class Person {
  public static 戻り値の型 メソッド名() {
    // メソッドの処理
  }
}

【例】

Main.java
class Main {
  public static void main(String[] args) {

    省略

    Person.printCount();
  }
}
Person.java
class Person {
  public static int count = 0;

   省略

  public static void printCount() {
    System.out.println("合計は" + count + "です");
  }
}
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

GraalVMを使ってみる

前書き

GraalVMのパフォーマンス、しいては、GraalをJITコンパイラとして利用した際のパフォーマンスにフォーカスした記事なので、GraalVMの特徴の一つであるnative imageや、multiple languagesなどに関しては、この記事では触れていない。

環境

  • macOS Mojava 10.14.4
  • Scala 2.13.1
  • sbt 1.3.8
  • GraalVM 20.1

GraalVMとは

Javaで書かれた最新のJITコンパイラ、Graalを搭載したVMである。
GraalVM公式ドキュメントによると、Graalには以下の特徴がある。

Graal自体がjavaで実装されているので、標準のJITコンパイラではできなかった部分的なエスケープ分析などの強力な最適化により、Javaプログラムを大幅に高速化できる

実際にどのくらい速くなるのかは後述している。

ちなみに、VM変更するのは面倒であれば、以下のオプションをつけることで、JITコンパイラだけGraalに変えることもできるらしい。
しかし、参考によるとJDK10以降でしか使えないので注意。

-XX:+UnlockExperimentalVMOptions -XX:+UseJVMCICompiler

GraalVMのアーキテクチャ

以下のようなアーキテクチャになっている。
標準JVMと比べて、C2部分がGraalコンパイラに置き換わっている。
GraalとJVMCIの部分が、Javaで実装されている。

Graal.png

JVMCI

Javaで実装されたコンパイラを動的コンパイラとしてJVMで利用できるようにしたもの。

https://openjdk.java.net/jeps/243

実際に使ってみる

インストール

公式ドキュメントに書いている通りにする。
macOSの場合は、ここ

OpenJDKの標準VMとGraalVMで速度比較してみる

275MbのGraalTest.txt に含まれている単語の種類からトップ10を吐き出すプログラムを実行する。

$ ll
total 65368
-rw-r--r--  1 kinsho  staff   202B  5 31 14:04 FibTest.scala
-rw-r--r--  1 kinsho  staff   1.9K  5 31 17:13 GraalTest.scala
-rw-r--r--  1 kinsho  staff   275M  5 31 16:54 GraalTest.txt
drwxr-xr-x  4 kinsho  staff   128B  5 31 14:28 project
drwxr-xr-x  5 kinsho  staff   160B  5 31 14:35 target

上述でインストールした、GraalVMをVMとして利用。

$ java -version
openjdk version "1.8.0_252"
OpenJDK Runtime Environment (build 1.8.0_252-b09)
OpenJDK 64-Bit Server VM GraalVM CE 20.1.0 (build 25.252-b09-jvmci-20.1-b02, mixed mode)

以下、実行プログラム

GraalTest.scala
import java.io.File

import scala.annotation.tailrec
import scala.io.BufferedSource

object GraalTest extends App {

  val fileName: String = "GraalTest.txt"
  val encode: String = "UTF-8"

  val source: BufferedSource = scala.io.Source.fromFile(fileName, encode)
  val lines: Iterator[String] = source.getLines()
  val sortedTextList = lines.toList.mkString(" ").split(" ").sorted.toList
  val value = createMap(sortedTextList)
  val top10Words = value.toList.sortBy(_._2).reverse.take(10)

  def createMap(wordList: List[String]): Map[String, Long] = {
    @tailrec
    def loop(list: List[String], acc: Map[String, Long]): Map[String, Long] = {
      wordList match {
        case head :: tail if acc.isEmpty => {
          loop(tail, acc + (head -> 1L))
        }
        case head :: tail => {
          acc.get(head) match {
            case Some(value) => {
              loop(tail, acc.updated(head, value + 1L))
            }
            case None => {
              loop(tail, acc + (head -> 1L))
            }
          }
        }
        case head :: Nil => {
          acc.get(head) match {
            case Some(value) => {
              acc.updated(head, value + 1L)
            }
            case None => {
              acc + (head -> 1L)
            }
          }
        }
      }
    }
    loop(wordList, Map.empty[String, Long])
  }
}

結果

OpenJDKの標準VMでは!?

比較のために、OpenJDKの標準JITコンパイラを使ってプログラムを実行してみる。
-XX:-UseJVMCICompilerを指定すると、OpenJDKの標準JITコンパイラを利用できる。

.jvmopts
-XX:-UseJVMCICompiler
-Xmx8G
実行
$ /usr/bin/time sbt run GraalTest.scala

すると、以下のような結果が得られる。

JVM結果
[info] running GraalTest
List((the,3297996), (and,2198664), (of,2198664), (you,1648998), (a,1648998), (in,1648998), (about,1099332), (always,1099332), (with,1099332), (how,1099332))
[success] Total time: 64 s (01:04), completed 2020/06/04 0:38:37
       85.31 real       479.11 user         8.89 sys

GraalVMでは!?

上記のプログラムをGraalVM上で実行してみる。

.jvmopts
-Xmx8G
実行
$ /usr/bin/time sbt run GraalTest.scala

すると、以下のような結果が得られる。

GraalVM結果
[info] running GraalTest
List((the,3297996), (and,2198664), (of,2198664), (you,1648998), (a,1648998), (in,1648998), (about,1099332), (always,1099332), (with,1099332), (how,1099332))
[success] Total time: 54 s, completed 2020/06/04 0:40:02
       75.29 real       333.95 user         9.23 sys

GraalVMを使うことで、10sも早くなっていることがわかる。
これは、だいぶ早くなっている!!!!!

↓パフォーマンス測定で使ったコード達
https://github.com/kinshotomoya/loginfrastructure/tree/master/jitCompiler

まとめ

現状のJITコンパイラの代わりにGraalを利用するのは、使えるなら使うべき。

次回は、GraalVMのもう一つの特徴である、native-imageに関してまとめる。

参考

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Mac]Visual Studio CodeにJavaをインストールする

以下のページを開き、ダウンロードする。
https://code.visualstudio.com/
スクリーンショット 2020-06-01 21.37.42.png

ダウンロード以降の手順は↓を参考にすると分かりやすいです。
https://qiita.com/watamura/items/51c70fbb848e5f956fd6

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

JavaによるExcelコメントの追加、読み取り、削除

注釈は、指定されたExcelセルにプロンプ​​トまたは追加情報を追加するために一般的に使用されるリッチテキスト注釈です。Free Spire.XLS for Javaは、JavaアプリケーションでExcelファイルにコメントを無料で追加および操作する機能を開発者に提供します。この記事では、Free Spire.XLS for Javaを使用してExcelドキュメントのコメントを追加、読み取り、削除する方法を紹介します。

基本的な手順:
1. Free Spire.XLS for Javaパッケージをダウンロードして解凍します。
2. libフォルダーのSpire.Xls.jarパッケージを依存関係としてJavaアプリケーションにインポートするか、MavenリポジトリーからJARパッケージをインストールします(pom.xmlファイルを構成するコードについては、以下を参照してください)。
3. Javaアプリケーションで、新しいJava Class(ここではAddComments / ReadComments / DeleteCommentsという名前を付けました)を作成し、対応するJavaコードを入力して実行します。

pom.xmlファイルを構成します:

<repositories>
        <repository>
            <id>com.e-iceblue</id>
            <name>e-iceblue</name>
            <url>http://repo.e-iceblue.com/nexus/content/groups/public/</url>
        </repository>
</repositories>
<dependencies>
    <dependency>
        <groupId>e-iceblue</groupId>
        <artifactId>spire.xls.free</artifactId>
        <version>2.2.0</version>
    </dependency>
</dependencies>

Excelコメントを追加する
次の例は、Free Spire.XLS for Javaを使用してコメントをExcelファイルに追加する方法を示しています、また、注釈テキストの各文字に異なるフォント色を設定します。

import com.spire.xls.*;
public class AddComments {
    public static void main(String[] args){
        //新しいExcelドキュメント
        Workbook workbook = new Workbook();

        //最初のワークシートを入手する
        Worksheet sheet = workbook.getWorksheets().get(0);

        //ワークシート名を設定
        sheet.setName("注釈");

        //セル[1,1]にテキストを追加
        CellRange range = sheet.getCellRange(1,1);
        range.setText("コメントを追加:");

        //セルにテキストを追加[5,1]
        CellRange range1 = sheet.getCellRange(5, 1);
        range1.setText("注釈");

        //セルにコメントを追加[5,1]
        range1.getComment().setText("これはコメントです\n複数行にすることができます");

        //注釈を表示する
        range1.getComment().setVisible(true);

        //注釈の高さを設定する
        range1.getComment().setHeight(100);

        //フォントを作成してフォントの色を設定する
        ExcelFont fontBlue = workbook.createFont();
        fontBlue.setKnownColor(ExcelColors.LightBlue);
        ExcelFont fontGreen = workbook.createFont();
        fontGreen.setKnownColor(ExcelColors.LightGreen);

        //注釈テキストの各文字のフォントを設定します
        range1.getComment().getRichText().setFont(0, 3, fontGreen);
        range1.getComment().getRichText().setFont(4, 6, fontBlue);
        range1.getComment().getRichText().setFont(7, 9, fontGreen);

        //結果ファイルを保存
        workbook.saveToFile("AddComments.xlsx", ExcelVersion.Version2013);
    }
}

AddComments.jpg

Excelのコメントを読む
Free Spire.XLS for Javaは、すべての注釈の読み取りをサポートしますまた、Excelワークシートの指定したセルに関連付けられた特定のコメント。

import com.spire.xls.*;
public class ReadComments {
    public static void main(String[] args){
        //Excelドキュメントを読み込む
        Workbook workbook = new Workbook();
        workbook.loadFromFile("AddComments.xlsx");

        //最初のワークシートを入手する
        Worksheet sheet = workbook.getWorksheets().get(0);

        //ワークシートに含まれるすべてのコメントを印刷する
        for(int i = 0; i < sheet.getComments().getCount(); i ++){
            String comment = sheet.getComments().get(i).getText();
            System.out.println(comment);
        }

        //指定したセルに関連付けられたコメントを印刷します
        //System.out.println(sheet.getCellRange(5,1).getComment().getText());
    }
}

ReadComments.jpg

Excelのコメントを削除する
Free Spire.XLS for Javaを使用すると、すべてのコメントを削除でき、Excelワークシートの指定したセルに関連付けられている特定のコメントも削除できます。

import com.spire.xls.*;
public class DeleteComments {
    public static void main(String[] args){
        //Excelドキュメントを読み込む
        Workbook workbook = new Workbook();
        workbook.loadFromFile("AddComments.xlsx");

        //最初のワークシートを入手する
        Worksheet sheet = workbook.getWorksheets().get(0);

        //ワークシートのすべてのコメントを削除する
        for(int i = 0; i < sheet.getComments().getCount(); i ++){
            sheet.getComments().get(i).remove();
        }

        //指定したセルに関連付けられているコメントを削除します
        sheet.getCellRange(5,1).getComment().remove();

        workbook.saveToFile("DeleteComments.xlsx", ExcelVersion.Version2013);
    }
}

DeleteComments.jpg

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MacにJava開発環境をインストールする

最終更新日

2020年6月1日

検証を行ったmacOSのバージョンは下記です。

  • macOS Catalina 10.15.5

インストールするもののバージョンは下記です。

  • AdoptOpenJDK 11.0.7 (HotSpot)
  • IntelliJ IDEA Community Edition 2020.1.1
  • Maven 3.6.3

この記事が古くなった場合、下記の手順は最新のインストール手順とは異なっている可能性があります。

JDK

JDKとは

Java Development Kitの略です。Java開発に必要なコンパイラ・JVM(Java Virtual Machine : Java仮想マシン)などが一体になっています。

JDKは色々な団体・ベンダーが提供しています。今回はAdoptOpenJDKを利用します。

複数バージョンのJDKをインストールしたい場合は、SDKMAN!を使ったほうがよいでしょう。

JDKのインストール

(1) https://adoptopenjdk.net にアクセスしてください。

(2) [OpenJDK 11]・[HotSpot]を選択したあと、[Latest Release]をクリックしてください。

スクリーンショット 2020-06-01 9.32.06.png

(3) [許可]をクリックしてください。

スクリーンショット 2020-06-01 9.36.13.png

(4) ダウンロードされた.pkgファイルを実行してください。

スクリーンショット 2020-06-01 9.37.03.png

(5) [続ける]をクリックしてください。

スクリーンショット 2020-06-01 9.37.58.png

(6) [続ける]をクリックしてください。

スクリーンショット 2020-06-01 9.38.45.png

(7) [同意する]をクリックしてください。

スクリーンショット 2020-06-01 9.39.00.png

(8) [インストール]をクリックしてください。

スクリーンショット 2020-06-01 9.39.21.png

(9) ①Touch IDを利用する、または②[パスワードを使用...]をクリックしてMacアカウントのパスワードを入力してください。

スクリーンショット 2020-06-01 9.39.43.png

(10) [閉じる]をクリックしてください。

スクリーンショット 2020-06-01 9.43.40.png

(11) ターミナル(未起動ならば起動してください)で下記コマンドを実行してください。これにより、環境変数 JAVA_HOME が設定されます。

cd ~
echo JAVA_HOME=/Library/Java/JavaVirtualMachines/adoptopenjdk-11.jdk/Contents/Home >> .zshrc
source .zshrc
echo $JAVA_HOME

1つ目のコマンド cd ~ で、ユーザーホームフォルダ(/Users/ユーザー名)に移動しています。

2つ目のコマンド echo JAVA_HOME=/Library/Java/JavaVirtualMachines/adoptopenjdk-11.jdk/Contents/Home >> .zshrc で、ユーザーホームフォルダ直下の.zshrcファイル(無かった場合は作成される)の最終行に JAVA_HOME=/Library/Java/JavaVirtualMachines/adoptopenjdk-11.jdk/Contents/Home という内容を追記しています。

この.zshrcファイルに書かれたコマンドは、ターミナルなどを起動した際に実行されます。

3つ目のコマンド source .zshrc で、.zshrcに書かれたコマンドを実行しています。2つ目のコマンド実行後にターミナルを再起動するならば、この3つ目のコマンドは不要です。

4つ目のコマンドでは、環境変数 JAVA_HOME の値を表示しています。正しく設定されていれば、設定したフォルダ名が表示されます。(設定されていない場合は何も表示されません)

これら4つのコマンドをターミナルで実行すると、こんな感じになります。

スクリーンショット 2020-06-01 11.48.39.png

この環境変数 JAVA_HOME は、様々なJava関連ツールが「JDKのインストール先」として使われます。設定しておかないと、それらのツールが動かない場合があります。

(12) ターミナルで下記コマンドを実行してください。これにより、環境変数 PATH が設定されます。

cd ~
echo PATH=$PATH:$JAVA_HOME/bin >> .zshrc
source .zshrc
echo $PATH

1つ目のコマンド cd ~ で、ユーザーホームフォルダ(/Users/ユーザー名)に移動しています。もし既にユーザーホームフォルダにいるのであれば、このコマンドは不要です。

2つ目のコマンド echo PATH=$PATH:$JAVA_HOME/bin >> .zshrc で、ユーザーホームフォルダ直下の.zshrcファイル(無かった場合は作成される)の最終行に PATH=$PATH:$JAVA_HOME/bin という内容を追記しています。

3つ目のコマンド source .zshrc で、.zshrcに書かれたコマンドを実行しています。2つ目のコマンド実行後にターミナルを再起動するならば、この3つ目のコマンドは不要です。

4つ目のコマンドでは、環境変数 PATH の値を表示しています。正しく設定されていれば、 表示結果の最後に /Library/Java/JavaVirtualMachines/adoptopenjdk-11.jdk/Contents/Home/bin が含まれています。

これら4つのコマンドをターミナルで実行すると、こんな感じになります。

スクリーンショット 2020-06-01 11.50.55.png

この環境変数 PATH は、ターミナルなどが「実行するコマンドを探すフォルダ」です。Javaの場合は javajavac などのコマンドが/Library/Java/JavaVirtualMachines/adoptopenjdk-11.jdk/Contents/Home/bin フォルダにあるため、この設定が必要になります。

(13) ターミナルで下記コマンドを実行してください。これにより、インストールされたJDKのバージョンが確認できます。

java --version
javac --version

これら2つのコマンドをターミナルで実行すると、こんな感じになります。

スクリーンショット 2020-06-01 10.38.57.png

(14) ターミナルを閉じてください。

もしインストールが上手く行かなかったら

ls /Library/Java/JavaVirtualMachines を実行して何も表示されない場合

JDKのインストールができていませんので、(4)からやり直してください。

echo $JAVA_HOME を実行しても何も表示されない、または違うフォルダが表示される場合

環境変数 JAVA_HOME の設定に失敗しています。

.zshrcファイルをVSCodeなどで開いて修正するか、 rm -f ~/.zshrc で.zshrcを削除後に(10)からやり直してください。

echo $PATH を実行しても最後に /Library/Java/JavaVirtualMachines/adoptopenjdk-11.jdk/Contents/Home/bin が表示されない場合

環境変数 PATH の設定に失敗しています。

.zshrcファイルをVSCodeなどで開いて修正するか、 rm -f ~/.zshrc で.zshrcを削除後に(10)からやり直してください。

IntelliJ IDEA

IntelliJ IDEAとは

チェコのJetBrains社が開発しているIDE(統合開発環境)です。高機能かつ動作が軽快なので、とても人気があります。

他のJava向けIDEとしては、EclipseやNetBeansがあります。

無償のCommunity Editionと、有償(30日間は評価版として無償で利用可能)のUltimate Editionがあります。

今回はCommunity Editionのインストール方法を紹介します。

Ultimate Editionのインストール方法もほとんど同じはずです。購入したい場合はサムライズムさんのWebサイトへどうぞ。

IntelliJ IDEA Community Editionのインストール

複数バージョンのIntelliJ IDEAをインストールしたい場合は、JetBrains Toolboxを使うとよいでしょう。

(1) https://www.jetbrains.com/ja-jp/idea/download/ にアクセスしてください。

(2) [コミュニティ]の[ダウンロード]ボタンをクリックしてください。

スクリーンショット 2020-06-01 10.55.52.png

(3) [許可]をクリックしてください。

スクリーンショット 2020-06-01 10.56.24.png

(4) ダウンロードされた.dmgファイルを実行してください。

スクリーンショット 2020-06-01 10.57.24.png

(5) [IntelliJ IDEA CE]のアイコンを、右側にある[Applications]フォルダにドラッグしてください。

スクリーンショット 2020-06-01 10.57.54.png

(6) 左上の赤い丸をクリックしてください。ウィンドウが閉じます。

(7) デスクトップにある[IntelliJ IDEA CE]を右クリック→["IntelliJ IDEA CE"を取り出す]を選択してください。

スクリーンショット 2020-06-01 10.59.53.png

(8) Launchpadを開いて、[IntelliJ IDEA CE]をDockに追加してください。

スクリーンショット 2020-06-01 11.01.18.png

(9) Dockから[IntelliJ IDEA CE]を起動してください。

スクリーンショット 2020-06-01 11.02.21.png

(10) [開く]を選択してください。

スクリーンショット 2020-06-01 11.02.49.png

(11) [I confirm that I have read and accept the terms of this User Agreement]にチェックを入れた後、[Continue]をクリックしてください。

スクリーンショット 2020-06-01 11.03.11.png

(12) JetBrains社に匿名で統計情報を共有するか確認されます。共有してもよい場合は[Send Anonymous Statistics]、そうでない場合は[Don't Send]をクリックしてください。

スクリーンショット 2020-06-01 11.04.32.png

(13) [Configure]-[Structure for New Projects]を選択してください。

スクリーンショット 2020-06-01 11.07.29.png

(14) [Project SDK]で[11 java version 11.0.7]、[Project language level]で[SDK default]を選択した後、[OK]をクリックしてください。

スクリーンショット 2020-06-01 11.08.40.png

IntelliJ IDEAを好みに設定する(ここの手順は必須ではありません)

(1) [Configure]-[Preferences]を選択してください。

スクリーンショット 2020-06-01 11.11.03.png

(2) [Appearance & Behavior]-[Appearance]を選択して、[Theme]で好きなカラーテーマを選択してください。

スクリーンショット 2020-06-01 11.12.39.png

(3) [Editor]-[Font]を選択して、好きな[Font]・[Size]などを選択してください。

スクリーンショット 2020-06-01 13.07.46.png

(4) [Editor]-[General]-[Code Completion]を選択して、[Match case]のチェックを外してください。

スクリーンショット 2020-06-01 11.16.58.png

デフォルト(Match case + First letter only)の設定では、大文字小文字まで厳密に書かないと補完されません。チェックを外すと、大文字小文字を無視して補完されます。

(5) ウィンドウ右下の[OK]をクリックしてください。

(6) [Configure]-[Edit Custom VM Options...]を選択してください。

スクリーンショット 2020-06-01 11.21.17.png

表示されたウィンドウで -Xms-XmX の行を書き換えることで、IntelliJ IDEAが利用するメモリ量を変えることができます。もしMac本体のメモリに余裕があるならば、 1G2G などに増やしておくと、よりIntellij IDEAの動作が軽快になります。変更後は[Save]をクリックしてください。

例:
スクリーンショット 2020-06-01 11.23.33.png

IntelliJ IDEAでHello World

(1) [Create New Project]をクリックしてください。

スクリーンショット 2020-06-01 11.27.06.png

(2) 左側のメニューで[Java]、[Project SDK]で[11]を選択した後、[Next]をクリックしてください。

スクリーンショット 2020-06-01 11.27.55.png

(3) そのまま[Next]をクリックしてください。

スクリーンショット 2020-06-01 11.28.54.png

(4) [Project name]に適当なプロジェクト名を入力した後、[Finish]をクリックしてください。

スクリーンショット 2020-06-01 11.29.19.png

(5) [Tip of the Day]は、IntelliJ IDEAを開くたびに使い方のTIPSを教えてくれるものです。必要のない場合は[Don't show tips]にチェックを入れた後に[Close]をクリックしてください。必要な場合は[Close]をクリックしてください。

スクリーンショット 2020-06-01 11.30.14.png

(6) [src]フォルダを右クリック後、[New]-[Java Class]を選択してください。

スクリーンショット 2020-06-01 11.32.31.png

[src]フォルダにカーソルを合わせた後にCommand + Nでも同じことができます。

スクリーンショット 2020-06-01 11.33.40.png

(7) [Class]を選択後、「Hello」と入力→Enterしてください。

スクリーンショット 2020-06-01 11.34.04.png

(8) Hello クラスを下記のように編集してください(保存は自動で行われますので不要です)。

public class Hello {

    public static void main(String[] args) {
        System.out.println("Hello!");
    }
}

クラス直下で psvm と入力→ psvm を選択してEnterすると、 main() メソッドが補完されます。

スクリーンショット 2020-06-01 11.36.39.png

main() メソッド内で sout と入力→ sout を選択してEnterすると、 System.out.println() が補完されます。

スクリーンショット 2020-06-01 11.38.46.png

(9) クラス内で右クリック→[Run 'Hello.main()']を選択すると、実行されます。

スクリーンショット 2020-06-01 11.39.52.png

クラス内で Shift + Control + Rでも実行可能ですが、macOS側のキーボード設定が[U.S.]でないとうまく実行されません。詳しくは@yusukeさんの資料をご確認ください。

Maven

Mavenとは

一般的には「ビルドツール」と呼ばれるものです。 javac を利用したコンパイルや、JAR/WARへのアーカイブ、必要なライブラリのダウンロード+クラスパスへの追加などを行ってくれます。

Mavenに関する説明は僕の資料をどうぞ!

Maven以外にはGradleも有名です。

Mavenのインストール

前述のSDKMAN!や、Homebrewでインストールすることも可能です。

(1) https://maven.apache.org/download.cgi にアクセスしてください。

(2) [apache-maven-3.6.3-bin.zip]をクリックしてください。

スクリーンショット 2020-06-01 13.29.16.png

(3) [許可する]をクリックしてください。

(4) ダウンロードされたZIPファイルをダブルクリックしてください。ZIPが展開されます。

ブラウザの設定によっては、ダウンロード直後に既に展開済みになっていることがあります。その場合は、この手順は不要です。

(5) 作成されたapache-maven-3.6.3フォルダを、ユーザーホームフォルダ(/Users/ユーザー名)直下に移動させてください。

Downloadsフォルダ内でも使えるのですが、誤って削除したりしないよう、別のフォルダに移します。

(6) ターミナルで下記コマンドを実行してください。これにより、環境変数 PATH が設定されます。

cd ~
echo PATH=$PATH:~/apache-maven-3.6.3/bin >> .zshrc
source .zshrc
echo $PATH

1つ目のコマンド cd ~ で、ユーザーホームフォルダ(/Users/ユーザー名)に移動しています。もし既にユーザーホームフォルダにいるのであれば、このコマンドは不要です。

2つ目のコマンド echo PATH=$PATH:~/apache-maven-3.6.3/bin >> .zshrc で、ユーザーホームフォルダ直下の.zshrcファイルの最終行に PATH=$PATH:~/apache-maven-3.6.3/bin という内容を追記しています。

3つ目のコマンド source .zshrc で、.zshrcに書かれたコマンドを実行しています。2つ目のコマンド実行後にターミナルを再起動するならば、この3つ目のコマンドは不要です。

4つ目のコマンドでは、環境変数 PATH の値を表示しています。正しく設定されていれば、 表示結果の最後に /Users/ユーザー名/apache-maven-3.6.3/bin が含まれています。

これら4つのコマンドをターミナルで実行すると、こんな感じになります。

スクリーンショット 2020-06-01 13.47.13.png

(7) ターミナルで下記コマンドを実行してください。これにより、インストールされたMavenのバージョンが確認できます。

mvn -v

このコマンドをターミナルで実行すると、こんな感じになります。

スクリーンショット 2020-06-01 13.48.19.png

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

JavaでTODOアプリを制作しよう2 まずはHello worldしたい

こんにちは。
JavaでTODOアプリを制作しよう1 MVCの簡単な説明の続きの記事です。

今回はとりあえずControllerを作ってそこからViewを表示させるところまでやってみたいと思います。

TodoController作成

todo>src>main>java>com.example.todo>TodoController
@Controller //①
public class ToDoController {

    @GetMapping("/top") //②
    public String top(){
        return "top"; //③
    }
}

①コントローラーの宣言

@Controllerとすることでこのクラスがコントローラーであることを宣言できます。
@~~~という記述はアノテーションと呼ばれます。(色々便利なモノを呼び出せるやつって感じです。)

②GetMapping

@GetMappingアノテーションは引数内のアドレスにHttp MethodのGet Methodでリクエストが来た時に直下のメソッドの処理行います。

③top.htmlをリターン

そのままです。詳しくは下記のHTMLの部分を参照!

HTMLを書く

Todo>src>resources>templates>top.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>hello world</title>
</head>
<body>

<p>hello world</p>

</body>
</html>

こんな感じでシンプルにHello worldを出力してみましょう。
templates下にHTMLファイルは上のコントローラーで書き方で呼び出すことができます!!

実際に確認してみる

localhost:8080/topにアクセスするとhello worldが表示されると思います!

次回は実際に登録部分をやってみようとおもいます!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

JavaでTODOアプリを制作しよう2 Spring Initializrで雛形を作ってHello worldしたい

こんにちは。
JavaでTODOアプリを制作しよう1 MVCの簡単な説明の続きの記事です。

今回はとりあえずControllerを作ってそこからViewを表示させるところまでやってみたいと思います。

TODOアプリ作成リンク集

1: MVCの簡単な説明
2: Spring Initializrで雛形を作ってHello worldしたい(今ここ)

Springの雛形を作成

まずはSpring InitializrでSpringの雛形を作っていきましょう。

Screen Shot 0002-06-01 at 12.53.18.png

シンプルにこんな感じで進めていきます。

今後JPAやlombokも追加していきますが、更新するのと同時に追加していくので今回はこの構成だけでOKです!

BuildしてRunする為の下準備

Buildする

Screen Shot 0002-06-01 at 14.39.14.png

InteliJの上部にカーソルを持ってくとメニューバーが出てくるのでBuild -> Build Projectを押してビルドします。ちょっと時間かかるかもですが待ちましょう。InteliJ最下部にビルド中みたいなのが出てるはず。

Edit ConfigurationsでRunする準備。

↓InteliJ上部のメニューバーからRun -> Edit Configurationsを押します。
Screen Shot 0002-06-01 at 14.39.37.png

↓こんな感じでハイライトしている部分を入力していきましょう。JREはJava11系のを選んでください。
Screen_Shot_0002-06-01_at_14_40_01.png

TodoController作成

お次はいよいよコントローラーの作成です。

下記のパスに従ってコントローラーを作ってください。

todo>src>main>java>com.example.todo>TodoController
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller //①
public class ToDoController {

    @GetMapping("/top") //②
    public String top(){
        return "top"; //③
    }
}

①コントローラーの宣言

@Controllerとすることでこのクラスがコントローラーであることを宣言できます。
@~~~という記述はアノテーションと呼ばれます。(色々便利なモノを呼び出せるやつって感じです。)

②GetMapping

@GetMappingアノテーションは引数内のアドレスにHttp MethodのGet Methodでリクエストが来た時に直下のメソッドの処理行います。

③top.htmlをリターン

そのままです。こう書くことによってtemplates下にあるhtmlファイルを呼ぶことができます(拡張子は省略)
htmlを表示する時のクラスの戻り値はStringです。

importについて

importはアノテーションを書くと自動で追加されると思いますが、されない場合はアノテーションをホバーしながらOption + Enter でも追加できます。

HTMLを書く

Todo>src>resources>templates>top.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>hello world</title>
</head>
<body>

<p>hello world</p>

</body>
</html>

こんな感じでシンプルにHello worldを出力してみましょう。
templates下のHTMLファイルは上のコントローラーの書き方で呼び出すことができます!!

実際にRunして確認してみる

Runする方法

Screen Shot 0002-06-01 at 14.57.30.png

InteliJの右上に緑色の矢印があると思うのでそこをクリックしてプロジェクトを実行(Run)してみましょう!

すると

Screen_Shot_0002-06-01_at_15_00_37.png

画面下部にこんなウィンドウが出てくるはずです。

Startedになっていたら無事起動しています。もしエラーが起きていた場合はその文でググってみよう!(結構出なくて困ったりする。)

いざアクセス

localhost:8080/topにアクセスするとhello worldが表示されると思います!

次回は登録部分の処理を書いてみます。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PlayframeworkでHikariCPのコネクション数をDataDogでモニタリング

アプリケーション側の設定

hikariCPのMbeansの設定を有効にする

application.conf
    play.db.prototype.hikaricp.registerMbeans = true

ConnectionPoolにPoolNameを設定する

デフォルトだと HikariCP-1, HikariCP-2 みたいになってしまうので、わかりやすい名前をつける

application.conf
    db.default.hikaricp.poolName = default
    db.default-ro.hikaricp.poolName = default-ro
    db.accesslog.hikaricp.poolName = accesslog

DataDog-agentの設定

参考: https://docs.datadoghq.com/ja/integrations/java

conf.d/jmx.d/conf.yaml を編集する

PoolごとにMBeanが登録されるので、 bean_regex で指定する

conf.d/jmx.d/conf.yaml
    conf:
      - include:
          domain: com.zaxxer.hikari
          bean_regex:
            - com\.zaxxer\.hikari.*[,:]type=Pool.*
          attribute:
            - ActiveConnections
            - IdleConnections
            - ThreadsAwaitingConnection
            - TotalConnections

確認 ?

あとは Metrics Expoler とかでメトリクスが取れるか見てみればOK :thumbsup:

スクリーンショット 2020-06-01 11.25.20.png

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Java(Jsoup)を使ってスクレイピングをしてみた

やったこと

Jsoupを使って、Yahoo! Financeの株価チャートをスクレイピングしてみました。
ちなみに、スクレイピングした株価チャートはアリババ(BABA)です。
アリババを選んだ理由は単純に伸びて欲しいからです。。。

こんな感じ

スクリーンショット 2020-05-31 20.06.36.png

コード

@Controller
public class YahooFinanceController {
    private static final String YAHOO_FINANCE_URL = "https://stocks.finance.yahoo.co.jp/us/detail/BABA";

    @RequestMapping("/")
    public String index(Model model) {
        Document YahooDoc = null;
        String imgSrc = null;
        try {
           YahooDoc = Jsoup.connect(YAHOO_FINANCE_URL).get();
           Elements img = YahooDoc.select("div.styleChart img");
           imgSrc = img.attr("src");
        } catch (IOException e) {
            e.printStackTrace();
        }
        model.addAttribute("imgSrc", imgSrc);
        return "index";
    }   
}
<body>
    <img th:src="${imgSrc}" title="アリババの株価!" />
</body>

解説

Documentとは?

URLで指定したHTMLを格納します。
メソッド名は、connect()です。
例えば、今回のケースでは、Documentを次のように指定しています。

Document YahooDoc = Jsoup.connect(YAHOO_FINANCE_URL).get();

これを、コンソール上に表示すると、指定したページのHTMLを全て持ってこれます!すごい。

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="ja"> 
 <head> 
  <title>アリババ・グループ・ホールディング【BABA】:株式/株価 - Yahoo!ファイナンス</title> 
  <meta charset="utf-8"> 
  <meta name="description" content="アリババ・グループ・ホールディング【BABA】の株価。NYSE(ニューヨーク証券取引所)とNASDAQに上場している全銘柄の株価やチャート、業績などを網羅。ADR日本株やランキングも充実しています。"> 
  <meta name="keywords" content="株価,ダウ,ナスダック,アメリカ,ランキング"> 
...省略...
  <meta property="og:description" content="アリババ・グループ・ホールディング【BABA】の株価。NYSE(ニューヨーク証券取引所)とNASDAQに上場している全銘柄の株価やチャート、業績などを網羅。ADR日本株やランキングも充実しています。"> 
  <meta property="og:title" content="アリババ・グループ・ホールディング【BABA】:株式/株価 - Yahoo!ファイナンス"> 
...以下省略

Elementとは?

上で取得したDocumentオブジェクトから要素を格納します。
メソッド名は、select()です。
例えば、今回のケースでは、Elementを次のように指定しています。

Elements img = YahooDoc.select("div.styleChart img");

divタグのstyleChartクラスにあるimgタグを取得しています。
これを、コンソール上に表示すると、

<img src="https://chart.yahoo.co.jp/?code=BABA&amp;tm=1d&amp;size=e" alt="チャート画像">

取得してきたimgタグのsrc属性だけを取得するには?

attr()で指定した属性の値をElementオブジェクトから取得できます。
今回は、imgタグのsrc属性をString型のimgSrcという変数に格納しています。

String imgSrc = img.attr("src");

これをコンソール上に表示すると、

https://chart.yahoo.co.jp/?code=BABA&tm=1d&size=e

最後にコントローラーからビューに値を渡し、ページを戻します。

model.addAttribute("imgSrc", imgSrc);
return "index";

意外と簡単にスクレイピングできることが分かりました。
以上です。最後まで読んでくださり、ありがとうございました。

参考

jsoupによるWebサイトのスクレイピング
How to parse for image src using JSOUP?my
Thymeleaf conditional img src

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Java(Jsoup)を使って株価チャートをスクレイピングをしてみた

やったこと

Jsoupを使って、Yahoo! Financeの株価チャートをスクレイピングしてみました。
ちなみに、スクレイピングした株価チャートはアリババ(BABA)です。
アリババを選んだ理由は単純に伸びて欲しいからです。。。

こんな感じ

スクリーンショット 2020-05-31 20.06.36.png

コード

@Controller
public class YahooFinanceController {
    private static final String YAHOO_FINANCE_URL = "https://stocks.finance.yahoo.co.jp/us/detail/BABA";

    @RequestMapping("/")
    public String index(Model model) {
        Document YahooDoc = null;
        String imgSrc = null;
        try {
           YahooDoc = Jsoup.connect(YAHOO_FINANCE_URL).get();
           Elements img = YahooDoc.select("div.styleChart img");
           imgSrc = img.attr("src");
        } catch (IOException e) {
            e.printStackTrace();
        }
        model.addAttribute("imgSrc", imgSrc);
        return "index";
    }   
}
<body>
    <img th:src="${imgSrc}" title="アリババの株価!" />
</body>

解説

Documentとは?

URLで指定したHTMLを格納します。
メソッド名は、connect()です。
例えば、今回のケースでは、Documentを次のように指定しています。

Document YahooDoc = Jsoup.connect(YAHOO_FINANCE_URL).get();

これを、コンソール上に表示すると、指定したページのHTMLを全て持ってこれます!すごい。

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="ja"> 
 <head> 
  <title>アリババ・グループ・ホールディング【BABA】:株式/株価 - Yahoo!ファイナンス</title> 
  <meta charset="utf-8"> 
  <meta name="description" content="アリババ・グループ・ホールディング【BABA】の株価。NYSE(ニューヨーク証券取引所)とNASDAQに上場している全銘柄の株価やチャート、業績などを網羅。ADR日本株やランキングも充実しています。"> 
  <meta name="keywords" content="株価,ダウ,ナスダック,アメリカ,ランキング"> 
...省略...
  <meta property="og:description" content="アリババ・グループ・ホールディング【BABA】の株価。NYSE(ニューヨーク証券取引所)とNASDAQに上場している全銘柄の株価やチャート、業績などを網羅。ADR日本株やランキングも充実しています。"> 
  <meta property="og:title" content="アリババ・グループ・ホールディング【BABA】:株式/株価 - Yahoo!ファイナンス"> 
...以下省略

Elementとは?

上で取得したDocumentオブジェクトから要素を格納します。
メソッド名は、select()です。
例えば、今回のケースでは、Elementを次のように指定しています。

Elements img = YahooDoc.select("div.styleChart img");

divタグのstyleChartクラスにあるimgタグを取得しています。
これを、コンソール上に表示すると、

<img src="https://chart.yahoo.co.jp/?code=BABA&amp;tm=1d&amp;size=e" alt="チャート画像">

取得してきたimgタグのsrc属性だけを取得するには?

attr()で指定した属性の値をElementオブジェクトから取得できます。
今回は、imgタグのsrc属性をString型のimgSrcという変数に格納しています。

String imgSrc = img.attr("src");

これをコンソール上に表示すると、

https://chart.yahoo.co.jp/?code=BABA&tm=1d&size=e

最後にコントローラーからビューに値を渡し、ページを戻します。

model.addAttribute("imgSrc", imgSrc);
return "index";

意外と簡単にスクレイピングできることが分かりました。
以上です。最後まで読んでくださり、ありがとうございました。

参考

jsoupによるWebサイトのスクレイピング
How to parse for image src using JSOUP?my
Thymeleaf conditional img src

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Java] Date 関連用語メモ

久々に サーバー側プロジェクトを担当することになりました。
しかも環境がdb & windows & Java など (T、T)
ですので、用語など勉強絡みでメモします。

用語

1。 ISO-8601暦体系

日付と時刻の表記に関するISOの国際規格

基本形式: YYYYMMDDThhmmss+0900
例)20200531T115959+0900

2。 GMT(グリニッジ平均時:Greenwich mean solar time)

英国のグリニッジ(経度0度)の地方平均太陽時
(平均太陽が南中する時を正午とする)
Greenwich.png| 経度0度0分0秒の基準子午線.png

グリニッジ天文台旧本館

3。 UTC(協定世界時:Universal time coordinated)

セシウム原子を利用したセシウム原子時計を基本

JST(日本標準時,Japan Standard Time)
UTC + 9時間(東経135度分の時差)

UNIX時間(POSIX )
UTCでのUNIXエポックから形式的な経過秒数
※UNIXエポック(epoch): 1970年1月1日午前0時0分0秒

4。グレゴリオ暦(新暦)

1582年10月15日(グレゴリオ暦)から行用されている暦法である。
(第226代ローマ教皇グレゴリウス13世がその前までの旧暦であるユリウス暦の改良を命じたである)

参照

・Wiki-ISO-8601
・Wiki-GMT(グリニッジ平均時)
・Wiki-UTC(協定世界時
・Wiki-UNIX時間

JAVA

(バージョン: 1.8)

1。OffsetDateTime

オフセットを使った日付/時間の不変の表現です。
UTC/グリニッジからのオフセットの他に、すべての日付と時間のフィールドをナノ秒の精度まで格納します。
例1)「2nd October 2007 at 13:45.30.123456789 +02:00」
例2)インスタンス生成
of(LocalDateTime date,ZoneOffset zone)
of(LocalDate date, LocalTime time, ZoneOffset zone)

2。LocalDateTime

日付/時間(年-月-日-時-分-秒として表示されることが多い)を表す不変の日付/時間オブジェクトです。
他の日付と時間フィールド(「年の日」、曜日、「年の週番号」など)にもアクセスできます。時間は、ナノ秒の精度まで表されます。
例1)「2007年10月2日の13:45.30.123456789」
例2)インスタンス生成
of(LocalDate date, LocalTime time)

3。Timestamp

java.util.Dateの薄いラッパーであり、JDBC APIはこれをSQL TIMESTAMP値として識別できます。

例1)インスタンス生成
valueOf(LocalDateTime date)

参照

https://docs.oracle.com/javase/jp/8/docs/api/java/time/OffsetDateTime.html
https://docs.oracle.com/javase/jp/8/docs/api/java/time/LocalDateTime.html
https://docs.oracle.com/javase/jp/8/docs/api/java/sql/Timestamp.html

おまけ

【Java】日付時刻API
【Swift】Dateの王道 (日付)
【kotlin】 Date日時計算をする方法

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む