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

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

5月12日、第一回 PlaggerConference に参加してきました。
場所はデジタルハリウッド池袋校です。


Plaggerは、Shibuya.pm会長の宮川さん(SixApart)が中心になって開発を行っているインストール型のFeedAggregatorです。以前から気になっていたのですが、使った事が無かったのでとりあえずConferenceに行ってみることに。

Plaggerは、Feedに限らず、様々なデータの形式を変換したり変更や修正を加えたりする事ができる、非常に拡張性に富んだ万能コンバータですね。

Plaggerを使うと、APIを利用しつつ広告を剥ぎ取ったりするプラグインを、グリースモンキー的な感覚で作れてしまいます。いろんな意味でグリースモンキーに似ています。

現時点ではインストールが難解なため、プログラマ以外には使う人はいない状態です。
しかし、簡単に誰でも使えて、プラグインを多人数でシェアできるような仕組みを作ると、非常に便利である一方で、法的な面で問題に直面する気がします。
なので、考えようによっては現状のままの方が良いのかもしれません。

いずれにしても、インターネットのトラフィックの流れを変えるパワーを秘めた存在として、今後の動向は注目に値します。

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

posted by Png genki on Tue 16 May 2006 at 09:48

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

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

今回は404 Blog Not Foundでお馴染みの小飼さんのご自宅で開催されました。
非常に素晴らしい環境を利用させていただいことに感謝いたします。

参加者は、だいたい前回と同じくらいで23名。
最近各所で遭遇するようになってきた面々や、CNetブロガーの山下さん、そしてもちろん小飼さんも参加されていました。

今回も前回同様、演習問題を黙々と解いていくという形式で進められました。
実際に解いた演習問題は1.32と1.33です。

何問か問題を解いてみて、ようやく括弧が見えなくなる感覚が芽生えてきました。

演習問題1.33については、過去の演習問題で作成した関数 'prime?' を利用する必要がある(しなくても良いけれど、時間が掛かりそうな)ため、Wikiからコピーしてきました。

filtered-accumulate を構成する問題の答え合わせを行っているときに、filterを使わないで同じ事をする事は可能かどうか、というテーマでいろいろな意見が出て盛り上がっていました。

(define (filtered-accumulate combiner null-value term a next b filter)
 (if (> a b)
   null-value
   (combiner (if (filter a) (term a) null-value)
        (filtered-accumulate combiner null-value term (next a) next b filter))))


combiner が受け取るのは a ではなく (term a) なので、term が全単射でないかぎり、逆写像が存在しないので、元の a の値が何だったのかわからず、combiner の定義の仕方だけでは filter と同等のものを構成できない場合もあるかなー、と思います。
どうでしょう。

というわけで、とても楽しい時間がすごせました。

帰り際に小飼さんの奥様からコーヒーを振舞って頂きました。
ありがとうございます。

小飼さん自身からも、壁面を覆う巨大な書架(うらやましい!)よりお勧めの本を何冊か紹介していただきました。ロジャー・ペンローズ氏の著書は読んだことが無かったですが、機会があったらぜひ読んでみたいですね。恥ずかしながらペンローズ・タイリングのペンローズ氏が同氏と同一人物であると初めて知りました。もっと昔の別なペンローズさんかとばかり思っていました。

ということで、次週は演習1.34から開始。各自写経をすませておくべしとの事。

最後に、今回使ったコードを置いておきます。
----
;; -*- Mode: scheme; indent-tabs-mode: nil; coding: utf-8; -*-

;; 1.2.6 素数性のテスト
(define (square x) *1)

(define (smallest-divisor n)
 (find-divisor n 2))

(define (divides? a b)
 (= (remainder b a) 0))

(define (find-divisor n test-divisor)
 (cond ((> (square test-divisor) n) n)
    ((divides? test-divisor n)  test-divisor)
    (else (find-divisor n (+ test-divisor 1)))))

(define (prime? n)
 (if (< n 2)
   #f
   (= n (smallest-divisor n))))

;; Fermatの小定理
;(begin                 ; for gauche
; (define (square x) *2)
; (use srfi-27)
; (define random random-integer))

(define (expmod a n m)
 (cond ((= n 0) 1)
    ((even? n)
     (remainder (square (expmod a (/ n 2) m)) m))
    (else
     (remainder *3 m)) m))))

(define (fermat-test n)
 (define (try-it a)
  (= (expmod a n n) a))
 (try-it (+ 1 (random (- n 1)))))

(define (fast-prime? n times)
 (cond ((= times 0) #t)
    ((fermat-test n) (fast-prime? n (- times 1)))
    (else #f)))

;; 問題 1.22
;; gauche用runtime (microsecを返す)
(define (runtime)
 (use srfi-11)
 (let-values (((a b) (sys-gettimeofday)))
       (+ *4 b)))

(define (timed-prime-test n)
 (newline)
 (display n)
 (start-prime-test n (runtime)))

(define (start-prime-test n start-time)
 (if (prime? n)
   (report-prime (- (runtime) start-time))))

(define (report-prime elapsed-time)
 (display " *** ")
 (display elapsed-time))

(define (search-for-primes beg end)
 (let loop ((i beg))
  (cond ((> i end) #f)
     (else
      (if (odd? i) (timed-prime-test i))
      (loop (+ i 1))))))
;
; ここから下が僕の書いたコード


(define (cube x) *5)
(define (sum-integers a b)
 (if (> a b)
   0
   (+ a (sum-integers (+ a 1) b))))
(define (sum-cubes a b)
 (if (> a b)
   0
   (+ (cube a) (sum-cubes (+ a 1) b))))
(define (pi-sum a b)
 (if (> a b)
   0
   (+ (/ 1.0 *6)) (pi-sum (+ a 4) b))))
(define (sum term a next b)
 (if (> a b)
   0
   (+ (term a)
     (sum term (next a) next b))))
(define (identity x) x)
(define (inc x) (+ x 1))
(define (integral f a b dx)
 (define (add-dx x) (+ x dx))
 *7) add-dx b)
   dx))
(define (even n)
 (= (remainder n 2) 0))
(define (integral_s f a b n)
 (define h (/ (- b a) n))
 (define (y k)
  (define c (if (or (= k 0) (= k n))
         1
         (if (even k) 2 4)))
  *8))))
 *9
   (/ h 3.0)))
(define (sum_i term a next b)
 (define (iter a result)
  (if (> a b)
    result
    (iter (next a) (+ result (term a)))))
 (iter a 0))
(define (integral_i f a b dx)
 (define (add-dx x) (+ x dx))
 *10) add-dx b)
   dx))
(define (product factor a next b)
 (if (> a b)
   1
   *11
     (product factor (next a) next b))))
(define (product_i factor a next b)
 (define (iter a result)
  (if (> a b)
    result
    (iter (next a) *12))))
 (iter a 1))
(define (factorial n)
 (product identity 1 inc n))
(define (sq x) *13)
(define (approx_pi n)
 (define (y k) (/ (sq (+ k 4)) (sq (+ k 3))))
 (define (next x) (+ x 2))
 *14) (product_i y 0 next n)))

; ここから下が今回書いたコード
;
(define (accumulate combiner null-value term a next b)
 (if (> a b)
   null-value
   (combiner (term a)
        (accumulate combiner null-value term (next a) next b))))
(define (accumulate_i combiner null-value term a next b)
 (define (iter a result)
  (if (> a b)
    result
    (iter (next a) (combiner result (term a)))))
 (iter a null-value))
(define (filtered-accumulate combiner null-value term a next b filter)
 (if (> a b)
   null-value
   (combiner (if (filter a) (term a) null-value)
        (filtered-accumulate combiner null-value term (next a) next b filter))))
(define (e_1_33_a n)
 (filtered-accumulate + 0 sq 1 inc n prime?))
(define (e_1_33_b n)
 (define (relatively-prime? i)
  (= (GCD i n) 1))
 (filtered-accumulate * 1 identity 1 inc n relatively-prime?))

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

  1. 1 x x

  2. 2 x x

  3. 3 a (expmod a (- n 1

  4. 4 a 1000000

  5. 5 x x x

  6. 6 a (+ a 2

  7. 7 (sum f (+ a (/ dx 2.0

  8. 8 c (f (+ a (* k h

  9. 9 (sum y 0 inc n

  10. 10 (sum_i f (+ a (/ dx 2.0

  11. 11 (factor a

  12. 12 result (factor a

  13. 13 x x

  14. 14 4 (/ 2.0 (+ n 4

posted by Png genki on Thu 11 May 2006 at 02:52

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

javascripts, stylesheets, images などの静的コンテンツを含むRailsのプラグインを作成している所なのですが、問題にぶち当たりました。

本家のこのへんでも議論されているようなのですが、現時点でも良い方法は見つかってないんでしょうかね。

方法は2通りぐらいあって、

(1) install.rb で Rails Root の public 以下にコピーする
(2) RailsEngines プラグインを利用する
 →プラグインローカルにpublicディレクトリを作るとその中を見てくれるようになるらしい。

という感じです。
(2) の仕組みはスマートなのですが、staticコンテンツにアクセスするのにAPを通るようになる気がします。(1)の場合は、uninstallする時にどうするのか、という問題が。

Railsのソースを読む必要が出てきた感じですね。

plugin.rb

で、悩んだ挙句、結局Rails本体に plugins の uninstall hook 機能を追加してみる事に。
片言の英語で頑張って本家の方にもPostしておきました。

[PATCH] Uninstall hook for plugins

これによって、install.rb と似たような uninstall.rb というファイルが出来るので、
その中に静的コンテンツの除去処理を入れればOKです。

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

posted by Png genki on Mon 8 May 2006 at 14:22

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

Cygwinには dig コマンドがないので、ちょっと不便な時があります。

そこで、こちらのサイトから BIND for Cygwin のバイナリを持ってきて導入します。

その中に dig が入っています。

$ tar -xvjf bind-9.2.2-1.tar.bz2
$ cp -R opt/bind /opt

あとは、/opt/bind/bin にPATHを通します。

最後に、Cygwinには /etc/resolv.conf ファイルが無いので作成します。

これで dig が使えるようになります。

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

posted by Png genki on Fri 5 May 2006 at 05:18
Contents
ネットワークの海の中で
素人くさいSICP読書会#13レポート
キャズムに架ける橋
PlaggerCon#1レポート
素人くさいSICP読書会#12レポート
静的コンテンツを含むRailsプラグインの作成について
Cygwinでdigを使う
Comments
瀧内元気: MacOS版は以下にあります * [genki/ViMouse](https://githu... '23-1
dsjf: https://gist.github.com/6bf1bf2c3cbb5eb6e7a7 これ... '13-1
瀧内元気: おお、チェックしてみます。thx! '11-12
overisland: Reeder for iPhone もこの UI を実装していますね。 '11-12
瀧内元気: その情報は見たのですが、以下のサイトによると、現在はまた必要になってるっぽいんですよね。 ... '11-12
Services from s21g
twpro(ツイプロ)
Twitterプロフィールを快適検索
地価2009
土地の値段を調べてみよう
MyRestaurant
自分だけのレストラン手帳
Formula
ブログに数式を埋め込める数式コミュニティ