だいたいのことはタイトルで言い尽くした。 Docker でビルドする、という workaround で凌いでいるけど、根本的な原因も解決策も分かっていない……
続きを読むPerl 6 のモジュールエコシステムの話とモジュールを公開する話 (2016年12月版)
このエントリは はてなエンジニアアドベントカレンダー2016の13日目のエントリです。12日目のエントリは追って書かれる見込みです。
それぞれ力のこもったエントリが並んでいるところ恐縮ですが、 Perl 6 の話をカジュアルにしようと思います。そして、この話は先日 YAPC::Hokkaido で LT した "Publishing a Perl6 Module" を revise の上ブログエントリにしたためた物でもあります。
このエントリを読むことで Perl 6 のモジュールエコシステムについて雰囲気を感じてもらったり、あわよくばちょっと面白そうだから Perl 6 のモジュールを書いてみるかと思ってもらえれば幸いです。一方で、 Perl 6 のコードの書き方のような話はほぼしないので、その辺は一般的な Perl 6 入門的なドキュメントを探していただければと思います。
なお、前述したようにこのエントリは"はてなエンジニアアドベントカレンダー2016"の一部ではありますが、 Perl 6 は特にはてなの中で利用されているわけではなく、このエントリは id:astj の完全な趣味によって書かれています。
YAPC::Hokkaido 2016 に行ってきた("Publishing a Perl6 Module" というタイトルで LT した)
京都から行ってきました。というか飛行機欠航で翌日振り替えになったので、このエントリを書いている12/11夜時点ではまだ北海道にいます。明日の朝飛行機が飛ぶことを祈っています。なので現時点では京都から「来ています」の方が正確かもしれません。
追記しておくと12/12に無事京都に帰ることに成功しています。おつかれさまでした。
エンジニア立ち居振舞い: プルリクエストは全部見る
だいたいタイトルが全て。GitHub (or GitHub Enterprise) で仕事をしているので、コードに誰かが何か変更を加えようとするときはプルリクエストを出すことになる。普段仕事をするとき、仕事のリポジトリに誰かがプルリクエストが submit したらそれを全部一旦眺めるようにしている。眺めると言っても実際にコードレビューを全部僕がしている訳ではなくて、コードベースのどの辺を変えようとしているのか、どう変えようとしているかとかをなんとなく把握しておこうとしている。そのまま本当にレビューすることもあるし、ざっと見るだけのこともある。
把握しておくと何かと便利で、他の人のタスクと競合しそうなプルリクエストを見つけたときに「こっちとぶつかりそうですね」とコメントしておいたり、なんだかたいへんそうなプルリクエストを見つけたときに「ちょっと相談しませんか」とこちらから声をかけたりできる。交通整理的な趣きがある。競合しそうという話題に近いところで言うと、自分のタスクで周辺を触りそうなプルリクエストの方針などを把握しておくと次に触るときにフォローしやすいということもある。
また、触りだして日が浅いリポジトリではさらにしっかりめに見るようにしていて、他の人の変更箇所を追いかけることでコードベースを理解するのに役立つと思っている。
しかしまぁ、これを全員がやるといかにもチームの効率が悪そうという話もあって、そうなると僕がこういうことをしているのも効率が悪いのかもしれない……
Perl6 で特定のモジュールがどのリポジトリから提供されているか調べる
そうです Perl6 です。
Perl6 のモジュールは github の perl6/ecosystem というリポジトリで管理されており、新しいモジュールを登録するには、そのモジュールのメタ情報の URL を perl6/ecosystem にコミットするとよい、ということになっている。
この辺に列挙されている様子が見える。すごい。
ecosystem/META.list at master · perl6/ecosystem · GitHub
Perl6 を書いていると、「このモジュールはどこから提供されているものだろう」と調べたくなることがあるのだけど、そういう時はこのデータを元に生成されている json を取ってきて jq でごちゃごちゃやると得られるようだった。
たとえばMonitor::Monit
を提供してるリポジトリが知りたいときはこういう感じで投げると調べられる。実際は curl した結果はどこかに保存しておくとよさそう。というか Perl6 が内部で持ってたりするのかな。。。
$ curl -s http://ecosystem-api.p6c.org/projects.json | jq '.[] | select( .provides | has("Monitor::Monit"))' { "resources": [], "support": { "source": "git://github.com/jonathanstowe/Monitor-Monit.git" }, "tags": [ "monitor", "api", "system" ], "version": "0.0.1", "test-depends": [ "Test", "CheckSocket" ], "auth": "github:jonathanstowe", "license": "perl", "perl": "6.c", "meta6": "0", "name": "Monitor::Monit", "build-depends": [], "authors": [ "Jonathan Stowe <jns+gh@gellyfish.co.uk>" ], "description": "Provide an interface to the monit monitoring daemon", "depends": [ "HTTP::UserAgent", "URI::Template", "XML::Class" ], "source-url": "git://github.com/jonathanstowe/Monitor-Monit.git", "provides": { "Monitor::Monit": "lib/Monitor/Monit.pm" } }
今回探していたのは HTTP::Response
なのだけど、探したところ2つのリポジトリから違う物が提供されていることが分かってニッコリ。実際は片方は Role で片方が実装ということのようなのだけど(よくわかってない)、何か難しい世界に来たような気がしますね。
$ curl -s http://ecosystem-api.p6c.org/projects.json | jq '.[] | select( .provides | has("HTTP::Response"))' { "version": "1.1.23", "perl": "6.c", "description": "Web user agent", "author": "github:sergot", "name": "HTTP::UserAgent", "test-depends": [ "IO::Capture::Simple" ], "depends": [ "HTTP::Status", "File::Temp", "DateTime::Parse", "Encode", "MIME::Base64", "URI" ], "source-url": "git://github.com/sergot/http-useragent.git", "provides": { "HTTP::MediaType": "lib/HTTP/MediaType.pm6", "HTTP::UserAgent": "lib/HTTP/UserAgent.pm6", "HTTP::Cookie": "lib/HTTP/Cookie.pm6", "HTTP::Header::Field": "lib/HTTP/Header/Field.pm6", "HTTP::Cookies": "lib/HTTP/Cookies.pm6", "HTTP::Request::Common": "lib/HTTP/Request/Common.pm6", "HTTP::Request": "lib/HTTP/Request.pm6", "HTTP::Response": "lib/HTTP/Response.pm6", "HTTP::Message": "lib/HTTP/Message.pm6", "HTTP::UserAgent::Common": "lib/HTTP/UserAgent/Common.pm6", "HTTP::Header": "lib/HTTP/Header.pm6" } } { "version": "0.1", "description": "role for HTTP::Server so we can have start building out some servers with interchangeable backends", "perl": "6.*", "source-url": "git://github.com/tony-o/perl6-http-server.git", "depends": [], "provides": { "HTTP::Response": "lib/HTTP/Response.pm6", "HTTP::Request": "lib/HTTP/Request.pm6", "HTTP::Server": "lib/HTTP/Server.pm6" }, "author": "github:tony-o", "name": "HTTP::Server" }
こちらからは以上です。頑張っていきましょう。
追記
こういうようにすると、特定のモジュールに依存しているパッケージを探すことも出来る。
$ curl -s http://ecosystem-api.p6c.org/projects.json | jq '.[] | select( .depends | .[]? == "HTTP::UserAgent" )'
Travis CI で go のバイナリを GitHub Releases に上げるようにした
特別目新しい話は多分ないと思うけど、まあやったので。
リポジトリ
mackerel-plugin-darwin-battery という Mackerel 用のエージェント。
github.com
この記事で書いたやつ。
astj.hatenablog.com
go のバイナリを作るので GitHub release にアップロードできると便利そう、ということでやった。別にこれくらいなら手でビルドすればいいんだけど、仕事でもちょっと Travis 触ってることもあって試しに Travis でやってみる。
Travis CI は組み込みで GitHub Releases へのアップロード機能があるので、ひとまずはそれにお任せしてみる。