投稿者「wpepea」のアーカイブ

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

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で処理できる。

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

自宅用通知マシン作成(1)で自宅用の予約通知端末がとりあえずできたので、次は家から店に呼び出しできる機能を作る。

今は携帯で呼び出しているけど、ゆるふわろぼっとに呼び出された方が雰囲気的にも店を一時抜け出しやすそうなのでスタックチャンぽいやつで作ることにする。

書いている途中でみつけた。こちらのイメージなやつ

ハードは息子がしばらく使っていないM5Stack Basicがあったのでそいつを使用。同じ時期に買ったやつの紙にCore1.0と書いてあるので1.0なのかな。いずれにせよだいぶ古いバージョン。

開発環境構築

Arduino IDE2.3.2を使用しているけどかど開発環境出来ていなかったのでインストール。

File->Prefarence->Additional boards manager urlsに公式のURLを追記

https://m5stack.oss-cn-shenzhen.aliyuncs.com/resource/arduino/package_m5stack_index.json

tools->boods:hogeを選びboards managerからm5stack by m5stack officialをインストール

tools->boods:hogeからM5stack->m5coreを選択

file->examples->m5stack->Basics->FactoryTestを選びUploadを実行。なんとなく動いて要るっぽいことを確認する。

とりあえず顔をだす(M5avatar準備)

顔がないと始まらないので準備。こちらを参考にライブラリインストール。(と思ったら古いのがすでにいたので新しいものに上書き)

最近は、M5Stack.hみたいに機種ごとのライブラリをインクルードするのではなく、大体の機種をカバーしているM5Unified.hをインクルードして作るらしい。今のM5Avatarもそれを使っているということだろう。

M5Unifiedはライブラリマネージャーから入れられるとのことなのでインストール。#include <M5Stack.h>#include <M5Unified.h>に変更しコンパイル&アップロードで動いた。

ずいぶんコンパイルが重い。と思ったら、二度目から軽くなった。IDE1系の時と違い設定しなくてもコンパイル結果キャッシュするようになったのかな?普段重いものコンパイルしないから気づかなかった。

とりあえず声を出す

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

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

MP3_with_ESP8266Audio.inoというのが開いた。中身もmp3用っぽいけど細かいことは気にしない。

/// need ESP8266Audio library. ( URL : https://github.com/earlephilhower/ESP8266Audio/ )

サンプルソースに上のコメントがある。昔入れたと思われるのが入っていたのでそれを使う。はいっていたのは下のlibrary.propertiesで今日時点で最新ぽい。ただコミットに合わせてバージョン上げてはいなそう。

name=ESP8266Audio
version=1.9.7
/// set your mp3 filename
static constexpr const char* filename[] =
{
  "/mp3/file01.mp3",
  "/mp3/file02.mp3",
  "/mp3/file03.mp3",
  "/mp3/file04.mp3",
};

mp3ファイル4つ(手元にたまたまあったやつ)をサンプルソースに書いてある上記のファイル名にリネームしてをSDカードに放り込み実行。

とりあえず音は割れまくりだが動いたっぽい。試しに他のM5Stackに入れたら音は(比較すると)ほぼ割れなかった。その後、音が変なM5Stackのアンプに直接、代わりのスピーカーを繋げたらそっちはきちんと聞こえた。スピーカー自体がお亡くなりっぽい。

サンプルソースの中身を理解する作業メモはこちらに置いておいた。

この先はこちら

ESP Touchがつながらない時のチェックポイントメモ

なかなかつながらなくて調べたのでメモ。未検証も含む

接続先Wifiが分離モードになっていないか

分離モード(呼び名は色々ある)になっているとつながらなそう

WPAの世代が古くないか

古い親機でWPAが昔のタイプだとセキュリティが弱いのでそのままだとつながらない

してやるかそれでもダメな場合はESP8266のライブラリをver.2.0.0まで戻す。

esp-touchでブロードキャスト、マルチキャストを変更してみる

スマホアプリ側でブロードキャスト、マルチキャストを変更してみる。理由はわからないがこれで動いた。

「chan_shutdown_read: channel 1: shutdown() failed for fd 7 [i0 o0]: Not a socket」と怒られる

chan_shutdown_read: channel 1: shutdown() failed for fd 7 [i0 o0]: Not a socket

ubustsuのlinuxサーバ(VPS)からgithubにつなげようとしたら上記メッセージが出てうまくいかなかった。

※2024/3/15手順追記

環境

サーバ

  • Ubuntu 22.04.4 LTS \n \l
  • OpenSSL 3.0.2 15 Mar 2022 (Library: OpenSSL 3.0.2 15 Mar 2022)

操作端末

  • Windows11

原因

おそらくこちらにあるWindows側でのssh-agentが悪さしているよう。

事象的にはWindows側のssh-agentがForwardAgent yes設定にてカギをもってサーバに入っているけどそいつが見れなくなって要るっぽい

きちんと直すならばこちらの対応でいけたそう

対処

Windows側のssh-agentの問題らしいのでベータに変えたら解消したっぽい。(細かい原因追っていないのでちょっと怪しい)

手順としては管理者権限のPowerShellで以下を順次実施

インストール済みOPENSSHの削除

Microsoft.OpenSSH.Betaのインストール

※2024/3/15手順追記

1週間ほどしたらvscodeターミナルからsshが通らなくなっていた。パスを確認したところ昔のC:\Windows\system32\OpenSSHを指していて、今のC:\Program Files\OpenSSHを指していない。

個人用環境変数にC:\Program Files\OpenSSHを追加した。

細かいところで、1週間ぐらいたって通らなくなったのでWindowsアップデート等で書き換わった可能性もある。C:\Windows\system32\OpenSSHはシステム全体の環境変数に入っていたので、そちらがまた書き換わる可能性を考え個人用の環境変数の方に入れてみた。(どれだけ効果あるかや本当にWindowsUpdate絡みか確認していない。またおかしくなったらこれみて思い出す)

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

店の予約が入ったときすぐ気づきたいとか、店から自宅に呼び出しかけたりとか細々としたとこ改善したいので自宅用通知マシンを作成開始する。

第一段階としては、店に予約が入ったときにすぐ気づけるように予約が入ったら通知としてLEDを光らせる機能をつくる。

予約が入ったらじゃらんとかアソビューから通知メールが飛んでくる。数分以内に気づけたら十分なので、自宅側の通知マシンから定期的に通知メールがあるか確認する方式にする。

ちなみにメールサーバは自前(VPS)でpostfix&dovecotなのでそっちで一部処理しておく。自宅側の端末はESP8266(ESP-WROOM-02)で作成する。秋月で現在420円するので今ならESP-WROOM-32とほとんど値段変わらないのでそっち使ってもよい。(200円台の時に買ったのが数10個余っているので消費もかねて)

全体構成

  1. VPS上メールサーバのdovecotに予約メールが入ったときに、表題をみてメールを指定フォルダに振り分け。使用ツールはseive
  2. メールサーバ上にpythonで立てた未読予約メールカウント返却APIを準備。(最前面はnginx)
  3. espからAPIを定期的に呼び出し、未読の予約メールがあったらLEDを光らせて通知する。(既読にするのはPC上のメーラーで)

メールサーバサイド

seiveの設定

seiveで予約メールが届いた際に指定フォルダ(今回はINBOX.ジム.予約)に振り分け。(seiveのインストールは手順まとめていない。)

予約メールはとりあえず件名で判断。設定ファイルは以下。件名がXXだったらYYフォルダに振り分ける。

APIの準備

以前書いていた。こちら

APIのサービス化

/etc/systemd/system/mailapi.service作成

※ ~/apiをベースパスにしていたけどgit cloneの時のパスがずれたので後ほど~/yobidashi/server/apiに変更

一応メールアカウントとパスワードは外部から読み出しに(/home/yoshitake/api/mailapi.conf)

サービスに登録