mise(rtx)を対話的シェル以外で使うなら大人しくshimsにPATH通した方がいい

asdfコンパチのバージョン管理ツールrtxがmiseにリネームされていた - Acme::AnaTofuZ->new;に続いてmise(rtx)の小ネタ。

miseのセットアップではeval "$(~/.local/bin/mise activate zsh)"のようなものを.zshrcに書くだけで済むのが基本形になっている。 自分が操作しているターミナルで使う分には問題ないのだが、例えばVSCodeがmiseでいれたperlを呼び出したり、タスクランナーでnodeを動かそうとすると、yarn not foundみたいなエラーが出てくる。

これはmiseは他の*envと異なり、環境変数PATHそのものをダイナミックに書き換えることでバージョン管理を行っていることが影響している。 他のenv系はshimsと呼ばれるシェルスクリプトで環境ごとのコマンドを呼び出しており、環境変数PATHはshimsが集まっている場所にだけ通せば良い。 他方miseはmise自身がPATHを書き換えるので、静的にshimsをPATHに通さなくても動く。

これはこれで良いのだが、miseのactivateコマンドのヘルプにもある通りスクリプトで動かそうとすると問題がある

This is only intended to be used in interactive sessions, not scripts.

mise is only capable of updating PATH when the prompt is displayed to the user.

For non-interactive use-cases, use shims instead.

つまり対話的シェル以外の場合はmiseはPATHを通さないので、意図した通りに動かなくなる。 miseはこんなこともあろうかと、shimsのシェルスクリプト自体は作成してくれるので、この場所に大人しくPATHを通せば良い。

すなわち.zshrcを以下のようにすれば良い

eval "$(mise activate zsh)"
export PATH="$HOME/.local/share/mise/shims:$PATH"

こうするとスクリプト実行の場合はshimsが使用され、そうでない普段の対話的シェルの場合はmiseがダイナミックに張り替えたPATHが使われるのでパフォーマンスも問題なく普段の生活ができる。

他になんか楽なソリューションがあるきもするが、まぁ大人しくPATH通しておいたほうが*env系からの移行時には楽だろう。

asdfコンパチのバージョン管理ツールrtxがmiseにリネームされていた

TL;DR

  • asdf互換のRust製のバージョン管理ツールのrtxがmiseにリネームされてるよ
    • brewもrtxではもう入らなくなっている(miseが入る)
    • すでにrtxをbrewで入れていた場合はbrew upgrade時にmiseが自動でインストールされ、rtxが消される
  • rtxにエリアスが貼られてるとかはないので、シェルスクリプト中のrtx表記は一律miseにリネームする必要がある
  • miseの初回起動時にrtxのディレクトリからmiseにマイグレーションが自動で行われる

詳細

いつものようにbrew updatebrew upgradeをしたところ、rtxのコマンドが見つからない系のエラーがでた。 おいおいおいと思ってwhere rtxとかしても本当に消えている。

流石にbrewのupgradeしかしてないので、rtx本体にissueがあるかなと思ってGitHubリポジトリ見に行ったら、もはやリポジトリの名前が変わっていて formerly called "rtx" とか書いてある。名前が変わったっぽい。 github.com

公式サイトも建立されていて結構気合が入っている。

miseで空打ちしたらパスも通ってて、rtx時代にみたコマンドが出てきたので単純に名前が変わっただけっぽい。

❯ mise
The front-end to your dev env

Usage: mise [OPTIONS] <COMMAND>

Commands:
  activate     Initializes mise in the current shell session
  alias        Manage aliases [aliases: a]
  bin-paths    List all the active runtime bin paths
  cache        Manage the mise cache

名前が変わったのはv2024.1.0から。2024/01/03のリリースですね。 github.com

ということでzshrcあたりの設定でrtxって書いてたところをmiseに切り替えてシェルを再実行したところ次のような表示が初回にでた。

mise migrating /Users/anatofuz/.local/share/rtx to /Users/anatofuz/.local/share/mise
mise migrating /Users/anatofuz/.config/rtx to /Users/anatofuz/.config/mise

2回目の実行では出てこなかったので初回でmiseのディレクトリがなければrtxディレクトリを見てマイグレーションしてくれるとかっぽい。

突然名前変わるとびっくりしますが、まぁ名前変える機会は正月くらいかもしれない。

ハッカーズチャンプルー2023に登壇してきました #hcmpl23

先日の2023/10/6 - 2023/10/7に卒業以来3年ぶりに沖縄に帰ってハッカーズチャンプルー 2023に参加してきました。

hackers-champloo.org

地味にその前週にOkinawa.pm(という名の飲み会)のために沖縄に行っていたので、なんと2週連続で沖縄に行ってました。 とはいえOkinawa.pmとハッカーズチャンプルーは全てにおいて優先されるイベントなので2週連続でも行くわけではあります。

前夜祭

id:touba_rumba先輩が受付やってたのが早速在りし日の沖縄っていう感じであまりにも良かったです。k_nishijimaさんやかびさんら沖縄でお世話になったみなさんも居たのがいきなり最高でした。

SAKURA innobase Okinawa は初めて行ったのですが、とても綺麗かつ設備も充実していて良い環境でした。いつか勉強会ここでしたいね。

懇親会では沖縄高専沖縄国際大学の学生さんと喋ったり、懐かしい沖縄のエンジニアのみなさんと話たりしていました。みんな偉くなったり社会にでたりしていてすごい。他には意外なところで弊社と関わりがある方とも話せてなかなかおもしろかった。

本編

本編なのですが今までのハカチャンとは違い応募制だったので、初めてハカチャンの本編トークに応募しました。

京都に引っ越し、社会人となって数年経過したころにハッカーズチャンプルーのリブート話題を聞いたので、「これはハカチャンが休んでいた頃の自分の話をするのがちょうど良いのでは」と思っていたので、自己紹介25分のトークで応募しました。(実際は本業の宝灯桃汁ちゃんのオタクとしての布教活動のためです。)無事採択していただいたので会社の支援でも行くことができました。各方面ありがとうございます。

結果的には2018年に僕がid:motemenさんを呼んでのフルタイム自己紹介に引き続きのフルタイム自己紹介となり、ハカチャンと共にエンジニア人生をやっている感が強くてエモかったですね。

トーク内容はこんな感じで25分のフルタイム自己紹介です。 練習したらオーバーしたので巻きで喋ろうとしたら物理カンファレンス久々によるテンションぶち上げも相まってだいぶ巻きで終わったのが反省点です。

内容としてはここ数年で僕がやってきたことを話そうと思っていたので、発表後にkono先生から「履歴書みたいな話」と言われたのが狙い通りで良かったです。また、Twitterで色々な人から良かったと言っていただいたのも素朴に嬉しかったです。ありがとうございます。

ハカチャン自体はマジで「いつもハッカーズチャンプルー!!!」という感じで最高でした。シングルトラックでトークの間にLTがあり、死んだ話があり、指笛でLTが終了し、ぺんさんのすさまじいコードが出てきて、クロージング芸人が締めるいつもの感じ。これぞホームという感じで最高に楽しかったです。

id:issei_ieくんとかの後輩や、シス管の戦友のmkがいたのが良かったですね。 そして先輩方がこぞって結婚し始めてたのは同窓会感強かったと思います。各位いつでも僕の結婚相手候補の方を紹介してください。

懇親会と二次会では楽しすぎて二次会では学生みたいな飲み方をしたのでまえけん先輩りょっか先輩はありがとうございました....。

布教活動

そういえば学生時代と変わったことに住所と尿酸値の他に推しができたことがあり、各位に推しを布教していました

Tシャツも前夜祭は会社のマークの服で行きましたが、本編は山梨首都化Tシャツで行ってました。これは前夜祭はスライドが無いのでわかりやすい服、本編はトークがあるので本業の服という感じです。最終的にはhtmxのスライドにできたので成功したかもしれない。

ちなみに服装について補足すると神戸空港からの帰りは寒かったので推しのパーカーを着て帰りました。

ということで本業の布教も無事できて、あまりにも最高なカンファレンスでした。来年もやるということなので来年もよろしくお願いします。

推しのVTuberの3分タイマーをReactで作った

これ anatofuz.net

背景

最近(ここ数ヶ月)、自分としては珍しくVTuberのファンをやっている。 珍しくと書いたのは自分は別に今までアイドルファンとかにはなったことがなく、いくつかのVTuberも知っているもののYouTubeのライブを見るとかはしてなかったからだ。最近は珍しく見ている。

最近見ているVTuberは2人ほどいるが、その中に宝灯桃汁がいる。 桃汁ちゃんは山梨ご当地VTuberなので、地元応援的な意味で見始めたが、普通にハジケリストっぽい配信が個人的に好きで今に至る。

そんな中先日の七夕に開催されたリスナーからのお願いを叶える配信でリスナーからの「3分タイマーがほしい」という願いがあり、これに答える形でいい感じのセリフを喋る一幕があった。

www.youtube.com

このボイスは運営によって切り抜かれてショートになった

www.youtube.com

とはいえ3分たったといいつつショートなので10秒くらいで3分たってしまう。

マジで3分たったときにこのボイスが聞きたいのと、基本的にPCで作業をしているので、カップ焼きそばを食べるときにPCからタイマー3分設定するのが毎回大変な課題感が揃ったので、いい感じの3分タイマーをPCから使えるwebアプリの形で作ろうと思った。

ツイートしたところ運営のボスと司令官からも補足されたので本格的に作ることにした。

作ったやつ

anatofuz.net

おもしろ機能

3分タイマーとしては普通に使えるけどいくつかおもしろ機能をいれている

  • 待機BGMを選択可能に
    • プレ配信のときの桃汁ちゃんの「ナリ」が入っているBGMがそこそこ気に入っているのでこれで聞けるように
  • 再生中にCDが回転する
    • 後述するけどviteのデフォルトcssをちょっといじっただけ
  • コナミコマンドに対応している
  • 古のオタクらしくHTMLコメントでAAがでるようにしている

おだいじにって書いてるのはこのとき桃汁ちゃんが運営いれて全員コロナに罹患してたから。

技術スタック

ソースコードはこれ github.com

Vite + React(SWC)をTypeScriptで書いていて、ホスティングサービスはGitHub Pagesを使っている。手軽。

仕事でTypeScript + Reactを書いているけれど、実際仕事じゃないプロダクトを1から書いてみると、意外とReactが書けるようになってることが実感できてよかった。 あとcss苦手マンなのだけど、Viteの初期コードのcssが意外とちゃんとしているので、それを拡張することでアプリケーションの形にもなったのが良かった。ダークテーマ対応と絵をcssで回転させる技術をこれで初めて知る。

シュッと作りたかったのでnpmモジュールをフルで使っている。いれたのはだいたい次らへん

とくにuse-konamiはかなりお手軽にコナミコマンドを実装できたのでよかった。

音源はYouTubeからyt-dlpでmp3データ形式でダウンロードしてAudacityで3分に調整した。Audacity数年ぶりに使ったけどやはりシュッと音声が作れて便利だった。

おもしろ話題

id:anatofuzはマジでCSSが苦手なので勢いで作ったところ、沖縄時代からの友人のろくさいパイセンがPRを送ってくれてだいぶ見た目が改善されるなどした。

感想

思い返せばここ数ヶ月くらいプライベートでコード書いていなくて、仕事でしか書いてなかった。 仕事で書くコードもユーザーに価値を届けられているので虚無に消えているコードを書いている訳では無いのだが、どうしても仕事となると保守性や仕様の妥当性、タスクの段取りなど、素朴にコードを書く楽しみとは別のファクターで頭を使う必要がある。それらの所為というわけではないものの、仕事でコードを書いているとどうしても「楽しい!!!」というよりは「責任」とかの方に意識が向いてしまう。*1

久しぶりに完全趣味のコードを書いて、公開して、会社の人じゃない人からPRをもらったり、Twitterで反応をもらったりする体験だった。 なにかこうエンジニアになろうとした根源的な楽しさを久々に感じられた。こうみると、やはり自分はプログラミングが好きで、それで周りの人とワイワイしたり、自分が面白いと思っているものを作るのが好きなのだなぁというのを再認識できて、技術に対しての最近のモヤモヤが一つ解消できた気がする。

それはそうと桃汁ちゃんのコロナ明け配信は明日なので各自見ましょう。 そろそろデビューして一周年です。

www.youtube.com

*1:楽しく仕事が進められるように段取りを工夫しろと言われればそうなのだが....

golangのenumは型が違うと違うものとして扱われる

タイトルの通りです。

以下のようにint型のFooTypeBarTypeを宣言して、それぞれ60をenumで持つ値をチェックしてみます

package main

import "fmt"

type FooType int
type BarType int

const (
    Hoge FooType = 60
    Nyan FooType = 61
    Baz  BarType = 60
)

var someTypes = []interface{}{
    Hoge,
    Baz,
}

func main() {
    for _, t := range someTypes {

        if t == Baz {
            fmt.Println("same")
        } else {
            fmt.Println("difference")
        }
    }
    if Baz == 60 {
        fmt.Println("Baz is 60")
    } else {
        fmt.Println("Baz is not 60")
    }
}

出力

difference (`Hoge != Baz`)
same (`Baz == Baz`)
Baz is 60 

go.dev

ということでenumに設定した数値をリテラルで比較するとその値として出てくるけれど、enumで同様の値を持つ別の型の値と比較した場合は違う扱いになります。

つまるところgolangでは同じ数値範囲のenumも型を分ければ別物として扱えます。便利ですね。

YAPC::Kyotoの思い出 #yapcjapan

こんにちは。そろそろ京都に引っ越して3年のid:anatofuzです。

先日のYAPC::Kyotoではスタッフをしていました

yapcjapan.org

コアスタッフではあるものの、昨年末から今年にかけて引っ越しがあったり、本業の仕事もなかなか大変で平日は仕事をしてそれ以外のことができない、土日は疲労という感じで身動きが取れない、様々なことが発生してメンタルも死*1という状況が数ヶ月続いてしまい、あまり準備にコミットすることができませんでした。ここはid:papixさんはじめスタッフの皆さんに非常に申し訳なく思っています。

その分準備と当日のスタッフ業こそはちゃんとやろうとしていて、当日は土俵の部屋番長をやっていました。主にslack/twitterで状況を確認しつつ、タイムキープをしながらメンバーと連携していく係です。土俵のスタッフのid:tomcha0079さん、id:nhayatoさん、id:kaoru1615くん方のおかげではあるのですが、スケジュール通りで大変な問題も発生せずに無事おえられて何よりでした。

基本的にはそういったスタッフ業が中心であんまりカンファレンス中は人々と話したりするのがバタバタしていてできなかったのですが、数年ぶりにid:codehex先輩とあったり、大学の戦友のid:unimarimoPerl入学式方面やYAPC::Okinawaでの思い出深いid:note103さん、ずっと憧れであったゆーすけべーさんとお会いすることができて、自分が好きだったYAPC、コミュニティにまた復帰できた感じがしました。特に土俵でトークしていただいたid:ar_tamaさんは、Okinawa.pmでやったYAPC::Okinawaの立ち上げのときに知り合ったこともあり、あらたまさんとYAPCの関連がすごく印象に残っていて、そんなあらたまさんがちょうど自分が今悩んでいたエンジニアのキャリアについて眼の前でトークされているのは、まさにYAPCだな....という感じで感無量でした。

個人的には今回のYAPCではちょっとだけ、恩を返せたかなという出来事がありました。 学生時代にPerlコミュニティの支援でPerlConに参加させていただいたのですが、今回はその支援カンパの余剰分のうちの一部*2を学生支援スポンサーメインのスポンサーとして協力させていただきました。

会社という訳ではないので金額等柔軟に対応していただいたid:papixさんには感謝です。*3

anatofuz.hatenablog.com

個人的にはスポンサーして無事学生さんの旅費を支援できて満足という感じだったのですが、忘れていたスポンサーチケットを、ちょうど学生チケットの購入を逃してしまった学生さんにお譲りすることができることなどがあり、そういう意味でも今までコミュニティからもらえた恩を少し返せたかなとは思っています。

あとは沖縄から学科の後輩のid:e205723id:mattari_matayuYAPC::Kyotoに呼べたのが良かったかなと思っています。沖縄のPerlコミュニティにお世話になったので、沖縄の人々にもどうにかしておきたかった。

次回はYAPC::Hiroshimaになりそうな気配がありますが、個人的に地元の山梨でYAPCをやるまではやっていくぞという感じでもあり、今回あまりコミットできなかった分次はやっていきたいので、次回は広島でまたお会いしましょう。よろしくお願いします。

*1:引っ越しで貯金が無くなったり、京都に引っ越してから数年物理的に旧友とあってなかったり、仕事のコードばかりでテンションが上がる趣味のコードがかけなかったり

*2:20万ほど。残りはまたYAPCで使います

*3:スポンサー一覧に載せなかったのはなんか個人的に自分のアイコン乗せるのもな...というところです