20210608のNode.jsに関する記事は10件です。

Jest + Property based Testing

はじめに 今読み進めている「関数型プログラミングの基礎 JavaScriptを使って学ぶ」の中で紹介されていた Property based testing に興味がわいたのでJavaScript環境で試した話です。 なお、Property based testing とはなんぞや という話については、本稿では詳しく触れません。そちらを知りたい方は、諸先輩方が投稿しているQiita記事などで調べて見てください。 環境 Node.js : v14.17.0 https://nodejs.org/ja/ npm : v6.14.13 jest : v27.0.1 https://jestjs.io/ja/ Facebook のオープンソース フルスタックテスティングフレームワーク fast-check : v2.14.0 https://dubzzz.github.io/fast-check.github.com/ Property based testing のフレームワーク jest-fast-check : v1.0.2 https://github.com/dubzzz/jest-fast-check jest と fast-check の統合用ライブラリ(記述を簡素化できるだけで必須ではない) 準備 作業ディレクトリを用意 (Node.js はインストール済みの前提です。) $ mkdir property-based-testing $ cd property-based-testing $ npm init --yes ライブラリをインストール $ npm install --save-dev jest fast-check jest-fast-check テスティングフレームワークの使用準備 編集前 package.json { "name": "property-based-testing", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [], "author": "", "license": "ISC", "devDependencies": { "fast-check": "^2.15.0", "jest": "^27.0.3", "jest-fast-check": "^1.0.2" } } "scripts" の "test" を以下のように書き換える package.json抜粋 "scripts": { "test": "jest" }, 実践 題材 「関数型プログラミングの基礎 JavaScriptを使って学ぶ」 でも使われている 後者関数 を使って以下の3つのケースに分けて各テスティングフレームワークを使って行きます。 jest のみを使用 jest + fast-check を使用 jest + fast-check + jest-fast-check を使用 テスト対象 const succ = (x) => { return x + 1; }; テスト内容 上記関数において succ(0) + succ(x) = succ(succ(x)) という命題をProperty based testingを使って確認する 共通部分 3つのケースで共通となるテスト対象の関数を作成します。 $ mkdir src $ touch src/app.js src/app.js const succ = (x) => { return x + 1; }; module.exports = { succ, }; jest のみ使用 テストコードを追加します $ mkdir test $ touch test/app-jest.test.js test/app-jest.test.js const { succ } = require('../src/app'); const iterate = (init) => { return (step) => { return [init, (_) => { return iterate(step(init))(step); }]; }; }; /* 無限の整数列を生成する */ const enumFrom = (n) => { return iterate(n)(succ); }; /* ストリームのmap関数 */ const map = (transform) => { return (aStream) => { console.log(aStream); const head = aStream[0]; return [transform(head), (_) => { return map(transform)(aStream[1]()); }]; }; }; /* ストリームの先頭から引数n分だけ取り出す */ const take = (n) => { return (aStream) => { if (n === 0) { return null; } else { return [aStream[0], (_) => { return take(n-1)(aStream[1]()); }]; } }; }; /* ストリームの全ての要素がtrueであるか判定する */ const all = (aStream) => { const allHelper = (aStream, accumulator) => { const head = aStream[0]; const newAccumulator = accumulator && head; if (aStream[1]() === null) { return newAccumulator; } else { return allHelper(aStream[1](), newAccumulator); } }; return allHelper(aStream, true); }; /* 検証の対象となる命題 */ const proposition = (n) => { return succ(0) + succ(n) === succ(succ(n)); }; /* 100個の整数について命題が正しいか */ test( 'should succ(0) + succ(x) = succ(succ(x))', () => { expect( all( take(100)( map(proposition)(enumFrom(0)) ) ) ).toBe(true); } ); テストの実行は以下のコマンドで行います $ npm test 実行結果 上記のコードでは、1から100の100個の整数で命題が正しいかチェックしています このようにProperty based testingはフレームワークを使用しないでも実現することができます ただし、整数をランダムに生成したり、事前条件などを追加したりしようとすると柔軟性にかけます つまり、検証用のテストデータ生成部分の柔軟性に難がある(手間がかかる)ということです jest + fast-check を使用 では、Property based testingのフレームワークを使用した場合にどうなるかみてみます なお、fast-check の詳細は公式を確認してみてください $ touch test/app-fast-check.test.js test/app-fast-check.test.js const { succ } = require('../src/app'); const fc = require('fast-check'); test( 'should succ(0) + succ(x) = succ(succ(x))', () => fc.assert( fc.property( fc.integer({ min:1 }), (x) => { // console.log(x); expect(succ(0) + succ(x)).toBe(succ(succ(x))); } ) ) ); fast-checkの各関数の詳細については、公式およびGithubを参照してください 上記コードではfc.integer()が検証用のテストデータを生成している部分になります コメントアウトしてる部分を有効にすると、1以上のランダムな整数がテストデータとして使われていることが確認できます jest + fast-check + jest-fast-check を使用 fast-check を使うことにより、テストデータの生成がとてもシンプルに記述することができました ただ、fast-check のみ使用した場合だと、fc.assert()やfc.property()など、fast-check独自の記法が必要となり、jestとの記述の差異が生まれます この差異を埋めるのがjest-fast-checkです jest-fast-checkの詳細はGithubを参照してください jest-fast-checkを使ったコードが以下になります $ touch test/app-jest-fast-check.test.js test/app-jest-fast-check.test.js const { succ } = require('../src/app'); const { testProp, fc } = require('jest-fast-check'); testProp( 'should succ(0) + succ(x) = succ(succ(x))', fc.integer({ min:1 }), (x) => { expect(succ(0) + succ(x)).toBe(succ(succ(x))); } ); jest-fast-checkのソースコードを読むとわかりますが、 testProp()がfc.assert()とfc.property()をtest()内で実行するようなラッパーになっています testProp()を使うと記述量を抑え、よりjestの記法に近い形でProperty based testingのコードを記述できます 参考記事 今回Property based testingを学習する際にこちらの記事を参考にさせていただきました Property based testing を試してみよう
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Node.js 周りの用語整理

普段Node.jsを利用しないため、用語をすぐに忘れるので整理しておく。 ツール Node.jsの管理には2つ(?)のツールがある Node.js自身のバージョンを管理するツール Node.jsのパッケージを管理するツール Node.js自身のバージョンを管理するツール nvm Mac以外はこっちが良さそう nodebrew Macならこっちかな? homebrewがMacにはあるので、名前からしてMacっぽい n シンプルらしいが、「n」だけだと検索してもあまりヒットしないのがデメリット Node.jsのパッケージを管理するツール npm 他にもあるかもしれないけど、これが一番有名かな
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

serverless-frameworkのLayerをローカルで使いたい。

困ったこと serverless-frameworkでLayerを使っていて、 デプロイした後に、AWS Lambdaコンソールで実行すると、動くのに、 ローカルで実行すると動かない問題があった。 解決方法 --dockerオプションを指定することで、解決しました。 裏でDocker-lambdaが起動するみたいです。 Docker-lambda https://github.com/lambci/docker-lambda 手順 最終的な構成はリポジトリ公開しています。 分かりやすいように、node_modulesまでコミットしています。 https://github.com/goda-kazuki/serverless-framework-sample npmの初期化 npm init serverlessのインストール npm install --save-dev serverless プロジェクト作成 npx sls create --template aws-nodejs --name sample --path sample 作成したプロジェクトに移動 cd sample ローカルで実行 npx sls invoke local -f hello レイヤーを追加する mkdir layer mkdir layer/nodejs momentを追加 npm init npm install moment handler.jsにmomentを使うように指定 以下を追加 require('moment') 実行(失敗する) npx sls invoke local -f hello serverless.ymlに以下を追加 functions: hello: handler: handler.hello layers: - { Ref: SampleLambdaLayer } layers: Sample: path: layer description: my sample layer compatibleRuntimes: - nodejs12.x 実行(失敗する) npx sls invoke local -f hello --dockerオプションを追加して実行(成功する) npx sls invoke local -f hello --docker その他 Githubで質問したところ、丁寧に回答いただけました。(感謝) https://github.com/serverless/serverless/issues/9535
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

nodeのバージョンをダウングレードする(さげる)

Node.js のバージョンを変更したい Node.js 14.17.0 を導入したものの、 Node.js 10.x にダウングレードする必要が生じました。 14.17.0 をアンインストールしてから 10.x をインストールしようと思いましたが、 Node.jsのバージョン管理ツールに相当する n コマンドを使うと簡単にバージョンを変更できるとわかりました。 https://www.npmjs.com/package/n 念の為、リリース一覧よりダウングレードするバージョン番号を確認します。 10.12.0にダウングレードすることにします。 https://nodejs.org/ja/download/releases/ 環境 macOS Big Sur 11.4 ダウングレード手順 root ユーザーに切り替えます。suコマンドを実行し、パスワードを入力します。 $ su n をインストールします。 sh-3.2# npm install -g n /usr/local/bin/n -> /usr/local/lib/node_modules/n/bin/n + n@7.3.0 added 1 package from 2 contributors in 0.343s nがインストールされました。 現在導入されている node のバージョンを確認しておきます。 sh-3.2# node -v v14.17.0 ダウングレード先のバージョンを引数に n を実行します。 sh-3.2# n 10.12.0 installing : node-v10.12.0 mkdir : /usr/local/n/versions/node/10.12.0 fetch : https://nodejs.org/dist/v10.12.0/node-v10.12.0-darwin-x64.tar.xz installed : v10.12.0 (with npm 6.4.1) ダウグレード後のバージョンを確認します。 sh-3.2# node -v v10.12.0 以上で終了です。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

n を使って Node.jsのバージョンをダウングレードする(変更したい)

Node.js のアンインストール Node.js 14.17.0 を導入したものの、 Node.js 10.x にダウングレードする必要が生じました。 ダウングレードの実施方法はいろいろありますが、今回は n を利用してダウングレードを実施したため、その作業ログを残します。 n コマンドの詳細はこちら。 https://www.npmjs.com/package/n 念の為、リリース一覧よりダウングレードするバージョン番号を確認します。 10.12.0にダウングレードすることにします。 https://nodejs.org/ja/download/releases/ 環境 macOS Big Sur 11.4 ダウングレード手順 root ユーザーに切り替えます。suコマンドを実行し、パスワードを入力します。 $ su n をインストールします。 sh-3.2# npm install -g n /usr/local/bin/n -> /usr/local/lib/node_modules/n/bin/n + n@7.3.0 added 1 package from 2 contributors in 0.343s n がインストールされました。 現在導入されている node のバージョンを確認しておきます。 sh-3.2# node -v v14.17.0 ダウングレード先のバージョンを引数に設定し、 n を実行します。 sh-3.2# n 10.12.0 installing : node-v10.12.0 mkdir : /usr/local/n/versions/node/10.12.0 fetch : https://nodejs.org/dist/v10.12.0/node-v10.12.0-darwin-x64.tar.xz installed : v10.12.0 (with npm 6.4.1) ダウグレード後のバージョンを確認します。 sh-3.2# node -v v10.12.0 以上です。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

n を使って Node.jsのバージョンをダウングレードする(macOS)

Node.js のアンインストール Node.js 14.17.0 を導入したものの、 Node.js 10.x にダウングレードする必要が生じました。 ダウングレードの実施方法はいろいろありますが、今回は n を利用してダウングレードを実施したため、その作業ログを残します。 n コマンドの詳細はこちら。 https://www.npmjs.com/package/n 環境 macOS Big Sur 11.4 ダウングレード手順 root ユーザーに切り替えます。suコマンドを実行し、パスワードを入力します。 $ su n をインストールします。 sh-3.2# npm install -g n /usr/local/bin/n -> /usr/local/lib/node_modules/n/bin/n + n@7.3.0 added 1 package from 2 contributors in 0.343s n がインストールされました。 現在導入されている node のバージョンを確認しておきます。 sh-3.2# node -v v14.17.0 ダウングレード先のバージョンを引数に設定し、 n を実行します。 念の為、リリース一覧よりダウングレードするバージョン番号を確認します。 10.12.0にダウングレードすることにします。 https://nodejs.org/ja/download/releases/ sh-3.2# n 10.12.0 installing : node-v10.12.0 mkdir : /usr/local/n/versions/node/10.12.0 fetch : https://nodejs.org/dist/v10.12.0/node-v10.12.0-darwin-x64.tar.xz installed : v10.12.0 (with npm 6.4.1) ダウグレード後のバージョンを確認します。10.12.0 にダウングレードできました。 sh-3.2# node -v v10.12.0 以上です。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Node.jsのバージョンをダウングレードする(変更したい)

Node.js のアンインストール Node.js 14.17.0 を導入したものの、 Node.js 10.x にダウングレードする必要が生じました。 14.17.0 をアンインストールの方法を調べていたら、Node.jsのバージョン管理ツールに相当する n コマンドを使うと簡単にバージョンを変更できるとわかりました。 https://www.npmjs.com/package/n 念の為、リリース一覧よりダウングレードするバージョン番号を確認します。 10.12.0にダウングレードすることにします。 https://nodejs.org/ja/download/releases/ 環境 macOS Big Sur 11.4 ダウングレード手順 root ユーザーに切り替えます。suコマンドを実行し、パスワードを入力します。 $ su n をインストールします。 sh-3.2# npm install -g n /usr/local/bin/n -> /usr/local/lib/node_modules/n/bin/n + n@7.3.0 added 1 package from 2 contributors in 0.343s n がインストールされました。 現在導入されている node のバージョンを確認しておきます。 sh-3.2# node -v v14.17.0 ダウングレード先のバージョンを引数に設定し、 n を実行します。 sh-3.2# n 10.12.0 installing : node-v10.12.0 mkdir : /usr/local/n/versions/node/10.12.0 fetch : https://nodejs.org/dist/v10.12.0/node-v10.12.0-darwin-x64.tar.xz installed : v10.12.0 (with npm 6.4.1) ダウグレード後のバージョンを確認します。 sh-3.2# node -v v10.12.0 以上です。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

IBM CLoud Cloud Foundryメモ - トークンが有効期限切れか、取り消されたか、あるいはトークン ID が誤りです。

ibmcloud cf pushしようとしたところ、以下のエラーが発生しました。久々に触るツールあるあるですね。 アプリ情報を取得しています... トークンが有効期限切れか、取り消されたか、あるいはトークン ID が誤りです。 ログインし直して再認証してください。 失敗 再ログインからのプッシュまで bimcloudのcliは入ってる前提となりますが以下の流れです。 あらためてログイン $ ibmcloud login --sso 組織、スペースの設定 $ ibmcloud target --cf push (デプロイ) $ ibmcloud cf push よもやま ログインしたあとのtarget指定がけっこう忘れますね。。 まよったらここ(IBM CloudでNode.jsアプリケーションをデプロイするまでの流れ)を見ながら振り返ると良さそうです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

IBM Cloud Cloud Foundryメモ - トークンが有効期限切れか、取り消されたか、あるいはトークン ID が誤りです。

ibmcloud cf pushしようとしたところ、以下のエラーが発生しました。久々に触るツールあるあるですね。 アプリ情報を取得しています... トークンが有効期限切れか、取り消されたか、あるいはトークン ID が誤りです。 ログインし直して再認証してください。 失敗 再ログインからのプッシュまで bimcloudのcliは入ってる前提となりますが以下の流れです。 あらためてログイン $ ibmcloud login --sso 組織、スペースの設定 $ ibmcloud target --cf push (デプロイ) $ ibmcloud cf push よもやま ログインしたあとのtarget指定がけっこう忘れますね。。 まよったらここ(IBM CloudでNode.jsアプリケーションをデプロイするまでの流れ)を見ながら振り返ると良さそうです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Next.jsでnpm run devを実行したところ、エラー「segmentation fault」が発生した

はじめに こんにちわ、dtakkiyです! Next.jsで作成したプロジェクトで$npm run devを実行したところ、下図の様にsegmentation faultエラーで落ちるようになりました。 ローカルでの実行の度にsegmentation faultエラーが起こるため、開発が全く進まなくなりました。 今回は、このエラーの解消方法についてお伝えします。 実行環境 ハード: MacBookAir cpu: Apple M1 os: macOS Big Sur version 11.2.3 node: version 16.2.0 next.js: 10.2.3 解決方法 nodeのバージョンを最新版のversion 16.2.0から推奨版version 14.17.0に切り替えました。 (2021/06/07時点) nodeの新しいバージョンをインストール nodeのバージョン管理には、nvmを使用しています。 以下の手順で推奨版のversion 14.17.0をインストールします。 #現在インストールされているバージョンの確認 $nvm list # インストール可能なバージョンの確認 $nvm ls-remote # v14.17.0のインストール $nvm install v14.17.0 #デフォルトのバージョンをv14.17.0に指定 $nvm alias default v14.17.0 #現在のバージョンを確認 $nvm current v14.17.0 node_modulesフォルダの削除および再インストール 作成したnext.jsプロジェクトにあるにnode_modulesフォルダを削除します。 $ rm -rf ./node_modules nodeモジュールを再インストールします。 $ npm install npm run dev の再実行 $ npm run dev 以上の手順でエラーは解消されました。 おわりに 以上です。 バージョン切り替え後は、エラーは発生せず動作は安定しています。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む