ぺい

渋谷系アドテクエンジニアの落書き

goaのデザインコードを分割する

f:id:tikasan0804:20170505212036p:plain

Golangのgoaの勉強に役立つ情報まとめ - ぺい
goaの情報をもっと見たい方は、上のリンクから確認してください

肥大化しがちなDSLコードを分割する

goaの開発フローは、以下のような感じです。

  1. DSLを作成する
  2. コントローラー作成
  3. 追加仕様または修正でDSLをごにょる

上記のようなことをしていたら、結構DSLが肥大化します。そこで、DSLを少し工夫することで分割することが可能です。これをすると以下のような構成に出来るので、困ってる人は実践してみてください。

├── Makefile
├── README.md
├── app
├── client
├── controllers
│   ├── hello.go
│   └── sample.go
├── design
│   ├── api_definition.go
│   ├── media
│   │   ├── hello.go
│   │   └── sample.go
│   └── resources
│       ├── hello.go
│       └── sample.go
└── main.go

ソース

github.com

まだ、PR出している最中ですが、上記のコードがその具体例になります。

goaのGoglandスニペットを活用しよう

f:id:tikasan0804:20170505212036p:plain

Golangのgoaの勉強に役立つ情報まとめ - ぺい
goaの情報をもっと見たい方は、上のリンクから確認してください

DSLを楽ちんにするスニペットを活用する

goaのDSL書くの面倒ですよね!? Gogland用のgoaのDSLを書くためのスニペット作成しました。

github.com

この発想はkawakenさんの以下の記事の影響されて作ったものです。(goa studyにて)

kawaken.hateblo.jp

イデア求む

Goglandでスニペットをコードベースで管理したいんですけど、何かいい方法ないですかね。

exampleがないOSSでexampleを探す方法

OSS使うとよく起きるアレ

f:id:tikasan0804:20170704205846p:plain

流行っている言語やフレームワークを使っていれば、そこまで深刻な問題ではありませんが、僕とかは普段Goをメインに書いているので、利用者が少ないOSSを使うことがよくあります。
そんな時に起きる問題が、
「良いOSS見つかったけど、使い方わからん」

せっかく良いの見つけたのに、正直よくわかんねーーーーってなって、使うのを諦めるのは勿体ないですよね。(ドキュメントとかテスト読めば分かりますが)そんな時にほしいのがexampleです。一切無いものは珍しいですが、あったとしても非常に端的なものしかないことが多いので、そこからはドキュメントなどを読んで、自分のケースに当てはめたりするフローは必須ですが、少しでも多くの利用例があるに越したことはありませんよね?

そこで、他のexampleを探す方法を紹介します。

コードを探すならGithub

github.com

今回はGoのOSSでexampleを探してみましょう。まだ、スター数は300前後で、少なくはありませんが採用例をググって探すのは難しいぐらいの微妙なラインのものです。

f:id:tikasan0804:20170704211049p:plain

使うのは、Githubの検索窓です。検索には先程のOSSを実行する時に必ず使うソースの一部を貼り付けます。

dockertest.NewPool(

以下が検索結果です。 github.com

f:id:tikasan0804:20170704210354p:plain 51コードがヒットしました。これで、用意されたexample以外のパターンを見ることが出来ます!!!これでまあまあ幸せになれるかもしれません。 他にも、importしているパッケージ名とかでも検索が出来たりするので、探してみてください。

学生の間に勉強するべき技術とかの話

学生という貴重な時間で何するべきか

f:id:tikasan0804:20170623112305j:plain

私を含めた学生のエンジニアの多くが悩む課題であろう「結局なにを勉強したらいんだろう」という内容について、私なりに出た結論が出たので紹介します。

先に断っておくと、これは私の完全なる主観です。

筆者の行く業界も重要な要素かもしれないので、簡単な紹介をしておくと、私はVOYAGE GROUPという渋谷にあるITベンチャーの会社に内定を頂いており、2018年より新卒入社する予定です。

とことん好きなことをやればいい

就職まで時間あるけど、入社まで何を勉強したらいいんだろう。または、就活まで何を勉強したらいいんだろうという話です。私の中で出たひとつの結論は、「誰にも負けないくらい、とことん好きなことをやればいい」です。
何故好きなことやっとけという話なったかと言うと、例えば、いまのWeb業界で流行っている技術の◯◯やったとしても、ITの世界は非常に技術革新の流れが早いので、入社の頃には役に立たなくなってる可能生もあります。たとえそれを勉強したところで、業務レベルで通用するかは結構怪しいです。何より仕方なくやってるというのが良くないです。

学生で自由に学ぶ権利がある今だからこそ、好きなことをとことん極めてしまった方が有意義ではないかと考えたわけです。業務に関する勉強は業務で学んで、学生だからこそ出来る勉強を今やるというスタイルで、最近はやりたいことやってます。(個人的には遊びまくるのも大事だと思ってます)

あと、私の場合、住んでいる場所が大阪で、就職先が東京っていうのもあって、内定先とかで働きたくても無理だったので、自分でどうにかする方に振り切るしかなかったという環境的要因も大きいかもしれません。

実際にいまやっていること

f:id:tikasan0804:20170505212036p:plain

私がいま実際に取り組んでいることは、バックエンドの特にAPI周りの勉強です。あとは、GoのOSSのgoaです。流行ってるからやってるというよりは、好きだからやってるという、リスペクト駆動開発でやっています。(goaいいよ本当に)

業務で使えない好きをやる意味

私がいま力を入れて取り組んでるOSSのgoaなどは正直まだまだ発展途上で、流行ってるとはとても言えない状況です。そもそもGoがまだまだ使える人が少ないですし・・・。そこで出て来る不安が、業務で使わないような技術やってる時間無駄じゃない?問題です。
これに関しては、私なりの持論があって、どんなことでも極めようと思うと様々な勉強が必要だったり、課題にぶつかることがあります。それらの解決策を考える際に、他のOSSではどうなってんだろう?とかやってると自然に体系的な技術力がつくので大丈夫だと思ってます。良くないのはなんとなく使い続けていることだと思います。色々なものを触った上で、これが好きだ!というのは大事だと思っています。なので、色々触って不満を感じれるレベルまで、まずは色々やってみようという最低ラインはあるかもしれません。

技術が好きじゃないとだめ?問題

勘違いしてほしくないので補足しておくと、「技術が最初から好きだから出来るんじゃないの?(天性的なやつ)」という誤解です。実は就活をし始めた3年生の5月時点では、エンジニア志望度はあまり高くなく、正直モノづくりに関われたら何でもいいというスタンスで、手段としてプログラムがあるくらいの認識の人間でした。なので、元々は全然技術には興味がなく、むしろやりたくない側でした。

好きになったきっかけとしては、夏のインターンなどを通して、ある程度のラインまでやって、学生レベルですが、理解出来て楽しくなってきたという感じです。何が言いたいかというと、食わず嫌いで無理だと思わず、自然と楽しくなってくることもあるので、トライしてみましょうって感じです。

好きをやってると良いことがある?(Go関連事例)

結局そんなことして何がいいの?って話ですが、私は少なくとも恩恵を得ました。以下にGoに関連したものだけを挙げますが、実際には他にもたくさん良いことがあります。

f:id:tikasan0804:20170623113200j:plain

人との繋がりが増える

当然ながら共通の好きなどの繋がりで、人との交流が増えます。楽しいです。

tikasan.hatenablog.com

OSSへコミット出来たりする

正直こんな僕でもリスペクト駆動でどうにかなってます。

tikasan.hatenablog.com

イベントで登壇したりして、刺激もらえる

場合によってはイベントでトーク出来たりして、アウトプットに対するフィードバックもらえたりします。

tikasan.hatenablog.com

会社によっては支援があったりする

これに関しては会社によりけりですが、私の内定先のVOYAGE GROUPでは、勉強に関する費用を負担頂ける制度があり、カンファレンスへの参加や技術書の購入など、様々な支援が頂けます。そこらへんの詳しい話はまた別で紹介しようと考えています。

支援で行ったイベント tikasan.hatenablog.com tikasan.hatenablog.com tikasan.hatenablog.com

まとめ

もし、好きなんだけど流行る気しねーみたいな技術があるなら、それはガッツリ取り組んだ方がいいです。そういう好きなことがあるということを無駄にするのは勿体ないです。
人によっては何もない人もいるかもしれませんが、焦らず自分の興味に対して注意を払って見つけると良いと思います。

でも就活心配だぞ!という人へ

でも、実際やっておいた方がいいことあるでしょ?という就活生向けの記事は過去に書きました。私の就活経験から感じた。よかったことなどまとめているので、心配な人は参考にしてみてください。

qiita.com qiita.com

Goの静的コード解析を一括でいい感じにする(Wercker)

静的コード解析(lint)でコード品質を保つ

f:id:tikasan0804:20170622161758j:plain

Goには静的解析のツールがたくさんあります。結局何使えばいいんだろうとか、いい感じの設定ファイルが欲しいなど、結構何かと困る点があったので、記事にしてまとめて紹介します。

alecthomas/gometalinter

github.com

今回の静的コード解析にはalecthomas/gometalinterを使います。このOSSはgoに存在する様々な静的コード解析ツールを一括で使うことが出来る優れものを使って、CI回していきます。 まずは、go getします。

これ以降、静的コード解析ツールをlintとします。

$ go get -u github.com/alecthomas/gometalinter
$ gometalinter --install --update
Installing:
  unconvert
  gas
  gosimple
  ineffassign
  safesql
  varcheck
  dupl
  goimports
  golint
  misspell
  structcheck
  unparam
  unused
  errcheck
  gocyclo
  lll
  gotype
  interfacer
  staticcheck
  aligncheck
  deadcode
  goconst

このパッケージをインストールすると、こんなにlintツールあんのか!wって感じなんですけど、今回はこの中にあるいくつかのパッケージに絞って実践してみたいと思います。 それぞれのlintについては別記事でそれぞれが何かを紹介します。
いい記事が既にあったので紹介しておきます。

tech.sideci.com

ソースくれ

github.com

lintの準備

Makefileを以下のように作成します

Makefile

# 開発者のためのインストールコマンド
install:
    @which gometalinter || go get -u github.com/alecthomas/gometalinter
    @gometalinter --install --update

# Werckerのための依存関係解決コマンド
deps:
    @which gometalinter || go get -v github.com/alecthomas/gometalinter
    @gometalinter --install --update

# lintの実行
lint:
    @if [ "`gometalinter ./... --config=lint_config.json | tee /dev/stderr`" ]; then \
        echo "^ - lint err" && echo && exit 1; \
    fi

設定ファイルを以下のように作成します

lint_config.json

{
  "DisableAll": true,
  "Enable": [
    "vet",
    "gofmt",
    "staticcheck",
    "goconst",
    "golint",
    "goimports",
    "errcheck"
  ],
  "Exclude": [
    "ignore"
  ],
  "Vendor": true
}

軽く意味を解説すると以下のような感じです。(細かいニュアンスは若干違います。)

キー 説明
DisableAll 全てのlinterを使わない設定にする
Enable 使用するlinterを指定する
Exclude lintしたくないファイルやフォルダを指定する
Vendor vendorフォルダを無視する

他にもたくさんオプションがあるので、気になる方は、gometalinter --helpで調べてみてください。

lint対象コード作成

次に実際に解析するコードを適当に作成します。

フォルダ構成

.
├── Makefile
├── check
│   └── main.go
├── ignore
│   └── main.go
├── lint_config.json
└── main.go

./main.go

package main

import (
    "github.com/tikasan/golint/check"
    "github.com/tikasan/golint/ignore"
)

func main() {
    check.Hoge()
    ignore.Foo()
}

./check/main.go

package check

import "fmt"

// Hoge print hoge <--- GoDocを書かないとエラーになる
func Hoge() {
    fmt.Println("hoge")
    err := returnErr() // errチェックを行わないとエラーになる
    if err != nil {
        fmt.Println(err)
    }
}

// nolint <--- これを書くとlintが無視される
// https://github.com/alecthomas/gometalinter#comment-directives
func NoLint() {
    fmt.Println("noLint")
}

// returnErr
func returnErr() error {
    return fmt.Errorf("return %s", "err")
}

./ignore/main.go
フォルダごと無視される

package ignore

import "fmt"

func Foo() {
    fmt.Println("foo")
}

では、lintを実行してみましょう。正しく終わったら、わざと間違えてみたりしてください。今回の例では、他にgoimportsされてない。gofmtされていないコードもエラーとなったりします。

$ make lint

Werckerと連携させる

せっかくlintが動くようになったので、CIで常にコードをチェックする仕組みほしいですよね。ということでさくっと実装してみたいと思います。

www.wercker.com

wercker.yml

box: golang
build:

    steps:
        - setup-go-workspace

        - script:
            name: dependencies
            code: make deps

        - script:
            name: lint
            code: make lint

管理したいアプリケーションを追加します f:id:tikasan0804:20170622160525p:plain

今回はGithubのrepoなので、Githubを選択します f:id:tikasan0804:20170622160527p:plain

対象のrepoを選択する f:id:tikasan0804:20170622161624p:plain

Ownerを選びます f:id:tikasan0804:20170622160533p:plain

何で設定ファイルにアクセスするか選択します f:id:tikasan0804:20170622160546p:plain

このアプリケーションはpublicです的な f:id:tikasan0804:20170622160550p:plain

設定が完了したら、コミットしてみてください。lintが走ってコードがチェックされるようになります。 f:id:tikasan0804:20170622160552p:plain

CollaborationにWerckerbotを追加しましょう f:id:tikasan0804:20170718213354p:plain

lintを入れるだけでもコードの品質は結構上がる

私は何か規模大きめ、またはリリース目的のコードには基本的にlintを必ず入れています。理由としては、コードの品質が保たれるのはもちろんですが、チームでやっていた場合に少なくともlintでチェックしている部分はレビューしなくてよかったりもするので、コスト削減にもなったりするので、絶対入れたほうが幸せになれますw

goa勉強会 in 六本木一丁目 参加レポート

やっぱgoa流行ってるんじゃね?

f:id:tikasan0804:20170616232424p:plain

istyle.connpass.com

togetter.com

あの素晴らしいOSSのgoaの勉強会が開催されるということで、勢いでトーク枠で登壇することにしました。

スライド一覧

様々な発表がありました。あまり気にせずやってた問題点とかを気づけて面白かったです。というか、自分の口以外から、「goa」というワードが出たことが良かったですね。間違いない。

goa概要@ikawahaさん

speakerdeck.com

あーこのスライド見たことあるわーと思いながら見てました。
私がgoaにコミットするきっかけを作ってくれた人だったので、地味に1人でテンションが上がってました。これでgoaは大体何が良いか分かるので良スライドです。

OSSにコントリビュートしたら楽しかった - ぺい

アイスタイルにおけるgoa導入事例@銀シャリさん

speakerdeck.com

今回のgoa勉強会の主催の銀シャリさんの発表資料です。主催者には本当圧倒的感謝しかないですね。
内容は実際の本番でgoaが動いていますよ。パフォーマンス良いですよ。でも、こんな問題も起きてますよという非常に具体的な内容で、導入を悩んでいる人向けの資料になります。これ聞いてやっぱりgoを書けるエンジニアは少ないんだなーと辛さを感じました。

goa の改善と改良@tchsskさん

スライドURL

goaの開発チームにjoinしているtchsskさんのありがたいお話をいただきました。今後のgoaのロードマップや最近こんなのしましたなど、goaの開発そのものの話を頂きました。

ざっくりまとめると以下のような感じです。

  • DSLのv1とv2は互換性がない
  • v2からgRPCにも対応する
  • まだしばらくかかる

質問で、「コントリビュートするモチベーションはなんですか?」という問いに対して、「趣味・・・いや人生って感じですね」という返しが印象的でしたw

goaを使った開発TIPS@tikasan(俺)

www.slideshare.net

私はいまVOYAGE GROUPの内定者開発である社内外向けのプロダクトを作っていて、それのバックエンドにgoaを使っているので、そこで得た知見や気付きなどを共有するような発表をしました。意外と私のブログを見て頂いている人がいて、かなーーーーり嬉しかったです。今後も継続してアウトプットします。

Generate better JavaScript
 From Goa Design@rudiさん

speakerdeck.com

goaはJSのコードを自動生成する仕組みはありましたが、内容はただリクエスト投げるぜ!という単調な動きしか出来ず、せっかく定義したバリデーションや型が使えていない問題がありました。
それらを全て解決したJSのコードを自動生成しますよというサードパーティプラグインを作成しましたというお話でした。(これ本家に入れてもいいんじゃね?と思ったり・・・)
こういったサードパーティ系のプラグインの使い方はまた、このプラグインの使い方と合わせて紹介する予定です。

goaを導入した話@k_yokomiさん

speakerdeck.com

こちらも実際の本番環境でgoaを運用しているお話でした。CIをどうやって運用しているか具体的なお話があったり、やはり、同じく運用していく上で発生した問題などがあり、それらをどうやって解決したかなどなど。こういったナレッジは共有出来るような仕組みがほしいなーと改めて思いました。

飛び込みLT design書くの面倒じゃない?@kawakenさん

www.slideshare.net

vscode goa snippets · GitHub

goaはただでさえ楽ちんにしてくれているのに、designすら楽しようという、完全に堕落しきってる素晴らしい内容でした。解決策として、スニペットを駆使すれば長いDSLもさくっと書けて楽でいいよね?というお話でした。実際ライブコーディングも素早くコードを構築していくので、これは良い!と思ったので、私も明日からそうします。

まとめ

goaの勉強会というか、言語ではないOSSの勉強会は初でしたが、とても楽しかったです。しかも結構ガッツリ技術よりな発表出来たのは個人的に大きな学びになったので、非常に価値ある時間でした。今後どこまでgoaが流行るかは分かりませんが、地味な活動を続けて、有名にしたいなーと思ったりしてます。
また、こういう機会があって、タイミングが合えば是非また参加したいですね!ありがとうございました!

Google Cloud Next 2017まとめ

f:id:tikasan0804:20170615121801j:plain

ザ・プリンス・パークタワー東京で開催されたGCPのカンファレンスに参加してきました。
個人的に費用が比較的に安価なことや学生には十分過ぎる機能が揃ってることから、私は普段からGCPを使っているのですが、実際に何が良いんだろう?というところをより具体的にしたい。知らない機能や何を目的に展開しているサービスなんだろうということを知るために参加してきました。
GCPとはGoogle Cloud Platformのことを指します

Google Cloud Next 2017とは

cloudnext.withgoogle.com

新しいアイデアに出会う。専門家からナレッジを学ぶ。同志とヴィジョンを語りあう。経営者から、IT マネージャー、技術パートナー、デベロッパー、Google エンジニアまで。ダイバーシティに富んだ知が集い、共有することで、次の「未来」が生まれていく。 そんな、クラウドのこれからをリードするイベント “Next” に、あなたも参加しませんか。 Google Cloud Platform から G Suite、マップからデバイスまで。80 を超える幅広いテーマのセッションをご用意してお待ちしています。

  • 80を越えるセッション
  • 40を越える体験セッション

上記に加えて、参加が無料というのもかなり驚愕なんですが・・・ 当日は、弁当や飲み物も会場で配布されますw

f:id:tikasan0804:20170615121418j:plain

GCPの提供する価値とは?

いきなり本題に入るのですが、Googleが言っていたGCPが提供するものは以下の4つです。

  • セキュア
  • カスタマーフレンドリー
  • インテリジェント
  • オープン

f:id:tikasan0804:20170615122631j:plain

※ちょっと見えにくい画像ですが、そこらへんの話をする時によく使ってたスライドです。

ざっくり、ひとつずつどういうことかを説明すると、以下のような感じになります。

セキュア

Googleの基盤を使うことになるので、圧倒的安心感があるのは間違いないと思います。

blog.google

通信の暗号化に力を入れるのはもちろんですが、ユーザーの認証周りにも非常に厳格な監視システムを入れていることも強くアピールしてました。

インテリジェント

高性能なソリューションが揃っている。

f:id:tikasan0804:20170615135804j:plain
様々なケースを想定したストレージやデータベース   BigQueryは使ってる人多いのでは?

f:id:tikasan0804:20170615135903j:plain PaaSやIaaSやコンテナなど

f:id:tikasan0804:20170615135922j:plain 機械学習済みの高性能API

カスタマーフレンドリー

GCPの特徴で、私がGCPをよく使う理由のひとつである。柔軟な課金システム(分単位の課金など)は、高いコストパフォーマンスを発揮してくれます。

f:id:tikasan0804:20170615214355j:plain VMのスペックを要件にあったものを提案してくれる機能があったり。

f:id:tikasan0804:20170615214402j:plain 割引とかなんやら組み合わせると、めっちゃ安くなりますよの図

f:id:tikasan0804:20170615214414j:plain
プレイド社がAWSから移行したことにより、性能とコストの両方で高いパフォーマンスを発揮したそうです。

オープン

f:id:tikasan0804:20170615214913j:plain
様々なソリューションがオープンに使える。これは利用者がこれまでは技術的に不可能だったことが可能になったり、新しいビジネスチャンスを生むことを意味しています。
今後もGoogleOSSへのコミットを続け、業界を引っ張っていくようです。これはこれまでの貢献があるGoogleだからこそ説得力がありました。

テクノロジを使った働き方改革

f:id:tikasan0804:20170615215658p:plain
今回のカンファレンスでGoogleがアピールしていたものはテクノロジも勿論ですが、働き方を変えるという取り組みについてでした。結構面白い取り組みだったので軽く紹介します。

f:id:tikasan0804:20170615215600p:plain
色々な切り口から、働き方を改革をし、実際に業務効率化をした事例がたくさん紹介されました。

ジャムボード

f:id:tikasan0804:20170615215936p:plain
ジャムボードという新しい製品のデモが行われました。遠隔に同時に操作が出来るホワイトボードで、ポストイット機能や文字認識をして、フォント化したりとかなりの高性能でかなりテンション上がる製品でした。

www.youtube.com
公式の動画が分かりやすいので貼っておきます。

チャット

f:id:tikasan0804:20170615220920p:plain
チャットはSlack的な使い方が出来るっぽいです。Botなども作成出来るので、これは使えそう・・・!Googleドキュメントなどと親和性が高いので色々な便利機能があったり、そのままビデオ会議にも繋げたりも可能なそうです。

Drive File Stream

www.itmedia.co.jp
ダウンロードせずに様々なファイルを操作可能

ここでは、紹介しきれないくらい他にも様々なサービスがありました。いま内定者開発でリモート開発をやっているので、こういうソリューションに興味湧いたりしてました。

技術系で面白かったもの

結局どんな技術あったんやっていうのも気になる方向けに面白かった技術系の紹介をします。

Cloud Spanner

cloud.google.com

f:id:tikasan0804:20170615221614j:plain

一言で言うと、リレーションがあるけど、いくらでもスケールできるデータベースらしいです。(正直意味がわからない)

f:id:tikasan0804:20170615221859j:plain スケールさせるとなると問題になるのが、データの整合性ですが、常に同期が取れるような仕様になっているそうです。何故リレーションがあるのに、そこまで高速に同期が可能になっているか?

f:id:tikasan0804:20170615222021j:plain 上の画像のような一般的なテーブルのものをSpannerでは、以下のように管理しているそうです。

f:id:tikasan0804:20170615222026j:plain うむ。なるほど。理屈はわかる。どうやってるんだ。

f:id:tikasan0804:20170615222356j:plain 基調講演でとんでもないリクエストを処理しきってるデモも行われました。

Cloud Video Intelligence

cloud.google.com

f:id:tikasan0804:20170615222731j:plain
このAPIは投げるだけで、動画にどういったものが写っているかを解析して、時間と情報をまとめて返してくれるという驚異的なものでした。

f:id:tikasan0804:20170615222949j:plain 海と検索すると、動画内に海が登場するものが抽出でき、しかも、実際に写ってる時間が分かるので見たい部分だけ見ることも出来る。

f:id:tikasan0804:20170615223053j:plain こんな感じで、細かい解析を行っており、犬の種類まで特定出来たりと、すごいとしか言えないものでした。

最近は、動画コンテンツがかなり注目を浴びてるので、検索の性能の向上や不適切な動画の摘発などにも一役買いそうな雰囲気がプンプンしました。

Data Loss Prevention API

cloud.google.com

f:id:tikasan0804:20170615223420p:plain
お客さんとのやり取りでもらった個人情報などを保存したくないけど、やり取りは残したい。そんなケース結構あると思います。このAPIを使うと消したい情報を指定して、実行するだけで勝手にマスキングしてくれます。
特に最近はリスクを減らす為、出来る限り顧客の情報を持たずにマスキングしたりする会社が多いので、かなり使えるAPIだと思います。

まとめ

APIひとつ叩くだけで、Googleの技術を使えるという贅沢な時代に生まれてよかった。

今後、追加で記事にする予定かもしれないもの