Hackers Champloo 2025で登壇してきました #hcmpl25

ということで2025年8月2日に開催されたHackers Champloo 2025に参加してきました。

前回喋っていたので2回連続で本編トークでした。(ありがたい)

speakerdeck.com

トークタイトルはonkさんの発表が印象に残ってたのでそれのインスパイアですが、そもそもonkさんのトークあんちぽさんのタイトルインスパイアなので一周回ってきて別の場所に着地したのが後に気づいてウケました。

スライドは最近はmarpを使っていたのですが、画像を乗せるのがやや面倒で今回どうしようかな〜〜〜と思っていたところ、songmuさんのツイートで見かけたk1LoW/deckを使ってGoogleスライドで作成しました。Googleスライドの全部を制御せずにあくまでテキストだけ制御するスタイル、使うとこれは手に馴染みますね。普段の思考ルーチンと同じ流れで効率よくかけるのでめちゃくちゃ良かったです。(資料作成そこまで時間がかけられなかったので救世主だった)

沖縄

琉大出身ということもあり学生時代の大学の友人や、当時からのコミュニティでお世話になった方々が大勢いらっしゃるので久々に同窓会という感じでした。 当時お世話になった山田先生や、インターネットでは見たことがある自分が卒業してから入学したieの後輩と話せたのがよかったです。 あとは現職のエンジニアの方々が結構参加されてたのでオフ会の感じでしたね。

前々野菜

大都会山梨に引っ越したのでバスで羽田経由で沖縄に行きました。なんか大学の帰省ぶりで懐かしい感じ。

国際通りはVRChatでよく行ってますが現物を見たのは久々でした。 なんか映像付きのサイネージができててびっくりした。

前夜祭の前、前々野菜はid:kimihitoさんが声をかけていただいたので、id:tompngさん、id:masakystさん、id:codehexさんとメキシコ料理店に行ってました。

渡航前日に酒を止められたのでノンアルでしたが、なぜか山梨のビールが置いてあったのがよかったです。

前々野菜ではCodeHexさんの最近の仕事の話題や、ジャングリアの悪口などで盛り上がりました。とても楽しかった....。

ハッカーズチャンプルー

前夜祭

前夜祭の前の日から沖縄入りしてたのでワーケーションしてました。 なんとかしてカレー屋に行きたかったのですが、ハリーズが時間的に厳しかったので比較的ホテルの近くのあじとやに行きました。

ホテル、松山にとったので夜帰ろうとするとめちゃくちゃ治安が悪かったのはよかった。 ちなみに大学の同期がやってたコンカフェは同期が店やめて当時東京に出張に行ってたこともあって期間中はいけませんでした。

前夜祭はCBcloudさんで行われました。ガラゲー時代のバスナビを使って無事移動。 hackers-champloo.connpass.com

飛び込みLTもあり、緩い感じかつ謎の技術が出てくるの、とてもハカチャンらしくで戻ってきた感じがありました。

その後は大学の同期のIntelと飲んでました。結婚めでたい。

本編

posfie.com

本編、いつも通りのハッカーズチャンプルーという感じのチャンプルー具合でとてもよかったです。今年は誰も死んでなくてよかった。

特にスポンサーセッションが会社紹介じゃなくて異様な技術トークになってたのがよかったですね。登壇者の脳波が見れるカンファレンスなんてハカチャンくらいじゃないか。

懇親会ではハカチャンの作り方をかびさんにちょっと聞いたので、今後山梨でハカチャンみたいなカンファレンスをする際の参考にもなりました。

あとは元同僚と行きのバス、会場までのエレベーター、懇親会からの帰り、ホテルが全部意図せず同じだったのがめちゃくちゃよかったです。エレベーターの中だと確信が持てなかったところまでよかった...。

ということでハッカーズチャンプルー、最高のカンファレンスでしたね。運営の皆さんはお疲れ様&ありがとうございました! また次回開催されたら駆けつけます。

RubyでFCMのHTTPv1 APIをHTTP/2を使ってやりとりするffccmmxをリリースした

ということでgem作者になりました。どうぞお使いください。

rubygems.org

RubyでFCMのAPIクライアントとしてはfcmpushfcmが有名です。これらのgemは非常に使い勝手がいいのですが、使用するHTTPのプロトコルがライブラリの都合上HTTP/1.1に限定されるという話題があります。

FCMのAPIはHTTP/2に対応しているため、通信を多重化できます。これを使うと、まとめて複数人に通知するユースケースでは大幅な時間短縮が見込まれます。

しかしRubyのFCMクライアントでHTTP/2に対応しているものは見た感じ存在しないという問題がありました。既存のgemにPRを送るとしても内部で利用しているHTTP Clientの選定から変更するという抜本的な対応をせざるをえないため、クライアントの使用感が大幅に異なるという問題も孕んでいました。

ということで既存のgemであるfcmpushを参考にさせていただき、HTTPクライアントごと切り替えたライブラリであるffccmmxを作りました。命名Rubyっぽい名前として色々悩みましたが、内部的にHTTP Clientとしてhttpxを利用していることと、デフォルトでHTTP/2を使うのでfcmを2倍してffccmmxです。

多重送信用機能

concurrent_XXXという命名規則で提供しているメソッドを使うと多重送信でリクエストされます。 機能としてはhttpx側で制御しており、オプションもインスタンス作成時に渡せるようになっているので、httpxが提供している機能がそのまま使えるようになってます。

@client = Ffccmmx.new(project_id)
notification_messages = [ 
  {
    message: {
      token: device_token,
      notification: {
        title: "test title",
        body: "test body"
      }
    }
  },
  {
    message: {
      token: other_device_token,
      notification: {
        title: "test title",
        body: "test body"
      }
    }
  },
]
responses = @client.concurrent_push(notification_messages)
responses.each do |response|
  httpx_response = response.value
end

多重送信の場合はResponse型で返ってくるので、#valueでhttpx responseそのものにアクセスできます。

リトライ系

エラーが返ってきた場合リクエスト可能かどうかもライブラリ側で判定、リクエスト可能であった場合は次にリクエスト出来る時間をヘッダまたは手動で計算します。

begin
  @client.push(notification_message)
rescue Ffccmmx::HTTPXRetryableError => e
    puts "Retry after: #{e.retry_time}"
end

ヘッダがわたってこなかった場合の対策として、countで試行回数を指定するといい感じに指数オーダーで計算してくれます。

e.retry_time(count: 2) #  Time.now + 2**2

#retry_timeはTimeオブジェクトを使うので、ActiveJobを使っている場合はwait_untilとしてそのまま渡せます。

実際使うとどうなるか

4000msくらいかかっていた通知ジョブで実験したところ300msくらいになりました。

感想

このライブラリの作業きっかけではないのですが、ちょっと作成している間に体調崩すみたいなトラブルがあったのですが、無事リリースできて良かったです。(今はある程度回復してきた)

今回はRubyのHTTPクライアント事情やwebmockの雰囲気、gemの命名問題など、色々と学ぶことが多かったです。

HTTPクライアントはいろいろとエントリを見たソースコードを見たりしたのですが、意外とRubyもいろいろあるのね...!という感じでした。

PerlCPANモジュールを作るときといえば現代ではminillaですが、Rubyの場合はbundlerで雛形が作れるのが体験として手軽で良かったです。特にRakefileでアップロード用のtaskが生えてたり、すでにrubocopの設定がされていたりと至れりつくせり....。最近は型の情報も雛形があってなるほど〜〜という感じで書いてました。

webmockとかもわりとRSpecのbefore/afterなどでうまく組み合うように書く必要があるのが、とりあえずスコープで全て管理していたPerlとの違い...というのが結構わかってきたなという印象です。Perlだとインスタンス変数にモックいれて有効な間はドーンみたいな感じなので....。

ちなみに完全にPerlのノリで名前を「Fcmpush::HTTPXとかにしようかな...」とか言ってたら全会一致で「拡張モジュールっぽいからやめとけ」みたいな話題になり、これがRubyの世界...!となっていたりしました。(PerlだとXXX::TinyとかでXXXと同じインターフェイスの別物、がありがち)

あとは時止める系のライブラリがtimecopなのめちゃくちゃいいですね。

また高速化は仕事の一環としてやらせていただいたので、 id:h6n さんやぱるすさんのレビューもいただいてリリースできました。ありがとうございました。

codeTaktに入社して1ヶ月がたった

タイトルははなちんさんリスペクトです

というわけで2025年1月から株式会社コードタクトに入社していました

入社まで

コードタクトは沖縄関係のエンジニアが多数所属しているのもあって、会社自体は以前から知っていました。

きっかけとしては去年那覇で行われたRubyKaigi 2024で、たまたま研究室の先輩でもあるぱるすさんと懇親会へ向かうバスで合流して、その後の二次会でid:h6nさん、id:tompngさん、id:sylph01さん、後藤さんあたりと飲むことになり、その後で面談を設定していただいて、エイッとやってバーン(しばらく副業として勤務してみたりした)という感じで入社に至りました。*1

転職に際してはある程度知人がいる会社にいくのと今後のキャリア的に技術スタックは変えようと思っていたのですが、知っている人が多く、Rubyに関しては情熱プログラマーよろしく自分が一番の下手でいられて爆速で成長できそうな環境、というのが決め手という感じでした。

くらし

生活

今まで住んでいた京都がそこまで体にあってなかったので引っ越そうと思っていたのですが、コードタクトはリモートワーク声明もだしているし、突然出社強制になることはまずないこともあり、沖縄に行くかは悩みましたが、なんやかんやあって甲府に移住しました。山梨県出身だけど地元は南アルプス市なので微妙に新生活と地元に戻ってきたのが合わさっている状況。この年で地元に戻ってくるの、年代もあって劇場版ゆるキャンの大垣千明みたいなところがあってウケますね。ちなみに入社して1週間後に引っ越しなので社の方々にはご迷惑をおかけしました...

入社初日の反省

甲府の家は今のところ

  • 換気扇に鳥がいない
  • 部屋が京都の家より広い
  • 家賃が安い
  • 地元なのでくたばっても家族に救援に来てもらえそう
  • 都会が苦手なのでちょうどいい田舎としてフィット

という感じでそこそこ楽しく過ごせています。車はまだないので自転車生活です。

リモートワーク企業ということもありslackが活発なのはだいぶ自分にあっていて良かったです。 前職でやっていた奇祭を投稿するslackチャンネルを入社初日に作るなどしました。前職はわりと自分のログをscrapboxに書くみたいな生活でしたが、今はslackに垂れ流してますね。そういう生活をしているからか、入社してから以下のように評価(?)いただいています。

というわけでインターネットの人として元気にやってます。

勤務風景

技術系

やすいうまいはやいことのLinuxを使い始めました。端末が良さそうだったVAIO SX14RにNixOSをいれて使っています。NixOSにしたのは周囲の人々が使っているのと純粋関数型OSを触ってみたかったから。

Grokに作ってもらった自撮り https://x.com/i/grok/share/dCmqusZa1WgVm2IJ0BDt200or

最初にインストールしたときは外部ディスプレイが反応しないという悲しさはありましたが、nixpkgs-unstableで構築し直したらkernelが最新になったのがいいのか映るようになってそこそこ快適に開発できています。スクリプト言語製のGUIアプリいれてもぶっ壊れる心配ないのがめちゃくちゃ安心。そしてある程度有名なソフトウェアのインストールが極めて素早くできて良いですね。anyenv的なツールを使わなくてもOSがなんとかしてくれるのは感動的。

NixOS自体はとても癖が強く序盤は「これはLinuxなのか...!?」と不安になりながら設定ファイルを書く生活をしていました。癖が強いOSとあまり世界的に使われていないラップトップの組み合わせは初見のハードルが高いので次は少なくともラップトップに関してはThinkPadとか普通に使いそうな気がする。しかしVAIOはキーボードだいぶ打ちやすくていいですね。薄いしRJ45を直挿しできるのも良いところという感じがする。

主戦場はPerlからRubyRoRになったので雰囲気で戦っています。

ModelにビジネスロジックをいれたりRubyGemsの機能をフル活用してタイプ数が少なくなる感じ、今まで書いていてたソフトウェアアーキテクチャとはまるで違うので日々面白いです。あと未だに@始まりの変数を見るとコンマ5秒くらいは配列だと誤認する。

Railsがわからなくてしわくちゃになってるワイ

なにをしているか

このあたりの仕事内容という感じで、今は全体のキャッチアップも兼ねながら小さいタスクを順次撃破するみたいな生活をしています。「あっこれがActiveModel....あっこれがRailsが生やしている便利メソッド!!! .hours便利〜〜〜」みたいなことを言ってます。

既存メソッドのリファクタリングに悩んでいるワイ

ちなみに業務コードはQuineとかコードがアスキアートになってるとかはなかったです。

はい

ということで数年ぶりにPerlが違法な世界にやってまいりました。Perlコミュニティには今後も顔を出そうと思っていますが、これからはRubyの方面にも行こうと思いますのでよろしくお願いします。あとまだ試用期間中なのでお茶漬けセットが家に届かないようにしたい

というわけでやっていくぞ!!!

あ、そういえば来週14日は誕生日です

www.amazon.jp

*1:流石にその場で内定とかじゃなくて入社フローはちゃんと踏んでる

そのうち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に参加すると楽しいので、いつかテンションが戻ってくるような気はしている。じゃあ今後どうしていくのか、それはまだ答えが見つからない。