モノラルログ

マツオ ( @matsuoshi / monaural.net ) のざっくりしたブログです

module.exports されていない関数を rewire でテストする

JavaScript + jest で古いコード、module.exports されていない関数をテストしたかったのですが、rewire というのを使えば可能でした、というメモ

たとえばこんなコード

function privateSum(a, b) {
  return a + b
}

とだけ書かれたファイルがあるとします。この後に

module.exports = privateSum

ってされていれば、テストコードから import すればいいだけなんですが、export されていないので外部から privateSum関数にはアクセスできません

rewire

ここで rewire というライブラリをかませます

github.com

rewire, かなり昔からあるライブラリっぽい。これを使って、こんな風にテストを書くことができます。

const rewire = require('rewire')
const myModule = rewire('../src/private')

test('exported function', () => {
  const sum = myModule.__get__('privateSum')
  expect(sum(1, 2)).toBe(3)
})

まず rewire を requireし、その rewire を使って対象のソースコードを読み込みます。

そんで

  const sum = myModule.__get__('privateSum')

この __get()__ というメソッドで、export されていない関数を参照できるようになるという具合。あとは普通に呼び出してテスト可能。

べんり。

モック化にも使える

__set()__ というメソッドもあり、対象の関数や変数を差し替えることも可能でした。なのでテスト時のモック化なんかにも使える。

べんり。


サンプルこちら

github.com

PhpStorm のフォルダ単位の diff ビューアーを、コマンドラインから起動

PhpStrom の、フォルダ単位の差分表示機能

見やすくて助かってるんですが、この画面って CLI から起動できるんですね、しらんかった

pstrom diff <path_1> <path_2>

でいけるっぽい

f:id:matsuoshi:20210514103611p:plain

参考こちら

pleiades.io

リモートでの意思決定/合意の工夫として miro を使ってみた

合意の段階

書籍「アジャイルコーチング」の「合意を形成する」の章で出てくる「合意の段階」

なにか意思決定をする場面において、賛成や反対は、1か10かに分かれるとは限りません。だいたい途中に段階があるものです。「条件つきで賛成」とか、「やや反対」とか、「絶対反対」とか。

f:id:matsuoshi:20210414133649p:plain

それを見えるようにするものとして、この本では「合意の段階」というものが紹介されています。この図のように賛成〜反対を 5段階に分けて、自分の考えがどこらへんに当たるか、各自にチェックを入れてもらうような方法。

他にも「拳から5本指 (5 fingers)」という、0〜5本の指をみんなで出して意思を示す方法とか、Lean Coffee などで使われるサムズアップ/ダウン 👍 👎 の方法とか。せーの、で同時に親指を出してもらったりする感じですね。

全員同席でやるなら、このへんのやり方はお手軽です。

リモートでこれをやる

リモートの場合はどうしよう。特にカメラ ONを強制していない場合。

カメラOFF の状態でも、こんな感じの意思決定方法を試したいなということで、miro でひと工夫してみました。

f:id:matsuoshi:20210414134442p:plain

まあ、miro 使ったことある方なら ↑ で一目瞭然だと思うのですが、miro って全員のカーソルが表示されるじゃないですか。

それを使って、「せーの」でカーソルで指し示してもらう方法です。

めちゃシンプルですし、みんなのカーソルが一斉に動くさまは、意外と楽しいですよ。

f:id:matsuoshi:20210414134650p:plain

サムズアップ 👍 サムズダウン 👎 もこんな感じで。

PHP の array_column() という便利関数を今さら知った

PHP 5.5 から入ってた array_column という関数を知らなかった。便利やん。今月知った。

いうなれば、laravel collection や underscore.js の pluck に相当するやつ。PHP標準で入ってたんですね……

www.php.net

array_column の使い方

このような二次元の連想配列があったとき

<?php
$records = [
    [
        'id' => 2135,
        'first_name' => 'John',
        'last_name' => 'Doe',
    ],
    [
        'id' => 3245,
        'first_name' => 'Sally',
        'last_name' => 'Smith',
    ],
    [
        'id' => 5342,
        'first_name' => 'Jane',
        'last_name' => 'Jones',
    ],
    [
        'id' => 5623,
        'first_name' => 'Peter',
        'last_name' => 'Doe',
    ]
];

array_column() を使い、第2引数にほしいキーを渡すと、こんな感じ

渡したキーの値だけを抜き出し、配列として返してくれる

$first_names = array_column($records, 'first_name');
print_r($first_names);

Array
(
    [0] => John
    [1] => Sally
    [2] => Jane
    [3] => Peter
)

第3引数もある

第3引数にもキーを渡せまして、その場合、第3引数のフィールドをキーにした連想配列として返してくれる

$first_names = array_column($records, 'first_name', 'id');
print_r($first_names);

Array
(
    [2135] => John
    [3245] => Sally
    [5342] => Jane
    [5623] => Peter
)

これはよく使いそう。

別の使い方

第2引数を null にして第3引数を渡すと、第3引数をキーにした連想配列として、全体を返してくれる

$sorted = array_column($records, null, 'id');
print_r($sorted);

Array
(
    [2135] => Array
        (
            [id] => 2135
            [first_name] => John
            [last_name] => Doe
        )

    [3245] => Array
        (
            [id] => 3245
            [first_name] => Sally
            [last_name] => Smith
        )
    // 以下略

これもよく使うケースだな〜

オブジェクトにも使える

PHP公式マニュアルによると

オブジェクトの配列を指定した場合は、public プロパティはそのまま取得できます。 protected や private なプロパティを取得したい場合は、そのクラスがマジックメソッド get() および isset() を実装している必要があります。

とのことで、連想配列だけでなくオブジェクトにも使える。(PHP 7.0以降)

知らんかった

symfony とか使ってて pluck ないのかな〜 とか調べてたんだけど、なんてことはない PHP 標準にあったのであった。知らんかった。

関連

underscorejs.org

readouble.com

Karabiner で、英数キーを Cmd キーに置き換えてしまったが大丈夫

また Karabiner でのキーボード設定メモ。

cmd キーを押すつもりが、間違って英数を押しちゃった!

というのをなくしたい

ええい、いっそ英数キーを cmd キーにしてしまえ!

でもやっぱり英数キーも使うので、

  • 英数キー押しながら、なにかのキーを押す → cmd キー扱い
  • 英数キーを単体で押す → 英数キー扱い

にします。しました。これなら大丈夫。

Karabiner-Elements ならね。

ということで Karabiner用のコードはこちら

ところで、いつ英数キーを使ってるか?

という話ですが、私の場合は、

IMEをオンのまま、アルファベットを打ち始めてしまったとき」

ですね。

打ってる途中に「日本語オンのままにしてた!」と気づいても、英数キーを2回連打したらアルファベットに戻してくれます。英数キー役にたってる。