Slide 1

Slide 1 text

2025/08/02 Hackers Champloo 2025 八雲アナグラ (@AnaTofuZ) Rubyの国のPerlMonger

Slide 2

Slide 2 text

2 ● 八雲アナグラ(@AnaTofuZ) ● 2015 ~ 2021まで沖縄で学生 ○ 京都を経由して今は山梨にいます ○ Okinawa.pmとかPerl入学式とかにいました ● 2025年1月から株式会社コードタクトでRailsでアプリを書いてます ○ それまではPerlの国(?)にいました ● 沖縄行きの前日に医者に酒を止められました my $self = shift;

Slide 3

Slide 3 text

3 Ruby💎の国のPerlMonger🐪

Slide 4

Slide 4 text

4

Slide 5

Slide 5 text

5 ● どちらも動的型付け言語 ○ 主にWebバックエンドやCLIツールとして利用される ● Ruby ○ Ruby 3.4.5 ● Perl ○ 5.42 ● やや似ている(諸説あり) ● 定期的に人間が行き来している Ruby(💎)とPerl(🐪)

Slide 6

Slide 6 text

6 ● Rubyistの国のPerl使い ○ 2021年 YAPC::Asia ○ id:antipop ● Simple組み合わせ村から大都会Railsにやってきた俺は ○ 2025年 東京Ruby会議12 ○ id:moznion ● id:anatofuz <- NEW Perl(🐪)->Ruby(💎)

Slide 7

Slide 7 text

7 ● Perl使いの国のRubyist ○ 2018年 RejectKaigi 2018 ○ id:onk Ruby(💎)->Perl(🐪)

Slide 8

Slide 8 text

8 ● どちらも相互に人が行き来している(た) ○ Perl側に最近人が来ていないのはそう... ● 今回はOkinawa.pm (Perl入学式)きっかけでPerlMongerになった私が Rubyの国に引っ越してからの様々についてです RubyとPerl

Slide 9

Slide 9 text

9 1. 言語ごとの特徴、違い、哀愁 2. 意外と似ているもの 3. 入国してからの学習方法 4. 最近の自由研究 Rubyの国のPerlMonger

Slide 10

Slide 10 text

10 ● 最近は今までに無いレベルで言語コア機能の開発が盛ん ○ class ○ boolean ○ try/catch ○ サブルーチンシグネチャ ● 言語の開発がGitHubに移管されたことで議論が追いやすい ○ 新しい構文などはPPC(Proposed Perl Changes)でRFCのように議 論 ■ Perl5.42じゃなくてPerl42にしよう、とか PerlMonger側からの最新 Perl

Slide 11

Slide 11 text

11 ● ここのところのISUCONの問題アプリケーションがその年の最新版の書き 方 ● 当時の新機能を惜しみなく使っているのでびっくりするかも 令和最新版 Perlアプリケーション

Slide 12

Slide 12 text

12 同じ知識が使えるケースもある ● pre-fork型のサーバー ● GraphQL/RESTなどのAPIの実装 ● 正規表現/モジュールバンドル/コレクション操作 Perlにはないものも多い ● fork以外の非同期プログラミング ● いろいろな処理系 Rubyの国にきてみて

Slide 13

Slide 13 text

13 ● Perlは基本的にマルチプロセスが主 ○ スレッドは.... ○ ライブラリベースでlibevとかを呼び出せる ○ プロセス間のやり取りはめちゃくちゃ書きやすい ● 素朴なWebアプリケーションだとあまり困らないがGraphQLとかするとき にちょっと大変だったりする ● Rubyだと最近色々ありますね ○ Fiber, Ractor 非同期プログラミング

Slide 14

Slide 14 text

14 ● mruby ● mruby/c ● PicoRuby 組み込み系の処理系がある

Slide 15

Slide 15 text

15 リストで文字列リテラルを作る記法 ● Perl ○ qw
 ■ qw/foo bar baz/
 ● Ruby ○ %w
 ■ %w(foo bar baz)
 似ているヤツ

Slide 16

Slide 16 text

16 変なコードは両方でも書けそう

Slide 17

Slide 17 text

17 ● Ruby ○ Bundlerで管理 ○ Gemfile/Gemfile.lock ● Perl ○ Carton/Carmelで管理 ■ 最近は殆どの人が使っているが公式という訳ではない ○ cpanfile/cpanfile.snapshot モジュールロック系

Slide 18

Slide 18 text

18 ● モジュールインストール時にMakefile.PLなどのPerlスクリプトが実行 される ● いくつか依存モジュールがインストール時に動的に決まるものの ○ インストール時にCコンパイラがある or ない ○ インストール時に特定のライブラリがある or ない ■ おまけにPerl特有の事情でランダム性があるときがある ● snapshotのdiffがガチャ ● 最近は使用時に動的チェックやある程度の規則性が入るように Perlのモジュールインストール事情

Slide 19

Slide 19 text

19 @始まりの変数(@val)はPerl/Rubyともにvalid 似てるけど似てない

Slide 20

Slide 20 text

20 @始まりの変数(@val)はPerl/Rubyともにvalid 意味合いが違う ● Perl ○ 配列 ● Ruby ○ インスタンス変数 似てるけど似てない

Slide 21

Slide 21 text

21 奇跡的に一致しているケース 似てるけど似てない

Slide 22

Slide 22 text

22 奇跡的に一致しているケース なお現代的なPerlの場合はmyが必要 RubyとPerl

Slide 23

Slide 23 text

23 ● 両方とも動的言語 ● 素の状態だとRubyのほうが厳格 ○ Integerが入っている変数を文字列連結するには#to_sとか ■ bar = 123; baz = bar.to_s + "hoge"
 ● Perlだとコンテキスト(文脈)でよしなに解釈される ○ $bar = 123; $baz = $bar . "hoge"
 ○ $bar = 123; $baz = $bar + 200
 
 型

Slide 24

Slide 24 text

24 ● 型とソースコードが同じファイル ● 型そのもの ○ Type::Tiny ○ Mouse::Util::TypeConstraints ● 引数 ○ SmartArgs::TypeTiny ○ FunctionParameter Perl

Slide 25

Slide 25 text

25 ● 基本的に実行時チェック ○ エディタでコーディング中に解釈させるにはひと工夫必要 ○ 本番以外で動く型チェックをコードロード時に実行してエラーさせる ● パターンマッチやJSONの型指定など関数の型チェック以外も使われる Perlの型

Slide 26

Slide 26 text

26

Slide 27

Slide 27 text

27 ● 基本的に実行時チェック ○ エディタでコーディング中に解釈させるにはひと工夫必要 ○ 本番以外で動く型チェックをコードロード時に実行してエラーさせる ● パターンマッチやJSONの型指定など関数の型チェック以外も使われる Perlの型

Slide 28

Slide 28 text

28 ● RBS ○ Ruby3.0から標準添付 ○ 型とソースコードが別ファイル ■ インラインで書くことができるgemもある ● RBI(Sorbet) ○ shopify方面で開発されている型システム ○ Rubyコード中に書くことも出来る ○ tapiocaでRBIファイルを作成しSorbetで検査 どちらもIDEでサポートされる Ruby

Slide 29

Slide 29 text

29 ● safe navigation operator ● nillable&.methodとすると&.の前がnilでもエラーにならない ○ JSのオプショナルチェーン(?.)と似てる ボッチ(&.)演算子がある

Slide 30

Slide 30 text

30 ● ?->が言語デザインとして提案されている ○ my $val = $data?->{deeply}?->{nested}?->[0]?->{data}?->{va lue};
 ○ まだドラフトステータスなので入るかは不明 ● https://github.com/Perl/PPCs/blob/main/ppcs/ppc0021-optio nal-chaining-operator.md Perlでは

Slide 31

Slide 31 text

31 そもそもPerlだとWAFらしいWAFを使わない派閥もある ● Perl ○ Mojolicous, Amon2, Dancer2, Catalyst... ○ WAF使わずにパーツ組み合わせるのが多い(特に日本) ● Ruby ○ Ruby on Rails, Sinatra, Hanami.. Webアプリケーション

Slide 32

Slide 32 text

32 ● CPANモジュールを組み合わせて作った薄いWAF ○ プロジェクトごとに手作りしたりコピペしたり ● めちゃくちゃ薄いのですぐ読めてシュッと拡張できる ○ 一部分だけカリカリにチューニングすることが容易 ■ PromiseのモジュールをCで書かれたものに交換とか ● モジュールが豊富だと全部把握できて楽しい ● パーツ自体を構成する上での考え方は他の言語にも移植出来る ○ ex) HonoのRegExpRouter 薄いWAF

Slide 33

Slide 33 text

33 ● 抜本的にアーキテクチャを切り替えるのがやりづらい ○ DIYして作ったので市販のツールが合わないがち ■ 一部の処理を非同期にするとか ● レールは自分で引く系なので年代によって線路が違う ○ git logして当時の流行りの考古学ができる 薄いWAF

Slide 34

Slide 34 text

34 ● Railsと組み合わせることが前提になっているgemが多い ○ 前提のアーキテクチャが揃っているのですぐ使える ● Ruby/Railsのレールに乗っていればめちゃくちゃ短くかける ○ メタプロでコードすらいらないケースも有る ○ 規約による規律 ○ キーワード引数とかうまく使うとめちゃくちゃ短くて便利 Rails

Slide 35

Slide 35 text

35

Slide 36

Slide 36 text

36 両方とも言語コミュニティがある ● Perl ○ xxxx.pm ■ Okinawa.pm ● Ruby ○ xxxx.rb ■ Okinawa.rb コミュニティ

Slide 37

Slide 37 text

37 ● Perl ○ YAPC ● Ruby ○ RubyKaigi,Kaigi on Rails... 両方とも沖縄で開催されている ● YAPC::Okinawa 2018 ONNASON ● RubyKaigi 2024 技術カンファレンスもある

Slide 38

Slide 38 text

38 言語をまたいでの感想

Slide 39

Slide 39 text

39 Rubyコミュニティ Rubyの話してる !! 言語をまたいでの感想

Slide 40

Slide 40 text

40 ● Perl ○ 元々Perlと関わりがあった人が軸になっているコミュニティに ○ 今はIT系全般のコミュニティになってる ■ Perlの話もないわけではない ● Ruby ○ 今Rubyを書いている人が多い ■ Rubyコミッターの方々がいる ■ 言語そのものやツールチェインの話が飛び交っている印象 現状の日本のコミュニティ

Slide 41

Slide 41 text

41 ● 言語基礎 ● モジュール作り ● コミュニティ 慣れるためにやったこと

Slide 42

Slide 42 text

42 言語基礎

Slide 43

Slide 43 text

43 比較的最近出ている本を買って読んだ ● チェリー本 ● Rubyコードレシピ集 ● 研磨Rubyプログラミング ● Ruby on Rails アプリケーションプログラミング 同人誌もいろいろでてますね 本

Slide 44

Slide 44 text

44 ● Perlはネイティブに喋れるのでPerlで書いてAIに翻訳させる ○ たまに存在しないAPIを教えてくれる... AIに翻訳させる

Slide 45

Slide 45 text

45 モジュール作り

Slide 46

Slide 46 text

46 両方ともコアで言語にバンドルされているもの以外にコミュニティから提供 されている ● Perl ○ CPAN ● Ruby ○ RubyGems 最近両方ともモジュールをリリースしたので作り方を比較してみる モジュール

Slide 47

Slide 47 text

47 ● PAUSE(Perlモジュールアップロードサーバー)に会員登録リクエスト ○ 手動で承認される ● 日本の場合はminillaを使ってモジュールの雛形を作成 ○ minil new mylibで雛形作成 ○ minil releaseでリリース Perl

Slide 48

Slide 48 text

48

Slide 49

Slide 49 text

49 ● RubyGemsに会員登録 ● bundle gem mylib
 ● version.rbの内容に基づいてrake releaseするとリリースされる Ruby

Slide 50

Slide 50 text

50

Slide 51

Slide 51 text

51 ● フローとしては割と似ている ○ Rubyの場合はbundlerで出来るので追加でなにか取得しなくても出 来る ● Perlの方は実態はだいぶ古き良き感じ ● モジュールといえば命名規則も文化ありますよね モジュール作り

Slide 52

Slide 52 text

52 ● Class::Accessor
 ○ Perlでアクセサ込でオブジェクトを簡単に定義できるくん ● Class::Accessor::Lite
 ○ 上の軽量版。インターフェイスは同じだが依存関係はない ● Class::Accessor::Lite::Lazy
 ○ 上を継承して遅延評価するアクセサを追加した版。依存関係がある CPANモジュールの命名規則

Slide 53

Slide 53 text

53 ● モジュール名はジャンルの名前空間としての意味合いが強い ○ ジョークモジュールの名前空間Acme::
 ■ Acme::EyeDrops ● 同じような名前を持つからと言って継承関係は必ずしもない ○ インターフェイスが同じだったりとゆるい一致 ● 汎用的な名前空間にいないモジュールも多々 ○ Teng, L CPANのノリ

Slide 54

Slide 54 text

54 ● net-http
 ○ RubyのHTTPクライアント ● net-http-persistent
 ○ Net::HTTPを拡張してコネクションを永続化する ● net-http-digest_auth
 ○ Net::HTTPを拡張してDigest認証 RubyGemsの命名規則

Slide 55

Slide 55 text

55 ● 同じ名前空間を持つモジュールは依存関係があるのが前提 ○ 何かしらの拡張としての意味合いが強い ● 同じインターフェイスでも依存関係がない場合は独立した名前にしたほう がいい RubyGemsのノリ

Slide 56

Slide 56 text

56 ● 新しい知見を得るには技術コミュニティに参加するのが良い ● リモートワークなので物理的にエンジニアと喋る重要な機会でもある ● anatofuzは今年山梨に引っ越したので山梨県内でコミュニティを探した コミュニティ

Slide 57

Slide 57 text

57 ことさら山梨においては4月ごろまでは ● Perl ○ undef ● Ruby ○ nil コミュニティ

Slide 58

Slide 58 text

58 ないならつくるぞ!! ● Perl ○ Houtou.pm ● Ruby ○ Kofu.rb コミュニティ

Slide 59

Slide 59 text

59 ● Kofu.なんか ○ 2025/08/16 クラフトビール屋さんでやるテックトーク ● Kofu.rb ○ 2025/08/23 TRICKを見る会 ● Otsuki.なんか ○ 2025/10/11 古民家でのノンジャンルトークイベント 【PR】山梨でやるんできてくれ 沖縄から片道 4時間!!

Slide 60

Slide 60 text

60 ここまでRubyとPerlをそれぞれ見てきま した

Slide 61

Slide 61 text

61 AnaTofuZの気持ちとしてはまだ Rubyそ こまでまだ功夫がたりない ..

Slide 62

Slide 62 text

62 ???「Rubyのことが知りたいんだったら Ruby実装すればいいのでは」

Slide 63

Slide 63 text

63 このイベントは Hackers Champloo

Slide 64

Slide 64 text

64 RubyをPerlで書いてPerlをRubyで書け ばいいのでは ...!?

Slide 65

Slide 65 text

65 ● Perl1.0とRuby0.49(公開されているうちのそれぞれ太古)を現代のそれ ぞれで書く活動をしている ○ なんと両方ともオリジナルのソースコードが公開されている ● 先週レキサーまで実装した ○ ソースコードを意味のある単位に分割してくれるヤツ ○ 詰まったらclaude codeに助けを求めるスタイル ということで最近の自由研究

Slide 66

Slide 66 text

66 ● おおよその文法は同じだが微妙に違う ○ Perl1.0はグローバル変数しかないのでフィボナッチができない PerlとRubyのオリジン

Slide 67

Slide 67 text

67 name = "World"
 Perlで作るRuby

Slide 68

Slide 68 text

68 Perlで作るRuby

Slide 69

Slide 69 text

69 $name = "World";
 Rubyで作るPerl

Slide 70

Slide 70 text

70 コードの一部

Slide 71

Slide 71 text

71 ● / などの曖昧なトークンの解析はPerl/Rubyともに状態で判定
 ○ /regex/ 
 ■ 正規表現
 ○ 10 / 2
 ■ 割り算
 ● 今の処理系も同様に状態を持っているので通じるものがある
 おもしろポイント

Slide 72

Slide 72 text

72 ● 両方とも最初のバージョンなので比較的手作り感がある ○ 最新の処理系ほどコードベースが大きくないので読めようとしたら読 める ● わりと古いC言語で書かれているので読むのがむずい ○ ...が、最近AIが出てきたので難易度が一気に下がっている ● リフレッシュとしてやってる 初期バージョンならではのよさ

Slide 73

Slide 73 text

73 ● PerlからRubyにいってみた ○ 一致するノリ、ちょっと違うノリ、様々 ● 生成AIが台頭してきた今こそ学習チャンス ○ 言語間翻訳やりやすい ○ おもしろソースコード作成 ● 別のコミュニティや言語もやっていきましょう まとめ