2026/02/19(木) [n年前の日記]
#1 [prog][windows] Windows上でgzipを使いたい
Windows11 x64 25H2上でgzipを使いたい。利用できる版はあるのだろうか。
◎ gzip for Windowsを使う :
gzip for Windows というものがあるらしい。
_Gzip for Windows
バージョンは 1.3.12。古い…。
Binaries の zip、gzip-1.3.12-1-bin.zip を入手して解凍したら bin/ の中に gzip.exe が入ってた。これを使えるのかな…。
バージョン表示はできた。
_Gzip for Windows
バージョンは 1.3.12。古い…。
Binaries の zip、gzip-1.3.12-1-bin.zip を入手して解凍したら bin/ の中に gzip.exe が入ってた。これを使えるのかな…。
> gzip --version gzip 1.3.12 Copyright (C) 2007 Free Software Foundation, Inc. Copyright (C) 1993 Jean-loup Gailly. This is free software. You may redistribute copies of it under the terms of the GNU General Public License <http://www.gnu.org/licenses/gpl.html>. There is NO WARRANTY, to the extent permitted by law. Written by Jean-loup Gailly.
バージョン表示はできた。
◎ GnuWin32について :
先ほどの gzip は、GnuWin32 のパッケージの中の一つ、という扱いらしい。GnuWin32 というのは UNIX系OS(Linux等)で利用できる一般的なコマンドを Windows に移植した版、という説明でいいのかな。
_GnuWin32
_GetGnuWin32 - Maintaining a Gnuwin32 Package archive
_GnuWin32 - Browse Files at SourceForge.net
GnuWin32 は、2024/01/29 の時点で15年前に開発が完全に終了しているそうで…。GetGnuWin32_legacy_install_archive.zip を入手して解凍して、bin/ にパスを通しておけば利用できる、ということになっているらしい。
一応入手して、今回は D:\Dev\GnuWin32\ に置いておいた。解凍すると433MBほどになる。
注意点として、GnuWin32 の bin/ を環境変数PATHに追加して常に利用する場合は、PATHの最後のあたりに追加せよ、ということになっているらしい。いくつかはWindowsが標準で持っているコマンド名と衝突しているので、最初のあたりに追加してしまうとWindowsの動作が怪しくなる可能性があるのだろう…。
自分の場合はbatファイルを用意して、GnuWin32 を使いたくなったら、そのbatファイルを実行してから使うことにした。
gnuwin32_enable.bat
自分が GnuWin32 を使いたいと思った時は、Windows標準の各コマンドより GnuWin32 を優先して使いたいと思うはずなので、このbatファイルではPATHの最初のあたりに追加してしまうことにした。
_GnuWin32
_GetGnuWin32 - Maintaining a Gnuwin32 Package archive
_GnuWin32 - Browse Files at SourceForge.net
GnuWin32 は、2024/01/29 の時点で15年前に開発が完全に終了しているそうで…。GetGnuWin32_legacy_install_archive.zip を入手して解凍して、bin/ にパスを通しておけば利用できる、ということになっているらしい。
一応入手して、今回は D:\Dev\GnuWin32\ に置いておいた。解凍すると433MBほどになる。
注意点として、GnuWin32 の bin/ を環境変数PATHに追加して常に利用する場合は、PATHの最後のあたりに追加せよ、ということになっているらしい。いくつかはWindowsが標準で持っているコマンド名と衝突しているので、最初のあたりに追加してしまうとWindowsの動作が怪しくなる可能性があるのだろう…。
自分の場合はbatファイルを用意して、GnuWin32 を使いたくなったら、そのbatファイルを実行してから使うことにした。
gnuwin32_enable.bat
@echo off set GNUWINPATH=D:\Dev\GnuWin32\bin set PATH=%GNUWINPATH%;%PATH% echo GnuWin32 enable. [%GNUWINPATH%]
自分が GnuWin32 を使いたいと思った時は、Windows標準の各コマンドより GnuWin32 を優先して使いたいと思うはずなので、このbatファイルではPATHの最初のあたりに追加してしまうことにした。
◎ Chocolateyでインストール :
パッケージ管理ツールの Chocolatey経由でも gzip はインストールできる。
_Chocolatey Software | gzip 1.3.12
これもバージョンは 1.3.12。
一応インストールしてみることにした。管理者権限で PowerShell 7 を開いて、以下を打ってインストール。
インストール場所は以下になっている。
PATHの並びの関係で、先ほどインストールした GnuWin32版の gzip よりも優先して使われる状態になった…。まあ、バージョンは同じなのだからどちらを使ってもいいよな…。
_Chocolatey Software | gzip 1.3.12
これもバージョンは 1.3.12。
一応インストールしてみることにした。管理者権限で PowerShell 7 を開いて、以下を打ってインストール。
choco install gzip
インストール場所は以下になっている。
C:\ProgramData\chocolatey\bin\gzip.exe
PATHの並びの関係で、先ほどインストールした GnuWin32版の gzip よりも優先して使われる状態になった…。まあ、バージョンは同じなのだからどちらを使ってもいいよな…。
◎ MSYS2上のgzipを使う :
MSYS2をインストールしてある環境なら gzip も使える。
_Package: gzip - MSYS2 Packages
インストールは以下。
バージョンは 1.14。これが一番新しい。
ただ、MSYS2 って起動するのがなんだか面倒で…。自分の場合は Chocolatey でインストールした版を使うことになっていきそうな気がする。
_Package: gzip - MSYS2 Packages
インストールは以下。
pacman -S gzip
$ pacman -Ss gzip | grep "gzip 1" msys/gzip 1.14-1 (compression) [インストール済み]
$ gzip --version gzip 1.14 Copyright (C) 2025 Free Software Foundation, Inc. Copyright (C) 1993 Jean-loup Gailly. This is free software. You may redistribute copies of it under the terms of the GNU General Public License <https://www.gnu.org/licenses/gpl.html>. There is NO WARRANTY, to the extent permitted by law. Written by Jean-loup Gailly.
バージョンは 1.14。これが一番新しい。
ただ、MSYS2 って起動するのがなんだか面倒で…。自分の場合は Chocolatey でインストールした版を使うことになっていきそうな気がする。
[ ツッコむ ]
#2 [golang] Go言語で作成したアプリをブラウザ上で動かしたい
Windows11 x64 25H2 + Go 1.25.7 64bit + Ebitengine で作成したアプリを、Webブラウザ上で動かしてみたい。
以下のページが参考になった。ありがたや。
_WebAssembly - Ebitengine
先日作成した Ebitengine のサンプル相当を wasm に変換してアップロードしてみた。Firefox 147.0.4 64bit、Google Chrome 145.0.7632.110 64bit上では動いてくれた。
_img/_2026/20260219_golang_wasm/index.html
golang って凄いな…。こんなにサクッとブラウザ上で動かせてしまうのか…。さすが Googleが作ったプログラミング言語…。Web上での利用についても抜かりが無い…。
以下のページが参考になった。ありがたや。
_WebAssembly - Ebitengine
先日作成した Ebitengine のサンプル相当を wasm に変換してアップロードしてみた。Firefox 147.0.4 64bit、Google Chrome 145.0.7632.110 64bit上では動いてくれた。
_img/_2026/20260219_golang_wasm/index.html
golang って凄いな…。こんなにサクッとブラウザ上で動かせてしまうのか…。さすが Googleが作ったプログラミング言語…。Web上での利用についても抜かりが無い…。
◎ 動作確認のみをしたい :
動作確認をするだけなら、wasmserve というGo言語製のツールが便利らしい。インストールは以下。Go言語がインストール済みであること。
利用時は、プロジェクトフォルダをカレントディレクトリにして以下を打つ。終了は Ctrl + C。
8080番ポートで待ち受けるので、Webブラウザで _http://localhost:8080/ を開けばいい。
Windows特有の処理を入れてないプロジェクトなら、すんなりブラウザ上で動いてくれた。
最初、多重起動禁止処理用にWin32 APIのMutexを使っているプロジェクトで試したら、DLL がどうとか言われてエラーが出てしまった…。どのOSでも動きそうな作りに留めておかないとダメっぽい。
go install github.com/hajimehoshi/wasmserve@latest
> which wasmserve "C:\Users\USERNAME\go\bin\wasmserve.exe"
利用時は、プロジェクトフォルダをカレントディレクトリにして以下を打つ。終了は Ctrl + C。
wasmserve .
8080番ポートで待ち受けるので、Webブラウザで _http://localhost:8080/ を開けばいい。
Windows特有の処理を入れてないプロジェクトなら、すんなりブラウザ上で動いてくれた。
最初、多重起動禁止処理用にWin32 APIのMutexを使っているプロジェクトで試したら、DLL がどうとか言われてエラーが出てしまった…。どのOSでも動きそうな作りに留めておかないとダメっぽい。
◎ wasmを生成 :
wasmファイルを作成してWebサーバ上に関連ファイルを置くことで、ブラウザ上でも動作するようになるらしい。
とにもかくにも、まずは wasmファイルを作らないと話にならない。見た感じでは、以下を行ってからビルドすると wasm を作れるようだなと…。
PowerShellなら以下。
コマンドプロンプトなら以下。
この wasmファイルを動作させるには、wasm_exec.js も必要になるらしい。Go言語(golang)に同梱されているので、プロジェクトフォルダにコピーする。Go 1.24以降と1.23以前で場所が違うらしいので注意。
ちなみに、Goのインストール場所は、go env GOROOT で得られる。go env xxxxxx で、Goに関する環境変数が確認できる模様。
PowerShell なら以下。
今回は、プロジェクトフォルダ内に該当ファイルをコピーしてくるbatファイル、get_wasm_js.bat を作成して対応してみた。AI(Google Gemini)に作成してもらった。
get_wasm_js.bat
配布時は以下が必要になる。
index.html は前述のページの内容をコピペして利用させてもらった。game.wasm のところを、自分で生成した wasmファイル名に修正しておくこと。
index.html
プロジェクトフォルダ内でローカルサーバ(Webサーバ)を立ち上げて、Webブラウザでアクセスして動作確認してみる。
Python 3.x が入っている環境なら、以下を打てば簡易ローカルサーバを立ち上げられる。終了は Ctrl + C。
_http://localhost:8080/ を開いて動けば成功。
とにもかくにも、まずは wasmファイルを作らないと話にならない。見た感じでは、以下を行ってからビルドすると wasm を作れるようだなと…。
- 環境変数 GOOS に "js" を指定。
- 環境変数 GOARCH に "wasm" を指定。
- この状態でビルドをすると wasmファイルが作成される。出力ファイル名の指定(-o hoge.wasm)も必要。
PowerShellなら以下。
$Env:GOOS = 'js' $Env:GOARCH = 'wasm' go build -o game.wasm main.go Remove-Item Env:GOOS Remove-Item Env:GOARCH
コマンドプロンプトなら以下。
set GOOS=js set GOARCH=wasm go build -o game.wasm main.go
この wasmファイルを動作させるには、wasm_exec.js も必要になるらしい。Go言語(golang)に同梱されているので、プロジェクトフォルダにコピーする。Go 1.24以降と1.23以前で場所が違うらしいので注意。
- Go 1.24以降 : (Goインストール場所)\lib\wasm\wasm_exec.js
- Go 1.23以前 : (Goインストール場所)\misc\wasm\wasm_exec.js
ちなみに、Goのインストール場所は、go env GOROOT で得られる。go env xxxxxx で、Goに関する環境変数が確認できる模様。
PowerShell なら以下。
# Go 1.24以降 $goroot = go env GOROOT cp $goroot\lib\wasm\wasm_exec.js . # Go 1.23以前 $goroot = go env GOROOT cp $goroot\misc\wasm\wasm_exec.js .
今回は、プロジェクトフォルダ内に該当ファイルをコピーしてくるbatファイル、get_wasm_js.bat を作成して対応してみた。AI(Google Gemini)に作成してもらった。
get_wasm_js.bat
@echo off
setlocal enabledelayedexpansion
echo [INFO] Searching for Go's wasm_exec.js...
:: Get GOROOT path from Go environment
for /f "tokens=*" %%i in ('go env GOROOT') do set "GOROOT_PATH=%%i"
:: Define possible paths (New in Go 1.24+ and Old in Go 1.23-)
set "NEW_PATH=%GOROOT_PATH%\lib\wasm\wasm_exec.js"
set "OLD_PATH=%GOROOT_PATH%\misc\wasm\wasm_exec.js"
:: Check New Path
if exist "%NEW_PATH%" (
copy "%NEW_PATH%" .
echo [SUCCESS] Copied wasm_exec.js from Go 1.24+ location.
goto :end
)
:: Check Old Path
if exist "%OLD_PATH%" (
copy "%OLD_PATH%" .
echo [SUCCESS] Copied wasm_exec.js from legacy Go location.
goto :end
)
:: Error handling
echo [ERROR] could not find wasm_exec.js in Go distribution.
echo [DEBUG] Tried:
echo 1: %NEW_PATH%
echo 2: %OLD_PATH%
:end
echo [DONE] Execution finished.
配布時は以下が必要になる。
- index.html
- wasm_exec.js
- game.wasm
index.html は前述のページの内容をコピペして利用させてもらった。game.wasm のところを、自分で生成した wasmファイル名に修正しておくこと。
index.html
<!DOCTYPE html>
<script src="wasm_exec.js"></script>
<script>
const go = new Go();
WebAssembly.instantiateStreaming(fetch("game.wasm"), go.importObject).then(result => {
go.run(result.instance);
});
</script>
プロジェクトフォルダ内でローカルサーバ(Webサーバ)を立ち上げて、Webブラウザでアクセスして動作確認してみる。
Python 3.x が入っている環境なら、以下を打てば簡易ローカルサーバを立ち上げられる。終了は Ctrl + C。
python -m http.server 8080
_http://localhost:8080/ を開いて動けば成功。
◎ taskfileに手順を書いておく :
毎回ビルドするたびに環境変数を指定するのも面倒だなと…。batファイルで対応してもいいけれど、先日 Task(taskfile)というツールをインストールしたことだし、そちらで対応してみよう…。
Taskfile.yml
task build-wasm と打てば wasm がビルドできる。
ただ、この項目を指定したら、exeを作るためのビルド時に「GOOS, GOARCHがおかしい」と言われてエラーになった…。res: や build: の設定項目内に env: を用意して、GOOS=windows, GOARCH=amd64 を指定することで対応することにしてみた。
Taskfile.yml
version: '3'
tasks:
default:
cmds:
- task --list
res:
desc: Make resource .syso
env:
GOOS: windows
GOARCH: amd64
cmds:
- go-winres make
build:
desc: Build GUI version
deps: [res]
env:
GOOS: windows
GOARCH: amd64
cmds:
- go build -ldflags="-H windowsgui"
run:
desc: Development
cmds:
- go run .
clean:
desc: remove *.exe and *.syso
cmds:
- rm -f *.exe
- rm -f *.syso
build-wasm:
desc: Build the Ebitengine game for WebAssembly
env:
GOOS: js
GOARCH: wasm
cmds:
- go build -o game.wasm main.go
sources:
- ./main.go
generates:
- ./game.wasm
serve:
desc: Run a local server to test the WASM build
cmds:
- wasmserve .
chkenv:
desc: Check OS env
cmds:
- echo GOOS is %GOOS%
- go env GOOS
task build-wasm と打てば wasm がビルドできる。
- env: を指定することで、環境変数を一時的に変更することが可能らしい。
- sources: と generates: の指定で、どのファイルを使ってどのファイルを作成するのか指定できる。main.go と game.wasm を指定してるから、main.go と game.wasm のタイムスタンプを見て、main.go のタイムスタンプが game.wasm より新しい時だけビルドが行われるようになる。
ただ、この項目を指定したら、exeを作るためのビルド時に「GOOS, GOARCHがおかしい」と言われてエラーになった…。res: や build: の設定項目内に env: を用意して、GOOS=windows, GOARCH=amd64 を指定することで対応することにしてみた。
[ ツッコむ ]
以上、1 日分です。