This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/32

Ruby on Railsでは、URLのマッピングに関する情報を routes.rbファイルに記述します。これを記述する際に、URLを丸ごとパラメータとして渡したい事があります。例えば、はてなブックマークでは、特定のURLに関するエントリーの情報を参照するためのURLは、こんな感じになります:

http://b.hatena.ne.jp/entry/http://foo.bar.com/

これがdel.icio.usの場合、URLを直接指定するのではなく、md5を使ったダイジェストを渡すようになっています。URLの規格としては後者の方が正しいアプローチなのですが、アドレス記入欄にURLを手入力する場合や、グリースモンキーから利用する場合を考えると、md5を使わずに済んで楽なので、前者の方法も捨てがたいわけです。

では、これと同じ事をRailsでやるにはどうしたら良いでしょうか。単純に考えると、routes.rbファイルに;

map.connect 'entry/:url', :controller => 'entry', :action => :list

という感じに書けば良さそうです。しかし、実際にこのコードを実行してみると、URLに含まれる'/'がデリミタだと見なされてしまうため、うまく認識してくれません。

最後の'/'より後に続く部分をまとめてパラメータとして捕捉するためには、下記のように記述する必要があります。

map.connect 'entry/*url', :controller => 'entry', :action => :list

こうする事で、params[:url] には ActionController::Routing::PathComponent::Result オブジェクトが渡されます。このオブジェクトの実体は、デリミタ'/'で区切られたパートを保持する配列です。また、to_sメソッドを呼び出す事で、元のURLを再現できるようになっているので、

url = params[:url].to_s

とすると、パラメータとしてURLを丸ごと渡す事ができます。

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/32

posted by Png genki on Fri 26 May 2006 at 21:43

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/31

Login Generator - ユーザ認証 へのトラックバック

転ばぬ先の杖という事で、login_generatorを初めて使った時にはまりやすい罠の情報。

login_generatorが生成するaccountのfunctional testのコードは、Fixtureのデータを@bob のような感じで参照できる、instantiated_fixturesという機能を使うように書かれています。

しかしながら、Railsのデフォルト設定ではこの機能はOFFになっているので、rake test:functionals を実行すると失敗します。

この機能をONにするには、test/test_helpler.rbの中にある

self.use_instantiated_fixtures  = false

という行を true に変えればOKです。

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/31

posted by Png genki on Fri 26 May 2006 at 11:32

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/30

Debian(sarge)にMySQL5.0を導入する方法のメモです。

/etc/apt/sources.list に下記の2行を追加します。

deb http://ftp.de.debian.org/debian/ testing main contrib non-free
deb-src http://ftp.de.debian.org/debian/ testing main contrib non-free

そして

# aptitude update
# aptitude install mysql-server-5.0

で、質問にYesで答えて完了。

途中で mysql のバージョンを変更すると、下記のようなエラーが出る場合があります。

Lost connection to MySQL server during query: SELECT version FROM schema_info

そのような場合、ここのサイトに書かれている事が解決の助けになるかもしれません。

僕の場合、上記の問題が発生したため、上記サイトの情報と、このあたり ([ruby-list:33513] Re: Mysql/Ruby のコンパイル)の情報を参考にしつつ、下記のように対処しました。

# gem install mysql
# cd /usr/local/lib/ruby/gems/1.8/gems/mysql-2.7
# vim extconf.rb

ここで、extconf.rbの中身(L14)を下記のように修正:

  #while not find_library('mysqlclient', 'mysql_query', lib, "#{ lib }/mysql") do
  #  exit 1 if libs.empty?
  #  have_library(libs.shift)
  #end
  have_library("mysqlclient")

あとは、

# ruby extconf.rb
# make install

でOK!

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/30

posted by Png genki on Thu 25 May 2006 at 19:03

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/29

素人くさいSICP読書会に参加してきました。

今回も、前回に引き続いてサイボウズ・ラボ様にて開催されました。素晴らしい環境を利用させてくださいましてありがとうございます。

参加者数は、だいたい20名前後でした。前回同様、演習問題を黙々と解いていくという形式で進められました。今回の範囲は、演習問題 1.37〜1.39でした。連分数に関するところです。連分数を使って、πや自然対数の底の導出や、正接関数の構成などを行いました。

ということで、今回使ったコードを置いておきます。

; 5/24 sicp#14
;
(define (cont-frac n d k)
  (define (frac i)
    (if (= i k)
        (/ (n i) (d i))
        (/ (n i)
           (+ (d i) (frac (inc i))))))
  (frac 1))
(define (dec n) (- n 1))
(define (cont-frac-i n d k)
  (define (frac i result)
    (if (= i 0)
        result
        (frac (dec i)
              (/ (n i) (+ (d i) result)))))
  (frac k 0))
(define (e-38 k)
  (/ 1 (cont-frac-i
        (lambda (i) 1.0)
        (lambda (i)
          *1 1) 2 1)
             (+ (floor (/ i 3)) 1)))
        k)))
(define (tan-cf x k)
  (define (n i) (if (= i 1) x (- *2)))
  (define (d i) (dec *3))
  (cont-frac-i n d k))

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/29

  1. 1 (if (= (remainder i 3

  2. 2 x x

  3. 3 2 i

posted by Png genki on Thu 25 May 2006 at 10:09

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/28

今月は、各所でRailsアプリケーションの国際化が話題になっていたようですね。

Ruby on Rails > Re: no one cares about i18n (was [OT]: Asking questions on t
Rails i18n Gets a Mailing List

中でも秀逸なのがこちらの記事

InternationalizationComparison

Railsアプリケーションの国際化における選択肢とその比較を行った記事が投稿されていました。

この表を見るかぎり、現時点ではむとうさんのRubyGetTextが良い感じですね。

RubyGetTextの使用法に関しては以下のサイトが詳しいです。

Ruby on RailsへRuby-GetTextの適用
Using Gettext To Translate Your Rails Application

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/28

posted by Png genki on Tue 23 May 2006 at 15:07

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/27

単にヘッダとフッタを消すだけですが。
http://js.gthp.net/gm/ldr/without_header_footer.user.js

headerとfooterというidを使っているサイトなら何でも使えます。

ファイル名の末尾に .user.js ってつけると自動でインストールしてくれるんですね。

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/27

posted by Png genki on Tue 23 May 2006 at 00:13

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/26

5/21日のRails勉強会@東京#6に参加してきました。

今回も前回同様オープンスペース形式で、前半・後半に分かれて7つのセッションが行われました。

■前半
・Rubricksの紹介
・Typo改造(I18N)
・SeaserでRails
・ChangeLogを淡々と読むよ

■後半
・Validation
・Mongrelのソースを読むよ
・AWDwRのテストの章を読むよ

今回は「ChangeLogを淡々と読む」と「Mongrelのソースを読む」に参加しました。
□ChangeLogを淡々と読む
Rails1.1以降の変更を追いかけて面白そうな機能を探すために、Railsのコンポーネントである、ActiveRecord、ActionPack、ActiveSupport、それからRakeのChangeLogを(本当に)淡々と読みました。5人の参加者でそれぞれ分担し、僕はActionPackの最新Logを読んでいきました。

・routesでサブパスのデリミタとして「;」が使えるようになった
・assert_recognizesの第2引数でmethodを指定できるようになった。
・link_to_functionでRJSテンプレートっぽいものをその場で記述できるようになった
・remote_form_for が form_for と同じように使えるようになった
・Prototype 1.5.0_rc0 にアップデート

定期的にChangeLogを追いかけるのは面白いですね。

□Mongrelのソースを読むよ
最近流行のMongrelのソースを読みました。SCGIの開発者がMongrelに移ったらしいという話ですが、確かにMongrelとSCGIは使い方が似ていますね。static file は Lighttpdに任せるという使い方だと、なお更SCGIと似たような立ち位置になります(この辺の図がわかりやすい)

起動が早いので、 development 環境で使用するには持って来いのようです。

□懇親会
懇親会では、荻野さん周辺で数学の話に花が咲いていました。やっぱり数学は面白いですね。数論の話、P≠NP問題の話…。クレイ数学研究所のミレニアム賞金問題の話も出ていました。

・リーマン予想
・バーチ&スウィンナートン・ダイアー予想
・P≠NP 問題
・ホッジ予想
・ポアンカレ予想
・ヤン-ミルズ方程式の質量ギャップ問題
・ナビエ-ストークス方程式の解の存在問題

この問題を解いたらそれぞれ100万ドルですが、全く歯が立たないです。

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/26

posted by Png genki on Mon 22 May 2006 at 12:02

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/25

P2P技術の本当に面白いところは、ランニングコスト0で様々なサービスを提供できる事です。

ランニングコストが0であるということは、放っておいても勝手に存在し続けられるという事です。

例えばWinny は、まるでそれが自立した生命であるかのように、誰も運営していなくても、サービスを提供し続けています。

これはネットワークの上に生まれた新しい高次元の生命なのかもしれません。

生物でいうなれば原始多細胞生物です。

ネットワークの海の中で、二度目のカンブリア爆発が起こる未来を夢想してみました。

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/25

posted by Png genki on Sat 20 May 2006 at 09:44

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/24

今週も、同僚のよしてつさんと一緒に素人くさいSICP読書会に参加してきました。

今回はサイボウズ・ラボ様のセミナールームにて開催されました。
毎度の事ながら、非常に素晴らしい環境を利用させていただいことを感謝いたします。

参加者は、だいたい20名前後だったでしょうか。前回同様、演習問題を黙々と解いていくという形式で進められました。今回の範囲は、演習問題 1.34〜1.36です。ようやく lambda で出てきたところですね。主に、関数の不動点(fixed point)の算出を行いました。

関数 f(x) の不動点とは、f(x) = x となるような x の事です。グラフを(x,y)平面にプロットして考えると、y = f(x) と y = x の交点が全て不動点になります。なので、不動点は一個であるとは限りません。不動点が存在しない f(x) もありえます。

今回使ったアルゴリズムは、初項 x_0 としてある値を設定し、続く数列を x_i = f(x_(i-1)) } で計算した時の、i → ∞ での極限を求める事で不動点に収束させるというものです。

こちらのサイトに図解入りのわかりやすい説明がありますね。

ということで、今回使ったコードを置いておきます。
----
; 5/17 SICP#13
(define (square x) *1)
(define (f g)
 (g 2))
(define (average a b)
 (/ (+ a b) 2))
(define (search f neg-point pos-point)
 (let ((midpoint (average neg-point pos-point)))
  (if (close-enough? neg-point pos-point)
    midpoint
    (let ((test-value (f midpoint)))
     (cond ((positive? test-value)
         (search f neg-point midpoint))
        ((negative? test-value)
         (search f midpoint pos-point))
        (else midpoint))))))
(define (close-enough? x y)
 (< (abs (- x y)) 0.001))
(define (half-interval-method f a b)
 (let ((a-value (f a))
    (b-value (f b)))
  (cond ((and (negative? a-value) (positive? b-value))
      (search f a b))
     ((and (negative? b-value) (positive? a-value))
      (search f b a))
     (else
      (error "Value are not of opposite sign" a b)))))
(define tolerance 0.00001)
(define (fixed-point f first-guess)
 (define (close-enough? v1 v2)
  (< (abs (- v1 v2)) tolerance))
 (define (try guess)
  (let ((next (f guess)))
   (if (close-enough? guess next)
     next
     (try next))))
 (try first-guess))
;(define (sqrt x)
; (fixed-point (lambda (y) (/ x y)) 1.0))
(define (sqrt x)
 (fixed-point (lambda (y) (average y (/ x y))) 1.0))
; ex 1.35
(define phi
 (fixed-point (lambda (x) (+ 1 (/ 1 x))) 1.0))
; ex 1.36
(define (fixed-point-v f first-guess)
 (define (close-enough? v1 v2)
  (< (abs (- v1 v2)) tolerance))
 (define (try guess step-count)
  (let ((next (f guess)))
   (display step-count)
   (display "\t")
   (display guess)
   (newline)
   (if (close-enough? guess next)
     next
     (try next (inc step-count)))))
 (try first-guess 1))

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/24

  1. 1 x x

posted by Png genki on Thu 18 May 2006 at 05:45

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/23

新規に開発したサービスを、初期の目標であるアーリーマジョリティにリーチさせる経路は、大体次の3つの方法しかないと思います。

(1)イノベイターやアーリーアダプターを経た口コミ
(2)お金を掛けたプロモーションによるダイレクトアピール
(3)既にアーリーマジョリティに到達している自社サービスから誘導する

(2)を選べるのなら何の問題も無いわけですが、リスクが高めです。(1)を選ぶ場合はリスクはほとんど無いですが、ある程度のユーザ数(5万ユーザぐらいらしいです)を超えてからキャズムを超えるのが大変になります。(3)は一番楽そうですが、そのようなサービスを持っていない新興企業の場合は選択肢に入らないですね。

多くの新興サービス提供者は(1)の道を選び、そしてキャズムの壁に苦しんでいるわけです。

イノベイターに受け入れられるサービスを作れば、ある程度のユーザ数まではすんなり増えて、その後伸び悩む。あるいはマジョリティだけを見てサービスを作れば、ユーザ数が増えるスピードはかなり遅いけれども、キャズムを超えるのは簡単(むしろキャズムは存在しない)。

で、このどちらかしかありえないのかというと、そうでもないわけです。イノベイターに受けるものは一般の利用者には受けないとは限らないわけで、両者に受ける(キャズムの無い)サービスを考えれば良いわけですね。

まあそれは非常に難しい事なのだけれども。

それで何が言いたかったかというと、プロモーションにお金を掛けないのならば、イノベイターやアーリーアダプターを無視してサービスを考える事はありえないという事です。例え本当にサービスを届けたい相手がマジョリティだけだったとしても。

最初から両方に受け入れられるものを作るか、イノベイターに受け入れられるものを作って、それからキャズムを超える努力をするか。

最初からしっかりしたサービスをリリースしていくのであれば前者が、β版やα版のサービスをどんどん作っていくという立場ならば後者の方が良さそうですね。

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/23

posted by Png genki on Wed 17 May 2006 at 01:21