MongoDBのSharding環境ををローカルで作る必要があったので、3カ月ぶり位にRubyを書いてみた。

ruby_mongo_sharding.rb — Gist

Continue reading...

転職しました。

沖縄高専を卒業して2年間お世話になったドリーム・アーツ沖縄(旧インデックス沖縄)を4月末で退社し、Nubee Tokyoに転職しました。

ドリーム・アーツ沖縄では新卒で採用して頂きRuby(Rails)での、沖縄では非常に貴重な仕事をさせてもらいました。3年目でこれからという時に心苦しいのですが、東京で挑戦してみたい気持ちが強くなり、今回転職することを決断しました。

新しい職場ではソーシャルゲーム系の開発に従事することになりますが、六本木・渋谷周辺やその他のRuby系・ソーシャルゲーム系の勉強会には積極的に顔を出していきたいと思いますのでどうぞよろしくオナシャス!

Continue reading...

たまたま見つけた記事、関数型言語の勉強にSICPを読もう - (7) 1章 - 反復をマスターしたいけど・・・が面白そうなのでやってみた。

取り敢えず factorial から。

再帰プロセス

(define (factorial n)
  (if (= 0 n)
      1
      (* n (factorial (- n 1)))))

反復プロセス

(define (f n)
  (define (f-iter a n)
    (if (= n 0) a
        (fa-iter (* a n) (- n 1))))
  (fa-iter 1 n))

または

(define (factorial n)
  (iter 1 1 n))

(define (iter product counter max-count)
  (if (> counter max-count)
      product
      (iter (* counter product)
            (+ counter 1)
            max-count)))

反復の場合、カウントを上げていく場合と下げていく場合の2種類で書くことができた。個人的には上がっていくほうが感覚的には分かりやすいが、スッキリ書くなら下がっていく方なのでちょっともどかしい。

次に1からnまでの数を足し合わせる場合。

再帰プロセス

(define (sum n)
  (cond ((= n 0) 0)
        (else (+ n (sum-r (- n 1))))))

反復プロセス

(define (sum n)
  (define (sum-iter a n)
    (if (= n 0) a
        (sum-iter (+ a n) (- n 1))))
  (sum-iter 0 n))

反復プロセス(カウントUPver.)

(define (sum-2 n)
  (define (sum-2-iter a count max)
    (if (> count max) a
        (sum-2-iter (+ a count) (+ count 1) max)))
  (sum-2-iter 0 1 n))

ここまではそんなに難しくない。次の問題はたしかにちょっと難しかった。

(define (f n)
  (if (< n 3)
      n
      (+ (f (- n 1))
         (* 2 (f (- n 2)))
         (* 3 (f (- n 3))))))

取り敢えずこれを反復プロセスで書けばいいようだ。コツとしては(- n x)の分を引数で渡してあげる事で関数を膨張させずにすむのだがそこまで気づくのに手間取ってしまった。

反復プロセス

(define (f n)
 (f-iter 2 1 0 n))

(define (f-iter a b c n)
 (cond ((= n 0) c)
       ((= n 1) b)
       ((= n 2) a)
       (else (f-iter (+ a (* 2 b) (* 3 c)) a b (- n 1)))))

これをカウントUPにしていくのは骨が折れそうだったので断念。

次に、順番が逆になってしまったが小飼さんからの問題。fibonacciを反復で書けばいいみたいだ。

再帰プロセス

(define (fib n)
  (cond
   ((= n 1) 1)
   ((= n 2) 1)
   (else (+ (fib (- n 1))
            (fib (- n 2))
            ))))  

反復プロセス

(define (fib-i n)
  (fib-iter 1 1 n))

(define (fib-iter a b n)
  (cond ((= n 1) b)
        ((= n 2) a)
        (else (fib-iter (+ a b) a (- n 1)))))  

反復プロセス(カウントUPver.)

(define (fib-i-2 n)
  (fib-iter-2 1 1 0 n))

(define (fib-iter-2 a b count max)
  (if (> count max) a
      (cond ((or (= count 1) (= count 2))
             (fib-iter-2 1 1 (+ count 1) max))
            (else
             (fib-iter-2 (+ a b) a (+ count 1) max)))))  

とまあ、問題は全部でこんな感じ。普段使わない頭のを使ったような気がする。

最後にRubyプログラマらしくRubyで解いて終わりにしよう。(全部は面倒くさいのでfibonacciだけ :p)

# -*- coding: utf-8 -*-
#再帰プロセス
def fib n
  n <= 2 ? 1 : fib(n - 1) + fib(n - 2)
end

#反復プロセス1
def fib_i n
  fib_iter(1, 1, n)
end

def fib_iter(a, b, n)
  case n
  when 1 then b
  when 2 then a
  else
    fib_iter (a + b), a, (n - 1)
  end
end

#反復プロセス2
def fib_i_2 n
  fib_iter_2(1, 1, 0, n)
end

def fib_iter_2 a, b, count, max
  return a if count > max

  case count
  when 1, 2
    fib_iter_2(1, 1, (count += 1), max)
  else
    fib_iter_2((a + b), a, (count += 1), max)
  end
end

puts "再帰プロセス:", fib(10)
puts "反復プロセス1:", fib_i(10)
puts "反復プロセス2:", fib_i_2(10)
Post thumbnail

Githubの「Watched Repositories」ってついつい追加して、気がつけば100とか普通に超えちゃいますよね。

デフォルトのUIだとなかなか見返すこともなく「あれ、なんだろうこれ」みたいな事が多かったり、リポジトリwatchしようと思ったら昔既にwatchしてたなんてことが多かったので、少しだけWatched Repositoriesを分かりやすく表示できるサイトを作りました。

OctoWatcher

Continue reading...

日本語ファイルに対応させるために新しくビルドしようと思ったけど、なんか1.6と1.7で互換性があるだの無いだのよく情報が分からなかったので取り敢えずhomebrewの中での1.6系最後のバージョンでインストールする。: p

  • ubversion-deps-1.6.17.tar.bz2
  • brew install  https://raw.github.com/mxcl/homebrew/6e2d550cf4961129a790bfb0973f8e88704f439d/Library/Formula/subversion.rb --unicode-path
    

    こういう時githubって便利ですよね ; )



    プラグイン化について取り組んでみた。突っ込み所満載だけど草案の一つとしてのでメモをば。

    取り敢えず仮として、プラグイン本体を 'gem_path/plugin_root/lib/lokka/lokka-*.rb' 、viewを 'gem_path/plugin_root/view/*.*' で配置する。I18nなんかは既存のplugin同様にplugin_rootに配置

    次に、既存のload_pluginを微妙に変更

      def load_plugin(app)
        gem_plugin = Gem.find_files('lokka/lokka-*.rb') #
        old_type_plugin = Dir["#{Lokka.root}/public/plugin/lokka-*/lib/lokka/*.rb"] #
    
        (gem_plugin + old_type_plugin).each do |path| #
          path = Pathname.new(path)
          lib = path.parent.parent
          root = lib.parent
          $:.push lib
          i18n = File.join(root, 'i18n')
          I18n.load_path += Dir["#{i18n}/*.yml"] if File.exist? i18n
          name = path.basename.to_s.split('.').first
    
          defun_view_path(app, root, name) #
          require "lokka/#{name}"
        end
    
        names = []
        Lokka.constants.each do |name|
          if const.respond_to? :registered
      ・・・
    
    Continue reading...

    Lokka本体のテストの充実化が進んでいるのでdaic-h/lokka-link_url_replaceを例にして、取り敢えずプラグインのUnitテストの書き方をまとめ。

    まずは、specディレクトリ、spec/spec_helper.rbを作成。

      $ mkdir spec
      $ touch spec/spec_helper.rb
    

    Lokkaのプラグイン構造だとGemfileをプラグインの一番上のディレクトリに置いておくと、本体をbundle installした際に読み込まれてしまうので今回はspecディレクトリの中に作成。

      $ touch spec/Gemfile
    

    次に、spec/spec_helper.rbを開き、Bundleを通すように設定

      ENV['BUNDLE_GEMFILE'] ||= File.expand_path(File.dirname(__FILE__) + '/Gemfile')
      require 'bundler/setup' if File.exists?(ENV['BUNDLE_GEMFILE'])
      Bundler.require :default if defined?(Bundler)
    

    取り敢えずこれでスペックを流す際にはプラグイン用のgemが使用されるようになった。

    Continue reading...
    Post thumbnail

    こんにちは、底辺プログラマーです。本気出す時計パクって底辺プログラマーが本気出す時計作ってみました。オマージュです。リスペクトです。

    底辺プログラマーが本気出す


    正直言って画像と言葉を選ぶ作業が一番大変でした。

    ソースコードはdaic-h/programmer_clockにおいてます。

    さすがにパクるのはオマージュはちょっとって場合は連絡ください!



    Post thumbnail

    自分のこのブログは、RubyでできたCMS Lokka で作成していて、プラグインをRubyで書けるということもあってこれまでに結構プラグインを作成してきました。

    ある程度作成したプラグインが溜まってきたので、自分が作っている、使っているプラグインの紹介をば。

    Continue reading...
    Post thumbnail

    ※タイトル分かり難かったので変えました

    Rubyにはるりまプロジェクトというリファレンスマニュアルを作成する素晴らしいプロジェクトがあります。

    その成果物である「るりま」(るびー りふぁれんす まにゅある)をrepl風(evalしてないですね :p)に実行できるサイトを作成してみました。

    Rurepl - Rurema Read-eval-print Loop

    Continue reading...