MD5 - Go - Docker
半月サボった!!! 再開。
ZennにMD5の記事を投稿
夏休みの成果としてZennに記事を上げた。RFC1321をベースにMD5を実装してみた!という内容。
sinの近似計算を含めたことで多少は普遍的な価値が付けられたように思う。そうかな……。
GitHub連携で記事を上げられるのが素晴らしい。本当に一切躓くことなく投稿できた。
連携しているリポジトリ:
ところで、Rustタグの記事を読んでいて、WebAssembly(WASM)というのがC++やRustからコンパイルしてウェブブラウザで動作する低レベル志向のプログラムだと知った。 RustやC++からコンパイルして作る。近いうちに触れたい。
Reak World HTTP
買った。雰囲気でHTTPに触れすぎているので。
O’Reilly Japan - Real World HTTP 第2版
「HTTPを扱う標準ライブラリが抽象化されすぎていないため、HTTPに触れてみるには最適な言語」(まえがきix)だという理由でGo言語が採用されている。
やるか!環境構築を……。
Go入門
公式サイト:The Go Programming Language
インストール方法:Download and install - The Go Programming Language
1. ダウンロード
Downloads - The Go Programming Language
Windowsなのでこれ
go1.17.1.windows-amd64.msi (124MB)
2 インストール
よし。
$ go version
go version go1.17.1 windows/amd64
3 Hello
Tutorial: Get started with Go - The Go Programming Language
他のモジュールに含まれるパッケージをコード内でインポートするとき、 そのコード自身のモジュールで依存性を管理する必要がある。 モジュールは
go.mod
ファイルの中で定義され、 利用している外部パッケージを含むモジュールを追跡する。go.mod
ファイルは常にコードと共存していて、リポジトリにも同時に上げる。
“Dependency tracking”の定訳って何だろう?
このgo.mod
がCargo.toml
みたいなものということか? cargo new
みたいにgo mod init example/hello
でexample/hello
モジュールが定義される。ただし作られるのはgo.mod
一つだけで、コードの雛形までは作ってくれない。
$ go mod init example/hello
go: creating new go.mod: module example/hello
go.mod
の中身:
module example/hello
go 1.17
hello.go
:
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}
標準ライブラリの中にfmt
パッケージがあってそれを明示的にインポートする。
fmt package - fmt - pkg.go.dev
$ go run .
Hello, World!
OK。ディレクトリを指定しないと、
$ go run
go run: no go files listed
となる。このgo run .
ではgo.mod
は書き変わらない。
4 外部モジュール
pkg.go.devでモジュールを探す。crates.ioだな。
rsc.io/quote
パッケージを使う。
hello.go:
package main
import "fmt"
import "rsc.io/quote"
func main() {
fmt.Println(quote.Go())
}
go mod tidy
でモジュールがインストールされ、go.sum
が作られる。.lock
みたいなものかな。
$ go mod tidy
go: finding module for package rsc.io/quote
go: downloading rsc.io/quote v1.5.2
go: found rsc.io/quote in rsc.io/quote v1.5.2
go: downloading rsc.io/sampler v1.3.0
go: downloading golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c
“Tidy”ってちょっとおもしろいな。身繕い。今回はgo.mod
も書き変わる。あれ、ということは人が依存関係を書き込むのは.go
ファイルということか。
go.sum
にはモジュールのチェックサムが書き込まれる。だから.sum
。このファイルはコミットする。
Ensure your go.sum file is committed along with your go.mod file.
そしてラン。
$ go run .
Don't communicate by sharing memory, share memory by communicating.
何だこれは。プログラムの並行性に関してGoが採用している思想?
- go - Explain: Don’t communicate by sharing memory; share memory by communicating - Stack Overflow
- Share Memory By Communicating - go.dev
環境はできたので後は追々。
Docker
「重要度は高くないのでインストールしなくても支障はありませんが」とのことだが良い機会なので入れる。
Windows 10 Homeで使うにはWindows Subsystem for Linux 2(WSL2)というのがいるらしいので入れる。
Windows 10 に WSL をインストールする | Microsoft Docs
LinuxディストリビューションとしてUbuntuを選択。よく分からないので……。
あとはこれに従うだけ。
Install Docker Desktop on Windows | Docker Documentation
1年前はホームエディションのWindowsでDockerを利用しようとすると仮想マシンが必要だったはずだけど、このWSLの公開という画期的な出来事があって大きく状況が変わったらしい?
Docker使えるようになりたい……。