gihyo.jp » DEVELOPER STAGE » 連載 » Ruby Freaks Lounge » 第25回 Rackとは何か(3)ミドルウェアのすすめ

Ruby Freaks Lounge

第25回 Rackとは何か(3)ミドルウェアのすすめ

前回前々回の記事では,Rackの生まれた背景,Rackとは何か,実際にRackアプリケーションを作る際に使えるものをご紹介しましたが,もう一つまだ説明していない重要な要素がRackにはあります。今回は,そのミドルウェアという仕組みについてご紹介します。

ミドルウェアとは

ミドルウェアとは何かを一言で言うと,「別なアプリケーションをラップして,リクエストやレスポンスを加工したり,処理を切り換えたりするRackアプリケーション」です。

この仕組みがあることで一体何ができるのでしょうか。Webアプリケーションを作っていると,リクエストやレスポンスをアプリケーションに行く前やアプリケーションの処理の後に加工したくなることはよくあります。例えば,条件に応じてURLの書き換えをしたり,エンコーディングの変換をしたり,Cookieの処理をしたり…といったことが日常茶飯事です。こういう処理を,サーバとアプリケーションの中間で行なうのがこのミドルウェアなのです。

ミドルウェアの作りかた

まずは,ミドルウェアを作ってみてその挙動を見てみましょう。とは言え,特に難しいことはありません。ミドルウェアが満たしていなければいけない要件は以下の二点です。

  • Rackアプリケーションの仕様を満たしていること
  • newの第一引数に他のRackアプリケーションを取ること

例えば,次のようなコードを書いて,neco_filter.rbという名前で保存してください。

neco_filter.rb

# coding: utf-8

class NecoFilter
  def initialize(app)
    @app = app
  end

  def call(env)
    res = @app.call(env)
    res[2].each do |body|
      body.gsub!(/!|?|。|,/) { "にゃ#{$&}" }
    end
    res
  end
end

そして,config.ruを次のように変更します。

# config: utf-8

require 'simple_app'
require 'neco_filter'

use NecoFilter
run SimpleApp.new

早速rackupでアプリケーションを起動してみましょう。出力が書き換えられているのがわかりますね。前回のSimpleApp同様,NecoFilterもとても簡単なものですが,ミドルウェアを理解する上で重要なポイントがいくつかあります。

まず,元のアプリケーションに一切変更を加えていないということです。出力や入力を書き換える汎用的な処理をこうしてミドルウェアとして実装しておけば,アプリケーションとは独立して付けたり外したりすることができます。また,サーバ側にも依存していないため,例えばApacheeからNginxに切り換えることになったときでも特にアプリケーションに変更を加える必要はなく,同じように使えます。

そして先ほど,ミドルウェアの要件として「他のRackアプリケーション内部に持つRackアプリケーションであること」と言及しました。ミドルウェアそのものもまたRackアプリケーションですので,ミドルウェアを複数重ねることもできます。上記のサンプルではミドルウェアは一つしか使っていませんが,サーバのモジュールやフレームワークのプラグインと同じように,組み合わせて使うことができます。

最後にこれは重要なことですが,Rackベースのフレームワークで実装したアプリケーションに対しても使えるということです。「Rackの仕様に則ってWebアプリケーションフレームワークを実装する」ということはすなわち「一個のRackアプリケーションとして動作する」,つまりRamazeやSinatraを使って開発されたアプリケーションはサーバやから見れば一つのRackアプリケーションになっているわけです。そのため,先程のNecoFilterミドルウェアも既存のSinatraアプリケーションに適用することができます。こうして汎用的な機能をミドルウェアとして切り出しておくことで,フレームワークをまたいで使うことができるのです。

もちろんパフォーマンスが何より重要な状況であれば,Webサーバのモジュールとして実装した方が当然高速でリソースも節約できます。あるいは,フレームワーク内部のプラグイン機構やフックを利用した方が,自由度はあがるでしょう。ですが,そういう制約がないのであれば,ミドルウェアとして実装されていた方が「サーバとフレームワークを自由に組み合わせることができる」というメリットをより享受できるのです。

余談ですが,ミドルウェアはある決まった形式だというだけのただのRackアプリケーションですので,config.ruで次のように書いても同じ意味になります。

# config: utf-8

require 'simple_app'
require 'neco_filter'

run NecoFilter.new(SimpleApp.new)

useはRack::Builderで用意されたDSLの記法で,後続のミドルウェアやアプリケーションを引数に取ってnewしてHandlerの引数にする,ということをおこなっています。ミドルウェアの要件として「newの第一引数がRackアプリケーションであること」があるのはこの記法を利用するためです。もしuseを使わないのであれば,Rack::URLMapのように,独自のイニシャライザを定義してアプリケーションとして実装してもいいかもしれません。

またconfig.ruやRack::Builderを使わない場合,たとえばCGI等で直接アプリケーションをハンドラに渡す場合は,

use MiddlewareA
use MiddlewareB
run App.new

となっていたものが,以下のような形になります。

Rack::Handler::CGI.run MiddlewareA.new( MiddlewareB.new( App.new ) )

著者プロフィール

佐孝太郎(さこうたろう)

株式会社ライブドア所属。仕事では主にPerlとObjCを使っているものの, MacRubyでCocoaアプリのテストを書くなど,隙を見付けてはRubyを使おうと目論んでいる。

bloghttp://blog.livedoor.jp/faulist/
twitter:http://twitter.com/faultier

コメント

コメントの記入

パスサポ

多数の情報処理技術者試験対策書籍の発行実績を誇る技術評論社がお届けする,資格試験合格サイト「めざせ! 情報処理試験 パスサポ」が開設されました。

ピックアップ

サクセスストーリーに続く,快適サーバー運用管理のヒント!

データの増大,煩雑な管理,システムダウン,セキュリティなど,迫りくる課題からシステム管理者の負担を軽くするポイントを解説します。

gihyo.jp インフラエンジニア情報局

ネットワークやITにかかわるあらゆる業種で必要とされるインフラエンジニアに向けた技術情報や心構え,その魅力について多角的に紹介。

テストエンジニア ステーション

いま,ITに関わるあらゆる開発業務で注目されつつあるテスト系エンジニアをターゲットにしたコンテンツサイトを展開します。

一行クイックアンケート

gihyo.jpで取り上げてほしいネタは?

※検索はページ右上の検索ボックスをご利用ください。

その他の連載

2010年版SEO体得講座

本連載では,いまや企業サイトの戦略の1つとして欠かすことのできないSEOについて,最新トレンドからすぐに使えるTipsまでを紹介します。

小型Linuxサーバの最高峰 OpenBlockS 600活用指南

搭載メモリの増加,CPUクロックの向上など,あらゆる面が強化された期待の新モデルOpenBlockS 600。この記事ではOpenBlockS 600の紹介から,活用するためのさまざまなノウハウを紹介していきます。

はじめMath! Javaでコンピュータ数学

プログラミング言語入門者向けに,知っていると役立つ数学的トピックスを紹介します。簡単な演習問題と解説で,即活用できる知識を目指します。

教科書には載っていない ネットワークエンジニアの実践技術

ネットワークエンジニア,インフラエンジニアのトラブル対応には,時には「教科書通りにいかない」テクニックが必要となります。資格試験では得られないこうした実践的な技術について,実例を元に紹介します。

Googleケータイ,世に現る

2008年9月,Googleが中心となって開発されている「Android」を採用した携帯電話「T-Mobile G1」が発表されました。本連載ではT-Mobile G1を中心にGoogleケータイに迫ります。

モバゲーオープンプラットフォームに挑戦!――面白法人カヤック流モバゲーオープンプラットフォーム企画と開発のイロハ

2010年1月にリリースとなったモバゲーオープンプラットフォーム。その制作企業であるカヤックが,アイデアを企画に落とし込み,開発までのノウハウを紹介します。

プロトタイピングツールSketchFlowを用いた,Silverlightアプリ開発

SketchFlowプロトタイプ作成からアプリケーション開発までをExpression Blend 3を使って実践的に解説します。

Ubuntu Weekly Recipe

Ubuntuの強力なデスクトップ機能を活用するための,いろいろなレシピをお届けします。

連載一覧

gihyo.jp

  • DEVELOPER STAGE
  • ADMINISTRATOR STAGE
  • WEB+DESIGN STAGE
  • LIFESTYLE STAGE
  • SCIENCE STAGE
  • NEWS & REPORT

書籍案内

  • 新刊書籍
  • 書籍ジャンル一覧
  • 書籍シリーズ一覧
  • 新刊ピックアップ
  • ロングセラー
  • 電脳会議

定期刊行物一覧

  • Software Design
  • WEB+DB PRESS
  • Web Site Expert
  • 組込みプレス

最近のコメント