'sqr'atch-note

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

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インターフェースを満たす型をハンドラーとして登録し、より複雑な処理を行いたいときに使います。

素のKVMからProxmox VEへ乗り換えた

  • M75q-TinyにRHEL 9をインストールして、KVMホストとして動作させていたが、仮想ネットワーク周りでトラブルがあり、これを解決するよりもProxmoxに乗り換えた方が楽なのでは?と思い、破壊的衝動に駆られ、Proxmoxに乗り換えた
    • なぜか分からないが、仮想マシンが起動して、vnicが作られているのに仮想マシンに割り当てられておらず、手動で割り当てようにも接続先の選択肢として表示されず 、どうにもならない状態になってしまった
    • 仮想ネットワーク周りが壊れるよりも前に、WebコンソールのCockpitダッシュボードが壊れて表示できなくなっていたので、そういうのも乗り換えの一因にある
  • Proxmox VEを触った感じ、個人用途で仮想環境が欲しいなら、Proxmox VEが簡単で十分だなと思った
    • インストールは簡単で、初期設定(VLAN設定、データストア設定)や仮想マシンの管理も全部ブラウザから出来て、便利
    • それに、無料版のESXiも無くなったので、もう仮想環境を作る選択肢として、素のKVMかProxmox VEの2択しかない気がする。であれば、Proxmoxの一択かなと
    • vSphereに慣れていると、はじめProxmoxの仕組みになれず、奇妙なやっちゃなーって思ったりはしたが、分かってしまえば非常に使いやすい。それに、仕組みが分かってしまえば、素のKVMを触るより100倍くらい楽だなと思った

『つくって、壊して、直して学ぶ Kubernetes入門』読んだ

www.shoeisha.co.jp

  • 「壊して、学ぶ」というのは非常に面白いテーマだと思ったので、興味引かれて買ってみた
  • Kubernetes(k8s)という言葉は知ってるけど、どういうもなのか分からないという人が読むと良さそうな入門書
  • k8sアーキテクチャについては、全体像が載っているくらいで、あまり解説はされていないので、アーキテクチャを含めて理解したいという場合は、本書では足りないと思う
  • k8sを少しでも触ったことのある人にとっては、壊す部分が物足りない気がした
    • 個人的には物足りなかった
  • 初心者だとk8sが壊れたときに、どう対処したら良いか分からないって場合があると思うし、この本では対処の”型”がハンズオン形式で学べる
    • k8sの解説書は数多くあるとは思うけど、障害時の対応について特化した本は無いようにも思うので、そういう意味では非常に有用な本かもしれない
  • 本書を読んだ後、より詳しく知りたい人のための読書紹介や学習ロードマップもあるので、入門書としては丁寧な作りになってると思う

REALFORCE RC1は結構良さそう

pc.watch.impress.co.jp

  • REALFORCE RC1は、個人的には結構理想型のキーボードな感じがする
  • 打ち心地が良いREALFORCEキーのコンパクトキーボードであり、アローキーがある。そして、本体重量が0.6kg
    • ケーブルがL字コネクタになってるのは分かってる感があって良い
  • コンパクトキーボードの有名どころとしてHHKBがあるけど、HHKBの場合は日本語配列にはアローキーがあるのに、US配列には存在しないので、厳しい
    • HHKB studioの打鍵感は非常に良かった分、アローキーがないので使っていて不便だった
  • ただ、REALFORCE RC1のマイナスポイントとして、電源がリチウムイオンバッテリーという点がある
    • ポータビリティ性を高めたかったんだろうけど、キーの寿命よりも短いであろうバッテリーを本体に内蔵するというのは如何なものなのだろう
    • 同じことを懸念して、結局乾電池を使うようにしたというHHKB studioの開発者インタビューがあった気がするので、余計に気になってしまう
    • まあ持ち運んで使うって言うケースは、ぼくは殆ど無いので、ずっとケーブルに接続した状態で使うから、バッテリーがどうとかはどうでもいいポイントかもしれない
  • とはいえ、KeychronキーボードのK3シリーズがかなり個人的に気に入ってるので、REALFORCE RC1が3万5千円という値段もあり、今回は即購入にはならず