'sqr'atch-note

ちりはつもれど ちりぬるを

Reakforce RC1を買った

去年買ったKeychron K3 Maxのエンターキーが二重に入力されてしまうチャタリングが発生するようになり、キーボードを新しく買うかどうかを悩んでいたら、ちょうどそのタイミング(2/14)で発売だったRealforce RC1ホワイトを勢いで購入。3ヶ月ほど使ってみたが、割と満足している。

  • 試し打ちせずに3万5千円もするキーボードを買うのは躊躇われたけど、Realforceというブランドを信頼して購入した
    • Kyechron k3の浅いキーストロークに慣れていたためか、2週間ほど使っていてもRC1の深いキーストロークに慣れずにタイプミスやタイピング速度が遅くなってしまい、Keychron K3 Maxをもう一枚買えば良かったかなと後悔してたけど、APC設定で1.5mmに変更したら、びっくりするほど体感が改善して打ちやすくなった
  • RC1の難点としては、RC1の横幅がKeychron K3 MAXより少しコンパクトであるため、MBPで本体の上に置いて使おうとすると、本体キーボードに干渉してしまう点
    • なので、タイプスティックという補助器具を買ってみた
    • タイプスティックス - 打ち箸 | FAR EAST GADGET
    • このバチをこのようにMBPのキーボードの上に置き、
    • そして、RC1をこのように置く
    • K3よりキーボード本体の厚さがあるので、打ちにくいものの、使いづらいと言うほどでも無いので良しとする
  • RC1はバッテリー駆動で、似たようなHHKB Studioが乾電池仕様であり、キーボードの耐用年数が高いのでバッテリー駆動はどうかな?(バッテリーも交換出来ないので)と思っていたが、1回の充電で1ヶ月持つのと、バッテリーの寿命が300サイクルと公式で言っているため、理論的には25年(=300/12ヶ月)持つことになり、まあ十分なのかなと思うに至った
    • そもそも、普段は有線で使うのでバッテリーを使うことが無い。そういう意味では、バッテリーがあるかどうかは気にしなくても良いのかもしれない
  • あと、公式からバッテリー交換サービスも提供されるらしい。でも、有償だろうから、正直自分で交換出来るようになっていて欲しかったとも思う

  • バッテリー部分の懸念や変荷重が良かったなという不満があるけど、トータルとしては満足寄り(高い買い物をしたため、満足したと納得するしか無い感はある)

WiMAXからdocomo Home 5Gへ乗り換え

WiMAXからdocomo Home 5Gに乗り換えてから2ヶ月ほど使ってみた実録として書き出しておく。特にオチはない。

  • 去年4月からWiMAXを使っていて特に不満はなかったのだけど、なんとなくネットが遅いなと感じるようになり、ある程度は無線なので仕方無いものだと割り切っていたものの、平日昼や夜、土日といった時間帯によらず常に遅いので、通信速度を確認してみると下り20〜40Mbps程度しか出ていない
    • 時間帯を変えて計測して見ても、ほとんど変わらないので、流石におかしいなとKDDIのエリアマップを見てみたら、いつの間にか5Gエリア外になってしまっていた…
    • 確認時点での夏以降もエリア拡張の予定が無いし、この程度の速度しか出ないのに毎月4000円弱支払い続けるのは割高だと思ったため、docomoのHome 5Gに乗り換えようと検討を始めた
  • たまたまdocomo回線のケータイを持っていたため、家の中で速度計測してみたら、夜でも600Mbps程度出ることが分かったので、十分に使えるだろうと判断し乗り換えを決意
  • docomo Home 5Gに乗り換えるに当たっての懸念事項は、ホームルータであるHR02が新品価格で7万円以上もすること
    • 月額サポートがついて3年使えば実質無料になるものの、こういう回線を3年も使い続けるのか?と考えると確証が無かったので、悩んでいた
    • ネットを調べていると中古なら2万円程度で買えるようだったが、流石に値段の落差が凄いし、ジャンク品に近いのかと思ったら、こういうデバイスの中古はこういうものらしい
    • ということで、中古の端末を購入
  • Home 5GもSIMのみ契約を2/21に行い、2/25に開通処理
    • 開通処理と同時に、WiMAXを解約。WiMAXはWebで申し込みして、Webでそのまま解約出来たので良かった(電話でしか解約を受け付けないNTTフレッツは本当にめんどう)
  • 開通してから速度測定もやってみたら、夜間で最低200Mbps程度は出るので非常に優秀だなと思った
    • そして、早朝で混雑していない時間帯という条件下ではあるものの、無線で1Gbpsを超えたのは初めて見た
  • 2ヶ月ほど使ってみて、混雑する昼や夜であっても下り300〜600Mbps程度は出ており、満足している

ProxmoxでTerraformを使う

大まかな流れ

  1. Proxmoxホストで、Terraform用のユーザ/ロールの作成&APIトークンの作成
  2. Terraformのインストール
  3. テンプレートVMの準備
  4. Terraformファイルの準備&実行

Terrform用ユーザ/ロールの作成

”Docs overview | Telmate/proxmox | Terraform | Terraform Registry”: https://registry.terraform.io/providers/Telmate/proxmox/latest/docs

Terraformのセットアップは、公式ガイドの通りなんだけど、ちょっと分かりづらかったので整理しておく。

  • Terraformを使う事前準備として、Proxmoxのユーザ管理コマンドpveumを使って、Terraformで使用するためのロールとユーザを作成する
## ロールの作成
pveum role add TerraformProv -privs "Datastore.AllocateSpace Datastore.AllocateTemplate Datastore.Audit Pool.Allocate Sys.Audit Sys.Console Sys.Modify VM.Allocate VM.Audit VM.Clone VM.Config.CDROM VM.Config.Cloudinit VM.Config.CPU VM.Config.Disk VM.Config.HWType VM.Config.Memory VM.Config.Network VM.Config.Options VM.Migrate VM.Monitor VM.PowerMgmt SDN.Use"
## ユーザの作成と確認
pveum user add terraform-prov@pve --password Passw0rd!
pveum aclmod / -user terraform-prov@pve -role TerraformProv

## ロールとユーザの確認
pveum role list
pveum user list

次に認証用のAPIトークンを作成する。TerraformでProxmoxのAPIを叩くためには、パスワード認証とAPIトークンによる認証の2つがあって、今回はAPIトークンを使う。

  • APIトークンは、Proxmoxの管理画面から作成できる
    • Datacenter -">> Permisson -">> API Token
    • このとき「PriviledgeSeparation」のチェックは外す

Terraformのインストール

  • Terraformは、Proxmoxホストでは無く、クライアント端末にインストールする。そしてAPIを使ってProxmoxを利用する形
  • インストール方法は、公式サイトを参照してほしい

developer.hashicorp.com

テンプレートVMの作成

今回は、Proxmox上に予め用意したテンプレートVMから、新しいVMをTerraformで作成する。なので、まず指定する仮想マシンテンプレートをProxmoxに登録する。

  • テンプレートVMの用意は、ゼロから新しいVMを作ってテンプレートVMに変換する方法と、クラウドイメージを利用する方法があり、簡単のために今回はUbuntuクラウドイメージを使うことにする
  • 下記URLからProxmoxホストのローカルディスクにダウンロードしてくる
  • このimgファイルをインポートしてテンプレートVM(ID 9100)を作成してみると、失敗する
## これは失敗する
qm disk import 9100 noble-server-cloudimg-amd64.img proxthin
Configuration file 'nodes/pve/qemu-server/9100.conf' does not exist
  • テンプレートVM(ID 9100)の設定ファイルが存在しないという話。なので、VMの”箱”を作ってあげる必要がある
  • 管理GUIから作成してみる。このとき、ProxmoxのVM作成ウィザードで表示されるデフォルトの仮想Disksは削除してVMを作成する
  • そして、用意したクラウドイメージをそのVM(9100)にアタッチしてあげる
root@pve:~# qm disk import 9100 noble-server-cloudimg-amd64.img proxthin --format qcow2
importing disk 'noble-server-cloudimg-amd64.img' to VM 9100 ...
format 'qcow2' is not supported by the target storage - using 'raw' instead
  Logical volume "vm-9100-disk-0" created.
transferred 0.0 B of 3.5 GiB (0.00%)
transferred 3.5 GiB of 3.5 GiB (100.00%)
Successfully imported disk as 'unused0:proxthin:vm-9100-disk-0'
  • 最後に、管理GUIを開いて、9100のVM画面から"More"メニューからテンプレートに変換する
  • この手順は、CLIGUIを行ったり来たりしてるので、GUIだけ、もしくはCLIだけで操作出来ると良いのだけど・・・

Terraformファイルの準備

  • 次に、作成したテンプレートVMから仮想マシンを作成するために、Terraformに渡すタスクファイルを作成する必要がある
  • tfファイルに記載するパラメータの詳細は以下の公式サイトを参照してほしい

以下のファイルを「create-vm.tf」ファイルとして用意する。途中、値が埋め込まれているので、自身の環境に応じたパラメータに変更してあげる必要がある

variable proxmox_token_id {}
variable proxmox_token_secret {}

variable cores {}
variable memory {}
variable disk_size {}

terraform {
  required_providers {
    proxmox = {
      source  = "Telmate/proxmox"
      version = "3.0.1-rc4"
    }
  }
}

provider "proxmox" {
  pm_api_token_id = "${var.proxmox_token_id}"
  pm_api_token_secret = "${var.proxmox_token_secret}"
  pm_api_url = "https://172.16.1.3:8006/api2/json"   ## デプロイするノード名のIPアドレスに変更する
  pm_tls_insecure = true
}

resource "proxmox_vm_qemu" "clone-vm" {
  name = "clone-vm"
  target_node = "prx01"  ## デプロイするノード名に変更する
  clone = "al8"  ## 使用するテンプレート名に変更する
  full_clone = true
  os_type = "cloud-init"
  scsihw = "virtio-scsi-pci"

  cores   = "${var.cores}"
  memory  = "${var.memory}"

  disk {
    slot = "scsi0"
    storage = "data"
    type = "disk"
    size = "${var.disk_size}G"
  }
  boot = "order=scsi0;net0"

}

同様に、以下を「create-vm.tfvars」ファイルとして作成する。

proxmox_token_id = "<your token id>"
proxmox_token_secret = "<your token secret>"
cores = 4
memory = 4096
disk_size = 32

実行

まずtfファイルを用意したディレクトリで、terraform initを実行する

╰─$ terraform init                                                                                                                                                                               1 ↵
Initializing the backend...
Initializing provider plugins...
- Finding telmate/proxmox versions matching "3.0.1-rc4"...
- Installing telmate/proxmox v3.0.1-rc4...
- Installed telmate/proxmox v3.0.1-rc4 (self-signed, key ID A9EBBE091B35AFCE)
Partner and community providers are signed by their developers.
If you'd like to know more about provider signing, you can read about it here:
https://www.terraform.io/docs/cli/plugins/signing.html
Terraform has created a lock file .terraform.lock.hcl to record the provider
selections it made above. Include this file in your version control repository
so that Terraform can guarantee to make the same selections by default when
you run "terraform init" in the future.

Terraform has been successfully initialized!

You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.

If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.
  • Terraform has been successfully initialized!と出力されていればOK
  • 次に、planで実行に問題がないか確認してみる
    • terraform plan -var-file="create-vm.tfvars"
  • 特に問題がなさそうであれば、applyする。途中で、実行するかどうか確認があるので「yes」を入力して実行する
    • terraform apply -var-file="create-vm.tfvars"
  • 少し待って以下のようにCreation completeとなればOK
  Enter a value: yes

proxmox_vm_qemu.clone-vm: Creating...
proxmox_vm_qemu.clone-vm: Still creating... [10s elapsed]
proxmox_vm_qemu.clone-vm: Still creating... [20s elapsed]
proxmox_vm_qemu.clone-vm: Still creating... [30s elapsed]
proxmox_vm_qemu.clone-vm: Still creating... [40s elapsed]
proxmox_vm_qemu.clone-vm: Creation complete after 41s [id=prx01/qemu/102]

Proxmox側でVMが作られていて、無事にOSが起動していればOK
作ったVMを削除する場合は、以下のコマンドを実行すれば良い
- terraform destroy -var-file="create-vm.tfvars"

今回は、以上。

2025年目標

毎年恒例の今年の目標設定。

目標OKR

  • O:技術的な知識をつける
    • O:フロントエンド技術の知識を付ける
      • K:Reactをやる
      • K:Vue.jsをやる
      • K:TypeScriptを学ぶ
    • O:運用周りの知識を付ける
      • K:オブザーバビリティについて本を読む
      • K:『運用設計の教科書』を読む
      • K:『システム運用アンチパターン』を読む
      • K:『良いFAQの書き方』
    • O:コミュニケーションスキルを身につける
  • O:健康
    • K:自重トレーニングを継続する
    • O:行動体力を付ける
      • K:エアロバイクかランニングをやる(具体的な目標を定める)
  • O:遊び系の目標(TBD

目標備忘録

  • 去年はGolangに取り組んで、クリーンアーキテクチャを踏まえた静的なWebアプリケーションが作れるようになったが、動きのあるアプリケーションが作れない。ので、ReactやVue.jsといった技術について学びたい
    • まず『これからはじめるReact実践入門』から始めることとしたい。これを読んで、足りないTypeScriptの知識などを仕入れていきたい
  • 毎年1プログラミング言語を学習するという目標がここ数年出来ていないので、今年はフロントエンドの学習と合わせて、TypeScriptに取り組みたい
  • LinuxWindowsの知識をつけてシステムを作るという観点ではある程度の知識や経験が身についてきてるけど、それらを運用するという観点では『入門 監視』くらいしか読んでないので、今年は運用周りの知識を付けていきたい
  • 去年、『エラスティックリーダーシップ』をようやく手に入れて再読したのをきっかけに、リーダーシップに関する本を乱読した(20冊くらい)。
  • 去年の8月頃から自重トレーニングを再開し、ある程度習慣化出来たのと、成果も出つつあるので、今年は持久力を高めていきたい
    • 行動体力と防衛体力という分類において、ここ5年以上、風邪を引いて発熱でダウン(ワクチン接種の副反応での発熱は除く)はしていないので、防衛体力は割とあると思っている。栄養バランスに気を遣って食事はしているつもりかつ、十分な睡眠を取って健康的な生活はしているが、一方で行動体力という点においてはてんで駄目だという自認がある
    • 理想的には朝から出かけて夜に帰宅するような12時間くらい外出しても大丈夫な筋力や持久力を付けたい
      • これを実現するためには、ランニングをするべきなのかウォーキングで十分なのか、はたまたエアロバイクをやるくらいで十分なのかという検討が出来ていないので、調べたい
      • 家の中にエアロバイクがあるので、まずはエアロバイクをやりつつ調べて、ランニングをやった方が良いのであれば、そちらにシフトしていくと言うのを考えてる

2024年振り返り

毎年恒例、年頭に立てた目標に対する予実の振り返り。

  • 今年一年の目標は、それぞれ達成した項目の満足度は、6〜7割かなという印象。目標の解像度が低いから、達成したのかどうか分からないっていう状態だから、まあ及第点レベルな感じ
  • 今年一年も風邪引かず健康に本も読んで知識付けてこられたから、それで良いのでは?

技術的な知識を付ける

  • 技術書を読んだ冊数は、予定20冊に対して実績56冊でだいぶ多めに達成出来た。
    • ブクログで記録してた冊数だから、新規分しかカウントされてないし、再読含めると60冊はいってそう(?)
  • LinuCレベル2まで習得し、さらにOracle bronzeも取得したので、これまで不足していたDB周りの知識も多少なりとも得ることが出来たと思う
  • ブログは19本、技術的なものを書いたので、20本には達せず
    • 書こうと思って結局まとめきれなかった話もそれなりにあるので、そういったものをきちんと書き上げられるようになるのは、課題

プログラミング

  • AtCoderで茶色になるという目標を立てていたが、これは未達
    • 結局2月くらいまでしか競プロをやっておらず、そこからLinuCの学習などに比重が移っていったため、達成出来ず
  • Golangでアプリを作り上げるという目標は、まあ達成出来たと思う
    • 「作り上げる」という部分が曖昧だったので、達成か未達か微妙なライン
    • 基本的なCRUDなWEBアプリをクリーンアーキテクチャに基づいて作り上げることはした
  • Githubに200コミットをする目標は、達成出来なかった
    • 毎日1コミットすれば余裕は目標だったけど、毎日コーディングすることが出来なかったので、未達

ゲーム

  • サーモンランの全ステ野良カンスト目標は達成
    • 2022年12月に野良カンストを目指して、2024年9月にようやくドンブラコの野良カンストが出来た。想像よりだいぶ時間がかかってしまった

健康

  • エアロバイクはあまり出来ていないが、自重トレーニングをはじめ、運動を去年よりも日常に取り込んで、改善してきてると思う

M75q-TinyへのProxmoxのセットアップメモ

KVMホストとして動作させていたが、仮想ネットワーク周りでvnicが作られているのに仮想マシンに割り当てられなかったりする現象が発生して、どうにも修正ができなくなったので、Proxmoxに乗り換えることにした話の続きで、Proxmoxインストールについてメモを残す。

使用する機器

  • Lenovo M75q-Tiny
    • CPU:AMD Ryzen 5 PRO 3400GE
    • メモリ:32GB
    • ディスク:
      • 128GB(標準ディスク)
      • 250GB(追加ディスク)

構成の検討

  • 128GBの標準SSD(NVME)にはWindows10が入っているが、この領域を削除して、Proxmoxをインストールする
  • 250GBの追加SSD(SATA)があるので、こちらに仮想マシンの仮想ディスク用の領域を作成する
  • ネットワークは、普段使っている主系の高速回線、加えて低速回線という2本のネットワークが家の中にある
    • Proxmoxの仮想マシンからは、高速回線側には出て行けないようFWを構成して、低速回線を仮想マシンの通信用として割り当てる
    • 高速回線側からは、NATを設定して仮想サーバにsshなどアクセスをする想定にする
    • なので、Proxmoxの仮想ネットワークの構成は、以下の3本構成とする
      • 高速回線側にブリッジした仮想ネットワーク
      • 低速回線側にブリッジした仮想ネットワーク
      • 仮想マシン間でのみ通信が可能な仮想ネットワーク(=インターネットには抜けられないNW)

初期インストール

  • Rufusなどを使って、USBディスクにProxmoxのインストールイメージを書き込み、ブートしてインストールしていく
  • ただし、LenovoのM75q-Tinyは、バッファローUSBメモリとの相性が悪いので、それ以外のメーカーのUSBメモリを使ってブートUSBを作成する
  • M75q-Tinyの電源を入れ、F1でBIOSメニューに入る
  • インストール自体は、ウィザードに従っていけば良いので他の方のエントリを参照してほしい

初期セットアップ

データ領域の拡張

  • SSD(NVME)にProxmoxがインストールされたが、NVMEディスクにデータ領域も作られてしまってる。なので、250GBのSATAディスクにはKVM領域が残っていものを消して仮想マシンのデータストアとして使う
root@pve:~# lsblk
NAME               MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
sda                  8:0    0 232.9G  0 disk 
└─sda1               8:1    0 232.9G  0 part 
nvme0n1            259:0    0 119.2G  0 disk 
├─nvme0n1p1        259:1    0  1007K  0 part 
├─nvme0n1p2        259:2    0     1G  0 part /boot/efi
└─nvme0n1p3        259:3    0 118.2G  0 part 
    ├─pve-swap       252:0    0     8G  0 lvm  SWAP
    ├─pve-root       252:1    0  39.6G  0 lvm  /
    ├─pve-data_tmeta 252:2    0     1G  0 lvm  
    │ └─pve-data     252:4    0  53.9G  0 lvm  
    └─pve-data_tdata 252:3    0  53.9G  0 lvm  
        └─pve-data     252:4    0  53.9G  0 lvm  
root@pve:~# 
  • 管理GUIから、data領域を削除する

GUIでのディスク追加

  • 次に領域を削除したディスクをデータストアとして設定していく
  • 管理GUIから、ノード→Disks→対象ディスクを選んでInitialize Disk with GPTをクリック
  • LVM-Thinを開いて、Create: Thinpoolをクリックして新しいディスクを選択して作成する
    • ここで指定した名前は、VG名とLV名に使われる

ネットワークの作成

  • 仮想マシンで使用する仮想ネットワークを作成していく
  • ノードを選択してSystem→Networkから開くと、Proxmoxホストのネットワーク設定が行える。新しいブリッジを作ったり、ボンディング、VLAN設定などが行える
  • デフォルトで作成されているブリッジネットワークvmbr0に仮想マシンNICを割り当てることもできるが、仮想マシン用の仮想ネットワークを作成する
  • Datacenter → SDNと辿っていく。作成する順番としては、Zoneを作成して、次にVNetの作成、最後にSubnetを作る
    • Zoneは、複数のVNetを含むまとまり
    • VNetが、仮想マシンNICに割り当てるLANになる
    • Subnetは作らなくても別に大丈夫
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master vmbr0 state UNKNOWN group default qlen 1000
3: ens34: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
4: vmbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
5: vnet01: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000
$ ip a
10: tap101i0: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master fwbr101i0 state UNKNOWN group default qlen 1000
        link/ether ca:4f:38:02:d5:0c brd ff:ff:ff:ff:ff:ff
11: fwbr101i0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
        link/ether 02:cc:3c:f9:33:80 brd ff:ff:ff:ff:ff:ff
12: fwpr101p0@fwln101i0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master vnet01 state UP group default qlen 1000
        link/ether 0a:ba:b9:cd:52:e0 brd ff:ff:ff:ff:ff:ff
13: fwln101i0@fwpr101p0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master fwbr101i0 state UP group default qlen 1000
        link/ether 02:cc:3c:f9:33:80 brd ff:ff:ff:ff:ff:ff

次回、テンプレートVMからTerraformを使って、ProxmoxにVMを作成するメモを残す予定。

http.Handleとhttp.HandleFuncの整理

Golangの標準ライブラリであるnet/httpを使っていると、http.Handleとhttp.HandleFunc、Handler、HandlerFuncとがあって、ごっちゃになってしまうので、自分なりに整理をした。

  • net/httpライブラリを使ってサーバを起動する(http.ListenAndServe)と、デフォルトのマルチプレクサー;mux(ルーター)が生成される
  • このmuxに対してURLパスとHTTPハンドラを登録することで、リクエストを受けたりレスポンスを返したり出来る。登録する仕組みとしては、
    • http.Handle(pattern string, handler Handler)
    • http.HandleFunc(pattern string, handler func(ResponseWriter, *Request))
  • の2つが用意されている
  • この2つの違いは、引数にHandlerインターフェイスを受け取るか、HandlerFunc型を受け取るかの違いでしかない
  • まず、Handlerインターフェイスの定義は、以下の通りServeHTTPメソッドだけが定義されている
type Handler interface {
    ServeHTTP(http.ResponseWrite, *http.Request)
}
  • 次にHandlerFunc型は関数型であり、以下のように定義されている。
  • type HandlerFunc func(ResponseWriter, *Request)
  • そして、HandlerFunc型にはServeHTTPメソッドが定義されている。
    • このServeHTTPは、レシーバで受け取ったHandlerFunc型を返すだけのメソッドとなっている。
func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) {
  f(w, r)
}
  • したがって、HandlerFunc型と同じシグネチャを持つ任意の関数MyFuncをhttp.HandlerFunc(MyFunc)のようにキャストすると、MyFuncに対してHandlerFuncが持つメソッドServeHTTP()が実装される。
    • func MyFunc(w http.ResponseWriter, r *http.Request) {// do something }
    • MyHandler := http.HandlerFunc(MyFunc)
  • 結果、暗黙的にHandlerインターフェイスを実装する(満たす)ことになる。よって、myFuncは、Handlerインターフェイス型として扱えるので、http.Handleの第2引数として渡せる。
    • http.Handle("/myfunc", MyHandler)
  • じゃあ、この二つの使い分け方はどうするのか?という点だけど、力尽きてしまったのでChatGPTに聞いてみると次のような簡潔な回答を得られた。

使い分け方
- シンプルなハンドラーが必要な場合、または匿名関数で簡潔に処理を記述したい場合は、http.HandleFuncを使用します。
- 状態を持つハンドラーや、複数のメソッドやロジックを持たせたカスタムハンドラーが必要な場合には、http.Handleを使い、構造体やカスタム型を渡すことで柔軟に実装します。
まとめ
- http.HandleFunc: 関数を簡単にハンドラーにしたいときに便利。
- http.Handle: http.Handlerインターフェースを満たす型をハンドラーとして登録し、より複雑な処理を行いたいときに使います。