M5Unified_StackChanを参考にした際のメモ

MP3_with_ESP8266Audio.inoを参考に音声出力をしていたが音がとんだり画面にノイズ?が入ったりとしていた。ツイッターで呟いたらタカヲさん(@mongonta555)から参考情報を教えてもらった。

こちらで音が出るようになった。リンク先レポジトリのメモ書きを残す。なお、M5Unified_StackChanにはあるが試していないものもある。

対象音声フォーマット

readmeにはwavとなっているけどmp3用

バッファ処理

MP3_with_ESP8266Audioにはなかったbuffer処理が入っている。下のあたり

音声ファイルのサンプリングレート

readmeには”wavファイルのサンプリング周波数は16khzか24khzにしてください。”とある。ffmpegで16khzか24khzに変換したかったが、26khzが生成されて直し方がわからなかったので26khzを受け入れて試験。サンプリングレートじゃなくてビットレートが26kbpsだった。

スピーカーのコンフィグ指定

下のようにいくつか指定が入っている。

sample_rate は出来上がったファイルに合わせてみた。

task_priorityは同じコアでの処理優先順位。数時大きい数が優先順位高くたしか23が最大値。m5avaterの中で2が使われているはずなので使っているライブラリの範囲では3にしとけば最優先のはず。

dma_buf_count /dma_buf_len はよくわかっていない。

task_pinned_core は処理をさせるCPUコアの指定(PRO_APP_NUMデフォルトで、もう一個がPRO_APP_NUM)。M5Unified_StackChanではPRO_CPU_NUMを使っていたがデフォルトでも音質違いが分からなかったのでデフォルトに戻してある。

  auto spk_cfg = M5.Speaker.config();
  spk_cfg.sample_rate = 26000;
  spk_cfg.task_priority = 23;
  spk_cfg.dma_buf_count = 20;
  spk_cfg.dma_buf_len = 128;
  //spk_cfg.task_pinned_core = PRO_CPU_NUM;
  M5.Speaker.config(spk_cfg);

ファイルクローズ処理

mp3.stop()の中でもoutやfileのクローズが呼ばれているのでソフトウェア的にはfileやoutのクローズ処理はいらないはず。ただし、どこかのサイト(メモってなかったら出典探せなくなった)で下みたいな書き方の方がスピーカーの最初の音が小さくなるみたいなことが書かれていたのでそちらに合わせた。ちなみに、スピーカーの最初の音とはスピーカーに電源が入る時のボッみたいな音。その違いが分からなかったが、こだわるところでもないので合わせておく。

補足

比較をしていないけどもともと使っていたのが160kbpsの3分というファイルだったのでそいつの影響が大きい気がしなくもない。

3Dプリンターでモデルの特定の場所が出なくなった

OpenSCADでモデル作成からstl出力。Repetier-HostV2.2.4というソフトでスライス&プリンタ操作をしている。使用しているプリンターはIUSEというアマゾンで安かった数年前のもの。

The object is not manifold.
This essentially means, that it is not watertight.
This normally causes problems during slicing, resulting in unwanted results.
We strongly advice to repair the model.

気付いたら上のエラーメッセージがRepetier-Hostにガッツリ出ている。しばらく出力していないモデルだけど昔は気づかなかった。

モデルがwatertight(防水?)でないのでうまくいかんかも知らんので修理しろと。watertightでないはモデルの部品が隙間なく並んでいても、重なる部分がないみたいな状態。1cmの立方体から1cmずらして立方体を置いたら隙間なく隣り合ってはいるけどかぶっている部分がないみたいな状態のはず。

なお、OpenSCADでは昔からnot manifoldという旨のメッセージが出ていたけど実際には出力されるから問題なしと放置していた。

いかにも修理ボタンがRepetier-Hostのエラーメッセージの横に出ているのでボタンを押してやると「オブジェクトは多様状態です」といかにも治った雰囲気のメッセージに変わった。

ところが実際に出力するとうまく出力されないと書こうとしたが、出力されたgcodeをRepetier-Hostのgcodeエディタから保存しオンラインシミュレーターで確認するといけそうなのが出力された。

とりあえず印刷中。ちゃんとOpenSCADでmanifoldにしてやってと書こうとしたが、gcode確認してうまく修理ボタンでなおったらそれでしのぐというのもありかもしれない。

結果が出たら追記する。->結果出た下に

manifoldにしてやらないでも動きそうなgcodeで通常通りに出力された。悪いgcodeと比較しようと思ったが何もしないでも動きそうなgcodeが現状出力されている。また、昔のうまくいかなかったときのgcodeは保存していないどころか観点になくチェックもしていない。

現時点では追加で調べられることもないので様子を見る。(調査いったん終了)

ArduinoIDE2系のキャッシュされたコンパイル済みファイルの消し方

ちょっと面倒。こちらをみると他の方法もあるみたいだけどガッツリ手動削除のほうで(以下の手法もリンク先が元)

消し方

ArduinoIDEのFile->Preference->Setting->Show verbose output duringのcompileにチェックを入れる

そのあとコンパイル実行。

outputに”Using previously compiled file ~”と”Using precompiled core ~”が出力される。その中にある目当てのクラスの場所が出ているはずなので検索。

対象のキャッシュを削除(面倒なら丸ごとフォルダでもいけるはず)

自分のけしたいやつはだけでなくて同じフォルダにいた他のやつも必要だったけどログ取り忘れた。

けしてっやて同じく他のも

Avatar.cppの~はすでに定義済みでうんぬんかんぬんというエラーメッセージだった。Avatar.cppとAvater.oも削除した。(コンパイルされたものがまとめて詰まっているobjs.aを見る作りな気がするのでそっちを削除してもよかったかも)

再度IDEからコンパイル実行(IDEの再起動等はいらないはず)

Show verbose output duringはかなり遅い気がするので好みで元の設定に。

一応発端

動きを調べようとライブラリフォルダのソースをフォルダ内で一旦コピーしてArduinoIDEからビルドした。ところAvatar – コピー.cppもコンパイルされインクルードガードなく(?)重複定義になった。

こんな配置で

PS C:\Users\kitam\Documents\Arduino\libraries\M5Stack_Avatar\src> ls

    Directory: C:\Users\kitam\Documents\Arduino\libraries\M5Stack_Avatar\src

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----

-a---          2024/03/07    14:40            261 Accessory.h
-a---          2024/03/07    14:40           8007 Avatar - コピー.cpp
-a---          2024/03/07    14:40           8007 Avatar.cpp

コンパイル(IDEのまるっとアップロード)実行

c:\Users\kitam\Documents\Arduino\libraries\M5Stack_Avatar\src/Avatar.cpp:233: multiple definition of `m5avatar::Avatar::getColorPalette() const'; C:\Users\kitam\AppData\Local\Temp\arduino\sketches\24ABF9CB78656DF99B51FAEF43A95CDD\libraries\M5Stack_Avatar\objs.a(Avatar - �R�s�[.cpp.o):c:\Users\kitam\Documents\Arduino\libraries\M5Stack_Avatar\src/Avatar - �R�s�[.cpp:233: first defined here
c:/users/kitam/appdata/local/arduino15/packages/m5stack/tools/xtensa-esp32-elf-gcc/esp-2021r2-patch5-8.4.0/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../../xtensa-esp32-elf/bin/ld.exe: C:\Users\kitam\AppData\Local\Temp\arduino\sketches\24ABF9CB78656DF99B51FAEF43A95CDD\libraries\M5Stack_Avatar\objs.a(Avatar.cpp.o): in function `m5avatar::Avatar::setColorPalette(m5avatar::ColorPalette)':
c:\Users\kitam\Documents\Arduino\libraries\M5Stack_Avatar\src/Avatar.cpp:231: multiple definition of `m5avatar::Avatar::setColorPalette(m5avatar::ColorPalette)'; C:\Users\kitam\AppData\Local\Temp\arduino\sketches\24ABF9CB78656DF99B51FAEF43A95CDD\libraries\M5Stack_Avatar\objs.a(Avatar - �R�s�[.cpp.o):c:\Users\kitam\Documents\Arduino\libraries\M5Stack_Avatar\src/Avatar - �R�s�[.cpp:231: first defined here

自宅用通知マシン作成(3)

スタックチャン風呼び出しマシン作製の続き。(これから書く)

音声の出し方はこちらでしらべて手を付けられそうになった。

まずは出し方で調べた音声用のAudioOutputM5Speakerを別ファイルに切り出し。サンプルソースほぼそのまんま。ただ、他の人とクラス名かぶりそうなのでネームスペースだけ切っておいた。

ファイル名指定したらファイル流す、止める関数追加

void stopVoice() {
  if (mp3.isRunning()) mp3.stop();
}

void startVoice(const char *filename) {
  file.open(filename);
  mp3.begin(&file, &out);
}

セットアップの中でavater.initしてループの中でボタン押されたらストップ&スタートでとりあえず音楽は流れる。が、途切れがち。CPUコア1にだいぶ頑張らせているからかな?

avater.initの中から呼ばれる描画タスクはどちらもcore1で動いている。音声もcore1。今のところ使ってないけどcore0はwifiで結構使うみたいなので開けておきたい。

CPU負荷が原因ならmp3からcpuに優しいwavにしたらいいじゃないと試してみたけど状況は悪化。ファイル形式変更の道もつらそうなのでやはりmp3で頑張ってみる。

試しにスピーカーで使うCPUをcore0に変えても状況は変わらず。もしかしてCPUのせいじゃない??

タカヲさんからサンプルを教えてもらったので一旦こちらを試す。

このあとは調べ中。タカヲさんの調べながら(おわったら?)書き足す->試したときのメモこちら

続きはこちら

EpeaAudioOutputM5Speaker.h)

CentOS7でyumのDB再構成

とあるパッケージを入れようとすると、エラー: db5 エラー (5) (dbcursor->c_get において): 入力/出力エラーです。といわれた

どうもyumで使っているrpmのDBが壊れたらしい。

DBファイルがある/var/lib/rpmに移動しDBファイルを一応バックアップとったうえで削除し、DBのrebuild実行。

むぅ。パッケージ名の整合性チェックは通った

が、試しにパッケージ名を読み込みなおしてみた

その後sudo rpm –rebuilddbで動いた。

整合性チェックはツール上では通ってたけどそこでかからないレベルでおかしくなってたのかな?

c_getで引っかかってしまったってことはbit単位ぐらいでおかしくなってそうだし。(いつも通り細かくは追わない)

Ubuntu 22.04.4にzabbix-agentをインストール(apt-get)

2024/09/19追記

ubuntsu24にアップデートした際にzabbix用のレポジトリがなくてupdateできなかった。もしかしたら下記のインストール手順の前にapt用のレポジトリの設定がいるかも。設定方法は以下のイメージ。debファイルのバージョン部分に関してはこちらの公式ページを見て適宜インストールするOS情報で書き換え

wget https://repo.zabbix.com/zabbix/6.4/ubuntu/pool/main/z/zabbix-release/zabbix-release_6.4-1%2Bubuntu24.04_all.deb
sudo dpkg -i zabbix-release_6.4-1+ubuntu24.04_all.deb

バージョン

エージェントを入れるサーバー側の作業

インストール(インストール時のログは下の方に張り付けておいた)

とりあえず起動(同じくログは下の方に張り付けておいた)

設定開始前のファイル退避

/etc/zabbix/zabbix_agentd.confのServerとHostnameを編集して(hostname設定したけど使わないかも)

サービス再起動

必要ならエージェント側のポートのファイヤウォールを開ける

本体サーバー側の作業

すでにある前提で、Webの画面からログイン

Configration->Hostsから右上の”Create host”ボタンを選択

name任意、group任意、inrterfaceはアージェントのサーバの値、必要ならテンプレートを指定。

しばらく待っていると通信できてたらConfigrationのhostsに生えてきた追加したhostのAvailability->ZBXが緑になる。

ログ関係

インストール時ログ

起動設定時ログ

Jenkinsのプラグインにログを埋めてみる

Jenkinsプラグインのエラーがなかなかわからなかった(こちら)のでとりあえずログだしするために微妙に改造。

対象はssh-agent。

とりいそぎレポジトリからクローン

STSにインポートしたかったけどMavenのライフサイクル周りが色々エラーを出していたのでVSCode(実質ターミナルしか使っていないのでコマンドラインと同じ程度)で作業。

Java/Mavenもなかったりパス通っていなかったのでダウンロード&パス通し(こちらの感じ)

C:\Users\kitam\git\ssh-agent-plugin> mvn install  

おもむろにパッケージ化したくて上記コマンドを打ったがテストでひっかかった。

とりいそぎログ出しが目標なのでテストケースをコメントアウト(クラスは残し殻だけの状態)し再度実行。

targetディレクトリにssh-agent.hpiができている

これをジェンキンス管理画面のプラグイン->高度な設定->ファイルを指定->デプロイ

でインストールできることを確認

とりあえず動くこと確認したので次はログの埋め込み。

            launcher.launch().stdout(listener.getLogger()).cmds("id").quiet(true).start().joinWithTimeout(1, TimeUnit.MINUTES, listener);
            launcher.launch().stdout(listener.getLogger()).cmds("env").quiet(true).start().joinWithTimeout(1, TimeUnit.MINUTES, listener);
            int status = launcher.launch().stdout(listener.getLogger()).cmds("ssh-agent", "-k").quiet(true).start().joinWithTimeout(1, TimeUnit.MINUTES, listener);
            listener.getLogger().println("status: " + status);

hudson.Launcherやhudson.model.TaskListenerにログ出し機能、パイプ機能的なものがあるので適宜埋め込んでもう一回ビルド~デプロイ。

(デフォルト設定だと?)管理画面のコンソールに出力される。

Jenkinsのshh-agentがつながらない

一気にすべてをアップデートしたので何が原因かわからないけどshh-agentがつながらなくなっている。

DockerのJenkinsからその中のssh-agentを使うというめんどくさそうな構成

これから細かく調べるが

FATAL: [ssh-agent] Could not find specified credentials
[ssh-agent] Looking for ssh-agent implementation...
[ssh-agent] FATAL: Could not find a suitable ssh-agent provider

(スタックトレースは長くなるので下のほうに張り付け)

本来だと以下みたいになる

[ssh-agent] Using credentials (credentials名) 
[ssh-agent] Looking for ssh-agent implementation...
[ssh-agent]   Exec ssh-agent (binary ssh-agent on a remote machine)
$ docker exec 80f7594988d50d5a190f788b4ffab62d8902fb594ebfffe3c282f6ace8ee88ba ssh-agent

死んでいるのはこの辺の処理

SSHAgentの拡張ポイント使っているプラグインがないか、あるけどfactory.isSupported(launcher, listener)のとこでダメっぽい。

こいつかな?ssh-agentがキルできないと(≒すでに生きていないと)いけない判定がある

よくみたら0か1ならよかった。

あまりにもわからないからプラグインにログ入れてみたらstatus が126といっている。

ログの埋め方はこちら

[ssh-agent] Looking for ssh-agent implementation...
[Loaded]   Exec ssh-agent (binary ssh-agent on a remote machine)
status: 126

こちらをみると実効権限がないと。

[Loaded]   Exec ssh-agent (binary ssh-agent on a remote machine)
OCI runtime exec failed: exec failed: unable to start container process: exec: "ssh-agent": executable file not found in $PATH: unknown
status: 126

さらにログ埋めたらうえ

そしてさらにさまよったら、ssh-agent入れなきゃいけないのはjenkinsファイルに書いてあるimageなことにやっと気づいた。ブログ書きながらやったけどただのポカミスだ。。。

pipeline {
	agent {
		docker {
			image 'kyoshitake/maven'

長くなった元々のスタックトレース

Also: org.jenkinsci.plugins.workflow.actions.ErrorAction$ErrorId: 594109d1-aaf2-4c19-97c1-539affc618f2 java.lang.RuntimeException: [ssh-agent] Could not find a suitable ssh-agent provider. at com.cloudbees.jenkins.plugins.sshagent.SSHAgentStepExecution.initRemoteAgent(SSHAgentStepExecution.java:176) at com.cloudbees.jenkins.plugins.sshagent.SSHAgentStepExecution.start(SSHAgentStepExecution.java:64) at org.jenkinsci.plugins.workflow.cps.DSL.invokeStep(DSL.java:323) at org.jenkinsci.plugins.workflow.cps.DSL.invokeMethod(DSL.java:196) at org.jenkinsci.plugins.workflow.cps.CpsScript.invokeMethod(CpsScript.java:124) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.base/java.lang.reflect.Method.invoke(Unknown Source) at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:98) at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325) at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1225) at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1034) at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:41) at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116) at org.kohsuke.groovy.sandbox.impl.Checker$1.call(Checker.java:180) at org.kohsuke.groovy.sandbox.GroovyInterceptor.onMethodCall(GroovyInterceptor.java:23) at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.onMethodCall(SandboxInterceptor.java:163) at org.kohsuke.groovy.sandbox.impl.Checker$1.call(Checker.java:178) at org.kohsuke.groovy.sandbox.impl.Checker.checkedCall(Checker.java:182) at org.kohsuke.groovy.sandbox.impl.Checker.checkedCall(Checker.java:152) at com.cloudbees.groovy.cps.sandbox.SandboxInvoker.methodCall(SandboxInvoker.java:17) at org.jenkinsci.plugins.workflow.cps.LoggingInvoker.methodCall(LoggingInvoker.java:105) at WorkflowScript.run(WorkflowScript:18) at org.jenkinsci.plugins.pipeline.modeldefinition.ModelInterpreter.delegateAndExecute(ModelInterpreter.groovy:137) at org.jenkinsci.plugins.pipeline.modeldefinition.ModelInterpreter.executeSingleStage(ModelInterpreter.groovy:666) at org.jenkinsci.plugins.pipeline.modeldefinition.ModelInterpreter.catchRequiredContextForNode(ModelInterpreter.groovy:395) at org.jenkinsci.plugins.pipeline.modeldefinition.ModelInterpreter.catchRequiredContextForNode(ModelInterpreter.groovy:393) at org.jenkinsci.plugins.pipeline.modeldefinition.ModelInterpreter.executeSingleStage(ModelInterpreter.groovy:665) at org.jenkinsci.plugins.pipeline.modeldefinition.ModelInterpreter.evaluateStage(ModelInterpreter.groovy:288) at org.jenkinsci.plugins.pipeline.modeldefinition.ModelInterpreter.toolsBlock(ModelInterpreter.groovy:544) at org.jenkinsci.plugins.pipeline.modeldefinition.ModelInterpreter.toolsBlock(ModelInterpreter.groovy:543) at org.jenkinsci.plugins.pipeline.modeldefinition.ModelInterpreter.evaluateStage(ModelInterpreter.groovy:276) at org.jenkinsci.plugins.pipeline.modeldefinition.ModelInterpreter.withEnvBlock(ModelInterpreter.groovy:443) at org.jenkinsci.plugins.pipeline.modeldefinition.ModelInterpreter.withEnvBlock(ModelInterpreter.groovy:442) at org.jenkinsci.plugins.pipeline.modeldefinition.ModelInterpreter.evaluateStage(ModelInterpreter.groovy:275) at org.jenkinsci.plugins.pipeline.modeldefinition.ModelInterpreter.withCredentialsBlock(ModelInterpreter.groovy:481) at org.jenkinsci.plugins.pipeline.modeldefinition.ModelInterpreter.withCredentialsBlock(ModelInterpreter.groovy:480) at org.jenkinsci.plugins.pipeline.modeldefinition.ModelInterpreter.evaluateStage(ModelInterpreter.groovy:274) at org.jenkinsci.plugins.pipeline.modeldefinition.ModelInterpreter.inDeclarativeAgent(ModelInterpreter.groovy:586) at org.jenkinsci.plugins.pipeline.modeldefinition.ModelInterpreter.inDeclarativeAgent(ModelInterpreter.groovy:585) at org.jenkinsci.plugins.pipeline.modeldefinition.ModelInterpreter.evaluateStage(ModelInterpreter.groovy:272) at org.jenkinsci.plugins.pipeline.modeldefinition.ModelInterpreter.stageInput(ModelInterpreter.groovy:356) at org.jenkinsci.plugins.pipeline.modeldefinition.ModelInterpreter.stageInput(ModelInterpreter.groovy:355) at org.jenkinsci.plugins.pipeline.modeldefinition.ModelInterpreter.evaluateStage(ModelInterpreter.groovy:261) at org.jenkinsci.plugins.pipeline.modeldefinition.ModelInterpreter.inWrappers(ModelInterpreter.groovy:618) at org.jenkinsci.plugins.pipeline.modeldefinition.ModelInterpreter.inWrappers(ModelInterpreter.groovy:617) at org.jenkinsci.plugins.pipeline.modeldefinition.ModelInterpreter.evaluateStage(ModelInterpreter.groovy:259) at org.jenkinsci.plugins.pipeline.modeldefinition.ModelInterpreter.withEnvBlock(ModelInterpreter.groovy:443) at org.jenkinsci.plugins.pipeline.modeldefinition.ModelInterpreter.withEnvBlock(ModelInterpreter.groovy:442) at org.jenkinsci.plugins.pipeline.modeldefinition.ModelInterpreter.evaluateStage(ModelInterpreter.groovy:254) at ___cps.transform___(Native Method) at com.cloudbees.groovy.cps.impl.ContinuationGroup.methodCall(ContinuationGroup.java:90) at com.cloudbees.groovy.cps.impl.FunctionCallBlock$ContinuationImpl.dispatchOrArg(FunctionCallBlock.java:116) at com.cloudbees.groovy.cps.impl.FunctionCallBlock$ContinuationImpl.fixArg(FunctionCallBlock.java:85) at jdk.internal.reflect.GeneratedMethodAccessor167.invoke(Unknown Source) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.base/java.lang.reflect.Method.invoke(Unknown Source) at com.cloudbees.groovy.cps.impl.ContinuationPtr$ContinuationImpl.receive(ContinuationPtr.java:72) at com.cloudbees.groovy.cps.impl.ClosureBlock.eval(ClosureBlock.java:46) at com.cloudbees.groovy.cps.Next.step(Next.java:83) at com.cloudbees.groovy.cps.Continuable$1.call(Continuable.java:152) at com.cloudbees.groovy.cps.Continuable$1.call(Continuable.java:146) at org.codehaus.groovy.runtime.GroovyCategorySupport$ThreadCategoryInfo.use(GroovyCategorySupport.java:136) at org.codehaus.groovy.runtime.GroovyCategorySupport.use(GroovyCategorySupport.java:275) at com.cloudbees.groovy.cps.Continuable.run0(Continuable.java:146) at org.jenkinsci.plugins.workflow.cps.SandboxContinuable.access$001(SandboxContinuable.java:18) at org.jenkinsci.plugins.workflow.cps.SandboxContinuable.run0(SandboxContinuable.java:51) at org.jenkinsci.plugins.workflow.cps.CpsThread.runNextChunk(CpsThread.java:187) at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.run(CpsThreadGroup.java:423) at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:331) at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:295) at org.jenkinsci.plugins.workflow.cps.CpsVmExecutorService$2.call(CpsVmExecutorService.java:97) at java.base/java.util.concurrent.FutureTask.run(Unknown Source) at hudson.remoting.SingleLaneExecutorService$1.run(SingleLaneExecutorService.java:139) at jenkins.util.ContextResettingExecutorService$1.run(ContextResettingExecutorService.java:28) at jenkins.security.ImpersonatingExecutorService$1.run(ImpersonatingExecutorService.java:68) at jenkins.util.ErrorLoggingExecutorService.lambda$wrap$0(ErrorLoggingExecutorService.java:51) at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) at java.base/java.util.concurrent.FutureTask.run(Unknown Source) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.base/java.lang.Thread.run(Unknown Source) Finished: FAILURE

spring-boot-starter-parentのバージョンアップ時メモ

小さいシステムバージョンアップしようとしたら色々コンパイルエラー(他)が出たので作業しながらメモ残す。新バージョンのライブラリ(Junitとか)は極力新しい奴のデフォルトに合わせる予定だが、つらくなったら妥協する。

作業内容

  • 2.1.6.RELEASEから3.2.3
  • JDKは11から17(21のバイナリで17動作指定)

Junitのエラー

Junit4系から5系に変わりった。

以下2つがコンパイルエラー。

  • import org.junit.Test
  • import org.junit.runner

org.junit.jupiter.api.Test に代わってrunnerはいらない

import static org.junit.Assert.assertHOGE

import static org.junit.jupiter.api.Assertions.assertHOGEに

import javax.servlet.http.HttpServletRequest;

import jakarta.servlet.http.HttpServletRequest;にパッケージ名が変わっている

import org.hibernate.validator

jakarta.validation.constraints.HOGEへ

以下はいれてコンパイルエラーは消えるがすでに org.hibernate.validatorはDuplicateだった。

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-validation</artifactId>
		</dependency>

import javax.persistence.HOGE

jakarta.persistence.HOGEへ

とりあえずコンパイルエラーは消えた。このあと実行時のやつらを

実行時のjar重複

Standard Commons Logging discovery in action with spring-jcl: please remove commons-logging.jar from classpath in order to avoid potential conflicts

こちらによるとほかの依存している奴と重複すると警告がでる。

依存関係から除外

		<dependency>
			<groupId>jp.co.epea</groupId>
			<artifactId>jpholiday</artifactId>
			<version>0.0.1</version>
			<exclusions>
				<exclusion>
					<groupId>commons-logging</groupId>
					<artifactId>commons-logging</artifactId>
				</exclusion>
			</exclusions>
		</dependency>

LogLevelの型?

Failed to bind properties under 'logging.level.org.hibernate.sql' to org.springframework.boot.logging.LogLevel:

    Property: logging.level.org.hibernate.sql
    Value: "DUBUG"
    Origin: class path resource [application.properties] - 12:33
    Reason: failed to convert java.lang.String to org.springframework.boot.logging.LogLevel (caused by java.lang.IllegalArgumentException: No enum constant org.springframework.boot.logging.LogLevel.DUBUG)

Action:

Update your application's configuration. The following values are valid:

    DEBUG
    ERROR
    FATAL
    INFO
    OFF
    TRACE
    WARN

application.propertiesのログレベル指定をorg.springframework.boot.logging.LogLevel=DUBUGにしたらとりあえず動くけどそんなプロパティないと警告出ている。また、デバックログは出てないっぽい。そもそもなにも働いていないからエラーにもならないだけだな。

Description	Resource	Path	Location	Type
'org.springframework.boot.logging.LogLevel' is an unknown property.	application.properties	/momoyama-web/src/main/resources	line 12	Language Servers

あらためて確認すると

  • logging.level.sql=DEBUG
  • logging.level.org.hibernate.SQL=DEBUG
  • logging.level.org.hibernate.orm.jdbc.bind=TRACE

これらは使えるっぽい(上ふたつは多分同じものさす)

改めて設定したら使えた。クラスパスの反映とかがうまくいってないかったのかな?ちょっと様子見。

それはそうとSTSでapplication.properties触ろうとするとかなりの確率でフリーズする。

HHH90000025

HHH90000025: PostgreSQLDialect does not need to be specified explicitly using 'hibernate.dialect' (remove the property setting and it will be selected by default)
spring.jpa.database=POSTGRESQL
spring.datasource.driverClassName=org.postgresql.Driver

がいらなくなったらしい

HHH000489

HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration)

調べ中

これはそういうものとここに書いてある。とりあえず受け入れる。

spring.datasource.hoge

spring.sql.init.hogeに変更

MP3_with_ESP8266Audio.inoのメモ

M5UnifiedのExampleに音声再生があったのでそれで試す。

File->Example->M5Unified->Advanced->Speaker_SD_wav_fileを選択。

自宅用通知マシン作成(2)

と、行こうとしたけど色々初めてなのでメモ残しながら確認していく。描画関係はおいておいて音声出力周りのみ予定。

試しながら書いているので丸っと書き換わるかも

M5Unified

最近のM5Stackは機種間をまたいでソースをある程度共有できるM5Unifiedを使う。M5Unifidには

みたいに各階層(カテゴリ?)毎にそれぞれコンフィグがあって細かい設定を仕込めるみたい。

ダウンロードしたソースのM5Unified\src\utility\M5Unified.hppやM5Unified\src\utilityあたりに中身がいる。ドキュメントは探していないここにあった。ぱっとみ、cppのコメントパッと見た中だと日本語もある。

/// Increasing the sample_rate will improve the sound quality instead of increasing the CPU load.
    spk_cfg.sample_rate = 96000;

音質とCPU負荷は引き換えと。手持ちのM5Stack Basicのスピーカーの音質だとどうせ頑張るところじゃないと思うので下げてよいかも。

SDカード

M5Unifiedへの移植ポイントにSD.begin()の追加ってのがあるけど前はなかったのかな?よくわからん。

bool begin(uint8_t ssPin=SS, SPIClass &spi=SPI, uint32_t frequency=4000000, const char * mountpoint=”/sd”, uint8_t max_files=5, bool format_if_empty=false);

+    while (false == SD.begin(GPIO_NUM_4, SPI, 25000000))
+    {
+      delay(500);
+    }

とりあえず上のイメージでよいらしい。最後のクロックレートはSDカードの一番遅い規格だと思うのでものによってはもっとあげられるのかな。GPIO_NUM_4はESP32のPIN指定からきていると思うけど追っていない。

音声

AudioOutput(本体)、AudioFileSourceHOGE(読み込み元)、AudioGeneratorHUGA(音声化)の3点セットが基本みたい。

AudioFileSourceID3は音声ファイルのプロパティ的な奴を扱える。

AudioOutputM5Speakerはトリプルバッファリングをよろしくやってくれながら(よくわかっていない)、M5Unifidのスピーカーに音声を渡してくれている。ChatGPT API搭載AIスタックチャンのレポジトリでは別ファイルに切り出されていた。(おおよそ一緒ぐらいのふんわりした確認)何か困ったらこっちにも情報あるかも。

AudioOutputM5Speakerが依存しているのはAudioOutput.hとM5Unified.hとみたい。

で開き

で継続

で終了。

おおよそ最小ぐらいの動作ソース

イタリックになっているところは別ファイルに切り出してすっきりさせたらよさそう。

こいつをベースにサンプル等をみたら何とかなりそう。

isRunningの周辺ここに大体まとまっていた。

ボリューム

ボリューム設定は以下。特定のバーチャルチャンネルに個別設定もできる(バーチャルチャンネルはわかっていない。文字から察するになにか仮想的な音声チャンネルを使う機能があるのだろう)

    M5.Speaker.setVolume(volume);
    M5.Speaker.setChannelVolume(m5spk_virtual_channel, volume);

コア指定?

ChatGPT API搭載AIスタックチャンのレポジトリでスピーカー再生タスクを割り当てるCPUコアを以下のように割り当てている。

こちらを見ると無線関係を使っているときにはCore0(PRO_CPU_NUM)を無線関連でかなり使うので、比較的空いているCore1(APP_CPU_NUM)を指定しているのかな?

AudioGeneratorMP3#close

cppの内部でoutputとfile閉じて、running(起動確認フラグ)をfalseにしている。こちら一つでまとめてクローズする思想な気がする。

この実装を信じるとisRunningとcloseで処理できる。