- 1. Java 入出力と例外
- 2. Javaでハッシュ値を生成する
- 3. JavaBeans
- 4. Java Enum(列挙型)
- 5. JavaのWeb基礎、Servlet、JSP
- 6. JavaのServletのセッション(session)管理
- 7. HttpServletRequestとHttpServletResponse
- 8. 並行・並列プログラミングと同期・排他制御とイミュータブル性の話〜その2「スレッドと同期・排他制御」
- 9. Kotlin 1.8.0の変更点
- 10. Javaのクラスのアクセス制御と複数クラスの宣言
- 11. Collection.sortを勉強するその2
- 12. 並行・並列プログラミングと同期・排他制御とイミュータブル性の話〜その1「背景: クロック周波数の停滞とコア数の増加」
- 13. Collection.sortを勉強する
- 14. Arrays.asListを勉強する
- 15. java 二次元配列と拡張for文について
- 16. Javaでタグ付きPDFを作成する方法
- 17. 自動型変換 キャスト
- 18. Spring BootでThymeleafとJSPを併用する
- 19. Leetcode 1833. Maximum Ice Cream Bars
- 20. Leetcode 452. Minimum Number of Arrows to Burst Balloons
Java 入出力と例外
・入出力とは
多くのプログラムは、そのプログラム単体で完結することが少なく、多くの場合は、データをプログラムの外から受け取り、そのデータを処理した結果をプログラムの外に出力する。さらに外部とのやりとりでは、プログラムが想定しないデータが入力されたり、そもそもデータが見つからないことがあります。これらの場合は例外として対応します。
・ファイルアクセスと例外
・ファイル書き込みの方法
ファイル書き込みのためにまず、ファイルを読み込む必要があります。そのために使われるメソッドは`Path.of`メソッドである。使い方としては引数に作りたいファイルのファイル名を指定します。ここに指定したファイル名のファイルがJavaのフォルダに作成されます。
次にファイルを書き込みしていきます。ファイル書き込みは`Files.writeString()`を使います。このメソッドは、ファイルに文字列を保存するメソッドです。引数の1番目にどのファイルに保存するか(Path.ofで設定する)、引数の2番目に書き込む文
Javaでハッシュ値を生成する
JavaでSHA1, SHA256のハッシュ値を作成するには、[MessageDigestクラス](https://docs.oracle.com/javase/jp/17/docs/api/java.base/java/security/MessageDigest.html)を使用します。
## byte配列を16進数文字列で出力する
Java17から標準クラスライブラリである[HexFormatクラス](https://docs.oracle.com/javase/jp/17/docs/api/java.base/java/util/HexFormat.html)でbyte配列を16進数文字列で変換することが出来るようになりました。
## サンプルプログラム
SHA1, SHA256アルゴリズムでハッシュ値を生成し、出力するプログラムです。
“`java
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.HexFormat
JavaBeans
## JavaBeans
Javaにおいてデータをひとつにまとめて格納するために利用する仕組みを指す。JavaBeansの設計ルールに従って作られたクラスを**Beanと呼び**ユーザーが入力した内容をサーバーへ送信したり、データベースに保存したりする際、それらのデータをひとつの「Bean」として定義することで扱いやすくなる。
### JavaBeansの設計ルール
**①クラスをpublicで宣言する**
**②引数なしのpublicコンストラクタを作成する**
Javaのオブジェクトにはコンストラクタが必要なので引数のない空のコンストラクタを作成する
引数なしにインスタンスを生成できるということは、後述の「シリアライズ」を行う上で重要な意味合いをもつ。
フレームワークでは、自動でJavaBeansを作成するような機能をもっているのものが多く、フレームワークはJavaBeansのルールに基づき、「引数なしのコンストラクタ」を利用してJavaBeansを生成する**③java.io.Serializableを実装する**
Serializableを実装することで、「シリアライ
Java Enum(列挙型)
実務で作成したenumを使ったメソッドの作成の備忘録。
そのまま載せると問題になるので、もちろん改変しています。
変数に決められた値を入れるときは、enum型を使うのは基本のようですね。“`java
private enum MDID {
IPHONE(“001”),
ANDROID(“002”),
IPAD(“003”),
TABLET(“004”);private String modelId = “”;
private MOID(String modelId) {
this.modelId = modelId;
}public String getId() {
return this.modelId;
}
}private enum SVID {
PRICE(“0010”),
DATA(“0020”),
NEWS (“0030”);private String serviceId = “”;
private SVI
JavaのWeb基礎、Servlet、JSP
## Web基礎
普段インターネットでWebページを見る時には二つのコンピューターが関連して動いている
①**Webブラウザ**:Webページを表示するソフトウェア
②**Webサーバー**:Webページの情報を提供出来るソフトウェア(コンピュータ)WebブラウザとWebサーバーの間では二つのやり取りが行われている。
①**リクエスト**:Webページの情報をサーバーに要求すること
②**レスポンス**:リクエストに対してサーバーが情報を返すこと・Web環境で動くプログラムをWebアプリケーションといい。**サーバーサイド(バックエンド)** と**クライアントサイド(フロントエンド)** に分かれる
サーバーサイドではJavaやPHP、Pythonなどが使用されクライアントサイドではJavaScriptが使用される事が多い
![スクリーンショット 2023-01-05 22.08.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2785154/a4fbe6cd-32a4-3cdf-f6ba
JavaのServletのセッション(session)管理
## セッション(session)とは
sessionとは、複数のユーザがアクセスするWebアプリケーションで、各ユーザの状態の保存・ユーザの区別を行う機能で、ユーザの識別はセッションIDを使って行う。
複数のリクエスト・レスポンスにまたがって**ユーザーの識別**と**データの管理**をする仕組み
簡単に言うと、ログインからログアウトまでの情報を保持する機能。セッションはクライアント毎に作成され、セッションが開始されるとセッションを識別するためのセッションIDをクライアントの保存し、また保存したい値をセッション変数としてサーバ側に保存する。クライアントに保存されるセッションIDは**クッキー**(Webページの利用履歴や入力情報などをテキストデータとしてWebブラウザに保存する仕組み)を利用して保存される。
### ユーザーの識別とデータの管理
サーバー側(Servlet)でユーザーの識別とデータの管理をするには”doGet”メソッドや”doPost”メソッドの引数で渡されてくる「HttpServletRequest」インターフェースのオブジェクトである**セッションオブ
HttpServletRequestとHttpServletResponse
## HttpServletRequest、リクエスト情報の取得
サーブレットに対して送られてきたリクエストに関して、フォームなどで設定されたパラメータの取得やクッキーなどの情報などリクエストに含まれている情報を取得するには、doGetメソッドやdoPostメソッドの引数に指定されているHttpServletRequestインターフェースのオブジェクトを使用する。「HttpServletRequest」インターフェースのオブジェクトからは色々な情報が取り出せる。
一番利用頻度が高いのが**リクエストパラメータ**(クライアント側のフォームから送られてきたデータ)取得する事。
リクエストパラメータは **「名前(キー名)」と「値」のペア** で送られ,
GETメソッドとPOSTメソッドの両方で送られてくる可能性がある下記はサーブレットに対して「GET」メソッドでリクエストがあった場合に呼び出される「doGet」メソッド
“`
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;publi
並行・並列プログラミングと同期・排他制御とイミュータブル性の話〜その2「スレッドと同期・排他制御」
大学の授業で講義資料を作ったので,Qiitaにも展開しておきます.
この記事シリーズでは,並行・並列プログラミングについて,要(かなめ)となる同期・排他制御の役割をCとJavaを例に簡単なプログラム例を示します.次に同期・排他制御の問題点をCのプログラム例とともに示します.そしてElixir(エリクサー)によって実現されている,全てをイミュータブルにすることによる利点について示します.
シリーズ
1. [並行・並列プログラミングと同期・排他制御とイミュータブル性の話〜その1「背景: クロック周波数の停滞とコア数の増加」](https://qiita.com/zacky1972/items/bfb3bd920f7bcea02c23)
1. **並行・並列プログラミングと同期・排他制御とイミュータブル性の話〜その2「スレッドと同期・排他制御」**(本記事)# スレッド
従来の普通のプログラミング(逐次プログラミングと呼びます)では,プログラム(正確には実行したい「連続した命令列」)を同時に1つしか実行できませんが,並行・並列プログラミングでは,「連続した命令列」を同時に複数実行
Kotlin 1.8.0の変更点
※ソース記事は[こちら](https://kotlinlang.org/docs/whatsnew18.html#updated-jvm-compilation-target)
※Kotlin/JS、Kotlin/Nativeについては割愛します。
[リリース日:2022/12/28](https://kotlinlang.org/docs/releases.html#release-details)
Kotlin 1.8.0リリースが世に出され、ここにいくつかの最大のハイライトがある。
– JVMのための新しいの実験的機能:ディレクトリ内容の再帰的なコピーと削除
– kotlin-reflect性能の改善
– より良いデバッグ経験のための新しい-Xdebugコンパイラオプション
– `kotlin-stdlib-jdk7`と`kotlin-stdlib-jdk8`の`kotlin-stdlib`へのマージ
– Objective-C/Swiftとの相互運用性の向上
– Gradle 7.3との互換性# IDEのサポート
1.8.0をサポートするKotlinプラグインはこちらで利用
Javaのクラスのアクセス制御と複数クラスの宣言
Javaを基礎から復習していて、クラスについて理解が曖昧だった部分があったのでまとめておきます!
注意して書いているつもりですが、誤りがあればご指摘いただければと思います?♂️## クラスに対するアクセス制御レベル
クラスに対するアクセス制御のレベルとしては2つのみです。(⚠️メンバに対しては4つある)
以下にまとめます。
| 名前 | 指定方法 | アクセス許可の範囲 |
| :—: | :—: | :—: |
| package private | 何も書かない | 自分と同じパッケージに属するクラス |
| public | public | どこからでも |なので、クラスを宣言するときは、publicをつけるか何もつけないかの2択になります。
クラスだけでなく、列挙型である`enum`を宣言するときも同じです。
`private class Hoge` とかやってjavacすると、
> 修飾子privateをここで使用することはできませんって怒られます。
## 1つのファイルに複数のクラスを宣言する
1つのファイルに複数のクラスを
Collection.sortを勉強するその2
original classを定義してsortする。
デフォルトはsorteditemに定義したcompareToでソートされる。
comparatorを切り替えることによりsort順をコントロールできる“`java
public class Outer {
public static void main(String[] args) {
Outer o = new Outer();
SortedItem s = o.new SortedItem(“sato”,1);
Listsl = new ArrayList();
sl.add(o.new SortedItem(“aoyama”,3));
sl.add(o.new SortedItem(“yamada”,2));
sl.add(o.new SortedItem(“sato”,1));
Collections.sort(sl); //name,ascending
並行・並列プログラミングと同期・排他制御とイミュータブル性の話〜その1「背景: クロック周波数の停滞とコア数の増加」
大学の授業で講義資料を作ったので,Qiitaにも展開しておきます.
# 背景: クロック周波数の停滞とコア数の増加
コンピュータはクロック周波数に同期して計算をします.おおむね1秒間にクロック周波数の数で示されるだけの数の機械語命令を実行できると考えると良いです.たとえばクロック周波数が1GHzであれば,1GHz=1,000MHz=1,000,000(百万)kHz=1,000,000,000(10億)Hzですので,1秒間に1,000,000,000(10億)個の機械語命令を実行できるというような感じです.もちろんこれは概算です.
いわゆるヘネパタ本(J. L. Hennessy & D. A. Patterson: Computer Architecture: A Quantitative Approach, 6th edition. Morgan Kaufmann, 2017; 邦訳 中條・天野・鈴木訳: コンピュータアーキテクチャ[第6版]定量的アプローチ, 星雲社, 2019)には,このクロック周波数の伸びについて描かれています.
ヘネパタ本によると,1987〜2003年
Collection.sortを勉強する
デフォルトはacending
acending以外にしたい場合、comparatorを作って渡す
sortは、comparatorのcompare結果が0以下となるように並び替える
昇順にしたければp1-p2、降順にしたければp2-p1
“`java
public static void main(String[] args) {
Listli = new ArrayList();
li.add(1);
li.add(100);
li.add(3);
Comparator c = new Outer().new DecendingComparator();
Collections.sort(li);
for(Integer i:li) {
System.out.println(i);
}
System.out.println(“———————-“);
Arrays.asListを勉強する
Arrays.asListは、配列をArrayListに変換
プリミティブ型(下記int)は配列として登録されるため要注意。
“`java
public static void main(String[] args) {
Listsl = Arrays.asList(“a”,”b”);
for(String s:sl) {
System.out.println(s);
}
String[] strarray = {“c”,”d”};
System.out.println(“————————–“);
sl = Arrays.asList(strarray);
for(String s:sl) {
System.out.println(s);
}
System.out.println(“————————–“
java 二次元配列と拡張for文について
## javaの二次元配列について
javaにおいて一次元配列は
` String[] array = new String[5]; `
このように宣言すると
![スクリーンショット 2023-01-06 16.47.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3087483/459e959b-7acb-1bc2-ea75-7d94ee94bddc.png)5つの配列がヒープに確保されてその配列ひとまとまりを参照する参照値がString[]型のarrayに確保されます。
一次元配列と二次元配列の違いは、一次元配列はx軸にしか配列が並ばないのに対して、二次元配列はy軸の方向にも要素が並ぶという違いです。![スクリーンショット 2023-01-06 16.58.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3087483/561e350f-02cc-7ae7-4eab-f4727bdb6633.png)
Javaでタグ付きPDFを作成する方法
タグ付きPDFファイルは、構造要素を持つPDFファイルです。これらは、補助技術に依存するユーザがコンテンツにアクセスできるようにするために使用されます。[Spire.PDF for Java](https://jp.e-iceblue.com/introduce/spire-pdf-for-java.html)は、Javaアプリケーションで**タグ付きPDFを作成する**ことをサポートしています。この記事では、**テキスト、画像、図形、表などのPDF要素にタグを追加する方法**について説明します。
– **[テキストにタグを追加する](#テキストにタグを追加する)**
– **[画像にタグを追加する](#画像にタグを追加する)**
– **[表にタグを追加する](#表にタグを追加する)**
## 【依存関係の追加】
この方法は、Spire.PDF for Javaが必要ですので、先にjarファイルをインポートしてください。
### 1. Maven
Maven を使用している場合、プロジェクトの pom.xml ファイルに以下のコードを追加することで、簡単にアプリケーションに JAR
自動型変換 キャスト
***型変換***
「+」などの操作は同じデータ型同士じゃないとできません。
型の違うものを演算するときは、型を変換し同じ型にする必要があります。
javaでは自動変換あります。“`java:Main.java
System.out.println(“佐藤さんは”+20+”歳です”);
“``String型`と`int型`を足すと、`int型`が自動で`String型`に変換されて、文字列として結合されます。
“`
“佐藤さん” + “20” + “歳です”
“`
こんな感じです。
なので、出力は
“`text:java.コンソール
佐藤さんは20歳です
“`
***計算時の自動変換***`int型`と`double型`の計算結果は`double型`になります。
計算の過程でint型がdouble型に変換されます。ここで、今まで触れてなかったので補足です。
`double型`とは、小数を表すデータ型です。
“`
5 int型
3.14 double型
“`
他にも多くのデータ型があります。それを全て説明するのは、今の私にはまだ無理なので、
Spring BootでThymeleafとJSPを併用する
本来、Spring BootによるWebアプリケーションで使用するViewはThymeleafを使用することが望ましいのですが、古いプロジェクトでJSPを使用しているWebアプリケーションをThymeleafに移行する場合等、一度に全ての画面をThymeleafに移行出来ない場合にJSPと併用する方法を紹介します。
## 開発環境
* Spring Tools Suite (STS) 4
* JDK 8
* Spring Boot 2.7.7## 前提
Spring Bootのプロジェクトで既にJSPを使用したWebアプリケーションに対してThymeleafと共存させるための手順をです。
従いまして、Spring BootプロジェクトでJSPを使用する際の手順は含まれておりません。:::note warn
JSPを使用していない既存プロジェクトであれば敢えてJSPと併用するメリットはありません。
:::## Maven依存関係の設定
pom.xmlにthymeleafの依存関係を追加します。
* spring-boot-starter-thymeleaf
* spring
Leetcode 1833. Maximum Ice Cream Bars
https://leetcode.com/problems/maximum-ice-cream-bars/
## 難易度
### Medium## アプローチ
### Brute-force“`java
class Solution {
public int maxIceCream(int[] costs, int coins) {
Arrays.sort(costs);
int result = 0;
for (int c : costs) {
coins -= c;
if (coins < 0) { break; } result++; } return result; } /* WA public int maxIceCream_WA(int[] costs, int coins) { Arrays.sort(c
Leetcode 452. Minimum Number of Arrows to Burst Balloons
https://leetcode.com/problems/minimum-number-of-arrows-to-burst-balloons/description/
## 難易度
### Medium## アプローチ
### Brute-force“`java
class Solution {
public int findMinArrowShots(int[][] points) {
Arrays.sort(points, (a, b) -> Integer.compare(a[1],b[1]));int result = 1;
int prev = 0;for(int curr = 1 ; curr < points.length; curr++){ if(points[curr][0] > points[prev][1]){
result++;
prev = curr;
}