goa へのプルリクエストの送り方 (プルリクエスト編)

goa へのプルリクエストの送り方 (プルリクエスト編) です。本記事の内容を実施する前に準備編を済ませておいてください。

1. リポジトリに移動

コンソールで以下のコマンドを実行します。

$ cd $GOPATH/src/github.com/goadesign/goa

2. master から新しいブランチをチェックアウト

コンソールで以下のコマンドを実行します。

$ git fetch
$ git checkout -b $BRANCHNAME origin/master

$BRANCHNAME には任意のブランチ名を入れてください。例えばブランチ名を foo-bar とする場合は以下の様になります。

$ git checkout -b foo-bar origin/master

3. ソースコードやテストコードを追加・修正しコミット

コードが書けたら、コンソールで以下のコマンドを実行し、コミットします。

$ git add .
$ git commit

もちろん複数回コミットしても構いません。

4. make できることを確認

コンソールで以下のコマンドを実行します。

$ make

これにはプログラムのビルドやテストコードの実行が含まれています。何らかのエラーが発生した場合はコードを修正しそれらを解決します。

5. 最新の master にリベース

コンソールで以下のコマンドを実行します。

$ git fetch
$ git rebase origin/master

6. リモートリポジトリにプッシュ

コンソールで以下のコマンドを実行します。

$ git push -u mine $BRANCHNAME

$BRANCHNAME には 2. で指定したブランチ名を入れてください。今回の例ではブランチ名を foo-bar としていたため以下の様になります。

$ git push -u mine foo-bar

7. GitHub でプルリクエストを作成

  1. https://github.com/goadesign/goa を開きます。
  2. Branch メニューの右にある New pull request をクリックします。

    f:id:tchssk:20170622142812p:plain

  3. Compare ページで compare across forks をクリックします。

    f:id:tchssk:20170622142834p:plain

  4. base fork が goadesign/goa になっていることを確認します。 base branch で master を選択します。

    f:id:tchssk:20170622142850p:plain

  5. head fork であなたがフォークしたリポジトリを、 compare branch で 6 でプッシュしたブランチを選択します。今回の例では head fork が tchssk/goa 、 compare branch が foo-bar になります。

    f:id:tchssk:20170622142910p:plain

  6. Title と Description を英語で入力します。

    f:id:tchssk:20170622142925p:plain

  7. Create pull request ボタンをクリックします。

    f:id:tchssk:20170622142949p:plain

参考

Creating a pull request from a fork - User Documentation

以上になります。あとはプルリクエストに対してレビューコメントがつくと思うので、議論しながらコードをブラッシュアップしていきましょう。すべて OK だと認めてもらえたらマージしてもらえるはずです!

goa へのプルリクエストの送り方 (準備編)

goa へのプルリクエストの送り方 (準備編) です。本記事の内容は、プルリクエストを送るための準備として最初に一回だけ行う必要があります。

1. GitHub で goa をフォーク

  1. https://github.com/goadesign/goa を開きます。
  2. ページの右上にある Fork をクリックします。

    f:id:tchssk:20170620120037j:plain

参考

Fork A Repo - User Documentation

2. goa リポジトリをクローン

コンソールで以下のコマンドを実行します。

$ go get -u github.com/goadesign/goa

3. リポジトリに移動

コンソールで以下のコマンドを実行します。

$ cd $GOPATH/src/github.com/goadesign/goa

4. フォークしたリポジトリをリモートとして追加

コンソールで以下のコマンドを実行します。

$ git remote add mine git@github.com:$USERNAME/goa.git

$USERNAME には GitHub 上でのあなたのユーザ名を入れて下さい。例えば筆者のユーザ名は tchssk なので以下の様になります。

$ git remote add mine git@github.com:tchssk/goa.git

これで準備は完了です!

goa へのプルリクエストの送り方

goa へのプルリクエストの送り方について 3 回に分けて解説する連載記事です。これを見れば誰でもコントリビュートできるようになるはずです!

目次

  1. goa へのプルリクエストの送り方 (準備編)
  2. goa へのプルリクエストの送り方 (プルリクエスト編)
  3. goa へのプルリクエストの送り方 (バックポート編)

goa勉強会 in 六本木一丁目で発表してきた

発表してきました。

connpass.com

国内の goa の勉強会としては golang: goa勉強会に次いで 2 回目になるかと思います。当日カミングアウトしましたが私はまだ goa の本番運用をしたことがないので、実際にサービス運用している視点での話がたくさん聞けてよかったです。早く本番デビューしなければ…。

goa の改善と改良

The improvement and enhancement of goa

主催の @deadcheatgreat さん、そして会場提供して下さった istyle さんありがとうございました。参加した皆さまお疲れさまでした。

goa 公式サイトを日本語翻訳した & goa の開発メンバーになった

goa 公式サイトを日本語翻訳した

昨年始めた goa 公式サイトの日本語翻訳が終わりました。

goa.design

日本の開発者にあまり使われてないのは日本語のリソースが少ないからでは、ということで昨年末に ikawaha さんとプロジェクトを開始したのですが、結構分量があったので数ヶ月かかってしまいました。細かい修正は残っているものの、一旦は年度内に完了できてよかったです。 Go で Web API の開発を行う際には是非 goa を候補に加えてみて下さい。

goa の開発メンバーになった

2 月末に goa の開発メンバーになりました。

先日アナウンスされた v1.2.0 のポストでも大きく取り上げてもらいました。

goa.design

以下、引用です。

Taichi was one of the first contributors to goa, his contributions are always of the highest quality. Apart from fixing many bugs and contributing actively to goa v2, Taichi also helped translate the entire https://goa.design/ja website into Japanese.

日本語だと以下のような感じでしょうか。

Taichi は goa の最初のコントリビュータの一人で、彼のコントリビューションはいつも最高のクオリティです。 Taichi は多くのバグ修正や goa v2 にアクティブに貢献している他、 https://goa.design/ja の Web サイト全体を日本語に翻訳するのにも尽力しました。

惜しみない賞賛です。少し照れます😅

2016 年の春くらいから goa を使い始めて、次第にプルリクエストを送るようになりました。 GitHub や Slack でやり取りをするうちに誘われて v2 の開発にも参加するようになり、今回とうとう goa の開発メンバーに加わりました。一応 push 権限を与えられているのでコミッタと呼べそうな気もしますが、今まで通り一人のユーザ、そしてコントリビュータとして goa の開発に携わっていければと思います。

おまけ

翻訳プロジェクトの打ち上げ。最高の肉だった。

f:id:tchssk:20170418161333j:plain

なぜ goa の DSL はブランク識別子への代入が必要なのか

goa のトップレベDSL

goa の design は DSL をネストさせながら記述しますが、その一番上の階層に来るものをトップレベDSL と呼びます。標準で用意されている apidsl では以下の DSL がそれに当たります。

  • API()
  • Resource()
  • Type()
  • MediaType()

前提として、すべての DSL は Go の関数であり、それを用いて記述される design は Go のソースコードです。

トップレベDSL の記述

goa ではトップレベDSL を以下のように記述します。

var _ = API("cellar", func() {
    // Definitions.
})

なぜ以下のように書けないのでしょうか?

API("cellar", func() {
    // Definitions.
})

Go の言語仕様

まず Go の言語仕様を確認します。

Go の言語仕様ソースファイル構成 という仕様が明記されています。それによるとソースファイルは以下の 3 つのブロックから構成されます。

この「トップレベル宣言」に含まれるのは以下の宣言です。

  • 定数 const
  • type
  • 変数 var
  • 関数・メソッド func

Go のコードとして見た API() DSL

翻って API() DSL を Go のコードとして見てみましょう。

var _ = API("cellar", func() {
    // Definitions.
})

上記の DSL は大きく以下の 3 つに分割することができます。

  1. API() という関数の呼び出し (Calls)
  2. var による変数宣言 (Variable declarations)
  3. = による代入 (Assignments)

総合するとこのコードは「代入を伴った変数宣言」であり、前述した Go のトップレベル宣言として有効です。

小ネタ

本来 var による変数宣言では型の指定が必要ですが、ここでは代入を伴っているため型推論が働いています。もちろん以下のように明示的に型の指定を行うこともできます。

var _ *design.APIDefinition = API("cellar", func() {
    // Definitions.
})

ブランク識別子への代入がないとどうなるか

もう以下の書き方がなぜ駄目なのかわかりますね。

API("cellar", func() {
    // Definitions.
})

API() は関数呼び出しであり Go のトップレベル宣言として記述することはできないのです。

結論

Go の言語仕様的にトップレベルに書けるのは以下のいずれかの宣言であるため、代入を伴った変数宣言とする必要があるから。

  • 定数 const
  • type
  • 変数 var
  • 関数・メソッド func

2016 年振り返り

勉強会

勉強会で発表しました。

tchssk.hatenablog.com

これは本当にいい経験でした。発表を通じて人と知り合えたのも良かったですね。

OSS

半年で 21 件、通年だと 34 件プルリクエストを出しました。

Search · author:tchssk created:2016-07-01..2016-12-31 · GitHub

8 割くらいは goa に対するものでした。やろうと思っていた goa のドキュメント翻訳にも着手したので、なるべく早く終わらせたいですね。モタモタしていると v2 が出てしまいそうだし。

それから自分自信のプロジェクトもいくつか始めました。これも goa 関連 (goa 好きすぎかw) 。

tchssk.hatenablog.com tchssk.hatenablog.com

ISUCON

そういえば予選に参加したのに惨敗だったこともあって記憶がおぼろげです。忘れたいのかもしれない ... 。

総括

goa に始まり goa に終わる 1 年でした。

ソフトウェアエンジニアとして数多くの OSS を使わせて頂いていている中で、いつかそれらに恩返ししていきたい、という想いがずっとありました。今年はほんの少しだけそれを遂げられたかな、と思います。