開発ブログへ戻る エンジニアリング更新

2026年7月 開発アップデート:より安定した Desk、より賢いキーボードが進行中

今月は 3 本立てです。今日ダウンロードできる SharkTTY Desk の修正ビルド、iPhone・iPad アプリの開発状況の正直な報告(進行中——まだ何も出荷されていません)、そして実験的な ターミナルトランスポートのステータスレポート。ここにあるのはエンジニアリング視点の 記録で、簡潔なユーザー向けの説明は新着情報にあります。

SharkTTY Desk 0.8.0 — 7月10日ビルド(公開中)

先週の 0.8.0 リリースのフォローアップビルドで、バージョンは 0.8.0 のままです。 ここからダウンロードできます。

「共有を停止」バグ

これは私たち自身が日常の利用で踏んだバグです。画面が閲覧されている間、macOS は メニューバーに独自のインジケータを出し、そこに独自の「共有を停止」ボタンがあります。 SharkTTY の中からではなくそこからセッションを終了すると、Desk が固まることが ありました。QR コードは消え、サービスは「起動中」を名乗り、再接続はすべて失敗—— アプリを終了して再起動するまで。リモート操作のスイッチを切って入れ直しても直りません。 最悪の種類の故障です。報告できるクラッシュではなく、静かにサービスであることをやめた サービス。

実際に起きていたこと:セッション終了後、エージェントは次の接続に備えてネットワーク リスナーを再構築し、その再構築には同じローカルポートが必要です。ところが旧リスナーの ポート解放は内部クリーンアップの副作用にすぎず、そのタイミングはセッションの終わり方に 依存していました。この特定の経路ではクリーンアップが再構築より大幅に遅れ、あるいは 永遠に完了しないことがあった。再構築はバインドを試み、ポートがまだ握られているのを見て、 結果的にクリーンアップより短かったリトライ枠で諦め、エージェントをリスナー不在のまま 残します。外から見れば、永遠の「起動中」です。

修正はこの受け渡しを偶然から契約に変えます。シャットダウンは今やポートを明示的に解放し、 解放の確認が取れてから再構築を進めます。再バインド自体も辛抱強くなり、試行ごとにログを 残すので、将来の報告は Console から診断できます。持ち帰る教訓:teardown は startup と 同じ決定性に値する。「ポートはそのうち勝手に空く」は契約ではありません。

接続キーの表示

Mac 側の接続キー表示に関する小さな修正が 3 つ。すべて表示だけの話で、キーの生成や保護は 一切変わりません。非表示のキーは 1 文字 1 ドットではなく固定長のプレースホルダーになり、 マスク状態がキーの長さをほのめかさなくなりました。非常に長いカスタムキーは 1 行に収まる よう縮小されます(犯人はフォントと一緒に縮まない字間でした)。そして Desk は「隠す」を 選んだことを再起動をまたいで覚えます——隠す操作が毎朝の雑用であってはいけません。 表示には従来どおり Touch ID かパスワードが必要です。

互換性は変わりません。このビルドは iPhone・iPad の SharkTTY 1.6 以降で 動作します。それより古い場合は SharkTTY Desk 0.5.0 ビルドが引き続き利用できます。

SharkTTY for iPhone & iPad — 開発中

先に明言しておきます:このセクションの内容はまだ何も出荷されていません。開発ビルドで 既に動いていて、次の App Store アップデートに向かっているものです——ローンチまで黙って いるより、現在地をお伝えするほうを選びました。

フローティングキーボード、第二幕

フローティングキーボードが第二幕を迎えます。レイアウトは 1 種類から 6 種類へ——US、 UK ISO、日本語 JIS、フランス語 AZERTY、ドイツ語 QWERTZ、スペイン語 ISO——しかも キーキャップを貼り替えただけではない本物のレイアウトです。欧州レイアウトは AltGr の 第 3 レベルをきちんと備え(| { } [ ] \ の打てないターミナルはターミナルではありません)、ISO 配列には左 Shift 横の追加キー、 fn→F1–F12 はレイアウトごとに物理位置でマッピングされます。全レイアウトを走査して ターミナル必須文字がすべて到達可能なことを証明するテストも書きました——開発中に本当に 2 つのキー漏れを捕まえています。テストとはまさにこういうことで恥をかかせてくれるべき ものです。フローティングキーボード・音声ボード・システムキーボードの切り替えは、 キーボード自身の設定ポップオーバーに収まりました。最初からそこにあるべきでした。

キーの上には新しい候補ストリップが載ります。補完はターミナルが最近出力したテキスト、 このセッションであなたが打った語、そして短い定番シェルコマンド表から。すべて端末上で、 画面に既にあるテキストから計算されます——候補を出すためにどこかへ送信されるものは ありません。キーボードのマイクボタンは押している間だけ聞き取るプッシュトゥトークに 対応し、ライブプレビューは同じストリップに表示、結果はタップしたときだけ挿入されます。 最後の点は意図的な設計です。ターミナルは聞き間違いに容赦がないので、音声がシェルに 直行することはありません。

音声入力ボード

音声入力ボードは、フローティングキーボードが既に持っているウィンドウ作法を取り込みます。 動かせて、サイズを変えられて、シェルが透けて読めるまで不透明度を下げられる。 ひとつの操作体系、ふたつのボード、驚きなし。

切断を生き延びるリモートデスクトップのタブ

とうに直すべきだった一貫性の修正です。リモートデスクトップのセッションを切断するとタブが 閉じ、SSH のセッションを切断するとタブは残って再接続ボタンが出る。同じアプリにふたつの 哲学。Desk のタブは SSH のタブと同じ振る舞いになります——切断してもタブは残り、再接続は ワンタップ、タブを閉じるのはタブ自身の操作だけです。

同期の堅牢性

今月いちばん目立たず、たぶんいちばん重要な仕事。保存したホスト・スクリプト・設定は デバイス間で同期され、アップデートの展開期間中、あなたのデバイス群は必ず複数バージョンの 混在で動きます——これは端のケースではなく、リリース前後の数週間の世界の通常状態です。 同期フォーマットの扱いを作り直しました。新しいバージョンが書いたデータは古いバージョンを 素通りします:古いアプリは理解できない部分を保持し、そのまま書き戻す。詰まることも、 知っている形に静かに潰すこともありません。私たちが自らに課すルールはシンプルです: 古いアプリが、新しいアプリの書いたものを壊せてはならない。この機能をあなたが目にすることは ないでしょう——それこそが狙いです。

実験的:Eternal Terminal トランスポート

SharkTTY は SSH と Mosh を話します。Mosh はターミナルが列車のトンネルを生き延びる理由 ——ただし UDP の上で動き、UDP をまったく通さないネットワークがある。 Eternal Terminal は同じ問題を素の TCP で解きます。そして etserver をすでに自分の マシンで動かしている人は大勢います。私たちの立場は単純です:この問題を解くサーバーを もう運用しているなら、その恩恵を受けるのに私たちのインフラは要らないはず——アプリの側が あなたのサーバーの言語を話すべきです。

そこで、オープンな ET プロトコルのクライアントを Rust でゼロから実装しました。いまでは 実物の etserver を相手に 全行程を完走します:接続し、入力し、途中でリンクを断ち、再接続して、何ひとつ失わない。 現在は実地の走行距離を稼ぐため実験フラグの後ろに控えています。十分に走ったら、SSH と Mosh に並ぶ、ホストごとに選べる第三のトランスポートとして登場します。すでに etserver を運用していて、 フラグが開いたら蹴りを入れてみたい方は、このブログを見ていてください。

上記のどれかについて質問やバグ報告は?フィードバックボードが最速の連絡先です。