2012/10/27

redmineを2.0.3から2.1.2へ切り替える

独自地デジ録画システムの根幹として使用しているRedmineを2.0.3から2.1.2へ切り替えることにしました。2.0.3でも特に不便はなかったんですが、jquery+ajaxな処理を色々やりたくなったので。

えーと、本家に説明されているような手順とは若干異なります。
自分の場合、自作プラグインの対応もあるので、2.0.3と2.1.2を暫く共存させて、プラグインの対応が終わったら切り替えるという手順です。

普通の場合でも、この方が無難なのでは?と思います。
会社でもいくつかのプラグインを入れていて動作確認してからじゃないと公開したくない。
同じサーバーマシン上で同居させてテスト運用してから切り替える方が気が楽というものです。

自分のredmine入れ場所は、/opt です。
いうまでもなく、OSは、ubuntuです。
テキストファイル編集は、emacsを使用してます。(ところどころ出てきます)
ということを踏まえたうえで参考にしてください。

redmine-2.1.2 インストール

$ wget http://rubyforge.org/frs/download.php/76495/redmine-2.1.2.tar.gz
$ cd /opt
$ sudo tar zxf ~/redmine-2.1.2.tar.gz
$ sudo chown -R www-data.www-data redmine-2.1.2
$ cd redmine-2.1.2
$ sudo bundle install --without development test postgresql sqlite rmagick

データベースコピー

$ cd (どこでもいいですね)
$ mysqldump -uredmine -predmine redmine > redmine2.sql
$ mysql -uredmine -predmine
create database redmine2
exit
$ mysql -uredmine -predmine redmine2 < redmine2.sql
$ rm redmine2.sql


バックアップというよりは、2.1.2用のDBを作成して2.0.3のDB内容をコピーするって感じです。


設定

$ cd /opt/redmine-2.1.2
$ sudo cp config/database.yml.example config/database.yml
$ sudo emacs config/database.yml
production:
adapter: mysql2
database: redmine2
host: localhost
username: redmine
password: redmine
encoding: utf8
データベースを'redmine2'を使うようにしておきます。

適応

$ sudo rake generate_secret_token
$ sudo rake db:migrate RAILS_ENV=production

apache2/passenger

$ sudo emacs /etc/apache2/conf.d/redmine.conf
RailsBaseURI /redmine2
$ sudo ln -s /opt/redmine-2.1.2/public /var/www/redmine2
$ sudo service apache2 reload

この辺は人によって色々でしょう。とにかく新旧両方へアクセスできるようにしておきます。

オプション

htmlタグ解禁
lib/redcloth3.rbのALLOWED_TAGSに解禁したいHTMLタグを羅列するだけ。

$ sudo emacs lib/redcloth3.rb

#    ALLOWED_TAGS = %w(redpre pre code notextile)
    ALLOWED_TAGS = %w(redpre pre code notextile html head body title isindex base meta link script h1 h2 h3 h4 h5 h6 hr br p center spacer div blockquote listing xmp address noscript span font basefont i tt s b u strike big small sub sup em strong code samp kbd var dfn q cite ul ol li dl dt dd table tr th td caption a img map area form input select option textarea applet param frameset frame noframes &quote &amp &lt &gt &nbsp &copy)

自分はこんな感じにしています。

farend_basicテーマ

自分は2.0.3で使用していたので、単純にコピーしました。
$ sudo cp -r /opt/redmine-2.0.3/public/themes/farend_basic /opt/redmine-2.1.2/public/themes/farend_basic
新規に取得する場合は、https://github.com/farend/redmine_theme_farend_basic/downloads から。

redmine_video プラグイン インストール (自作なので自分だけですが)

$ cd /opt/redmine-2.1.2
$ sudo cp -r /opt/redmine-2.0.3/plugins/redmine_video plugins
$ sudo ln -s /opt/videos public/videos
$ sudo rm -rf files
$ sudo ln -s /opt/videos files

redmine-2.1.2/Gemfile.log がrootになってしまい、パーミッションエラーがでたので・・・
$ sudo chown www-data.www-data Gemfile.lock

プラグインのマイグレーションはデータベースを完全コピーしているので不要です。


一応これで、入るには入って、Redmine自体は正常起動しましたが、prototype.jsなメソッドを使用しているビューでエラーになりました。これからこの辺を色々jqueryなものに書き換えていく作業です。


プラグインとか、ちゃんと動くようになったら

config/database.yml のdatabase:を元々の’redmine'に変更
$ sudo rake db:migrate RAILS_ENV=production
$ sudo ln -s /opt/redmine-2.1.2/public /var/www/redmine

こんな感じの手順を踏むだけで、切り替え完了です。

2012/10/04

MediaElement.jsのキー操作でCMスキップ

ここしばらく、録画されたビデオを視聴するってことに取り組んでいる。前回記事ではMediaElement.jsを組み込んで動くところまでは確認した。

今回は、やりたかったことの一つ、CMスキップについて

その前に、その他のビデオプレーヤーフレームワークはどんなもんだろうか?と思って HTML5 Video Player Comparison を参考にいろいろ試してみた。
JWPlayer、LeanBackPlayer を入れて動かしてみたけれど、MediaElement.jsみたいにFirefoxで簡単に見れるようにしてくれなかった。その時点でパスって感じ。メンドクサイのはいやなのです。
でも、LeanBackPlayerは普通の使い方としてはインプリメントも簡単で悪くない感じだった。

キーアクションにコマンドを割り振る

よくカスタムコントローラを作るっていう記事やサンプルがあるけれど、HTMLページに操作ボタンを付けたところで、フルスクリーンで視聴すると操作できないじゃん。
カスタムコントローラにカスタムボタンを追加することが出来ればいいんだけどね。これはこれで可能なのか?も含めて調べ中。
今はとにかく一番簡単確実な組み込み方法として、キーボードに機能を割り振ることでやってみる。

で、どうやるの?
MediaElement.jsのサイトでもサンプルでもキーアクションについての記述がどこにもない。
Player Options で、keyActions: [] って書いてあるだけ。仕方がないので(っていうかそうすべきなんだろうけど)JavaScriptソースを読んで、理解する。

標準キー操作
  • [SPC]  プレイ・ポーズ切り替え
  • [UP]   サウンドボリュームアップ
  • [DOWN] サウンドボリュームダウン
  • [LEFT]  5%先送り
  • [RIGHT] 5%後送り
  • [’F’]   フルスクリーン切り替え
こんな操作ができるようになっていた。おおっ。既にシークが自分がアサインしたいキーに振られているじゃないですか。一瞬困ったけど、素晴らしいことにプレイヤーオプションの方で、どのくらいシークさせるかを定義する関数が独立しておりました。
デフォルト設定は、

                // default amount to move back when back key is pressed
                defaultSeekBackwardInterval: function(media) {
                        return (media.duration * 0.05);
                },
                // default amount to move forward when forward key is pressed
                defaultSeekForwardInterval: function(media) {
                        return (media.duration * 0.05);
                },
となっている。media.duration(全体の長さ)の5%っていう簡単な関数。これを上書きしてあげれば良さそう。

ビューの最後を以下のように変更

前回記事
<%= javascript_tag "$('video').mediaelementplayer()" %>
としていたところを、
<%= javascript_include_tag "mediaelement_conf.js", :plugin => 'redmine_video' %>
に変更。HTMLにJavaScriptコードを長々と書きたくないから。

assets/javascripts/mediaelement_conf.js
$('video').mediaelementplayer({

    iPadUseNativeControls: true,

    defaultSeekBackwardInterval: function(media) {
        return 15;
    },
    defaultSeekForwardInterval: function(media) {
        return 15;
    },
});

プレイヤーオプションの中にその関数を書いてオーバーライドする。これでLEFT、RIGHTキーで15秒スキップが出来るようになった。もちろんフルスクリーン状態でも大丈夫。
ただし、HTML5ビデオネイティブの時だけ。すなわちFirefoxでSilverlightプラグインで視聴しているときは効かないようだ。しょうがないけどちょっと残念。

GoogleTVコントローラもいけそう

ソースを読む限りだと、これらのキー操作がGoogleTVコントローラコードからも機能するように書かれている。ということは、Android端末でGoogleTVコントローラ使って自分の録画ビデオの再生制御が出来そうってことか。

カスタムキーアクション追加

keyActions:
[
 { keys: [キーコード,キーコード,・・・], action: function(player, media) {処理色々・・} },
 { keys: [キーコード,キーコード,・・・], action: function(player, media) {処理色々・・} }
]
って感じでmediaplayer()オプションのkeyActionsへ追加して行けば、どんどん自分のカスタム処理をキーに割り振っていける。

ブラウザのコントローラカスタマイズに拘らずにキーボードアクションの方が使い勝手がいいかもね。


今の悩みどころ

MediaElement.jsは使い勝手が良くてとってもいいんだけれど、jquery.jsを必要とする。他のフレームワークもほとんどがjquery依存のものが多い。
だけれど、redmine2.0.3はまだjqueryベースじゃないのだ。
幸いなことにprotptype.jsと混在していてもこのフレームワークの動作には問題ないらしい。

一番困るのがajaxだ。従来通りの記述で表現してみても、jqueryな書き方してみても、どちらもajaxによる非同期処理が機能しなくなってしまうのだ。

本来、rails3 + jqueryでもajaxは問題ないはず。だけれどもredmine2.0.3はrails3だけれどjqueryベースじゃないためか動作がわけわからない感じになる。

試しにjquery-railsをgemインストールして、プラグインのGemfileに'jquery-rails'を追加してみたけれど、希望通りに動いてはくれなかった。jquery.jsをインクルードしなければ昔通りのremote_functionとかはちゃんと動く。インクルードしなければね。MediaElement.jsは動かないけどね。本末転倒。

ここら辺でやりたいことは、再生イベントからフォームコミットをしてリモート(ajax)でサーバーへ送信したいのだ。出来ればページ更新は一切せずに非同期で行ったきりにさせたい。

自分はビデオ操作情報をサーバーへ送りたいだけなんだけど。なぜにそんな簡単そうなことがこんなに難しい・・・素人にはお手上げ気分。

この辺の実装をするには、最近リリースされたredmine2.1.2なら大丈夫なのだろうか?
話によると、redmine2.1.xはやっとjqueryベースになったということらしいけど。
もうしばらく今の状態を楽しんだら、やってしまおうかな。