- 1. 【Java初心者】Google Tinkを使った電子署名
- 2. メソッド
- 3. java basic
- 4. Entityがnullかどうかを知る
- 5. 手続き型から関数型への書き換え 言語別ガイド
- 6. GWT は日本語の文字も、サーバクライアント通信も簡単
- 7. 【Java初心者】Google Tinkを使ったハイブリッド暗号
- 8. [Java] 2つの合計 (アルゴリズム)
- 9. Entity、DTO、VO
- 10. 要素数の取得
- 11. Scanner クラス
- 12. Javaの組合せ最適化ソルバー「Timefold」をさわってみる
- 13. GWT 最初の画面は何か?
- 14. TimeSlotTrackerで作業時間を計測集計する
- 15. 【 Java 】Javaとは/基本文法
- 16. 【はじめてのJava Silver】試験概要や申込方法について解説
- 17. ProcessingでオリジナルClassのソートの方法
- 18. Javaのcloneメソッドとシャローコピー
- 19. JavaでAESWrapアルゴリズムを試してみる
- 20. 日時を扱うクラス
【Java初心者】Google Tinkを使った電子署名
# 電子署名とは
Wikipediaには
“`
電子署名とは、電磁的記録に付与する、電子的な徴証であり、
紙文書における印章やサインに相当する役割をはたすものである。
主に本人確認や、改竄検出符号と組み合わせて偽造・改竄の防止のために用いられる。
電子署名を実現する仕組みとしては、公開鍵暗号方式に基づくデジタル署名が有力である。
“`
とあります。自分の秘密鍵でファイルに署名し、それを予め配布しておいた公開鍵で検証することで、送信者が「正しい人」であることがわかります。
# Javaで書いてみました
Tinkは、バージョンアップのたびに、APIが変わり、以前書いたコードが非推奨となることが多いため、その都度ドキュメントを見ながら修正しています。
以下に示すコードはtink-1.12.0.jarを用いています。依存ライブラリーとして protobuf-java と gson が必要です。
“`java
package sample2024;import com.google.crypto.tink.CleartextKeysetHandle;
import co
メソッド
# メソッドとは
public static voidを使用するとメソッドが作成されます。
メソッドでは引数を渡すことも可能です。~~~:メソッドの作成方法
public satic void メソッド名(引数){
メソッドで行う処理内容
}
~~~~~~:メソッドの呼び出し方法
メソッド名(引数)
~~~# メソッドの利点
メソッドは複数の処理をまとめ、一つの処理として扱う事が出来ます。
これにより、複雑な処理を行う際もプログラムが見やすくなり便利です。
java basic
### ラベルを用いて多重ループを自由に移動 or 抜ける
“`
labalName: for(int i = 0; i < 10; i++) { for(int j = 0; j < 10; j++) { if (何らかの条件) { break labalName; // このbreak文で外側のループまで一気に抜ける } } } ``` この時continue文を用いてラベルを指定すると指定したラベルの初めにジャンプして次の繰り返しを行う。 ---
Entityがnullかどうかを知る
## 背景
javaの資材を修正した際に、作成されたentityListがnullかどうかで条件分岐した箇所があった。そこで自分は、CollectionとEntityをごっちゃにして考え、null判定をするためにメソッドを理解するのに時間を要した。そこで、メモとしてここに書き留めておく## EntityがNullかどうか判定する
“isNull”, “nonNull”,”==null”, “!=null”の4つ。
直観的にわかりやすいのは”isNull”, “nonNull”かと思う## Listの中身がnullかどうか
“isEmpty()”,”list.size()==0″
手続き型から関数型への書き換え 言語別ガイド
# はじめに
この記事では、手続き型プログラミングと関数型プログラミングの違いを明らかにし、複数の言語を通じて、同じ問題を解決するための両アプローチを示します。
# 手続き型と関数型の基本的な違い
手続き型プログラミングと関数型プログラミングは、コードの書き方とプログラムの設計において根本的に異なるアプローチを取ります。これら二つのスタイルの基本的な違いを理解することは、プログラミングの柔軟性を高め、より効果的なコードを書く上で重要です。
## 手続き型プログラミング
手続き型プログラミングは、命令の列としてプログラムを考えます。このアプローチでは、データ構造を操作するために一連の手続き(関数やサブルーチン)を作成し、プログラムの状態を変更するためにこれらの手続きを実行します。手続き型プログラミングの特徴は、プログラムがどのように実行されるか(アルゴリズムと手順)に焦点を当てている点にあります。C 言語や Java(オブジェクト指向の側面を除く)などが、このパラダイムの典型的な例です。
## 関数型プログラミング
関数型プログラミングは、計算を数学的関数の評価として扱い、
GWT は日本語の文字も、サーバクライアント通信も簡単
# GWTは、いちいち日本語を通信する際の文字処理もそのままでできますよ
![GIF 2024-02-18 4-50-09.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132663/b9c916eb-7884-e41e-5668-ca51193ab08b.gif)
【Java初心者】Google Tinkを使ったハイブリッド暗号
# ハイブリッド暗号とは
Wikipediaによると
“`
公開鍵暗号方式と共通鍵暗号方式を組み合わせた暗号方式である。
公開鍵暗号方式と共通鍵暗号方式の欠点を補い合い、
2つの暗号方式のそれぞれ利点を同時に利用することができる。
“`
とあります。具体的な方法については
“`
1. Aは共通鍵を生成する
2. Aは共通鍵を公開鍵暗号方式で暗号化してBに送信する
3. AとBは安全に共有された共通鍵を用いて共通鍵暗号方式で通信を暗号化する
“`
となっている。これならば、公開鍵暗号でもいいのではないかと思うが 上記wikipediaでは
“`
公開鍵暗号方式には、共通鍵暗号方式と比較して処理速度が非常に低速という欠点と、
事前の鍵共有が不要という利点がある。
そのため、公開鍵暗号方式のみで通信を暗号化するのは非効率的である
(中略)
ハイブリッド暗号方式には、公開鍵暗号方式と比較して処理速度が非常に高速という利点と、
事前の鍵共有が不要という利点がある。
つまり、ハイブリッド暗号方式は公開鍵暗号方式と共通鍵暗号方式の利点を
どちらも同時に利用できる、優れたそして大きな
[Java] 2つの合計 (アルゴリズム)
## 課題
—
### 問題:
> 与えられた整数の配列**`nums`**と整数**`target`**に対して、その和が**`target`**になるような2つの数のインデックスを返します。各入力には**正確に1つの解**が存在し、同じ要素を2回使うことはできません。答えは任意の順序で返して構いません。
>**例 1:**
“`
入力: nums = [2,7,11,15]、ターゲット = 9
出力: [0,1]
説明: nums[0] + nums[1] == 9 であるため、[0, 1] を返します。“`
**例 2:**
“`
入力:数値 = [3,2,4]、ターゲット = 6
出力: [1,2]“`
**例 3:**
“`
入力:数値 = [3,3]、ターゲット = 6
出力: [0,1]“`
### **制約:**
– `2 <= nums.length <= 104` - `109 <= nums[i] <= 109` - `109 <= target <= 109` **フォローアップ:** 時間の計算量よりも少
Entity、DTO、VO
Javaでオブジェクトを実装する方法としては、Entity、DTO、VOなど様々な方法がある。
# Entity
– 実際のデータベースと1:1にマッピングされるclass
– @Entity を付ける。
– オブジェクトの一貫性を高めるために、無分別なsetter の使用を推奨しない。
– 生成者を通じて値を入れて一貫性を維持するようにすることをお勧めする。 基本生成子のアクセス制御子をprotectedと宣言し、希望通り生成子を作成するようにすることで、オブジェクト自体の一貫性を高めることができる。“`java
@NoArgsConstructor(access = AccessLevel.PROTECTED)
“`– 別々に使用する必要がある場合は、setter 以外に使用した意図や意味が分かる別途のメソッドを作成することを推奨する。
– 小規模な個人プロジェクト程度であれば、エンティティを直接使用することがコードの簡潔性とメンテナンスに容易である。# DTO
– 階層間データ交換のためのオブジェクト
– 別途のロジックなしに主に
要素数の取得
# .length
配列名や文字列変数名の後ろに.lengthと続けることで該当の配列・文字列の要素数を取得する事が出来ます。この時、半角・全角どちらも同じ1文字として扱われます。
.lengthの表記方法はプログラム内のマジックナンバーを減らす事が出来ます。
Scanner クラス
# Scannerクラス
* キーボードやファイルから入力された情報を取り込む。
* Javaで入力処理を行うクラス。入力処理は、キーボードから入力を行う場合や、ファイルから入力を行う場合などに使う。
* 入力処理は、ユーザーによる任意の情報をjavaのプログラムで扱う場合に必要。## Scannerクラスのメソッド一覧
| メソッド | 用途 |
|:-:|:-:|
| next | 区切り文字までの入力を取得する(デフォルトの区切り文字は空白) |
| nextLine | 改行までの入力を取得する |
| nextInt | 整数の入力を取得する |
| nextDouble | 小数点を含む数値の入力を取得する |
| nextBoolean | 真偽値の入力を取得する |
| useDelimiter | 区切り文字を指定する |
| hasNext | 入力の読み込みが続くか判定する |### next,nextLine,nextInt,nextDoubleの4つを実装してみる
## next()
“`java
ackage text_
Javaの組合せ最適化ソルバー「Timefold」をさわってみる
本記事では、OSSの組合せ最適化ソルバーであるTimefoldを紹介していきます。
## Timefoldとは
Javaで実装されたOSSの組合せ最適化ソルバー(以下、ソルバー)です。
ソルバーとは、組合せ最適化問題を解く目的で利用できるツールのことです。組合せ最適化問題とは、様々な制約の下で多くの選択肢の中から、定義されたスコアによる評価が最も高くなる組合せを求める問題のことです。
巡回セールスマン問題などが広く知られております。Javaで作られたソルバーとしては、Optaplannerなどが有名です。
今回紹介するTimefoldはOptaplannerをforkしたもので、もともとOptaplannerのコミッターであったエンジニアの方々が開発に携わっています。## サンプルアプリ
Timefoldを使って、簡単な組合せ最適化問題を解いていきます。
サンプルアプリのコード全量はGithubにアップしています。https://github.com/Hami1ton/study_or/tree/main/solver/timefold/shift-schedul
GWT 最初の画面は何か?
# GWTの最初の画面はEntryPoint インターフェースを継承したクラス
通常、サンプルの画面から改造していけば、できます。図は新規プロジェクトから、ローカルで立上げまで再現しています。
![GIF 2024-02-17 5-11-18.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132663/e55f2b55-0600-0785-52ae-0e43f6d113b8.gif)
TimeSlotTrackerで作業時間を計測集計する
# 目的
大量の小さいタスクを抱えている。タスクごとの作業時間を把握管理したい。
# 制約
お客様環境で利用したい。
個人契約ウェブアプリ利用や個人購入アプリの持込みは不可。
但し、githubなど禁止されていないサイトからライセンス上問題のないアプリであれば利用可能。
# (参考)いままで
フリーランス時代は、PerlでWebアプリを自作して、まぁまぁ機能していた。(今でも個人タスクでは利用してる)
しかし上記の制約で、お客様環境では利用不可。
現環境では、Excelベースの作業時間表をつくって枠ごとに集計したりしてた。
ただ、タスク増えすぎて限界に達していたのと、単軸ではなく「いろんな切り口」での数字報告を求められるようになった。
さすがに限界に達し、なにか探し始めた、というのが今回の経緯。# 候補さがし
[SourceForge](https://sourceforge.net/)の[Time Tracking Software](https://sourceforge.net/directory/time-tracking/)から、[Window
【 Java 】Javaとは/基本文法
# Javaとは
Javaは、オブジェクト指向プログラミング言語のひとつ。1995年にSun Microsystemsのエンジニアチームによって開発・初公開された。※後にSun Microsystemsは、Oracle Corporationによって買収された。
## 特徴
### オブジェクト指向
クラスとオブジェクトの概念を重視しているため、プログラムのモジュール化、再利用性、保守性が高い。### プラットフォーム
JVM上で実行されるため、ソースコードを再コンパイルせずにさまざまなプラットフォームで動作する。そのため、ポータビリティが高い。### 豊富な標準ライブラリ
豊富な標ライブラリが付属しており、データ構造、入出力、ネットワーキング、GUIなど多くの機能をサポートしている。### セキュリティ
セキュリティを重視しているため、安全なコンピュータプログラムの開発をサポート。Java仮想マシンは、サンドボックス環境を提供し、不正な癖すやメモリの競合を防止。### マルチスレッドサポート
複数のスレッドを同時に実行することができるため、並行処理を行うアプリ
【はじめてのJava Silver】試験概要や申込方法について解説
はじめに
Softbankのテックブログで記事を書いたので紹介します!![JavaSilverサムネイル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2980561/33684a88-ca9e-7e64-55f5-3a93abb199fd.png)
本記事では私が2023年5月に取得したJava Silver(Oracle Certified Java Programmer, Silver SE 11 )の試験概要と申込方法について紹介しました!
特にJava Silverは申込方法が複雑で、資格の認定機関であるOracle・資格情報を管理するCertview・試験を主催しているピアソンVUEといった3つのサイトを経由して申し込むというわかりにくい構図になっているので、丁寧に解説しました!!### この記事について
– この記事では、Java Silverの試験概要と申込方法を中心に解説しています!
– 申込方法が複雑で困っている方には特におすすめの記事です!ぜひ読んでみてください!
ProcessingでオリジナルClassのソートの方法
# ArrayListを使う
まずは基本になるコードです。ソートの例としては人事データや在庫とかが多いですが、もうちょっと楽しそうなグラフィカルな例にしたいと思います。画面に多数の円を表示するサンプルにします。このような例では配列を使うことが多いですが、配列は事前に使う個数を指定して宣言する必要があります。実現したい内容によっては不便です。ArrayListを使うと可変長にできるので、ArrayListを使います。
次のサンプルではBallというクラスを作成し、クラスの中で位置、ballのサイズを持っています。
setupの中でランダムで座標と円のサイズを決めballList.add()でArrayListに追加していきます。追加した後はballList.size()で個数が確認できるのでforループで簡単に処理することができます。
“`arrayListSample.java
import java.util.Arrays;public class Ball {
float x;
float y;
float r;public Ball(float xPo
Javaのcloneメソッドとシャローコピー
## はじめに
新卒1年目の時、Java Silverの問題集に掲載されていたある問題にかなり悩まされた。その際Javaの仕様とコンピュータのメモリについて勉強できたので、自分なりに記しておく。# 目次
問題設定
前提知識
コピーの方法
解答
感想# 問題設定
**問題:A~Dのコードを実行したとき、`True`になるのはどれか**
“`定義.java
char[][] array1 = {{‘a’, ‘b’}, {‘c’, ‘d’}};
char[][] array2 = array1.clone();
char[] array3 = array1[1].clone();
“`
– **A**:`array1[1] == array3`
– **B**:`array1[1] == array3[1]`
– **C**:`array1[1] == array2[1]`
– **D**:`array1.equals(array2)``clone`メソッドの詳細がよくわからなくても、Bは次元が異なるので不正解(`False`になる)であることがわかる。残りの3つについて以
JavaでAESWrapアルゴリズムを試してみる
今更ながらJavaでAESWrapアルゴリズムを試してみた
“` java
// Java Version
System.out.println(“Java Version: ” + System.getProperty(“java.version”));// キーを初期化(例として16バイトの0で初期化)
byte[] keyBytes = new byte[16];
SecretKey key = new SecretKeySpec(keyBytes, “AES”);// Cipherインスタンスを初期化
Cipher cipher = Cipher.getInstance(“AESWrap”);// アルゴリズムの確認
System.out.println(“Algorithm: ” + cipher.getAlgorithm());// 両方のCipherインスタンスで同じキーを使用して暗号化し、結果を比較
cipher.init(Cipher.WRAP_MODE, key);// テスト用のデー
日時を扱うクラス
# Dateクラス
* 現在日時の取得。
* クラスのなのでDateクラスのオブジェクトを生成する`import java.util.Date;`が必要。
(コレクション作成時も`java.util.ArrayList;`した)
“`java
package text.section_21;import java.util.Date;
public class DateTime_Test1 {
public static void main(String[] args) {
// 現在日時の取得
Date date = new Date();// 出力
System.out.println(date);}
}
“`
実行結果
“`Java
Fri Feb 16 09:32:23 JST 2024
“`
曜日、月、日、時間:分:秒 日本時間 年
上記の順で出力される。# Calenderクラス
* 任意の日時を設定、取得できる。
* クラスのなのでDateクラスのオブジェクトを生成する
* Calendarクラ