その後のその後

iOSエンジニア 堤 修一のブログ github.com/shu223

Googleリポジトリのコントリビュータになりたくて19日間粘った話

「Google リポジトリのコントリビュータです」って言えたらかっこいいなぁというミーハー精神からプルリクを送り、却下されそうになりつつも粘ってマージしてもらって CONTRIBUTORS に名前も入れてもらえた(まだ世界で9人しかいない!)、という経緯について、嬉しいので書いておこうと思います。

google/eddystone リポジトリ

Google が提唱しているビーコン規格、「Eddystone」というものがありまして、これは Apple の iBeacon の対抗規格となるわけですが、その売りのひとつとして、「オープン」である、という点があります。


そんなわけで、Google社のリポジトリ google/eddystone にて、その規格やサンプルコード、関連ツール等が公開されています。

最初のプルリク

先日の海外案件にて iBeacon をいじっていたときに、とある「クローズドの壁」にぶつかり、Eddybeacon も試してみるかー、という話になったのが発端です。


で、下記記事にも書いたのですが、Google の Eddystone リポジトリに置いてある iOS 向けのサンプルが不完全で、肝心の Eddystone-URL フレームタイプがサポートされていない、という状態でした。


Eddystone の仕様について勉強しつつ Google のコードを読んでいるうちに、「自分が実装するならこのへんにこう書くな」というのが思い浮かんできて、それと冒頭に書いたようなミーハー心も手伝って、コードを修正してプルリクを送ってみました。

Travis CI のテストが通らない・・・

こんな感じで failed になってしまいました。

さっくりあきらめようかとも思いましたが、ログをよく見ると自分がやった修正と全然関係ないところで引っかかっていて、他のプルリクの自動テスト結果を見ると同じログが出ていたところもあったので、コミットログからコミッタらしき人に連絡をとってみました。

Hi, my pull request could not pass the check by Travis CI, however this error seem not to be caused by my changes. Please confirm my changes don't cause errors and merge. Thanks.

(このエラーって僕の修正のせいじゃないと思うんだけど見てもらえますか?)


で、このコミッタの mashbridge さんがいろいろな人に連絡をとってくれて、g-ortuno さんという人が Travis を直してくれたのでした。

フィードバック→修正の繰り返し

プルリクの修正の中身については、marcwan さんという人がフィードバックをくれました。


「インデントは4スペースじゃなくて2スペースを使うように」とか「1行あたり100文字を超えないように」とか以外の大きいフィードバックとしては、

This pull request basically adds support for an Eddystone beacon sending out both URL and UID frames. It would be nice if we could also support just scanning and reporting for URL frames as well, even if the underlying hardware isn't broadcasting UID frames.

For this, I had thought to add a new didFindURL:(NSUUID *) method to the delegate class. IF a beacon has URL + UID, then they'll get the didFindBeacon: as they currently do, but whenever we see a URL, we could also fire a didFindURL: delegate as well (provided people are listening to it).

Should we fold in duplicates of a given URL within a certain timeframe? Probably. Maybe don't report a URL more than once a minute?

I can do this new change, or if you're feeling super energetic, you're welcome to contribute that too ^_^

というものがあり、修正イメージがすぐに湧いたしそんなに大変じゃなさそうだったので対応してpushしました。


(Eddystoneの仕様や実装の細かい話については、下記記事もご参照ください)

CONTRIBUTORS に!

そんなこんなで

Awesome, Played around with it and it seems great, thanks so much!

とマージしてくれそうな雰囲気になり、

Do you want to add yourself to the CONTRIBUTORS file too?

と、あちらから CONTRIBUTORS ファイルへ僕の名前を追加することを申し出てくれたのでした。

中身を見るとまだ9名しかいない(2015年12月現在)のでこれはかなり嬉しかったです。


おわりに

そんなこんなで、最初のプルリクから19日後に、google/eddystone リポジトリに自分のソースコードをマージしてもらうことができました。といってもほとんどは待ち時間で、そんなにすごいやりとりがあったわけではないのですが、Travis CI のよくわからないエラーで fail になったときに面倒ながらも問い合わせコメントを書いてみたところが分岐点だったなと。確か、いったんはあきらめたのですが、思い直してダメ元でコメント書いてみてよかったです。せっかくなので LinkedIn にも書いておこうと思います!

余談:その他の著名リポジトリへのContributions

あまり書く機会もないので、過去にマージしてもらえた著名リポジトリへのプルリクもここで掘り起こしてみたいと思います。

GPUImage

iOSにおける画像処理ライブラリのデファクトスタンダード。

バイラテラルフィルタのシェーダのパラメータの修正。修正量は少ないですが、GPUImage のシェーダのソースをいろいろと読み、バイラテラルフィルタの特性をちゃんと理解しての修正なので、ある程度の貢献ではあると思います。

appledoc

Apple風ドキュメントを生成してくれるツール。

僕の環境で落ちて使えなかったので、判定を入れただけ。あまり本質的な修正でもないので、それほど誇れる話ではないです。

LGBluetooth

Core Bluetooth のラッパーライブラリ。

LGBluetooth は元のリポジトリが消えて、別のところに移されたので、残念ながらプルリクのログは残っていないようです。が、コミットログには残っています。当時は案件でも使っていたので自分の必要な機能を追加してはプルリクを送っていました。

facebook/pop

Facebook の Paper が話題になった頃に公開され、同アプリで使われているということでこちらも話題になったアニメーションエンジン。


ソースの規模が他のアニメーション系ライブラリと比べて大きく、何をやっているんだろう、とソースを読んでみようとして、

どのクラスがどういう役割なのかを把握しようと思ったところ無駄に依存し合ってる部分が多くあって設計指針が把握しづらいと感じたので、依存関係を整理してプルリクを送ったのでした。




他にも大小あります。不具合修正や、他の人も必要になるであろう機能追加であればなるべくpull requestを送るようにしています。