Slide 1

Slide 1 text

エンプラでも活⽤できる︕Goのご紹介 〜初級者編〜 倉林 雅

Slide 2

Slide 2 text

はじめに • 「エンプラでも活⽤できる」とありますが、内容はエンタープライズに特化したもので はなくGoの基礎を中⼼に整理したものです • Goのメリット・デメリットやサードパーティのライブラリーを使ったCLIの導⼊などを 簡単にまとめています • エンタープライズの環境でGoの活⽤の検討につなげられたらと考えております 2

Slide 3

Slide 3 text

倉林 雅(くらはやし まさる) • OpenIDファウンデーション・ジャパン • 理事 • エバンジェリスト • ヤフー株式会社 • ID・セキュリティユニット • CISO室 • エンジニア • https://twitter.com/kura_lab 3

Slide 4

Slide 4 text

担当業務・活動 • OAuth/OpenID Connectの開発・運⽤ • Yahoo! ID連携(IdP) • スマートログイン(RP)など • ID関連のセキュリティ推進 • 認証・認可技術の普及・啓発活動 • ID基盤関連のコンサルティング業務 4

Slide 5

Slide 5 text

開発の経験 • 学⽣時代 • CとJavaの基礎を学ぶ • 群集歩⾏者シミュレーションをJavaで実装 • ヤフーでの業務 • PHP(⼀部C++)でID基盤やOpenID Connectサーバー(IdP)を開発 • ヤフー公式のAndroidアプリの認証・認可機能を開発 • 趣味 • GoによるOpenID Connectクライアント(RP)を実装中 • AWS上にSPAアプリケーションを実装など • Github • https://github.com/kura-lab 5

Slide 6

Slide 6 text

Goとは • 2009年にGoogleから発表されたプログラミング⾔語 • BSDライセンスのオープンソース • https://github.com/golang/go • 改良されたC⾔語 • 読解性・⽣産性・⾼速性に優れている • リポジトリはgithub.com Gopher 6

Slide 7

Slide 7 text

メリット 1/2 • VM(仮想マシン)を持たず実⾏環境が不要 • ビルドすることで動作する環境に適合した実⾏ファイル(バイナリー)が⽣成される • マルチプラットフォームで動作する • CPUやOSの差異を吸収してくれる • サードパーティ製のライブラリーが多くある • Googleだけでなく、DockerやDropBoxなどでも利⽤されており、Github上で多くのライブラリーが提供されている • デプロイが容易 • バイナリーを配置するのみ • ガベージコレクションがある • メモリリーク、バッファオーバーフローを解消 7

Slide 8

Slide 8 text

メリット 2/2 • 並列処理 • スレッドよりも⼩さい単位のgoroutineを提供 • ⾔語機能や⽂法がシンプル • IDEがなくても開発ができる • スクリプト⾔語より⾼速 • ネイティブコードにコンパイルされているため実効性能がよい • 命名規則があるためシンプルになる • パッケージや関数を⼩さくする必要が出てくるため、疎結合になりテストしやすくなり可読性も 上がる 8

Slide 9

Slide 9 text

デメリット 1/2 • 実⾏ファイルが⼤きくなることがある • 各OSが個別に提供する共通ライブラリーは利⽤できないため全てを実⾏ファイルに含める必要がある • LinuxやWindowsの固有のOS依存を利⽤するケースは稀であるため⼤きな問題ではない • オブジェクト指向⾔語ではない • オブジェクト指向な実装もできなくはないが、Javaなどに⽐べると機能が⽋けている • 構造体、関数などシンプルな機能を提供 • 低レベルな処理の理解 • パフォーマンスを出すためにはスタック、ヒープなどを理解する必要がある • ソースファイルに名前空間がない • 同⼀のディレクトリでファイルを分けても名前空間は同じになるため、変数名や関数名を分ける必要がある 9

Slide 10

Slide 10 text

デメリット 2/2 • 例外処理がない • Exceptionのthrowができないが、エラーを処理するためのerrorインターフェースがある • オーバーロードや継承がない • JavaやC++でできていたオブジェクト指向な実装が難しい部分がある • フロントエンドのレンダリングには不向き • MVCモデルなどフレームワークが標準で提供されているわけではない • Go単体でテンプレートをレンダリングするようなフロントエンドの実装は不向き 10

Slide 11

Slide 11 text

活⽤例 • Webサーバー・アプリケーション • Goに標準でWebサーバーの機能が提供されている • サーバーレス・アプリケーション • AWS LamdaやGCP Cloud Functionを使ってイベント駆動やHTTPリクエストを受けるアプ リケーションに利⽤できる • コマンドラインインターフェース(CLI)→今回はこの例をご紹介 • PerlやBashで処理するようなスクリプトとして利⽤する 11

Slide 12

Slide 12 text

CLIライブラリー例 • cobra • CLIアプリケーション作成ライブラリー • コマンドでソースコードの⾻組みを⽣成 • ⾻組みに機能の説明や処理を実装することでCLIアプリケーションが簡単に作成できる https://github.com/spf13/cobra 12

Slide 13

Slide 13 text

Goのインストール -Windows 1. Golangダウンロードサイト • https://golang.org/dl/ 2. ダウンロードサイトより最新バージョンの.msiをダウンロードしインストーラーに従いインストールする • 例) https://dl.google.com/go/go1.XX.XX.windows-amd64.msi 3. ログインユーザーのホームフォルダーに「go」フォルダーを作成 4. 環境変数の設定 • 検索ボックス > 環境変数 • Pathに「C:¥Go¥bin;」を追加 • GOPATHを作成し「%HOME%¥go」を設定 5. コマンドプロンプト上で以下のコマンドでバージョンが確認できたらインストール完了 > go version go version go1.XX.x widows/amd64 13

Slide 14

Slide 14 text

Goのインストール -macOS 1. Golangダウンロードサイト • https://golang.org/dl/ 2. ダウンロードサイトより最新バージョンの.pkgをダウンロード しインストーラーに従いインストールする • 例) https://dl.google.com/go/go1.XX.XX.darwin- amd64.pkg • ターミナルを開いている場合にはターミナルを再起動する 3. 環境変数の設定 $ mkdir $HOME/go $ export GOPATH=$HOME/go $ export PATH=$PATH:$GOPATH/bin 4. 以下は.bash_profileまたは.bashrcに追記しておくとログイン 時に環境変数が設定される $ export GOPATH=$HOME/go $ export PATH=$PATH:$GOPATH/bin 5. ターミナル上で以下のコマンドでバージョンが確認できたらイ ンストール完了 $ go version go version go1.XX.XX darwin/amd64 14

Slide 15

Slide 15 text

Cobraのインストール $ cd $HOME/go/src/github.com// // ライブラリーのインストール $ go get -u github.com/spf13/cobra $ mkdir -p go-sample-cli && cd go-sample-cli $ cobra init --pkg-name github.com//go-sample-cli // 新規コマンド追加 $ find . . ./cmd ./cmd/root.go ./LICENSE ./main.go $ vim main.go 15

Slide 16

Slide 16 text

package main import "github.com/kura-lab/go-sample-cli/cmd" func main() { cmd.Execute() } 16 1. mainパッケージの定義 2. ライブラリーのインポート 3. main関数 4. cmdパッケージのExecute関数呼び出し main.go

Slide 17

Slide 17 text

サブコマンドの追加 $ cobra add hello // 新規サブコマンド追加 $ find . . ./cmd ./cmd/hello.go ./cmd/root.go ./LICENSE ./main.go $ vim cmd/root.go $ vim cmd/hello.go ./main.go ./cmd/root.go ./cmd/ hello.go ./cmd/ hoge.go … ./cmd/ fuga.go 呼び出し元 コマンドの実装 サブコマンドの実装 17

Slide 18

Slide 18 text

package cmd import ( "fmt" "github.com/spf13/cobra" …省略… ) var cfgFile string var rootCmd = &cobra.Command{ Use: "go-sample-cli", …省略… } func Execute() { if err := rootCmd.Execute(); err != nil { fmt.Println(err) os.Exit(1) } …省略… 18 1. サブコマンドを含むパッケージの定義 2. 複数ライブラリーのインポート 3. パッケージの名前空間に変数を定義 4. デフォルトのコマンドの構造体を 初期化し変数に代⼊ root.go 5. Excute関数の定義(main関数から呼び出される)

Slide 19

Slide 19 text

package cmd import ( "fmt" "github.com/spf13/cobra" ) var helloCmd = &cobra.Command{ Use: "hello", Short: "A brief description of your command", …省略… Run: func(cmd *cobra.Command, args []string) { fmt.Println(“hello called”) }, } func init() { rootCmd.AddCommand(helloCmd) } 19 1. サブコマンドの構造体の初期化と 変数への代⼊ 4. パッケージの初期化 (main関数よりも先に実⾏される) 5. コマンド本体へサブコマンドを追加 hello.go 3. サブコマンドで提供する処理を実装する 2. 無名関数を構造体に追加

Slide 20

Slide 20 text

実⾏ $ go run main.go hello // バイナリーを⽣成せずに実⾏ hello called $ go build // バイナリーを⽣成 $ ./go-sample-cli hello hello called 20

Slide 21

Slide 21 text

CLIの利⽤イメージ • オンプレミスアプリケーション • ログの集計・加⼯ • アプリケーションの監視 • アクセスログ • エラーログ • メール通知 • クラウドアプリケーション • ヘルスチェック • Web APIでステータスを確認する • イベント駆動処理 • cron、Lambda、Cloud Functionなど 21

Slide 22

Slide 22 text

最後に • Googleの提供するGoをご紹介させていただきました • Goはシンプルな実装になっており、読解性、⽣産性、⾼速性に優れています • 今回ご紹介したCLI以外にもWebサーバー・アプリケーションやサーバレス・アプリ ケーションも実装できます • デメリットがあるものの、他の⾔語よりも洗練されている部分もあるためエンタープラ イズの領域においても導⼊を検討してみてはいかがでしょうか • 中級者編以降のご紹介やハンズオンなどのご依頼お待ちしております 22

Slide 23

Slide 23 text

ご清聴ありがとうございました 23