Перейти к содержанию

Терминальный тренажер кодинга

Раз уж речь зашла о поделках — надо упомянуть еще об одной, которую я довел до ума в последнее время.

У меня есть давний пет-проект, который вроде бы умер, но иногда вспоминается и руки тянутся что-нибудь там доделать. Я имею в виду проект учебной платформы.

Один из репозиториев этого проекта я недавно решил вытащить на свет и допилить. Это бэкенд для выполнения учебных заданий по языкам программирования: виджет, встраиваемый в статические HTML-страницы, который связывается с FastAPI на бэкенде и отдает терминал с готовой средой для выполнения задания. В рамках учебной платформы я планировал через него встраивать практические задания по кодингу прямо в теоретические курсы.

Я уже было совсем забыл, что у меня был такой замечательный проект. Я продвинулся в нем довольно далеко — по крайней мере, удалось реализовать контейнер со средой и веб-версию терминала, которая отдавала его на фронте через Flask. Но на этом все и закончилось: начались проблемы с доступом к VPN, мысли ушли в другую сторону. Так и не успел сделать то, что планировал изначально, — готовые преднастроенные окружения для разных языков и практические задания к ним. Что-то вроде LeetCode или CodeWar, только — на базе терминальных решений.

Из этого же проекта, кстати, вырос ai-box, о котором я рассказал в прошлый раз.

Вобщем, я решил вернуться к нему и стряхнуть с него пыль. Тому было несколько причин.

Ограничения подступают со всех сторон. Интернет сжимается — неравномерно, но неуклонно; дошло до GitHub, а это уже совсем близко. С другой стороны — подписка одного из моих ключевых AI-провайдеров исчезла с нашего рынка: я успел купить годовую в последний месяц, пока она еще была. Ходят тревожные слухи об ужесточении требований — может, это временно, перед IPO, а может, тенденция и ситуация будет только ухудшаться. Кто знает.

В любом случае, на этой волне я решил вернуться к написанию кода руками — сел за LeetCode, взялся за освоение Go. И тут подумал: а не стряхнуть ли пыль с этого проекта? Ведь это почти готовый тренажер для кодинга, там оставалось не так много.

Так появился Практицираптор - тренажер заданий для быстрой практики кодинга. Нейминг идет от Велоцираптор - самая быстрая и агрессивная зверюга из доисторического периода.

Как известно, в программировании (да и не только), лучшая теория — это практика! Изучать новые языки и фреймворки лучше руками, а не головой, а для небольших сниппетов кода, быстрого кодинга, проверки, как работает то или иное выражение — часто хочется открыть терминал и по быстрому вбросить код. Посмотреть вывод, поэкспериментировать, закрыть и забыть — не отвлекаясь при этом на предварительные ласки (настройку окружения, установку необходимых тулзов, создание структуры проекта). Речь не идет про работу над каким-либо большим проектом и сохранение результата — эта штука создана для быстрых одноразовых сеансов с последующим удалением всех следов. Встречайте!

Бэкенд на FastAPI. Устроен намеренно просто: я решил обойтись без всей сложной логики, кнопочек запуска, проверки и всего прочего, что бывает в таких тренажерах. Если честно — я зажестил и сделал чрезвычайно гиковскую штуку. Говорю об этом с довольной ухмылкой.

Для каждого языка наготове стоит пул из трех контейнеров, готовых запуститься по первому требованию. В контейнере — терминал с настроенной рабочей средой (компилятор или интерпретатор, вспомогательные библиотеки и вся фигня), а также текстовый редактор. И это, конечно же, vim — в качестве IDE для написания кода. Я же говорю — зажестил.

Задания хранятся прямо в образе контейнера и запускаются из браузера уже открытыми на нужном номере. Сейчас, в базе, я сделал три типа заданий: написать выражение, реализовать функцию (для алгоритмических задач), или модульное — когда нужен код из нескольких файлов. Задание включает описание (выводится в терминал на старте), структуру проекта (файлы для работы) и тесты. После завершения сессии контейнер уничтожается, из пула поднимается следующий — таким образом можно поддерживать до трех одновременных сессий.

Для пробы — три языка: Bash, Python, Go. Rust не взлетел: дистрибутив оказался слишком тяжелым для моей полудохлой и почти полностью забитой виртуалки. Зато остальные три — вполне.

Go выбран не случайно: я сейчас смотрю в сторону этого языка, мне кажется у нас с ним совпадает вайб.

Вряд ли эта поделка способна стать коммерческой и популярной, но в качестве рабочего инструмента для прокачки алгосиков и небольших практических заданий — вполне. Я думаю, текущая реализация даже способна пережить наплыв пользователей (в размере до 3 человек))).

Демку можно посмотреть по адресу practiciraptor.com. Предупреждение: под капотом там идет раздача js-фреймоврка через CDN, и без VPN оно, скорее всего, не взлетит. Проклятие шестнадцати килобайт настигло меня и здесь.