2023-12-26

macOSのbashでzshに変更するよう促すメッセージを消す方法

macOS上のbashを使おうとすると、以下のようなメッセージが出力される。
The default interactive shell is now zsh.
To update your account to use zsh, please run `chsh -s /bin/zsh`.
For more details, please visit https://support.apple.com/kb/HT208050.
これを消すには、 ~/.bashrc などbashが起動したときに読み込まれるファイルに以下の記述を加える。
export BASH_SILENCE_DEPRECATION_WARNING=1

2023-06-25

lcov function coverage lines

新しいlcovで作ったファイルを古いlcovに読ませると、ファンクションカバレッジが半減するようになった。 どうも新しいlcovでは関数定義の開始・終了行を記録するようになったらしく、古いlcovでそのまま読ませると、終了行を関数名と認識するらしい。

バージョン番号の違いまでは追っていないが、最近1-2周間ほどの間に、CIのmacOS上でbrewを使ってインストールしたlcovのデータを、Linuxマシンのlcovでマージさせようとするとこの問題が起こった。

以下は新しいlcovの出力例:

SF:/Users/runner/work/obs-studio-cirun/obs-studio-cirun/obs-studio/libobs/callback/decl.h
FN:32,37,decl_param_free
FN:45,55,decl_info_free
FNDA:113041,decl_param_free
FNDA:77756,decl_info_free
以下は古いlcovで同じファイルを処理した例:
SF:/home/runner/work/obs-studio-cirun/obs-studio-cirun/obs-studio/libobs/callback/decl.h
FN:32,decl_param_free
FNDA:2,decl_param_free
FN:45,decl_info_free
FNDA:11,decl_info_free

sedで以下のように処理することにした。

sed -i 's;^FN:\([0-9]*\),\([0-9]*\),;FN:\1,;'

2023-05-18

lcov on macOS

macOS上でLCOVを使用しカバレッジレポートを取る方法を説明する。

インストール

brew install llvm lcov w3m

CMakeのシンプルな設定例

CMakeLists.txt:
cmake_minimum_required(VERSION 3.16)
project(a VERSION 0.1.0)

add_compile_options(-fprofile-arcs -ftest-coverage)
add_link_options(--coverage)

add_executable(a a.c)
以下の設定を試したが、生成されるカバレッジデータのフォーマットが異なり、LCOVで処理する方法がわからなかった。
# add_compile_options(-fprofile-instr-generate -fcoverage-mapping)
# add_link_options(-fprofile-instr-generate -fcoverage-mapping)
その他、以下のファイルを準備する。 llvm-gcov.sh:
#! /bin/bash
exec `brew --prefix llvm`/bin/llvm-cov gcov "$@"

ビルドし実行

以下のどちらでも良さそう。
cmake -G Xcode -B build .
cmake --build build
cmake -B build .
(cd build/ && make VERBOSE=1)
./build/a
実行して正常終了すれば、*.gcda*.gcnoというファイルができているはず。

カバレッジの取得

以下のコマンドで、LCOVのデータを作成し、HTMLを作成する。(そしてw3mで開く。)
lcov -c -d ./ -o lcov.info --gcov-tool $PWD/llvm-gcov.sh
genhtml -q lcov.info -o ./coverage/
w3m ./coverage/index.html

参考にしたサイト

2023-05-03

iptables hashlimitを使ったSSH攻撃のログ削減

SSHサーバーを運用していると、ユーザー名・パスワードの総当たり攻撃を受けることがある。ログが膨らんで嫌なので、減らす方法をメモする。

接続の試行を複数回行わないと、SSH接続を受け付けなくする。これにより、SSHサーバーが走っていることに気づかれない。この代償として、自身で接続するときには何度かSSHコマンドを打ち直す必要がある。

以下の例だと、最初の10回分の接続はドロップする。必要に応じて、sourceのネットワークを限定するか、リミット値を調整すると良いだろう。

sudo iptables -I INPUT 1 -p tcp -m tcp -m state --state NEW --dport 22 -m hashlimit --hashlimit-upto 50/hour --hashlimit-burst 10 --hashlimit-mode srcip,dstport --hashlimit-name ssh-limit -j DROP

ちなみに、--hashlimit-burst2くらいに設定すると、SSH接続するときに数秒の待ち時間で接続できるが、SSH攻撃はさほど減らなかった。

2023-02-20

avrdude: target doesn't answer というエラーが出るときの対処

問題

ATtiny44Aを使った回路を組んだところ、以下のようなエラーが出て、プログラムできなくて困っていた。
$ avrdude -v -c usbasp -p t44 -U signature:r:/dev/stdout:i
avrdude: error: program enable: target doesn't answer. 1 
avrdude: initialization failed, rc=-1
         Double check connections and try again, or use -F to override
         this check.

このようなトラブル時に何を試行錯誤すると良いのかも含め、備忘録として残しておく。

解決方法

結局のところ、SCKの周波数が高いことが原因だったようで、-B 10をつけて解決した。

以下が実行例。

$ avrdude -B 10 -F -c usbasp -p t44 -U signature:r:/dev/stdout:i

avrdude: set SCK frequency to 93750 Hz
avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.00s

avrdude: Device signature = 0x1e9207 (probably t44)
avrdude: reading signature memory:

Reading | ################################################## | 100% 0.00s

avrdude: writing output file "/dev/stdout"
:030000001E920746
:00000001FF

avrdude: safemode: Fuses OK (E:FF, H:DF, L:62)

avrdude done.  Thank you.

試行錯誤

情報通りに-Fをつけて試しにsignatureを読んでみると、以下のように変なdevice signatureが表示され、この値が毎回変わる。
$ avrdude -F -c usbasp -p t44 -U signature:r:/dev/stdout:i

avrdude: error: program enable: target doesn't answer. 1 
avrdude: initialization failed, rc=-1
avrdude: AVR device initialized and ready to accept instructions
avrdude: Device signature = 0x37f912
avrdude: Expected signature for ATtiny44 is 1E 92 07

avrdude done.  Thank you.

データシートを再確認し、ATtiny44AはATtiny44と同じsignatureが書かれているようなので、-p t44でプログラムできることを確かめた。配線間違いが心配になり、配線を再確認したが異常は見つからない。

Verboseオプションをつけて表示される内容を確認した。 すると、以下のような情報が表示されていたので、SCKを遅くしたところ動作した。

avrdude: auto set sck period (because given equals null)