2013-12-08

browserify を使い始めるためのファーストステップ 2013 冬

browserify は、ブラウザ JavaScript のためのコードを、Node スタイルのコード(Node 向けの JavaScript コードを書いているかのような形)で記述しておいて、ブラウザ上で利用できるような Javascript コードとして出力してくれるツール。
require() で利用しているモジュール群をすべてアナライズして、それらモジュールコードまですべて都合よい形で同梱してくれる。

リリース当初(3年くらい前)は Node で HTTP サーバを建ててブラウザ用 Javascript コードを返すような仕掛けから始まったはずで、そこから静的ファイルを出力する仕組みが追加されて、現在ではむしろ後者の方がメイン扱いになっている感じになっている。
そうなった背景として、Grunt の登場でその辺りの機能が有効的に参照利用できるようになったり、実際に Grunt を使ってのビルド環境がカジュアルに行われるような土壌が出来上がったからというのが大きいのかもしれない。

今から browserify の利用を始めるべく browserify 側の情報をみても、低レベルなところが中心で戸惑ってしまい躊躇してしまうかもしれない。どんなものかを知るために動かすならば、簡単に利用できる Grunt 経由側のものを知ってしまったほうがよいと思う。
ということで、簡単なサンプルを紹介。

今回利用するファイルとツリーの状態は以下の通り。

@ /
├─ Gruntfile.js
├─ package.json
├─ index.html
├─ main.js
└┬ lib/
├─ foo.js
└┬ bar/
└─ baz.js
view raw tree hosted with ❤ by GitHub


------------

まずは環境作りのための package.json。
モジュールは grunt と、grunt で browserify するための grunt-browserify。
あとはサンプル用スクリプトで使うモジュール例として async.js を指定している。

{
"private": true,
"dependencies": {
"async": "0.2.9"
},
"devDependencies": {
"grunt": "~0.4",
"grunt-browserify": "*"
},
"optionalDependencies": {},
"engines": {
"node": ">= 0.8.0"
}
}
view raw package.json hosted with ❤ by GitHub


記述後、npm install を実行する。

続いて、ブラウザ上で動作させるための JavaScript コードを Node スタイルで記述。
以下のサンプルでは、core モジュールと npm で入れたモジュールを require() で利用しつつ、エントリポイントとなるスクリプトから自前のファイルを require() して読み込んでいる。

var foo = require('./lib/foo.js');
var content = document.getElementById('content');
foo.run([ 3, 10, "foo", "bar", 42 ], function (err, results) {
if (err) throw err;
results.forEach(function (r) {
content.innerHTML += ' ' + r;
});
});
view raw main.js hosted with ❤ by GitHub

var async = require('async');
var baz = require('./bar/baz');
exports.run = function (values, callback) {
async.map(values, function (v, next) {
next(null, baz(v));
}, callback);
};
view raw foo.js hosted with ❤ by GitHub

var format = require('util').format;
module.exports = function (v) {
if (typeof v === "string") {
return format('%s OK.', v);
} else if (typeof v === "number") {
return v * 10;
} else {
return v;
}
};
view raw baz.js hosted with ❤ by GitHub


browserify を実行する Gruntfile.js を用意。

module.exports = function(grunt) {
var pkg = grunt.file.readJSON('package.json');
grunt.initConfig({
browserify: {
dist: {
src: 'main.js',
dest: 'build.js'
}
}
});
Object.keys(pkg.devDependencies).forEach(function (devDependency) {
if (devDependency.match(/^grunt\-/)) {
grunt.loadNpmTasks(devDependency);
}
});
grunt.registerTask('default', [ 'browserify' ]);
};
view raw Gruntfile.js hosted with ❤ by GitHub


grunt を実行すると、build.js が出力される。
中身を覗いてみると、browserify が頑張って構築してくれたブラウザ用 JavaScript コードとして、先ほど自分で記述したコードやアナライズした結果同梱する必要ありと判断された util.fomat や async.js などが含まれている。

適当な HTML ファイルを用意して、この build.js を script タグで読み込むようにする。

<html>
<head>
</head>
<body>
<div id="content"></div>
<script src="build.js"></script>
</body>
</html>
view raw index.html hosted with ❤ by GitHub


実行デモ


先ほど browserify v3 がリリースされたばかりで、記念的な感じで。

上記例は v2 系を動かした結果 (grunt-browserify がまだ v2 を使うため)  なものの、恐らくただ単純に使う分には v3 以降も違いなくいけるんじゃないかと(個人的な期待)。

2013-02-19

MongoDB イン・アクションを頂きました


2012年末、勉強会後の懇親会で玉川竜司さん (@tamagawa_ryuji) と初めてお会い/お話することがあり、その際に話の流れで

「NodeでのストレージにはMongoDBを使う事が多くて触ってるんですけども、小規模なら簡単でも、中大規模になると途端に難しくて…」

みたいなことを言っていたら、

「今度 MongoDB の翻訳本が出るから、これもなにかの縁だし送ってあげるよ」

と言われ、そんなこと初めてだし、わーそうなったらいいなあなどと思っていたら、本当に郵送で送っていただきました。やたー!



……などと、年末の話だったにも関わらず、年明け早々いろんなことがあったせいで今頃のエントリで大変申し訳ございません…。

 
 

ということで、MongoDB イン・アクション (http://www.oreilly.co.jp/books/9784873115900/) の紹介です。
海外ではいくつか出ている MongoDB の書籍ですが日本では単独でのものがなく、これまで MongoDB の日本語情報といえば利用者によるブログ、勉強会、および公式ドキュメントでの翻訳を頼りに進めてきていた感じでした。(でもそれらが比較的充実していたり、はまりやすいポイントをいち早く紹介されていたりと、比較的恵まれた環境だったと思う)

MongoDB イン・アクションでは、MongoDB の基本的なお話、特徴、および利用法について1から紹介していきます。
中身は大きく3つの部に分かれていて、「1. はじめての方のための MongoDB」「2. ショッピングサイトシステムを実例にした利用方法の紹介」「3. 本格運用する際に抑えておくべき要素」となっています。

1, 2 では所々 RDB と比較して「RDB ならばこうだっただろう、MongoDB ではこうするんだ」といった具合に解説が入るので、既に RDB を利用している人であれば、MongoDB におけるアプローチ方法や差異などを把握しながら読んでいく感じになります。リレーショナルなデータであったものについて、RDB で正規化していた事に対して MongoDB での対非正規化であったりそれに伴う設計の流儀などが、2 のショッピングサイトシステムを例として紹介されるので、2 までを読み終えた時点で、簡単な CRUD アプリケーションならば作れてしまう程度に知識はついているんじゃないでしょうか。

3 では、データベースを扱っている人ならば気になるであろう、クエリ最適化(インデックスの話)、レプリカ、シャーディング、バックアップとリストアなどを扱っています。
冒頭に書いているとおり、MongoDB は簡単なデータ構造で規模も小さいアプリケーションならば本当にシンプルに扱えるものの、取り扱うデータが大きくなったり構造が複雑になったりすると知っておかなければならない話が色々あったりします。特にクエリ最適化とシャーディングあたりが重要(そしてはまりやすい)だと思うんですが、きちんとそのあたりが構築例、動作例含めて紹介されているのが良い感じです。

 

全体的にテンポ良く読み進めていける本です。目的に対するクエリ例を逐一紹介してくれるのが嬉しい。
ちょっとだけ気になった点としては「突然紹介され始める○○」みたいなのが何回かあったような。でも変な感じではないので大丈夫。

完全に知識がつくまで、これを見ながらシステム構築する感じなりそう。



以上、MongoDB イン・アクションの紹介でした。
玉川さん、およびオライリージャパンさん本当にありがとうございました。

2013-02-06

新しい Windows PC を組んで Win8 環境にした ー 2013春


最近パソコンの普段使いは完全に Mac に移っているものの、Windows マシンはゲームのために一応持ち続けている。

もうずいぶんと昔に買ったマシンパーツから入れ替えしながらやってはきていたけど、それも 2009年1月 (Warhammer Online のためにビデオとCPUを変えた) を最後に進化は止まっていて、壊れた電源だけは変えたものの、性能的にはもうずいぶんと置いてけぼり状態だった。OS も未だ Windows XP だった。

で、シムシティの新作がこの春に出ることと、近頃の為替に比例してパーツの値段がモリモリ上がっていっているのを眺めていてもう我慢ならん!ということで久々に一機買いしてみた。
  • CPU: Intel Core i7 3770
  • Cooler: ENERMAX ETS-T40-TB
  • RAM: 8GB x 2
  • Mother: ASUS P8H77-V
  • GPU: 玄人志向 GF-GTX660-E2GHD/DF/OC
  • Storage: Intel SSD 335series 240GB
  • Case: Corsair Obsidian 550D

しめて 89,796 円。電源だけ流用。
DVDドライブは、必要なときにUSB接続 (IDE/SATA変換) すればよいと思って買ってない、というか最近はマザーに IDE 端子ついてないんだね。おじさんびっくり状態。
そのくせにデカいケース買ってどうすんの状態だけども、ケースはメンテナンスしやすいに越したことはない。最近の良いケースは本当によく出来ている。これまでの苦労が嘘のようだ。
 

OS は Windows 8。さすがにこの時期から 7 はないだろうということで。(8 が良いものかどうかは置いといて)

以下、 Windows 8 導入後に行ったときの作業メモの写しを紹介。
前述のとおり、メインは Mac で Windows はゲーム用途ということなので、実はそこまでやる事はない。


キーカスタマイズ

利用している Real force にあわせて、レジストリを操作することで低レベルでキーポジションを変更する。

参考:

HKEY_LOCAL_MACHINE/System/CurrentControlSet/Control/Keyboard Layout
という領域に、新たに Scancode Map というバイナリ値を新規作成。

以下、バイナリ値として次のように設定した。
今回は Ctrl を A の左に、および ESC と半角/全角を入れ替えるというシンプルな変更に留めている。

0000 0000 # ヘッダ
0000 0000 # ヘッダ
0400 0000 # 以下に続くエントリー数を定義。終端のNULLのぶんも含める
1D00 3A00 # 1. CapsLock を Ctrl に
0100 2900 # 2. 半角/全角 を ESC に
2900 0100 # 3. ESC を 半角/全角 に
0000 0000 # 4. NULLによるターミネータ


ショートカットキー

Emacs のショートカットが欲しいので xkeymacs をいれた。


近年ついに64bit版の対応がなされた ( http://d.hatena.ne.jp/kfujieda/20110428/1303924737 )  とのことで、本当に有り難いお話。

XP の頃は窓使いの憂鬱を利用してキー入れ替えやショートカット変更をしていたが、設定ファイルをゴリゴリ書くほどのカスタマイズはもうしないだろう(テキストを書くような作業を Windows に求めていない)ので、のどか ( http://www.appletkan.com/nodoka.htm ) や yamy ( http://sourceforge.jp/projects/yamy/ ) の採用は見送った。ブラウザのアドレスバーで C-a や C-h が効いてくれればそれでよい。


Dropbox

Dropbox のサイトからプログラムをダウンロードしてセットアップ、既存アカウントを設定。気づいたら同期完了していたので出来るやつだ。


Skype

for Windows8 を Windows Store から落とせと言われたが、レビューを見る限り使い勝手が悪いことばかり書いている。
なによりストア利用のためのアカウントを(多分持っているけど)用意するのが面倒だったので、別プログラムとして Skype サイト上で用意されていた Windows Desktop 版というものを入れた。いつもの Skype だった。


Steam

Steam のサイトからプログラムを落としてセットアップ。新しいマシンでの初ログインではメールによる確認キーを求められる。一手間かかるけども安心できる。
早速 Civ5 をいれて DirectX 11 版で起動、その速度をみて満足する。(ちゃんと遊んで、八方美人具合に度が過ぎたのかお隣の大国から喧嘩売られて散る)


Diablo3

いれてない。