ここでは検証などを目的にシステム全体を構築する一例を説明します。アプリケーションの各機能、操作方法などについては今後必要に応じて追加します。
アーカイブ内容説明
locomi-1.0.0.zip
- ict20-ddl
データベーステーブル、サンプルレコード作成などのDDLを格納しています。
- ict20-src
Webアプリケーション部分、Webサービス部分、バッチプログラム部分のソースコードを格納しています。
- ict20-downloader
Webサービスで配信される「番組」を取得し、「番組」の再生に必要な動画ファイルをダウンロードするプログラムのソースコードを格納しています。
LOCOMIシステムでは、各所に設置されインターネットへ接続された公衆ディスプレイ(デジタルサイネージ)に対し、動画や静止画の再生順、時間などを定義した「番組」をWebサービスにより配信します。なお、公衆ディスプレイで「番組」の再生に使用するプレーヤー(flashアプリ)のソースは調整中につき現時点では公開されていません。
locomi-sample.zip
構築例
Webアプリケーション、Webサービス、バッチプログラムなどを動作させるための構築例を以下に示します。
※プラットホームについて
Javaによるプログラム(Webアプリケーション、Webサービス、バッチプログラム、ダウンローダー)については、Java2 SE の下であればWindowsでもLinux、その他の環境でも問題ないと思われます。
データベースについてはLudiaを利用しますので、Linux等の上で構築した方が良いと思われます。
データベース
まず、PostgreSQL、Ludiaをセットアップします。Ludiaのビルド、インストール手順などについては
Ludiaのアーカイブをご覧ください。
セットアップ後、データベースの作成、Ludiaのインデックスアクセスメソッド登録、ユーザーの作成などを行います。
※同梱のDDLやプログラムソースでは、ict20というデータベース、ict20 / ict20 というユーザー / パスワードを作成する前提になっています。
実行例
# su - postgres
$ createdb ict20 -E UTF-8 ←DB作成コマンド
CREATE DATABASE
$ psql -f /usr/local/pgsql/share/pgsenna2.sql ict20 ←ludia登録
CREATE FUNCTION
CREATE FUNCTION
...
...
$ psql
postgres=# CREATE ROLE ict20 PASSWORD 'ict20'; ←ユーザー(ログインロール)の作成
CREATE ROLE
次に、アーカイブ(locomi-1.0.0.zip)から展開されたict20-ddlディレクトリ内の create_table.sql, create_view.sql, create_constraint.sql, create_index.sql, add_grant.sql を順番に流し、テーブル、ビュー、制約、インデックスの作成とユーザーに対する権限の追加を行います。
実行例
$ psql -f create_table.sql ict20
$ psql -f create_view.sql ict20
$ psql -f create_constraint.sql ict20
$ psql -f create_index.sql ict20
$ psql -f add_grant.sql ict20
静的コンテンツのコピー、パーミッションの確認など
-
アーカイブ(locomi-sample.zip)から展開されたict20-staticディレクトリ内の全ディレクトリ、ファイルをそのままドキュメントルート直下へコピーまたは移動してください。(つまり、/icon, /static などのURLで各ディレクトリがApacheで公開されるように)
fckeditorは空です。後述するダウンロードしたfckeditorのパッケージをここに上書きしてください。 userfilesディレクトリも空です。fckeditorのサーバーブラウザ機能によりアップロードされたファイルを格納するためのディレクトリです。
-
次に、同じくアーカイブ(locomi-sample.zip)から展開されたict20-sample-contents内のict20というディレクトリ以下を/varへコピーまたは移動します。(/var/ict20となるように)
-
以上の各種ディレクトリは、Webアプリケーション、およびバッチプログラムから読み書きされます。したがって、Tomcatの起動ユーザー、バッチプログラムの起動ユーザーに対する読み書き権限が必要になります。
| ディレクトリ | 説明 |
| apache_document_root/icon | Webアプリ: rw, バッチ: rw |
| apache_document_root/thumbnail | Webアプリ: rw, バッチ: rw |
| apache_document_root/userfiles | Webアプリ: rw |
| /var/ict20 | Webアプリ: rw |
| /var/ict20/contents/flv | Webアプリ: r, バッチ: rw |
| /var/ict20/contents/hd | Webアプリ: r, バッチ: rw |
| /var/ict20/contents/mobile | Webアプリ: r, バッチ: rw |
| /var/ict20/contents/upload | Webアプリ: rw, バッチ: r |
-
FCKEditor(※)をダウンロードして、先にict20-staticの内容をコピーする説明で触れたとおり、Apacheのドキュメントルート直下へ展開します。(/fckeditorというURLで参照できる状態にする)
※動作確認しているバージョンはFCKEditor 2.6.6です。
swf設定ファイルの修正
flashコンテンツのための設定ファイルを修正します。先に展開した
apache_document_root/static/swf/player 以下にある*.xmlファイル(embedPlayerConfig.xml, digestPlayerConfig.xml, mainPlayerConfig.xml)をエディタで開き、URLが設定されているパラメータのホスト名部分を実際の環境に合わせて変更します。
アプリケーションのビルド
-
まず、ict20-srcディレクトリ内のict20-common/src/main/resources/system.propertiesを編集します。データベース関連(db.*)、各種ディレクトリ(dir.*)、URL(url.*)、メール関連(mail.*)などのパラメータを適切に変更してください。
system.properties パラメータ説明
| パラメータ | 説明 |
| db.driver |
JDBCドライバのドライバクラス名を設定します。PostgreSQL前提なのでorg.postgresql.Driverとなります |
| db.url |
JDBCドライバの接続先URL。jdbc:postgresql://ホスト名:ポート/DB名 |
| db.username |
データベース接続に使用するユーザー名 |
| db.password |
データベース接続に使用するユーザーのパスワード |
| dir.temp |
システムが一時ファイルの生成などに使用するディレクトリです |
| dir.upload |
利用者がアップロードしたファイルが保存されるディレクトリ |
| dir.hd |
エンコードされた動画(高品位)の保存先 |
| dir.flv |
エンコードされた動画(標準品位)の保存先 |
| dir.mobileMovie |
エンコードされた動画(携帯向け)の保存先 |
| dir.thumb |
システムが生成する動画のサムネイル保存先(web公開ディレクトリ内のパスを指定すること) |
| dir.icon |
ユーザー登録時、任意にアップロードされるユーザーアイコンの画像ファイル保存先(web公開ディレクトリ内のパスを指定すること) |
| commandline.srcInfo |
動画ファイルの情報取得に使用するコマンドライン。INPUTは動画ファイルへのパスに置換されるプレースホルダ |
| commandline.hd |
高品位動画のエンコードに使用するコマンドライン。ASPECTは出力動画のアスペクト比、padding(ソースが16:9以外の場合)されるpixel数など設定される。なお、高品位動画へのエンコードはPCサイトからアップロードされた場合のみ行う前提 |
| commandline.fromPC.toFlv |
PCからアップロードされた動画をPC向けFLV(標準品質)へエンコードする場合のコマンドライン |
| commandline.fromPC.to3g2 |
PCからアップロードされた動画を携帯向け動画へエンコードする場合のコマンドライン |
| commandline.fromMobile.toFlv |
携帯からアップロードされた動画をPC向けFLVへエンコードする場合のコマンドライン |
| commandline.fromMobile.to3g2 |
携帯からアップロードされた動画を携帯向け動画へ(再)エンコードする場合のコマンドライン |
| commandline.thumb |
通常サイズのサムネイルを生成するコマンドライン |
| commandline.thumbSmall |
携帯サイト向けサムネイルを生成するコマンドライン |
| icon.fixedWidth |
ユーザーアイコンサイズ(幅) アップロードされたアイコン画像は、強制的にこの値でリサイズされる |
| icon.fixedHeight |
ユーザーアイコンサイズ(高さ) アップロードされたアイコン画像は、強制的にこの値でリサイズされる |
| user.stillLimit |
現在未使用 |
| user.confirmationLimitMinutes |
利用者登録時、または、パスワード再発行(変更)時、確認キーの有効期限 |
| mail.smtpHost |
使用するMTAホストのアドレス |
| mail.fromAddress |
システムから送信するメールの差出人アドレス |
| mail.fromName |
システムから送信するメールの差出人名 |
| mail.bouncetoAddress |
smtpセッションのmail from:で指定されるアドレス |
| mail.bccAddress |
システムから送信するメールのbcc先。カンマ区切りで複数指定可能 |
| mail.confirmationTemplate |
利用者登録、パスワード変更(再発行)時にシステムが送信するメールの本文テンプレート。classpathで指定する |
| mail.encodingDoneTemplate |
エンコード完了時に投稿者へ送信する通知メールの本文テンプレート。 |
| mail.uploadRejectTemplate |
管理者により投稿動画が差し戻された場合送信されるメールの本文テンプレート。 |
| areaCd.value |
サイトを識別するためのコード値。(現状では変更不可) |
| googlemap.key |
GoogleMapのAPIキー。アップロード画面等でGoogleMapを利用しているため、稼働させるサイトのURLに応じて取得したAPIキーを指定する必要あり |
| url.base.channelPage |
「チャンネル」のインデックスページURL。通常はホスト名の部分だけ稼働させるサイトに合わせて変更すれば良い |
| url.base.moviePage |
動画の再生画面URL。同上 |
| url.base.flv |
FLV(標準品質)動画のダウンロード先。/v/コンテンツID の形式でアクセスすれば、直接動画がダウンロードできる。なお、この設定値は httpd の url rewrite の設定と関連する |
| url.base.mobileMovie |
携帯向け動画のダウンロード先。同上。 |
| url.base.thumb |
サムネイル画像URL。dir.thumb で設定した物理ディレクトリの公開URLを設定する |
| url.base.icon |
ユーザーアイコン画像のURL。dir.icon で設定した物理ディレクトリの公開URLを設定する |
| encode.basic.maxProcess |
標準品質+携帯向けの動画をエンコードする際、同時に実行する外部プログラム(ffmpeg)の最大プロセス数。バッチ処理が起動された時点で未処理のアップロードファイルが複数ある場合、最大encode.basic.maxProcessの設定値まで同時に外部プロセス(ffmpeg)を起動する。 |
| encode.basic.maxQueueSize |
標準品質+携帯向けの動画をエンコードする際、キューイングするファイルの最大値。バッチ処理が起動された時点で未処理のアップロードファイルが複数ある場合、その起動シーケンスでは最大encode.basic.maxProcessの設定値までのファイルを連続処理する。なお、処理が完了しないうちに次の起動シーケンスが到来した場合はブロックする。 |
| encode.basic.repeatInterval |
標準品質+携帯向け動画のエンコード処理起動間隔。 |
| encode.hd.maxProcess |
高品質動画をエンコードする際、同時に実行する外部プログラム(ffmpeg)の最大プロセス数。 |
| encode.hd.maxQueueSize |
高品質動画をエンコードする際、キューイングするファイルの最大値。 |
| encode.hd.repeatInterval |
高品質動画のエンコード処理起動間隔。 |
| fileCleaner.repeatInterval |
サムネイル、ユーザーアイコン関連の処理において、作成されることがある一時ファイルの削除処理間隔。 |
-
続いて、ict20-srcディレクトリ内のict20web/src/main/resources/net/fckeditor/handlers/default.propertiesを編集します。詳細についてはFckeditor.Java Integrationのサイトをご覧ください。fckeditorは「広告」機能のコンテンツ作成時、htmlエディタとして使用します。
とりあえず修正する必要があるパラメータは「connector.userFilesAbsolutePath」で、値にはApacheにより /userfiles というURLで公開されるディレクトリの物理パスを指定します。
-
以上のpropertiesファイルを修正した後、maven でビルドします。
ict20-src/pom.xml を対象に「mvn package」を実行すれば、子プロジェクト(ict20web, ict20ws, ict20quartz-batch)のtarget内にwar, jarが生成されます。
$ mvn package
[INFO] Scanning for projects...
[INFO] Reactor build order:
[INFO] ict20 parent project
[INFO] ict20 common jar
[INFO] ict20web Maven Webapp
[INFO] ict20 batch
[INFO] ict20ws Maven Webapp
....
....
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO] ------------------------------------------------------------------------
[INFO] ict20 parent project .................................. SUCCESS [1.687s]
[INFO] ict20 common jar ...................................... SUCCESS [8.060s]
[INFO] ict20web Maven Webapp ................................. SUCCESS [4.981s]
[INFO] ict20 batch ........................................... SUCCESS [1.992s]
[INFO] ict20ws Maven Webapp .................................. SUCCESS [3.640s]
[INFO] ------------------------------------------------------------------------
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 20 seconds
[INFO] Finished at: Wed Jul 14 15:58:14 JST 2010
[INFO] Final Memory: 36M/87M
[INFO] ------------------------------------------------------------------------
Apache httpd, Tomcat 間の連携設定
以下に連携設定の例を示します。(名前ベースのvirtual host 利用の前提です)
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule rewrite_module modules/mod_rewrite.so
<VirtualHost *:80>
ServerAdmin webmaster@your.domain
DocumentRoot "/var/www/www.your.domain"
ServerName www.your.domain
ErrorLog "logs/www.your.domain-error.log"
CustomLog "logs/www.your.domain-access.log" common
<Location />
Order deny,allow
Allow from all
</Location>
# fckeditor の connector だけTomcatへマッピングする
ProxyPass /fckeditor/editor/filemanager/connectors ajp://localhost:8009/ict20web/fckeditor/editor/filemanager/connectors
ProxyPass /fckeditor !
ProxyPass /thumbnail !
ProxyPass /work !
ProxyPass /static !
ProxyPass /include !
ProxyPass /icon !
ProxyPass /userfiles !
ProxyPass /crossdomain.xml !
ProxyPass /ictws/services/listServices !
ProxyPass /ictws/services ajp://localhost:8009/ictws/services
ProxyPassReverse /ictws/services ajp://localhost:8009/ictws/services
ProxyPass / ajp://localhost:8009/ict20web/
ProxyPassReverse / ajp://localhost:8009/ict20web/
ProxyPassReverseCookiePath /ict20web /
RewriteEngine On
RewriteLogLevel 0
# RewriteLog logs/rewrite.log
RewriteRule ^/v/(\d+)\.flv$ ajp://localhost:8009/ict20web/GetFlvAction.html?contId=$1[P,L]
RewriteRule ^/mm/(\d+)\..*$ ajp://localhost:8009/ict20web/Get3g2Action.html?contId=$1[P,L]
</VirtualHost>
Webアプリケーション、Webサービスのデプロイ
先にビルドしたwar(ict20-src/ict20web/target/ict20web.war, ict20-src/ict20ws/target/ictws.war)をTomcatへデプロイしてください。
Webアプリケーションの動作確認
Tomcat, Apacheを起動した後、ブラウザでドキュメントルートへアクセスすればトップページが表示されるはずです。
ログインするには、初期レコードに「email: test@test.test , password: testtest」というユーザーが登録されていますのでこのアカウントでログインしてみてください。
Webサービスの動作確認
先の設定例ではaxis2の管理画面へApacheからはマップしていませんので、例えば http://host:8080/ictws/services/listServices などとして各サービスの一覧、WSDLを確認してみてください。APIの仕様はwordドキュメントを同梱しますが、実際には未実装の部分もあります。詳細はソースコードをご覧ください。
バッチプログラムについて
ict20quartz-batch は
Springの
Quartz Integrationを利用して一定間隔でエンコードなどを繰り返し実行するJavaプログラムです。エンコード処理は前述のとおりict20-src/ict20-common/src/main/resources/system.properties内で設定されたコマンドにより ffmpeg を呼び出す想定です。
具体的な処理内容は、アップロードされた動画から3種類の動画エンコード(標準品質(FLV)、高品質(H.264など)、携帯向け(3g2))とサムネイルの作成、および、アップロードやコンテンツの更新時に生成される場合がある一時ファイルの掃除を行います。
バッチプログラムの起動テスト
通常のJavaコンソールプログラムと同様に起動します。同梱のサンプルバッチファイルを参考にしてください。(ict20-src/ict20quartz-batch/locomi_batch_test.batなど) 正常に起動されれば定期的にloggerより出力されるメッセージにより動作が確認できると思います。(初期設定では3分間隔のエンコードタスクが2つ(標準画質エンコード用、高画質エンコード用)、1日間隔のファイル掃除タスクが1つ、合計3つのタスクが繰り返し実行されます)
また、commons-daemonのインターフェースを実装していますので jsvc/procrunを利用してOSのサービスとして実行しても良いと思います。
※起動しない場合
ict20-commonで生成されるjarが ict20quartz-batch/target/lib へコピーされない場合があります。ict20-common-1.0.0.jar が target/lib へコピーされているかどうか確認してください。コピーされていない場合は手動でコピーしてしまうか、ict20-commonのinstallタスク(ict20-common配下でmvn installを実行)を実行してict20-commonの成果物(jar)をローカルリポジトリへコピーした後、あらためてict20quartz-batch内でpackageタスク(mvn package)を実行してみてください。
ダウンローダーに関して
冒頭でも述べましたが、LOCOMIシステムでは当システムに投稿された動画を中心に再生順や再生時刻などを定義した「番組」を作成して、各所に設置された公衆ディスプレイ(中身は普通のパソコン)へWebサービスを介して配信することができます。
ダウンローダーと称しているプログラムは、その番組情報を取得、解析し、再生に必要な動画ファイルをあらかじめローカルディスクへダウンロードしておくためのプログラムです。
src/resources/system.propertiesを修正の上必要に応じてビルドしてください。以下、パラメータの説明です。
downloader system.properties パラメータ説明
| パラメータ | 説明 |
| param.ws.endpoint |
番組情報取得のためのSOAPエンドポイント。ホスト名の部分を環境に合わせて変更する。 |
| param.termId |
端末(公衆ディスプレイ)IDを指定する。データベースのtermテーブル.term_idカラムの値に対応する。サンプルレコードでは id=1 のレコードが登録されている。なお、現状では端末(公衆ディスプレイ)を追加登録する機能は管理機能には実装されていない。 端末(公衆ディスプレイ)はグルーピングする前提なので、mst_term_grp, term_grp, termの各テーブルへ適切にレコードを追加することで端末(公衆ディスプレイ)の登録を追加できる。 |
| param.dir.contents |
ダウンロードしたファイルの保存先。 |
| param.ftp.host |
ftp接続先。(コンテンツのダウンロードはftpで行う) |
| param.ftp.user |
ftp接続ユーザーID |
| param.ftp.password |
ftp接続パスワード |
| param.ftp.remoteDir |
ダウンロードするファイルがあるディレクトリ。公衆ディスプレイ向けに高品質でエンコードされた動画が格納されているディレクトリを指定する。→ 先の構築例では/var/ict20/contents/hd になる。したがって、ftp経由で直接/var/ict20/contents/hdへアクセスできるような設定、もしくは、エンコード済動画を自動的にftp公開ディレクトリへコピーするような設定が必要となる。 |