60
これからのGoの話をしよう GDG神戸 野田悟志 GDG DevFest Kyoto 2014 みんなの ライフ

GDG DevFest Kyoto 2014 これからのGoの話をしよう

Embed Size (px)

DESCRIPTION

GDG DevFest Kyoto 2014 これからのGoの話をしよう

Citation preview

Page 1: GDG DevFest Kyoto 2014 これからのGoの話をしよう

これからのGoの話をしよう

GDG神戸 野田悟志

GDG DevFest Kyoto 2014

みんなの

ライフ

Page 2: GDG DevFest Kyoto 2014 これからのGoの話をしよう

自己紹介って大事だよね

野田です。以上

Page 3: GDG DevFest Kyoto 2014 これからのGoの話をしよう

環境

OS Ubuntu14.04 x64 (VMware Player 6)

Go Version 1.3.3 (一部1.2.2)

Page 4: GDG DevFest Kyoto 2014 これからのGoの話をしよう

開発環境 ≒ Vim

Page 5: GDG DevFest Kyoto 2014 これからのGoの話をしよう

Vimインストール

 $ sudo apt-get install vim

.profileにGOROOTとGOPATHを設定

 export GOROOT=/usr/local/go export GOPATH=$HOME/go export PATH=$GOPATH/bin:$GOROOT/bin:$PATHGOPATHはgo getでライブラリが格納されるディレクトリ。適当で OKあと、ソースファイルはGOPATH以下のsrcディレクトリに作っていくと良いよ (後で説明)

万と言わず京の一の念の念の念のため

Page 6: GDG DevFest Kyoto 2014 これからのGoの話をしよう

gitとhgコマンドが使えるようにインストール

 $ sudo apt-get install git $ sudo apt-get install mercurialGithubやGoogleCodeから色々取ってくるから

万と言わず京の一の念の念の念のため

Page 7: GDG DevFest Kyoto 2014 これからのGoの話をしよう

gocodeインテリセンスを使えるようになる

 $ go get -u github.com/nsf/gocodeVimの場合、"."の後に<C-x><C-o>で補完される

Page 8: GDG DevFest Kyoto 2014 これからのGoの話をしよう

go getすると、GOPATH以下にbin、pkg、srcが自動的に作ら

れる必要ないディレクトリは作られない

自分で作成したソースをgo installしてパッケージを作る場合、

GOPATH以下のsrcと同階層にあるpkgにパッケージが作成さ

れるなので、GOPATH以下のsrcにソースファイル作っていくと良いよって話

Page 9: GDG DevFest Kyoto 2014 これからのGoの話をしよう

.vimrc (僕のはこんな感じ)

filetype offfiletype plugin off "indent offset runtimepath+=$GOROOT/misc/vimexe "set runtimepath+=".globpath($GOPATH, "src/github.com/nsf/gocode/vim")set number "行番号を表示

set tabstop=4 "インデントをスペース4つ分に設定

set smartindent "改行時のオートインデント

set completeopt=menuone "コード補完時のプレビューを無効にする

set ignorecase "大文字/小文字の区別なく検索する

set incsearch "検索フレーズに部分マッチしている部分を表示する

set hlsearch "マッチするすべを強調表示する

set smartcase "検索文字列に大文字が含まれている場合は区別して検索する

"バッファの前後切り替え

nmap <C-p> :bp<CR>nmap <C-n> :bn<CR>filetype plugin on "indent on

Page 10: GDG DevFest Kyoto 2014 これからのGoの話をしよう

クロスコンパイル

Page 11: GDG DevFest Kyoto 2014 これからのGoの話をしよう

最初に対象となるプラットフォームのクロスコンパイル環境を作

成する必要がある

GOOSに対象OS、GOARCHに対象アーキテクチャを指定

 $ cd $GOROOT/src $ sudo GOOS=windows GOARCH=amd64 ./make.bash

GOOSとGOARCHの組み合わせは下記参照

http://golang.org/doc/install/source

Page 12: GDG DevFest Kyoto 2014 これからのGoの話をしよう

GOOS、GOARCHを指定してgo buildすると、対象プラット

フォームの実行ファイルが作成される

 $ GOOS=windows GOARCH=amd64 go build sample.go

Page 13: GDG DevFest Kyoto 2014 これからのGoの話をしよう

SQL

Page 14: GDG DevFest Kyoto 2014 これからのGoの話をしよう

SQL DriverSQL Driverの一覧

https://code.google.com/p/go-wiki/source/browse/SQLDrivers.wiki?repo=wiki

MyMySQLhttps://github.com/ziutek/mymysqlMySQLは入れといてね!今回はMySQL5.5を使ってるよ

Page 15: GDG DevFest Kyoto 2014 これからのGoの話をしよう

MyMySQLを取ってくる

 $ go get github.com/ziutek/mymysql/thrsafe $ go get github.com/ziutek/mymysql/autorc $ go get github.com/ziutek/mymysql/godrv

Page 16: GDG DevFest Kyoto 2014 これからのGoの話をしよう

importに _ "github.com/ziutek/mymysql/thrsafe"を入れておく

import ( "fmt" "github.com/ziutek/mymysql/mysql" _ "github.com/ziutek/mymysql/thrsafe" "os")

Page 17: GDG DevFest Kyoto 2014 これからのGoの話をしよう

直接使うわけじゃないけど、thrsafe.goのinit関数が呼ばれ、

DB接続の準備をする

thrsafeはスレッドセーフなDB接続になる

_ "github.com/ziutek/mymysql/native"をthrsafeの代わりにimportしても良い

mysql.goのinit関数が呼ばれ、同じくDB接続の準備をする

thrsafeとの違いは、こっちはスレッドアンセーフなDB接続にな

Page 18: GDG DevFest Kyoto 2014 これからのGoの話をしよう

db := mysql.New("tcp", "", "127.0.0.1:3306", "sampleuser", "samplepw", "sampledb")db.Connect()

DB接続情報を作成し、接続する

第二引数はローカルアドレス。第三引数がサーバアドレス

Page 19: GDG DevFest Kyoto 2014 これからのGoの話をしよう

defer func() { db.Close()}()

遅延実行でDBを閉じようにしておく

Page 20: GDG DevFest Kyoto 2014 これからのGoの話をしよう

クエリを実行するにはQueryを使う

第一引数にクエリ、第二引数にパラメータ(可変)を設定する

sqlstr := "INSERT INTO sample_table (name) VALUES ('test_%d')"db.Query(sqlstr, 1)

Page 21: GDG DevFest Kyoto 2014 これからのGoの話をしよう

SELECT文の実行結果のマッピング

sqlstr := "SELECT * FROM sample_table"rows, res, _ := db.Query(sqlstr)id := res.Map("id")name := res.Map("name")

Page 22: GDG DevFest Kyoto 2014 これからのGoの話をしよう

レコードはこんな感じで見れる

for _, row := range rows { // 結果を1行ずつ表示する

fmt.Printf("| %d | %s |\n", row.Int(id), row.Str(name))}

Page 23: GDG DevFest Kyoto 2014 これからのGoの話をしよう

トランザクションはこんな感じ

tr, err := db.Begin()sqlstr := "UPDATE sample_table SET name='test'"_, err = tr.Start(sqlstr)

コミットはtr.Commit()、ロールバックはtr.Rollback()を呼ぶ

Page 24: GDG DevFest Kyoto 2014 これからのGoの話をしよう

OpenCV

Page 25: GDG DevFest Kyoto 2014 これからのGoの話をしよう

OpenCVをインストール

 $ sudo apt-get install ocl-icd-libopencl1 $ sudo apt-get install libopencv-dev

1つ目のをインストールしないと、次回ログイン時に XWindowがこけて

ログインできなくなるバグがあるっぽい

http://computationaldiary.blogspot.jp/2013/11/ubuntu-1310-opencv-245-apt-get.html

Page 26: GDG DevFest Kyoto 2014 これからのGoの話をしよう

OpenCVが使えるようにする(バインディングしてくれる) $ go get github.com/lazywei/go-opencv

$GOPATH/src/github.com/lazywei/go-opencv/samples に色々サンプル入ってるよ。

Page 27: GDG DevFest Kyoto 2014 これからのGoの話をしよう

Demo

Page 28: GDG DevFest Kyoto 2014 これからのGoの話をしよう

Gobot

Page 29: GDG DevFest Kyoto 2014 これからのGoの話をしよう

http://gobot.io/ArduinoやSphero(2.0)、ARDroneなど11のプラットフォームに

対応

今回はArduino(Arduino UNO R3)でLEDを光らせるよ

Gobot

Page 30: GDG DevFest Kyoto 2014 これからのGoの話をしよう

Firmata(フェルマータ)というプロトコルを使う

まずはArduino UNO R3にFirmataを書き込む

Arduino UNO R3を接続し、ArduinoIDEから、

File -> Examples -> Firmata -> StandardFirmataを開いて、Upload

ArduinoIDEhttp://arduino.cc/en/main/software

Firmata

Page 31: GDG DevFest Kyoto 2014 これからのGoの話をしよう

Gobotを取ってきて、各パッケージを用意する

 $ go get -u github.com/hybridgroup/gobot $ go install github.com/hybridgroup/gobot/platforms/firmata $ go install github.com/hybridgroup/gobot/platforms/gpio

シリアル通信が出来るようにgoserialも入れる

 $ go get -u github.com/tarm/goserial

Gobotのバージョン確認は下記で出来るようになるよ

 $ go get -u github.com/hybridgroup/gobot/gobot $ gobot -v

Page 32: GDG DevFest Kyoto 2014 これからのGoの話をしよう

gobot/examplesの下のfirmata_blink.goポート番号など適宜変更

firmataAdaptor := firmata.NewFirmataAdaptor("arduino", "/dev/ttyACM0")led := gpio.NewLedDriver(firmataAdaptor, "led", "7")

Page 33: GDG DevFest Kyoto 2014 これからのGoの話をしよう

Demo

Page 34: GDG DevFest Kyoto 2014 これからのGoの話をしよう

見てみろよ、LED光ってるだろ?

これ、Goで動いてるんだぜ!

Page 35: GDG DevFest Kyoto 2014 これからのGoの話をしよう

停止するにはCtrl+C

もし「open /dev/ttyACM0: "Permission denied"」と出る場合

$ sudo chown (ユーザ名) /dev/ttyACM0

Page 36: GDG DevFest Kyoto 2014 これからのGoの話をしよう

GoAndroid

Page 37: GDG DevFest Kyoto 2014 これからのGoの話をしよう

AndroidにはJNIというネイティブ言語をJava経由で実行する仕

組みがある

GoをJNIで実行できるようにしたのがGoAndroidというパッチパッチなのでGoソースからビルドする必要があるよ

GoAndroid

Page 38: GDG DevFest Kyoto 2014 これからのGoの話をしよう

まずはAndroid SDKとかJDKとかもろもろ取ってくる

Android SDKhttp://developer.android.com/sdk/index.htmlSDKだけでいいなら、「VIEW ALL DOWNLOADS AND SIZES」->「SDK Tools Only」から

適当なところに展開して.profileに下記を追加

export ANDROID_HOME=$HOME/android-sdk-linux

Page 39: GDG DevFest Kyoto 2014 これからのGoの話をしよう

JDK、ant、adbを入れる

 $ sudo apt-get install openjdk-7-jdk $ sudo apt-get install ant $ sudo apt-get install android-tools-adb試しに端末が認識されるか確認しておく。もし認識されていない場合は rulesファイルを作成してね

 $ adb devices

SDKManagerを起動し、端末のAPIレベルに合わせて、

インストール

 $ $ANDROID_HOME/tools/android

Page 40: GDG DevFest Kyoto 2014 これからのGoの話をしよう

JNIを利用するにはAndroid NDKが必要

https://developer.android.com/intl/ja/tools/sdk/ndk/index.html

展開する

 $ chmod a+x android-ndk-r10c-linux-x86_64.bin $ ./android-ndk-r10c-linux-x86_64.binLinuxのx86は問題なかったんだけど、 x64の方は全然展開されない…で、調べてみたら Issueには上がってた ( https://code.google.com/p/android/issues/detail?id=78148 )以下を実行して展開すれば OKみたい

 $ sudo dpkg --add-architecture i386 $ sudo apt-get update $ sudo apt-get install libstdc++6:i386

Page 41: GDG DevFest Kyoto 2014 これからのGoの話をしよう

適用なところに展開して.profileに下記を追加

export NDK=$HOME/android-ndkバージョン邪魔だったので android-ndkにリネームしてるよ

Page 42: GDG DevFest Kyoto 2014 これからのGoの話をしよう

NDKToolchainを作成する

Android向けライブラリを作る時に使うみたい

$ $NDK/build/tools/make-standalone-toolchain.sh --toolchain=arm-linux-androideabi-4.9 --platform=android-18 --install-dir=ndk-toolchain

Page 43: GDG DevFest Kyoto 2014 これからのGoの話をしよう

・toolchain 対象端末のアーキテクチャ設定

 「arm-linux-androideabi-4.x」はARM端末

 「x86-4.x」はx86端末

 「mipsel-linux-android-4.x」はMIPS端末

 

・platform 対象端末のAPIレベルの設定  今回はNexus7(2013)に入れようと思ってるので、とりあえず 18

Page 44: GDG DevFest Kyoto 2014 これからのGoの話をしよう

・install-dir NDKToolchainの作成先ディレクトリ

ndk-toolchainディレクトリが作成されたら、NDK_ROOTを設定

しておく

export NDK_ROOT=$HOME/ndk-toolchain

Page 45: GDG DevFest Kyoto 2014 これからのGoの話をしよう

GoAndroidhttps://github.com/eliasnaur/goandroid

ARMv7以降のCPUに対応している

Go1.2に対応。Go1.3はサポート対象外

えーって感じだけど、それについては後述

Page 46: GDG DevFest Kyoto 2014 これからのGoの話をしよう

とりあえず今回はGoソースは1.2.2を取ってくる

 $ hg clone -u go1.2.2 https://code.google.com/p/go既に取得済みで1.2.2でないならブランチを切り替える

 $ hg update -C release-branch.go1.2

1.2.2の方に$GOROOTを設定する

Page 47: GDG DevFest Kyoto 2014 これからのGoの話をしよう

GoAndroidを取ってくる

 $ git clone https://github.com/eliasnaur/goandroid.git

goandroidディレクトリに移動し、patchesディレクトリ

を$GOROOT以下へコピーする

 $ cp -a patches $GOROOT/.hg

Page 48: GDG DevFest Kyoto 2014 これからのGoの話をしよう

$GOROOT/.hg/hgrcに下記を追記する

usernameは適当に変えるといいよ

[extensions]mq =codereview = !

[ui]username = name<[email protected]>

Page 49: GDG DevFest Kyoto 2014 これからのGoの話をしよう

パッチをあてる

 $ cd $GOROOT/src $ hg qpush -a

ビルドする

 $ CGO_ENABLED=0 GOOS=linux GOARCH=arm ./make.bash CC="$NDK_ROOT/bin/arm-linux-androideabi-gcc" GOOS=linux GOARCH=arm GOARM=7 CGO_ENABLED=1 $GOROOT/bin/go install -tags android -a -v std

Page 50: GDG DevFest Kyoto 2014 これからのGoの話をしよう

サンプルを実行してみるgoandroid/hello-gl2/へ移動

build.shを開き、

$GOANDROID/bin/goを

$GOROOT/bin/goに書き換える

Page 51: GDG DevFest Kyoto 2014 これからのGoの話をしよう

ビルド実行

 $ ./build.sh

androidディレクトリのproject.propertiesを開き、

使用するAPIバージョンに書き換え僕のNexus7(2013)の場合、target=android-18とする

Page 52: GDG DevFest Kyoto 2014 これからのGoの話をしよう

端末をPCに繋ぎ、インストール

 $ ant -f android/build.xml clean debug install

「BUILD SUCCESSFUL」と出力されていれば成功

端末に「Go GL2!」というアプリがあるはず

Page 53: GDG DevFest Kyoto 2014 これからのGoの話をしよう

Demo

Page 54: GDG DevFest Kyoto 2014 これからのGoの話をしよう

見てみろよ

これ、Goで動いてるんだぜ!

Page 55: GDG DevFest Kyoto 2014 これからのGoの話をしよう

もし

「error while loading shared libraries: libz.so.1: cannot open shared object file: No such file or directory」のエラーで失敗した場合(おそらくx64の場合のみ)

 $ sudo apt-get install lib32z1

で、もう一度インストール実行

Page 56: GDG DevFest Kyoto 2014 これからのGoの話をしよう

ちょっとだけ

これからのGoを考えてみる

Page 57: GDG DevFest Kyoto 2014 これからのGoの話をしよう

GoAndroidでは、Go1.3はサポート対象外

な、なんだってー!って感じだけど、どうやら、Go1.4に向けて

準備しているみたい

噂では、GoAndroidを組み込んで、Go1.4からGOOSにandroidが追加されるかも!http://www.infoq.com/jp/news/2014/07/golang-google-android-native-dev

ついに PhysicalGo の時代か!?

あとGobotもあるし

Page 58: GDG DevFest Kyoto 2014 これからのGoの話をしよう

これからも熱いぜ!

golang!

Page 59: GDG DevFest Kyoto 2014 これからのGoの話をしよう

ご清聴

ありがとうございました

Page 60: GDG DevFest Kyoto 2014 これからのGoの話をしよう

GopherCon2014http://confreaks.com/events/gophercon2014

今年の春ごろにやってた、Goのイベントの動画

今回のGobotはここから見つけてきたよ

おまけ