httpdコマンドでApache HTTP Serverの設定ファイルを構文チェックする

Apache HTTP Serverのhttpdコマンドを使って設定ファイルの構文チェックをおこなうときのコツをメモしておきます。

要約

  • 構文チェックはhttpdコマンドのtオプションで実施できる
  • テスト対象の設定ファイルを読み込む大本の設定ファイルを用意し、そのファイルを出発点に構文チェックをおこなう
  • テスト対象はfオプションを使って絶対パスで指定する
$ httpd -t -f /tmp/apacheconf-test/test-httpd.conf
Syntax OK
続きを読む

LinuxのOS情報・システム情報・ネットワーク情報を確認するコマンド

Linuxを使っているとき、特にDockerのコンテナの中などで、OS情報やシステム情報、ネットワーク情報を確認することはよくあります。
そんなときに使える便利なコマンド(とファイル)をまとめました。

なるべくどのディストリビューションでも使えるものを中心に紹介します。

確認に使ったOSは以下のとおりです。

  • Ubuntu 22.04.5(WSL2)
  • AlmaLinux 10.1(WSL2)
  • Amazon Linux 2023 インスタンスタイプ t4g.nano
続きを読む

シェルスクリプトでTOTPコードを算出する

シェルスクリプトでTOTPのコードを算出する方法を2つ紹介します。 1つ目はoathtoolというライブラリを使う方法、2つ目は外部ライブラリを使わずに自作実装した方法です

続きを読む

Node.jsのバージョンによって`JSON.parse()`でエラーが発生したときのメッセージが違う

Node.jsのバージョンによってJSON.parse()でエラーが発生したときのメッセージが異なります(parseメソッドだけではありませんが)。 正確にはNode.jsのバージョンではなく、Node.jsに梱包されているV8エンジンのバージョンによります。

この記事ではそれぞれのNode.jsのバージョン、V8エンジンのバージョンとメッセージを確認していきます。 実行したJavaScriptのコードは以下です。

JSON.parse('a');

Node.jsに含まれているV8エンジンのバージョンは、以下のコマンドで確認できます。

$ node -p process.versions.v8

https://nodejs.org/docs/latest-v24.x/api/process.html#processversions

バージョンごとのメッセージ

v16

$ node -v
v16.20.2
$ node index.js
undefined:1
a
^

SyntaxError: Unexpected token a in JSON at position 0
    at JSON.parse (<anonymous>)
    at Object.<anonymous> (<my-directory>/index.js:1:6)
    at Module._compile (node:internal/modules/cjs/loader:1198:14)
    at Object.Module._extensions..js (node:internal/modules/cjs/loader:1252:10)
    at Module.load (node:internal/modules/cjs/loader:1076:32)
    at Function.Module._load (node:internal/modules/cjs/loader:911:12)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)
    at node:internal/main/run_main_module:22:47
$ node -p process.versions.v8
9.4.146.26-node.26

v18

$ node -v
v18.20.8
$ node index.js
undefined:1
a
^

SyntaxError: Unexpected token a in JSON at position 0
    at JSON.parse (<anonymous>)
    at Object.<anonymous> (<my-directory>/index.js:1:6)
    at Module._compile (node:internal/modules/cjs/loader:1364:14)
    at Module._extensions..js (node:internal/modules/cjs/loader:1422:10)
    at Module.load (node:internal/modules/cjs/loader:1203:32)
    at Module._load (node:internal/modules/cjs/loader:1019:12)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:128:12)
    at node:internal/main/run_main_module:28:49
$ node -p process.versions.v8
10.2.154.26-node.3

v20

$ node -v
v20.20.0
<anonymous_script>:1
a
^

SyntaxError: Unexpected token 'a', "a" is not valid JSON
    at JSON.parse (<anonymous>)
    at Object.<anonymous> (<my-directory>/index.js:1:6)
    at Module._compile (node:internal/modules/cjs/loader:1521:14)
    at Module._extensions..js (node:internal/modules/cjs/loader:1623:10)
    at Module.load (node:internal/modules/cjs/loader:1266:32)
    at Module._load (node:internal/modules/cjs/loader:1091:12)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:164:12)
    at node:internal/main/run_main_module:28:49
$ node -p process.versions.v8
11.3.244.8-node.3

v22

$ node -v
v22.22.0
$ node index.js
<anonymous_script>:1
a
^

SyntaxError: Unexpected token 'a', "a" is not valid JSON
    at JSON.parse (<anonymous>)
    at Object.<anonymous> (<my-directory>/index.js:1:6)
    at Module._compile (node:internal/modules/cjs/loader:1706:14)
    at Object..js (node:internal/modules/cjs/loader:1839:10)
    at Module.load (node:internal/modules/cjs/loader:1441:32)
    at Function._load (node:internal/modules/cjs/loader:1263:12)
    at TracingChannel.traceSync (node:diagnostics_channel:328:14)
    at wrapModuleLoad (node:internal/modules/cjs/loader:237:24)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:171:5)
    at node:internal/main/run_main_module:36:49
$ node -p process.versions.v8
12.4.254.21-node.3

v24

$ node -v
v24.13.1
$ node index.js
<anonymous_script>:1
a
^

SyntaxError: Unexpected token 'a', "a" is not valid JSON
    at JSON.parse (<anonymous>)
    at Object.<anonymous> (<my-directory>/index.js:1:6)
    at Module._compile (node:internal/modules/cjs/loader:1804:14)
    at Object..js (node:internal/modules/cjs/loader:1936:10)
    at Module.load (node:internal/modules/cjs/loader:1525:32)
    at Module._load (node:internal/modules/cjs/loader:1327:12)
    at TracingChannel.traceSync (node:diagnostics_channel:328:14)
    at wrapModuleLoad (node:internal/modules/cjs/loader:245:24)
    at Module.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:154:5)
    at node:internal/main/run_main_module:33:47
$ node -p process.versions.v8
13.6.233.17-node.40

まとめ

バージョンとメッセージは以下の表の通りになりました。

Node.js V8 メッセージ
v16.20.2 9.4.146.26-node.26 Unexpected token a in JSON at position 0
v18.20.8 10.2.154.26-node.3 Unexpected token a in JSON at position 0
v20.20.0 11.3.244.8-node.3 Unexpected token 'a', "a" is not valid JSON
v22.22.0 12.4.254.21-node.3 Unexpected token 'a', "a" is not valid JSON
v24.13.1 13.6.233.17-node.40 Unexpected token 'a', "a" is not valid JSON

現時点でのLTSの最新バージョンしか調べていませんが、v20からメッセージが変わって、わかりやすくなっています。 エラーメッセージで分岐を作るようなことはしないようにしましょう。

便利なAWS公式が公開しているSystems Manager Parameter Storeのパラメータを使ってみる

AWS公式が公開しているSystems Manager Parameter Store(以下、Parameter Store)のパラメータには、様々な便利なパラメータがあります。 その便利な使い方とほかの便利なパラメータを紹介したいと思います。

続きを読む

AWSでお試しWebアプリ環境を構築するのに便利なCloudFormationテンプレートを作った

AWSで、

を構築してくれるCloudFormationテンプレートを作ってみました。
何かちょっとしたWebアプリを構築するときに使えるリソース群を構築してくれます。

ざっくり紹介すると、以下のような構成を作れます。

CloudFormationテンプレートはGistで公開しています。

この記事では使い方を簡単に説明します。

続きを読む

Node.js v20以前にcrypto.createCipherで暗号化した暗号文をv22のメソッドで復号する

はじめに

Node.jsの組み込みモジュールであるcryptocreateCipherおよびcreateDecipherがNode.js v22では削除されます。
v20で使っている場合には、次のメジャーバージョンではcreateCipherivおよびcreateDecipherivに移行する必要があります。

とはいえ、v20のときに作った暗号文が戻せないと困ると思います。 そのためには、npmで公開されているOSSモジュールを使ったり、自分で実装したりすることで対応できます。
この記事ではnpmに公開されているモジュールevp_bytestokeyを使う方法と、自分で実装する方法を紹介しています。

Node.js v22が公開されたのは2024年4月ですし、v20のメンテナンス終了は2026年4月に予定されています。AWS Lambdaでも同様にサポート期限が2026年4月の予定となっています。
今更まだ対応していないケースは少ないかと思いますが。

本記事で紹介しているコードはGitHubで公開しています。

続きを読む