働くプログラマ

Oak 入門

Ted Neward

ここ 50 年の業界の変化には興味深いものがあります。1960 年に大学を卒業した学生がプログラマを仕事にするのはごく当たり前のことでした。その経歴はパンチ カードに記入して、なんと 4K のアクティブ メモリを搭載する (オンライン ストレージがない) 1 部屋サイズのコンピューターのプログラミングを行うことから始まりました。メインフレームでは COBOL などのプログラミング言語が台頭し、その後 IBM PC などのミニ コンピューターが登場します。GUI など、UI テクノロジの変化を体験し、ノート PC が標準コンピューターとして選ばれるようになります。インターネットや Web が誕生し、タブレットやモバイル デバイスが消費者のコンピューティング デバイスとして選ばれるようになった現在、定年を迎えます。

しかし、業界の限られた分野の中でも同じように変化は起きます。テクノロジやドメインのほんの小さな分野でも同種の "革新" が起きています。そのように迅速に変化したテクノロジ分野の 1 つがユビキタス Web サイトです。Web サイトは Perl や C 言語で記述された CGI (Common Gateway Interface) スクリプトから始まり、ISAPI などの Web サーバーの拡張機能、ASP などの "ページ指向" ツール、このようなページ指向ツールを支える基盤を強化した (ネイティブ コードではなく CLR でサポートされる) ASP.NET へと変化しました。さらに変化は続き、このようなツールで選ばれる言語は、"静的に型指定" される C# などから、"動的に型指定" される Ruby、Python などに移行しています。ただし、動的言語プログラミングのデメリット (コンパイラが一般的な間違いを見つけられない) の深刻度と、静的言語のオーバーヘッド (コンパイルのプロセスと型システムに関する操作の必要性) との比較検討について、激しい議論が交わされています。この議論に決着がつかないため、一部の開発者は両方のメリットを生かす方法を求め始めています。

Oak は、Amir Rajan (Twitter: @amirrajan、Web: amirrajan.net、どちらも英語) が作成したオープン ソース プロジェクトで、前述のように両者のメリットを活かす試みの 1 つです。Oak は、Visual Studio 2010 で導入された "dynamic" キーワード/型と Dynamic Language Runtime (DLR) を使用して C# 内で動的機能を活用し、Ruby on Rails などのシステムの生産性のメリットを得ながら、静的な型チェックや検証を提供する言語 (C#) のすべての特徴を保持します。

セットアップ

Oak は NuGet パッケージとして利用できますが、開発者は使用する前に理解しておく必要があることが 1 つあります。それは、Oak は "単なる" ライブラリではなく、開発ライフサイクルの 1 つのアプローチであることです。Oak では、従来の ASP.NET MVC 開発者が使用していたのとは異なるアプローチでアプリケーションをビルドします。たとえば、非常に迅速なフィードバックを重視することは、Oak でもバックグラウンドで継続的にビルドする (少なくともそのように見える) ことを希望することを意味します。つまり、.cs ファイルを保存するだけで結果をブラウザーで確認でき、明示的な "ビルド" 手順は必要がないことを意味します (Oak で実際にこれを実現するのは難しくありません)。Oak 開発の最終結果は "従来" の ASP.NET アプリケーションになるため、運用担当者は以前と異なるアプローチでアプリケーションがビルドされていることにまったく気付きません。

ツール

開発ライフスタイルの調整の一環として、Oak の使用を開始する際に、NuGet をダウンロードするだけでなく、他のツールをいくつかコンピューターにインストールして使用するようにします。このようなツールの 1 つが IIS Express です。Visual Studio LightSwitch を使用した経験がある Microsoft .NET Framework 開発者の多くは、既にこのツールをインストールしています。もう 1 つは Ruby です。ビルド自動化の一部として、またツールとして使用します。開発完了後、Ruby は運用サーバーに必要なくなりますが、Oak で開発を開始する際および開発中は必要です。本コラムの執筆時点は、Ruby バージョン 2.0 のリリース直後ですが、バージョン 1.9 でも同様にうまく機能します (個人的には、だれもまだ使ったことがない Ruby バージョン 2.0 は奇妙なバグに出会うかもしれないので不安があります)。最後に、迅速な対話型の開発を行うために、バックグラウンドでの継続的コンパイル システムのメッセージを Oak から表示できるように、バックグラウンドでのビルドが成功または失敗したといったイベントが発生したときに、(MSN Messenger などを使用して) デスクトップに短いメッセージをポップアップする通知システムとして Growl for Windows を用意します (Growl API については、うまく使用できると便利なツールなので、今後のコラムで取り上げる予定です)。

これらのツールをインストールしたら、もう 1 つ手順が必要です。Oak が使用する Ruby スクリプトは、Ruby パッケージ マネージャーの gem 経由で利用できるパッケージをいくつか必要とします (Ruby gem は、NuGet だけでなく、Node npm、Haskell Cabal などの言語パッケージ マネージャーの影響を多く受けています)。PATH 上の Ruby を使用してコマンド プロンプトを起動し、コマンド ラインから次のコマンドを実行します。

C:\Projects\Exploration\Oak\Blog>gem install warmup

実際、warmup gem (bit.ly/15e51Lx、英語) は Oak プロジェクトを開始する方法で、Oak で必要なすべての主要動作パーツを含むテンプレートを取り出します。

これまで使い慣れた [ファイル]、[新規作成]、[プロジェクト] を順にクリックする長い手順が必要なくなります。

Oak の開始

新しい Oak プロジェクトに着手して稼働するには、次のように、コマンド ラインから warmup gem を使用して、ホーム オンラインからシード テンプレートを取り出します。

C:\Projects\Exploration\Oak\Blog>warmup https://github.com/amirrajan/loam Blog

このシード プロジェクトをコンピューターに取り出すと、必要最低限の機能を備えた "ブログ" 実装が含まれています (ブログを引用符で囲んだのは、これがブログと呼べるならば、ドリブル、シュート、ダンクができなくても、NBA バスケットボールへの情熱は冷めないことになります)。プロジェクトの取り出しに続く一連の初期処理が終わったら、ダウンロードした Blog.sln という Visual Studio ソリューション ファイルを開きます (快適な Visual Studio 環境が表示されます)。次に、warmup コマンドを実行したコマンド ラインから次の 2 つのコマンドを実行します。

C:\Projects\Exploration\Oak\Blog>rake
 C:\Projects\Exploration\Oak\Blog>rake server

Rake が Ruby の "ビルド" ツールです。長年使用されてきた C/C++ ビルド ツールの "make" とほぼ同様に機能し、ターゲットに応じて一連の手順を実行します。最初のコマンドはソリューションをビルドします。2 つ目のコマンドは IIS Express ディレクトリにコードを配置し、IIS Express を起動するように Rake に指示します。これにより、(既定の) ポート 3000 で着信する HTTP 要求を受け入れる準備ができます。

Rakefile がサポートするターゲットの完全な一覧を確認する場合は、"rake -T" コマンドを呼び出すと、図 1のようなコマンド ラインの出力が表示されます (注: タスクごとにすべてのヘルプ テキストを確認する場合、"rake -D" を使用することで、ターゲットのより長い完全なリストを確認できます)。

図 1 コマンドラインからのサポート対象の Rakefile ターゲット一覧

C:\Projects\Exploration\Oak\Blog>rake -T
 rake build                  # builds the solution
 rake default                # builds and deploys website to directories iis...
 rake deploy                 # deploys MVC app to directory that iis express...
 rake export                 # if you have the nuget package oak installed, ...
 rake reset                  # if you have the nuget package oak installed, ...
 rake sample                 # if you have the nuget package oak installed, ...
 rake server                 # start iis express for MVC app
 rake simulate_load_balance  # simulate the web application as if it were lo...
 rake stop_nginx             # stops nginx
 rake sync[file]             # synchronizes a file specfied to the website d...
 rake tests                  # run nspec tests
 rake ui                     # run ui automation tests
 rake ui_tests               # runs ui tests (without building)

IIS Express を起動して実行したら、sidekick という継続的ビルド ツールを起動します。

C:\Projects\Exploration\Oak\Blog>sidekick

sidekick は実際にはコマンドライン C# コンパイラを使用するバッチ ファイルです。このバッチ ファイルは、ファイル システム監視ツールを設定する小さな .exe プログラム (sidekickapp.exe) をコンパイルします。このツールは、ディレクトリ ツリー内のファイルが変更されたかどうか確認し、ソース ファイルが変更されていれば MSBuild をトリガーしてプロジェクトを再コンパイルします (Glenn Block の最新の実験では、Roslyn を使用して C# REPL 環境を作成しますが、ScriptCS を使用しても同じことを実現できる可能性が高いようです)。

ここで少し本題と外れます。図 1では、Rake で "rake simulate_load_balance" コマンドを実行するオプションが示されています。このコマンドは、名前が示すように単純なラウンド ロビン ロード バランサーの背後でアプリケーションが動作する方法をシミュレーションします。そのため、仮想マシン (VM)、ロード バランサーのハードウェアやソフトウェア、および IIS に手を加える必要なく、負荷分散された環境でアプリケーションをテスト (具体的には、アプリケーションの状態の動きをテスト) できます。これはプロジェクト全体に追加する効果的で小さなアドオンにすぎませんが、これだけでも Oak を学習する意味がわかります。

現時点で Oak は動作しているため、ブラウザーを開いて localhost:3000 に接続し、これを確認できます (図 2)。


図 2 localhost:3000 をブラウザーで表示して Oak が動作していることを確認

次回のコラムから Oak の表示内容についての説明を始めるので心配しないでください。現時点では、Oak が動作しているということを確認できれば十分です。

トラブルシューティング

ブラウザーで動作を確認できない場合、Rake は、IIS Express が想定する Web サイトの場所がわからない可能性があります。Oak が設定する Rakefile は dev.yml 構成ファイルを使用して、ASP.NET のコンパイル済みファイルをインストールする場所を把握します。(Blog.sln ファイルと同じディレクトリにある) このファイルは次の行を設定して、使用するコンピューターの状況と一致させています。

website_port: 3000
 website_deploy_directory: c:\Prg\iisexpress\Blog
 solution_name: Blog # just the name, no .sln extension
 mvc_project: Blog # just the folder name,
   no .csproj extension
 test_project: Blog.Tests # just the folder name,
   no .csproj extension
 iis_express: C:\Program Files\IIS Express

たとえば、64 ビット システムでは、IIS Express は「C:\Program Files (x86)\IIS Express」にインストールされます。

さらなる応用

Oak (樫の木) についてはまだ調査していないことがたくさんあり、残りのフレームワーク (およびコラムのシリーズ) が誕生するのに必要なシード (種) となったいう意味で、実際、コラムのタイトルを「どんぐり」とすべきだったかもしれません。Oak にはまだ取り上げていない多くの機能があります。そこで、従来の ASP.NET MVC 開発構造 (コントローラー、ビュー、およびモデル) に Oak を統合することから始め、データベースとの対話機能にも取り組みます。また、追加したツール (Ruby および Growl) が提供する機能についてもまだ確認していません。もう少しお待ちください。本当に楽しくなるのはこれからです。

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

Ted Neward は、Neward & Associates LLC の社長です。これまでに 100 本を超える記事を執筆している Ted は、さまざまな書籍を執筆および共同執筆していて、『Professional F# 2.0』(Wrox、2010 年、英語) もその 1 つです。F# MVP であり、世界中で講演を行っています。彼は定期的にコンサルティングを行い、開発者を指導しています。彼の連絡先は ted@tedneward.com(英語のみ) です。彼がチームの作業に加わることに興味を持ったり、ブログをご覧になったりする場合は、blogs.tedneward.com(英語) にアクセスしてください。

この記事のレビューに協力してくれた技術スタッフの Amir Rajan (Oak プロジェクトの作成者) に心より感謝いたします。