e-tipsmemo

ごった煮

Rustでsambaアクセスする pavao使用

RustのソフトウェアでSambaで共有フォルダにアクセスしたい気がしたので適当なコードを書いてみる。
WSL上でいろいろ行っている。

準備

cargo new --bin samba_test
cd samba_test
cargo add pavao
cargo add clap --features derive

ここでbuildしてみると

The system library `smbclient` required by crate `pavao` was not found.

といったエラーがでてきた。

sudo apt install -y libsmbclient-dev libsmbclient

実装

use clap::Parser;
use pavao::{SmbClient, SmbCredentials, SmbOpenOptions, SmbOptions};
use regex::Regex;
use std::fs::File;
use std::io::Read;
use std::io::{BufRead, BufReader};
use std::process::exit;

/// Simple program to greet a person
#[derive(Parser, Debug)]
#[command(author, version, about, long_about = None)]
struct Args {
    /// Name of the person to greet
    #[arg(short, long)]
    username: Option<String>,

    #[arg(short, long)]
    password: Option<String>,

    #[arg(short, long)]
    loginfile: Option<String>,

    #[arg(short, long)]
    server: String,
}

pub fn login_info(
    username: Option<String>,
    password: Option<String>,
    loginfile: Option<String>,
) -> (String, String) {
    let (username, password) = match (username, password) {
        (Some(username), Some(password)) => (username, password),
        (_, _) => {
            let path = if let Some(path) = loginfile {
                path
            } else {
                println!("Specify username/password or login information file.");
                exit(1);
            };
            let file = File::open(path).unwrap();
            let mut reader = BufReader::new(file);
            let mut username = String::new();
            let mut password = String::new();
            let _ = reader.read_line(&mut username);
            let _ = reader.read_line(&mut password);
            let username = username.lines().collect::<String>();
            let password = password.lines().collect::<String>();
            (username, password)
        }
    };
    (username, password)
}

fn main() {
    let args = Args::parse();

    let (username, password) = login_info(args.username, args.password, args.loginfile);

    let server = format!("smb://{}", args.server);
    // Initialize a new client
    let client = SmbClient::new(
        SmbCredentials::default()
            .server(server)
            .username(username)
            .password(password),
        // .workgroup(workgroup),
        SmbOptions::default().one_share_per_server(true),
    )
    .unwrap();

    let path = r"/dtv/";

    let contents = client.list_dir(path).unwrap();
    for entry in contents {
        println!("{}", entry.name());
    }

    drop(client);
}

こんな感じで、

cargo run -- -s 192.168.100.28 -u username -p password

とか

cargo run -- -s 192.168.1.28 -l ../login.txt

sambaのログイン情報は適当に用意しておく。
clapを使用して簡単に引数設定できる。
頑張ればWindowsに保存されている情報とかつかってログインできるのだろうか?

結果



ちゃんとディレクトリ一覧を表示できた。

エラーハンドルとかよくわからないのでちゃんとやらなきゃいけない気がするけどベストプラクティスはどのようなものかとか、
DTV環境をもっと有意義なものにするためのソフトウェア開発をしていこうかなどと考えているがまず手始めになにをしようかなぁ
コピーとか移動はどうするのだろうか・・・

docker build中にresolveに失敗する場合の対処方法 EAI_AGAIN registry.yarnpkg.com

問題

Docker版のKonomiTVのインストール中にyarnのリポジトリへのアクセスが失敗したり、
それ以降のubuntuリポジトリへのアクセスが失敗することでインストールが完了しないことが多々あった。


=> CANCELED [konomitv thirdparty-downloader 2/5] RUN apt-get update && apt->get install -y --no-install-recommend  1.0s
 => CANCELED [konomitv stage-2 2/9] RUN apt-get update && apt-get install -y --no-install-recommends ca-certifica  1.0s
 => [konomitv client-builder 3/6] COPY ./client/package.json ./client/yarn.lock /code/client/                      0.1s
 => ERROR [konomitv client-builder 4/6] RUN yarn install --frozen-lockfile                                         0.6s
------
 > [konomitv client-builder 4/6] RUN yarn install --frozen-lockfile:
0.333 yarn install v1.22.19
0.366 [1/4] Resolving packages...
0.508 [2/4] Fetching packages...
0.567 error An unexpected error occurred: "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz: getaddrinfo EAI_AGAIN registry.yarnpkg.com".
0.567 info If you think this is a bug, please open a bug report with the information provided in "/code/client/yarn-error.log".
0.567 info Visit https://yarnpkg.com/en/docs/cli/install for documentation about this command.
------
failed to solve: process "/bin/sh -c yarn install --frozen-lockfile" did not complete successfully: exit code: 1
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────

  ┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
  │ Docker                                                                                                           │
  │ イメージのビルド中に予期しないエラーが発生しました。お手数をおかけしますが、上記のログを開発者に報告してください │
  │ 。                                                                                                               │
  └──────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘

  ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
7.358 W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/jammy/InRelease  Temporary failure resolving 'archive.ubuntu.com'

対処

dockerがnetwork mode : hostの時に使用するDNSを指定するには以下のディレクトリに設定ファイルを設置すればいよいらしい。

sudo vim /etc/docker/daemon.json

以下を作成、または追記

{
    "dns": ["8.8.8.8", "8.8.4.4"]
}

これでKonomiTVのインストールが進んだ。

growiのデータ引っ越し

今までQNAPのTS-453BeのContainer Stationを使用してgrowiをホスティングしていしたが、CPUのスペック不足や検索機能の不全など不便な側面が出てきたので、新しく組み立てたPCにデータを載せ替えることにした。

PCスペック

CPU Ryzen 9 7950X3D
MB MAG X670E TOMAHAWK WIFI
MEM コルセアの32GB
SSD ADATAの1TBのもの
ケース MODEL4 King Arthur White

最近は前面がファンを取り付けるケースが主流で、上面にUSBが差し込めるタイプが置くなっている。
上面にUSBがあると埃が入りそうであまり好んでいないのでこのケースを選んだが、このケースはパーツを組み付けるのが非常に手間であった。

準備

マニュアル
データのアーカイブ | GROWI Docs

データの移行元と移行先のツールバージョンが一致している必要があるので、
バージョンを確認する。

growi 5.1.11
Elasticsearch 7.17.1
mongodb 4.4

growiは管理ページからバージョンを確認できる。
elasticsearchはdocker execでバージョンを確認
mongodbはdocker-compose.ymlに書いてある。

同じdocker-compose.ymlファイルを使用すればおなじバージョンを使用することが可能。

growi-docker-composeのgithubをクローンした場合、Dockerfileのバージョン部分を手書きで合わせておく必要がある。

#FROM weseek/growi:${version}
FROM weseek/growi:5.1.11

データエクスポート


とりあえずエクスポートできるものはすべてしておく。
zipファイルができるのでページからダウンロードする。

データインポート

データアーカイブの上にデータインポートの項目があるのでそこからzipファイルをアップロードし、インポートする項目を選択できる形式になっている。
インポートする項目を選択する方法は、一括チェックなどがあるが、
どのようにインポートするか(Insert/Upsert/Flush and Insertなのか)を選ぶのをポチポチやらないといけないのがめんどくさかった。
まっさらな環境にインポートするので、当然Flush and Insertでいいのかと思ったら以下のIssueのようなエラーがでて何もできなかった
Bug:Failure to import Page Collection in Growi Archive/Import Page Collections in feature Insert by default · Issue #7132 · weseek/growi · GitHub

代わりに以下のようにUpsertで行ったところメンテナンスモードではないので事項できないというエラーが出たので、メンテナンスモードに入ってから再度行ったらインポートされた。

画像データ

growiのページに画像を挿入するとき、ファイルアップロードをlocalにしていると、データエクスポートのときにページに入れた画像ファイルなどはzipファイルには入ってないので手動でコピーする。

 # - FILE_UPLOAD=mongodb   # activate this line if you use MongoDB GridFS rather than AWS
      - FILE_UPLOAD=local # activate this line if you use local storage of server rather than AWS
      - MATHJAX=1 # activate this line if you want to use MathJax


画像ファイルは、docker-comopse.ymlのgrowiのデータvolumeのパス以下のuploadsをそのまま同じ形で配置すればいいはず


アーカイブしたzipデータをインポートした直後は、画像が表示されないが、
時間が経つと画像が表示された。(なんで?)
アーカイブデータにuploads/attachmentも含まれるようになったらうれしい。

最後に、もとのページと目視でページ数が一致するかだけを見てよさそうだとなった
QNAPでgrowi運用すると若干重かったが、Ryzen 9 7950X3DのPCで運用すればスペックは持て余しているが、まったくストレスを感じなくなった。

Ubuntu Anydesk セキュリティ設定を解除できない

UbuntuをインストールしたPCを組んだが、やはり画面なし運用をするために。Anydeskをインストールしたときに、過去に遭遇してないはまりポイントがあったので、その追加情報。

過去記事

e-tipsmemo.hatenablog.com

Anydeskのインストール自体は以下のようにすることで簡単におこなうことができる。

sudo apt install ./anydesk_6.3.0-1_amd64.deb

しかし実行してみてからセキュリティ設定を変更しようとしてもなぜか変更できない状態になっていたりする。

このボタンが動かない。


AnyDesk Can't Start as Root and I Can't Unlock Security Setting - Ask Ubuntu
これを参考にして、

sudo su
anydesk --admin-settings

を行ったところ、セキュリティ設定を解除された状態の設定画面が出てきたので無人アクセス設定などができた。

しかしながら、無人アクセスを行おうとすると、Display_server_not_supportedというエラーが出てきてしまったので以下のサイトを参考に
/etc/gdm3/custom.conf
を設定したところ無人アクセスが可能になった(ディスプレイを接続した状態)。

How to Fix AnyDesk of Display_Server_Not_Supported Error for Ubuntu 22.04 - Dylan Wang - Medium


最後に過去記事にあるように、xorg-dummyなどインストールして、画面解像度を設定すればディスプレイを接続しなくてもanydeskが使用可能となった。

VSCodeとModelSimでそこそこ楽なSystemVerilog開発環境

背景

VScodeでHDLを楽に書きたいと思った。
Verilog-HDLではなく、SystemVerilogを使用する。

フォーマッター

巷のソフトウェア言語に比べ、HDLのフォーマッターは少ないが、
Chipsallianceがフォーマッターをリリースしているので、それを使用する。
Releases · chipsalliance/verible · GitHub

適当な場所に展開し、パスを通す。

コマンドプロンプトでパスが通ってることを確認

ModelSim

無料のHDLシミュレーターとしてiverilogがあるが、SystemVerilogの文法にどの程度対応しているのかわからないことや、コマンドがちょっと面倒なので、
ModelSimを使用することにした。

ModelSimはIntel版だとかXilinx版だとかQuartus Primeだとかいろいろバンドルが違うようだが、Intelのサイトからそれ単体をダウンロードすることができる。
ModelSim-Intel® FPGAs Standard Edition Software Version 18.1

Starter Editionはライセンスなしで使用することができる。(制限あり)

VScodeの設定

拡張機能に以下を追加する
Verilog-HDL/SystemVerilog/Bluespec SystemVerilog - Visual Studio Marketplace
これはveribleに対応しているらしい。

Ctrl + ,
で設定画面を開いたらjson編集モードにして

以下を追加する

    "[verilog]": {
        "editor.formatOnSave": true,
    },
    "[systemverilog]": {
        "editor.formatOnSave": true,
    },

これで保存時にsvやvのファイルが勝手にフォーマットされると思う。
(されないときは、右クリックから一回フォーマットしてやると、治る気がする)

ビルドの構成

VScodeからGUIレスで、svをビルド & シミュレーションしたいので、modelsimのコマンドを呼ぶ。

Shift + Ctrl + B
から呼び出すコマンドを以下のように定義する。

{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "label": "vsim",
            "type": "shell",
            "command": "./run.bat",
            "group": {
                "kind": "build",
                "isDefault": true
            }
        }
    ]
}

サンプルコード

module hello (
    clk
);
  input clk;
  reg [31:0] count = 0;
  always_ff @(clk) begin : counter
    count <= count + 1;
  end
endmodule
`timescale 1ps / 1ps

module tb_hello ();
  reg clk = 0;

  hello dut (clk);

  always #1000 clk = ~clk;

  initial begin
    $dumpfile("wave.vcd");
    $dumpvars(0, tb_hello);
    repeat (10) @(posedge clk);
    $stop;
  end

endmodule

run.bat & modules.txt

ModelSimをコマンドから実行するのに必要なコマンドを並べる

run.bat

vlib MODELSIM_LIB
vmap MODELSIM_LIB MODELSIM_LIB
vlog -work MODELSIM_LIB -f modules.txt

vsim -c tb_hello -lib MODELSIM_LIB -do "run -all;quit -f;"

modules.txt

hello.sv
tb_hello.sv

ビルドのスクリプトで、modules.txtを毎回生成することもできる気がするが、
そこまでは頑張らない。

Shift + Ctrl + B
で、run.batが実行され、ModelSimが実行され、

vcd view

VScode上からVCDを見れる。
無料版だと波形表示数に上限がある。
(もっといい波形ビューワーはないか?結局gtkwaveを使っている)
WaveTrace - Visual Studio Marketplace

HandBrakeCLIで動画を大量にエンコードする

監視カメラの録画ファイルは
5分の動画が12個x無限に生成される感じになっている。
監視カメラのONVIF機能、QNAPのSurveillance録画するやつで録画されるが、これをエンコードしたい
(本当はそのままの録画ファイルをpython処理できたらよかったが、なぜかできない)
ffmpegではなぜかエンコードできなかったのでHandBrakeでエンコードする。

実践

#!/bin/bash

FILENAME=./enc_mp4/${1%.*}.mp4
CMD="HandBrakeCLI --input $1 --x264-preset fast -f mp4 -o $FILENAME"
eval $CMD

こういうスクリプトを用意して、実行権限を付けておく。
動画ファイルがあるディレクトリに置く、enc_mp4フォルダを作っておく。
実行時間を簡易的に数えておきたいので、

SECONDS=0; ls *avi | xargs -I{} encode_avi.sh {}; echo $SECONDS

とかやってみる。

途中経過。240fps出ているらしい

HandBrake内部での処理が並列化されている

CPU処理的にはまだ余裕がある?

Encode done!
HandBrake has exited.
387

5分の動画12個をエンコードするのに、6分20秒≒6.3minかかった。

並列化

意味があるかわからないが、とりあえずやってみる

SECONDS=0; ls *avi | xargs -P 4 -I{} ./encode_avi.sh {}; echo $SECONDS

さっきより100%に張り付いている

90fps ~ 80fpsになっている(4並列で)

Encode done!
HandBrake has exited.
271

5分の動画12個をエンコードが4分30秒で終わった。

感想

1日分を処理するのに、24回繰り返すので、
24*6.3min ≒ 150min = 2h30min
24*4.5min ≒ 108min ≒ 1h48min
1時間ぐらい早くおわるのなら、毎日朝5時ぐらいにとかならいいかも?

そもそもONVIFで録画するときに最初からPythonOpenCVで処理可能な形式になっていたら問題ない話なので、QNAPのSurveillance Station(もうない)とかいうのをやめて、フリーのONVIF録画ソフトを探すかもしれない。

Seeed Studio XIAO nRF52840 Sense を試す(1)

なんかBLEで作りたいものが出てきたので、マイコンを探した。

BLEとSerial通信しか使わない予定なのでこれがよい。
また、6軸IMU、マイクも載っている様子。

昔はBLEモジュールとったものをマイコンとは別に用意する必要があったが最近は、なんでもかんでもSoC ?になっている。
それとも缶パッケージのなかに複数チップあるのだろうか?

準備

Arduinoを使用するのははるか昔にArduino Duemilanoveを使った以来で、IDEもパッとしない感じのイメージがあった。それはArduino IDE 1.x.xがそれに当たる。

なので、VScodeで開発しようと奮闘したが、VScode経由のArduino CLIでBoard Managerがうまく動いてくれなかったのであきらめた。

現在最新のIDEは、Arduino 2.x.xとなっており、GUIの見た目も操作性も多少まともになっている。

Board Manager

[File]→[Preference]から
以下のURLを追加する。
https://files.seeedstudio.com/arduino/package_seeeduino_boards_index.json

Board Managerから

「Seeed」を検索して、「Seeed nRF52 mbed-enabled Boards」をインストール。
(こちらだけでいい気がする)

Hello World

[File]→[Example]→[Basic]→[Blink]を書いてみる。

void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(LED_RED, OUTPUT);
}
// the loop function runs over and over again forever
void loop() {
  digitalWrite(LED_RED, HIGH);  // turn the LED on (HIGH is the voltage level)
  delay(1000);                      // wait for a second
  digitalWrite(LED_RED, LOW);   // turn the LED off by making the voltage LOW
  delay(1000);                      // wait for a second
}

LED_RED、LED_GREEN、LED_BLUEが定義ずみなので、使用できる。

書き込み

USBを差し込むと、COMポートが出現する。
画像のように、ボード選択で太文字の表示になっていると書き込みが可能になる。

もしそうでなければ、ボード上、USB-Cのとなりにある小さいリセットスイッチを二回押すことで書き込み待機状態にできる。

SimpleSerialShell

BLEを使う前に、プログラム修正→書き込みを繰り返すのは面倒。
組み込みマイコン内部で動くShellの実装はいろいろあるらしいが、メンテされていなかったりする。

  • NTshell (日本で有名っぽい。かなり軽量、Arduinoライブラリに入っていなかった)
  • SimpleShell (2020が最後のコミット)
  • SimpleShell Enhanced (SimpleShellのForkだったが、うまく動かなかった)
  • SimpleSerialShell (これを使用した)



Arduino_Builtlnを入れないとうまく動かなったような気もする。

[File]→[Example]→[SimpleSerialShell]→[AdjustableBlink]を試す。

ちゃんと動いている様子。