<?xml version="1.0" encoding="UTF-8"?><!-- generator="WordPress/2.6.2" -->
<rss version="0.92">
<channel>
	<title>func09</title>
	<link>http://www.func09.com/wordpress</link>
	<description>Ruby, Rails, ActionScript、JavaScriptなどの話題</description>
	<lastBuildDate>Tue, 18 Nov 2008 02:01:54 +0000</lastBuildDate>
	<docs>http://backend.userland.com/rss092</docs>
	<language>ja</language>
	
	<item>
		<title>[rails] ユーザーのパスワード忘れ処理を簡単に生成してくれるプラグインforgot_password ( with Restful-authentication)</title>
		<description>はじめに

Railsとrestful-authenticationの組み合わせで、パスワード忘れの機能を実装するにあたって、いろいろと参考になるものを探していたところ、簡単に機能を実装できるプラグインがあったので紹介。

forgot_passwordプラグイン
http://github.com/greenisus/forgot_password/tree/master



restful-authenticationを使う事前提で、script/generate forgot_passwordというジェネレータでちゃちゃっとパスワードを忘れた人用のページを作ってくれます。実際にやってみます。


準備

まずはプロジェクトのインストールから

[code]
% rails forgot_password_sample
% cd forgot_password_sample/
[/code]

つづいてプラグインのインストール。gitコマンドが必要です。

[code]
% script/plugin install git://github.com/technoweenie/restful-authentication.git
% script/plugin install git://github.com/greenisus/forgot_password.git
[/code]

そして、認証とパスワード忘れのジェネレーターを実行。

[code]
% script/generate authenticated --include-activation user sessions
% script/generate forgot_password forgot_password user
[/code]

forgot_passwordプラグインによって、以下のファイルが追加・編集されている


追加ファイル


db/migrate/xxxxxxxxxxxxxx_create_forgot_passwords.rb
app/models/forgot_password.rb
app/models/forgot_password_mailer.rb
app/controllers/forgot_passwords_controller.rb

修正ファイル


config/routes.rb







修正

アクティベーション用のルートを設定。config/routes.rbに追加

[ruby]
map.activate '/activate/:activation_code', :controller => 'users', :action => 'activate', :activation_code => nil
[/ruby]

forgot_passwordのバグなのか、パスワード用のモデル名にpassword以外を使うと、メール送信の行が２行、それも片方は存在しないクラス名で作られています。

app/controllers/forgot_passwords_controller.rbを修正して、使わない方の行をコメントアウトしておきます。

[ruby]

50行目をコメントアウト

PasswordMailer.deliver_reset_password(@user)

ForgotPasswordMailer.deliver_reset_password(@user)
[/ruby]

確認

パスワード忘れを表すテーブルが追加されました。

[code]
% cat db/migrate/*_create_forgot_passwords.rb
[/code]

[ruby]
class CreateForgotPasswords &#60; ActiveRecord::Migration
  def self.up
    create_table "forgot_passwords" do &#124;t&#124;
     ...</description>
		<link>http://www.func09.com/wordpress/archives/348</link>
			</item>
	<item>
		<title>[rails] restful-authenticationの使い方　基本編</title>
		<description>はじめに

Railsでの認証機構はrestful-authenticationで決まりらしいのですが、いざ自分で新しい機能を実装しようと思うとなかなか骨があってどう組んで良いものか悩んでしまう。

ユーザー認証のあるサービスには欠かせないであろうパスワードを忘れた人への対策処理を実装してみようと思うのだけど、えらく長くなりそうなので、とりあえず基本的なrestful-authenticationの使い方を。

準備


railsのプロジェクト「auth_sample」を生成
restful-authenticationのインストール
aasmのインストール
script/generate authenticated


[c]
// プロジェクト生成
% rails auth_sample
% cd auth_sample

// プラグインインストール
% script/plugin install git://github.com/technoweenie/restful-authentication.git
% script/plugin install git://github.com/rubyist/aasm.git

// 雛形の生成（メールアクティベートとaasmによる状態管理を有効にしておく）
% script/generate authenticated --include-activation --aasm user sessions

[/c]

続いて


config/environment.rbにuserモデルのオブザーバーを定義
config/routes/rb


/activateのルートを設定
usersのresourcesにsuspend,unsuspend,put,purgeを追加

AuthenticatedSystemのインクルード


[ruby]

config/environment.rbに追加

config.active_record.observers = :user_observer

config/routes.rbに追加

map.activate '/activate/:activation_code', :controller => 'users', :action => 'activate', :activation_code => nil
map.resources :users, :member => { :suspend => :put, :unsuspend => :put, :purge => :delete }

app/controllers/applications.rbに追加

include AuthenticatedSystem

＃

[/ruby]

を追加しておく。

さらに、このままではaasm用のクラスを読み込めないので
vendor/plugins/restful-authentication/rails/init.rb
に下記の追加

[ruby]

vendor/plugins/restful-authentication/rails/init.rb

この行を追加してaasmを読み込む

require File.join(File.dirname(FILE), "..", ...</description>
		<link>http://www.func09.com/wordpress/archives/280</link>
			</item>
	<item>
		<title>Rails2.2の新機能i18nを使ってみる</title>
		<description>はじめに

Rails2.2ではついに国際化が標準で搭載されることになった。

Rails 2.2 リリースノート日本語訳

これまでRuby on Railsで作ったアプリの検証メッセージなどを日本語化する場合は
gettextを使う方法がデファクトスタンダードだったけれど、正直めんどくさいし、初心者にはとっつきにくかった。

ということで正式版が登場する前にi18nを試してみよう。



準備

まずはプロジェクトを作成してedge版を展開する。

[code]
% rails sample
% cd sample
% rake rails:freeze:edge
[/code]

次に必要なプラグインをインストールする
localized_datesとi18nを入れる。

http://github.com/clemens/localized_dates/tree/master
http://github.com/mattetti/i18n/tree/master

[code]
% script/plugin install git://github.com/clemens/localized_dates.git
% script/plugin install git://github.com/svenfuchs/i18n
[/code]

次にi18nを初期化してロケールファイルを読み込む処理を用意
config/initializers/init_i18n.rb
というファイルを作成して

[code]
I18n.default_locale = 'ja-JP'
LOCALES_DIRECTORY = "#{RAILS_ROOT}/config/locales/"
LOCALES_AVAILABLE = Dir["#{LOCALES_DIRECTORY}/*.{rb,yml}"].collect do &#124;locale_file&#124;
  File.basename(File.basename(locale_file, ".rb"), ".yml")
end.uniq.sort
[/code]

を記述する。

デフォルトのロケールを日本語にしてconfig/locales/以下にあるロケール名.rb、ロケール名.ymlを読み込む。

次にロケール用のファイルを用意する

[code]
touch config/locales/ja-JP.rb
touch config/locales/ja-JP.yml
[/code]

サンプルアプリをscaffoldで作成する

日本語化の準備ができたのでサクっとscaffoldでメモ帳など作ってみよう。

[code]
% script/generate scaffold note title:string body:text
[/code]

app/models/note.rbを編集する

[code]

app/models/note.rb

class Note &#60; ActiveRecord::Base
  validates_presence_of :title, :body
  validates_uniqueness_of :title
end
[/code]

確認

ではサーバを起動して確認してみよう

[code]
% rake db:migrate
% script/server
[/code]

[caption id="attachment_264" ...</description>
		<link>http://www.func09.com/wordpress/archives/262</link>
			</item>
	<item>
		<title>Mac Leopard環境でActionMailerでメール送信できない時に見直すこと</title>
		<description>結論

可能性として


Postfixが起動していない
プロバイダのOP25B対策


がある

プロセス

今日何時間も格闘したのでメモ。

MacでRails開発している際、普通にはActionMailerでメールを送信できない。

[code]
config.action_mailer.raise_delivery_errors = true
[/code]

の場合

[code]
Errno::ECONNREFUSED: Connection refused - connect(2)
[/code]

メール送信時にこんなエラーが出るはず。

で、そもそもNet::SMTPが使えていないっぽいのです。

[code]
% irb


  
    require 'net/smtp'
    smtp = Net::SMTP.start( 'localhost', 25 )
    Errno::ECONNREFUSED: Connection refused - connect(2)
    [/code]
  


ふむふむ。25ポートが空いてないっぽい。
そりゃそーだ。メールサーバ起動してないもん。。

[code]
sudo postfix start
[/code]

これで起動する。
Linuxの生活になれて、Postfixが起動していないというオチを考えてなかったため、ここまでに３時間くらいかかってます。

chkconfig的なものってないですかねぇ？

それでも送信できない場合は、そもそもmailが使えてない可能性が。

[code]
% echo 'Hi' &#124; mail -s test mitsuru.haga@gmail.com
% tail /var/log/mail.log
[/code]

これで送信が成功しているかチェックしましょう。
プロバイダのOP25B対策で送信できていない可能性があるので、各プロバイダでリレーホストを調べて
/etc/postfix/main.cf
に追加します。

例えば、うちはKDDIなので

[code]
relayhost = ...</description>
		<link>http://www.func09.com/wordpress/archives/254</link>
			</item>
	<item>
		<title>gemが1.3.xにバージョンアップできない件</title>
		<description>うちの環境でgemが1.1.1から1.3.1にアップデートできなくなる現象に陥った。

環境はMac OS10.5.5, ruby 1.8.6, gem1.1.1

[code]
Moon% sudo gem update --system
Updating RubyGems
Bulk updating Gem source index for: http://gems.rubyforge.org/
Nothing to update
[/code]

http://blog.segment7.net/articles/2008/09/26/rubygems-1-3-0

ここを見ると、gem1.1とgem1.2にはupdate --systemにバグがある模様です。
上記ページに従って

[code]
gem install rubygems-update
update_rubygems
[/code]

とすれば最新のgemがインストールされます。

僕の環境の場合、

[code]
sudo gem install rubygems-update
sudo update_rubygems
[/code]

とsudoをつけて実行しました。
 </description>
		<link>http://www.func09.com/wordpress/archives/252</link>
			</item>
	<item>
		<title>[Ruby] 集合知プログラミング 03</title>
		<description>オライリー「集合知プログラミング」のPythonサンプルコードをRubyに翻訳していく作業ログ。３回目。



2.3.4 評者をランキングするのサンプルコードをRuby化

[code]
def top_matches( prefs, person, n=5, similarity=:sim_pearson)
  scores = prefs.keys.select{&#124;i&#124; i != person}.map do &#124;other&#124;
    [ method(similarity).call(prefs,person,other), other ]
  end
  return scores.sort.reverse[0...n]
end

p top_matches( critics, 'Toby', 3 )

=> [[0.99124070716193, "Lisa Rose"], [0.924473451641905, "Mick LaSalle"], [0.66284898035987, "Claudia Puig"]]

[/code]

2.4 アイテムを推薦するのサンプルコードをRuby化

[code]
def get_recommendations( prefs, person, similarity=:sim_pearson )
  totals ...</description>
		<link>http://www.func09.com/wordpress/archives/250</link>
			</item>
	<item>
		<title>[Ruby] 集合知プログラミング 02</title>
		<description>オライリー「集合知プログラミング」のピアソン相関によるスコア計算のサンプルプログラムをRubyに置き換えたもの



[code]
def sim_pearson( prefs, person1, person2 )

# 両者が互いに評価しているアイテムのリストを取得
  si = prefs[person1].keys &#38; prefs[person2].keys

# 要素の数を調べる
  n = si.size

# 共に評価しているアイテムがなければ0を返す
  return 0 if n == 0

# 配列をブロックで収集し、合計するメソッド
  def map_sum( list, &#38;block )
    list.map{&#124;i&#124; yield(i) }.inject(0.0){&#124;res,item&#124; res += item }
  end

# すべての嗜好を合計する
  sum1 = map_sum( ...</description>
		<link>http://www.func09.com/wordpress/archives/247</link>
			</item>
	<item>
		<title>JavaScriptで文字列リテラルは Stringクラスのインスタンスではない</title>
		<description>最近人にプログラミングを教えるというような事があって、「オブジェクトの正体」を理解してもらおうという目的から
いろんなリテラルをinstanceofにかけていました（FireFox3のFireBugで）。

[code]
[1,2,3] instanceof Object // => true
{ a:0, b:1} instanceof Object // => true
[/code]

こんな感じで。
しかし文字リテラルの挙動が期待と違っていました。

[code]
"a" instanceof Object // => trueかと思いきやfalse
"a" instanceof String // => trueかと思いきやfalse
[/code]

ちょっと待ってほしい。
文字リテラルも文字列クラスのインスタンスですよー、なんて解説をしようと思ってたのに
これじゃぁ、文字リテラルはStringオブジェクトじゃないという事になってしまう。

事実として

[code]
"hoge".sub("o","a") // => "hage"
[/code]

というコードが実行できるのだから、文字列リテラルがStringオブジェクトじゃないと話が合わない。だってsubメソッドはStringのインスタンスメソッドじゃないか！

結論

答えはここにありました。

Literals - MDC（文字列リテラル）

String Object - MDC #文字列リテラルは String オブジェクトとは別物 


  文字列リテラルの値でなら、String オブジェクトのどんなメソッドでも呼び出すことができます。JavaScript が自動的に文字列リテラルを一時的な String オブジェクトに変換し、メソッドを呼び出し、その一時的な String オブジェクトを破棄するのです。String.length プロパティを文字列リテラルで使うこともできます。


という事なんですって。

つまり、文字列リテラルの状態では確かにStringのインスタンスではないけれど、メソッドを呼び出す時はJavaScriptがStringオブジェクトに変換していると。なるほど。

ちなみにこのエントリーの内容はMozilla FireFoxでしか試していませんし、Mozillaのサイトでしか結論を見つけていませんので、他のブラウザでどうなのかは一切調べてませんので悪しからず。誰か暇な人は調べてトラバください。
 </description>
		<link>http://www.func09.com/wordpress/archives/244</link>
			</item>
	<item>
		<title>[Ruby] 集合知プログラミング 01</title>
		<description>オライリーの「集合知プログラミング」を購入したので読み始めている。
最近はプログラミング本よりビジネス本が読みたい気分なんだけど、何故か買ってしまった。買ってしまったからにはちゃんと読もう。

でもこの本のサンプルコードは全部Pythonで書かれている。Pythonはちょっとかじったことがある程度で全然覚えていない。特に乱用されているリスト内包がよくわからない。

ので、本書内で出てくるサンプルコードを淡々とRubyコードに翻訳していく。自分のメモ用なので本書のどのページのどれだとかをいちいち書くこともないと思う。試しに一本やってみたが、Rubyへの翻訳はそんなに難しくない。難しいのはPythonのコードを写経し、エラーが出ずに動かすまでだ。

[code]
critics = {
  'Lisa Rose' =>
  {
    'Lady in the Water' => 2.5,
    'Snakes on a Plane' => 3.5,
    'Just My Luck' => 3.0,
    'Superman Returns' => 3.5,
    'You, Me and Dupree' => ...</description>
		<link>http://www.func09.com/wordpress/archives/241</link>
			</item>
	<item>
		<title>Shur.inにブックマークレットの機能を追加しました。</title>
		<description>Shur.inにブックマークレットの機能を追加しました。

ページ内の「もっと」をクリックして、下の方にある
「このリンクをブックマークに登録すると、今見ているページをわりと短くできるよ」
というリンクをブックマークに登録してください。

今見ているページをいつでもわりと短くすることができます。

気が向いたらFireFoxのプラグインとかにしたいっすね。
 </description>
		<link>http://www.func09.com/wordpress/archives/239</link>
			</item>
	<item>
		<title>URLをわりと短くするサービス「shur.in」を作った。</title>
		<description>URLをわりと短くするサービスhttp://shur.in/をリリースしました。



最近はてな界隈で話題のIT業界のえがちゃん
サービスの内容はどうあれ、週に１つ２つはサービスをリリースする勢いは見習いたいものだと感心していた。

で、えがちゃんが作ってる数多くのサービスの中で
サイトURL短縮君つー、tinyurlライクなサービスがあって
URL圧縮サービスの仕組みとか全く考えたことが無かった僕は、えがちゃんやるなーと思っていたのだけど
ただ単にqurl.comのAPIを叩いているだけだった。
全然サービスでもなんでもねーー。

というわけで自分で考えつつ作ってみた。実装は３〜４時間くらいで、ドメイン取るのに時間がかかった・・・。

仕組みは簡単で

2,176,782,336（36の6乗）からランダムに数字を選んで、それをPKとしてDBにURLを保存。
PKの数字を36進数に変換して一緒に保存しておくだけ。

rubyは36進数の相互変換が超ラクチンなので簡単だった。

[code]
code = rand(36**6).to_s(36)
code.to_i(36)
[/code]
 </description>
		<link>http://www.func09.com/wordpress/archives/237</link>
			</item>
	<item>
		<title>パスワードをシンプルに管理できるHummingPassというサービスをリリースしました。</title>
		<description>

パスワードをシンプルに管理できるHummingPassというサービスをリリースしました。ベータ版です。

HummingPassβ

mixiやTwitterやGoogleなど、どんどん増えていくアカウント情報をオンライン上で一括管理するためのサービスで、タグによる分類が可能です。

もともと自分のために作っていたのですが、２週間前のRails on Award 2008の存在をしり、ほぼ全部作り直しました。

デザイン、コーディング、JavaScript、システム、サーバ、全部ひとりでやりました。

どうぞ、よろしくお願いします。
 </description>
		<link>http://www.func09.com/wordpress/archives/235</link>
			</item>
	<item>
		<title>[Rails] 個人Webサービス</title>
		<description>こんにちはfunc09です。

Rails on Award2008に出品すべく、Webサービスを誠意作成中です。

僕はHTMLオペレーターから始まり、デザイナに転向し、Flashデベロッパに転向し、今プログラマ兼サーバ管理者という節操のないWeb人生を渡って来ていますので、デザインからサーバ構築まで全部ひとりでやってます、というのが最大の売りです。

今週末中にはリリースできると思うので、よろしくおながしまつ。
 </description>
		<link>http://www.func09.com/wordpress/archives/233</link>
			</item>
	<item>
		<title>[ruby] インスタンス変数を連番で作る</title>
		<description>タイトルの通り。

Hogeクラスにhoge1〜hoge10までのインスタンス変数を作って、パブリックメソッドにする場合、以下のような感じで書ける。

[code]
class Hoge
  attr_accessor *Array.new(10){&#124;i&#124; "hoge#{i}".to_sym }
  def initialize
    10.times do &#124;i&#124;
      self.instance_variable_set("@hoge#{i}".to_sym,i)
    end
  end
end

hoge = Hoge.new
p hoge
p hoge.hoge1

[/code]

もっときれいに書けるかな
 </description>
		<link>http://www.func09.com/wordpress/archives/232</link>
			</item>
	<item>
		<title>Flashが埋め込まれているURLを調べる</title>
		<description>ブログパーツのようなFlashで、いろいろなサイトに埋め込まれるSWFの
埋め込まれているページのURLを取得する方法。

[code]
import flash.external.*;
var locationHref:String = String(ExternalInterface.call("function(){return location.href}"));
[/code]

ExternalInterface.callの１番目の引数は、呼び出すJavaScriptのメソッド名という事になっていますが

[code]
ExternalInterface.call("myMethod","args1","args2");
[/code]

は単純に以下のようなJSが実行されているものと考えられるので

[code]
eval("myMethod").apply(window,["args1","args2"]);
[/code]

まぁ、ようするに無名関数をFlash側で引数としてあげればいいと。
 </description>
		<link>http://www.func09.com/wordpress/archives/231</link>
			</item>
	<item>
		<title>軽量なPHPフレームワークCodeIgniter</title>
		<description>CodeIgniterというフレームワークがなかなか良い。

PHPのフレームワークではCakePHPをよく利用するのだけれど、使えば使うほど何がゴールなのかわからないフレームワークだなと感じる。非常にRuby on Railsに似ているのだけど、RailsはRubyだから成り立っているような側面が多いから、結局PHPで実装しようとすると非常に中途半端になる。CakePHPは高機能だけど、おせっかいだし、そのおせっかいさも中途半端だなと思う。Railsも随分おせっかいだけど、かゆいところに手が届きすぎるくらい徹底的におせっかいだ。

CodeIgniterは見るからにシンプルで軽量。PHPでスクラッチやセミスクラッチするのは面倒だけど、おおげさなフレームワークは必要ないような時はぴったりだと思う。

最低限のMVCは用意されていて、あとはPHPとヘルパーライブラリでがんばれ、フレームワーク特有の俺節はあんまりないよ。そんなフレームワークな感じがする。
 </description>
		<link>http://www.func09.com/wordpress/archives/230</link>
			</item>
	<item>
		<title>passengerで開発環境(development)</title>
		<description>一ヶ月に１エントリーは書かないと・・・。

PassengerでRailsのdevelopment環境を動かす方法。
恐らくPassenger2以降のみです。

[code]

    ServerName www.hoge.com
    DocumentRoot /home/hoge/hogeproject/public
    RailsEnv development
    RailsAllowModRewrite off

[/code]

参考
http://w.koshigoe.jp/study/?%5BRuby%5D+Passenger#l20
 </description>
		<link>http://www.func09.com/wordpress/archives/229</link>
			</item>
	<item>
		<title>JavaのString#hashCode()をRubyで再現</title>
		<description>Javaで作ってあるアプリをiPhoneに移植しようと思ったが、まずObjective-Cがわからないので、Rubyに移植してみようと考えた。

移植元のアプリの中でさらっとString#hashCode()を使っていて困った。

http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/java/lang/String.html#hashCode()


この文字列のハッシュコードを返します。String のハッシュコードは、次の方法で計算します。
 s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]


上記の通りの計算をしてもRubyでは同じ数値にならない。
どうもJavaのintとRubyのIntegerは挙動が違うからのようだ。

java のInteger int 最大値超えるとどうなるの&#60;br/>
http://becomehappy.orz.hm/smithlog/article.php?id=370

Javaのintは-0x80000000~0x7fffffffの間をぐるぐるループしているらしい。&#60;br/>
最大値（2147483647）を超えたら最小値（-2147483648）に戻してやる気遣いが必要だ。

というわけで作ってみたのが下記。

hashcode_gen.rb
[code]

!/usr/bin/env ruby

module EmurateJavaStringHashCode
  def to_hashcode
    max = 2 ** 31 - 1 # Javaのint最大値
    min = -2 ** 31 # Javaのint最小値
    h = 0
    n = ...</description>
		<link>http://www.func09.com/wordpress/archives/228</link>
			</item>
	<item>
		<title>[works] eyeVioがHDビデオに対応</title>
		<description>eyeVioがHD動画に対応してます。

http://eyevio.jp/

今回もいつも通り、動画のプレイヤーと、JavaScriptあたりをやりました。

FlashPlayerは7で作っているのでExternalInterfaceクラスが使えないわけですが、
それでも一生懸命JavaScriptと連携しています。

SWFからダイナミックにHTMLのレイアウトを弄ったりして、なかなか楽しいです。

今回途中で非同期処理の管理に嫌気がさしたのでAS2用のスレッドライブラリを作りました。

AS3ではSparkの「そうめん」のような素晴らしいライブラリがあるんですが、AS2向けでシンプルなのは見つからなかったので
自作で

[js]
new Sequence(
  new Wait(1),
  new XMLLoad('hoge.xml'),
  new Wait(1),
  new FunctionJob(this,this.normalfunc)
).start();
[/js]

こんな感じで書けるように。

もともとのソースコードのコールバック関数をそのまま弄らずシーケンス処理に組み込めるように
関数をひとつのスレッドとして利用できるようにしたのが正解でした。

非同期の整理のつもりでスレッドライブラリを作りましたが、メソッドが集中しやすいコントローラー系クラスの処理分散にも効果を発揮してウハウハ。

時代遅れのAS2なので、気合いをいれて拡張していくつもりはサラサラないけど、
気が向いたら公開したいですね。
 </description>
		<link>http://www.func09.com/wordpress/archives/227</link>
			</item>
	<item>
		<title>KDDIのSMTPリレーサーバ</title>
		<description>家のサーバから外にメールが送信できなくて、ハマっていたのだけど
プロバイダのOP25Bという対策の所為だということに、やっと気付いた。

うちはKDDI
下記のページを探すのに２〜３時間かかった。

http://www.auone-net.jp/support/trouble/mail_other.html

relay-mta.auone-net.jp

KDDIはサポートサイトをFlexで作ったり、Macで表示されなかったり
かなり酷いと思います。。
 </description>
		<link>http://www.func09.com/wordpress/archives/226</link>
			</item>
</channel>
</rss>
