Skip to content

Posts

Rust移植再開

go版のリファクタリングも進めたので、またRust版を進めようと思ったら、すっかり構文など忘れてしまっていた。

やっぱり集中&継続して触らないとダメだ。。

関数化

細かい変換を関数化してみた。

strconv.Atoiをエラーだったらデフォルト値で返すやつとか。

titleやtempoを[]byteにして返すやつとか。

メソッドか関数か

最初は、構造体のフィールドを参照しているものはメソッドにしていた。

けど、フィールドのごく一部しか使っていないものはメソッドではなく関数にして、疎結合な感じにしてみた。

もちろんフィールドを更新しているものはメソッドのほうが良いかもしれないが、それでも新しく構造体を生成して返すようにすれば必ずしもメソッドにする必要はない。

Read more

main関数を分けたのでテストも書く

mainのテストは、os.Argsを直接設定するという割と無理やりな書き方でテストしていたけれど、処理部分を別関数にしたので、引数を変えて正常系と異常系をテストし分けることができるようになった。

docker-compose v1のEOL

Docker Desktopでは設定でcomposeのバージョン(1系と2系)を切り替えることができる。

ところで、いつまでV1が使えるのか気になったので調べてみた。

https://github.com/docker/compose では、デフォルトのブランチがv2となっている。masterブランチに切り替えてREADME.mdを見ると、

New features and bug fixes will only be considered in the V2 codebase

とあるが、

but as of right now there is no concrete timeline

Read more

コマンドライン引数をflagで処理する

入力ファイルをos.Args[1]で取得していたので、引数指定しないと範囲外アクセスでpanicしていた。

flagパッケージ使ってflag.Arg(0)で取得するようにしたので、引数指定しなかった場合にはファイルなしエラーで終わるようになった。

もっと親切にするなら、エラー終了ではなくヘルプ表示にするのが良いのだろうけど、それはまた余裕があるときにでも。

Read more

Goのconst

EOTとかbyteのスライスをconstで定義しようとしてできなかった。

const EOT = []byte{0x00, 0xFF, 0x2F, 0x00}
$ go run cmd/mdmml/main.go 
# github.com/umemak/mdmml
./mdmml.go:10:7: const initializer []byte{...} is not a constant

The Go Programming Language Specification - The Go Programming Language

文字列リテラルが許されるならbyteスライスも許されてもよいではないかと思ったけれど、ダメらしい。 varで我慢する。

バグ取り

MDMMLのループバグ、デバッグが面倒だったのでループの展開だけ前処理に分けることにした。

これだと文字列の状態でテストできるので、16進数より見やすい。

たぶん直ったと思う。