月別アーカイブ: 2024年3月

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

音声関連クラス化

見通しが悪くなりそうなので音声周りは別クラスに。多分まだ予想してない改造をしそなのでパラメーター渡すとか考えずに単純な別ファイル化だけ。(StackSpeaker.h)

呼び出しは

しておいて使いたいところで

通信

次に外部から呼び出せるようにserver機能を持たせる。店の外から呼び出す計画のでまずはhttpでそのまま外からつなげられるようする。そのうちリバースプロキシの後ろに隠すかもしれないけどとりあえずルーターにNAPTでさばかせておく。

wifi周り

スマートコンフィグ使おうかと考えたけど、ip指定で起動するときにデフォゲとサブネット与えないといけなかった。そいつらをしっかりと渡すとなると外から与えてスマートコンフィグの意味なくなるか、一回目の接続で取れた値を使用と面倒になりそう。というわけでおとなしく明示的に指定することにした。

と、サンプルにありそうなやつそのまま

server周り

これもよくありそうなやつ。

WebServer.hつかって、呼び出し処理があったら音声を流す処理を行う。

handleYobidashiの中で、speaker#stopVoice/speaker#startVoiceを直接呼んでいるので同期処理になっている。音声が流れ終わってから呼び出し側にはレスポンス返る。使うケース次第では非同期呼び出しにするためにさらにスレッドを呼ぶ形にする方が良い場合は多そう。

続き 呼び出し側の自宅端末バージョンアップ

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)

バージョン

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

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

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

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

/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に変更