Python の ジェネレータをJavaで表現
Python の ジェネレータをJavaで理解
Python の ジェネレータが優れもののようなので、 自分の理解のためにJavaで実装するならばどうなるか考えてみました。
python の ジェネレータ
- ジェネレータ関数の戻り値は、ジェネレータイテレータと呼ばれるイテレータ
- 特殊メソッド __next__() が呼ばれるたびに、関数内の処理が次の yield 式まで進む
- 呼び出し元にyield 式に渡した値を返すと、その状態を保持したまま、その行で処理中断
- 再度特殊メソッド__next()__ が呼ばれると、次の行から処理が再開
- 関数を抜けるとStopIterationが送出
def gens(n): while n: print(f'yield: {n}') yield n n -= 1
関数実行
gen = gen_func(2) next(gen) # yield: 2 next(gen) # yield: 1 # next(gen) ここで例外
Javaによる実装考察
値を実行の都度生成するイメージで。
class Gens implements Iterable<Integer>, Iterator<Integer> { private Integer num; Gens(Integer num) { this.num = num; } @Override public Iterator<Integer> iterator() { return this; } @Override public boolean hasNext() { return 0 < num; } @Override public Integer next() { Integer ret = num; num = num - 1; return ret; } }
多分、こんな感じになると思われます。
うん。Python の効率、身につけたい。
TLS通信まとめ
TLS通信
応用情報技術者試験勉強で学んだTLS通信手順についてまとめます。
- クライアントからTLSによる接続要求に対し、サーバはサーバ証明書をクライアントに送付する
- クライアントは、サーバ証明書に含まれている認証局のディジタル署名を認証局の公開鍵で復号してメッセージダイジェストを取り出し、また自らサーバ証明書のメッセージダイジェストを生成し、サーバ証明書の正当性を検証する
- クライアントは、共通鍵生成用の乱数を作成し、サーバ証明書に添付されたサーバの公開鍵で暗号化しサーバに送付する
- 暗号化された乱数を受け取ったサーバは自らの秘密鍵を用いて復号
- クライアントとサーバは同一の乱数により共通鍵をそれぞれ作成し、以降はこの共通鍵による暗号通信を実施する
感想
他マシンのもので自マシンが使えるのは公開鍵だけ。だから公開。
Pythonにおけるクラス
Python のクラス(javaとの比較)
Pythonのクラス
Python でクラスの書き方を調べたのでjavaとの比較で整理します。
# 商品 class Goods: def __init__(self, price): if price < 0: raise ValueError('価格は0円を超えること') self._price = price # 価格 self._tax = 0 # 消費税率 @property def tax(self) -> float: return self._tax @tax.setter def tax(self, tax): if tax < 0.0 or 1.0 < tax: raise ValueError('税率は0.0 〜 1.0 で入力') self._tax = tax @property def price(self): return int(self._price * (1.0 + self._tax)) goods = Goods(2000) goods.tax = 0.18 print(goods.price)
結果は 2360
java で書くとしたら
僕が対外的に、使えると言える言語のjavaで書くとしたら
import java.math.BigDecimal; /** * 商品 */ public class Goods { // 価格 private int price; // 消費税率 private BigDecimal tax; public Goods(int price) { if (price < 0) { throw new IllegalArgumentException("価格は0円を超えること"); } this.price = price; this.tax = BigDeceimal.ZERO; } public BigDecimal getTax() { return tax; } public void setTax(BigDecimal tax) { if (tax < BigDecimal.ZERO && BigDecimal.ONE < tax ) { throw new IllegalArgumentException("税は0 〜 1 で入力"); } this.tax = tax; } public int price() { return BigDecimal.valueOf(getPrice()).multiply(tax).intValue(); } }
雑感
java
- javaは呪文が長いのがアレだけど、オブジェクト指向のために作られた言語って感じです。「私をオブジェクト指向で書いて」って。
- カプセル化が前提です。自クラスのフィールドにもアクセッサ経由で値を取得するようにすると、継承時に振る舞いを変えやすくなります。
- ちなみに商品価格と税は関心が分離されると思われますので、実業務では同一クラスにしないです。軽減税率の実装もしにくくなりますし。