Plan 9とGo言語のブログ

主にPlan 9やGo言語の日々気づいたことを書きます。

GitHub ActionsでC言語のコードをクロスコンパイルする

GitHub ActionsではARM64ランナーも公開されつつありますが、ここでは gcc を使ったクロスコンパイルを説明します。この記事ではホスト*1のアーキテクチャを x86_64、ターゲット*2のアーキテクチャを arm64 としていますが、他のターゲットでも同様の手順と…

Goで関数呼び出しを繋げてパイプライン演算子を再現する

Go

最近、Goで関数呼び出しを無限に繋げる書き方を気に入っています。文字で書いても伝わらないと思うので実例を挙げると、例えばこういう書き方。 repeat(yield)("しか", 1)("のこ", 3)("こし", 1)("たん", 2) どうやって実現しているのかというと、自身を参照…

Plan 9とInfernoにおけるtar(1)の変化

小ネタです。以下の記事を読んでいて、 tar(1) はなぜオプション引数にハイフンが不要なのか? 続・tar(1) はなぜオプション引数にハイフンが不要なのか?―tarとkey argumentsの起源を更に辿る なぜ不要なのかは元記事を読んでもらうといいのだけど、ここで…

Goでモンキーパッチするライブラリを作った

Go

Goで単体テストを実装する場合、動的な言語のように「テスト実行中に外部への依存を置き換える」といったことはできません。代わりに、 外部への依存を引数で渡す 外部への依存をインターフェイスで渡す のように、テスト対象をテスト可能な実装に変更してお…

Go製バイナリを配布するためのGitHubワークフロー

前置き 以前、BuildInfoからバージョンを取得する方法を紹介しました。 blog.lufia.org go installで正規の公開されたバージョンをインストールした場合は、以下の出力においてmodの行が示すように、sum.golang.orgでチェックサム等が検証されてバイナリのメ…

Steamクライアントが起動しなくなっていた

2024年2月ごろにSteamクライアントを更新してから、以下のログで停止して起動しなくなっていました。 $ flatpak run com.valvesoftware.Steam ... Steam Runtime Launch Service: starting steam-runtime-launcher-service Steam Runtime Launch Service: st…

Titan Security Keyの新しいバージョンがPasskeysに対応していた

2FA

Titan Security Keyがパスキーに対応していたようですが、Google Storeの製品ページを見ても、それがパスキー対応したバージョンのTitan Security Keyなのか分からなくて混乱しました*1。ストア上では全部同じ名前でバージョン表記も無いし、国内販売が遅れ…

Goで非推奨(Deprecated)や撤回(Retracted)を明示する方法

Go

最近のGoには、関数やパッケージを非推奨と扱う方法があります。まとまっていると便利かなと思うので、種類ごとにまとめてみました。GoDocコメントを多用するので、GoDocを書き慣れていない場合は以下も参考にしてください。 blog.lufia.org 関数と型を非推…

GitHub ProjectsのTracksとTracked byを設定する

GitHub ProjectsにはTracksフィールドとTracked byフィールドがあります。 フィールド選択のところで確認できます これらのフィールドは、新しいタスクリストでissueやプルリクエストを追加すると追跡の対象となります。 ```[tasklist] ## Tasks - [ ] #1234…

systemd-homed環境でユーザーにログインできなくなる原因と対処

ここ数年はLinuxデスクトップで生活しているが、たまにユーザー環境へログインできなくなることがあった。 症状 これまで何の問題もなく動いていたが、再起動した後に突然ログインできなくなる。gdm を使っているけれども、パスワード入力のあと何のエラーも…

Goの型パラメータを使って型付きバリデータを作っている

Go

型パラメータ(generics)とerrors.Joinを使ってバリデータを作っています。 github.com 経緯 Goで値のバリデーションを行う場合、有名なライブラリには以下の2つがあります。 go-playground/validator go-ozzo/ozzo-validation go-playground/validator はよ…

GitHubの複数リポジトリで共通したワークフローを(ある程度)まとめて管理する

TL;DR Reusable workflowにタグを付けて、参照する側のリポジトリはDependabotなどで更新するといいと思う リポジトリごとにDependabotのプルリクエストをマージする手間は必要になる GitHub Actionsのscheduleトリガーでcron式を書けるが、60日以上更新がな…

Goでホスト名とポート番号の操作をするときはnetパッケージの関数が使える

Go

標準のnetパッケージには、ホスト名とポート番号を操作する関数がいくつか用意されていますが意外と知られていないようなので、便利だけどあまり知られていない関数を3つ紹介します。 TL;DR Goで、pathの結合はfilepath.Joinを使えというのは広まっている気…

Goで実装したアプリケーションのメトリックをOpenTelemetryで計装する

これはOpenTelemetry Advent Calendarの14日目です。 qiita.com どんな話がいいかなと考えていたのですが、ここでは「アプリケーションとOpenTelemetry Collectorがどのように関わってメトリックを(Prometheusなどの)バックエンドサービスに送信するのか」を…

Linux版のSteamでWindowsのゲームをする話(主にGNOME+Wayland環境)

最近、SteamをLinuxにインストールしてWindowsのゲームを遊んでいます。Steamのインストール自体はそんなに困ることはありませんでしたが、コントローラーやパフォーマンスのところでいくつか悩んだところがあったので忘れないように記事にします。グラフィ…

Goフォントの紹介と使い方

Goのソースコードをきれいに描画する目的で作られた「Goフォント」があるのをご存じでしょうか。周囲に聞いたところ、あまり知られていなかったので、紹介の意味も込めてインストール方法を書きます。 Goフォント Goフォントは、2016年に以下の記事で公開さ…

Goのコードを書きながらAcmeエディタの基本を覚えるチュートリアル

AcmeエディタはPlan 9のためにRob Pikeによってデザインされたエディタで、現在はUnixにも移植されています。慣れると非常に快適なんですが、既存のエディタとは操作感が全然違うので、初見では何をすればいいのか分からないとよく聞きます。なので、この記…

Arch LinuxでTPM2.0デバイスを使って暗号化したボリュームのパスフレーズ入力を省略する

以前の記事で、ルートファイルシステムを暗号化する手順を紹介しました。 blog.lufia.org ルートとなるボリュームを暗号化すると、再起動のたびにパスフレーズの入力を促されますが、何度も入力するのは面倒です。そこで、TPMデバイスに鍵を保存してパスフレ…

業務端末としてLinuxデスクトップを使うために設定したこと

2021年の11月に、業務端末としてDELL XPS 13を購入して、Linuxデスクトップに移行しました。いまでは快適に使えるようになりましたが、Linuxデスクトップに慣れていないこともあって思ったように動かず困ったところがあったので、導入にあたって悩んだところ…

I/O errorでユーザーにログインできなくなった

普段使っているユーザーでLinuxデスクトップにログインできなくなった。正しいパスワードを入力すると画面が1秒程度切り変わるけど、すぐディスプレイマネージャのログイン画面に戻ってしまう状態だった。 エラーの内容を調べる rootではログインできたので…

Gitで9legacyのパッチを管理する

9legacyは「ベル研Plan 9最終版からのパッチ集」という位置付けです。更新がある場合、基本的には新しいパッチが追加されていきますが、パッチにバグがあった場合などはパッチ自体が更新されることもあります。そのため、手元の環境にパッチを適用したあと、…

Goの型や関数定義を検索するコマンド

9fansを見ていると、Rob Pike氏が、Goの型定義や関数定義を検索するコマンドを紹介していた。 [9fans] Codebase navigation and using tags files in acme 実装 上記によるとコマンドは4つ。 bin/f カレントディレクトリにあるソースコードから関数定義をgre…

labstack/echoのv4.6でRequestLoggerWithConfigを使う

Go

labstack/echoには、以前から middleware.LoggerWithConfig が存在していて、リクエストログのカスタマイズがある程度は可能でした。公式のLogger Middlewareドキュメントより引用します。 e.Use(middleware.LoggerWithConfig(middleware.LoggerConfig{ Form…

NodeJS+TypeScriptのchild_processモジュールで非同期にコマンドをパイプする

さいきん業務ではReactを使っていて、フロントに対する苦手意識も減ってきたので、いろいろ実験するための環境として自サイトをNextJSのSSGで生成するようにしたのですが、このとき、もともとはPlan 9のmkfileでリソースを管理していた事情もあって、NodeJS+…

Plan 9 CのARGBEGIN、ARGENDマクロ

Plan 9のCは独自のライブラリを持っていて、stdio.hのようなANSIライブラリもAPE(ANSI/POSIX Environment)として存在してはいるが、基本的にはPlan 9独自のライブラリを使う方が好まれる。ANSI Cとの違いは挙げればいくつもあるのでPlan 9 Cを知らない人には…

systemd-logindにSuspend key pressedと記録されてサスペンドする問題とthermal-conf.xmlの書き方

12インチMacBookにLinuxをインストールして使っていたが、負荷が上がったときにMacBookがサスペンドする問題に困っていた。サスペンドが発生した時刻には、systemd-logindのログに systemd-logind[299]: Suspend key pressed. のようなイベントが記録されて…

FIDO U2Fセキュリティキーを使ってSSHする

2FA

今年の5月に、GitHubがFIDO U2Fセキュリティキーを利用したSSH接続に対応したので、手元にあったTitan Security Keyで試してみました。 Security keys are now supported for SSH Git operations | The GitHub Blog Titan Security Keyを買ったときの話はこ…

デスクトップ環境をKDE 5 Plasmaデスクトップに変更した

先月の記事ではGNOMEをインストールしましたが、KDE 5 Plasmaデスクトップの方が見た目も操作感も好みだったので変更しました。WebブラウザとターミナルとPlan 9ツールの利用が主な使い方なので、どれを使ってもそんなに変わらないのですが。 KDE - ArchWiki…

12インチMacBookにArch Linuxをインストールした

手元のデスクトップ環境をLinuxに切り替えました。2009年頃からmacOS(当時はMac OS X)を使っていたけど、QEMUやFUSEを不自由なく使える方がPlan 9との相性が良いので、Linuxの方がいいかなと思ったのでした。 やったこと MacBook10,1 (Retina, 12-inch, 2017…

Plan 9の権利がPlan 9財団に譲渡され、MITライセンスに変わりました

2021年3月23日に、ノキアから、Plan 9の著作権をPlan 9財団に譲渡する発表がありました。 www.bell-labs.com 翻訳はこちら。 okuranagaimo.blogspot.com 元々、AT&Tの一部門が独立してLucent Technologiesとなっていて、ベル研はそこに含まれていたけれども…