Rebuild A Podcast by Tatsuhiko Miyagawa. Talking about Tech, Software Development and Gadgets.

Aug 09
2013

17: Carton, YAPC and Perl 6 (tokuhirom)

収録時間: 48:51 | Download MP3 (28.1MB)

Tokuhiro Matsunoさんをゲストに迎えて、Carton 1.0 リリース、YAPC::Asia, Perl 6 などについて話しました。

miyagawa: じゃあ 2回めの登場になりますけど。tokuhirom さんです。

tokuhirom: よろしくお願いします。

miyagawa: 何の話から始めましょうかね。

tokuhirom: Carton の話とかですかね。

miyagawa: そうですね。ちょうど今週の初めぐらいに Carton の 1.0 というのを出したんですけども。これは開発を始めたのが2011年の YAPC::NA だったので、もう2年ぐらい経っちゃってるんですけど。

tokuhirom: けっこうかかってますね。

miyagawa: 今年 RubyKaigi に行ったときに、Hallway でハックばっかりやってて。

tokuhirom: ああ、ikasam_a さんと何かやってたときですか。

miyagawa: そうそう、RubyKaigi なのになぜか Perl のハックをしてるという。

Cartonを作り始めたときは、bundler のソースコードを読んだりとか、使い方は知ってたんだけど、どういう挙動を中でしているかとかはあまりわからないまま想像でやっているところがあって。

それが仕事とかで Ruby を使うようになって、だいぶ bundler の正しい使い方とか、どういう風に挙動すべきかっていうことがわかってきたので、その RubyKaigi のときにほぼ一から書き直したような感じで。

tokuhirom: けっこう中身変わってますよね。

miyagawa: そうなんですよね。基本的には、今まで Carton.pm というところにロジックが全部ベタって書いてあったのを、モジュールに移したりとか。その辺はけっこう綺麗になって、使いやすくなってると思うんですけど。あと先月 OSCon に行ってきたので、その時もカンファレンスドリブンで。

tokuhirom: カンファレンスのたびにがらっと変わりますよね(笑)。

miyagawa: 大きい機能がカンファレンスのたびに追加されていくっていうパターンでやってるんですけど。本当は当日のトークの中で、リリースしたって言いたかったんだけど、どうもちょっと細かいところが間に合わなかったので、Later this week って言って次の週に出した感じですけどね。

試してもらった人だと、牧さんとか、tokuhirom のブログにもいろいろ書いてもらったけど。僕の方も CPAN-MetaDB を今まで Carton 0.9 で動かしていたのを 1.0 にして、基本的にはファイル名がちょっと変わったぐらいで、基本的な使い方は一緒なんですけど。どんな感じですかね?

tokuhirom: 今仕事でも、昨日ちょうど一つ Carton 1.0 に上げて、やってみて。そんなに問題はないかなって感じですね。exec の -Ilib の位置が変わったっていうので、ちょっと動かなくなるところとかありますけど。そのぐらいですかね。

miyagawa: Dev リリース、トライアルリリースを一ヶ月ぐらい出してたんだけど、みんなあまりテストしてくれないんだよね。

tokuhirom: けっこう Carton とかって試すのが大変っていうか。手元の環境を上げちゃうと、carton.lock が壊れたりとかすると嫌だなとか。

miyagawa: なかなかテストしづらいっていうのはありますよね。出してからもいろいろ直したんだけど、インストールしたモジュール一覧からパッケージ一覧を抽出する部分を書き換えたのがけっこう動かなくなってて。それの対応がほとんどだったかな。

tokuhirom: あとは install.json がうまく出来ないとか。そういうのがやっぱり微妙ですね。

miyagawa: これも本当はもうちょっと綺麗に書きたいというか、今は cpanm のドキュメントにない秘密機能を使って実装しているので、本当はあんまり良くなくて。Carton 自体にその機能を持たせるべきなんですけど。

tokuhirom: 最終的には CPAN 側がやってくれるといいんですけどね。もうちょっと。

miyagawa: そうなんですよね。……何の話をしているのかわからない人が多いと思うんですけど。

tokuhirom: 話が細かすぎる(笑)。

miyagawa: 大ざっぱに言うと、CPAN には、モジュールをアップロードすると、tarball の中にどのパッケージが入っているかっていうのを PAUSE がスキャンして、ヴァージョンナンバーとかをチェックするんですけど。インストールするときの素の情報がわからなくて、その情報を手元で作り直しているんですよね。

だけど PAUSE っていう、CPAN モジュールをアップロードするサーバは、Andreas König さんが作っているんだけど、それは普通のサーバと作り方が逆で。普通サーバっていうのは、プロトコルを決めたら、そのフォーマットに決めてアップロードしてもらって、そうじゃないのは却下するっていう作り方が普通なんですけど、PAUSE は何となくパーズするものがあって、いろんな人が変なモジュールをアップロードすると、それに対応する形でサーバを書き換えるっていう進化をしてきているので。いろんなところに「このモジュール用の特殊コード」みたいなのが入っていて、それを手元で再現しなきゃいけないっていう、かなり地獄な感じになっちゃってるんだよね。

tokuhirom: 一個直すと、他のモジュールが読み込めなくなったりとか。

miyagawa: その辺は石垣さんとかも頑張って直したりとか、僕もけっこう手伝ったりしているんだけど。この辺は PAUSE の方を、アップロードサーバを書き直すしかないんですよね、根本的には。

tokuhirom: そうですね。あとはみんなが、どのパッケージがどのヴァージョンを提供しているかっていう、メタデータをちゃんと送るように変わればいいんですけど。

miyagawa: みんなが変わるか、受ける側がそれがないやつは拒否っていう風に変えるかっていう。まあ何となく来年ぐらい、来年じゃなくてもいいんだけど、時間が取れたらやりたいなって思っていますけど。

6:40

miyagawa: それで、本当はその 1.0 に付けたかった機能がいくつか足りてなくて。具体的には、Git からインストールする機能とか。けっこう bundler を使っていると、gem を使うんだけどちょっとバグってて、プルリクエストを送ったんだけどレスポンスがなくて、でもとりあえずデプロイしたいから自分の fork を使う、みたいなことがけっこうあって。

CPANでも、そういうことがたまにあると思うんだけど、それが今はできないから。それを今やろうと思ったら、fork したやつの tarball を作って、自前のミラーを作るという形になるんですかね、たぶん。

tokuhirom: そうですねえ。あんまり綺麗じゃないですね。

miyagawa: あんまり綺麗じゃないね。具体的には、Jeff っていう人がやってる Stratopan とかはそういう発想で。GitHub とかに作った fork したやつを、fork したバージョンとしてミラーに登録しておいて、それをインストーラから使うみたいな感じなんだよね。

tokuhirom: なるほど。Stratopan はあまり細かく見ていないのでわからないんですけど。

miyagawa: tokuhirom が作ってる OrePAN も発想的にはそんな感じだよね。

tokuhirom: OrePAN は大体そういう挙動ですね。

miyagawa: あれは使ってるんですか?

tokuhirom: ええと、今は使ってないですね(笑)。何かのときに使おうと思って作って、その後使っていない感じですね。それか、あれは単に作れそうだから作っただけかもしれないですけど。

でもけっこう、あれは使ってる人がいるっぽくて。exodist っていうモノクロのアイコンの人が、最近すごい勢いでプルリクエストを送ってきてくれたりしてますね。

miyagawa: それは 2の方? 1の方?

tokuhirom: 2の方ですね。今は基本 2の方しかメンテしてないので、大体 2の方にプルリクエストが来ますね。1の方はちょっとコードが読みづらい感じなので。OrePAN 2 はほとんど Parse::LocalDistribution を使ってるだけなので、非常に読みやすいので。

miyagawa: まあ基本的には、Stratopan も OrePAN も、インストーラをいじるのが大変だから、サーバ側で PAUSE みたいな CPAN ミラーみたいなものを自前で作って、それを使おうっていう発想なんですよね。

tokuhirom: そうですね。あとはまあ、自前のモジュールをどんどんインストールさせるのが……まあでも、クライアント側でもうちょっと頑張ってくれれば、サーバ側でやらなくてもいいのかもしれないですけどね。

miyagawa: いわゆる DarkPAN っていう、社内モジュールみたいなものを管理したいっていうのがもしあれば、そういう使い方になっちゃうよね。

tokuhirom: そうですね。だからそれこそ、Git の URL から直接インストールとかが簡単にできるのであれば、べつに DarkPAN は要らないのかなって感じではありますね。

miyagawa: けっこう Perl のそういうソリューションは、クライアント側が CPAN.pm と CPANPLUS しかなくてハックしづらい状況が続いていたので、サーバ側を何となく作るっていうのがけっこう主流になってて。

で、cpanm と Carton を僕が作ったので、クライアント側の方で頑張るっていうことが出来るようになったので。それがやりやすくなってきてはいるんですけどね。

tokuhirom: そうですね。やっぱりここ数年、いろんな人がツールチェイン周りっていうか、CPAN 関連のやつをいろいろいじって、前よりは全体的に状況は良くなっている感じはしますね。

miyagawa: だからこれで、クライアント側の plenv とか perlbrew とか、cpanm、Carton とかが一段落したら、次はサーバ側を直すっていう方に行きたいなと思っているんだけど。

tokuhirom: かなり……茨の道な感じがしますけどね(笑)。

miyagawa: でもどうだろうね、tarball をアップロードしたやつを解析して、インデックスを作って、ゼロツール作るだけじゃないですか。パッケージリストを作るだけだから。まあ、すごいコーナーケースとかレアケースとかあるのが大変だと思うけど、理論としては簡単かなあと思っていて。

tokuhirom: そうですね。

11:37

miyagawa: この Carton という名前がね、emacs のパッケージ管理システムが Carton っていう名前だったんですよ。でも先週、cask っていうのにリネームされたみたいですね。

tokuhirom: あ、そうなんですか。antipop さんが「名前かぶってるから変えろや」ってプルリクエストを送ったら、「Perl なんてまだあったの?」みたいなことを言われてましたけどね(笑)。

miyagawa: emacs にも同じこと言われちゃうよね。

tokuhirom: お前がいうな的な感じの。

miyagawa: だけどちょうど僕が 1.0 出した次の日ぐらいに cask にリネームされてました。たまたまだと思うけど。

12:23

miyagawa: 1.1 は、さっき言ってた Git 機能とか、あと今 carton check とか carton exec とかがちゃんとチェックしてない時がたまにあって。

tokuhirom: (笑)。

miyagawa: 細かい話をすると長いんですけど、複数のマシンで同じコマンドを実行しても、そのときの Perl の状態によって結果が変わるんですよ。

tokuhirom: あー。

miyagawa: なので、そこをもうちょっと厳密にやりたいと思っている。まあそれが、YAPC で話すと思うので、YAPC のときにカンファレンスドリブンで 1.1 を出せたらいいかなと思っているんですけど。

tokuhirom: 今って、install.json から中身を取っているのが、install.json が古い cpanm で入れたときに、今いち上手くできてないとか。

miyagawa: それはね、でも解決したんですよ。

tokuhirom: あ、そうなんですか。

miyagawa: cpanm って、1ファイルなんですよね。だから perlbrew とか使っていると、cpanm が変なところに入ってて、Carton が期待する cpanm と一致してないっていうことがあったんですけど、それを直すために cpanm と同じ中身のファイルを .pm でインストールするようにして、それを使っているんですよ。

tokuhirom: なるほど。

miyagawa: だからこの間 Twitter で、それのせいで動きませんっていうのが来てたんだけど、それは直してるはずなんですよね。

14:00

miyagawa: 今 YAPCの話が出たので。この間出てもらったときも牧さんと一緒に YAPC::Asia の話をしたんですけどね。

tokuhirom: あの時に比べると YAPC::Asia も近づいてきたなっていう感じはありますね。

miyagawa: この間話したときはまだトークの募集が始まっていなかったんだけど、今回はもう出てるし、そもそもチケットの販売があと何日かで終わっちゃうみたいじゃないですか。

tokuhirom: そうみたいですね。意外と早いなっていう感じですけど。

miyagawa: 普段だと定数があって「売り切れ」ってなると思うんだけど。打ち切るというのは……人数を把握したい的なものがあるとは思うんですけど。

tokuhirom: よくわからないですね。でもなんか、書いてあるのを見るとTシャツ付きチケットが 8 月 12 日まで、みたいなことが書いてあるから、Tシャツなしだったらまた出るのかなと思ってたんですけど。

miyagawa: Tシャツの数をとりあえず確定させたいというのもあるかもしれないですけどね。なので、この Podcast をアップした時にはもうあと2日、3日ぐらいしかないと思いますから。行きたい人は早く買った方がいいですね。

tokuhirom: たしかに。もう今日の時点で9日ですからね。

miyagawa: あと、学生の人は無料だけど、登録はしておかないと無料にならないと思うので。

tokuhirom: そうですね。

miyagawa: それで、僕の作ったものの宣伝なんですけど。昨日の昼間にちょっとハックしてた、モバイルカレンダーっていうのを作りまして。チャットルームにあります。もし見ていない人がいれば。

YAPC::Asia のスケジュールアプリって、たまに有志で iOS 版とか Android 版とか、みんな一週間ぐらい前に思い出したように作るんですけど。大体間に合わないとか、submit したけど approve されないとか。けっこうあるんですよね。

tokuhirom: iOS はそれがきついですよね。Perl 時間だとそれが間に合わない。

miyagawa: 今年の4月に RailsConf に行ったときに、公式サイトのスケジュールはモバイル対応してなくて、ちょっと見づらかったんですね。アプリもなくて。で、誰かが移動時間の合間に作った HTML5 のアプリで、スケジュールとか全部オフライン対応しているっていうモバイルアプリ、というかサイトがありまして。

これをダウンロードしてきてよく見たら、JSON ファイルを作って、ただ HTML5 で、パブリックファイルを出すだけで行けたので、それをちょっと YAPC::Asia のスケジュールを持ってきて、作ればいいかなと思って。

最初は HTML を解析するところを作り始めたんですけど、かなりだるかったので、牧さんに JSON ないのって聞いたら、去年のコードがあったみたいで、それをもらうことが出来たので、かなり簡単にできましたね。

tokuhirom: けっこうこれ便利ですよ。

miyagawa: 一回読み込んじゃえば Wi-fi が切れても使えるし、あと星マークが付けられて、これはクライアントサイドだけで保存しているので、サーバ側には送られないんですけど、それも Cookie 的な感じで保存されるからけっこういいですよね。

なので、まだ気が早いですけど、ダウンロードしてみて当日使えるようにしておくといいんじゃないかなと。

18:10

miyagawa: tokuhirom は YAPC のトークは 1つ? 2つ?

tokuhirom: トークは 1つですね。あんまり多いようだったらもう一個の方は落としていいよって言っておいたので(笑)。

miyagawa: 2個 submit したのね。

tokuhirom: minilla の話をしようかなと思ったんですけど、もうだいぶ飽きてるかなという感じもあって(笑)。みんな使ってるので、すでに。

miyagawa: 使うべき人はもう使っちゃってるからっていう感じはあるよね。この間の Podcast に出てもらったときは、YAPC::NA に行く前だったと思うので、初めて行ってみて、それでこういうトークをしようっていう影響があった感じですかね。

tokuhirom: そうですね、accept された方はわりと影響ある感じですね。

miyagawa: 僕は今年、何年かぶりに YAPC::NA に行かなかったんですけど、YAPC::NA と比べてどんな感じですかね。

tokuhirom: いろいろ向こうの人とも話したりしたんですけど、やっぱり NA はみんな話を聞いてないですね(笑)。宮川さんがよく、日本の人はみんな話を聞きすぎって言ってますけど、実際、あ、こんなに話聞かないんだって思いますね。

ずっと廊下でパソコン開いてるだけの人とか、そこでハッカソンするからみんなおいでって Twitter で言ってる人とか、そういう人が多いのがやっぱり印象的で。

miyagawa: いわゆる Hallway Track というやつで、実際のスケジュールにあるトークを一個一個真面目に聞くのもいいんですけど、とくに見たいものがない時は無理して聞かないで、外で談笑するというか、駄弁るというか。そういう機会としての使われ方も多いですよね。

tokuhirom: やっぱりアメリカって広いっていうこともあるだろうし、みんなそんなに頻繁に会うことも出来ないので。YAPC のときに集まって、あの機能は実際どうだとか話をするとか、そういうところは大きいように感じますね。

miyagawa: 日本だと東京でかなり集中していることもあるし、小さいから、すぐ会えるっていう部分はアメリカに比べると少ないと思うけど。それでも地方から来ている人もいるだろうしね。

VIP Mixer っていうのは行きました? 初めて YAPC に参加する人と、YAPC のベテランとかキーノートスピーカーの人がオープンな場所で1時間ぐらい話す機会みたいなのがあるんですよ。

tokuhirom: スタンディングのパーティーみたいなやつですよね。それは行きました。行っていろんな人と話して。その後、お前らこの後どうするんだって聞かれて、BOF をやるから来い、みたいなことを言われて。のこのこついていったりもしましたけど。

miyagawa: 今年は YAPC::Asia でも BOF の時間と場所が用意されているみたいなので。僕が運営していたときも BOF やったら? みたいなことを軽くやってたんですけど、あんまりちゃんと使われていなかったんですが。ちゃんと場所を提供して、スロットとかを書けるようになっていれば意外とやるかもしれないですね。

tokuhirom: ただ、僕は BOFって日本だから成立しないのかなと思っていたんですけど、意外と YAPC::NA でも「BOF をやるぞ!」って言っても人が集まらないんだなって思いましたね(笑)。

miyagawa: RubyKaigi だと BOF っていう名前はないんですけど、アンカンファレンスできるみたいな部屋があって。そこにみんなペンでいろいろ書き込んでやっているのは、わりと使われているイメージがありましたけどね。

tokuhirom: それはけっこう使われているみたいですね。

miyagawa: 僕は初めて NA に行けなかったんですけど、OSCon の Perl トラックっていうのも一応あって。OSCon は元々、The Perl Conference から発展したものなので、一応あるんだけど、かなり縮小傾向にあってですね。僕のトークも 30 人ぐらいかな、来たのは。まあ部屋は半分ぐらいにはなったんですけど。

Larry Wall のキーノートがあったんだけど、それも 80〜100 人弱ぐらいですかね。けっこう OSCon における Perl っていうのは縮小傾向にあって。逆に YAPC::NA の方が全然人数が多いっていう感じに最近はなりつつあるかもしれないです。

23:50

miyagawa: tokuhirom は毎年、いろんな違うものをサクッと作ってやってるイメージがあるんだけど。最近は Perl6 をいじってるようなことをブログにも書いていたので。

tokuhirom: そうですね。

miyagawa: どういう感じのことをやってるのかなって思って。

tokuhirom: それは YAPC::Asia で喋る話の一部でもあるんですけど、元々 Perl6 って、Parrot っていう VM があって、それはあらゆる言語を実行可能な素晴らしい VM になるぞっていう、そういう感じで始まったプロジェクトだと思うんですけど、それがもう何年ですかね、だいぶ長いことやってて。

miyagawa: 12年ぐらいかな。

tokuhirom: 実際、あまり速度も出ていないと。そういった状況の中で、Rakudo っていう Perl6 の一番メインの実装が JVM に移植されて、JVM で意外と速く動いてるみたいな状況になってきて。それが今年の YAPC::NA ぐらいで一応、ひとつ発表できる段階までなったよ、みたいな話になってきて。

その YAPC::NA のちょい前ぐらいに、MoarVM っていう Perl6 専用の VM を新しく作ろうみたいな話が出てきて、そのあたりの話を YAPC::NA で見たりして。

Perl6 のコミュニティの人がやりたいのは、NQP っていう Perl6 のサブセットを実装して、それを MoarVM の上で動かして、その NQP で Rakudo を実装しておけば、NQP っていう Perl6 のサブセットさえ実装してしまえば、そのプラットフォームで動く。NQP を JVM で動かす、NQP を Parrot で動かす、NQP を MoarVM で動かすっていうところをそれぞれでやっておけば、もう Rakudo が完璧に動くから、いろんなところで run anywhere 的なことができるんだ、みたいなことを言っているんですね。

miyagawa: この MoarVM とか、Rakudo の JVM インポートは、Jonathan がやっているのかな、大体。

tokuhirom: そうですね。今は Jonathan とか Patrick Chad とか、その辺りの人が多いですね。あと MoarVM 自体のハックは、Jimmy Zhuo という人がけっこうやってますね。たぶん中国の人なのかな。

miyagawa: この MoarVM 自体は何で書かれているんですか?

tokuhirom: それは C です。

miyagawa: じゃあ一回 Rakudo、JVM にポートした後に NQP で書き直すということなのかな?

tokuhirom: 元々は JVM で動かすために Rakudo、NQP にポートした、みたいな感じのノリっぽいですね。

miyagawa: なるほどね。

tokuhirom: あとちょっとだけ Java でランタイムとかは書いていますけど、ほとんど NQP で書いてある。

miyagawa: NQP はたぶん Not Quite Perl の略ですよね。

tokuhirom: そうですね。で、そこまで出来たので、MoarVM っていう専用の VM を作って、その MoarVM の上で NQP を動かそうとしているところですね、MoarVM のチームは。

miyagawa: JVM を使うと Java のマルチスレッドとかを使えて良い、的なメリットがあるのかなと思ったんだけど。

tokuhirom: それはもちろんそうですね。現状だと、あらゆる面で JVM の方が Parrot よりも優れているので。スレッド周りとかは何も考えなくても、JVM の機能だけでかなり出来るので、けっこう動いているみたいではありますね。

miyagawa: 前に聞いたときは、JVM の起動時間を含めても、足し算とかは Rakudo より速いっていう話をしていた記憶がありますけどね。

tokuhirom: まあ、とはいえ JVM なので、遅いのは遅いですね、起動時間は。で、MoarVM は起動時間が気になってしょうがない人向けに作るんだ、みたいなことを最初言ってましたね。

miyagawa: 軽量に起動して、スレッドとかもちゃんと使えて、っていう感じですかね。

tokuhirom: そうですね。スレッド周りのサポートも今、一応入ってる感じですね。

miyagawa: Python の PyPy とかは、サブセットの RPython をターゲットにしてコンパイルして動かしたりとかしているけど、そういう意味で Perl6 を NQP っていう Perl6 のサブセットで記述していくっていう。まあブートストラップできるようにしていくということですよね。

tokuhirom: そうですね。そのアプローチを見て、MoarVM にコントリビュートしようと思ったんですけど、けっこう大変なんですよ。MoarVM 自体が大きくて。

で、とりあえず VM があるんだったら、あとはパーザーとコードジェネレーターがあればインタープリタとして動くから、とりあえず中の勉強も兼ねてパーザーとコードジェネレーターを書いてみようと思って最近書いている感じですね。

miyagawa: Perl6 のパーザーですか。

tokuhirom: そうですね。Perl6 のパーザーで PVIP っていうのを書いていて、それが最近それなりに動くようになってきてますね。

miyagawa: Perl6 の文法って、PEG とか使って自分で記述できる言語だったような気がするんですけど、そういうのではなくて、別のアプローチでパーズするようにしたっていうことでいいんですかね。

tokuhirom: いや、普通に C で書こうと思って。C を生成する PEG パーザーを使ってやっていますね。

miyagawa: じゃあ PEG の部分は共有されていて、それを C にコンパイル?

tokuhirom: 共有っていうか、Perl6 のやつとはまた別個にまた一から書いていますけど、あれもかなり取っ付きづらくて(笑)。なので一から書いていますけど。

やっぱり文法自体、かなり無理があるというか(笑)。頑張ってる文法なので。Perl5 よりはましですけども。普通に Lexer とか、字句解析器的なものを一回挟んで、その後にパーザーを動かして、みたいな普通のやり方だと、なかなかちょっと難しい感じですね。曖昧なところが若干あったりするので。

miyagawa: じゃあ一回パーズした後、ダイナミックに実行していく。インタープリターもそこから書かなきゃいけないわけですよね。

tokuhirom: そこまでではないです。一部分、この記号がどういう意味になるかみたいなのが場所によって違ったりとかはあるので、その辺は微妙ですけど。

miyagawa: Perl5 とかだと、モジュールの中身とかがあると、それを一回評価して、インポートする/しないで結果が変わったりするから、激しく曖昧なんだけど。

tokuhirom: そうなんですよね。あれに比べたら全然やりやすいです。やっぱり Perl5 ってコンパイル時にコードを実行するみたいなのがけっこうできるし。関数が定義されているか/いないかで挙動が変わるとか、そういうのがけっこうあるので。

miyagawa: とくにビルトインの関数とか、ビルトインじゃなくてもそうだけど、ベアワード的なものの評価のされ方が、その名前の関数がそのネームスペースにあるかないかで、パーズのされ方が変わるとかあるよね。字面からは評価できないですよね。

tokuhirom: そういった点では Perl6 はだいぶすっきりしてますね。

32:50

miyagawa: 去年の LL とかでは Perl7 とか(笑)、Perl6 のような新しいプログラミング言語を作ったりしていたけど、それを一旦やめて Perl6 になったんですかね。

tokuhirom: そうですね、最近はその方針の方がもうちょっと使われる余地が大きかなっていうところでやってますね。

過去に Shika っていう黒歴史的なモジュールがあるんですけど(笑)。Moose っていう Perl5 のオブジェクトまわりを何とかしようっていうプロジェクトを Stevan Little っていう人がやってて。それが設計自体、インターフェイスとかはすごくいいんだけど、一方ですごく遅くて、使い物にならないと。というか、使っている人はいるんですけど、けっこう遅いよねっていう話があったりして。

そういう時に、オルタナティブな実装として、軽量で、速いけど機能が足りないみたいな実装が出てくることによって、重い実装の方も、あ、これはやばいっていう感じになって、もうちょっと速くチューニングしていこうか、みたいな感じになるみたいな。そういう面もあるだろうし。

今の Perl6 の実装の方針っていうのは、NQP っていうので書けばどこでも動くっていう、わりと夢見がちというか(笑)、それで上手くいけばいいんですけど、それで速度が出るのかどうか、というところもあるので、機能は少なめだけど、とりあえず動くっていうのを一回やってみようかなっていう。まだやってみようかなレベルですけど。

あと、一回それを実際に作ってみておけば、今後 Perl6 がすごい流行ってきたりした場合に、だいぶ中身のことも知っているからやりやすいだろうっていう。いろいろそういう目論見もありつつ、ですね。

miyagawa: Perl5 は VM が一個しかないけど、Perl6 はそういう意味では最初から、Pugs とか Rakudo とか、あと Niecza とか。複数の VM が競争というのかな、違うアプローチで物をいっぱい作っているので、そういう中でもう一個増えるというのは、自然な考え方ではありますよね。

tokuhirom: 今は Rakudo 以外はあんまり注目されていないですけど、実際、その Niecza ですか、.Net のやつですよね。あれとかも一応開発が進んでいるし。いろいろ試してみて、やってみたいなっていう感じですね。

miyagawa: それは Perl6 のコミュニティの人からは何かフィードバックがあったりするんですか?

tokuhirom: いや、Perl6 の人は怖いので(笑)。ある程度出来上がってから見せようかなって感じですけどね。

miyagawa: あんまり怖い印象ないですけど、僕は。

tokuhirom: いやなんか、一回ちょっと IRC で話したら、けっこう面倒くさい絡み方してくる人がいて。

miyagawa: (笑)。

tokuhirom: 何言ってるのかわからない人とかがいて(笑)。あと今 MoarVM とかの人がやりたいこととだいぶずれてるから。

miyagawa: コミュニティの方向性としてはちょっと違うかもしれない、と。

tokuhirom: そうですね。まあ、それはべつにいいんですけど、もうちょっと出来上がってからやろうかなと。一応、それなりに出来てきてはいて、今 roast っていう Perl6 のテストスイートがあって。それを全部クリアしたら Perl6 としてパーフェクトだっていう感じのテストスイートがあるんですけど。それを今 PVIP でパーズできるのが32% ぐらいまで来ていて。900ぐらいある内の270ぐらいまで出来るみたいな感じになってて。

あと、Kiji っていう Perl6 の実装の方は、今5個行ってます。

miyagawa: Kiji っていうのは、tokuhirom が作っているランタイム?

tokuhirom: そうです。その PVIP でパーズした結果をもとに、MoarVM のコードを生成するっていう。

miyagawa: そのパーザーのテストスイートっていうのは、パーズした結果が正しいかどうかをどうやってチェックするんですか?

tokuhirom: パーザーが全部パーズできたら OK です。

miyagawa: パーズして、どういう構成のツリーができたかっていう比較する方法がある?

tokuhirom: いや、比較してないです。シンタックスエラーが出なかければ OK。

miyagawa: ああ、そうなんだ。

tokuhirom: 一応 PVIP 自体をテストするためのテストケースみたいなものを別個で用意してあるので、パーズ結果自体は問題ないはずなんですけど。

miyagawa: 実際の実行結果っていうのは、でもそのパーザーだけじゃなくてランタイムがないとわからないわけだよね。パーズした段階で合っているかどうかは、何となくエラーが出ないから良しとしようっていう感じなんですか。

tokuhirom: そうです。まあでも実際、あんまり問題ないですけどね。

miyagawa: 今の Perl6 を完全にパスする実装ってあるんですか?

tokuhirom: 今は全然、まだ Rakudo もけっこうスキップしてますよ、テストケースは。

miyagawa: じゃあまだ言語として完成した実装は一個もないと。

tokuhirom: そうですね。というか、言語自体が完成しているかがけっこう微妙ですけど(笑)。

miyagawa: たしかに。

tokuhirom: 元々、その roast のテストスイート自体も日々変わってて、どんどんテストケースが増えているので。どっちかというと Rakudo とかの方が、テストスイートとして本当に roast を使ってる、みたいな感じだったりもするので。

Rakudoの JVM でこのコードで落ちたからこのコードをとりあえずテストケースとして入れておく、みたいなコメントがついたコードとかもあったりするので。

miyagawa: Ruby の RSpec だっけ、Ruby という言語がどういう言語であるべきかっていうテストスイートとかを ISO に登録するので作ったりしたと思うんですけど。イメージとしては、言語がこうあるべきだっていうテストスイートがあって、各実装がそれを共有していくっていう感じですかね。

tokuhirom: そうですね。テストスイートが巨大すぎて、これ本当に実装するの? みたいなのもけっこうあるので、まあどうなるかわからないですけど。

miyagawa: さっき Perl5 は一個しか実装がないって言ったけど、一応 Perl5 オルタナティブみたいなのも今年に入って、いくつか出てきたりしているけどね。Moe とか。p2 とかって、Perl5 なんですかね?

tokuhirom: p2 は、Perl5 も Perl6 も実行できるっていう。

miyagawa: そうなんだ。

tokuhirom: そういう VM を作りたいっていう話っぽくて。

miyagawa: 実装ではないのね。

tokuhirom: 実装も含むんですけど、作りたいのは VM みたいです。だから一応 Perl5 のパーザー、まあサブセットみたいなやつと Perl6 のサブセットみたいなやつがディストリビューションには入ってますね。

Perl5 の方が今年の夏で 50% 文法をサポートできるって、Reini (Urban) は言ってましたね。ただ、Perl5 の 50% っていうのがどこまでなのかよくわからないですけどね(笑)。

miyagawa: かなり疑問があるね。さっきも言ったけど、文法がサポートされているっていうのは、結果がリライヤブルなのかどうかっていう事とはちょっと違うから。

tokuhirom: あと Perl5 の 50% が動いたところで、じゃあ何に使うかっていうのが微妙なところなので。

miyagawa: CPAN のコードが動かないとキツイからね。なかなか難しそうですけどね。

tokuhirom: そうですね。……これあんまり喋りすぎると、YAPC で話す話がだいぶ出ちゃうので(笑)。

miyagawa: それあるよね。

tokuhirom: べつにわかっててもいいんですけど。みんながみんな聴いているわけでもないだろうし。

miyagawa: まあ YAPC::Asia に来る人は 5000 人ぐらい居るわけで。全員が聞いているわけではないだろうし。

42:30

miyagawa: 何か最近、それ以外で作っているソフトウェアとか、プロダクトとかあるんですか?

tokuhirom: ありますね。昨日の夕方から作り始めたのがあって。

miyagawa: おお。

tokuhirom: 前に、Term::ReadLine::EditLine っていうのを作ったんですよ。libeditline の Perl の拡張ですよね。それを作ったんですけど、ちょっと不安定なところがあったりして。Pure Perl で書けたらいいなっていうのはあったんですね。

で、昨日ちょうど、Linenoise っていうライブラリがあるのを発見しまして。すごく小さい実装で、C で 2000 行だったかな…… そんなにない、885 行しかない実装で。これが BSD ライセンスで使いやすいのと、Redis とか MongoDB ですでに使われているっていうのがあって、これをそのまま Pure Perl で移植したらいいだろうっていうのがあって。

miyagawa: Pure Perl で書くんだ。

tokuhirom: Pure Perl で移植して、大体できたんですけど。それが最近は出そうですね。

miyagawa: これは書いてるのが antirez って、Redis の作者ですね。じゃあ Redis の CLI ツールで使っている感じかな、これは。

tokuhirom: たぶんそうです。

miyagawa: XS 実装を作るのではなくて、Pure Perl で書くと。

tokuhirom: Pure Perl で移植しました。本当に POSIX.pm とかしか使ってないので、依存なしで。

miyagawa: じゃあ、ついに MacOS でもちゃんとコマンド補完とかヒストリーがちゃんと動く、コマンドラインのライブラリができると。

まあでも、それ以前に Term::ReadLine っていうベースモジュールの API がクソだっていうのもありますけどね。

tokuhirom: そうですねえ。僕が作ったやつは本当に Pure Perl で、インターフェイスもそれなりに作ってあるので、Term::ReadLine 経由じゃなくて、これを直で使ってもらえばいいのかなって感じですね。

miyagawa: Term::ReadLine っていうのはコアモジュールですよね、たしか。ちゃんとしたバックエンドの実装がないので、上キーとか押してもちゃんとヒストリーが出てこないっていうゴミ実装がデフォルトで入っていて。

みんな Pure Perl 実装とか libreadline とかを使うんだけど、Mac の libreadline っていうのは libeditline っていうのにリンクされていてちゃんと動かないから、使いたい人は homebrew で入れ直して、とか無茶苦茶めんどくさいことしなくちゃいけなくて。こんな単純なことが何で動かないのかっていう感じなんだけど。ちゃんとまともにできるやつが欲しいですね。

tokuhirom: そうですね。

miyagawa: それは Linenoise っていう名前なんですか。それとも違う名前?

tokuhirom: とりあえず lineなんとか って名前にしようと思って。ググって、最終的には Caroline っていう名前にしたんですけど。

miyagawa: またダジャレですか。

tokuhirom: いや、単にググっていたら、Caroline っていうのが出てきたのでそれを付けただけですけど(笑)。なんか普通に人の名前っぽい感じですけどね。

47:00

miyagawa: 今は何万人ぐらい視聴されているんですか? という質問が来ましたけど、何万人も聴いてないですね (笑)。

tokuhirom: (笑)。

miyagawa: たぶんライブで聴いている人は、50人ぐらいです。でもこの間、土日の夕方にやったときは100人ぐらい聴いてましたね。ライブでやると。

Podcastの方は、前回のエピソードでフィードを移したっていう話をしたんですけど。FeedBurner と FeedPress とでカウントの仕方が違うんですね。FeedBurner は、その日一日にアクセスしたユニークなユーザーを出してくれるんですけど、FeedPress はたぶん一週間分ぐらいをマージして、週に1回とかしか起動していない人も別のユーザーとしてカウントするんですよ。

だから、たとえば携帯で 3G とかからアクセスしている人は、たぶん毎日違う IP になって違うカウントになっちゃうんじゃないかなと思っていて。だから、どっちが正しいのかわからないんですけど、まあ1万は行ってないです。ただ、けっこう増えてきてますね、移してから。

tokuhirom: 思い出したときに Web で見てる人とかも多そうですか。

miyagawa: そうなんですよね。JavaScript で、Google アナリティクスでイベントを取っているんですけど、RSS フィードを読んでいる人と Web 上でプレイヤーで再生する人の比はたぶん 4:1 ぐらい。なので 20% ぐらいは、毎回は聴いてないけどブラウザで聴いているという人なんだと思いますね。

48:50

Transcribed by Hiroaki Kadomatsu

Download Transcript