日記

日本語の勉強のためのブログ

【Vagrant】provisionを用いてzsh+preztoを自動セットアップ

目標

vagrant upするだけで

  • デフォルトのシェルがzsh
  • preztoのセットアップも完了している

ような環境を実現する。

はじめに注意

初期状態ではroot権限でprovisionスクリプトが実行されるので、スクリプト内の$HOME/rootに置換されてしまう *1
今回はこの仕様がpreztoセットアップの妨げになるため、Vagrantfileのconfig.vm.provisionprevileged: falseを指定し、一般ユーザ(vagrant)で実行されるようにしておく。

config.vm.provision "shell", privileged: false, path: "./vagrant_init.sh"

参考: qiita.com

作成したVagrantfileとprovision用スクリプト

Vagrantfile

# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure("2") do |config|
  config.vm.box = "generic/ubuntu2204"
  config.vm.synced_folder "./share", "/share"
  config.vm.provision "shell", privileged: false, path: "./vagrant_init.sh"
end

vagrant_init.sh

#!/bin/sh
sudo apt update -qq
sudo apt install -y -qq zsh git

# === zsh ===
## "setopt EXTENDED_GLOB"はpreztoインストール時に自動設定されるので書かなくてよい
git clone --recursive https://github.com/sorin-ionescu/prezto.git $HOME/.zprezto
## https://qiita.com/honono-bonono/items/66c37d99ffddc66d3a06
ln -s $HOME/.zprezto/runcoms/zlogin    $HOME/.zlogin
ln -s $HOME/.zprezto/runcoms/zlogout   $HOME/.zlogout
ln -s $HOME/.zprezto/runcoms/zpreztorc $HOME/.zpreztorc
ln -s $HOME/.zprezto/runcoms/zprofile  $HOME/.zprofile
ln -s $HOME/.zprezto/runcoms/zshenv    $HOME/.zshenv
ln -s $HOME/.zprezto/runcoms/zshrc     $HOME/.zshrc
sudo chsh -s $(which zsh) vagrant

*1:たとえば今回の例では、"git clone *.git $HOME/.zprezto"を実行すると、/home/vagrant/.zpreztoではなく/root/.zpreztoにダウンロードされてしまう

Vagrantを使って仮想マシンの初期設定を自動化する

注意

GUI仮想マシンUbuntu Desktopなど)は対象としていません。

はじめに

訳あってVirtualBox上のUbuntu仮想マシンUbuntu Server)を使用する必要が出てきた*1が、初期設定が非常に面倒である。
そこでVagrantを導入し、自動で仮想マシンを作成してもらうことにする。さらに作成後のパッケージ追加なども自動化する。

環境

1. VagrantVirtualBoxのインストール

winget*2を使うことで即座にインストールが完了する。

# PowerShellで以下を実行
winget install Oracle.VirtualBox Hashicorp.Vagrant

インストール完了後、再起動する。

2. Vagrantfileの作成

Vagrantでは、Vagrantfileの記述に沿って仮想マシンが自動的にセットアップされる。
Vagrantfileを作成するには、適当なディレクトリでvagrant init <Box名>を実行すればよい。
ここでBoxとは、仮想マシンのベースとなるimageを指している*3。とりあえずはDockerのimageと同じような解釈でいいと思う。

たとえば、bento/ubuntu-22.04というBoxを使用するためのVagrantfileを作成するには、以下を実行すればよい。

# PowerShellで以下を実行
vagrant init bento/ubuntu-22.04

3. Vagrantfileの追記

今回は仮想マシン作成後のパッケージ追加まで自動化したいので、Vagrantfileの末尾にあるconfig.vm.provisionあたりを修正する。
provisionを設定することで、マシン作成後に実行してほしいコマンドを指定できる。

たとえば、apt updateapt install vimを実行してほしい場合、Vagrantfileを次のように修正する。

(前略)
  # Enable provisioning with a shell script. Additional provisioners such as
  # Ansible, Chef, Docker, Puppet and Salt are also available. Please see the
  # documentation for more information about their specific syntax and use.
  config.vm.provision "shell", inline: <<-SHELL
    apt update
    apt install -y vim
  SHELL
end

補足:default: SSH auth methodで止まる・タイムアウトする場合

さまざまな解決法があるようだが、自分の環境では以下の記事を参考にしたら解決した。

qiita.com

ただ、別のBoxを試したほうがいい気もする。ちなみに自分の環境ではgeneric/ubuntu2204なら止まらず動作した。

(追記)
vagrant up --debugデバッグ情報を出力するようにしたところ、成功率が上がった気がする。

4. 仮想マシンの立ち上げ

ここまで来たらvagrant upを実行することで、初期設定と立ち上げが自動実行される。
立ち上げ後、vagrant sshを実行すればターミナルにアクセス可能である。

ちなみに仮想マシンを止めたい際はvagrant haltを実行すればよい。

補足:ホスト側のディレクトリをマウントする

これもVagrantfileの書き換えで可能。ゲスト側のディレクトリの場所は絶対パスで書く必要があるとのこと。

(前略)
  # Share an additional folder to the guest VM. The first argument is
  # the path on the host to the actual folder. The second argument is
  # the path on the guest to mount the folder. And the optional third
  # argument is a set of non-required options.
  config.vm.synced_folder "../host_directory", "/guest_directory"
(後略)

*1:訳ありでDockerやWSLは使えない

*2:簡単に言えば、Ubuntuで言うaptのようなもの

*3:https://developer.hashicorp.com/vagrant/tutorials/getting-started/getting-started-boxes

【Win11】クリーンインストール後にwingetが使えない

問題

以前のPCに入っていたソフトをwingetで一括導入しようとしたところ、

PS C:\Users\user> winget import -i hoge.json
\
PS C:\Users\user>

(注:2行目以降は実際は青色で表示される)

としか表示されず、いつまで経ってもインストールされない。
なおwinget listwinget search hogeを実行しても同様の現象が起こるものの、winget -vwinget settingsは正常に実行できる。

解決法

Microsoft StoreでApp Installer(アプリインストーラー)をアップデートする。

Google以外の検索エンジンを使ってみよう

Google検索はその検索精度の高さや使いやすさもあり、広く一般に利用されている。とくに画像検索の優秀さは目を見張るものがある。
しかしプライバシーやカスタマイズ性を考えると問題点もある。

  • カスタマイズ性が低い
  • 広告に関する問題
  • プライバシーの問題
    • uBlock Originを見ると驚くほどトラッキングされていることがわかる
    • フィルターバブルの問題も指摘されている

そこで現在では、こうした問題点を改善した様々な検索エンジンが誕生している。
この記事ではそれらの検索エンジンを実際に利用して感じた長所や短所を記載する。

DuckDuckGo

Startpage

  • 長所
    • google検索を利用しており検索精度が高い
    • Webプロキシを標準搭載している
    • 安定性もそこそこ
  • 短所
    • 動作が重く、検索に数秒かかる
    • 特定の検索クエリにはエラーを返す
      • おそらくクエリが長すぎる場合だと思う

SearXNG

  • 長所
    • 様々な検索エンジンの検索結果を利用することができる割に動作が軽量
    • 設定を非常に細かく指定でき、 検索画面のレイアウトも変更可能
    • 一応!bangも搭載
    • インスタンスごとに機能が違ったりするので自分にあうものを探すのが楽しい
      • 例えばsearch.ononoki.orgではWebプロキシが搭載されているなど
  • 短所
    • 安定性に欠ける
      • インスタンスでも安定性は異なるが、以下のようなエラーを吐いて利用不能になることが多い
エラー! エンジンは結果を取得できません:
google ( 一時停止: アクセスが拒否されました )

まとめ

  • 安定性で言えばDuckDuckGo、もしくはStartpage
  • 動作の軽量さで言えばDuckDuckGoやSearXNG
  • 検索精度で言えばStartpageやSearXNG
  • カスタマイズ性の高さで言えばSearXNG

これらすべての性質を満たす検索エンジンはおそらく現状存在しないので、どれを重視するかで利用するものは変わってくる。
自分はStartpage→SearXNG→DuckDuckGoの順で利用してきたが、どれも一長一短があるため、定期的に使うエンジンを変えている。ちなみに現在は安定性と精度をとってStartpageを使用している。

今回挙げた3つ以外にも様々な検索エンジンが存在する(参考:Wikipediaに記事があるもの一覧)。それらについても今後使用してみたい。

付録:各検索エンジンの設定可能項目まとめ&比較

あとで書く。

【VSCode】Dockerコンテナにアタッチできないエラー

問題

VSCodeでDockerコンテナにアタッチしようとすると,突如以下のエラーが出て失敗するようになった.

Error running command remote-containers.attachToRunningContainerFromViewlet: The operation was aborted. This is likely caused by the extension that contributes remote-containers.attachToRunningContainerFromViewlet.

環境

解決法

Dev Containersのバージョンを下げる. どうやら数時間前にアップデートされていたようで,これが問題になっていた.

具体的には,「拡張機能: Dev Containers」のページから「アンインストール」の横の▽を押して「別のバージョンをインストール」を選択することでバージョンを下げられる.
1つ前のバージョン(v.0.309.0)をインストールしたところ,無事解決した.

図1. 別のバージョンをインストールする方法

教訓

  • 拡張機能絡みの問題が発生した場合,最近アップデートされたかどうかを確認する.