投稿

ラベル(Java)が付いた投稿を表示しています

[資格] Oracle Certified Java Programmer, Bronze, Silver, Goldを取得した話

イメージ
Oracle認定JavaプログラマのBronze、Silver、Goldをすべて取得してきました。 Oracle認定Javaプログラマについて 概要 Oracle認定Javaプログラマは、日本Oracle社が主催するJavaプログラマ向けのベンダー資格です。 Javaのバージョンアップに合わせて試験の内容もバージョンアップされており、2022年12月現在はJava SE 8とJava SE 11が配信されています。今から取得を考えている人は、特に理由がない限りJava SE 11の取得を目指したほうが良いでしょう。 試験のグレードとしてはBronze(初級)、Silver(中級)、Gold(上級)の3段階あります。3段階ですがそれぞれで範囲が違ってくるので、試験に合わせた準備が必要です。 Bronze SE 概要 この試験はいわゆる入門向けの資格で、プログラミング言語(Java)を初めて学ぶ人を対象とした資格です。変数や制御構文の基礎、クラスやオブジェクト指向の基礎について出題されます。 なお以前はJava SE 7/8 Bronzeが配信されていましたが、現在はバージョンに依存しない構成でリニューアルされています。 試験情報 1. Bronze SE試験情報 資格名 Oracle Certified Java Programmer, Bronze SE 試験番号 1Z0-818(-JPN) 問題数 60 試験時間 65分 合格ライン 60% 受験料(税込み) ¥12,540 前提条件 無し、誰でも受験・認定可能 参考書 所感 実はこの試験が一番危なかったです。理由は試験時間に対して問題数がやや多く、1問1分程度で解かなくてはならないためじっくりと考えていると時間が足りなくなります。 問題としてはプログラムのロジックを理解する問題が多いですが、テンポよく解いていく必要があります。とにかくスピード重視です。 参考書に挙げた問題集を使って慣れておくとよいです。 Silver SE 11

[Java] JDBCのAPIでデータ検索・更新

イメージ
JDBCのAPIを使用してDB操作をする方法について、いくつかまとめていきます。 JDBCを介してSQLを発行する場合、Statementインターフェースを使用します。Statementインターフェースには以下の種類があります。 1. Statementの種類 Statement パラメータなしのSQL文を実行する。コンパイルせずに文字列のままSQL文を発行するので、DBMSがSQL文を解析する。 PreparedStatement Statementインターフェースのサブインターフェースで、パラメータ付きのSQL文を実行することが出来る。SQL文はDBMSが理解できるようにあらかじめコンパイルして発行する。 CallableStatement Statementインターフェースのサブインターフェースで、ストアドプロシージャを実行することが出来る。 なお、この記事で使用するテーブルとして、以下のようなデータを用意しています。 テーブル名はarticles、idを主キーにtitle、bodyといったフィールドを保持したテーブルです。 Statementを利用してSQLを実行 Statementインスタンスを取得 Connectionオブジェクトから生成 Statementインターフェースのインスタンスは、ConnectionクラスのcreateStatementメソッドで生成します。 Connection conn = DriverManager.getConnection(url, user, password); Statement statement = conn.createStatement(); Statementインスタンスの主なメソッド Statementインターフェースの主なメソッドは以下の通りです。なお、これらのメソッドはサブインターフェースである、PreparedStatement、CallableStatementにもそれぞれ引き継がれます。 2. Statementインスタンスの主なメソッド ResultSet executeQuery(String) 引数で指定されたデータ検

[Java] JDBCドライバでMySQL接続するまでの手順

イメージ
JavaでJDBCドライバを利用して、データベース接続をするまでの手順です。ここではJDBCドライバのインストール、jarファイルのセットアップまでの手順をまとめます。 なお、今回使用するデータベースはMySQLを使用しますが、1からサーバーを立てるのは大変なので、以前Laravel環境を構築したときに使用したdocker上のMySQLを使用します。これについては以下の記事を参照してください。 https://www.s-watanabe.work/2020/12/laravel-mysqldocker.html 1. 環境情報 OS Windows10 データベース MySQL JDBCドライバ Connector/J 8.0.31 IDE IntelliJ JDBCドライバのセットアップ インストーラのダウンロード 以下のMySQL公式サイトのダウンロードページからConnector/Jという、JDBCドライバをダウンロードします。なお、現在単体でのダウンロードは見つからなく、MySQL Installerに含まれているようなので、MySQL Installerをダウンロードします。 https://dev.mysql.com/downloads/connector/j/ インストーラを実行 ダウンロードしたインストーラを実行し、Setup TypeにCustomを選択してNextをクリックします。 インストールするプロダクトを選択 インストールするプロダクトは最小構成にしたいので、Connector/Jのみを選択します。 ダウンロード対象のプロダクトを確認 Connector/Jが入っていればOKです。Executeをクリックするとダウンロードとインストールが開始されます。 セットアップ完了 Show Detailをクリックすると、セットアップのログが確認できます。ここにライブラリがインストールされたディレクトリが確認できるので控えておきます。 Next → Finishをクリックし、MySQL JDBCドライバのセットアップは完了です。 ライブラリ設定 次にインス

[Java] シリアライズとデシリアライズ

入出力ストリームを利用してインスタンスをファイルに書き出すことをシリアライズ、ファイルから読み込むことをデシリアライズと言います。 Serializableインターフェース Serializableインターフェースはシリアライズ、デシリアライズさせたいクラスに実装させるインターフェースです。 このインターフェースは、マーカーインターフェースといい、シリアライズするクラスであるということをJVMへ示すためだけのものです。メソッドは何も持っていません。 コード例 ここではidとnameというフィールドを保持するPersonクラスを定義し、Serializableインターフェースを実装しています。 import java.io.Serializable; public class Person implements Serializable { private int id; private String name; public Person(int id, String name) { this.id = id; this.name = name; } @Override public String toString() { return "id:" + id + ", name:" + name; } } Serializableインターフェースはマーカーインターフェースであり、JVMがシリアライズ可能と判別するためのもの。メソッドは持たない。 シリアライズ ObjectOutputStreamクラス オブジェクトをシリアライズしてファイルに書き出すにはObjectOutputStreamクラスを使用します。 ObjectOutputStreamクラスのインスタンスを取得 ObjectOutputStreamクラスのコンストラクタは、FileOutputStreamクラスのオブジェクトを引数に取ります。 FileOutputStream fstream = new FileOutputStream("output/test.ser"); ObjectOutp

[Java] バイト入出力ストリーム

画像ファイルなどのバイナリーデータの入出力については、バイトストリームを扱うクラスが用意されています。ここでは、バイトストリームの入出力についてまとめていきます。 バイト入出力ストリーム FileInputStreamクラス ファイルからバイトストリームを読み込みます。 1. FileInputStreamクラスの主なメソッド byte read() ファイルから1バイト読み込むで返す。 byte[] readNBytes(int) ファイルから指定バイト数を読み込んで配列を返す。 byte[] readAllBytes() ファイルから全バイトを一度に取り出して配列で返す。大きなサイズのファイルの場合メモリを大量に使用するので、一般的にはreadNBytes(int)を使用する。 FileOutputStreamクラス バイトストリームをファイルへ出力します。 2. FileOutStreamクラスの主なメソッド void write(int) ファイルへ1バイト出力する。 void write(byte[]) ファイルへ複数バイトを出力する。 コードサンプル 以下の例はsample1.pngファイルを1024バイトずつ読み込んで、sample2.pngへコピーする例です。 FileInputStream fileInputStream = new FileInputStream("test/sample1.png"); FileOutputStream fileOutputStream = new FileOutputStream("test/sample2.png"); try ( fileInputStream; fileOutputStream; ) { byte[] data = null; while ((data = fileInputStream.readNBytes(1024)).length > 0) { fileOutputStream.write

[Java] 入出力ストリーム

Javaの入出力ストリームについてまとめていきます。 Fileクラス Fileクラスは、Java1.0の最初期からあるAPIで、ファイルやディレクトリのパスを表すクラスです。 あくまでパスを扱っているだけで、ファイルやディレクトリそのものを扱っているわけではない。 Fileオブジェクトの取得 コード例 File file = new File("output/data.txt"); この時オブジェクトはファイルパスを扱っているだけなので、output/data.txtの存在有無や書き込み権限にかかわらず、インスタンスを生成することが可能です。 Fileオブジェクトの主なメソッド boolean isFile() ファイルの場合にTrueを返す。 boolean isDirectory() ディレクトリの場合にTrueを返す。 long lastModified() ファイルの更新日付をUNIXタイムで返す。 String getAbsolutePath() ファイルの絶対パスを取得する。 String getCanonicalPath() ファイルの相対パスを取得する。 File[] listFiles() ディレクトリ配下のFileオブジェクトの配列を生成する。 File[] listFiles(FileFilter) FileFilter関数型インターフェースを引数に取り、条件に一致したFileオブジェクトの配列を生成する。 サンプル コード例 output配下の拡張子が「.txt」のファイル一覧を取得 ファイル名と最終更新日時を出力する File file = new File("output"); FileFilter filter = pathname -> pathname.getName().endsWith(".txt"); File[] files = file.listFiles(filter); Ar

[Java] ストリームAPI

ListやSetといったコレクションを扱う際に、すべての要素に処理を行う際、for文を使って順に要素を取り出していましたが、このような逐次処理を簡潔に記述できるようにしたStream<T>型がJava8で導入されました。 ここではStream API(以下ストリームAPI)の使い方についてまとめていきます。 ストリームAPIを使用する目的 ストリームAPIを使用する目的としては以下の通りです。 コレクションや配列の全要素に対して同じように変換する。 コレクションや配列の要素の合計や平均といった統計を取る。 コレクションや配列の要素に対して特定の条件でグルーピングやフィルターを行う。 コレクションや配列から特定の条件に合ったデータを検索する。 ストリームAPIは従来のfor文や拡張for文を置き換えるために用意されたAPIではない。 ストリームオブジェクトの取得 Iterableインターフェースから取得 java.lang.Iterableインターフェースのstream()メソッドで取得します。 コード例 List<String> list = new ArrayList<>(); list.add("Apple"); list.add("Melon"); list.add("Orange"); Stream<String> stream = list.stream(); Streamインターフェースから取得 コード例 Streamインターフェースのofメソッドからも可変長引数で取得することが出来ます。 Stream<String> stream = Stream.of("Apple", "Melon", "Orange"); Arraysクラスから生成 コード例 String[] arrays = {"Apple", "Melon", "Orange"}; Stream<String> stream = Arrays.stream(arrays

[Java] 並列処理 (Thread, Runnable)

Javaで並列処理(マルチスレッド)の実装についてのまとめです。 Javaで並列処理を実装するにはいくつか方法がありますが、ここではThreadクラスを継承する方法と、Runnableインターフェイスを実装したクラスを用意して、Threadクラスのインスタンスを生成する方法についてまとめます。 基本的な並列処理の実装 Threadクラスを継承する 実装 import java.lang.Thread; public class ThreadTest { public static void main(String[] args) { Thread t = new Thread() { @Override public void run() { for (int i = 0; i < 5; i++) { System.out.println("sub:" + i); } } }; t.start(); for (int i = 0; i < 5; i++) { System.out.println("main:" + i); } } } 実行結果 実行結果は順不同で出力され、並列に処理されているのが分かります。 java ThreadTest.java main:0 sub:0 main:1 sub:1 main:2 sub:2 main:3 sub:3 main:4 sub:4 Runnableインターフェースを実装する 実装 import java.lang.Runnable; import java.lang.Thread; public class ThreadTest { public static void main(String[] args) { Runnable r = new Runnable() { @Override

[java] Optional<T>について

Optionalクラスは何らかの処理の結果を格納・保持するクラスです。 これまでは取得した値が空ではないか、またはnullではないかなど、取得結果について確認したうえで後続の処理を行っている場合があり、これが冗長・可読性低下の原因でした。 Java8から導入されたOptionalクラスを使うと、こういったケースが簡潔に記述できるようになりました。 ここではインスタンスの生成と、値を使用するにあたって利用する主なメソッドについてまとめておきます。 インスタンスの生成 OptionalのインスタンスはOptionalインターフェースに定義されたファクトリメソッドを使用して生成します。 1. Optionalインスタンスを生成するメソッド empty() 空のOptionalのインスタンスを生成する。 of(T value) nullを許容しない値を持ったOptionalのインスタンスを生成する。 nullを指定するとNullPointerExceptionが発生する。 ofNullable(T value) nullを許容し、nullを指定した場合は空のOptionalインスタンスを生成する。 emptyメソッド コード例 Optional<String> optional = Optional.empty(); System.out.println(optional); 実行結果 Optional.empty ofメソッド コード例 Optional<String> optional = Optional.of("test"); System.out.println(optional); 実行結果 Optional[test] ofメソッドにnullを指定するとNullPointerExceptionが発生する。 ofNullableメソッド コード Optional<String> optional = Optional.ofNullable(null); System.out.println(optional); 実行結果 Optional.e

[Java] Enum(列挙型)についてまとめ

Enum(列挙型)について 概要 Enumは同じカテゴリの定数をまとめて管理するためのもので、クラスのように扱うことができます。 なお、JVM上はクラスとして扱われるため、メソッドやコンストラクタを定義することもできます。 構文 アクセス修飾子 enum 列挙名 { 列挙子, 列挙子, 列挙子... } Enumの基本的な使い方 定義例 public enum Status { DISABLED, APPROVED, ENABLED } Enumを使った分岐処理 Status status = Status.APPROVED; switch (status) { case DISABLED: System.out.println("無効"); break; case APPROVED: System.out.println("承認"); break; case ENABLED: System.out.println("有効"); break; } 配列で列挙子をすべて取得する Status[] statuses = Status.values(); 列挙子を文字列で取得する Status status = Status.valueOf("APPROVED"); 存在しない列挙子を指定すると IllegalArgumentException が発生します。 列挙子に値を持たせる 構文 アクセス修飾子 enum 列挙名 { 列挙子(値), 列挙子(値), 列挙子(値)... private 型 フィールド; private コンストラクタ {} } 定義例 enum Status { DISABLED("無効"), APPROVED("承認"), ENABLED("有効"); private String value; Status(String

[Java] ラムダ式と関数型インターフェース

ラムダ式とは前述の匿名クラスの記述をより簡潔に書くことが出来る記述法で、Java8から導入されました。 また、それに合わせてラムダ式で記述できるいくつかの関数型インターフェースが用意されているので、主要な部分についてまとめていきます。 ラムダ式 構文 インターフェース 変数 = (引数) -> {処理}; 定義例 例えば匿名クラスの説明で利用した次のサンプルコードがあります。 https://www.s-watanabe.work/2022/10/java.html#3 interface Itest { public void doTest(); } public class AnonymousTest { public static void main(String[] args) { Itest itest = new Itest() { @Override public void doTest() { System.out.println("Itest.doTest"); } }; itest.doTest(); } } このコードはラムダ式によって次のように置き換えることが出来ます。 interface Itest { public void doTest(); } public class AnonymousTest { public static void main(String[] args) { Itest itest = () -> { System.out.print("Itest.doTest"); }; itest.doTest(); } } 処理内容が1行の場合、中カッコ{}を省略することができます。 Itest itest = () -> System.out.print("Itest.doTest"); ラムダ式は関数型インター

[Java] ネストしたクラスについてのまとめ

クラス内に定義するクラスを総称してネストしたクラスと呼び、外側のクラスをエンクロージングクラスと呼びます。 ネストしたクラスには次の種類があります。 インナークラス staticインナークラス 匿名クラス ローカルクラス インナークラス インスタンス化 new エンクロージングクラス().new インナークラス() インナークラスのインスタンス化するには、エンクロージングクラスのインスタンスを先に生成する必要がある。 定義例 public class InnerTest { private class Test { private void method() { System.out.println("Test.method"); } } public static void main(String[] args) { new InnerTest().new Test().method(); } } インナークラス、およびそのメソッドのアクセス修飾子はpublic、protected、private、無しの4つとも指定できる。 privateを指定してもエンクロージングクラスからは呼び出すことができる。 実行結果 java InnerTest.java Test.method staticインナークラス インスタンス化 new インナークラス() staticインナークラスのインスタンス化には、エンクロージングクラスのインスタンスは必要ない。 staticインナークラスが外部のクラスファイルの場合は、「new エンクロージングクラス.インナークラス()」のように生成する。 定義例 public class InnerTest { private static class Test { private void method() { System.out.println("Test.method"); } } public static

[資格]Javaプログラミン能力認定試験2, 3級

6/19に行われた、Javaプログラミング能力認定試験の2級と3級について受験してきました。 と言っても、オンラインによるリモート開催のため、自宅にいながらの受験です。オンラインによる受験自体が初めての体験だったので、このあたりについても少し記載しておきます。 Javaプログラミン能力認定試験について 概要 サーティファイ社が運営する認定プログラムで、Javaプログラミングについてのスキル、知識を認定する資格で3級から1級まであります。 3級についてはJavaについての基礎知識、オブジェクト指向に関する基本的な知識などに加え、簡単なプログラムの保守能力のようなものが求められます。 2級についてはJavaについての基礎知識に加えて、インターフェース、抽象クラス、例外処理、マルチスレッドなどに関する知識、さらに小規模なアプリケーションの理解、保守能力のようなものが求められます。 1級についてはまだ受験してませんが、Javaについてのより上級レベルの知識が求められ、さらに実務に近い形の実技試験となります。いずれはこちらについても受験したいと思っているので、その際にまた詳しくまとめたいと思います。 試験 1. Javaプログラミング能力認定試験 3級 試験名 Javaプログラミング能力認定試験 3級 合格ライン 6割 問題数 テーマ別で6問、全37問 試験時間 60分 出題形式 多岐選択式 受験料 ¥5,100 2. Javaプログラミング能力認定試験 2級 試験名 Javaプログラミング能力認定試験 2級 合格ライン 6割 問題数 テーマ別で7問、全39問 試験時間 90分 出題形式 多岐選択式 受験料 ¥6,200 ※合格ラインは共通で、6割程度と言われています。詳細は公開されていません。 また、2級と3級に関して現在オンラインによるリモート試験

Windows + IntelliJ + Javaアプリケーションの開発環境を構築する

イメージ
IntelliJ はJET BRAINS開発のJVMアプリケーションに特化した統合開発環境IDEです。 有償版のUltimateと無料版のCommunityがあります。 今回は機能は制限されますがCommunityを使用します。 環境構築 Java11をインストール まずはJDKのをインストールします。以下ページからWindows版のインストーラをダウンロードしてインストールします。 ※Oracleアカウントが必要 https://www.oracle.com/technetwork/java/javase/downloads/jdk11-downloads-5066655.html chocolateyのインストール chocolateyはWindowsのPackage管理ツールです。 Linuxでいうところの yum や apt のようにアプリケーションのインストール、アップデートができます。 これまでWindowsアプリケーションはインストーラを探してインストールやアップデートをポチポチ行ってましたが、この作業が劇的に楽になります。 今後も使うと思うのでこれを導入してみました。 インストール PowerShellを管理者権限で起動し、以下のコマンドを実行してchocolateyをインストールします。 PS> Set-ExecutionPolicy Bypass -Scope Process -Force; ` iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1')) パッケージ管理コマンドについて よく使うパッケージ管理コマンドについて簡単にまとめます。 # インストール済みのパッケージ一覧 choco list --local-only # パッケージの検索 choco search <filter> # パッケージのインストール choco install <package> [-y] # パッケージのアップデート choco upgrade <package> # パッケージのアンインストール choco uni

JavaFXアプリケーションをMavenプロジェクトで作り直す

イメージ
前回作成したパスワード管理ツールをMavenプロジェクトで作り直し、jarファイルを作成するところまでを行います。 なお、今回からスペックの関係上OSがUbuntuになってますが、基本的な手順は変わらないはずです。 環境 Ubuntu 20.04 vscode JDK11 プロジェクト作成 mvn archetype:generate コマンドでプロジェクトを作成します。 入力ウィザードで以下を求められるので適当に入力します。 groupId artifactId version package mvn archetype:generate [INFO] Scanning for projects... [INFO] [INFO] ------------------< org.apache.maven:standalone-pom >------------------- [INFO] Building Maven Stub Project (No POM) 1 [INFO] --------------------------------[ pom ]--------------------------------- [INFO] [INFO] >>> maven-archetype-plugin:3.2.1:generate (default-cli) > generate-sources @ standalone-pom >>> (省略) Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): 1854: Choose org.apache.maven.archetypes:maven-archetype-quickstart version: 1: 1.0-alpha-1 2: 1.0-alpha-2 3: 1.0-alpha-3 4: 1.0-alpha-4 5: 1.0 6: 1.1 7: 1.3 8: 1.4 Choose a number: 8: Define value for property

Windowsで動くパスワード管理ツールをJavaFXで作る

イメージ
Windows上のGUIで動作するパスワード管理ツールを作成しました。 まずは必要最低限の機能を持たせました。 パスワード名称の一覧表示 絞り込み機能 クリップボードへコピー 経緯について コロナ過に入ってからずっとリモートワークが続き、Slack等で画面を共有しながら作業することがよくあります。 その際にパスワードをメモからコピーするときにさらけ出してしまうのを防ぎたかったからです。 2画面以上のマルチディスプレイであれば共有していないほうのディスプレイでコピーすれば済むんですが、1画面のためそうはいかず... またWindowsのアプリケーションでも探してみましたが、有償であったり会員登録が必要であったりと、これといったものが無かったのでJavaFxの勉強がてらに作ってみました。 環境 Windows10 vscode JDK11 プロジェクト作成 vscodeを開き「Ctrl+Shift+P」で「Java:Create Java Project...」を選択 Project type に No build tools を選択 Project を作成する親フォルダを選択 ここでは C:¥workspace を選択 Project名を入力 以下のような構成でプロジェクトが作成される 実行は右上の > ボタン Terminalに「Hello, World!」が出力されればひとまずOK ライブラリ JavaFX SDKダウンロード JavaでGUIを実装するためのフレームワークです。 Windows版のSDKをダウンロードします。 https://gluonhq.com/products/javafx/ ダウンロード後解凍し、任意のディレクトリに配置します。 ここでは C:\workspace\password-manager-test\lib\javafx へ配置しました。 JavaFX SDKインポート vscodeのエクスプローラーから、Java Projectを開く