わたねこコーリング

野良プログラマ発、日々のアウトプット

RDS MySQL のタイムゾーン問題でもう一捻り

AWS RDS で MySQL を使ってる人の多くはご存知かと思いますが、default_time_zone が UTC のまま変更出来ないので NOW() 等の日時関数を使った時に困ったことになります。これを解決する為に、パラメタグループの init_connect に接続時のタイムゾーン変更処理を記述してやる方法が知られているようですね。ただ、細かいことですが、この方法はストアドプロシジャに依存しているので、このパラメタグループを適用したデータベースインスタンスを追加する度にプロシジャを登録しなけりゃならんってのが、ちょっとスッキリしません。

てな訳でもう一捻り。前述のストアドプロシジャの内容を関数ベースでワンライナーにして、init_connect に直に書いちゃうってだけですが(↓)。

SET SESSION time_zone = IF(POSITION('rdsadmin@' IN CURRENT_USER()) = 1,'UTC','Asia/Tokyo')

シングルクォートとか入ってて大丈夫かな? と思いましたが、今のところ問題なくいってます。

音程・テンポが自在なミニプレーヤ Vox.app を山ライオンでもそのまま使う

Lion 時代の Mac アプリで Vox.app というミニプレーヤーがあるんですが、こいつが再生の際に音程・テンポを自在に設定できるという大変有り難い機能を持ってまして、採譜時の耳コピや、曲の調を変えて音源と合わせて練習する時なんかで便利に使ってました(↓)。

f:id:mariyudu:20130526172439p:plain

それが Mountain Lion にアップデートした後から動かなくなった(再生ボタンをクリックしても反応せず)ので、開発元に行って山ライオン対応版をダウンロードしたところ、音程・テンポの調整機能が無い全く普通のプレイヤーに何故か変貌してました。さてこれは困った。何とか古いままのアプリ(自分のはver.0.2.7.1)を動かせないだろうかとあれこれ調べたら、どうやらアプリ内の libbass.dylib というダイナミックライブラリを入れ替えればいい模様。以下の手順で行います。尚、この行為はアプリケーションの内部に手を入れることになるので、予めアプリを複製してバックアップしておく等、各自の自己責任で行なって下さい。

  1. ライブラリの開発元である http://www.un4seen.com/ から、BASS Audio Library をダウンロード(自分が DL したのは ver.2.4.10)。
  2. 解凍したフォルダ内にある libbass.dylib を、ターミナルでアプリケーション内のそれと差し替える(こんなかんじ↓)
cp libbass.dylib /Applications/Vox.app/Contents/Frameworks/

さて、この便利なアプリを使って某イベントの練習練習…

RDS で MySQL の EVENT 機能を使う

AWS 上で稼働している某サービスで、MySQL データベースを EC2 インスタンス上での稼働から RDS に移行することになったんですが、その作業の過程で EVENT 機能なるものが MySQL 5.1 以降で用意されていることを知りました。こんな便利なモノがあるのを知らずにもう何年も定期処理を cron で回してたのか… と恥じ入りつつ、早速使ってみることに。ところが、RDS 版 MySQL (現在、ver.5.5)はデフォルト設定で、EVENT 用のスケジューラプロセスが稼働してない模様。これを有効にするには以下の手順で行います。

  1. AWS コンソールの RDS ページを開いて、左サイドメニューから「DB Parameter Groups」をクリック。
  2. デフォルト状態では「default.mysql5.5」ってのがひとつあるだけですが、これに直接手を入れるのもアレなのでカスタマイズ用の設定を新規追加してみます。リストの上のボタン「Create DB Parameter Group」をクリックして適宜名前を付けて保存します。その際、「DB Parameter Group Family:」で「mysql5.5」を選べばデフォルト設定と同一内容の設定となります。
  3. 新規追加したパラメタグループを選択 → リストの上のボタン「Edit Parameters」をクリック → パラメタ一覧画面に移動。
  4. パラメタ一覧表から「event_scheduler」という項目を見つけて値が空欄になっているのを確認したら、一覧表上部のボタン「Edit Parameters」をクリックして、編集画面に移動。
  5. 「event_scheduler」の値を「ON」にして、ボタン「Save Changes」をポチッと。

あとは、上記で編集したパラメタグループを当該のインスタンスに適用するだけ。新規インスタンスなら生成ダイアログの「Additional Configuration」のところで「Parameter Group:」で選択してやります。既存インスタンスなら、Modify でこれを選択しなおしてインスタンス再起動。

パラメータグループの編集→保存は、インスタンスの再起動とかなしに反映されるみたいです。即時って程でもないみたいですが、遅い場合でも数分で稼働中インスタンスに反映されました。

Live Spots Today (今晩のライブ)、リニューアルしました

エリア毎にライブハウスのスケジュールを日別に集約するサービス、Live Spots Today (今晩のライブ)をリニューアルしたです。内部的な改修(ていうか実質作り直し)も大きいんですが、まずはページ外観のビフォーアフターを。

f:id:mariyudu:20130406132149p:plain

このサービス、ローンチして3年以上は経っていると思いますが、かねがね以下のような問題点を感じていました。

  • 本来は外出先でモバイル端末から使ってこそ便利なサービスな筈なのに、本気でモバイル対応してないし。
  • スケジュールページのスクレイピング処理のライブラリ整備がいまいちで、ライブハウス追加の作業が捗らない。
  • ページのレイアウトに余白部分が多く、結果として全ての情報を見るのに何度もスクロールを強いられる縦長構造になってる。デザインもスカスカしててなんかダサい、ていうか飽きてきた…

ということで、上記を受けての今回のリニューアル内容はこんな感じ。

  • スクレイパーWeb::Scraper を使った Perl スクリプトから、phpquery を使った PHP で作り直し。多分私が Web::Scraper を使いこなせてないだけだと思うのですが、SAX 的にハンドラを組み込んで処理を行う前者より、jQuery 感覚で DOM を縦横にトラバーシングできる phpquery のほうがコードが直観的で、共通処理の集約もしやすかったです。Web サイトが PHP 製なので、そっちとの親和性の良さもありますし。
  • Web のほうも CakePHP から Silex + Twig + phpActiverecord で書き直し。私の Cake 離れが本格化してきますた…
  • UI は Twitter Bootstrap をベースに、Pinterest ふうタイリングは jQuery Masonry なぞで。Bootstrap のレスポンシブ性のおかげで、それほど苦労しなくてもスマホ対応できました(最適化にはまだほど遠いですが)。

そんなこんなで、これでやっとライブハウス登録も楽になった(当社比)ので時間を見ながら、まずは自分の生活圏内である吉祥寺〜新宿間で登録を増やして行きたいと思ってます。本当の戦いはこれからだ… ww

デフォルトから気分一新! な Redmine のテーマ7選

プロジェクト管理および構成管理で Redmine の出番が増えてきました。しがないフリーの立場での仕事なので Redmine サイトもお客さん毎に複数立ち上げたりしてます。んで、ブラウザのタブで切り替えながら並行作業してるとどっちの Redmine サイトだったか混乱するので、ぱっと見で分かるようにテーマを変えてみようかと思いましてね。標準でバンドルされてるテーマは何だか似たり寄ったりなので、 http://www.redmine.org/projects/redmine/wiki/Theme_List あたりでテーマを見繕ってたらなかなかイイ感じのがあったので、デフォルトの青いテーマと区別しやすいのを選んでみました。ご参考までにどうぞ↓

1. A1

http://redminecrm.com/pages/a1-theme
f:id:mariyudu:20130320163559p:plain
クールな印象ですね。Ronin という請求・見積書サービスのルック&フィールを真似たとのことです。

2. Axiom

https://github.com/hulihanapplications/axiom
f:id:mariyudu:20130320164237p:plain
これはまたギークなデザイン。まぢめなお客さんには向かないかなぁw

4. CM-RED

https://github.com/ChrisMcKee/redmine-themes/
f:id:mariyudu:20130320165016p:plain
デフォルトテーマをカスタマイズした、プロダクトの名前どおりの赤!なテーマです。なんだかんだ言っても、カラースキームを変えるのがいちばん区別しやすかったりしてw

5. Modula Gitlab

https://github.com/doublerebel/modula-gitlab
f:id:mariyudu:20130320165326p:plain
Gitlab っていう、Rails 製の Git 管理アプリケーションのテーマらしいですね。Bootstrap っぽいいま風のデザインです。

6. Modula Martini

http://www.modula.fi/2008/redmine-theme/
f:id:mariyudu:20130320165723p:plain
こちらもモノクロームを基調にした、ミニマルで飽きのこないデザインです。

7. gitmike theme

https://github.com/makotokw/redmine-theme-gitmike
f:id:mariyudu:20130320170301p:plain
最後は日本人の makoto_kw さんによる、Github テイストなテーマ。前述の A1 をベースにしたとのこと。

…という訳で、今回は最後の gitmike theme を採用!(気分次第で何時でも変えられるよう、全部インストールはしましたがねw)。

YouTube 動画に TAB 譜をつけてギターが練習できる SoundSlice を使ってみた

先般、百式さんで紹介されていた SoundSlice という、YouTube 動画に TAB 譜をつけてみんなでシェアするサービスを使ってみました。というのも最近、プライベートで知人と似たような方向のサービスを企んでたりしたもんで、競合サービスの調査という訳です。正直、SoundSlice のあまりの出来の良さにモチベーションを全部持っていかれた気分です。しおしおのぱー…

では気を取り直して、動画に TAB を付けるまでの手順を駆け足で紹介しましょー。TAB を作る側になるにはユーザ登録が必要となりますので、まず SoundSlice サイトの右上にある「Sign up」をクリックしてユーザ登録を済ませます。メールアドレス・ユーザ名・ログインパスワードの入力だけで OK です。

f:id:mariyudu:20130216220112p:plain

次に、TAB をつけたい YouTube 動画を選択します。ページ上部の「Search for keywords or URL」とある検索窓から曲名やアーティスト名等のキーワードや動画 URL を入力して動画検索できるのですが、ここではこないだ投稿した自分のアコギ動画の URL をそのまま入力してみます。するとこんな感じの制作ページが(↓)。

f:id:mariyudu:20130216220604p:plain

DTM 経験者はだいたいこの画面でどういう作業をすればいいか予想できるのではないでしょうか。そう、多くの DTM ソフト(今じゃ DAW か…)と同様にまずトラックを作ります。トラックには文字列を入れるだけの「ベーシックトラック」と TAB 用の「ギター TAB トラック」の2種類があるので、必要に応じてページ左下の「+ ADD TRACK」というボタンをクリックしてトラックを追加作成します。ちなみにギター TAB トラックは、通常の6弦ギター以外にも4・5・7弦のそれも用意されているので、ベースやウクレレ・バンジョー等も作成可能かと。

今回はベーシックトラックで曲の構成パートと小節番号、それからコード名用のトラックを一つずつ、そしてギター TAB のトラックと、計3つのトラックを用意しました(↓)。

f:id:mariyudu:20130217174536p:plain

あとはトラックを選択して入力していくだけです。ベーシックトラックへのテキストの入力も、ギター TAB トラックへの TAB 数字の入力も、手順は基本的に同じです。トラックのタイムライン上で、デュレーション(入力対象となる長さ)をマウスで選択すると、そこに入力を促すプロンプトが表示されるので、そこにキーインします。トラックを作成した時に表示される解説ムービー(↓)の Method2 を観れば分かるハズ。

f:id:mariyudu:20130217183655g:plain

入力したタブ数字のコピー・移動・削除・デュレーション調整等はヘルプページに逐一、動画付で載っていますのでご一読を。特に、選択部分を Alt + 数字(Mac の場合は Option + 数字)で等分割する機能は非常に有用です。最初はひとつひとつ入力していたのですが、それだと手間がかかってしょうが無いことに気づきました。まず4小節ぶんの長さを選択して作った長いボックスを4等分して小節を生成 → 小節内で全音符の長さの音符を作成してから4等分して4分音符化し、弦や数字を変更、というやり方にすると、だいぶストレスが軽減できて仕上がりもキレイになりますよ。そんなこんなで、出来た TAB 譜がこれ(↓)です。

f:id:mariyudu:20130217184647p:plain

実際に動くやつは http://www.soundslice.com/yt/J5qpc0SJ2AU/ でご覧下さい。

これを作るのにだいたい5〜6時間くらいは費やしました。感想としては正直、以下のように↓

  • 複数の TAB 音符の選択機能が弱い(Shift キーを押しながらひとつずつクリックして選択)。タイムラインで指定した幅内にあるものを一気に選択できたらいいのに。
  • クリップボードを使ったコピペ機能はやっぱり欲しい。
  • トラックは一度作ったら上下に移動できないの?
  • ハンマリング・ポルタメント・ベンドの表現がない(まー動画観りゃわかるんだろうけどw)
  • 音符のクオンタイズが出来たらキレイに仕上がるんだが…

と機能的に不足している部分もあるかな? と思わなくもないですが、なにせローンチが昨年11月ですからね。現在も猛烈な勢いで開発を続行しているようなので、じきに解決されるのかもしれません。

さてさて、このサービスに対抗するには生半可じゃ勝てないなぁ。困った…

Silex + Twig : テンプレート中で PHP のスーパーグローバルにアクセス

Twig ネタふたたび。テンプレート中で PHPスーパーグローバル($_GET とか $_SERVER とかのアレ)を表示したいケースがあって、ルーティングプロシジャ毎の render でいちいちセットするのもちょっと切ないので、もうちょっと簡素な処理で何とかならないか調べてみました。結果、Twig_Extension_Staging::addGlobal() ってのを使ってグローバル変数を追加すればいいみたい。

Silex で TwigServiceProvider を登録した後で、before コールバック中でこんなふうに(↓)。

$app->before(function () use ($app) {
	$app['twig']->addGlobal('_get', $_GET);
});

テンプレート中では、当該変数が存在しない時の為に default フィルタをカマして(↓)。

<input type="text" name="hoge" value="{{ _get.hoge|default('') }}"/>

その都度 default フィルタ書くのがめんどかったら $_GET を、存在しないプロパティならヌルストリングを返す __get() をインプリメントしたオブジェクトでラップするとかすればいいかも。

グローバル変数に逃げるってあたりが作法的にアレかなぁと不安ですが、もしバッドノウハウだったら誰か突っ込んで下さい。