Обнаружил секретный репозиторий на гитхабе JetBrains под названием Projector. Благодаря нему написал кусок кода в IntelliJ IDEA, запущенной на Android-планшете. Рассказываю, как это повторить.
Проблема
Все мы любим IntelliJ IDEA, но есть с ней неувязочка — она жрёт ресурсы компьютера. Может, крипту майнит, никто не знает.
У всех нас есть что-то вроде старого ноутбука, который ты очень любишь, но работать на нём уже не получается — уж слишком он слабый. На некоторых девайсах Идеи и не было никогда. Например, на Android-планшетах. Зайдите на сайт — нет там сборки под Arm.
(На самом деле, это не совсем правда, запустить Идею на Arm можно — но поддержки не заявлено и ссылки на странице загрузки нет. Раз уж мы начали колдовать, то надо рубить правду-матку).
В отдельном аду жарятся последователи секты DevOps. Если ты разработчик в среде с кучей современных DevOps-инструментов, то твоя среда исполнения локально на макбуке и на проде — это две совершенно разные вещи. Отсюда возникают всякие миникубы, тиллеры, лупбэк прокси и прочие костыли. Остюда — ноут, обжигающий коленки во время билда.
Примерно те же проблемы у пользователей C++. Большие проекты вроде браузера Chromium могут занимать на жестком диске десятки гигабайт и компилироваться сутками напролёт. Когда ноутбук уходит в троттлинг от перегрева, пользоваться им не очень удобно. SSD протираются до дыр, а если SSD напаян и гарантия закончилась — выбрасывать его придется вместе с ноутбуком.
Решением было бы разделить фронтенд и бэкенд IDE. Запускаем тяжелый вычислительный бэкенд в дата-центре, или просто на своём домашнем Threadripper 3990X. Соединяемся с бэкендом из локального приложения, написанного на Java.
К сожалению, IntelliJ IDEA так сдизайнена, что до последнего времени сделать этого было нельзя. Ну, почти. Не надо быть гением, чтобы догадаться, что в Rider как-то общаются между собой Java-фронт и .NET-бэк, но использовать это в своих корыстных целях никак нельзя.
Удалённый рабочий стол — отстой
Конечно, многие пытались запускать Идею через TeamViewer, Microsoft Remote Desktop, VNC, и так далее. Существуют компании, которые только так и работают — сотрудники сидят на удалёнке и кодят через Remote Desktop.
Видите в этом проблему? Вот, посмотрите:
Теперь я должен вам новые глаза!
Это то, что вы видите при соединении через удалённый рабочий стол. Все ощущения изящества интерфейсов, чёткости шрифтов, вся магия Идеи куда-то улетучиливается, и во рту остаётся только горечь от пожатого джипегом мыла.
Из этого можно вынести какой-то опыт. Например, TeamViewer тормозит меньше, но изображение больше артефачит. RDP выдает лучше картинку, но безбожно тормозит. И там и там есть вопросы к качеству мобильных приложений — если хочется запускать на планшете.
Что же делать? Сколько надо полоскать рот, чтобы извести оттуда привкус мыла?
Ваше слово, товарищ Projector!
Вот как выглядит картинка на моем планшете Huawei MediaPad M5:
Вначале я хотел сфотографировать шрифты с близкой дистанции, но неспособность камеры Sony RX100 v5 сфокусироваться на таком расстоянии похоронила эту идею. Вместо этого держите нотариально заверенный скриншот:
Видите косяки в шрифтах, покорёженных джипегом?
Не трудитесь, их там нет. Это настоящие векторные шрифты, и Идея тоже настоящая. Ну, почти. Это полноэкранный браузер.
Магия заключается в том, что в репозитории проекта Projector на GitHub лежит запускатор IntelliJ IDEA в серверном режиме.
Почему это работает?
Судя по всему, Projector работает на переписанном изнутри рендерере AWT из OpenJDK. Теперь AWT рисует всё не на обычных поверхностях из операционной системы, а прямо в браузере. Как именно эта магия работает я сейчас быстро описать затрудняюсь — это тема для отдельной статьи.
Но эффект потрясающий — любое приложение, написанное на Java и Swing, автоматически начинает работать в браузере без переписывания кода!
Хочу! Что нужно делать?
Сразу видно, что проект очень экспериментальный. Эта штука для тех, кто очень любит всё новое и хочет попробовать использовать в повседневной жизни. Но ставить на эту штуку свою жизнь я бы не стал.
Расскажу о том, как всё это запустить и начать разбираться. Дальше вы уже сами.
Общие инструкции есть вот в официальном репозитории.
Алгоритм действий:
- Подготовить сервер (только для использования в облаке)
- Сбилдить и запустить докерные образы
- Открыть IDEA в браузере
- PROFIT
Подготовка сервера
Вам понадобится компьютер с Docker.
Завести всё это можно и без Docker, но конкретно эта статья подразумевает его наличие, ибо без Docker всё становится куда сложнее.
"Сервер" может быть как машиной в облаке, так и вашим обычным компьютером — неважно.
Я всё тестировал в двух конфигурациях: Linux на десктопе и Linux на удалённой виртуалке с четырьмя ядрами и 4 гигабайтами оперативной памяти. Для других операционных систем могут потребоваться корректировки.
В Ubuntu 16.04 установка докера делается вот по этой инструкции. Если у вас другая операционная система — придется погуглить самостоятельно.
Краткое содержание установки Docker на Ubuntu 16.04:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get update
sudo apt-get install -y docker-ce
sudo usermod -aG docker ${USER}
sudo reboot
Дальше нужно немного поднастроить саму операционку. Если вы используете Linux-десктоп как рабочую машину в графическом режиме, то ничего делать не нужно.
Если же вы хотите развернуть что-нибудь вроде тестового сервера в облаке (благо сейчас это делается двумя щелчками мыши в Amazon и других облачных сервисах), нужно будет поставить пару пакетов.
Суть в том, чтобы у вас в командной строке появились xvfb (виртуальный фреймбуфер) и dbus-launch. Зачем нужен фреймбуфер я сказать затрудняюсь, но без этого не работают скрипты сборки. Вероятно, тяжелое наследие AWT.
Вот что нужно установить для Ubuntu 16.04:
apt install xvfb dbus dbus-x11 gnome-keyring
Устанавливать gnome-keyring приходится по внутренним убунтовым причинам. Иначе окажется, что у вас проблемы с секретами для десктопа. Если у вас не Ubuntu, то скорей всего, это не нужно.
Дальше нужно создать фреймбуфер:
Xvfb :99
export DISPLAY=:99
Скрипт этот стоит засунуть куда-нибудь в автозагрузку. Например, в юнит systemd. Ну или просто руками каждый раз набирать заново.
Собираем и запускаем образ Projector
Скачиваем репозиторий со сборочными скриптами:
git clone https://github.com/JetBrains/projector-docker.git
cd ./projector-docker
Собираем и запускаем образ:
./clone-projector-core.sh
./build-container.sh
./run-container.sh
Заходим в IntelliJ IDEA из браузера
Если вы всё это время работали на своём (локальном) компьютере, то ссылка выглядит так: http://localhost:8080/projector/.
Если же вы запускаете всё это на удалённой машине (например, в облаке), то ссылка выглядит так: http://hostname:8080/projector/?host=hostname&port=8887.
Вместо hostname
нужно ввести IP-адрес вашего сервера или доменное имя. Обратите внимание, что hostname в URL встречается два раза. Без этого не заработает.
Проблемы:
- Если вы используете прокси (именно прокси, а не VPN), временно отключите. Проблемы с пробросом вебсокетов через прокси всё ещё существуют в 21 веке.
- Если вы используете Google Chrome в качестве браузера, он может начать перебрасывать вас с HTTP на HTTPS. Попробуйте вот такую ссылку: http://host:8080/projector/?host=//hostname&port=8887. Заметьте, что слева от
hostname
появилось два слеша (//
). В Firefox все должно работать без этого хака. Предупреждая вопрос, частично включить шифрование можно (для вебсокета), но это настолько муторно, что я не стал бы этим заморачиваться прямо сейчас.
Как работать в Android
Стандартный браузер Google Chrome в Android тратит слишком много места на всякие ненужные вещи вроде адресной строки. Для решения этой проблемы поможет бесплатное приложение Fully Kiosk Browser.
Если вам не мешает адресная строка, но мешают органы управления Android, то можно использовать бесплатное приложение Fullscreen Immersive.
Одновременно и то и другое использовать не имеет смысла, т.к. FUlly Kiosk Browser уже умеет отключать органы управления Android-оболочки и делает это по-умолчанию.
Как работать в iOS
Понятия не имею! Из всех эппловских девайсов у меня есть только служебный макбук и личный айфон. На айфоне проверять всё это бессмысленно (экран слишком маленький), а на макбуке никаких проблем не существует.
Как запаролить соединение?
Идём в файлы проекта, которые мы скачали ранее, открываем файл run-container.sh
и ищем строчку:
docker run --rm -p 8080:8080 -p 8887:8887 -it "$containerName" bash -c "nginx && ./run.sh"
И добавляем туда ещё один параметр с негуманоидным именем, значение которого — ваш пароль:
docker run --rm
--env ORG_JETBRAINS_PROJECTOR_SERVER_HANDSHAKE_TOKEN=mypassword
-p 8080:8080 -p 8887:8887 -it "$containerName" bash -c "nginx && ./run.sh"
Теперь контейнер можно запускать!
./run-container.sh
Теперь можно пойти в браузер и подключиться по новому URL. Новый отличается от старого наличием параметра token с вашим паролем.
Для локальной машины: https://localhost:8080/projector/?token=mypassword
Для облачного сервера: https://hostname:8080/projector/?host=//hostname&port=8887&token=mypassword
Как сделать безопасное соединение?
Про это я написал на Хабре отдельную статью. Приготовьтесь к тому, что придется сделать кучу нудной работы в консоли.
Перспективы
Можно мгновенно придумать множество областей, где поможет этот проект:
- Удалённая разработка;
- Коллаборативная разработка;
- Комфортная удалённая отладка;
- Ускорение раундтрипа в приложениях с большими данными;
- Работа в защищенном контуре;
- Мгновенное разворачивание рабочего места;
- Работа с Очень Большими Монорепозиториями;
- Интеграция в инфраструктуру облачных компаний;
Кто знает, что ещё нас ждёт! Перспективы безграничные.
Проблемы
Надо сказать, что MediaPad M5 двухлетней давности на чипсете Kirin 960 — не самая мощная машина в истории. (Зато это толстый надежный кирпич металла, которым можно копать землю в огороде!) И конечно, при редактировании большого количества текста появляются тормоза перерисовки. Браузеру сложно рисовать столько графики быстро.
Тем не менее, чтобы что-то отлаживать — этого уже вполне достаточно. Отладчик будет красивый, четкий и приятный, а не как через Remote Desktop.
Если же запускать всё это на ноутбуке, тормозов почти нет. Особенно если там есть видеокарта, а не как у планшета MediaPad M5, где вместо видеокарты работает Mali-G71.
Выводы
Найдено чудесное решение для запуска IntelliJ IDEA (и всех IDE от JetBrains) на удалённом сервере.
Если честно, это чуть ли не лучшая новость про IDEA за последние годы. Новый хоткей — это приятно, но в целом — ничего не меняет. Projector же меняет всё. Удивительно, что об этом никто ничего не пишет, что из каждого утюга не доносится победная песнь проекта Projector.
Сам я сейчас занимаюсь тем, что пытаюсь упаковать запускатор IDEA в качестве нативного приложения для Windows, Android и iOS с помощью нативных для платформы средств (Electron и WebView). Некоторое время еще нужно писать код, а потом публикация на сторы может занять длительное время. Как чего получится — напишу статью на Хабр.
Где-то в богом забытом репозитории на GitHub обнаружилось настоящая гора золота. К сожалению, чудес не бывает, и наверняка, это золото охряняют драконы. Посмотрим, кто выйдет на свет!
Автор: Олег Чирухин