コード日進月歩

しんくうの技術的な小話、メモ、つれづれ、など

五十六(いそろく)メソッドを自分なりにまとめる

山本五十六の名言、と語られるけどもこの呼称だと無いなと思いさらっとまとめてみる

五十六メソッドとは

山本五十六の名言

やってみせ 言って聞かせて させてみて ほめてやらねば 人は動かじ

に由来し、ものごとを教える際は

  • まずは教える側が実演する
  • その後に手法、やり方を教える
  • 教えたら実際にやらせてみる
  • 上手く行ったら褒める

というステップを踏むと良い、という教え

システム開発において

ペアプロなどはまさにこの典型であり、自身がやり、そのあと具体に手法を解説し、バトンタッチするというかたちなのでまさにこの形にあたる。

言葉の由来

この格言、何かの書籍にあったわけではなく、山本五十六の手紙などでよく頻出する言葉だったらしくもともと五十六自身が上杉鷹山の「してみせて 言って聞かせて させてみる」という格言から影響を受けているとのこと。

関連リンク

MacでもWindows同様にすぐにスクリーンロックするショートカットキーがある

意外と知られていないし、カフェとかで仕事する人は覚えて置くと良いと思う。

やり方

Mac のキーボードショートカット - Apple サポート より

Command + Option + 電源ボタン

(余談)Windowsの場合

Windows のキーボード ショートカット - Windows Help より

Windowsキー + L

参考リンク

Webmockでform送信されるリクエストをモックする

割と考えればわかりそうなことだが、ピンと来なかったのでメモとして書く

環境

webmock (3.5.1)

やり方

WebMockのwithに以下の記述を書き足す

headers: { "Content-Type": "application/x-www-form-urlencoded" }

user_idの100がformでPOSTでされたときに名前がJSONで返却される形のモック

stub_request(:post, "https://example.com").with(
    body: {
        "user_id" => 100,
    },
    headers: {"Content-Type": "application/x-www-form-urlencoded"},
).to_return(
    status: 200,
    body: {
        "name": "TARO",
    }.to_json,
    headers: {},
)

参考リンク

CircleCI上のマシンで環境変数を扱う場合はContextsを使うと便利

デプロイのCircleCIを使っているなどの場合、結構あると便利なのでメモ

環境

version: 2

Contextとは

日本語テキストがあるので抜粋すると

コンテキストは、環境変数を保護し、プロジェクト間で共有するためのメカニズムを提供します。 環境変数は、名前・値のペアとして定義され、実行時に挿入されます。 - コンテキストの使用 - CircleCI

という機能

使い方

環境変数の設定

CircleCI上のUIから設定をする。 場所は Settings ページの ORGANIZATIONContexts

f:id:shinkufencer:20190707170603p:plain
ORIGANIZATIONなのでPROJECTではない点に注意

Create Context ボタンを押すとContextの名前の入力を求められるので入力して作成

f:id:shinkufencer:20190707170648p:plain
この名前をyamlに設定するので英語推奨

作成したContextのページに行くと環境変数を追加できるので追加する。

f:id:shinkufencer:20190707170726p:plain
リンクができるので詳細ページへ

f:id:shinkufencer:20190707170753p:plain
ここから環境変数を追加する

f:id:shinkufencer:20190707170819p:plain
環境変数名と値を設定する。値はマスクがかかるので打ち間違えに注意

config.yml上の書き方

利用したいworkflowにcontextを使用する

workflows:
  test-workflow:
    jobs:
      - test:
        context: SAMPLE

利用シーン

主にはworkflowごとに必要な環境変数が変わる場合で活躍して

  • ステージング/本番でデプロイ作業を分けている場合
  • テストコード実行時のみ必要な変数がある場合

などのシーンで便利

参考リンク

RSpec3の配列系マッチャを利用シーン別に逆引き表を作ってみた

RSpec3から結構選択肢があるようなので一覧表にしてみる

環境

$ ruby -v
ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-darwin18]
$ bundle exec rspec -v
RSpec 3.8
  - rspec-core 3.8.0
  - rspec-expectations 3.8.2
  - rspec-mocks 3.8.0
  - rspec-rails 3.8.1
  - rspec-support 3.8.0

逆引き利用表

利用用途 使うマッチャ
配列の内容が順番含め一致するか eq , match
期待する値が配列に含まれているか include
順番は気にしないが、配列の中身が同じか match_array
指定する要素が配列にすべて含まれているか contain_exactly
異なるマッチャを使って検証したいか match

記述例

RSpec.describe "array_match_sample" do

  let(:demo_array) {[1, "example", variable]}
  let(:variable) {:symbols}
  
  it "eqで内容が==でtrueを返す状態であるかを確認する" do
    expect(demo_array).to eq([1, "example", variable])
  end
  
  it "matchで同一なものかを確認する" do
    expect(demo_array).to match([1, "example", variable])
  end

  it "includeで配列に含まれているかを検証する" do
    expect(demo_array).to include("example")
    expect(demo_array).not_to include("example2")
  end

  it "match_arrayで順番は気にせず同一の配列かを検証する" do
    expect(demo_array).to match_array(["example", 1, :symbols])
    expect(demo_array).not_to match_array(["example", 1, :symbols, "huge"])
  end

  it "contain_exactlyで指定した値がすべて含まれるかを検証する" do
    expect(demo_array).to contain_exactly("example", :symbols, 1)
    expect(demo_array).not_to contain_exactly("example", :symbols)
  end

  it "matchとコンポーザブルマッチャを使って型を検証する" do
    expect(demo_array).to match([be_kind_of(Integer), be_kind_of(String), be_kind_of(Symbol)])
  end
  
end

参考リンク

Rubyで初期値設定を行うときは || を使って nil 判定をする自己代入式を使うと便利

x ||= 10 みたいな形でORの仕組みを使って初回だけ値を入れるやり方を考える

環境

$ ruby -v
ruby 2.3.7p456 (2018-03-28 revision 63024) [universal.x86_64-darwin18]

考え方

たとえば、インスタンス変数に 「すでに a に 値が入っていれば値をそのまま使い、なければ初期値として 20 入れる」という場合以下のような書き方をする

a || ( a = 20 )

これは a に値が入っていれば || の左の式で true となるので 右の式の ( a = 20 ) は実行されないが、 anil なら右の式が実行されるというもの。

なお上の式は自己代入( a += 1 のような書き方 ) をすると下記のように書ける

a ||= 20

参考リンク

RailsのActiveSupport::TimeWithZoneシリーズの利用シーンと対応メソッドをざっくりまとめる

Railsで現在時間を扱うときは設定したタイムゾーンを意識してほしいので Time.zone.now を使う、というのは割と染みて覚えるが他のケースを忘れがちなので一覧的に書いてみる

環境

$ bin/rails -v
Rails 5.2.2

逆引き利用シーン

利用シーン メソッド
現在時間が欲しい now Time.zone.now
整数値で指定したい local Time.zone.local(2019,6,25,21,30,55)
文字列から分解したい parse Time.zone.parse("2018/1/10 10:00:00"
UNIX TIMEから変換したい at Time.zone.at(1560363121)
ただのTimeやDateのオブジェクトから変換したい in_time_zone Date.new(2010,1,10).in_time_zone

参考リンク