小ネタ備忘録です。
環境
rails (5.2.0)
例
下記のクラスをテストしたい場合
class Example def logging Rails.logger.info("hoge") end end
下記のように書く
# 実行前にloggerのinfoに設定される引数を見るようにする expect(Rails.logger).to receive(:info).with("hoge") # テスト対象を実行 Example.new.logging
小ネタ備忘録です。
rails (5.2.0)
下記のクラスをテストしたい場合
class Example def logging Rails.logger.info("hoge") end end
下記のように書く
# 実行前にloggerのinfoに設定される引数を見るようにする expect(Rails.logger).to receive(:info).with("hoge") # テスト対象を実行 Example.new.logging
アーキテクチャ ディスカッション Vol.1に傍聴席サイドで行ってきましたのでそのメモ。
ディスカッション形式だったので、話題ごとにまとめてみました。 今回のねらいとしてはクリーンアーキテクチャの導入事例、成功した話、表に出にくい失敗した話などを語りたい、という回でした。
話のテーマとしてRDBのテーブル設計とデータのモデリングというのをどうしているかという話があった
アプローチに関しては…
などがあがりました。
また、データを分析するときの考え方として…
などのやり方の話もあがりました。
また、これらのベースの力をつけるために図書館アプリを作るという例をあげて「図書館といえば貸し借り」「だが会社としての着目点は『本の資産管理』である」「なのでドメインは『在庫管理』や『資産管理』が着目点になる」という考え方の練習法などが紹介された
nrs(@nrslib)さんによる体験談とそれに対する質問。
クリーンアーキテクチャの右下の図 がデータの流れを表しておりだいたいこの形式に落ち着いた。MVCフレームワークと共存させる場合は非同期処理が不要という観点からPresenterが不要になる。
「Presnterは日付オブジェクトから日付文字列への変換などをする形でテストしやすいものとしにくいものを分けるために必要では?」という話になったらDTO(Data Transfer Object)を用意していたので、今回の事例の場合はその点は不要だった。
手順化すると何も考えずにやってしまう人が多くなってしまうがその点どうしているかという話から布教の話題に。いろいろな体験談があがり…
check style
という静的解析ツールを一枚噛ませることで、依存関係的にご法度なものを防いだり、コードレビューでその点を充填的に見るなどの実践的なアプローチなどなどが上がりました。
Entityを渡す、という設計で組む話が多く、Entityを渡してRipository内で差分をチェックしてRDBに書き込むという作業をしていたがつらい、などの話が出た。Entity Frameworkにおまかせすることで簡易化するという話もあがった。
ケースバイケースだったが、以下のような話があがった。
クリーンアーキテクチャなどを実践していくと、どうしてもドメイン分析が入ってきてコミュニケーションをとっていくことが必要になってくる。
その中でユビキタス言語を整理していくと、どうしても英語だと表現しにくいものが出てくる、そこで無理に英語を使わず、部分的に日本語表現するのも1つの方法論としてはありという意見がでた。
どうやって学ぶべきか、という観点になり…
設計というジャンルに興味を持ったきっかけを三者三様に話があがり…
などなどのバックグラウンドが語られた
クリーンアーキテクチャの本に取り上げられていた「本物の重複・偶然の重複」という部分からDRY原則の話になった。
コンウェイの法則を例にあげ、それらへの立ち向かい方の話に。
また、組織とソフトウェア開発との関わり方の話になり…
温故知新的に振り返る、スライド回顧録のコーナーです。
自走できるかつ頑張る人ほどバス因子になりやすいんですけど、人が少ない間はそれが常だし仕方がないんだけど、人が増えてきたときにそこで積み重ねてきたものを丁寧に分配していったかって話です。
もちろんこのスライドを発表された方自身もすごいのだけれども、それと双璧を成す部分として、できあがった環境がとても良い環境だなって感じていて、バス因子を解いてくれるために協力的な仲間や、バス因子を組織の問題としてどうにかしようという風土があるということ。
だいたいこういうバス因子になるひとってその環境下におけるスタープレーヤー的な部分があるので、バス因子を取り除けど取り除けど新しいものを割り振られがちなんだけど、きっとそれよりも解く速度のほうが早かったんだろうなという感じが(スライドからだと)感じられた。
私の今いる環境は、バス因子をなくして行けるほどここに余裕がないけれども、バス因子をなくしていけるような努力や、姿勢みたいなものはこのスライドからエッセンスとして活かして行きたいなーと思った。
ちなみの同じ人が書かれた、普通のRubylistとしての生活発表(傍からみるとすごくできる人感あるけど)もすごくよかったので併せて読むとよりエモい。
風邪で寝込んでたため一回休みです。
体調悪めなので雑記 + 用語備忘録的な話です。
個人的に昔からインフラ構築とは遠い場所で仕事することが多くて、抱くイメージとして
みたいのが5、6年前に抱いていたインフラ屋さんのイメージでした。
しかしながら近年のクラウド化やInfrastructure as Codeの世界観が浸透してきたのと、より自分がインフラ寄りの仕事をせねならぬことになり、現状確認をしたら、だいぶイメージと違っていました。
その中でも一番感銘を覚えた言葉が「式年遷宮」でした。
例えば、1つのシステムを ロードバランサ、スイッチ、サーバ、ミドルウェア、ログ集約サーバなど 完全に冗長化しておき、1週間毎に冗長化されたシステム、A、Bをそれぞれ入れ替える。
- 式年遷宮Infrastracture · さよならインターネット より
秘伝のタレ化しそうなインフラもコードにより安易に複製可能になったのでそれを交互に入れ替えて検証するなんてこともできる、そんな時代になったんだなと思いました。
あとそれに加えて、なにかで耳にした「ディスポーザブル長屋」って概念も素敵だなって思いました。
そういえば、帰り際に興味深い体験がありました。 新幹線までの時間、鴨川で遊んでいると、川沿いにある長屋が目に飛び込んできて 長屋、火事になると隣家が燃えて大変になる。そこで編み出されたのが 長屋を壊しやすくして、火事になればすぐに取り壊して建て替えるシステムだったな。 はて、これはもしやImmutable Infrastructureではないのか。 不要になったものを取り壊し、新しくつくりなおす。 まさにImmutable Infrastructureでした。 我々日本人は、ちょんまげの頃に既に Immutable Infrastructureの概念を取り入れていたのです。
-Monitoring Casual Talk in Kyoto 行ってきた #monitoringcasual · さよならインターネット より
Terraformなんかがあるとココらへん容易に可能で、「やべぇこの構成おかしいからぶっ壊して作りなおそう」ってのが結構簡単に差し替えられるんですよね。昔は構築するのが大変だったものがサクッと作れるからできるワザ。
現実世界の感覚を、システムにコンバートすると良い発見があるという一例がここには詰まっているなと思いました。
※インフラ避難訓練の話も学びが多かったのでまた別の機会に書く。
両方使うことで、面白い使い方ができるんだなというメモ
$ ruby -v ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-darwin16]
*引数名
で引数を好きな個数指定でき、配列に格納できる
def optional_args(*args) p args end
上のメソッドを実行すると以下のような結果になる。(出力結果はコメント表記)
optional_args("30") # ["30"] optional_args("20","30") # ["20", "30"] optional_args("20","30",:hoge) # ["20", "30", :hoge]
**引数名
で引数がキーワード引数の形式で選択された場合、キーワード名をシンボルとしたハッシュで格納される
def keyword_args(**keywords) p keywords end
上のメソッドを実行すると以下のような結果になる。(出力結果はコメント表記)
keyword_args(first_sym:1) # {:first_sym=>1} keyword_args(second_sym:"2", first_sym:1) # {:second_sym=>"2", :first_sym=>1} keyword_args(second_sym: :second, first_sym:1) # {:second_sym=>:second, :first_sym=>1}
下記のように指定すると、どっちでも対応のような記述ができる
def double_args(*args,**keywords) p args p keywords end
# キーワード引数でかけば、**keywordsの方に値が入る double_args(one_sym:1) # [] # {:one_sym=>1} # 普通の引数でかけば、**argssの方に値が入る double_args("30") # ["30"] # {}
もちろん順番通り入れれば両方の値がはいる
# 普通の引数、キーワード引数というdefの設定通り入れればちゃんと入る double_args("30",first_sym:1) # ["30"] # {:first_sym=>1} # 逆にすると当たり前だけど引数の順が違うのでエラー double_args(first_sym:1,"30") # syntax error, unexpected ')', expecting => # double_args(first_sym:1,"30")
2回実行した時…みたいので subjectを2回実行すればいいやん!
みたいに思うがそうは問屋が…的な。原理までは調べてないが挙動としてはこうなんだよメモ
$ bundle exec rspec --version RSpec 3.7 - rspec-core 3.7.1 - rspec-expectations 3.7.0 - rspec-mocks 3.7.0 - rspec-rails 3.7.2 - rspec-support 3.7.1
下記のようなクラスで
class Calculate def initialize @value = 0 end def add_and_print @value += 1 end end
下記のようなrspecを用意した場合
describe ".add_and_print" do let(:obj) { Calculate.new } subject { obj.add_and_print } context "2回実行した場合" do it "1回目は1,2回目は2" do expect(subject).to eq(1) expect(subject).to eq(2) end end end
下記のように失敗する。
Failures: 1) .add_and_print 2回実行した場合 1回目は1,2回目は2 Failure/Error: expect(subject).to eq(2) expected: 2 got: 1 (compared using ==)
なので意図通りにやりたいときは直実行するのみ
describe ".add_and_print" do let(:obj) { Calculate.new } context "2回実行した場合" do it "1回目は1,2回目は2" do expect(obj.add_and_print).to eq(1) expect(obj.add_and_print).to eq(2) end end end