ArchLinuxによる基本のdwmデスクトップ

概要

ArchLinuxでデスクトップ環境を作成する時、見落としやすい手順をまとめた。 基本となる手順はインストールガイド - ArchWikiを参照。

なおwikiの手順は一見複雑に見えるかもしれないが、以下のような大きな流れがある事を理解してから読めば大体分かるはず。

  1. ディスクを初期化&フォーマットする
  2. 上記をマウントして、pacstrap(pacman)でパッケージファイルを投入
  3. 設定ファイルを書いてデスクトップ環境が自動起動されるようにする


上にある"pacstrap"コマンドは、指定したディレクトリ以下をルートとみなして書き込むpacmanのようなもの。言い換えれば、「インストーラ環境上でpacstrap」と「インストール後のデスクトップでpacman -S」はほぼ同じである。
そのため、デスクトップは起動したが足りないパッケージ等があったら後でpacmanすればいいし、 逆にインストール後pacmanが動かない等で困ったらインストーラ環境に戻ってきてもいい。


1. ファイルシステム作成

UEFIで作成したいので、gdiskを使用する。

No バイス サイズ タイプ マウント先
1 /dev/nvme0n1p1 512MB EFI System
(gdisk=EF00)
/efi
2 /dev/nvme0n1p2 (残り) Linux filesystem
(gdisk=8300)
/

2. パッケージ追加&有効化

No.1~4あたりはpacstrapで入れる。AURはNo.4以降から使用可能。

No グループ 1. pacman 2. AUR 3. 有効化コマンド
1 必須 base
base-devel
linux
linux-firmware
2 ブート設定 amd-ucode bootctl install
3 ネットワーク systemctl enable systemd-networkd
systemctl enable systemd-resolved
4 ツール gvim
less
git
xfsprogs
dosfstools
zsh
zsh-completions
5 GUI xorg-xserver
xorg-xrandr
xorg-xsetroot
lightdm
lightdm-gtk-greeter
libxft
libxinerama
mate-terminal
dwm-git
dmenu
systemctl enable lightdm
6 オーディオ alsa-utils
pulseaudio
pavucontrol
7 日本語 fcitx5-im
fcitx5-skk
noto-fonts-cjk
noto-fonts-emoji
noto-fonts-extra

3. 設定作成

1.インストーラ環境上で実行するもの

No 概要 作業内容
1 ブートローダ設定 以下のファイルを作成。
/efi/loader/entries/arch.conf
> title Arch Linux
> linux /vmlinuz-linux
> initrd /initramfs-linux.img
> initrd /amd-ucode.img
> options root="LABEL=ARCH_OS" rw

※optionsはルートファイルシステムの指定のため、UUIDなどでも良い。
2 ログイン用ユーザ作成 以下のコマンドを実行。
useradd -m -G wheel -s /usr/bin/zsh (ユーザ名)
passwd (ユーザ名)
3 sudoers設定 visudoを使用、以下の行からコメントアウト(先頭#)を削除。
#%wheel ALL=(ALL:ALL) ALL
4 ネットワーク設定 以下のファイルを作成。
/etc/systemd/network/20-wired.network
> [Match]
> Name=enp1s0
>
> [Network]
> DHCP=yes
5 日本語入力 ログインユーザのホーム直下に以下ファイルを作成。
~/.xprofile
> #!/bin/sh
> export LANG=ja_JP.UTF-8
> export EDITOR=vim
>
> # インプットメソッド起動
> export GTK_IM_MODULE=fcitx
> export QT_IM_MODULE=fcitx
> export XMODIFIERS=@im=fcitx
> /bin/fcitx5 &

2.インストール後、デスクトップ環境で実行するもの

No 概要 作業内容
1 インプットメソッドの有効化 fcitx5-configtoolを起動
→「有効な入力メソッド」からskkをダブルクリック
→「現在の入力メソッド」に設定されたことを確認
→「OK」で画面を閉じる
2 NTP設定 以下のコマンドを実行。
timedatectl set-ntp true


参考サイト

ライブラリを使用せずCSV読込する汎用ロジック

概要

タイトルそのまま。

単純な制御構文と文字列操作のみで実装することで、 採用ライブラリを制限された環境下でなるべく短く最低限実用性のあるCSVパーサを実装するための実験。

あるいは、VBAのようにそもそも一般的なライブラリのない言語でも使えるロジックを作成する。
(参考実装に使用したのはJava

主に使用条件を限定することでコード量を削減している。

使用条件

  • 区切り文字は半角カンマ、囲み文字は半角ダブルクオート
    (囲み文字は無くてもよい)
  • 半角ダブルクオートで囲まれたカラムには半角カンマおよび改行を含むことができる
    (半角ダブルクオートをカラム内に含める場合、後述の変更が必要)
  • カラム内に含まれた改行の改行コード種類は無視され、出力では常にLFのみになる
  • 区切り文字と囲み文字の間に文字があった場合、データ内に含める

コード

import java.io.BufferedReader;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;

public class CsvCutter {

    /**
     * テスト実行
     */
    public static void main(String[] args) {

        try {
            // 文字コード取得
            Charset cs = (args.length == 1) ? StandardCharsets.UTF_8
                    : Charset.forName(args[1]);

            // 入力表示
            System.out.println("■入力");
            System.out.println("-----------------------------------");
            Files.readAllLines(Paths.get(args[0]), cs)
                    .forEach(System.out::println);
            System.out.println("-----------------------------------\n");

            // 分解実行
            System.out.println("■出力");
            try (BufferedReader br = Files.newBufferedReader(Paths.get(args[0]), cs)) {
                List<String> lnCsv;
                int row = 1;

                // レコード取得
                while ((lnCsv =readCsvLine(br)) != null) {
                    // 結果出力
                    for (int col = 0; col < lnCsv.size(); col++) {
                        System.out.println(row + "行" + (col + 1) + "列 = \""
                                + lnCsv.get(col) + "\"");
                    }
                    row++;
                }
            }
        } catch (Exception e) {
            // エラー
            e.printStackTrace();
        }
    }

    /**
     * CSVファイルから1レコードを取得
     */
    public static List<String> readCsvLine(BufferedReader reader)
        throws IOException {

        List<String> lnCsv = new ArrayList<>();
        StringBuilder buf = new StringBuilder();
        String line;
        boolean inQuote = false;

        // 行ループ
        while ((line = reader.readLine()) != null) {
            // 行内処理
            for (int i = 0; i < line.length(); i++) {
                char c = line.charAt(i);
                if (c == '"') {
                    inQuote = !inQuote;
                } else if (c == ',' && !inQuote) {
                    lnCsv.add(buf.toString());
                    buf = new StringBuilder();
                } else {
                    buf.append(c);
                }
            }

            // 行末判定
            if (inQuote) {
                // 次行へレコード継続
                buf.append("\n");
            } else {
                // 行終了
                lnCsv.add(buf.toString());
                buf = new StringBuilder();
                break;
            }
        }
        if (0 < buf.length()) {
            // イレギュラー:クオート内のままファイル終了
            lnCsv.add(buf.toString());
        }

        return !lnCsv.isEmpty() ? lnCsv : null;
    }

}

実行例

■入力
-----------------------------------
"Name","Age","City"
"John Doe","25","New York"
"Mary Lee","45","Houston, TX"
"Tom Brown","35","San
Francisco"
"Jane Smith", "30",+"Los Angeles"*
-----------------------------------

■出力
1行1列 = "Name"
1行2列 = "Age"
1行3列 = "City"
2行1列 = "John Doe"
2行2列 = "25"
2行3列 = "New York"
3行1列 = "Mary Lee"
3行2列 = "45"
3行3列 = "Houston, TX"
4行1列 = "Tom Brown"
4行2列 = "35"
4行3列 = "San
Francisco"
5行1列 = "Jane Smith"
5行2列 = " 30"
5行3列 = "+Los Angeles*"

補足

  • カラム内にダブルクオートを含めたい場合
    CSVではダブルクオートは二個連続することでエスケープするため、 クオート判定後の処理に先読みを追加する必要がある。
    (対応前の状態では単純に二字無視される)
if (c == '"') {
    inQuote = !inQuote;
} else //〜後略if (c == '"') {
    if (inQuote && i + 1 < line.length() && line.charAt(i + 1) == '"') {
        buf.append(c);
        i++;
    } else {
        inQuote = !inQuote;
    }
} else //〜後略

Excelファイルを一括検索するVBAマクロ

概要

Excel-VBAを使って、Excelファイルを一括検索するソフトを作成しました。

本当はもっとちゃんとしたツールが沢山存在しており、 そちらを利用した方が速度的にも精度的にも有利です。
しかし、会社のルールでソフトが自由にインストールできないなどの理由から、 そういったツールの使えない環境でも似たような検索ができるように作成しました。

  • コピーで作成しやすいよう、1シート&1モジュールで完結させています
  • 検索キーワードは部分一致、かつワイルドカードVBA Like形式)に対応しています
  • 余計なファイルは検索から除外することで高速に処理できるよう、 「ファイル名フィルタ」および「除外フォルダ名」を搭載しています
  • 図形に含まれたテキストも検索対象とします。
    その時、図形の左上端がセル位置として表示されます。
  • パスワードがかかっている等の理由で開けないファイルがあった場合、
    検索結果の代わりにエラーメッセージが出力されます。

なお、勘のいい方ならお気付きでしょうが基本的に自分用です。
二次利用は自由ですが自己責任でお願い致します。


Step1. スクリプト

VBAエディタで「標準スクリプト」を追加して、 以下の内容を貼り付け。

'================================
' Excel-Grep検索
'================================

Const SHEET_OUTPUT = "search"
Const CELL_PRINT_COL = 1
Const CELL_PRINT_ROW = 9
Const CELL_ROOT_DIR = "B3"
Const CELL_SEARCH_WORD = "B4"
Const CELL_FILE_FILTER = "B5"
Const CELL_EXCLUDE_DIR = "B6"

' 現在の出力行
Dim nowRow As Long
' 最初の検索フォルダ
Dim rootDir As String
' 検索用Excel
Dim xlApp As Excel.Application

' メイン処理
Sub searchMacro()
    Dim outputSht As Worksheet
    Dim excludeDir As Dictionary
    Dim rootDir As String
    Dim searchWord As String
    Dim fileFilter As String
    Dim s As String

    Set outputSht = ThisWorkbook.Sheets(SHEET_OUTPUT)
    Set excludeDir = New Dictionary
    nowRow = CELL_PRINT_ROW

    ' 入力取得
    With ouputSht
        rootDir = .Range(CELL_ROOT_DIR)
        searchWord = .Range(CELL_SEARCH_WORD)
        fileFilter = .Range(CELL_FILE_FILTER)
        For Each s In Split(.Range(CELL_EXCLUDE_DIR), ";")
            excludeDir.Add s, Empty
        Next
    End With

    ' 入力チェック
    If "" Like searchWord Then
        MsgBox "検索ワードを入力してください"
        Exit Sub
    End If

    ' 結果シート初期化
    With outputSht
        .Cells(CELL_PRINT_ROW, CELL_PRINT_COL).Select
        .Range(.Cells(CELL_PRINT_ROW, CELL_PRINT_COL), .Cells.SpecialCells(xlCellTypeLastCell)).ClearContents
        .Range("C:C,F:F").NumberFormatLocal = "@"
    End With

    ' 検索用Excel起動
    Set xlApp = New Excel.Application
    On Error Goto GrepErr

    ' フォルダ内を検索
    Call searchDir(rootDir, searchWord, fileFilter, excludeDir)

    ' 検索用Excel終了
    xlApp.Quit
    Set xlApp = Nothing
    On Error Goto 0

    If 0 < nowRow - CELL_PRINT_ROW Then
        MsgBox "検索結果:キーワード「" & searchWord & "」に、" & Format(nowRow - CELL_PRINT_ROW, "#,##0") & "件の一致がありました。"
    Else
        MsgBox "検索結果:キーワード「" & searchWord & "」への一致はありませんでした。"
    End If
    Application.StatusBar = ""
    Exit Sub

GrepErr:
    Application.StatusBar = ""
    xlApp.Quit
    Set xlApp = Nothing
    MsgBox "<エラー発生>" & vbCrLf & _
        "Number=" & Err.Number & vbCrLf & _
        "Source=" & Err.Source & vbCrLf & _
        "Description=" & Err.Description
End Sub

' フォルダ内検索
Sub searchDir(ByVal searchPath As String, ByVal searchWord As String, ByVal fileFilter As String, ByVal excludeDir As Dictionary)
    Dim curDir As Folder, subDir As Folder, f As File

    Application.StatusBar = "検索中フォルダ:" & searchPath
    DoEvents

    ' フォルダを開く
    With New FileSystemObject
        Set curDir = .GetFolder(searchPath)
    End With

    '------ ファイルを検索 ------
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual

    For Each f In curDir.Files
        If f.Name Like fileFilter Then
            Call grepExcel(searchPath, f.Name, searchWord)
        End If
    Next

    Application.Calculation = xlCalculationAutomatic
    Application.ScreenUpdating = True

    '------ サブフォルダを検索 ------
    For Each subDir In curDir.SubFolders
        If Not excludeDir.Exists(subDir.Name) Then
            Call searchDir(subDir.Path, searchWord, fileFilter, excludeDir)
        End If
    Next
End Sub

' Excelファイル内を検索
Sub grepExcel(ByVal searchPath As String, ByVal searchFile As String, ByVal searchWord As String)
    Dim wb As Workbook
    Dim sht As Worksheet

    ' ファイルを開く
    On Error Resume Next
    Set wb = xlApp.Workbooks.Open(Filename:=searchPath & "\" & searchFile, UpdateLinks:=0, ReadOnly:=True, _
            IgnoreReadOnlyRecommended:=True, Password:="")
    If Err.Number <> 0 Then
        Call writeSheet(searchPath, searchFile, "-", "-", "ERROR: 開けないファイル")
        Exit Sub
    End If
    On Error Goto 0

    ' 各シートを検索
    For Each sht In wb.Worksheets
        Dim aryWhole As Variant
        Dim crow As Long, ccol As Long, ctext As String
        Dim shp As Shape

        '------ セル検索 ------
        With sht
            aryWhole = .Range("A1", .Cells.SpecialCells(xlCellTypeLastCell))
            If vbArray < VarType(aryWhole) Then
                For crow = LBound(aryWhole) To UBound(aryWhole)
                    For ccol = LBound(aryWhole, 2) To UBound(aryWhole, 2)
                        ctext = aryWhole(crow, ccol)
                        If ctext Like "*" & searchWord & "*" Then
                            ' 見つかった内容を書き込み
                            Call writeSheet(searchPath, searchFile, sht.Name, .Cells(crow, ccol).Address(False, False), ctext)
                        End If
                    Next
                Next
            End If
        End With

        '------ 図形検索 ------
        For Each shp In sht.Shapes
            With shp
                ' 図形内テキストを検索 (テキストのない図形は無視)
                ctext = ""
                On Error Resume Next
                ctext = .TextFrame.Characters.Text
                On Error Goto 0

                If ctext Like "*" & searchWord & "*" Then
                    ' 見つかった内容を書き込み
                    Call writeSheet(searchPath, searchFile, sht.Name, .TopLeftCell.Address(False, False) & " *", ctext)
                End If
            End With
        Next
    Next

    ' ファイルを閉じる
    wb.Close saveChanges:=False
End Sub

' 検索結果を書き込む
Sub writeSheet(ByVal searchPath As String, ByVal searchFile As String, ByVal resultSheet As String, ByVal resultAddr As String, ByVal resultText As String)
    ThisWorkbook.Sheets(SHEET_OUTPUT).Cells(nowRow, CELL_PRINT_COL).Resize(, 6) = Array( _
          Replace(searchPath, rootDir, "") _
        , searchFile _
        , resultSheet _
        , resultAddr _
        , Replace("=HYPERLINK(""["" & $B$3 & $A# & ""\"" & $B# & ""]"" & $C# & ""!"" & $D#, ""LINK"")", "#", nowRow) _
        , resultText _
    )
    nowRow = nowRow + 1
End Sub

Step2. 操作シート

ファイル内に「search」シートを作成して、以下のテーブルをA1セルへ貼り付ける。
その後、フォーム部品からボタンを配置、スクリプトの「searchMacro()」を割り当てる。

Excel-Grep検索
検索フォルダ
検索ワード(部分一致、ワイルドカード可)
ファイルフィルタ(ワイルドカード可)
除外フォルダ(";"区切り、完全一致)
フォルダ名ファイル名シート名セル番号LINKセル内容

【参考】自由にインストールが可能な場合に使いたいツール

  1. TresGrep

    • http://hp.vector.co.jp/authors/VA055804/TresGrep/
    • 普段使用しているソフト。
      検索が高速なことはもちろん、多様なファイル形式に対応していることから探し漏れが生じづらく信頼性が高い。
      また、ソフト自体の起動終了が早いため、ちょっとした時にも使いやすい。
  2. RelaxTools Addin

以上

ソーシャルログイン 管理画面リンク集

はじめに

私はパスワード管理アプリとしてFirefoxのパスワード管理機能を使っていて、 各サービスのアカウント情報は基本的にそこに集まっています。

しかし、Webサービスの中にはパスワードを使わずにアカウント連携でログインしているものもあり、 それらは把握できていませんでした。 これらは「ソーシャルログイン」と呼ばれており、二段階認証など強固なセキュリティが一般的になるとともに近年対応サービスを増やしています。

今回、そういった連携サービスもきちんと把握していけるよう、 ソーシャルログイン機能を持つサービスとその管理画面をリンク集としてまとめることにしました。

提供者一覧

  1. Twitter

    表示手順
    もっと見る > 設定とプライバシー > セキュリティとアカウントアクセス > アプリとセッション > 連携しているアプリ
    リンク
    https://twitter.com/settings/connected_apps

  2. Google

    表示手順
    右上アイコン > Googleアカウントを管理 > セキュリティ > アカウントにアクセスできるサードパーティ アプリ
    リンク
    https://myaccount.google.com/permissions

  3. Amazon

    表示手順
    右上の「アカウント&リスト」 > アカウントサービス > その他のアカウント > Amazonログインの設定
    リンク
    https://www.amazon.co.jp/ap/adam

  4. LINE

    表示手順
    ※PCからはアクセスできず、スマホアプリから管理画面を出さなければならない。
    右上歯車アイコン > アカウント > 連動アプリ

  5. Yahoo!Japan

    表示手順
    ユーザー名右にある「登録情報」 > プライバシー・メール配信 > 外部企業へのデータ提供設定 (または 各アプリケーションでのデータ利用)
    リンク
    https://accounts.yahoo.co.jp/privacy/optout/vendors (外部企業へのデータ提供設定)
    https://accounts.yahoo.co.jp/privacy/optout/auth (各アプリケーションでのデータ利用)

  6. Facebook

    表示手順
    右上アイコン > 設定とプライバシー > 設定 > アプリとウェブサイト
    リンク
    https://www.facebook.com/settings?tab=applications&apps_only

確認結果

サービス名 管理状況
Firefox ユーザー名&パスワード:93件
Twitter 連携しているアプリ | 23件
Google サードパーティ アプリ:8→7件
Google でログイン:15件
Google のアプリ:2件
Amazon Amazonログイン:3件
LINE 連動アプリ:4件
Yahoo!Japan 外部企業へのデータ提供設定:2件
外部アプリケーションでのデータ利用:1件
Yahoo! JAPAN 公式アプリ:2件
Facebook アプリとウェブサイト:0件

おわりに

結局、今回消したのはアプリ削除済みだったGoogleサードパーティ認証1件のみでした。
今後も定期的に確認するよう心掛けたいと思います。

私は基本的にTwitter連携に集約していたつもりだったのですが、思ったよりもGoogle連携が沢山ありました。
ちなみに、世間一般的にはLINEが一番人気らしいです。 しかし、PCから管理できないのが面倒なので私がメインにすることは恐らく今後も無いでしょう…

なお、今回上げた以外にも、Mixiがソーシャルログインサービスを行なっているようです。
ただ私がそもそもMixiのアカウントを持っていないため確認できませんでした。

PT3のドライバ更新が失敗した (kernel 5.19.1-arch2-1)

TL;DR

  • ArchLinuxにてpacman -Syuした際に、DKMSによるドライバ更新が失敗した
  • 原因はカーネルバージョンアップに際し、レガシー関数pci_alloc_consistentにエラーが出るようになったため
  • 既に対応パッチが出てるので、リポジトリを取り直して再ビルドしましょう
    m-tsudo · GitHub

詳細

pacmanでこんな内容のエラーが出ました。

:: パッケージを取得します...
 linux-5.19.1.arch2-1-x86_64                                                                                   178.4 MiB  4.32 MiB/s 00:41 [#####################################################################################] 100%


(10/16) Updating module dependencies...
depmod: ERROR: failed to load symbols from /lib/modules/5.19.1-arch2-1/kernel/sound/soc/intel/avs/snd-soc-avs.ko.zst: Invalid argument
(11/16) Install DKMS modules
==> dkms install --no-depmod pt3_drv/0.0.1 -k 5.19.1-arch2-1
Error! Bad return status for module build on kernel: 5.19.1-arch2-1 (x86_64)
Consult /var/lib/dkms/pt3_drv/0.0.1/build/make.log for more information.
==> WARNING: `dkms install --no-depmod pt3_drv/0.0.1 -k 5.19.1-arch2-1' exited 10

ログファイルの内容はこんな感じ。

最後の方にある「いくつかの警告はエラーとして取り扱われます」 という一文がなんとなく怪しいですね。

$ cat /var/lib/dkms/pt3_drv/0.0.1/build/make.log
DKMS make.log for pt3_drv-0.0.1 for kernel 5.19.1-arch2-1 (x86_64)
2022年  8月 16日 火曜日 22:08:37 JST
eval `sed -e "s/\[0\]//" ./dkms.conf`; \
GREV=`git rev-list HEAD | wc -l 2> /dev/null`; \
if [ $GREV != 0 ] ; then \
    printf "#define DRV_VERSION \"${PACKAGE_VERSION}rev$GREV\"\n#define DRV_RELDATE \"`git show --date=short --format=%ad | sed -n '1p' 2> /dev/null`\"\n#define DRV_NAME \"${BUILT_MODULE_NAME}\"\n" > version.h; \
else \
    printf "#define DRV_VERSION \"${PACKAGE_VERSION}\"\n#define DRV_RELDATE \"$PACKAGE_RELDATE\"\n#define DRV_NAME \"${BUILT_MODULE_NAME}\"\n" > version.h; \
fi
fatal: detected dubious ownership in repository at '/var/lib/dkms/pt3_drv/0.0.1/build'
To add an exception for this directory, call:

    git config --global --add safe.directory /var/lib/dkms/pt3_drv/0.0.1/build
make -C /lib/modules/5.19.1-arch2-1/build M=`pwd` V=0 modules
make[1]: 警告: jobserver が利用不可: 今回は -j1 を使います. 親 make ルールに `+' を追加しましょう.
make[1]: ディレクトリ '/usr/lib/modules/5.19.1-arch2-1/build' に入ります
  CC [M]  /var/lib/dkms/pt3_drv/0.0.1/build/pt3_pci.o
/var/lib/dkms/pt3_drv/0.0.1/build/pt3_pci.c: 関数 ‘pt3_pci_init_one’ 内:
/var/lib/dkms/pt3_drv/0.0.1/build/pt3_pci.c:923:14: エラー: 関数 ‘pci_set_dma_mask’ の暗黙的な宣言です [-Werror=implicit-function-declaration]
  923 |         rc = pci_set_dma_mask(pdev, DMA_BIT_MASK(64));
      |              ^~~~~~~~~~~~~~~~
/var/lib/dkms/pt3_drv/0.0.1/build/pt3_pci.c:925:22: エラー: 関数 ‘pci_set_consistent_dma_mask’ の暗黙的な宣言です [-Werror=implicit-function-declaration]
  925 |                 rc = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64));
      |                      ^~~~~~~~~~~~~~~~~~~~~~~~~~~
cc1: いくつかの警告はエラーとして取り扱われます
make[2]: *** [scripts/Makefile.build:249: /var/lib/dkms/pt3_drv/0.0.1/build/pt3_pci.o] エラー 1
make[1]: *** [Makefile:1843: /var/lib/dkms/pt3_drv/0.0.1/build] エラー 2
make[1]: ディレクトリ '/usr/lib/modules/5.19.1-arch2-1/build' から出ます
make: *** [Makefile:12: pt3_drv.ko] エラー 2

自分でオプションを変更してもよかったのですが、この類のエラーは自分の環境だけではないだろうと思い、
upstreamを確認したところ以下のようなコミットを見つけました。

 commit c10619da580e3a801b205df2ba4a95a850a38786
  Author: fix@elementz <fix@elemsoft.com>
   Date:   Sat Jun 18 01:15:05 2022 +0900
   
       Fix compile error on kernel 5.18.
   
   M   pt3_dma.c
   M   pt3_pci.c

という訳で、あとはgitからソースを再取得してインストール&DKMSをやり直して終了です。

$ sudo /bin/bash ./dkms.install  
[sudo] fuha のパスワード:
Deleting module pt3_drv-0.0.1 completely from the DKMS tree.
rm -vf /lib/modules/`uname -r`/kernel/drivers/video/pt3_drv.ko* /etc/udev/rules.d/99-pt3.rules
'/usr/src/pt3_drv-0.0.1/pt3_tc.h' を削除しました
'/usr/src/pt3_drv-0.0.1/pt3_bus.c' を削除しました
'/usr/src/pt3_drv-0.0.1/pt3_bus.h' を削除しました
'/usr/src/pt3_drv-0.0.1/pt3_mx.c' を削除しました
'/usr/src/pt3_drv-0.0.1/pt3_i2c.h' を削除しました
'/usr/src/pt3_drv-0.0.1/pt3_i2c.c' を削除しました
'/usr/src/pt3_drv-0.0.1/dkms.install' を削除しました
'/usr/src/pt3_drv-0.0.1/.gitignore' を削除しました
'/usr/src/pt3_drv-0.0.1/pt3_tc.c' を削除しました
'/usr/src/pt3_drv-0.0.1/Makefile' を削除しました
'/usr/src/pt3_drv-0.0.1/COPYING' を削除しました
'/usr/src/pt3_drv-0.0.1/.git/logs/HEAD' を削除しました
'/usr/src/pt3_drv-0.0.1/.git/logs/refs/heads/master' を削除しました
ディレクトリ '/usr/src/pt3_drv-0.0.1/.git/logs/refs/heads' を削除しました
'/usr/src/pt3_drv-0.0.1/.git/logs/refs/remotes/origin/HEAD' を削除しました
ディレクトリ '/usr/src/pt3_drv-0.0.1/.git/logs/refs/remotes/origin' を削除しました
ディレクトリ '/usr/src/pt3_drv-0.0.1/.git/logs/refs/remotes' を削除しました
ディレクトリ '/usr/src/pt3_drv-0.0.1/.git/logs/refs' を削除しました
ディレクトリ '/usr/src/pt3_drv-0.0.1/.git/logs' を削除しました
'/usr/src/pt3_drv-0.0.1/.git/description' を削除しました
'/usr/src/pt3_drv-0.0.1/.git/objects/pack/pack-74a2bbe7e502032cbbc16ae0607eb906cb1d65ea.idx' を削除しました
'/usr/src/pt3_drv-0.0.1/.git/objects/pack/pack-74a2bbe7e502032cbbc16ae0607eb906cb1d65ea.pack' を削除しました
ディレクトリ '/usr/src/pt3_drv-0.0.1/.git/objects/pack' を削除しました
ディレクトリ '/usr/src/pt3_drv-0.0.1/.git/objects/info' を削除しました
ディレクトリ '/usr/src/pt3_drv-0.0.1/.git/objects' を削除しました
'/usr/src/pt3_drv-0.0.1/.git/HEAD' を削除しました
'/usr/src/pt3_drv-0.0.1/.git/refs/heads/master' を削除しました
ディレクトリ '/usr/src/pt3_drv-0.0.1/.git/refs/heads' を削除しました
'/usr/src/pt3_drv-0.0.1/.git/refs/remotes/origin/HEAD' を削除しました
ディレクトリ '/usr/src/pt3_drv-0.0.1/.git/refs/remotes/origin' を削除しました
ディレクトリ '/usr/src/pt3_drv-0.0.1/.git/refs/remotes' を削除しました
ディレクトリ '/usr/src/pt3_drv-0.0.1/.git/refs/tags' を削除しました
ディレクトリ '/usr/src/pt3_drv-0.0.1/.git/refs' を削除しました
'/usr/src/pt3_drv-0.0.1/.git/packed-refs' を削除しました
'/usr/src/pt3_drv-0.0.1/.git/hooks/fsmonitor-watchman.sample' を削除しました
'/usr/src/pt3_drv-0.0.1/.git/hooks/pre-merge-commit.sample' を削除しました
'/usr/src/pt3_drv-0.0.1/.git/hooks/pre-push.sample' を削除しました
'/usr/src/pt3_drv-0.0.1/.git/hooks/push-to-checkout.sample' を削除しました
'/usr/src/pt3_drv-0.0.1/.git/hooks/pre-rebase.sample' を削除しました
'/usr/src/pt3_drv-0.0.1/.git/hooks/applypatch-msg.sample' を削除しました
'/usr/src/pt3_drv-0.0.1/.git/hooks/post-update.sample' を削除しました
'/usr/src/pt3_drv-0.0.1/.git/hooks/pre-receive.sample' を削除しました
'/usr/src/pt3_drv-0.0.1/.git/hooks/pre-applypatch.sample' を削除しました
'/usr/src/pt3_drv-0.0.1/.git/hooks/commit-msg.sample' を削除しました
'/usr/src/pt3_drv-0.0.1/.git/hooks/update.sample' を削除しました
'/usr/src/pt3_drv-0.0.1/.git/hooks/prepare-commit-msg.sample' を削除しました
'/usr/src/pt3_drv-0.0.1/.git/hooks/pre-commit.sample' を削除しました
ディレクトリ '/usr/src/pt3_drv-0.0.1/.git/hooks' を削除しました
'/usr/src/pt3_drv-0.0.1/.git/config' を削除しました
ディレクトリ '/usr/src/pt3_drv-0.0.1/.git/branches' を削除しました
'/usr/src/pt3_drv-0.0.1/.git/index' を削除しました
'/usr/src/pt3_drv-0.0.1/.git/info/exclude' を削除しました
ディレクトリ '/usr/src/pt3_drv-0.0.1/.git/info' を削除しました
ディレクトリ '/usr/src/pt3_drv-0.0.1/.git' を削除しました
'/usr/src/pt3_drv-0.0.1/td/check_lfsr.c' を削除しました
'/usr/src/pt3_drv-0.0.1/td/.gitignore' を削除しました
'/usr/src/pt3_drv-0.0.1/td/Makefile' を削除しました
'/usr/src/pt3_drv-0.0.1/td/td.c' を削除しました
ディレクトリ '/usr/src/pt3_drv-0.0.1/td' を削除しました
'/usr/src/pt3_drv-0.0.1/pt3_com.h' を削除しました
'/usr/src/pt3_drv-0.0.1/dkms.uninstall' を削除しました
'/usr/src/pt3_drv-0.0.1/pt3_qm.c' を削除しました
'/usr/src/pt3_drv-0.0.1/pt3_ioctl.h' を削除しました
'/usr/src/pt3_drv-0.0.1/pt3_pci.c' を削除しました
'/usr/src/pt3_drv-0.0.1/README' を削除しました
'/usr/src/pt3_drv-0.0.1/pt3_dma.h' を削除しました
'/usr/src/pt3_drv-0.0.1/pt3_pci.h' を削除しました
'/usr/src/pt3_drv-0.0.1/pt3_qm.h' を削除しました
'/usr/src/pt3_drv-0.0.1/pt3_dma.c' を削除しました
'/usr/src/pt3_drv-0.0.1/etc/99-pt3.rules' を削除しました
ディレクトリ '/usr/src/pt3_drv-0.0.1/etc' を削除しました
'/usr/src/pt3_drv-0.0.1/pt3_mx.h' を削除しました
'/usr/src/pt3_drv-0.0.1/dkms.conf' を削除しました
ディレクトリ '/usr/src/pt3_drv-0.0.1' を削除しました
Creating symlink /var/lib/dkms/pt3_drv/0.0.1/source -> /usr/src/pt3_drv-0.0.1
Sign command: /usr/lib/modules/5.19.1-arch2-1/build/scripts/sign-file
Signing key: /var/lib/dkms/mok.key
Public certificate (MOK): /var/lib/dkms/mok.pub

Building module:
Cleaning build area....
make -j2 KERNELRELEASE=5.19.1-arch2-1 KVER=5.19.1-arch2-1 dkms..........................
Signing module /var/lib/dkms/pt3_drv/0.0.1/build/pt3_drv.ko
Cleaning build area...kj

pt3_drv.ko.zst:
Running module version sanity check.
 - Original module
   - No original module exists within this kernel
 - Installation
   - Installing to /usr/lib/modules/5.19.1-arch2-1/updates/dkms/
depmod.................

あとがき

注意点として、pacmanによる更新をした直後だと「uname -r」で取れるカーネルバージョンが昔のバージョンのままのため、linux-headerのバージョンが合わずMakeが失敗する。 Make前に一回再起動することで回避ができる。

archlinuxの更新でQEMU関連ファイルがエラーを吐いた話

ある日、パッケージ更新をしようとした所以下のようなエラーが表示された。

エラー: 処理を完了できませんでした (衝突しているファイル) seabios: /usr/share/qemu/bios-microvm.bin がファイルシステムに存在しています (qemu によって所有されています) seabios: /usr/share/qemu/vgabios-ati.bin がファイルシステムに存在しています (qemu によって所有されています) エラーが発生したため、パッケージは更新されませんでした。

Wikiを調べた結果、「qemuは3つのパッケージに分割された」という趣旨のリリースがあった。
この変更のせいで変な競合の仕方をしたと思われる。

www.archlinux.jp

というわけで、一旦消してから入れ直すことにした。

なお、筆者の場合QEMUVirtualBox用にインストールしたものであり、 現在もいくつかVirtualBoxの環境を持っている。
ただ、アンインストールしたとしてもいきなりユーザーデータを消したりはしないだろう ということでそのまま削除した。

結果、滞りなく更新は終了し、VirtualBoxも以前と変わりなく利用できた。

以上

余談

見返した所、更新の実行前に時に以下のような確認が出ていたので、 ここでそのままYesにしても同じ結果になったかもしれない。

:: qemu を extra/qemu-desktop に置き換えますか? [Y/n] n

ただ、毎回ちゃんとそのまま置換できるパッケージが提案されるとは限らないと思うので、 一応確認したことは意味がある…はず。

Youtubeで使える絵文字コマンド調べ方&一覧

慣れると一覧から選択するより圧倒的に早いので、 自分がよく使う物や見かける物だけですが集めました。
概ね自分用です。

2022/7追記 検索を使った名前の調べ方と一覧の文字追加

調べ方

一覧でカーソルを合わせた際、検索窓に出てくる文字がコマンドです。
ちなみにカスタム絵文字はアンダーバーから始まるようです。使い方は変わりませんが。

というか単純な奴は調べるまでもなく、コロン+英単語入れれば割と通ります。

※補遺
Unicodeに定義されている絵文字の場合、名前はUnicodeの英語名と概ね一致します。
よって、『絵文字をそのままGoogleにコピペして検索』することで、名前が見つかる場合もあります。
(一部のyoutube専用絵文字は対応不可 【:yougotthis:など】)

使い方

オススメは普通に手で打つ方法です。

コマンド最初の2文字程度を打てば選択肢が出てきて、押す度にどんどん絞り込まれます。
絞った後は上下キーで選択、タブキーで確定します。

コピペする場合、コピペした直後は文字のままですが後ろにスペースを一個入れると確定します。

一覧

コマンド
:thumbs_up: 👍
:yougotthis:
:clap: 👏
:victory_hand:
:raised_fist:
:hand_with_fingers_splayed:
:loudly_crying_face: 😭
:thinking_face: 🤔
:smiling_face_with_smiling_eyes: 😊
:smiling_face_with_halo: 😇
:folded_hands: 🙏
:horse: 🐴
:horse_racing: 🏇
:cat: 🐱
:shelterin:
:fire: 🔥
:buffering:
:waving_hand:  👋

後書き

じゃんけんの難易度が高すぎる。

以上