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

Preview:

DESCRIPTION

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

Citation preview

これからの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<sample@mail.com>

パッチをあてる

 $ 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はここから見つけてきたよ

おまけ