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,,

2025,江端さんの技術メモ

$ go run . > NUL 2>NUL

でも"NUL"というファイルができてしまうました。

で、今、以下を試しています。

cmd ではなく PowerShell で実行する場合、$null を使用できます。

go run . *> $null

2025,江端さんの技術メモ

今で言う投稿サイトに"fj"というものがありました。

There was a posting site called “fj” back then.

かつて、そこでは、『「ナンバーディスプレイ通知」の是非』について、熱い議論が交されていました。

In the past, there were heated debates about the pros and cons of “number display notification.”

「ナンバーディスプレイ通知」とは、相手先の電話番号がスマホに表示されることです。

'Number display notification' is when the other party's phone number is displayed on your smartphone.

今となっては、『何のために、そんな議論をしていたんだろう』と思われるかもしれません。

Now, you may be thinking, 'What was the point of all that discussion?

ですので、当時のことを思い出しながら書いてみます。

So, I'll try to write about it while remembering what happened back then.

-----

(1)プライバシー保護: 発信者の番号通知がプライバシー侵害につながる可能性が懸念された。

(1) Privacy protection: There were concerns that caller ID could violate privacy.

(2)受信者の権利: 受信者の利便性と発信者の匿名性の対立が議論された。

(2) Recipient's rights: The conflict between the recipient's convenience and the sender's anonymity was discussed.

(3)迷惑電話対策: 迷惑電話抑止の利点と偽装番号などの新たな問題が指摘された。

(3) Measures against nuisance calls: The benefits of discouraging nuisance calls and new problems, such as spoofed numbers, were pointed out.

(4)法的・技術的課題: 技術や料金、法整備が利用者の選択肢に影響を与えるとされた。

(4) Legal and technical issues: Technology, fees, and legal developments are said to affect users' choices.

(5)社会的影響: ナンバーディスプレイ普及によるコミュニケーションの変化が懸念された。

(5) Social impact: There were concerns about changes in communication due to the spread of number display.

-----

今となっては、「相手先の電話番号が表示されない」ということ自体、意味が分からないと思うのですが、当時は、『発信者のプライバシーを保護する』という、考え方があったのです。

Nowadays, I find it incomprehensible that the other party's phone number is not displayed, but at the time, there was a concept of 'protecting the privacy of the caller.'

この議論は、「ナンバーディスプレイ通知サービス = 是」とする側が優位だったように記憶しております。

I remember that the side that said “Number Display Notification Service = Good” was in the majority.

理屈はシンプルでして「ナンバーディスプレイ通知 = 非」とする人は、ナンバーディスプレイ通知サービスを使わなければ、それで足るだろう、という理由でした。

The logic is simple: if you don't use the number display notification service, it should be sufficient to set “number display notification = bad.”

ただ、これを個人の自由選択の問題に矮小化してしまえば、『発信者のプライバシーを保護する』という考え方そもののが消滅することが公共の利益に反する、という主張もあり、私は、それはそれで一理あったと思います。

However, suppose this is reduced to personal freedom of choice. In that case, there is also the argument that the idea of 'protecting the privacy of the sender' itself will disappear, which is contrary to the public interest, and I think that has a point.

この問題は「SNSの匿名性」の問題と形を変えて、引き継がれているように思います。

This problem has been passed on differently as the “anonymity of SNS” problem.

今は、(1)完全キャッシュレス決済、(2)現金決済との併存、という意見の論争があるようです。

There seems to be a debate between the opinions of (1) utterly cashless payment and (2) coexistence with cash payment.

これについては、調べて頂ければ、双方、説得力のある論が展開されていますので、興味のある人は調べて下さい。

If you investigate this, you will find that both sides have developed persuasive arguments. Please do so if you are interested.

-----

私が思い出すのは「地上デジタル放送」への切替の時の話です。

I remember the story of the switch to terrestrial digital broadcasting.

政府は10年も前から、切替を宣言していました(地上デジタル放送への完全移行を2011年7月24日に実施しましたが、この切替計画については約10年前の 2001年 から公知し、その10年間を移行期間としていました)。

The government had been announcing the switchover for 10 years (the complete switchover to terrestrial digital broadcasting was carried out on July 24th, 2011, but the switchover plan had been publicized about 10 years ago in 2001, and the 10 years was set aside as a transition period).

で、いざ「地上デジタル放送」への切替を行う1月前くらいから、マスコミは「高齢者や貧困者」を盾にした「地上デジタル放送反対キャンペーン」を実施はじめました。

So, about a month before the switch to terrestrial digital broadcasting, the media began to run a campaign against terrestrial digital broadcasting, using older people and people with low incomes as a shield.

当然、政府はそれに応じませんでした。

Naturally, the government did not respond.

さすがに、この件に関しては、私は『政府は悪くない』と思いましたよ。

As expected, I thought the government was not to blame.

だって、10年間も移行期間があったんですよ。こればかりは『いざとなったらゴネればなんとかなる』は、通用しないと思いました。

After all, there was a 10-year transition period. In this case, the saying “if push comes to shove, you can make do by complaining” wouldn't work.

私が覚えている限り、この騒ぎは、切替から1~2週間後にはニュースにも出てこなくなりました。

As far as I can remember, this commotion stopped appearing in the news after the switchover, which took place a week or two ago.

大した手間ではなかったからでしょう(あるいは、テレビがなくても何とかなることが、分かったのかもしれません)。

It probably wasn't much trouble (or maybe they realized they could manage without a TV).

-----

今年は「マイナンバーカード」で、一悶着おきそうな感じがしますが、多分、これも「地上デジタル放送」と同じような結末になるだろうと予想しています。

This year, there has been much fuss about the My Number Card, but I think it will probably be like terrestrial digital broadcasting.

2025,江端さんの技術メモ

以下は現在TCをインストールして設定したラズパイのifconfigです。

pi@raspberrypi:~$ ifconfig
br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.0.88 netmask 255.255.255.0 broadcast 192.168.0.255
inet6 fe80::ba27:ebff:fe69:5b65 prefixlen 64 scopeid 0x20<link>
inet6 240f:30:a9ce:1:ba27:ebff:fe69:5b65 prefixlen 64 scopeid 0x0<global>
ether b8:27:eb:69:5b:65 txqueuelen 1000 (Ethernet)
RX packets 10040 bytes 750155 (732.5 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1326 bytes 166549 (162.6 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

eth0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
ether b8:27:eb:69:5b:65 txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
ether f4:4d:ad:04:49:d5 txqueuelen 1000 (Ethernet)
RX packets 11626 bytes 1414469 (1.3 MiB)
RX errors 0 dropped 4 overruns 0 frame 0
TX packets 1326 bytes 166549 (162.6 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 6 bytes 234 (234.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 6 bytes 234 (234.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::ba27:ebff:fe3c:e30 prefixlen 64 scopeid 0x20<link>
ether b8:27:eb:3c:0e:30 txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 23 bytes 3164 (3.0 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

eth0 → eth1 の方向に bitrateを500
eht1 → eth0の方向にbitrateを300
で設定したい時、入力するコマンドを、 既存の設定をクリアにするところから教えて下さい

以下の手順で、既存の設定をクリアし、eth0からeth1の方向にビットレート500kbps、eth1からeth0の方向にビットレート300kbpsを設定できます。


1. 既存のtc設定をクリアする

まず、eth0eth1tc設定を削除します。

sudo tc qdisc del dev eth0 root 2>/dev/null
sudo tc qdisc del dev eth1 root 2>/dev/null

2. eth0 → eth1 のビットレートを500kbpsに制限する

eth0tcを設定します。

sudo tc qdisc add dev eth0 root handle 1: htb default 1
sudo tc class add dev eth0 parent 1: classid 1:1 htb rate 500kbit ceil 500kbit

3. eth1 → eth0 のビットレートを300kbpsに制限する

eth1tcを設定します。

sudo tc qdisc add dev eth1 root handle 1: htb default 1
sudo tc class add dev eth1 parent 1: classid 1:1 htb rate 300kbit ceil 300kbit

4. 設定確認

以下のコマンドで設定を確認できます。

sudo tc -s qdisc show dev eth0
sudo tc -s qdisc show dev eth1

5. オプション: 遅延やパケットロスを追加する場合

例えば、遅延やパケットロスを追加したい場合は、以下のように設定します。

eth0 → eth1 に遅延を追加(例: 50ms)

sudo tc qdisc add dev eth0 parent 1:1 handle 10: netem delay 50ms

eth1 → eth0 にパケットロスを追加(例: 10%)

sudo tc qdisc add dev eth1 parent 1:1 handle 10: netem loss 10%

この設定により、双方向の帯域制御が行われます。必要に応じて、burstlatencyのオプションを追加してください。