mikutter blog

mikutterのアナウンスなど

mikutter 3.9の新機能

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

今年の12月25日で10年目を迎えます。これまで明確なスケジュールを立てずにやってきたmikutterですが、10年の節目を迎えるにあたってメジャーバージョンアップを行い、mikutter 4.0をリリースすることにしました。

今年一年でどこまで実装できるかは分かりませんが、一旦途中経過をmikutter 3.9としてリリースする予定です。

Mastodonプラグイン

現在バンドルされているWorld追加系のプラグインTwitterのみですが、新たにMastodonもバンドルプラグインになります。

今までも Worldon などのサードパーティプラグインMastodonを利用できましたが、今回Worldonをカスタマイズしたものをバンドルすることになります。ユーザとしては大したインパクトはないですが、対外的にはMastodonに対応したという受け取り方をしてもらえるかもしれません。

Mastodonプラグインは、次のような機能を提供します。

  • World連携: Mastodon Worldを提供します。アカウント追加ウィザードなどでMastodonを選択できるようになるほか、アカウント切り替え機能でTwitterMastodonを切り替えられます。

f:id:toshi_a:20190421133426p:plain
臨機応変なみくったーちゃん

  • タイムライン: Twitter同様、タイムラインにTootが表示できます。
  • Extract連携: データソースとしてMastodonの様々なタイムラインを利用し、ミックスできます。複数の外部インスタンスのLTLをミックスしたり、Twitterのタイムラインとミックスしたり。

f:id:toshi_a:20190421134104p:plain
抽出タブの設定例。TwitterMastodonで「mikutter」を含むツイート、トゥートを検索し、ミックスしている

現在のWorldonプラグインに加えて、以下のような変更があります。

  • Plugin slugの変更: mastodon となります。
  • Toot、アカウントの表示: Twitter同様、拡張可能な詳細画面が実装されます。
  • i18n: 他のバンドルプラグイン同様、transifexで翻訳者の貢献を集められます。
  • プロフィールタブ: リッチなプロフィールタブが実装されました(6月8日追加)

UIスケーリング対応(6月8日追加)

f:id:toshi_a:20190608184338p:plain

ディスプレイのピクセル密度が高い場合、mikutterのUIがかなり小さく表示されてしまうという問題がありました。 しかも、Gtkは自動的にUIをスケーリングしてくれるのに対して、mikutterの画像やタイムラインはスケーリングが効かないので、Gtkの文字だけやたらでかい、という状態になっていました。

今回のアップデートで、UIのスケールを、1倍、1.5倍、2倍、自動(デフォルト)の4つから選べるようになりました。

自動というのは、ディスプレイのDPI(1インチあたりのピクセル数)から、96dpiを基準に拡大率を自動的に算出します。私の環境もいわゆるhidpi環境なので、自動にすると1.61倍に拡大されました。

ショートカットキーにWorldアカウントを割り当てる

自由度が高いmikutterのショートカットキー設定ですが、新たにWorldアカウントの割り当てが可能になります。

今までのコマンドは、コマンドが実行された時に選択されているWorld (Current Account)を対象にしていました。結果、たとえばfキーにふぁぼを割り当てている場合、fを押すとCurrent Accountでふぁぼりました。

これを実現するために、ほとんどすべてのコマンドが、Current Accountを取得するコードを書く必要がありました。具体的には以下のようなものです。

world, = Plugin.filtering(:world_current, nil)

もともとコマンドのコールバックには、リクエストオブジェクト(だいたいみんな opt という変数にバインドして使ってる)が渡されますが、これに world メソッドが追加され、対象とすべきWorldを返します。要するに、先程挙げた決まり文句は、これからは以下のようになります。

world = opt.world

短いので、いちいち変数にバインドすることもないでしょう。更に、 opt.world はCurrent Accountを返すとは限りません。本題の「ショートカットキーにWorldアカウントを割り当てる」機能で割り当てられたWorldがあれば、Current Accountを無視してそれが渡されます。

Worldアカウントの並び替え(6月8日追加)

f:id:toshi_a:20190608190822p:plain

設定画面のアカウント情報で、アカウントをドラッグ&ドロップすることでアカウントを並び替えることができるようになりました。

スキンにPNG画像以外を利用可能に

いままで、 Skin['notfound.png'] のようなコードで、設定でユーザが選択したスキンから画像を探索し、対応するPhoto Modelを得ることができていました。ファイル名を明示してしまっているためにpng画像しか使えないという問題がありました。

3.9からは、拡張子抜きで指定できるようになり、Symbolも許容されます。したがって以下のように書くことができます。

Skin[:notfound]

更に、スキン側もSVGPNGなどの、PNG以外の画像形式を提供できるようになります。

拡張子を指定する従来の方法も引き続き利用可能です。その場合は画像ファイル名を厳密に指定したことになるため、スキン側がPNG画像を提供していない場合、デフォルトスキンが使われます。

汎用Modelビューア(6月8日追加)

f:id:toshi_a:20190608185437p:plain

特定のModelクラスのインスタンスの詳細な情報を見るためのタブを、Gtkを使わずに定義できるようになりました。

プラグインコンテキストで、以下のようなコードを書くと、Intentが定義されます。 定義されたIntentが呼び出されると、上記スクリーンショットのようなタブが表示されます。

  defmodelviewer(Plugin::Mastodon::Account) do |user|
    [
      [_('名前'), user.display_name],
      ['acct', user.acct],
      [_('フォロー'), user.following_count],
      [_('フォロワー'), user.followers_count],
      [_('Toot'), user.statuses_count]
    ]
  end

defmodelviewer で作られたタブは、他のプラグインで以下のようなコードを書くことで拡張できます。 以下の例は、ユーザのtootを表示するタイムラインを拡張する例です。

  deffragment(Plugin::Mastodon::Account, :user_timeline, _('ユーザタイムライン')) do |user|
    set_icon Skin[:timeline]
    timeline(nil)
  end

Quick Step

f:id:toshi_a:20190421141534p:plain

こちらも拙作のサードパーティプラグインであるQuick Stepをバンドルするというものです。

機能としては、検索クエリを入力するテキストエリアがポップアップ表示され、入力内容によっていろんなものがサジェストされます。たとえばMastodonのユーザや、「そのキーワードでツイート検索する」といったものが出てきます。上下キーで候補を選んでエンターを押すと、それを開く(Intentを発行する)ことになります。

サジェストする項目はプラグインによって拡張可能となっており、たとえばquickstep_twitterをインストールすると、「toshi_a」のようなScreen Nameとしては正しいが、実際には存在しない(かもしれない)ユーザも開くことができます。

バンドルすることにしたのは、ホームタイムラインなどの常設タブを減らす試みの一環です。検索タブも常設するのではなく、QuickStepで検索し、検索結果のタイムラインが都度作成され、ユーザが要らなくなった時点で閉じるという使い方を想定しています。

今回で検索タブの仕様をどこまで変更できるかは分かりませんが、mikutter 4.0ではそのようになります。

この名前に関して、先日発売されてmikutterの開発に甚大な悪影響を与えている「ルルアのアトリエ」の登場人物であるエーファちゃんのパッシブスキル「クイックステップ」から取ったのではないかと勘違いされないように明言しておきますが、このプラグインは一昨年のコミケで頒布されたmikutterの薄い本vol.13の私の記事「偉大なmikutterプラグインを作ろう」で例として取り上げていたプラグインで、mikutterがパクられた側です。まあ、エーファちゃんなので許してあげましょう。

PulseAudio

f:id:toshi_a:20190421135240p:plain

サードパーティプラグインだった、PulseAudioプラグインをバンドルします。割と今更感がありますが、そんな事を言っていたらもうタイミングがないので今回入れます。

設定画面でAlsaとPulseAudioどちらでサウンドを再生するか選択できます。新たにセットアップしたmikutterでは可能な限りPulseAudioを利用しようとします。

利用しているライブラリの見直し系

json_pure

詳細は省きますが、これを利用するより標準のJSONライブラリのほうが高速であるとされていて、mikutterがこれを利用する理由はとくにありませんでした。

rnotify(廃止) 、libnotify(新規採用)

デスクトップ通知を表示するためのライブラリとしてrnotifyを使うコードがありましたが、意図的に有効化しないと使えないようになっており、メンテナンスもされていなかったため削除されました。

今まではデスクトップ通知のためにnotify-sendコマンドを逐一実行していましたが、これからはlibnotifyというライブラリを使い、D-Busでデスクトップ通知を表示します。今まで通知の表示のために変なことをしていたのがわりと改善されています。

(6月22日追記) libnotifyの採用は見送り、引き続きnotify-sendコマンドを利用することにしました。一応コマンドを経由したくないという気持ちはあるのですが、やり方をもう一度検討します。

書き忘れていること

書き忘れていることです。

リリース時期

6/8にα1をリリースし、毎週土日にα版をアップデートします。 完成度にかかわらず、7/7にリリースするバージョンをmikutter 3.9.0とします。