14
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

RICOH THETAAdvent Calendar 2015

Day 15

Go言語でRICOH THETA API v2を叩いてみた

Last updated at Posted at 2015-12-14

gopher
出典 golang.org

RICOH THETA
出典 developers.theta360.com

RICOH THETA API v2 をGo言語で叩いてみる

Go言語にちょっと興味が湧いてきたので理解するために何か実装して見ようと思って、ちょうどタイミング的にRICOH THETA API v2の公開が重なったのでではGo言語のAPIクライアントを作ろうということにしました。

作ったもの

THETAを開発するとき無線LAN USBアダプターは必需アイテム

THETAを使ったアプリの開発すると地味に面倒なことに気づきます。それはTHETAに接続しながらネットに繋げられないので調べ物が出来ないのです。その問題を解消するために無線LAN USBアダプターを挿すことでネットを見ながら接続もキープできるのでオススメです。

私は主にMBPで開発してますが、Macに対応する無線アダプタはちょっと少ないですが、PLANEXのものであればMacも対応してることも多いようです。PLANEXの刀を愛用してます。かっ飛びです。

katana.jpg

APIv2クライアントを試してみる

Go言語自体は既にインストールしていることを前提とします。まずAPIv2クライアントを取り込みます。

go get github.com/toshi3221/theta_v2

クライアントライブラリ内にTHETA Sを操作可能な各種サンプルを用意しているのでここでは撮影を行うサンプル(take_picture.go)を実行してみます。THETA SをWi-Fi接続後、以下コマンドを実行します:

cd $GOPATH/src/github.com/toshi3221/theta_v2/examples
go run take_picture.go

サンプルではセッションを開始し、撮影を行ってファイルが保存されるまで待つようにしています。

APIv2 WebUIを試してみる

Go言語のWebフレームワークであるRevelを使ってみました。高速で動作してAPIサーバー等に相性が良さそうです。Revelをインストールします:

go get github.com/revel/revel
go get github.com/revel/cmd/revel

revelコマンドは$GOPATH/binフォルダにインストールされるのでPATHを通しておいて下さい。Revelのインストールが終了したら、APIv2 WebUIをインストールしてビルドしてサーバーを起動します:

go get github.com/toshi3221/pazu
revel build github.com/toshi3221/pazu pazu
cd pazu
./run.sh

あとはTHETA Sを接続しておいて http://localhost:9000/ にアクセスすると、撮影・一覧表示ができました。

file_list.jpg

THETA API v2は複数同時HTTP接続が可能だが3つまで

API v1はコマンドを複数同時に受け付けることは出来ませんでしたが、API v2からは複数同時に受け付けが可能となりました。これにより、CheckForUpdates / Stateをコマンド等とは非同期にリクエストを行って監視する等応用が可能となります。

しかしながら、無制限に複数同時接続が出来るというわけでは無く、同時3接続を超えるとリクエストを受け付けずエラーで弾かれるようです。

Go言語にはチャネルという並列処理時に同期する仕組みがあり、バッファリングを行ったチャネルを利用することでセマフォのように使うことが出来ます。この仕組みを利用してtheta_v2ではClientメソッドを同時に3つまで処理可能とし、それを超えるとチャネルによってブロックすることで制御しています:

var clientSemaphore = make(chan int, 3) // バッファサイズ3のint型チャネル。値は使わないので型や格納する値は何でも良い

func (client *Client) Info() (info Info, error error) {
	clientSemaphore <- 1  // チャネルに格納。同時格納が3を超えるとブロックする
	defer func() { <-clientSemaphore }() // メソッドを抜けるときにチャネルから値を取り出す
	...
}

今後の展望

APIv2 WebUIが今のところ動いたーってことしか本当に出来てないので、ファイルの取り込み、ファイル各種操作程度出来るようになれば普通にノートPCで使えるようになるかなと思ってます。それくらいまではやろうかなと。RICOH THETAは普通のユーザーも開発者も楽しいので是非みんなで盛り上げていきましょう!

14
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?