私と私の猫の他は誰でも隠し事を持っている

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

D3.js でローソク足チャート描くなら TechanJS がイイ!(かもしんない)

最近、データ分析の真似事をしたくなって、どうせやるなら実益も目指せる株取引を対象に、とごにょごにょ始めたりしています。そこで必要になるのが、データの「見える化」。ローソク足チャートをベースに、諸処の分析結果を作画して「ほほー」等と言ってみたい訳ですが、まずはツール選びに一苦労。jqPlot の様に高レベルに実装されたプロダクトは使うのも簡単なのですが、そのぶんちょっとしたカスタマイズにも苦労するようです。

他の手段を調べてみると、データ分析のビジュアライズには D3.js がイイという話。けど、D3.js ってのは「グラフを簡単に描けるライブラリ」というよりはデータ分析の視覚化フレームワーク的な、非常に広範囲な利用を想定した「低レベル」な実装なんですね。なので、グラフひとつ描くにもそれなりの学習が要るみたい…「努力すんのは嫌いだしめんどっちーし楽して身につく方法はないもんかな」と調べていたら、TechanJS という D3.js ベースの財務グラフ作画ライブラリを見つけました。

開発元提供のサンプルを見て頂ければ分かるように、ローソク足チャートは序の口で、MACD・RSI・トレンド線・一目均衡表など、テクニカル分析を齧ると出てくる様々な手法の作図が用意されているようです。しかも、このライブラリは作図だけでなくデータ分析の機能も併せ持っているらしい! とっても凄そうなのですが、先ずはシンプルにローソク足チャートに移動平均線を重ね描きするという初歩の初歩にチャレンジしてみました。で、出来た図がこんな感じ(↓)。

f:id:mariyudu:20150830212210p:plain

直近100日の日経平均日足と、5日・25日・75日の移動平均線です。TechanJS はドキュメントが殆ど無いので、サンプルのコードを参考に必要に応じて削ったり足したりしながらのプログラミングでした。作画には D3.js 流儀のステップが必要で関数一発という訳には行きませんが、データをポンと渡すだけで軸の目盛を実用的に調整してくれるところが有り難いです。プログラムは JSFiddle に上げておきましたよ、と(↓)。

jsfiddle.net

なにぶん、D3.js そのものに未だ不慣れなので自由自在に使えるようになるまでは長い道のりになりそうですが、一攫千金をニンジンにがんばってみようかと。

MuseScore ver.2 のギタータブ譜機能を試してみた

全国の撥弦楽器愛好者に朗報です。オープンソース&無料の楽譜作成アプリ、MuseScore (ミューズスコア)のバージョン2が先ごろの3月にリリースされて、かねてから予告されていた待望のタブ譜機能が正式に実装されました! ギターやウクレレ、その他を多少嗜む身としては本当にグッドニュースです。音楽的な表現に慣れ親しむという意味で五線譜の楽譜を蔑ろにすべきではないと思いつつも、アコースティック・ギターなんかは変則的なチューニングを用いることが多く、どうしてもタブ譜が欲しい時があるのですよね…

という訳で、早速試してみることにしました。お題は、戦前ブルーズの巨人、ブラインド・ブレイクの「ポリス・ドッグ・ブルース」のイントロを、五線譜とタブの二段構成で作成してみるというものです。

スコア書類の作成

先ず五線譜とタブの二段形式のスコアを新規作成します。メニューから[ファイル]>[新規作成…]を選択して、表示されたダイアログにて曲名や作曲者名等を適宜入力して、ボタン[次へ]をクリック(↓)。
f:id:mariyudu:20150601202704p:plain

テンプレートの一覧から「Solo」というグループにある「Guitar + Tablature」をクリックして選択(↓)。
f:id:mariyudu:20150601202757p:plain

「ポリス・ドッグ・ブルース」はキーが D (ニ長調)なので、調号からシャープふたつを選択して、ボタン[次へ]をクリック(↓)。
f:id:mariyudu:20150601202836p:plain

拍子・小節数はデフォルトのままで、ボタン[完了]をクリック(↓)。
f:id:mariyudu:20150601202847p:plain

はい、五線譜とタブの二段スコアのひな形ができました(↓)。
f:id:mariyudu:20150601202855p:plain

チューニングの変更

この曲のギターはレギュラーチューニングではなくオープン D という、6弦から順に DADF#AD に合わせる変則チューニングなので、その設定が必要になります。タブ譜の上でマウスを右クリックして、コンテクストメニューから[譜表のプロパティ]を選択します(↓)。
f:id:mariyudu:20150601202910p:plain

このダイアログの左下あたりにあるボタン[文字列データの編集…]をクリックすると、ギターの調弦が表示されたサブダイアログが表示されます(※ヘンな表記ですが多分「弦(Strings)」が「文字列」に誤訳されているのでしょう)。この値(6弦なら E2)をダブルクリック → 表示された音符選択ダイアログで変更する値(6弦なら D2)をダブルクリック、という手順で各弦を必要に応じて調弦を変更します(↓)。
f:id:mariyudu:20150601202924p:plain

はい、この通り DADF#AD へのチューニング設定が完了(↓)。
f:id:mariyudu:20150601203027p:plain

あと、チューニングに合わせて「使用可能な音高の範囲」も設定しておいたほうが良さげ(音符入力の際にこの範囲を逸脱すると赤くエラー表示されてしまうので)。5フレットでのハーモニクス等考えると、D2 〜 D6 とかにしておけば良いかと(↓)。
f:id:mariyudu:20150601203037p:plain

音符の入力

あとは音符を入力していくだけです。タブ譜の先頭をクリックして選択状態にしておいて、メニューバーから音符入力ボタンをクリックするか、n キーを押して、音符入力モードに入ります(↓)。
f:id:mariyudu:20150601203049p:plain

音符(というかタブ譜なのでポジション番号)の入力位置が青く表示されますので、音符の種類(4分,8分etc)をメニューバーから選択してポジション番号をキー入力します。カーソルキーの←・→で左右位置が、↑・↓で弦の移動ができるので、これらの繰り返しでどんどん音符を入力していきましょー(↓)。
f:id:mariyudu:20150601203147p:plain

そんな感じで黙々と入力していったら、こんな感じでイントロ部分が出来上がりました(↓)。
f:id:mariyudu:20150601203505p:plain

…と、必要最小限ですがタブ譜の作成手順でした。説明した以外でも、繰り返し記号やタイ・スラー等はどうやって入力するの? 的なギモンがあると思いますが、その辺は通常の楽譜機能に属する事柄なので、純正のハンドブックから学んで頂ければと。自分でも MuseScore は初心者レベルなので、これからどんどん使い倒して、獲得したノウハウは共有して行こうと思ってます。そんな訳で、今日はここまで!

Redis で FIFO バッファを作って PHP から使う

昨今じゃ当たり前になった NoSQL ってやつですが、自分はどうも使う機会が無かったというか、フツーに RDB 使ったほうが目的に叶うケースが多かったので memcached でさえ殆ど手を触れずに今日まで来ました。それがやっと先ごろ、NoSQL なシチュエーションが発生!という訳で、人生初 NoSQL の作業メモです。

要件は、各所から発生するデータをそのまま RDB に書き込むと諸事情で色々と嬉しくないので、いったんバッファに溜めておいて専用のデータストア用プログラム経由で逐次 RDB に格納するというものです。古いものから順に読み出す必要があるので、所謂 FIFO (First In First Out) バッファですな。memcached は万一のデータ消失が怖いので、最近評判が良いらしい Redis を採用。

まずは環境づくりから。当方の AWS EC2 な LAMP サーバにて、Redis を PHP から使えるようにします。Redis 関係は EPEL リポジトリにしか無いようなので、それを指定して yumインスコします。

% sudo yum --enablerepo=epel -y install redis

Redis サーバを起動して、ブート時の設定も忘れずに。

% sudo service redis start
% sudo chkconfig redis on

で、動作確認…

$ redis-cli
redis 127.0.0.1:6379> info
redis_version:2.4.10
(省略)
redis 127.0.0.1:6379> exit

よし、OK。

PHP の Redis 用モジュールのほうも同様にインスコ

% sudo yum --enablerepo=epel -y install php-pecl-redis
% sudo service httpd reload

以上で環境が整ったので、プログラムを書きます。Redis は色々なデータ型が用意されていますが、FIFO バッファは Lists 型を使って実現できるとここにあったので、これに倣って LPUSH で書き込み、RPOP で読み出すことにします。RDB 用のデータを Redis に書き込む側はこんな感じ。

$data = array(':name' => $name, ':email' => $email, ':created' => date('Y-m-d H:i:s')); //テーブル列名 => 値、な1レコードぶんのデータ
$redis = new Redis();
$redis->connect('localhost');
$redis->lPush('mykey', json_encode($data)); //JSON に変換して Redis に保存

Redis → RDB の処理側はこんな感じ。

$redis = new Redis();
$redis->connect('localhost');
$pdo = new PDO('mysql:host=localhost;dbname=my_db', 'login_name', 'login_pw');
$stmt = $pdo->prepare('INSERT INTO my_table (name, email, created) VALUES (:name, :email, :created)');
while ($data = $redis->rPop('mykey')) { //有るだけ読み出しては RDB に追加
	$data = json_decode($data, true);
	$stmt->execute($data);
}

とまぁ、こんな具合です。実にシンプルな利用ケースなので一寸物足りない気もw 他のデータ型も使ってみたいなー。

Thunderbird アドレス帳と GMail 連絡リストを同期させて、迷惑メール誤振分けを是正する

SNS やら諸サービスの台頭で連絡手段も多彩になりましたが、仕事ではやっぱり未だ E メールがメイン。自分の場合、GMail で用途別にアカウントを作って、それらを Thunderbird に集約して使ってます。で、困るのが GMail 側で正常メールが迷惑メールに誤振分けされる件。これを抑止するにはそのメールの差出人アドレスを GMail 側で連絡帳に追加しておけば良いのですが、その度にウェブブラウザで設定するのが面倒でしてねぇ。何とかならんか? と調べたら、Thunderbird アドレス帳と Google 連絡先を同期させる Google Contacts という Thunderbird アドオンがあるようなので、それを試してみました。以下、手順。

配布元から Google Contacts アドオンをダウンロードして、書いてある手順(↓)に従ってインストール。Ver.24 までと表記されてますが、現行バージョン(31.5.0)でも問題なく動作するようです。
f:id:mariyudu:20150321143558p:plain

インストール後に、Google 連絡先のインポート可否を聞いてくるのでオケーイと言ってやります(↓)。
f:id:mariyudu:20150321144136p:plain

Thunderbird アドレス帳ウィンドウを表示させると、おお、Google 連絡先が加わってる(↓)。
f:id:mariyudu:20150321144621p:plain

さて、誤振分けの対応はここから。誤振分けされてしまったメールの差出人を右クリックして、そのアドレスを Thunderbird アドレス帳に追加します。
f:id:mariyudu:20150321151103p:plain

んで、Thunderbird アドレス帳ウィンドウを開いて、追加されたメアドを Google 連絡帳にドラッグ&ドロップしてコピーします(↓ モザイクだらけでわかりづらいですがw)。f:id:mariyudu:20150321151822p:plain

以上です。メアドを直接 Google 連絡先のほうに追加できればいちばんなんですが、それでもいちいちブラウザで GMail を開くのに比べたらだいぶ楽になりました。

続・MySQL データベースからテーブル定義書を生成する

以前書いた「MySQL データベースからテーブル定義書を生成する」が、地味にアクセスがあるようです(当社比)。ナウでヤングで意識高いギークさんには見向きもされないような類の古臭いイシューだと思ってましたが、平成27年のニッポンでは現在進行形の悩ましい問題だったりする訳ですかね?

とまぁそんな訳で続編というか改訂版というか。前回記事では、ダンプした DDLSQL::Translator という CPAN モジュールを使った perl スクリプトXML 化した上で、それを XSLT で HTML 変換するという、ちょっとややこしい手順でした。その後、MySQL のダンプコマンド mysqldump には --xml というオプションがあって、こいつを使えば XML 形式の DDL がカンタンに入手できることが判明!(って今頃ヲイw つまり、

mysqldump --no-data --xml foodb > foodb.xml

XMLDDL を生成しておいて、

xsltproc -o foodb-document.html style.xsl foodb.xml

で HTML 変換という、たった2手順でコトが済んでしまう訳です(MySQL 限定)。知らぬこととはいえお恥ずかしい。

さて、冒頭で書いたように、このイシューには割と需要があるようにも見えるので XLST 処理を行える環境が手元に無い方を想定して、上記の xsltproc 処理をウェブ上で行えるサービスのようなモノを作ってみました。使い方はカンタン。フォームにて、左テキストボックスに DDLXML を、右テキストボックスにスタイルの XSL をコピペして変換ボタンをポチっとするだけです。
f:id:mariyudu:20150201025514p:plain

f:id:mariyudu:20150201025531p:plain

なにせ1時間程度でちゃちゃっと作ったモノなので、XML のバリデーション等は一切行っていませんが(文法に誤りがあると「変換できませんですた」って言うだけw)、マジで需要があるようだったらご希望を取り入れながら充実させて行こうかと。

【AWS EC2】bash プロンプトにインスタンス名を表示する

インフラ屋の皆様、年末年始に向けたサーバ増強はお済でしょうか。そんな貴兄に EC2 関連の小ネタです。

スケールアウトなんかを目的としてクローン・サーバー・パターンを実施するとき、同じ AMI から立てたインスタンスだと bash のプロンプトもぜんぶ同じになっちゃうのですが、やっぱりこれはインスタンス毎に変えておきたい。でないと思わぬ操作ミスをしちゃいそうですもんね。

さて、どうするか。まず、起動したインスタンスで自分のメタデータ(インスタンスIDとか)を取得するには、こうすれば良いみたい。

Amazon EC2インスタンスの自身のMetadataを簡単に取得する

ふむふむ、

wget -q -O - http://169.254.169.254/latest/meta-data/instance-id

とすれば良いのですな(チョー簡単で嬉しいけどなんで生の IP なんだろ?)。

インスタンス名が判ればあとは AWS CLIインスタンスに付けた名前(タグの Name の値)を取得出来ますね。こんな感じ?

aws ec2 describe-instances --instance-ids <インスタンスID> --query "Reservations[*].Instances[*].[Tags]" --output table

これで問題は解決。perl で 上記出力からインスタンス名だけ抜き取って PS1 にセットすればよしっと。

export PS1="["$(/usr/bin/aws ec2 describe-instances --instance-ids $(/usr/bin/wget -q -O - http://169.254.169.254/latest/meta-data/instance-id) --query "Reservations[*].Instances[*].[Tags]" --output table | /usr/bin/perl -n -e 'print $1 if / Name \|\s*([^\s]+)/')" \W]\$ "

これを .bash_profile でも追記して完了! ムキになってワンライナーにしちゃいましたが、可読性が悪くていやんという場合は、

INSTANCE_ID=`/usr/bin/wget -q -O - http://169.254.169.254/latest/meta-data/instance-id`
MYNAME=`/usr/bin/aws ec2 describe-instances --instance-ids $INSTANCE_ID --query "Reservations[*].Instances[*].[Tags]" --output table | /usr/bin/perl -n -e 'print $1 if / Name \|\s*([^\s]+)/'`
export PS1="["$MYNAME" \W]\$ "

でも良いと思います。さあ、紅白歌合戦でも除夜の鐘でもどんと来い!(うそ、なるべく来ないで)。

「ブッシュマン・ワールド・ウクレレ・ヴィデオ・コンテスト」のこと

先日の記事に書いたように当方、「Beat Ukulele」というウクレレによるポップスカバー動画のキュレーションサービス(のようなもの)を運営していますが、そのネタを YouTube で漁っている時にタイトルや説明に「Bushman Ukulele Video Contest」というフレーズが入っているものに多々出会いまして。こりゃいったい何だろうということで、調べてみました。

ブッシュマン・ワールド・ウクレレ・ヴィデオ・コンテストとは?

どうやらこれ、インディアナポリス市にある Bushman Ukuleles というウクレレ屋さんが始めたウクレレ動画のコンテストのようです。ウェブサイトはこちらになりますが、オンラインショップを営みながらオリジナルブランドのウクレレも数本リリースしている模様。コンテストは2007年から始まっており、3度の休止はありましたが今年(2014年)も無事行われたようです。毎回100を超えるエントリーがあり、なかなか盛況なようです。

このウクレレ屋さん、ほんの10年程前まではハーモニカ専門店だったとかで、ここにあるウクレレショップに進出したいきさつが面白いのでチョウ訳してみます。

それは2003年の5月…(遠い目) ハーモニカショップを営んでいた僕らの元にホーナー社のラニカイ・ウクレレを取り寄せできないかいう引き合いが入った。「ホーナーはハーモニカ製造会社なのでウクレレは作ってませんよ?」とドヤ顔でアドバイスした僕らに、そのお客さんは「んなことあるかい! LU21 ってモデルを現に作っとるわい!」と逆切れ。ホーナーに確認してみたら、うっわー、本当だった! そこでお客さんと弦楽器好きな僕の父と、そしてお店の在庫用に3本のウクレレを取り寄せて、自分達のウェブページでも注文できるようにしておいたんだ。そうしたら驚いたことにそれが大当たりしちゃって、60件以上の注文が! それ以来僕らもウクレレに入れ込むようになっちゃったのね。そんなこんなで、その年のロードアイランド州でのウクレレ・エキスポに僕らもブースを出したんだけど、そこに80歳のおばあちゃんがやって来て、ちっちゃなソプラノ・ウクレレビートルズの「ハピネス・イズ・ア・ウォーム・ガン」をプレイしたんだYo! それを聴いて確信したのさ。「世界中でウクレレほどクールで、魅惑的なサウンドで、楽しい楽器は無い!」ってね。

何やらリーマン・ショック以前の絶好調だったアメリカの情景が垣間見えるようですがw、とにかく彼等のウクレレにかける熱い想いが伝わってきますな。

過去の優勝作品

ではこれまでの優勝動画を年代順に追って紹介しましょう。

【2007年】 「サヴァイヴァー (デスティニーズ・チャイルド)」


Survivor Destinys Child on Ukulele - YouTube
ご存知、R&B ガールズグループ「デスチャ」のヒット曲。チャキチャキ娘のジュリア・ニュネスちゃん、かわいい♡

【2008年】 「キラメキ☆ンー・バップ (ハンソン)」


Bushman World Video Ukulele Contest - MMMbop ...
世界中で大ヒットした兄弟ロック・バンド、ハンソンのデビュー作。小中学生くらいの少女達がはにかみながら… と思ってたら堂々としてて上手いのなんのw

【2010年】 「オールド・バザー・イン・カイロ (クリントン・フォード&ジョージ・チゾーム)」


Felukuleles &#39;Old Bazaar in Cairo&#39; - YouTube
カイロで働く4人組の作品で、個人的には一番突き刺さりますた。原曲はクリントン・フォード&ジョージ・チゾームという英国人ミュージシャンによる'60年代のものらしいです。

【2011年】 「ホェアー・ザ・サイドウォーク・エンズ (オリジナル)」


Shel Silverstein - Where the Sidewalk Ends ...
シェル・シルヴァスタインという作家による詩に、自作の曲を付けたものらしいです。組曲風になっていて、力量の凄さが伺えますな。

【2014年】 「アイ・ワント・ア・ブッシュマンウクレレ (オリジナル)」


I Want A Bushman Ukulele by Uke-A-Lady ...
ユーク・ア・レディという自らのユニットの自作曲。こいつら、おねだりしてるよ… 本当に身もフタもないったらwwww

上記優勝作品の他にも多くのエントリー作がここのリンクを辿って見られますので、どうぞ。

さて、来年は?

という訳で、来年の2015年は例年通りコンテストが開催されるのか? ウェブサイトには今のところ言及は見当たりませんが、注視していきたいと思います。日本人によるエントリーがあるかは確認していないのですが、ウデに覚えのある方は是非。そういえば、日本でも某最大手ウクレレブランドさんが隔年でウクレレ・コンテストを開催されていますが、こんな感じの動画コンテストもイイんじゃないですかね? 費用もそれ程かからないと思いますしw