【LOCOMI オープンソース 説明書】

ここでは検証などを目的にシステム全体を構築する一例を説明します。アプリケーションの各機能、操作方法などについては今後必要に応じて追加します。

アーカイブ内容説明

locomi-1.0.0.zip 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

静的コンテンツのコピー、パーミッションの確認など

  1. アーカイブ(locomi-sample.zip)から展開されたict20-staticディレクトリ内の全ディレクトリ、ファイルをそのままドキュメントルート直下へコピーまたは移動してください。(つまり、/icon, /static などのURLで各ディレクトリがApacheで公開されるように)

    fckeditorは空です。後述するダウンロードしたfckeditorのパッケージをここに上書きしてください。 userfilesディレクトリも空です。fckeditorのサーバーブラウザ機能によりアップロードされたファイルを格納するためのディレクトリです。
  2. 次に、同じくアーカイブ(locomi-sample.zip)から展開されたict20-sample-contents内のict20というディレクトリ以下を/varへコピーまたは移動します。(/var/ict20となるように)
  3. 以上の各種ディレクトリは、Webアプリケーション、およびバッチプログラムから読み書きされます。したがって、Tomcatの起動ユーザー、バッチプログラムの起動ユーザーに対する読み書き権限が必要になります。
    ディレクトリ説明
    apache_document_root/iconWebアプリ: rw, バッチ: rw
    apache_document_root/thumbnailWebアプリ: rw, バッチ: rw
    apache_document_root/userfilesWebアプリ: rw
    /var/ict20Webアプリ: rw
    /var/ict20/contents/flvWebアプリ: r, バッチ: rw
    /var/ict20/contents/hdWebアプリ: r, バッチ: rw
    /var/ict20/contents/mobileWebアプリ: r, バッチ: rw
    /var/ict20/contents/uploadWebアプリ: rw, バッチ: r
  4. 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が設定されているパラメータのホスト名部分を実際の環境に合わせて変更します。

アプリケーションのビルド

  1. まず、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 サムネイル、ユーザーアイコン関連の処理において、作成されることがある一時ファイルの削除処理間隔。
  2. 続いて、ict20-srcディレクトリ内のict20web/src/main/resources/net/fckeditor/handlers/default.propertiesを編集します。詳細についてはFckeditor.Java Integrationのサイトをご覧ください。fckeditorは「広告」機能のコンテンツ作成時、htmlエディタとして使用します。
    とりあえず修正する必要があるパラメータは「connector.userFilesAbsolutePath」で、値にはApacheにより /userfiles というURLで公開されるディレクトリの物理パスを指定します。
  3. 以上の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 はSpringQuartz 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公開ディレクトリへコピーするような設定が必要となる。