bouzuya.hatenablog.com

ぼうずやのにっき

b の状況メモ

b の状況メモ。

b を stamp-rally と同様の構成に変更したかった。

stamp-rally は https://github.com/bouzuya/rust-sandbox/tree/ff014d2a2f46f87a84379d369ace2f68887c3d44/stamp-rally

同様の構成というのは次のようなもの。

  • 複数 crates に分割する
  • 大きく分けて entity / use_case / adapter / application の 4 つにする
    • README では ports になっているが ports は use_case に含まれている
    • entity はシステム化対象範囲における中心的な要素を表現したもの
    • use_case は entity を使用してシステムとユーザーの相互作用を表現したもの
      • adapter のための port を提供する
    • adapter は入出力などシステム外部のものに適合させるためのもの
    • application は entity / use_case / adapter を統合するもの

同様の構成にしようとして起きたことは次のようなもの。

  • 入出力を切り離そうとした
  • Repository の戻り値として Vec を返していた
    • 大量のファイルを一度に読みこむとメモリ使用量の問題が起きると気づいた
  • Vec ではなく Iterator を返すことにした
    • これにより一度に読み込む量を減らして順に読み込むようにする
    • Iterator を書いたことがなかったので書いてみた
  • Repository を Iterator に変更する際に Query に対応しようとした
  • Query を b と bbn で共通化しようとした
  • 実装してみてから b と bbn では同一にするのは大変だと気づいた
    • 0.10.18 (2021-10-08)
    • b は日時 (UTC) 単位、 bbn は日付 (JST) 単位で保存している
    • 例: b では date:2021-02-03flow/2021/02/03/ だけでなく flow/2021/02/02/ 検索する必要がある
      • 単純な YYYY, MM, DD のパスとの一致だけでは不十分になる
      • パスを日付として解釈してそれがマッチするかで確認することにした
        • 意外と難しい
        • flow/2021/ はどの日付になる?
          • 現状は 2021-01-01T00:00:00/2021-12-31T23:59:59 (指定のタイムゾーンの) と解釈するようにしている
    • 例: date:--02-03 のようなクエリへの対応が面倒

現状はまだ Query を直している。


子どもが熱で保育所から途中で帰ってきた。一日中元気に家の中を走り回っていた。それを見ていたぼくのほうが微熱になっている。

下の子は「あー」と「てぇー」を話す。


今日のコミット。

2021-W40 ふりかえり

2021-W40 をふりかえる。

2021-W40 の目標 とその記事

目標。

  • 宅建の勉強を進める

記事。

つくったもの

よんだもの

(なし)

みたもの

その他

勉強会。

(なし)

おでかけ。

(なし)

ゲーム。

  • リングフィットアドベンチャー ワールド 58
  • 進め! キノピオ隊長 エピソード 3 をクリア
  • Mindustry (進まず)

買い物。

体調。

育児。

  • 上の子はねこあつめで遊んでいる
  • 下の子は何をあげてもぱくぱく食べている
  • 下の子はかまってもらえないとすぐに泣く

2021-W40 はどうだったか。

もう W40 か……。

謎の頭痛に悩まされていた。慢性的に疲れている。リングフィットアドベンチャーや体操は続けている。体がかたまっているように感じる。仕事時間中にストレッチを入れると良さそうだ。

仕事。今週の土日は解放されている。宅建は諦めている。来週まで多少はやって受けるだけ受けるつもりで居る。いろいろなものが壊れているのでなんとかしたい。

rust365 (2021-05-14) は bouzuya/rust-sandbox は b をまだ直している。進んでいない。ので状況を整理する。例の Event Sourcing の件から脱線している。

ABC222 に参加した。

2021-09 のふりかえりを書きそびれているので書く。

2021-W41 の目標

  • 宅建を受験する
  • ストレッチする
  • b の状況を整理する
  • 2021-09 ふりかえりを書く

子どもの運動会

子どもの運動会。疲れている。


『リング』を観た。


ABC222 に参加した。つまらない WA を 2 回。


今日のコミット。

golang で Shift_JIS への変換

枕を買った。試そうとしたのだけど上の子に取られてまともに試せていない。


golangUTF-8 から Shift_JIS への変換。

package main

import (
    "fmt"

    "golang.org/x/text/encoding/japanese"
    "golang.org/x/text/transform"
)

func main() {
    s := "日本語" // UTF-8
    {
        t, n, err := transform.String(japanese.ShiftJIS.NewEncoder(), s)
        fmt.Printf("%#v %v %#v\n", t, n, err) // "\x93\xfa\x96{\x8c\xea" 9 <nil>
    }
    {
        t, err := japanese.ShiftJIS.NewEncoder().String(s)
        fmt.Printf("%#v %#v\n", t, err) // "\x93\xfa\x96{\x8c\xea" <nil>
    }
}

今日のコミット。

UNIQUE 制約は NULL の列を複数含んでも良い

MySQLPostgreSQL の UNIQUE 制約は NULL の列を複数含んでも良い。

MySQL 8.0 https://dev.mysql.com/doc/refman/8.0/ja/create-table.html

すべてのエンジンについて、UNIQUE インデックスは、NULL を含むことができるカラムでの複数の NULL 値を許可します。 UNIQUE インデックスのカラムに接頭辞値を指定する場合、カラム値は接頭辞の長さ内で一意である必要があります。

PostgreSQL 13 https://www.postgresql.jp/document/13/html/sql-createtable.html

一意性制約では、NULL値同士は等しいとはみなされなせん。

なので例えば NULL を許容する expired_at TIMESTAMP という有効期限を複合キーに持つ UNIQUE 制約は意図通りに動作しないかもしれない。

CREATE TABLE prices (
  id           INTEGER   NOT NULL PRIMARY KEY,
  commodity_id INTEGER   NOT NULL,
  expired_at   TIMESTAMP, -- 最新の商品の価格は期限が NULL になっている想定だが……
  price        INTEGER   NOT NULL,
  FOREIGN KEY (commodity_id) REFERENCES commodities (id),
  UNIQUE (commodity_id, expired_at) -- NULL の重複は許すので expired_at が NULL の行は複数できる
)

この動きは標準 SQL に従った動きらしいけど詳しく調べていない。


今日のコミット。

頭が痛い

頭が……痛い……。


golangsha1 で hash 値を計算する。 "crypto/sha1" の例に従えば良い。 err がチェックされていない点に注意する。

https://pkg.go.dev/crypto/sha1


チョコレートのアイスケーキを食べた。


今日のコミット。