非業務日誌

ファクシミリ駆動開発の現場からお届けします。

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は呪文が長いのがアレだけど、オブジェクト指向のために作られた言語って感じです。「私をオブジェクト指向で書いて」って。
  • カプセル化が前提です。自クラスのフィールドにもアクセッサ経由で値を取得するようにすると、継承時に振る舞いを変えやすくなります。
  • ちなみに商品価格と税は関心が分離されると思われますので、実業務では同一クラスにしないです。軽減税率の実装もしにくくなりますし。

python

  • Pythonに関しては、「オブジェクト指向でも書けますよ、自分」感が出てる気がします(小並感)。
  • でも頑張ってPython覚えたいです。

Git push origin HEAD

Git における リモートリポジトリへのプッシュは Git push origin HEAD でOK

Git push origin <branch_name>

Gitリモートリポジトリへのコミット後のプッシュには Git push origin <branch_name> がよく検索でヒットすると思いますが、

Git push origin HEAD でOKです。

覚えておきたかったので書き付けます。