格安VPS GreenCloud ミニレビューで書いたように、最近Linux VPSを契約したので、その中に開発環境をいれてSSHで接続し、ClaudeCodeKiro-CLIOpenCode等を使っています。エディタを含めSSH内ですべて完結するようになると、iPadから接続できると、さらにどこからでも使えて便利では?と思い試したのですが、日本語や通信回りでちょっと工夫が必要だったので、その課題や工夫について記載します。

Linux VPSにiPad, AndroidからSSH接続して開発する場合の課題

仕事ではKiro-CLIを使うことが多いのですが、プライベートでは色々なLLMを触ってみたいという考えで最近はOpenCodeをよく利用しています。とてもリッチなTUI(コンソールアプリ)で、複数のLLMを切り替えて利用できるために、私の用途にぴったりです。

iPad + SSH +OpenCode
iPad + Termius (SSH) + UIM + OpenCode

このOpenCode等の環境はGUI(X)を使っておらず、SSHで接続するだけで使えるので、iPadとBTキーボードでも使えそうと思って試してみたのですが、いくつか課題がありました。

  1. iPadでアプリがバックグラウンドに回るとSSH接続が切れる時があり、作業が失われる(電波状況が悪いところで使った場合も同様で、これはAndroidでも共通)
  2. (私の持っている)iPadのBTキーボードでは一部打てないキーがある(PgUPや、ESC等)
  3. 日本語入力回りの課題

1.の解消方法としては切断に強いmoshをSSHの代りに使うという方法があるのですが、OpenCodeやClaudeCodeといったモダンなTUIアプリは画面描画の書き換えが激しくて、mosh側で差分を吸収しきれずに画面が破綻するという事が発生するため常用は難しいです。ただし一般的なコマンド入力の作業であれば問題ありませんし、vim等は普通に利用できました。

2.については、他の操作で代替したりアプリ側のソフトキーで操作するなどでおおむね対応可能です。

3.については、昔の情報ですとiPad OSではターミナルにiOS側で変換した文字は渡せないとあったのですが、OS側の改善なのかアプリ側なのか、私が試したTermiousではCJK機能を設定からONにすればターミナルに日本語が入力できました(Termius -> Profile -> Settings -> CJK)。

ただ、このCJK入力が各種TUIアプリと相性が悪く、入力すると画面表示が崩れてしまい、利用が困難でした。

iPadからでも問題なく日本語入力できる構成

上記をふまえて、以下の方法で環境を準備し、問題なく利用できています。

  • SSHで接続
  • iPad/Androidアプリとしては、Termiusを利用
  • tmuxで複数画面切り替え+切断時の復帰を実現
    • 切断された場合はSSHで再度接続し、tmux attachコマンドで復帰する
  • 日本語入力はLinuxサーバー側に、uim-fep と uim-mozcを入れてサーバーサイドで日本語変換を実現する(iOSやAndroid側のかな漢字変換を使わない)

uimはLinuxデスクトップ上では使っているので存在は知っていたのですが、GUIの無い環境でもuim-fepが使えるということがこのQuiitaエントリに解説されており、そのおかげで解決策が見つかりました。uim-mozcがかな漢字変換を実現するインプットメソッド、uim-fepがユーザーの入力を受け付けてmozc(やanthy)に渡すフロントエンドです。

つまりSSHで接続してuim-fepで日本語入力可能な環境に入り、そこでtmuxを実行するという形です。若干面倒なのでaliasを作ったり.bashrc側の制御で工夫しています(後述)。

環境構築

簡単に環境構築の方法を紹介します。OSはUbuntu Linux 24.04ですが、他のLinuxディストリビューションでもあまりやるべき作業は変わらないと思います。前提としてSSHサーバーは設定済で、秘密鍵を使ってSSHクライアントから接続可能になっている必要があります。

uim-fep & uim-mozc導入

Ubuntuの場合パッケージがあるのでaptで導入可能です。

sudo apt install uim-fep uim-mozc

次に以下をユーザーの ~/.uim に設定します。ここではCtrl+\ (バックスラッシュもしくは円マーク)を日本語ON,OFFキーに設定しています。

;; uim-fepのデフォルトのインプットメソッドをMozcに設定
(define default-im-name 'mozc)

;; 日本語入力ONのキー設定 (Ctrl + \)
(define-key generic-on-key? '("<Control>\\"))

;; 日本語入力OFFのキー設定 (Ctrl + \)
(define-key generic-off-key? '("<Control>\\"))

ここでいったんuim-fepを起動し、 Ctrl-\ で日本語ON,OFFができるようになったかを確認します。以下のように画面最下段にmozcのステータス表示が出て、Ctrl-\で”あ”が表示されるはずです。この状態になれば日本語入力が出来るようになっています。

tmuxとalias設定

次にtmuxを導入します。tmuxの詳細は省きますが、いわゆるターミナルマルチプレクサで、複数の画面を切り替えたり、ネットワーク切断時にもターミナルのセッションを維持し、あとからセッションにattachして復帰することを実現します。Ubuntuの場合はaptで導入可能です。

sudo apt install tmux -y

~/.tmux.confのカスタマイズ方法については多数情報がありますので、それを参照してください。

今回の環境ではuim-fepを起動をしてその環境の中でtmuxを起動する必要がありますが、これはコマンド1行で実行できます。

uim-fep -e tmux

私の場合は、以下のようにaliasを設定して利用しています。

alias ut='uim-fep -e tmux new-session -As mobile'

tmuxのオプションは、mobileという名前で新セッションを起動するが、同名のセッションが実行中の場合はそれにattachするというオプションです。utと打つと以下のような状態になり、uimとtmuxが起動していることが分かります。

iPadからの接続

iPadのTermiusからSSH接続してutと入力すれば、あとは通常通りです。ネットワークが切断された場合は再度SSH接続して、utで再開です。Termiusは非常に高性能な仮想ターミナルで、モダンなTUIアプリも問題なく描画してくれます。また、今のところバックグラウンドにアプリが回ったり、iPadを画面ロックしてもTermiusがSSH接続を維持している事が多く、あまり再接続せずに済んでいます。これはうれしい誤算でした。

一部BTキーボードに無いために打てないキーに関しては、私の利用範囲ですと以下のようにして対応しています。また、Termius自体にもソフトウェアキーボードがあるので打つ頻度が低いキーに関してはそちらで対応するのでも良いでしょう。

  • ESC : Ctrl-[ で代替
  • PgUP, PgDown (OpenCodeでエージェントからの出力を見る場合) : iPad 画面のスワイプで代替
  • ファンクションキー (F1~F10): Alt-Shift-数字 ※Termiusの設定でキーバインドを変更可能です

なお、tmuxのセッションが残っているかを、接続時に毎回確認しないで良いように、.basrcに以下の設定を入れています。

# SSHログイン時に、もしtmuxセッションが存在すればそれを表示する (tmux内では表示しない)
if [[ -n "$SSH_CONNECTION" && -z "$TMUX" ]]; then
    if command -v tmux >/dev/null 2>&1; then
        tmux_count=$(tmux list-sessions 2>/dev/null | wc -l)

        BLUE='\033[1;34m'
        RESET='\033[0m'
        
        if [[ "$tmux_count" -gt 0 ]]; then
            if [[ "$tmux_count" -eq 1 ]]; then
                echo -e "${BLUE}1 tmux session is running:${RESET}"
            else
                echo -e "${BLUE}$tmux_count tmux sessions are running:${RESET}"
            fi
            tmux ls
        fi
    fi
fi

補足:moshでの接続

前述のようにmoshとOpenCodeやClaudeCodeは相性が悪く、正しく画面描画を転送できないのですが、それ以外の多くのアプリではおおむね問題なく利用できます。moshの場合は自分で再接続する必要がないという点のメリットがあるので、私はmoshもセットアップして必要に応じて使い分けています。

moshで接続した場合、その親プロセスがmosh-serverになる(SSH接続であればsshdになる)という違いがありますので、~/.bashrcに以下の設定を入れることで、moshで接続した場合は(iPadでしかmoshを利用しないので)uim-fepを自動実行するようにしています。

# execしているので~/.bashrcの最後で実行する
if [[ $- == *i* ]] && [ -z "$TMUX" ] && [ -z "$__INSIDE_UIM_FEP" ]; then
    parent_process=$(ps -o comm= -p $PPID 2>/dev/null)
    if [ "$parent_process" = "mosh-server" ]; then
        if command -v uim-fep &> /dev/null; then
            export __INSIDE_UIM_FEP=1
            exec uim-fep
        fi
    fi
fi

“iPadからSSH接続し日本語を利用できる環境をセットアップする”. への1件のコメント

  1. 格安VPS GreenCloud ミニレビュー – Portablecode.info のアバター

    […] このLinux上に作った開発環境にiPadから接続して快適に利用するための設定を別途書いていあますので、ご参考まで。=> iPadからSSH接続し日本語を利用できる環境をセットアップする […]

    いいね

コメントを残す