チャットアプリ

RailsチュートリアルでもTDD推奨でしたが、この書籍では「ここまで細かく段階を分けて作っていくものなのか?」と思いました。

var buf bytes.Buffer
tracer := New(&buf)
...

まずこのようなテストを書きます。
戻り値についても型宣言もしていません。

それからテストを実行し。
New関数がないので作り。
またテストを実行し。
引数を受け取れないので受け取れるようにし。
またテストを実行し。
戻り値を戻していないので、Tracerインタフェースを定義し、それを戻すようにし。
といった感じです。

少し驚き不安になりました。
今までの自分のプログラミング経験や、特にElmですと、自分は型から作っていった記憶があるからです。
(勘違いかも)

頭の中でどこまで出来上がっているかなどにもよると思うのですが、
関数 -> インタフェース -> 公開しない構造体
といった手順に見えました。

インタフェースも型といえば型なのかもしれませんが、関数の集まりを宣言しているようなもので、文章化が難しいのですが少し不思議です。

結局このパッケージは外部に構造体は出していません。

手続き型言語は関数から、関数型言語はデータからという傾向でもあったりするんでしょうか?

監訳者版tracer.goも日本の書籍にだけ載っているのですが、こちらではインタフェースは使わずにもっとシンプルです。

メソッドのレシーバをポインター型にするかどうかという判断も自信が持てません。

なんだか悩ましいところです。

引数をインタフェースにすることのほうが重要で、戻り値はそこまで重要ではないような気がします。

チャットアプリ

サーバー側コードを自力で思いつけていたかというと自信がありません。
まるでElmで言ったら、大げさですがTEAを自力で生み出すような。
相変わらず並行処理は難しく感じます。

たった16pの時点でチャットができてしまい感動しました。

goplやっていて気づかず今更なのですが、go buildこれだけでカレントディレクトリの全ての.goファイルが適切にビルドされるのですね。

go runは全てというわけには行かず、go run hoge.goのように単一のファイルをちょっと実行するというのが主なようです。

数学勉強

数検2級は2ヶ月ほど勉強したら取れたのですが、それに続けて勉強し始めた準1級がなかなか大変です。

合格するかどうか以前に、挑戦可能になるまでに2級の10倍は時間がかかりそうな体感です。

cos36°
こんなに公式をたくさん使うとは。

x=2みたいな複素数z
思いつかなくて、それか!と悔しい思いをしました。

Go言語によるWebアプリケーション開発

今日からこの本を読んでいこうと思います。

この本を選んだ理由は、目次を見て実践的なアプリを作っているのではないかと思ったからです。

すでにインプット比率が高くなってしまっていると思いますが。

goで作ったもの

goplをほぼ読了して、現時点でgoで作ってみたものです。

テキスト処理

タイピングゲームでのお題になるテキストファイルをElmのファイルに変換するものを書いてみました。

リンク

flagパッケージが便利だと思いました。

ファイル名から拡張子を取り除いたものを得るには自前で用意しなきゃならないようです。

以前こういったものはRubyで書いていました。
サーバーサイドで使われる他の言語ですとエンタープライズ感があり、個人開発で自分が使う姿が想像しにくいのですが、こういったところもRubyやGoの好きなところです。
さらにGoは静的型チェックされるのでたのもしいです。

モニターを消すもの

非常に小さなものでプログラムもなにもないのですが、意外と使っています。

リンク

起動すると5秒後にモニターを消すループが走ります。
(ちょっとマウスの移動などでついても再び消えてもらうためです)
その間の時間も計測します。

「お腹痛い!」となりトイレに行くさいに起動します。
すると、15分使ってしまったがモニターの寿命が15分伸びてさらにエコといった感じです。

Goなので実行ファイルにできていいですね。

11章 テスト

11.6 Example関数

すごい。こんなものあるのかと思いました。

func ExampleAdd() {
    fmt.Println(Add(3, 4))
    fmt.Println(Add(5, -1))
    // Output:
    // 7
    // 4
}

このようなものをhoge_test.goに書いておき、godocするとドキュメントにコード例として表示されます。

さらにこのコードはgo testで実際に実行されテストもされるので、型が違ったり結果が違うなど、ドキュメントが古くならないとのことです。

よくわかっていないのですが、fmtで印字されたものがチェックされるみたいです。

自分で作成したディレクトリでgodocを使ってみたかったのですが、やり方がわかりませんでした。

GOPATHで設定されている%USERPROFILE%\go/srcにコピーしてgodoc実行してみるとできました。

現在のディレクトリで実行することはできないんでしょうか?

これで11章が終わり、次は12章なのですが

この本の最後の二つの章では、reflectパッケージとunsafeパッケージを説明します。それらは、Goプログラマが日常的に使うパッケージではありませんし、使う必要があるGoプログラマはさらに少ないでしょう。もし、みなさんが相当な量のGoプログラムをまだ書いていないのであれば、今がGoプログラムを書く絶好の時期でしょう。

これで一旦読了としてしまったほうがいいのかもしれません。
流し読み程度で読み進めようと思います。


Example関数のような手法は、一般的にはDoctestというみたいです。

11章 テスト

11.4 Benchmark 関数

$ go test -bench=. -benchmem
これでベンチマークとメモリ割り当てを調べられます。
さっそくやってみました。

BenchmarkIsPalindrome-4          3548802               314 ns/op             248 B/op          5 allocs/op
BenchmarkIsPalindromeB-4         3987262               309 ns/op             248 B/op          5 allocs/op
BenchmarkIsPalindromeC-4         7521350               156 ns/op             128 B/op          1 allocs/op

最も速いプログラムはたいてい最も少ないメモリ割り当てを行うプログラム (p373)

らしいです。