Skip to content

Instantly share code, notes, and snippets.

@sunaot
sunaot / swap_closure_local_variable.rb
Created October 14, 2014 17:50
Ruby でクロージャのローカル変数を差し替え (たかのように錯覚させる) トリック
def e &blk
s = Struct.new(:a,:b,:c).new(1,2,3)
s.instance_eval(&blk)
end
def foo
e { a + b + c }
end
puts foo #=> 6
@sunaot
sunaot / spec_file.rb
Last active April 26, 2022 05:23
Ruby で Groovy の Spock ぽい spec を書きたいという遊び。assert を書かないと power_assert できないのがかっこ悪い。
class Foo
extend Ruby::Spock
spec 'maximum of two numbers', ->(*) {
expect {
assert { [a, b].max == c }
}
where [
[ :a, :b, :c ],
[ 1, 3, 3 ], #=> .
@sunaot
sunaot / keyword.rb
Last active August 29, 2015 14:10
キーワード引数で引数の委譲や再定義ってどうやるの?って質問したら答えを教えてもらったよ
##
# 知りたかったこと
def foo(a: 1, b: 2, c: 3, d: 4)
p a, b, c, d
end
# 1. bar の引数定義を a~d のキーワード引数として foo へすべて委譲したい
# 2. bar の引数定義を a~d のキーワード引数とさらに e: 5 を追加したい
def bar( ??? )
class Injectee
def hello
puts :hello
end
end
module DI
class Injector
def initialize(module_object)
@module = module_object
@sunaot
sunaot / comment.md
Created January 13, 2015 07:30
shared_example ぇぇぇ

たとえば、subject でこのように書けて、

subject { model.errors }
it { is_expected.to be > 0 }

これを DRY にしたくて

@sunaot
sunaot / designing_class.md
Last active August 16, 2018 04:40
役割を閉じ込めてそれを名前で表現する (レビューコメントから)
  • 入力フォーマット
  • 登録処理の中でのデータモデル
  • 出力フォーマット

が分離していて、それがコード上の構造で表現されているのがよいと思います。 分離すると、どこかで結合しないといけないのでマッピングが発生します。 そこは互いのインターフェイスをどう解釈するかという表現なので明示的になっているほうがよいと思います。


@sunaot
sunaot / learning_oop.md
Last active August 29, 2015 14:14
オブジェクト指向プログラミングの設計について学ぶためのリソースあれこれ

ユニットテストのガイドライン

  • 一つのテストに一つのアサーション (論理的なアサーション)。
    • 一つのテストで確認する意図は一つにすること。
    • アサーションの機能が弱いために、一つのことを確認するためにいくつかの実装上のアサーション (物理的なアサーション) を書かざるをえないケースはありえる。
  • よいユニットテストは一瞬で実行を終えなければならない (そうじゃないとコードの変更のたびに実行するのが面倒になる)。
  • 書くべきテストとは、同値分割と境界値分析を考慮して、モジュールの外面的な振舞いを検証するテストで、エラーを見つけられそうなもの。
    • 「テストとは、エラーを見つけようとしながら、プログラムを実行する過程である。」
    • 「良いテスト・ケースとは、まだ発見されていないエラーを検出する確率の高いものである。」
  • ホワイトボックスでの同値分割と境界値分析によって導かれるすべてのケースを網羅すること、ではないのがポイント。それによって外面的な振舞いに影響を与えるものが基本的な検証すべきケース。
@sunaot
sunaot / git-ignore.md
Last active January 5, 2021 13:36
gitignore の使い方

今後何度も書くことになるだろうから repo へコミットする .gitignore の使い方について書いておく。まあ、ゆるーく使って余分に ignore 書きまくってもいいんですが覚えておくと、はかどります。なお、man に書いているというつっこみを受けた。

以下の方針で運用すると扱いやすくなります。

  • プロジェクトで使う .gitignore ファイルへはプロジェクト固有でバージョン管理から外したいものを書く
    • 例: そのプロジェクトでできる中間成果物、スナップショットで残したいだけでバージョン管理する必要のない成果物 (テスト結果とか) など
  • プロジェクト固有ではなく発生し、バージョン管理から外したいものはグローバルな gitignore ファイルへ書いておく
    • ~/.config/git/ignore
    • 例: OS が勝手につくるファイルやフォルダ、エディタの作るバックアップファイルなど
    • 自分で育てなくてもグローバルな gitignore のための雛形があるので自分が関わるものを追記していけば OK.
@sunaot
sunaot / fixup_patch.rb
Created August 13, 2015 01:00
adhoc patch to ~/.heroku/client/lib/heroku/client/rendezvous.rb
private
def fixup(data)
return nil if ! data
return_data = output.isatty ? data : data.gsub(/\cM/,"")
if return_data.respond_to?(:force_encoding)
return_data.force_encoding('utf-8') if return_data.respond_to?(:force_encoding)
end
if running_on_windows?
begin