日記

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

パーティションの移動

中古PCを買ったら1つのSSDがCドライブとDドライブに分割されていた。
個人的にDドライブは使わないため、Cドライブに統一しようとしたが、

EFIシステムパーティション:Cドライブ:回復パーティション:Dドライブ

のようにC・Dドライブが隣り合っておらず、簡単にはマージできない。

図1. 購入時のパーティションの様子(ディスク0に注目。なおDドライブのパーティションはすぐ削除してしまったため、未割り当てと記載されている)

買ってすぐなので初期化も構わないと考え、少々強引な方法でドライブの統合を行うことにした。

環境

  • Windows 11 Pro
    • Homeエディションでもいけると思う

方法

1. 回復ドライブの作成

失敗したときのお守りを作っておく。 あくまでも起動すらしなくなった際のお守りであり、基本的に使うことはないと思うが一応。

2. パーティションを移動

適当なソフトを使って移動する。今回は以下に沿って「AOMEI Partition Assistant Standard」というソフトを使用した。これで正常に統合できれば終了だが…

www.diskpart.com

非常にわかりやすく直感的に移動できたのはいいが、回復パーティションの表示がおかしくなっている

図2. 移動後のパーティションの様子。「正常(回復パーティション)」という表記が消えている

追記:diskpartで確認したところちゃんと回復パーティションとして認識されていた。実際に回復環境も動作するようなので問題なさそう。

図3. diskpartでの確認結果

M5Stack core2で能登地方の強震モニタを表示する

余震が続いているのもあり、Vivaldiのウェブパネルに強震モニタを表示しているが、常時表示しておくのが面倒なのでM5Stack core2にやらせたい。
全国版の強震モニタについてはM5Stack(core2ではない)で作成された方がいらっしゃる↓ため、これをcore2に移植しつつ、能登地方バージョンに改変する。

www.ria-lab.com

作成した能登地方バージョンはGitHubに置いた。

github.com

以下、移植時の改変点などを記載する。

ボード情報やライブラリの変更

ボード情報やライブラリ名をcore2用に書き換える必要がある。書き換え後は以下の通り。

main.cpp<M5Stack.h><M5Core2.h>に置換)

#include <AnimatedGIF.h>
#include <Arduino.h>
#include <HTTPClient.h>
#include <M5Core2.h>
#include <WiFi.h>
#include <WiFiMulti.h>
(後略)

platformio.ini

[env:m5stack-core2]
platform = espressif32
board = m5stack-core2
framework = arduino
monitor_speed = 115200
lib_deps = 
    bitbank2/AnimatedGIF@^1.3.2
    paulstoffregen/Time@^1.6
    mbed-kazushi2008/HTTPClient@0.0.0+sha.cf5d7427a9ec
    m5stack/M5Core2@^0.1.8

※なお、monitor_speedについてはシリアルモニタの文字化け防止*1に記載したもので、必須ではない。

音声をバイブに変更

core2では音の鳴らし方が変更されたようで、移植にあたり対応が必要となる。 しかし対応が難しいと感じたため、バイブレーションで代用することにした。

具体的には、main.cppに次のような関数

void vibrate(unsigned int vibLength = 500) {
  M5.Axp.SetLDOEnable(3, true);
  delay(vibLength);
  M5.Axp.SetLDOEnable(3, false);
}

を定義して、M5.Speakerの関数が使われている部分をすべてvibrate()で置換した。

能登地方を表示する

強震モニタの画像のURLに_notoを付け加えることで、能登地方のマップを表示させることができる*2

具体的にはmain.cpp内のURLを以下のように変更すればよい。

http://www.kmoni.bosai.go.jp/data/map_img/CommonImg/
-> http://www.kmoni.bosai.go.jp/data/map_img/CommonImg_noto/
http://www.kmoni.bosai.go.jp/data/map_img/EstShindoImg/
-> http://www.kmoni.bosai.go.jp/data/map_img/EstShindoImg_noto/
http://www.kmoni.bosai.go.jp/data/map_img/PSWaveImg/
-> http://www.kmoni.bosai.go.jp/data/map_img/PSWaveImg_noto/
http://www.kmoni.bosai.go.jp/data/map_img/RealTimeImg/
-> http://www.kmoni.bosai.go.jp/data/map_img/RealTimeImg_noto/

しかし、強震モニタ背景に表示される日本地図の画像CommonImg/base_map_w.gifが16.4kBなのに対し、能登地方の地図画像を指すCommonImg_noto/base_map_w.gifは50.9kBと非常に大きい。そのため次のように画像ダウンロード用のバッファ容量を増やしておく必要がある点に注意。

main.cpp

(前略)
unsigned long file_buffer_size;    // ダウンロードしたサイズ
unsigned char file_buffer[51000];  // ダウンロード用のバッファ
(後略)

GPU使用可能なtensorflowが入ったconda環境の構築

minicondaを入れてから仮想環境を構築するまで、以下のコードでまとめて実行できる。
GPUのドライバ設定等はすでに済んだものとする

Ubuntu 22.04.3 LTS & NVIDIA RTX A4500が載ったサーバで動作確認済。

# minicondaをダウンロードして実行権限を与える
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
chmod a+x Miniconda3-latest-Linux-x86_64.sh

# インストールする。実行後にライセンス全部読んでyes -> インストール場所確認してEnter -> initしていいかと聞かれるのでyes
./Miniconda3-latest-Linux-x86_64.sh 

# シェルを再起動
exec $SHELL -l
# 仮想環境を作る。ここではtensorflow2.12.0、Python3.11の環境を作っている。動作確認でうまくいかない場合はこのバージョンをいろいろ変えてみよう
conda create -n tf-2.12.0 tensorflow=2.12.0=gpu_py311h65739b5_0 -y

# 作った仮想環境に入る(これは毎回起動時にやる必要がある)
conda activate tf-2.12.0

# 動作確認。GPUが使えるかチェックする。実行してGPUのリストが出てくればOK
python -c "import tensorflow as tf;print(tf.config.list_physical_devices('GPU'))"

補足

  • 仮想環境リストを表示するにはconda info -e
  • 仮想環境を削除するときはconda remove -n <仮想環境名> --all

参考リンク

【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