そのうちPerlに入るかもしれないcase文Syntax::Keyword::Matchの紹介

こんにちは。id:anatofuzです。 これはPerl Advent Calendar 2024の15日目の記事です。

昨日はid:mackee_wさんによるaquaでperlを入れて使えるようになりました でした。relocatable-perl自分は低スペックのPCでとりあえずPerl動かしたいときによく使っています。

さて、PerlC言語からの影響が強い言語ですが、C言語にあってPerlにない、というよりあったが使われてなかった機能にcase文があります。 かつてはPerlのコアにgiven-whenと呼ばれるcase文の機能がPerl5.10.1から導入されていました。

use v5.10.1;
given ($var) {
    when (/^abc/) { $abc = 1 }
    when (/^def/) { $def = 1 }
    when (/^xyz/) { $xyz = 1 }
    default       { $nothing = 1 }
}

これはgivenの後ろに評価したい変数をいれ、whenキーワードでいわゆるcaseに相当するものを書くスタイルです。 一見すると良さそうな機能なのですが、givenで値をスマートマッチ演算子(~~)を使って評価するという特徴があります。 このスマートマッチ演算子が曲者で、いくつかの問題を抱えていることから5.18で非推奨となりました。 http://perldoc.jp/docs/perl/5.18.0/perl5180delta.pod#The32smartmatch32family32of32features32are32now32experimental

長らく非推奨という形だったのですが、これを受けて5.41.3(Perlの開発用バージョン)でついにスマートマッチ演算子とgiven-whenが削除されました。 次のリリース予定の安定版(Perl5.42またはPerl42)でもスマートマッチ演算子とgiven-whenは削除されてリリースとなります。

metacpan.org

ということでコア機能からはcase文は消されたのですが、しかし全ての計算をif~elsifで書くのはちょっとだるい、というときが存在します。我々はcase文がやはり欲しくなるときがあるわけです。

さて、最近のCPANモジュールにはSyntax::Keyword名前空間のモジュールがいくつか存在します。 これはPaul Evans先生がPerlのsyntax plugin 機能を利用し構文の拡張を検証しているモジュール郡です。

PaulEvansはPerlのコア開発者でもあるので、Syntax::Keywordで成果がでた言語機能がPerl本体に取り込まれるというのが最近のムーブメントとなっています。具体的には5.36より導入されたdeferSyntax::Keyword::Deferの開発内容が元になっています。このためSyntax::Keyword名前空間のモジュールとPerlコアに最近入っている新機能は内容がコンパチであるので、Feature::Compat名前空間のモジュールを利用するとPerlバージョンに応じてコアかSynrax::Keywordかどちらかで処理を実行するという互換性に強いPerlアプリケーションを書くことができます。例えばdeferはFeature::Compat::Deferを使うとdeferがfeatureにある場合はfeature, ない場合はSyntax::Keywordなモジュールが使われるので、まずアプリケーション側をdefer対応してからPerlのバージョンアップ、というのが比較的スムーズに行えます。

さて、given-whenは消えてしまったわけですが、なんと今CPANにはSyntax::Keyword::Matchモジュールが公開されています。もちろんこれはPaulEvansによって作られた新しいcase文の検証実装です。

use v5.16;
use Syntax::Keyword::Match;
my $n = ...;
match($n : ==) {
   case(1) { say "It's one" }
   case(2) { say "It's two" }
   case(3) { say "It's three" }
   case(4), case(5)
           { say "It's four or five" }
   case if($n < 10)
           { say "It's less than ten" }
   default { say "It's something else" }
}

主な特徴はmatchキーワードの後ろに評価したい変数と演算子を指定します。 各case文はその演算子での比較先を書くことができます。この例では$nを数字として比較演算しているわけですね。 各caseブロックはgolangと同様に自動でbreakされます。cと違い明示的に書かなくても{}のブロック内で処理を完結できるので直感的ですね。複数の評価値で実行したいブロックをまとめたい場合は,で繋いで書くことで実装できます。

ここまでだと他の言語のcase文と同じなのですが、おもしろポイントとしてcaseの後ろにifを書くことで別の評価を行うことができます。上の例ではcase if ($n < 10)としていて、ここだけ大小演算が行われるわけですね。

他にはmatch構文のスコープだけで有効な変数も定義できます。例えばこの例では$xはcase文の中だけ使うことができる変数です。

match( my $x = some_function_call() : == ) {
   case ...
}

さてこう見ると結構使えそうな感じがありますね。実はこの前のISUCON14ではこっそりこのcase文を使ってみています。 一応導入前にif-elsifとのベンチマークの比較をしたのですが、ほぼ等価、またはcase文の方が多少早いという結果になったのでパフォーマンスも非常に良いです。 というわけである程度のアプリケーションでも実際にキビキビ動作するcase文、ぜひ使ってみてはどうでしょうか。

github.com

明日はid:karupaneruraさんでTBDです。お楽しみに!

株式会社はてなを退職します

本日2024年12月13日を最終出社として、2021年の4月から新卒として入社してから3年半ほど努めていた株式会社はてなを退職します。

入社時はこんな感じでした。

anatofuz.hatenablog.com

はてなではノベルチーム、システムプラットフォームチームを経験させてもらいました。 特に新卒時代からお世話になったノベルチームではWebアプリケーションエンジニアとしてやっていくとはこういうことだというのを叩き込んでいただき、今の自分が作られたと思っています。

speakerdeck.com

特に配属されて初めて自分のPC上でカクヨムの開発環境が立ち上がったときの感動は今でも覚えています。

学生の頃からPerlでプログラミングはしていましたが、PerlでWebアプリを書いて給料をいただくのは初めての体験でした。Webアプリケーションエンジニアとしても力をつけられたのはありがたい限りです。

入社して社の有志でスタァライト見に行ったり、肉を焼いたり、slackの趣味チャンネルで盛り上がったりしたのは思い出深いです。雑な飲み会のログをCosenseに書く文化が好きでした。

理由

🍅を食べたから、または「劇場版 少女☆歌劇 レヴュースタァライト」を見たからです。*1(あるいは飲みに行ったときに)

今後

次の会社はもう決まっていて、年明けから勤務予定です。*2

もうしばらくは京都にいる予定ですが、そのうち一番長く住んだ土地である山梨か、2位である沖縄に引っ越そうかなと思っています。

最後に

はてなの皆様本当にお世話になりました。学生の頃の悲願だったPerlで合法的*3にWebアプリケーションを書けたのはとても自分の中でよい経験でした。またインターネットでお会いしましょう。というわけで、どうぞ今後ともよろしくお願い致します。

www.youtube.com

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のスライドにできたので成功したかもしれない。

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

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