YAPC::Hiroshimaで登壇してきました

ということでYAPC::Hiroshimaで登壇してきました。

speakerdeck.com

内容としてはRakulangの入門とおもしろRubyVM実装でした。いかがでしたか?

今回RubyVMは文字列をパースしようとしてたんですが、これは偉大な先人のめもりーさんのアプローチと意図的に違うアプローチを取ってみたためです。 実際Rakulangではバイナリ操作が可能なので、同じようにバイトコードを読むVMも作れると思うのですが、やはり文字列操作が得意なPerlなので(???)、こういった感じにしてみました。あんまり自信はなかったですが、当日結構よかったと言っていただいたのでほっとしています。

心残りとしてはGrammarとActionを使ったコードを書いてみようと思ったんですが、エラーが微妙すぎて完成まで至らなかったヤツです。

今回は気づいたらスタッフになってたので学生旅費支援まわりをやってました。当日までの準備はあんまできなかったので(京都に続いて申し訳ない...)、今まさに働いている気がする。

ここから先は暗い話なのだけど、今回のYAPCはなぜかテンションが上がらない状態で当日を迎えてしまった。なんかだいぶエンジニアコミュニティに対するモチベーションが無い状態。

最近のコミュニティ活動に対する自分の熱量の低さを鑑みたけれど、主な原因としては

  • エンジニアリング以外のも趣味が増えた
  • 色々あり最近金があまりなく生活に余裕がない
  • 朝起きて仕事をするだけで部屋から出ない生活が3年くらい続いている
    • 近所に友人や家族もいないので孤独感がましていて厳しい
  • ほぼ社会人になってからエンジニアコミュニティに参加してない
    • まだ沖縄にいると思われている、のはインターネットと現実で存在感がないことの裏返しなんだよナァ
  • かろうじて参加しているコミュニティもわりと義務的な理由で参加するコミュニティが最近多かった
    • 関西に住んでるので関西の初心者向け勉強会に行かなければならない、とか

多分このあたりがあるんだろうが、今でも自分ではよく解っていない。よく考えるとYAPCの今回のテーマは「お好み」であるが、好みとか言わずにやるんだよ、みたいなシーンが生活に多くて厳しい気持ちになっているのが最近多くて疲れている、というのもあるかもしれない。というか数年単位で地域PMの勉強会みたいなのに参加できてないんですよね。なんかコミュニティと距離が出来てしまって、どうしたらいいのか解っていない。

YAPCに参加していると周辺の人がよく「恩返し」とかいっていて、自分も恩を返す立場なのではないか、しかしそれをするには自分が今やるには元気がないぞ...みたいな一種の辛さ、みたいなのが多い。どうにかしたいが....。

あのときの熱量を取り戻すきっかけがなんなのか、それはまだよく解っていないが、しかし、YAPCに参加すると楽しいので、いつかテンションが戻ってくるような気はしている。じゃあ今後どうしていくのか、それはまだ答えが見つからない。

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も型を分ければ別物として扱えます。便利ですね。