Archive

Archive for the ‘サービス’ Category

マニアックな金融系サイトをnode.jsとMongoDBで実装してみた(実装編)

1月 19th, 2011

さて、前回の記事「マニアックな金融系サイトをnode.jsとMongoDBで実装してみた(概要編)」に続き、実装の詳細を書こうと思うのですが、こちらはどうせ技術者しか見ないので手っ取り早く、コードとシェルを中心にします。

この記事では、開発から運営まで一連の流れを示して、node.jsとMongoDBである程度のWebサービスを提供できるようになること、を目的としています。

SakuraのVPSにMongoDBとnode.jsをインストール

以前、別のサーバーにMongoDBを入れてアクセス解析をしようとしたのですが、どうやら32bit版だと1つのDBは2GB以上入れられないらしく。
しかたなしにSakruaのVPS(CentOS64bit)に64bit版のMongoDBをソースコードから入れました。
※32bitだとyumとかapt-getとかで入ったのにー

wget http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-1.6.5.tgz
tar xvzf mongodb-linux-x86_64-1.6.5.tgz
sudo mv mongodb-linux-x86_64-1.6.5 /usr/local/bin # どっか適当に
sudo mv /usr/local/bin/mongodb-linux-x86_64-1.4.3 /usr/local/bin/mongodb
useradd mongodb
mkdir /var/lib/mongodb  # 中身を入れるディレクトリ
chown -R mongodb:mongodb /var/lib/mongodb
mkdir /var/log/mongod
chown -R mongodb:mongodb /var/log/mongod
sudo /sbin/chkconfig --add mongod
/sbin/chkconfig mongod on
/sbin/chkconfig --list |grep mongod
sudo /etc/init.d/mongod # 起動スクリプト
sudo /etc/init.d/mongod start
sudo easy_install pymongo # ついでにpythonから使うのでライブラリインストール

ちなみに、デーモン化したかったので簡単な起動シェルをこちらから拝借してきました。
» 技術メモ
(こちら、公開してなかったらゴメンナサイ。そしたら別にファイル作ります。)

試しにmongoのシェルから動いてるのを確認してみてください。

mongo
----
MongoDB shell version: 1.6.5
connecting to: test
> show dbs
admin
local
test

次にnode.jsを入れます。
安定版の0.2.6をインストール。ssl使う場合はもっと大変そう。

wget http://nodejs.org/dist/node-v0.2.6.tar.gz
tar zxvf node-v0.2.6.tar.gz
cd node-v0.2.6
./configure --without-ssl
make
sudo make install

また、node.jsはライブラリのパッケージ管理にnpmというものを使っていて、こちらもインストール。

ここまできて、npmは/usrとか/usr/localにroot権限で入れるのではなく、$HOME/.npmrcを設定して一般ユーザーの権限で入れるのがベストプラクティスなのだと理解した。
» npmをインストールする – スコトプリゴニエフスク通信

とのことで、おとなしくそれに従う。ってか実際rootで入れると、sudo npm install xxxするときに怒られます。

wget https://download.github.com/isaacs-npm-v0.2.14-6-14-g0cec5bf.tar.gz
cat >>~/.npmrc <<NPMRC
root = $HOME/.node_libraries
binroot = $HOME/bin
manroot = $HOME/share/man
NPMRC
tar -zxvf isaacs-npm-v0.2.14-6-14-g0cec5bf.tar.gz
cd isaacs-npm-v0.2.14-6-14-g0cec5bf
make install

で、必要なライブラリをインストール。

npm install express # これは古いらしく結局ソースから読み込み・・・
npm install mongodb
npm install ejs
npm install spark # 結局使わず・・・
npm install forever

node.jsでwebサーバーを書く

これで一通り環境が整ったので、適当なフォルダにapp.jsかなんかのファイル名でごりごり書いていきます。
前提として、mongoDBに既に必要なデータは入ってるものとします。
詳しくはmongoDBの日本語マニュアルを参照。@doryokujin君に感謝!

ちなみにnode.jsコミュでは一番メジャーっぽい、express.jsっていうフレームワークを使っています。
githubにサンプルコードがたくさん載っていて、特にmvcがとても参考になりました。

なお、フォルダ構成はこんな感じです。
/service
 /public・・・cssとかimgとか静的ファイル
 /express・・・expressの本体
 /views・・・テンプレートファイル
  body.html
  layout.html
  header.html
 app.js

app.js

var express = require('./express'),
	phpjs = require('./php');

var app = module.exports = express.createServer(),
	Db = require('mongodb/db').Db,
	ObjectID = require('mongodb/bson/bson').ObjectID,
	Server = require('mongodb/connection').Server,
	db = new Db('dbname', new Server('localhost', 27017, {}));

app.set('views', __dirname + '/views');
app.register('.html', require('ejs'));
# express.jsはテンプレートエンジンにjadeを使ってるがキモいのでejs
app.set('view engine', 'html');
app.use(express.staticProvider(__dirname + '/public'));
# 静的フォルダの指定
app.use(express.logger('\x1b[33m:method\x1b[0m :date :status \x1b[32m:url\x1b[0m :response-time :remote-addr :referrer'));
# loggerはnode.jsが使っているConnectのformatに対応
app.helpers({ # テンプレートから呼び出せるヘルパー関数群
  helper1: function(){ return false; },
  helper2: functoin(){ return true; }
});
# routingの部分。 / にアクセスしたらこれが実行される
app.get('/', function(req, res){
	getCollection1(function(result1){
		getCollection2(function(result2){
			res.render('body', { # layout.htmlを使ったbody.htmlを描画
				layout:'layout',
				result1: result1,
				result2: result2
			});
		});
	});
});

db.open(function(){}); # dbをオープン。これしないと接続できなかった。。。
function getCollection1(callback) {
	db.collection('collection1', function(error, stock_info) {
		if( error ) console.log(error);
		else {
			stock_info.find({}, function(error, cursor){
				if( error ) console.log(error)
				else{
					cursor.toArray(function(error, results) {
						if( error ) console.log(error)
						else callback(results);
					})
				};
			})
		}
	});
}
function getCollection2(callback) { /* 以下同文 */ }

console.log('Express app started');
app.listen(3000);

layout.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
	<div id="header"><%- partial('header') %></div><!-- こういう風にヘッダも分けれる -->
	<div id="body"><%- body %></div><!-- 中身がここに書かれる -->
</body>
</html>

開発のポイントとしては、
php.jsが便利すぎる!
 phpの関数をjavascriptでどう書くか?というスニペット集。
 上記コードでは必要な関数を外部モジュール化して使ってます。
loggerのformatが不明だった
 node.jsが使っているConnectのサイトにAPIが!
DBへのアクセス毎にcallbackが入れ子していくので、とにかくアクセスは少なく!
 いやはやMongoDB使ってて正解でした。
 これがMySQLだったらどれだけ入れ子していったことか。
 もちろんjsdeferredとか使って同期処理させることはできますが。

これでモノは揃ったので、実際に実行してみます。

cd /path/to/service
node app.js

すると”Express app started”と出るので、実際に http://localhost:3000/ から確認してください。
ポートは自由に変えられます。

nodeのデーモン化を行う

一応以上までで実装は完了してるのですが、これをちゃんとサービスとして運営するにはあともろもろ必要ですよね。

一番てこずったのが、デーモン化。
なんかエラー出して止まっちゃったときに、自動で再起動してくれないと困る。
結論から言うと、npmでインストールできるforeverというライブラリを使っているのですが、右余曲折ありまして。

1. どうやらspark(configの設定、マルチコア対策)+upstart(デーモン化)+monit(監視)がテッパンらしい。
» Deploying Node Apps with Spark – How To Node – NodeJS
» Deploying Node.js With Upstart and Monit
2. sparkはすんなり入った。
3. upstartが動かん・・・ってrequirementがpython2.5以上で他にもCentOS5向けじゃなさそう・・・
» What are the requirements for building Upstart?
4. じゃあmonitから直でspark呼ぶか、ってnpmとか諸々$HOMEに入れてるから、monitから起動できない模様・・・
5. なんか他にも、spark2とかdaemon.nodeとかforeverとか色々あるな~
6. daemon.nodeは割と有名っぽいけど、作者が同じforeverが簡単そう!

cd /path/to/service
forever start app.js

7. 動いた!←イマココ

これで何とかデーモン化ができました。

実際にデプロイする

ちょっとポートを空けてうんぬんとか面倒くさかったので、ApacheからProxyさせました。
これだとloggerの:remote-addressにIPが出ないんですけどね・・・
近々改善予定。
» mitukiii.jp | Ubuntuにnode.js入れてApacheからProxyさせてみた

ついでにMongoDBの状況をmuninでチェックできるように、mongo-muninとやらを導入しました。

sudo ln -s /usr/share/munin/plugins/mongo_ops /etc/munin/plugins/mongo_ops
sudo /etc/init.d/munin-node restart

まとめ

いやいや、MongoDBもnode.jsも初めてだったので四苦八苦しました。
しかもnode.jsに関しては、まとまった日本語ドキュメントが無いという・・・
ていうか全体的にドキュメントが不足がち。
しかもまだ安定運営周りの方法が確立していないようで、色々議論されてました。
node servers, npm scripts, spark2 and monit
たしかにnpm start app.jsで管理できたら便利やなー

でもこれで、一通りnode.js周りのことが勉強できたし、足りないとこだらけなので貢献していければなーと思います。
久々の長文ありがとうございました。

今回リリースしたサイト↓
http://marketgeek.net/ja/

8maki IT, proposal, エンジニア, サービス , ,

マニアックな金融系サイトをnode.jsとMongoDBで実装してみた(概要編)

1月 19th, 2011

ちょっと半分趣味で、Marketgeekなるマニアックなファイナンス系のサイトを、意味もなくnode.jsとMongoDBで実装、リリースしました。

ただ、node.jsとMongoDBは結構はやりな割に、運用実績がすごく少ないようで、その技術の背景など含めてまとめてみました。
※なお、開発回りのことだけ知りたい方はこちらへどうぞ↓
» マニアックな金融系サイトをnode.jsとMongoDBで実装してみた(実装編)

node.jsとは何か?

node.jsは、サーバーサイドJavascriptのフレームワークで、簡単にWebサーバー等を実装することができます。

サーバサイドJavascriptは昔から注目されていましたが、node.jsの登場で一気にその流れが加速。
理由といえば、こういう類のモノにしては、びっくりするくらい速い!こと。
Google Chromeで採用していたV8をJavascrptエンジンに使っており、スピードUPが測れたとのこと。
いわゆる”Pythonより速い”らしいw

加えて、昨今HTML5も騒がれていますが、そうなるとサーバーへのリクエストが細分化されますよね?
そうすると非同期で処理するnode.jsはうってつけかも!という流れもあり(WebSocketとか)、今年はnode.jsの年!と言われるようになったのかも。

node.jsに関してはこの記事が詳しいです↓
» 2011年はサーバサイドJavaScriptの年になる - Publickey

MongoDBとは何か?

MongoDBとは、いわゆるNoSQL系のDBで、最新DBの中では一番注目されているオープンソースです。
今まで主流のDBであるRDBは、いわゆるExcelのようにまず列を決めてその属性群(スキーマと言う)をもったデータを行として入れていく、というスタイルのものでしたが、NoSQL系のDBではkey(IDのようなもの)でデータを管理し、そのデータの属性(スキーマ)は一定に決めなくてもよい、という柔軟なデータ構造を取れるため各所で使われ始めています。
スキーマレスDBとも言われています。

中でもMongoDBは、KVS(Key Value Store)だけでなく、複雑な検索を行ったり、インデックス張ったり、簡単にスケールさせられたり(サーバー増やしやすい)と、実用にかなった機能をもっているため広まってきています。

ちなみに実用実績としては、ForsquareがMongoDBを採用してるようです。
MongoDBと他のDBとの比較はこの記事が詳しいです↓
» MongoDB’s performance as compared to others

また、3月頭にMongoDBの商用サポートを行っている10genのイベントが東京であるらしいので興味ある方はどうぞ。
» Mongo Tokyo

なぜnode.js+MongoDBを使って実装したのか?

柔軟に金融情報を管理しようとするとスキーマ決めるのって難しいよねーっていう感じと、今後もっとリッチなVisualizationを作っていくためにAjaxとかWebSocketに適してるっぽいのがいいという勘で、MongoDBとnode.jsを選んでみました。

。。。正直あんま理由とかはないですけどねf^^;
ていうか、もともとこういうサイトを作る気合いはあったのですが、ただ技術的には何も新しい・難しいことはないので、だったら勉強がてらやってみよう!というノリでw

あと、オープンソースコミュニティにもそろそろ絡んでいきたいなーと思っていて、発展途上のnode.jsとMongoDBは最適だ思ったので。
開発して分かったのですが、まだまだ色々な問題点があるので、随時コミットしていきたい。

なぜMarketgeekを作ったのか?

日本のベンチャー界隈も「世界へ出ろ!英語化しろ!」とはやし立てられてますけど、実際世界と日本の違いをまともに話せる人、まともに比較できるリソースがあまりにも少なすぎるかなー、と。
それだと「とりあえず英語化して、海外視察して、ちょっと英語でプレゼンしてみて。」っていう感じで終わってしまう気がする。
そこで、具体的に何を目標にどうアプローチしていけばよいのか、思考のネタになるものを作ってみたかったとです。

加えて、逆に英語圏の人からアジアのベンチャーとかって、中々見えにくいのではないでしょうか?
2バイト文字ばっかだし。
もちろん中国とかシンガポールとかにたくさんVCは進出してきてある程度情報が海を越えてるかもしれませんが、英語で書かれた米メディアに比べて、アジアの英語メディアって圧倒的に少ない。
特に東南アジア。
これからはアジアの時代になると言われていますし、思った以上にニーズがありそうで、かつそれなりのポジションを築けそうだったのでホイホイ作ってみました。

まぁなにより作ってて単純に楽しかったです。
最先端の技術使って、興味のあるマニアックなもの作ってw
Naspersって2兆円もあるのか!フヒヒヒヒヒっwwwみたいなw

あ、ちなみにNaspersは@anritさんが作ったこの図が凄く分かりやすい。
Zynga、Groupon、Facebookの金の供給元ってすごいですよね。
naspers

とりあえず見てみてください。随時機能拡張予定です。
http://marketgeek.net/ja/

あと、要望とかコメントとかあったらtwitterへどうぞ⇒@marketgeek_net

技術編はこちら↓
» マニアックな金融系サイトをnode.jsとmongoDBで実装してみた(実装編)

8maki IT, proposal, エンジニア, サービス, 金融 , , , ,

今のiPadでできること・できないこと2

5月 20th, 2010

先日の記事、「今のiPadでできること・できないこと」が割と好評だったので、書き漏らしを追記します。

なんか半分以上、アプリの紹介になってしまいましたが・・・f^^;

画面の向き固定
デュアルディスプレイ化
日本の雑誌の購読
リモートデスクトップ/Linuxへのアクセス

画面の向きの固定

ipad2-hold

地味に知ってる人が少ない画面の向きの固定機能。
右側の側面に、音量調節スイッチの上にHOLDスイッチが付いてます。
iPhoneではHOLDができないため、寝転がると向きを変えてしまってすげー不便、と言う声は良く聞いていたのですが、iPadでは解決しています。

デュアルディスプレイ化

ipad2-dual

iPadをディスプレイとして使っちゃおうという使い方。
iDisplayというアプリを使えば、PCとWifiを通じて外部ディスプレイとして使うことができるようです。
Gizmodeで詳細なレビューがされています。
4月初旬段階ではまだまだバグが多いようですが、今ならもう直ってるかな?
あと、AirDisplayという拡張ディスプレイ用のアプリも、今週中くらいに登場予定。

日本の雑誌の購読

ipad2-maga

ちょうど昨日リリースされたマガストアというアプリが凄いです。
日本の雑誌をiPadでダウンロードして、読むことができます。
値段はだいたい、本誌の100円引きくらい。
AERA週刊NewsweekF1速報というマニアックな雑誌も扱っています。

中身はというと、雑誌のデータをまんま画像データとして入れた感じ。
見開きなどは見れませんが、いちいち本屋に行かずに買え、どこでも読むことができるので重宝しそうです。

リモートデスクトップ/Linuxへのアクセス

ipad2-remote

LogMeIn Ignitionというアプリを使えば、会社や家のPCのデスクトップにアクセスできるようになります。
¥3,500と割高ですが、かなり人気のアプリのようです。

また、iSSHというアプリは、LinuxへのSSH接続機能を提供しています。
これらを使えば、開発関連のタスクをすべてiPadで行うことができるようになるかもしれませんね。
もちろん、iPadのキータッチ入力だとプログラミングはしにくいので、BlueToothの外付けキーボードの接続をオススメしますが!

8maki IT, proposal, サービス

今のiPadでできること・できないこと

5月 17th, 2010

mixi日記には書きましたが、4/26~5/1まで、WWW2010という学会に参加するためにアメリカに行っておりました。
ついでながら、近くにApple Storeもあったため、iPadを何個か買ってきました。

一番初めに使った衝撃が、「ノートPCを持ち歩かなくて済む!」という印象でした。
ちょうど2週間くらい使ってみて、本当にノートPCの代替として使えるのか、現状何ができて何ができないのか、タスク内容に応じてまとめてみました。

※なお、画像は全てiPad本体でキャプチャしたものです。

タッチキー入力
メール/カレンダーチェック
Webブラウジング
本・雑誌・新聞
iPadアプリ
音声通話
カメラ
外部出力
その他

タッチキー入力

iPhoneみたいに結構めんどいのではないか?というのが、懸念として大きかったのですが、案外入力しやすいです。
というより、横に倒してキーボードを大きくすると、本当に普通のキーボードの8割くらいの速度で打てます。
縦の場合、持って両親指二本でタイプする感じですね。

ipad-key

メールを打ったり、メモを書いたりというときにはあまり不自由しません。
ただ、プログラミングといった細かい文章作業は難しいように思えます。
また、十字キーもないので、文章の途中選択、コピー&ペーストはiPhoneと同じくめんどい。。。

メール/カレンダーチェック

・メール
メールのリーダーもデフォルトで入ってるものがあります。
ローカルに保存したい(オフラインでも見たい)場合はこちら。

しかし個人的に、圧倒的にGmailをWebで見た方が使いやすい。
メールのスレッドもちゃんと折りたためたり、開いたりできますし。
メール操作はほとんど不満がありません。

ipad-mail

・カレンダー
こちらは逆に、Web版のGoogle CalendarのUIはクソでした。
なぜか、週での表示ができない。

カレンダーはiPad付属のカレンダーを使っています。
こちらのテクニック↓を使えば、複数のカレンダーを表示できます。
カレンダーも不満無し。
» iPadで複数のGoogleカレンダーを表示させる方法

ipad-cal

Webブラウジング

基本的に、普通のWebブラウザと変わらない感じです。
ただ、タブ(?)が9個までしか開かず、それ以上開こうとすると上書きされてしまうので注意が必要。
操作性、表示は全く問題ありません。
縦で表示するといくらか縮小されますが、横で表示するとほとんどのサイトが等倍で表示されます。

ipad-safari

また、PCで見ていて「あとで読む」記事をiPadに送る、という操作も便利です。
Evernoteでそういうプロセスがあるそうですが、完全にオフラインの状態だと中々開かなかったりしてちょっと不満。
そこで私は、pdfdownloadというサイトで、指定のサイトをPDF化してiPadに入れています。
結構めんどいっちゃめんどいですが、じっくり読めるので長文ブログやニュースは全部PDFに落としています。

本・雑誌・新聞

iBookやKindleアプリを使って、英語の本は基本的に読めます。
PDF化した本も、PDFリーダーアプリを使って読むことができます。
また、Wall Street JournalやTime、New York Timesなど、メジャーなアメリカの雑誌も購読することができます。

日本の場合、i文庫というアプリを使って青空文庫という、著作権切れの本を自由に読むことができます。
日本の雑誌はまだ見たことがありませんが、新聞では、産経新聞がiPhoneアプリを出ていて、それを2倍拡大することで結構読みやすくなっています。
追記: 日本の雑誌も読めるようになりました。 » 今のiPadでできること・できないこと2

ipad-mag

iPadアプリ

現状あまり良質なアプリがあるとは言えない状況です。
電子書籍(雑誌)、ゲーム、メモ帳(手書き可能)などがやはり主流となっています。

また、ややこしいことに、iPadアプリをiTunes経由で見るには米国アカウントが必要で、さらに米国アカウントだとクレジットカードを登録できないため、米国でしか見れない有料アプリは買えない状態です。
例えば、各ドキュメントアプリのKeynoteやNumbers(Excelのような表計算アプリ)も米国でしか見れないため、落とせない。。。
ただ、普通の有料アプリは、日本のアカウントでも検索してダウンロードすることができるので、重宝しています。
この問題は、日本発売と同時に解決されることでしょう。

こちらのサイトから、各カテゴリ毎のアプリランキングを見ることができます。
» iPadアプリのカテゴリ別ランキングリスト – もとまか日記

音声通話

iPadには電話機能は付いていませんが、マイクとスピーカーが内蔵されているので、Skypeアプリ(iPhoneアプリ)を使えば不自由なく音声通話も行えます。
この際なので、Skypeのクレジットも買ってしまいました。
20円/分くらいで携帯電話にも通話ができます。
ただ注意が必要なのが、3G回線ではSkypeは使えないようです。

» Skype – Skype 日本語ブログ – Skype for iPhoneの3G通話対応について

カメラ

標準装備はされていません。
なんか上部にMacBookと同じタイプのカメラっぽいのが付いているんですが・・・
いずれファームウェアかなんかがUpdateされると使えるようになるのか?
追記: 輝度センサーらしいとのこと。

ちなみに、Camera for iPadというアプリを使えば、iPhoneで取った写真・動画を無線経由でiPadに表示する、ということはできるみたいです。

外部出力

iPadのオプションツールとして、VGAアダプタがあります。
要はiPad内のコンテンツを、出力するために必要なコネクタです。
ただ、出力には注意が必要。
基本的に表示できるコンテンツは、以下に限られるようです。

 ・ビデオ、Youtube、Safariで表示しているビデオ
 ・写真(スライドショー)
 ・Keynote
 ・Safari上のWebページ(アプリ使用)

» iPad:iPad Dock Connector – VGA アダプタの互換性について

その他

・ドキュメント編集:
OfficeのWord、Excel、Powerpointのようなアプリを、AppleがPages、Numbers、Keynoteというアプリで、それぞれ$10くらいで販売しています。
ただ、アカウントの問題からまだ購入できていません。
Google Docsは問題なく扱えます。

・印刷
デフォルトの機能としては、まだ無いようです。
下記記事を見るといずれ実装されるみたいですが・・・
とは言え、ネットワーク経由で印刷できるアプリはいくつかあるみたいです。
» アップルのS・ジョブズ氏、「iPad」への印刷機能実装を肯定か–米報道

・ラジオ
radikoというiPhone用のアプリを使って、FMラジオも聞くことができます。
バックグラウンドでの再生もできて便利。(Safariのストリーミングページを立ち上げる)

まだまだ未知数なところが多いiPad。
日本発売が楽しみですね。

続きを書きました→今のiPadでできること・できないこと2

8maki IT, proposal, サービス