stylesheet

2023-09-13

Grafana公式レポジトリの鍵が更新されたようだ

apt update失敗。サードパーティーレポジトリを追加していると稀に遭遇する公開鍵のエラー。

$ sudo apt update
ヒット:1 http://ftp.iij.ad.jp/pub/linux/ubuntu/archive jammy InRelease
ヒット:2 http://ftp.iij.ad.jp/pub/linux/ubuntu/archive jammy-updates InRelease
ヒット:3 http://ftp.iij.ad.jp/pub/linux/ubuntu/archive jammy-security InRelease
ヒット:4 https://download.docker.com/linux/ubuntu jammy InRelease
取得:5 https://apt.grafana.com stable InRelease [5,984 B]
ヒット:6 http://security.ubuntu.com/ubuntu jammy-security InRelease
エラー:5 https://apt.grafana.com stable InRelease
  公開鍵を利用できないため、以下の署名は検証できませんでした: NO_PUBKEY 963FA27710458545
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています... 完了
状態情報を読み取っています... 完了
アップグレードできるパッケージが 24 個あります。表示するには 'apt list --upgradable' を実行してください。
W: 署名照合中にエラーが発生しました。リポジトリは更新されず、過去のインデックスファイルが使われます。GPG エラー: https://apt.grafana.com stable InRelease: 公開鍵を利用できないため、以下の署名は検証できませんでした: NO_PUBKEY 963FA27710458545
W: https://apt.grafana.com/dists/stable/InRelease の取得に失敗しました  公開鍵を利用できないため、以下の署名は検証できませんでした: NO_PUBKEY 963FA27710458545
W: いくつかのインデックスファイルのダウンロードに失敗しました。これらは無視されるか、古いものが代わりに使われます。

今回はGrafanaのようだ。

こちらのブログによると、「秘密鍵をうっかり共有しちゃったので、鍵を新しくしたよ!」とのこと。
更新方法も書いてあったが、古い鍵の削除がうまくいかなかったので、ちゃんとやる。

apt-key listで鍵の一覧を表示。

$ apt-key list
Warning: apt-key is deprecated. Manage keyring files in trusted.gpg.d instead (see apt-key(8)).
/etc/apt/trusted.gpg
--------------------
pub   rsa2048 2017-01-24 [SC]
      4E40 DDF6 D76E 284A 4A67  80E4 8C8C 34C5 2409 8CB6
uid           [  不明  ] Grafana <info@grafana.com>
sub   rsa2048 2017-01-24 [E]

pub   rsa3072 2023-08-24 [SC] [有効期限: 2025-08-23]
      B53A E77B ADB6 30A6 8304  6005 963F A277 1045 8545
uid           [  不明  ] Grafana Labs <engineering@grafana.com>
sub   rsa3072 2023-08-24 [E] [有効期限: 2025-08-23]

/etc/apt/trusted.gpg.d/apt-fast-ubuntu-stable.gpg
-------------------------------------------------
pub   rsa1024 2012-06-11 [SC]
      A216 6B8D E8BD C336 7D19  01C1 1EE2 FF37 CA8D A16B
uid           [  不明  ] Launchpad PPA for apt-fast

/etc/apt/trusted.gpg.d/ubuntu-keyring-2012-cdimage.gpg
------------------------------------------------------
pub   rsa4096 2012-05-11 [SC]
      8439 38DF 228D 22F7 B374  2BC0 D94A A3F0 EFE2 1092
uid           [  不明  ] Ubuntu CD Image Automatic Signing Key (2012) <cdimage@ubuntu.com>

/etc/apt/trusted.gpg.d/ubuntu-keyring-2018-archive.gpg
------------------------------------------------------
pub   rsa4096 2018-09-17 [SC]
      F6EC B376 2474 EDA9 D21B  7022 8719 20D1 991B C93C
uid           [  不明  ] Ubuntu Archive Automatic Signing Key (2018) <ftpmaster@ubuntu.com>

apt-key delで指定するフィンガープリントは下8桁で良いらしい。
Grafana関連と思わしき鍵を削除。

$ sudo apt-key del 24098CB6
$ sudo apt-key del 10458545

新しい鍵をダウンロード。

$ sudo wget -q -O /usr/share/keyrings/grafana.key https://apt.grafana.com/gpg.key

以上。

2023-06-20

HyperSBI2をSolarized色に染める

HYPER SBI 2: テーマ選択できるのは良いのだけど、ブラックorホワイト、どっちのテーマもものすごく目が疲れるんですけど…。旧バージョン時代のブルーカラー復活を切に願い…。

我慢して使っていたけどもう限界。リソースを編集して無理やり背景色を書き換えることにする。

手順

stylesheet.rccの差し替えを行う。元に戻せるよう、事前にC:\Program Files (x86)\SBI SECURITIES\HYPERSBI2\stylesheet.rccのバックアップを取っておく。

curl -o RccExtended-v1.0.5-win32.zip -L  https://github.com/zedxxx/rccextended/releases/download/v1.0.5/RccExtended-v1.0.5-win32.zip
Expand-Archive RccExtended-v1.0.5-win32.zip
cd .\RccExtended-v1.0.5-win32\
cp 'C:\Program Files (x86)\SBI SECURITIES\HYPERSBI2\stylesheet.rcc' .
.\rcc.exe --reverse
Set-ItemProperty .\qresource\res\stylesheet.rcc\stylesheet\dark\common -Name IsReadOnly -Value $false
sed -i -e 's/#0C0C0D/#073642/g' -e 's/#1a1a1a/#002B36/g' .\qresource\res\stylesheet.rcc\stylesheet\dark\common
cd .\qresource\rcc\
cp ..\..\rcc.exe .
.\rcc-make.bat
sudo cp .\stylesheet.rcc 'C:\Program Files (x86)\SBI SECURITIES\HYPERSBI2\stylesheet.rcc'

以上。

リソースの書き換えには危険が伴います。また、アップデートに失敗したり、編集内容が元に戻ったりといったことが起こります。記載の内容を十分理解したうえ、自己責任で行いましょう。

概要

リソースのアンパック

HYPER SBI 2のインストール先はC:\Program Files (x86)\SBI SECURITIES\HYPERSBI2\
qtアプリケーションのようなので、rccextendedツールを使用してリソースをアンパックする。リソースファイルは拡張子が.rccのもの。 目当てのものはstylesheet.rccに含まれていた。config.rccにもテーマらしきものが含まれていたが、今回は使用しない。

wget https://github.com/zedxxx/rccextended/releases/download/v1.0.5/RccExtended-v1.0.5-win32.zip
Expand-Archive RccExtended-v1.0.5-win32.zip
cd .\RccExtended-v1.0.5-win32\
cp 'C:\Program Files (x86)\SBI SECURITIES\HYPERSBI2\stylesheet.rcc' .
.\rcc.exe --reverse

スタイルの書き換え

手っ取り早くsed.\qresource\res\stylesheet.rcc\stylesheet\dark\commonの色置換を行った。 なぜか読み取り専用属性がついていたので、外してから実行。

Set-ItemProperty .\qresource\res\stylesheet.rcc\stylesheet\dark\common -Name IsReadOnly -Value $false
sed -i -e 's/#0C0C0D/#073642/g' -e 's/#1a1a1a/#002B36/g' .\qresource\res\stylesheet.rcc\stylesheet\dark\common

リソースの再パック

.\qresource\rcc\rcc-make.batを実行してstylesheet.rccを生成。rcc.exeにパスが通っていることが前提のようなので、rcc.exeを同じ場所にコピーして実行した。

cd .\qresource\rcc\
cp ..\..\rcc.exe .
.\rcc-make.bat

stylesheet.rccの差し替え

書き換え済みのstylesheet.rccで上書き。UACの権限昇格が必要。

sudo cp .\stylesheet.rcc 'C:\Program Files (x86)\SBI SECURITIES\HYPERSBI2\stylesheet.rcc'

コマンドが見つからない?

sed,sudoscoopでインストールできるよ。PowerShellを使おう。

参照

2023-05-28

diffusers の使い方を調べてGoogle Colab ノートブックファイルを作った

概要: この記事では、Google Colabのフリー版におけるAUTOMATIC1111版WebUIの制限について取り上げ、その代替手段としてHugging Faceのdiffusersを使用する方法について調査します。

最近、Google Colabのフリー版での利用制限が行われ、AUTOMATIC1111版WebUIの使用が禁止されました。さらに悪いことに、この制限はRemoteUI全体に広がっているようです。
この制限によって、以前は簡単にアクセスできていたWebユーザーインターフェース(WebUI)を使用することができなくなりました。AUTOMATIC1111版WebUIは、使いやすく便利なユーザーインターフェースでしたが、これからは別の方法を探さなければなりませんでした。

代替の手段を模索する必要がありました。
その結果、UIを持たないHugging Faceのdiffusersを利用することに決めました。diffusersは、モデルの推論や処理を行うためのPythonライブラリであり、UIを必要としないため、制限を受けずに利用することができます。これは私たちのニーズに合致していると考え、積極的に取り入れることにしました。

diffusersの使い方について詳しく調査しました。Hugging Faceの公式ドキュメンテーションやコミュニティのフォーラムなど、さまざまな情報源を活用しました。

2023-05-23

オレオレ証明書に SAN (Subject Alternative Name) を追加。

TL;DR: /usr/share/ssl-cert/ssleay.cnf を編集して、make-ssl-cert -f generate-default-snakeoil するべし。

$ sudo cp /usr/share/ssl-cert/ssleay.cnf /usr/share/ssl-cert/ssleay.cnf.org
$ sudo jed /usr/share/ssl-cert/ssleay.cnf

...
[ v3_req ]
basicConstraints        = CA:FALSE
subjectAltName          = @SubjectAltName@, DNS:@HostName@.local, IP:192.168.1.5, IP:192.168.1.6

証明書の作成とwebサーバーの再起動。

$ sudo make-ssl-cert -f generate-default-snakeoil
$ sudo systemctl restart nginx

以上。

以下、結論にたどり着くまでの試行錯誤の記録。

2023-05-12

今はプログラマーにBardは必要ないかも

GoogleのChatGPT対抗AIBardが日本語対応とのことなので、プログラム生成を試してみた。 仕様書は、前回ChatGPTに生成させたドキュメントを使用する。

プログラムの実装

N.Y.

次のようなpythonプログラムを実装してください。

【タイトル】
マルチディスプレイ用の画像分割プログラム

【概要】
本プログラムは、1枚の画像をマルチディスプレイで使用するために複数の画像に分割するためのプログラムです。 分割数やディスプレイの縦横比を指定することができます。

【前提条件】

  • Python 3.6以上がインストールされていること。
  • 必要な外部ライブラリ(pillow)がインストールされていること。

【機能】

  • 画像の分割: 入力画像を指定された分割数に応じて複数の画像に分割します。
  • 出力: 分割された画像は指定された出力ディレクトリに保存されます。
  • ディスプレイの縦横比指定: マルチディスプレイの縦横比を指定することができます。デフォルト値は16:9です。

【入力】

  • input: 入力ファイルのglobパターンを指定します。1つまたは複数のファイルを指定することができます。
  • output: 分割された画像が保存されるディレクトリを指定します。デフォルト値は"output"です。
  • split: 入力画像を分割する数を指定します。デフォルト値は2です。
  • aspect: マルチディスプレイの縦横比を指定します。指定しない場合、デフォルト値は16:9です。

【出力】

  • 分割された画像が指定された出力ディレクトリに保存されます。

【エラー処理】

  • ファイルが存在しない場合、エラーが発生します。
  • ファイルが画像ファイルでない場合、エラーが発生します。
  • ファイルが開けない場合、エラーが発生します。
  • ディレクトリが存在しない場合、自動的に作成されます。

【ログ出力】

  • ログは標準出力に出力されます。ログレベルはINFOです。

【実行例】 次のように実行することができます。

$ python image_spliter.py input/*.jpg -o output -s 3 -a 4:3

【参考】

ChatGPT

マルチディスプレイ用の画像分割プログラムのPythonプログラムは次のとおりです。

import argparse
import os
from PIL import Image


def main():
    parser = argparse.ArgumentParser(description="Image splitter for multi-displays")
    parser.add_argument("input", type=str, help="Input image glob pattern")
    parser.add_argument("-o", "--output", type=str, default="output", help="Output directory")
    parser.add_argument("-s", "--split", type=int, default=2, help="Number of splits")
    parser.add_argument("-a", "--aspect", type=str, default="16:9", help="Display aspect ratio")
    args = parser.parse_args()

    if not os.path.exists(args.output):
        os.makedirs(args.output)

    for image_file in glob.glob(args.input):
        image = Image.open(image_file)
        width, height = image.size
        aspect_ratio = width / height

        if aspect_ratio != float(args.aspect):
            print("Warning: Image aspect ratio ({}) does not match display aspect ratio ({})".format(aspect_ratio, args.aspect))

        split_width = width // args.split
        split_height = height // args.split

        for i in range(args.split):
            for j in range(args.split):
                box = (i * split_width, j * split_height, (i + 1) * split_width, (j + 1) * split_height)
                image.crop(box).save(os.path.join(args.output, "{}-{}.png".format(i, j)))


if __name__ == "__main__":
    main()
コードは慎重に使用してください。詳細

このプログラムは、globを使用して入力画像を取得し、Pillowを使用して画像を分割します。分割された画像は指定された出力ディレクトリに保存されます。

2023-04-12

プログラマーには ChatGPT が必要だ

ChatGPT捗る。
これだけできると、非公開のプログラムコードも喰わせたくなる。
禁止されるのもわからないでもないな。

コードレビューの依頼

N.Y.

コードレビューをお願い

ChatGPT

もちろんです!コードを共有していただければ、レビューさせていただきます。

N.Y.
"""
マルチディスプレイ用の画像分割

python image_spliter.py -h

[requirements]
pillow
"""

import os
import glob
import argparse
import re
import logging
from PIL import Image, ImageFilter

logger = logging.getLogger(__name__)
logging.basicConfig(level=logging.INFO)


def split_image(name:str, output:str, split:int, aspect:str):
    img = Image.open(name)
    ax, ay = map(lambda x: int(x), aspect.split(':'))
    aspect_ratio  = ay / ax

    out_w = int(img.width / split)
    out_h = int(out_w * aspect_ratio)
    if out_h > img.height:
        out_w = int(out_h * aspect_ratio)
    
    x = int(img.width / 2 - out_w * split / 2)
    y = int(img.height / 2 - out_h / 2)
    folder, file_name = os.path.split(name)
    base_name, ext = os.path.splitext(file_name)

    logger.info(f'processing... {name}, {img.width}x{img.height} -> {out_w}x{out_h}')

    for n in range(split):
        p = os.path.join(output, f'{base_name}_{n}{ext}')
        cropped = img.crop((x, y, x + out_w, y + out_h))
        cropped.save(p, quality=95)
        logger.info(f'cropped: {p}')
        x += out_w


def aspect_type(value:str) -> str:
    if not re.match(r'^\d+:\d+$', value):
        raise argparse.ArgumentError('invalid value')
    return value


if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='マルチディスプレイ用の画像分割')
    parser.add_argument('input', help='入力ファイル globパターン')
    parser.add_argument('-o', '--output', default='output', help='出力ディレクトリ')
    parser.add_argument('-s', '--split', type=int, default=2, help='分割数')
    parser.add_argument('-a', '--aspect', default='16:9', help='ディスプレイの縦横比', type=aspect_type)
    args = parser.parse_args()

    os.makedirs(args.output, exist_ok=True)
    for s in glob.glob(args.input):
        split_image(s, args.output, args.split, args.aspect)

    logger.info('done')

ChatGPT

このコードは、指定された入力画像を複数の画像に分割し、それらを出力する Python スクリプトのようです。以下は、いくつかのコメントです。

  • コード全体の構造は良く整理されており、コードが読みやすくなっています。
  • それぞれの機能は、独自の関数に分割されており、単一の機能にフォーカスされています。
  • パラメータの解析には、Python の標準ライブラリである argparse が使用されています。
  • コマンドラインオプションのヘルプは、"-h" オプションで表示されます。
  • エラーの検査には、正規表現が使用されています。

最後に、いくつかの改善の提案です。

2023-04-11

「卵高騰 卵かけご飯に 涙こぼす」 by ちゃっとじぷと

Q:卵が値上がりしていることを、川柳で。
A:卵高騰 卵かけご飯に 涙こぼす
Q:その心は?
A:普段当たり前に食べていた卵が高騰し、手が届かなくなってしまったという悲しみや無念さを表現しています。食糧価格の高騰は、日々の暮らしに大きな影響を与えるため、胸が痛くなる思いがします。
Q:手が届かなくなってしまったなら、白ごはんのほうが良いのでは?
A:確かに、卵かけご飯が手が届かなくなってしまった場合は、白ごはんだけでもお腹を満たすことができますね。身近な食材であっても、ありがたさを感じることが大切です。また、栄養バランスを考えて、他の食材で補うことも大切です。
Q:川柳つくりなおして。
A:卵が手が届かなくなってしまったとき、身近な白ごはんに目を向け、感謝の気持ちを持つことが大切だという心情を表現しています。日常の中で当たり前に食べているものでも、高騰したり手に入らなくなると不便や悲しさを感じますが、そんなときこそ自分がもっているものに感謝し、謙虚な気持ちを持つことが大切だということを表しています。
Q:ありがとう。もう寝ます。
A:おやすみなさい。良い夢を見てくださいね。

ChatGPT、おっさんの話相手に最高やな。老害が捗るわ。
なんか、かわいそう。

(ChatGPT Mar 23 Version)

2022-10-06

ユニクロの月次売上を整形 9月度月次データ

ユニクロの国内月次売上推移が使いにくいので整形してみた。
正直、前年比じゃなく数値も公表して欲しいんだが、なにか問題があるんだろうか。

海外事業の分は公表されていないので、中国事業の月次を公表しているバロックジャパンを参照して雰囲気を感じてみる...。

コメントは控える。
今回作ったファイルはユニクロ月次売上.xlsxでダウンロード。

もう少しIRにも力を入れて欲しいなぁ...。

参照データ

作成ファイル

2022-09-18

Python SSL: UNSAFE_LEGACY_RENEGOTIATION_DISABLED エラーの回避策

URLError: <urlopen error [SSL:
UNSAFE_LEGACY_RENEGOTIATION_DISABLED] unsafe legacy renegotiation
disabled (_ssl.c:1131)>

上記は、セキュリティリスクのあるhttpsアドレスを開いたときに発生するエラーとなる。
SSLプロトコルの不具合で、中間者攻撃に使用される脆弱性のためopenssl側で無効化されている。OpenSSL 3.0.0からデフォルトで無効化された。

本来はサーバー側をアップデートするのが筋だが、なかなかそういうわけにもいかないことも多い。リスクを承知で、クライアント側の無効状態を解除する方法をメモ。

環境は以下の通り。

$ python -c 'import ssl; print(ssl.OPENSSL_VERSION)'
OpenSSL 3.0.2 15 Mar 2022

$ python --version
Python 3.8.10

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 22.04.1 LTS
Release:        22.04
Codename:       jammy

回避策A: opensslの設定変更

opensslの設定を変更する方法。 /etc/ssl/openssl.confを編集して、system_default_sectセクションにOptions = UnsafeLegacyRenegotiation設定を追加する。

# /etc/ssl/openssl.conf

...
[ssl_sect]
system_default = system_default_sect

[system_default_sect]
CipherString = DEFAULT:@SECLEVEL=2
Options = UnsafeLegacyRenegotiation

ただし、/etc/ssl/openssl.confを直接編集すると、システム全体に適用されてしまうので流石にそれはまずい。
実際は別の設定ファイルを用意して、環境変数でpythonプログラムへ渡してやると良い。

$ cp /etc/ssl/openssl.conf openssl_unsecure.conf
$ echo -e "Options = UnsafeLegacyRenegotiation\n" >> openssl_unsecure.conf
$ OPENSSL_CONF=/path/to/openssl_unsecure.conf python cherry.py

回避策B: プログラム改修

sslのオプションに0x4フラグを追加してやると回避できる。
開発版ではssl.OP_LEGACY_SERVER_CONNECT定数が追加されているが、現行バージョン3.10でも使用できないので直接、値を指定する。

import urllib.request
import ssl

ctx = ssl.create_default_context()
ctx.options |= 0x4  # ssl.OP_LEGACY_SERVER_CONNECT
resposne = urllib.request.urlopen('https://...', context=ctx)
...

build_openerを使う場合は、HTTPSHandlerを作成してやる。

opener = urllib.request.build_opener(urllib.request.HTTPSHandler(context=ctx))
...

開発版でのOP_LEGACY_SERVER_CONNECTについての記載。

.. data:: OP_LEGACY_SERVER_CONNECT

   Allow legacy insecure renegotiation between OpenSSL and unpatched servers
   only.

   This option is only available with OpenSSL 0.9.8m and later, and is disabled
   in default context since OpenSSL 3.0.0.

   .. versionadded:: 3.11

以上。
古いpython2向けのスクリプトをpython3向けへ移植している時に発生した。

参照

2022-09-10

Windows PowerShell で Emacs (bash-like) キーバインドを有効にする

PowerShellでもEmacsキーバインドが使えるらしい。 すぐにSSHしてしまうので利用頻度が低いとは言え、微妙にストレスを感じていたのでありがたい。

EmacsキーバインドはPSReadLineモジュールの機能として提供されているようだ。 以下、Windows11 21H2 + PowerShell 7.2.6 での設定方法を記録しておく。

2022-08-03

flutter_web を netlify + github で CI/DI

flutter webで作成したお試しアプリをnetlifyで動かしてみたので、CI/DI (Continuous integration/Continuous Delivery) 設定手順をメモ。
注意すべきは、初期状態でflutterコマンドが使えないのでビルドでひと手間加える必要があること、GitHubのアクセス設定が見つけにくいこと、以上の2点。

設定手順

レポジトリの準備

レポジトリを作成し、netlify.tomlbuild.shを追加してpushしておく。netlify側のデプロイ設定をnetlify.tomlに記載する。

https://docs.netlify.com/configure-builds/file-based-configuration/
# netlify.toml

[build]
command = "chmod 777 ./build.sh && ./build.sh"
publish = "build/web"

netlify.tomlでは、自前のシェルスクリプトを呼び出すよう指示。

# build.sh

FLUTTER=`which flutter`
if [ -z $FLUTTER ]; then
  if cd flutter 2>/dev/null; then
    git pull
    cd ..
  else
    git clone https://github.com/flutter/flutter.git -b stable --depth=1
  fi
  FLUTTER="flutter/bin/flutter"
fi

$FLUTTER config --enable-web
$FLUTTER pub get
$FLUTTER gen-l10n
$FLUTTER pub run flutter_native_splash:create
$FLUTTER pub run grinder download-data
$FLUTTER build web --release

flutterコマンドをインストールしてflutter buildを行う。
言語リソースの作成や、スプラッシュ画面の作成、gridnerタスク等も追加で実行。

接続とアクセス許可

Site SettingsBuild & DeployLink repository
GitHubを選んで認証を行う。

一覧から対象のレポジトリを選ぶ。レポジトリが表示されていない場合はGitHub側でアクセス設定が必要。
[Configure the Netlify app on Github]リンクからGitHubの設定ページへ。(GitHub内ではSettings > Integrations: Applications > Installed Github Apps > Netlify: Configureとたどる)

Repository accessへリポジトリを追加してやる。

CI設定

netlify.tomlの内容で自動構成されるので、そのままデプロイできる。

以上で、設定完了。
レポジトリへPUSHするたびに自動でデプロイされる。

その他

デプロイのスキップ

デプロイをスキップしたい更新は、最終コミットのメッセージに[skip ci][skip netlify]と書いておくとスキップできるようだ。

https://docs.netlify.com/site-deploys/manage-deploys/#skip-a-deploy

ビルド作成API

また、任意のタイミングでデプロイさせたい場合は、APIが簡便に使える。sites/{SITE_ID}/buildsエンドポイントへPOSTするだけで良い。
SITE_ID、TOKEN共にnetlifyで作成・確認できる。

curl -XPOST -H "Authorization: Bearer {TOKEN}" https://api.netlify.com/api/v1/sites/{SITE_ID}/builds

使用したアプリ

コロナ感染症データを読み込むようにしたflutterサンプルコードの改修品を使用した。 実用性はほぼないが、過去に大騒ぎしていた頃のさざ波感は味わえる。

2022-06-15

東証株価指数ヒートマップ表示 デスクトップアプリ v1.2.0

東証株価指数ヒートマップ v1.2.0 リリースです。

新バージョンでは、東証の指数変更の反映と若干の外観調整を行いました。
東証の市場再編に伴う仕様変更で、長らく正常に動作しない状態が続いておりましたが、当バージョンにてフィックスです。 ご利用の方は最新バージョンへの更新をお願いします。

ダウンロードはこちらからどうぞ。 (最新版はv1.2.0になります)

2022-04-21

TPM1.2のThinkpad t440pへWindows11をインストール

非推奨ながらもTPM2.0のチェックを回避してインストールする方法が公式で紹介されていたので、Windows11をインストールしてみた。

レジストリ編集

レジストリでフラグを建てておくとTPMとCPUチェックをバイパスできるようになる。
HKLM\SYSTEM\Setup\MoSetup\AllowUpgradesWithUnsupportedTPMOrCPU1をセットする。

sudo New-ItemProperty -LiteralPath 'HKLM:SYSTEM\Setup\MoSetup' -Name 'AllowUpgradesWithUnsupportedTPMOrCPU' -PropertyType 'DWord' -value 1

インストールメディアの作成

Windows11をMicrosoftのサイトよりダウンロードする。
今回は、「Windows 11 のインストール メディアを作成する」の手順に従ってUSBインストールメディアを作成した。

インストール開始

メディアの作成に完了したら、インストールメディア内のsetup.exeを実行してインストールプロセスを開始する。

警告が表示される以外は通常のインストールプロセスと変わるところはない。
特にトラブルに遭遇することなくインストールが完了した。

参照:Ways to install Windows 11

その後の経過は...

インストールしてから数か月たっているが、特に問題に遭遇していない。現時点で(OSビルド22000.613)まで更新されているので、Windows Updateでの更新も滞りなく提供されているようだ。
個人的な予想では、Windows10のサポートが終了する2025年10月14日あたりまではいけるんじゃないかと思っている。