Rackアプリケーションのプロファイリングをしたくて、preftoolsを使ったりしてみたのですが、なかなかちょうど良い粒度で出力されず困っていました。 実効速度は爆遅になるのが難点だけれど、標準profileライブラリはいい感じの粒度なので、Rackミドルウェアにしてみました。 これをどこかでuseすれば、どうにかなります。 require "profile" require "logger" require "stringio" class Profile #= initialize def initialize(app) @app = app @logger = Logger.new('log/profile.txt') end #= call def call(env) log_profile(env) { @app.call(env) } end def log_profile(
rack-protection とは,Sinatra 関連のコンポーネント (sinatra-contrib など) を多数作ってる rkh 氏のプロダクトの一つで,Rack に組み込むだけでいくつかの脆弱性に対する防御をしてくれる Rack middleware です。 いかがかなと思うコンポーネントもありますが,基本的にそういうのはデフォルトで無効化されてますし,FrameOptions や XSSHeader のように「とりあえず入れといても副作用ないし実効性がある」コンポーネントも多いので,とりあえずいれとくというスタンスでもよいのではないでしょうか。 使い方 ざっくりと省略。 とりあえず説明ページにあるように,config.ru に書く場合, な感じで使うことになります。この Rack::Protection を use すると,バンドルされているコンポーネント (middlew
この middleware ちゃんと動いてるか確認したい、とか、この middleware とこの middleware を同時に使うとなんかヘッダがおかしいけどどうなってるの!とか、そういうののデバッグ法。 単にログ吐く middleware を stack の途中に積めばよい。 @app.call の前後でそれぞれロギングできる。 class M def initialize(app) @app = app end def call(env) warn '='*80 env.each do |k,v| warn "#{k}=#{v}" end warn '='*80 triplet = @app.call(env) warn triplet.inspect triplet end end config.middleware.insert_before Rack::ETag, M con
私は自作Webアプリケーションの公開にHerokuを利用しています。Ruby on Rails tutorialにHerokuデプロイの入門編があり、最初はこれで勉強しました。 http://railstutorial.jp/chapters/beginning?version=4.0#top Ruby on Railsで開発している場合はこの本の通りにやればできます。しかし(昔のレンタルサーバのように)単純に静的なHTMLをアップしたい場合が逆に分かりません。Railsではstaticディレクトリに送れば可能ですが、わざわざこのためにRailsを使うのはいくら何でも重すぎる感じがします。 Sinatraを使えばずっと身軽になると思いますが、私はSinatraについてよく知りません。 ここではRackを使う方法を紹介します。RackはRuby on Railsのコアモジュールに採用されてお
require File.join(File.expand_path(File.dirname(__FILE__)), 'rack/timeout') if defined? Rails case Rails::VERSION::MAJOR when 2; Rails.configuration.middleware.insert 0, Rack::Timeout when 3 class Rack::Timeout::Railtie < Rails::Railtie initializer("rack-timeout.insert-rack-timeout") { |app| app.config.middleware.insert 0, Rack::Timeout } end end end # encoding: utf-8 require 'rack/timeout' requir
Sinatraとかでいつも忘れるのでメモ Rack::Requestのenvの仕様は以下のような感じになる RackのEnvironmentによるとHTTP_で始まる値がHTTPリクエストヘッダ 形式としてはRFC 3875 - The Common Gateway Interface (CGI) Version 1.1に準拠している HTTP ヘッダフィールド名が大文字に変換され、存在する全ての - が _ に置換され、先頭に HTTP_ が与えられる なので、以下のような感じでダンプ出来る(人間がわかれば良ければ1行目をpするだけでも良さそう) http_headers = request.env.select { |k, v| k.start_with?('HTTP_') } headers = http_headers.inject({}) do |a, (k, v)| a[k.s
概要 webアプリでとあるパスへのリクエストをフックしてゴニョゴニョする。 そんな方法ないかなぁと思っていたらタイムリーな記事を見つけた。 開発環境でのみ、リクエスト毎になんか処理をフックしたい in Ruby しかしrack middlewareってどんなもの?状態なので勉強からスタート。 rack middlewareの簡単なお勉強 Rackミドルウェアの作り方を勉強した ここみたら何となく分かった。 簡単なmiddlewareを書いてみる /hogeにアクセスが来たら、"hogehoge"を返すmiddleware。 元のアプリに/hogeの処理が定義してあっても、その処理を通さずにクライアントへ結果を返す。 そんなmiddlewareを書いてみた。 class MyRackMiddelware def initialize(app) @app = app end def call(
Sitespec というGemを利用して、Rackアプリから静的サイト用のファイル群を生成する方法について説明します。 Sitespecとは Sitespecは、Rackアプリとrequest-specを利用して静的ファイルを生成するためのGemです。ここで言うrequest-specとは、RSpecでRackアプリに対してHTTPリクエストを送信し、アプリの振る舞いやレスポンスの内容を確かめるテストのことを指しています。Sitespecは、request-specで利用されたリクエストとレスポンスを元に、buildディレクトリの中に静的ファイルを生成します。GitHub Pagesなどを利用すれば、ここで生成された静的ファイル群をWebサイトとして公開できます。 よいところ Rackアプリの知見や道具を再利用できる Rackアプリを書けば静的サイトを構築できるため、これまで利用していたR
これを受信したブラウザは受信したボディを指定された圧縮エンコーディング(この場合はgzip)で解凍して処理します。特にテキストファイルに対しては大きな効果があり、(おおまかな目安として)30-40%程度まで通信時間を短縮できます。 Rack::Deflaterによる対応 Rackにはこのための標準ミドルウエアとしてRack::Deflaterがあります。前回の解説で簡単な応用例を示しています。 http://qiita.com/higuma/items/838f4f58bc4a0645950a#2-5 RackミドルウエアにRack::Deflaterを挿入するだけで自動的に上記リクエストヘッダを認識し、ボディを圧縮してレスポンスヘッダをセットして応答します。大部分のケースではこの対応で十分です。 事前圧縮による最適化 しかし大量のデータを扱ったりサーバ負荷が高い場合は改善の余地があります
Rackとは RackはRubyによるWebアプリケーション開発のHTTP送受信処理を担当するモジュール(gem)で、Ruby on Railsを始めとする多くのWebフレームワークの一番下のレベルで利用されています。 https://github.com/rack/rack http://rack.github.io/ 本稿ではRackの基本的な部分を中心に説明します。 簡単なRackアプリケーション まず基本を理解するため説明用の簡単なアプリケーションを作成します。 最初にrack gemのインストールが必要ですが、Ruby on Railsをインストールしている場合はすでに必須モジュールとして入っています。単独でインストールする場合は次を参考にして下さい。 http://qiita.com/higuma/items/b23ca9d96dac49999ab9#2-3 次にconfig.
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く