7月に動作していた処理が8月にエラー

TL;DR 0始まりの数字を10進数で解釈させたい場合は$((10#$val))のように記載する。 経緯 date +%mの結果は、8月の場合は'08’となる。これを先頭の0を取って比較したいため$(($val))とやっていたところ、7月までは問題ないのだが8月になって以下のようなエラーが出る。 08: value too great for base (error token is "08") bashでは一文字目が0の数字は8進数とみなされるため、08という表記はダメ、というエラー。 対応としては、$((10#$val))のように変数の頭に'10#‘をつけることで10進数で解釈させることができる。 https://stackoverflow.com/questions/8078167/printf-in-bash-09-and-08-are-invalid-numbers-07-and-06-are-fine 同じようなことは過去してきたと思ったのだが、今回初めて遭遇してかなりびっくりした。

<span title='2021-08-02 00:00:00 +0900 +0900'>August 2, 2021</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;tack41

Accessの通貨型にはSystem.Decimal

TL;DR .Net FrameworkからAccessの通貨型の列に値を設定する場合は、System.Decimal型を利用する。 経緯 伝票番号が11桁の数値となるシステムにて、値をSystem.Int64型に格納していた。最終的にAccessのテーブルに格納する必要があり、こちらは通貨型で整数部11桁で定義していた。 OleDb経由でParameterを利用して(SQLにべた書きせずにobject型の変数として渡す)INSERTしたところ、何のエラーも吐かずにこけた。 どうも、System.Int64(=long)が渡されるとAccess側ではLong型(-2,147,483,648 ~ 2,147,483,647)に変換しようとするらしい。ただ、該当の列に「1L」(System.Int64型)を与えるとこけるが、「1」(System.Int32)ではこけないので、値そのものではなく型の違いによるエラーなのだと思われる。DEBUG実行してもエラーをはかずにこけるので切り分けに時間がかかった… 相手が通貨型11桁なのでそれに合わせてよしなに変換してくれるものと思っていたが甘かった。が、前回同じコードを実行した際にはエラーは起きなかったはずなのだが… 仕様が変わったのか? まぁ、特にAccessのような(レガシーな?)システムとの接続の際には、自動変換には期待せずこちらで必要な型が分かる場合は指定したほうが無難だと理解した。

<span title='2021-07-21 00:00:00 +0900 +0900'>July 21, 2021</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;tack41

DockerコンテナのZabbixからDockerホストの監視

Ubuntu20.04で構築しているDocker環境にて Dockerコンテナで構築したZabbix serverでDockerホストにzabbix agentをインストールして監視する場合、Zabbix serverの接続元IPがDocker内部IPになってしまう。既定ではDockerコンテナのIPは毎回変わるため、zabbic agent側でzabbix serverのIPを指定できない(configファイルに記載が必須)。 Dockerホスト1台で運用する環境であれば、内部IPを固定してしまえばよい。 当方では、2台でActive-Standbyで運用しており、自サーバがActiveの場合は内部IPでアクセスが来るが、Standbyの場合には(自サーバでないActiveサーバの)外部IPでアクセスが来るため、serverとして2つのIPを指定したい。 https://www.zabbix.com/forum/zabbix-help/379138-one-node-monitored-by-2-differents-zabbix-servers によると、configのSERVER値に複数のIPをカンマ区切りで指定することもできるらしい。 一方で、SERVER値にはホスト名の指定もできるので、ホスト名に対するAレコードを複数登録して動作確認したところ、こちらも問題なく動作した。なお、PTRレコードは不要。 環境によっては、IP直指定よりもDNSの方がよいというところもあるだろう。

<span title='2021-07-02 00:00:00 +0900 +0900'>July 2, 2021</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;tack41

050番号の運用をやめた

私がPC,スマホが好きなため、手元に多数の機器があります。 すべての端末で電話が取れるように出来たら、どの端末でも同じ環境で作業できると考えて050番号を運用していました。が、以下の理由でやめました。 SMSがとれない 現時点でSMSによる認証を完全に避けることは難しい。また、結局、通常の090,080,070の番号は必要。 SaaSで永続性に疑問がないのはTwillioくらいだが、こちらではSMS認証の目的で利用することは規約違反になる。 https://zenn.dev/kawabatas/articles/e996a7d59eeadf 最近の各種MVNOによる料金値下げで、電話番号付きとデータ専用での料金差がとても小さくなった LINEやFacebook Messenger等、ほとんどのメッセンジャーアプリには通話機能があり、それで用が足りることがほとんど。 もし電話番号出ないとダメなタイミングが発生したら、SIMを差し替えればよい。面倒だが、機会はほとんどないのでそれで充分 スマホの購入の際、SIMフリーであることは前提条件となる。現状、すべてSIMフリーではあるが。 NTTcomの050plusを利用していて、毎月わずかですが使わない機能にお金を払うことがなくなり、少し気が軽くなりました。

<span title='2021-06-27 00:00:00 +0900 +0900'>June 27, 2021</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;tack41

Ubuntu20.04 でのsecondary IPの設定

Ubuntu 20.04の2台構成で、サーバ固有のIPアドレスとは別にクラスタ用IPアドレスを割り振ることでクラスタを組もうとした際のメモ。 通信の送信元はクラスタIPで行いたい。Ubuntuで複数IPを割り当てると一方がSecondaryとなり、通信の送信元にはSecondaryでない方が使用される。これはsshサーバに接続してログに表示される接続元IPで確認。 サーバ固有のIPが192.168.1.191,クラスタIPが192.168.1.11の場合に、クラスタのマスタからメンバに降格してサーバ固有のIPのみ割り振られた状態で再度クラスタIPを追加すると、クラスタIPがSecondaryとなってしまう。/etc/netplan/99_config.yamlにて以下のように指定しているのだが。 network: version: 2 renderer: networkd ethernets: eth0: dhcp4: false dhcp6: false addresses: - 192.168.1.11/24 - 192.168.1.191/24 gateway4: 192.168.1.254 nameservers: addresses: [192.168.1.254] IPアドレスの順番を変えてもダメ。どうも、追加したIPアドレスが必ずSecondaryになるという仕様らしい。対応として一旦クラスタIPアドレスのみ割り当て、サーバ固有のIPアドレスを追加するという手順を踏んだところ、クラスタIPアドレスがSecondaryでない設定をすることができた。 …と思っていたが、それでもうまくいかないケースが発生。 インストール時にサーバ固有IPを初期設定すると、/etc/netplan/00-installer-config.yamlに設定が書き込まれ、そちらも含めて設定しようとするらしく、/etc/netplan/99_config.yamlを書き換えてもサーバ固有IPが解放されない状態となった。これは/etc/netplan/00-installer-config.yamlを/etc/netplan/00-installer-config.yaml.disabledのようにリネームすることで解消した。 /etc/netplan/00-installer-config.yamlを作成しろという記事はあるが、/etc/netplan/00-installer-config.yamlを無効化しろという記載がない記事が多いので、落とし穴かもしれない。

<span title='2021-06-24 00:00:00 +0900 +0900'>June 24, 2021</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;tack41