2026/04/28(火)nvm-windowsをマニュアルインストールする方法

投稿日:

マニュアルインストールするのに地味にハマったので記録として残しておく。

Windowsのユーザー名が日本語だとインストーラーを使ったインストールでは正常に動作しないため、そういったときに使える。

確認環境

nvm-windows 1.2.2

やり方

  1. GitHubのnvm-windows/releasesからnvm-noinstall.zipを落としてくる
  2. 適当な場所に解凍する。ここではC:\env\apps\nvmとする。
  3. Windowsのパスに次の物を作成する
    • NVM_HOME: C:\env\apps\nvm
    • NVM_SYMLINK: C:\env\apps\nvm\env
      • シンボリックリンク用なので存在しないパスを指定する
  4. PATH%NVM_HOME%%NVM_SYMLINK%の二つを追加する
  5. 次のコマンドを走らせ、上手くいけば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は入っていないものとする。

やり方

  1. nvm-windowsからインストーラーを落としてインストール
  2. 任意のシェルでnvm onを実行
  3. nvm install ltsなり適当なインストールコマンドを叩く
  4. 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);
}

参考

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 RoutingHostより

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応答が返された。