「npm install」で「npm ERR! code EMISSINGARG」になった

「npm install」で「npm ERR! code EMISSINGARG」になったのでメモ。

/usr/bin/npm install を実行するとエラーになりました。

% /usr/bin/npm install
npm ERR! Linux 3.10.0-327.36.2.el7.x86_64
npm ERR! argv "/usr/bin/node" "/usr/bin/npm" "install"
npm ERR! node v6.7.0
npm ERR! npm  v3.10.3
npm ERR! code EMISSINGARG

エラーの状況は「なぜか上がらないnpmのバージョン – Qiita」と同じで、npmのバージョンが古いことが原因のようです。

サーバーはCentOS7を使っていますが、「CentOS 7 でepelリポジトリのnpmでアップデートを行うとnpmが消されてしまう問題の回避方法によると、CentOS7のリポジトリからnpmがなくなったようです。

npmを更新したいのですが(そもそもサーバーを更新したいのですが)、dockerを入れたほうが任意のバージョンのnode.jsを使えて良いかもしれません。

% docker run -it --rm --name "node18" -v "$PWD":/usr/src/app -w /usr/src/app node:18 npm install

pod installを実行すると「Your project does not explicitly specify the CocoaPods master specs repo.」

pod installを実行すると以下のメッセージが表示されました。

[!] Your project does not explicitly specify the CocoaPods master specs repo. Since CDN is now used as the default, you may safely remove it from your repos directory via pod repo remove master. To suppress this warning please add warn_for_unused_master_specs_repo => false to your Podfile.

Google翻訳で日本語に翻訳します。

あなたのプロジェクトは、CocoaPods マスター スペック リポジトリを明示的に指定していません。 CDN がデフォルトとして使用されるようになったため、「pod repo remove master」を使用してリポジトリ ディレクトリから CDN を安全に削除できます。 この警告を抑制するには、warn_for_unused_master_specs_repo => false を Podfile に追加してください。

メッセージに書かれているコマンドを実行して、masterリポジトリを削除します。

% pod repo remove master
[!] repo master does not exist

masterリポジトリがありませんでした。

リポジトリを確認します。

% pod repo list

cocoapods
- Type: git (remotes/origin/master)
- URL:  https://github.com/CocoaPods/Specs.git
- Path: /Users/yamamoto/.cocoapods/repos/cocoapods

trunk
- Type: CDN
- URL:  https://cdn.cocoapods.org/

どうやらcocoapodsがmasterリポジトリのようです。

cocoapodsリポジトリを削除します。

% pod repo remove cocoapods
Removing spec repo `cocoapods`

リポジトリの削除に成功しました。

pod installを実行すると、先程のメッセージは表示されなくなりました。

coreMLの「Could not create inference context」エラーの対策

Appleシリコン(M1)を搭載したMacのiOSシミュレータでcoreMLを実行すると「Could not create inference context」エラーになった。

do {
    try handler.perform([request])
} catch {
    print(error) //=> Could not create inference context
    fatalError("画像分類に失敗しました")
}

iOSシミュレータはNeuralEngineをサポートしていないため、エラーが発生している。

iOSシミュレータで実行するには、「request.usesCPUOnly = true」を追加する。

do {
    request.usesCPUOnly = true // <=追加
    try handler.perform([request])
} catch {
    print(error)
    fatalError("画像分類に失敗しました")
}

これでAppleシリコン(M1)を搭載したMacのiOSシミュレータでも動作する。

LaravelのUnitTestでArtisan::queue()をテストする方法

問題

LaravelでArtisan::queue()が呼ばることをテストしたい。

環境

  • Laravel 6

対策

Queue::fake()メソッドを使用し、ジョブをテストできるようにする。

use Illuminate\Support\Facades\Queue;

Queue::fake();

Queue::assertPushed()メソッドを使用して、ジョブが正しくキューに入っているかどうかを検証する。

ソースコードを調べたところ、キューに登録されるクラスはQueuedCommandクラスのようなので、ジョブにQueuedCommandクラスが登録されているか検証する。

use Illuminate\Foundation\Console\QueuedCommand;

Queue::assertPushed(QueuedCommand::class);

サンプルコード

テストするコントローラクラス

class ImportController extends Controller
{
    public function import(): RedirectResponse
    {
        Artisan::queue('import');
        return back();
    }
}

テストコード

class ImportTest extends TestCase
{
    public function testImport()
    {
        Queue::fake();
        Queue::assertNothingPushed();

        $this->post(route('import'));

        Queue::assertPushed(QueuedCommand::class);
    }
}