e-tipsmemo

ごった煮

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]を試す。

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

growi、elasticsearch、mongodbをアップデートする(Ubuntuマシン(普通のPC)とQNAP NAS)

growiをアップデートしたい。
具体的には以下のことを実現したいが、内容が壊れないで実行可能かわからない
あと、機能的に変更がないか

  • growiのアップデート
  • elasticsearchのバージョンアップ
  • mongodbのアップデート
  • growiをno_cdnにする(オプション)

特にサーバーをオフライン環境で使用したくなったためno_cdnのイメージに書き換えて
docker をrebuildしても動いてくれるのか不明なのでとりあえず、
まっさらなUbuntuにdockerでgrowiを入れてアップデートの予行演習をしてみた。

現状


Elasticsearchのバージョンを確認する。

 docker exec -it [Container ID] "/bin/bash"
curl -s -XGET http://localhost:9200/ | grep number
"number" : "6.8.22",

バージョンと対応表
GROWI v6.1.x へのアップグレード | GROWI Docs
目標は、
growi 6.1
Elasticsearch 7
mongodb 6.0
を目指す。

目次

ここを参考に行っていく
GROWI v5.0.x へのアップグレード | GROWI Docs

アップデート前に

必ずバックアップを取ってから行いましょう。自己責任で。
growi 5以上ではElasticsearch 6には対応していないことになっているので、
まずはElasticsearchとgrowi本体のアップデートから始める。(Mongodbは4.4のままを維持)
growi-docker-composerを利用しているので、
目次に従って、こちらを行っていく。
Upgrade Elasticsearch from 6.x to 7.x · weseek/growi-docker-compose Wiki · GitHub

これを見ると、elasticsearchのデータだけ消して、最新のイメージを利用するように指定したDockerファイルを指定して、docker composeするだけの様子。

手順1(growi-appとelasticsearchのアップデート)

自分はdocker-compose.ymlを変更して、volumeを自分で明示したディレクトリに指定しているので、
そこは合わせておく。(前のバージョンでmongodbやgrowi_dataがある場所に一致させておく)
Mongodbは、前のバージョンに合わせておく(今回の場合,4.4)

docker ps

でIDを確認する。

docker stop [container IDs]

で、growi-app、elasticsearch、mongodb を停止。
停止してもコンテナは残っている

docker container ls -a

docker rm [container IDs]

でgrowiとelasticsearchを消す

コンテナを消してもイメージがあるのでそれを消す。

docker imgaes
docker rmi [image IDs]

Elasticsaerchが生成したデータを手動で消す
(docker-compose.ymlでvolume指定を使用していれば、docker composeコマンドで削除できる)

ビルド1と起動

growiのイメージとelasticsearchのイメージに関してはまっさらになった(はず)なので
イメージをビルドしていく
(mongodbは同じバージョンなのでビルドしても置き換わらない(すでにあるので))

docker compose -f docker-compose.v61x-es7.yml build

相変わらず以下があると、ビルドに失敗するかもしれないので、コメントアウトして、
あとから手動で実行する

#RUN bin/elasticsearch-plugin install analysis-kuromoji
#RUN bin/elasticsearch-plugin install analysis-icu
docker compose -f docker-compose.v61x-es7.yml up -d

確認

docker ps


管理画面

Elasticsearchのバージョン

docker exec -it [Container ID] "/bin/bash"
curl -s -XGET http://localhost:9200/ | grep number
    "number" : "7.17.1",

growiはv6.1になり、Elasticsaerchはv7になった。
今のところlatest-nocdnのイメージはgrowi 5のものしかなさそうなので、
Dockerfileの中で、最初からgrowi:latest-nocdnを指定したほうがよさそう。
そうするとmongodbも5までしか対応していないらしい。

それに気づかず、growi 6.1.2にアップデートしてしまったが、
v5に変換されたページの見た目はlatest-nocdn(現時点で5.1.11)にしても
ぱっと見動いてそう?

ページのバージョン変換

前のバージョンの時に作ったページがあることが検出されているので
変換を行う。

メンテナンスモードに入る

管理画面のアプリ設定→一番下
GROWI v5.0.x へのアップグレード | GROWI Docs

メンテナンスモードを終了

メンテナンスモードから抜けないとページが見れいない様子


よさそう

Elasticsearchのターミナルで以下を実行しないと日本語のインデックスを構築できない

bin/elasticsearch-plugin install analysis-kuromoji
bin/elasticsearch-plugin install analysis-icu

Elasticsearchのコンテナを再起動する。

検索も動いてそう

手順2(mongodbのアップデート)

現在、mongodbは4.4であるが、メジャーバージョンを上げるときはスキップできない様子。
MongoDB Upgrade from 4.2 and 4.4 to 6.0 - Installation & Upgrades - MongoDB Developer Community Forums
Upgrade a Replica Set to 6.0 — MongoDB Manual

Upgrade Version Path

To upgrade an existing MongoDB deployment to 6.0, you must be running a 5.0-series release.

To upgrade from a version earlier than the 5.0-series, you must successively upgrade major releases until you have upgraded to 5.0-series. For example, if you are running a 4.4-series, you must upgrade first to 5.0 before you can upgrade to 6.0.

なので手順に従い、4.4→5.x→6.xとしていく
MongoDB のアップグレード | GROWI Docs

Growi 4.5.8から5.1.3までアップグレードした時の記録 - Qiita

4.4から5.0へは、

docker containerを停止する。

docker-compose.ymlのmongoのバージョンを書き換える

コンテナを起動する。

以下の手順でターミナルに入ってsetFeatureCompatibilityVersionとかいうものを設定する。

このdb~~から始まるコマンドは

docker exec mongo bash

で入ったターミナルでそのまま実行するのではなくて、
さらに

mongo

として、mongodbのターミナルに入る必要がある
その後、

 db.adminCommand( { setFeatureCompatibilityVersion: "5.0" } )

といったコマンドをうつ。

こうなる

ここでこの値が、5.0でないと、6.0にしたときにmongodbがうまく起動されない


setFeatureCompatibilityVersionを4.4のままで、6.0を起動した場合
ずっとRestartingのまま

この状態になっても5.0で起動しなおして、再びsetFeatureCompatibilityVersionを5.0に設定しなおす。
そして、6.0で起動しなおせばmongodb:6.0にアップデート完了となる。
(growi <=6.0だとmongodbは5までしか対応していないらしいのでアップデートを5で止めておく)

後日談(QNAPで挑戦)

Ubuntuを入れた普通のPCではOKだったのでQNAP NASで試したところgrowiとElasticsearchのアップデートはうまくいった
いろいろと書き溜めてあったページも変換され、検索インデックスもガチャガチャやっていたらリビルドできた。
最後にmongodbが4.4 → 5.0にできない!と嘆いていたらQNAPのContainer Stationのログに答えがあった。

どうやらmongodb 5.0以上はCPUがAVXに対応していないと使えないらしい!?(マジかよ)


上:QNAP NASIntel(R) Celeron(R) CPU J3455
下:Ubuntuマシン:AMD Ryzen 5 7600X 6-Core Processor

  • おしまい-

感想

nocdnのイメージが最新では用意されていないのに気付かなかったが、v5とv6でページに互換性があって助かった。
nocdnのイメージを自分で作成することが可能かわからないが、v6も新機能がたくさんある様子なので使ってみたい。プラグイン機能など

QNAPの性能が低すぎて、NAS以上に使い始めると物足りなくなってきてしまったので
普通の省電力PCにUbuntuなどを入れたものを運用したくなってきている。
そうすると6.0以上のほうがgrowi間でデータ移行が簡単にできそうらしい。

常時ONの機器が増えてきたので、電力測定をしてみたいと思い、購入したものなど。