ずっと君のターン

2007-06-10 ふつうにあめー

斉藤さん

| 23:22 |  斉藤さんを含むブックマーク

Reject会議のゆきひろ認証は個人的に非常にツボったので今日中に3-4個くらいは実装出てくるかなーと思ってたんだけど、ぜんぜん出てこないのな。というかこれの発表者に関する情報の少なさは異常。公式サイトですら

「ゆきひろ」(not ひろゆき) 認証

斉藤

って、名前だけじゃん。ていうか苗字だけじゃん。リンクもないし。日本に何人斉藤さんがいると思ってんだ*1

このまま謎の斉藤さんで終わったら個人的伝説のオトコだなぁ。


[追記]

公式サイトの情報が更新されてますね。

近日公開、ググれ、か・・・。

はてなのSEOパワーのせいでググるとここに来ちゃうかも・・・。

クラスメソッドの別名

| 17:26 |  クラスメソッドの別名を含むブックマーク

んー、なんかもっといいのないのかなー

class Hoge
  def self.fizz; puts :fizz end
  class <<self; alias buzz fizz end
end

Hoge.buzz

before_filter内でのrenderとredirect_to

| 13:41 |  before_filter内でのrenderとredirect_toを含むブックマーク

before_filter内でエラーメッセージをrenderしたりエラーページにリダイレクトした場合は同時にreturn falseする必要があります。そうしないと、以降のフィルタが実行されて描画が2度以上行われるというエラーになります。

ゆきひろ認証の例で言えばこの部分。

define_method :yukihiro_login do
  if params[:matz] == 'yukihiro'
    session[:i_love_ruby] = :ofcourse
    redirect_to params[:from] and return false # ←この「and return false」
  else
    yukihiro_render_check
  end
end

ていうか、Railsはそんなことまでエラーメッセージで教えてくれるんすね。すばらしい。

ゆきひろ認証プラグイン(acts_as_yukihiro_ninshoable)

| 02:52 |  ゆきひろ認証プラグイン(acts_as_yukihiro_ninshoable)を含むブックマーク

Ruby会議2007、もとい、Reject会議2007で発表されたベーパーウェアのアイデアに感銘を受け、いきおいまかせに実装してしまいました。反省はしていない。


このRailsプラグインをインストールすると素人がまつもとゆきひろさんの名前をよく「ひろゆき」と間違えることを利用してユーザーを認証できるようになります。まぁ認証失敗してももう一度聞かれるだけなので、最大二回で確実にログインできますけど。「なんに使うんだ?」とかそういうことは聞いちゃ駄目。

インストール

1. 下記コマンドを実行してゆきひろ認証プラグインをインストールする

./script/plugin install svn://rubyforge.org/var/svn/yukihiro-ninsho/vendor/plugins/yukihiro_ninsho

2. コントローラーでこんな感じに宣言する

class ApplicationController < ActionController::Base
  acts_as_yukihiro_ninshoable

3. 認証されてない状態でページを表示しようとしてこうなると成功

f:id:technohippy:20070611025734p:image

ソースコード

ソースをTxDに上げてみたんだけど、なんだかクソ重い上にすぐ落ちるのでRubyForgeに申請中。待ちきれない場合は自分で作ってみるといいと思うよ。

必要なファイルはたった二つだけ。

(RubyForgeに登録したけど、一応コードは残しておきます)

# vendor/plugins/yukihiro_ninsho/init.rb
require 'yukihiro_ninsho'
# vendor/plugins/yukihiro_ninsho/lib/yukihiro_ninsho.rb
class ActionController::Base
  def self.acts_as_yukihiro_ninsho(*args)
    define_method :yukihiro_check do
      if params[:action] == 'yukihiro_login'
        yukihiro_login
      elsif params[:action] == 'yukihiro_check'
        yukihiro_render_check
      elsif session[:i_love_ruby] == :ofcourse
        true
      else
        yukihiro_render_check
      end
    end

    define_method :yukihiro_render_check do
      params[:action] = 'yukihiro_welcome' if params[:action] == 'yukihiro_login'
      params[:only_path] = false
      render :inline => <<-end_of_template
<% form_tag :action => 'yukihiro_login', :from => url_for(params) do %>
 <h4>Rubyを開発したのは次のうちどちら?</h4>
 <%= select_tag :matz,
                options_for_select(
                  [['まつもとゆきひろ', 'yukihiro'],
                   ['まつもとひろゆき', 'hiroyuki']]),
                :size => 2, :style => 'border:1px solid gray' %>
 <br/>
 <%= submit_tag 'ログイン' %>
<% end %>
      end_of_template
      false
    end

    define_method :yukihiro_login do
      if params[:matz] == 'yukihiro'
        session[:i_love_ruby] = :ofcourse
        redirect_to params[:from] and return false
      else
        yukihiro_render_check
      end
    end

    define_method :yukihiro_logout do
      session[:i_love_ruby] = nil
      redirect_to :action => 'yuhikiro_check'
    end

    define_method :yukihiro_welcome do
      render :inline => <<-end_of_template
<h4>無事に認証されました</h4>
<%= link_to 'ログアウト', :action => 'yukihiro_logout' %>
      end_of_template
    end

    before_filter *(args.unshift(:yukihiro_check))
  end
end

※ 注意

まともなテストはしてません。ご利用は自己責任で。っていうか、ネタ以外のなにものでもないので、(そんな人いないと思うけど)これで何かを認証できたりすることは期待しないでください。

※ さらに注意

「ゆきひろ認証」でググって来た人がいたら、「404 Not Found」がReject会議での元ネタなので注意してくださいね

斎藤ただし斎藤ただし 2007/06/14 08:11 あぁ、こちらにコメント書ける事を今まで気づきませんでした orz
ネタを取り上げていただき、本当にありがとうございました。最も波及効果が期待できる(?)Railsというプラットフォーム向けの実装で、かつrubyforgeのdescriptionも提唱者の意図を汲み取っていただき素晴らし過ぎで(^^; 感謝感謝です。
# うちもようやくググって出てくるようになりました。
# が、タイトルの設定が遅れて、それが甘いまま
# 登録されてる…反省。

technohippytechnohippy 2007/06/14 22:56 斉藤さんこんにちは。お世話になってます。本家はコメントスパム対策なんですね。なるほど。確かにそれだと使い道ありそう。残念ながらこちらは「ログイン認証」なのでジョーク以外の使い道が全く思いつかないです。なので、波及効果と言う点ではちょっと・・・。

斎藤ただし斎藤ただし 2007/06/15 01:27 いや、所詮50%で通るボット判定ですからジョーク以外の何者でもないです (^^;