dot ファイル 2022年版

現状の dot ファイルのたぐいをメモするついでに人に見せる形でまとめておこうと思う。

自分の思想として「フレームワークよりライブラリー」というのがあるので、プロシージャーの形で定型処理をまとめておいて実際の dot ファイルはプロシージャーを呼び出すようにしている。

github.com

Bash

Linux ではデフォルトのことが多い Bash を使っている。

リポジトリーをクローンしてきたところに各種 example を置いてあるので、それをコピーしてきて随時そのマシンに合わせて書き換える。

cd

mv .profile .profile.back
mv .bashrc .bashrc.back
mv .bash_logout .bash_logout.back

dot_files='path/to/this/repo'
cp "$dot_files/bash/.bash_profile.example" .bash_profile
cp "$dot_files/bash/.bashrc.example" .bashrc
cp "$dot_files/bash/.bash_logout.example" .bash_logout

# edit .bash_profile .bashrc .bash_logout

.bash_profile

.bash_profile はこんな感じ。

# dotfiles リポジトリーのディレクトリーを指定する
dot_files=.

# ここでプロシージャーを定義してあるライブラリーをロードする
# shellcheck source=/dev/null
source "$dot_files/sh/lib.sh"
# shellcheck source=/dev/null
source "$dot_files/bash/lib.bash"

# ~/.bin とかを PATH に追加
add_local_bin

# shellcheck source=/dev/null
source "$HOME/.bashrc"

# X 環境なら
setup_sands

# SSH エージェントを起動
# WSL2 の場合は Windows で起動してあるエージェントにつなぎに行くようにしてある(が、ちょっとバグってる
# くわしくは https://kakkun61.hatenablog.com/entry/2022/06/28/WSL2_%E3%81%AE_SSH_Agent_%E7%9B%86%E6%A0%BD
start_ssh_agent
# start_ssh_agent_wsl

# もろもろ設定のための環境変数の定義
setup_gpg

setup_git_env

setup_saml2aws

.bash_logoutSSH エージェントの後始末だけ。

.bashrc

.bashrc はこんな感じ。

# この辺は .bash_profile と一緒
dot_files=.

# shellcheck source=/dev/null
source "$dot_files/sh/lib.sh"
# shellcheck source=/dev/null
source "$dot_files/bash/lib.bash"

# もろもろ設定
# 環境変数の定義したり eval したり source したり
setup_nix

setup_less

setup_prompt "$dot_files"

setup_dircolors

setup_bashmarks "$dot_files"

setup_fuck

setup_bash_config

setup_ls

setup_shellcheck

setup_direnv

setup_git_completion "$dot_files"

使ってるツール

あんまり多くは使ってないが使ってるのは次のような感じ。

  • fuck
    • 「それはまちがいだからこう実行しなおしてね」というエラーのときに fuck と打てばよくなる
  • direnv
    • nix と連携してる
  • nix
    • バージョン違いの C ライブラリーとかインストールして管理できる
  • shellcheck

PowerShell

しごとでないときは WindowsPowerShell を使っている。

PowerShell には標準でパッケージマネージャーが付いてくるので外部ライブラリーを入れるのが簡単。

[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidUsingInvokeExpression', '', Justification = 'For the fuck')]

param ()

# dotfiles リポジトリーのディレクトリーを指定する
$dotFiles = '.'

# 自前ライブラリーをインポート
. $dotFiles\pwsh\lib.ps1

# 外部ライブラリーをインポート
Import-Module Posh-Git
Import-Module posh-sshell
Import-Module PSBookmark
Import-Module psake
Import-Module ghcman
Import-Module path-switcher
Import-Module code-page

Import-DotenvModule

# SSH エージェントの起動
Start-SshAgent -Quiet

# 環境変数の設定とかローカルの ps1 ファイルのインポートとか
Initialize-Chocolatey
Initialize-Python

# the fuck
Invoke-Expression "$(thefuck --alias)"

# prompt
Set-Item -Path Function:\prompt -Value (Get-Prompt) -Options ReadOnly

# arduino
. $dotFiles\lib\arduino-cli\completion.ps1

使ってるツール

  • Posh-Git
    • プロンプトに Git の情報を表示したり
  • posh-sshell
    • SSH エージェントの管理
  • PSBookmark
  • psake
  • ghcman
    • GHC の管理(自作)
  • path-switcher
    • PATH の管理用ユーティリティー(自作)
  • code-page

NixOS

この年末年始に NixOS 機が1つできたのでそれは当然 /etc/nixos/configuration.nix で管理しているが、home-manager までは手が出ていない。

github.com

RSS 監視して Discord に投げるやつを Raspberry Pi で動かした

これをしようとコードを書いた。クロスコンパイルの容易さから Go で書いた。Raspberry Pi 2 Model B で動かしている。

feed-trigger

ひとつめは feed-trigger。

github.com

これは RSS をチェックして更新があると指定されたコマンドの標準入力に新規エントリーのみを含めたフィードを渡して起動するやつ。

discord-feed-post

ふたつめは discord-feed-post

github.com

これは標準入力から取得した RSS フィードを Discord に投稿するやつ。

これらふたつを合わせて cron で1時間に1回起動するようにした。

課題

RSS 2・RSS 1・Atom のどれか(もしくは複数)で失敗している。

wd コマンドをリリースした

wd コマンドって?

これがしたかった。

$ wd ディレクトリー コマンド オプション

とすると「ディレクトリー」をワーキングディレクトリーにして「コマンド」を「オプション」付きで実行する。

pushd でもできるけど popd と合わせるとタイプ数が多かった。

インストール

GitHub のリリースページに WindowsLinuxmacOS (x64) 用のバイナリーがある1

github.com

自分でビルドする場合は cabalghc が必要。

$ make install

気に入ったら GitHub にスターをよろしくね。


  1. GitHub Actions に macOS (ARM) が提供されるとそのバイナリーを追加するつもり。

初めての Modellbahn-Shop Lippe(ドイツ型鉄道模型)

芦屋のモデルバーンに行ったらドイツ国有鉄道(Deutsche Reichsbahn-Gesellschaft)03形蒸気機関車サウンド付きが22000円とびっくりお手ごろ価格だったのでウッカリしてしまった。

www.instagram.com

ESU LokSound v3 搭載の2004年製品のようだが十分に恰好いい。キャブにスピーカーがデデンと鎮座している以外は何も文句がない。デデンなスピーカーだけあって音がいい。

単行も悪くはないが、そうは言っても引かれるものがほしくなってくるというもの。

調べると急行用機関車だそうなので客車を物色する。

ヤフオク!で一等二等合造客車と荷物車のセットがあったので落札。これもちょっと古そうな製品だけど悪くない。2両で税込8635円、送料1130円。

www.instagram.com

ほんでもうちょっと引きたいな~となったのでドイツのお店に発注!界隈で有名な Modellbahn-Shop Lippe

一二三等合造車と三等車と食堂車。実はちょっとまちがえて DRB と略される方の Deutsche Reichsbahn の車両なのでちょっと時代が違うがまあよかろう1。それぞれ54.54ユーロ、送料35ユーロ。

www.instagram.com

8月1日15時に発注して着荷は8月8日午前だった。早い。

最後に走行シーン。

www.instagram.com

ほな!


  1. 1924-1937 はドイツ国有鉄道(Deutsche Reichsbahn-Gesellschaft)、1937-1945 はドイツ帝国鉄道(Deutsche Reichsbahn)。

Windows で Haskell SDL2

Hackage にある SDL2 ライブラリーを Windows で利用する方法のメモ。

hackage.haskell.org

Haskell-jpSlack の質問をきっかけに手元で試したことを思い出しながら書いている。

sdl2.cabal に下記の記述があるので C ライブラリーを事前にインストールする必要がある。

    pkgconfig-depends:
      sdl2 >= 2.0.6

今回は stack に附属する MSYS2 を利用する。

stack exec -- pacman -S mingw64/mingw-w64-x86_64-SDL2 でインストールできるはずだが、MSYS2 パッケージメンテナー入れ替えの影響で証明書のインストールをしないと次のようにエラーになることがある。

> stack exec -- pacman -S mingw-w64-x86_64-SDL2
…
error: mingw-w64-x86_64-mpfr: signature from "David Macek <david.macek.0@gmail.com>" is unknown trust
…
error: failed to commit transaction (invalid or corrupted package (PGP signature))
Errors occurred, no packages were upgraded.

MSYS2 のサイトに解決手順が書いてあるのでその通りにする。

www.msys2.org

そうすると stack exec -- pacman -S mingw64/mingw-w64-x86_64-SDL2 が成功する。

pkg-config 自体がインストールされてなかったので stack -- exec pacman -S mingw64/mingw-w64-x86_64-pkg-config でインストールする。

これで使用できるはずなので試してみる。

GitHub 上のリポジトリーに examples があるのでこれを実行する。

github.com

clone してきたディレクトリーで stack init して stack プロジェクトにする。

examples は無効になっているので下記のように stack.yaml を改変して有効にする。

- # flags: {}
+ flags:
+   sdl2:
+     examples: true

ビルドする。

> stack build
…
sdl2> copy/register
Installing library in C:\Users\kazuki\Projects\Sub\haskell-game\sdl2\.stack-work\install\723b28be\lib\x86_64-windows-ghc-9.0.2\sdl2-2.5.3.3-LQ1fiw2pm1OGrmM1xeYJnd
Installing executable twinklebear-lesson-01 in C:\Users\kazuki\Projects\Sub\haskell-game\sdl2\.stack-work\install\723b28be\bin
Installing executable lazyfoo-lesson-15 in C:\Users\kazuki\Projects\Sub\haskell-game\sdl2\.stack-work\install\723b28be\bin
Installing executable lazyfoo-lesson-14 in C:\Users\kazuki\Projects\Sub\haskell-game\sdl2\.stack-work\install\723b28be\bin
Installing executable twinklebear-lesson-04 in C:\Users\kazuki\Projects\Sub\haskell-game\sdl2\.stack-work\install\723b28be\bin
Installing executable lazyfoo-lesson-01 in C:\Users\kazuki\Projects\Sub\haskell-game\sdl2\.stack-work\install\723b28be\bin
Installing executable lazyfoo-lesson-08 in C:\Users\kazuki\Projects\Sub\haskell-game\sdl2\.stack-work\install\723b28be\bin
Installing executable lazyfoo-lesson-09 in C:\Users\kazuki\Projects\Sub\haskell-game\sdl2\.stack-work\install\723b28be\bin
Installing executable userevent-example in C:\Users\kazuki\Projects\Sub\haskell-game\sdl2\.stack-work\install\723b28be\bin
Installing executable lazyfoo-lesson-05 in C:\Users\kazuki\Projects\Sub\haskell-game\sdl2\.stack-work\install\723b28be\bin
Installing executable lazyfoo-lesson-03 in C:\Users\kazuki\Projects\Sub\haskell-game\sdl2\.stack-work\install\723b28be\bin
Installing executable lazyfoo-lesson-17 in C:\Users\kazuki\Projects\Sub\haskell-game\sdl2\.stack-work\install\723b28be\bin
Installing executable lazyfoo-lesson-02 in C:\Users\kazuki\Projects\Sub\haskell-game\sdl2\.stack-work\install\723b28be\bin
Installing executable audio-example in C:\Users\kazuki\Projects\Sub\haskell-game\sdl2\.stack-work\install\723b28be\bin
Installing executable lazyfoo-lesson-07 in C:\Users\kazuki\Projects\Sub\haskell-game\sdl2\.stack-work\install\723b28be\bin
Installing executable lazyfoo-lesson-10 in C:\Users\kazuki\Projects\Sub\haskell-game\sdl2\.stack-work\install\723b28be\bin
Installing executable lazyfoo-lesson-04 in C:\Users\kazuki\Projects\Sub\haskell-game\sdl2\.stack-work\install\723b28be\bin
Installing executable lazyfoo-lesson-19 in C:\Users\kazuki\Projects\Sub\haskell-game\sdl2\.stack-work\install\723b28be\bin
Installing executable lazyfoo-lesson-43 in C:\Users\kazuki\Projects\Sub\haskell-game\sdl2\.stack-work\install\723b28be\bin
Installing executable twinklebear-lesson-02 in C:\Users\kazuki\Projects\Sub\haskell-game\sdl2\.stack-work\install\723b28be\bin
Installing executable eventwatch-example in C:\Users\kazuki\Projects\Sub\haskell-game\sdl2\.stack-work\install\723b28be\bin
Installing executable lazyfoo-lesson-11 in C:\Users\kazuki\Projects\Sub\haskell-game\sdl2\.stack-work\install\723b28be\bin
Installing executable lazyfoo-lesson-12 in C:\Users\kazuki\Projects\Sub\haskell-game\sdl2\.stack-work\install\723b28be\bin
Installing executable lazyfoo-lesson-13 in C:\Users\kazuki\Projects\Sub\haskell-game\sdl2\.stack-work\install\723b28be\bin
Installing executable twinklebear-lesson-04a in C:\Users\kazuki\Projects\Sub\haskell-game\sdl2\.stack-work\install\723b28be\bin
Installing executable lazyfoo-lesson-18 in C:\Users\kazuki\Projects\Sub\haskell-game\sdl2\.stack-work\install\723b28be\bin
Installing executable twinklebear-lesson-05 in C:\Users\kazuki\Projects\Sub\haskell-game\sdl2\.stack-work\install\723b28be\bin
Registering library for sdl2-2.5.3.3..

実行する。

> stack exec lazyfoo-lesson-43

おわり

WSL2 の SSH Agent 盆栽

この記事を読んでセットアップしたので備忘録として残しておく。

qiita.com

自分の選択はこのチャートの青線で書いたやつにした。

手順

元々「Windows の機能」で OpenSSH をインストールしてある。

Pageant は使ってないので WSL2 も OpenSSH に寄せる。

Linuxsocat を、 Windowsnpiperelay をインストールする。

$ sudo apt install socat
$ choco install npiperelay

~/.bash_profile からこの start_ssh_agent_wsl を呼ぶ。

start_ssh_agent_wsl() {
    if [ -z "$SSH_AUTH_SOCK" ]
    then
        SSH_AUTH_SOCK=$(mktemp -d /tmp/ssh-auth.XXXX)/sock
        setsid socat UNIX-LISTEN:"$SSH_AUTH_SOCK",fork EXEC:'npiperelay -v //./pipe/openssh-ssh-agent',nofork >>/tmp/ssh-agent.log 2>&1 &
        export SSH_AUTH_SOCK
    fi
}

$SSH_AUTH_SOCKUnix ソケットをリッスンして、接続があれば npiperelay を起動し転送する。npiperelay は標準入力を \\.\pipe\open-ssh-agent の名前付きパイプに転送する。\\.\pipe\open-ssh-agentWindows の OpenSSH が待ち受けている。

setsid とか nohup が何かよく分かってない。