Intel Edisonの開発に貢献する

　もしかしてこれって，ネタになる？ということで．
# 概要
　Edisonと言うか，EdisonとかGalileoとか，最近だとRaspberry Piとかでも共通で使える，[libmraa](https://github.com/intel-iot-devkit/mraa)というGPIOを叩く共通ライブラリがあります．これに機能追加案を出して，採用してもらいました．

# 手順
１．Gitをインストールする．
$ sudo apt-get install git

２．[GitHub](https://github.com/)にアカウントを作る．

３．GitHubにSSHキーを登録する．
　[このへん](https://help.github.com/articles/generating-ssh-keys/)（本家英語）．Web上に他にもたくさん説明あるので，探してみそ．

４．Gitに自分の名前とメールアドレスを登録する．
$ git config --global user.name "名前"
$ git config --global user.email someone@example.com
　後で重要になります．また，libmraaの場合は，[本名でないと受け付けないというルールになっています．ハンドルネーム不可](https://github.com/intel-iot-devkit/mraa/blob/master/docs/contributing.md)．

４．[本家のページ](https://github.com/intel-iot-devkit/mraa)の右上あたりにある「Fork」をクリックする．
　これで，自分用のlibmraaのリポジトリが作成されます．

５．ソースコードを自分のリポジトリからクローンする．
$ git clone https://github.com/yoneken/mraa.git
　みたいなかんじになります．

６．自分の修正用のブランチを切る
　自分が修正している間に，本家でもソースを更新しているので，その差分が分かりやすいように，自分用の作業履歴を作るっていうイメージです．
　クローンしたディレクトリの中で，
$ git branch -b *myfunc*
とかすると， *myfunc* という名前のブランチが切れます．本当は，もっと”何の機能を追加したのか”がわかりやすい名前だと良いですね．

７．シコシコとソースを修正する
　ここで注意なのですが，修正点は，小さければ小さいほど良いです．あまりに大きな修正ですと，それを取り込むべきかどうかの議論が先に必要になってしまうので．そんな場合は，先にGitHub上でIssueを出して議論してからソースの修正に入りましょう．
　当然ですが，修正する先のコーディングスタイルに準拠するようにしましょう．修正したコードを取り込むかどうかの最終判断が，コードの管理者が持っているので，オレオレコーディング規約なんか絶対に受け入れてくれません．

８．リポジトリにコミットする
$ git commit -a -s -m " *コメント* "
　修正ができたら，コメントを付けてコミット．このときに，"-s"オプションを入れることで，自分の名前とメールアドレスでコミットにサインを入れることになります．このサインを入れることで，[ここ](https://github.com/intel-iot-devkit/mraa/blob/master/docs/contributing.md)に書いてある，「このコードは全部，自分が書いたものですよ」「自分の書いたコードをオープンソースにしてもらってかまわないですよ」という意思表示になります．これがないと，libmraa本家は受け付けてくれません．

９．GitHubにプッシュする
$ git push origin *myfunc*
　修正点をGitHubの自分のリポジトリにアップロードすることになります．

１０．GitHubの自分のリポジトリから，プルリクエストする
　GitHubで自分のリポジトリを見ると，「Pull Request」みたいな緑色のボタンが出て来ていると思います．
　それを押すと，本家との差分が抽出され，本家にコメントと一緒に投げられるようになっています．コメント欄で，自分がどのような修正をしたのか，その修正によってどのような恩恵が得られるのかを説明しましょう．

　私の場合は，GPIOの割り込みが入ったときのコールバック関数内で，割り込みを入れたピンの番号が知りたかったので，以下のように，サンプルコードを添えて提出しました．

>I add a function named mraa_gpio_get_pin .
This function is useful to restore a physical pin number in callback function.

>For example,
>
```
void interrupt_in(void *arg)
{
  mraa_gpio_context dev = (mraa_gpio_context)arg;
  printf("Pushed %d", mraa_gpio_get_pin(dev));
}
>
int main(int argc, char *argv[])
{
  mraa_gpio_context in0 = mraa_gpio_init(14);
  mraa_gpio_dir(in0, MRAA_GPIO_IN);
  mraa_gpio_mode(in0, MRAA_GPIO_PULLUP);
  mraa_gpio_isr(in, MRAA_GPIO_EDGE_FALLING, interrupt_in, (void *)in0);
>
  mraa_gpio_context in1 = mraa_gpio_init(15);
  mraa_gpio_dir(in1, MRAA_GPIO_IN);
  mraa_gpio_mode(in1, MRAA_GPIO_PULLUP);
  mraa_gpio_isr(in, MRAA_GPIO_EDGE_FALLING, interrupt_in, (void *)in1);
>
  sleep(30);
>
  return 0;
}
```

１１．審査を待つ
　プルリクエストを投げると，本家の人（メンテナ）がそのリクエストを取り込んで良いかどうか審査します．結果はコメントでもらえるので，それをドキドキしながら待ちます．
　libmraaは開発が活発なので，私の場合は1時間以内にコメントがもらえました．

１２．コメントに合わせて，プルリクエストを修正する．
　[こちらのページ](https://github.com/intel-iot-devkit/mraa/pull/76)が実際にメンテナからコメントをもらったところなのですが，私の場合は，「返り値をint型にしてくれ」という修正依頼をもらいました．
　そのため，その通りにコードを修正し，
$ git -a -s commit --amend
します．この"--amend"というのは，前回のコミットをやり直すという意味になります．
　終わったら，
$ git push -f origin *myfunc*
として，アップロードします．やり直しをしたせいで，ローカルのリポジトリとGitHub上のリポジトリの間で不整合が生まれているので，"-f"オプションを付けて，強制的に上書きする必要があります．

１３．修正した旨を伝える．
　また先ほどのプルリクエストのページで，メンテナに修正が完了したことをコメントで伝えます．
　今回は，これだけで取り込んでもらえましたが，もっと何度もやりとりが続く場合もあります．

# まとめ
　駆け足でしたが，いかがでしたでしょうか？
　やってみると，意外と簡単な手順です．
　これだけで，世界中の人が使っているライブラリ（の一部）に貢献したという満足感が得られ，二日くらいはドヤ顔ができそうな気がします．
　このように，他人のプロジェクトにプルリクエストを投げるのは，自分のコーディングスキルを上げる練習になります．他人のコードを読んで，その挙動を理解し，規約に合わせて自分のコードを追加するということになるので．また，メンテナからもらえるコメントも，とても勉強になります．
　ダメなコードの場合，メンテナは容赦なくリジェクト（拒否）するので，リジェクトを怖がらず，どんどんプルリク送ってみるのが良いんじゃないでしょうか．

# 今回プルリクした修正
　ちなみに，今回，私がlibmraaにプルリクした機能追加ですが，libmraaは **mraa_gpio_isr** 関数で，GPIOの立ち上がりや立ち下がりのイベントにコールバック関数を登録できるのですが，このコールバック関数内で，”どのポートから上がってきたイベントか”を知るための関数 **mraa_gpio_get_pin** をプルリクしました．
　実際の使い方は，上のコメントのところのコードになります．