2026/04/28(火)nvm-windowsをマニュアルインストールする方法
マニュアルインストールするのに地味にハマったので記録として残しておく。
Windowsのユーザー名が日本語だとインストーラーを使ったインストールでは正常に動作しないため、そういったときに使える。
確認環境
nvm-windows 1.2.2
やり方
- GitHubのnvm-windows/releasesから
nvm-noinstall.zipを落としてくる - 適当な場所に解凍する。ここでは
C:\env\apps\nvmとする。 - Windowsのパスに次の物を作成する
NVM_HOME:C:\env\apps\nvmNVM_SYMLINK:C:\env\apps\nvm\env- シンボリックリンク用なので存在しないパスを指定する
PATHに%NVM_HOME%と%NVM_SYMLINK%の二つを追加する- 次のコマンドを走らせ、上手くいけばOK
nvm install lts nvm on nvm use 24 node -v
トラブルシューティング
nvm useしてもnodeにパスが通っておらず動かない
NVM_SYMLINKの設定がおかしい。どうもnvm useをした時に、このパスに指定したバージョンのnode.exeのシンボリックリンクが張ることで切り替えているようなので、ここが正しくないと正常にパスが通らない。
NVM_SYMLINKは存在しないパスを指定する必要がある。適当な文字列を指定しても動かない。
参考
2026/02/13(金)Windows 11にnvmを入れてMSYS2のzshから使う
なんか気が付いたら動かなくなってた気がするので作業ログとして残しておく。
確認環境
| Env | Ver |
|---|---|
| Windows 11 Pro | 25H2 OS build 26200.8740 |
| MSYS2 | msys2-x86_64-20251213 |
| zsh | 5.8 (x86_64-pc-msys) |
| nvm-windows | 1.2.2 |
MSYS2 msys2-x86_64-20210725でも動作を確認しているため、MSYS2のバージョンはほぼ関係ないと思われる。
前提条件
- MSYS2とzshは既にあるものとする。
- Node.jsは入っていないものとする。
やり方
- nvm-windowsからインストーラーを落としてインストール
- 任意のシェルで
nvm onを実行 nvm install ltsなり適当なインストールコマンドを叩くnode -v && npm -vで両方のバージョンが出ればOK
トラブルシューティング
nodeやnpmのコマンドが見つからない
nvm onを実行していないと上手くパスが通らないのでこれを実行する必要がある。
あとがき
nvm onなんてしなくても動いていた気がしたが、久々にWindowsでnodeを叩こうとしたら動かなかったので、ついでに全部の環境を刷新するついでに書いた。
2024/07/16(火)GitHub ActionsでNode.jsのスクリプトを単純に蹴る方法
Node.jsのスクリプトを適当に書き次のようなWorkflowsを記述することで実行できる。勿論Dockerイメージを作ってそこから立ち上げることもできるので好みの問題。直に呼べる分、取り回しは楽だと思う
name: hoge
description: hoge
inputs:
GITHUB_TOKEN:
description: 'Workflowsを実行するリポジトリのGITHUB_TOKEN'
required: true
on:
workflow_call:
runs:
using: node20
main: dist/index.js
inputs:やoutputs:を記述すれば入出力の引数も定義できる。
inputs.GITHUB_TOKENについて
これを書いておくとoctokitを使ってGitHubのAPIを叩けるようになる。普通は何かAPIを叩くはずなので書いておいた方が良い。
以下は一例。
const github = require('@actions/github');
const core = require('@actions/core');
async function run() {
const token = core.getInput('GITHUB_TOKEN');
const octokit = github.getOctokit(token);
const { data: pullRequest } = await octokit.rest.pulls.get({
owner: 'octokit',
repo: 'rest.js',
pull_number: 123,
mediaType: {
format: 'diff'
}
});
console.log(pullRequest);
}
参考
- Metadata syntax for GitHub Actions (docs.github.com)
- @actions/github
2024/06/18(火)生のHTTPメッセージを投げてみた
動機としてはcurlだと見えない部分があるので、自分でHTTPメッセージを手組みして送ってみたかった。
Node.jsとPHPのサーバーでリクエストが期待通り取得できたので、メッセージの実装としては問題ないと思われる。
検証用サーバー
以下のコードをNode.js v20.11.1を用いて検証
import http from 'node:http';
http
.createServer((req, res) => {
console.log(req.headers);
req.on('data', (chunk) => {
// body
console.log(Buffer.from(chunk).toString());
});
res.statusCode = 200;
res.end();
})
.listen(9999);
netcatコマンドによるリクエスト検証
GETリクエスト
echo -e 'GET / HTTP/1.1\r\nHost: localhost:9999\r\n\r\n' | nc localhost 9999
POSTリクエスト
echo -e 'POST / HTTP/1.1\r\nHost: localhost:9999\r\nContent-Length: 4\r\n\r\nhoge' | nc localhost 9999
備考
PHPで検証サーバーを作る場合
実際にAPサーバーでリクエストの中身をパース出来るかどうかの観点で見た場合にNode.jsよりPHPのが楽なので、PHPで作ってみた結果、軽くハマったので残しておく。
以下のコードを用いてPHP 8.0.29で検証サーバーを作る場合に、php -S 0.0.0.0:9999としてサーバーを起動すると、Content-Typeヘッダがない場合に正常な動作をしなかった。
<?php
var_dump($_SERVER);
var_dump($_REQUEST);
ncで検証サーバーを作る場合
デバッグ用。生のメッセージが見れるのでダンプしてdiffを取るなどでcurlとecho + ncの差分を見るのに使える。
nc -l 9999
HTTPメソッド名を非標準的なものにした場合の挙動
前述のNode.jsサーバーでは400 Bad Request、PHPサーバーでは501 Not Implementedが応答された。
2024/05/29(水)HTTPリクエストを投げるときにHostヘッダは省かないほうがいい
HTTPヘッダを持たないHTTPリクエストはあり得るのか?というのを検証しているときに気づいた話。
RFC 7230ではHostヘッダを持たないHTTPリクエストは禁止されており、これを受けたサーバーは400応答を返すことを必須としている。
RFC 7230:Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and RoutingのHostより
A client MUST send a Host header field in an HTTP/1.1 request even if
the request-target is in the absolute-form, since this allows the
Host information to be forwarded through ancient HTTP/1.0 proxies
that might not have implemented Host.
A server MUST respond with a 400 (Bad Request) status code to any
HTTP/1.1 request message that lacks a Host header field and to any
request message that contains more than one Host header field or a
Host header field with an invalid field-value.
なお、Node.jsのHTTPサーバー機能ではHostヘッダーのない要求を受け入れることができる。
http.createServer([options][, requestListener])を見ると、以下のようにrequireHostHeader: falseを渡すことで実現可能だ。規定値はtrueであるため、基本的にはHostヘッダーなしの要求は400応答が返される。
import http from 'node:http';
http
.createServer({requireHostHeader: false}, (req, res) => {
console.log(req.headers);
res.statusCode = 200;
res.end();
})
.listen(3000);
nginxにおいてもHostヘッダーなしの要求は以下の応答が返されたため同様と思われる。
<html>
<head><title>400 Bad Request</title></head>
<body>
<center><h1>400 Bad Request</h1></center>
<hr><center>nginx/1.26.0</center>
</body>
</html>
但し、nginxにおいてHostなしの要求を許容する方法は見つからなかった。Server namesによるとserver_name "";とすることで出来そうに見えたが、これは機能させることができず、400応答が返された。