Download - GDG DevFest Kyoto 2014 これからのGoの話をしよう
これからの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はここから見つけてきたよ
おまけ