2013年11月24日日曜日

Rails Application Templatesを使ってみたよヘ(^o^)ノ

Rails Application Templatesとは、Railsアプリの開発環境設定を自動化するやつ

PC開発環境の自動化はBOXENでどうぞ

Railsアプリの環境構築するまで(環境はMacでrbenvを使用
$ mkdir sample_app
$ cd sample_app
$ bundle init
$ vim Gemfile #gem 'rails'をコメントアウト
$ bundle install --path vendor/bundler
$ bundle exec rails new . -m https://raw.github.com/murajun1978/rails_template/master/rails_template.rb --skip-bundle --skip-test-unit

僕はローカルのgem環境を汚したくないので、bundle installするときにpath指定しています

RubyMotionのgemとかごちゃごちゃしちゃう…

ちなみにローカルgemにはspringやherokuなんかをインストールしています

springはbundlerで管理すると意味ないみたいなので

bundle install のpathを毎回指定するのがめんどくさい人は

~/.bundler/config
BUNDLE_PATH: ./vendor/bundler

僕のRails Application Templates ⇒ GitHub murajun1978 / rails_template

作りかけで参考になるかわかりませんがwww

みなさんも自動化して少しでもラクしましょうねー

( ̄(エ) ̄)彡☆

2013年11月20日水曜日

GitHub Meetup in Kobeへ参加してきたヘ(^o^)ノ

参加してきましたヘ(^o^)ノ

GitHubの基本操作からGitHubチームが使っているツールなんかを紹介していただきました。

参加形式でとても楽しかったです。

MBA忘れたので参加できませんでしたが…


仕事の進捗良くないので仕事します:(;゙゚'ω゚'):

明日の大阪も参加予定.。oO(進捗大丈夫かな…)

Thanks( ̄(エ) ̄)彡☆

2013年11月19日火曜日

Git入門 レベル1ヘ(^o^)ノ

Gitを再認識する為に始めました

まずはレベル1から

Gitはバージョン管理システムです

現場ではSubversionを使っていますが…(;・∀・)

自分のお仕事ではGitを使っています。

ぶっちゃけ一人開発なので、Subversionでもよいのですがwww

SubversionとGitとどう違うのでしょうか?

Subversionは集中型バージョン管理システムです。

一方、Gitは分散型バージョン管理システムです。

現場ではSubversionでコミットするとJenkinsが動きます

Subversionでのcommit = 納品という認識です

しかし!うっかりcommitが頻繁に発生します(Subversionのせいではないw

んじゃ、ブランチきればいいじゃーんヘ(^o^)ノ

Subversionは集中型バージョン管理システムです…

ブランチをきるさきはローカルではなくネットワーク先になります

この時点で僕はムリですが…

Subversionをあまり理解していませんので、つっこみ大歓迎です

Gitは分散型なので、ローカルにブランチを切り放題のやっぱやーめたやり放題w

RubyはSubversionで管理されていますが、mrubyはGitで管理されGitHubにて公開されています

GitHubの登場がGitの地位をここまで押し上げたと言っても良いでしょう(ほんまかいなw

そのうち、GitHubについてもブログ書きますよ( ー`дー´)キリッ

MacならGitはデフォルトでインストールされています(10.9以降

10.8以前のバージョンではXcodeのcommand line tool?をインストールすればよろし

今回は基本的なコマンドをご紹介

$ mkdir murajun1978

$ cd murajun1978

$ git init

$ ls -a
.    ..   .git

git initでローカルにリポジトリを作成しています

.gitがリポジトリ

試しにファイルを作成してみましょ

$ echo 'Hello, Git!' >> hello.txt

$ git status
# On branch master
#
# Initial commit
#
# Untracked files:
#   (use "git add ..." to include in what will be committed)
#
# hello.txt

Untracked filesはgitで管理されてないよーってこと(ワーキングツリー

$ git add hello.txt

$ git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached ..." to unstage)
#
# new file:   hello.txt

git addしたことでGitの管理下に(ステージへ移動

$ git commit -m "init commit"

$ git status
# On branch master
nothing to commit, working directory clean

git commitしたことでステージからいなくなった(リポジトリへ移動

$ git log
commit [ハッシュ]

Subversionではコミット番号で管理してるけど、Gitは分散型なので一意な文字列ハッシュを使って管理してるのね

$ git show HEAD
Date:   Tue Nov 19 00:24:21 2013 +0900

    init commit

diff --git a/hello.txt b/hello.txt
new file mode 100644
index 0000000..670a245
--- /dev/null
+++ b/hello.txt
@@ -0,0 +1 @@
+Hello, Git!

git showでリポジトリの状態を見ることができる

$ echo 'Lets try Git' >> hello.txt

$ git status 
# On branch master
# Changes not staged for commit:
#   (use "git add ..." to update what will be committed)
#   (use "git checkout -- ..." to discard changes in working directory)
#
# modified:   hello.txt
#

$ git diff
diff --git a/hello.txt b/hello.txt
index 670a245..edaa8ae 100644
--- a/hello.txt
+++ b/hello.txt
@@ -1 +1,2 @@
 Hello, Git!
+Lets try Git

git diffで変更内容を見ることができます

間違えたのでこの修正を取り消してみましょう

$ git checkout -- hello.txt

$ git status
# On branch master
nothing to commit, working directory clean

もとに戻りましたねー

また書きます

( ̄(エ) ̄)彡☆

2013年11月17日日曜日

Shinosaka.rb キックオフヘ(^o^)ノ

本日、Shinosaka.rbのキックオフを勝手にやりましたw

次回からオープンコミュニティとして運営していくよー

会場も決まっているので、Doorkeeperでイベントたてまするヘ(^o^)ノ

【決まったこと】
メンバーの連絡はyouroomをする
募集はDoorkeeperを利用する
メンバーの困りごとをみんなで解決する
GitHubを使ったソーシャルコーディングを実践する

セッションも少しやりました。

【セッション】
Shinosaka.rb


Ruby × gnuplot


やはり会場探しが一番難しいですね…

会場提供して頂ける場合は@murajun1978までご連絡をm(_ _)m

ステマは全力でさせて頂きますwww

まだ、できたてホヤホヤのコミュニティですが、温かい目で見守ってやってください。

関西圏のRubyコミュニティとも連携していきたいですね

わくわく( ^ω^)

( ̄(エ) ̄)彡☆

2013年11月16日土曜日

GitHub PagesでSassがCSSにコンパイルされなかった…(;・∀・)

前回の「JekyllでHamlとSassとCoffeescriptを使ってみたヘ(^o^)ノ

うまくできなかったから調べた

現象SassがCSSにコンパイルされない…

ローカルでは動いてたけどね(;・∀・)

参考サイト
  ⇒Setting up Jekyll, Compass, and Github Pages
  ⇒Use Jekyll, SCSS, and CoffeeScript without plugins

Rakefileに書くのが手っ取り早いな

( ̄(エ) ̄)彡☆

2013年11月14日木曜日

Paperclipを使ってみたよヘ(^o^)ノ

仕事でファイルを扱うプロジェクトがあり、Paperclipというgemを使ってみた

ブラウザからはサンプルを見ればすぐに理解できる

では、ファイルからPaperclipを使って登録するにはどうすれば良いのか?

やってみたヘ(^o^)ノ

ActionDispatch::Http::UploadedFileを使えば良いのだー

サンプルソースはGitHub⇒paperclip_sample

めっちゃ簡単w

Paperclip便利だー

( ̄(エ) ̄)彡☆

2013年11月3日日曜日

JekyllでHamlとSassとCoffeescriptを使ってみたヘ(^o^)ノ

Shinosaka.rb

コミュニティサイトはGitHub Pagesを使うことにしました

なぜGitHub Pages?

メンバーがGitHub Pageを利用することで、Gitの操作やGitHubの使い方を実践できる

どうせならサイトを運用しならSassやCoffeeScriptのスキルも身につけたいなー(個人的にw

なので、JekyllでSassとCoffeeScriptを使う方法を調べてみました

JekyllでSassを使う


Gemfile
source 'https://rubygems.org'

gem 'jekyll'
gem 'jekyll-sass'

_plugins/bundler.rb
require "rubygems"
require "bundler/setup"
Bundler.require(:default)

_config.yml
sass:
  syntax: scss
  style: compact

css/main.css ⇒ css/main.scss

動作確認…

動いたヘ(^o^)ノ

JekyllでHamlを使う


Gemfile
gem 'jekyll-haml'

_incloudes/test.haml
%h1 Welcome to Shinosaka.rb

index.md
{% haml test.haml %}

動作確認…

動いたヘ(^o^)ノ

JekyllでCoffeeScriptを使う


Gemfile
gem 'coffee-script'

_plugins/coffeescript_converter.rb
module Jekyll
  require 'coffee-script'
  class CoffeeScriptConverter < Converter
    safe true
    priority :normal
 
    def matches(ext)
      ext =~ /coffee/i
    end
 
    def output_ext(ext)
      ".js"
    end
 
    def convert(content)
      begin
        CoffeeScript.compile content
      rescue StandardError => e
        puts "CoffeeScript error:" + e.message
      end
    end
  end
end

javascript/test.coffee
---
---
alert "Hello CoffeeScript!"

_layouts/default.html
script src="javascript/test.js"

動作確認…

ちゃんとjsファイルに変換されてるヘ(^o^)ノ

これでGitHub + Git + Jekyll + Haml + Sass + Coffeescriptの環境ができました

( ̄(エ) ̄)彡☆

2013年10月17日木曜日

Rails4の新規プロジェクトが開発フェーズに突入したよヘ(^o^)ノ

最近、アジャイル本を読みあさって現場に落とし込めればと猛勉強中ヘ(^o^)ノ

タイトルからアジャイルらしさが見受けられませんが…Σ(゚д゚lll)

設計フェーズも終わり、開発フェーズに突入しました(現場w)

開発チームのルールはTDD、ペアプロ、RSpecによる単体テスト&Capybaraでの結合テスト

ビルドを壊したらスタバのコーヒーをメンバーにごちそうなど

さっそく、本日ビルドを壊してしまいました(;・∀・)

言い訳

  1. svnよくわからない
  2. commit ⇒ Jenkins (実は今日のコミットもミスが原因


普段はGitを使ってる

  1. ローカルにブランチキリ放題ヘ(^o^)ノ
  2. branch ⇒ commit ⇒ merge ⇒ push ⇒ Jenkins

さて、検証機のセッティングに2日弱かかりました(お疲れ様でした!

KVMなので本気でVagrant + Chefを考えます

RSpecの設定

これも自動化しよう…

今回のプロジェクトではCapybaraの結合テストがあるのでViewとControllerの単体テストは行いません( ー`дー´)キリッ

config/application.rb
config.generators do |g|
  g.test_framework :rspec,
    routing_specs: false,
    controller_specs: false,
    view_specs: false
end

Gemfile
group :development, :test do 
  gem 'rb-fsevent'
  gem 'terminal-notifier-guard'
  gem 'guard-rspec'
  gem 'guard-spring'
  gem 'rspec-rails'
  gem 'factory_girl_rails'
end

group :test do 
  gem 'turnip'
  gem 'capybara'
  gem 'launchy'
  gem 'poltergeist'
end

Guardfile
guard :rspec, cmd: 'spring rspec --color --format d' do
  watch(%r{^spec/.+_spec\.rb$})
  watch(%r{^lib/(.+)\.rb$})     { |m| "spec/lib/#{m[1]}_spec.rb" }
  watch('spec/spec_helper.rb')  { "spec" }

  # Rails example
  watch(%r{^app/(.+)\.rb$})                           { |m| "spec/#{m[1]}_spec.rb" }
  watch(%r{^app/(.*)(\.erb|\.haml|\.slim)$})          { |m| "spec/#{m[1]}#{m[2]}_spec.rb" }
  watch(%r{^app/controllers/(.+)_(controller)\.rb$})  { |m| ["spec/routing/#{m[1]}_routing_spec.rb", "spec/#{m[2]}s/#{m[1]}_#{m[2]}_spec.rb", "spec/acceptance/#{m[1]}_spec.rb"] }
  watch(%r{^spec/support/(.+)\.rb$})                  { "spec" }
  watch('config/routes.rb')                           { "spec/routing" }
  watch('app/controllers/application_controller.rb')  { "spec/controllers" }
end

spec/spec_helper.rb
config.include FactoryGirl::Syntax::Methods
config.before(:all) do
  FactoryGirl.reload
end


開発中の技術的なとこはできる範囲で書いていくヘ(^o^)ノ

Minamisenba.rbのGithubグループ作った(まだなにもない

https://github.com/minamisenbarb

ホームページとかイベント告知とかやっていきます。

よろしくお願いします( ̄(エ) ̄)彡☆

2013年10月8日火曜日

社内LT大会を開催したよヘ(^o^)ノ

お久しぶりの更新です(;・∀・)

先日、社内でLT大会を開催しましたヘ(^o^)ノ

言い出しっぺではないのですが。。。

楽しかった!!!

社内LTを進める理由

  • 楽しいヘ(^o^)ノ
  • 楽しいワーイヽ(゚∀゚)メ(゚∀゚)メ(゚∀゚)ノ
  • 楽しい(・∀・)
  • etc
僕のLTはこんな内容でしたー


みんな開発環境の構築はめんどくさい

なら自動化すればいいじゃんヘ(^o^)ノ

みたいなー

10分くらい話してしまった…(;・∀・)

全員分はアップできませんが、許可を頂いた有志のスライドはこちら





次回開催も決定していますヘ(^o^)ノ

( ̄(エ) ̄)彡☆

2013年8月29日木曜日

FactoryGirl Traits

FactoryGirlしりーず

Traits

これもよく使う

factory :user do
  name 'murajun1978'
  
  trait :admin do 
    admin true
  end

  trait :general do 
    admin false
  end

  factory :admin_user,   traits: [:admin]
  factory :general_user, traits: [:general]
end

とか

factory :user do 
  name 'murajun1978'
  
  trait :admin do 
    admin true
  end

  trait :general do 
    admin false
  end
end

factory :admin_user, parent: :user do 
  admin
end

こんな感じでもかける

使い方
FactoryGirl.create(:admin_user)
FactoryGirl.create(:user, :general)

どちらでもおk

複数レコードを作りたい場合
FactoryGirl.create(:user, 2, :general)

シーケンスと一緒に使おう

ネタが少なくなってきたw

( ̄(エ) ̄)彡☆

2013年8月27日火曜日

FactoryGirl Inheritance

FactoryGirlしりーず

Inheritance

みんな大好きお手軽継承です

spec/factories/user.rb
FactoryGirl.define do
  factory :user do
    name 'murajun1978'
    password 'murajun1978'
    password_confirmation { |u| u.password }

    factory :admin_user do 
      admin true
    end
  end
end

ブロックの外に書きたい場合は

FactoryGirl.define do
  factory :user do
    name 'murajun1978'
    password 'murajun1978'
    password_confirmation { |u| u.password }
  end

  factory :admin_user, parent: :user do ← ここ
    admin true
  end
end

両方ともこんな感じでつかえるよ

FactoryGirl.create(:user)
FactoryGirl.create(:admin_user)

admin_userでcreateするとadminフラグがtrueのユーザができる

かんたんヘ(^o^)ノ

2013年8月26日月曜日

FactoryGirl Associations

FactoryGirlしりーず

Associations

factories/users.rb
FactoryGirl.define do
  factory :user, aliases: [:author] do
    name 'murajun1978'
    password 'murajun1978'
    password_confirmation { |u| u.password }

    factory :user_posts do
      ignore do ←これ
        count 1
      end

      after(:create) do |user, value|
        FactoryGirl.create_list(:post, value.count, author: user)
      end
    end
  end

  factory :post do 
    author ←ここ
    sequence(:title) {|n| "text#{n}"}
  end
end

factories/post.rb
factory :post do 
  association :author, factory: :user ←ここ
  sequence(:title) {|n| "text#{n}"}
end

でも、このままだとbuildしたときにuserオブジェクトが作られない

factories/post.rb
factory :post do 
  association :author, factory: :user, strategy: :build ←ここ
  sequence(:title) {|n| "text#{n}"}
end

strategy: :buildオプションを指定するとbuildだけでuserオブジェクトも一緒に作成されるよ

明日は継承について書こうかなヘ(^o^)ノ

FactoryGirlしりーずとか書いてるけどFactoryGirlのGetting Startedにすべてがあるので…

そっちを見るのがはやいかも(;・∀・)

2013年8月23日金曜日

FactoryGirl Sequences ignore …

FactoryGirlしりーず

Sequences

これはよく使う
factory :post do 
  author
  sequence(:title) {|n| "test#{n}"} ←これ
end

test1,test2,test3と連番でvalueをセットできるよ

ignore

これは僕は知らなかった
factories/users.rb
FactoryGirl.define do
  factory :user, aliases: [:author] do
    name 'murajun1978'
    password 'murajun1978'
    password_confirmation { |u| u.password }

    factory :user_posts do
      ignore do ←これ
        count 1
      end

      after(:create) do |user, value|
        FactoryGirl.create_list(:post, value.count, author: user)
      end
    end
  end

  factory :post do 
    author
    sequence(:title) {|n| "text#{n}"}
  end
end

models/user.rb
require 'spec_helper'

describe User do
  context "example1" do 
    subject {FactoryGirl.create(:user)}
    its(:name){should eq 'murajun1978'}
  end

  context "example2" do 
    subject {FactoryGirl.create(:post)}
    its("author.name"){should eq "murajun1978"}
  end

  context "example3" do ←これ
    before {FactoryGirl.create(:user_posts, count: 5)}
    it {Post.should have(5).posts}
    it {User.should have(1).user}
  end
end

countを引数で指定するとそのレコード数だけ作成してくれる

countを指定しなければデフォルト値がセットされるよ

上の例だと1回だね

ちなみに…

have(5).postsのpostsは任意なのでitemsとかなんでもおkヘ(^o^)ノ

FactoryGirl Aliases

FactoryGirlとRSpecをすこしずつまとめようとおもう

まずはFactoryGirlのAliasesから

こんなテーブルがあるとする
User
 name
 password_digest

Post
 title
 author_id

model/user.rb
class User < ActiveRecord::Base
  has_secure_password

  has_many :posts
end

model/post.rb
class Post < ActiveRecord::Base
  belongs_to :author, class_name: 'User'
end

factories/users.rb ←ここ
FactoryGirl.define do
  factory :user, aliases: [:author] do
    name 'murajun1978'
    password 'murajun1978'
    password_confirmation { |u| u.password }
  end

  factory :post do 
    author
    title 'test'
  end
end

spec/models/user_spec.rb
require 'spec_helper'

describe User do
  context "example1" do 
    subject {FactoryGirl.create(:user)}
    its(:name){should eq 'murajun1978'}
  end

  context "example2" do 
    subject {FactoryGirl.create(:post)}
    its("author.name"){should eq "murajun1978"}
  end
end

specの書き方はさておき(;・∀・)

こんな書き方ができまするヘ(^o^)ノ

2013年7月12日金曜日

RailsでMySQLに接続できないヘ(^o^)ノ

Railsでmysql2のgemがインストールできないの続き

gemがインストールできたのでscaffoldしてみたー

Library not loaded: libmysqlclient.18.dylib (LoadError)

また、なんか無いって怒られた(;・∀・)

$ sudo ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/lib/libmysqlclient.18.dylib

再びscaffoldヘ(^o^)ノ

でけた(Rails4の場合)

これでも動かない場合は…

Connector/C 6.1がいるかもしれない

./bundle/config
UNDLE_BUILD__MYSQL: --with-mysql-config=/usr/local/Connector6.1のぱす/bin/mysql_config

もし、gemのmysqlバージョンとインストールされてるバージョンが違うって言われたら…

MySQL Community Server 5.7.1 m11をインストールすると幸せになるかも

実は…Rails3.2.11の環境ではここまでしないと動かなかった(;・∀・)

Postgres.appみたいなのあれば幸せになれるのになー

( ̄(エ) ̄)彡☆

2013年7月11日木曜日

Railsでmysql2のgemがインストールできないヘ(^o^)ノ

RailsとMySQLで開発してると、mysql2のgemインストールすると…

checking for mysql_query() in -lmysqlclient... no
checking for main() in -lm... yes
checking for mysql_query() in -lmysqlclient... no
checking for main() in -lz... yes
checking for mysql_query() in -lmysqlclient... no
checking for main() in -lsocket... no
checking for mysql_query() in -lmysqlclient... no
checking for main() in -lnsl... no
checking for mysql_query() in -lmysqlclient... no
checking for main() in -lmygcc... no
checking for mysql_query() in -lmysqlclient... no
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.

Provided configuration options:
 --with-opt-dir
 --without-opt-dir
 --with-opt-include
 --without-opt-include=${opt-dir}/include
 --with-opt-lib
 --without-opt-lib=${opt-dir}/lib
 --with-make-prog
 --without-make-prog
 --srcdir=.
 --curdir
 --ruby=/Users/murajun1978/.rbenv/versions/2.0.0-p247/bin/ruby
 --with-mysql-config
 --without-mysql-config
 --with-mysql-dir
 --without-mysql-dir
 --with-mysql-include
 --without-mysql-include=${mysql-dir}/include
 --with-mysql-lib
 --without-mysql-lib=${mysql-dir}/
 --with-mysqlclientlib
 --without-mysqlclientlib
 --with-mlib
 --without-mlib
 --with-mysqlclientlib
 --without-mysqlclientlib
 --with-zlib
 --without-zlib
 --with-mysqlclientlib
 --without-mysqlclientlib
 --with-socketlib
 --without-socketlib
 --with-mysqlclientlib
 --without-mysqlclientlib
 --with-nsllib
 --without-nsllib
 --with-mysqlclientlib
 --without-mysqlclientlib
 --with-mygcclib
 --without-mygcclib
 --with-mysqlclientlib
 --without-mysqlclientlib


Gem files will remain installed in /Users/user_name/dev/rails/asa_cloud_system/vendor/bundler/ruby/2.0.0/gems/mysql-2.9.1 for inspection.
Results logged to /Users/user_name/dev/rails/asa_cloud_system/vendor/bundler/ruby/2.0.0/gems/mysql-2.9.1/ext/mysql_api/gem_make.out

An error occurred while installing mysql (2.9.1), and Bundler cannot continue.
Make sure that `gem install mysql -v '2.9.1'` succeeds before bundling.

(゚д゚)!

ならば!
$ bundle config build.mysql --with-mysql-config=/usr/local/mysql/bin/mysql_config

あかん!

ん?ちょっとまてよ…

~/.bundle/config
BUNDLE_BUILD__MYSQL: --with-mysql-config=/usr/local/mysql/bin/mysql_config

BUNDLE_BUILD__MYSQL2: --with-mysql-config=/usr/local/mysql/bin/mysql_config

いけたやん(;・∀・)

そうだよね、mysql2だもんね…

( ̄(エ) ̄)彡☆

2013年7月10日水曜日

Railsで複数カラムのリレーションヘ(^o^)ノ

Railsは複合キーでのリレーションができない(;・∀・)

こんなgemがあったりする → composite_primary_keys

とても便利!

こんな実装を覚えたw
has_one :xxx, conditions: proc { ["id = ?", self.xxx_id] }

結構使えるかもヘ(^o^)ノ

( ̄(エ) ̄)彡☆

2013年7月9日火曜日

Rails4でRSpec(4) ヘ(^o^)ノ

前回のテストケースをDRY

spec/models/user_spec.rb
require 'spec_helper'

describe User do
  describe '#validate' do
    before :all do
      @user = FactoryGirl.build(:user)
    end

    it "正常に保存できる" do
      expect(@user.save).to be true
    end

    context 'login_name' do
      it '数字のみ' do
        @user.login_name = '11111'
      end

      it '英字のみ' do
        @user.login_name = 'ssss'
      end

      it '最初の文字は英字' do
        @user.login_name = '111aaa'
      end

      it '必須' do
        @user.login_name = ''
      end

      after :each do
        expect(@user.save).to be false
      end
    end

    after :all do
      User.delete_all
    end
  end
end

( ̄(エ) ̄)彡☆

Rails4でRSpec(3) ヘ(^o^)ノ

前回のはテストになってないwww

specファイルを修正

spec/models/user_spec.rb
require 'spec_helper'

describe User do
  describe '#validate' do 
    before :all do 
      @user = FactoryGirl.build(:user, password: 'murajun1978')
    end

    it "正常に保存できる" do
      expect(@user.save).to be true
    end

    context 'login_name' do
      it "login_nameは数字のみは不可" do
        @user.login_name = "111"
        expect(@user.save).to be false
      end

      it "login_nameは英字のみは不可" do
        @user.login_name = "eee"
        expect(@user.save).to be false
      end

      it "login_nameの先頭は必ず英字" do
        @user.login_name = "111aaa"
        expect(@user.save).to be false
      end

      it "login_nameは必須" do
        @user.login_name = ""
        expect(@user.save).to be false
      end

      it "login_nameは重複不可" do
        @user = FactoryGirl.build(:user, login_name: 'user_name_1')
        expect(@user.save).to be false
      end
    end

    after :all do
      User.delete_all
    end
  end
end

正常に保存できる条件でテストしないと意味ない(;・∀・)

( ̄(エ) ̄)彡☆

2013年7月8日月曜日

Rails4でRSpec(2) ヘ(^o^)ノ

昨日のBlogで少しきになるところがあったのでリファクタリング

spec/factories/users.rb
FactoryGirl.define do
  factory :user, :password, class: User do |f|
    sequence(f.login_name) { |n| "user_name_#{n}" } 
    f.password_confirmation { |u| u.password }
    f.admin true
  end
end

spec/models/user_spec.rb
require 'spec_helper'

describe User do
  describe '#validate' do 

    it "正常に保存できる" do
      @user = FactoryGirl.build(:user, password: 'murajun1978')
      expect(@user.save).to be true
    end

    context 'login_name' do
      before :all do
        @user = FactoryGirl.build(:user)
      end

      it "login_nameは数字のみは不可" do
        @user.login_name = "111"
        expect(@user.save).to be false
      end

      it "login_nameは英字のみは不可" do
        @user.login_name = "eee"
        expect(@user.save).to be false
      end

      it "login_nameの先頭は必ず英字" do
        @user.login_name = "111aaa"
        expect(@user.save).to be false
      end

      it "login_nameは必須" do
        @user.login_name = ""
        expect(@user.save).to be false
      end

      it "login_nameは重複不可" do
        @user = FactoryGirl.build(:user, login_name: 'user_name_1')
        expect(@user.save).to be false
      end
    end

    after :all do
      User.delete_all
    end
  end
end

Factory_Girlを少しシンプルにしてみましたヘ(^o^)ノ

login_nameは連番(user_name_1..user_name_2.. みたいな)

いい感じになったかな?

( ̄(エ) ̄)彡☆

2013年7月7日日曜日

Rails4でRSpec ヘ(^o^)ノ

Rails3からRails4へアップグレードしてみましたヘ(^o^)ノ

TurnipとCucumberについても近々書こう

Gemfile
source 'https://rubygems.org'

gem 'rails', '4.0.0'

group :development do 
  gem 'sqlite3'
  gem 'better_errors'
  gem 'binding_of_caller'
end

group :test do
  gem 'rspec-rails'
  gem 'spring'
  gem 'turnip'

  gem 'guard-rspec'
  gem 'guard-spring'

  gem 'growl'
  gem 'rb-fsevent'

  gem 'factory_girl_rails'
  gem 'database_cleaner'
end 

group :production do
  gem 'thin'
  gem 'pg'
end

gem 'sass-rails', '~> 4.0.0'

gem 'uglifier', '>= 1.3.0'

gem 'coffee-rails', '~> 4.0.0'

gem 'jquery-rails'

gem 'turbolinks'

gem 'jbuilder', '~> 1.2'

group :doc do
  gem 'sdoc', require: false
end

gem 'bcrypt-ruby', '~> 3.0.0'

Guardfile
guard :rspec, spring: true, turnip: true do
  watch(%r{^spec/.+_spec\.rb$})
  watch(%r{^lib/(.+)\.rb$})     { |m| "spec/lib/#{m[1]}_spec.rb" }
  watch('spec/spec_helper.rb')  { "spec" }

  # Rails example
  watch(%r{^app/(.+)\.rb$})                           { |m| "spec/#{m[1]}_spec.rb" }
  watch(%r{^app/(.*)(\.erb|\.haml)$})                 { |m| "spec/#{m[1]}#{m[2]}_spec.rb" }
  watch(%r{^app/controllers/(.+)_(controller)\.rb$})  { |m| ["spec/routing/#{m[1]}_routing_spec.rb", "spec/#{m[2]}s/#{m[1]}_#{m[2]}_spec.rb", "spec/acceptance/#{m[1]}_spec.rb"] }
  watch(%r{^spec/support/(.+)\.rb$})                  { "spec" }
  watch('config/routes.rb')                           { "spec/routing" }
  watch('app/controllers/application_controller.rb')  { "spec/controllers" }

#  # Capybara features specs
#  watch(%r{^app/views/(.+)/.*\.(erb|haml)$})          { |m| "spec/features/#{m[1]}_spec.rb" }

  # Turnip features and steps
  watch(%r{^spec/acceptance/(.+)\.feature$})
  watch(%r{^spec/acceptance/steps/(.+)_steps\.rb$})   { |m| Dir[File.join("**/#{m[1]}.feature")][0] || 'spec/acceptance' }
end

app/models/user.rb
class User < ActiveRecord::Base
  has_secure_password

  validates :login_name, uniqueness: true
  validates_presence_of :login_name, :admin
  validates_format_of :login_name, with: /\A[a-z][a-z0-9]*[0-9]\Z/
end

spec/models/user_spec.rb
require 'spec_helper'

describe User do
  describe '#validate' do 
    before :all do
      @user = FactoryGirl.create(:user)
    end
    
    it "正常に保存できる" do
      expect(@user.save).to be true
    end

    context 'login_name' do
      it "login_nameは数字のみは不可" do
        @user.login_name = "111"
        expect(@user.save).to be false
      end

      it "login_nameは英字のみは不可" do
        @user.login_name = "eee"
        expect(@user.save).to be false
      end

      it "login_nameの先頭は必ず英字" do
        @user.login_name = "111aaa"
        expect(@user.save).to be false
      end

      it "login_nameは必須" do
        @user.login_name = ""
        expect(@user.save).to be false
      end

      it "login_nameは重複不可" do
        @user2 = FactoryGirl.build(:user2)
        expect(@user2.save).to be false
      end
    end

    after :all do
      User.delete_all
    end
  end
end

spec/factories/users.rb
FactoryGirl.define do
  factory :user, class: User do |f|
    f.login_name 'murajun1978'
    f.password 'murajun1978'
    f.password_confirmation { |u| u.password }
    f.admin true
  end

  factory :user2, class: User do |f|
    f.login_name 'murajun1978'
    f.password 'sss'
    f.password_confirmation { |u| u.password }
    f.admin true
  end
end

.rspec
--color
--format d

実行結果
User
  #validate
    正常に保存できる
    login_name
      login_nameは数字のみは不可
      login_nameの先頭は必ず英字
      login_nameは重複不可
      login_nameは英字のみは不可
      login_nameは必須

Finished in 0.10709 seconds
6 examples, 0 failures

validateの正規表現で^や$が使えなくなってたねー

( ̄(エ) ̄)彡☆

2013年7月6日土曜日

第2回 RubyMotion もくもく会 Osakaに参加してきたーヘ(^o^)ノ #rubymotionosaka

前回は参加できなかったので…

今日こそは!!!

少し遅れましたが参加できましたヘ(^o^)ノ

場所は前回と同じ1×1株式会社さんです(前回参加してませんが…)

勉強会の場所を提供してくれるのは本当にありがたいですー

あ(・∀・)り(・∀・)が(・∀・)と(・∀・)う!

Apple TVでコードレビューもすーいすい

僕が本日試したのはProMotion

naoyaさんのブログで紹介されていて興味津々だったので試してみました

GitHubにはTutorialもあるのでよい

もくもく会の最後にProMotionを使ったコードと使わなかったコードを比べてみました

みなさんの反応も上々www

帰宅してもう少し調べてみるとTeacupにも対応しているみたい

期待大ヘ(^o^)ノ

現地ではbundle installでpath指定すると動かなかったのですが…

帰宅しチャレンジするとすんなり動きました(;・∀・)

よくわからない…

rakeするとGemがないとメッセージはでるもののちゃんと動いています

楽しかったー

次回も参加するぞーヘ(^o^)ノ

( ̄(エ) ̄)彡☆

2013年6月2日日曜日

Heroku Postgresのデータをローカルにリストアしてみたヘ(^o^)ノ

環境
Mac OS X 10.8.3
Postgres.app

Heroku

PG Backupsアドオンを追加
$ heroku addons:add pgbackups --app アプリ名

Heroku Postgresのデータをバックアップ
$ heroku pgbackups:capture --app アプリ名

Heroku Postgresへログインしてバックアップファイルをダウンロード



バックアップファイルをPostgres.appへリストア
$ pg_restore --verbose --clean --no-acl --no-owner -h localhost \
         -d データベース名 バックアップファイル名(パス)

Postgres.appはとても便利で簡単にPostgreSQLを利用できますよ

( ̄(エ) ̄)彡☆

iPhoneさんさようなら、Androidさんこんにちわヘ(^o^)ノ

iPhone 4sからGalaxy S4へ

ウキウキ触ってると…















なんとminiなるものが…Σ(゚д゚lll)

miniの方が良かったなー

Simフリー版を買うかー?w

Android Studioで趣味アプリでも作りますか。

資格に興味が無かった私ですが、Ruby Association Certified Ruby Programmer Silverをパスしました。







普段使わないRubyの基礎を学ぶいい機会になりました。

今月中にRuby Association Certified Ruby Programmer Goldにチャレンジします。

受験料がちょっと高いwww

( ̄(エ) ̄)彡☆

2013年5月30日木曜日

Ubuntuがきてるヘ(^o^)ノ

最近、Ubuntuにぞっこんのむらじゅんですw

Ubuntu 13.04
Rubyのバージョン管理はrbenv
Gemパッケージ管理はbundler
PostgreSQL9.2.4

あと、Chromeでないと生きていけないので…

使い出して2週間ほどですが、標準のTerminalがイマイチいけてないのに気がつきました(;・∀・)

Googleさんに聞いてみると…

Guake terminalなるものが Σ(゚д゚lll)

こいつがなかなかイイ


F12でさくっと立ち上がり、F11で全画面表示ヘ(^o^)ノ













スクショがこちら…

うーん、いいのよー

RubyMotion以外の開発はUbuntuへ移行するかもー

今度、家に転がってるNexusにUbuntu for phonesでもインストールしてみようヘ(^o^)ノ

( ̄(エ) ̄)彡☆

2013年5月6日月曜日

Arrayクラス #Ruby

Class Array(Ruby 2.0)

Rubyの配列

foo = Array.new(2, "foo") # => ["foo", "foo"]
foo[0].replace("bar")
foo # => ["bar", "bar"]

ひえー、すべての要素の値が変更されました(;・∀・)

んじゃ…
foo = Array.new(2){"foo"} # => ["foo", "foo"]
foo[0].replace("bar")
foo # => ["bar", "foo"]

ほー、おもろいなーヘ(^o^)ノ

( ̄(エ) ̄)彡☆

2013年5月4日土曜日

比較演算子 #Ruby

Rubyの比較演算子

"foo" == "foo" # => true

eql?メソッド
"foo".eql? "foo" # => true

基本的には同じ振る舞いですねー

でも、eql?メソッドには少し注意が必要です

eql?メソッドは型の比較も行います

1 == 1.0 # => true
1.eql? 1.0 # => false

equal?メソッドは同じオブジェクトか判定します

"foo".equal? "foo" # => false

a = "foo"
b = a
a.equal? b # => true

( ̄(エ) ̄)彡☆

文字列からシンボルを生成する #Ruby

Rubyのシンボル

:foo ← こういうやつ

実は文字列からも生成できる

こんなかんじ
"foo".to_sym # => :foo

"foo".intern # => :foo

Class: String (Ruby2.0)

( ̄(エ) ̄)彡☆

2013年4月12日金曜日

Array#injectを使ってみたよヘ(^o^)ノ

Rubyで配列内の値をもごもごしたいときに使うやつ?

たとえば配列内の合計を取得してみる
[1,10,100].inject{|sum, value| sum + value} # => 111

実はこいつ…こんな風に書ける
[1,10,100].inject(:+) # => 111

知らんかった…Σ(゚д゚lll)

( ̄(エ) ̄)彡☆

2013年3月24日日曜日

Windowsで生成したcsvファイルをPostgreSQLへインポートしたよ

サーバはLinuxでDBはPostgreSQL…

WindowsでCSVファイルを生成して、\copyコマンドでインポートしたい!

なやましいところ

改行コード
文字コード
BOM(なんだこれ?)

改行コードヘ(^o^)ノ
WindowsはCR+LF
Linux、Mac OS XはLF

僕はC#.NETでアプリ作ってたからControlChars.LFで

文字コード
これはファイル作成時にUTF-8を指定してファイルを作ってあげればよい

それでもできない…なぜ…

それはBOM…
od -c file_path で見てみると…
なにやら先頭に357 273 277←こいつですよ

UTF8Encoding(false)でBOMを無効にできる

コマンドでもできる

めんどくさい…

と、統一しようぜ…Win…do…

( ̄(エ) ̄)彡☆

2013年3月12日火曜日

MBAの環境構築ヘ(^o^)ノ

ヘ(^o^)ノ

Xcode
Command Line Tools
Homebrew

$ brew install wget
$ brew install rbenv
$ brew install ruby-build

.bashrc or .zshrc
export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init - zsh)" ← zsh
eval "$(rbenv init -)" ← bash

$ rbenv install 2.0.0-p0
$ rbenv global 2.0.0-p0
$ gem install bundle
$ gem install pry
$ gem install powder
$ rbenv rehash

bashの人
bundler exec
curl -L https://github.com/gma/bundler-exec/raw/master/bundler-exec.sh > ~/.bundler-exec.sh
$ echo "[ -f ~/.bundler-exec.sh ] && source ~/.bundler-exec.sh" >> ~/.bashrc

zshの人
bundler exec 
$ curl -L https://raw.github.com/willnet/bundler-exec/master/bundler-exec.sh > ~/.bundler-exec.sh
$ echo "[ -f ~/.bundler-exec.sh ] && source ~/.bundler-exec.sh" >> ~/.zshrc

Github for Mac
iTerm2
TextMate バイナリはここ
Postgres.app
MacRuby
RubyMotion (有料ですw
R for Mac
RStudio

TextMateでRubyMotionの補完 ここを参考
$ cd ~/Library/Application\ Support/
$ git clone https://github.com/libin/RubyMotion.tmbundle.git Avian/Bundles/RubyMotion.tmbundle

Railsヘ(^o^)ノ
$ mkdir hoge
$ cd hoge
$ vi Gemfile

Gemfile
source 'https://rubygems.org'
gem 'rails', git: 'git://github.com/rails/rails.git'

$ bundle install --path vendor/bundler
$ rails new .  (bundler execがインストールされてないならbundle exec rails new .
$ bundle

こんな感じ

2013年2月25日月曜日

関西ゼロからはじめるR言語勉強会へ参加してきたーヘ(^o^)ノ

最近、お客様の傾向を分析したいとかいう案件があった。

なので、関西ゼロからはじめるR言語勉強会に参加してきたーヘ(^o^)ノ

今回が初めてという事でR言語とは何か?何ができるのか?を飯田さんが説明してくれました。

実際にデモでグラフで視覚化したり、とてもわかり易かったです。

僕の印象
R言語はPythonっぽい(多分、習得には時間はかからない)
統計学、機械工学等の知識がある程度は必要 (。・x・)ゝ
楽しそうヘ(^o^)ノ
簡単そうヘ(^o^)ノ
CRANパッケージが便利ヘ(^o^)ノ

来月も開催されるようなので、書籍を購入してなにか発表できればいいなー

Railsアプリで統計や分析部分をR言語のスクリプトを叩くのが最終目標

やることいっぱいだけど、頑張らないとねヘ(^o^)ノ

これから、マーケティングっぽい案件も増えて来そうだ

でわ( ̄(エ) ̄)彡☆


2013年2月14日木曜日

RubyMineを使ってみようヘ(^o^)ノ

RubyMine5がリリースされてRubyMotionも正式サポートされましたヘ(^o^)ノ

Ruby、Rails、JRuby、RubyMotionとまさにRubyのためのIDE!

もちろんIDEなのでコマンドいらずー

いいか悪いかは別としてねw

今週末のCocoa勉強会関西でRubyMineでRubyMotionを試してみますヘ(^o^)ノ

RVMならgemsetでgemパッケージを管理すると思うので、IDEから新規プロジェクトを作れるのですが…

僕はbundlerでgemパッケージを管理しているのでIDEからはプロジェクトを作成できません…(rbenv-gemsetなるものがあるようだが試してない)

TerminalからRubyMineを起動したいので、Toos > Create Command-line Laucher…
(初回起動時に設定できるよー)

Pathに/usr/binを指定すればTerminalからmineコマンドが利用できる

















30日トライアル版でぜひお試しあれーヘ(^o^)ノ

ちなみにRubyMineは年間ライセンスとなっています


2013年2月11日月曜日

Railsで画像をバイナリファイルで保存ヘ(^o^)ノ

( ̄(エ) ̄)彡☆

適当にひな形作る
$ rails g scaffold photo image:binary

app/models/photo.rb
class Photo < ActiveRecord::Base
  attr_accessible :image, :picture_file
  
  def picture_file= (file)
    if file
      self.image = file.read
    end
  end
end

app/controllers/photos_controller.rb
#追加
def picture
  @image = Photo.find(params[:id])
  send_data(@image.image)
end

config/routes.rb
#変更
resources :photos do
  member do
    get :picture
  end
end

app/views/photos/_form.html.erb
#変更
<%= f.label :picture_file %>
<%= f.file_field :picture_file %>
app/views/photos/index.html.erb
<% @photos.each do |photo| %>
  <%= image_tag picture_photo_path(photo), :size => '30x30' %> #修正
  <%= link_to 'Show', photo %>
  <%= link_to 'Edit', edit_photo_path(photo) %>
  <%= link_to 'Destroy', photo, method: :delete, data: { confirm: 'Are you sure?' } %>
<% end %>

app/views/photos/show.html.erb
Image:
  <%= image_tag picture_photo_path(@photo), :size => '30x30' %> #修正

これでバイナリーデータで保存して、表示できるヘ(^o^)ノ

でもね… select_dateのおかげでレコード毎にselect文が─=≡Σ((( つ•̀ω•́)つ

うーん、なんか良い方法ないですかね?

2013年2月10日日曜日

rbenv BUILD FAILEDヘ(^o^)ノ

$ rbenv install 1.9.3-p385

BUILD FAILED…

またかよ…

$ brew tap homebrew/dupes
$ brew install apple-gcc42
$ export CC=/usr/local/bin/gcc-4.2
$ CONFIGURE_OPTS="--with-readline-dir=/usr/local --with-openssl-dir=/usr/local" rbenv install 1.9.3-p385

インストールできたヘ(^o^)ノ

( ̄(エ) ̄)彡☆

2013年2月5日火曜日

RailsのURIヘ(^o^)ノ

Railsで検索フォームで検索した結果を表示した場合
localhost:3000/search?utf8=✓&title=&commit=検索

こんな感じになる…

なんか( ´Д`)キモッ

localhost:3000/search?title=xxxxみたいにしたい!

調べたヘ(^o^)ノ

Railsのutf8パラメータとcommitパラメータ

なるほど…

commitパラメータ
フォームに複数ボタンを設置した場合に判別できる
今回は不要
<%= submit_tag "検索", name: nil %>

utf8パラメータ
IE対策みたいだから(ЭεЭ)イラネーヨ
app/helpers/application_helper.rb
module ApplicationHelper
 def utf8_enforcer_tag
  return ""
 end
end

URLにクエリを含める理由は検索結果をbookmarkできるから

同じ検索を何度もするのは( ゚Д゚)マンドクセー

セキュリティ上よくない場合もあるので気を付けてねー

( ̄(エ) ̄)彡☆

Railsのsecret_tokenヘ(^o^)ノ

RailsアプリをまんまGithubへプッシュしたらconfing/initializers/secret_token.rbも!!!

このsecret_tokenはセッションデータを署名するために使う秘密鍵 Σ(゚д゚lll)

これを変更してWebサーバにデプロイすれば問題ないけど…

色々調べてるとみんないろんな方法で対処している

rake secretで生成された文字列をコピーする(絶対忘れるw

Rakeタスクを作成する(僕はこれにした

$ rails g task generate_secret_token

lib/tasks/generate_secret_token.rake

参考というかそのままw → config/initializers/secret_token.rb を生成する Rake タスク

登録されているかチェックしてrakeコマンド
$ rake -vT
$ rake secret:generate

リポジトリからはsecret_token.rbは削除した

でも、よく考えると…

これって、デプロイする度に再起動しないといけない?…(´・ω・`)

Herokuだと環境変数に登録しておくのもアリだ

$ heroku config:add SECRET_TOKEN=xxxxx

config/initializers/secret_token.rb
#Hogeはアプリ名
Hoge::Application.config.secret_token = ENV['SECRET_TOKEN']

なんか良い方法ないか?w

( ̄(エ) ̄)彡☆

僕のPrivate開発コストヘ(^o^)ノ

毎月
RailsCasts Pro      $9
Github micro       $7
RailsApps Tutorials Pro  $19
Gehirn           ¥350(サーバ
Heroku Postgres     $40 - 50(近々とめる予定

Pivotal Tracker       $7 (今日知って良さげで検討中

ライセンス(年間)
Apple dev for iOS
RubyMotion
RubyMine
Pixate

自分なりにコストパフォーマンスはかなり良いと思うヘ(^o^)ノ

年間ライセンスは…たっ、たかい><

( ̄(エ) ̄)彡☆





2013年1月24日木曜日

RailsでAPI用のルーティングを設定してみたヘ(^o^)ノ

( ̄(エ) ̄)彡☆

最近、スマートフォンの開発需要が高まりつつあります…

iOS用のアプリならRubyMotionMobiRuby(α版)とか

RubyMotionは1.30で落ち着いていますねー

CSSでiOSアプリをデザインできるPixateなんかも注目されています

WebアプリはRailsPadrino(日本語)とか

Rubyistの活躍の場がどんどん増えていくのは嬉しい限りですヘ(^o^)ノ

そこでiOSとRailsを連携したいなー

モバイルとの連携はAPIたたいてデータをやりとりする流れ…

Webはexample.com/blogs

APIはapi.example.com/blogs

routes.rb
resources :blogs

constraints :subdomain => 'api',:format => :json do
  resources :blogs, :defaults => { :format => :json }
end

api.example.com/blogs.jsonをたたけばJSONファイルでデータを取得できます

うーん、最後の.jsonが気に入らない…

routes.rb
constraints :subdomain => 'api',:format => :json do
  resources :blogs, :defaults => { :format => :json }
end

resources :blogs, :format => :html

api.example.com/blogsでJSONファイルでデータ取得できたヘ(^o^)ノ

ローカルでテストしたいならPowを使うといいよ

2013年1月23日水曜日

Gehirn RS2を設定してみたよヘ(^o^)ノ

なぜGehirn???

きっかけは「ゲヒルンウェブセキュリティ勉強会 第3回 in大阪」

代表取締役の石森氏が丁寧に説明してくれましたヘ(^o^)ノ

石森氏は1990年生まれ Σ(゚д゚lll)

天才ハッカーです…

Gehirnのミッションは「人と社会のために新たな価値を創造し続ける」

それはサーバのスペックと価格にも反映されている

プランはショート、グランデの2つ

ショートプランは月額350円(初期費用1,000円)で利用できます

低価格、高セキュリティ!

その上…サーバのメインメモリは64GB!

rootはとれないけどインフラ知識のないプログラマには最適かもねヘ(^o^)ノ

ああ…またインフラ力が低下していく…www

シェル環境はzsh+screen

うーん、良い感じ

まずはGehirn IDを作成します

コンパネ > RS2 > SSH > SSHアカウントを追加する

実はSSHとFTPSのアカウントは作りたい放題?

コンパネ > RS2 > SSH > 公開鍵の管理 > キーペアを生成する

これで鍵がダウンロードできますヘ(^o^)ノ

僕はMac OS X 10.8

$ cp xxxxxx.key ~/.ssh
$ cd ~/.ssh
$ chmod 600 xxxxxx.key

~/.ssh/config
Host xxxx
 User xxx
 Port 22
 Hostname xxxx
 IdentityFile ~/.ssh/xxxxxx.key

こんな感じですかねー

Host名はコンパネの契約情報を見ればいい

$ ssh username@hostname

パスワード認証なしでSSHログインできたヘ(^o^)ノ

Railsをインストール
$ rs2 install rails

rs2はGehirn RS2の独自コマンド(๑>◡<๑)

注意が必要なのは、自分でインストールしたもの(RailsとかWordPressとか)は自分でアップデートしないとダメよー

データベースも複数作れるし、スナップショットも自動でとってくれるよ

ドメイン設定すればメールサーバも簡単に構築できるしいいよ

( ̄(エ) ̄)彡☆

2013年1月12日土曜日

TDD Boot Camp in 大阪に参加してきたよヘ(^o^)ノ #tddbc

( ̄(エ) ̄)彡☆

TDD Boot Camp in 大阪3.0に参加してきました

今年の目標がRuby勉強会の開催とTDDだったので迷わず参加してきた

Rubyチームは端っこ…ヽ(;´Д`)ノ

意外?にC#、C++が多かった

懇親会でも話しに出たが、関西はC#やC++の勉強会が活発です

@moririringさんが積極的に勉強会をやっていからなのか?w

見習ってRubyの勉強会やらんとあかんなー

ないなら作るの精神ですw

さて、午前中は@t_wadaさんのセッションとデモでした

昼食後にTDD+ペアプロ開始ヘ(^o^)ノ

僕は@fumikonyさんとペアになって課題からToDoリストを作成してテストコードを書いていきました

最初は2画面でテストコードとソースコードを見ていたのですが…

気がついたらソースコードをあーだこーだ Σ(゚д゚lll)

テストコード書いてないwww

プロジェクトという大きなモノをステップに分割して、さらに細かく分割していきます

TDDのサイクル
1.次の目標を考える
2.その目標を示すテストを書く
3.そのテストを実行して失敗させる(Red)
4.目的のコードを書く
5.1で書いたテストを成功させる(Green)
6.テストが通るままでリファクタリングを行う(Refactor)
7.1〜6を繰り返す

TDDに慣れるためにテストを書くことを習慣化させないとダメですね…

ペアプロも出来たし楽しかったヘ(^o^)ノ

次回も是非参加したいですね

みなさんおつかれさまでしたー(๑>◡<๑)

Untitled