nplの小部屋

しっかりブログ的なものを書くときもあれば雑なメモのときもある

Ubuntu 23.10でFcitx5を使おうとしたらAppArmorに何故か叱られた話

(◕‿‿◕) < わけがわからないよ なお筆者はまどマギをよく知らない

Ubuntu 24.04を試したかっただけなのに

もうすぐUbuntu 24.04 LTSリリースの季節ということで、本来はUbuntu 24.04の開発版を触ってみる予定でした。

が、5GB以上あるISOファイルが何故か4GBでダウンロードが止まったり、Vivaldiブラウザがダウンロードの再開操作を受け付けず1からダウンロードし直そうとしたり(wget -cで解決)、Regolith Desktopが認証ウィンドウを表示してくれなかったり(GNOMEに移動して解決)と、準備段階からしてグダグダな状態が続いていました。

そしていざUbuntu 24.04が書き込まれたUSBメモリを空き状態のノートパソコンに挿してみたところ、Ubuntu自体起動しないという問題に直面して大きなショックを受けたため、気分直しにUbuntu 23.10を入れることにしました。

Ubuntu 23.10をインストールするのは今回が初めてです。

ibusを蹴ってfcitx5を入れて終わる予定だった

個人的にはUbuntuにおけるibusの体験があまり良くなく(Ctrl+Backspaceをすると即クラッシュとか)、Wayland上で日本語入力するならFcitx 5の方がいいという曖昧な印象でFcitx 5を使用するつもりでいました。

とりあえず以下のコマンドでFcitx 5のインストールと切り替え操作を行いました。

sudo apt install fcitx5-mozc
im-config -n fcitx5

本来であれば再起動後にはFcitx 5を利用して普通に日本語入力ができるはずでした。

が…

Snapか…

起動後、Fcitx 5が起動していることを確認し、端末上でも日本語入力ができることを確認していました。

が、その後Firefoxを開いたところ、日本語入力ができなくなっていることに気が付きました。

この時点で内心「Snapか…」という思い初めていました。

重症患者がいた

直後にもう一つのSnapアプリケーションである「アプリセンター」を開いたところ、こちらは日本語入力ができないどころか、Fcitx 5が起動している状態だと文字入力そのものができないという事態に陥っており、この時点でUbuntu24.04インストール失敗の仕切り直しという気分ではなくなっていました。

AppArmorか…

この問題を調べるため、Firefoxを端末で起動してみたところ、起動直後から入力に関する問題がエラーとして表示されていました。

Create input context failed: GDBus.Error:org.freedesktop.DBus.Error.AccessDenied: An AppArmor policy prevents this sender from sending this message to this recipient; type="method_call", sender=":1.317" (uid=1000 pid=68181 comm="/snap/firefox/3836/usr/lib/firefox/firefox " label="/snap/firefox/3836/usr/lib/firefox/firefox (enforce)") interface="org.freedesktop.IBus" member="CreateInputContext" error name="(unset)" requested_reply="0" destination="org.freedesktop.IBus" (uid=1000 pid=16975 comm="fcitx5 -d " label="unconfined").

アプリセンターでも同様のログが表示されていた他、キーを押す毎に

ibus_im_context_filter_keypress: assertion 'ibusimcontext->cancellable != NU++ || ibus_bus_is_connected (_bus) == FALSE' failed

というエラーが吐き出されていました。

結論を焦った筆者

※ここには盛大な勘違いが記載されているので畳んでいます。

情報不足

このエラーについてDuckDuckGoで調べてもFirefoxを公式バイナリ版にする話やあまり関係ない内容のみであり、Twitter(現X)で同様の報告は3しかありませんでした(そもそもFcitx 5に切り替えたユーザーが少ない?)。

多分無闇にやってはいけない

このときの自分は問題の解決に対する気力はなくなっていたため、AppArmorを無効にすることで一時的解決を図りました。

gihyo.jpの記事を参考に以下のコマンドを実行して再起動しました。

sudo systemctl stop apparmor.service
sudo systemctl disable apparmor.service

再起動後、再びSnapアプリを起動してみたところ、無事Fcitx 5で入力をすることができました。

真相は闇の中へ

しばらくしてから、この問題について(勉強も兼ねて)バグ報告をしようと、以下のコマンドで有効にしなおしました。

sudo systemctl enable apparmor.service

しかし、困ったことに、再起動後には同様の手順を踏んでも、文字入力ができないという問題は解消されてしまい、エラーも発生しなくなっていました。

結論?

何もしてないのに壊れた後、大したこともしてないのに直ってしまった。

「結論とは…?」と疑問に思うような内容ですが、「こんなことがあった」という備忘録です。

筆者がアホだった

筆者は記事作成前、雑な調査でAppArmorを無効にしたことで問題を解決したつもりになっていましたが、もう一度Ubuntu 23.10を入れたときに再発し、AppArmorを無効にしても直らなかったので再調査をしたところ、非常にかんたんな方法で修正することができました

sudo apt autoremove ibus-mozc

…競合ですね。

結論(再)

fcitx5入れたらibusを吹き飛ばす(か、無効にする)

MiriaがSnapパッケージになるまで

Misskeyを開いたら、それはミス廃への片道切符。もう、後戻りはできない―――。 …ふざけました。NPLです。

今回はMisskey専用クライアントアプリ「Miria」のSnapパッケージ化の記録を簡単にまとめていきます。

Advent Calenderの季節ですが、特に関係はありません。

注意

この記事の内容はほとんどプログラミングをしたことが無い人間によって書かれています。間違った内容が紛れている可能性が高いため、後述する参考記事や、その他複数の情報を参考にしながら読み進めてください。特に、この記事では解説していない内容も多数存在するため、Snapcraft.ioのドキュメントを参考にしてください

Miriaとは

Miriaは、そらいろ氏が開発した、FlutterベースのMisskeyクライアントアプリです。

Misskeyに特化した機能開発による「複数アカウントのタブ切り替え」や「(初の)MFMの互換表示」などの特徴が存在します。

タブには通常のHTLやLTLに限らず、リスト・アンテナ・チャンネル・ロールなどを割り当てることもできます。また、Misskeyクライアントとしては珍しいWebViewを使わないMFM互換表示を利用することができます。

そんなMiriaですが、Flutterをベースに開発されていることから、AndroidWindowsiOS/iPadOS/macOSでサポートされています。

そして、Flutter SDKを利用すれば、Linux用アプリを同一のコードでビルドすることができます。

今回は、MiriaをSnapパッケージで利用できるようにするため、snapcarftに挑戦してみることにしました。

注意:MiriaのSnapパッケージを作成する話であり、現在Snap Storeを検索してもMiriaは存在しません。

Snapパッケージについて

SnapパッケージはUbuntuの開発元Canonicalが推奨しているパッケージです。debパッケージと違い、必要な依存関係を開発元が本体のパッケージにまとめて配布する方式です。snapコマンドやSnap Store(Snapcraft.io)からパッケージのインストールを行うことができます。

debパッケージやrpmパッケージの方がユーザー数は多いとは思いますが、Flutter公式ドキュメントにSnapパッケージ化の方法が存在することや、Snapcraft側にもドキュメントが揃っていることから、Snapパッケージを選択しました。

Flatpakじゃだめだったの?

日本語記事が少ない時点で諦めました。

一応パッケージ化することはできたものの、仕様の理解が進まなかった故、維持管理に問題のある状態の設定ファイルが出来上がってしまったため、お蔵入りになりました。

参考

この記事の内容のほとんどは、gihyo.jpの「Snapパッケージ入門」を参考にしています。この記事を読む前に、参考記事の方を読むことをオススメします(この記事より詳細なことが書かれており、そちらの方が理解しやすいため)。

MiriaをSnapパッケージ化する

ここでは、Flutter公式ドキュメントに従ったパッケージングを行います。

これからFlutterアプリをSnapパッケージにするときはSnapcraftのドキュメントを読むことをオススメします。(理由

1, プロジェクトフォルダ内にSnapパッケージ用ファイルを作成する

ここではmiria-snapディレクトリをプロジェクトフォルダとして作業を行います。

事前にsnapcraftをSnapでインストールしておきます。

~$ sudo snap install snapcraft --classic

プロジェクトフォルダに入り、Snapパッケージ作成のためのファイルを追加します。

~$ mkdir miria-snap && cd miria-snap
~/miria-snap$ snapcraft init

これでプロジェクトフォルダ内にsnapフォルダとsnap/snapcraft.yamlファイルが作成されました。

2, snapcraft.yamlをドキュメントに習って編集する

初期状態のsnapcraft.yamlの中身はこのようになっています。

name: my-snap-name # you probably want to 'snapcraft register <name>'
base: core22 # the base snap is the execution environment for this snap
version: '0.1' # just for humans, typically '1.2+git' or '1.3.2'
summary: Single-line elevator pitch for your amazing snap # 79 char long summary
description: |
  This is my-snap's description. You have a paragraph or two to tell the
  most important story about your snap. Keep it under 100 words though,
  we live in tweetspace and your description wants to look good in the snap
  store.

grade: devel # must be 'stable' to release into candidate/stable channels
confinement: devmode # use 'strict' once you have the right plugs and slots

parts:
  my-part:
    # See 'snapcraft plugins'
    plugin: nil

まずはこのファイルをFlutterドキュメントに合わせたものに変更します。

- name: my-snap-name # you probably want to 'snapcraft register <name>'
+ name: miria-snap
- base: core22 # the base snap is the execution environment for this snap
+ base: core18
- version: '0.1' # just for humans, typically '1.2+git' or '1.3.2'
+ version: '1.0.13+87'
- summary: Single-line elevator pitch for your amazing snap # 79 char long summary
+ summary: Misskey Client for Mobile
description: |
-   This is my-snap's description. You have a paragraph or two to tell the
-   most important story about your snap. Keep it under 100 words though,
-   we live in tweetspace and your description wants to look good in the snap
-   store.
+   Misskey Client App built with Flutter
grade: devel # must be 'stable' to release into candidate/stable channels
confinement: devmode # use 'strict' once you have the right plugs and slots

parts:
-   my-part:
+   miria-snap:
    # See 'snapcraft plugins'
-     plugin: nil
+     plugin: flutter
+     source: https://github.com/shiosyakeyakini-info/miria.git
+     flutter-target: lib/main.dart
+
+ apps:
+   miria-snap:
+     command: miria
+     extentions: [flutter-stable]

今はFlutterドキュメントに合わせてcore22からcore18に変更していることを覚えておいてください。

基本的に前半部分はアプリの名前や説明欄などを編集しています。

confinementはユーザーに対するアプリのセキュリティ設定であり、開発中はdevmodeを選択しますが、リリース時にはstrictで動くようにしなければなりません(ただし、エディターなどのファイルの書き込みの制限を緩める必要のある場合にはclassicが使用できます)。

partsでは、パッケージに含めるプログラムの追加などを行います。今回の場合、miria-snapのパーツとして、MiriaのソースコードをGitHubから取得し(source)、Flutterのビルド環境を用意して(plugin)、lib/main.dartを対象としたビルドを行う(flutter-target)ように記述しています。

appsでは、実際に実行するコマンドの記述などを行います。今回はアプリ名がmiria-snapであるため、apps:miria-snap:の並びで作成します。アプリのインストール後に端末からmiria-snapを入力してアプリを実行することができるようになります。

apps:command:には、実際に実行されるプログラムのコマンドを入力します。ここではビルドしたmiriaの実行ファイル名"miria"を入力します。

Flutterはビルド成果物をbuild/linux/x64/release/bundle以下にlib, data, miriaを生成しますが、snapcraftはそれらをSnapアプリのフォルダのルートに配置します。つまり、コマンドの内容は{Snapパッケージのフォルダルート}/miriaのような配置になります。

apps:miria:としてしまった場合、アプリ名とコマンド名が一致せず、端末からの実行時にmiria-snap.miriaと入力しなければならないため、apps以下の名前とsnapcraft.yaml先頭のnameは一致するようにします。

apps:miria-snap:extentions:には、Flutterに関連するplugs環境変数などを自動的に追加するためflutter-stableを入力します。

基本的な内容はこれで書き終えたので、このままsnapcraft buildを実行すればSnapパッケージのビルドが開始されます。

ただし、このままではMiriaのビルドは完了しません。

3, 依存関係を追加する

ログを確認すると、Snapパッケージのビルド中の"Miria本体のビルド"が完了できていません。これは依存関係が不足していることが原因です。

Miriaではflutter_secure_storagemedia_kitが使用されており、ビルド時にはlibsecret-1-dev, libmpb-devが、ユーザーの使用時にはlibsecret-1-0, libmpv1が必要となります。

このため、ビルド専用の依存関係と、Snapパッケージに同梱する用の依存関係を追加します。

依存関係をparts:miria-snap:以下のそれぞれbuild-packagesstage-packagesに記述しました。

[...]
parts:
    miria-snap:
  [...]
+   build-packages:
+     - libsecret-1-dev
+     - libmpv-dev
+   stage-packages:
+     - libsecret-1-0
+     - libmpv1

参考1: flutter_secure_storage | Flutter Package libjsoncppは最近のバージョンから不要になりました

参考2: media_kit | Dart Package mpvstage-packagesに含めるとMPVプレーヤーがデスクトップアプリとして一緒にインストールされてしまうのでlibmpvのみで十分です。

これで再度snapcraft buildを実行すると、Miria本体のビルドまで実行することができます。

これ以降のステップに進むには、一旦生成されたSnapパッケージをインストールして、動作を確認しながら進めていくことをおすすめします。

~/miria-snap$ sudo snap install --dangerous --devmode ./miria-snap_1.0.13+87_amd64.snap

4, セキュリティレベルをstrictにする

ある程度動くものになってきたため、今度はconfinementdevmodeからstrictに切り替え、必要な機能の洗い出しを行います。

[...]
- confinement: devmode
+ confinement: strict

Snapでは必要な機能のみをplugで接続する必要があります。

extentionsflutter-stableを設定しているので、desktop, desktop-legacy, gsettings, opengl, wayland, x11は、自動的に接続されます。

この時点で再度ビルドを実行し、すべての機能が動作するか確認します。Miriaの場合、"動画の音声が聞こえない"、"ログイン情報が保存されていない"という、2つの不具合がみつかりました。

音声の再生は、audio-playbackというプラグ、ログイン情報の保存はpassword-manager-serviceというプラグによって管理されているため、この2つをapps:以下に追加します。

[...]
apps:
  [...]
+   plugs:
+     - audio-playback
+     - password-manager-service

参考: The flutter extension | Snapcraft documentation

ただし、password-manager-serviceは機密情報を扱うプラグであるため、アプリをインストールしても自動ではプラグが機能しないようになっています。 ユーザーにアプリを公開する前に、password-manager-serviceへのアクセスを許可する操作を行うよう告知することを忘れないでください。

$ sudo snap connect miria-snap:password-manager-service

参考: Snapcraft.yaml reference | Snapcraft documentation

5, ファイル選択ダイアログを表示できるようにする

Miriaには画像ファイルをノートに添付して投稿する機能がありますが、SnapにしたMiriaではファイル選択のメニューが表示されなくなっています。

Miriaのファイル選択機能はflutter_file_pickerによって呼び出されていますが、flutter_file_picker内部ではzenity --file-selection(もしくは、qarmakdialogでそれに類するコマンド)を呼び出しています。

Ubuntu Desktop自体にはzenityが含まれているものの、Snapからは呼び出すことができないため、zenityをパッケージに含めるようにする必要があります。

FLutterはGTKを使用したアプリであるためzenityで統一しました。

[...]
parts:
  [...]
+   zenity:
+     plugin: nil
+     stage-packages:
+       - zenity
+     prime:
+       - usr/bin/zenity
+       - usr/share/zenity/*

parts以下に、miria-snapとは別にzenityを作成し、zenityを用意して、primeでパッケージに関連するファイルをSnapパッケージに含めるように指定しました。

参考: Inform users with custom dialogs - doc - snapcraft.io

6, デスクトップアイコンを追加する

今のままではデスクトップアプリなのにアプリのメニューボタンが存在しない状態になってしまうので、デスクトップエントリーファイルとアイコン画像を追加します。

デスクトップエントリーファイルとアイコン画像は次のコマンドでsnap/guiディレクトリを作成して、そこに追加します。

~/miria-snap $ mkdir -p snap/gui
~/miria-snap $ touch snap/gui/miria-snap.desktop

デスクトップエントリーファイルには以下の内容を追加します。

[Desktop Entry]
Version=1.0
Name=Miria Snap
GenericName=Misskey Client
Type=Application
Exec=miria-snap
Icon=${SNAP}/meta/gui/miria-snap.png
Comment=Misskey client app for mobile (Linux build)
Comment[ja]=モバイル向けのMisskeyクライアントアプリ(Linux向けビルド)
Keywords=Misskey;Miria;みりあ
Terminal=false
StartupNotify=false

Execにはアプリ名を追加します。Iconsnap/gui/mria-snap.pngを使用する場合、snap以下のファイルはSnapパッケージ作成時に${SNAP}/meta以下にコピーされるため${SNAP}/meta/gui/miria-png.pngを指定します。

keywordsは、Firefoxのデスクトップエントリーを見たところ、各言語ごとに分ける必要がありそうです(キーワードが多くなければ1つにまとめたままでもいいとは思いますが…)。

7, バージョン情報を自動で取得する

現在はversionを直接記述しています(version: 1.0.13+87はこの記事作成時の最新バージョン)が、Snapパッケージビルド時にこのバージョンを手動で書き換えるのは面倒なので、毎回バージョン情報を自動で取得するように変更します。

1, 直接記述されたバージョン情報を削除

[...]
- version: 1.0.13+87
+ adopt-info: miria-snap

versionを削除する代わりに、バージョンを取得する処理を行うパーツ名(今回はmiria-snap)をadopt-infoに追加します。

2, ソースコード取得の処理を上書き

本来自動的に行われるソースコードの取得処理に変更を加えます。

[...]
parts:
  miria-snap:
+     override-pull: |
+       snapcraftctl pull
+       VERSION=$(cat pubspac.yaml | grep "version[:]" | cut -d " " -f 2)
+       snapcraftctl set-version "$VERSION"

snapcraftctl pullは本来行われるソースコードの取得処理を行うコマンドです。

VERSION変数に、pubspac.yamlに記述されたバージョンを代入して、snapcraftctl set-versionに渡しています。

Miriaではflutter pub run cider versionでバージョン情報のみを取得する適切な方法がありますが、この時点ではFlutterのセットアップが済んでいないため利用できません。そのため、cat, grep, cutを駆使した酷いコードになっています。

参考1: 第660回 自作のsnapパッケージをSnap Storeに公開する | gihyo.jp

参考2: Override build steps | Snapcraft documentation

完成(のはずだった)

これにてリリース可能なMiria Snapパッケージが完成しました。お疲れ様でした。

…で終わらなかった。

core18からの脱却

ここまで作ってきたSnapパッケージはcore18というUbuntu 18.04 LTSベースのビルドが行われていました(Snapパッケージビルド時に起動するLXDコンテナもUbuntu 18.04です)。

しかし、Ubuntu 18.04 LTSのサポート期限はリリースから5年の2023年であり、MiriaのSnapパッケージを作成し始めた頃にはサポート終了の直前でした。Snapcraftも同様にcore18のサポートを終了することは容易に予想でき(そして的中し)たので、Ubuntu 22.04 LTSベースのcore22に移行する必要があります。

core22に移行する

core18からcore22の間にはいくつか変更点があります。

1, Flutter Extentionの廃止

core18ではextentionsflutter-stableを設定することでplugなどが自動的に接続されていましたが、core22では用意されていません。

代わりとしてgnomeを選択する必要があります。

flutter-stablegnomeのプラグの内容はほとんど同じなので不要だったのかもしれない。

2, snapcraftctlの廃止

override-pulloverride-build内で処理を上書きするときに、既定の処理を呼び出すsnapcraftctlが廃止され、代わりにcraftctlを利用するようになりました。

override-pull内でsnapcraftctl pullとしていたコマンドやoverride-build内でsnapcraftctl buildとしていたコマンドなどは、どちらもcraftctl defaultに置き換えられます。

参考: Using the craftctl tool | Snapcraft documentation

置き換える

上記の2つを置き換えていきます。

extentions

[...]
apps:
  [...]
-   extentions: [flutter-stable]
+   extentions: [gnome]

上記で記した通り、flutter-stablegnomeに置き換えるだけです。使用するplugsに変更はないのでそのままです。

snapcraftctl

[...]
parts:
  miria-snap:
    [...]
-     snapcraftctl pull
+     craftctl default
    VERSION=$(cat pubspac.yaml | grep "version[:]" | cut -d " " -f 2)
-     snapcraft set-version $VERSION
+     craftctl set version=$VERSION

上記で記したsnapcraftctl pullcraftctl defaultの他、set-versionオプションをset version=<version>に置き換える必要があります。

これでコマンドの置き換えなどが完了しました。

これにてMiriaのSnapパッケージ化は一旦完了です。

まとめ

今回は、MiriaをSnapパッケージにするまでの流れを解説(記録?)しました。

基本的にはgihyo.jpの記事を参考に大まかに内容を理解してから、Snapcraftのドキュメントを参考に詳細を埋めていく形でMiriaをSnapパッケージにすることができました。

作ってみた感想としては、「とりあえずパッケージ化して動くものを作りたい」という面では悪くない選択肢ではないかと思います。

また、「もう少し日本でSnapパッケージを利用する記事増えないかな〜?」と期待しています。

今後

今回はパッケージ化するところ(「とりあえず動くものを作る」段階)まで記事にしましたが、今のままでは起動時間が長いことやパッケージサイズが200MBとちょと大きいという問題を抱えているため、これを改善する(「細かい調整」の段階)内容を時間があればまとめていきたいと思います。

ReactOSをLenovo IdeaPad S12に入れたかったメモ

検索でここにたどり着いた人へ: 最後を見ればわかると思いますが、実働記録ではありません。

ReactOSインストールメモ for Lenovo IdeaPad S12

インストールに必要なもの - ReactOS ISOイメージ v0.4.14は使わないように(一敗)

メモ

いきなりメモ投下してきたけど動いたの?

「ダメです、動きません!!」

LiveUSB起動画面途中でフリースして動かない。

原因調査中

Ubuntu Touchを試すため、utqemuをインストールしてみた。

Ubuntu Touchを仮想環境で試す方法について調べたことを簡単にまとめていきます。

Ubuntu Touchって何ぞや

Ubuntu Touchとは、Ubuntuの開発元であるCanonicalが、iOSAndroidに対抗するために作ったモバイルOSです。

Home | Ubuntu Touch

現在は開発方針についてなんやかんやあった結果、UBportsが管理しています。

Ubuntu TouchはAndroidのカスタムROMと同じような方法で、対応する端末にインストールすることができます。

Ubuntu Touchの仮想イメージ

開発者向けにUbuntu Touchの仮想環境が提供されていないか、Ubuntu Touchの開発者向けドキュメントを読んだり(ついでに翻訳したり)していたところ、utqemuという、Ubuntu TouchのQEMU環境が提供されているのを見つけました。

GitHub - ubports/utqemu: Ubuntu touch qemu virtual machine

utqemusnapで提供されています。

とりあえず手元の環境で試す

環境

手順

1, 端末を開き、utqemuをインストール

sudo snap install utqemu --edge

2, qemu-virgilをインストール

README.mdでインストールする項目として書かれていないものの、インストールする必要があります。

sudo snap install qemu-virgil --devmode

3, 接続

sudo snap connect utqemu:kvm

4, Ubuntu TouchのQEMUイメージを取得

utqemu create

5, 以下のコマンドで起動

README.mdには「utqemu startを使え」と書かれていますが、以下のコマンドでなければ起動しないことがIssueで報告されています。

qemu-virgil -enable-kvm -m 2G -device virtio-vga,virgl=on -display sdl,gl=on -netdev user,id=ethernet.0,hostfwd=tcp::10022-:22 -device rtl8139,netdev=ethernet.0 ~/snap/utqemu/common/ubuntu-touch-mainline-generic-amd64.img

ちなみにqemu-virglなしだと以下のエラーで止まります。

$ utqemu start
qemu-system-x86_64: -device virtio-vga,virgl=on: Property '.virgl' not found

これでUbuntu Touchの仮想イメージが起動します。

ざっくりとした使用感

OSバージョン

どこにもOSのバージョン情報が書かれておらず、いつビルドされたものかもわかりません。

とりあえずTerminalでuname -aを入力してみたところ、

Linux ubuntu-phablet 4.15.0-142-generic 146~16.04.1-Ubuntu SMP Tue Apr 13 09:27:15 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux

と帰ってきました。少なくともUbuntu16.04 LTSベースである模様。

一方、ファイルアプリを開くと、ファイルの作成(最終アクセス?)日は2022年となっています。

2022年にビルドされたものなのでしょうか...?

とりあえずここまで。

追記(10月5日)

一応utqemuQEMUのバイナリなどを持っているなので、本当はutqemuだけで完結するはずのパッケージのようです。

でも、qemuのパスを直接指定して使った結果は以下のとおり…

$ /snap/utqemu/current/usr/bin/qemu-system-x86_64 -enable-kvm -m 2G -device virtio-vga,virgl=on -display sdl,gl=on -netdev user,id=ethernet.0,hostfwd=tcp::10022-:22 -device rtl8139,netdev=ethernet.0 ~/snap/utqemu/common/ubuntu-touch-mainline-generic-amd64.img
/snap/utqemu/current/usr/bin/qemu-system-x86_64 -enable-kvm: error while loading shared libraries: libbrlapi.so.0.6: cannot open shared object file: No such file or directory

ライブラリ不足…(ソースコードを見るとstage-packageにちゃんと入ってるので謎)

Misskeyのクライアントアプリを探している人向けのリスト

wiki.misskey.ioで作ったリストですが肝心のWikiが落ちてるのでここにコピーしておきます。 多分CCいくつとかのライセンスだと思います。 -> CC-BYでした。

注意:記事の内容は少し古くなり始めているので、元の記事を読むことをオススメします

Misskeyクライアントアプリ一覧

特定のプラットフォームで使えるかどうかだけ書いてあります。App名には各公式サイトURL、Yesの項目にはダウンロードURLが貼ってあります。

なお、「このビッグウェーブに乗り遅れるわけにはいかない!」のノリで書いたのでリンク切れがある場合があります。

App iOS/iPadOS Android Windows macOS Linux Web Language Source Code
Kaiteki No Yes Yes No Yes Yes de, el, en, es, fr, he, id, it, ja, lv, pl, ru, zh Kaiteki-Fedi/Kaiteki on GitHub
Kimis Yes No No Yes No No en-US Lakr233/Kimis on GitHub
Milktea No Yes No No No No ja-JP pantasystem/Milktea on GitHub
Miria Yes Yes Yes Yes Yes No ja-KS, ja-OJ shiosyakeyakini-info/miria on GitHub
MissCat Yes No No No No No ja? YuigaWada/MissCat on GitHub
MissLI No No No No No Yes ja? uboar/missli on GitHub
MissRirica Yes Yes No No No Yes en, ja, ko fruitriin/missRirica-client on GitHub
PSkey No Yes No No No No ja-JP ibuki2003/pskey - GitHub
SocialHub Yes No No No No No en, ja uakihir0/SocialHub on GitHub
SoraSNS Yes No No No No No fr, ja, kr, es, zh-CN, zh-TW -
Takesama Yes Yes No No No Yes en, ja -
TootRain No No No Yes No No en, ja b123400/TootRain on GitHub
ZonePane No Yes No No No No ja-JP -

※: 開発中のアプリであり、不具合が頻発する可能性があります。

おまけ

特殊な環境下で動くMisskeyクライアントです。ノリが某有名俳優公式サイトのそれ。

App Target Platdorm Source Code
Citraskey 3DS browser GitHub - CyberRex0/citraskey
misskey-cli CLI System (Go) GitHub - mikuta0407/misskey-cli
Misskey Client for Visual Studio Code Visual Studio Code GitHub - mikankari/msky4vscode
MisT TUI System (Python) GitHub - 35enidoi/MisT
Teramisu host server: Running Node.js, client: Telnet Client GitHub - castella-cake/teramisu-server
vimskey vim/neovim GitHub - Allianaab2m/vimskey
もふきー Windows 95+ -

参考

アプリ | Misskey Hub

Clients | Misskey Wiki

この記事の更新履歴

2023/07/02 - リンク切れを多数起こしていたため修正、注意事項を追記

2023/07/03 - 特殊なクライアントを追加

2023/07/09 - クライアントを追加

2023/07/10 - 特殊なクライアントを追加

2023/07/12 - 特殊なクライアントを追加

2023/07/13 - wiki.misskey.ioが復旧してた

2023/07/20 - 祝・miria for iOSの正式リリース

2023/07/28 - 祝・miria for Androidの正式リリース

2023/09/05 - クライアントの追加と言語の追加

2023/09/06 - クライアントを追加

2024/02/10 - 一部クライアントを削除、wiki.misskey.ioへの誘導

2024/03/26 - 特殊なクライアントを追加

2024/04/17 - 特殊なクライアントを追加

その辺にあったタブレットPCをネットビデオ再生機にしようとLinux入れて弄っていたら躓いたこと

Linuxなんもわからん。nplです。

今回はこれまで経験したことをもとにLinuxデスクトップを自分好みに構築とした結果つまずいたことを残しておこうと思います。

やろうとしていたこと

今回、家に転がっていたタブレットPCを使ってオンラインビデオ再生機っぽいもの...Chromecast?そんなものはいらん!...を用意しようと計画していました。

とりあえずテレビに常時HDMI接続してすぐに動画再生できる環境が作れればOKということです。

そこであまりスペースを取らずあまり使っていないパソコン(タブレットPC)を動画視聴に最適化することになったのです。

注意

今回使用したタブレットPCはすでにリビングのテレビに設置して取り出せない状態にしてしまったので、この記事に書かれていることは自分の記憶(と、りなっくすきーでのボヤキ)をもとにした曖昧なものです。参考にするときは「なんかこんなこともあるっぽい」程度に捉えておくことをおすすめします(そもそもこのブログメモ扱いなので...)。

タブレットPCの仕様

  • メーカー: mouse -型番: WN801v2
  • CPU: Intel Atom Z3735F (32-bit UEFI)
  • Memory: 2GB
  • Storage: 32GB eMMC
  • Default OS: Windows 8 32-bit

CPUの型番が曖昧なのはさておき、上記からわかるようにこのタブレットPC64-bit CPUなのに32-bit OSが要求されるめんどくさいやつです。まぁbootia32.efiがあれば問題ありませんが...

既知の問題

  • タッチスクリーンが機能しない

タブレットを地面に落とした衝撃のせいですはい()

これはUEFIの設定でタッチスクリーンを存在しないものとして扱うことで回避しました。

なんだかLinuxドライバとの相性が悪いようです。

こちらもUEFI設定からBluetoothモジュールを存在しない扱いに変更し、その辺に転がっていたUSBタイプのBluetoothドングルを刺すことで問題を解決しました。

今回イロイロ面倒くさくなった元凶です。

実は今回使用するタブレットは今まで何度もOSを入れ替えてきたものの、Wi-Fi接続ができないため常用できませんでした。スキャンはできるのに。

原因を特定する能力が私になかったので今まで放置してきましたがなぜかRaspberry Pi OS for PCだとネット接続できたので今回はこのOSをインストールしていくことにしました。

Raspberry Pi OS for PCをインストールする

1, Raspberry Pi OS for PCのISOイメージをダウンロード

公式サイトからISOイメージをダウンロードします。たしか3.4GBくらいあります。

2, ISOイメージをUSBメモリなどに書き込み

balenaEtcherRufusを使ってインストールメディアを作成します。

Windowsユーザーの場合はWindowsターミナルを起動しwinget install rpi-imagerを実行してRaspberry Pi Imagerをインストールして使用するのがおすすめです。

3, 作成したインストールメディアを使ってタブレットPCにインストール

今回使用しているタブレットはmicroUSB端子しかないので、microUSB(オス)-USB type-A(メス)のケーブル(セリアとかに在庫残ってるかも)やUSBハブ(ハードオフのジャンクの安いやつでも)、有線キーボード(今回はLogicoolのUnifyingレシーバー接続のキーボード)などが必要になります。よ、用意するものが多い...!

UEFI設定への入り方は面倒なので書きません(かなり面倒だけど本題じゃないので)。

4, 指示に従いOSのインストールを完了させる

見ればわかると思うので飛ばします。

インストール後は再起動して設定に移ります。

5, 指示に従い設定を完了させる

こちらも指示どおりに設定するだけです(英語だけど)。

多分この途中でWi-Fi接続するような...

このときユーザー名とパスワードをよく確認しましょう。

6, 再起動

再起動すればLinuxデスクトップ環境が完成します。

Raspberry Pi OSをWayland環境にする

とりあえず使える状態にはなりましたが今回はもう少し快適に使えるように工夫していきたいと思います。

こだわりが無ければXorgがインストールされた状態でも使えますが、この環境だとアニメーションや動画に切れ込み(2つのフレームが斜めの線を境に同時に表示された状態)が発生しており、見栄えがあまりよくありません。

そのため、なめらかなアニメーション動作に最適なWayland環境を整えていきます。

今回はUbuntuで採用されているGNOMEにしました。

1, GUIでの起動をキャンセルしてCLIのみ起動させる

Raspberry Piの設定」というアプリを開き、起動方法をCLIに変更します。

2, CLI環境でログイン

再起動後、Login:と出たらユーザー名と を、Password:と出たらパスワードをちゃんと手動で入力しましょう。

3, 衝突するパッケージを削除

この後インストールするパッケージと今回インストールするパッケージで色々ぶつかるみたいなので先に削除します。

sudo apt remove pi-session // 確かこんな名前のパッケージだったけどgnomeインストールしようとすると多分パッケージが衝突しているとエラーが出るはずなのでそれを削除する
sudo apt autoremove

4, 色々パッケージをインストール

ここからGNOMEや日本語入力に必要なものをインストールしていきます。

sudo apt update && sudo apt upgrade
sudo apt install --no-install-recommends task-gnome-desktop network-manager-gnome gdm3 gnome-terminal  im-config fcitx5 fcitx5-mozc fcitx5-config-gtk mozc-utils-gui

※この時点でトラブルの種が蒔かれていたりします。

5, 再起動

もろもろインストールし終わったら次のコマンドを実行後再起動します。

sudo systemctl set-default graphical.target

ここでトラブルが起きる

Wi-Fi接続ができない

再起動したらWi-Fiに接続できなくなっていました。

周辺のWi-Fiのスキャンはできるいつもの流れに...なぜ?

原因はNetwork-Managerっぽい

その答えはWi-Fiの管理をdhcpcdからNetwork-Managerに切り替えたことにあるようです。

残念ながら私はネットワーク技術の専門家ではないので原因はわかりませんがdhcpcdに戻せば直るということが判明しました。

もしかしたら今までインストールしてきた64r-bit OSもdhcpcdに切り替えたら常用できたのでは...?

とりあえず使えるようにすることが目的なのでdhcpcd中心の環境に整えていきます。

GNOME with dhcpcd環境を整える

1, Network-Managerの削除

sudo apt remove hetwork-manager-gnome
sudo apt autoremove
sudo systemctl enable dhcpcd.service
sudo systemctl start dhcpcd.service

さらばNetwork-Manager。

2, dhcpcd-uiを依存関係含めてインストール

GNOMEのネットワーク管理画面ではdhcpcdを操作できないためdhcpcd-uiをインストールする必要があります(debianではGTK向けにビルドされたdhcpcd-gtkとして提供されています)。

sudo apt install dhcpcd-gtk gnome-extentions gnome-shell-extention-topicon-plus

3, GNOME-Tweakを有効にしてTopIcon Plueを有効化

dhcpcd-gtkの通知アイコンは現在の素のGNOMEでは表示できないため、古いシステム向けの通知を表示可能にする拡張機能を有効にする必要があります。

"GNOME-Tweaks"、もしくは「拡張機能」を開き、"TopIcon Plus"を有効化します。

4, dhcpcd-gtk自動起動

aptでのインストール時に特に設定されなかったので自分で設定します。

editor ~/.config/gnome-session/dhcpcd-gtk.desktopを実行し、エディターで

[Desktop Entry]
Type=Application
Name=dhcpcd-gtk
Exec=sudo dhcpcd-gtk
Terminal=false

を入力して保存します。

※sudoの権限がゆるゆるなRaspberry Pi OSなのでこの記述をしていますが他のLinuxだと動作しない可能性があるので注意

再起動後、dhcpcd-gtkのアイコンがタスクバーに表示され、Wi-Fiの設定が可能になっているはずです。

まとめ?

今回はタブレットPCGNOME環境構築しようとしたらネットワーク接続でつまずいた話でした。

今まで苦しんできた問題がネットワーク管理サービスを切り替えることで解決できる...正直仕組みが理解できていませんが「こういうこともある」という経験にはなったのでよかったかなー?と思っています。

参考資料

gnomeのスタートアップの設定ファイルはどこ?? -CentOS6のGnomeのス- UNIX・Linux | 教えて!goo

【メモ】UbuntuのGUIを無効にする操作(簡易化)|npl

(自分で書いた記事に助けられるとは思わなかった...)

dhcpcd - ArchWiki

(ArchWikiは偉大)

Debianで余計な物を入れずにGnomeデスクトップをインストールする | 7me

Raspberry Pi OSでGNOME Desktopを使う - Qiita

(ここに書いてある通りにインストールしていたらNetwork-Managerでぶつかった)

ご注文はお決まりですか? | フリーゲーム投稿サイト unityroom

Misskey.ioの広告で見つけたゲーム(面白い)

翻訳中のプロジェクト一覧

自分が翻訳に参加しているプロジェクト一覧です。時間のある人は一緒に翻訳に参加してもらえると自分もプロジェクト元も泣いて喜びます(本当か?)。

Linphone

SIP通話アプリ。Windows,macOS,Linux,iOS,Android対応。

Linphone open source VoIP SIP softphone - voice, video and instant messaging

Linphone Desktopの日本語訳

翻訳状況

Linphone Androidの日本語訳

翻訳状況

Android版の翻訳中心です。

実際のアプリ動作を確認しながら翻訳していますが、Linphoneアカウント作ってない&連絡相手が少なく動作確認がしづらいといった理由で翻訳が止まりかけてます。

KaOS

KDEとQtを主眼に置いたLinuxデスクトップ。x86_64のみ対応。

KaOS – A Lean KDE Distribution

KaOSの翻訳

長文がそこそこ出てきます。タグをつけたりですます調を合わせたりで苦労し一度ギブアップしてます(少しずつ翻訳は進めてます)。

DarkModeLiveWallpaper

壁紙をシステムのダーク・ライトテーマに合わせて切り替えてくれる神アプリ。Android 10以降に対応。

DarkModeLiveWallpaper - F-Droid

翻訳はほとんど完了済み。開発継続中のためたまに翻訳箇所が追加されるかも。

Discreet Launcher

F-Droidで見つけたランチャーアプリ。シンプルなデザインが特徴。

Discreet Launcher

翻訳はほとんど完了済み。開発継続中のためたまに翻訳箇所が追加されるかも。

Xournsl++

PDFにデジタルペンで書き込みできるやつ(正確には新たなレイヤーファイルを作成してそこに描画を保存している)。

Xournal++ - Xournal++

Xournal++の翻訳

UBports Docs

多分手を出してはいけません。

Home - UBports documentation

ユーザーガイド

翻訳状況

アプリ開発

翻訳状況

Regolith Desktop

Swayはいいぞおじさん「Swayはいいぞ」

概要 | Regolith Desktop

Regolith Desktop公式サイトのソースコード

これからもっと増えるかも

自分から翻訳頼みに行くのはちょっとニガテなので、問題意識の高い人が積極的に参加してくれることを願っています…