- 投稿日:2022-01-19T23:38:51+09:00
Java Silver SE11 5章
Java Silver SE11 5章 黒本をもとに学んだことをアウトプットしていきます。 主に問題を解いていて、間違えた箇所もしくは知らなかった内容になります。 配列 Javaの配列は、配列クラスから作成されたインスタンスであり、複数の値を取り扱う。 配列が扱う値のことを要素と呼ぶ。 以下のような特徴がある。 同じ型か互換性のある型を扱える インスタンス生成時に要素数を決める 後から変更できない 宣言とインスタンス生成 宣言時には以下のルールがある。 記述する[]は、変数名の前後に入れることができる 宣言時に要素数の指定はできない 配列型の変数には、あくまで配列インスタンスへの参照のみが代入されているので要素は関係ない 2次元配列を生成する場合の流れ(int[][]array = new int[2][2];) 1次元目の配列インスタンスを生成 2次元目の配列インスタンスを生成 1次元目の要素として、2次元目の配列インスタンスの参照が代入される この時上記の内容から以下に注意する。 1次元目の要素数は省略できない 2次元目の配列インスタンスは後から生成できる 多次元配列でも変数に入っているのは、1次元目の参照のみ 例 宣言 public class Array_declare { int[]array1 = new int[3]; // []と変数名は逆でも問題なし int b[]; // 2次元配列 int[][]array2; // 3次元配列 int array3[][][]; // 分けて記述することも可能 int[]array4[]; int[][]array5[]; // コンパイルエラー 要素数を指定する必要がある int[]array6 = new int[]; // コンパイルエラー 要素数はint型 long型は× int[]array7 = new int[1.2]; // 2次元配列のインスタンス生成 int[][]array8 = new int[3][4]; // 式を利用できる int c = 1; int d = 2; int[]array9 = new int[c * d]; // 2次元目は後から生成できる int[][]array10 = new int[3][]; // コンパイルエラー 1次元目は省略できない int[][]array11 = new int[][3]; // コンパイルエラー 変数とインスタンスでの次元数は一致させる int[]array12 = new int[4][5]; // コンパイルエラー 配列型変数の宣言時に要素数を指定できない int[2]array13; } 要素のデフォルト値 要素のデフォルト値は以下のように決まっている。 型 デフォルト値 整数型 0 浮動小数点数型 0.0 真偽値 false 文字型 ¥u0000 Object型 null 例 Itemクラス public class Item { String name; int price = 100; } デフォルト値 public class Array_element { public static void main(String[] args) { Item[]array = new Item[3]; int total = 0; for(int i = 0; i < array.length; i++) { total += array[i].price; } System.out.println(total); // × 300 // nullPointerException をスローする // Itemインスタンスは生成されていないので、デフォルト値のnull } } 初期化子 { } 配列インスタンスと要素の初期化を同時にする場合は、初期化子{}を使用する。 変数の宣言と同時にしか使用することができない。 (配列インスタンスを作成するときに、次元数を示せばOK) 初期化 int[]array = {1, 2, 3}; 宣言・生成・初期化 組み合わせ 以下に具体例を記載する。 組み合わせ public class Array_declare_format { public static void main(String[] args) { // 同じ意味 int[]array1 = {1, 2, 3}; int[]array2 = new int[] {1, 2, 3}; // コンパイルエラー 初期化する場合、要素数を指定してはいけない int[]array3 = new int[3] {1, 2, 3}; // 意味はないが、文法的に問題ない int[]array4 = {}; int[]array5 = new int[0]; // 2次元配列をまとめて初期化 int[][]array6 = {{1, 2}, {3, 4, 5}}; // コンパイルエラー 次元数が異なる 初期化をカウントしないように! int[][]array7 = new int[] {}; // これならOK int[][]array8 = new int[][] {}; // 分割して初期化できる 次元数を明示してるからOK int[]array9; array9 = new int[] {1, 2, 3}; // コンパイルエラー 次元数を自動算出できない int[]array10; array10 = {1, 2, 3}; } } その他間違えた問題 例題 public class Array_string { public static void main(String[] args) { String[]array = {"A", "B", "C"}; array[0] = null; for(String str : array) { System.out.print(str); // nullBC } // nullはどこも参照していないことを表す「リテラル」である // なので、printで表示される } } 例題 public class Array_clone { public static void main(String[] args) { int[][]array1 = {{1, 2}, {1, 2},{1, 2, 3}}; int[][]array2 = array1.clone(); int total = 0; for (int[] array3 : array2) { for(int i : array3) { total += i; } } System.out.println(total); // 12 System.out.println(array1 == array2); // false } // clone()は内容が全く同じ、別のインスタンスを生成する // したがって参照先はクローン元と一致しない }
- 投稿日:2022-01-19T22:32:47+09:00
Java基礎(アウトプット用)
メソッドの定義,呼び出し class Main{ public static void main(String[]args){ hello(); } public static void hello(){ System.out.println("Hello World"); } } 引数をメソッドに渡す class Main{ public static void main(String[]args){ hello("Bob"); } public static void hello(String name){ System.out.println(name + "さんこんにちは"); } } 複数の引数を渡す class Main{ public static void main(String[]args){ printPrice("ピザ",3000); printPrice("コーラ",150); } public static void printPrice(String item,int price){ System.out.println(item + "は" + price + "円です"); } } 文字列の受け取り import java.util.Scanner; class Main{ public static void main(String[]args){ Scanner scanner = new Scanner(System.in); //文字列の受け取り String name = scanner.next(); //整数の受け取り int age = scanner.nextInt(); //小数の受け取り double weight = scanner.nextDouble(); } }
- 投稿日:2022-01-19T21:26:09+09:00
プログラミング言語を簡単にまとめる
Java JavaとはC言語ベースに開発された汎用性の高いプログラミング言語。求人需要が多い WEBサービスから業務システム、組み込み、など多岐に渡り開発現場で採用されている。 フレームワークはspring Framework Ruby Rubyとはオブジェクト指向のプログラミング言語。コードはシンプルに書きやすく読みやすい。 WEBサービスやWEBアプリケーションができる。 フレームワークのRuby on Rails。クックパッドや食べログに使用されている PHP PHPとは動的なWEBページを生成することができるサーバーサイドのスクリプト語。HTMLは静的WEBページ。 他のプログラミング言語と比べると文法が比較的容易なので取得しやすい。 フレームワークはLaravel C# マイクロソフト社が開発したオブジェクト指向のプログラミング言語。Javaと似ている。 GUIアプリケーション、WEBアプリケーション、ゲーム開発ができる フレームワークはASP.NET
- 投稿日:2022-01-19T20:55:55+09:00
Kotlinデビューしたくて環境構築してみた
はじめに Kotlinを触ってみたくなったので、環境構築をしてみました。 実際に動かすのは、今後になる予定です。 環境構築(Windows) JDKのインストールをする 1.公式サイトからJDKをダウンロードする https://www.oracle.com/java/technologies/downloads/#jdk17-windows 2.インストールする 3.環境変数の設定をする 「スタートメニュー」>「設定」>「システム」>「詳細情報」>「システムの詳細設定」>「環境変数」 「JAVA_HOME」を追加する インストールが完了したことを確認する C:\Users\XXX>java -version java version "17.0.1" 2021-10-19 LTS Java(TM) SE Runtime Environment (build 17.0.1+12-LTS-39) Java HotSpot(TM) 64-Bit Server VM (build 17.0.1+12-LTS-39, mixed mode, sharing) Android Studioをインストールする(統合開発環境) 1. 公式サイトからAndroid Studioをダウンロードする 特に変更がないのでどんどん進めていきます。 初回起動時に上記画面が出てきましたが、特にインポートせずに進めます。 セットアップを行いますので、好みの設定を行いました。 セットアップが完了しました。
- 投稿日:2022-01-19T18:47:17+09:00
必要な .class ファイルから間接的に参照されています
エラー解消に時間がかかったのでメモ。 ビルドパスのエラーの可能性があるのはわかっていたのですが…。 今後はjavaのビルド・パスを見て、 JREシステム・ライブラリがアンバインドとなっていないかを真っ先に確認すること 「アンバインド済み」という言葉があった場合は、 一旦除去して同じライブラリ(or Jar)を入れなおすと治ります。
- 投稿日:2022-01-19T11:02:20+09:00
Javaを通してPDFをPDF / Aに変換する方法
背景 PDF形式をPDF / A形式に変換することにより、ドキュメントのレイアウト、フォーマット、フォント、サイズなどが変更されないように保護し、ドキュメントの読み取りとアクセスを保証しながら、ドキュメントのセキュリティ保護の目的を達成できます。この記事では、Javaバックエンドプログラムコードを使用してPDFをPDF / A1A、2A、3A、1B、2B、および3B標準に変換する方法を示します。以下は、その方法と手順です。 jarパッケージのインポート Spire.Pdf.jarはこのプログラムにインポートされます。ダウンロードとインポートを実装するために、Mavenプログラムでpom.xmlの次のコンテンツを構成できます。 com.e-iceblue e-iceblue https://repo.e-iceblue.com/repository/maven-public/ e-iceblue spire.pdf 5.1.0 または、Jarをローカルにダウンロードして解凍し、libフォルダーでjarファイルを見つけてから、Javaプログラムで次の操作を実行して手動でインポートすることもできます。 フォーマット変換を実現するには、それを完了するために必要なコードは2行だけで、ターゲットのPDF / Aフォーマットが取得できます。変換を実装するためのコードサンプル手順は次のとおりです。 PdfStandardsConverterクラスのオブジェクトをインスタンス化し、PDFソースドキュメントをロードします。 上記の表で指定されたメソッドを呼び出して、PDFを指定された標準形式のPDF / Aに変換し、保存します。 Javaコード一覧 import com.spire.pdf.conversion.PdfStandardsConverter; public class PDFtoPDFA { public static void main(String[]args){ //PdfStandardsConverterクラスのオブジェクトを作成し、ドキュメントパスを渡す PdfStandardsConverter converter = new PdfStandardsConverter("C:\\Users\\Administrator\\Desktop\\sample.pdf"); //PdfA1Aに変換する converter.toPdfA1A("ToPdfA1A.pdf"); //PdfA1Bに変換する converter.toPdfA1B("ToPdfA1B.pdf"); //PdfA2Aに変換する converter.toPdfA2A("ToPdfA2A.pdf"); //PdfA2Bに変換する converter.toPdfA2B( "ToPdfA2B.pdf"); //PdfA3Aに変換する converter.toPdfA3A( "ToPdfA3A.pdf"); //PdfA3Bに変換する converter.toPdfA3B( "ToPdfA3B.pdf"); } } PDF/A形式の変換効果は以下のように: 今回のPDFからPDF/A形式に変換する方法は以上でした。最後まで読んでいただきありがとうございます。
- 投稿日:2022-01-19T08:33:06+09:00
Log4Shellについて知っておいた方がよいこと
本記事は2022年1月4日に公開した英語ブログLog4Shell webinar: What you need to knowを日本語化した内容です。 多くのJavaアプリケーションに影響を与えるLog4Shellの脆弱性については、すでに耳にしたり、対処したりしたことがあるのではないでしょうか。この重要なゼロデイ脆弱性についての最新情報を提供するため、弊社では最近オンラインセミナーを開催しました。 「Log4Shellについて知っておくべきこと」と題したオンラインセミナーでは、弊社SnykのField CISOのSteve Kinman(スティーブ・キンマン)、 Field CTOのSimon Maple(サイモン・メイプル)、Security Research Team をリードするKirill Efimov(キリル・エフィモブ)が Log4Shell の脆弱性とその修正方法についてお話ししました。本ブログ記事では、オンラインセミナーでお伝えした内容を簡単にまとめています。 なお本オンラインセミナーの全編は、日本語字幕入りでこちらからご覧いただけます。 Log4jとは何か? Log4jは、オープンソースのJavaライブラリで、Javaアプリケーション内でロギングに広く利用されています。このロギング・フレームワークは、Java Development Kit(JDK)によって提供されるJNDIサービスを使用して、アプリケーションから追加情報を取得し、ログ・データをより多くのメタデータで充実させることによって、開発者にとってログをより有益にしています。Apache Struts 2、Apache Solr、Apache Druid など、多くの一般的なJavaアプリケーションフレームワークは、デフォルトでLog4jを使用しています。 ログを取ることはとても重要なことです。Javaアプリケーションは、特に例外やエラーの周りでは常にログを取り、開発者が何が起こっているのかを理解できるようにします。 Log4Shellという脆弱性 Log4Shellは、Log4j2ライブラリに存在する重大かつ容易に悪用可能な脆弱性に付けられた名称です。この脆弱性(CVE-2021-44228)は、CVSSスコア10(最大値)です。 Log4jに、非常に広範かつ重大で、容易に悪用可能なゼロデイ脆弱性が公開されています。これは5、6年前から存在する攻撃ベクトルです。非常に悪用されやすいので、膨大な数の攻撃が行われており、常に進化している状況です。 Log4Shellが悪用される仕組み JNDI (Java Naming and Directory Interface)は、LDAPに似たディレクトリサービスで、一意の識別子を使ってコードやJavaオブジェクトを取得し返すことができます。Javaアプリケーションは、データソースやその他の情報のために、JNDIサービスにリクエストを行うのが一般的です。 Log4jロギングフレームワークは、それがログに記録するデータを豊富にするために、変数や他の情報を引き出すためにJNDIを使用しています。問題は、Log4jがログを記録する際に、未承認のJNDIサービスへのURLを含む危険な文字列を実行時に解決しようとする可能性があることです。 つまり、Log4Shellの脆弱性により、悪意のある行為者は、ロギングサービスを悪用して、Javaアプリケーションから独自のJNDIサービスにリクエストを行い、そのサービスが悪意のあるオブジェクトやコードで応答することができる可能性があるということです。このリモートコード実行(RCE)攻撃は、広範囲に及ぶ結果をもたらす可能性があります。 Log4Shellの主要なリスク Log4Shellに関して言えば、直接的なリスクはリモートコード実行攻撃です。悪意のあるコードを注入することで、脅威者はマルウェアやランサムウェアを展開し、サーバやアプリケーションを乗っ取り、データを流出させ、データの整合性やアプリケーションの可用性に影響を与え、他のセキュリティサービスを無効化することができます。 脆弱なJavaアプリケーションには、悪用される直接的なリスク以外にも、懸念すべき点があります。Log4Shellの脆弱性は、法令遵守の違反、クラウドセキュリティコントロールの失敗、サードパーティSaaSアプリケーションのセキュリティ問題、コンプライアンスポリシーの違反、などにつながる可能性もあるのです。 御社の監督委員会やCEOから「我々はLog4Shell脆弱性の影響を受けているのか?」 と聞かれた時に、あなたが正しく回答できないとしたら、それが最大のリスクです。 Log4Shellの脆弱性を確認する Java開発チームにとって、Log4Shell脆弱性に対応するためには、依存関係グラフの中でLog4jが使用されている可能性がある場所を特定する必要があります。この特定はたいていの場合、困難です。Snykの顧客の60.8%は、Log4jを推移的依存ライブラリとして使用していました。推移的依存とは、使っているオープンソースライブラリの中で間接的に、Log4jが使われていることを指します。 この脆弱性がセキュリティチームにとってさらに恐ろしいのは、Log4jが使われているかどうかさえ分からないことです。もし、あなたのソフトウェアが実際に何を使って構築されているのかわからない場合、影響を受けているかどうか本当にわからないかもしれません。 Snykを使用すると、Log4Shellのようなセキュリティ問題が推移的依存関係の中にある場合でも、アプリケーションの脆弱性をスキャンすることができます。これにより、Log4Shellのようなセキュリティリスクから、ソフトウェアのサプライチェーンを保護することができます。また、Snykは、アンマネージドJARおよびシェーディングされたJARの脆弱性を検出するsnyk log4shellコマンドを作成しました。 Log4Shellエクスプロイトの緩和策 使用しているLog4jのバージョンを確認したら、最低でもバージョン2.17.1であることを確認する必要があります。ゼロデイが発見された直後の最初のアドバイスは、Log4Shellの脆弱性を修正するためにバージョン2.15.0に移行することでしたが、このバージョンには他の問題もあります。 編集者注:ウェビナー収録時点では、2.16へのアップグレードが推奨されていました。その後、2.17.1 に更新されました。この脆弱性については、毎日多くのことが判明していますので、Log4Shellの脆弱性リソースページで、最新情報を定期的に確認することをお勧めします。 すぐにライブラリをアップグレードできない場合は、Log4Shellの悪用可能性を緩和することをお勧めします。完全な修正ガイドについては、Log4Shellの修正に関するチートシートをご覧ください。 この脆弱性は何年も続くでしょうし、ゼロデイであることは業界にとって懸念材料です。人々がそれを再び利用したり、気づかれていない依存関係として存在することにより、この脆弱性はずっと頭をもたげ続けるでしょう。 参考情報 Snyk株式会社では下記の日本語情報も公開しています。 Log4Shellの脆弱性が公開されました:Version 2.17.1にアップデートしてLog4j RCEを防ぐ Log4Shellデモ(実証〜検出〜修正)を公開しました 最新版Log4j 2.17.1ではCVE-2021-44832のリモートコード実行が修正されています 米国連邦取引委員会(FTC)からのLog4jの脆弱性に関する警告について 本記事にまとめたオンラインセミナーの全編は下記よりご覧いただけます。 Log4Shellオンラインセミナー録画動画(日本語字幕) また最新情報は下記の弊社公式SNSにてお届けしています。フォローをして脆弱性に関する最新情報をご確認ください。 Snyk Japan Twitter Snyk Japan Facebook Snyk株式会社 ウェブサイト セキュアコーディングのための情報を随時発信しております。ぜひご覧ください。
- 投稿日:2022-01-19T04:16:10+09:00
Javaでデータベースに接続する
はじめに この記事は独習JSP&サーブレット第3版に基づいて、データベースを勉強していた際に躓いた点をまとめた記事です。最新版のJDBCやデータベースを使用している人は、同じようなエラーで躓いていると思うので参考になれば嬉しいです。 環境 Tomcat 10.0 MySQL 8.0 MySQLドライバ(JDBC):mysql-connector-java-8.0.27 jspからデーターベースに接続する 以下のようにconnect.jspファイルからデータベースに接続するとする。 データソースの設定はcontext.xmlで行う。 connect.jsp <%@ page contentType="text/html;charset=UTF-8" import="java.sql.*, javax.naming.*, javax.sql.*" %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>データベースへの接続</title> </head> <body> <% Context context = new InitialContext(); DataSource ds = (DataSource)context.lookup("java:comp/env/jdbc/database_name"); Connection db = ds.getConnection(); db.close(); %> データベースへの接続に成功しました。 </body> </html> context.xml <?xml version="1.0" encoding="UTF-8"?> <Context reloadable="true"> <Resource name="jdbc/database_name" auth="Container" type="javax.sql.DataSource" driverClassName="com.mysql.cj.jdbc.Driver" url="jdbc:mysql://localhost/database_name?serverTimezone=JST" username="user_name" password="password" maxTotal="4" maxWaitMillis="5000" maxIdle="2" validationQuery="SELECT count(*) FROM book"> </Resource> </Context> Connector/JというMySQL用のJDBC Driverのバージョンが8.0.23以上を用いている人は次のようなエラーが発生していると思う。 Caused by: java.time.zone.ZoneRulesException: Unknown time-zone ID: JST 解決方法はcontext.xmlのタグ<Rerouce>にあるurlを以下のように変更すればいい。 url="jdbc:mysql://localhost/database_name" データベースにアクセスできるユーザーの設定方法 database_nameというデータベースにアクセスするためのアカウントを新規作成する. mysql> CREATE USER 'user_name'@'localhost' IDENTIFIED BY 'password'; ユーザー名とパスワード以外にもlocalhostの部分も入力しないといけないので注意。 このアカウントに権限を与えるためには、GRANT命令を使う。 mysql> GRANT ALL ON database_name.* TO 'user_name'@'localhost'; ここでもlocalhostを忘れずに入力しないと次のようなエラーが発生する。 ERROR 1410 (42000): You are not allowed to create a user with GRANT おわりに 勉強する際は、最新版をインストールすると躓く。
- 投稿日:2022-01-19T00:57:25+09:00
EclipseでPayaraTools導入エラー
環境 mac OS Monterey Eclipse IDE for Enterprise Java and Web Developers - macOS x86_64 (Eclipse IDE 2021-12 R Packages) 原因 Details Cannot complete the install because one or more required items could not be found. Software being installed: Payara Tools 1.4.0.202110041326 (org.eclipse.payara.tools.feature.group 1.4.0.202110041326) Missing requirement: Payara Tools1.4.0.202110041326(org.eclipse.payara.tools.feature.group 1.4.0.202110041326) requires 'org.eclipse.equinox.p2.iu; org.eclipse.sapphire.modeling.xml.feature.group [9.1.0,10.0.0)' but it could not be found Google翻訳から org.eclipse.payara.tools.feature.groupにはorg.eclipse.equinox.p2.iuが必要。 しかしorg.eclipse.sapphire.modeling.xml.feature.groupが見つからなかった為インストール失敗。 どういうことか payara toolsをインストールする為に必要なライブラリ?がなくその為にsapphireというプラグイン?をインストール(自動で)してくれるがそもそもsapphireインストール元が存在しなかった。 本来は https://download.eclipse.org/sapphire/9.1.1/repository/ にあるはずだが Not Found になっている。(2022/01/19現在) 解決策 探した結果sapphire/9.1.1/を配布しているサイトがあった為、ダウンロード。 メニューバーのHelp→Install New Softwareからインストールした後、再度Payara Toolsのインストール(Market Place) サイト http://mirrors.ibiblio.org eclipse→sapphire→9→sapphire-repository-9.zip ダウンロード(直接) http://mirrors.ibiblio.org/eclipse/sapphire/9/sapphire-repository-9.zip