2014年7月4日金曜日

Punditでsessionとかにアクセスしてみるヘ(^o^)ノ

CanCanあかんみたい。なので。。。

Punditを使ってみました。

シンプルで良くできたgemだと思います。

とりあえずインストール
$ rails g pundit:install

するとapp/policies/application_policy.rbが作成されます。

authorizeはアクセス制御

index?とかupdate?とかにロジックを書けばよし

コントローラにコレ書いて
rescue_from Pundit::NotAuthorizedError, with: :user_not_authorized

プライベートメソッドでどっかにredirectすれはおk
def user_not_authorized
  # errorメッセージ
  flash[:error] = "You are not authorized to perform this action."
  
  # リダイレクト先
  redirect_to(request.referrer || root_path)
end

AppicationPolicyクラス内でセッション情報にアクセスしたい!

application_controller.rb
before_action :_current_session

protected def _current_session
  accessor = instance_variable_get(:@_request)
  ApplicationPolicy.send(:define_method, :session, ->{accessor.session})
end

パラメータもいけまっせー
ApplicationPolicy.send(:define_method, :params, ->{accessor.params})

( ̄(エ) ̄)彡☆


参考
rails 4 対応の認可の gem

2014年6月29日日曜日

Shinosaka.rb & 西脇.rb & 東灘.rb 合同ペアプログラミングを開催したよヘ(^o^)ノ

先日、西脇.rb & 東灘.rbとの合同ペアプログラミングを開催しましたー

会場は弊社リバティフィッシュ株式会社


地域コミュニティ同士の交流を深めたいなーという事で、
西脇.rbの伊藤さんと東灘.rbのAkiさんの協力で実現しました!

Shinosaka.rbと西脇.rb & 東灘.rbメンバーのシャッフルでペアプロ開始!


僕は、みなさんを見守っていましたw (19人だった

あーだこーだとホントに楽しそうだし、真剣だった(当たり前w

終了後は、みんなでコードレビュー(写真とるの忘れた...

変数名やメソッド名の付け方とか、RSpec3のits使えないなぜだ?とか、
Rubyのコーディング規約的なとこや、もっと良い書き方はないかなどなど

勉強になりました(`・ω・´)ゞ

変数やメソッドの名前についてはこちらが参考になるかも
モデルやメソッドに名前を付けるときは英語の品詞に気をつけよう
アプリケーションをつくる英語

RSpec
Better Specs { rspec guidelines with ruby }
RSpecの最新の動向・RSpec 3へのアップグレードガイド
RSpec 3の重要な変更
Project: RSpec Core 3.0
Everyday Rails - RSpecによるRailsテスト入門

Ruby
ruby-style-guide (英語)
ruby-style-guide (日本語)

懇親会もみなさん参加していただきましたヘ(^o^)ノ

総勢18名の懇親会!

これだけRubyistがあつまると、なんでもできる気がしますw

ホントに楽しかった!

愚痴もいっぱい聞いてもらえたし... ( ̄▽ ̄;)

また、やりたいなー

参加していただいた皆さん!ホントにお疲れ様でしたヘ(^o^)ノ
そして、ありがとうございました!

このイベントの為に、Skypeミーティングで2ヶ月前から協力してくれた、
伊藤さん、Akiさんに心から感謝です!(これからも宜しくですw


イベント内容
Shinosaka.rb #6 with 東灘.rb & 西脇.rb 合同ペアプログラミング
西脇.rb & 東灘.rb ペアプログラミング In Action with Shinosaka.rb

みんなのコード(ペアごとにブランチ作成してます
pair-programming-in-action

勉強会
Minami.rb 第26回勉強会
東灘.rb Meetup #2
Shinosaka.rb #7


みなさんの参加お待ちしていますよー

( ̄(エ) ̄)彡☆

2014年6月12日木曜日

Rubyのancestorsメソッドヘ(^o^)ノ

ancestorsメソッドはクラスの親クラスを配列にして返します。

インクルードしたモジュールも含まれます。

ところで。。。

RailsでDate.tomorrowとすれば、明日の日付が取得できます。

RubyのDateクラスを拡張していますね−。

モンキーパッチは手軽で簡単に拡張できます。

Railsは。。。

調べてみましょう。

Railsコンソールで実行すると
$ Date.ancestors
=> [Date, DateAndTime::Calculations, Comparable, Object, ActiveSupport::Dependencies::Loadable, PP::ObjectMixin, JSON::Ext::Generator::GeneratorMethods::Object, Kernel, BasicObject]

注目すべきは
DateAndTime::Calculations

ちなみにRubyのirbで実行すると
$ Date.ancestors
=> [Date, Object, Kernel, BasicObject]

todayやtomorrowはDateAndTime::Calculationsに定義されています。
[参考] DateAndTime::Calculations

これModuleですねー。

なぜ、わざわざモジュールに定義してインクルードしているのか?
class date
  include DateAndTime::Calculations
end

それはオープンクラス拡張の可視化です。

モンキーパッチは手軽ですが、わかりずらいのです。

DateAndTime::Calculationsを見ればどんな拡張しているのか一目瞭然ですよね!

( ̄(エ) ̄)彡☆

2014年6月10日火曜日

プロキシ環境でSeleniumを使うヘ(^o^)ノ

こんなことがありまして。。。


今日も解決せずに、Seleniumを使うことにしました(>_<)

プロキシ環境下なんで、Firefoxは起動するけど、その先に進まない!

Capybara + Selenium + プロキシ環境下で使えるようにしたよ。

設定は簡単で、プロキシサーバーに接続しないようにしただけやけど

spec/spec_helper.rb
 ENV['NO_PROXY'] = ENV['no_proxy'] = '127.0.0.1'
 Capybara.app_host          = 'http://127.0.0.1:3000'
 Capybara.server_port       = 3000
 Capybara.default_driver    = :selenium
 Capybara.default_selector  = :css
 Capybara.default_wait_time = 10

プロキシは越えるためにあるのだー(こえてない

( ̄(エ) ̄)彡☆

2014年6月8日日曜日

Rails Girls Osaka #1 に行ってきたよーヘ(^o^)ノ

昨日はRails Girls Osaka #1にスポンサーとしてお邪魔しましたー。





















コーチのみなさんも、参加されたGirlsのみなさんも楽しそうなのが印象的でした。

楽しそうなみなさんを見ているとムズムズして、僕も途中から裏でコーディングを始めちゃったw

Heroku弁当うまかったー

みなさん無事、Herokuにpushできました。

プライベートでHeroku使ってますが、やっぱりいいですね

インストールも簡単 ⇒ heroku toolbelt

最後のつじたさんの挨拶は感動的でしたねー(>_<)

僕もShinosaka.rbを主催しているので、伝わるものがありました。

最初は不安でいっぱいでしたw

Rails Girls Kyoto #2の告知もありましたねー(楽しみや

ホントにみなさんお疲れ様でしたヘ(^o^)ノ

みなさんとすばらしい時間を共有できたことを幸せに思います。

僕の中で企画中のイベントもありますw

またお会いできることを楽しみにしています。

( ̄(エ) ̄)彡☆


2014年6月1日日曜日

Rubyの特異メソッドヘ(^o^)ノ

例えば。。。

murajunクラスでmurajun?メソッドを定義しているよねー

そのオブジェクトをnameクラス(名前アカンやつ)のhello_murajunメソッドに引数で渡してる。

murajun?メソッドだけなら、Stringクラスにモンキーパッチできるよねー

でも、このときだけmurajunかどうか判定したい場合は???

そんな時の特異メソッドですよ

murajun_name = "murajun"

def murajun_name.murajun?
  self == "murajun"
end

name = Name.new
p name.hello_murajun(murajun_name) # => Hello, murajun.


特定の条件下だけ、ある機能を実装したい場合に便利ですね。

( ̄(エ) ̄)彡☆

2014年5月31日土曜日

Rubyの無名クラスヘ(^o^)ノ


Classクラスの引数にクラスを渡すと継承と同じことができる

これと同じ
class Foo < String; end

11行目でクラス名を取得してるけど、nilなので名無しです

ちゃんと名前を付けてあげましょう
Foo = anonymous_class
p anonymous_class.name # => Foo

親クラスを確認
p anonymous_class.superclass # => String
p Foo.superclass # => String

helloメソッドの有無を確認
p Foo.instance_methods.grep(/hello/) # => [:hello]


( ̄(エ) ̄)彡☆

2014年5月30日金曜日

Rubyのinstance_evalヘ(^o^)ノ

昔VBとかやってた。

withとかでこんな感じで書けた
with foo
  .foo_method
end

これをinstance_evalを使ってRubyでやってみようヘ(^o^)ノ


こんな感じでfooを省略できる
foo.bar
foo.baz

インスタンス変数とかを条件に
メソッドコールしたりできるから便利

さらに17行目みたいに、
スコープを越えてローカル変数にアクセスできるのも便利

( ̄(エ) ̄)彡☆

2014年5月26日月曜日

Shinosaka.rb #5を開催したよヘ(^o^)ノ #shinosakarb

Shinosaka.rb #5

今回で5回目!

そして、初めて淀川を渡らなかった。。。(;・∀・)

開催場所はクレオ大阪北

会場にちゃりで向かっていると。。。

ぎゃる、ぎゃる、ぎゃる、ぎゃる、ぎゃる



Shinosaka.rbはぎゃるがくる勉強会?(こない

なんか、イベントがあったらしくなにやら入りにくかったwww

今回はみんなでもくもくしましたーヘ(^o^)ノ

















和室だったから、こんなかんじー

















僕は改修業務中心なので、リファクタリングの知識を深める為にこいつをもくもく


すごく良いのだけれど、サンプルコードが見当たらない。。。

テストもない。。。

全部自分で書かないとイケないので、中級者向きかなー

まだ途中なので、後日ここに感想書きまする

 懇親会も17:30から23:00までΣ(゚д゚lll)


お疲れ様でした。

そして、楽しかった!

ちけん、画像いっぱいありがとm(__)m

参加してくれたみなさん、当日の成果はここにお願いします><

次回も参加してねー

( ̄(エ) ̄)彡☆


2014年5月24日土曜日

Rubyのmethod_missingで動的メソッドヘ(^o^)ノ

method_missingで動的メソッドを作ってみよー

method_missingって...そうあれ!よく怒られるやつw

そいつをオーバーライドして、動的メソッドを作るよ

こんな感じ
例えば、17行目でmethod_missingの第1引数には「:name=」こんなハッシュが、
 第2引数には「アボ」って文字列が渡される。

参照する場合、19行目では第1引数には「:name」=のないハッシュが渡される。

その場合は、インスタンス変数のハッシュから値を取得する。

Rubyは楽しい!

ちなみにコードに出てくる「アボ」はこの子です




















Dragon Ball Wiki

戦闘力53万だけど、MAXは10億8千!


( ̄(エ) ̄)彡☆

参考
BasicObject#method_missing

2014年5月22日木曜日

Rubyのクラスインスタンス変数ヘ(^o^)ノ

Rubyではクラスで@valueとすることで、インスタンス変数として使うことができますよね?

んじゃ、ちょっと試してみましょう

class Foo
  def bar(val) 
    @value = val
  end
end

instance_variablesメソッドでインスタンス変数を取得しましょう
$ foo = Foo.new
$ p foo.instance_variables # => []

あれ?

barメソッドを呼び出してみましょう
$ foo.bar("murajun")
$ p foo.instance_variables # => [@value]

何が言いたいかというと、インスタンス変数はクラスにはいないよー

オブジェクトにいるんだよー














( ̄(エ) ̄)彡☆

参考
Object#instance_variables



2014年5月20日火曜日

RubyのArrayで条件式に一致する要素を抽出ヘ(^o^)ノ

Arrayでselectメソッドを使って、条件式に一致する要素を抽出してみましょう

普通にやっても味気ないので、2パターン書いてみました

どっちでもあんまり変わらないけど...(;・∀・)

こんな感じ


( ̄(エ) ̄)彡☆

Rubyで動的メソッド define_method編ヘ(^o^)ノ

Rubyでdefine_methodで動的にメソッドを作る

こんな感じ


共通部分をまとめるのに便利

( ̄(エ) ̄)彡☆

2014年5月16日金曜日

Rails generate model オプションのparentを使ってみたヘ(^o^)ノ

rails generate modeのparentオプションを調べてみたヘ(^o^)ノ

オブジェクト指向か?と言われると微妙なとこです(;^ω^)

前にこんなモデル設計しました

















userには共通項目があって、customer、employeeそれぞれの項目をもっています。

このプロジェクトでは、それぞれのテーブルをリレーションして実装しました

ふりかえって、parentオプションを使ってみます

userモデル typeカラムを追加
$ rails g model User first_name:string last_name:string \
       email:string company:string unit:string type:string

customerモデル
$ rails g model customer --parent user

employeeモデル
$ rails g model employee --parent user

userモデルはこんなの
class User < ActiveRecord::Base
end

customerモデルはこんなの
class Customer < User
end

employeeモデルはこんなの
class Employee < User
end

それぞれuserモデルを継承しています

では、employeeモデルにバリデーションを設定しましょう
class Employee < User
 validates :working_arrangements,
   presence: true
end

バリデーションの確認してみましょう






コールバックされましたヘ(^o^)ノ

customerモデルはどうでしょう?








saveできましたねー

userテーブル一つで、各モデルで振る舞いを変更できました

( ̄(エ) ̄)彡☆

Rubyのネームスペースヘ(^o^)ノ

Rubyはオープンクラスのメソッドをオーバライドできます。

いわゆるモンキーパッチ〜


便利だけど、すべての振る舞いを変更してしまうので危険(;^ω^)

では、自分で定義したクラスをネームスペースで囲ってみましょう

オーバライドされなくなりましたー

ネームスペースで囲ったときは、10行目のように使用することができますー

( ̄(エ) ̄)彡☆

2014年5月14日水曜日

Rubyのincludeとextendヘ(^o^)ノ

Rubyのincludeとextendの違いについて


つまりはこういうことです





















ポイントは32行目と38行目

ancestorsメソッドでご先祖さんを取得しています。

includeしたbarクラスは、barとfooが取得できていますが、
extendしたbuzクラスは、fooが取得できていません。

extendはクラスに定義されるのではなく、
selfの特異メソッドとして定義されるのですねー


間違えてたら教えてw

( ̄(エ) ̄)彡☆

参考
instance method Module#ancestors
instance method Object#singleton_methods
instance method Enumerable#grep
instance method Module#instance_methods


2014年5月10日土曜日

RubiniusでRubyを学ぶヘ(^o^)ノ

@merborneさんのProcを制する者がRubyを制す(嘘)rubiniusを知ったw

こいつはRubyの学習にはもってこいと思い、コードリーディングしてみたヘ(^o^)ノ

Arrayクラスのeachがどんな処理をしているのか調べてみる。

コードリーディングにunite-grepを使ってみる。

パターン検索にはagを使います(早いらしい???)

agのインストール
$ brew install ag

Vimプラグインのunite.vimvimproc.vimをインストール

unite-grepでagを使いたいので
.vimrc
" unite grep
let g:unite_enable_start_insert = 1
let g:unite_enable_ignore_case = 1
let g:unite_enable_smart_case = 1
nnoremap  ,g  :Unite grep:. -buffer-name=search-buffer
nnoremap  ,cg :Unite grep:. -buffer-name=search-buffer
nnoremap  ,r  :UniteResume search-buffer
if executable('ag')
  let g:unite_source_grep_command = 'ag'
  let g:unite_source_grep_default_opts = '--nogroup --nocolor --column'
  let g:unite_source_grep_recursive_opt = ''
endif

vimを開いて,gとたたくとこんな感じで検索パターンを入力できる






結果がuniteで表示される












kernel/bootstrap/array.rb:1:class Array ← Enterでファイルを開く

eachメソッドを見てみる













要素の数だけループして、ブロックに要素の値を渡してる

引数にブロックがないときはなんか返してる

to_enumとは

そんな時はctagsヘ(^o^)ノ

rubiniusのルートディレクトリで
$ ctags -R

さっきのto_enumで<C-]>定義先へ

定義先から戻る場合は<C-o>

( ̄(エ) ̄)彡☆


参考ページ
unite.vimの使い方まとめ
ackを捨てて、より高速なag(The Silver Searcher)に切り替えた

2014年4月28日月曜日

Shinosaka.rb #4を開催しましたヘ(^o^)ノ #shinosakarb

Shinosaka.rb #4を開催しましたーヘ(^o^)ノ


今回はペアプロ!

僕のWiMAXが圏外なので、あきらめていたら...

iceさんがここならつながる!


無事つながりましたw


なのでペア決めスクリプト作った⇒make_pair

意外とペアプロ経験者が少なかったなー

ペアプロは「精神と時の部屋」と冒頭に断言しましたw

どうだったかな?

【お題】
1問目 FizzBuzz
2問目 ボーリングのスコア計算

ボーリングのスコア計算がわからない人がいるのは意外だった...

準備不足でした...(;・∀・)

皆さんのコードはこちら

2次会で数名を朝帰りさせてしまいました。

反省...( TДT)ゴメンヨー

来月も懲りずに開催するので、みなさん参加してくださいねー

でわ( ̄(エ) ̄)彡☆



2014年2月23日日曜日

Shinosaka.rb #2を開催したよーヘ(^o^)ノ

Shinosaka.rb #2を開催したヘ(^o^)ノ


参加費1,500円(゚д゚)!にも関わらず?意識高い皆さんが参加していただきましたー

次回は参加費見直しますw ごめんねー

内容はTDDハンズオン!

スライド

デモでプロ生ちゃんTDDを実践 ⇒ [GitHub]pronama_tdd

RSpecでみなさんと一緒にTDDを実践しました。

ライブコーディングはとっても緊張…(;・∀・)

でも、とても勉強になった。

こういう風に書いた方が良いとか、スペルミスのご指摘などなど

コードレビューの大切さを実感したよ

金井さんのLT
= 準備中 =

@kytiken_codeさんのテストコードをレビュー

Pryこみったーのyui-knkさんのお話。

普段ちょー便利に利用させていただいているPryの便利な使い方を教えていただきましたー

みなさんのこんな便利gemあるよー情報良かった!

知らないものばかり…まだまだですわw

rbenv-gemsetのお話

railsActiveRecordの便利な機能のお話

Autodocテスト結果をドキュメント化してくれるgem

その中でも…

コレ! git-svn

現場はsvn…

でもgitが使いたい!!!って人はこれ

ヤバいw

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

Windowsでも使えるようですね ⇒ http://shinodogg.com/?p=4964

即採用決定ーヘ(^o^)ノ

やっぱり勉強会はいいよー

立ち上げてほんとによかった

次回は3月22日(土)予定です。「初めてのgem(仮)」

是非、参加してくださいねー

参加していただいたみなさん。お疲れ様でしたー( ̄(エ) ̄)彡☆