mikutter blog

mikutterのアナウンスなど

mikutter 4.0の新機能

はじめに

mikutter 4.0の季節がやってきました。

10年もmikutterを開発してしまったやぞ、後悔してもておくれや

メジャーバージョンアップについて

mikutterは、2014年6月8日に3.0をリリースして以来 、5年半ぶりのメジャーアップデートを行います。

今回メジャーバージョンをインクリメントする理由は2つあります。

ひとつは、10周年という佳節に、華々しいバージョンアップをしたかったから。

もうひとつは、ユーザにとって非互換といって差し支えない変更を行うからです。

単にお祝いでメジャーバージョンを上げるなら大手を振って喜べるところでしたが、10年前のプラグインが動くmikutterに、遂に互換性のない変更が行われるというのは、私達にとっては大きな事件です。

アップデート内容

Twitterプラグインサードパーティプラグイン

10年間Twitterクライアントとして使われてきたmikutterですが、4.0にはTwitterプラグインをバンドルしないことになりました。

これによって、Worldプラグインが実装されたmikutter 3.6以前に開発された、Twitterにしか対応していなかったmikutterを前提にした一部のプラグインは動かなくなります。そして、なによりmikutterでTwitterを使えなくなります。

しかし、もともとバンドルされていたTwitterプラグインは下記のURLに書かれている手順でサードパーティプラグインとしてインストールできます。4.0以降でも、プラグインとしてTwitterをインストールすることで、今までどおりTwitterを使えます。

https://github.com/mikutter/twitter_bootstrap

決定の経緯については折りに触れて説明してきましたが、mikutterのTwitterコンシューマキーが凍結されましたなどを参照してください。

Serviceの廃止

Serviceモジュールが廃止されます。

mikutterのリビジョン1にはPostクラスというものがありました。 これはTwitterと通信するためのもので、Twitterアカウントひとつに対してインスタンスが作られるため、シングルトンのようなものになっていました。 もともとbotフレームワークとして作られたmikutterは、ツイート、特にリプライを返すことが急務だったため、投稿を表すPostという名前になっていました。

Twitterクライアントとして成長し、Postクラスはフォローやふぁぼといった全く関係ない機能も担当するようになってしまっており、より抽象的なServiceという名前になりました。 Twitterクラスにしかなった理由は、リビジョン1の頃からTwitter以外に対応することを目標にしていて、この頃にもまだ、いつかはプラグインでサービスを拡張できるようにしようと思っていたからです。

しかし、Serviceによる抽象化は不十分で、mikutter 3.6ではWorldプラグインに置き換えられました。 Serviceがmikutter本体の機能だったのに対して、Worldは全てをプラグインの範囲でやってのけました。 この時にServiceクラスは廃止され、代わりにWorldプラグインがServiceモジュールを提供し、いくつかの利用頻度が高い機能、たとえば Service.#primary などを提供していました。

一方で、Serviceを使っているプラグインは、それがTwitter Worldであることを暗に期待しており、突然全く関係のないWorldを返した場合、メソッドが実装されていないなど、互換性が失われます。 そこでServiceモジュールには、Twitter Worldしか見えないようにするハックが入っていました。 Serviceを使う古いプラグインにはTwitterしか見えないので、大きな問題が起こらなかったのです。 このことによって目立った非互換は起こらなかったので、mikutter 4.0は3.6としてリリースされることになりました。

どのみち4.0にするなら、このタイミングでServiceクラスを削除しておこうというのが今回の決断です。

bootイベントはDeprecateに

よく、mikutterプラグインで、起動時に実行されて欲しいコードをbootイベントの中で書く、という文化がありました。 しかし、3.0の頃から、bootイベントは直感に反する挙動をするので、使用は控えられていました。

初期化処理をするならプラグインコンテキストに書けば良いですし、ロードが完了した後に実行する必要があるのであれば、 Delayer.new { ... } を使えば良いので、今更ではありますが利用しているプラグインがあれば修正をおすすめします。

こちらは正式にDeprecateになっただけで、まだ利用はできます。 ただ、このイベントには今まで最初のWorldがひとつ引数として渡されていましたが、常にnilが渡されるようになりました。 nilを渡すこと自体は、今までもWorldが一つも登録されていない時には起こっていた挙動です。

miquireを廃止

これはプラグインには影響がないことですが、一応。 mikutter本体だけで使われていたローダー、miquireが廃止されました。

ruby 1.8のrequireの挙動の問題の回避と(昔のこと過ぎて何が問題だったのかは忘れた)、mikutterにはコマンドラインオプションでロードするファイルを切り替える機能があったのですが、今はどちらも無いので、requireを使うように書き換えています。

プラグインでmiquireを呼び出している場合は、単純にそれを削除してください。 requireに書き換える必要はありません 。というのも、miquireでロードする本体のファイルは、プラグインがロードされる頃には全て読み込まれているため、もともと書いておく必要がなかったのです。

もしmiquireの呼び出しを単純に削除してクラッシュするようになったプラグインがあれば、mikutter本体のバグとして、そのプラグインのコードを添えて報告してください。

イベントループをGtkではなく常に独自処理を使うようになった

mikutterは独自にメインループを持っていましたが、Gtkプラグインを有効にしていると、GtkのメインループからDelayerキューをpopするようになっていました。

しかし、この実装だとたまにFiberError例外の発生が仕様上避けがたいことがわかったので、速度上特にペナルティもないことから、Gtkプラグインのときの特別な処理をやめました。

汎用Modelビューアのタブの並び順を変更できるようになった

Mastodonのユーザプロフィールのタブの中のタブ(フラグメント)などを並び替えた場合、その順番が記録され、以降に開かれる同種のタブでは、フラグメントの並び順としてそれが使われます。

タブを開いた時に最初に選択されるのは一番左のフラグメントなので、最初から開いておくフラグメントを設定できるようになりました。

Ruby 2.5以降をサポート(2.4系のサポートを終了)

Ruby 2.4は、2020年3月末を以てサポートを終了することが決定されています。

https://www.ruby-lang.org/ja/news/2019/10/02/ruby-2-4-9-released/

少し早いですが、mikutter 4.0では、要求するRubyのバージョンを2.5に引き上げます。

tarballへのgemのバンドルをやめる

現在、tarballにはNative Extensionを含まないgemはバンドルされています。

bundlerを使っていなかった頃は、gemのをバンドルしておくことでインストールの手間を削減しようとしていましたが、最早bundlerを使うことが当たり前になっていることや、Gemfileをもったプラグインがあることを考えれば、却って状況をややこしくしています。

更に、Appimageの配布開始などでtarballのダウンロード数が減っていることから、単にgitリポジトリをarchiveしたものを配布することにしました。

書き忘れていること

書き忘れたことです。

リリース日

mikutterの開発開始からちょうど10年となる、2019年12月25日時点の内容をリリースします。