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

店の呼び出しブザーをDiscord対応

以前ラズパイで作った店の呼び出しボタンだけどLine Nofityがサービス終了になるという事でDiscordの通知を追加した。該当部のソース

#!/usr/bin/env python3
# coding: utf-8
import os
import requests
import json

def send_discord_message(message_content):
    """
    DiscordのWebhookにメッセージを送信する関数
    PCでログインしているとandroidのポップアップ通知出ない模様
    エラーハンドリングしていない

    :param message_content: 送信するメッセージ
    """
    headers = {"Content-Type": "application/json"}
    payload = {"content": message_content}

    webhook_url = os.environ['DISCORD_WEBHOOK']

    response = requests.post(webhook_url, data=json.dumps(payload), headers=headers)

if __name__ == '__main__':
    send_discord_message( '2018/11/12 固定' )

その他追加箇所

--- a/control.py
+++ b/control.py
@@ -11,6 +11,8 @@ import RPi.GPIO as GPIO

from mail import visitmail
from line_notify import line_notify
+from discord_notify import send_discord_message
+
#from voice import make_voice

def handler(signal, frame):
@@ -52,6 +54,7 @@ def callBuzzer(channel):
str_current_time = current_time.strftime("%Y/%m/%d %H:%M:%S")
visitmail(str_current_time)
line_notify(str_current_time)
+ send_discord_message(str_current_time)
#make_voice(str_current_time)

webhook_url = os.environ[‘DISCORD_WEBHOOK’]のwebhook_url はこちらを参考に取得。

os.environはserviceのEnvironmentFileから仕込んであるけどwebhook_url べた書きでも多分困らない。

なんとなく作業中の注意点メモ。下からのツリー

江添本写経scope_exit

写経中にstd::scope_exitというものが出てきたが、(本が書かれている時点ではC++20に公式に取り込まれる予定だったみたいだが)C++20ではまだ取り込まれていない模様。

experimental/scopeというとこで実験的に入っているっぽい。

#include <experimental/scope>してstd::experimental::scope_exitすると使える模様。

experimentalなので何かあるかもしれないが写経はこれで使ってみる。

#include <iostream>
#include <experimental/scope>

void example() {
    auto cleanup = std::experimental::scope_exit([] {
        std::cout << "Scope exited.\n";
    });

    std::cout << "Doing work inside the scope.\n";
}

int main() {
    example();
    return 0;
}

な感じ。

Remote ContainerのVSCode拡張に設定追加

環境

作業端末

ローカルのWindows11、Docker未インストール。

Docker host

別のLinuxPC。(物理PCにインストールしているubunstu)

docker --version
Docker version 27.3.1, build ce12230

Remote Container

docker host上で動いているdockerコンテナ。

Remote Container起動方法

作業端末からVSCode上でremote sshでdocker hostに接続、docker hostからRemote Containerでコンテナに接続

本題の追加設定方法

RemoteContanair内のVSCode拡張に関する設定はdevcontainer.json内に記載。

おもむろに中身。

インストールしたい拡張は、customizations->vscode->extensionsに書く。

拡張のパラメータ設定はcustomizations->vscode->settingsに書く。

2024/11/23 C_Cpp.default.cppStandard/C_Cpp.default.cStandard追記

{
    "name": "ezoecpp",
    "dockerComposeFile": "docker-compose.yml",
    "service": "cpp1",
    "workspaceFolder": "/home/ubuntu/vol",
    "customizations": {
        "vscode": {
            "settings": {
                "c-cpp-flylint.flawfinder.enable": false,
                "c-cpp-flylint.lizard.enable": false,
                "c-cpp-flylint.flexelint.enable": false,
                "c-cpp-flylint.clang.extraArgs": [
                     "-std=c++23"
                ],
                "C_Cpp.default.cppStandard": "c++23",
                "C_Cpp.default.cStandard": "c23"
            },
            "extensions": [
                "ms-vscode.cpptools",
                "twxs.cmake",
                "jbenden.c-cpp-flylint",
                "ms-vscode.cpptools-extension-pack"
            ]
        }
    }
}

書いた設定は、コンテナをビルドしなおすと反映されている。設定されている値はコンテナ内で設定を開く(CTRL+,)とユーザ、ワークスペース以外にリモートコンテナ名のタブが生えているのでそこにある。

優先順位としては「コンテナの設定」>「ワークスペース」>「ユーザ」の模様。

コンテナの設定のsetting.jsonの実態がどこにあるかは未確認だけどdevcontainer.jsonに設定した値を原本と扱えばよいという思想だと思う。一応中身は、リモートコンテナ名のタブから右上アイコンの「設定(JSON)を開く」から見られる。

ワークスペース内に「.vscode/setting.json」があるのでいじったら設定優先順位真ん中で繁栄されると思うが多分devcontainer.jsonを使うべきなんだと思う。

なお、devcontainer.jsonは自分の環境だとDocker hostにリモートsshしたところにある一般的にはDocker Desktopいれてある作業端末にいると思う。

Aliexpressで買っているOLEDの微妙な違い

Aliexpressでよく1.3inchのOLEDを買っている。秋月で売っているこいつの少し大きい版みたいなやつ。

こいつが微妙なバージョン違いがある。

買ったやつはうらの金色の配線(フレキシブルフラットケーブル)に型番が書いてある。(aliの写真で見る限り書いていないやつなど色々ありそう)

DSC_0059

で手元にあるのはGME12864-70,GME12864-71,GME12864-77の3種類。なお、色と型番紐ついているかわからないけど(型番のとこに色も書いていたので色ごとに型番っぽい)70と77は白の、71は青のOLED文字色。

供給元と思われるとこのページをみると

GME12864-70のドライバはCH1116G/SH1106。

GME12864-77のドライバはSSD1315。しかも1.3inchでなく1.29inchらしい。

GME12864-71はページがないのでわからない。(後継っぽいGME12864-73があるけどそっちはI2Cがないタイプなので色々違いそう。)

GME12864-70,GME12864-71はAliで売っている互換Arduino NanoとAdafruit_SH1106.hの組み合わせで安定して動いている。

GME12864-77

GME12864-77はAdafruit_SH1106.hだと不安定というかすぐにとまる。Adafruit_SH110X.hだと動いている。

Adafruit_SH1106はAdafruit公式のOLEDに合わせてチューニングしているやつらしい。ちょっとパラメータが違うとダメっぽい。

なお、ラズピコや自作基盤のArduino互換機ではAdafruit_SH1106でも動くっぽい。

SSD1315と互換のあるSSD1306と互換のあるSH1106として動かしている状況なので色々無理が出るという状況っぽい。

ちゃんとするなら、ハードに合わせて使用ライブラリを交換するのがよいけど互換Nanoだとメモリが少ないのでOLEDライブラリ変えるとそれはそれでメモリ不足とか大変

Adafruit_SH110X

Adafruit_SH110Xライブラリの中のAdafruit_SH1106GはAdafruit_SH1106ライブラリのなかのものより若干メモリ使用量が多い模様。

メモリが足りない時に初期化でメモリ確保に失敗することがあるけど(ここ)、beginの中で戻り値を確認していないのですこしあとで死ぬ。多分続くdrawBitmapかoled_commandListで初期化されていないi2c_devを呼ぼうとした当たり。

google play consoleにてDUNSの登録を求められたが管理されている住所が違った

しばらく放置していたggolge playでAndroidアプリを公開するためのアカウントだが11/15だったかまでに支払いプロファイルを登録しないとアカウントを削除するという警告が来ていた。

面倒だが登録しようとすると組織アカウントだとDUNSという東京商工リサーチで管理してある番号が必要とのこと。

東京商工リサーチにて検索できるとのことで、検索ページから検索。

自社が登録されていたものの会社作った際の古い住所のままだった。google playにて登録する際に最近の取引明細の提出で確認が求められるようなニュアンスが書いてある。そのまま突き進むのは危険そうなのでgoogleに対してヘルプページから聞いたがAIによって違う窓口に振り向けられて担当窓口につながらない。

しかも、どの画面かスクリーンショットを取ってほしいといわれてとった際に、次へボタンを気軽に押したら半確定状態のようになってしまい一段と危険そうな状態に。

11/26の進捗に書いたが、DUNSに古い住所が登録されているまま支払いプロファイルを作成した場合は東京商工リサーチに修正依頼をかけてもgoogleの作成済み支払いプロファイルには自動反映されない模様。支払いプロファイルを新たに作成し再度DUNSを入力したところ反映された。

以下解決するかわからないけど時系列で追記していく

10/18 夕方

東京商工リサーチのページから更新依頼がかけられるというのを発見し実施。たしか動きがあるまで2~3営業日ぐらい必要とのことが申請画面の周りに書いてあった。

10/18 夜

googleの窓口からは「デベロッパー向けの専用サポート」にPlay Consoleヘルプから再度問い合わせてときていた。

10/19(または18深夜)

 google play console画面に「プロファイルを登録を延期依頼」みたいなリンクができていたので延長依頼を実施。クリックして画面が切り替わったぐらいのタイミングで申請期限が2025年2月13日まで延長されていた。期間に若干余裕ができたので少し待機。

10/24 夜

現時点で東京商工リサーチによる変更反映手続きはされていない模様。googleとappleの要求対応で処理がたまっており、8-10営業日ぐらいかかると東京商工リサーチのどこかのページに書いてあった。

10/31 13:47

東京商工リサーチより住所変更処理完了のメールが入った。13日(営業日だと10日ぐらい?)

14:30分にgoogle play consoleから支払いプロファイルの住所を確認したがまだ古い住所のまま。東京商工リサーチからgoogleのデータベースの住所に反映されるにはタイムラグがあるとどこかに書いてあったので少し待ってみる。

11/16 12:00

google play consoleから支払いプロファイルの住所を確認したがあいかわらずまだ古い住所のまま。2月まで確認期間延長済みなので問い合わせ等せずもうしばらく待ってみる。

11/26 15:00

いつまでも反映されないので、試しに「支払いプロファイルをつくる」からDUNSを入力し新しい支払いプロファイルを作成したところ新住所での支払いプロファイルが作成された。

住所やらの入力を求められたので何点か入力し保存実行。この後に書類提出があるはず。保存クリックから20分ほどたったがまだ、関連する通知は来ていない。

12/04

管理コンソールに入ったら本人確認までステップが進んでいた。多分メール通知等はなかったのでプロファイル確認が進んだかはログインしてチェックするしかなさそう。

会社の確認書類(登記簿か税務署からの書類か納税証明書)と個人確認の書類(免許かメモしなかったけど他いくつか)が必要。画像にしてアップロードしたところ「本人確認中」ステータスまで進んだ。

AliExpressで買ったレーザーポインタ使えた

aliで売っていた本体価格43円(送料200円前後)のレーザーポインターとりあえず使えた。(リンク

5個買って送料込み473円だったので一つ100円弱。3個必要なボタン電池ついていないので百均で2セット入り2パック買ってプラス150円ぐらい。

長さは指先サイズ。(57mmらしい)。

DSC_0042

部品はレーザー素子が入っている筒とボタン電池ホルダー(緑)、電極兼用と思られる蓋。頑丈層ではないけど安いしまあありだろう。

DSC_0043

電池が小さめのボタン電池LR41が3個必要。(コーナンに買いに行ったら高かったのでダイソーで調達。)

ボタン電池のセットが少し難しい。ボタン電池のホルダーは口が広い方と狭い方があるが、口の広い方にプラス面(直径の広い方)を向けて平になるように電池を3個詰め込む。蓋が電極を兼ねているみたいで奥に行くと接触しなそう。また、赤い筒の電極はばね式になっている。電池ホルダー内で隙間があるとばねがへたりそうなのでドライバー等で押し込んで隙間がないようにしといたほうがよさそう。

DSC_0044

出力が4mwあるので自分で使うのはよいが小売りはダメ。抵抗変更したら出力調整できるかもしれないけど分解は壊れてから。ためす

whoisをaptで入れたかっただけなのにnfsが止まっているだけで固まったっぽい

sudo apt install whois

入っていなかったので気軽にぽちっとな。といったところ

Fetched 51.7 kB in 3s (20.5 kB/s)
Selecting previously unselected package whois.
(Reading database ... 84374 files and directories currently installed.)
Preparing to unpack .../whois_5.5.22_amd64.deb ...
Unpacking whois (5.5.22) ...
Setting up whois (5.5.22) ...
Processing triggers for man-db (2.12.0-4build2) ...

ここいらで固まった。

root     2325613 2325562  0 11:19 pts/2    00:00:00 sudo apt install whois
root 2325619 2325613 0 11:19 pts/3 00:00:00 sudo apt install whois
root 2325620 2325619 0 11:19 pts/3 00:00:00 apt install whois
root 2325694 2325620 0 11:19 pts/3 00:00:00 apt install whois
root 2325709 2325694 0 11:19 pts/3 00:00:00 sh -c -- test -x /usr/lib/needrestart/apt-pinvoke && /usr/lib/needrestart/apt-pinvoke -m u || t
root 2325710 2325709 0 11:19 pts/3 00:00:00 /usr/bin/perl /usr/sbin/needrestart -m u

pid 2325710で動いていないっぽいので

yoshitake@epeasv01:~$ sudo cat /proc/2325710/stack
[<0>] rpc_wait_bit_killable+0x11/0x90 [sunrpc]
[<0>] __rpc_execute+0x121/0x340 [sunrpc]
[<0>] rpc_execute+0xda/0x110 [sunrpc]
[<0>] rpc_run_task+0x12e/0x190 [sunrpc]
[<0>] nfs4_do_call_sync+0x6b/0xc0 [nfsv4]
[<0>] _nfs4_proc_getattr+0x13b/0x180 [nfsv4]
[<0>] nfs4_proc_getattr+0x6e/0x110 [nfsv4]
[<0>] __nfs_revalidate_inode+0xd7/0x3c0 [nfs]
[<0>] nfs_access_get_cached+0x1da/0x280 [nfs]
[<0>] nfs_do_access+0x63/0x290 [nfs]
[<0>] nfs_permission+0x9a/0x1f0 [nfs]
[<0>] inode_permission+0xff/0x1b0
[<0>] link_path_walk.part.0.constprop.0+0x130/0x3c0
[<0>] path_lookupat+0x3e/0x1b0
[<0>] filename_lookup+0xe4/0x200
[<0>] user_path_at_empty+0x3e/0x70
[<0>] do_readlinkat+0x6d/0x140
[<0>] __x64_sys_readlink+0x1e/0x30
[<0>] x64_sys_call+0x1c24/0x25c0
[<0>] do_syscall_64+0x7f/0x180
[<0>] entry_SYSCALL_64_after_hwframe+0x78/0x80

スタックトレース中を見たらrpc_wait_bit_killableとかいっている。nfsが何やらともいっている。

直接の原因はnfsのrpc呼び出しが待ち状態でエンドレス待機中の模様。

身に覚えがあるといえば自動再接続設定しているnfsホストが停止中なのこと。これのせいかな?

という事で調べる

とりあえずcronからバックアップしているのでpsしたら終わっていないやつらが大量に待機中。

sudo systemctl stop cron

だと、待機中のrsyncプロセスは実行中のまま。(それはそう)ということで様子をみながら手動でpid指定でぺちぺちkill。と思ったが途中で面倒になったのでまとめてpkill。

消えないプロセスいたのでkill -9

作業が終わって、apt installが固まっていたコンソールを見たら処理が完了していた。きちんと見ていないのでいつ処理が再度走り出したかは未確認

とりあえず、cron止めておいた。nfsホストがお亡くなりなので直さなくては。

docker composeで作っていたzabbixをバージョンアップして再構築しようとしたら色々はまったときのメモ

mysqlのlatestイメージとzabbix-server-mysql:alpine-7.0-latestの組み合わせだとDBの権限が足りなくて初期構築のsqlが実行されない

docker compose を初回起動するとおおよそ以下のようなエラーが出た

ERROR 1419 (HY000): You do not have the SUPER privilege and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)

zabbixサーバー(zabbix-server-mysql)からdbに初期構築のsqlを実行しようとするが、バイナリログを使用しているときには特別に権限が必要らしい。意図的にはバイナリログを有効にしていないしDockerのmysqlだと通常無効と調べている途中で見たが実際にできたDBを覗くとバイナリログが有効になっている。

mysql> SHOW VARIABLES LIKE 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | ON    |
+---------------+-------+

my.cnfカスタマイズしている影響の可能性もあるけど、下のコマンドで素の引っ張りたてイメージでもバイナリログ有効になっていた。

 docker run -it --name test-wolrd-mysql -e MYSQL_ROOT_PASSWORD=mysql -d mysql

このへんから呼ばれるcreate.sql.gzの中身で呼ばれているっぽい。qz自体はzabbixのものでたぶんここらへんでつくられている模様。(ちゃんと見ていない)zabbix-serverの/usr/share/doc/zabbix-server-mysql/create.sql.gzを見ようとしたけど長いので見るのやめた。何か制約にかかるトリガーとかを作っているのだと思う。

対処法

my.confに以下を追加

[mysqld]
log_bin_trust_function_creators = 1

制約回避の設定。他にも回避策の指定は色々あるらしい。

zabbix-agentとのバージョン違い?

zabbix-server-1 | 197:20240929:102940.592 unknown request received from “192.168.xxx.yyy“: [active check heartbeat]

みたいなメッセージがzabbix-serverのログに出ていて、zabbixのGUIのエージェント死活監視の色が緑にならず灰色のままだった。データ自体は取れている模様。

対処法

エージェントとサーバのバージョンを合わせた。(他にもいろいろやっていた中だったのでたまたまの可能性もなくはない)

zabbiz-agentでサーバ側のipを指定する必要があるがdocker composeの素の状態だと変わってしまう

zabbix agent(/etc/zabbix/zabbix_agentd.conf)でServer,ServerActiveにzabbixサーバのIPを指定する必要があるがcompose内で明確に指定しないとipが変わってしまうので接続できなくなる時がある。

対処法

ipを固定すればよい。

まずはdocker-compose.ymlで、下みたいにカスタムネットワーク作ってIP指定する。

services->zabbix-server->networks->zabbix2hostでの利用指定とnetworks->zabbix2hostでのネットワーク作成。

services:
  zabbix-server:
    build: ./server
    cap_add:
      - NET_ADMIN
    restart: always
    depends_on:
      - db
    volumes:
      - "./data/zabbix:/var/lib/zabbix"
    environment:
      DB_SERVER_HOST: db
      MYSQL_USER: ほげ
      MYSQL_PASSWORD: ふが
    ports:
      - "10051:10051"
    networks:
      zabbix2host:
        ipv4_address: 192.168.100.2
      default: {}

networks:
  zabbix2host:
    driver: bridge
    ipam:
      config:
        - subnet: 192.168.100.0/24

zabbix2hostとdefaultの二つのネットワークに所属しているのでルーティング設定も必要。(zabbix-serverで使うネットワークが一つならおそらく不要)

dockerイメージでip route を使うがdocker-compose.ymlでcap_add:NET_ADMINの権限を付与していないと使えないはず。(もしくはprivileged指定)

docker起動時にルーティングをするようにentrypointとなるシェルを作成。

#!/bin/sh
# route2はdocker fileにてインストール済み
#向き先 host gwはcomposeで作成したネットワークのもの 
sudo ip route add 192.168.1.2 via 192.168.100.1

exec docker-entrypoint.sh "$@"

192.168.1.2(zabbix-agentが実際に動いているdockerのホストIP)は192.168.1.2(zabbix-agentが実際に動いているdockerのホストIP)は192.168.1.2(zabbix-agentが実際に動いているdockerのホストIP)は作ったネットワーク(192.168.100.1)を使う設定。

ルーティングだけ追加したら、元々のエントリーのdocker-entrypoint.shを呼び出し元のパラメータ付きでコール

で、Dockerファイルも作成

FROM zabbix/zabbix-server-mysql:alpine-7.0-latest

# 元イメージでユーザーがzabbix(1997になっているので一旦切り替え)
USER 0
COPY add-route-entrypoint.sh /usr/local/bin/add-route-entrypoint.sh
RUN chmod +x /usr/local/bin/add-route-entrypoint.sh && apk add --no-cache iproute2 && apk add --no-cache sudo && echo "zabbix ALL=(ALL) NOPASSWD: /sbin/ip" >> /etc/sudoers
USER 1997

ENTRYPOINT ["add-route-entrypoint.sh"]
CMD ["/usr/sbin/zabbix_server", "--foreground", "-c", "/etc/zabbix/zabbix_server.conf"]

alpineだとiproute2もないのでapk(alpineのapt相当)でインストール。sudoも使うのでインストール、シェル実行時にパスワードがいいらないように/etc/sudoersも編集。

あとは作ったadd-route-entrypoint.shをエントリーポイントにして、zabbix/zabbix-server-mysql:alpine-7.0-latestと同じCMDをつけて呼び出し。(ENTRYPOINT付けたらベースイメージのCMDがクリアされていた。引き継がれる気がしていたけどどこか間違っている?)

netplanのgateway4がdeprecatedになっていた

sudo vi /etc/netplan/50-cloud-init.yaml
network:
    ethernets:
        enp2s0:
            dhcp4: false
            addresses:
              - 192.168.1.5/24
            gateway4: 192.168.1.1
            nameservers:
              addresses:
                - 8.8.8.8
                - 8.8.4.4
    version: 2

からの

sudo netplan try

** (process:991): WARNING **: 08:38:09.630: gateway4 has been deprecated, use default routes instead.
See the 'Default routes' section of the documentation for more details.

と怒られた。

gateway4がdeprecated(非推奨)になってrouteを使えとのこと

network:
  version: 2
  ethernets:
    enp0s3:
      dhcp4: false
      addresses:
        - 192.168.1.100/24
      routes:
        - to: 0.0.0.0/0
          via: 192.168.1.1
      nameservers:
        addresses:
          - 8.8.8.8
          - 8.8.4.4

Dockerがhostのネットワークを使っている場合routingがこのto設定の影響を受けるので要注意