kkato.dev

Hi there 👋

Welcome to my website!

Vim Tips

移動 キー 説明 } / { 次/前の空行へ移動 % 対応する括弧へ移動 * / # カーソル下の単語で前方/後方検索 f{char} / F{char} 行内で指定文字へ移動 t{char} / T{char} 行内で指定文字の手前へ移動 Operator と Text Object Operator 説明 c change d delete y yank v visual Text Object は i(inner: 内側のみ)と a(a: 囲み文字も含む)の2種類がある。 Text Object 説明 iw 単語の内側 aw 単語 + 周囲の空白 i" "..." の内側 a" "..." 全体(引用符含む) i( (...) の内側 a( (...) 全体(括弧含む) i{ {...} の内側 a{ {...} 全体(波括弧含む) it HTMLタグの内側 at HTMLタグ全体(タグ含む) 例 説明 ciw 単語を削除して挿入モード di" ダブルクォート内を削除 ya( 括弧ごとコピー 参考文献 なれる! Vimmer

February 1, 2026 · Ken Kato

nvim-treeの操作コマンド

nvim-tree キー 動作 <Space>e ツリー開閉 <Space>o 現在のファイルを表示 g? ヘルプ <CR> / o 開く <C-v> 垂直分割で開く <C-x> 水平分割で開く <C-t> タブで開く a 作成 d 削除 r リネーム x / c / p 切り取り / コピー / 貼り付け ペイン操作 キー 動作 <C-w>h/j/k/l 左/下/上/右へ移動 <C-w>c 閉じる <C-w>o 他を全て閉じる <C-w>= 均等サイズ タブ操作 キー 動作 gt / gT 次/前のタブ :tabnew 新規タブ :tabclose タブを閉じる キー表記 表記 意味 <C-x> Ctrl + x <CR> Enter <leader> スペース

February 1, 2026 · Ken Kato

日報を学びのツールにする

現職になってから、日報を学びのツールとして活用することを意識しています。1on1などで今のフェーズで課題となっている箇所を特定し、日報で振り返ることで、成長を加速させることを狙っています。 期待値のずれを認識する 仕事は依頼者(上長や同僚、他チームのメンバー)からの期待値があり、それを超えていくことが求められます。ただ、初めは依頼者の期待値とずれてしまうことが多かったため、当時の上長からまずは期待値のずれを認識することを勧められました。 具体的には以下の点を日報に記載していきました。 人との期待値がずれていた点 なぜ期待がずれていたのか考える 具体例 Aさんにお願いされたタスクで、とりあえず指示を待てば良いと思っていたが、Aさんは自分から提案してほしいと思っていた。事前に期待値をすり合わせておけばよかった Bさんは10分くらいで終わると思っていたが、実際には30分かかった。事前に前提や既にわかっている情報をヒアリングしておけばもっと早く終わったかもしれない 技術的な疑問を書き留める 私の同僚はタスクに関連する技術について、その周辺まで調べてから進めます。私以上に時間がかかることもありますが、次に同じことをやるときや少し違うことをやるときに応用が効き、結果として仕事が早く進むことが多く見られました。一方、私は分からないものがあってもタスクと関係ないからと放置してしまうことが多く、結局応用が効かずに時間がかかってしまうことがありました。 仕事中に「なんでこうなってるんだろう?」「これってどういう意味があるんだろう?」と思った小さなことでも書き残します。それについて調べて答えを日報に書きます。場合によっては、日報を見てくれている人が教えてくれることもあります。 【今日の疑問】 Goのiotaって何? → 連番を自動生成する。const宣言で使う kubectl applyと kubectl createの違いは? → 未調査

January 29, 2026 · Ken Kato

Kubernetesをv1.30からv1.31にアップグレードした

自宅で運用しているKubernetesクラスターをv1.30からv1.31にアップグレードしました。 kubeadmを使った標準的なアップグレード手順ですが、忘れがちなので備忘録として残しておきます。 公式ドキュメント: https://kubernetes.io/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/ コントロールプレーンノードのアップグレード コントロールプレーンノードから順番にアップグレードしていきます。 パッケージリポジトリの変更 まず、yumリポジトリの設定ファイルをv1.31用に変更します。 変更前(v1.30): [kkato@nuc01 ~]$ cat /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://pkgs.k8s.io/core:/stable:/v1.30/rpm/ enabled=1 gpgcheck=1 gpgkey=https://pkgs.k8s.io/core:/stable:/v1.30/rpm/repodata/repomd.xml.key exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni 変更後(v1.31): $ cat /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://pkgs.k8s.io/core:/stable:/v1.31/rpm/ enabled=1 gpgcheck=1 gpgkey=https://pkgs.k8s.io/core:/stable:/v1.31/rpm/repodata/repomd.xml.key exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni 参考: https://kubernetes.io/docs/tasks/administer-cluster/kubeadm/change-package-repository/ kubeadmのアップグレード まずkubeadmパッケージをアップグレードします。 sudo yum upgrade kubeadm --setopt=disable_excludes=kubernetes アップグレード可能なバージョンを確認します。 sudo kubeadm upgrade plan Components that must be upgraded manually after you have upgraded the control plane with 'kubeadm upgrade apply': COMPONENT NODE CURRENT TARGET kubelet nuc01 v1.30.1 v1.31.14 kubelet nuc02 v1.30.1 v1.31.14 kubelet nuc03 v1.30.1 v1.31.14 kubelet nuc04 v1.30.1 v1.31.14 Upgrade to the latest stable version: COMPONENT NODE CURRENT TARGET kube-apiserver nuc01 v1.30.4 v1.31.14 kube-controller-manager nuc01 v1.30.4 v1.31.14 kube-scheduler nuc01 v1.30.4 v1.31.14 kube-proxy 1.30.4 v1.31.14 CoreDNS v1.11.1 v1.11.3 etcd nuc01 3.5.12-0 3.5.24-0 You can now apply the upgrade by executing the following command: kubeadm upgrade apply v1.31.14 アップグレードを実行します。 ...

January 24, 2026 · Ken Kato

GORMの基本的な使い方

最近、Goを勉強していてGORMを触る機会があったので、基本的な部分を調べてみました。 モデル定義 GORMでは構造体をそのままテーブルにマップします。gorm.Modelを埋め込むとIDやCreatedAtなど便利なカラムが自動で付きます。 package main import "gorm.io/gorm" type User struct { gorm.Model Name string Email string `gorm:"uniqueIndex"` Age uint } DB接続とマイグレーション PostgreSQLを例に、DBへ接続し、モデルに沿ってテーブルを自動生成します。dsnは環境に合わせて書き換えてください。 package main import ( "log" "gorm.io/driver/postgres" "gorm.io/gorm" ) func main() { dsn := "host=localhost user=postgres password=postgres dbname=app port=5432 sslmode=disable" db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{}) if err != nil { log.Fatal(err) } // モデルに合わせてテーブルを作成・更新 if err := db.AutoMigrate(&User{}); err != nil { log.Fatal(err) } } CRUD操作 基本的なCRUD操作は以下のように行います。 package main import ( "fmt" "log" "gorm.io/driver/postgres" "gorm.io/gorm" ) type User struct { gorm.Model Name string Email string `gorm:"uniqueIndex"` Age uint } func main() { dsn := "host=localhost user=postgres password=postgres dbname=app port=5432 sslmode=disable" db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{}) if err != nil { log.Fatal(err) } if err := db.AutoMigrate(&User{}); err != nil { log.Fatal(err) } // CREATE: レコードを追加 alice := User{Name: "Alice", Email: "alice@example.com", Age: 28} if err := db.Create(&alice).Error; err != nil { log.Fatal(err) } // READ: 1件取得(主キーまたは条件指定) var user User if err := db.First(&user, "email = ?", "alice@example.com").Error; err != nil { log.Fatal(err) } fmt.Printf("found: %+v\n", user) // UPDATE: 1カラム更新(モデルを指定) if err := db.Model(&user).Update("Age", 29).Error; err != nil { log.Fatal(err) } // DELETE: ソフトデリート(DeletedAtにタイムスタンプが入る) if err := db.Delete(&user).Error; err != nil { log.Fatal(err) } } よく使うクエリの書き方 // 条件付きで複数取得 var users []User db.Where("age >= ?", 25).Order("age desc").Limit(5).Find(&users) // 複数カラムをまとめて更新 db.Model(&user).Updates(map[string]interface{}{ "Name": "Alice Updated", "Age": 30, }) 参考 GORM Official Guides GORM PostgreSQL Driver

January 17, 2026 · Ken Kato