tsutsuiの作業記録置き場

NetBSDとかPC-6001とかの作業記録のうち、Twitterの140字では収まらない内容や記事としてまとめるべき内容をとりあえず置いてみる予定

mikutter GTK3対応(1) 〜とりあえず動かしてみる〜

上記のツイートのように GTK3版 mikutter はそこそこ動くようになっているものの、現状では「mikutter gtk3」でGoogle検索してもほとんど情報がない状態です。

そこで、私自身で行ってきた mikutter GTK3対応作業を含め、何回かに分けて mikutter GTK3対応について書いてみたいと思います。

↓GTK3版 mikutter画面。タブ形状とTooltipの背景が黒という以外はわからないくらいに同じように使えます

f:id:tsutsuii:20211205141105p:plain

とりあえず動かしてみる

GTK3版の mikutter は今のところソースコード tar ball 等は用意されておらず、開発版のツリーを取得して動かす必要があります。

また、前述のツイートの通りで、 mikutter 動作に必要な Rubygtk3 gemについても ruby-gnome 3.5.0 が出るまではイレギュラーな暫定対応が必要です。

mikutterソースコードgit

mikutterのページdevelopのページの「開発版」の項にある通り、 mikutter のソースツリーは git://mikutter.hachune.net/mikutter.git の Gitでメンテされているため、そこから取得することになります。githubにも mikutter のコードが置かれていますが何かあったときのバックアップ扱いです

mikutterの Gitでは、リリース版(現状だと mikutter 4.1.x系)が master ブランチ、次の開発版(現状だと mikutter 4.2系)が develop ブランチ、 Redmineの各チケット案件別の対応ツリーが topic/[チケット番号]-[案件名] ブランチという管理構成を採っています。

本来であればGTK3版についても「次の開発版」という位置づけになりそうなものですが、 mikutter GTK3対応の歴史的経緯(?)から、GTK3版は Redmineチケット887 に対応する topic/887-gtk3 ブランチで管理されています。
mikutter の gtk3対応の歴史その他については次回以降のエントリで書く予定

GTK3ブランチ取得

mikutter などというクライアント、それも GTK3版を動かそうという方で git が入っていない人などいないという気はしますが、まずは各システムのパッケージシステムその他から git をインストールしてください。

NetBSDであれば

su
pkg_add -u https://cdn.netbsd.org/pub/pkgsrc/packages/NetBSD/`uname -p`/`uname -r`/All/git-base

ubuntu等であれば

sudo apt install git

等でいけると思います。

mikutter GTK3ツリーの取得は以下でできると思います。

git clone git://mikutter.hachune.net/mikutter.git ~/mikutter
cd ~/mikutter git switch topic/887-gtk3

※2021/12/14追記

2021/12/12 に無事に(?) topic/887-gtk3 ブランチが develop ブランチにマージされたので、今は git clone 後に

git switch develop

としてください。

追記ここまで

ruby-gnome開発版のインストール

※2021/12/11追記

このブログエントリを見た(?) shibafu528さんにより、 mikutter GTK3版に対して 提案 #1551: gtk3: ruby-gnome 3.4.9でも動くようにする - mikutter - やること黒魔術(?)パッチが投稿され、ほどなく toshi_a さんによりマージされました。

dev.mikutter.hachune.net

このため、2021/12/10以降の mikutter topic/887-gtk3 ブランチであれば、 ruby-gnome 3.4.9 リリース版でも動作するようになっています。

追記ここまで

冒頭のツイートにあるとおり、 mikutter GTK3版を動作させるにはリリース済みの ruby-gnome 3.4.9 ではダメで、最低限以下の2つの修正および変更を取り込んだものが必要です。

  • commit:554fe3e 親の親(およびそれ以上)のクラスの virtual function の修正
  • commit:73f123c pango gemのモジュール名の変更

特に後者の変更が別のRactor関連の変更の後に行われているため単独で cherry-pick することができず、機械的作業で対応しようとするとかなりの量のコミットを持ってくるハメになります。

とりあえず私の手元で確認用に fork したブランチではこれだけのgithub差分がありました。こんなにあるなら最新版を持ってきても変わらないという話もありますが、後述の pkgsrc 差分を作るのに不要なものは除きたかったので

とりあえず試す手順としては以下のいずれかになると思います。

  • 必要な差分を当てた状態のオレオレパッケージを作成する
  • インストール済みの ruby-gnomeの各gem (glib2 gobject-introspection gio2 pango gdk3 gtk3) の *.rb ファイルを必要な差分の当たった更新版のファイルと差し替える
  • mikutter の GTK3ブランチ付属の Gemfile を使って bundler により git最新版ベースの gem を作ってインストールする

環境にもよりますが、どれもある程度強引な方法なので、元に戻す方法の見当がつく中級者以上向けの内容になると思います。

なお、以下の記述では、すでに現状の mikutter 4.1.7 が動いている環境、つまり GTK3関連以外の必要なパッケージがインストール済みである前提で、それらの説明は省略しています。

(1) ローカル差分を当てたpkgsrcを作成する

とりあえず自分自身の NetBSD環境でのテスト用に pkgsrc-2021Q3 に対する差分ファイル一式を用意してあります。また、NetBSD/i386 9.2 および NetBSD/amd64 9.2 についてはバイナリパッケージも作成してあります。

バイナリパッケージを使う場合は以下のサーバーにこちらで作成したバイナリが置いてあります。

NetBSD/i386 9.2:

pkg_add -u http://teokurebsd.org/netbsd/packages/i386/9.2_2021Q3/All/ruby27-gtk3-3.4.9nb1.tgz

NetBSD/amd64 9.2:

pkg_add -u http://teokurebsd.org/netbsd/packages/x86_64/9.2_2021Q3/All/ruby27-gtk3-3.4.9nb1.tgz

自分自身で pkgsrc-2021Q3 からバイナリパッケージを作成する場合は、 pkgsrc-2021Q3 のツリーに対して以下の tar ball のファイルを上書きして ruby-gtk3 および依存パッケージをビルドしてください。

http://teokurebsd.org/netbsd/tmp/pkgsrc-2021Q3_ruby-gnome-3.4.9nb1_for_mikutter_gtk3.tar.gz

含まれているファイルは以下:

devel/ruby-glib2/Makefile
devel/ruby-glib2/distinfo
devel/ruby-glib2/buildlink3.mk
devel/ruby-glib2/patches/patch-ext_glib2_rbglib__error.c
devel/ruby-glib2/patches/patch-ext_glib2_rbgobj__boxed.c
devel/ruby-glib2/patches/patch-ext_glib2_rbgobj__closure.c
devel/ruby-glib2/patches/patch-ext_glib2_rbgobj__enums.c
devel/ruby-glib2/patches/patch-ext_glib2_rbgobj__flags.c
devel/ruby-glib2/patches/patch-ext_glib2_rbgobj__object.c
devel/ruby-glib2/patches/patch-ext_glib2_rbgobj__param.c
devel/ruby-glib2/patches/patch-ext_glib2_rbgobj__signal.c
devel/ruby-glib2/patches/patch-ext_glib2_rbgobj__type.c
devel/ruby-glib2/patches/patch-ext_glib2_rbgprivate.h
devel/ruby-gio2/Makefile
devel/ruby-gio2/distinfo
devel/ruby-gio2/buildlink3.mk
devel/ruby-gio2/patches/patch-lib_gio2_loader.rb
devel/ruby-gobject-introspection/Makefile
devel/ruby-gobject-introspection/distinfo
devel/ruby-gobject-introspection/buildlink3.mk
devel/ruby-gobject-introspection/patches/patch-ext_gobject-introspection_rb-gi-arguments-out.c
devel/ruby-gobject-introspection/patches/patch-ext_gobject-introspection_rb-gobject-introspection.c
devel/ruby-gobject-introspection/patches/patch-lib_gobject-introspection_loader.rb
devel/ruby-gobject-introspection/patches/patch-lib_gobject-introspection_type-tag.rb
devel/ruby-gobject-introspection/patches/patch-test_test-loader.rb
devel/ruby-pango/Makefile
devel/ruby-pango/distinfo
devel/ruby-pango/buildlink3.mk
devel/ruby-pango/patches/patch-lib_pango.rb
devel/ruby-pango/patches/patch-lib_pango_cairo-loader.rb
devel/ruby-pango/patches/patch-lib_pango_fc-loader.rb
devel/ruby-pango/patches/patch-lib_pango_ft2-loader.rb
devel/ruby-pango/patches/patch-lib_pango_loader.rb
devel/ruby-pango/patches/patch-lib_pango_ot-loader.rb
graphics/ruby-gdk3/Makefile
graphics/ruby-gdk3/distinfo
graphics/ruby-gdk3/buildlink3.mk
graphics/ruby-gdk3/patches/patch-lib_gdk3.rb
graphics/ruby-gdk3/patches/patch-lib_gdk3_loader.rb
graphics/ruby-gdk3/patches/patch-lib_gdk3_x11-loader.rb
x11/ruby-gtk3/Makefile
x11/ruby-gtk3/distinfo
x11/ruby-gtk3/buildlink3.mk
x11/ruby-gtk3/patches/patch-lib_gtk3_loader.rb
graphics/ruby-clutter/Makefile
graphics/ruby-clutter/distinfo
graphics/ruby-clutter/patches/patch-lib_clutter.rb
multimedia/ruby-gstreamer/Makefile
multimedia/ruby-gstreamer/distinfo
multimedia/ruby-gstreamer/patches/patch-lib_gst.rb
multimedia/ruby-gstreamer/patches/patch-lib_gst_base-loader.rb
multimedia/ruby-gstreamer/patches/patch-lib_gst_controller-loader.rb
multimedia/ruby-gstreamer/patches/patch-lib_gst_loader.rb
multimedia/ruby-gstreamer/patches/patch-test_run-test.rb

なお ruby-clutterruby-gstreamer については mikutter を使うだけならビルドは不要です。

(2) インストール済みの各gemの *.rb ファイルを差し替える

ruby-gnome で必要になる差分の中には C言語で記述された extension のソースもありますが、とりあえず強引に *.rb ファイルだけを差し替えてもとりあえず mikutter は起動するようです。よって、すでにパッケージシステムその他でインストールした ruby-gnome 3.4.9 の各gemのインストール済みの *.rb ファイルを必要なファイルに置き換えるという方法も一応アリです。

pkgsrc-2021Q3 の場合は /usr/pkg/lib/ruby/gems/2.7.0/gems 以下に、 ubuntu 20.04 の apt の場合は /var/lib/gems/2.7.0/gems 以下に gem関連のファイルが置かれるようなので、その中の必要な *.rb ファイルをオレオレruby-gnomeツリーから持ってきたファイルに置き換える、という操作をすることになります。

具体的には、以下のファイルを置き換えればいけると思います。当然ながら無保証です

gdk3-3.4.9/lib/gdk3.rb
gdk3-3.4.9/lib/gdk3/loader.rb
gdk3-3.4.9/lib/gdk3/x11-loader.rb
gio2-3.4.9/lib/gio2/loader.rb
gobject-introspection-3.4.9/lib/gobject-introspection/loader.rb
gobject-introspection-3.4.9/lib/gobject-introspection/type-tag.rb
gtk3-3.4.9/lib/gtk3/loader.rb
pango-3.4.9/lib/pango.rb
pango-3.4.9/lib/pango/cairo-loader.rb
pango-3.4.9/lib/pango/fc-loader.rb
pango-3.4.9/lib/pango/ft2-loader.rb
pango-3.4.9/lib/pango/loader.rb
pango-3.4.9/lib/pango/ot-loader.rb
(3) mikutterの Gemfile による bundler を使って gemをインストールする

mikutter は rubybundler gem と Gemfile の記述によるインストールにも対応しています。bundlerの仕組みについては適当にググってもらうとして、GTK3版のブランチの mikutter の plugin/gtk3/Gemfile には以下のような通常の Gemfile の記述とは異なる黒魔術(?)が入っています。

source 'https://rubygems.org'

git 'https://github.com/ruby-gnome/ruby-gnome', ref: '554fe3ebba5da5f4b1f61ac7b5e6121be1b32b51' do
  gem 'gtk3'
end

このため、通常の bundler 操作でも GTK3版 mikutterに対応した ruby-gnome の各gemがインストールされます。

私自身は pkgsrc 環境がメインのため bundler の設定をよくわかっていませんが、 ubuntu 20.04 の場合は以下のように bundler gem を設定すれば mikutter を起動できるようになるようです。

sudo apt install ruby-dev ruby-bundler
cd [mikutter topic/887-gtk3 ブランチを展開したディレクトリ]
sudo bundle install

手元の virtualbox 環境での実行結果は以下のような感じです。

tsutsui@ubuntu-vbox:~/mikutter$ sudo bundle install
Don't run Bundler as root. Bundler can ask for sudo if it is needed, and
installing your bundle as root will break this application for all non-root
users on this machine.
Using rake 13.0.6
Using public_suffix 4.0.6
Using addressable 2.7.0
Using native-package-installer 1.1.1
Using pkg-config 1.4.6
Using glib2 3.5.0 from https://github.com/ruby-gnome/ruby-gnome (at 554fe3e@554fe3e)
/usr/lib/ruby/2.7.0/rubygems/ext/builder.rb:165: warning: conflicting chdir during another chdir block
/usr/lib/ruby/2.7.0/rubygems/ext/builder.rb:173: warning: conflicting chdir during another chdir block
Using atk 3.5.0 from https://github.com/ruby-gnome/ruby-gnome (at 554fe3e@554fe3e)
/usr/lib/ruby/2.7.0/rubygems/ext/builder.rb:165: warning: conflicting chdir during another chdir block
/usr/lib/ruby/2.7.0/rubygems/ext/builder.rb:173: warning: conflicting chdir during another chdir block
Using bundler 2.1.4
Using matrix 0.4.2
Using red-colors 0.3.0
Using cairo 1.17.5
Using cairo-gobject 3.5.0 from https://github.com/ruby-gnome/ruby-gnome (at 554fe3e@554fe3e)
/usr/lib/ruby/2.7.0/rubygems/ext/builder.rb:165: warning: conflicting chdir during another chdir block
/usr/lib/ruby/2.7.0/rubygems/ext/builder.rb:173: warning: conflicting chdir during another chdir block
Using rexml 3.2.5
Using crack 0.4.5
Using delayer 1.2.1
Using delayer-deferred 2.2.0
Using diva 1.1.1
Using gobject-introspection 3.5.0 from https://github.com/ruby-gnome/ruby-gnome (at 554fe3e@554fe3e)
/usr/lib/ruby/2.7.0/rubygems/ext/builder.rb:165: warning: conflicting chdir during another chdir block
/usr/lib/ruby/2.7.0/rubygems/ext/builder.rb:173: warning: conflicting chdir during another chdir block
Using gio2 3.5.0 from https://github.com/ruby-gnome/ruby-gnome (at 554fe3e@554fe3e)
/usr/lib/ruby/2.7.0/rubygems/ext/builder.rb:165: warning: conflicting chdir during another chdir block
/usr/lib/ruby/2.7.0/rubygems/ext/builder.rb:173: warning: conflicting chdir during another chdir block
Using gdk_pixbuf2 3.5.0 from https://github.com/ruby-gnome/ruby-gnome (at 554fe3e@554fe3e)
/usr/lib/ruby/2.7.0/rubygems/ext/builder.rb:165: warning: conflicting chdir during another chdir block
/usr/lib/ruby/2.7.0/rubygems/ext/builder.rb:173: warning: conflicting chdir during another chdir block
Using pango 3.5.0 from https://github.com/ruby-gnome/ruby-gnome (at 554fe3e@554fe3e)
/usr/lib/ruby/2.7.0/rubygems/ext/builder.rb:165: warning: conflicting chdir during another chdir block
/usr/lib/ruby/2.7.0/rubygems/ext/builder.rb:173: warning: conflicting chdir during another chdir block
Using gdk3 3.5.0 from https://github.com/ruby-gnome/ruby-gnome (at 554fe3e@554fe3e)
/usr/lib/ruby/2.7.0/rubygems/ext/builder.rb:165: warning: conflicting chdir during another chdir block
/usr/lib/ruby/2.7.0/rubygems/ext/builder.rb:173: warning: conflicting chdir during another chdir block
Using locale 2.1.3
Using text 1.3.1
Using gettext 3.3.9
Using gtk3 3.5.0 from https://github.com/ruby-gnome/ruby-gnome (at 554fe3e@554fe3e)
/usr/lib/ruby/2.7.0/rubygems/ext/builder.rb:165: warning: conflicting chdir during another chdir block
/usr/lib/ruby/2.7.0/rubygems/ext/builder.rb:173: warning: conflicting chdir during another chdir block
Using hashdiff 1.0.1
Using httpclient 2.8.3
Using instance_storage 1.0.0
Using memoist 0.16.2
Using mini_portile2 2.6.1
Using mocha 1.13.0
Using moneta 1.4.2
Using racc 1.6.0
Using nokogiri 1.12.5 (x86_64-linux)
Using oauth 0.5.8
Using pluggaloid 1.7.0
Using power_assert 2.0.1
Using ruby-prof 1.4.3
Using test-unit 3.5.1
Using typed-array 0.1.2
Using webmock 3.13.0
Bundle complete! 18 Gemfile dependencies, 42 gems now installed.
Use `bundle info [gemname]` to see where a bundled gem is installed.

bundlesudo 付きで起動すると上記の通りいろいろ警告されるのですが、 sudo なしで実行すると glib2 gem の extension のビルドでパーミッション関連で怒られたような……。細かいところは ubuntu および bundler に詳しい方にお任せしたい

ただ、 apt のようなパッケージシステムがインストールファイルを管理しているであろう環境で bundler により gem を置き換えた場合にどうなるのかというのはよくわかっていません。このあたりは自己責任でお願いします。

mikutterの起動

ここまででだいぶ力尽きている感じですが、デフォルトでサポートされている Mastodon のクライアントとして使うだけならこれで mikutter の起動は可能です。

pkgsrc のように bundler を使わずに環境設定をした場合は以下のように環境変数 DISABLE_BUNDLER_SETUP1 に設定して mikutter ソースツリーの mikutter.rb を引数に ruby を起動します。人柱テストとしては --debug オプションも指定したほうが良いでしょう。

$ DISABLE_BUNDLER_SETUP=1 ruby27 mikutter.rb --debug

csh系 shellなら以下

% env DISABLE_BUNDLER_SETUP=1 ruby27 mikutter.rb --debug

bundler で設定した場合はそのまま mikutter.rb を指定して起動すればOKです。

$ ruby mikutter.rb --debug

mastodonなんてやってないよ」という方も、 mikutterを使うのであればせっかくなので https://social.mikutter.hachune.net/ に登録して toshi_a さんの動向を観察するのもよいのではないでしょうか。

サードパーティープラグインのGTK3対応

toshi_aさんのプレゼンにもあるとおり、各ユーザーが作成したプラグインで各種の機能拡張ができることがmikutterの大きな特徴です。これらの各種プラグインについても、 GTKに依存しているものは GTK3対応の修正が必要になる場合があります。

変更内容の詳細については mikutter本体のGTK3対応と合わせて別エントリで書く予定なので、ここでは対応状況の説明のみを記載します。

Twitterプラグイン

github.commikutter 4.0からはオプションになった、 mikutterで Twitterを使うためのプラグインです。

Twitterを使うためには mikutter に対して機能別の複数のプラグインのインストールが必要ですが、上記 twitter_bootstrap のページに記載のあるワンライナーもしくは twitter-bootstrap.shスクリプトを実行することで必要なプラグイン一式をインストール可能です。

なお、実際に Twitterを利用するには別途 twitter_api_keys プラグインによるコンシューマーキーの登録が必要ですが、その設定についてはGTK3版固有の話ではないので説明は割愛します。

各種TwitterプラグインのGTK3対応については、私の方で作業していた変更本家mikutter側のgithubにそれぞれマージしてもらっているので、上記のワンライナーもしくは twitter-bootstrap.shスクリプトを実行すればそのまま GTK3版として使用可能です。逆に、現状ではタグやバージョンを指定していないので従来のGTK2版でこのまま設定すると動かなくなっています。そのうちなんとかするかも

各種Twitterプラグインのうち、実際にGTK3対応の変更が入っているのは以下の6つです。

sub-parts-clientプラグイン

github.com"via client名" の形式の投稿クライアント名を追加するプラグインです。Twitterだけでなく Mastodonの投稿にも対応しています。

GTK3 対応と言っても、プラグイン中の .mikutter.yml plugin: 行に続く依存プラグイン記述の gtkgtk3 に書き換えるだけでOKです。

mikutter-uwm-hommageプラグイン

github.com謎のプラグイン名ですが、Twitterでの画像投稿を可能にするプラグインです。 hommage というのは「オマージュ」ですね

こちらは私で fork した GTK3対応版ブランチでそれなりに動いているのでそちらを git clone してください。

$ mkdir -p ~/.mikutter/plugin; git clone https://github.com/tsutsui/mikutter-uwm-hommage.git ~/.mikutter/plugin/mikutter-uwm-hommage

mikutter本体側で GTK3版が正式リリースされたら正式に pull request を出そうと思っています。

subparts_imageプラグイン

github.com説明通り、メッセージに添付された画像を mikutter タイムライン中に表示するプラグインです。 Twitter だけでなく Mastodon トゥートの添付画像、各種画像サービスの画像のプレビューにも対応しています。

こちらは shibafu528 さんによる GTK3版の fork が作成されていますので、それをそのまま使えばOKです。※誤記訂正 2021/12/6 thanks shibafu528さん

$ mkdir -p ~/.mikutter/plugin; git clone https://github.com/shibafu528/mikutter-subparts-image.git ~/.mikutter/plugin/mikutter-subparts-image
その他のプラグイン

その他のプラグインで GTK3対応についてはとりあえず以下のようになると思います

  • .mikutter.yml を見て gtk プラグインに依存しているかを確認し、依存していたらとりあえず gtk3 に書き換えてみる
    プラグインによっては gtk に依存していても依存関係が明示的に記載されていないものがあるので注意
  • mikutter を --debug オプション付きで起動してプラグインが意図通り動いているかを見る
  • 動いていないようであれば頑張って GTK3対応を調べる 詳細は次回以降のエントリで

mikutter GTK3版 バグレポート

mikutter Redmine の「バージョン」の 「gtk3」 「5.0」で検索すると gtk3関連のチケット一覧を確認可能です。※2021/12/12追記: toshi_aさんにより「gtk3」バージョンが正式に「5.0」の名称に変更されました

個人的には使い勝手に関連する以下が直るといいなと思っていますが、これらはそもそも GTK3版で使用する Widget が変更されたところなので、従来どおりの動作が可能なのかは不透明です。

mikutter GTK3版のリリースについて

例年であれば mikutter の誕生日である 12月25日に新バージョンのリリースが行われるのが常で、 GTK3版についても今年の 12月25日に mikutter 5.0 としてリリースされる構想はあるようなのですが、上述の toshi_a さんのトゥートにある通り ruby-gnome 3.5.0 のリリースがどうなるかにかかっている、という状況です。

ruby-gnome 最新版の正式リリースが行われない場合、このエントリで説明したようにインストールがかなり煩雑なので、現状では先行き不透明な状況です。

まあ、お互い趣味活動のオープンソース活動なので、時が来ればなるようになることを期待したいと思います。