- PVSM.RU - https://www.pvsm.ru -
Обнаружил секретный репозиторий на гитхабе 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 [1] лежит запускатор IntelliJ IDEA в серверном режиме.
Судя по всему, Projector работает на переписанном изнутри рендерере AWT из OpenJDK. Теперь AWT рисует всё не на обычных поверхностях из операционной системы, а прямо в браузере. Как именно эта магия работает я сейчас быстро описать затрудняюсь — это тема для отдельной статьи.
Но эффект потрясающий — любое приложение, написанное на Java и Swing, автоматически начинает работать в браузере без переписывания кода!
Сразу видно, что проект очень экспериментальный. Эта штука для тех, кто очень любит всё новое и хочет попробовать использовать в повседневной жизни. Но ставить на эту штуку свою жизнь я бы не стал.
Расскажу о том, как всё это запустить и начать разбираться. Дальше вы уже сами.
Общие инструкции есть вот в официальном репозитории [1].
Алгоритм действий:
Вам понадобится компьютер с Docker.
Завести всё это можно и без Docker, но конкретно эта статья подразумевает его наличие, ибо без Docker всё становится куда сложнее.
"Сервер" может быть как машиной в облаке, так и вашим обычным компьютером — неважно.
Я всё тестировал в двух конфигурациях: Linux на десктопе и Linux на удалённой виртуалке с четырьмя ядрами и 4 гигабайтами оперативной памяти. Для других операционных систем могут потребоваться корректировки.
В Ubuntu 16.04 установка докера делается вот по этой инструкции [2]. Если у вас другая операционная система — придется погуглить самостоятельно.
Краткое содержание установки 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/ [3].
Если же вы запускаете всё это на удалённой машине (например, в облаке), то ссылка выглядит так: http://hostname:8080/projector/?host=hostname&port=8887 [4].
Вместо hostname
нужно ввести IP-адрес вашего сервера или доменное имя. Обратите внимание, что hostname в URL встречается два раза. Без этого не заработает.
Проблемы:
hostname
появилось два слеша (//
). В Firefox все должно работать без этого хака. Предупреждая вопрос, частично включить шифрование можно (для вебсокета), но это настолько муторно, что я не стал бы этим заморачиваться прямо сейчас.Стандартный браузер Google Chrome в Android тратит слишком много места на всякие ненужные вещи вроде адресной строки. Для решения этой проблемы поможет бесплатное приложение Fully Kiosk Browser [6].
Если вам не мешает адресная строка, но мешают органы управления Android, то можно использовать бесплатное приложение Fullscreen Immersive [7].
Одновременно и то и другое использовать не имеет смысла, т.к. 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 [8]
Для облачного сервера: https://hostname:8080/projector/?host=//hostname&port=8887&token=mypassword [9]
Про это я написал на Хабре отдельную статью [10]. Приготовьтесь к тому, что придется сделать кучу нудной работы в консоли.
Можно мгновенно придумать множество областей, где поможет этот проект:
Кто знает, что ещё нас ждёт! Перспективы безграничные.
Надо сказать, что MediaPad M5 двухлетней давности на чипсете Kirin 960 — не самая мощная машина в истории. (Зато это толстый надежный кирпич металла, которым можно копать землю в огороде!) И конечно, при редактировании большого количества текста появляются тормоза перерисовки. Браузеру сложно рисовать столько графики быстро.
Тем не менее, чтобы что-то отлаживать — этого уже вполне достаточно. Отладчик будет красивый, четкий и приятный, а не как через Remote Desktop.
Если же запускать всё это на ноутбуке, тормозов почти нет. Особенно если там есть видеокарта, а не как у планшета MediaPad M5, где вместо видеокарты работает Mali-G71.
Найдено чудесное решение для запуска IntelliJ IDEA (и всех IDE от JetBrains) на удалённом сервере.
Если честно, это чуть ли не лучшая новость про IDEA за последние годы. Новый хоткей — это приятно, но в целом — ничего не меняет. Projector же меняет всё. Удивительно, что об этом никто ничего не пишет, что из каждого утюга не доносится победная песнь проекта Projector.
Сам я сейчас занимаюсь тем, что пытаюсь упаковать запускатор IDEA в качестве нативного приложения для Windows, Android и iOS с помощью нативных для платформы средств (Electron и WebView). Некоторое время еще нужно писать код, а потом публикация на сторы может занять длительное время. Как чего получится — напишу статью на Хабр.
Где-то в богом забытом репозитории на GitHub обнаружилось настоящая гора золота. К сожалению, чудес не бывает, и наверняка, это золото охряняют драконы. Посмотрим, кто выйдет на свет!
Автор: Олег Чирухин
Источник [11]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/java/354817
Ссылки в тексте:
[1] в репозитории проекта Projector на GitHub: https://github.com/JetBrains/projector-docker
[2] по этой инструкции: https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-16-04
[3] http://localhost:8080/projector/: http://localhost:8080/projector/
[4] http://hostname:8080/projector/?host=hostname&port=8887: http://hostname:8080/projector/?host=hostname&port=8887
[5] http://host:8080/projector/?host=//hostname&port=8887: http://host:8080/projector/?host=//hostname&port=8887
[6] Fully Kiosk Browser: https://www.fully-kiosk.com/
[7] Fullscreen Immersive: https://play.google.com/store/apps/details?id=immersive.duna.com.immersivemode&hl=en
[8] https://localhost:8080/projector/?token=mypassword: https://localhost:8080/projector/?token=mypassword
[9] https://hostname:8080/projector/?host=//hostname&port=8887&token=mypassword: https://hostname:8080/projector/?host=//hostname&port=8887&token=mypassword
[10] отдельную статью: https://habr.com/ru/post/510282/
[11] Источник: https://habr.com/ru/post/510210/?utm_source=habrahabr&utm_medium=rss&utm_campaign=510210
Нажмите здесь для печати.