20220125のJavaに関する記事は4件です。

【合格】Java Silver(Java SE 8 Programmer I)勉強方法

職業訓練校でJavaをせっかく学んだので、形にするために受験しました。受験料が高すぎて(26600円)個人的には全然薦めてないです。自分が受験したときは8でしたが、現在は11にバージョンアップされています。そして、受験料がなんかさらに上がったような…? Java SE 11 Programmer I (1Z0-815-JPN) 試験 | Oracle University 受験状況 勉強期間:1か月程度 使用教材:徹底攻略 Java SE 8 Silver 問題集[1Z0-808]対応(=黒本) 費用合計:30100円 黒本:3500円 受験料:26600円(受験当時) 使用教材と勉強方法 Java Silver黒本 黒本一択です。これしかやってません。巻末の模擬試験をやり込めるか否かが合格ラインです。1章ずつ進めていき、最後に模擬試験を3周しました。模擬試験は解説を確認し、細かいところまでできるようにして行った方がいいです。 簡単だと評価する先輩方も多いですが、初心者にとっては結構難しい試験だと思います。試験料も高いですし、油断しない方がいいです。 試験結果 合格 得点率88%(合格ライン65%)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Databricks上でのJAR(Javaなど)の実行方法

JavaをDatabricks上のSpark環境で実行する方法について説明します。 DatabricksのSparkランタイム(Databricks Runtime)は、 最新のSparkバージョン対応・最適化機能の享受 OSS Sparkにはない高速化機能/拡張機能 C++ベースのSparkエンジン(Photon)の高速化ランタイム インフラ管理・ソフトウェア/脆弱性管理などからの解放 などの特徴があり、コードはほぼそのままで、Databricks上に実行環境を移すだけで、実行速度の向上、それに伴う、費用削減などが見込めます(もちろんケースバイケースになります)。 Databricks上でのJARの実行方法 以下のステップになります。 JARファイルアップロードする Jobの作成 Jobの実行と結果の確認 ここでは、前半でWeb UIを使用した方法に関して説明し、その後、CLI(コマンドライン)で実施する方法を説明します。 1. JARファイルのアップロード JARをDatabricks上で実行するには、JARファイルをDBFS(DatabricksのRootストレージ、実体はWorkspaceを作成したときにS3, Blob Storage, GCS)にアップロードする必要があります。 Upload機能の有効化の確認 まず、Web UIからファイルをアップロード機能が有効化されているか確認します。 Admin権限を持つユーザーでDatabricksのWorkspaceにログインした後、以下の通り確認できます。 左バーの下部にあるSettings(ギアのアイコン) > Admin Consoleをクリック ページ遷移後に、上部にあるタブからWorkspace Settingsを選択 AdvancedセクションにあるDBFS File BrowserをONになっているか確認 以上で設定が完了しました。 JARのアップロード Databricksの左メニューから Dataを選択 上部にあるDBFSボタンをクリック その右側に現れるUploadボタンをクリック ポップアップするWindow内でアップロードするディレクトリを指定 アップロードするファイルを選択する Doneボタンをクリック 例えば、以下の通り設定します。 アップロード先ディレクトリ: /FileStore/JAR_examples/ アップロードするファイル: dataframe-example-1.0.JAR アップロード後のファイルパスは以下の通りになります。 dbfs:/FileStore/JAR_examples/dataframe_example_1_0.JAR 2. Jobの作成 Databricksの左メニューから  Jobsをクリックして、Job一覧ページを開く Create Jobボタンをクリック Taskタブに現れるポップアップのWindow内にタスクの内容を設定 Task name: 任意の文字列(適宜) Type: JAR Main class: JARのメインクラス名 Depenent Libraries: Addクリックして Library Source: DBFS/S3 File Path: 先ほどアップロードしたJARファイルのパス(例: dbfs:/FileStore/JAR_examples/dataframe_example_1_0.JAR) Addをクリック Cluster: Editをクリックしてクラスタの内容を設定 Parameters: JARに渡すパラメータ(コマンドライン引数)をJSON形式で指定する (任意) Createをクリック 3. Jobの実行と結果の確認 以下の通り、Jobの管理画面を開きます(Job作成した直後のページ)。 Databricksの左メニューからJobsをクリック Job一覧から該当のJobをクリック Job設定ページに以下の2つのタブがある Runs: 実行結果の一覧 Tasks: Jobの設定(前節で実施した内容) Jobの設定ページの右上にあるRun NowをクリックするとJobが実行開始されます。 実行が終了するとRunsタブにある一覧から結果が参照できます。Spark UI、標準/エラー出力なども参照可能です。 以上が基本的なJARの実行方法になります。 (補足1)クラスタについて Jobを実行する際のクラスタは以下の2種類があります。 Jobs Computeクラスタ(Jobsのデフォルト) バッチ処理向けのクラスタタイプ Job実行される毎に起動し、実行が終了した後すぐにシャットダウンされる 起動に1-2数分かかる 利用単価は安価(対All Purpose Compute) All Purpose Computeクラスタ(Notebook実行のデフォルト) インタラクティブ作業向けのクラスタタイプ 起動、シャットダウンはユーザーが実施する(idle時のオートシャットダウンの機能あり) 連続起動しているため、すぐにJobの実行が可能 利用単価は高価(対Jobs Compute) 本番運用時のバッチ処理ではJobs Computeクラスタが適していますが、開発時などの繰り返しJob実行する場合にはAll Purposeクラスタを使用することで効率化できます。 All Purposeクラスタの設定は、Databricksの左メニュー内のComputeで実施します。 (補足2) DBFSとS3 Bucketの対応について 上記で使用したDBFSストレージの実体はWorkspace作成時に登録したS3 Bucketです。 DBFS上のファイルパスとS3上のファイルパスの対応は以下の通りになっています。 システム file path DBFS上 dbfs:/FileStore/example/foobar.csv S3上 s3://{DBFSのバケツ名}/tokyo-prod/{ワークスペースID}/FileStore/example/foobar.csv また、SparkのコードからはDBFSのファイルパスはdbfs:を除いた/FileStore/example/foobar.csvでもアクセス可能です。 ファイル一覧参照については、DatabricksのUIから実施できます(左メニュー内のDataからDBFSをクリック)。 (補足3) Javaのコードについて DatabricksのSparkを使用する際の注意点が以下のドキュメントから参照可能です。 Job > Best Practice > JAR ジョブ https://docs.microsoft.com/ja-jp/azure/databricks/jobs#jar-jobs 以下、Job実行確認のためのサンプルコードとJARファイルになります。 import org.apache.spark.sql.SparkSession; import org.apache.spark.sql.Dataset; import org.apache.spark.sql.Row; public class DataframeApp { public static void main(String[] args){ SparkSession spark = SparkSession .builder() .appName("Simple Daraframe Example") .getOrCreate(); Dataset<Row> df = spark.read().format("csv") .option("inferSchema", "true") .option("header", "true") .load("/databricks-datasets/Rdatasets/data-001/csv/ggplot2/diamonds.csv"); df.show(); //spark.stop(); } } JARファイル: dataframe-example-1.0.jar (補足4) コマンドラインからの実行について 上記で説明したJARの実行について、コマンドライン(CLI)からの実行も可能です。 以下にドキュメントがありますので、参照ください。 ジョブ CLI 参考リンク Databricks Jobs
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Javaを使用してWordのタイトルを読み取る方法

概要 人々がWordを使ってレポートまたは論文を編集している時、タイトルが使用されるのはごく普通のことです、特定のニーズにより、それらを従って適応されるため、「スタイル」のオプションでWordのタイトルをすばやく設定できます、以下の画像のように。 ディレクトリを追加する場合、「有効スタイル」を「ディレクトリレベル」に設定することができます。ある程度で言えば、タイトルアウトラインをディレクトリとして使用することもできます。 この記事では、バックエンドのJavaプログラムコードを介してWordのタイトルコンテンツを取得する方法を紹介します。 今回のテスト用Word文書は、下の図に示されています。「タイトルスタイル」と「ディレクトリレベル」は既に関連するセッティングも設置完了しました、タイトルは取得ディレクトリと同じです、タイトルを取得する時目次を獲得すると同じです。 コードテスト環境 Wordテストのドキュメント:.Docx 2019 Edition. コンパイル環境:Intellij Idea 2018. JDKバージョン:1.8.0 Word Jarパッケージ:Free spire.doc.jar 7.11 Javaコード一覧 import com.spire.doc.*; import com.spire.doc.documents.Paragraph; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; public class GetTitle { public static void main(String[] args)throws IOException { //Wordテストドキュメントをロードする Document doc = new Document(); doc.loadFromFile("C:\\Users\\Administrator\\Desktop\\sample.docx"); //ヘッダーの内容を.txtファイルに保存する File file = new File("GetTitle.txt"); if (file.exists()) { file.delete(); } file.createNewFile(); FileWriter fw = new FileWriter(file, true); BufferedWriter bw = new BufferedWriter(fw); //sectionをトラバースする for (int i = 0; i < doc.getSections().getCount(); i++) { Section section = doc.getSections().get(i); //Paragraphをトラバースする for (int j = 0; j < section.getParagraphs().getCount(); j++) { Paragraph paragraph = section.getParagraphs().get(j); //タイトルを取得する if ( paragraph.getStyleName().matches("1"))//「見出し1」という内容の段落 { //段落タイトルのコンテンツを取得する String text = paragraph.getText(); //txtドキュメントにテキストを書き込む bw.write("タイトル1: "+ text + "\r"); } //タイトルを取得する if ( paragraph.getStyleName().matches("2"))//「見出し2」という内容の段落 { //段落タイトルのコンテンツを取得する String text = paragraph.getText(); //txtドキュメントにテキストを書き込む bw.write("タイトル2: " + text + "\r"); } //タイトルを取得する if ( paragraph.getStyleName().matches("3"))//「見出し3」という内容の段落 { //段落タイトルのコンテンツを取得する String text = paragraph.getText(); //txtドキュメントにテキストを書き込む bw.write("タイトル3: " + text+"\r"); } //タイトルを取得する if ( paragraph.getStyleName().matches("4"))//「見出し4」という内容の段落 { //段落タイトルのコンテンツを取得する String text = paragraph.getText(); //txtドキュメントにテキストを書き込む bw.write("タイトル4: " + text+"\r"); } bw.write("\n"); } } bw.flush(); bw.close(); fw.close(); } } タイトルを取得した効果は以下のようになります。 今回のWordタイトル読み取る方法は以上でした、最後まで読んでいただきありがとうございます。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Java Silver SE11 6章

Java Silver SE11 6章 黒本をもとに学んだことをアウトプットしていきます。 主に問題を解いていて、間違えた箇所もしくは知らなかった内容になります。 クラス・インスタンス JVMによりハードディスクに保存されているクラスファイルが読み込まれ、メモリ上にインスタンスを展開する。 例 Itemクラス public class Item { public String name; public int price; public void printInfo() { System.out.println(name + ", " + price); } } Mainクラス public class Main { public static void main(String[] args) { Item item1 = new Item(); item1.price = 100; item1.name = "Item"; System.out.println(item1.price); // 100 item1.printInfo(); // Item, 100 } } ガベージコレクタ メモリ空間には限りがある。空きスペースを確保するために、ガベージコレクタはメモリ上にある利用されていない不要なインスタンスを削除する。 この不要なインスタンスを探し、破棄する一連の流れをガベージコレクションと呼ぶ。 またガベージコレクションが起こるタイミングはJVMが決めるので、制御できない。 ※gcメソッドがあるが、あくまでJVMに実行を促すだけである。 ガベージコレクタ public class Garbage_collection { public static void main(String[] args) { Object a = new Object(); Object b = new Object(); Object c = a; a = null; b = null; } } 【ガベージコレクションの対象】 Object a = new Object(); Object b = new Object(); 1) Object c に参照があるので、aがnullでも対象にならない 2) どこからも参照がないので削除対象になる static クラスファイルを読み込む(ロード)するときメモリ空間には、staticな部分は以下のように別の領域に配置される。 static領域 staticで修飾されたフィールドやメソッドが配置される ヒープ領域 static以外の部分が配置される それぞれの領域に配置した後、ヒープ領域上にてクラス定義に従ったインスタンスが生成される。 よってstaticなフィールドは、インスタンスを生成しなくとも使用することができる。 【アクセスの可否について】 staticなメソッドは、staticなメンバ(フィールドとメソッド)にしかアクセスできない staticでないメンバには、インスタンスが生成されていない可能性があるため 逆にstaticでないメソッドからstaticなメンバへは、アクセス可能 例 Sampleクラス public class Sample { static int num = 0; } Mainクラス public class Main { public static void main(String[] args) { Sample.num = 10; Sample s1 = new Sample(); Sample s2 = new Sample(); s1.num +=10; s2.num = 50; System.out.println(Sample.num); // 50 } } このようにstaticなフィールドは、Sampleクラス間で共有するように使用できる。 メソッド まずは構文を整理する。 構文 アクセス修飾子 戻り値型 メソッド名(引数の型 引数名){ // メソッドでの処理 } 戻り値 retunr文で戻すデータの型と、メソッド宣言時での戻り値型は一致させなければならない。 戻り値を何も戻さない場合、戻り値型には「void」を指定する。 (つまり、何かしら戻り値型は記述する必要がある。) メソッドを実行するとき、以下の条件でメソッドを探し出す。 参照 (どのインスタンスのメソッドか) クラス名 (どのクラスにあるstaticなメソッドなのか) シグニチャ (メソッド名と引数のリスト) return文 以下の役割がある。 呼び出し元のメソッドに値を戻す メソッドでの処理を強制終了し、呼び出し元のメソッドに戻る 必ずreturn文が実行される場合、以降に処理を記述することはできない 例 return文 public class Sample { public void method(int num) { if (num < 0) { return; } System.out.print(num); return; // ↓ コンパイルエラー returnで制御を戻しているので、到達できない System.out.print(num); } } オーバーロード メソッド名が同じでも引数が異なる場合、同名のメソッドを複数定義できる機能のこと。 引数が異なるとは、以下の条件が相違していることを指す。 引数の数 型 順番 「戻り値型やアクセス修飾子」が異なっていてもオーバーロードとは見なされず、コンパイルエラーになる。 例 オーバーロード public class Calc { int calc(double a, int b) { return (int) a * b; } ///// 以下は4つはオーバーロードと認識されるのでOK ///// // 引数の数が違う int calc(int a) { return 1;} // 引数の型が違う int calc(double a, double b) { return 1;} // 引数の数が違う int calc( ) { return 1;} // 引数の順番が違う int calc(int b, double a) { return 1;} ///// 以下はコンパイルエラー ///// // 戻り値型は関係なし double calc(double a, int b) { } // 引数の変数名も関係なし int calc(double num1, int num2) { } } またオーバーロードできていても引数の型を判別できない場合、コンパイルエラーになる。 例 エラーなし public class Main { public static void main(String[] args) { Main m = new Main(); System.out.print(m.calc(2, 3)); // 2.5 } private double calc(double a, int b) { return (a + b) / 2; } } コンパイルエラー public class Main { public static void main(String[] args) { Main m = new Main(); System.out.print(m.calc(2, 3)); // コンパイルエラー } private double calc(double a, int b) { return (a + b) / 2; } private double calc(int a, double b) { return (a + b) / 2; } } 【解説】 数値リテラルはデフォルトではint型で解釈される。 そのため引数の型が一致していないように見えるが、double型はint型よりも範囲が大きいため、暗黙の型変換により互換される。 従ってJVMが「どちらのcalcメソッドを使用するのか判断できなくなる」のでコンパイルエラーになる。 コンストラクタ インスタンスが生成されたタイミングで実行される、前処理のメソッドのこと。 コンストラクタには以下のルールがある。 メソッド名とクラス名を同じにする 戻り値型は記述しない 記述した場合、通常のメソッドとして扱われる インスタンス生成時以外は使用できない アクセス修飾子は自由に設定可能 コンストラクタ自体を省略可能 この場合、自動的に引数なしの「デフォルトコンストラクタ」が追加される デフォルトコンストラクタは、コンストラクタを1つも記述しなかった場合のみ追加される 例 Sampleクラス public class Sample { public String name; // コンストラクタ public Sample() { this.name = "field name"; } // コンストラクタではない void Sample() { System.out.println("Sample()"); } } Mainクラス public class Main { public static void main(String[] args) { Sample s = new Sample(); s.Sample(); System.out.println(s.name); } } 結果 Sample() field name 戻り値型を記述している場合コンパイルエラーになるのではなく、通常のメソッドとして解釈される。 通常のメソッドが、クラス名と同じではいけないというルールはないので注意すること。 this オーバーロードされた別のコンストラクタを呼び出すことができる。 thisは最初に記述する必要があり、最初でない場合コンパイルエラーになる。 例 Sampleクラス public class Sample { public Sample() { // this("B"); ここならOK System.out.println("A"); // コンパイルエラー thisは一番最初に記述する必要がある this("B"); } public Sample(String str) { System.out.println(str); } } Mainクラス public class Main { public static void main(String[] args) { Sample s = new Sample(); // コンパイルエラー } } コンストラクタと初期化子 コンストラクタもメソッドに分類されるので、オーバーロードにより複数定義できる。 このときに初期化子{ }を使用することで、全てのコンストラクタに対して、共通処理を設定できる。 共通処理は、コンストラクタが実行される前に処理される。 例 Sampleクラス public class Sample { Sample(){ System.out.print("A"); } Sample(String str){ System.out.print(str); } // コンストラクタの共通処理 { System.out.print("B"); } } Mainクラス public class Main { public static void main(String[] args) { Sample s1 = new Sample(); // BA Sample s2 = new Sample("C"); // BC } } メンバに対するアクセス修飾子 4種類あるので、以下にまとめる。 アクセス修飾子 アクセス可能な範囲 public どのクラスからでもアクセス可能 protected 同じパッケージに属するクラス、継承した子クラス 何も書かない 同じパッケージに属するクラス private 自分自身のクラスのみ 例 Parent package ex26; public class Parent { // アクセス修飾子は何も記述しない int num = 10; } Child package other; import ex26.Parent; public class Child extends Parent{ public static void main(String[] args) { System.out.println(num);  // コンパイルエラー } } 何も書かれていないので、同じパッケージに属するクラスからしかアクセスできない。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む