Archive for the ‘ruby’ Category

{ 2010.12.15 }

無限ループのRSpec

    はてなブックマーク - 無限ループのRSpec
    このエントリーをはてなブックマークに追加

    はじめましての人ははじめまして。
    たぶん、Fusic社員の中野です。

    Advent Calendarに当たってない社員はいるのに、もう2回も当たってしまいました。ルーレットバグってんじゃね?
    さて、今回は実際に活用したRSpecのTipsについて書いていこうかと思います。

    RSpecはRubyのテスト用フレームワークです。(RSpecを知らない人はごめんなさい。詳しい説明は省きます。)
    例えば、こんな感じでテストを書いていきます。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    class Hoge
      def run
        puts foo
      end
      def foo; "foo" end
    end
     
    describe Hoge do
      it "#run" do
        hoge = Hoge.new
        hoge.should_receive(:foo).and_return("foo") # 一度だけHoge#fooがコールされるよ                                                                                                                                                           
        hoge.run
      end
    end
    # >> foo
    # >> .
    # >>  
    # >> Finished in 0.00048 seconds
    # >> 1 example, 0 failures

    それでは、Hoge#runの中に無限ループがあるときはどうするのか?

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
    class Hoge
      def run
        while true do 
          puts foo
        end
      end
      def foo; "foo" end
    end
     
    describe Hoge do
      it "#run" do
        hoge = Hoge.new
        hoge.should_receive(:foo).and_return("foo")
        hoge.run
      end
    end

    もし、これをそのままテストすると、Hoge#runの中の無限ループが実行されて処理が帰ってきません。
    無限ループを終わらせる判定があれば、テストは可能なので・・・。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    
    class Hoge
      def run
        while bar do
          puts foo
        end
      end
      def foo; "foo" end
      def bar; true end
    end
     
    describe Hoge do
      it "#run" do
        hoge = Hoge.new
        hoge.stub!(:bar).and_return(true, true, true, false)
        hoge.should_receive(:foo).exactly(3).times.and_return("foo")
        hoge.run
      end
    end
    # >> foo
    # >> foo
    # >> foo
    # >> .
    # >>  
    # >> Finished in 0.00085 seconds
    # >> 1 example, 0 failures

    という感じにしてあげたら、(擬似的な)無限ループを使ったテストができると思います。

    それでは、次の人にバトンタッチ〜。

    { 2010.12.4 }

    rails 日付TIPS

      はてなブックマーク - rails 日付TIPS
      このエントリーをはてなブックマークに追加

      昨日まで続いた師走の嵐から一変、ど晴天の休日の今日、皆様いかがお過ごしでしょうか。

      昨日エントリーを書きました安元の結婚式である本日も、Advent Calendarのバトンを引き継いでおります。
      休日なので、軽めのtipsを書かせていただきます。

      皆さんは日付を和暦で表示する時、どのような処理をしているでしょうか。
      日付なんてDBに入ってる値を、多少整形する形で済めばいいのですが、案件によっては和暦表示にせざるを得ないことは、往々にしてあるかと思います。
      私がメインで扱っているruby(rails)では、和暦表示用のプラグインがあるので、それを導入すれば済むのですが、
      それを知らずに自前で作っていた時は以下のようにメソッドを作ってました。

      def get_wm_y(ymd)
          return "" if ymd.blank? 
          case ymd.year
            when 0..1925
              return "#{ymd.year}年"
           when 1868..1911
               return '明治' + "#{ymd.year - 1867}年"
            when 1912..1925
               return '大正' + "#{ymd.year - 1911}年"
            when 1926..1988 
               return '昭和' + "#{ymd.year - 1925}年"
            else 
              return '平成' + "#{ymd.year - 1988}年"
          end
        end

      とても泥臭い感じはしますが、和暦計算の法則に則ったかたちになります。
      ひとつ難点は、「元年」表示ができないことですが、これも条件分岐で処理すればいいでしょう。

      日付に関してもう一つ。
      これは日本特有かもしれませんが、「年度」という概念があります。
      2010年1月は、2009年度扱いにしないといけないわけですが、これは以下のようにしてます。

      def get_nend_y(ymd)
          return "" if ymd.blank?
          case ymd.month
          when 1..3
            (ymd.year - 1).to_s
          else
            ymd.year.to_s
          end
        end

      これはすごくシンプルですかね。

      大したことは書いてませんが、ちょっとしたtipsとしてお役に立てればと思います。
      あと、こうしたほうがいいというのがあれば、ぜひご意見お寄せください。

      では、めでたき結婚式に行って参ります。

        はてなブックマーク - ZENPREで過去の勉強会をいつでも視聴
        このエントリーをはてなブックマークに追加

        こんにちは。
        ヤマモトです。

        本日(11/25)の15:00に、弊社小山による「TitaniumMobile勉強会」を行いました。
        TitaniumMobileとは、端的に申しますとJavaScriptでiPhoneアプリが作れるツールです。
        アプリとして魅力の多いiPhoneアプリですが、その開発にはObjective-Cという言語を習得する必要があります。
        どれでもそうだと思いますが、新たな言語を習得するのはなかなか骨が折れますね。
        慣れ親しんだ言語でプロダクトができれば、何て素敵なことだろうと思います。
        そのためのアプローチは方方で進んでいて、TitaniumMobileはその中の1つですね。

        弊社でも生粋のJavaScript使いである小山は、先日のエントリで書いたように、
        PHPMatsuriにてユニットホスティング賞を受賞しiPodTouchの贈呈を受けました。
        そしてそれ以来、その魅力にどっぷり浸かり、TitaniumMobileを知ってから短期間でiPhoneアプリを何と2本も開発しました。
        短期間とは1ヶ月位だったと思います。そんな短い期間で、しかも空いた時間で開発してしまいました。

        そんなTitaniumMobileに、ひいてはJavaScriptに興味を持ってもらいたく本日の勉強会を開催し、その模様は「ZENPRE」にて配信しました。

        と、ここまでは経緯について書かせていただきました。

        そんな、何とも魅力のあるTitaniumMobileの勉強会を見てみたかったという方。
        ZENPRE」のサイトへ来てみませんか?
        当然ながら勉強会は終了しているのですが、その模様をZENPRE上であればいつでも見ることができます。

        本日、ZENPREに「プレゼン同期録画機能」を新たにリリースしました。
        これは、動画と同期してスライドも切り替わり、動画だけのプレゼンに比べて飛躍的に表現力を向上させたZENPREでのプレゼンを、
        いつでも堪能できるようになります。

        配信したスライドの操作は記録されるようになり、録画されたUstreamの映像と併せて保存されますので、
        過去に配信されたプレゼンは、いつでも視聴できるようになります。
        生での配信を見ていた方は、「あの時何と言っていたっけ?」と振り返るために、
        見逃した方も、後で時間にゆとりのある時にじっくり見ることができます。

        本日配信した、TitaniumMobile勉強会も以下のアドレスからいつでも視聴できます。
        zenpre.net/p/yBxMn
        いつでもありますから、今日にでも、興味の湧いたときにでも、ぜひご覧ください。

        また、勉強会やセミナーを発信していこうとされている方も、
        無料で利用できるZENPREを使ってみませんか?
        映像のみに比べ表現力が向上し、遠方で見ている方にも伝わりやすくなります。
        また、ストレージの役割ももっていますので、自分が作ったスライド資料もウェブ上ですぐ確認できます。
        配信したプレゼンテーションは記録されますので、自分の活動の履歴にもなります。

        本日リリースを終えて一段落しておりますが、
        まずは使っていただいて、利用者の声をお寄せいただけたらと思います。
        実際に勉強会等で利用してみたという声をぜひとも聞かせてください。
        利用をたくさんされることでしか、このサービスは成長していかないと思います。

        ぜひとも、よろしくお願いします。