2015 年 8 月

Volume 30 Number 8

働くプログラマ - MEAN あれこれ: はじめに

Ted Neward | 2015 年 8 月

Ted Neward特にコミックが好きな方はご存知でしょうが、「パラレル ワールド」が大ブームです。今回、明らかにこのパラレル ワールドに踏み込んでいます。このマガジンを読み始めた頃、本誌は「Microsoft Systems Journal (MSJ)」と呼ばれていました。記事の主力言語は、C++ と Visual Basic でした。基盤となるテクノロジ プラットフォームは、C++ のようなアンマネージ言語と Visual Basic のようなマネージ言語の両方で記述されたマネージ プラットフォーム (COM) でした。主力の OS は明らかに、間違いなく、紛れもなく、断言しますが Windows でした。Windows 3.0、3.1、Chicago、NT と変わりはしましたが、Windows であったことは間違いありません。

現代に目を向けましょう。もはや「マイクロソフト ワールド」でないことは明らかで、「マイクロソフト ワールド」の中に身を置いているわけでもありません。Java や Ruby など、マイクロソフトの「競争相手」のことはしばし忘れましょう。マイクロソフトは既にこうした言語と手を結び、次世代の Microsoft Azure プラットフォームではそれらをネイティブにサポートします。C#、Visual Basic、F# など、マイクロソフトが "所有" する言語についても忘れましょう。これらはすべてオープン ソースになっています。さらに Web フレームワークを備え、データアクセス フレームワークも備えています。そして Visual Studio の新バージョンは、Android エミュレーターを実装する予定です。

マイクロソフトはこれ以上変わらないだろうと考えていた矢先、同社はまったく毛色の違うものに手を出し始めました。本稿執筆中に、マイクロソフトは Android ディストリビューターの Cyanogen との提携を発表しました。今度はどのパラレル ワールドへの扉を開いたのでしょう。

コミックの世界ではヒーローがパラレル ワールドに足を踏み入れると、新しい世界を受け入れるための時間が必要だったり、よそ者だと気付かれる危険があったり、時にはサナトリウムに閉じ込められることもあります。サナトリウムに魅力を感じない限り、その新しい世界を受け入れなければなりません。

MEAN について

Node.js に話を移しましょう。もっと正確に言うと、今人気が高まっている Node.js プラットフォーム向けソフトウェア スタックの 1 つ、MEAN (MongoDB、Express、AngularJS、Node.js) の話をしましょう。新しいテクノロジ ワールドでは、MEAN がまたたく間に中心的存在の 1 つとなっています。マイクロソフトが Azure で Node.js と MongoDB をサポートしていることはマイクロソフト開発者なら誰でも知っています。どちらもオンプレミスの標準 Windows コンピューターで簡単に使用できることは言うまでもありません。

MEAN を使用する方法には、Visual Studio を含め、いくつかあります。まずは「Node 方式を受け入れる」ところからです。使用するのは、テキスト エディター、コマンド ライン、および (手元にあれば) Mac という、Node 式ツールの推奨セットです。これらを使うところから始めます。コマンドライン コマンドの大半は簡単に Windows 風に調整できますが、異なるものです。

このパラレル ワールドに深く入り込む前に、主な役割を果たすものを見ておきましょう。MEAN スタックとは、4 つのものが揃って「完全なスタック」を形成し、フロント エンド、バック エンド、ストレージをカバーします。AngularJS がフロント エンドです。これは単一ページ アプリケーション Web クライアント フレームワークを提供し、UI 用に MVC (モデル - ビュー - コントローラー) の抽象化と双方向バインドを完備します。AngularJS はすべてフロント エンドに常駐しますが、通信相手となるバック エンドが必要です。通常、このバック エンドには Web API 呼び出しを使用します。これらは一部では RESTful なエンドポイントとしても知られていますが、REST の内容にについての説明まで踏み込まなければならないので、今のところは Web API ということにしておきます。

この Web API エンドポイントは、Node.js プラットフォームの上位に位置する Express フレームワークを使って構築されます。このしくみは、ASP.NET パイプラインと Microsoft .NET Framework の上位に位置する ASP.NET Web API の関係とほぼ同じです。こうしたバックエンド Web API には確実にストレージ用のデータベースが必要になるため、ここで MongoDB の出番となります。MongoDB は組み込みの共有と Map-Reduce 機能を備えたスキーマレスのドキュメント指向データ ストアです (これは、スキーマを使用するリレーショナル指向のデータ ストアである SQL Server とは対照的です)。

既にお気づきかもしれませんが、ここまでの 3 つのパーツ (フロント エンド、バック エンド、ストレージ) は実際どれも問題なく置き換えることができます。たとえば、AngularJS に ASP.NET Web API と対話させ、ASP.NET Web API に MongoDB と対話させることは容易に想像できます。あるいは、フロント エンドに Windows フォーム アプリケーションを使って HttpClient に Node.js と対話させ、Node.js に MongoDB と対話させることもできます。ほかにも、AngularJS、Node.js、SQL Server という具合に連携させることも可能です。

この 3 つのコンポーネントは、フロント エンドがバック エンドとの対話に HTTP (または同様のプラットフォーム ニュートラルなプロトコル) を使用している限り、どれも簡単に "取り替えが可能" です。バック エンドには選択したデータ ストアと通信させるドライバーも必要です。

Node.js のインストール

単刀直入に言って、Node.js のインストールは実に簡単です。以前から Azure SDK をインストールしている開発者は Node.js もインストールされており、ブートするために、おそらく既に PATH 上に存在しています。Node.js がインストールされていることを確かめるには、コマンド プロンプトで「node」と入力するだけです。Node.js がインストールされていると対話型シェルが起動されます。このシェルは Ctrl キーを押しながら C キーを押すことで終了できます。

入手したばかりの新品状態の Windows コンピューターには、Node.js をインストールする必要があります。これは新品の Mac OS コンピューターでも同じです。Windows で Nodejs をインストールする場合、Azure SDK を入手する方法か、Node.js の Web サイトにアクセスして Node.js 用の MSI インストーラーを使用する方法のどちらかベストです。後者は、Node.js が既定で PATH 上に設定されます。Mac OS 向けのインストーラーも存在しますが、Mac では、Homebrew という別のパッケージ マネージャーをインストールするアプローチがお勧めです。。このパッケージ マネージャーは brew.sh (英語) からダウンロードできます。インストールが完了した Homebrew は、Node.js も含め、Mac に何かをインストールする際に頼れるツールになります。

Homebrew はシンプルな「調整済みインストール ノード」で、Node.js のすべての構成要素を取り出し、それぞれを正しい位置にインストールします (そのためにルート アクセスする必要はありません)。その後、Node.js を暗黙のうちに PATH 上に設定します。前述のように、インストールが正しく行われたかどうかは、コマンド ラインに「node」と入力することで確認できます。Node.js を起動すると、今までにインストールしたどのユーティリティよりも控えめな応答が返ってきます (図 1 参照)。

問題なく動作中の Node.js
図 1 問題なく動作中の Node.js

Ctrl キーを押しながら C キーを押す操作を 2 回繰り返すと、Node.js が終了します。始まりましたが、これで終わりではありません。

NPM のインストール

.NET ワールドにあるのは NuGet です。Ruby ワールドには gem があります。そして、Node.js ワールドには Node パッケージ マネージャーがあります。これは npm と呼ばれ、Node.js 自体の一部としてインストールされます (実は npm とは、コマンド ラインから実行する Node. js の小さなアプリケーションです)。Node.js をインストールしていれば他に何もする必要はなく、コマンド ラインに「npm」と入力すれば 図 2 のように npm が起動します。

Node パッケージ マネージャー
図 2 Node パッケージ マネージャー

最もよく使うコマンドは、「npm install」と「npm update」の 2 つです。それぞれのコマンドは、1 つ以上の npm パッケージ名をパラメーターとして受け取ります。パッケージをインストールするとき、NuGet と同様に、npm は npm の Web サイトからパッケージをダウンロードします。その後、ハード ドライブ上の現在のディレクトリにローカル インストールします。例として、空のディレクトリに debug パッケージをインストールするように npm へ指示してみます (図 3 参照)。

npm パッケージのインストール
図 3 npm パッケージのインストール

npm ツールは、debug パッケージのバージョン 2.1.3 と、それが依存している ms パッケージのバージョン 0.7.0 のダウンロードが順に完了したことを示す応答を返しています。重要なのは、どちらのパッケージも node_modules というローカル ディレクトリにインストールされている点です。このディレクトリは、npm で使用するすべての Node.js パッケージの「ローカル リポジトリ」です。なんらかの理由から (共有の場所に存在する node_modules ディレクトリに) npm パッケージをグローバルにインストールする場合、「npm install –g debug」と入力します。

現在のディレクトリに上記のパッケージをインストールしたら、Node.js で "require" を呼び出してそのパッケージを参照します。"require" は、パッケージ名を表す文字列を受け取ります。Node.js は、現在のディレクトリの直下にある node_modules ディレクトリにその名前のパッケージがあると想定します。したがって、helloDebug.js というファイルにある以下のコードは、debug パッケージを読み込み、パッケージを同名の変数 (Node.js の規則) に代入して、デバッグ情報を生成するためにその変数を使用してデバッグ ストリームを取得します (System.Diagnostics.Trace に似ています)。

var debug = require('debug')('hello');
debug("This should never appear unless DEBUG=hello");

ここで上記のコード (node helloDebug.js) を実行すると、DEBUG という環境変数に "hello" が設定されていれば、デバッグ呼び出しがコンソールに出力されます。と設定されていなければ、何も表示されません。Mac または Unix システムでは、node コマンドの直前に代入をプレフィックスとして置くことで、その Node.js の実行に対する環境変数を一時的に設定できます (図 4 参照)。

ようこそ、デバッグ ワールドへ
図 4 ようこそ、デバッグ ワールドへ

簡単な説明でしたが、Node.js 開発のしくみを感じられたと思います。require 呼び出しはローカルの node_modules ディレクトリからパッケージを読み込むことを理解するのが最も重要です。require が失敗する場合は、ローカルのパッケージが破損しているか、パッケージがインストールされていないかのどちらかです。インストールした npm パッケージを追跡する方法について次回説明するので、このことは忘れてもかまいません。

念のため、すべての Node.js コードは JavaScript です。JavaScript が苦手ならば、復習する良い機会です。その手始めとして Douglas Crockford 著『JavaScript: The Good Parts: 「良いパーツ」によるベストプラクティス』(O’Reilly Media、2008) がお勧めです。

MongoDB のインストール

ローカルな開発システムに MongoDB をインストールするのも実に簡単です。MongoDB の Web サイト (mongodb.org、英語) から自身のシステムに合った .zip ファイルをダウンロードして解凍した後、PATH 上にそのバイナリを配置します。MongoDB は、MongoLab (mongolab.com、英語) など、複数の "サービスとしての" 風に使用することもできます。MongoLab は、0.5 ギガ未満のデータ読み込み層を永久無料で提供しています (大半の初歩的な目的には十分な量です)。ローカルに MongoDB をインストールするか、MongoLab アカウントを作成します。

MongoDB のダウンロードには "mongo" コマンドライン クライアントも含まれています (スタイルとスコープは SQL Server のコマンドライン クライアントに似ています)。これはシェル スクリプトなどから MongoDB データベースにアクセスする際に役立ちます。GUI を中心とするアプリケーションを作成する場合、このワールドには無料の MongoDB GUI ツールがいくつかあります。Mac 向けには RoboMongo、Windows 向けには MongoVue がお勧めです。

既定では、Mongo はローカルで動作していることを前提とします (サーバーは "localhost" で、既定のポートは 27017 です)。Mongo に詳しくない方は、以前のコラム「MongoDB と NoSQL を試す」(msdn.microsoft.com/magazine/ee310029) を参照するか、オンライン上に何万もある MongoDB に関する記事を呼んで数分間を復習に費やすことをお勧めします。資料の検索には Bing が便利です。

ローカル マシンで MongoDB を動作させるのも簡単です。MongoDB の bin ディレクトリが PATH に設定されているとすると、「mongod」と入力するだけです。この場合、データを保存するには "/var" ディレクトリに書き込むことができると想定されます。普通はこのような想定は行わないので、引数 "--dbpath" (ハイフンが 2 つある点に注意) を渡して、データを保存する任意のディレクトリを指定します。

MongoDB の Web サイトでは、MongoDB を Windows サービスまたは *nixプラットフォーム上のデーモンとして動作させる方法も説明されています。ただし、MongoDB をフォアグラウンドで手動で起動すると、発生した MongoDB のログが画面に表示される様子を確認できるというメリットがあります。

まとめ

今回はこれ以上書き進めるスペースがありませんが、手始めに必要で、重要だと思われる部分は紹介しました。次回は、サーバーの HTTP エンドポイントの話から始めて、Express を使用し、Node.js アプリケーションを構造化する方法と、Azure で実行するためにエンドポイントを構築する方法について詳しく解説します。その開発の一環として Node.js アプリケーションが使用するツールもいくつか取り上げる予定です。ですが今のところは、

コーディングを楽しんでください。


Ted Neward は、コンサルティング サービス会社の iTrellis で CTO を務めています。これまでに 100 本を超える記事を執筆している Ted は、さまざまな書籍を執筆および共同執筆していて、『Professional F# 2.0』(Wrox、2010 年、英語) もその 1 つです。F# MVP であり、世界中のカンファレンスで講演をしています。彼は定期的にコンサルティングを行い、開発者を指導しています。彼の連絡先は ted@tedneward.com (英語のみ) です。ブログを blogs.tedneward.com (英語) に公開しています。