File.openを使っているメソッドのテストを書く

軽めのネタ。例えば、次のようなread_dataというメソッドがあるとします。

class MyTest
  def read_data
    File.open("hoge.txt").read
  end
end

このread_dataのテストをRSpecで書くかというお話。なんとなくhoge.txtというものは用意したくない。

StringIOを使って次のように書きました。

require "rspec"
require_relative "my_test"

describe MyTest do
  context "read_data" do
    it "return test data" do
      file = StringIO.new("aaa")
      allow(File).to receive(:open).and_return(file)
      expect(MyTest.new.read_data).to eq("aaa")
    end
  end
end

環境は

で確認。

「Ruby Association Certified Ruby Programmer Silver version 2.1」を受けてきた

Ruby技術者認定試験の新版である「Ruby Association Certified Ruby Programmer Silver version 2.1」を受験して、合格しました。

f:id:miyohide:20141223003844j:plain

このエントリーでは、その受験体験を簡単に記してみます。

きっかけ

古いバージョンのRuby(1.8が前提のもの)はSilver/Goldともに合格していたのですが、バージョンアップしたということと、Ruby技術者認定試験再受験無料キャンペーンってものをちょうどやっていて、万が一に不合格でも金銭的なダメージが少ないということで、とりあえず、受験してみました。

ちなみに、Ruby技術者認定試験再受験無料キャンペーンは2015年1月20日申請分までが上限らしいので、気になっている人はおやめに。

受験勉強

さすがに一回落ちてもいいという気楽さはあるとはいえ、流石に落ちてしまうのはどうかと思ったので、勉強しました。

勉強において、version 2.1に対応したいわゆる試験対策本は無いです。とりあえず、1.8のもので勉強することにしました。

Ruby公式資格教科書 Ruby技術者認定試験 Silver/Gold対応 (EXPERT EXPASS)

Ruby公式資格教科書 Ruby技術者認定試験 Silver/Gold対応 (EXPERT EXPASS)

ネットで検索すると、version 2.1での変更点は(Silverに関する限り)あんまりないみたいなので、Rubyアソシエーションビジネスセミナー試験案内講演資料(注:リンク先PDF)に軽く目を通しておくだけにしました。


資格 - Ruby技術者認定試験Silver version 2.1 必勝合格法 - Qiita

あとは、るりまをみながら、Array、Hash、Stringなどの各種メソッドirbでタイプして動作確認をしてみました。名前が違っても処理が同じもの(mapとcollect、findとdetectなど)、!がついてなくても破壊的なものを覚えるようにしました。

試験日の前日に本の模試を解くと全問正解だったので、まぁ、なんとかなるだろうと思い試験に備えました。

試験

試験はプロメトリック。本人確認書類が二種類いるのがポイントで、少々面倒くさいです。また、遅刻厳禁なので、注意しましょう(身近に経験者が居て、本当に受けさせてもらえませんでした)。

受付を済ませて、荷物をロッカーに入れて、5分もしないうちに「じゃ、簡単に説明したあと案内します」と言われすぐ試験会場に。トイレ行く暇もないので、受付前にトイレは済ませたほうがよいでしょう。

試験は全てパソコンで。ラジオボタンチェックボックスにチェックを入れる方式。タイプする問題はないので気楽なものです。

時間は余程のことがない限り余ると思います。私の場合、20分でひと通り問題を解き終え、さらに10分で全問の復習を終えて試験終了のボタンを押しました。

結果

100点満点中90点で合格でした。1問2点という計算かと思うので、5問間違えたという計算になります。本当は100点取りたかったんですが、いくつか記憶があやふやなものがあったので、ま、これぐらいかなという感じです。

75点が合格ラインなので、12問は間違えることが出来ます。普段Rubyを触っていて、るりまで復習をすれば合格できるような気がします。

RubyWorld Conference 2014で喋ってきた

はじめに

f:id:miyohide:20141124212917j:plain

2014年11月13日(木)-14日(金)で開催されたRubyWorld Conference 2014に参加し、喋ってきました。発表者として参加するのは2年連続、カンファレンスに出るのは4年連続。年間イベントの一つとなっています。

喋る経緯

喋る事になったのは、上司の軽い「ゆー、喋っちゃいなよ」という軽い一言から。採択されたら旅費も出してくれるし、ちょうどいいかと思い応募資料を書きつつ、関係各位にOKを取り、応募資料を提出。ありがたいことに採択されました。

応募について

RubyWorld Conferenceという場は半分以上がスーツな人なので、その人向けに話すことを前提にすると良いのかなと思っています。例えば、RubyGemsの詳細な使い方を説明してもあまり響かず、それよりかは「Rubyを使ってこんなシステムを作りました」という事例紹介のほうが響くような気がします。ただ、Rubyをつかうことは既に当たり前の状態になってきているので、そこからどうやって独自性を出すかがポイントになるような気がします。

で、発表募集要項を見ると開発事例以外にも教育とか研究とかの話題があります。ちょうど私が所属しているOSS推進フォーラムアプリケーション部会にて、ベンチマークをやっていてJRubyでやった例はあんまり無いかなぁと思ったのでそのネタで応募することにしました。

発表について

発表時間は25分、質疑応答は5分という枠なのですが、しゃべろうと思うと結構資料から話す内容は削る必要があります。発表においては、JRubyにおけるPassenger、Warbler、Pumaの3つを取り上げましたが、実際のところは、Javaアプリケーションを載せたベンチマークだったり、CRubyにおけるPumaのベンチマークも取りました。後、Ruby Benchmark Suiteの結果についても色々と語ることがあったのですが、時間の都合上カット。

それでも、本番は全然時間が足りず、28分ぐらい喋ってしまいました。後半はかなり早口で置いてきぼりにしたかなぁと思ったりしています。Pumaが早いってことが伝わったからいいのかな?ここらへんは再考の余地がありそうです。

実況ツイートについて

で、実況ツイート業で名前が売れた自分にとって、今回も自分の発表を自動実況ツイートしようとしたのですが、何故かうまく動かず。エラーも吐かずにツイートしてないってなんで〜と発表中に思いましたが、修正する時間なんて当然ないわけなので、とりあえず突き進みました。う〜む、残念だった。

苦しんだところ

JRubyに関してはあまり実績データがなく、この設定で大丈夫かいな?と思うところが多数ありました。今でも設定に自信はないのですが、まぁ動いているし(^_^;)

あと、JRubyの問題でメモリリークの問題があり、単調増加的にメモリ使用量が増えることが長い間存在していました。この問題はJRuby 1.7.15で解決したのですが、解決してなかったらJRubyのデメリットが強調されるので、大変助かりました。こういうのはやった人だけが分かる話。

資料の公開とデータの公開について

ありがたいことに、発表が終わってから色々とご指摘を頂きました。発表資料とかデータの公開についてはこの記事を書いている2014年11月24日時点で準備を進めていますので、今しばらくお待ち下さい(SIerの面倒くさいところの一つですm(_ _)m)。後は、RubyWorld Conferenceのページで公開されるかも。。。ここらへんはどうなるんだろうなぁ。
なお、メールとかでよろしければ、個別に送信しますので、Twitter(@miyohide)やメールなどでご連絡ください。

来年について

来年も喋ることができたらいいなぁと思っていますが、はてさて。なにせ松江にタダでいけるし。機会があれば。

大江戸Ruby会議04に行ってきた

はじめに

もう、一週間以上前のことですが、大江戸Ruby会議04に行ってきました。

最近、こういう勉強会に出ることは体力的な問題からあまり参加していないのですが、参加するならば現場でのみ得られることをつかもうと考え参加しています。

ちなみに、スライド一覧は以下のサイトにまとめられているので、行けなかった人とかは目にすると良いと思います。

大江戸Ruby会議04参加しました! スライド・リンクまとめ - 酒と泪とRubyとRailsと

印象に残った発表など

From ‘Legacy’ to ‘Edge’ 2014 edition

@hsbtさんの発表「From ‘Legacy’ to ‘Edge’ 2014 edition」は、実際自分が今やっていることなので、興味深く聞きました。

便利なGemで一発どーんってわけではなくて、地道にテストを書いて、地道にedgeを追って、それでも出てくる問題はすぐ直すという言葉にするとすごく地味なんですが、2年以上もそれを続けられているのはすごい。

ただ、後でお話をお聞きすると、やはりメンテナンス性を向上させるために色々と工夫はされているようで、その中の一つが薄いGemを使うということ。

なんでもかんでも提供してくれるGemは便利なんだけど、中身がブラックボックス化になりがちで、バージョンアップに追随できない。その代わりに薄いGemを使って、自分が目の届くようにしてメンテナンス性を向上させるというのがすごく納得出来ました。

Another language you should learn

@knsmrさんの英語習得に関するお話。一番のポイントは、英語の習得には1週間とか1年とかで終わる話ではなく、年単位、しかも5年10年のスパンで考えないとダメということ。

そういう言葉を聞くと、毎日iKnow!やっている自分にとってはすごい励まされます。全然単語覚えられないけど。一喜一憂せずにコツコツと続けていくべきかなと。

ただ、だらだらと長い時間やっていてもしょうがないので、集中して継続できる勉強をする必要があるのは事実で、う〜ん、英語修業の日々はまだまだ続きそうです。

Hacking Home

@a_matsudaさんの発表。

るびまに記事が載ると社会的信用が上がってお金を借りることができるようなので、みんな、るびまを読んだり、記事を寄稿してみたり、編集を手伝ったりしてみてください。

Rubyでメソッドの呼び出し直後と終了直後をhookしてログを出力したい

タイトル通りなのですが、メソッドの呼び出し直後と終了直後をhookしてログを出力したいなぁと考え、ちょっとやってみました。

やりたいこと

やりたいのは次のようなこと。


メソッドの呼び出し直後と終了直後にログを出力したい

アイディア

メタプログラミングRubyを読むと既存のメソッドを壊さずに新しい処理を埋め込むには、aliasを使うというアイディアがありました。

メタプログラミングRuby

メタプログラミングRuby

実装

それを元に色々とやってみると、次のようなコードになりました。


メソッドの呼び出し直後と終了直後にログを出力したい(解決編)

予め決まったメソッド名でしたら単にaliasで定義すればよいのですが、メソッド名が分からないものに対してどうやって処理を埋め込もうか、色々悩んで次のような実装になりました。

今のところ、インスタンスメソッドしか対応できていないので、クラスメソッドにも対応しておこうかなと思っています。

Rails Tutorialをminitestでやってみた

はじめに

Rails4が出たことだし、Rails Tutorialでもひと通りやってみようとチャレンジ。

ただ、Rails3のときにひと通りやったこともあり、普通にやったらあまり面白みもないので、RSpecで書かれているテストをminitestのspec形式で書いてみることにしました。

minitest

そもそものきっかけは、RubyHirobaでのwillnetさんによるLT。ちょうどRSpecの書き方が色々と変わったことで嫌気が差した頃だったので、「ちょっとやってみるか」という軽い気持ちでやってみました。

題材

さて、minitestでテストを書くと言っても素で書くのはちょっとつらい。題材として、

  • 何か動くものができること
  • RSpecでテストが書かれていること

を探していると、ちょうどいいものが。それがRails Tutorialで、Rails4の勉強がてらやってみることにしました。

やった成果

GitHubで公開しています。

ただ、一部のテストはちょっと書けないままでいます。

所感

思ったことをつらつらと

  • MinitestでSpec形式のテストもかけるので、RSpec書いていた人はさくっと書けるのではないかと思います。
  • matcherがまだ不足気味かなと思います。自分で書けよって言われそうですが。
  • ただ、環境はどんどん整ってきているような気もします。GitHubに上がっているソースを見ると、最新のものにはmatcherが幾つか追加されているので、より書きやすくなることは確実かと。
  • minitest-rails-capybara gemとcapybara_minitest_spec gemがあって、それぞれcapybaraに関するgemですが、matcherの有無だけです。こういうところがまだ発展途上ってな感じ。
  • 時間があったらGuardfileも修正しておこうかなと思います。controllerを直して、integrationのテストを実行するようにしたいなと。