また散財してしまった...
ついカッとなってやった。
今は反省している。
先日,久しぶりに『プログラミング言語Go』の読書会に参加したのだが
ちょっと思い付いてパソコン(Ubuntu 機)で繋ごうとか考えてしまったのが運の尽き(今までは Android タブレットで繋いでた)。
で,ヘッドセットを繋ぐ Bluetooth アダプタは勤務先に置きっぱなしにしてたので「じゃあ家電量販店で買ってしまうか」と読書会イベント当日の午前中に徒歩圏内の家電量販店に出掛けたわけさ(田舎の「徒歩圏内」は広い。片道5〜10kmくらい?)。
しかも,考えたら Web カメラも必要だし,セキュリティ・リスクも考えたら USB ハブもスイッチ付きにしたい。 というわけで以下を購入した。
- エレコム WEBカメラ UCAM-C750FBBK マイク内蔵 フルHD 1080p 30FPS 500万画素 高精細ガラスレンズ ケーブル長1.5m ブラック
- エレコム (Release 2018-01-26)
- Personal Computers
- B078J9MR75 (ASIN), 4953103333932 (EAN)
- 評価
家電量販店で買ったのは失敗だったが,製品自体に不満はない。 Web ミーティングに使うだけなら200万画素でよかったかも。選ぶならフレームレートで選ぶべきだったね。
- エレコム Bluetooth USBアダプタ Class2 Windows10対応 LBT-UAN05C2/N
- エレコム (Release 2016-07-25)
- Personal Computers
- B01K8XRQ6O (ASIN), 4953103278165 (EAN)
- 評価
家電量販店で買ったのは失敗だった。何故か Bluetooth 4 のアダプタしかなかったんだよ。とりあえず,問題なく使えはする。あとで Bluetooth 5 に買い直そう。
- エレコム USB3.0 ハブ 4ポート バスパワー マグネット付 MacBook / Surface Pro / Chromebook他 ノートPC Nintendo Switch対応 ブラック U3H-S418BBK
- エレコム (Release 2016-11-06)
- Personal Computers
- B01MQDYCB0 (ASIN), 4953103277243 (EAN)
- 評価
家電量販店で買ったのは失敗だったが,製品自体に不満はない。ポートごとにスイッチが入ってるのが欲しかったのよ。
いや,これ, 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()
関数の機能は
であって,割り当てる領域がヒープであるとは記されてないんだよね。
ある関数スコープ内でのみ生成・利用されるインスタンスであれば new()
関数で生成してもスタック上に割り当てられるかもしれない。
インスタンスがどこに生成されるかはコンパイル時の最適化で決まる。
とするとますます new()
関数は要らない子になってしまう。
ただし Generics が正式に実装されると new()
関数の使いみちが増えるんじゃないか,ということらしい。
「名前付き型」はなくなった
『プログラミング言語Go』2.5章には
と書かれてある。
たとえば 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)」である。
なので
みたいな鬼畜なコードも書けてしまう(:=
は代入ではなく初期化付き宣言である点に注意)。
まぁ,この程度なら(鬼畜ではあるが) main()
関数のスコープの中に収まっているのでまだマシだが,うっかり init()
関数を使った初期化で
みたいなコードを書いて初期化に失敗したりするわけだ。 こわいこわい(笑)
ブックマーク
参考図書
- プログラミング言語Go (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)
- Alan A.A. Donovan (著), Brian W. Kernighan (著), 柴田 芳樹 (翻訳)
- 丸善出版 2016-06-20
- 単行本(ソフトカバー)
- 4621300253 (ASIN), 9784621300251 (EAN), 4621300253 (ISBN), 9784621300251 (ISBN)
- 評価
著者のひとりは(あの「バイブル」とも呼ばれる)通称 “K&R” の K のほうである。この本は Go 言語の教科書と言ってもいいだろう。
- AfterShokz Aeropex 骨伝導ワイヤレスヘッドホン 防水bluetooth5.0 コズミックブラック
- SHENZHEN VOXTECH CO.,LTD
- エレクトロニクス
- B07RRQ59JR (ASIN), 0811071032209 (EAN), 811071032209 (UPC)
- 評価
Amazon Prime Day にそそのかされて買った。反省はしない。値段並みの音質はある,と思う。耳が自由って素晴らしい。