Amazon Fire HD 8 (第10世代)で、Microsoft Officeアプリを利用する

Amazon Fire HD 8 (第10世代)というAndroidをベースにしたFire OSがインストールされたタブレットを持っている。 しかし、これまで全く活用していなかった。 Kindleアプリから、Amazon.co.jpでKindle電子書籍を購入できるという利点があるのだが、 手元にあるタッチパネルの動く端末の中で一番ディスプレイのサイズが大きいというのも良い点である。

Amazon Fireタブレットには、Microsoft Officeアプリが提供されるようになっており、 Fire HD 8の画面サイズは8インチくらいで10.1インチ以下なのでMicrosoft 365の契約をしていなくてもMicrosoft Officeアプリを利用できる。 ただし、ファイルの作成と表示、基本的な編集機能以外のいろいろな機能はMicrosoft 365の契約をしていないと利用できない。 また、収益が発生する活動では利用できない

最初にAmazon Fire HD 8でMicrosoft Officeアプリを起動させる時には、言語ファイルのダウンロードが必要だった。 また、必須ではないのかと思っていたが、Microsoftアカウントでのログインも必要だった。 なので、最初の起動時はインターネットにつながっている必要がある。

Firefoxで、ユーザー認証付きのHTTPプロキシーサーバーへのログインを自動化する

ユーザー認証付きのHTTPプロキシーサーバーを使う環境でWindows 10の端末を使っていることが多いのだが、 Firefoxを起動するたびに、HTTPプロキシーサーバーへログインするポップアップが出るのを面倒に思っていた。 ユーザーIDとパスワードは記憶させているので、Enterキーを押すだけではあるのだが。 about:configで、 signon.autologin.proxytrueに設定してやれば、記憶させたユーザーIDとパスワードで 自動的にログインしてくれるようになる。 これで、小さいことだが、1つは面倒がなくなった。

Windows 10 22H2でBluetoothオーディオのAbsolute Volume機能を無効にする

Bluetoothオーディオでは、Absolute Volumeという機能があって、WindowsでもAndroidでもiOSでも利用することができる。 iOSの場合には、無効にすることはできないようだ。 私は、このAbsolute Volumeで設定できるより小さな音量でBluetoothヘッドセットでの音声の再生をしたいことがある。 最近のWindows 10では、Absolute Volume機能が有効になっており、Windows自体の音量とBluetoothヘッドセットの音量が 同期しており、2つの音量を組み合わせて木目細かに音量を調整することはできない。 だが、Absolute Volume機能は、レジストリーで設定することで無効にできた。

MUO - What Is Absolute Volume? How To Enable or Disable It in Windows 10にあるように、以下のようにコマンドプロンプトで実行すれば良い。

> reg add HKLM\SYSTEM\ControlSet001\Control\Bluetooth\Audio\AVRCP\CT /v DisableAbsoluteVolume /t REG_DWORD /d 1 /f

Inferno OSのLimboコンパイラーのライセンス

InfernoというOSがあって、今は全く注目されていないと思うのだが、2021年にMITライセンスでリリースされ直している。 そこでは、Limboというプログラミング言語が利用されているはずなのだが、Limboコンパイラーはどういう実装なのか気になっていた。 Infernoのリポジトリーは、2つあるように見える。同期している訳ではないようだ。

  • https://bitbucket.org/inferno-os/inferno-os/
  • https://github.com/inferno-os/inferno-os/

いずれでもLimboコンパイラーはMITライセンスでリリースされているようだ。

NetBSD/amd64 10.99.2で動かすFirefoxで、Google Titan Security Keyを使ってログインしてみる

この記事は、NetBSD Advent Calendar 2022の24日目の記事です。

Google Titan Security Keyとは?

Google Titan Security Keyというのは、 多要素認証をするために利用される機器です。 いつも日本のGoogle Storeでは品切れだったのですが、最近は在庫があるようです。 品切れだった時は、ページを開くとエラーページが表示されるという状況でした。 今回、私が購入したのは、USB Type-C接続をするタイプです。 スマートフォン向けに、NFCも搭載されています。 今回は、NetBSD/amd64 10.99.2で動くpkgsrc/www/firefoxをアップデートするのに使う予定のFirefox 108.0.1で試して書いていますが、 現在pkgsrc/www/firefoxとして利用できる107.0.1でも同様に動作します。

Google Titan Security Keyを接続してみる

NetBSD/amd64 10.99.2を動かしているHP Envy 13-ay1052AUというラップトップPCに接続すると、以下のようにdmesgに出力され 認識されます。

uhidev3 at uhub5 port 1 configuration 1 interface 0
uhidev3: FS (0x096e) ePass FIDO (0x085b), rev 1.10/31.00, addr 5, iclass 3/0
uhid7 at uhidev3: input=64, output=64, feature=0

実を言うと、NetBSD/amd64 10.99.2にはlibfido2が含まれています。最近ブランチの切られたNetBSD 10にも同様に含まれています。 fido2-tokenコマンドを使って、認識されるか確認してみます。

$ fido2-token -L
/dev/uhid7: vendor=0x096e, product=0x085b (FS ePass FIDO)

このように認識されました。 この表示を見ると、Google Titan Security Keyは、FEITIAN Technologies社ePass FIDOのラインナップのOEMなようです。 Firefoxでは、libfido2を使うのではなくRust言語で書かれたthird_party/rust/authenticator以下にある実装を経由して Google Titan Security Keyを利用することになるはずですので、これ以上libfido2を追求するのは止めておきます。

Googleアカウントに登録する

2 段階認証プロセスにセキュリティ キーを使用するという Googleのヘルプページのパソコン向けの手順に従って登録してみます。

まず、Googleアカウントに登録します。2段階認証の登録画面 から登録して行きます。 Nextボタンをクリックし、表示に従ってUSBポートにGoogle Titan Security Keyを接続し、Security Key registeredと表示されたら認識されました。 名前を決めて入力し、Doneをクリックすれば登録は完了です。

Googleにログインする

さきほど設定したGoogleアカウントからログアウトしてもらうか、Firefoxのプライベートウィンドウでログインすれば、Google Titan Security Keyを正しく登録できたか 確認できます。今回はプライベートウィンドウで試してみます。ログイン画面へ遷移しユーザーIDを入力し、パスワードも入力します。

次の画面に進み、Google Titan Security Keyを接続すると、接触センサーの部分に触れるようにうながされます。

接触センサーに触れると、ユーザー認証は完了です。

おわりに

今回は、Google Titan Security KeyをNetBSD/amd64 10.99.2上で動くFirefoxで利用し、Googleアカウントにログインできました。 WebAuthnを採用したGoogle以外のウェブサービスを使ったり、他の用途でも使えるかもしれません。 いずれ試してみたいと思います。

Android 8.0なスマートフォンでGoogleアカウントにログインできない問題を解消させる

Android 8.0をインストールしてあるスマートフォンをファクトリーリセットして保管してあった。 これを再度利用しようとしたがGoogleアカウントにログインすることができなかった。 何らかの方法でログインしようとすると、Google Play開発者サービスの画面が表示され、 以下のようなメッセージが表示されてしまう。

ログインできませんでした
Googleサーバーとの通信中に問題が発生しました。
しばらくしてからもう一度お試しください。

どうやってもログインできないという問題は以前にも遭遇したことはあって、 そのときはユーザーIDとパスワードを正しく入力しても、ログインに成功しなかった。 これは、古いAndroidの場合に、2要素認証を有効にしていてはいけないという問題だった。 だが、今回はそもそもユーザーIDを入力する段階にまでも進めないので、違う問題だ。

Google Play開発者サービスで止まっているのを考えると、現在のGoogleサーバー側の設定に 対応できないような古いバージョンが使われているというのが可能性としてはありそうである。 Google Play開発者サービスのバージョンを確認すると、12.6.89という非常に古いものだった。 Android 10のインストールされている環境で確認すると、22.42.12がインストールされていた。 ウェブで検索してみると、最新は22.43.12のようだ。

普通であれば、Play Store appからアップデートできると思うのだが、そもそもAndroidへの アカウント追加もできていないし、Play Store appもログインできず利用できないので、 普通の方法でアップデートすることはできそうにない。 Google Play開発者サービスのような重要なアプリケーションを出所の分からないウェブサイトから インストールしたくはなかったのだが、apkmirror.comから.apkファイルをダウンロードして ダウンロードしてみた。 apkmirror.comは、この端末のGoogle ChromeではCloudflareのcaptchaを突破できずアクセスが一切できなかった。 なので、PCのウェブブラウザーで.apkファイルをダウンロードして適当な場所にアップロードして、 それをこの端末のGoogle Chromeでダウンロードしてインストールした。この時、Google ChromeにはGoogle Play Store 以外からの.apkをインストールできるように設定しておいた。 Android 8.0では、.apkファイルしかインストールできないようなので、 com.google.android.gms_22.43.12_(020400-483592595)-224312010_minAPI21(arm64-v8a,armeabi-v7a)(nodpi)_apkmirror.com.apkというのをダウンロードして利用した。

これでGoogleアカウントでログインできるようになり、全てが正常に利用できるようになった。

Firefoxでクライアント証明書認証をするウェブサイトに接続する際に、SSL_ERROR_HANDSHAKE_FAILURE_ALERTが出る場合の対処法

Firefoxでクライアント証明書認証をするウェブサイトにアクセスすると、少なくとも初回では提出するクライアント証明書を選択することができる。 ここで提出したクライアント証明書がどれかを保存し、次回以降は聞かれないようにすることができる。 提出するクライアント証明書が間違っていた場合には、SSL_ERROR_HANDSHAKE_FAILURE_ALERTのエラーが発生し、ウェブサイトにアクセスすることはできない。

ここで、間違ったクライアント証明書を提出して、その設定を保存してしまうと、次回以降毎回SSL_ERROR_HANDSHAKE_FAILURE_ALERTが発生してしまうことになる。 どのクライアント証明書をどのウェブサイトに既定値として提出するかの情報は、設定(Settings)→プライバシーとセキュリティ(Privacy & Security)→証明書(Certificates) →証明書を表示(View certificates)→証明書マネージャー(Certificate Manager)の認証の決定(Authentication Decisions)で確認できる。間違った決定は削除(Delete)すれば 再度選択できるようになるので、正しいものを提出すれば、SSL_ERROR_HANDSHAKE_FAILURE_ALERTにはならなくなる。

Microsoft EdgeのIEモードのuser-agent string

Internet Explorer 11でしか動かないウェブサイトを利用しないといけないため、Microsoft EdgeのIEモードでアクセスする場合がある。 その場合のuser-agent stringを見てみると、Internet Explorer 11そのままだった。当たり前かもしれない。

Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko

ANAの機内Wi-Fiのゲートウェイ

航空機に乗る機会はめっきり少なくなってしまったのだが、仕事の都合でどうしても乗らないといけない場合というのは存在する。 ここ1年間くらいでは、ANAしか乗っていないような気がするが、小さな空港との往復便でも機内でWi-Fi接続ができるようになっている。

私が乗った便だと、205.220.148.137205.220.148.140がゲートウェイのIPアドレスとして見えていた。 これらのIPアドレスは、Panasonic Avionics Corporationに割り当てられている。 機内では、ana-panasonic.aeroというドメインがウェブサイトのホスト名の一部として見えていたが、このドメインは実在するものではないようだ。

WindowsのサービスをPowerShellで再起動させる

Windows Server 2012 R2 x86_64上に、定期的に再起動しないと動作がおかしくなるサービスがあって、タスクスケジューラーで夜中に再起動したい。 PowerShellのRestart-Serviceで比較的容易にできるようだったので、スクリプトを作成し、タスクスケジューラーに設定した。

サービスのNameを取得する

Restart-ServiceにはNameかDisplayNameを指定してサービスを再起動できるのだが、Nameを利用する方が良さそうな気がする、 今回再起動したいサービスでは該当しないが、DisplayNameには日本語が含まれている場合もあるし、ホワイトスペースが含まれている場合もあり、 いつか困ることになりそうな気がする。 Get-Serviceを使うとNameとDisplayNameを表示できるのだが、長いNameは最後が省略されてしまい、Restart-Serviceに 厳密に指定できない。Restart-Serviceではワイルドカードも利用できるのだが、今回はサービスの再起動の順序はあらかじめ決めてあるし、 Get-Serviceで表示が省略されるからといってワイルドカードを利用するのは良くない。 以下のようにすると、長いNameも省略されずに一覧できる。

> Get-Service | Sort-Object | Format-List -Property Name

これで、目当てのサービスのNameが、ServiceNameだと分かった場合には、以下のように実行すれば、サービスが再起動される。 スクリプト中に複数行で複数の再起動指示を記載しておくと、1つのサービスが再起動されるまで次の再起動の実行開始はブロックされる。

> Restart-Service -Name 'ServiceName'

How to use Google Workspace OAuth2 with mbsync (from isync) and msmtp on NetBSD

Google will remove old OAuth out-of-band (OOB) support on 2022-10-04. And desktop clients for Google Workspace should use Loopback IP address flow instead. So I must change my script to support Loopback IP address flow. My previous setup using OOB is described in How to use Google G suite OAuth2 with mbsync (from isync) and msmtp on NetBSD post.

I have searched the web and found How to continue using msmtp OAuth 2.0 for Gmail in mutt after oob deprecation? on StackExchange. The answer is to use getmail-gmail-xoauth-tokens script from getmail6 to get refresh token and access tokens. The answer says "- which are what we've been looking for, but that 1h expiry is prohibitively awkward...". It is absolutely unacceptable for me. I am away from GUI or web browsers in most time. I have not read getmail-gmail-xoauth-tokens script. However I feel that it may be the answer's misunderstanding or misuse. Anyway I do not have enough time to investigate the potentially hopeless script.

As a result, I found that the access tokens will expire in 3600 seconds and the refresh token has much longer life time like before. I have create two scripts to confirm this result. And I can reuse the scripts for my mbsync from isync and msmtp setups.

Get refresh token and save it

At first, you must download your client secret file as client_secret_*.json. Just rename it as client_secret.json

Google provides Google Auth Python Library and related libraries for Python. For further changes, I should use common methods to get tokens. I am a pkgsrc user and I have installed required libraries as follows:

# cd /usr/pkgsrc/www/py-google-api-python-client
# make install
# cd /usr/pkgsrc/security/py-google-auth-oauthlib
# make install

To get refresh token, you can use google_auth_oauthlib.flow.InstalledAppFlow.from_client_secrets_file() with the client_secret.json file. My source code (google-oauth2-loopback-ip.py) is as follows:

#!/usr/pkg/bin/python3.10

# Get refresh token and save it as ~/.refresh_token.pickle.
# Saved information will be used to refresh access token hourly.

# Follow:
# https://googleapis.github.io/google-api-python-client/docs/oauth-installed.html

import os
import pickle
from google_auth_oauthlib.flow import InstalledAppFlow

# Constants
CLIENT_SECRETS_FILE = 'client_secret.json'
CREDENTIAL_CACHE_FILE = '.refresh_token.pickle'

## Configurations
### To identify scopes and services, See:
### https://developers.google.com/identity/protocols/oauth2/scopes#gmail
SCOPES=['https://mail.google.com/']
API_SERVICE_NAME = 'mail'
API_VERSION = 'v1'

## Get credentials
def get_credentials():
    ## Create client object
    flow = InstalledAppFlow.from_client_secrets_file(
        CLIENT_SECRETS_FILE,
        scopes=SCOPES)

    ## Open with local web browser, input credential manually
    flow.run_local_server(host='localhost',
        port=8091,
        authorization_prompt_message='Please visit this URI: {url}',
        success_message='The auth flow is complete; you may close this web browser window.',
        open_browser=True)

    return flow.credentials


if __name__ == '__main__':
    credentials = get_credentials()

    # Get home directory path and create a path for cache file
    homeDir = os.environ['HOME']
    if not homeDir:
        homeDir = '.'
    credPath = os.path.join(homeDir, CREDENTIAL_CACHE_FILE)

    # Save credentials as file
    with open(credPath, 'wb') as tokenCache:
        pickle.dump(credentials, tokenCache)

    # https://google-auth.readthedocs.io/en/stable/reference/google.oauth2.credentials.html#google.oauth2.credentials.Credentials
    print('Refresh Token:', credentials.refresh_token)

You will get your refresh token as Refresh Token: YOURREFRESHTOKENSTRING. This script get an access token simultaniously (See your ~/.refresh_token.pickle). However I will not use the access token in this script at all.

Get access token using the refresh token

The refresh token has longer life time than 3600 seconds (life time of the access token). And the refresh token is used to get refreshed access tokens without login via web browsers.

To get a refreshed access token, you should load saved credentials in ~/.refresh_token.pickle and invoke refresh() method. My source code (google-oauth2-refresh-access_token.py) is as follows:

#!/usr/pkg/bin/python3.10

# Get new access token using saved refresh token.

# Follow:
# https://googleapis.github.io/google-api-python-client/docs/oauth-installed.html

import os
import pickle
from google.auth.transport.requests import Request

# Constants
CREDENTIAL_CACHE_FILE = '.refresh_token.pickle'

## Configurations
### To identify scopes and services, See:
### https://developers.google.com/identity/protocols/oauth2/scopes#gmail
SCOPES=['https://mail.google.com/']
API_SERVICE_NAME = 'mail'
API_VERSION = 'v1'

## Refresh credentials and get new ones
def get_refreshed_credentials():
    # Get home directory path and create a path for cache file
    homeDir = os.environ['HOME']
    if not homeDir:
        homeDir = '.'
    credPath = os.path.join(homeDir, CREDENTIAL_CACHE_FILE)

    if os.path.exists(credPath):
        with open(credPath, 'rb') as tokenCache:
            credentials = pickle.load(tokenCache)

        if credentials:
            # Refresh access token with refresh token
            credentials.refresh(Request())

    return credentials

if __name__ == '__main__':
    credentials = get_refreshed_credentials()

    # https://google-auth.readthedocs.io/en/stable/reference/google.oauth2.credentials.html#google.oauth2.credentials.Credentials
    print('Access Token:', credentials.token)
    #print('Expiry:', credentials.expiry) # in UTC

You will get your access token as Access Token: YOURREFRESHEDACCESSTOKENSTRING.

For mbsync and msmtp

This part is almost identical to my previous post. I will include my current script and configuration files.

$ cat /opt/bin/get_teteraorg_token.sh
#!/bin/sh

python3.10 /opt/bin/google-oauth2-refresh-access_token.py | awk -F" " '{if(NR==1)print $3}'
$ cat ~/.mbsync
(snip)
IMAPAccount gmail
Host imap.gmail.com
User username@tetera.org
AuthMechs XOAUTH2
PassCmd "/opt/bin/get_teteraorg_token.sh"
SSLType IMAPS
CertificateFile /etc/openssl/certs/ca-certificates.crt
(snip)
$ cat ~/.msmtprc
(snip)
account teteraorg
tls on
tls_certcheck off
tls_starttls off
host smtp.gmail.com
port 465
protocol smtp
auth xoauth2
from username@tetera.org
user username@tetera.org
passwordeval "/opt/bin/get_teteraorg_token.sh"
(snip)

Windows 10で、スタートアップディレクトリーを開く

Windows 10にはスタートアップディレクトリーがあって、ログインすると、ここに入っているショートカット等が自動的に開かれる。 このフォルダーを開く方法を忘れないように書いておく。

スタートアップが自分のユーザー用と、全ユーザーに適用されるものの2つがある。 自分のユーザーだけに適用されるフォルダーを開くには、Windowsキー+Rで表示される「ファイル名を指定して実行」よりshell:startupを実行すれば良い。 全ユーザーに適用されるフォルダーを開くには、shell:common startupを実行すれば良い。

これは、「ファイル名を指定して実行」から実行する必要があり、コマンドプロンプトからは実行できない。

エレコム製のハードウェア暗号化USBメモリーMF-ENU3A32GBKのファームウェアを最新化する

エレコム製の ハードウェア暗号化USBメモリーMF-ENU3A32GBKと言うのがあって、 Windows 10 Pro 21H2 64ビット版の環境で利用できる。 このUSBメモリーは、AESで暗号化する機能をハードウェアとして実装しており、USB CD-ROMとして認識される読み取り専用のパーティションに格納されたソフトウェアを 使ってパスワードを入力することで、USBリムーバブルディスクがインサートされた状態になり、読み書きができるようになる。 他にも、内容を全て削除してパスワードも初期化をする機能や、USBリムーバブルディスクを読み取り専用にする機能もある。 試してはいないが、macOS用のソフトウェアも、同じUSB CD-ROMのパーティション内に配置されており、macOSからでも利用できるはずである。

このMF-ENU3A32GBKが3台あって、いずれもProductVersion: 400というバージョンになっていた。そして、これはメニューの操作ではエラーになりファームウェアをアップデートできなかった。 これを最新版であるProductVersion: 520にする方法を記載しておく

Startup.exeを実行して、ファームウェアのアップデートをしようとすると、下図のようなエラーになってしまう。 どうやら、違う製品のファームウェアをインストールしようとして失敗しているように見える。 良く見ると、問題なくファームウェアをアップデートできたMF-ENU3A04GBKやMF-ENU3A08GBKとは違い、MF-ENU3 ソフトウェア更新内容ではなく、ソフトウェア更新内容/Software UpdateというURIにPLM30という文字列の入った変更履歴ページへリンクされている。

1つ目の図にあるように、エレコムのブランドで販売されていたが、実際には子会社になったハギワラソリューションズの製品のようだ。 そこで、ハギワラソリューションズのウェブサイトを見ていると、セキュリティUSBのページ というウェブページがあり、修復ソフトのダウンロード先が案内されている。エレコムの製品Q&A 5152番 が案内される。 しかし、実際にはそこから更に新しいファームウェアへのアップデーターエレコムの製品Q&A 7117番 へのリンクがあり、そこでProductVersion: 520にするためのアップデーターENU3A_Update_v520.zipがダウンロードできる。

このZIPアーカイブファイル中のSoftwareWriter.exeを実行すると、ファームウェアを最新化し、読み取り専用パーティションの内容もSecurityUSB.iso の内容に更新された。

グループポリシーでWindows Updateを管理されているPCで、Microsoftのサーバーに接続してWindows Updateする

Active Directoryで管理しているWindows 10 ProのPCで、自前で用意しているWindows Server Update Services (WSUS)のサーバーにのみ接続させ、 適用させたい更新のみを配布したいというのは理解できるが、 Windows Updateで配布されているデバイスドライバーにアップデートしたい場合がある。 ちゃんと理由は調べてはいないが、IntelのWi-Fiアダプターを搭載したラップトップで、新しいiPhoneのWi-Fiホットスポットにつなごうとするとき、古いデバイスドライバーだと SSIDが見つからない場合があった。 Intelは最新のデバイスドライバーを自社ウェブサイトで配布するのは止めてしまっているし、ラップトップのメーカーも最新のものを配布していないことが多い。 そうすると、Microsoftの提供するWindows Updateのサーバーに接続しないといけない。 まあ、本当は管理しているマシンに必要な最新のデバイスドライバーはWSUSで配信できるのだと思うので、ちゃんと管理して欲しいのだが。

いずれにしても、一時的にMicrosoftの提供するWindows Updateのサーバーに接続しないといけない。 その際には、勝手に最新のWindows 10のFeature Updateにアップグレードしないようにして、WSUSではなくMicrosoftのWindows Updateサーバーに接続するようにしないといけない。

指定したFeature Updateに留まるには、以下のように管理者権限のコマンドプロンプトで実行し、レジストリーに設定すれば良い。 ここでは、21H1のFeature Updateに留まるように設定している。

> REG ADD HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate /v TargetReleaseVersion /t REG_DWORD /d 1 /f
> REG ADD HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate /v TargetReleaseVersionInfo /t REG_SZ /d 21H1 /f

その上で、HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU\UseWUServer1になっているのを 0にしてやれば良い。デバイスドライバーが最新になったら、REG ADDした2つの値は削除し、UseWUServerの値は0に 戻しておけば良い。

neomuttで、未読の電子メールのみ表示させる

とあるドメイン宛ての電子メールをPostfixを使ってユーザー名によらず受信し、Maildir形式で保存するようにしているサーバーがある。 ほぼ全てがspamである訳だが、中には内容を確認しないといけない電子メールも存在している。 そのためにIMAP4サーバーを立ち上げるというようなことはしたくない。 そこで、sshでログインして、netmuttで受信した電子メールを読むことにした。 netmuttで、未読の電子メールのみを表示させるには、l~Uと入力すれば良かった。 現在この環境以外ではnetmuttを利用しておらず、すぐに忘れてしまうので、書いておく。

Clojure 1.11.1からJava 2Dを利用する

ClojureからJava 2Dを利用するようにしたいが良く分からなかった。 探してみるとCX's Hello, World!のHello, Java 2D(Clojure) World!に 例が掲載されていた。 ただ、そのままではOpenJDK 17.0.4で動かしたClojure 1.11.1では動かなかった。 その部分を動くようにして、フォントの設定をしたかったのでそれを追加してみた。

; From http://cx20.main.jp/blog/hello/2012/12/05/hello-java2d-clojure-world/
; Modified for Clojure 1.11.1 by Ryo ONODERA <ryo@tetera.org>
; Run: clj -M java2d.clj

(import
  (javax.swing JFrame)
  (javax.swing JPanel)
  (java.awt Graphics)
  (java.awt Graphics2D)
  (java.awt Font)
)

(defn create-panel []
  (proxy [JPanel] []
    (paintComponent [g]
      (.setFont ^Graphics2D g (Font. "Droid Sans" Font/PLAIN 72))
      (.drawString ^Graphics2D g "Hello, Java 2D World!" 0 100)
)))

(def panel
  (create-panel))

(def frame
  (JFrame.))

(doto frame
  (.setDefaultCloseOperation
    javax.swing.WindowConstants/EXIT_ON_CLOSE)
  (.add panel)
  (.setSize 640 480)
  (.setTitle "Hello, World")
  (.setLocation 100 100)
  (.setVisible true))

Windows 10で保存されたWi-FiアクセスポイントのSSIDとパスフレーズを一覧する

Windows 10で保存されたWi-FiアクセスポイントのSSIDとパスフレーズを知りたいのだが、標準のGUIでは今接続しているSSIDに対応するパスフレーズを 表示させることはできるものの、接続中ではないもののパスフレーズを表示することはできないようだ。 しかし、Windows 10の保存している全てのSSIDとパスフレーズの組み合わせを表示させたい場合がある。

まず、保存されたWi-FiのSSIDの一覧は、以下のようにすれば表示できる。

> netsh wlan show profiles

インターフェイス Wi-Fi のプロファイル:

グループ ポリシー プロファイル (読み取り専用)
---------------------------------------------
    ≤なし>

ユーザー プロファイル
---------------------
    すべてのユーザー プロファイル     : SSIDSTRING

そこでSSIDとしてSSIDSTRINGが分かるので、そのパスフレーズは以下のようにすれば表示できる。 「セキュリティの設定」の「主要なコンテンツ」の部分の値がパスフレーズである。

> netsh wlan show profile name=SSIDSTRING key=clear

インターフェイス Wi-Fi のプロファイル SSIDSTRING:
=======================================================================

適用先: すべてのユーザー プロファイル

プロファイル情報
-------------------
    バージョン             : 1
    種類                   : ワイヤレス LAN
    名前                   : SSIDSTRING
    コントロール オプション        :
        接続モード    : 手動接続
        ネットワーク ブロードキャスト : このネットワークがブロードキャスト配信している場合に限り接続
        AutoSwitch         : 他のネットワークに切り替えません
        MAC ランダム化  : 無効

接続の設定
---------------------
    SSID の数        : 1
    SSID 名             : "SSIDSTRING"
    ネットワークの種類           : インフラストラクチャ
    無線の種類          : [ 任意の無線の種類 ]
    ベンダー拡張          : 存在しません

セキュリティの設定
-----------------
    認証                : WPA2-パーソナル
    暗号                : CCMP
    認証                : WPA2-パーソナル
    暗号                : GCMP
    セキュリティ キー      : あり
    主要なコンテンツ       : SSIDPASSPHRASE

コスト設定
-------------
    コスト                   : 制限なし
    混雑                   : いいえ
    データ制限間近         : いいえ
    データ制限超過         : いいえ
    ローミング             : いいえ
    コスト ソース          : 既定

これをWindows 10上で組み合わせてやれば、SSIDとパスフレーズを一覧できるはずである。 ウェブを検索してみると、stackoverflow.comに How can I see all Wifi Passwords using netsh with 1 command?という記事があった。 PowerShellを使い、以下のようにすれば良い。

> type show-all-saved-wifis.ps1
netsh wlan show profiles | Select-String ":.*[a-zA-Z0-0-_]+" | % {"$_".split(":")[1].trim()} | % {netsh wlan show profile name=$_ key=clear}

Windows 10で秘密鍵がエクスポート禁止になっている電子証明書をエクスポートする

どういう仕組みで設定されているのかは把握していないが、Windows 10では秘密鍵がエクスポートできない電子証明書を指定することができるようだ。 だが、その秘密鍵は例えばHTTPSで電子証明書によるクライアント認証をする際には送られているはずなので、 単に秘密鍵をエクスポートを禁止するユーザーインターフェイスの機能があるだけで、秘密鍵を得ることはできるはずである。

その秘密鍵を受け取るようなサーバーを用意すれば良いのだとは思うが、同じようなことをしようと考えている人はいるはずである。 検索すると、https://github.com/iSECPartners/jailbreakというのが見付かる。 今回は、Windows 10 21H2 64-bitで試してみた。

https://github.com/iSECPartners/jailbreak/binariesに ビルド済みのバイナリーが含まれている。リポジトリーをcloneするか.zipファイルとしてダウンロードし、 管理者権限のコマンドプロンプトで以下のように実行すればcertmgr.mscが開き、そこでは秘密鍵がエクスポートできないという制限はなくなった。

binaries> jailbreak64 c:\windows\system32\mmc.exe c:\windows\system32\certmgr.msc -64

もし、管理者権限のないコマンドプロンプトで実行すると、以下のようなエラーになってしまう。

binaries>jailbreak64 c:\windows\system32\mmc.exe c:\windows\system32\certmgr.msc -64
CreateProces failed with error code = 740
Command line = c:\windows\system32\mmc.exe c:\windows\system32\certmgr.msc -64

また、アンチウイルスソフトウェアによっては、hacking toolとして認識されてしまうので、アンチウイルスソフトウェアは 停止させておかないといけない。Microsoft Defenderは検出はしないようである。

HP ProBook 450 G7でhomeキーを押すとmキーが押されたことになっていた

気付くと、HP ProBook 450 G7の内蔵日本語キーボードでhomeキーを押すと、mの文字が入力されるようになっていた。 USBキーボードをつないで、そちらのhomeキーを押すと、homeキーとして働きmの文字は入力されない。 Windows 10 21H2 x86_64には、xevコマンドのようなキーボードのスキャンコードを把握できるようなソフトウェアは 含まれていないようだった。 KeyboardStateView v1.00をダウンロードして 実行してみると、確かにhomeキーを押した時にmキーを押したようになっている。 USBキーボードが内蔵キーボードと違う挙動を示しているということは、レジストリーでスキャンコードを差し替えている訳ではないはずである。 そして、このPCはCaps Lockキーを左Ctrlキーになるようにレジストリーで設定しているが、その内容も変化しておらず、Caps Lockキーを左Ctrlキーに しているだけの内容だった。それを削除しても状況に変化はなかった。 本当はWindows以外のOSで試してみれば良かったのだが、準備できず試すことはできなかった。 再起動しても電源を落としても変化はない。

内蔵キーボードだけおかしいとなると、キーボードの配線に不良が発生したか、BIOSがキーボードを制御している部分があるとすれば、 それがおかしいのだと思われる。 いずれにしても、BIOSは最新化しておかないといけない。修理に出すのであれば修理依頼時にBIOSの最新化を求められるだろう。 不具合のあった時のBIOSは、 01.13.01 Rev.A だった。 今日時点の最新は、01.14.00 Rev.A であった。 BIOS S71 01.14.11 Rev.Aの変更点には今回の問題についての記述はなかったが、00.14.00 Rev.Aにアップデートしたところ問題は解消した。

Arvel USBシリアルケーブルSRC06-USBをWindows 10 x86_64で使う

Arvel SRC06-USB USBシリアルケーブルというUSBシリアル変換器を持っている。 これにはFDTI製のUSBシリアル変換チップをい利用していて、USB VendorID/ProductID=0x0403/0x6001として認識される。 Arvelを買収したBuffaloのウェブサイトでは、Windows 10用のデバイスドライバーは提供されていないようだ。 Windows 7までのデバイスドライバーは、https://www.buffalo.jp/support/download/detail/?dl_contents_id=60914で配布されている。

FTDIのウェブサイトに行くと、2022年6月21日現在、Windows 7から11用のVCPとD2XXの両方のデバイスドライバーのインストーラーhttps://ftdichip.com/wp-content/uploads/2021/08/CDM212364_Setup.zipが配布されていた。 このインストーラーを使うと、USB Serial Port (COM3)として認識され、無事に利用できた。COM3の部分は環境によって違うと思われる。

O’Reilly learning platformに日本語の書籍が収録されるようになっていた

O’Reilly learning platformというのがあって、かつてはSafari Books Onlineと呼ばれていたものなのだが、 コンピューターに関する技術書が中心だったのだが、旅行のガイドブックや自己啓発書など今はいろいろ分野の本も含まれている。 昨年くらいには、英語の本以外には、韓国語や中国語の本がいくつかあるだけだったのだが、最近はオライリージャパンの出版する日本語の本も収録されるようになってる。 2021年に刊行されたプログラミングC# 第8版や 2012年に刊行されたリーダブルコード――より良いコードを書くためのシンプルで実践的なテクニックなど100冊以上が 収録されている。

Content Decryption Module (CDM)の種類

Encrypted Media Extensions (EME)から利用するContent Decryption Module (CDM)の種類を調べてみた。

この程度がCDMとして利用されているようだ。

バンクペーパーを利用したLIFE WRITING PAPER

三菱製紙のバンクペーパーを利用した ライフ ライティングペーパー A5 T35を使っている。 書いた感触は非常に良いのだが、透しが入っているので、スキャンする予定の絵を書くには向かないような気がする。 製紙会社の透しなど入れる必要はないような気がするが、なぜ入れているのだろうか。

Windows 10で全ての属性のファイルとディレクトリーを再帰的に表示する

Windows 10のdirコマンドで、全ての属性のファイルとディレクトリーを再帰的に表示するには以下のように実行すれば良かった。

> dir /a /s

Google Bloggerの独自ドメイン利用時のTLS/SSL証明書の発行者が変わっていた

このブログはGoogleのBloggerを使っていて、blog.onodera.asiaという独自ドメインを 設定していて、それに対してHTTPSでのアクセスを有効にしている。 独自ドメインでHTTPSを有効化した際のTLS/SSL証明書は、Turn on HTTPS for your blogに2022-03-20時点で、

Important: If you use CAA Records on your custom domain, add a record for letsencrypt.org, or Blogger won't create or renew your SSL certificate.

と記載のあるように、Let's Encryptの発行する電子証明書を使っていた記憶がある。

しかし、2022-03-20現在ではGoogle Trust Services LLCのGTS CA 1D4という中間CAの発行する3カ月間有効なDomain Validationな 電子証明書に切り替わっている。 Fri, 18 Feb 2022 09:11:14 GMTが開始日になっているので、少なくとも2022-02-18の時点ではLet's Encryptを利用しないように なっていたようだ。

Amazon Fire 7でUSB接続のキーボードとマウスを使う

使おうと思って使えていないWindows 10のインストールされたタブレットPCのために、USB micro-BなOTGケーブルを持っている。 Amazon Fire 7 (第5世代と第9世代)でキーボードでアルファベットを入力できると助かる用途があった。

まず第9世代だが、US配列なMajestouch Convertible 2というキーボードをつないでみると、正常に入力できた。 ついでにマウスも使えるのかとLogicool G304というマウスをつないでみたところ、マウスカーソルが表示され、正常に操作できた。 セルフパワーなUSBハブを使ってキーボードとマウスの両方を同時に使うことも可能だった。

第5世代の方は、Fire 7が供給する電力が不足しているようで、キーボードもマウスも使えなかった。OTGケーブルには給電する端子もあるので、 5V1Aを給電したところ、キーボードもマウスも正常に認識され使用できた。 セルフパワーなUSBハブを使って両方を同時に使うこともできた。

まあ、Androidなので基本的には使えて当然なのだろうが。

Apple Configurator 2

サポート期間が長いという理由でiPhoneを使っているのだが、Androidと違っていろいろ小回りがきかないので面倒で不便で仕方がない。 と言うことで、Androidのスマートフォンも持たざるを得ないのだが、そうなると本末転倒な気もする。 まあ、Androidなスマートフォンは、特定の用途にしか使わないようにして、iPhoneでほとんどの操作はしているのだが。

iPhoneで細かい設定がメニューからはできないので、Apple Configurator 2を使ってプロファイルを作ったら良いのではないかと考えた。 しかし、私の手元にあるMacは、既にサポートの終了したmacOS High Sierra (10.13.6)のインストールされたMac mini Mid 2011しかない。 Mac mini Mid 2011で利用できる最新のmacOSはHigh Sierraである。 これはiPhone 8 Plus、XR、XS、12の写真を安定して取り出すには十分だが、 Apple Configurator 2は新規インストールはできなかった。少なくともmacOS Catalina (10.15)である必要があるとのメッセージが表示された。

3度目のDell XPS 13 9300の修理をしてもらった

前回、訪問修理でファンを修理してもらったが、 また同様にファンが異音を出すようになってしまったため、今回は引取修理をしてもらった。

異音の発生と修理依頼

2022-02-03からファンがまた断続的に異音を発生させるようになってしまった。 音を聞いた感じでは、左側のファンがおかしいようだ。 前回も同様の問題が発生し、修理をする方に自宅に訪問してもらい、ファン2つを交換してもらい、解消していた。 www.dell.comで、購入時に使ったアカウントでログインして、いろいろ見ていたら、電話番号を案内されるルートがあったが、 そこには受付時間帯が記載されていなかった。遅い時間だとは思ったが、 受付時間外であれば、どの時間帯に電話すべきかアナウンスされるだろうと考え、 2022-02-04 23:20ころに電話した。すぐにオペレーターにつながった。 BIOSから自己診断を実施するように言われ、実施するが思ったより時間がかかった。 また、Video FanもProcessor Fanも異常という診断にはならなかった。この時には、異音は発生しなかった。 OSを起動して負荷を掛けてみて、異音が発生するか確認したが、すぐには再現できなかった。 一度電話を切り、15分間程度後にオペレーターから電話をもらうこととして様子を見た。だが、この15分間では異音の発生はなかった。 修理をして欲しい旨を伝えたところ、訪問修理と引き取り修理の2つの選択肢があり、 引き取り修理にして工場に送った方が総合的に診断してもらえるので良さそうと判断した。 他に気になる所があるかという話になり、左右いずれのUSB Type-CコネクターでもUSB-Ethernetアダプターなど USB接続機器が認識されないことがあるので、合わせて見て欲しいと伝えた。 発生頻度については、50%くらいで発生するようなイメージであり、OSは関係なく、BIOSでも認識されていない旨を伝えた。 引き取りは、ヤマト運輸を予定しており、最短で2022-02-08の回収になるとのことであった。 午前中と18:00-21:00を指定できるとのことだったので、18:00-21:00の間に回収してもらうこととした。 渡すのは本体のみで良いとのことだった。 また、内蔵のリチウムイオン電池が良くない状態の場合には、有償での交換になるとのことであった。 有償である場合には、事前に交換して欲しいと指定することはできず、作業前に連絡する必要があるとのことだったので、 電話でも電子メールでも良いので連絡をもらうこととした。

追加問い合わせが来た

2022-02-06 17:10ころに電話があったが取ることができなかった。 電子メールで、同梱のUSB Type-C to Aアダプターを使っていてUSBの問題が発生しているか、 そうであれば、同梱のUSB Type-C to Aアダプターも引き取りたいとの連絡があった。 私は同梱のUSB Type-C to Aアダプターは全く利用していないので、その旨電子メールで返信した。 電子メールで返信があり、本体のみ引き取りするとのことであった。

引取手配の完了

2022-02-07に、2022-02-08の引き取りの手配がされたとの電子メールが来た。

ヤマト運輸による引取の実施

2022-02-08 21:00ころに、ヤマト運輸がPC本体のみを引き取りに来たので引渡した。 伝票番号で到着予定日付を確認すると、2022-02-09到着予定日になっていた。

修理センターへの到着

2022-02-10 11:28に電子メールで、引き取り修理センターに到着したと言う連絡が来た。 「サービスリクエストの詳細」のウェブページを見ると、「システムは受領済み」というステータスになっていた。 しかし、この時点で、ヤマト運輸の荷物問い合わせシステムで見ると、まだ「作業店通過(南東京法人営業支店)」のステータスのままだった。

修理の実施

2022-02-10 11:43に、「サービスリクエストの詳細」のウェブページで「修理に向けて、お客様のシステムを診断中です。」 と言うステータスになっていた。 2022-02-10 12:48に、「サービスリクエストの詳細」のウェブページで「現在、ユニットの修理に必要なパーツの手配を行っております。」 というステータスになっていた。 2022-02-10 17:58に、「サービスリクエストの詳細」のウェブページで「現在、認定技術者がお客様の製品の修理を行っております。 このステップには、正常に動作できる状態にユニットを戻すための修理、テスト、および必要なパーツの交換が含まれます。」 というステータスになっていた。 2022-02-10 19:19に、ヤマト運輸の荷物問い合わせシステムで「配達完了」のステータスになった。

返却

2022-02-14 15:58に、「サービスリクエストの詳細」のウェブページで「返却の手続きを実行中。」というステータスになっていた。 2022-02-14 16:08に、「サービスリクエストの詳細」のウェブページで「お客様の製品はご返却先住所に出荷されております。 返送状況は、追跡番号xxxxxxxxxxxxを利用して追跡できます。」というステータスになっていた。 この時点で、2022-02-10 17:58の「現在、認定技術者がお客様の製品の修理を行っております。 このステップには、正常に動作できる状態にユニットを戻すための修理、テスト、および必要なパーツの交換が含まれます。」 というステータス表示は消えていた。 また、xxxxxxxxxxxxの部分は、http://toi.kuronekoyamato.co.jp/cgi-bin/tnekoへのリンクになっていた。 上部のワークオーダーアクティビティーの右側の配送状況の追跡の文字列も同じURIへのリンクになっていた。 2022-02-14 18:02の時点で、ヤマト運輸荷物お問い合わせシステムでは、xxxxxxxxxxxxの伝票番号は、「伝票番号未登録」のステータスだった。 2022-02-14 21:00頃に見ると、ヤマト運輸荷物お問い合わせシステムでは、 南東京法人営業支店で「荷物受付」と「発送済み」の2つのステータスが19:12に同時に更新されていた。 2022-02-15 08:36に、ヤマト運輸荷物お問い合わせシステムで、最寄りのセンターから配達中になっていた。 2022-02-15 13:03に、配達されて来た。 2022-02-15 17:04に、テクニカルサポートから電子メールで問題は解消したかの確認の電子メールが来ていた。

到着

報告したファンの異音もUSBポートの問題も、確認できなかったそうだが、 左右のファンとマザーボードの交換をしたとの修理報告書が同封されていた。 ファンの異音はなくなったが、USBポートは、手元のUSB Type-C接続のEthernetアダプターをBIOSで常に認識できるようにはなっていなかった。 おそらくハードウェアの問題ではないのだろう。問題は解決した旨をテクニカルサポートに返信しておいた。

NetBSD/amd64 9.99.93上のpkgsrc/x11/mltermでのOpenType layout表示

本当は、NetBSD以外でも起きるのかとか、HarfBuzz他のライブラリーの変更とかも調べて解決しないといけないのだが、 pkgsrc/x11/mltermからインストールしたmlterm-3.9.2で「ドル」「ミリ」「キログラム」「サンチーム」などが、 一文字の㌦、㍉、㌕、㌠といった組文字1文字になってしまっているのに気付いた。 ~/.mlterm/mainluse_ot_layout = trueになっていると、この状態になって しまうことが分かった。Ctrl+右クリックで表示されるmlterm configurationウィンドウでOpenType Layoutの部分が 該当するGUIでの設定項目だと思うのだが、そのFeaturesを全てオフにしても解消しなかった。 Scriptの設定ではlatnを選択していたが、アットランダムに他のものに変更しても解消しなかった。 OpenTypeについてちゃんと理解すれば正しく解消できそうだが、最近あまり時間がないので、OpenType Layoutはオフにしておくことにした。

MetabaseでOracle databaseをデータソースにしている時の「ORA-00911: 文字が無効です。」エラーの原因

Metabaseもどんどん新しくなって、改善されて便利になっている。 SQLを保存しておいて、インタラクティブにクエリーを実行したり、 結果を電子メールで配信したりするのに重宝している。

MetabaseでSQLを実行するときに、「ORA-00911: 文字が無効です。」というエラーが発生することがある。 このエラーが発生するのは、SQLの最後にセミコロンがついていることが原因だった。

Microsoft Windows 10で、独自のdhcpdから渡されたIPv4のDNSサーバーを優先して利用するようになっていた

Microsoft WindowsでIPv6が優先されている時に、IPv4なDNSサーバーを優先して使いたい場合という記事を2019年に書いていた。 PR-500MIというNTTの貸与するホームゲートウェイのファームウェアバージョン08.00.0003のものを利用しているのだが、 いつの間にか、静的にIPv4のDNSサーバーを指定しなくても、自分のネットワーク内のIPv4なDNSサーバーが第1に優先して利用されるようになっていた。 「Microsoft Windows 10ではNTTから貸与されるひかり電話対応のルーターをIPv6なIPアドレスを持つDNSサーバーを優先して使用してしまう」と 書いた問題はなくなっているようだ。

IPoEによるIPv6接続が有効になったくらいしか変わったことはないので、そういう影響なのだろうか?

iOS 15.3を利用するiPhoneでの日本語表示で中国語フォントが使われないようにする

Han unificationというのは、本当に良いことはなかったのだと毎回思うのだが、実際には既にされてしまっている訳で どうしようもない。 iPhone/iOSはいろいろとできないことが多く使いたくはないのだが、最新のOSが提供される期間を考えると、 Androidを搭載するスマートフォンは不便である。 私だけで言えば、安いAndroid搭載のスマートフォンを2年ごとに買い替えても構わないのだが、他の人のことも考えると そうも行かない。 そのお下がりをもらって使うのだから、iPhoneを使うしかない訳だ。

最近のAndroidでは、OPPOのColor OSのように機能を削っていなければ、複数のロケールを設定できる。 なので、第1ロケールを英語にし、第2ロケールを日本語にしておけば、UIは英語で表示できるし、 日本語の文字は中国語フォントではなく、日本語フォントで表示させることができる。

iPhoneを使い始めてすぐに、QWERTYキーボードで常に数字を表示させたかったのだが、Google Gboardを 使っても、そういうことはできなかったので、あきらめてiOS標準のキーボードを利用していた。 iOS標準のキーボードの日本語変換は非常に精度が悪く、簡単な文章でもうまく変換できないことが多い。 どこかで間違った学習をさせてしまったのかもしれないが、何にしても不便だ。

と言うことでGoogle Gboardを再度使い始めたのだが、これまでのAppleのキーボードであるEnglish (Japan)とJapanese - Romajiを 削除して、Gboardのみにしてしまうと、日本語の文字が中国語フォントで表示されるようになってしまった。 iPhone LanguageをEnglishにしている場合、Preferred Language Orderを第1にEnglish、第2に日本語にしていても、Japanese - Romaji のキーボードを削除してしまうと、日本語の文字が中国語フォントで表示されるようになってしまうようだ。 使わなくても、Japanese -Romajiキーボードを残しておくことにした。

地方自治体の利用するgo.jpドメイン

しばらく前に、tokyo-eiken.go.jpという東京都健康安全研究センターのドメインが、地方自治体の組織なのにgo.jpドメインを 使っているのが話題になっていたように思う。whoisで見ると、今も有効ではあるようだ。

$ whois tokyo-eiken.go.jp
[ JPRS database provides information on network administration. Its use is    ]
[ restricted to network administration purposes. For further information,     ]
[ use 'whois -h whois.jprs.jp help'. To suppress Japanese output, add'/e'     ]
[ at the end of command, e.g. 'whois -h whois.jprs.jp xxx/e'.                 ]

Domain Information: [ドメイン情報]
a. [ドメイン名]                 TOKYO-EIKEN.GO.JP
e. [そしきめい]                 とうきょうとけんこうあんぜんけんきゅうせんたー
f. [組織名]                     東京都健康安全研究センター
g. [Organization]               Tokyo Metropolitan Public Health Research Institute
k. [組織種別]                   地方公共団体(東京都健康局の組織)
l. [Organization Type]          Local Government
m. [登録担当者]                 NK036JP
n. [技術連絡担当者]             NK036JP
p. [ネームサーバ]               dns-x.sinet.ad.jp
p. [ネームサーバ]               ns.tokyo-eiken.go.jp
s. [署名鍵]
[状態]                          Connected (2022/09/30)
[登録年月日]                    1994/09/22
[接続年月日]                    1994/11/24
[最終更新]                      2021/10/01 01:03:01 (JST)

同じように、kmt-iri.go.jpという熊本県産業技術センターのドメインが地方自治体の組織でgo.jpドメインを 利用している。

$ whois kmt-iri.go.jp
[ JPRS database provides information on network administration. Its use is    ]
[ restricted to network administration purposes. For further information,     ]
[ use 'whois -h whois.jprs.jp help'. To suppress Japanese output, add'/e'     ]
[ at the end of command, e.g. 'whois -h whois.jprs.jp xxx/e'.                 ]

Domain Information: [ドメイン情報]
a. [ドメイン名]                 KMT-IRI.GO.JP
e. [そしきめい]                 くまもとけんさんぎょうぎじゅつせんたー
f. [組織名]                     熊本県産業技術センター
g. [Organization]               Kumamoto Industrial Research Institute
k. [組織種別]                   地方公共団体の下部組織
l. [Organization Type]          Local Public Organization
m. [登録担当者]                 SK22472JP
n. [技術連絡担当者]             SK22472JP
p. [ネームサーバ]               amakusa.kmt-iri.go.jp
p. [ネームサーバ]               kumamoto.kmt-iri.go.jp
p. [ネームサーバ]               dns-x.sinet.ad.jp
s. [署名鍵]
[状態]                          Connected (2022/03/31)
[登録年月日]
[接続年月日]                    2018/11/15
[最終更新]                      2021/04/01 01:06:26 (JST)

組織種別に統一感がないのが気になるが、特殊な例なので仕方がないのだろうか。

Mac miniにWindows用キーボードを接続してmacOSをインターネットリカバリーする

iPhoneの写真をWindows PCにUSB-Lightningケーブルで接続すると、MTPでファイル転送できるのだが、 非常に不安定で、少しまとめて写真を転送しようとすると、すぐにデバイスエラーになってしまう。 iPhoneがMTP経由でWindows PCに見せるファイル形式をネイティブにしてもエラーは同じくらいの頻度で発生するので、 Windows PCにはまともに転送はできないのだろうと思っている。

既にサポートが終了している古いMac miniしかないのだが、そのmac OS High SierraでもiPhone 12から写真は 安定して転送できた。 やはり、iPhoneの写真を安定して取り出すには、macOSが必要だということなんだろう。 深く追求する価値がある問題であるとも思えないので、このMac miniを使えば良いということにしよう。

さて、当然Apple製のキーボードなど持っていないので、Windows用のキーボードをつないで macOSをインターネットリカバリーをしないといけない。 その際には、macOS を再インストールする方法 - その他の macOS のインストールオプション にあるように、optionキー+commandキー+Rキー電源を投入しないといけない。 でも、当然だが、Windows用のキーボードには、optionキーもcommandキーもないのである。 どうやら、commandキーはWindowsキーになり、optionキーはAltキーになるようだ。 なので、Windowsキー+Altキー+Rキーを同時に押して電源を投入すると、最新のmacOSをインターネットリカバリーできた。

Windows 10でコマンドラインでユーザーを追加する

非常に不便なWindowsのみの環境で作業することがあるのだが、 その環境にあるActive Directoryで管理されたWindows 10 20H2の端末では、 管理者権限があっても、 コントロールパネル→ユーザーアカウント→ユーザーアカウント管理の画面では、 ローカルユーザーを削除はできても追加はできない。 おそらく、グループポリシーか何かで制限しているのだろう。

全てのドメインユーザーに管理者権限はあるので、 全てのローカルユーザーを削除してしまうと、メンテナンスをするのが難しくなって しまうことを理解していないユーザーでも、 ローカルユーザーを意図せず削除してしまうことができてしまう。 でも、GUIではユーザー追加はできないので、コマンドラインで試みたところ、 追加できたので、書いておく。

「コマンドプロンプト」を「管理者として実行」として実行した上で、 以下のように実行すれば良い。 今回の環境では、追加したユーザーの権限はGUIで変更できるので、 ここでは考えていない。

> net user owner ownerspassword /ADD

Windows 10のnslookupコマンドでDNSのMXレコードを参照する

Windowsには、少なくとも標準ではdigコマンドやhostコマンドはなく、nslookupコマンドしかない。 NetBSDにもBINDに付属するnslookupコマンドはあるのだが、最近は使うことはあまりない。

そのWindows用のnslookupコマンドも、BINDのものと同様に、レコードのタイプを 指定して参照できる。少なくともレコードのタイプを指定するという意味では、 Windows 10 20H2のnslookupコマンドは、BINDのものと同じように使えた。

Windows 10の場合

>nslookup -type=MX google.com
サーバー:  UnKnown
Address:  10.123.123.123

権限のない回答:
google.com      MX preference = 30, mail exchanger = alt2.aspmx.l.google.com
google.com      MX preference = 40, mail exchanger = alt3.aspmx.l.google.com
google.com      MX preference = 50, mail exchanger = alt4.aspmx.l.google.com
google.com      MX preference = 20, mail exchanger = alt1.aspmx.l.google.com
google.com      MX preference = 10, mail exchanger = aspmx.l.google.com

alt2.aspmx.l.google.com internet address = 142.250.115.26
alt2.aspmx.l.google.com AAAA IPv6 address = 2607:f8b0:4023:1004::1b
alt3.aspmx.l.google.com internet address = 64.233.171.26
alt3.aspmx.l.google.com AAAA IPv6 address = 2607:f8b0:4003:c15::1a
alt1.aspmx.l.google.com internet address = 142.250.141.26
alt1.aspmx.l.google.com AAAA IPv6 address = 2607:f8b0:4023:c0b::1a
aspmx.l.google.com      internet address = 108.177.97.26
aspmx.l.google.com      AAAA IPv6 address = 2404:6800:4008:c15::1a

NetBSD 9.99.92の場合

$ nslookup -type=MX google.com
Server:         10.234.234.234
Address:        10.234.234.234#53

Non-authoritative answer:
google.com      mail exchanger = 30 alt2.aspmx.l.google.com.
google.com      mail exchanger = 50 alt4.aspmx.l.google.com.
google.com      mail exchanger = 10 aspmx.l.google.com.
google.com      mail exchanger = 20 alt1.aspmx.l.google.com.
google.com      mail exchanger = 40 alt3.aspmx.l.google.com.

Authoritative answers can be found from:
alt4.aspmx.l.google.com internet address = 142.250.152.27
aspmx.l.google.com      internet address = 108.177.97.26
aspmx.l.google.com      has AAAA address 2404:6800:4008:c13::1a
alt1.aspmx.l.google.com internet address = 142.250.141.27
alt1.aspmx.l.google.com has AAAA address 2607:f8b0:4023:c0b::1b
alt3.aspmx.l.google.com internet address = 64.233.171.27
alt3.aspmx.l.google.com has AAAA address 2607:f8b0:4003:c15::1a
alt2.aspmx.l.google.com internet address = 142.250.115.26

nslookupコマンドでインタラクティブにクエリーを発行する場合にも、 WindowsとBINDで設定方法は同じだった。

Windows 10の場合

>nslookup
既定のサーバー:  UnKnown
Address:  10.123.123.123

> set type=MX
> google.com
サーバー:  UnKnown
Address:  10.123.123.123

権限のない回答:
google.com      MX preference = 40, mail exchanger = alt3.aspmx.l.google.com
google.com      MX preference = 50, mail exchanger = alt4.aspmx.l.google.com
google.com      MX preference = 20, mail exchanger = alt1.aspmx.l.google.com
google.com      MX preference = 10, mail exchanger = aspmx.l.google.com
google.com      MX preference = 30, mail exchanger = alt2.aspmx.l.google.com

alt3.aspmx.l.google.com internet address = 64.233.171.27
alt3.aspmx.l.google.com AAAA IPv6 address = 2607:f8b0:4003:c15::1a
aspmx.l.google.com      internet address = 108.177.97.26
alt2.aspmx.l.google.com internet address = 142.250.115.26
> gmail.com
サーバー:  UnKnown
Address:  10.123.123.123

権限のない回答:
gmail.com       MX preference = 30, mail exchanger = alt3.gmail-smtp-in.l.google.com
gmail.com       MX preference = 5, mail exchanger = gmail-smtp-in.l.google.com
gmail.com       MX preference = 10, mail exchanger = alt1.gmail-smtp-in.l.google.com
gmail.com       MX preference = 40, mail exchanger = alt4.gmail-smtp-in.l.google.com
gmail.com       MX preference = 20, mail exchanger = alt2.gmail-smtp-in.l.google.com

alt3.gmail-smtp-in.l.google.com internet address = 64.233.171.26
alt3.gmail-smtp-in.l.google.com AAAA IPv6 address = 2607:f8b0:4003:c15::1a
gmail-smtp-in.l.google.com      internet address = 108.177.125.26
gmail-smtp-in.l.google.com      AAAA IPv6 address = 2404:6800:4008:c01::1a
alt1.gmail-smtp-in.l.google.com internet address = 142.250.141.26
alt1.gmail-smtp-in.l.google.com AAAA IPv6 address = 2607:f8b0:4023:c0b::1b
alt4.gmail-smtp-in.l.google.com internet address = 142.250.152.26
alt4.gmail-smtp-in.l.google.com AAAA IPv6 address = 2607:f8b0:4001:c56::1a
alt2.gmail-smtp-in.l.google.com internet address = 142.250.115.26
alt2.gmail-smtp-in.l.google.com AAAA IPv6 address = 2607:f8b0:4023:1004::1a

NetBSD 9.99.92の場合

$ nslookup
> set type=MX
> google.com
Server:         10.234.234.234
Address:        10.234.234.234#53

Non-authoritative answer:
google.com      mail exchanger = 40 alt3.aspmx.l.google.com.
google.com      mail exchanger = 30 alt2.aspmx.l.google.com.
google.com      mail exchanger = 50 alt4.aspmx.l.google.com.
google.com      mail exchanger = 10 aspmx.l.google.com.
google.com      mail exchanger = 20 alt1.aspmx.l.google.com.

Authoritative answers can be found from:
alt4.aspmx.l.google.com internet address = 142.250.152.27
aspmx.l.google.com      internet address = 142.250.157.26
alt1.aspmx.l.google.com internet address = 142.250.141.26
alt3.aspmx.l.google.com internet address = 64.233.171.26
alt2.aspmx.l.google.com internet address = 142.250.115.27
> gmail.com
Server:         10.234.234.234
Address:        10.234.234.234#53

Non-authoritative answer:
gmail.com       mail exchanger = 30 alt3.gmail-smtp-in.l.google.com.
gmail.com       mail exchanger = 20 alt2.gmail-smtp-in.l.google.com.
gmail.com       mail exchanger = 40 alt4.gmail-smtp-in.l.google.com.
gmail.com       mail exchanger = 10 alt1.gmail-smtp-in.l.google.com.
gmail.com       mail exchanger = 5 gmail-smtp-in.l.google.com.

Authoritative answers can be found from:
alt1.gmail-smtp-in.l.google.com internet address = 142.250.141.27
alt1.gmail-smtp-in.l.google.com has AAAA address 2607:f8b0:4023:c0b::1b
gmail-smtp-in.l.google.com      internet address = 108.177.97.27
gmail-smtp-in.l.google.com      has AAAA address 2404:6800:4008:c00::1a
alt3.gmail-smtp-in.l.google.com internet address = 64.233.171.26
alt3.gmail-smtp-in.l.google.com has AAAA address 2607:f8b0:4003:c15::1b
alt2.gmail-smtp-in.l.google.com internet address = 142.250.115.27
alt2.gmail-smtp-in.l.google.com has AAAA address 2607:f8b0:4023:1004::1b
alt4.gmail-smtp-in.l.google.com internet address = 142.250.152.27
alt4.gmail-smtp-in.l.google.com has AAAA address 2607:f8b0:4001:c56::1a

plgarc/wip/llama.cppでpkgsrcのBLASサポートを探る

この記事は、 NetBSD Advent Calendar 2024 の13日目の記事です。 llama.cppを使ってみる 以前に、 NetBSD/amd64でllama.cppを使ってみる という記事で llama.cpp を使ってみていました。 あれか...