モノラルログ

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

PHP でシステムのコマンドを実行する関数の種類を調べた

PHP でサーバのコマンドを実行する関数ってどれくらい種類があるのか、調べる機会があったので、そのメモです

system()exec() が有名かと思いますが、結構種類が多かった……!

  • exec
  • passthru
  • pcntl_exec
  • popen
  • proc_open
  • shell_exec
  • system
  • 実行演算子

しかし多いな…… とりあえず8種類か。

参考にしたのは PHPのドキュメントのこちら。

www.php.net

実行演算子は関数ではなくて、 ``` で囲んだ文字列を実行できるというもの。強そう (危険そう)

<?php
$output = `ls -al`;
echo "<pre>$output</pre>";

www.php.net

また、pcntl_exec と実行演算子は、前述のドキュメント「システムプログラムの実行」一覧には載っていません。この 8種類というのも自分調べなので、まだ実行させる関数は他にもあるのかもしれない。わからない。

たとえばセキュリティ、OSコマンドインジェクションの調査をするとかなら、可能性としてはここらの関数をひととおりチェックする必要があるということかな。

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

リモートでの意思決定/合意の工夫として 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