mieki256's diary



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 --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
@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 を開いて、以下を打ってインストール。
choco install gzip

インストール場所は以下になっている。
C:\ProgramData\chocolatey\bin\gzip.exe

PATHの並びの関係で、先ほどインストールした GnuWin32版の gzip よりも優先して使われる状態になった…。まあ、バージョンは同じなのだからどちらを使ってもいいよな…。

MSYS2上のgzipを使う :

MSYS2をインストールしてある環境なら gzip も使える。

_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上での利用についても抜かりが無い…。

動作確認のみをしたい :

動作確認をするだけなら、wasmserve というGo言語製のツールが便利らしい。インストールは以下。Go言語がインストール済みであること。

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 を作れるようだなと…。

  • 環境変数 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
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 日分です。

過去ログ表示

Prev - 2026/02 -
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project