2025,江端さんの技術メモ

DockerのPostgreSQLデータベースをWindows→WSLのDockerへ移行する方法

Windows上のDockerで動作するPostgreSQLデータベースを、WSL(Windows Subsystem for Linux)のDockerに移行する 手順を説明します。


🔷 方法 1: Dockerボリュームごと移行する(推奨)

Windowsでは grepbusybox は不要 で、標準的な PowerShellコマンド を使用して移行できます。

📌 ① ボリューム名を確認

まず、PostgreSQLのデータが保存されているボリューム名を確認します。

powershell
docker volume ls

出力例:

DRIVER VOLUME NAME
local hakata_db-data

この hakata_db-data がPostgreSQLのデータが格納されているボリュームです。


📌 ② ボリュームをtarファイルにバックアップ

PowerShellを管理者権限で開き、以下のコマンドを実行します。

docker run --rm -v hakata_db-data:/data -v C:\Users\tomoi\backup:/backup ubuntu tar czf /backup/hakata_db_backup.tar.gz -C /data .

重要なポイント

  • C:\Users\tomoi\backup はWindows側のバックアップ保存先(任意のフォルダを指定)
  • ubuntu イメージを使用(busybox は不要)
  • hakata_db_backup.tar.gz という圧縮ファイルが作成される

この hakata_db_backup.tar.gz をUSBやネットワーク経由で 移行先のマシンへコピー します。


📌 ③ WSLのDocker環境にファイルをコピー

WSLのファイルシステムにバックアップを移動します。

powershell
wsl

WSL内で以下のコマンドを実行して、WindowsのバックアップファイルをWSLの /home/ ディレクトリにコピー。

cp /mnt/c/Users/tomoi/backup/hakata_db_backup.tar.gz /home/

📌 ④ WSLのDockerでボリュームを作成

WSL内で以下を実行し、新しいボリュームを作成します。

docker volume create hakata_db-data

作成したボリュームにデータを展開します。

docker run --rm -v hakata_db-data:/data -v /home:/backup ubuntu tar xzf /backup/hakata_db_backup.tar.gz -C /data

📌 ⑤ WSLのDockerでPostgreSQLコンテナを起動

WSL内で以下を実行し、データをマウントしたPostgreSQLコンテナを起動。

docker run -d --name postgres_hakata -p 15432:5432 -v hakata_db-data:/var/lib/postgresql/data postgres:16

📌 ⑥ データが正しく復元されたか確認

PostgreSQLコンテナに接続してデータを確認。

docker exec -it postgres_hakata psql -U postgres

データベース一覧を表示:

\l

2025,江端さんの技術メモ

音声を無視して、最も一般的な webm → mp4 変換コマンドは以下のようになります。

ffmpeg -i input.webm -vf "scale=640:360" -r 5 -c:v libx264 -preset slow -crf 23 -an output.mp4

説明:

  • -i input.webm:入力ファイルの指定
  • -vf "scale=640:360":解像度を640x360に変更
  • -r 5:フレームレートを5fpsに変更
  • -c:v libx264:H.264コーデックでエンコード
  • -preset slow:エンコード速度と圧縮率のバランスをとる(品質優先)
  • -crf 23:品質を指定(数値が低いほど高品質)
  • -an:音声を削除(無音にする)
  • output.mp4:出力ファイルの指定

このコマンドで、音声なしの mp4 に変換できます。

2025,江端さんの技術メモ

TC帯域を設定して、レイテンシーを設定した後、パケロスや遅延を設定する場合、だいたい、こうやるのですが、

sudo tc qdisc add dev eth0 root handle 1: tbf rate 10mbit burst 10kb latency 500ms
sudo tc qdisc add dev eth0 parent 1:1 handle 10: netem delay 10000ms loss 1%

RTNETLINK answers: No such file or directory と言われます。

Webで調べてみたところ、山のように、同じ"悲鳴"が飛んでいました。

で、解決方ですが、ChatGPTが、逆転の発想のやりかたを教えてくれました。

# 既存の設定を削除
sudo tc qdisc del dev eth0 root (何か表示されるが無視する)

# `netem` を root にして、まずパケットロスを設定
sudo tc qdisc add dev eth0 root handle 1: netem loss 1% delay 10000ms

# その上に `tbf` を適用
sudo tc qdisc add dev eth0 parent 1:1 handle 10: tbf rate 10mbit burst 10kb latency 500ms

つまるところ、ルールの親と子を引っくり返す、という手法です。

まあ、理由は不明ですが、これで動いているようです。

2025,江端さんの技術メモ

例題: 水道の蛇口に例える

ネットワークの「ビットレート (bitrate)」と「帯域 (bandwidth)」 の違いを、水道の蛇口に例えて説明します。


1. 帯域 (bandwidth) = 水道管の太さ

  • 水道管の太さが 「ネットワークの帯域」 に相当する。
  • 例えば 「10Gbpsの回線」 というのは 「直径10cmの水道管」 に相当する。
  • 「最大で10Gbps流せる」 という意味だが、実際にどれくらい流すかは別の話。

2. ビットレート (bitrate) = 水の流量 (蛇口の開き具合)

  • 蛇口をどれくらい開くかが 「ビットレート」 に相当する。
  • 例えば tcrate 5mbit を設定すると、蛇口を半分だけ開くようなイメージ。
  • 回線が10Gbps(帯域)でも、実際に使うのは5Mbps(ビットレート)に制限される。

3. tc を使った制限の具体例

(1) 10Gbpsの回線を持つPC (帯域 = 10Gbps)

  • 例えば、自宅のネット回線が 10Gbps だったとする。
  • しかし、tc を使って rate 5mbit に制限すると、実際のデータ転送は 5Mbps しか出ない。

(2) tc で 5Mbps のビットレート制限

sudo tc qdisc add dev eth0 root tbf rate 5mbit burst 10kb latency 1ms

この設定をすると、10Gbpsの回線を持っていても、実際の転送速度は 5Mbps に制限 される(=蛇口を少ししか開かない)。

(3) tc で 5Mbps ~ 10Mbps の変動を許可

sudo tc qdisc add dev eth0 root handle 1: htb default 10
sudo tc class add dev eth0 parent 1: classid 1:1 htb rate 5mbit ceil 10mbit
  • 最低 5Mbps最大 10Mbps まで許可 する設定。
  • 普段は5Mbpsだが、ネットワークに余裕があれば 最大10Mbps まで利用可能

4. 結論

項目 水道の例 ネットワークの意味
帯域 (bandwidth) 水道管の太さ 利用可能なネットワークの最大容量 (例: 10Gbps)
ビットレート (bitrate) 蛇口の開き具合 実際に流せるデータ速度 (例: 5Mbps)
  • 帯域は「最大でどれくらい流せるか」 を決める(物理的な上限)。
  • ビットレートは「実際にどれくらい流すか」tc で調整できる。

2025,江端さんの技術メモ

OBSの録画時にCPU負荷が増大し、操作が困難になる場合、以下の設定を調整することで負荷を軽減できます。


1. 録画のエンコーダを変更

設定 → 出力 → 録画 → エンコーダ

  • 「ハードウェアエンコード (NVENC, QuickSync, AMF)」を使用する
    • NVIDIANVENC (H.264)
    • Intel CPU内蔵GPUQuickSync H.264
    • AMD GPUAMF
    • ハードウェアエンコードがない場合x264のプリセットを変更(後述)

      私の場合、エンコードするハードウェアがにないからスキップ


2. 録画の品質を下げる

設定 → 出力 → 録画

  • 録画品質:低品質、ファイルサイズ優先
  • 録画フォーマット: mp4(またはflv)
  • エンコーダ設定: CBR (固定ビットレート)
    • ビットレート: 1500~2500kbps(画質が多少荒くなるが負荷が下がる)
    • キーフレーム間隔: 2秒
    • CPUプリセット: 「ultrafast」(x264使用時のみ)

      録画の方には、上記メニューに該当するものがなかったので、こちらもスキップ

3. 解像度とフレームレートを下げる

設定 → 映像

    • 基本 (キャンバス) 解像度: 1280×720
    • 出力 (スケーリング) 解像度: 640×360 または 854×480
    • FPS: 30 FPS または 24 FPS

      出力は最低値に、FPSは手動で10fps位まで落した→ 動作が軽くなって、マウス操作ができるようになった

2025,江端さんの技術メモ

OBSでブラウザ全体が表示されず、一部が大きく拡大されてしまう場合、以下の点を確認してください。

1. ソースのプロパティを確認

  • OBSの「ソース」リストでブラウザをキャプチャしているソースを右クリック → 「変換」→「画面にフィット」 を選択
  • これで画面全体がOBSのプレビューに収まるか確認

    # 私は、ここで解決したので、以下省略

2025,江端さんの技術メモ

VSCodeでCSVファイルの文字エンコーディングを Shift_JIS(SJIS) にする方法はいくつかあります。


① VSCodeの「文字コードの変更」機能を使う

  1. CSVファイルを開く
  2. 画面の右下に エンコーディング(例: UTF-8, UTF-16など) が表示されているのでクリック
  3. 「エンコーディングの変更」 を選択
  4. 「Shift_JIS」または「Japanese (Shift_JIS)」を選択
  5. 「エンコードされた内容を保存」 をクリックし、Shift_JIS形式で保存

2025,江端さんの技術メモ

VSCodeからCSVファイルをExcelで開く方法

VSCodeから直接 Excel を起動してCSVファイルを開く方法はいくつかあります。


① ターミナルからExcelを起動する(Windows)

方法 1: start コマンドを使用

VSCodeのターミナル(PowerShell または コマンドプロンプト)で以下を実行

start excel output.csv
  • output.csv は開きたいCSVファイルの名前
  • これでExcelが起動し、CSVファイルが開かれる

2025,江端さんの技術メモ

Windows 11 に WSL2 をインストールし、Ubuntu をデフォルトOSに設定し、Docker をインストールする手順を説明します。

1. 背景

Docker for Windowsが、有償化されて、(現場が)困ったことになっています。

ChatGPTにDocker for Windows と Docker Desktop の違いについて教えてもらいました

で、これを回避する方法として、「WSLのLinuxを利用して、Dockerを利用する方法」がある、という話を聞き『あ、盲点』と思い、さっそく環境構築をノートPCでやってみました(本番PCでコケるのは怖かったので)。


2. WSL2 のインストール

2.1. WSL の有効化

管理者権限で PowerShell または コマンドプロンプトを開き、以下のコマンドを実行します。

wsl --install

これにより、WSL2 とともに Ubuntu が自動でインストールされます。

WSL のバージョンを確認するには

wsl --list --verbose

もし、既に WSL1 になっている場合、以下のコマンドで WSL2 に変更できます:

wsl --set-version Ubuntu 2


3. Ubuntu をデフォルトOSに設定

インストールされている WSL のディストリビューションを確認:

wsl --list --verbose
デフォルトを Ubuntu にする:
wsl --set-default Ubuntu

4. Docker のインストール

WSL2 上の Ubuntu に Docker をインストールします。

4.1. パッケージの更新更新

sudo apt update && sudo apt upgrade -y

4.2. Docker のインストール

sudo apt install -y docker.io

4.3. Docker のサービスを開始

sudo systemctl enable --now docker

4.4. Docker グループへのユーザー追加

sudo usermod -aG docker $USER

適用するには、一度ログアウトするか、以下を実行:

newgrp docker

4.5. Docker の動作確認

docker run hello-world

「Hello from Docker!」と表示されれば成功です。


5. Docker Compose のインストール

sudo apt install -y docker-compose

6. Docker デーモンを WSL2 内で実行

通常、Windows 上で Docker Desktop を使う方法もありますが、WSL2 内で直接 Docker を動かしたい場合は systemd を有効にします。

6.1. WSL2 で systemd を有効化

sudo nano /etc/wsl.conf

以下の内容を追加:

[boot] systemd=true

保存して WSL を再起動:

wsl --shutdown

再度 WSL を起動して systemctl が使えることを確認:

systemctl list-units --type=service

6.2. Docker の自動起動

sudo systemctl enable --now docker

これで、WSL2 + Ubuntu + Docker の環境構築が完了しました。

7. Docker for Windowsのコンテナイメージをtarで固めて展開する

これは、以下を参考にして下さい。

Dockerコンテナのイメージをセーブして先方に送る方法

$ sudo docker load < 20240828_shajyo.tar

のあたりから続けます。

これをwslで実行すると、docker imageができます。

8. ちょっと変なことが起っている話

ところで、この段階で、ちょっと不思議なことが起こりました。

docker for windowsを起動すると、WSL内のdocker imageの名称が変わります(理由不明で、変なのですが、動くなら、まあ構いません)。

で、それだけでなく、docker imagesで、Docker for windowsのイメージが全部登場してきます。

なんだか良く分かりませんが、これが出てくるのであれば、「Docker for Windowsのコンテナイメージをtarで固めて展開する」をサボれるかもしれません(誰か確認したら教えて下さい)。

で、あとは、Docker for Windowsで作成した時と、同じディレクトリに移動して、

docker-compose restart

をすると、無事に動き出しました。

9. 総括

なんだか良く分かりませんが、Docker for Windowsを使っている環境であれば、それを残した状態で、この作業すると、随分手を抜けるかもしれません

移行した後に、Docker for Windowsをアンインストールすれば良いでしょう。

お試しあれ。

言うまでもありませんが、無保証です。


「ちょっと変なことが起っている話」の理由

Docker for Windows を起動すると、WSL 内で動作している Docker イメージの内容が変化する可能性があります。以下の理由が考えられます。


1. Docker for Windows は WSL 2 をデフォルトで使用

Docker for Windows(Docker Desktop)は、デフォルトで WSL 2 ベースのエンジン を使用します。
これにより、WSL 2 で管理されている Docker のデーモン(dockerd)が Docker Desktop の管理下に入る ため、起動時に設定や状態が変更されることがあります。


2. Docker デーモンの変更

Docker for Windows を起動すると、WSL 内の Docker の設定が次のように変わる可能性があります。

  1. Docker デーモンが変わる
    • もともと wsl -d Ubuntu などで WSL 2 内の dockerd を起動していた場合、Docker for Windows を起動すると Docker Desktop が管理するデーモンに切り替わる
    • これにより、ローカルの Docker デーモンが停止 する可能性がある。
  2. デフォルトのデータストアが変更
    • Docker for Windows を起動すると、デフォルトの docker データストアの場所が C:\ProgramData\DockerDesktop\ に変更されることがある。
    • それまで ~/.docker/var/lib/docker に保存されていたイメージやコンテナが正しく認識されなくなる場合がある。

3. ネットワークやストレージの影響

Docker Desktop は Windows 側のネットワーク設定やストレージマウントを変更するため、WSL 側の Docker コンテナに影響を与えることがあります。

  • ネットワークの影響
    • docker0 ブリッジの再設定や、NAT の適用によって WSL 内の Docker コンテナの通信方法が変わることがある。
    • WSL の IP アドレスが変化し、WSL 側で設定していたネットワーク設定が無効になる可能性がある。
  • ボリュームマウントの影響
    • WSL で /mnt/c のようにマウントしていたボリュームが、Docker Desktop の管理下で //wsl$/Ubuntu 経由でマウントされることがある。
    • これにより、Docker 内で期待していたファイルパスが変わる可能性がある。

4. WSL 2 のデフォルト設定が変更される

Docker for Windows の SettingsResourcesWSL Integration「Enable integration with my default WSL distro」 を有効にすると、
Docker のデフォルトデーモンが WSL 2 の docker-desktop ディストリビューションを経由 するように変更されます。

これにより、Docker Desktop を起動すると、docker images の一覧が変わることがあります。


5. 解決策

もし WSL 内の Docker 環境を変えたくない 場合は、次の方法を試してください。

  1. Docker Desktop を無効化
    • wsl --set-version Ubuntu 1 にして、WSL 2 ではなく WSL 1 を使う(WSL 1 では Docker Desktop 連携がない)。
    • Docker Desktop の WSL Integration 設定を無効化する。
  2. WSL 内で独立した Docker 環境を使う
    • Docker Desktop を使わず、WSL 内で dockerd を手動で起動し、独立した環境を維持する。
    • sudo service docker start で WSL 内で Docker デーモンを起動。
  3. Docker の context を使い分ける
    • docker context コマンドを使用し、Docker Desktop のデーモンと WSL 内のデーモンを使い分ける。
    docker context create wsl-docker --docker "host=unix:///var/run/docker.sock"
    docker context use wsl-docker

結論

Docker for Windows を起動すると、WSL で動作している Docker の デーモン・ネットワーク・ストレージ設定 などが変更され、docker images の結果が変わる可能性がある
WSL 内で独立した Docker 環境を維持したい場合は、Docker Desktop の WSL 統合を無効化するか、docker context を適切に設定すると良い。

ただ、これだと、Docker for Windowsをアンインストールできないんだよなぁ。

さらに検討.....

結局のところ、WSLのDockerから、Docker for Windowsで作ったディレクトリから、docker-compose down して、docker-compose up -d して作り直すのが一番てっとり早かった、というオチでした(私の場合)。

2025,江端さんの技術メモ

WindowsにGnuplotをインストールする手順を以下に説明します。


1. Gnuplotのインストールファイルをダウンロード

  1. 公式サイトにアクセス
    Gnuplotの公式サイト http://www.gnuplot.info/ にアクセスします。
  2. ダウンロードページを開く
    ページ内の「Download」セクションを見つけ、Windows用のインストーラを探します。
  3. Windows版のインストーラをダウンロード
    推奨されるダウンロードリンク(例: SourceForgeのWindows用バイナリ)から最新の安定版を選択し、インストールファイル(例: gnuplot-x.x.x-win64.exe)をダウンロードします。

2. Gnuplotのインストール

  1. インストーラを実行
    ダウンロードした .exe ファイルをダブルクリックして実行します。
  2. セットアップウィザード
    セットアップウィザードが開いたら、以下の手順で進めます:

    • 「Next」をクリック。
    • ライセンス条項を確認して「I Agree」をクリック。
    • インストール先フォルダを指定(デフォルトのままで問題ありません)。
    • 必要なコンポーネントを選択(デフォルト設定でOK)。
    • 「Install」をクリックしてインストールを開始。
  3. インストール完了
    インストールが完了したら「Finish」をクリックします。

2.1. PATH環境変数の設定(オプション)

コマンドプロンプトやPowerShellで簡単にGnuplotを実行するには、PATH環境変数にGnuplotのインストールディレクトリを追加します。

  1. 環境変数の設定を開く
    • 「スタート」メニューで「環境変数」と検索し、「システム環境変数の編集」を選択。
    • 「環境変数」をクリック。
  2. PATH変数を編集
    • 「システム環境変数」または「ユーザー環境変数」の Path を選択し、「編集」をクリック。
    • Gnuplotをインストールしたディレクトリ(例: C:\Program Files\gnuplot\bin)を追加。
  3. 保存して閉じる
    「OK」をクリックして変更を保存します。

2.2. インストール確認

  1. コマンドプロンプトを開く
    Win + R を押して「cmd」と入力し、Enterキーを押します。
  2. Gnuplotを起動
    以下のコマンドを入力して、Gnuplotが起動するか確認します。

    gnuplot

  3. バージョン確認
    Gnuplotのプロンプト(gnuplot>)が表示されるので、以下を入力してバージョンを確認します。
show version

 

2.3. 動作確認

インストールが成功している場合、以下のコマンドで簡単なプロットが表示されます。

plot sin(x)

これでGnuplotのインストールは完了です。

3. PTファイル(73.csv)の表示方法

以下の手順で Gnuplot スクリプトを保存し、73.csvを表示する方法を説明します(73.csvはファイルの一つにすぎません)


3.1. スクリプトをファイルに保存する

  1. 任意のテキストエディタを使用して、以下の内容をファイルにコピーします。
  2. ファイル名を plot_73.gnu など、わかりやすい名前で保存してください。

3.1.1. スクリプト内容 (plot_73.gnu)`)

# Gnuplot Script for 3D Plot# X, Y, Z 軸の範囲を設定
set xrange [130.3296537290101:130.56028128619576]
set yrange [33.49812295428995:33.67972606282988]
set zrange [0:1440]
# 軸ラベル
set xlabel "Longitude"
set ylabel "Latitude"
set zlabel "Time (Minutes)"

# タイトル set title "3D Plot of GPS Data"

# CSVのヘッダー行をスキップする設定
set datafile separator "," # カンマ区切りを指定
set key autotitle columnhead # ヘッダーをタイトルに使用(必要に応じて)

# データの3Dプロット
splot "73.csv" every ::1 using 9:8:($6*60+$7) with points pointtype 7 pointsize 1 lc rgb "blue" title "GPS Points"

 

3.2. スクリプトの実行方法

  1. スクリプトファイルの保存場所
    保存した plot_73.gnu ファイルと 73.csv ファイルを同じディレクトリに配置してください。
  2. Gnuplot の起動
    ターミナルを開き、Gnuplot を起動します。

    gnuplot

     

  3. スクリプトの実行
    Gnuplot のプロンプト (gnuplot>) 上で以下のコマンドを実行します。

    load 'plot_73.gnu'

     

  4. スクリプトが読み込まれ、プロットが表示されます。

3.3. 実行の自動化 (オプション)

ターミナルから直接スクリプトを実行できるようにするには、以下のコマンドを使用します。

gnuplot plot_73.gnu

これにより、Gnuplot を起動せずにスクリプトを実行できます。


3.4. 注意点

  • スクリプトで指定したファイル名 (73.csv) が正しいことを確認してください。
  • CSV ファイルの形式がスクリプトと一致している必要があります。
  • 必要に応じて 73.csv のパスをフルパスで指定することで、スクリプトと CSV が別のディレクトリにある場合でも動作します。

例:

splot "/path/to/73.csv" every ::1 using 9:8:($6*60+$7) ...

3.5. "73.csv"のサンプル

dailyid,year,month,day,dayofweek,hour,minute,latitude,longitude,gender,age
73,2023,4,9,7,8,40,33.307463,130.511456,,
73,2023,4,9,7,8,41,33.307477,130.512114,,
73,2023,4,9,7,8,41,33.305819,130.514793,,
73,2023,4,9,7,8,41,33.307467,130.511813,,
73,2023,4,9,7,8,45,33.306084,130.515009,,
73,2023,4,9,7,8,45,33.306151,130.515051,,
73,2023,4,9,7,8,54,33.309299,130.518183,,
73,2023,4,9,7,8,54,33.308469,130.517488,,