docker の snap パッケージをプロキシ環境で使う方法と、 compose で build エラーになる話

本記事は、 Docker/コンテナ仮想環境 Advent Calendar 2024 - Qiita 5日目の記事だ。

Linux で docker をインストールする場合、どのようにしているだろうか?
OS 標準のパッケージマネージャーからのインストールが一般的? それとも、 Docker 公式のリポジトリ (Install - Docker Docs) を使っているだろうか?

そんな docker インストールする方法のひとつに Snap (Snapcraft) がある。

Snap (Snapcraft) とは

Snap (Snapcraft) は、Canonical が開発・管理している、アプリケーションをパッケージ化して配布するためのシステムのひとつだ。 Canonical は Ubuntu を支援している企業だが、 Ubuntu 以外の多くの主要なディストリビューションでも Snap を利用できる。

依存関係を含む一式がコンテナ化されており、異なる Linux ディストリビューション間で共通のパッケージで動作するのが特徴だ。 サンドボックス化したファイルシステム内でインストールしたアプリケーションを動かすという、セキュリティ面の特徴もある。

snap 版 docker は、 /home/ 以下のファイルしか参照できない強い制限 1 や、インストール時に docker グループを作成してくれない制限があるが、それ以外はわりと問題なく動く。

Snap 版 docker に於けるプロキシ設定手順

プロキシの設定さえ適切に行えば、 snap 版 docker もプロキシ環境下で動作する。

基本的な設定箇所は、 Docker DaemonDocker CLI の設定と同じだが、前述のサンドボックス化の関係で、記述するファイルの場所が異なる。

具体的には

  • /etc/docker/daemon.json の替わりに /var/snap/docker/current/config/daemon.json
  • ~/.docker/config.json の替わりに ~/snap/docker/current/.docker/config.json

をそれぞれ書き換える。

特に後者 (~/snap/docker/current/* 以下) については、一度そのユーザーで何らかの docker コマンド (後述の例では docker info) を実行してから設定しなくてはならない。
そうしないと、フォルダが Snap サンドボックスへマッピングされないからだ。

では、インストールからの手順を追ってみよう

続きを読む

プロキシ環境下の Rust の入れ方と Rust Analyzer がコード補完してくれない問題の対処メモ

本記事は、 Rust Advent Calendar 2024 4日目 の記事だ。
ついでに、 Windows Advent Calendar 2024 4日目 の記事としても登録させてもらっている。

どちらもまだ空きが在るので是非登録してね!

Rust Advent Calendar 2024 シリーズ 2 の 3日目 の記事は、 @yo-naka 氏の Observable Framework のデータローダーを Rust で書く方法 #ObservableFramework
データ可視化用の静的サイトジェネレーター Observable Framework のデータローダーを、省メモリで高速に処理できる Rust で書くという内容だった。


さて4日目の本記事は、プロキシ環境下にて Windows + vscode + Rust Analyzer の組み合わせで使用しようとしたところ、標準ライブラリ等のコード補完が期待通り動いてくれなかった問題の対処メモだ。

ついでに、プロキシ環境下のセットアップ手順も示す。

再現手順

とりあえず、まずプロキシ環境下でセットアップしてみよう。
基本的に Windows - The rustup book の手順をベースにしている。

1) Build Tools for Visual Studio をインストール

Visual Studio の何らかのライセンス対象の場合 は、 Build Tools for Visual Studio をインストールする。
Visual Studio Installer

最低限、個別のコンポーネントで MSVC v14* - VS 20** C++ x64/x86 ビルド ツール (最新) と、 Windows 1* SDK をインストールしよう。


もし、 Visual Studio (非 vscode) の重量級 IDE を使うつもりがあるなら、 『C++ によるデスクトップ開発』 のワークロードをインストールすれば、上記コンポーネントも同時にイントールされる。

公式の手順では Visual Studio 2022 (MSVC v143) をインストールしているが、サポート期間が残っている Visual Studio 2017 (MSVC v141) などでも良いようだ。 1 2

Visual Studio のライセンスについて、少し補足をば。

プロキシの環境下にあるようなユーザーは、おそらく何らかの組織に所属しているような人だろう。

ビルドツールのライセンス条項 によると、 OSS の依存関係の中でビルドする場合を除くと、 Community, Professional, Enterprise のいずれかの Visual Studio ライセンスが必要だ。

個人開発者なら Community のライセンスが使えるものの、 250人 or 250台のPC or 収益 $100万 のいずれかを超える会社に所属したり、その下請けとして利用する場合など、「エンタープライズ利用」と分類される場合は、基本的に Professional, Enterprise が必要となる。

もし、 Visual Studio のライセンスが使えない場合、この手順はスキップして (2.5) の手順で rust の toolchain を stable-gnu に設定しよう。(後述)

2) rustup で Rust をインストール

Rust のインストールには Rustup を使おう。

PowerShell を起動し、以下を実行する。
ここで、 http_proxy, https_proxy 変数に設定するプロキシのアドレスは、環境にあわせて書き換える(以下同)。

$env:http_proxy = $env:https_proxy = 'http://proxy.example.com:8080';
winget install --id Rustlang.Rustup;

自動的に staube-msvc のツールチェインや、主要なコンポーネントがインストールされる

2.5) ツールチェインを stable-gnu に切り替える

(1) で Build Tools for Visual Studio をインストールしなかった人向け。
Build Tools for Visual Studio インストール済みの方はこの項を実行せず (3) にスキップ。

改めて PowerShell を起動し直し、以下を実行する。

# Visual Studio をインストールしなかった人のみ
$env:http_proxy = $env:https_proxy = 'http://proxy.example.com:8080';
rustup toolchain install stable-gnu;
rustup default stable-gnu;

3) vscode のセットアップ

vscode のインストールと、プロキシ回りの設定をしておく。

  1. Microsoft の Visual Studio Code のサイト から vscode をインストール
  2. vscode 上部のコマンドパレットで > Open user settings (json) と入力して settings.json を開き、以下の JSON 構造を追記。
    {
        "http.proxy": "http://proxy.example.com:8080",
        "terminal.integrated.profiles.windows": {
            "PowerShell": {
                "source": "PowerShell",
                "icon": "terminal-powershell",
                "env": {
                    "https_proxy": "http://proxy.example.com:8080",
                },
            },
        },
    }
    • 既に何らかの設定が入っていたら、 JSON 構造的にうまくマージしてくれ。
  3. vscode を立ち上げ直し、任意の(空の)フォルダを開く
  4. vscode の拡張機能で rust-analyzer をインストール

コード補完が効かない問題の発生

さて、コレで環境が整ったはず。

  1. vscode のターミナル上で cargo init などと入力し、任意の Rust プロジェクトを作成する
  2. 適当に main.rs のソースを書いてみる。
    #[derive(Debug)]
    struct Location(i32, i32);
    fn main() {
        println!("Hello, world!");
        let loc = Location(42, 42);
        let mut tvec = Vec::new();
        tvec.push(1);
        tvec.push(2);
        println!("{:?} {:?}", loc, tvec);
    }
  3. ターミナルでビルドと実行してみる。 cargo build cargo run
    • ちゃんと動いていそう。
      Hello, world!
      Location(42, 42) [1, 2]
  4. ところが、コード内で定義した型 (Location 構造体) の型推論は動いているのに、 標準ライブラリ (Vec::new) を使った方は型推論もされず {unknown} となることに加えコード補完も動かない。

    • rust analyzer は以下のようなエラーまで吐いている。
      ERROR error="can't load standard library from sysroot\n{sysroot_path}\n(discovered via rustc --print sysroot)\ntry installing the Rust source the same way you installed rustc"

うーん…

原因

エラーメッセージ上は、 {sysroot_path} の設定 (vscode の設定上の rust-analyzer.cargo.sysroot など) に rustc --print sysroot で出力した内容を記述すればうまく動きそうだが、それは上手く行かない。

そもそもの原因は単純で、 rust-analyzer がプロキシの設定を読めていない為だ。

vscode は以下の 3箇所 でプロキシの設定がある。

  1. vscode 本体 (拡張機能のインストールなど) は、 OS のプロキシ設定を読む
  2. vscode の拡張機能などは(本来)、 vscode の設定の http.proxy を読む
  3. vscode のターミナルは、 vscode の設定の terminal.integrated.profiles.windows.*.env を読む

本来 rust-analyzer は (2) のプロキシ設定を解釈すべきなのだが、どうも無視してしまうようだ。

厳密には、 非HTTP 通信には適用されているものの、 HTTPS 通信には適用されないため、 HTTPS で配信されているコンポーネントやクレートが落とせないのが問題なようだ。

対策

vscode プロセスそのものの環境変数に https_proxy を設定すれば、解消する。

方法1:

Windows 側のシステムまたはユーザーの環境変数に、上記値を設定する。

多分これが一番手っ取り早いのでオススメ。

但しすべてのアプリに影響してしまうので、場合によっては他のイントラネットアプリが動かなくなってしまうこともあるだろう。

方法2:

一回だけ vscode を立ち上げる際に、プロセス環境を設定する。

具体的には、 PowerShell 上で一時的な環境変数を設定し、カレントディレクトリを移動したあと、 code . で vscode を立ち上げる。

$env:https_proxy = 'http://proxy.example.com:8080';
cd 'path\to\project_dir';
code .;

一度上記環境で vscode の rust-analyze が起動すれば、標準ライブラリのコード補完に必要なコンポーネントやクレートはダウンロードされる。
このため、次回起動時に通常通り vscode 立ち上げても、引き続きコード補完は期待通り動く。

但し、 Cargo.toml を書き換えて依存クレートが変更されると、変更後の依存関係の情報の更新に失敗するので、そのときはまた環境変数を設定した vscode に立ち上げ直す必要がある。

対策後

上記いずれかの対策を行って、 rust-analyze 内部の Cargo のモジュール解決が済めば、以下のように正しく型推論やコード補完が実行されるようになるはずだ。


  1. 当然、ビルド時にリンクされる Visual C++ 再頒布可能パッケージ のバージョンも変わるので注意。 

  2. エンタープライズ利用のライセンスの緩い Visual Studio Express を使う手もあるようだ → Rust + Visual Studio 2017 Expressで環境構築 #Windows - Qiita 

バッチや JScript に PowerShell を埋め込んでダブルクリックで起動する Polyglot 色々

本記事は、 シェルスクリプト&PowerShell Advent Calendar 2024 2日目の記事だ。
まだまだ始まったばかり。 執筆者求む、執筆者!


さて、 PowerShell スクリプトファイル (.ps1) は、 WSH や Office VBA のウイルス蔓延を許した反省からか、 Windows の標準ではスクリプトファイルをダブルクリックしても実行できない。
ただ、これだと人にファイルを渡して実行してもらうのに手間がかかるので、特別な関連付け設定をせずダブルクリックで実行できる PowerShell スクリプトを作りたい。

ひとつのスクリプトファイルを、異なる複数のプログラミング言語で正しく解釈できるように書く、 Polyglot というテクニックがある。
そういったテクを活用して、「ダブルクリックで起動できるバッチやスクリプトを使って、自分自身を PowerShell スクリプトと解釈させて実行」する単一ファイルを作成する方法をいくつか考えてみよう。

仕組み上、 PowerShell スクリプトファイル (.ps1) を介さないので、以下のような制限がある。

  • 標準入力を受け付けられない (パイプ先になれない)
  • PowerShell 的にはスクリプトファイルを実行しているわけではないので、 $PSScriptRoot, $PSCommandPath, $MyInvocation.MyCommand.Path あたりが空になる

このため以降で紹介するどのパターンでも、自身のファイルのフルパスを環境変数 SCRIPT_PATH に入れてから PowerShell を呼び出している。
PowerShell スクリプト内では $env:SCRIPT_PATH を呼び出すことで、少なくとも後者の問題については回避できる。

コンソールウィンドウありバッチファイル

続きを読む

Hyper-V で「リンクしたクローン」の VM を作成し、容量を節約する

本記事は、 Windows Advent Calendar 2024 初日の記事だ。
今年もついに始まった技術記事の Advent Calendar シーズン。 みんなこぞって参加しよう!!!


突然だが、 VirtualBox や VMware には、 "リンクしたクローン" という機能がある。

例えば、同じ OS のサーバーを 10台 用意する必要がある際に、まず1台キッティングした後にこの機能を使って複製すると、仮想HDDのサイズを大幅に節約することができる。

Hyper-V には同じ機能は用意されていないのだが、「差分ディスク」という機能を使えば、似たようなことを実現できる。 1

流れ:

  1. 仮想マシン作る
  2. 自動チェックポイントを外す
  3. キッティング
    • Windows ならページングファイル(仮想メモリ)サイズを小さめに (256-512MB)
    • 仮想 DVD ドライブからメディアを取り外し
  4. チェックポイントを作成
  5. 差分ディスクだけ作成
  6. 仮想マシンを差分ディスクを指定して作成

ただし、 VirtualBox などと異なり、任意のチェックポイントからの差分は作成できない。
必ず初回のチェックポイントからの差分となる。

では、細かい手順を見ていこう。

仮想マシンを作る ~ キッティング

続きを読む

最も公式な情報で MAC アドレス の OUI を検索し共有する

MAC アドレスの 上位3オクテットは、 OUI(Organizationally Unique Identifier)と呼ばれていて、製造業者にユニークな値が割り当てられている。

OUI からそのデバイスのメーカーが推察できるので、ネットワーク上で通信しているデバイスの範囲を絞り込むために、度々 OUI とそれに紐付く会社の関係を調べたくなる。

そのような情報は様々な場所で提供されているが、 OUI は IEEE に料金を支払って割り当ててもらうモノなので、 IEEE Standards Registration Authority が最も公式な情報となる。

このページでの OUI の検索結果を共有したい。

共有方法

続きを読む

k8s ミリしら向けの AWX on MicroK8s with プロキシ

Docker ぐらいならなんとかわかるけど、 Kubernetes (k8s) は全然わかっていない人向けに、プロキシ環境下の MicroK8s 上で AWX をインストールする手順と、その周囲情報を説明していく。

AWX とは

AWX とは、 Ansible Automation Controller (旧称: Ansible Tower) と呼ばれる Ansible の構成コードの実行を管理する WebUI を持ったツールの OSS版だ。

Ansible とは IaC (Infrastracture as Code) ができる CUI ツールであり、構成先に Python さえ入っていれば、そこに ssh するだけで実行できるのが特徴だ。
AWX はこれを Git などのソースコード管理ツールと連携しながら、 Web UI 上で実行・管理・記録できるツールとなる。

Ansible Automation Controller と比べると、 Red Hat によるサポートや LTS はなく、 ローリングリリースモデルを採用していて更新が激しい。
このため、エンタープライズ用途には基本的には向かないものの、元々そんなに破壊的変更が頻繁にあるタイプのツールではないため、小規模に使う程度ならかなり実用的になっている。
(但し 2024年9月現在、次回のメジャー更新の v25 あたりで、認可・認証の内部構成が大きく変わる予定ではある 1)

Kubernetes と MicroK8s

AWX を運用環境にインストールするには、 Kubernetes が必須となっている。

Kubernetes (多くは K8s と略される) は、コンテナ管理ツールのひとつで、コンテナオーケストレーションツールとも呼ばれる。

コンテナ管理といえば、 Docker が非常に有名だ。
Docker はどちらかというと開発者よりのツールで、一つのコンテナないし、 Docker Compose を使って一つのホスト(マシン)内に閉じた複数のコンテナの管理に特化している。

一方、多少規模のあるサービスをコンテナで運用する場合、複数ホストにまたがっていくつものコンテナを協調動作させる場合が多い。

Kubernetes であれば複数のホストに跨がって複数のコンテナを協調操作させる運用管理ができる。
例えば・・・

  • 異なるホストで動作しているコンテナを、同じ仮想ネットワークにあるかのように扱う
  • 負荷に応じてコンテナをスケーリングする
  • コンテナ起動やダウン時の自己修復や負荷分散のロジック等を自分で作り込む

といった事ができる。

続きを読む

Ventoy ブート時の Verifiying shim SBAT data エラーのワークアラウンド

久々に、 Ventoy: A New Bootable USB Solution をブートしようとしたら、以下のようなエラーが発生してしまった。

Verifiying shim SBAT data failed: Security Policy Violation
Something has gone seriously wrong: SBAT self-check failed: Security Policy Violation

スペルのブレで場合によっては以下の表記となっているかもしれない。

Verifying shim SBAT data failed: Security Policy Violation
Something has gone seriously wrong: SBAT self-check failed: Security Policy Violation

どうやら、セキュアブートをサポートする UEFI 環境で起動しようとすると、上記エラーが発生するようだ。

本記事執筆時の Ventoy 最新版 1.99 では修正されていない。
もしかしたらより新しいバージョンでは修正されているかもしれないので、古いバージョンを使用しているなら、まずはバージョンアップを試してみよう。

ただ、大分前 (2023年12月) から問題になっているのに、 Ventoy 側にはこの修正が反映されていない。
このため、この問題のワークアラウンドについて紹介しよう。

ワークアラウンド方法1) セキュアブートを無効にする

単純な話、セキュアブートでエラーになっているのだから、 UEFI 設定でセキュアブートを無効にしてしまえば良い。

続きを読む

WESTER のキャンペーンポイントが付与される日

最近、 JR西日本の WESTER ポイントがアツい。

そんな WESTER ポイントの貯め方の主要な方法のひとつが、各種キャンペーンで付与やポイント還元だ。

キャンペーンの詳細を見ると、こういった特典ポイント進呈時期は、 ○月下旬予定 となっている。
下旬って、具体的に何日なんじゃい。

ポイント使って旅程考えたり、ポイントを使ったお得な切符を買う事を考えると、いつ頃付与されるのか知っておきたいというもの。
たまたま、私と知り合いが異なる月で J-WESTカードご入会キャンペーン に申し込んだところ、異なる月の同じ日付に付与されたので、参考までに紹介しよう。

その日付は、 26日 だった。

26日の0時にすぐ付与されるわけではなく、午前中の時間のどこかで付与処理が走るようだ。
また、今回付与を確認した月はいずれも26日が平日だったので、もし26日が週末だったりすると1~2日前後するかもしれない。


…とまぁ、今回の記事の主たる内容は以上なのだが、これで記事をお終いにしてしまうと少し物足りないので、『WESTER ポイントがどうアツいのか』を少し補足しておこう。

WESTER ポイントとは

続きを読む

Hyper-V 等の VM 上にプロキシと DNS を立てる

本ブログでは、ちょいちょいプロキシ環境下での設定方法を紹介しているが、
そういったプロキシ環境下での動作の検証のため、以下を満たすプロキシサーバーを立てたい。

  • OS は Ubuntu 24.04
  • squid によって 8080 ポートにて HTTP プロキシする
  • bind9 によって自身のアドレスを proxy.example.com として名前解決する DNS サーバーとなる

とりあえず、 squid と bind9 をいれて、設定ファイルを必要最低限書き換えてみよう。

export CURRENT_IP_ADDRESS=`hostname -I | tr -s ' ' '\n' | tail -n 1`
sudo apt update
sudo apt -y install squid bind9 bind9utils
sudo sed -i -r -e 's/^(#\s?)?(http_access allow localnet)/\2/' -e 's/^http_port 3128/http_port 8080/' /etc/squid/squid.conf
sudo sed -i -e 's%^\s*\(//\)\?\s*forwarders {%        forwarders {\n                8.8.8.8;\n        };\n\0%' -e 's%^};%\0\nzone "proxy.example.com" in {\n  type master;\n  file "proxy.example.com.zone";\n};%' /etc/bind/named.conf.options
sudo tee /var/cache/bind/proxy.example.com.zone << EOF > /dev/null
\$TTL 86400
@       IN      SOA     proxy.example.com. root.proxy.example.com. (
                        2023070301      ;Serial
                        3600            ;Refresh
                        1800            ;Retry
                        604800          ;Expire
                        86400           ;Minimum TTL
)
@       IN      NS      proxy.example.com.
@       IN      A       $CURRENT_IP_ADDRESS
EOF
sudo systemctl restart squid named

これだけ。

解説

続きを読む

SwitchBot S10: 初ロボット掃除機の実利用レビュー

SwitchBot お掃除ロボット S10 を購入し、1ヶ月ほどガッツリ使ってみたので、そのレビューをしてみようと思う。

これまで長年 dyson のスティック掃除機を使っていた層なので、そこからの乗り換えの観点で良し悪しや、妥協しなければならない注意点などをまとめている。

ざっくりまとめると、

良い点は

  • 水拭きがストレスフリー
  • 想像よりマッピングがかなり賢い
  • 段差の乗り越え能力が高い
  • お手入れ時期をアプリが教えてくれるのがものぐさに嬉しい

気を付ける点は

  • 我が家の椅子の下がギリギリ通れない
  • 2回掃除させた方が良い
    • 吸引力マックスで2回はバッテリーが保たない
  • カーテンを押しのけてくれない
  • Google Assistant 連携が不完全

というところ。

詳しく見ていこう。

SwitchBot お掃除ロボット S10 の特徴

S10 の特徴は「水拭きの給排水含め真の全自動」の一言に尽きる。
SwitchBot お掃除ロボット S10 | 世界初革新的な「水道直結⤫リアルタイムモップ洗浄設計」

以前から水拭き対応のロボット掃除機には興味はあったが、毎回手動でのウェットシートの付け替えや、頻繁なタンクの汚水交換など、手間が必要なものばかりだった。
我が家の大人はものぐさなので、そんな面倒なのはすぐに使わなくなるのが目に見えていた。
排水をサボったら、タンクにカビまみれになりかねない。そんなのはゴメンである。

ところが、 2023年にクラウドファンディングが発表された S10 は違った。

洗濯機のバンの前に電源不要な給排水用のウォーターステーションを設置するだけで、給水・排水に加え、モップの洗浄や乾燥までやってくれる。
「これなら我が家でも運用できるかも!?」と思わせる物だった。

クラファンは EarlyBird でも $900 、今の円安だと15万円近くと流石に高額過ぎたので、国内の正式発売を待っていた訳だ。

SwitchBot のロボット掃除機シリーズ

現在、 SwitchBot のロボット掃除機には、

  • S1 (S1/S1 Plus W)
  • K10 (K10+)
  • S10

の3シリーズある。

名前が似ていてややこしい上、一部(買いもしないでレビューしてる)質の悪い記事では、 S10 と K10 を混同して書いていたりするので、注意が必要だ。

主な違いは以下の通り。

続きを読む