7月20日に催されたJTPAギークサロン「青木淳氏とNode.js/Herokuを体験する」にボランティアのテクニカルサポートスタッフとして参加してきた。JTPAでのハッカソンは、Hadoopで始める並列データ解析以来。参加者は各々ラップトップを持ち込み(参加者の9割がMacというのがシリコンバレーらしい)、ガイドに従いながらプログラムを書いていくわけだが、Hadoopの時と同様に参加者のプログラミングスキルはバラバラ。自分でWebサービスを作ったことがある人もいれば、プログラムを書いたことがないという初心者もいたけれど、ホスト役の青木氏の素晴らしいファシリテーションで、時間内に全員が「heroku上でMySQLを使ったnodeアプリを動かす」というゴールに辿り着くことができた。
どんなことをやったのかをgithub上にソースコードと共にまとめておいたので、ハッカソンの参加者で復習しておきたい人、残念ながら会場に足を運べなかった人は参考まで。当日は時間の関係上、app.jsにすべてのコードを詰め込んでいくスタイルだったけど、githubに載せたコードは若干ながらroutes/index.jsにコードを分散させている。まぁ入門なのでこんなもんですな。
heroku上でのデータベースにはClearDB MySQL Databaseを使ってたので、heroku configで表示される環境変数CLEARDB_DATABASE_URLから手動でmysqlのクライアントの設定をコーディングするシーンがあったが、こういうのは関数を作っておくと使い回しできる。
function parseClearDbUrl() {
if(!process.env.CLEARDB_DATABASE_URL) {
return null;
}
var url = require('url')
, dsn = url.parse(process.env.CLEARDB_DATABASE_URL)
, parseError = function(msg) {
return new Error('[CLEARDB_DATABASE_URL] '+msg);
};
if(dsn.protocol != 'mysql:') {
throw parseError('Scheme must be mysql');
}
if(!dsn.auth) {
throw parseError('No credencials');
}
var auth = dsn.auth.split(':');
if(auth.length != 2) {
throw parseError('Invalid credencials');
}
if(!dsn.pathname || dsn.pathname == '/') {
throw parseError('No database name');
}
var path = dsn.pathname.split('/');
if(path.length != 2) {
throw parseError('Invalid database name');
}
path.shift();
var config = {
database: path.shift()
, username: auth.shift()
, password: auth.shift()
, options: { dialect: 'mysql' }
};
if(dsn.hostname) {
config.options.host = dsn.hostname;
}
if(dsn.port) {
config.options.port = dsn.port;
}
return config;
}
かなり執拗なエラーチェックをしているが、これはSequelizeをherokuのClearDBと連携させるときに、node.jsでSequelizeを使うための準備/前編で紹介したdbconnモジュールで流用できるように書いたもの。
改良したdbconnモジュール本体はこのようになる。
module.exports = function(config) {
var Sequelize = require('sequelize')
, params = config.sequelize || {}
, cleardb = parseClearDbUrl();
if(cleardb != null) {
var extend = require('node.extend');
params = extend(params, cleardb);
}
params.options = params.options || {};
console.log('Sequelize connecting to %s on %s as %s', params.database, params.options.host || 'localhost', params.username);
return new Sequelize(params.database, params.username, params.password, params.options);
};};
今回の参加者はみんな行儀よくガイドに従って作業をしていく感じで、自分で新しい道を開拓していく(脱線ともいう)プログラマが現れなかったのがちょっと残念。
ふじちゃん、お手伝いありがと!想定外の事態がありすぎでふじちゃんがいなかったら炎上してたよ。
オリジナルの資料を貼っておきます。オリジナルは動けばいいレベルで書いてあるのでブログ主の最適化版と見比べると面白いかもです。
事前準備
http://goo.gl/5rmTc
手順
http://goo.gl/MF6Mj
遅くなりましたが、Junさんおつかれさまでした!
参加者それぞれの環境依存な問題が多かったですねぇ。MySQLインストールできないとか、rubyのバージョンが違ってherokuが動かないとか。サポートに追われて本流がどこまで進んでいるのかまで気が回りませんでしたが、いろいろ勉強になりました。