また散財してしまった...

no extension

ついカッとなってやった。

今は反省している。

先日,久しぶりに『プログラミング言語Go』の読書会に参加したのだが

ちょっと思い付いてパソコン(Ubuntu 機)で繋ごうとか考えてしまったのが運の尽き(今までは Android タブレットで繋いでた)。

で,ヘッドセットを繋ぐ Bluetooth アダプタは勤務先に置きっぱなしにしてたので「じゃあ家電量販店で買ってしまうか」と読書会イベント当日の午前中に徒歩圏内の家電量販店に出掛けたわけさ(田舎の「徒歩圏内」は広い。片道5〜10kmくらい?)。

しかも,考えたら Web カメラも必要だし,セキュリティ・リスクも考えたら USB ハブもスイッチ付きにしたい。 というわけで以下を購入した。

photo
エレコム WEBカメラ UCAM-C750FBBK マイク内蔵 フルHD 1080p 30FPS 500万画素 高精細ガラスレンズ ケーブル長1.5m ブラック
エレコム (Release 2018-01-26)
Personal Computers
B078J9MR75 (ASIN), 4953103333932 (EAN)
評価     

家電量販店で買ったのは失敗だったが,製品自体に不満はない。 Web ミーティングに使うだけなら200万画素でよかったかも。選ぶならフレームレートで選ぶべきだったね。

reviewed by Spiegel on 2021-08-07 (powered by PA-APIv5)

photo
エレコム Bluetooth USBアダプタ Class2 Windows10対応 LBT-UAN05C2/N
エレコム (Release 2016-07-25)
Personal Computers
B01K8XRQ6O (ASIN), 4953103278165 (EAN)
評価     

家電量販店で買ったのは失敗だった。何故か Bluetooth 4 のアダプタしかなかったんだよ。とりあえず,問題なく使えはする。あとで Bluetooth 5 に買い直そう。

reviewed by Spiegel on 2021-08-07 (powered by PA-APIv5)

photo
エレコム USB3.0 ハブ 4ポート バスパワー マグネット付 MacBook / Surface Pro / Chromebook他 ノートPC Nintendo Switch対応 ブラック U3H-S418BBK
エレコム (Release 2016-11-06)
Personal Computers
B01MQDYCB0 (ASIN), 4953103277243 (EAN)
評価     

家電量販店で買ったのは失敗だったが,製品自体に不満はない。ポートごとにスイッチが入ってるのが欲しかったのよ。

reviewed by Spiegel on 2021-08-07 (powered by PA-APIv5)

いや,これ, Amazon で買えば8千円ほどだったのに(Prime 会員なので送料無料),家電量販店で買ったから諭吉先生がまるっと飛んでいったぞ。 ホンマ,家電量販店で買うと碌なことにならないな。 いや,我ながら魔が差したとしか思えない。 なにやってんだ,私 orz

もう二度としない (今度はもっと上手くやる) 。 といいつつ,またやらかすんだろうなぁ。 ヒトとは何度でも間違う生き物である。

ちなみに上の機器でちゃんと Zoom 接続できた。 Zoom アプリは使わず(Linux 版のアプリがあるかどうかも知らないが) Firefox のプライベートウィンドウで Zoom サイトを開いて問題なくサインインできた。 次回以降もこれで行こう。

第15回 読書会の感想

閑話休題 (それはさておき)

読書会の感想だが,今回もなかなか面白かった。

「参照型」などない

プログラミング言語Go』ではポインタ,スライス,マップ,チャネル,関数の各型を「参照型」と呼んでいるが “The Go Programming Language Specification” (以降 “Golang Specs” と略称する) には「参照型」に相当する記述はない。 Go には C++ や Java で言うところの「参照(reference)」の仕組みは持っていない。 あるのはポインタを使った直接的なアドレッシングである。 Interface 型のようなボックス化(boxing)の仕組みでさえポインタで操作するのだ。

私はぺーぺーの新人の頃に アセンブラ→C言語 とアドレッシングについて叩き込まれたので今更 Go のポインタに躓くことはないが,慣れてない人はやっぱ戸惑うよねぇ。

new など要らぬ?

私は C++ や Java から来たということもあり,最初の頃は new() 関数を多用していた。 たとえば可変長バッファの bytes.Buffer を生成する際も

buf := new(bytes.Buffer)

と書かいていたが,これはリテラル表現を使って

buf := &bytes.Buffer{}

と書いても全く同じなのだ。 これを知ってからは new() 関数はほぼ使わなくなった(古いコードには残ってるがw)。

もっと言うと new() 関数の機能は

The built-in function new takes a type T, allocates storage for a variable of that type at run time, and returns a value of type *T pointing to it. The variable is initialized as described in the section on initial values.

であって,割り当てる領域がヒープであるとは記されてないんだよね。 ある関数スコープ内でのみ生成・利用されるインスタンスであれば new() 関数で生成してもスタック上に割り当てられるかもしれない。 インスタンスがどこに生成されるかはコンパイル時の最適化で決まる。

とするとますます new() 関数は要らない子になってしまう。 ただし Generics が正式に実装されると new() 関数の使いみちが増えるんじゃないか,ということらしい。

「名前付き型」はなくなった

プログラミング言語Go』2.5章には

type 宣言は、既存の型と同じ基底型underlying type)を持つ新たな名前付き型named type)を定義します

と書かれてある。 たとえば src/syscall/syscall_unix.go

type Errno uintptr

みたいな感じ。

でも Go 1.9 で型エイリアス(type alias)がサポートされたことで「名前付き型」という文言は Golang Specs からなくなったんだそうな。 ちなみに型エイリアスは,たとえば golang.org/x/sys/unix パッケージで

// Copyright 2018 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

//go:build (aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || zos) && go1.9
// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris zos
// +build go1.9

package unix

import "syscall"

type Signal = syscall.Signal
type Errno = syscall.Errno
type SysProcAttr = syscall.SysProcAttr

みたいに定義されているやつ。 文字通りの別名定義で「新たな型」でなく「全く同じ型」として扱うことができる。

レキシカルブロックの罠

プログラミング言語Go』2.7章では { ... } 等で囲まれた記述ブロックをレキシカルブロック(lexical block)と呼んでいる(厳密にはちょっと違うが)。 で,レキシカルブロック間が親子関係にあるとき,親が宣言する変数などの識別名を子が上書き再宣言して親の識別子を隠蔽することができる。 いわゆる「シャドウイング(shadowing)」である。 なので

func main() {
    x := "hello!"
    for i := 0; i < len(x); i++ {
        x := x[i]
        if x != '!' {
            x := x + 'A' - 'a'
            fmt.Printf("%c", x) // "HELLO"
        }
    }
}

みたいな鬼畜なコードも書けてしまう(:= は代入ではなく初期化付き宣言である点に注意)。 まぁ,この程度なら(鬼畜ではあるが) main() 関数のスコープの中に収まっているのでまだマシだが,うっかり init() 関数を使った初期化で

var cwd string

func init() {
    cwd, err := os.Getwd() //注意: 誤り!
    if err != nil {
        log.Fatalf("os.Getwd failed: %v", err)
    }
    log.Printf("Working directory = %s", cwd)
}

みたいなコードを書いて初期化に失敗したりするわけだ。 こわいこわい(笑)

ブックマーク

参考図書

photo
プログラミング言語Go
アラン・ドノバン (著), ブライアン・カーニハン (著), 柴田芳樹 (著)
丸善出版 2016-06-20 (Release 2021-07-13)
Kindle版
B099928SJD (ASIN)
評価     

Kindle 版出た! 一部内容が古びてしまったが,この本は Go 言語の教科書と言ってもいいだろう。感想はこちら

reviewed by Spiegel on 2021-05-22 (powered by PA-APIv5)

photo
AfterShokz Aeropex 骨伝導ワイヤレスヘッドホン 防水bluetooth5.0 コズミックブラック
SHENZHEN VOXTECH CO.,LTD
エレクトロニクス
B07RRQ59JR (ASIN), 0811071032209 (EAN), 811071032209 (UPC)
評価     

Amazon Prime Day にそそのかされて買った。反省はしない。値段並みの音質はある,と思う。耳が自由って素晴らしい。

reviewed by Spiegel on 2021-06-24 (powered by PA-APIv5)