WPP
synology の Docker で code-server を動かす

タブレットをせっかく買ったので個人開発をタブレットでもできるようにということでいろいろと調べてみる。

coder っていう Web IDE が見つかり、それはどうやら VS Code を動かしているものっぽい。その coder が出している code-server ってので Docker で動くらしいのでやってみた。

自分の環境では、Docker と Synology NAS のリバースプロキシを使っているが Docker だけの場合は R.P. 部分は読み飛ばせばいい。リバースプロキシで SSL しているので Docker 側では何もしていない。

Docker 設定

Docker の設定は、 Synology NAS にならう感じで書いてくので、いい感じで読み替えて Dockerfile なりを書いてほしい。

イメージ

codercom/code-server を duckerhub からダウンロードする

ポート

ここでは、ホスト側 9001 をコンテナ側 8080 になるように expose した。

ボリューム

ここは、dockerhub の説明とは少し変えた。というのもボリュームリンクなしで起動してみると /home/config の中には、.config や、 .local の他にもいろいろ保存されそうなだったのでざっくりと指定した。まとめると

ホスト側はあくまで自分の環境でのことなので、好きな場所に変えてください。

ホスト側コンテナ側
/volume1/docker/code-server/config/home/coder
/volume1/docker/code-server/project/home/project

ここまでで、 9001 ポートに http アクセスすれば使えるようになっている。

ログインパスワード

コンテナははじめからパスワード認証が有効になっている。そのパスワードは初期値が config.yaml に生成されるようだ。

場所は上の例で行くと、/volume1/docker/code-server/config/.config/code-server/config.yaml です。

リバースプロキシ設定

ここも、synology NAS のでやる場合の内容です。

外側 443ポートに対しネームベースで振り分けるように設定します。また、code-server は WebSocket を使っているらしいので ws が通るように設定します。

xxx.myds.me は、NAS に付属の DDNS ホスト名です。そのサブドメインを作成し、コンテナに流す設定をします。

コンテナは、先程 9001 を開けたので 9001 に流します。

[ソース側]

Protocol: HTTPS
Hostname: code.xxx.myds.me
Port: 443

[転送先 (destination) ]

Protocol: HTTP
Hostname: localhost
Port: 9001

[カスタムヘッダー]

WebSocket を通すためにカスタムヘッダーを設定します。 Synology のリバースプロキシの実態は nginx なのでその設定と言ったらわかりやすいでしょうか?

Custom Header タブに行き Create > Websocket を選択すうと結果こうなります

Upgrade => $http_upgrade
Connection => $connection_upgrade

ここまで終えると、

https:/code.xxx.myds.me/ でアクセルすると、VS-Code っぽい画面がでてきます。初回はパスワード認証で先程のパスワードを入力すると認証をパスします。

エディタで開くフォルダは、 ?folder=/home/project とかすればいいようです。場所によってかけなかったり、コンテナ停止で消えたりするので注意が必要ですね。

code-server のコンテナには python とか入っていないので、ちゃんとやりたければ別のコンテナかサーバーに ssh したほうがよさそう。直接コンテナにインスールしても消えてしまう。(コンテナの / をどっかにマウントするのもちょっとなんだし)

参考

codercom/code-server – Docker Image | Docker Hub

Install – code-server Docs

Websoc kets for Synology DSM – Matthias Lohr – Synology のリバースプロキシで websocket を通す方法

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 は端末ごとに別の認証コードを生成ようです。