「Cloud Foundry 百日行」第74日目は、Play Framework 2 ベースの ZOUND です。ZOUND は Play Framework の データストリームをリアルタイムに処理するためのAPIであるIteratees
を使って、オーディオストリームを実験的に処理するアプリのようです。今回は、CF 上でオーディオストリームの再生ができるのか興味があったので、試してみました。が、アプリは上がったものの残念ながら音を出すところまではたどり着けませんでした。
基本情報
-
公式サイト
http://greweb.me/2012/08/zound-a-playframework-2-audio-streaming-experiment-using-iteratees/ -
ソースコード
https://github.com/gre/zound -
参考
Play Framwork 2.1.x のドキュメント(日本語版)
Iteratees のドキュメント(日本語版)
デプロイ準備から動作確認までの手順は以下の通りです。
- 1) Play 用ツールのインストール
- 2) ソースの取得
- 3) 設定ファイルの修正
- 4) jsyn ライブラリのアップデート
- 5) バイナリの生成
- 6) デプロイ
- 7) 動作確認
- 8) まとめ
1. Play 用ツールのインストール
まず、Cloud Foundry へデプロイするバイナリを作成するため、デプロイ実行環境に play 用ツールをインストールします。
ZOUND のソースを確認すると、 project/plugins.sbt にて、 Play Framework のバージョンは 2.1
のようなので、今回は最終リリースの 2.1.5
をDLページから取得し、PATH を設定します。
※ JDK 6
以降が必要なので予め準備しておいてください。
$ wget http://downloads.typesafe.com/play/2.1.5/play-2.1.5.zip
$ unzip play-2.1.5.zip
$ export PATH="$PATH:$HOME/play-2.1.5"
play コマンドのヘルプを実行し、以下のような表示が出れば成功です。
$ play help
_ _
_ __ | | __ _ _ _| |
| '_ \| |/ _' | || |_|
| __/|_|\____|\__ (_)
|_| |__/
play! 2.1.5 (using Java 1.6.0_35 and Scala 2.10.0), http://www.playframework.org
Welcome to Play 2.1.5!
These commands are available:
-----------------------------
license Display licensing informations.
new [directory] Create a new Play application in the specified directory.
You can also browse the complete documentation at http://www.playframework.org.
2. ソースの取得
ZOUND のソースを GitHub から取得します。
$ git clone https://github.com/gre/zound.git
$ cd $ cd zound/playapp/
zound/playapp$ ls -a
. .. app conf .gitignore lib project public README test
3. 設定ファイルの修正
まず、今回使う play のバージョンは 2.1.5
としたので、 project/plugins.sbt の addSbtPlugin
のバージョン指定部分を 2.1.5
固定で指定する修正をします。
diff --git playapp/project/plugins.sbt playapp/project/plugins.sbt
index 5aeab77..1e48efa 100644
--- playapp/project/plugins.sbt
+++ playapp/project/plugins.sbt
@@ -5,4 +5,4 @@ logLevel := Level.Warn
resolvers += "Typesafe repository" at "http://repo.typesafe.com/typesafe/releas
// Use the Play sbt plugin for Play projects
-addSbtPlugin("play" % "sbt-plugin" % "2.1-SNAPSHOT")
\ No newline at end of file
+addSbtPlugin("play" % "sbt-plugin" % "2.1.5")
次に、project/build.properties で指定している sbt
のバージョンを 2.1.5
に合わせて修正します。
指定するバージョンの確認は、以下のようにインストールした play 用ツールのソースから確認ができます。
zound/playapp$ cat $HOME/play-2.1.5/framework/project/build.properties
sbt.version=0.12.2
該当する sbt
のバージョンを指定します。
diff --git playapp/project/build.properties playapp/project/build.properties
index 390c1af..66ad72c 100644
--- playapp/project/build.properties
+++ playapp/project/build.properties
@@ -1 +1 @@
-sbt.version=0.11.3
\ No newline at end of file
+sbt.version=0.12.2
4. jsyn ライブラリのアップデート
上記までの修正後、後述する play dist
によるバイナリ生成 → アプリのプッシュを実施したところ、デプロイには成功するのですが、ブラウザからアプリにアクセスしてみると、以下のようなオーディオフォーマットがサポートされていないようなエラーを残して、画面には何も表示されない状態になりました。
Play server process ID is 29
[info] play - Application started (Prod)
[info] play - Listening for HTTP on /0:0:0:0:0:0:0:0:61531
---- Pure Java JSyn www.softsynth.com - rate = 44100, RT, V16.5.1 (build 439, 2012-06-02)
JavaSoundOutputStream - not supported.PCM_SIGNED 44100.0 Hz, 16 bit, stereo, 4 bytes/frame, little-endian
[error] application -
エラーメッセージを出している Jsyn
ライブラリは lib
で管理されており、確認してみると結構古いバージョンでした。
zound/playapp$ ls lib
jsyn-beta-16.5.1.jar
そこで、 JSyn
を最新版 jsyn_16_7_3.jar
に置き換えて再度試すことにしました。
zound/playapp$ wget -P lib http://www.softsynth.com/jsyn/developers/archives/jsyn_16_7_3.jar
zound/playapp$ rm lib/jsyn-beta-16.5.1.jar
zound/playapp$ ls lib/
jsyn_16_7_3.jar
5. バイナリの生成
上記までの修正が完了したら、play
コマンドを使って、デプロイ用のバイナリを作成します。
zound/playapp$ play dist
:
[success] Total time: 20 s, completed Oct 6, 2015 6:29:28 PM
上記のように [success]
が出て、 dist
ディレクトリの下に zip ファイルが出来ていれば成功です。
zound/playapp$ ls dist/
zound-1.0-SNAPSHOT.zip
6. デプロイ
まずは、デプロイ用のマニフェストを作成します。
zound/playapp$ cat manifest.yml
---
applications:
- name: zound-100
path: dist/zound-1.0-SNAPSHOT.zip
path:
には、作成したバイナリのパスを指定します。
マニフェストができたら、いよいよ cf push
を実行しデプロイします。
zound/playapp$ cf push
:
1 of 1 instances running
App started
OK
App zound-100 was started using this command `PATH=$PWD/.java-buildpack/open_jdk_jre/bin:$PATH JAVA_HOME=$PWD/.java-buildpack/open_jdk_jre $PWD/zound-1.0-SNAPSHOT/start -Djava.io.tmpdir=$TMPDIR -XX:OnOutOfMemoryError=$PWD/.java-buildpack/open_jdk_jre/bin/killjava.sh -Xmx160M -Xms160M -XX:MaxMetaspaceSize=64M -XX:MetaspaceSize=64M -Xss853K -Dhttp.port=$PORT`
Showing health and status for app zound-100 in org horiu-jn / space horiu-jn as horiu-jn...
OK
requested state: started
instances: 1/1
usage: 256M x 1 instances
urls: zound-100.10.244.0.34.xip.io
last uploaded: Tue Oct 6 09:41:55 UTC 2015
stack: cflinuxfs2
buildpack: java-buildpack=v3.0-https://github.com/cloudfoundry/java-buildpack.git#3bd15e1 open-jdk-jre=1.8.0_60 play-framework-auto-reconfiguration=1.10.0_RELEASE play-framework=2.1.5 spring-auto-reconfiguration=1.10.0_RELEASE
state since cpu memory disk details
#0 running 2015-10-06 06:42:31 PM 0.0% 157.4M of 256M 0 of 1G
無事、デプロイは成功しました。
7. 動作確認
ブラウザから、払いだされたアプリのURLへアクセスすると、無事にアプリの画面が表示されました。
摘みや波形のボタンなどもマウスで操作すると反応します。
しかし、ストリームの読み込み時に WebSocket connection
エラーが発生してしまい、今回は音を出すところまで行きませんでした。
cf logs
でアプリ側のログを確認しましたが、エラーは出力されていませんでした。
8. まとめ
Cloud Foundry でオーディオストリームを扱えるのか試みてみましたが、時間の都合もあり今回は再生するところまでいきませんでした。
Cloud Foundry 自体は、 WebSocket をサポートしており、他の WebSocket を使ったアプリで実際に起動している事例もありますが、今回のように WebSocket 接続がうまくいかないパターンもあるのかもしれません。
もしも何か知見をお持ちの方は、 Twitter で @horiu_jnにmentionを飛ばして頂ければと思います。
今回使用したソフトウェア
- cf-release(v211)
https://github.com/cloudfoundry/cf-release/tree/v211
(https://github.com/cloudfoundry/cf-release/tree/2121dc6405e0f036efa4dba963f7f49b07e76ffa) - bosh-lite
https://github.com/cloudfoundry/bosh-lite/tree/552dc6869600c5350eb7ffb4fb9c9c5e79e3889d - CF CLI (v6.12.0-8c65bbd-2015-06-30T00:10:31+00:00)
https://github.com/cloudfoundry/cli/tree/v6.12.0 (https://github.com/cloudfoundry/cli/tree/8c65bbd4d243cbbc9bdbf2ec2a3b0e094c094f48) - Play(2.1.5)
http://downloads.typesafe.com/play/2.1.5/play-2.1.5.zip - JSyn(16_7_3)
http://www.softsynth.com/jsyn/developers/archives/jsyn_16_7_3.jar - ZOUND
https://github.com/gre/zound/tree/00963fe6f394dba9c07132c7fb17ae8879cb3f76
投稿者:NTTソフトウェア株式会社 堀内 純