岩本隆史の日記帳(アーカイブ)

はてなダイアリーのサービス終了をうけて移行したものです。更新はしません。

Ruby

Ruby Association Certified Ruby Programmer Silverに合格した

Ruby Association Certified Ruby Programmer Silverを本日受験し、無事合格した。満点だった。受験した理由は色々あるのだが、今の会社に依存していたくなかったというのが大きい。転職時や独立時に有利になるよう、今年は取れそうな資格を手当たりしだい取…

Ruby製Webアプリでの書式チェック用正規表現

制御文字は不許可にすべき 前回の日記で「単なる書式チェック(文字種や長さなどのチェック)なので、アプリの要件にしたがって粛々と行えばよい」と書いた「(c)パラメータ文字列の妥当性検証」であるが、実は考えるべきことがそれなりにある。アプリの要件…

Ruby製Webアプリでの入力チェック手順

今回はRuby製Webアプリでの入力チェック手順について考えてみる。Ruby1.9を使い、Railsなどのフレームワークは使わない前提だ。 文字エンコーディングの妥当性検証こそが重要 徳丸浩さんの『体系的に学ぶ 安全なWebアプリケーションの作り方』には「入力処理…

RubyからHaskellを呼び出したくてHubrisをインストールした

Hubrisという、RubyからHaskellのコードを呼ぶためのブリッジがあります。HaskellパッケージとRubyライブラリで構成されており、現在のバージョンは0.0.3です。とある理由から、このHubrisで遊んでみようと思ったのですが、Haskellパッケージのインストール…

RVM上のRubyでOpenSSLを使うときは

RVM上のRuby1.9.1にThinをインストール後、ためしに「thin -v」したら、「thin.rb:6:in `require': no such file to load -- openssl (LoadError)」となった。どうしようかといろいろ調べたら、「All about Ruby on Rails & Data recovery software」に答え…

XSS対策パッチを当ててもRailsに残る脆弱性

どのような脆弱性か 先日書いた「Rails 2系のXSS脆弱性がRuby 1.9では影響なしとされる理由」という記事に、奥さん(id:kazuhooku)より、下記のブックマークコメントをいただきました。 たとえばブログの場合、誰かに壊れたUTF-8を含むコメントを書き込まれ…

Rails 2系のXSS脆弱性がRuby 1.9では影響なしとされる理由

Rails 2系のXSS脆弱性を修正するパッチが先日公開されました。 4日(米国時間)、Ruby on Railsの2系すべてのバージョンにXSSの脆弱性があることがRiding Rails: XSS Vulnerability in Ruby on Railsにおいて発表された。特定のUnicode文字列を使ってチェック…

(次回試そうと思っている)GitHubでRubyGemを公開する手順

前々回の記事で「次回は、Ruptaを作成・公開するにあたって工夫した点や苦労した点について書こうと思っています」と予告しました。前回の記事ではライブラリインターフェースについて触れただけでしたので、今回は、工夫した点と苦労した点について触れなが…

デメテルの法則厨がライブラリを作るとどうなるか

お題:クラス名からそのクラスを得るライブラリ Webアプリのフレームワークを作っていて、クラス名からそのクラスのインスタンスを生成したくなりました。リクエストURIによって呼び出したいコントローラが変わるためです。そこで、下記のような ClassGetter…

Rack用HTTPデーモンの複数起動を制御するスクリプト

RailsでいうところのMongrelClusterのような、複数のHTTPデーモンを起動したり停止したりする仕組みがRackにもあったら便利だなーと思い、Daemonsを使う方法を考えてみました。以下、サンプルコードに注釈をまじえながら。 まずはrequire require 'rubygems'…

gemを初めて作った

Rubyでオレオレフレームワークを作ろうと思ってから、はや数か月。非同期処理やらRESTやら認証方式やらについて悩みはじめて、すっかり手が止まっていたのですが、悩んだおかげで方向性がだいぶ固まりました。手を動かすターンが再びやってまいりました。せ…

非同期処理メインのWebアプリについて考えた

先日「非同期にしたいけれど」という記事を書いてからずっと、非同期処理メインのWebアプリについて考えています。実装したわけではないため、まだ机上の空論にすぎませんが、方向性が見えてきたので備忘録として残しておきます。 前提条件 Create/Update/De…

条件付きGETに対応するRackミドルウェア「Rack::ConditionalGet」

コミットされてました。 ConditionalGet middleware (Last-Modified/Etag) · chneukirchen/rack@3b31e21 · GitHub 実装を見ると、If-None-Matchが「*」や複数のエンティティタグに対応しておらず、RFC的には微妙な感じ。とはいえ、そんなリクエストを投げる…

Railsのどこがスレッドセーフでないのか

今まで、自分の書いているコードがスレッドセーフかどうかなど気にしたことがありませんでした。単に、必要がなかったからです。が、Railsがスレッドセーフになるというニュースを読んだり、MongrelやRackについて調べたりしているうちに、こりゃオレオレフ…

RubyとDIコンテナ

先日の日記のコメント欄に書いたとおり、まつもとさんの書かれた記事「探訪Ruby 第5回 ダイコン」(『Linux magazine』、2005年2月号)が読みたくて、同誌のバックナンバーがぎっしり詰まっている『Linux magazine the DVD Complete』を入手しました。さっそ…

Rack 0.4がリリースされていた

去る21日に、Rack 0.4がリリースされていました。 [ANN] Rack 0.4, a modular Ruby webserver interface == Changes * August 21st, 2008: Fourth public release 0.4. * New middleware, Rack::Deflater, by Christoffer Sawicki. * OpenID authentication …

Webアプリケーションをテスト駆動開発するには

TDDならモックの出番はない? いつものように思いつきエントリなので、眉にツバをキュッキュとつけてお読みいただければ幸いです。「Pinto公開に向けて #18 ― RSpecのモックを使ってみた」では、Rackエントリポイントの実装と、そのテストコードを考えました…

Pinto公開に向けて #18 ― RSpecのモックを使ってみた

あらすじ Pintoというソーシャルブックマークサービス、およびPintoBeansというWebアプリケーションフレームワークをRubyで開発中です。開発中に気づいたことや工夫した点などを、備忘録も兼ねて書いています。その18回目です。 Rackインターフェーサが必要だ…

ダイコンからモカへ

依存性注入おもろい、自分のコードもDIで書き直したい、などと毎度の思いつきであれこれ調べ、そうか、DIコンテナってものがあって、これを使えば良いのだな、と納得しかけたら、下記の記事を読んで轟沈。 Buckblog: Net::SSH revisited 数年前に、Coplandと…

Pinto公開に向けて #17 ― フレームワークを切り出した

あらすじ Pintoというソーシャルブックマークサービスを、Rubyで開発中です(GitHubリポジトリ)。開発中に気づいたことや工夫した点などを、備忘録も兼ねて書いています。その17回目です。 PintoBeans 始めました Pintoを作る過程で、実はWebアプリケーショ…

Pinto公開に向けて #14 ― rackupの「-E」オプション

あらすじ Pintoというソーシャルブックマークサービスを、Rubyで開発中です(GitHubリポジトリ)。開発中に気づいたことや工夫した点などを、備忘録も兼ねて書いています。その14回目です。 本題 Rack本体のbin/rackupにはいろいろなオプションを渡せます。 …

Pinto公開に向けて #13 ― ActiveRecord::Extensions を断念

あらすじ Pintoというソーシャルブックマークサービスを、Rubyで開発中です(GitHubリポジトリ)。開発中に気づいたことや工夫した点などを、備忘録も兼ねて書いています。その13回目です。 本題 ActiveRecordの拡張ライブラリであるActiveRecord::Extension…

Pinto公開に向けて #12 ― URIを変更&HTTPメソッドに簡単に対応

あらすじ Pintoというソーシャルブックマークサービスを、Rubyで開発中です(GitHubリポジトリ)。開発中に気づいたことや工夫した点などを、備忘録も兼ねて書いています。その12回目です。 URIを変更 ニコニコ動画の外国語版が公開されたとのニュースを読み…

Pinto公開に向けて #11 ― gettextのメッセージIDを固定文字列に変えた

あらすじ Pintoというソーシャルブックマークサービスを、Rubyで開発中です(GitHubリポジトリ)。開発中に気づいたことや工夫した点など、他の開発者の方にも役立ちそう、と思ったことを書いています。その11回目です。 本題 「メッセージIDが変数になるこ…

Pinto公開に向けて #10 ― Rackリファレンスとar-extensions

あらすじ PintoというソーシャルブックマークサービスをRubyで開発しています(GitHub上のリポジトリ)。開発中に気づいたことや工夫した点など、他の開発者の方に役立ちそうなことがあれば書いていくシリーズ企画です。 Rack日本語リファレンス 山本陽平さ…

OpenID::Consumer.newにセッションオブジェクトを渡す意味がわからない

誰かが教えてくださる可能性に期待して、ruby-openidに対する疑問を書きます。RP用のOpenID::Consumerクラスのインスタンスを作る際、セッションオブジェクトとストアオブジェクトを渡さなければなりません。 consumer = OpenID::Consumer.new(session, stor…

Pinto公開に向けて #9 ― Content-Locationヘッダに対応した

以前に書いた: 非プラトニック形式のURIに対してGETリクエストがあった場合 ステータスを「200 OK」とし、指定言語でリソースを返す。また、Content-Locationヘッダでプラトニック形式のURIを返す。 続・多言語リソースのURIに関する覚書 という方針をPinto…

Pinto公開に向けて #8 ― OpenID対応中

眠いので、簡単に。「Pintoって何?」という方は前回の記事をご参照ください。 Rack::Auth::OpenIDは現状使えない OpenID対応するにあたり、Rack::Auth::OpenIDを使ってみようと思ったわけですが、現状では使えないことが分かりました。ruby-openidのバージ…

Pinto公開に向けて #7 ― Ruby-GetText-Packageで多言語対応した

あらすじ Rubyの勉強がてら、Pintoというソーシャルブックマークサービスを作っています。前回の予告どおり、Ruby-Gettext-Packageで多言語対応したので、そのメモを残しておきます。 テンプレートの検討 view/index.erb <a href="<%== uri('signup_openid', 'lang' => @lang) %>"><%= _('Sign Up') %></a> としておいて、…

Pinto公開に向けて #6 ― テンプレートにuriメソッドを追加した

あらすじ いじり始めたばかりのRubyで、Pintoというソーシャルブックマークサービスを作っている最中です。前回は、ビュー周りを実装しました。今回は、gettextを触る予定でしたが、後回しにして(えー)、テンプレートにuriメソッドを追加しました。その際…