Работаем в IntelliJ IDEA на слабом железе
- пятница, 10 июля 2020 г. в 00:27:48
Обнаружил секретный репозиторий на гитхабе 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 выдает лучше картинку, но безбожно тормозит. И там и там есть вопросы к качеству мобильных приложений — если хочется запускать на планшете.
Что же делать? Сколько надо полоскать рот, чтобы извести оттуда привкус мыла?
Вот как выглядит картинка на моем планшете Huawei MediaPad M5:
Вначале я хотел сфотографировать шрифты с близкой дистанции, но неспособность камеры Sony RX100 v5 сфокусироваться на таком расстоянии похоронила эту идею. Вместо этого держите нотариально заверенный скриншот:
Видите косяки в шрифтах, покорёженных джипегом?
Не трудитесь, их там нет. Это настоящие векторные шрифты, и Идея тоже настоящая. Ну, почти. Это полноэкранный браузер.
Магия заключается в том, что в репозитории проекта Projector на GitHub лежит запускатор IntelliJ IDEA в серверном режиме.
Судя по всему, Projector работает на переписанном изнутри рендерере AWT из OpenJDK. Теперь AWT рисует всё не на обычных поверхностях из операционной системы, а прямо в браузере. Как именно эта магия работает я сейчас быстро описать затрудняюсь — это тема для отдельной статьи.
Но эффект потрясающий — любое приложение, написанное на Java и Swing, автоматически начинает работать в браузере без переписывания кода!
Сразу видно, что проект очень экспериментальный. Эта штука для тех, кто очень любит всё новое и хочет попробовать использовать в повседневной жизни. Но ставить на эту штуку свою жизнь я бы не стал.
Расскажу о том, как всё это запустить и начать разбираться. Дальше вы уже сами.
Общие инструкции есть вот в официальном репозитории.
Алгоритм действий:
Вам понадобится компьютер с 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. Ну или просто руками каждый раз набирать заново.
Скачиваем репозиторий со сборочными скриптами:
git clone https://github.com/JetBrains/projector-docker.git
cd ./projector-docker
Собираем и запускаем образ:
./clone-projector-core.sh
./build-container.sh
./run-container.sh
Если вы всё это время работали на своём (локальном) компьютере, то ссылка выглядит так: http://localhost:8080/projector/.
Если же вы запускаете всё это на удалённой машине (например, в облаке), то ссылка выглядит так: http://hostname:8080/projector/?host=hostname&port=8887.
Вместо hostname
нужно ввести IP-адрес вашего сервера или доменное имя. Обратите внимание, что hostname в URL встречается два раза. Без этого не заработает.
Проблемы:
hostname
появилось два слеша (//
). В Firefox все должно работать без этого хака. Предупреждая вопрос, частично включить шифрование можно (для вебсокета), но это настолько муторно, что я не стал бы этим заморачиваться прямо сейчас.Стандартный браузер Google Chrome в Android тратит слишком много места на всякие ненужные вещи вроде адресной строки. Для решения этой проблемы поможет бесплатное приложение Fully Kiosk Browser.
Если вам не мешает адресная строка, но мешают органы управления Android, то можно использовать бесплатное приложение Fullscreen Immersive.
Одновременно и то и другое использовать не имеет смысла, т.к. FUlly Kiosk Browser уже умеет отключать органы управления Android-оболочки и делает это по-умолчанию.
Понятия не имею! Из всех эппловских девайсов у меня есть только служебный макбук и личный айфон. На айфоне проверять всё это бессмысленно (экран слишком маленький), а на макбуке никаких проблем не существует.
Идём в файлы проекта, которые мы скачали ранее, открываем файл 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 обнаружилось настоящая гора золота. К сожалению, чудес не бывает, и наверняка, это золото охряняют драконы. Посмотрим, кто выйдет на свет!