🏡

NeoVimを活用してハイブリッドワークを快適にした話

2023/12/11に公開

自己紹介

こんにちは。株式会社DELTA代表・CTOの丹です。
この記事は Vim Advent Calendar 2023 の10日目の記事となります。

弊社はAWSコスト削減代行をはじめとして、主にベンチャー・スタートアップのCTOを中心に技術支援を行っている会社です。
普段は技術支援の内容について発信していますが、今回は私のハイブリッドリモートワーク環境を支える技術について紹介します。
ほぼ雑談のような話なので、箸休め程度に読んでください!

CTOの仕事について

一般的に、いわゆるCTOの仕事は「上級エンジニア」というよりは経営層でもあるので、エンジニアリングだけをやっていればいいというわけでもありません。
例えば、チームビルディングの目的で一時的に出社を増やすだとか、周辺のステークホルダーとの調整が多く会議が必然的に増えるとか、いろいろな要因でどこかひとつの場所でのみ働ければOK!とはならないのがこのレイヤーの仕事だと思います。

とはいうものの、完全に管理職でいられるほどのスケールもない中では、自ら大量にコードを書いたりPoCを回したりする必要も同時にあるわけです。
そのため、多くの人はスペックの高いノートPCを持ち歩き、会議室に素早く移動したり執務室に戻ってハイスペックなPCで開発をごりごりするのもやる。という選択を取っているかと思います。

ただ、この方針にはいくつか問題が存在していました。

リモートワークはどうするの問題

リモートワーク時に、出社用と同じノートPCを取りまわすと家にPCを忘れてしまいがち。
PCだけならいいのですが、充電器など周辺機器も含めるとリスクが大きいと感じました。

スペック良いノートPC、電池の持ちが悪い問題

これは私だけかもしれませんが、ゲーミングノートPCを使っていたのですが電池の持ちが極端に悪く、40分ほどで落ちてしまっていました。
会議によっては60分の枠のことも多いため、電源のない席についてしまうと詰んでいました。

家のPC(デスクトップ)と状態を同期したい問題

ノートPCでやっていた作業を家のスペックの高いデスクトップPC(リモートワーク用)と同期しないと、環境依存のものなどがうまく動かなかったり、作業の手戻りが発生してしまうので不便 という問題もありました。

スペックの良いノートPC、重い問題

出張などもしていく中で、スペックの高いノートPCはそれ自体かなり重く、荷物が重くなってしまいつらい という問題もありました。

シンクラにしたい

となると、クライアントとなるノートPC自体はスペックを比較的落とし、バッテリーの持ちが良く軽量なものとして、開発環境自体は自宅のデスクトップPCとする、いわゆるシンクライアント構成にすればよいということになります。

ただ、皆さんがご存じのとおり、シンクライアントには一つの致命的な欠点があります。それは

シンクラは遅い

ということです。

いわゆるシンクライアントは、リモートデスクトップ(RCPまたはVNC)にてサーバに接続し、そこで作業をするというものです。
リモートデスクトップは細かく映像をやりとりするため、帯域やクライアント・サーバ双方の負荷が大きくなり、速度が劣化します。

そこで、より小さい情報をやりとりするようにすれば、高速に動作するシンクライアントが実現できるのでは?と考え、SSHでサーバのターミナルに接続し、そこで作業を行うことを考えました。
そうすれば、やり取りする情報はターミナル上に表示される文字列の情報だけになるので、リモートデスクトップで全量をやり取りするより高速に動作するのではないでしょうか。

(Neo)Vimはいいぞ

今回、「SSHで高速に動作するシンクライアント」を実現するため、ターミナル内で軽快に動作する最高のエディタであるVimを採用することにしました。
正確にはNeoVimを使っています。

本稿では、環境を作ってみてどこが良かったかをシェアしたいと思います。

ターミナル内で利用できる

通常のSSH接続だとターミナルを接続することになるため、GUIを前提としたエディタの利用はできません。
(VS CodeやInteliJなども、SSHで内部的な通信はやり取りしつつ、クライアント側のエディタのGUIを利用できるモードがありますが、それについては後述します)

そこで、ターミナル内で軽快に動作する最高のエディタであるVimを採用することにしました。
正確にはNeoVimを使っています。

これにより、SSHでサーバのターミナルに接続し、そこで nvim . することでその場でエディタを立ち上げて開発を開始できるようになりました。

サーバ側でUIを起動できる

他のエディタでも、Over SSHなリモート開発が行える機能は存在します。
ただし、シンクライアントという要件を考えたとき、いわゆるPreferenceは クライアント ではなく サーバ側 に置いておきたいという欲求もありました。

つまり、ノートPC自体を乗り換えたとしても、SSH一本さえつながれば、いつでも・どこからでも同じような開発者体験が実現できるというようにしたかったのですが、Vimはサーバサイドで動いているものをSSH経由で触っているだけなので、そのまま実現ができています。

すぐにサーバ側にスイッチできる

SSHで接続後、すぐにサーバ側のセッションを tmux セッションにプロキシしてその中でNeoVimを起動して仕事をするようにしています。
そうすることで、作業途中でいったん帰宅した際にサーバ側のターミナルを開き、 tmux セッションにアタッチするだけで、全く同じ場所から作業を再開できます。

セキュアかつどこからでも利用できる

SSH接続は Cloudflare Zero Trust の Short Lived Certificate経由で行うようにしています。
これにより、Cloudflare Zero Trustの認証機能で認証された、24時間だけ有効な証明書でのアクセスができるようになっています。

またCloudflare Zero Trustの機能でBrowser Rendering SSHというものを使ってブラウザからSSH接続することもできるようにしています。
この際も同じくCloudflare Zero TrustのShort Lived Certificate機能が利用できます。また当然ですがIncognito Windowなどを使えばウィンドウを閉じればセッションは無効になってくれます。
これによって、どのノートPCからでも安全かつ快適にアクセスできるという状態を担保しました。

この可搬性が可能になった時点で、先ほどの「サーバ側でUIを起動できる」というメリットがさらに大きくなりました。どこからでもアクセスできるなら、どこからでも同じように・同じ作業をしたいですよね!


こういう感じになりました

気を付けるべきことと対策

この構成はかなり標準的な技術を組み合わせているだけなので特に大きな落とし穴はないですが、以下の二点は工夫した点です。

  • NeoVim側のマウス機能をオフにしないと、クライアント側のPCに例えば一時的に発行したURLなどをコピーしてくる術がなくなってしまいます。
    Luaを使っているなら、以下のようにしてマウス機能をOFFにする必要があります。
vim.cmd([[set mouse=]])
  • Webアプリなどを作っている場合、コーディングだけではなく、実際に起動してブラウザから動作確認をしたくなるときもあると思います。その場合は、対象のポートをSSHポートフォワーディングすることで対応可能です。

We're Hiring!

最後までお読みいただきありがとうございます。
DELTAは仲間を募集中です!

まずはカジュアル面談からできればと思います、ぜひPittaから
またはGoogle Formから お申込みください!

Discussion