gdg devfest kyoto 2014 これからのgoの話をしよう
DESCRIPTION
GDG DevFest Kyoto 2014 これからのGoの話をしようTRANSCRIPT
これからのGoの話をしよう
GDG神戸 野田悟志
GDG DevFest Kyoto 2014
みんなの
ライフ
自己紹介って大事だよね
野田です。以上
環境
OS Ubuntu14.04 x64 (VMware Player 6)
Go Version 1.3.3 (一部1.2.2)
開発環境 ≒ Vim
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ディレクトリに作っていくと良いよ (後で説明)
万と言わず京の一の念の念の念のため
gitとhgコマンドが使えるようにインストール
$ sudo apt-get install git $ sudo apt-get install mercurialGithubやGoogleCodeから色々取ってくるから
万と言わず京の一の念の念の念のため
gocodeインテリセンスを使えるようになる
$ go get -u github.com/nsf/gocodeVimの場合、"."の後に<C-x><C-o>で補完される
go getすると、GOPATH以下にbin、pkg、srcが自動的に作ら
れる必要ないディレクトリは作られない
自分で作成したソースをgo installしてパッケージを作る場合、
GOPATH以下のsrcと同階層にあるpkgにパッケージが作成さ
れるなので、GOPATH以下のsrcにソースファイル作っていくと良いよって話
.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
クロスコンパイル
最初に対象となるプラットフォームのクロスコンパイル環境を作
成する必要がある
GOOSに対象OS、GOARCHに対象アーキテクチャを指定
$ cd $GOROOT/src $ sudo GOOS=windows GOARCH=amd64 ./make.bash
GOOSとGOARCHの組み合わせは下記参照
http://golang.org/doc/install/source
GOOS、GOARCHを指定してgo buildすると、対象プラット
フォームの実行ファイルが作成される
$ GOOS=windows GOARCH=amd64 go build sample.go
SQL
SQL DriverSQL Driverの一覧
https://code.google.com/p/go-wiki/source/browse/SQLDrivers.wiki?repo=wiki
MyMySQLhttps://github.com/ziutek/mymysqlMySQLは入れといてね!今回はMySQL5.5を使ってるよ
MyMySQLを取ってくる
$ go get github.com/ziutek/mymysql/thrsafe $ go get github.com/ziutek/mymysql/autorc $ go get github.com/ziutek/mymysql/godrv
importに _ "github.com/ziutek/mymysql/thrsafe"を入れておく
import ( "fmt" "github.com/ziutek/mymysql/mysql" _ "github.com/ziutek/mymysql/thrsafe" "os")
直接使うわけじゃないけど、thrsafe.goのinit関数が呼ばれ、
DB接続の準備をする
thrsafeはスレッドセーフなDB接続になる
_ "github.com/ziutek/mymysql/native"をthrsafeの代わりにimportしても良い
mysql.goのinit関数が呼ばれ、同じくDB接続の準備をする
thrsafeとの違いは、こっちはスレッドアンセーフなDB接続にな
る
db := mysql.New("tcp", "", "127.0.0.1:3306", "sampleuser", "samplepw", "sampledb")db.Connect()
DB接続情報を作成し、接続する
第二引数はローカルアドレス。第三引数がサーバアドレス
defer func() { db.Close()}()
遅延実行でDBを閉じようにしておく
クエリを実行するにはQueryを使う
第一引数にクエリ、第二引数にパラメータ(可変)を設定する
sqlstr := "INSERT INTO sample_table (name) VALUES ('test_%d')"db.Query(sqlstr, 1)
SELECT文の実行結果のマッピング
sqlstr := "SELECT * FROM sample_table"rows, res, _ := db.Query(sqlstr)id := res.Map("id")name := res.Map("name")
レコードはこんな感じで見れる
for _, row := range rows { // 結果を1行ずつ表示する
fmt.Printf("| %d | %s |\n", row.Int(id), row.Str(name))}
トランザクションはこんな感じ
tr, err := db.Begin()sqlstr := "UPDATE sample_table SET name='test'"_, err = tr.Start(sqlstr)
コミットはtr.Commit()、ロールバックはtr.Rollback()を呼ぶ
OpenCV
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
OpenCVが使えるようにする(バインディングしてくれる) $ go get github.com/lazywei/go-opencv
$GOPATH/src/github.com/lazywei/go-opencv/samples に色々サンプル入ってるよ。
Demo
Gobot
http://gobot.io/ArduinoやSphero(2.0)、ARDroneなど11のプラットフォームに
対応
今回はArduino(Arduino UNO R3)でLEDを光らせるよ
Gobot
Firmata(フェルマータ)というプロトコルを使う
まずはArduino UNO R3にFirmataを書き込む
Arduino UNO R3を接続し、ArduinoIDEから、
File -> Examples -> Firmata -> StandardFirmataを開いて、Upload
ArduinoIDEhttp://arduino.cc/en/main/software
Firmata
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
gobot/examplesの下のfirmata_blink.goポート番号など適宜変更
firmataAdaptor := firmata.NewFirmataAdaptor("arduino", "/dev/ttyACM0")led := gpio.NewLedDriver(firmataAdaptor, "led", "7")
Demo
見てみろよ、LED光ってるだろ?
これ、Goで動いてるんだぜ!
停止するにはCtrl+C
もし「open /dev/ttyACM0: "Permission denied"」と出る場合
$ sudo chown (ユーザ名) /dev/ttyACM0
GoAndroid
AndroidにはJNIというネイティブ言語をJava経由で実行する仕
組みがある
GoをJNIで実行できるようにしたのがGoAndroidというパッチパッチなのでGoソースからビルドする必要があるよ
GoAndroid
まずは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
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
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
適用なところに展開して.profileに下記を追加
export NDK=$HOME/android-ndkバージョン邪魔だったので android-ndkにリネームしてるよ
NDKToolchainを作成する
Android向けライブラリを作る時に使うみたい
$ $NDK/build/tools/make-standalone-toolchain.sh --toolchain=arm-linux-androideabi-4.9 --platform=android-18 --install-dir=ndk-toolchain
・toolchain 対象端末のアーキテクチャ設定
「arm-linux-androideabi-4.x」はARM端末
「x86-4.x」はx86端末
「mipsel-linux-android-4.x」はMIPS端末
・platform 対象端末のAPIレベルの設定 今回はNexus7(2013)に入れようと思ってるので、とりあえず 18
・install-dir NDKToolchainの作成先ディレクトリ
ndk-toolchainディレクトリが作成されたら、NDK_ROOTを設定
しておく
export NDK_ROOT=$HOME/ndk-toolchain
GoAndroidhttps://github.com/eliasnaur/goandroid
ARMv7以降のCPUに対応している
Go1.2に対応。Go1.3はサポート対象外
えーって感じだけど、それについては後述
とりあえず今回は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を設定する
GoAndroidを取ってくる
$ git clone https://github.com/eliasnaur/goandroid.git
goandroidディレクトリに移動し、patchesディレクトリ
を$GOROOT以下へコピーする
$ cp -a patches $GOROOT/.hg
$GOROOT/.hg/hgrcに下記を追記する
usernameは適当に変えるといいよ
[extensions]mq =codereview = !
[ui]username = name<[email protected]>
パッチをあてる
$ 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
サンプルを実行してみるgoandroid/hello-gl2/へ移動
build.shを開き、
$GOANDROID/bin/goを
$GOROOT/bin/goに書き換える
ビルド実行
$ ./build.sh
androidディレクトリのproject.propertiesを開き、
使用するAPIバージョンに書き換え僕のNexus7(2013)の場合、target=android-18とする
端末をPCに繋ぎ、インストール
$ ant -f android/build.xml clean debug install
「BUILD SUCCESSFUL」と出力されていれば成功
端末に「Go GL2!」というアプリがあるはず
Demo
見てみろよ
これ、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
で、もう一度インストール実行
ちょっとだけ
これからの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もあるし
これからも熱いぜ!
golang!
ご清聴
ありがとうございました
GopherCon2014http://confreaks.com/events/gophercon2014
今年の春ごろにやってた、Goのイベントの動画
今回のGobotはここから見つけてきたよ
おまけ