GTK3版 mikutter テスト中。
— Izumi Tsutsui (@tsutsuii) 2021年10月11日
ruby-gnome 3.4.9 では起動せず、 ruby-gnome の gtk3 gdk3 gio2 pango gobject-introspection のそれぞれの最新リビジョンが必要なので、 ruby-gnome 3.5.0 が早く出ませんかー、というところ pic.twitter.com/DkFNMdjMsC
上記のツイートのように GTK3版 mikutter はそこそこ動くようになっているものの、現状では「mikutter gtk3」でGoogle検索してもほとんど情報がない状態です。
そこで、私自身で行ってきた mikutter GTK3対応作業を含め、何回かに分けて mikutter GTK3対応について書いてみたいと思います。
↓GTK3版 mikutter画面。タブ形状とTooltipの背景が黒という以外はわからないくらいに同じように使えます
とりあえず動かしてみる
GTK3版の mikutter は今のところソースコード tar ball 等は用意されておらず、開発版のツリーを取得して動かす必要があります。
また、前述のツイートの通りで、 mikutter 動作に必要な Rubyの gtk3 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 さんによりマージされました。
このため、2021/12/10以降の mikutter topic/887-gtk3 ブランチであれば、 ruby-gnome 3.4.9 リリース版でも動作するようになっています。
追記ここまで
冒頭のツイートにあるとおり、 mikutter GTK3版を動作させるにはリリース済みの ruby-gnome 3.4.9 ではダメで、最低限以下の2つの修正および変更を取り込んだものが必要です。
特に後者の変更が別の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 についてはバイナリパッケージも作成してあります。
バイナリパッケージを使う場合は以下のサーバーにこちらで作成したバイナリが置いてあります。
pkg_add -u http://teokurebsd.org/netbsd/packages/i386/9.2_2021Q3/All/ruby27-gtk3-3.4.9nb1.tgz
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-clutter
と ruby-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 は ruby の bundler 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.
bundle
を sudo
付きで起動すると上記の通りいろいろ警告されるのですが、 sudo
なしで実行すると glib2 gem の extension のビルドでパーミッション関連で怒られたような……。細かいところは ubuntu および bundler に詳しい方にお任せしたい
ただ、 apt のようなパッケージシステムがインストールファイルを管理しているであろう環境で bundler により gem を置き換えた場合にどうなるのかというのはよくわかっていません。このあたりは自己責任でお願いします。
ubuntu でも bundler でゴニョゴニョすると gtk3版 mikuter 動きます(適当に現状まとめブログを書く予定) pic.twitter.com/472HyVC2jy
— Izumi Tsutsui (@tsutsuii) 2021年12月4日
mikutterの起動
ここまででだいぶ力尽きている感じですが、デフォルトでサポートされている Mastodon のクライアントとして使うだけならこれで mikutter の起動は可能です。
pkgsrc のように bundler を使わずに環境設定をした場合は以下のように環境変数 DISABLE_BUNDLER_SETUP
を 1
に設定して 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つです。
- followingcontrol
- list_for_profile
- list_settings
- message_detail_view
- message_retweet
- user_detail_view
sub-parts-clientプラグイン
github.com"via client名" の形式の投稿クライアント名を追加するプラグインです。Twitterだけでなく Mastodonの投稿にも対応しています。
GTK3 対応と言っても、プラグイン中の .mikutter.yml
の plugin:
行に続く依存プラグイン記述の gtk
を gtk3
に書き換えるだけで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 が変更されたところなので、従来どおりの動作が可能なのかは不透明です。
-
バグ #1528: gtk3: TL先頭を表示していない場合でもメッセージ受信でTLがスクロールする - mikutter - やること
-
バグ #1541: gtk3: TLタブを再選択したときにTL表示位置が選択中メッセージ位置に移動してしまう - mikutter - やること
mikutter GTK3版のリリースについて
例年であれば mikutter の誕生日である 12月25日に新バージョンのリリースが行われるのが常で、 GTK3版についても今年の 12月25日に mikutter 5.0 としてリリースされる構想はあるようなのですが、上述の toshi_a さんのトゥートにある通り ruby-gnome 3.5.0 のリリースがどうなるかにかかっている、という状況です。
ruby-gnome 最新版の正式リリースが行われない場合、このエントリで説明したようにインストールがかなり煩雑なので、現状では先行き不透明な状況です。
まあ、お互い趣味活動のオープンソース活動なので、時が来ればなるようになることを期待したいと思います。