Friday, January 30, 2009

Rubyで平方根を求める

Scheme

   1  #!/usr/local/bin/ruby

   2  # encoding: utf-8

   3  

   4  #Newton's method

   5  def sqrt_iter(guess, x)

   6    if good_enough?(guess, x)

   7      guess

   8    else

   9      sqrt_iter(improve(guess, x), x)

  10    end

  11  end

  12  

  13  def improve(guess, x)

  14    average(guess, x/guess)

  15  end

  16  

  17  def average(x, y)

  18    (x + y) / 2

  19  end

  20  

  21  def good_enough?(guess, x)

  22    (square(guess) - x).abs < 0.001

  23  end

  24  

  25  def square(x)

  26    x * x

  27  end

  28  

  29  def sqrt(x)

  30    sqrt_iter(1.0, x)

  31  end

  32  

  33  sqrt 9 # => 3.00009155413138

  34  

  35  #fixed point method

  36  Tolerance = 0.00001

  37  def fixed_point(f, first_guess)

  38    def close_enough?(v1, v2)

  39      (v1 - v2).abs < Tolerance

  40    end

  41    def try(guess, f)

  42      _next = f.call(guess)

  43      if close_enough?(guess, _next)

  44        _next

  45      else

  46        try(_next, f)

  47      end

  48    end

  49    try(first_guess, f)

  50  end

  51  

  52  fixed_point(lambda{ |y| Math.sin(y) + Math.cos(y) }, 1.0) # => 1.25873159629712

  53  

  54  def sqrt(x)

  55    fixed_point(lambda { |y| average(y, x/y) }, 1.0)

  56  end

  57  

  58  sqrt 3 # => 1.73205080756888

  59  

  60  def average_damp(f)

  61    lambda { |x| average(x, f.call(x)) }

  62  end

  63  

  64  def sqrt(x)

  65    fixed_point(average_damp(lambda { |y| x/y }), 1.0)

  66  end

  67  

  68  sqrt 3 # => 1.73205080756888

  69  

  70  def average_damp

  71    lambda { |x| average(x, yield(x)) }

  72  end

  73  

  74  def sqrt(x) 

  75    fixed_point(average_damp{ |y| x/y }, 1.0)

  76  end

  77  

  78  sqrt 5 # => 2.23606797749998


Rubyらしく

   1  #!/usr/local/bin/ruby

   2  # encoding: utf-8

   3  class Numeric

   4    def square

   5      self**2

   6    end

   7    

   8    def sqrt

   9      sqrt_iter(1.0)

  10    end

  11    

  12    def sqrt_by_fp

  13      fixed_point(1.0) { |y| average(y, self/y) }

  14    end

  15    

  16    def sqrt_with_adump

  17      fixed_point(1.0) { |y| average_damp(y) }

  18    end

  19    

  20    private

  21    def sqrt_iter(guess)

  22      if good_enough?(guess, self)

  23        guess

  24      else

  25        sqrt_iter(improve(guess))

  26      end

  27    end

  28    

  29    def improve(guess)

  30      average(guess, self/guess)

  31    end

  32    

  33    def average(x, y)

  34      (x + y) / 2

  35    end

  36    

  37    def good_enough?(guess, x)

  38      (guess.square - x).abs < 0.001

  39    end

  40    

  41    def fixed_point(first_guess)

  42      try(first_guess) { |y| yield(y) }

  43    end

  44    

  45    Tolerance = 0.00001

  46    def close_enough?(v1, v2)

  47      (v1 - v2).abs < Tolerance

  48    end

  49    

  50    def try(guess)

  51      _next = yield(guess)

  52      if close_enough?(guess, _next)

  53        _next

  54      else

  55        try(_next){ |y| yield(y) }

  56      end

  57    end

  58    

  59    def average_damp

  60      lambda { |x| average(x, yield(x)) }

  61    end

  62  end

  63  

  64  2.sqrt # => 1.41421568627451

  65  2.square # => 4

  66  2.sqrt_by_fp # => 1.41421356237469

  67  

Scheme_Chickenをosxにインストール

バイナリを試したがうまくいかなかったのでソースから

READMEを読んだら以下でインストールまでいったみたいだ

tarの解凍が今一よくわからないtar xvfとかしたかな?


$ make PLATFORM=macosx


call-with-current-continuation.org

http://www.call-with-current-continuation.org/

Thursday, January 29, 2009

平方根の近似解法

計算機プログラムの構造と解釈の例をRubyで

   1  #!/usr/local/bin/ruby

   2  # encoding: utf-8

   3  def sqrt_iter(guess, x)

   4    if x.good_enough?(guess)

   5      guess

   6    else

   7      sqrt_iter(x.improve(guess), x)

   8    end

   9  end

  10  

  11  class Integer

  12    def sqrt

  13      sqrt_iter(1.0, self)

  14    end

  15    

  16    def improve(guess)

  17      average(guess, self/guess)

  18    end

  19    

  20    def good_enough?(guess)

  21      (guess**2 - self).abs < 0.001

  22    end

  23    

  24    private

  25    def average(x, y)

  26      (x + y) / 2

  27    end

  28  end

  29  

  30  9.sqrt # => 3.00009155413138

  31  (100 + 37).sqrt # => 11.7046999177581

Sunday, January 25, 2009

バイナリーサーチ


   1  #!/usr/local/bin/ruby

   2  # encoding: utf-8

   3  list = (1..10).to_a

   4  

   5  def bi_search(n, list)

   6    low = 0

   7    high = list.length-1

   8    while low <= high

   9      mid = low + (high - low)/2

  10      mid_value = list[mid]

  11      if n > mid_value

  12        low = mid + 1

  13      elsif n < mid_value

  14        high = mid - 1

  15      else

  16        return mid

  17      end

  18    end

  19  end

  20  

  21  list.each { |i| print "#{i}: #{bi_search(i, list)}, "}

Fibonatti最適化


   1  #!/usr/local/bin/ruby

   2  # encoding: utf-8

   3  def fib(n)

   4    case n

   5    when 0

   6      0

   7    when 1

   8      1

   9    else

  10      fib(n-2) + fib(n-1)

  11    end

  12  end

  13  

  14  

  15  def fibo2(a=0, b=1, n)

  16    if n == 0

  17      a

  18    else

  19      fibo2(a+b, a, n-1)

  20    end

  21  end

  22  

  23  range = 0..100

  24  t = Time.now

  25  p range.map { |i| fibo2 i } # => [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55]

  26  p Time.now - t # =>

  27  t = Time.now

  28  p range.map { |i| fibo i } # => [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55]

  29  p Time.now - t # =>

重要なのはスキルを上げることではない

企業の目的は利益を上げることである
利益を上げるためにできることは3つある
売上を上げること
費用を下げること
留保資金を運用することである

企業の売上と費用は
労働者の生産性でほぼ決まる
全体としての労働者の生産性が高ければ
単位期間における売上は上がり費用は下がる

労働者の生産性を上げるためには
そのスキルを上げることが重要である
しかしながらスキルは生産性を上げるための一手段に過ぎず
企業の目的ではない

スキルはないが情報を持っている者が
生産性の上で職人を凌駕することがある
情報は生産工程を細分化単純化させて
仕事を万人向けにし
ときには無駄な工程を省く

スキルは属人的であり
永続化を必要とする企業にとって
それは諸刃の剣である

Ruby injectが素晴らしい

injectの素晴らしさを知ったRubistをinject厨というらしい

[1,2,3,4].inject(0){|sum, i| i.even? ? sum+i : sum-i}

[1,2,3,4].inject([]){|arr, i| i.even? ? arr << i : arr }

[1,2,3,4].inject({}){|h, i| h[i] = "h#{i}" ; h }

Tuesday, January 20, 2009

Euler Project行き詰まってる

Problem18で行き詰まってる

各ポイントをオブジェクトに見立てて
レベル、数値、親の情報を持たせる戦略を考えてるけど
親の情報の持たせ方が難しい

さて…

Monday, January 19, 2009

Cのポインタ

プログラミング言語Cを読んでいる
ポインタのところに来て
Rubyとの違いを意識したら
理解できたような気がするのでメモ

1.値渡しと参照渡し
(Ruby)
a = 10, b = a とすると
aもbも同じオブジェクト10を指すことになる

(C)
a = 10, b = aとすると
bには10のコピーが入る
Rubyと同じように同じオブジェクトを指すようにするには
b = &aでaのアドレスをbに持たせれば
*bでaが指しているものを指すようになる

つまりRubyはデフォルトで参照渡しで
Cはデフォルトで値渡し

2.関数の引数
Cはデフォルトで値渡しなので
関数に与える引数自身を変更したい場合
例えばswap(a, b)では目的を達成できない
だからこの場合swap(&a, &b)としてアドレスを渡し
それを受ける関数側では
void swap(int *px, int *py)などとする(ここがちょっとわからない)

3.配列
int a[10]の配列宣言において
aは、その先頭アドレスを格納する
だからこれはa = &a[0]と等価であり
よって*aでその内容を参照できるようになる
さらに*(a+i)は配列aのi番目の要素を参照することになる

4.関数
void func()に対してfuncはその関数の基底アドレスを表す
だからptr = funcでptrはfuncの基底アドレスをさすことになる
このときptrの宣言はただのポインタ宣言であるint *ptrではなく
int (*ptr)()として括弧を付けて関数のポインタ宣言とする必要がある
(int *ptr()は*(ptr())と解釈されてしまうので不可)

Wednesday, January 14, 2009

そばつゆ、作ってみる?


門外不出!?美味しいそばつゆの作り方


<専門店と市販品との味のギャップ>
皆さんがざる蕎麦などを自宅で食べる時に、麺を茹でて濃縮タイプのそばつゆを2〜3倍に薄めて
作り、いざ食べてみても専門店のつゆと濃縮タイプのそばつゆとの味のギャップに不満を抱いた経験
はありませんか?
市販のものは塩辛い割にはダシの旨みが薄くてコクが無く、専門店の味とは遠くかけ離れています。
僕も以前は「専門店の味を自宅で出すのは不可能なんだろうな〜。」と諦めていました。

では何故、スーパーで市販されている濃縮つゆと専門店のつゆとは味にギャップがあるのでしょうか?
そこには市販品であるがゆえの「宿命」があったのです。
それは「だし」と「塩分」の分量が問題で、専門店本来の味を出すまでのカツオ節を入れると保存期間
に問題が出る為、常温でももたせる為には「だし」の量を減らし、逆に塩分を強くする必要があり、それ
が味に影響するのです。
専門店のそばつゆを自宅で再現するのには、素人目には凄く難しい気がしますが実際には意外と簡単
です。時間も、材料さえ用意できればゼロから始めて30分も掛かりません。

ところで、何故僕が専門店の味の作り方を語れるのかと言いますと、以前うちの職場に応援で来ていた
職人さんが、過去に10年間そば専門店で修行をしていたというのです。その専門店というのが僕の地元
では老舗中の老舗店で、「ちょっとお昼にあそこで、ざる蕎麦でも!」とは言い難いお店であり、ざる蕎麦
1人前でも1500円くらいしてしまいます。(普通は800円くらいですよね?)
(しかし、そこのお店とご本人に迷惑が掛かるので、店名公開は控えさせて頂きます)

その方に冒頭の悩みを相談したところ、あっさりと「簡単だよ!」と返され次の日にレシピをいただきました。
早速そのレシピ通りに作ったところビックリ!!本当に専門店の「あの味」が我が家で再現されているでは
ないですか!!
しかも作り方は驚くほど簡単で、特別なコツは必要ありません。さあ!みなさんも作ってみましょう!!

<基本的な作り方>
まずはそばつゆの「たれ」にあたる「かえし」の作り方です。

1・かえしの作り方

醤油・・・・100cc
みりん・・・・・27cc
砂糖・・・・・20〜25グラム

注意:上記はタレの基本材料量です。出来あがりのざるそばつゆ量は、これの4倍になる(約520cc)ので、最
終的に作りたい量に調整して下さい。ただ、このタレは1年程度なら保存がきくので多めに作ったほうが良いです。
例えば全ての量を7倍にして作れば約1リットルのタレが作れます。

また、砂糖の量は出来あがりの味を参考に、以後、調整して下さい。上記はあくまでも、某専門店の量です。

作り方
鍋に、しょうゆとみりんをまぜ、沸騰しない程度に加熱しながら砂糖をとかす。沸騰する直前に火を止めて冷ま
し、かめや、ビンなどに移してフタをせずに(ティッシュや、布などをかぶせて輪ゴムで止める)3日から1週間
寝かす。(寝かす程おいしくなる)以後は普通にフタをしていただければ1年程度は楽に保存できます。
急ぎの場合はそのまま寝かさずに作っても、市販品とは段違いの美味しさのつゆが出来上がります。
ちなみに最近の僕の場合は寝かさずにそのまま作ってしまうことが多いです(爆)
(注:減塩タイプの醤油や保存環境によっては長期保存した後、醤油が酸化したような味になる場合があります。) 

2・だしの取り方(出来あがり500ccの場合)

鰹ぶし(出来れば荒削りの荒節がベスト)20〜30グラム(軽く野球のボール一握り分くらい)
鯖ぶし(スーパーに「さば、いわしミックス」といった商品名で売ってます)20〜30グラム(同上)
上記はあくまでも目安で、実際のところは適当で良いです(笑)
ちなみに鰹節はスッキリとした旨みを出すのに対し、鯖節はコクと深みを出します。

鍋に水800cc〜1リットルを入れ、かつお節と鯖節を入れる。そして強火で沸騰後10〜15分煮込む。
(グツグツと煮立たせます)
最初のうちはアクが出るのですくい取る。時間が来たら火を止め、だしがらを取り出す。
(注!顆粒状のだしの粉は絶対に使わない事。温かいうちはダシがきいていても、冷めると途端に不味くなります。)


また、今回のような冷たいつゆの場合、だしに昆布は入れない方が良いです。私も一度試した事があるのですが、
昆布だしは暖かいうちはとても美味しい旨みがでるのですが、冷たくすると旨み成分よりも独特なエグみが目立って
しまいます。

3・辛汁(ざるそばのつゆ)の作り方

だし汁が熱いうちに、かえし1(125cc)だし3(375cc)の割合で混ぜ、一晩寝かせる。
この時点で舐めてみると味が濃過ぎるように感じますが、洗いたての水が滴るようなソバを入れるとちょうど良くなります。
しかし、麺に水気が無い場合は、「かえし1:だし4」でも構いません。
また、急ぎの場合はそのまま寝かさずに冷やして食べてもOKです。


4・甘汁(かけそばのつゆ)

かえし1、だし5〜8位で混ぜればOKです。寝かす必要はありません。


=おまけレシピ=

天丼のつゆ

甘汁・・・・・100cc
しょうゆ・・・25cc
さとう・・・・15グラム

カツ丼のつゆ

甘汁・・・・・100cc
かえし・・・・40cc
しょうゆ・・・10cc
みりん・・・・5cc
さとう・・・・18グラム

上記の丼物のタレについて、タレだけを舐めると濃い目に感じますが、実際にご飯や具にかけると専門店の味
になるから不思議です。

=最後に=
上記の作り方で作られる各種つゆやタレは、関東や中部で食べられる「蕎麦専門店」の味になっています。
僕はそれ以外の地域の「せいろ蕎麦・ざる蕎麦」は食べた事が無いので、果たしてこの通りに作って美味
しいと感じるかどうかは分かりません。でも、関東や中部で食べられる専門店の「蕎麦」を美味しいと感じる
方にはビックリするほどの美味しいつゆが出来あがる事と思います。
実際の作業時間もタレから始めても30分もあれば出来ますので是非、一度お試しを。


Tuesday, January 13, 2009

MediaMarkerがよさげな件

ブクマ経由でWeb本棚サービス「MediaMarker」を発見
今年は読書年にする予定なので
これで読みたい本、読み終えた本を管理できればいい

アカウントを作って試してみるとかなりよさげだ
いい点は

  • 登録が簡単でかつ細かい情報も入れることができる
  • 本以外のCD、DVD、その他も登録できる
  • Amazonの欲しいものリストから一括移管できる
  • 登録した本が新宿図書館にあるか簡単に検索できる
問題点は、ブックマークレットがあるのだが、それがSafariに対応していない点だ
それが対応すれば言うことなしかも




Saturday, January 10, 2009

Numbers

Numbersの09年版が出たので現在試用中
少し使い勝手が向上しているが
08のアップデートで対応してもいい内容か
アップグレードは無くファミリーパックで10,800円
悩む投資だ

とAppleのHPを見ていたらLeopardBoxSetなるものを発見
LeopardにiWorkとiLifeをバンドルしたものだ
ファミリーパックで24,800円
Leopard単体で22,800円するので+200円でiWorkとiLifeが付いてくる計算だ
これはお得だな
ただ総額がそれなりにするので少し検討しよう

singlefamily
Leopard14,80022,800
iWork8,80010,800
iLife8,80010,800
BoxSet18,80024,800