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

2022-08-24

MOTU M2 on Fedora 35

Fedora 35でdnf updateにより、MOTU M2を使用できなくなった。 どうやらalsaの更新が原因だった。

Googleで検索していると、以下のバグレポートと修正を見つけた。 /

以下のようにalsa-ucm-confの修正をパッチにして、手元の設定に当てた。

gh repo clone alsa-project/alsa-ucm-conf
cd alsa-ucm-conf/
git show 3a6acaa509 > /tmp/motu-m2-ucm2.patch
cd /usr/share/alsa
sudo patch -p1 < /tmp/motu-m2-ucm2.patch

2022-08-09

Intel上のmacOSでarm64のbrew bottleをダウンロードする

Intel macでarm64用のパッケージをビルドするために、arm64版のbrew bottleをダウンロードしたい。 その手順を残しておく。

手順

  1. 別のディレクトリに Homwbrew をインストールする。
    sudo mkdir /opt/brew-aarch64
    sudo chown ${USER}:staff /opt/brew-aarch64
    cd /opt/brew-aarch64
    curl -L https://github.com/Homebrew/brew/tarball/master | tar xz --strip 1
    
  2. brewの動作に必要なツールをインストールする。
    PATH=/opt/brew-aarch64/bin:$PATH brew install ruby
    export PATH=/opt/brew-aarch64/bin:$PATH
    export HOMEBREW_PREFIX=/opt/brew-aarch64/
    
  3. brewスクリプトのアーキテクチャを取得する箇所を書き換え、arm64に変更する。Catalinaを使用しているので、強引にBig Surに書き換える。以下に変更箇所を示す。
    diff --git a/Library/Homebrew/brew.sh b/Library/Homebrew/brew.sh
    index cbe08846a..925c39706 100644
    --- a/Library/Homebrew/brew.sh
    +++ b/Library/Homebrew/brew.sh
    @@ -5,7 +5,7 @@
     
     # Doesn't need a default case because we don't support other OSs
     # shellcheck disable=SC2249
    -HOMEBREW_PROCESSOR="$(uname -m)"
    +HOMEBREW_PROCESSOR='arm64'
     HOMEBREW_PHYSICAL_PROCESSOR="${HOMEBREW_PROCESSOR}"
     HOMEBREW_SYSTEM="$(uname -s)"
     case "${HOMEBREW_SYSTEM}" in
    @@ -425,7 +425,7 @@ then
       HOMEBREW_PRODUCT="Homebrew"
       HOMEBREW_SYSTEM="Macintosh"
       [[ "${HOMEBREW_PROCESSOR}" == "x86_64" ]] && HOMEBREW_PROCESSOR="Intel"
    -  HOMEBREW_MACOS_VERSION="$(/usr/bin/sw_vers -productVersion)"
    +  HOMEBREW_MACOS_VERSION="11.0"
       # Don't change this from Mac OS X to match what macOS itself does in Safari on 10.12
       HOMEBREW_OS_USER_AGENT_VERSION="Mac OS X ${HOMEBREW_MACOS_VERSION}"
     
    diff --git a/Library/Homebrew/system_config.rb b/Library/Homebrew/system_config.rb
    index a019aa4de..ab8aa002f 100644
    --- a/Library/Homebrew/system_config.rb
    +++ b/Library/Homebrew/system_config.rb
    @@ -118,7 +118,7 @@ module SystemConfig
     
         sig { returns(String) }
         def kernel
    -      `uname -m`.chomp
    +      "arm64"
         end
     
         sig { returns(String) }
    diff --git a/Library/Homebrew/hardware.rb b/Library/Homebrew/hardware.rb
    index 52bf2e5e8..80ae69329 100644
    --- a/Library/Homebrew/hardware.rb
    +++ b/Library/Homebrew/hardware.rb
    @@ -57,17 +57,7 @@ module Hardware
     
           sig { returns(Symbol) }
           def arch_64_bit
    -        if arm?
    -          :arm64
    -        elsif intel?
    -          :x86_64
    -        elsif ppc64le?
    -          :ppc64le
    -        elsif ppc64?
    -          :ppc64
    -        else
    -          :dunno
    -        end
    +        :arm64
           end
     
           def arch
    
  4. パッケージをダウンロードする。(下記の例では、openblas)
    brew fetch --force-bottle openblas
    brew fetch --force-bottle gfortran
    
  5. 次回から使用する際は、以下のようにbashで設定する。(うっかりbrew installでインストールしないよう、プロンプトも変更しておく。)
    export PATH=/opt/brew-aarch64/bin:$PATH
    export HOMEBREW_PREFIX=/opt/brew-aarch64/
    PS1='[\u@\h \W brew-arm64]\$ '