2021年11月7日日曜日

WSL2 で Debian 11 (Bullseye) を使う

/etc/apt/sources.list を修正して、 apt update, apt full-upgrade するのが楽かもしれない。

しかし、WSL2 のルートファイルシステムも Docker と同じ感じて作れるようなので、 Bullseye のルートファイルシステムを作って WSL2 へインポートしてみる。

前提

  • ゲスト OS: Ubuntu 20.04(WSL2)
  • Docker: Docker version 20.10.8, build 3967b7d

Debian 11 のルートファイルシステム作成

Docker コンテナ起動

debootstrap して作成したルートファイルシステムを Windows に持っていけるように、ボリュームをマウントしつつ Debian コンテナを起動。

PowerShell 上で、以下コマンドを実行。

docker run -it --rm -v "$(pwd):/work" --workdir "/work" -name debian debian:buster-slim

以降、起動した Debian コンテナ上でルートファイルシステムを作成していく。

必要パッケージのインストール

apt-get update
apt-get install -y debootstrap

debootstrap 実行

debootstrap で Debian 11 のルートファイルシステムを作成し、 tar で固める -> Windows へ渡すため、マウントしたフォルダへコピー。

cd
debootstrap bullseye ./bullseye http://deb.debian.org/debian
cd bullseye/
tar cfv ../debian-bullseye.tar .
cp ../debian-bullseye.tar /work

作成したら Debian コンテナはもう使わないので、停止。

WSL2 に Debian 11 をインポート

WSL2 ディストリビューションのディスク格納フォルダを作って、そこにインポートする。

PowerShell 上で以下コマンドを実行。

New-Item -ItemType Directory -p $HOME\wsl\debian\bullseye
wsl --import Debian-11 $HOME\wsl\debian\bullseye\ .\debian-bullseye.tar

Debian 11 の環境構築

Debian 11 のディストリビューション起動

PowerShell 上で以下コマンドを実行。

wsl -d Debian-11

Debian のアップグレードと必須パッケージインストール

アップグレードして sudo をインストールする。

起動した WSL 上で以下コマンドを実行。

apt-get update
apt-get upgrade -y
apt-get install -y sudo

一般ユーザー追加・設定

一般ユーザーを追加し、パスワード設定と sudo グループへの追加を行う。

useradd -m -s /bin/bash mikoto
passwd mikoto
gpasswd -a mikoto sudo

apt ソースリストの更新

適当に更新。

cat << EOF > /etc/apt/sources.list
deb http://ftp.jp.debian.org/debian/ bullseye main contrib non-free
deb-src http://ftp.jp.debian.org/debian/ bullseye main contrib non-free

deb http://ftp.jp.debian.org/debian/ bullseye-updates main contrib non-free
deb-src http://ftp.jp.debian.org/debian/ bullseye-updates main contrib non-free

deb http://security.debian.org/ bullseye-security main
deb-src http://security.debian.org/ bullseye-security main
EOF

デフォルトユーザー設定

/etc/wsl.conf を更新し、WSL2 起動時に追加した一般ユーザーでログインする設定を行う。

cat << EOF > /etc/wsl.conf
[user]
default=mikoto
EOF

WSL2 再起動

これで、追加したユーザー(今回は mikoto) でログインした状態で Debian 11 が起動する。

Debian をログアウトして、 PowerShell 上で以下コマンドを実行する。

wsl -t Debian-11
wsl -d Debian-11

バージョン確認

/etc/os-release で、 Debian 11 がインストールされていることを確認する。

再起動後の Debian 上で、以下コマンドを実行・確認する。

mikoto@DESKTOP-CO13JB2:~$ cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 11 (bullseye)"
NAME="Debian GNU/Linux"
VERSION_ID="11"
VERSION="11 (bullseye)"
VERSION_CODENAME=bullseye
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

以上、あとはよしなに。

参考資料

更新履歴

日付 更新内容
2021/11/7 新規作成
2021/11/10 sources.list の内容が適当すぎたので修正。
あわせて参考資料を追加。

Ubuntu 20.04 on WSL2 で GUI アプリケーション(mikutter) を動かす

Twitter と Mastodon をひとまとめに確認したいと思って、 mikutter を導入した。

とりあえず動いているようなので、作業メモを残す。

※ ROM なので日本語入力環境構築までやっていない

前提

  • ホスト OS: Windows 11 Pro ビルド 22000.282
  • ゲスト OS: Ubuntu 20.04(WSL2)

WSL 環境構築

Windows 11にWSL 2、WSLgをインストール | AsTechLog を参考に実施。

GUI サポートを有効にするため、 WSL をアップデートする。

PowerShell を管理者権限で起動し、以下コマンドを実行。

wsl --update

Ubuntu 20.04 のインストール

管理者権限でない PowerShell を開いて、以下コマンドで Ubuntu 20.04 をインストール。

wsl --install -d Ubuntu-20.04

mikutter 環境構築・実行

Ubuntu のアップグレードと必要パッケージのインストール

Ubuntu 20.04 のインストールが完了したら、ベースシステムのアップグレードと、 mikutter の実行に必要なパッケージ一式をインストール。

sudo apt update
sudo apt upgrade -y
sudo apt install -y gcc make ruby libgtk2.0-dev libidn11-dev fonts-noto fonts-noto-cjk fonts-noto-mono ttf-ancient-fonts ruby-dev

mikutter インストール

本体と、 Twitter 用プラグインをインストールする。

ソースコード取得

mkdir ~/project
cd ~/project
git clone git://mikutter.hachune.net/mikutter.git

Twitter 用プラグインインストール

基本的に mikutter/twitter_bootstrap: The most popular Twitter client for mikutter plugin, teokure first projects on the Linuxとか desktop. の通りだが、今回は saved_search の挙動がよくわからなかったのでそれは削除している。また、インライン画像表示してくれる moguno/mikutter-subparts-image: mikutterで画像をインライン表示するプラグイン を追加した。

mkdir ~/.mikutter/plugin
cd ~/.mikutter/plugin
for i in api_request_file_cache direct_message followingcontrol home_timeline list list_for_profile list_settings mentions message_detail_view message_favorite message_retweet ratelimit rest streaming twitter twitter_activity twitter_datasource twitter_settings user_detail_view; do git clone https://github.com/mikutter/$i.git ~/.mikutter/plugin/$i; done
git clone https://github.com/moguno/mikutter-subparts-image.git

コンシューマーキーは昔勉強用に作ったものを流用。

必要な gem のインストール

bundle でインストール。

sudo gem install bundler
cd ~/project/mikutter
bundle config --local path vendor/bundle
bundle install

mikutter 起動

cd ~/project/mikutter
bundle exec ruby mikutter.rb

以下のような感じで GUI が表示される。

ショートカット作成

Windows 側でショートカットを作って、リンク先を wslg.exe -d Ubuntu-20.04 ~/mikutter.sh という感じで、 wslg から起動シェルスクリプトを叩くような形にする。

これで、ショートカットダブルクリックか、スタートメニューから実行できるようになる。

以上。

参考資料

2021年10月24日日曜日

WSL2 の Ubuntu 18.04 で WSL2 カーネルをビルドして差し替える

Windows -> WSL2 Ubuntu への USB カメラパススルーを行う前準備として、 USB/V4L2 関連の機能を有効にしたカーネルをビルドし、差し替える方法をまとめた。

現時点で USB カメラへの接続まで確認できていないが、とりあえず作業記録を残す。

前提

  • ホスト OS: Windows 11 Pro 21H2
  • ゲスト OS: Ubuntu 18.04(WSL2)

検証環境の準備

以前使っていた環境が残っていたので、 Ubuntu 環境を削除して作り直す

PS C:\Users\mikoto> wsl -l
Linux 用 Windows サブシステム ディストリビューション:
Ubuntu-18.04 (既定)
docker-desktop-data
docker-desktop
PS C:\Users\mikoto> wsl --unregister Ubuntu-18.04
登録を解除しています...
PS C:\Users\mikoto> wsl -l
Linux 用 Windows サブシステム ディストリビューション:
docker-desktop-data (既定)
docker-desktop
PS C:\Users\mikoto> wsl --install -d Ubuntu-18.04
Ubuntu 18.04 LTS は既にインストールされています
Ubuntu 18.04 LTS を起動しています...

この流れで Ubuntu が起動するので、続けて作業していく。

パッケージアップグレードと必要パッケージのインストール

sudo apt-get update
sudo apt-get upgrade -y
sudo apt-get install -y build-essential flex bison libssl-dev libelf-dev libncurses-dev autoconf libudev-dev libtool

カーネル更新

現在のカーネルバージョンを確認

mikoto@DESKTOP-CO13JB2:~$ uname -r
5.4.91-microsoft-standard-WSL2

カーネルバージョンにあったカーネルをチェックアウト

sudo git clone --depth 1 https://github.com/microsoft/WSL2-Linux-Kernel -b linux-msft-5.4.91 /usr/src/5.4.91-microsoft-standard

念のためチェックアウトしたブランチを確認。

mikoto@DESKTOP-CO13JB2:~$ cd /usr/src/5.4.91-microsoft-standard/
mikoto@DESKTOP-CO13JB2:/usr/src/5.4.91-microsoft-standard$ git log
commit 807335635710b9038f2bb95019878d846130501a (grafted, HEAD, tag: linux-msft-5.4.91)
Author: Vivek Yadav <vyadav@microsoft.com>
Date:   Wed Jan 20 18:25:17 2021 +0000

    Merge remote-tracking branch 'msft/linux-msft-wsl-5.4.y' into linux-msft-wsl-5.4.y
mikoto@DESKTOP-CO13JB2:/usr/src/5.4.91-microsoft-standard$ cd -
/home/mikoto

linux-msft-5.4.91 のタグがチェックアウトされているのを確認できる。

現在のカーネル設定をコピー

cd /usr/src/5.4.91-microsoft-standard/
sudo cp /proc/config.gz config.gz
sudo gunzip config.gz
sudo mv config .config

カーネルモジュール設定

make menuconfig で、カーネルモジュールの設定を行う。

sudo make menuconfig

以下に今回変更したものだけ記載する。環境によって差があるかも…。

■ USB 関連

Device Drivers
    +- [*] USB support
        +- <M> Support for Host-side USB
        +- <M> USB Modem (CDC ACM) support
        +- <M> USB Mass Storage support
        +- <M> USB/IP support
        |   +- <M> VHCI hcd
        +- <M> USB Serial Converter support
        |   +- <M> USB FTDI Single Port Serial Driver
        +- USB Physical Layer drivers
        |   +- <M> NOP USB Transceiver Driver
        +- Network device support
            +- <M> USB Network Adapters
                +- <M> Multi-purpose USB Networking Framework
                |   +- <M> Host for RNDIS and ActiveSync devices
                +- <M> Multi-purpose USB Networking Framework

■ V4L2 関連

Device Drivers
    +- <M> Multimedia support
        +- [*] Cameras/video grabbers support
        +- [*] Media USB Adapters
            +- <M> USB Video Class (UVC)

カーネルのビルドとインストール

gcc 8 以上でないとコンパイルできないコードがあるため、 gcc のバージョンを上げて make する。

sudo apt-get install -y gcc-8
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-8 8
sudo make -j 12 && sudo make modules_install -j 12 && sudo make install -j 12

カーネルを Windows から見られる場所へコピー

sudo mkdir /mnt/c/Users/mikoto/.wsl
sudo cp /usr/src/5.4.91-microsoft-standard/vmlinux /mnt/c/Users/mikoto/.wsl/

新カーネルで WSL 起動

起動カーネル設定

~/.wslconfig で、使用するカーネルを指定する。

[WSL2]
kernel=C:\\Users\\mikoto\\.wsl\\vmlinux

WSL 再起動

wsl --shutdown
wsl -d Ubuntu-18.04

uname で確認すると、新しいカーネルで起動しているのがわかる。

mikoto@DESKTOP-CO13JB2:/mnt/c/Users/mikoto$ uname -a -r
Linux DESKTOP-CO13JB2 5.4.91-microsoft-standard-WSL2+ #1 SMP Sun Oct 24 09:46:32 JST 2021 x86_64 x86_64 x86_64 GNU/Linux

ここから Windows -> Ubuntu への USB カメラパススルーまでもっていきたかったけど、 IP 経由でやり取りするためにアプリインストールとかあるらしくめげた。今日はここまで。

以上。

参考資料

QEMU + aarch64 版 Ubuntu 18.04 で USB パススルーして V4L2 を試す

aarch64 のプラットフォームで Web カメラを使う機会があるので、エミュレーターで何とかできないか試してみた。

前提

Windows 11 Pro -> x86_64 Ubuntu 18.04 on VirtualBox -> aarch64 Ubuntu 18.04 on QEMU という感じに重ねて、 USB パススルーで Windows から QEMU まで Web カメラを繋げていく。

  • ホスト OS: Windows 11 Pro 21H2
  • VirtualBox: バージョン 6.1.28 r147628 (Qt5.6.2)
  • ゲスト OS: Ubuntu 18.04
  • QEMU: QEMU emulator version 2.11.1(Debian 1:2.11+dfsg-1ubuntu7.38)
  • 各 Ubuntu のインストール手順は省略。最小構成でインストールしている。

VirtualBox のゲストに、ホストの USB を繋げる方法は、Windows 11 上の VirtualBox で、 Ubuntu 18.04 に Web カメラを繋げる - mikoto2000 の日記 の記事参照。

aarch64 版 Ubuntu 18.04 の準備

cortex-a57 の virt VM を作る。

QEMU のインストール

sudo apt-get install -y qemu

これで、 QEMU の VM を作成・実行するためのコマンド一式がインストールされる。

aarch64 Ubuntu 18.04 ネットブート ISO イメージのダウンロード

arm64 版 Ubuntu のネットブートインストーラーのダウンロードページ から、 mini.iso をダウンロード。

wget http://ports.ubuntu.com/ubuntu-ports/dists/bionic-updates/main/installer-arm64/current/images/netboot/mini.iso

aarch64 VM 用のディスクイメージ生成

qemu-img コマンドでディスクイメージを作成する。

qemu-img create -f qcow2 storage.qcow2 50G

QEMU 用 UEFI イメージの取得

QEMU 用の UEFI イメージを、 Linaro が公開しているのでそれをダウンロード。

wget https://releases.linaro.org/components/kernel/uefi-linaro/latest/release/qemu64/QEMU_EFI.fd

USB パススルーのための情報取得

lsusb で、 Web カメラの Vendor ID, Product ID を特定する。

Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 019: ID 1bcf:2281 Sunplus Innovation Technology Inc.
Bus 001 Device 002: ID 80ee:0021 VirtualBox USB Tablet
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

今回の場合、 Vendor ID: 0x1bcf, Product ID: 2281 のものが Web カメラ。

USB パススルーをするときに使うので、それぞれをメモ。

aarch64 の QEMU で Ubuntu 18.04 をインストール

ここまでで調達した、インストーラー、UEFI, ディスクイメージを使って QEMU を起動。

sudo qemu-system-aarch64 \
    -M virt \
    -cpu cortex-a57 \
    -m 4096 \
    -bios ./QEMU_EFI.fd \
    -drive if=none,file=storage.qcow2,id=hd0 \
    -device virtio-blk-device,drive=hd0 \
    -cdrom ./mini.iso \
    -nographic

aarch64 の QEMU で Ubuntu 18.04 を実行

インストールが完了したら、 VirtualBox にパススルーした USB カメラを、 QEMU にパススルーしながら実行する。

sudo qemu-system-aarch64 \
    -M virt \
    -cpu cortex-a57 \
    -m 4096 \
    -bios ./QEMU_EFI.fd \
    -drive if=none,file=storage.qcow2,id=hd0 \
    -device virtio-blk-device,drive=hd0 \
    -device nec-usb-xhci,id=usb \
    -device usb-host,bus=usb.0,vendorid=0x1bcf,productid=0x2281 \
    -nographic

aarch64 版 Ubuntu で USB が認識されていることを確認

ここでもやはり lsusb で確認。

mikoto@ubuntu:~$ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 002: ID 1bcf:2281 Sunplus Innovation Technology Inc.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

Vendor ID: 0x1bcf, Product ID: 0x2281 の、 Web カメラが認識されていることがわかる。

V4L2 の動作確認

ffmpeg を使って、 Web カメラの画像を録画できることを確認する。

aarch64 版 Ubuntu 18.04 に ffmpeg をインストール

sudo apt-get install -y ffmpeg

ffmpeg でカメラから画像生成

sudo ffmpeg -f v4l2 -s 352x288 -i /dev/video0 -f image2 ./output-%6d.jpeg

q で録画を停止して、 ls すると、 jpeg 画像が大量に吐き出されている。

QEMU 上の ffmpeg で生成したファイルを抽出

QEMU を停止し、 x86_64 Ubuntu 上で以下コマンドを実行

# qcow2 ファイルをマウント
sudo modprobe nbd
sudo mkdir /mnt/tmp
sudo qemu-nbd -c /dev/nbd0 ./storage.qcow2
sudo mount -o ro /dev/nbd0p2 /mnt/tmp/

/mnt/tmp に aarch64 Ubuntu のディスクがマウントされるので、 吐き出された jpeg を回収、 Windows と共有しているディレクトリへコピーして Windows 上で jpeg ファイルを確認。

OK.

ディレクトリの共有方法は Windows 11 上の VirtualBox で、 Ubuntu 18.04 とフォルダー共有を行う - mikoto2000 の日記 参照。

# 後始末
sudo umount /mnt/tmp/
sudo killall qemu-nbd

こんな画像が大量に吐き出されていた。

以上。

参考資料

2021年10月22日金曜日

Ubuntu 18.04 で BLE iBeacon の内容を確認する

前提

Windows 11 Pro 上の VirtualBox に立てた Ubuntu 18.04 VM に、 USB ドングルを繋げて確認した。

使用した USB ドングルとビーコンは 今回使ったハード類 を参照。

  • ホスト OS: Windows 11 Pro 21H2
  • VirtualBox: バージョン 6.1.28 r147628 (Qt5.6.2)
  • ゲスト OS: Ubuntu 18.04

Bluetooth の環境構築

Bluetooth 通信スタックのインストール

sudo apt-get install -y bluez bluez-hcidump
  • bluez : Bluetooth 通信スタック
  • bluez-hcidump : Bluetooth 通信のパケットをダンプするためのパッケージ。今回は iBeacon の通信内容を確認するために使う。

USB ドングルの認識確認

hciconfig で、 USB ドングルの情報が確認できる。

以下のような形でもろもろの情報が取得できる。

LMP Version4.0 以上になっていれば BLE(iBeacon) できるはず…。

$ hciconfig -a
hci0:   Type: Primary  Bus: USB
        BD Address: 00:1A:7D:DA:71:15  ACL MTU: 310:10  SCO MTU: 64:8
        UP RUNNING
        RX bytes:4238 acl:0 sco:0 events:147 errors:0
        TX bytes:2189 acl:0 sco:0 commands:44 errors:0
        Features: 0xff 0xff 0x8f 0xfe 0xdb 0xff 0x5b 0x87
        Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3
        Link policy: RSWITCH HOLD SNIFF PARK
        Link mode: SLAVE ACCEPT
        Name: 'ubuntu'
        Class: 0x000000
        Service Classes: Unspecified
        Device Class: Miscellaneous,
        HCI Version: 4.0 (0x6)  Revision: 0x22bb
        LMP Version: 4.0 (0x6)  Subversion: 0x22bb
        Manufacturer: Cambridge Silicon Radio (10)

iBeacon を受信できるかの確認

BLE アドバータイズ検索

hcitool lescan で、 BLE のアドバータイズを検索できる。

以下コマンドで、ビーコンの MAC が表示されることを確認。

$ sudo hcitool lescan
...(snip)
AC:23:3F:26:2C:DE (unknown)
...(snip)

ビーコンとの通信

簡単に iBeacon の内容を確認するコマンドは無いようだ。

hcidumphcitool lescan の合わせ技で UUIDMajor, Minor を取得している方法が見つかる。

$ sudo hcidump -R & sudo hcitool lescan
...(snip)
AC:23:3F:26:2C:DE (unknown)
> 04 3E 2B 02 01 00 00 DE 2C 26 3F 23 AC 1F 02 01 06 03 03 F1
  FF 17 16 E2 C5 6D B5 DF FB 48 D2 B0 60 D0 F5 A7 10 96 E0 00
  0C 00 22 00 64 C7
...(snip)
<C-c>
$ fg
<C-c>

ダンプされたバイナリの中に、今回使ったビーコンで設定した UUID, Major, Minor が含まれていることを確認できた。

バイナリの読み方は Raspberry piでiBeacon受信 | TomoSoft を参照のこと。

iBeacon 受信プログラムを nodejs で作る

あまりに読みずらいので、 nodejs のビーコンライブラリを使って受信と情報表示を行う。

Raspberry PiでiBeaconを受信する(Node.js + bleacon) - Qiita に記述されている beacon_discover.js をそのまま利用する。

必要パッケージのインストール

sudo apt-get install -y nodejs npm libbluetooth-dev vim
  • nodejs : ビーコン受信プログラムのランタイム
  • npm : nodejs のパッケージ管理システム
  • libbluetooth-dev : nodejs のビーコンライブラリのビルドに必要なパッケージ
  • vim : プログラム作成のため
mkdir ibeaconreceiver
cd ibeaconreceiver
npm init
npm install bleacon
  • bleacon : nodejs のビーコンライブラリ

iBeacon 受信プログラム作成

Raspberry PiでiBeaconを受信する(Node.js + bleacon) - Qiita に記述されている beacon_discover.js の通りにファイルを作成する。

名前だけ、 npm デフォルトの index.js にした。

var Bleacon = require("bleacon");
Bleacon.startScanning();
Bleacon.on("discover", function(bleacon) {
  console.dir(bleacon);
});

iBeacon 受信プログラム実行

$ sudo nodejs ./index.js
{ uuid: 'e2c56db5dffb48d2b060d0f5a71096e0',
  major: 12,
  minor: 34,
  measuredPower: 0,
  rssi: -62,
  accuracy: 0,
  proximity: 'immediate' }
{ uuid: 'e2c56db5dffb48d2b060d0f5a71096e0',
...(snip)

hcidump より大分わかりやすく情報が表示されている。

後は uuid, major, minor, rssi あたりを見たり見なかったりしながら所望の処理を実装していけばいい感じですかね。

以上。

今回使ったハード類

Bluetooth ドングルは、家に転がっていた 2 つで試して、どちらでも OK だった。

ビーコン発信側は、サンワダイレクトのビーコンを使った。

参考資料

Ubuntu 18.04 で h264 対応の ffmpeg をビルドする

Ubuntu 18.04 の、 apt-get install ffmpeg でインストールされる ffmpeg が h264 に対応していないと勘違いしてビルド方法を調べてしまった。

基本的に CompilationGuide/Ubuntu – FFmpeg の手順にのっとって進めるだけ。

前提

VirtualBox 上の Ubuntu で実施。

  • ホスト OS: Windows 11 Pro 21H2
  • VirtualBox: バージョン 6.1.28 r147628 (Qt5.6.2)
  • ゲスト OS: Ubuntu 18.04

手順

必要パッケージのインストール

sudo apt-get -y install \
  autoconf \
  automake \
  build-essential \
  cmake \
  git-core \
  libass-dev \
  libfreetype6-dev \
  libgnutls28-dev \
  libmp3lame-dev \
  libsdl2-dev \
  libtool \
  libunistring-dev \
  libva-dev \
  libvdpau-dev \
  libvorbis-dev \
  libx264-dev \
  libxcb-shm0-dev \
  libxcb-xfixes0-dev \
  libxcb1-dev \
  meson \
  nasm \
  ninja-build \
  pkg-config \
  texinfo \
  wget \
  yasm \
  zlib1g-dev

ソースコード取得

cd ~/project
git clone https://github.com/FFmpeg/FFmpeg.git

ビルド

cd ~/project/FFmpeg

./configure \
  --pkg-config-flags="--static" \
  --extra-libs="-lpthread -lm" \
  --ld="g++" \
  --enable-gpl \
  --enable-gnutls \
  --enable-libx264 \
  --enable-nonfree

make

ビルドしたバイナリがカレントディレクトリへ配置される。

./ffmpeg -codecs で、 h264 のコーデックが入っていることを確認できる。

参考資料

おまけ

本題とは関係ないが、 VirtualBox 上の CLI Ubuntu に、コマンドコピペできなくて辛かったので SSH 接続するようにした。

VirtualBox 上の CentOS に ssh 接続する [ Windows 編] - Resty’s log:手取り15万円の日常

Windows 11 上の VirtualBox で、 Ubuntu 18.04 に Web カメラを繋げる

前提

  • ホスト OS: Windows 11 Pro 21H2
  • VirtualBox: バージョン 6.1.28 r147628 (Qt5.6.2)
  • ゲスト OS: Ubuntu 18.04

手順

Oracle VM VirtualBox Extension Pack のインストール

1.Downloads – Oracle VM VirtualBox の見出し VirtualBox 6.1.28 Oracle VM VirtualBox Extension Pack の下のリンク All supported platforms から、 Extension Pack をダウンロードする 2. ダウンロードした Oracle_VM_VirtualBox_Extension_Pack-6.1.28.vbox-extpack をダブルクリックし、インストーラーの指示に従いインストール

USB カメラの設定

  1. 対象の Ubuntu VM を停止
  2. 対象の Ubuntu VM の 設定 -> USB を選択し、 USB 設定を行い、 OK ボタン押下
    • USB コントローラーを有効化(U) : チェックを入れる
    • USB 3.9 (xHCI) コントローラー にチェックを入れる
    • USB デバイスフィルター :
      • 右の USB デバイス追加ボタンを押下し、 Ubuntu VM に繋げたい Web カメラを選択

これで、 VM 起動後、 /dev/video* のデバイスが生えているはず。

ffmpeg で録画

/dev/video0 に生えた場合、以下コマンドで Web カメラの画像を avi で録画できる。

sudo ffmpeg -i /dev/video0 output.avi

参考資料

Windows 11 上の VirtualBox で、 Ubuntu 18.04 とフォルダー共有を行う

やっていきます。

前提

  • ホスト OS: Windows 11 Pro 21H2
  • VirtualBox: バージョン 6.1.28 r147628 (Qt5.6.2)
  • ゲスト OS: Ubuntu 18.04

手順

  1. virtualbox-guest-utils をインストール

    sudo apt install -y virtualbox-guest-utils
  2. 再起動

    sudo shutdown -r now
  3. ユーザーを vboxsf グループへ追加

    sudo adduser mikoto vboxsf
  4. ログアウトしてログインしなおす

  5. 共有フォルダ設定

    1. メニューの 仮想マシン -> 設定 -> 共有フォルダ―
    2. 右上の 共有フォルダ―追加 アイコンをクリック
    3. 共有フォルダ―の追加 ダイアログが開くので、必要事項を記入
      • フォルダーのパス : ゲスト OS のフォルダー
      • フォルダー名 : 自動で入力される。フォルダー名を指定したい場合に修正
      • 自動マウント : ON
      • マウントポイント : ゲスト OS のどこにマウントするかを指定
  6. 再起動

    • 再起動後、指定のマウントポイントにマウントされる
    • マウントポイントが指定されなかった場合、 /media/sf_<フォルダー名> のフォルダにマウントされる

参考資料

2021年8月22日日曜日

Vert.x で MQTT クライアントを実装する

前提

  • OS: Windows 10 Pro
  • Java: openjdk version “11.0.2” 2019-01-15

MQTT プロジェクトのひな形を作成

Vert.x Starter - Create new Eclipse Vert.x applications を使用し、プロジェクトのひな形を作成する。

MQTT ブローカー起動

MQTT パブリッシャー・サブスクライバーの実装

MQTT | Eclipse Vert.x を参考に、自分で publish したトピックを自分で subscribe する MQTT クライアントを実装する。

1 秒周期で publish し、subscribe していることが確認できる。

実行ログ

PS C:\Users\mikoto\project\MiscellaneousStudy\java\Vertx\mqtt> ./mvnw compile exec:java
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------< dev.mikoto2000.study.vertx:mqtt >-------------------
[INFO] Building mqtt 1.0.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ mqtt ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory C:\Users\mikoto\project\MiscellaneousStudy\java\Vertx\mqtt\src\main\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.8.1:compile (default-compile) @ mqtt ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- exec-maven-plugin:3.0.0:java (default-cli) @ mqtt ---
8月 20, 2021 9:19:01 午前 io.vertx.core.impl.BlockedThreadChecker
警告: Thread Thread[vert.x-eventloop-thread-1,5,io.vertx.core.Launcher] has been blocked for 2348 ms, time limit is 2000 ms
8月 20, 2021 9:19:02 午前 io.vertx.mqtt.impl.MqttClientImpl
情報: Connection with localhost:1883 established successfully
connected localhost:1883.
{ topic: temperature, payload: 2021-08-20T09:19:03.505719800 }
{ topic: temperature, payload: 2021-08-20T09:19:04.506401500 }
{ topic: temperature, payload: 2021-08-20T09:19:05.506077900 }
{ topic: temperature, payload: 2021-08-20T09:19:06.505243 }
{ topic: temperature, payload: 2021-08-20T09:19:07.505362700 }
{ topic: temperature, payload: 2021-08-20T09:19:08.505559100 }
...(snip)

以上。

参考資料

Vert.x チュートリアルをやってみる

Get started | Eclipse Vert.x を試す。

前提

  • OS: Windows 11 Pro
  • Java: java version “1.8.0_201”
    • 諸事情あって Java8 です…

プロジェクトのひな形を作成

  1. Vert.x Starter - Create new Eclipse Vert.x applications にアクセスし、作成するアプリケーションの情報を入力し、 Generate Project ボタンを押下
    • Version: 4.1.2
    • Language: Java
    • Build: Maven
    • Group Id: dev.mikoto2000.study.vertex
    • Group Id: firststep
    • Dependencies:
      • Vert.x Web
  2. firststep.zip がダウンロードされるので、任意の場所に展開
  3. ソースとターゲットの変更
    • ダウンロードしたひな形は <release>11</release> と指定されているが、今回は Java8 を使うため、sourcetarget を指定する方法に修正する。以下コマンドを実行。
      • sed -i -e "s/<release>11<\/release>/<source>1.8<\/source>\\n <target>1.8<\/target>/" ./pom.xml

とりあえずテストを実行してみる

  1. ひな形プロジェクト展開したディレクトリへ移動
  2. コマンド ./mvnw.cmd clean test を実行

実行ログ

PS C:\Users\mikoto\project\MiscellaneousStudy\java\Vertx\firststep> ./mvnw clean test
[INFO] Scanning for projects...
[INFO]
[INFO] ---------------< dev.mikoto2000.study.vertex:firststep >----------------
[INFO] Building firststep 1.0.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ firststep ---
[INFO] Deleting C:\Users\mikoto\project\MiscellaneousStudy\java\Vertx\firststep\target
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ firststep ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory C:\Users\mikoto\project\MiscellaneousStudy\java\Vertx\firststep\src\main\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.8.1:compile (default-compile) @ firststep ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to C:\Users\mikoto\project\MiscellaneousStudy\java\Vertx\firststep\target\classes
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ firststep ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory C:\Users\mikoto\project\MiscellaneousStudy\java\Vertx\firststep\src\test\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.8.1:testCompile (default-testCompile) @ firststep ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to C:\Users\mikoto\project\MiscellaneousStudy\java\Vertx\firststep\target\test-classes
[INFO]
[INFO] --- maven-surefire-plugin:2.22.2:test (default-test) @ firststep ---
[INFO]
[INFO] -------------------------------------------------------
[INFO]  T E S T S
[INFO] -------------------------------------------------------
[INFO] Running dev.mikoto2000.study.vertex.firststep.TestMainVerticle
HTTP server started on port 8888
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.703 s - in dev.mikoto2000.study.vertex.firststep.TestMainVerticle
[INFO]
[INFO] Results:
[INFO]
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  3.520 s
[INFO] Finished at: 2021-08-17T04:49:55+09:00
[INFO] ------------------------------------------------------------------------

ok.

ひな形のアプリケーション実行

  1. ひな形プロジェクト展開したディレクトリへ移動
  2. コマンド ./mvnw clean compile exec:java を実行
    • コンソールログに HTTP server started on port 8888
  3. ウェブブラウザで http://localhost:8888 へアクセス
    • ウェブブラウザに Hello from Vert.x! と表示される

ok.

アプリケーションを修正

package dev.mikoto2000.study.vertex.firststep;

import io.vertx.core.AbstractVerticle;
import io.vertx.core.MultiMap;
import io.vertx.core.Promise;
import io.vertx.core.json.JsonObject;
import io.vertx.ext.web.Router;

public class MainVerticle extends AbstractVerticle {

  @Override
  public void start(Promise<Void> startPromise) throws Exception {
    // ルーター作成
    Router router = Router.router(vertx);

    // 全パスにマッチするルートを作成し、そこにハンドラを割り当てる
    // 全パスにマッチするルートなので、HTTP リクエストが来るたびにハンドラメソッドが実行される
    router.route().handler(context -> {
      // リクエスト送信元アドレスを取得
      String address = context.request().connection().remoteAddress().toString();

      // クエリーパラメーター `name` を取得
      MultiMap queryParams = context.queryParams();
      String name = queryParams.contains("name") ? queryParams.get("name") : "unknown";

      // JSON レスポンスを生成して返却するよう設定
      context.json(
        new JsonObject()
          .put("name", name)
          .put("address", address)
          .put("message", "Hello " + name + " connected from " + address)
      );
    });

    // HTTP サーバーを生成
    vertx.createHttpServer()
      // 上で作成したルーターを設定
      .requestHandler(router)
      // 待ち受けポート設定
      .listen(8888)
      // 待ち受けポートを標準出力へ
      .onSuccess(server ->
        System.out.println(
          "HTTP server started on port " + server.actualPort()
        )
      );
  }
}

修正したアプリの動作確認

./mvnw clean compile exec:java してからブラウザで localhost:8888?name=mikoto に接続。

パラメーターが反映されているのが確認できる。

今回はここまで。

参考資料

2021年7月15日木曜日

Docker で MemSQL を試す

今日は入手から起動するところまで。

アカウント登録

SingleStore is The Database of Now™ Powering Modern Applications and Analytical Systems」 にアクセスし、右上の Start Free → ボタン押下。

登録フォームに情報を入力し、ページに従ってアカウント登録を行う。

ライセンスキー取得

アカウント登録完了後、ログインし、ポータルの左メニューから Software Licenses を選択すると、ライセンスキーが確認できるのでメモ。

MemSQL 動作確認

Docker コンテナ起動

# 「ライセンスキー取得」でメモした文字列を設定
$MEM_SQL_LICENSE_KEY="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

# MemSQL 管理コンソールに root ログインする際に使用するパスワードを設定
$MEM_SQL_ROOT_PASSWORD="yyyyyyy"

# MemSQL 用の volume 作成
docker volume create memsql

# コンテナ初期化
docker run -i --init `
    --name memsql-ciab1 `
    -e LICENSE_KEY=$MEM_SQL_LICENSE_KEY `
    -e ROOT_PASSWORD=$MEM_SQL_ROOT_PASSWORD `
    -e START_AFTER_INIT=Y `
    -v "memsql:/var/lib/memsql" `
    -p 3306:3306 -p 8080:8080 `
    memsql/cluster-in-a-box

MemSQL へ接続

http://localhost:8080 へアクセスすると、管理コンソールへ接続できる。

また、 docker exec でコンテナ内のクライアントを使用することもできる。

後片付け

Ctrl-C でコンテナから抜けたうえで、以下コマンドを実行。

コンテナ起動時に初期データを投入するのを試す

/init.sql にファイルを入れると、初期化時に実行してくれるようなので、そちらも試してみる。

以下 SQL ファイルを作成し、 init.sql という名前で保存。

コンテナ起動時に、 -v/init.sql へマウントする。

http://localhost:8080 に接続。はい、いけてるっぽい。

後片付け

Ctrl-C でコンテナから抜けたうえで、以下コマンドを実行。

以上。

参考資料

2021年7月13日火曜日

Windows で shiguredo/momo を Jetson Xavier NX / AGX 向けにビルドする

基本的に momo/BUILD_LINUX.md at develop · shiguredo/momo を見れば OK.

前提

  • OS: Windows 11 Pro 21H2
  • Docker: Docker version 20.10.7, build f0df350

ソースコード取得

git clone https://github.com/shiguredo/momo.git
cd momo

ビルド用コンテナ環境立ち上げ

ビルドに Docker が必要なので、コンテナにソケットを渡してしまう。

docker run -it --rm -v "$(pwd):/work" --workdir=/work -v "/var/run/docker.sock:/var/run/docker.sock" docker:20.10

必要パッケージのインストール

ビルドに bashgit が必要。

ビルド結果のバイナリを簡易的に確認するため、 file もインストール。

apk add bash git file

ビルド

ビルド手順通りに Ubuntu 18.04 (armv8) Jetson Xavier NX / AGX 向けバイナリを作成する。

cd build
./build.sh --no-mount ubuntu-18.04_armv8_jetson_xavier

/work/_build/ubuntu-18.04_armv8_jetson_xavier/momo にバイナリが出力された。

/work/build # file /work/_build/ubuntu-18.04_armv8_jetson_xavier/momo
/work/_build/ubuntu-18.04_armv8_jetson_xavier/momo: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, for GNU/Linux 3.7.0, not stripped

後は docker cp コマンドでバイナリを抽出して Jetson にコピーすれば OK なのかな?

とりあえずここまで、以上。

参考資料