WPP
ssh ログイン時に “no matching host key type found. Their offer: ssh-rsa” エラー

自宅 PC を Linux にスイッチして2ヶ月位が経ちました。この間小さなハマりは、たくさんありましたがこの話もその 1 つです。

今朝、NEC の ix ルーターに久しぶりにログインしようとするとログインできません。職場から支給されている Windows では問題なくできています。

実際にはこんな感じです。

$ ssh KANRISYA@192.168.1.222
Unable to negotiate with 192.168.1.222 port 22: no matching host key type found. Their offer: ssh-rsa

Qiita によると、ssh のいつかのバージョンから古い鍵タイプはデフォルトでオフされているようです。

解決するには、参考ページのように ~/.ssh/config に追記してやります。コマンドラインのオプションを追加してもいいのですが、ちょっと長いのでつらいです。

  Host ix
       Hostname 192.168.1.222
       HostKeyAlgorithms ssh-rsa

これで無事にアクセスできるようになりました。

参考

ssh 接続で no matching host key type found エラー #SSH – Qiita

Linux Mint に azure-cli をインストールする

例によって新しい仕事に関連して azure-cli をインスールする必要があったのでそのメモ。

Linux Mint の場合 lsb_release コマンドでは Ubuntu コードネームを返さないといいつものトラップがあるのでそれを回避す必要があるよという話。

手順

基本、Microsoft の公式の案内通りですが、Ubuntu のコードネームを手動で設定してやる必要があります。

Linux Mint 21.3 の場合は、 jammy にする必要があります。 このコードネームは /etc/os-release 見るのが一番手っ取り早いと思う。

$ cat  /etc/os-release 
NAME="Linux Mint"
VERSION="21.3 (Virginia)"
ID=linuxmint
ID_LIKE="ubuntu debian"
PRETTY_NAME="Linux Mint 21.3"
VERSION_ID="21.3"
HOME_URL="https://www.linuxmint.com/"
SUPPORT_URL="https://forums.linuxmint.com/"
BUG_REPORT_URL="http://linuxmint-troubleshooting-guide.readthedocs.io/en/latest/"
PRIVACY_POLICY_URL="https://www.linuxmint.com/"
VERSION_CODENAME=virginia
UBUNTU_CODENAME=jammy

こんな感じで jammy とわかる

$ sudo apt update
$ sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release
// 上の行はたいてい入っているはずだからいらない

// 鍵をダウンロードする
$ sudo mkdir -p /etc/apt/keyrings
$ curl -sLS https://packages.microsoft.com/keys/microsoft.asc |
  gpg --dearmor | sudo tee /etc/apt/keyrings/microsoft.gpg > /dev/null
sudo chmod go+r /etc/apt/keyrings/microsoft.gpg

//$ AZ_DIST=$(lsb_release -cs) の代わりに直接指定する
$  AZ_DIST=jammy
echo "Types: deb
URIs: https://packages.microsoft.com/repos/azure-cli/
Suites: ${AZ_DIST}
Components: main
Architectures: $(dpkg --print-architecture)
Signed-by: /etc/apt/keyrings/microsoft.gpg" | sudo tee /etc/apt/sources.list.d/azure-cli.sources

$ sudo apt update
$ sudo apt install azure-cli

$ az -v
azure-cli                         2.61.0

core                              2.61.0
telemetry                          1.1.0

Dependencies:
msal                              1.28.0
azure-mgmt-resource               23.1.1

Python location '/opt/az/bin/python3'
Extensions directory '/home/mnishi/.azure/cliextensions'

Python (Linux) 3.11.8 (main, May 16 2024, 03:47:28) [GCC 11.4.0]

Legal docs and information: aka.ms/AzureCliLegal


Your CLI is up-to-date.

こんな感じで実行できる。

こういうケースでアップストリームのコードネームを取れるコマンドってきっとありそうだが、知らないので少し気にして調べてみよう。

今度のプロジェクトでは C#が必要らしいが、Linux の Mono でいいんか?んー、よくわかりません。

参考

Azure CLI を Linux にインストールする | Microsoft Learn

Windows updateが 0x80240438 で失敗する場合

数週間前から Windows update が失敗する現象が発生していて少し気になっていたが解決したので記録に残す。

現象の発生状況

問題の PC は、普段は Windows ドメイン (アクティブ ディレクトリ)に参加していて色々な設定がよしなにされている(有無を言わせず強制されている)。インターネットには正常に接続できている。

Windows Update を実行すると「更新サービスに接続できませんでした。。。。」というメッセージが表示され、

イベントビューアでは WindowsUpdateClient がエラー 0x80240438 で失敗している。

解決方法

はじめ、不用意にサービスを停止してしまって Windows update が失敗するのだと思い試行錯誤したが原因は他にあった。

Windows update の参照先が WSUS (Windows Server Update Services) に向いていてそこにアクセスできなくなっていることが問題だったようだ。WSUS はざっくりいうと Windows update のダウンロード元を社内サーバーなどに置くことができるソフト。利用すると会社の PC が一斉にアップデートを実施してインターネットのダウンロード帯域を食いつぶすことを防ぐことができる。

HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate キー

デフォルト変更値
DoNotConnectToWindowsUpdateInternetLocations10
WUServer
WUStatusServer

グループポリシーかログイン時のスクリプトで上記レジストリが設定されているっぽいが、それを変更できちゃうのはちょっと解せない。がアップデートできたので OK。

まとめると、何らかの方法で WSUS を使う設定がされており、かつ WSUS にアクセスできない状況で今回のエラーが発生していた模様。エラーコード自身は他の原因とも共有されているらしいので WSUS 関連とは限らないっぽい。

大体、このケースにぶち当たる人は個人ユースでは皆無と思われる。なので検索で見つからないのも無理はない、参照ページがなかったらサービス周りを疑い続けたと思うのでとても助かった。

ついでに依存サービス

Windows update はいくつかのサービスに依存しているようで、サービス表示名のサービス名対応は以下のようになる。sc コマンドで BITS などのサービス名の方を使う。

  • Background Intelligent Transfer service – BITS
  • Windows Update – wuauserv
  • Windows Modules Installer – TrustedInstaller

参照

Windows Update 「更新サービスに接続できませんでした」エラーの解消 – A Memorandum

apt で “N: There are 2 additional versions. ….” が表示されて apt upgrade できないとき

今日 apt list –upgradable すると “N: There are 2 additional versions. …” とメッセージが表示され、upgrade できない現象に出会いました。

ネットを検索すると There are 2 の部分が 1 とか 3 とかで見つかったので一定数、同じ問題で困った人がいるようです。

今回 upgrade できなかったのは、snapd/jammy-updates ですが、その適宜メッセージでレポートされたパッケージにしてください。

$ sudo apt --only-upgrade install snapd/jammy-updates

参照

List Upgradable Packages With apt Command in Ubuntu

Firefox でページ上の QR をスキャンするアドオン “QR Lite”

最近は QR コードが URL の変わりに使われることが多くなりました。カメラ経由でスキャンするケースでは、スマホも PC も大して変わりません、楽ですよね。

今日はスライド共有サイトを見ていて表示された QR コードをなんとかしたいので QR Lite というアドオンを見つけたという話です。

QR Lite – Get this Extension for 🦊 Firefox (en-US)

機能

  • QR コードの生成
  • カメラから QR 読み込み
  • ブラウザ表示中の QR をスキャン

使い方は簡単なので、特に説明しません。

QR を生成するアドオンは無数にあり、多くが画像ファイルのスキャンができるようで。しかし、画面上のQR をスキャンできるものは少ないです。

VScode で pipenv 環境を認識できないとき

ひさびさに python をいじろうと思ったら VScode で認識できなかったのを対処した話です。

まあ pipenv に限らず、python インタプリタを認識しないとき全般同じ対策です。

手順

プロジェクトのフォルダに .vscode/settings.json ファイルがあるはず。なければ .vscode フォルダも含めて作ります。

ファイルに “python.pythonPath” キーを追加しインタプリタのフルパスを設定してやります。

今回は、プロジェクトフォルダ内に pipenv の環境を作ったので .venv フォルダ以下の python を指定してやります。

こんな感じです。

{
 ... 設定済みの値が並んでいたら適当な位置に追加する
  "python.pythonPath": "d:/projects/xxxx/.venv/Scripts/python.exe"
}

これで認識するようになります。

それはそれでいいのだけれど、どうして自動で認識する時としない時があるのか VSCode の挙動は未だに謎が多い。

Android の Firefox で小さすぎる文字を拡大する

Android の Firefox でネットを見ているとたまにとても文字が小さいサイトがあって拡大できないことがあると思う。そんな時 Tampermonkey とそこで動くスクリプトを書くと問題を解決できることがある。

Tampermonkey は、ブラウザの機能拡張で任意の Javascript を動かせるようになる。書くのが面倒ではあるがこれを使うとブラウザ画面上の表示や操作を改変することができる。スマホブラウザでこれができるのは知る限りAndroid + Firefox の組み合わせだけ、PC なら chrome 系ブラウザでも同様のことができる。

また、Tampermonkey は変遷があって過去には Violetmonkey とかいろいろ xxx monkey に主流がうつっているが最近は Tampermonkey で落ち着いている模様。

自分は正直、ブラウザで動く Javascript を書くのは得意でもないし好きでもない。ただただ面倒なので Claude か Bing Copilot に書いてもらった。

最初に文字を10 % 大きくするスクリプトを生成し、後から大/小ボタンを追加するコードを生成してもらった。

それらをそれぞれ動作確認して、くっつけたのが以下。

@match の行を適当に対象サイトに絞り込むように設定するとそのマッチするサイトでだけスクリプトが動くようになる。

// ==UserScript==
// @name         文字サイズを調整する
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  サイト全体の文字を10%大きくし、文字サイズを調整するボタンを追加します
// @author       You
// @match        *://*/*
// @grant        none
// ==/UserScript==

// http://*/*
(function() {
    'use strict';

    // 全ての要素を取得
    var all = document.getElementsByTagName("*");

    // 各要素のフォントサイズを10%大きくする
    for (var i=0, max=all.length; i < max; i++) {
        var style = window.getComputedStyle(all[i], null).getPropertyValue('font-size');
        var fontSize = parseFloat(style);
        all[i].style.fontSize = (fontSize * 1.1) + 'px';
    }

    // ボタンを作成する関数
    function createButton(value, scale) {
        var button = document.createElement("button");
        button.innerHTML = value;
        button.style.margin = '4px';

        button.onclick = function() {
            for (var i=0, max=all.length; i < max; i++) {
                var style = window.getComputedStyle(all[i], null).getPropertyValue('font-size');
                var fontSize = parseFloat(style);
                all[i].style.fontSize = (fontSize * scale) + 'px';
            }
        };
        //document.body.appendChild(button);
        document.body.insertBefore(button, document.body.firstChild)
    }

    // ボタンを作成
    createButton("文字を小さく", 0.95);
    createButton("文字を大きく", 1.05);
})();

参考

以下に、いろいろなユーザスクリプトがあるのでダウンロードして使うのもいい。

OpenUserJS アクセス制限が厳しく 10 秒に一回くらいしかリクエストできないので注意

Greasy Fork – safe and useful user scripts

Github の TOTP に別の端末を追加する

Github の 2FA で TOTP アプリの認証を複数端末に追加するとき、少しハマったのでメモします。

複数のスマフォだったり、別のブラウザのTOTPプラグインで認証しようとする時に Github の場合は QR コードをスキャンした直後に VERIFY をしないとその QR コードはアクティブにならないようだ。

手順

Github にログインし、 settings に入る。

Password and authentication に進み、Authenticator app で Edit をクリックする。

TOTP アプリやプラグインで QR コードをスキャンする。

TOTP アプリやプラグイン表示されたコードを [Verify the code from the app] に入力して [save] をクリックする。

これで、認証する端末を追加できた。

アマゾンやマイクロソフトアカウントと異なり、Github は端末ごとに別の認証コードを生成ようです。

Linux Mint 21.3 Cinnamon でデスクトップのメニューバーが表示しなくなったのを修復した話

タイトルにある通り Linux Mint + Cinnamon を使っているのですが、普段はノート PC に外部ディスプレイをつなぎ2画面で使用しています。

その際、デスクトップのメニューバー(仮)、Windows でいう所の タスクバーの位置をいじっているうちに PC 側の画面には表示しなくなってしまったトラブルに遭遇しました。

メニューバー(仮)は正式には panels という名称のようです、恐らく以前の cinnamon バージョンでは launcher と呼んでいたようですが、それは廃止されるもののようです。

dconf-editor で /org/cinnamon/panales-enabled というキーがパネルの位置を示す設定値のようで [‘1:1:bottom’] となっていました。これが意味するところは パネル1: モニタ1:下 を示すらしい。

dconf-editor の説明によるとモニタは 0 から始まる数値といっており、外部ディスプレイがない状態では、0になるということのようです。

そこでモニタを 0 に変えて [‘1:0:bottom’] とするとどっかにいっていたメニューがデスクトップ下部に帰ってきました。

この設定を手動でいじった記憶はないのでこれバグだと思う。同様の事象に出会った人の助けになればうれしく思う。(恐らくそれは未来の自分になるだろう。)

English

If you meet Cinnamon Panels gone to extend display on Linux Mint 21.3, You can fix location of panels by dconf-editor.

Key: /org/cinnamon/panels-enabled

value [‘1:0:bottom’] – bottom can replace to top (maybe left or right too).

I hope your help.