平常運転

アニソンが好き

過去記事とかは記事一覧で見れます

Perl 6 のモジュールエコシステムの話とモジュールを公開する話 (2016年12月版)

このエントリは はてなエンジニアアドベントカレンダー2016の13日目のエントリです。12日目のエントリは追って書かれる見込みです。
それぞれ力のこもったエントリが並んでいるところ恐縮ですが、 Perl 6 の話をカジュアルにしようと思います。そして、この話は先日 YAPC::Hokkaido で LT した "Publishing a Perl6 Module" を revise の上ブログエントリにしたためた物でもあります。

www.slideshare.net

このエントリを読むことで Perl 6 のモジュールエコシステムについて雰囲気を感じてもらったり、あわよくばちょっと面白そうだから Perl 6 のモジュールを書いてみるかと思ってもらえれば幸いです。一方で、 Perl 6 のコードの書き方のような話はほぼしないので、その辺は一般的な Perl 6 入門的なドキュメントを探していただければと思います。
なお、前述したようにこのエントリは"はてなエンジニアアドベントカレンダー2016"の一部ではありますが、 Perl 6 は特にはてなの中で利用されているわけではなく、このエントリは id:astj の完全な趣味によって書かれています。

続きを読む

YAPC::Hokkaido 2016 に行ってきた("Publishing a Perl6 Module" というタイトルで LT した)

YAPC::Hokkaido 2016 SAPPORO

京都から行ってきました。というか飛行機欠航で翌日振り替えになったので、このエントリを書いている12/11夜時点ではまだ北海道にいます。明日の朝飛行機が飛ぶことを祈っています。なので現時点では京都から「来ています」の方が正確かもしれません。
追記しておくと12/12に無事京都に帰ることに成功しています。おつかれさまでした。

続きを読む

エンジニア立ち居振舞い: プルリクエストは全部見る

お題「エンジニア立ち居振舞い」

だいたいタイトルが全て。GitHub (or GitHub Enterprise) で仕事をしているので、コードに誰かが何か変更を加えようとするときはプルリクエストを出すことになる。普段仕事をするとき、仕事のリポジトリに誰かがプルリクエストが submit したらそれを全部一旦眺めるようにしている。眺めると言っても実際にコードレビューを全部僕がしている訳ではなくて、コードベースのどの辺を変えようとしているのか、どう変えようとしているかとかをなんとなく把握しておこうとしている。そのまま本当にレビューすることもあるし、ざっと見るだけのこともある。
把握しておくと何かと便利で、他の人のタスクと競合しそうなプルリクエストを見つけたときに「こっちとぶつかりそうですね」とコメントしておいたり、なんだかたいへんそうなプルリクエストを見つけたときに「ちょっと相談しませんか」とこちらから声をかけたりできる。交通整理的な趣きがある。競合しそうという話題に近いところで言うと、自分のタスクで周辺を触りそうなプルリクエストの方針などを把握しておくと次に触るときにフォローしやすいということもある。
また、触りだして日が浅いリポジトリではさらにしっかりめに見るようにしていて、他の人の変更箇所を追いかけることでコードベースを理解するのに役立つと思っている。

しかしまぁ、これを全員がやるといかにもチームの効率が悪そうという話もあって、そうなると僕がこういうことをしているのも効率が悪いのかもしれない……

Perl6 で特定のモジュールがどのリポジトリから提供されているか調べる

そうです Perl6 です。

Perl6 のモジュールは githubperl6/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 へのアップロード機能があるので、ひとまずはそれにお任せしてみる。

GitHub Releases Uploading - Travis CI

続きを読む

Google Apps Script で DropBox の使用量を Mackerel のサービスメトリックに投稿する

Mackerel のサービスメトリックを投稿する環境についていろいろ考えると投稿スクリプトを動かし続ける環境を用意するのが面倒になりがちなのだけど、外部の Web サービスなどからさっと API で取れる情報であれば Google Apps Script (以下 GAS)で動かすのが便利そうだということに気付いた。

ということで、自分の DropBox の使用量を Mackerel のサービスメトリックに投稿するスクリプトを GAS で書いたのでその話をする。

続きを読む