a newcomer!

Ruby関係の事を忘れない為に書き綴っていきます : -)

2

5/2012

転職しました。

Category: 日記 Tags: 転職 by daic_h on

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

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

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

初出社日にカッペ丸出しで撮った写真

20120501092229 20120501091914 20120501091858

20

3/2012

SchemeとRubyで再帰プロセスと反復プロセス

Category: Lisp Tags: Scheme, 関数型 by daic_h on

たまたま見つけた記事、関数型言語の勉強に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)
    

    12

    3/2012

    GithubでWatchしているリポジトリをもう少し分かりやすく見たいと思ってるあなたへ

    Category: Git Tags: Github by daic_h on

    Post thumbnail

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

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

    OctoWatcher

    Continue reading...

    9

    3/2012

    MacのHomebrewで1.6系のSVNをインストールする

    Category: その他(技術系) Tags: Homebrew, Subversion by daic_h on

    日本語ファイルに対応させるために新しくビルドしようと思ったけど、なんか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って便利ですよね ; )



    5

    3/2012

    LokkaプラグインのGem化について考えてみた

    Category: Lokka Tags: Lokkaプラグイン by daic_h on

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

    取り敢えず仮として、プラグイン本体を '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...

    27

    2/2012

    LokkaプラグインのUnitテストをRspecで書く WebMock編

    Category: Lokka Tags: Lokkaプラグイン, Rspec by daic_h on

    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...

    26

    2/2012

    底辺プログラマーも本気を出してみた

    Category: その他(技術系) Tags: ネタ by daic_h on

    Post thumbnail

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

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


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

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

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



    22

    2/2012

    これまでに作成したLokkaプラグインの話とこれからの話

    Category: Lokka Tags: Lokkaプラグイン by daic_h on

    Post thumbnail

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

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

    Continue reading...

    18

    2/2012

    Sinatra + Node.jsで複数バージョンのRubyリファレンスが最速で(自称)検索できるreplを作りました

    Category: Ruby Tags: coffeescript, node.js, rurema, rureple, sinatra by daic_h on

    Post thumbnail

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

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

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

    Rurepl - Rurema Read-eval-print Loop

    Continue reading...

    17

    2/2012

    herokuでcoffeescriptで書かれたWEBフレームワーク「zappa」を動かす際のメモ

    Category: Javascript Tags: coffeescript, heroku, node.js, zappa by daic_h on

    Post thumbnail

    node.jsのcoffeescriptで書かれたweb用フレームワーク「zappa」を使用してアプリケーションを作成しているので、開発やheroku用の細かなメモやコードスニペットをば。

    後でちゃんとした記事にまとめます。できたら今日、明日で:)

    Continue reading...
    To Top Fork me on GitHub