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)

2022-09-20

Linux: Firefoxのツールチップ

Firefoxを開いた状態でマウスをあるウインドウから別のウインドウへ動かしたときにFirefoxの上を通過すると、ツールチップが開いたままになることがある。これによって移動先のウインドウが隠れてしまう。

これを回避するため、browser.chrome.toolbar_tipsfalseに設定してみた。

根本的な解決ではないが、上記の問題はタブのツールチップによって引き起こされていたので、これで様子をみてみる。 ウインドウが非アクティブのときにツールチップが出ないようにしたかったが、そのような設定は見つからなかった。

2022-09-01

RPMとDPKGとの比較

最近Ubuntuを使うことが出てきたが、パッケージツールの使い方で苦労している。RPMとDPKGとの違いをまとめておく。
rpm dpkg
rpm -qa dpkg -l
rpm -ql pkg-name dpkg -L pkg-name
rpm -qi pkg-name dpkg -s pkg-name
rpm -e pkg-name dpkg -r pkg-name
rpm -qf /path/to/file dpkg -S /path/to/file
DNFとAPTの比較もまとめておく。
dnf apt
dnf provides */file apt-file search file
なお、apt-fileを使用するには、パッケージをインストールする必要がある。
sudo apt install apt-file
sudo apt-file update

外部のレポジトリは、 add-apt-repository というコマンドで追加できる。software-properties-commonというパッケージをインストールする。

sudo apt install software-properties-common