オープンソースのPaaSソフトウェア CloudFoundry の技術情報やイベント告知などを掲載します

2015-10-07

ZOUND は Cloud Foundry で動かなかった

「Cloud Foundry 百日行」第74日目は、Play Framework 2 ベースの ZOUND です。ZOUND は Play Framework の データストリームをリアルタイムに処理するためのAPIであるIteratees を使って、オーディオストリームを実験的に処理するアプリのようです。今回は、CF 上でオーディオストリームの再生ができるのか興味があったので、試してみました。が、アプリは上がったものの残念ながら音を出すところまではたどり着けませんでした。

基本情報

デプロイ準備から動作確認までの手順は以下の通りです。

  • 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.sbtaddSbtPlugin のバージョン指定部分を 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を飛ばして頂ければと思います。

今回使用したソフトウェア



投稿者:NTTソフトウェア株式会社 堀内 純