2015年11月29日日曜日

rails4 modelのvalidate:maximumをrspecでテストする

  • 公開日:2015年11月29日

記事概要


rails4でmodelのvalidateをrspecで記述する方法の説明記事です。
すぐ忘れてしまうので、まとめました。参考にする際は、rspecのバージョンに注意してください。この記事では3.X系を利用しています。

環境


  • ruby2.2.3
  • ruby4.2.4
  • rspec-rails 3.0.2

モデルの作成


ここではサンプルとしてNoteというモデルを作成します。

このモデルにvalidateを記載します。

models/note.rb

# encoding: utf-8
class Note < ActiveRecord::Base

  validates :title, length: { maximum: 64 }

end

上記のモデルでは、titleという属性をもっています。validateとして、

  • 最大文字数は64文字

を設定しています。
このvalidateをテストするrspecを実装します。

rspecモデルの作成


spec/models/note_spec.rbにテストコードを実装します。
境界値のエラー文字数65字の文字列を設定します。

spec/models/note_spec.rb

  it "fails validation with 65 word number of title" do
    note = Note.new
    ## 65文字を設定
    note.title = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
    
    expect(note).not_to be_valid
  end

失敗を期待するので、not_to be_validを指定しています。上記のrspecを実行します。

terminal

benv exec bundle exec rspec spec/models/note_spec.rb

1 example, 0 failures

うまくいきました。次は境界値の正常文字数64字の文字列を設定します。

spec/models/note_spec.rb

  it "successes validation with 64 word number of title." do
    note = Note.new
    ## 64文字を設定
    note.title = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
    
    expect(note).to be_valid
  end

失敗を期待するので、be_validを指定しています。実行します。

terminal

benv exec bundle exec rspec spec/models/note_spec.rb

2 example, 0 failures

うまくいきました。最後に値がnilの場合を設定します。

spec/models/note_spec.rb

  it "successes validation with nil of title" do
    note = Note.new
    expect(note).to be_valid
  end

実行します。

terminal

benv exec bundle exec rspec spec/models/note_spec.rb

3 example, 0 failures

うまくいきました。

まとめ


modelのvalidate処理は、テストコードを書く必要があるかどうかは微妙だと個人的には思っています。

とはいえ、書いておいても損はないと思うので、プロジェクトの締め切りに応じて書く、書かないをコントロールするとよいのではないでしょうか。

以上です。

Rails4の開発にオススメの本


運営サイト(railsで作成しています)


参考サイト

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

2015年11月28日土曜日

docker-compose Illegal instruction: 4

  • 公開日:2015年11月28日

記事概要


以前利用していた古いMacを使ってdocker-composeを利用しようとしたら、Illegal instruction: 4というエラーが発生したので、動作するように修正しました。その対応記事です。

環境


  • Docker Toolbox
  • docker version 1.8.2
  • 2010年より以前に発売されたmac(OSは無関係)

Dockerのインストール


Dockerのインストールは、Docker Toolboxを利用しました。

docker-composeコマンドでエラー発生


docker-composeコマンドを実行します。


docker-compose version
Illegal instruction: 4

しかし、上記のようにIllegal instruction: 4が発生し、docker-composeを実行できません。
この現象は2010年以前に購入した古いmacだと発生するようです。

この現象が発生した場合は、pythonのpipを利用してdocker-composeをinstallすることで解消することができます。


// pythonのインストール
brew install python

// pipでdocker-composeをinstall
pip install docker-compose

installが完了したら、docker-composeコマンドで確認してみましょう。


docker-compose version
docker-compose version: 1.5.1
docker-py version: 1.5.0
CPython version: 2.7.8
OpenSSL version: OpenSSL 1.0.1j 15 Oct 2014

動作しました。これでdocker-composeが利用できます。

まとめ


古いマシンでdockerを利用するのはパワー的にも厳しいので、できれば新しいマシンを買い換えることをオススメします。
10万円程度のマシンで十分です。開発者なら5年に一度は買い換えるくらいで丁度いいのではないでしょうか。

以上です。

dockerを理解するのにオススメの本


オススメ開発マシン


運営サイト


参考サイト

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

2015年11月27日金曜日

2015年も終わりなので、2015年の感想と今後について考えをまとめてみた。

記事の概要


2015年を振り返る雑談記事です。

はじめに


2015年もあと1か月で終わりです。
今年を振り返ると、よくブログを更新したなという一年でした。

1月-11月までのブログ更新数は、

170

で過去最高の更新数でした。

それだけ、多くの技術に触れたということであると同時に、時間的な余裕もあったということで、よい一年だったと言ってよいと思います。
また、去年よりも多くの人がこのサイトに訪問してくれたみたいで、ありがたい限りです。
今後もこのサイトをよろしくお願いします。

2015年の技術から未来を考える


さて、最近私が開発していて思うことは、数学や物理の知識がやたらに必要になってきているということです。
もともとゲーム開発では数学的な知識は必要でしたが、スマホネイティブアプリ開発で様々なことが可能になったことで、幅広い数学や物理の力が必要になってきています。

スマホネイティブアプリ開発だけでなく、

  • 統計や分析
  • 機械学習

でも数学の力が必要になってきています。

私が個人的にタッチしているドローンの改造も数学と物理の基礎力が必要です。

そんなわけで、私は理系出身のため数学や物理に苦手意識はないのですが、もっと深く理解しようと思い、大学数学と大学物理の学習を再開しました。

5年前の2010年くらいは、英語、会計、ITなんて言われた時代がありましたが、5年後の2020年くらいには

英語、プログラム

の時代になり、さらに10年後の2025年くらいには

プログラム、数学、英語

の時代になっているのではないかとぼんやり思っています。

2016年はどうなるのか


開発技術について


dockerが本番のサービスでも使われはじめるのではないでしょうか。
私も来年は開発環境の利用だけでなく、本番運用を考えています。

サーバーは変わらずRails5。あとはgoですね。
スマホでのAPI呼び出しなら、goを使うのもよい選択かもしれません。

jsはreactよりbackbornのほうがよいと思います。
私がreactが必要になるようなアプリを作成していないだけかもしれませんが。

サービスについて


2015年、私は山のサービス(マウンテンチャンネル)を作りましたが、2016年もまた別のアプリを作ろうと考えています。
アイディアと設計はだいたい固まっていて、春頃に公開予定です。楽しみにしていてください。もちろん、マウンテンチャンネルも継続します。

あとはそろそろシェアサービス系が日本でもはやりだすかもしれませんね。個人的に期待しているサービスは以下です。

  • Uber
  • Airbnb
  • BlaBlaCar
  • Girl Meets Dress

これらが全滅なら、シェア文化は日本には根付かないかもしれませんね。

IT業界について


まだまだ人材不足が続くでしょう。労働条件の改善と、給料を上げる以外に人材を確保する方法はないと思います。
飛躍しそうなベンチャーもなさそうです。というより、もう大企業の時代ではないのでしょう。

おわりに


みなさんは2016年をどのように予想しているでしょうか。
私はあまり変化のない一年になるのではないかと予想しています。
本格的に世界が変わりはじめるのは2018年くらいになるのかなと思っています。
なので、がっちりと基礎固めをしていきたいと思います。

以上

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

2015年11月23日月曜日

機械学習の基礎知識まとめ アルゴリズム 探索木 幅優先探索(breadth first search)

はじめに


2015年も後半になって、ようやく重い腰をあげて機械学習の本を読み始めました。

しかし、色々と基礎知識が欠落していて内容を理解するのに苦労しています。
というわけで、ブログに学習したことを記載していきたいと思います。
プログラマー目線で記載しているので、プログラマーでこれから機械学習を勉強しようと思っている人の役に立てばいいなと思って記事を書きました。
数年後には、エンジニアにある程度求められる能力になる可能性が高いので、何もわからない人はちょっとずつ準備しといたほうがよいと思います。
今回はアルゴリズム「幅優先探索(breadth first search)」の記事です。

環境


  • ruby

難易度


  • 簡単

利用シーン


  • 迷路

幅優先探索(breadth first search)とは


木やグラフを探索するためのアルゴリズムです。
根ノードから探索し、隣接した全てのノードを探索していきます。

キューを利用したアルゴリズムです。

サンプル


木の探索の実装

wikipediaに掲載されているツリー状の探索を、rubyでプログラム化してみましょう。

image from wikipedia

木のnode(図の○の部分)の番号は探索順になります。

プログラムの作成


上記の式をプログラムに落とし込みます。

最初にnode(図の○の部分)をクラス化します。


# encoding: utf-8
class Node

  def initialize(name)
    @name = name
    @visited = false
    @childrenNode = []
  end
  
  # 子ノードの設定
  def setChildren(children)
    @childrenNode = children
  end

  def setVisited(status)
    @visited = status
  end
  
  def visited
    return @visited
  end
  
  def name
    return @name
  end
  
  def childrenNode
    return @childrenNode
  end

end

次に図の木の構成をプログラム化します。


# ノードの作成
node1 = Node.new('1')
node2 = Node.new('2')
node3 = Node.new('3')
node4 = Node.new('4')
node5 = Node.new('5')
node6 = Node.new('6')
node7 = Node.new('7')
node8 = Node.new('8')
node9 = Node.new('9')
node10 = Node.new('10')
node11 = Node.new('11')
node12 = Node.new('12')


# ノードの子ノードの設定
node1.setChildren([node2, node3, node4])
node2.setChildren([node5, node6])
node4.setChildren([node7, node8])
node5.setChildren([node9, node10])
node7.setChildren([node11, node12])

最後に幅優先探索を実装します。


# encoding: utf-8
class BreadthFirstSearch

  def initialize
    @queue = []
  end
  
  def search(node)
    # 訪問済みにチェック
    node.setVisited(true)
    # キューに追加
    @queue.push(node)
    # キューが空白でない
    while !@queue.empty? do
      # キューから取り出す
      queue_node = @queue.shift
      # キューの名称
      puts queue_node.name
      # 子供を取り出す
      childrenNode = queue_node.childrenNode
      unless childrenNode.empty?
        childrenNode.each { |tempNode|
          # 未訪問
          unless tempNode.visited
            # 訪問済みにチェック
            tempNode.setVisited(true)
            # キューに追加
            @queue.push(tempNode)
          end
        }
      end
    end
    
  end

end

プログラムの実行と結果


上記のプログラムを実行します。


breadthFirstSearch = BreadthFirstSearch.new
breadthFirstSearch.search(node1)

結果です。


1
2
3
4
5
6
7
8
9
10
11
12

図の探索順通りに出力されていますね。

まとめ


幅優先探索は有名なアルゴリズムなので、機械学習の学習をしていなくても、プログラマーであれば押さえておくべきです。実装もシンプルで簡単です。
また、プログラムコンテスト等でもよく出題されるので、過去問などをあさって、どんなケースで利用されているのかを知っておくと良いでしょう。

以上

参考サイト

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

2015年11月19日木曜日

機械学習の基礎知識まとめ アルゴリズム 探索木 深さ優先探索(depth-first search)

はじめに


2015年も後半になって、ようやく重い腰をあげて機械学習の本を読み始めました。

しかし、色々と基礎知識が不足していて、内容を理解するのに苦労しています。
というわけで、ブログに学習したことを記載していきたいと思います。
プログラマー目線で記載しているので、プログラマーでこれから機械学習を勉強しようと思っている人の役に立てばいいなと思って記事を書きました。
数年後には、エンジニアにある程度求められる能力になる可能性が高いので、何もわからない人はそろそろ準備しといたほうがよいと思います。
今回はアルゴリズム「深さ優先探索(depth-first search)」の記事です。

環境


  • ruby

難易度


  • とても簡単

利用シーン


  • 迷路

深さ優先探索(depth-first search)とは


木やグラフを探索するためのアルゴリズムです。
目的のノードが見つかる、もしくは、子のないノードに行き着くまで深く伸びていく探索です。

スタックを利用したアルゴリズムです。

サンプル


木の探索の実装

wikipediaに掲載されているツリー状の探索を、rubyでプログラム化してみましょう。

image from wikipedia

木のnode(図の○の部分)の番号は探索順になります。

プログラムの作成


上記の式をプログラムに落とし込みます。

最初にnode(図の○の部分)をクラス化します。


# encoding: utf-8
class Node

  def initialize(name)
    @name = name
    @visited = false
    @childrenNode = []
  end
  
  # 子ノードの設定
  def setChildren(children)
    @childrenNode = children
  end

  def setVisited(status)
    @visited = status
  end
  
  def visited
    return @visited
  end
  
  def name
    return @name
  end
  
  def childrenNode
    return @childrenNode
  end

end

次に図の木の構成をプログラム化します。


# ノードの作成
node1 = Node.new('1')
node2 = Node.new('2')
node3 = Node.new('3')
node4 = Node.new('4')
node5 = Node.new('5')
node6 = Node.new('6')
node7 = Node.new('7')
node8 = Node.new('8')
node9 = Node.new('9')
node10 = Node.new('10')
node11 = Node.new('11')
node12 = Node.new('12')

# ノードの子ノードの設定
node1.setChildren([node2, node7, node8])
node2.setChildren([node3, node6])
node3.setChildren([node4, node5])
node8.setChildren([node9, node12])
node9.setChildren([node10, node11])

最後に深さ優先探索を実装します。


# encoding: utf-8
class DepthFirstSearch
  
  def search(node) 
    # 訪問したノード名を出力
    puts node.name
    # 訪問済みにチェック
    node.setVisited(true)
    # 子ノードを取得
    childrenNodes = node.childrenNode
    unless childrenNodes.empty?
      childrenNodes.each { |tempNode|
        # 未訪問
        unless tempNode.visited
          search(tempNode)
        end
      }
    end
    
  end

end

プログラムの実行と結果


上記のプログラムを実行します。


depthFirstSearch = DepthFirstSearch.new
depthFirstSearch.search(node1)

結果です。


1
2
3
4
5
6
7
8
9
10
11
12

図の探索順通りに出力されていますね。

まとめ


深さ優先探索は有名なアルゴリズムなので、機械学習の学習をしていなくても、プログラマーであれば押さえておくべきです。実装もシンプルで簡単です。
また、プログラムコンテスト等でもよく出題されるので、過去問などをあさって、どんなケースで利用されているのかを知っておくと良いでしょう。

以上

まとめ


この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加
Related Posts Plugin for WordPress, Blogger...