Furyu

[フリュー公式] Tech Blog

フリュー株式会社の技術ブログです

2013年11月15日

kasuya

CentOSでScalaからSoXを使って音声ファイルを操作する手順

ソフトウェア開発部、粕谷(@daiksy)です。

今回は音声ファイルの操作についてのお話です。

我々のチームでは、ソーシャルゲームのサーバサイドの開発・運用を行っています。
昨今のソーシャルゲームは、アニメーションや音声の再生など、一昔前に比べて表現がずいぶんリッチになっています。

そのような流れの中で、我々のチームでも音声ファイルの操作について検証をはじめました。

別にどのような技術を用いても良かったのですが、我々のチームでは、ゲームのサーバサイドのシステムをPlay + Scalaで構築しており、どうせならScalaから音声ファイルを操作しようと思いました。

やりたいことは、

  • wav -> mp3 などの形式変換
  • 音声ファイルのサイズ(再生秒数)の取得
  • 複数の音声ファイルの結合

の3要件です。

我々が扱っているScalaは、JVMで動作する言語であり、Javaの豊富なライブラリを使用することができます。
そういったライブラリ群を用いれば、音声ファイルの操作は行えるでしょうが、今回はそれらを使わずにSoXというツールをScalaから呼び出すことで要件を実現することにしました。
理由は、SoXは基本的にコマンドラインで音声ファイルを操作するツールなので、Scalaからこれらのコマンドを呼び出せば、Javaのライブラリを使うよりも楽に要件が実現できそうだったからです。

まとめると、システム構成は以下のようになります。

  • OS: CentOS 5.5
  • 使用言語: Scala
  • 音声ファイル操作: SoX

まず、最初の手順としては、SoXをCentOSにインストールする必要があります。
インストールは実に簡単で、wgetで最新版をとってきて解凍し、makeするだけです。  

 
これだけで、SoXは使えるようになるはずです。しかし、CentOSを扱っている場合は注意が必要です。  

 
を実行すると、SoXの設定状態が一覧表示されます。この時点での設定状態を見てみましょう。
注目すべきはこの部分です。  

 
ご覧のように、mp3がサポートされていません。
今回、我々はmp3のファイルを扱う必要があるのですが、CentOSはデフォルトではmp3を扱えないのです。 そこで、mp3を扱うために必要なライブラリを入れましょう。  
こちらのサイトを参考にしました。  

 
再度、SoXをmakeします。  
 

 
これで、SoXの状態が下記になっていれば準備完了です。    

 
サーバでSoXさえ動くようになれば、Scalaからこれを呼び出すのは容易です。  
ScalaからOSのコマンドを叩くには scala.sys.process を使います。
これは非常に強力で、import scala.sys.process._とimportすると、Scalaの暗黙の型変換(implicit conversion)によってStringにプロセスを実行するメソッドが拡張されます。  
例えば、  

 
を実行してやると、変数retls -lコマンドの実行結果が格納されます。
詳しくは、こちらをご参照ください。  
この scala.sys.process と、Scala2.10のString Interpolationを組み合わせることで、可読性も非常に高くSoXコマンドを扱うことができます。
それぞれのコード例を見てみましょう。  
 
例1) wav -> mp3 の形式変換

 
例2) 音声ファイルのサイズ取得

 
例3) 複数の音声ファイルの結合

 
非常に簡単ですね!!


2013年09月4日

kunihira

AnsibleでNginxインストールしてみた

全国のプロビジョニングフレームワークファンの皆さんこんにちは。 フリューChef導入委員長(自称)の国平です。

前回の記事から2ヶ月も間が開いてしまいました。 この2ヶ月間何をやっていたかというと、ネタLTしてみたり、フレームワーク作ってみたり、夏サミ2013に参加してみたり、あとはひたすらPlay2.1+Scalaと格闘していました。

さて、今回の記事ですが、プロビジョニングフレームワーク周りでChefの対抗馬として注目を集めているAnsibleを触ってみたので、その使用感をレポートしたいと思います。

目的

本記事の目的は、プロビジョニングフレームワークの検討です。 前々回の記事で、ChefとFabricを使ってみた感想をまとめましたが、同様にAnsibleを検証してみます。

Ansibleとは

http://www.ansibleworks.com/

Ansibleは最近話題の構成管理ツールです。 Python製のツールで、サーバの環境設定はPlaybookと呼ばれるyaml形式のファイルにまとめます。このPlaybookがChefのrecipeに相当します。 構成管理ツールとして作られているので、べき等性が保証されており、Playbookに記述した状態にリモートマシンを収束させます。

サーバに対する操作はsshで実行されるので、リモートマシンにAnsibleをインストールする必要がなく、Ansibleをインストールしたマシンが1台あれば利用出来ます。

使ってみる

今回もNginxのインストール手順をAnsibleで自作してみました。 Nginxインストールの要件は、以前の記事と同じで下記のようになっています。

  • Nginxをソースからビルドする
  • ビルドに必要なライブラリもインストールする
  • nginx.confを配備する
  • nginx.confはテンプレートを用意し、本番環境/開発環境で設定内容を書き換える
  • 本番環境は、AWS EC2のm1.largeを想定しworker_processを2に設定
  • 開発環境は、m1.smallを想定し worker_processを1に設定

ファイル構成

Ansibleを実行するための最小ファイル構成は、非常にすっきりしています。 公式ドキュメントでは、ディレクトリ構成などのベストプラクティスも紹介されていますが、今回は以下のディレクトリ構成となりました。 Chefに比べて非常にスッキリとしています。

このPlaybookはGistで公開しています。 Playbook|Gist

今回、環境ごとに変数を切り替える方法が調べきれなかったので、実行時に外部から–extra-varsオプションで変数を渡すことでnginx.confの出し分けを行いました。 (こういった出し分け方法をご存知の方がいらっしゃれば是非ご教授ください。)

使った感想

いろいろなところで、「Chefに挫折したのでAnsible」という記事をよく見かけますが、確かにChefより実行環境の構築が楽で、やりたい事が記述しやすいように思います。 特に、Push型の構成で、リモートサーバに対するインストールが不要というのが大きいと思います。 Chefの場合ですと、knife-soloを利用する事で、Push型に似せた実行が出来るのですが、やはりプラグインを追加でインストールしなくてはならない上に、あくまでPush型ライクな実行ができるだけにとどまっています。

Playbookもシンプルなので、これまでシェルスクリプトを書いていたり、実行していたコマンドを元に、書き起こしやすいと思います。

ただ、やはりyamlファイルなので、込み入った事がやりづらいという印象でした。 今回のような、変数の出し分けで、まずはPythonのDictionaryを使いたいと思ったのですが、yamlで扱う方法がわかりませんでした。 この辺り、ChefやFabricならRubyなりPythonなりでダーティーながらも、やりたい事を無理矢理書いて動かしてしまえました。 その一方で、Ansibleは、きちんと型に沿って利用するのが大前提になっているようです。

Chef/Fabricとの比較

どのツールでも、サーバに対する操作をソースコードにまとめられるので、Gitなどでバージョン管理する事が出来ます。 また、Ansibleはべき等性が保証されている点がChefと同様であり、リモートマシン環境を収束させるという使い方で実力を発揮します。

その一方で、Chefが基本的にはサーバ/クライアント構成のPull型アーキテクチャであるのに対して、AnsibleはFabric同様のPush型アーキテクチャになっています。

比較表

項目 Ansible Chef Fabric
構成 Ansibleサーバ → リモートマシン Chef-Solo Fabricサーバ → リモートマシン
言語 Python(2.6~) Ruby(1.9系) Python(2.5~)
設定ファイル yamlで記述 DSLで記述 Pythonで記述(シェルライク)
日本語ドキュメント 少ない 豊富 少ない
サンプル 少ない 豊富 少ない
サーバ追加の作業 少ない:実行先をhostsファイルに追加するだけ 多少多い: Chefインストールの手間がかかる 少ない:タスクの実行先を追加するだけ

まとめ

今回、話題のAnsibleを利用して、使い勝手を検討してみました。 環境構築が楽で、すぐに実行出来る点は非常に優れていますが、一方でyamlの記述力が物足りない感じでした。

また、あくまで現段階の比較ですが、Chefが既に膨大なrecipeが公開されているのに対して、Ansibleは参考になるPlaybookが見つけづらく、日本語の資料もまだまだ少ないようでした。 この辺りは、時間とともに充実してくると思いますが、現段階ではChefの方が情報がまとまっていて、扱いやすいように思いました。 また、VagrantはAnsibleも使えるようになったようですが、AWS OpsWorksやPackerなど利用されている範囲が広い点でも、まだChefが優位な様子です。

参考

最後に、Ansibleを利用する上で役に立ったサイトを挙げておきます。


2013年04月19日

kunihira

この春エンジニアなった君に使って欲しいVagrant

お久しぶりです。 フリュー乙女ゲームチームの国平です。

前回は、弊社で開発したplay-velocity-pluginをご紹介させて頂きましが、今回はVagrantをご紹介したいと思います。 技術の検証・学習のために仮想マシンを使う機会は多いと思いますが、Vagrantを利用することで、仮想マシンの利用を簡略化することができます。

これは、私が学生時代に後輩に指導していた時なら間違いなく導入していたと確信できるほど便利だったので、何番煎じかわかりませんが思わず記事にしてしまいました。

本記事のゴールは、とりあえずVagrantを使ってWindowsPC上にLinuxの仮想マシンを動かすところまでです。

目次

  • 仮想マシンについて
  • Vagrantとは
  • インストール
  • vmを用意する
  • vmを使う
  • vmを止める
  • vmを削除する
  • まとめ
  • 最後に

仮想マシンについて

仮想マシンとは

文字通り仮想のマシン(PC)だと思ってもらえたら大丈夫です。 今、あなたが向かっているPCの中にもう一つPCを用意するイメージです。 いわゆるコンピュータは、入力装置、出力装置、制御装置、演算装置、記憶装置といった部品から成り立っています。 今年新卒で入社した人なら、高校の情報の授業で習ったんじゃないかと思います。 仮想マシン(VirtualMachine:vm)というのはこれらの部品のうち、演算装置や記憶装置をプログラムでシミュレートして、PCの中でもう一つPCを動かすシステムです。

なにがおいしいの

この仮想マシンを使って何がお得なのか。 それは2点あります。 1つは、PCを壊してもスグに復旧出来る事です。 そして、もう1つは、持っているPCのOSに関係なく別のOSを動かす事が出来る事です。

小さいときに親のPCを触ろうとして、「壊すからダメ」とか言われた経験はないでしょうか?私はあります。 確かに、会社から支給されたPCに適当にいろいろなものをインストールしまくって動かなくしてしまったら大問題です。 でも、仮想マシンなら突き詰めるとPCの中にあるファイルにすぎません。どんなむちゃくちゃな使い方をしても、最後には仮想マシンの情報が入ったファイルを削除して新たに作成すれば問題ありまん。用心深さを発揮してこまめにファイルの保存をしておけば完璧です。動かなくなったら、動いてたファイルを取り出してもう一度試す事が出来ます。 また、PC上に仮想のPCを作るので、WindowsPCしか持っていなくても、仮想マシン上でLinuxを動作させる事も出来ます。 Web系の開発だと、開発マシンはMacもしくはWindowsで、サーバはLinuxという環境も多いのではないかと思います。 自分の学習のために、共用しているサーバをいじり倒すのは問題がある場合があると思います。 しかし、この仮想マシンを利用することで、自分だけの学習環境を手に入れることができます。

Vagrantとは

ざっくり言ってしまうと仮想マシンの構築ツールです。 Vagrantではコマンドラインから仮想マシンを構築/起動する事が出来ます。 なんで、直接VMWareやVirtualBoxなどの仮想化ソフトウェアを操作せずVagrantを使うのかという疑問もあると思います。しかし、Vagrantには直接仮想化ソフトウェアを操作する以上のメリットがあります。 仮想マシンの設定をファイルに書き込むので設定の再利用がしやすいので、仮想マシンを破棄してもすぐに再構築できます。また、どこでも同じ環境を複製する事ができるので、ホストPCの変更にも影響されません。 サーバ周りのソフトウェアの検証や動作確認、学習環境構築などでは、仮想マシンを作って消して、また作るという事が多くなりますが、Vagrantにより手間の軽減をする事が出来ます。

インストール

VirtualBoxのインストール

Vagrantでは仮想マシンとしてVirtualBoxを利用します。

このインストール自体は簡単で、ここから自分のOSに応じたインストーラをダウンロードしてインストールしてください。

VirtualBox以外にもMacユーザの方なら、VMwareFusionでも大丈夫なようですが、ここではMac/Windowsの両方で利用できるVirtualBoxを前提とします。

Vagrantをインストールする

Vagrantのインストールも簡単です。ここから最新バージョンを選択して、自分のOSに応じたインストーラをDLするだけです。

あとは、適当にぽちぽちとやったらインストール完了です。

インストール出来た事を確認するために、コマンドプロンプトを立ち上げて、

と打ち込んでみてください。

こんな感じで、vagrantコマンドのヘルプが表示されればインストール成功です。

ここから先はコマンドプロンプトにコマンドを打ち込む作業が多いので、プロンプトは立ち上げっぱなしにしておいてください。

vmを用意する

Boxの用意

Vagrantでは仮想マシンのひな形をboxと呼びます。 このboxを用意するには、vagrant box コマンドを実行します。 今回は既に用意されているboxを利用させてもらいましょう。 試しに、CentOS 6.3のboxを用意します。以下のコマンドを実行してください。

これで、CentOS 6.3を使った仮想マシンのひな形が用意出来ました。 他のOSを使いたいときは、 http://www.vagrantbox.es から探すといいでしょう。

Vagrantfileの生成

ひな形が用意出来たら、作成するマシンの設定を用意します。いろいろと設定をいじる事は出来るのですが、今回はLinux環境を作る事が目的ですので、ネットワークの設定だけ行います。 Vagrantでvmを作成するときは、Vagrantファイルにvmの設定を書き込みます。

これで、vagrantというフォルダにVagrantfileというファイルが出来ているはずです。 このファイルを適当なエディタで開くと、いろいろとデフォルトの設定が書かれています。 Vagrantfileは#から始まる行はコメントとして扱われるので、大半がコメントになっています。

ネットワーク設定

とりあえず、ネットワークだけつながるようにしておきましょう。 Vagrantfileにいろいろ書かれている内容のうち、

と書かれている行の#を消して保存しましょう。 もう一カ所、

の行も#を消します。 ここまで、この記事の通りに実行していれば、23行目と28行目にあると思います。 これでネットワーク設定は完了です。

vmを使う

vmの起動

さて、これでvmを起動する用意は出来ました。 それでは、WindowsPCの上でLinux(CentOS)を動かしてみましょう。 vmの起動にはvagrant upコマンドを実行します。 vagrant upコマンドは今後vmの起動に何度も使うので、覚えておきましょう。 このコマンドを打って、しばらく待つとvmが起動します。 ひょっとすると途中で、どのネットワークアダプタを利用するかWhat interface should the network bridge to?と聞かれるかもしれません。 もし聞かれたら、だいたい 1 を入力してエンターで問題ないはずです。

vmに接続する

vagrant upコマンドの実行が終わっても、特にウィンドウが立ち上がるという事も無いので、本当に仮想マシンが動いているのかわからないと思います。 しかし、ちゃんと起動しています。 起動した仮想マシンにアクセスして操作するにはvagrant sshコマンドを実行します。 sshというのは、あるPCから別のPCへ接続して操作するコマンドのことです。ここでは、大本のOS(ホストOS)から仮想マシンへ接続しています。

vagrant sshコマンドを実行すると、いろいろ出力された後に、

の様なプロンプトが表示されると思います。 これが、今回作ったLinux仮想マシンのコンソールになります。 試しにunameと打ち込んでみましょう。unameというのは、システムの情報を出力するLinuxコマンドです。これを実行するとLinuxと出力されるはずです。これで、今Linuxを操作している事がわかりますね。 ここまで、出来たら好き放題LinuxOSを楽しみましょう。 必要な開発環境のインストールなどをガシガシしてみてください。

Linuxの操作を終了するときは、exitコマンドを実行すれば、Windowsのコマンドプロンプトに戻る事が出来ます。

vmを停止する

exitコマンドでWindowsのコマンドプロンプトに戻っても、仮想マシンが停止したわけではありません。 見えないだけで、しっかりと仮想マシンは動作しています。 つまり、このままだとホストOSのメモリやCPUを使い続けてしまいます。 そのため、やりたい事が一通り完了したら仮想マシンを停止する必要があります。 仮想マシンを止めるには、

  • vagrant suspend で仮想マシンを一時停止状態にする
  • vagrant halt で仮想マシンを停止する

の2通りの方法があります。 suspendはWindowsで言うところのスリープで、もう一度vagrant upを実行すると、suspendする前の状態そのままに続きから仮想マシンが動き始めます。 対して、haltは電源Offです。一度仮想マシンの電源を切るので、vagrant upを実行するとOSは完全に再起動されます。 どちらを使うのも自由ですので、お好きな方を選んで使ってください。

vmを削除する

さて、ここまででLinux環境でいろいろ実験出来るようになったのですが、いろいろいじりすぎて完全に環境をリセットしたいときも出てくるかと思います。 そんなときには、vagrant destroyを実行します。 このdestoryコマンドはその名の通り、作成した仮想マシンを破棄するコマンドです。 このコマンドを実行して、再度vagrant upすれば、キレイなLinux仮想マシンを新たに作る事が出来ます。 ただし、これまで仮想マシンにインストールしたプログラムや保存したファイルなどは全て消えるので実行には注意してください。

まとめ

Vagrantを使って、仮想マシンを用意する事でトライ&エラーをどんどん出来る環境を用意出来ました。 どんどん、仮想マシンをいじり倒して壊しまくってください。

最後に

本記事では、今からLinuxの勉強を始める人を対象に書きました。 そのため、省いている内容も多くあります。

より詳しく学ぶためのとっかかりをまとめておきます。

  • Vagrant公式サイト http://www.vagrantup.com/ vagrantをもっと便利に使うには、まずは公式サイトを読むことをお勧めします。 英語のページですが、比較的読みやすいように思います。 今回はネットワーク設定しか設定を変更しませんでしたが、もっといろいろと出来るのでぜひ調べてみて下さい。

  • ネットワーク設定 今回は、とりあえずLinuxを起動すること優先でネットワーク設定を適当に流しましたが、private_networkやpublic_networkが何をやっているのか、ipとはなんなのかは知っておくべきです。

以上、Vagrantを紹介しました。 次回は同じくLinuxビギナー向けにviの記事を書こうかと思います。