:don: 2.0.0

ついに来ましたね、2.0。

リリースノート見ながら思い出話するやつです。

https://github.com/tootsuite/mastodon/releases/tag/v2.0.0

Breaking changes:

  • All id attributes in the REST API responses, including attributes that end in _id, are now returned as strings instead of integers. This is because large integers cannot be encoded in JSON losslessly, and all IDs in Mastodon are now bigint. Some apps will not work with this release until they are updated

新しいIDは最大で64bit、現時点でも61bitありますが、JavaScriptのNumber型は有効桁数が53bitほどしかないので、そのままでは下位ビットの情報が失なわれてしまいます。そこで文字列にしたわけですが、鳥さんのように新たに id_str を足したわけでもなく、しれっと型を変えてしまったのでさあ大変。それでも2.0.0のリリースまでにはPawooアプリも間に合せてきたのでえらい。

  • Mastodon will no longer deliver private and direct statuses to OStatus-based recipients (that means pre-1.6.0 Mastodon, too)

前々から言っていたことですね。ただ現状はプロフィール取得が発生しないと相手がAP対応であることに気付けないので、1.6になってから一度も発言してない人に@飛ばそうとするとあれです。というかだまって破棄してしまうので、エラーのひとつも出すべき(#5535)。

  • Stylesheet customizations now work differently due to the new theme feature. See upgrade notes for details.

後述。

Features:

Custom emoji (#4988, #5243, #5258, #5002)

現状の仕様はだいたいこんな感じ。

  • adminだけが登録・変更できます
  • 他の鯖(2.0以降)でも見れる
  • 投稿時ではなく表示時に適用されるので、過去の投稿もごそっと変わります
    • ローカルでは2.0より前の投稿にも適用されるし、登録解除すれば戻る
    • リモートでは変更後の絵文字を含む投稿を受けとると上書き、という形なので云々
  • 50KB以内のPNGならサイズ不問(表示サイズは固定だけども)
    • APNGを使えばアニメーションもいける(WebUIではGIFの自動再生をオンにしておかないと動かない)
  • :shortcode: で入力する関係で前後にスペースが必要(ZWSPでもOK)
  • リモートからの絵文字は個別に無効化でき、メディアブロックの対象にもなる

Add support for multiple themes (#4959, #5336)

ねんがんの テーマきのうをてにいれたぞ!

application.scss 相当のファイルを複数用意しておいて、themes.yml に書いてやるとテーマを追加できます。custom.scss は自動では読みこまなくなったので、自分でテーマとして登録するなりdefaultテーマを置き換えるなりする必要があります。

Replace EmojiOne emoji pack with Twemoji (#5046)

利点: tofu_on_fire 欠点: 猫がかわいくない

Add emoji autosuggestions (#5053)

  • 中身は後述する絵文字ピッカーの検索機能なので、
    • ハイフンやアンダースコアはAND検索の区切り文字として扱われます
    • shortcodeとは別の検索用キーワードにヒットする場合があります
    • この辺微妙
  • shortcodeではなく絵文字を直接入力します
    • Unicode絵文字についてはサーバー側でshortcodeの変換を行わなくなりました

New emoji picker (#5046, #5275)

  • よく使う絵文字は最初はおすすめ絵文字で埋まってます
  • カスタム絵文字も出るよ

New error page graphic. Other error page improvements (#5067, #5099)

500.html もRailsのビューとしてコンパイルするようになりました。具体的には assets:precompile でWebpackが走ったあとに assets:generate_static_pages がその仕事をしています。単体でも呼べるよ。

あとキーボードは叩かないように。

Better primary ID generation (#4801, #5260)

TwitterSnowflakeみたいな実装になりました。unixtime 48bit + sequence 16bit で最大64bit。これでURL検索、返信先やブースト対象の取得など、過去の投稿を取得した時に突如HTL/FTLの先頭に現われるということがなくなります。

ただし次のような場合はローカルの時計に基づいたIDになります。

  • APやOSで配信された場合: 最新の投稿が配信されるはずなので、多少遅れて届いてもHTLの先頭に表示されてほしいとか、Streaming API を使ってないと取りこぼすとか。
  • 未来の日付だった場合: TLの先頭に居座られても困るので…。

Hotkeys in web UI (#5164)

j/k で上下移動とか f でお気に入りとか n で投稿欄とかそういうやつです。割と多いですね。

Add ability to specify alternative text for media attachments (#5123)

いわゆる、imgタグのalt属性です。投稿欄でアップロードした画像にカーソルを乗せると、日本語では「視覚障害者のための説明」というテキストがふわっと出てきますが、そこがテキストボックスになっています。

Redesign public hashtag pages (#5237)

ハッシュタグページ(/tags/hogehoge)が /about のようにリッチになりました。幅が狭い?うん、まあ…。

Implement dynamic e-mail blacklist for admins (#5109)

.env.production等で設定できる環境変数のなかに EMAIL_DOMAIN_BLACKLIST というものがあったわけですが、似たようなものを管理画面で登録できるようになりました。環境変数も残っていて、両方適用されます。

Other:

  • After 7 days of repeated delivery failures, give up on inbox delivery to reduce wasted effort (#5131)

息してない鯖への配信が無限に積まれる件ですね。

  • APの配信は間隔を延ばしながら8回まで試行しますが、その8回目に計7日失敗するとこれが発動します。
  • 発動中はフォロワー宛の配信が止まりますが、メンションや通知は飛びます。
  • 一回でも配信に成功したり、当該アカウントから投稿を受信するとリセットされます。

なかなか再試行減らないんで機能してるんかこれ、と思っていたら、その大半は再購読によるものだったので、こっちは動いているんじゃないでしょうか。再購読ももうちょっとなんとかしたい。

  • Send streaming API delete to people mentioned in status, so they would get it even if they don't follow the author (#5103)
  • In detailed status view, display the attachment uncropped if there's only one of it (#5054)
  • When a streaming API status arrives, sort it into conversations live so you don't have to reload the conversation to see it (#5206)
  • New Material app icon for Chrome, new icons for iOS, Microsoft (#5291, #5321)
  • New API: GET /api/v1/apps/verify_credentials to confirm app works (#5112)
  • Reorganize preferences page (#5161, #4447)

見出しがついたり、通知関連の設定が別ページになったりしました。

  • Admins can now add moderation notes to accounts (#5240)
  • New preference for reducing animations in web UI to prevent motion sickness (#5393)

日本語では「アニメーションの動きを減らす」と書かれています。

これを設定すると、要素の大きさが変化したり、CW入力欄のようにスライドで現われるようなアニメーションが消えます。透明度が変化するようなものはそのままです。

Upgrade notes:

Non-Docker only:

  • The recommended Ruby version has been bumped to 2.4.2. However, it is only a recommendation. If you would like to stay with 2.4.1, simply overwrite the value in .ruby-version
  • Dependency updates: bundle install and yarn install

Both Docker and non-Docker:

  • This release includes database migrations, that means you need to run RAILS_ENV=production bundle exec rails db:migrate (in Docker: docker-compose run --rm web rails db:migrate). Depending on your database size, this migration may take a long while! It may also lead to some downtime. Make sure you have backups. This is because we are upgrading a multitude of database columns from int to bigint to make sure they're future-proof.

今回のmigrationの目玉はふたつあります。

  • 各種id列をbigint型に変更: テーブルをロックしない代わりに相当時間がかかります。例えユーザーが少なくても、リモートの投稿を大量に保持していたりすると注意したほうがいいかもしれません。進捗も表示されます。
  • Redisに保存されたHTLの変換: 64bit IDはRedisで扱うにも一悶着あり、ブーストの持ちかたを変えることになりました。で、これがバグもあったりしてそこそこ遅いです。大量にRedisの読み書きが発生するので、負荷とかレートリミットとかそういうあれもあるかも。 とはいえアクティブユーザーが5桁いるような鯖でなければ数分で済むと思いますが、進捗表示はないので根気よく待つか、2.0.1を待ちましょう(#5338)。

  • This release includes changes to assets, that means you need to run RAILS_ENV=production bundle exec rails assets:precompile (in Docker: docker-compose run --rm web rails assets:precompile)

Optionally:

  • custom.scss is no longer automatically loaded because the feature has been reworked into themes. Change to default: styles/custom.scss in config/themes.yml to restore old behaviour

Troubleshooting

  • If you have upgraded to the master branch before v2.0.0rc1 and your custom emoji now fail to load, perform this rake task: RAILS_ENV=production bundle exec rake paperclip:refresh:thumbnails CLASS=CustomEmoji

当初カスタム絵文字はoriginalひとつ保存していたのが、APNG対策でアニメーションしないstatic版も保存するようになりました。で、以前からあるものは後者がないので404になってしまいます。そこでoriginalを元にstaticを再生成するのがこれです。

Fixes:

  • Web UI: Make sure formatted numbers don't contain insignificant zeroes (#4993)
  • Bump recommended Ruby version to 2.4.2 (#4958)
  • Fix performance on stats queries (#4996)
  • OpenGraph: Fix error when generating OpenGraph tags for images without metadata (#4995)
  • ActivityPub: Add published property to activity for reblogs (#5000)
  • Re-allow final underscore in parsed URLs (#4999)

1.6.1でURLの自動リンク正規表現を変更した時に、これまで許容していた末尾アンダースコアが除外されてしまっていた件。一方でUnicodeの書記方向を指定するメタ文字が含まれてしまっていたり、なかなか難しい。

  • Web UI: Improve scrolling performance on Chrome (#5001)
  • Remove ubuntu-toolchain-r-test dependency (#5005)
  • Fix account records being read before processing finished (#4998)
  • Web UI: Hide sensitive image by default on the public pages (#5009)
  • ActivityPub: Use OrderedCollectionPage to return followers/following list (#4949)
  • Web UI: Improve scrolling performance in general (#5011, #5152)
  • Web UI: Fix remote statuses being html_encoded in public pages (#5012)
  • Fix race condition when processing incoming OStatus messages (#5013)
  • API: Change IDs to strings rather than numbers in API JSON output (#5019)
  • Web UI: Use file extensions in addition to MIME types for file picker (#5029)

Firefoxで .jpg 拡張子のファイルが選択できなかった件。image/jpeg を指定して推測された拡張子が .jfif とは…。

  • Disable private status federation over OStatus (#5027)
  • Web UI: Reduce wasted renders (#5021, #5036)
  • Web UI: Improve mobile style of /about/more (#5034)
  • Web UI: Make dropdowns render into portal, expand animation (#5018, #5140)
  • Document REDIS_NAMESPACE (#5038)
  • Do not filter statuses with unknown languages (#5045)

言語フィルタをひとつでも指定していると、判定結果が"不明"なものまでフィルタされてしまうというバグ。WHERE NOT language IN (...) で language が null なレコードが漏れていた。

  • Web UI: Fix overflowing tabs in account__action-bar (#5056)
  • Web UI: Fix media gallery CSS (#5064)
  • Web UI: Change mobile layout breakpoint from 1024px to 630px (#5063)

これは…結局好みだからなあ。基本的にはPC版はモバイル版の上位互換みたいなところはあるので、UserCSSでだいたい似せることはできると思うけど、それが適用できない・非表示にするだけではパフォーマンスに問題が出る環境もあるわけで…。特にPC版でたくさんカラムを並べている人はそのままだと微妙なのではという気がする。

せめてブレークポイントを手動で設定できるようにするぐらいしたほうがよさそう。

Please make it possible to force the single column view regardless of screen width · Issue #5341 · tootsuite/mastodon

  • Suppress backtrace when failed to communicate with a remote instance (#5076)
  • Thread notification e-mails for mentions by conversation (#5061)
  • Web UI: Increase max height of preview card image (#5092)

つまりはPixivの横長イラストを貼った時の解像度が上がります。縦長は…うんまあ。

  • Stop processing of payload if it originates from a local account (#5100)
  • API: When OAuth password verification fails, return 401 instead of redirect to login (#5111)

/oauth/tokengrant_type=password で叩いた時に、メールアドレスやパスワードが間違っている場合に401を返すべきところが、ログイン画面にリダイレクトしていた、というバグです。

で、これを修正したらなぜかAmaroqが死にました。

Amaroqが2.0rc1以降のMastodonインスタンスで使えなくなる理由についての技術的な詳細 - HackMD

すぐには修正できそうにないという話も出ていたわけですが、Amaroq 1.1.6で無事修正され、再びログインできるようになっています。

  • Web UI: Remove now redundant warnings about OStatus privacy (#5102)

リモートアカウントにDMを送ろうとするとなにやら長い注意文が出ていたかと思いますが、あれはMastodon以外のOStatus実装が公開範囲の指定を解釈しないということが前提にあったということで、そもそも配信しなくなった2.0では不要と削除されました。

  • Improve worker performance by flushing body when performing POST requests (#5128)
  • ActivityPub: If HTTP signature is wrong and webfinger cache is stale, retry with resolve (#5129)

現状APでのアカウント情報更新はほとんど相手からの通知に委ねており、その通知は基本的にフォロワーにしか送られません。のでインスタンスで誰もフォローしていないアカウントのプロフィールはなかなか更新されないという問題があります。(OStatusでは割と頻繁にアカウント情報を更新していました)

さて、リモートアカウントの公開鍵は変更される可能性があるわけですが、これが古いままだとメンション等で受け取ったデータの署名検証に失敗してしまいます。そこで、失敗したら一日一回まで(これはOStatusの頻度と同じ)アカウント情報の更新を試すようになりました。

まあそうでなくともプロフィール更新されないのはつらいので、これもなんとかしたいですね…。

  • Web UI: Improve performance of modal and swipe animations (#5135)
  • Change max redirects followed to 2 (#5136)
  • When using statsd to track Mastodon performance, it will now get more useful metrics (#5118)
  • Web UI: Upgrade to React 16 (#5119)
  • Web UI: Make emoji autosuggestions immediate, usernames appear sooner (#5149)
  • Fix bug with OpenStack v2 (#5155)

最初 OpenStack v2 のサポートが追加され、その後 v3 にも対応…と思いきや、そこで v2 対応が失われてしまっていました。

  • Fix order of paginated accounts on authorized followers page (#3357)
  • Mobile: Make Chrome splash screen the same color as web UI's background color for smoother transition (#5169)
  • Web UI: Toggle contain:strict on fullscreen (#5159)
  • Append confirmation link as plain text in e-mails (#5146)
  • Web UI: When muting someone, clear web UI of their content like for blocks (#5172)
  • Web UI: Fix emoji sequence bug in substring-trie (#5191)
  • Web UI: Compress and combine emoji data (#5201, #5229)
  • Improve HTTP responses for Salmon and ActivityPub inbox processing (#5200)
  • ActivityPub: Fix possible acct URI usurpation in account discovery (#5208)
  • Use separate workers to process imports, retry failures (#5207)

インポートを行う際に途中でエラーが起きるとそこで中止されてしまっていた件ですね。

  • ActivityPub: Validate id of objects (#5114)

ActivityPubの処理ではidとして渡されたURLからオブジェクトの実体をダウンロードする場面がいくつかありますが、もし何らかの理由でダウンロードしたものが想定と異なるオブジェクトであれば、それを処理すべきではありません。ということで、ダウンロードしたオブジェクトのidが当初の想定通り(つまりダウンロードしたURLと等しい)かを検証するというものです。

  • Web UI: Use own, shorter relative timestamps in web UI to save space (#5171)

投稿の右上に表示される日付が英語だと 5 hours ago といった感じで少々長い、ということで、 5d といった表記に変更されました。日本語では 5時間前 という表記のままですが、数日前などの場合に 10/31 といった形で表示されるようになりました。

  • OpenGraph: Use summary_large_image card only when media attachments present (#5219)
  • Web UI: Fix remote profile being displayed as HTML on remote follow page (#5249)
  • Improve error handling in LinkCrawlWorker (#5250)

例外の握りつぶしは最小限にしよう。その結果既知のバグがdeadキューにぽこぽこ現われたけど、まあそのためなので。

  • Web UI: Fix overflowing (#5246)
  • Web UI: Show buffering in video player (#5261)
  • Web UI: Dynamically calculate card height for embeds instead of using CSS padding trick (#5265)
  • ActivityPub: Use object URI only in Announce, instead of embedding (#5266)
  • Fix pagination in blocks API (#5285)
  • Web UI: Center error layout (#5289)
  • Fix offline-plugin warning in dev mode (#5411)
  • Disable reblog counter for private toots (#5397)
  • Fix unreblogged toot being at wrong position in the home timeline (#5418)

これはSnowflake導入後のmasterで起きていたバグなんですが、

  1. ブースト解除した時にブーストがあった位置(スコア)で挿入してしまっていた
  2. すると最新40件にやたら古い投稿が紛れている
  3. HTLはリクエストごとに投稿IDでソートして返すので、古い投稿は常に末尾に位置する
  4. クライアントがmax_idにその投稿のidを指定して続きを読みこむ
  5. めっちゃ飛んでない…?

というちょっと面白いはなし。ソートしてることに気づくまで時間がかかった。

  • Ensure that home feed regeneration after inactivity restores non-zero items (#5409)

しばらくログインしていないとHTLが空っぽになり、次にログインした時に再生成が行なわれますが、パフォーマンス上の理由からいくつかのフィルタ処理はDBから取得した後に行なっています。ということは、一回目の取得で得た投稿が全部フィルタされてしまう可能性もあり、その場合HTLは空っぽのままになっていた、というバグです。足りなければ何回か試行するようになりました。

  • Properly remove unreblogged toots from timelines by keeping references of all reblogs (#5419)

ブースト解除でTLに中身だけ残ってしまう問題に対する修正です。投稿ごとにそれ自身とブーストをまとめておき、TLからブーストが消える時にはそのセットの中から適当なものを選択してTLに挿入し、空っぽになったらTLから完全に消す、といった流れになります。

ブーストした順番は反映されないものの、元々なかった中身だけ残ってしまうという問題は解決できることになります。なおWebUIではこのセットを見ることはできず、それに相当する情報も管理していないので、そのような場合には既にTLにあった可能性があっても消してしまうようになりました。

  • Web UI: Replace newlines in desktop notifications with spaces instead of removing them (#5361)
  • Allow unreblogging pre-ActivityPub reblogs (#5376)

OStatusで配信したブーストをAPで削除できないバグ。こんなのがまだあったのです。

  • ActivityPub: Fix remote status fetching for ActivityPub-only WEB_ACCOUNT users (#5372)
  • Web UI: Avoid confusing messaging: When unfollowing, remove toots from home in web UI immediately (#5369)
  • Web UI: Avoid confusing messaging: Do not try to guess why home timeline is empty in web UI (#5370)
  • Fix user sign in count updating on every request, optimize some queries (#5368)
  • Optimize Status#permitted_for 500x (account timeline) (#5373)

以前は効果的だった最適化が今では逆効果になっていたというのはちょっとおもしろい話。

  • Make HTTP deliveries faster by closing connection right after posting (#5390)
  • Fix some failure cases when fetching link preview cards (#5347)
  • Web UI: Reduce discrepancies between server and client-side character count (#5360)
  • Fix reblog count increasing without reason (#5363)

1.6で発生していた、ブースト数が余分に増えるバグの修正です。ローカルの投稿を一度保存した後にuriを生成してもう一度保存する、といった挙動になった際に、その両方でインクリメントしていたようで。

  • Web UI: Fix React warning about tabIndex on status with CW (#5432)
  • Don't capture scheme-less URLs in the status (#5435)
  • When status is fetched instead of delivered, do not stream it (#5437)

Snowflakeが導入されてもWebUIはStreamingで流れてきた投稿を素直にTLの一番上に挿入してしまうので、通常の配信でなければStreamingに流さないようになりました。

  • Web UI: Fix unwanted content warning gap in CSS (#5436)
  • OpenGraph: OpenGraph tags on sign in and sign up pages (#5308)
  • Web UI: Only preload JS on /web pages (#5325)
  • Web UI: In thread view, only scroll on first update, and scroll to replied-to post (#5322)

会話を表示した際に対象の投稿の位置までスクロールしていたわけですが、あまりにピッタリの位置にスクロールしてしまうせいで返信先の存在に気付きにくい、ということで返信先の位置までスクロールすることに。

Mastodon v1.6.1

v1.6.0のを整理しないままに出てしまった。まあいいか。

リリースノート見ながら思い出話するやつです。

https://github.com/tootsuite/mastodon/releases/tag/v1.6.1

今回はActivityPub周りのバグ修正が多いですねー。

Features

  • Add section for protocol specific information on the admin page (#4910)

ActivityPubに移行したらActivityPubの情報だけ表示するようにしたのも私なんですが、移行時のごたごたで購読状況見たいとか購読解除したいとかあるわな、となったので、全部出すようにしました。

  • Admin UI: Make instance names in into links to user list in the instance (#4924)
  • Admin UI: Add instance search feature (#4925)

管理画面でインスタンスごとのアカウント一覧を表示するのが簡単になりました。

  • Admin UI: Uploads for admin site settings (#4913)
    You can now upload your own OpenGraph thumbnail for your instance

鳥や丼にリンクを貼った時に表示されるサムネ画像が設定できるようになりました。ちなみに自鯖ドメインのURLを貼ってもcard表示されないので、他の鯖で試してみましょう。

  • Redesign video player (#4911)

生コントロールを自前実装して、拡大表示しなくてもそれらが表示されるようになっています。左から再生・一時停止、ミュート、非表示切り替え、間をあけて拡大表示、全画面表示です。

そしてこのプレイヤーはpublicページや埋め込み表示でも使えます。

  • Support OpenGraph video embeds (e.g. Twitch clips) (#4897)

Twitchの他にもSoundcloudとかいけます。

  • Include requested URL into the message on network errors (#4945)

Mastodonはなにかにつけ外部にリクエストを飛ばしますが、単にタイムアウトだの証明書だのと言われても、どこに接続できなかったのかがSidekiqの管理画面でわかりにくいので、エラーメッセージに足しました。PullRequestに貼った画像を見てもらうとわかりやすいです。

  • When web UI URL used while logged out, redirect to corresponding static page (#4954)

WebUIでトゥートの詳細を表示するとアドレスバーには /web/statuses/11126 といったURLが表示されますが、これはログインしていないと見れません。で、ログインしてなかったらWebUIじゃない方に飛ぶようになりました。ちなみにこの数値は status id なので、アカウント名がわからない状態でも簡単に表示できるようになったわけです。/web/statuses/1 とか。

  • When accessing uncached media attachment, redownload it (#4955)

外部のインスタンスから取得した添付画像は無限に保存していると辛いので、古いものは定期的に削除していますが、これをされるとサムネイルが表示されず不便でした。今後は古い投稿でも(多少時間はかかりますが)サムネイルが表示されるようになります。
具体的には、画像キャッシュが削除された投稿を取得した際、画像URLの代わりに、画像を自動的にダウンロードしつつ返すURLを渡すようになりました。

  • Add OpenStack Keystone V3 support (#4889)
  • Add scheduled worker to purge old user IPs (#4951)

Fixes

  • Fix error when following locked accounts (#4896)
  • Fix count numbers from ActivityPub not being saved (#4899)
  • Merge context hash into final JSON hash after key transform (#4898)
  • Fix nil error for old toots that don’t have a conversation (#4900)
  • Add missing suspend checks (#4921)
  • Fix ActivityPub handling of replies with WEB_DOMAIN (#4904)
  • Fix AP serialization error when thread is missing (#4970)
  • Fix an error in ReplyDistributionWorker when replied status was deleted (#4974)
  • Fix an error when actor json couldn’t be fetched in ResolveRemoteAccountService (#4979)

この辺だいたいAP関連のバグですね😇

  • Whenever a remote keypair changes, unfollow them and re-subscribe to them (#4907)

何らかの事情でインスタンスを立てなおした際、これまでのフォロワーはフォローしたつもりでいるのに、立てなおしたインスタンスの方は忘れていて配信されない、ということが起きていました。そこで通常の運用では変化しないアカウントごとの公開鍵を見て、これが変更されたら立てなおしかもしれない、ということで再度フォローを送るようになりました。

  • Enable to recognize most kinds of characters as URL paths (#4941, #4968, #4975)

Wikipediaなど、URLに日本語などの文字が含まれている場合、これまではあらかじめ%xxといった形式で変換していないとURLとして認識されませんでした。まあ大抵のブラウザはアドレスをコピーすると変換した状態になっているんですが、なっていない場合もあるので…。
また、そのように貼り付けられたURLは元の形のまま、日本語の部分は日本語のまま表示されるようになりました。

  • Fix invisible load more button (#4962)

ホームTLなどで最後までスクロールすると、クリックできそうでクリックできない空白が見えていた点などを修正しています。

  • Fix filterable_languages method of SettingsHelper (#4966)

言語フィルタに効果のない選択肢があったので、ちゃんと有効なものだけを表示するようになりました。

  • Randomize sidekiq-scheduler cron schedule (#4980)

OStatusの再購読を24時間ごとにかけているんですが、これまではその時間が固定だったので、特定の時間になると世界中のMastodonインスタンスが再購読を始めてしまい、される側に負荷がかかるという問題がありました。で、他の定時実行タスクとあわせてSidekiqの起動時にランダムに決めるようになりました。

  • Raise an error on getting activity uri for remote status (#4984)
  • Validate uri presence for remote status (#4985)

この辺は謎のバグ報告を受けてチェックを厳しくしたやつですね…。謎。

  • Oauth code in input form and add description message (#4986)

アプリのアクセス許可をしたあとのPINコード画面、コードがはみだしているわ説明はないわだったんですが、きれいになりました。

  • Reset preview image if avatar/header image selection was cancelled (#4893)
  • Clean up and improve generated OpenGraph tags (#4901)
  • Specify libicu explicitly in Aptfile (#4920)
  • Fix height cache (#4909)
  • Limit pinned toots to 5 (#4923)
  • Fix share intent (#4926)
  • Do not keep remote file names, generate random (#4934)
  • Fix race condition when receiving an ActivityPub Create multiple times (#4930)
  • Remove redundant width/height values from SVGs to fix Safari bug (#4956)
  • Fix hasSize condition in secSet and sizes. (#4969)
  • Adjust landing pages 2 (#4967)
  • Fix cancellation of scroll to the right (#4978)

Mastodon v1.6.0

https://github.com/tootsuite/mastodon/releases/tag/v1.6.0 を訳したり捕捉を入れたり再編したものです。

ActivityPub 対応

鯖缶はこれをどうぞ https://hackmd.io/s/H1KSg6ttW

ユーザーとして知っておくべきポイントは、これぐらいです:

  • ロックされていないアカウントをリモートフォローする時にも砂時計マークになることがあります。しばらく待てばフォロー済みアイコンになるはずですが、改善されないようなら一旦砂時計をクリックして未フォロー状態に戻してから再度フォローしてみてください。
  • いくつかの機能が追加されました。これらは1.6以上のインスタンス同士でのみ発生します。
    • Aさんのトゥートに対して返信が送られると、その返信をAさんのフォロワーにも転送します。つまり、Aさんだけフォローしているインスタンスでも、BさんからAさんへの返信が会話表示に現れます。
    • これまでトゥートの削除は直接のフォロワーまでしか配信されていませんでしたが、今後はブーストした人やメンション先、またブーストした人のフォロワーなど、可能な限り削除通知を転送するようになりました。(これでも完全ではありません)

ところで、ActivityPubのひとつの目玉は、非公開やダイレクトといった公開範囲の指定がきちんと考慮されていることです。これまで使ってきたOStatusというプロトコルではMastodonの独自実装だったために、GNUSocialなど他の実装では非公開投稿なのにブーストできてしまう、といった問題がありました。

そこで将来的にはActivityPubでのみ非公開やダイレクトを配信するようになる予定ですが、1.6よりも古いMastodonにもそれらの非公開投稿が配信されなくなってしまうので、1.6の普及を待っている段階です。知り合いにインスタンスを運用している人がいれば、早めにv1.6以上へ更新するよう伝えていただければと思います。

  • Security:
    • Digest header on requests with body (#4565)
    • Add handling of Linked Data Signatures in payloads (#4687, #4752)
    • Support more variations of ActivityPub keyId in signature (#4630)
  • Plumbing:
    • Incoming processing (#4216, #4571, #4595, #4601, #4629, #4639, #4728, #4729, #4763, #4754, #4761)
    • Delivery (#4566, #4703, #4704, #4739)
    • Improvements to representation of entities (#4592, #4737, #4764, #4767, #4779)
  • Protocol upgrade:
    • Migration from OStatus (#4583, #4593, #4623, #4631, #4632, #4617, #4662, #4582, #4702, #4730, #4756, #4766)
    • Alternate links to ActivityPub resources from HTML/HEAD variants (#4586)
    • Hook up URL-based resource look-up to ActivityPub (#4589, #4661, #4599, #4668, #4672)
  • User-facing:
    • Update admin view for ActivityPub users (#4600, #4622)
    • Forward ActivityPub deletes to followers of rebloggers (#4706)
    • Forward ActivityPub replies to local statuses to followers of authors (#4709)
    • Fetch statuses/following/followers numbers from ActivityPub (#4840)

その他機能追加など

  • Include the stats from the /about/more page in API response about instance (#4074)
    /about/moreで得られる情報をよりAPIで取得できるように。
  • Add protocol handler. Mastodon can now respond to URLs that begin with web+mastodon://, e.g. specially crafted “follow me” buttons would automatically open your correct instance from any webpage (#4511)
    あらかじめ登録しておいたインスタンスを呼び出してフォローや投稿できる、web+mastodon:// プロトコルハンドラを追加。
    • web+mastodon://follow?uri=alice@example.com opens follow dialog for alice
    • web+mastodon://share?text=Lorem+ipsum opens new toot dialog with preset text “Lorem ipsum
  • Redesign public profiles. Add no-replies, with-replies, only-media filters (#4608, #4711, #4713)
    プロフィールページのデザイン刷新
  • Developer UI for OAuth applications (#2758, #4664, #4671)
    設定ページからもアプリ登録やトークン発行を行えるように。
  • Add Mastodon::Source.url for forks (#4643)
  • Pinned statuses (#4675, #4690, #4817)
    公開プロフィールページで表示される固定トゥート機能を追加。
  • Update status embeds with better URLs, better design, branded follow button using protocol handler (#4742)
  • “Embed” modal in web UI (#4748, #4759, #4773)
    トゥートのメニューに埋め込みようHTMLを取得できる項目を追加。
  • Add script to make embedded iframes autosize (#4853)
  • OpenStack Swift support as alternative to S3 📎 (#2322, #4816)
  • “Mute conversation” option on all own toots, not just in notifications (#4844)
  • Default follows for new users (#4871)
    新規ユーザーがデフォルトで管理者をフォローするように。設定ページからフォロー対象は変更することができます。 New users automatically follow certain accounts upon e-mail confirmation. Configurable with admin site setting. When nothing else set, defaults to admins.

修正等

  • During Docker build: Use multiple cores in bundler and make (#4544)
    dockerイメージのビルド時に -j xx オプションを付けて高速化
  • Web perf: Cache status height (#4439)
    IntersecionObserverを使って画面外のトゥートの描画を簡易化していますが、このためにはトゥートを表示した時の高さを知る必要があります。これまではカラムを切り替えると高さ情報が失しなわれてしまい、ブラウザバックで戻った時に表示が遅いことがありました。そのような場合でも高さ情報を保持する、という改善です。
  • Fixes to the about page (#4554, #4548, #4682)
  • Add missing content type on throttled responses (#4558)
  • Add coalesce option to avatar and header convert processor (#4552)
    GIFアニメアバターの表示を修正
  • Add missing @ to the onboarding modal (#4560)
  • Add missing scroll to top to some column headers (#4563)
    一部カラムヘッダクリックでスクロールせずにエラーが出ていた
  • Add favourited toot to favourites column (#4562)
  • Remove toot from favorites column when unfavorited (#4597)
    お気に入りカラムを表示している状態でお気に入りの登録・解除を行なっても判定されるように。
  • Fix emoji picker scrollbar style (#4572)
    絵文字ピッカーのスクロールバーの色を修正
  • Extend Devise remember_me longevity to 1 year instead of 2 weeks (#4587) 再ログインを求められるまでの期間を長く
  • Fix search (regression from #4589) (#4594)
  • Fix require_user! behavior when not logged in (#4604)
  • Don’t send Link header when prev and next links are empty (#4633)
  • Re-add missing token authorization for /api/v1/verify_credentials (#4650)
  • Refactored streaming connections (#4645)
  • Do not try to re-subscribe to unsubscribed accounts (#4653)
    購読解除したアカウントも自動的に再購読されていたバグを修正。ところでこれに伴い、一人もフォローしていないアカウントでも再購読が自動的に行われるようになりました。これを整理したい場合は rake mastodon:push:clear を実行することで、誰にもフォローされていないリモートアカウントの購読を解除することができます。
  • Fix visual line-break glitch with .invisible parts of links (#4655)
  • Increase contrast in landing pages (#4567)
  • Periodically remove expired PuSH subscribers (#4654)
  • Disable babel-loader cache when in development environment (#4684)
  • Don’t load Roboto webfont when system font is used in the app (#4591)
  • Automatically authorize pending incoming follow requests after unlocking account (#4658)
    未承認のフォローリクエストがある状態でアカウントのロックを解除してもそれらが承認されていなかったのを修正。
  • Adjust RTL styles (#4712)
  • Do not scroll the columns area due to redirection (#4541)
  • Remove unnecessary indices (#4738)
  • Add close tag of iframe for OEmbed response (#4745)
  • Docker: Update to Alpine 3.6 (#4747)
  • Make first use less overwhelming with browser permissions: Ask for desktop notifications after 1 minute, ask to register protocol handler after 5 minutes (#4760)
    WebPushやプロトコルハンドラの登録リクエストが表示されるまで少しウェイトを設けるように。
  • Use system’s default font (when selected) on non web UI pages too (#4553)
  • Link previews storage and fetching reworked/optimized (#4642)
  • Fix text position of “sensitive content” spoiler in Safari (Mac/iPhone) (#4570)
  • Make “unfollow” remove pending outgoing follow requests too (#4781)
    砂時計マークのクリックでフォローリクエストをキャンセルできるように。
  • Validate presence of data in imports (#4782)
  • Fix short number locales (#4790)
  • Fix a problem that notification column goes to top (#4792)
  • Use correct syntax for content preloading (#4798)
  • Fix streaming url to lowercase (#4804)
    ハッシュタグは内部的には全て小文字で管理されている、というのを踏まえて、大文字を含んだハッシュタグを指定してStreamingAPIに接続できなかったのを修正。
  • Show pinned statuses only in the top of the profile page (#4803)
  • Fix some ActivityPub JSON bugs (#4796)
  • Add new index on notifications to make filtering faster (#4750)
  • Adjust status embeds (#4808)
  • Restore instant follow in API response when account is unlocked (#4799)
    ActivityPubではロックされていないアカウントをフォローする時にもフォローリクエストと自動承認という形を取りますが、自動承認の結果はリアルタイムでWebUIには反映されず、ページを再読み込みするまで砂時計のまま…というのはあれなので、フォローできたような表示にする(APIレスポンスを返す)ように。
  • Fix mentions in direct statuses not being delivered via AP (#4806)
  • Do not execute the job with the same arguments as the retry job (#4814)
  • Enable UniqueRetryJobMiddleware even when called from sidekiq worker (#4836)
  • Fix text position of NSFW for video file (#4819)
  • Fix scroll position (#4821)
  • Add Smartphone screen favourite back button and adjust styles (#4813)
    お気に入りカラムのスマホレイアウトで戻るボタンがなかったのを修正。
  • Make new statuses use the same URI format in both ActivityPub and OStatus (fixes threading issue in OStatus) (#4815)
  • Fix rake task compatibility with Ruby 2.3.x (#4832)
  • Report comment: limit to 1000 characters (#4833)
    通報コメントの上限を1000文字に。
  • Fix counting of local statuses for stats (#4839)
  • Fix language filter codes (#4841) 言語フィルタで意味のない選択肢があったのを修正(それでも全部チェックしてもフィルタできない言語がある)
  • Handle stream_entry URL correctly in ActivityPub (#4854)
  • Refresh timeline after toot while the timeline is disconnected (#4858)
    LTLやFTLを表示していない時にトゥートしてからLTLやFTLを開くと、トゥートするまでの投稿が読み込まれないことがあったのを修正。
  • When visibility missing from API call to toot, fallback to user preference (#4861)
    投稿APIでvisibilityを省略した場合、WebUIのデフォルト設定に合わせるように
  • Check if already follow-requested from FollowService to avoid error (#4855)
    フォローリクエスト済みのアカウントを再フォローしようとしてもエラーにならないように。
  • Scrollable tables in settings pages (#4857)
  • Add missing reject_media check before avatar download via ActivityPub (#4862)
  • Fix errors preventing UnsubscribeService from working (#4866)
    接続エラー等が発生する場合に購読解除ができなかったのを修正。
  • Set fallback address when empty notification address (#4868)
  • Fix dimensions of loading component for compose drawer (#4872)
    投稿カラムに切り替えた時に一瞬普通のカラムっぽいなにかが表示されていたのを修正。
  • Hide modal loading screen for media/video/boost/confirm/actions modals (#4873)
    各種確認モーダルやメディアの拡大表示で、一瞬チュートリアルみたいな枠が表示されていたのを修正。

:don: 170806

v1.5.0から今日の分まで。そろそろパッチリリース出るんじゃないかって気もするけど。

https://github.com/tootsuite/mastodon/compare/v1.5.0…d1d4653

重い話

絵文字をドメイン名に含んだURLを投稿すると、投稿時やTL取得時に500になっていた件

Don’t throw while normalizing invalid domain names by TheKinrar · Pull Request #4499 · tootsuite/mastodon

Issueに書かれていたURLの例が http://🌹🌹🌹.ws/ です。そんなドメインあるんか…。

トゥート内のURLをリンクに変換する際、こうした国際化ドメイン名(IDN)は http://xn--2h8haa.ws といった形に正規化されて <a href="..."> に埋め込まれるのですが、高速化のためにv1.5.0からは idn-ruby というライブラリを使うようになりました。その中身である libidn が上記ドメインを無効なものとして例外を投げたために、当該statusを投稿した際や当該statusを含むTLの取得時にエラーになっていた、というものです。ちなみに投稿がエラーになるように見えますが、エラーが起きるのは保存された投稿をJSON等に変換する処理の一部*1なので、DBには保存されちゃってます、はい。

いずれにせよ不正なURLが投稿されただけでこのようなエラーになるのはまずいので、ひとまずIDNの正規化に失敗したらURLのリンク化をやめるだけで、その後の処理に支障がでないようにしたのがこのパッチです。

ただ上記URLに実際アクセスできることからも、本来はURLとして扱いたいところです。libidnが準拠するIDNA2003は禁止リスト制だったので、後から追加されたコードポイントはデフォルトでは禁止するようになっていました。そこでnullkal氏によって ALLOW_UNASSIGNED オプションをつけるPRがadressableに投げられています *2

Docker環境でプレビューカードの文字化けを防ぐためにlibiconvを自前ビルドするように

Use GNU libiconv in Nokogiri by ykzts · Pull Request #4494 · tootsuite/mastodon

URLをトゥート内に書いた時のプレビューカードを取得する際、UTF-8以外のエンコーディングの場合はNokogiri経由で変換を行っていたのですが、MastodonのDocker構成で使っているAlpine Linuxのlibiconvは対応するエンコーディングが少なく、例えばSJISのサイトでは化けてしまっていました。ITmediaとか。

そこで GNU libiconv のソースコードを取得してきて自前ビルドし、Nokogiri で利用してもらう、というのがこのパッチです。今後ビルドにかかる時間が増えるのでは?という点については、一度ビルドすれば大抵はキャッシュが効くのでそこまで大変でもないかと。自分でビルドせずにDockerHubからpullしてそのまま使うのも手ではあります。

重くはない

右端のカラムの中身が変わったらページ全体を右端までスクロールするように

Scroll columns area to right when children property is changed by akihikodaki · Pull Request #4517 · tootsuite/mastodon

ピン留めしているカラム数に対してウィンドウの幅が狭いと、全てのカラムを見るには横にスクロールしなければいけません。で、アカウントやトゥートをクリックするなどしてURLと右端のカラムが変更されたときに、自動的にスクロールする、というものです。なおシングルカラムの場合にエラーが出ていたので、別途修正されています。

Disable scroll columns area to right when single column mode by MitarashiDango · Pull Request #4528 · tootsuite/mastodon

ログイン中のアカウントの情報を一部ページで表示するように

Add “signed in as” header to some pages by Gargron · Pull Request #4523 · tootsuite/mastodon

具体的にはリモートフォローの確認ページ*3やOAuthの承認ページなどです。これらのページで、ページの一番上にログイン中のアカウントが表示されるようになりました。

キーボード操作のHome/EndをCtrl+Home/Ctrl+Endに修正

fix(status_list): Use correct keys for keyboard navigation by sorin-davidoi · Pull Request #4487 · tootsuite/mastodon

修正?って話については、PageUp/PageDown/Ctrl+Home/Ctrl+EndというキーバインドWAI-ARIA Authoring Practices 1.1 という文書に則っているので、という。

細かいの

一部ブラウザでの「戻る」ボタンのスタイルを修正

Fix column-back-button style for some browsers (regression #4457) by unarist · Pull Request #4484 · tootsuite/mastodon

Edgeで中央揃えになっていた件と、Safariで周りにmarginがついていた(黒枠にも見える)件。

パスワードリセットを行う際、リンクの期限が切れていたら最初のフォームに戻すように

Redirect to PasswordController#new when reset_password_token is invalid by nullkal · Pull Request #4506 · tootsuite/mastodon

これまでは新パスワードを設定するフォームが謎のバリデーションエラーと共に表示されていたとのことで…。

Transfer-Encoding: chunked なサイトでWebFingerに失敗することがあった問題を修正

Update goldfinger to 2.0.1, see tootsuite/goldfinger#5 by Gargron · Pull Request #4527 · tootsuite/mastodon

*1:Mastodonはリモートの投稿はHTMLで、ローカルの投稿はプレーンテキストでDBに保存しており、プレーンテキストからHTMLへの変換はAPIが呼び出されたときやAtomが必要になった場合に行われます。この変換処理の中に、今回問題となったURLのリンク化処理が含まれています。ですから1.4.7以前のインスタンスやGNUSocialからこのような投稿が流れてきても、今回の問題は発生しません。

*2:ところでIDNAには後継のIDNA2008という版があるのですが、こちらでは記号や絵文字は disallowed という扱いに変更されています。といっても既存のドメインにアクセスできないのでは困りますから、TR46 という文章で移行期間中の変換手順が用意されており、こちらでは絵文字も通るようになっているようです。libidn2では IDN2_TRANSITIONAL を付けるといいようです。参考: FAQ - International Domain Names (IDN)

*3:フォロー元のアカウント名を入力するフォームでも表示されるようになったのですが、フォロー相手のインスタンスでログイン済みだとリモートフォローボタンが表示されないので、あまり目にすることはないですね…。

:don:170802 v1.5.0

🎉 v1.5.0リリース 🎉

https://github.com/tootsuite/mastodon/compare/v1.5.0rc3…v1.5.0

まあrc3まで行ったのでそんなに残ってはいないですね。

でかい修正(当社比)

™ ® © を絵文字に変換しない

Do not emojify ™, ® and © - no more gray on gray by MightyPork · Pull Request #4472 · tootsuite/mastodon

やったーっ。

これらの記号がカラー絵文字に変換された結果、グレーになっていたんですね。背景が暗いから読みにくいのなんの。使ったことないから知らんって人はPRの比較画像をどうぞ。

その他

rc2以降一部ブラウザでトゥートが表示されなくなっていたバグ

Load extra polyfills when isIntersecting is undefined (regression #4398) by ykzts · Pull Request #4469 · tootsuite/mastodon

MastodonのWebUIではIntersectionObserverを使って、トゥートが表示範囲内に入っている(もしくは近づいている)時以外はDOM構造を簡略化して、かつ非表示にするようにしています。この判定に isIntersecting というプロパティを使うのですが、IntersectionObserverには対応してるけどこのプロパティは持っていない、というブラウザがいくつかあります。Edgeとか、あと今回の話から察するにしばらく前のChromeとか?

これまで代わりの策を自前で書いていたんですが、IntersectionObserverのpolyfillにこのプロパティも入ったのでそれを使うことにしました。というのがrc2の話。

ここもPolyfillに頼ることにしたので、IntersectionObserverだけでなくisIntersectingの存在までチェックして読み込む必要があるわけですが、上記のPRではそれが漏れていたので、一部ブラウザでうまく動かなくなっていたわけです。

じゃあなぜ気づかなかったのかって話ですが、MastodonではPolyfillをbaseとextraの2セットに分けていて、それぞれまとめて判定・読み込みを行っているんですね。Edgeは object-fit のために既にextraを読み込んでいたので、isIntersectingの判定を行わなくても読み込まれてしまっていたのでした。今後もはまりそうだなーこれ。

rc3で一旦背景色に置き換えた :focus 効果を元に戻す

rc2でトゥートにフォーカス移動できるようになりましたが、その際にフォーカスを表すoutlineが表示されていました。マウスで操作しているときには邪魔ですし、ブラウザによっても見た目が違うし、ということで最初はひとまず消してしまおうという話があったのですが、流石にそれはアクセシビリティ上まずいということで背景色を変えることにしました。

Remove outline from focused toot by ykzts · Pull Request #4448 · tootsuite/mastodon

ただこれはこれで、背景色とテキストのコントラストが下がって読みにくい、既に背景色を変えているDMと紛らわしい、といった意見が出てoutlineに戻すことになりました。この時もChromeの表示に揃えるという提案があったのですが、トゥート以外の場所で表示されるoutlineは今回ノータッチなので、やっぱりデフォルトの挙動にもどすか、という結論に。

Remove outline from focused toot by ykzts · Pull Request #4448 · tootsuite/mastodon

ちなみに、ブラウザ間での違いについて、手元で少し試した感じだと次のような違いがありました。

  • Chrome: 青い線、クリックでも常にoutlineを表示
  • Firefox: 点線、一度キーボードでのフォーカス移動するとクリックでも表示される
  • Edge: 点線、クリックでは常にoutlineが表示されない

結構違いますね…。

SMTP_TLSのサンプルを .env.production.sample に追加

Show SMTP_TLS in config sample by ScienJus · Pull Request #4477 · tootsuite/mastodon

SMTPSなメールサーバーを使う人はオンにしましょうね。

:don: 170801 v1.5.0rc3

昨日リリースされた 1.5.0rc3 をご紹介。

https://github.com/tootsuite/mastodon/releases/tag/v1.5.0rc3 https://github.com/tootsuite/mastodon/compare/v1.5.0rc2…v1.5.0rc3

そこそこのやつ

URLを全て23文字としてカウントし、メンションのドメイン部分をカウントしないように

ちなみに、この処理においては「http:// または https:// で始まりスペースを含まない任意の文字列」をURLとして扱っているため、URLの後ろにスペースを入れないと後続の文章が巻き込まれる可能性があります。URL化の処理よりははるかに甘い条件なので、今後もう少し厳しく(あるいはURL化が甘く)なったりするんだろうか、と思わないでもないです。

WebUI上でもCWを設定するとNSFWを強制するように

この仕様は 1.5.0rc1 でサーバー側に導入されたものですが、それを WebUI の投稿フォームでも反映するというものです。CWをオンにすると自動的にNSFW*1もオンになり、オフにすることができなくなります。

タブをクリックして切り替えたときに、タブの表示を先に更新するように

現在選択されているタブは青く色がつくようになっていますが、これまでこの表示の更新はカラム切り替えと同時…実質カラムの切り替えが終わってからタブの表示も更新されていました。環境によってはカラム切り替えには時間がかかるので、クリック→タブの表示更新と空っぽのカラムの読み込み→カラムの中身を読み込む、といった感じに表示された方が、タブの切り替えは受け付けたが読み込みに時間がかかっている、とわかります。

そこでクリック→Reactを使わずタブの表示更新→カラム切り替えという形にしたのがこのPRです。

ただしタブ表示切替のトランジション中にカラム切り替えを始めるとやはりそこで止まってしまうため、トランジションの完了を待ってからカラムを読み込むようになっています。この分カラム切り替えにかかる時間は増え、特にこれまで一瞬で済んでいた環境からすると気になるということで、クリックではなくタッチした場合のみこの処理を行うように変更されました。

なおこれらの変更に伴って「現在表示しているタブをクリック・タッチするとタイムラインの一番上にジャンプする挙動がなくなった」という話がありましたが、カラムヘッダ(ホームとか通知とか)をクリック・タッチすることで似たようなことが行えますし、別に狙って付けていた機能でもないかなーと思ったので指摘はしていません*2

と言いつつ、二つ目のPRではクリックの場合preventDefaultもしなくなっているので、従来通りジャンプしますね。タップではジャンプしません。

細かいやつ

/about/moreで表示されるメールアドレスをmailto:リンクに変更

/about/more のデザイン刷新によって、長いメールアドレスが折り返されずに省略されるようになりました。カーソルを乗せるとツールチップで表示されはするものの、コピペしにくいですし、スマホではツールチップを表示することもできませんでした。

これをリンクにすることで、ブラウザの右クリック・長押しメニューなどからコピーすることができるようになります。

モバイルレイアウトでの確認ダイアログの幅を広めに

PRの画像を見てもらうとわかりやすいですが、一部確認ダイアログではボタンの右余白がない状態になっていたので、これを修正します。ちなみに iPhone5s では直りきっていません。

ただ各言語の中で日本語のボタンテキストが最長というわけでもなく、例えばフランス語とかはもっと長いので、結局テキストごとはみ出してしまう場合があります。paddingを詰めればもう少しカバーできるようにはなりますが、最終的にはボタンテキストを原文からもっと短いものに変更するか、あるいは横並びにしないといった変更を加えないと厳しいように思います。

とはいえダイアログの幅を広くすることに問題はないですし、本文も読みやすくなるでしょうから、これはこれで直すことにしました。

設定フォームなどでオートコンプリートが無効にできていなかったのを修正

加えて、2段階認証のコードを入力する欄などにも autocomplete="off" が追加されました。

*1:WebUIではNSFWという言葉を使わなくなっているので、これからは閲覧注意やsensitiveと言った方がいいかもしれませんが

*2:個人的には、別のタブをクリックした時であってもスクロール位置を保持していてほしいと思ったりします。実装を考えると、上部に出てるあれはタブではなくてWebサイトによくあるナビゲーションバー(≒リンク集)と解釈するのが正しい気はするのですが、なまじアプリのタブっぽいんですよねえ…最近になってスワイプでの切り替えも実装されましたし。

:don: 170729 v1.5.0rc2

今回はv1.5.0rc1~rc2の範囲が対象です。

https://github.com/tootsuite/mastodon/compare/v1.5.0rc1…v1.5.0rc2

比較的大きいやつ

ドロップダウンメニューをスマホではモーダルとして表示するように

fix(dropdown_menu): Open as modal on mobile by sorin-davidoi · Pull Request #4295 · tootsuite/mastodon

トゥートの下にある「…」メニューや投稿の公開範囲設定はドロップダウンとして表示されていましたが、スマホでは小さくてタッチしづらい、下の方で表示されるとスクロールする必要がある、などの問題がありました。で、モーダルとしてポップアップするようになりました。なかなか便利ですよ。

シェアボタン

feat(status_action_bar): Web share button by sorin-davidoi · Pull Request #4365 · tootsuite/mastodon feat: Web Share for detailed status and account by sorin-davidoi · Pull Request #4402 · tootsuite/mastodon

トゥートやアカウントをブラウザやOSの機能で共有するボタンが追加されました。が、今のところ特に設定なく使えるブラウザはAndroidChromeの次期バージョンぐらいしかなく、すぐ試したいなら chrome://flags から有効にしたり、Canary版を使うことになります。

参考 Google、ウェブサイトのボタンでAndroidの共有メニューを表示できる「Web Share API」 -INTERNET Watch

アクセシビリティ周りの改善

aria属性などの追加やタグの変更だけでなく、Tab/Enterで多くの要素が操作できるようになったり、PageDown/PageUp/Home/EndでTL内を移動したりできるようになっています。

なおトゥートなどにフォーカス移動できるようになった関係で、クリック時にこれまでなかった枠が表示されたりします。ブーストボタンとか大して見た目が変わらないところもあります。CSSでいじれるところなので、指摘されればなんかなるかも?

admin向け

Docker環境でsw.jsが読み込めない(WebPushが動かない)件

fix #4356 : missing sw.js in Docker environment by skoji · Pull Request #4357 · tootsuite/mastodon

普段MastodonのJSファイルはpacks/に置かれていますが、ServiceWorkerのJSファイルはそれが置かれたディレクトリ以下のページにしか作用することができないため、このsw.jsだけpublic直下に置いていました。が、公式のDocker構成ではこれをボリュームに割り当てていないので、docker-compose run --rm assets:precompile でsw.jsを生成しても保存されずに消えてしまうという問題がありました。

で最終的に、public直下のsw.jsはassets/sw.jsへのシンボリックリンクということになりました。assets/はボリュームが割り当てられているので、ちゃんと保存されるというわけです。

PuSH 購読に何度も失敗する場合、購読を解除する

When PuSH subscribe attempts are exhausted, unsubscribe by Gargron · Pull Request #4422 · tootsuite/mastodon

リトライしなくする修正は少し前に入っていたのですが、失敗したままdeadに積まれ、DB上も購読が切れている(更新待ち)という扱いは変わらずでした。今回の修正でdeadに入ることなく、そのまま購読を解除するようになりました。

細かいやつ

development環境でwebpackが生成したファイルにハッシュ値をつけないように

Remove hash from chunk filename when dev env by ykzts · Pull Request #4411 · tootsuite/mastodon

Webpackでビルドしたファイルにはファイル名にハッシュ値がついていましたが、development環境ではこれを付けないようになりました。開発時は度々再ビルドすることになりますからね…。

ホイールイベントにPassive Event Listenerを使うように

fix(column): Use passive wheel listener by sorin-davidoi · Pull Request #4348 · tootsuite/mastodon

wheel イベントはキャンセル可能なイベントですが、これをあえてキャンセルしないと宣言しておくことで、パフォーマンスの向上を狙うものです。詳しくはこの辺が参考になります。

Passive Event Listeners によるスクロールの改善 | blog.jxck.io

お気に入り一覧の表示を高速化するためのインデックス追加

Add index favourites on account_id and id by akihikodaki · Pull Request #4360 · tootsuite/mastodon

これ自体はそれだけなんですが、Eugen氏からこんなにインデックスいるの?という意見と共に mastodon.social のインデックスサイズがいくつか挙げられていて、ちょっと面白いです。statusesテーブルのサイズと同じくらいstatusesテーブルのインデックスが食ってる。

その他いっぱい

WebPushの通知のグループ化

Sidekiqの管理画面を開いたときにForbiddenが表示されることがある件。

Fix current session not being displayed in sessions list by Gargron · Pull Request #4424 · tootsuite/mastodon

/auth/edit のセッション一覧で「現在のセッション」という表示がされなくなっていた件。一覧に項目自体はあるのですが、古いセッションと同じように表示されてしまっていました。

スワイプでカラムを切り替えたときに、タブの表示が先に切り替わるように。

Sidekiqの処理でPuSH関連のエラーがあった時に、原因のURLやユーザー名を表示するように。

ランディングページに表示されるタイムラインが、Safariでは途中から消えていた件。

federation先でrc1のトゥートに含まれるメンションをクリックしたときに、WebUI内で開かれずに新しいタブが開いていた件。

ランディングページの一番上の3つ並んだリンクがスマホで折り返されていた件とか、インスタンス名の下にやたらでかい空白があった件とか、/about/more に表示されていたデータがスマホでも一行に押し込められていた件とか。