diff --git a/TZ.md b/TZ.md index 8433fd9..ad6aca6 100644 --- a/TZ.md +++ b/TZ.md @@ -9,7 +9,7 @@ **Ник `cacto` (кактус) — сквозной мотив:** - Пиксельный кактус (16×16 или 32×32 спрайт, зелёный/серебро на чёрном) как лого в шапке и favicon. - ASCII-арт кактуса в hero-блоке главной страницы. -- Терминальные префиксы вместо обычных заголовков/навигации: `cacto@matrix:~$ whoami`, `cacto@matrix:~$ ls projects/`, `cacto@matrix:~$ ./battlecity`. +- Терминальные префиксы вместо обычных заголовков/навигации: `cacto@matrix:~$ whoami`, `cacto@matrix:~$ ls projects/`, `cacto@matrix:~$ ./tanks`. - Названия комнат в лобби генерируются в формате `cactus-room-01`, `cactus-room-02`, ... - Характер, а не просто ник: живучесть, минимум ресурсов, "колючий" стиль текста в отдельных местах (например, error-сообщения). @@ -19,7 +19,7 @@ |---|------|------------| | 1 | `index.html` | Резюме — PHP/Go backend, опыт КИПиА/АСУТП | | 2 | `projects.html` | Карточки проектов со ссылками на репозитории | -| 3 | `game.html` | BattleCity: лобби + игра | +| 3 | `game.html` | ./tanks: лобби + игра (танки, собственная разработка — без привязки к товарным знакам) | ## 3. Структура проекта diff --git a/frontend/assets/dmitry-gammel-cv.pdf b/frontend/assets/dmitry-gammel-cv.pdf new file mode 100644 index 0000000..e4dd294 Binary files /dev/null and b/frontend/assets/dmitry-gammel-cv.pdf differ diff --git a/frontend/assets/og.png b/frontend/assets/og.png new file mode 100644 index 0000000..acfbf43 Binary files /dev/null and b/frontend/assets/og.png differ diff --git a/frontend/css/game.css b/frontend/css/game.css index 342113b..6e43c75 100644 --- a/frontend/css/game.css +++ b/frontend/css/game.css @@ -89,7 +89,7 @@ color: var(--color-accent-dim); } -#battlecity-canvas-container { +#tanks-canvas-container { position: relative; max-width: 900px; margin: 1.5rem 0; diff --git a/frontend/css/resume.css b/frontend/css/resume.css index 53de471..9bf8c37 100644 --- a/frontend/css/resume.css +++ b/frontend/css/resume.css @@ -22,6 +22,27 @@ max-width: 34ch; } +.hero-actions { + display: flex; + flex-wrap: wrap; + gap: 0.75rem; + margin-top: 1.25rem; +} + +.hero-actions__btn { + border: 1px solid var(--color-accent-dim); + color: var(--color-fg); + font-size: 0.85rem; + padding: 0.45rem 0.9rem; +} + +.hero-actions__btn:hover { + border-color: var(--color-accent); + color: var(--color-accent); + box-shadow: 0 0 6px var(--color-accent-dim); + text-decoration: none; +} + .status-line { display: flex; align-items: center; @@ -169,6 +190,18 @@ section { margin-top: 0.1rem; } +.site-footer { + border-top: var(--border); + margin-top: 1rem; + padding: 1.5rem 0 0; +} + +.site-footer p { + color: var(--color-silver); + font-size: 0.85rem; + margin: 0; +} + @media (max-width: 640px) { .hero { flex-direction: column; diff --git a/frontend/game.html b/frontend/game.html index 6836907..b265145 100644 --- a/frontend/game.html +++ b/frontend/game.html @@ -3,7 +3,7 @@ - ./battlecity — cacto + ./tanks — cacto @@ -23,7 +23,6 @@ @@ -31,9 +30,9 @@
-

./battlecity

+

./tanks

- +
diff --git a/frontend/index.html b/frontend/index.html index 9509451..d18f4f4 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -3,8 +3,15 @@ - cacto — Гаммель Дмитрий, PHP/Go backend - + cacto — Гаммель Дмитрий, PHP backend-разработчик + + + + + + + + @@ -24,14 +31,198 @@
-
+ +
+
+ +
+
STATUS: OPEN TO WORK
+

Гаммель Дмитрий

+

PHP-разработчик (Backend, Middle+/Senior)

+

От электрического сигнала до строчки кода.

+ +
+
+ +
+

01cat about.txt

+

Backend-разработчик, 6 лет коммерческого опыта на PHP. Работаю с legacy, сложными запросами и архитектурными решениями — там, где «просто добавить фичу» не получается.

+

Спроектировал аналитический контур на ClickHouse: отчёты формировались 3–4 минуты, стали за 10–15 секунд. Вёл разработку модуля документооборота в банковской IT-инфраструктуре — архитектура, декомпозиция, код-ревью, онбординг разработчиков.

+

Начинал с электротехники и АСУТП: писал управляющий софт для промышленных систем на ST, поднимал SCADA. Путь «от электрического сигнала до строчки кода» помогает быстро вникать в чужие системы и в задачи на стыке железа и бэкенда.

+

Ищу позицию Middle+/Senior backend. Основной стек — PHP, параллельно пишу на Go.

+
+ +
+

02ls -la experience/

+
    +
  1. +
    март 2026 — настоящее время · 5 месяцев
    +

    Программист АСУТП и КИПиА

    +
    Уралэнергоаква · Екатеринбург
    +
      +
    • -Временный период вне основной специальности после завершения проекта в ЭТП ГПБ. Ищу позицию backend-разработчика; параллельно — пет-проекты и Go.
    • +
    +
  2. +
  3. +
    июль 2022 — март 2026 · 3 года 9 месяцев
    +

    PHP-разработчик

    +
    ООО «ЭТП ГПБ» (дочернее АО «Газпромбанк») · Екатеринбург
    +
      +
    • -Разрабатывал и поддерживал внутреннюю систему электронного документооборота для согласования и контроля исполнения договоров.
    • +
    • -Поддерживал и развивал legacy-проект на Zend Framework, участвовал в архитектурном переходе на Symfony; PHP 7.4 → 8.0.
    • +
    • -Переписывал построители запросов на «чистый» SQL с оптимизацией под PostgreSQL, внедрял сервисный слой архитектуры.
    • +
    • -Спроектировал и реализовал аналитический контур отчётности на ClickHouse — сократил время формирования отчётов с 3–4 минут до 10–15 секунд.
    • +
    • -Реализовал интеграции с внутренними банковскими сервисами, включая проверку электронной подписи и машиночитаемых доверенностей.
    • +
    • -Работал с очередями сообщений (RabbitMQ) для асинхронной обработки задач.
    • +
    • -Неофициально возглавлял разработку нового модуля документооборота: планировал архитектуру, проводил код-ревью, довёл проект до MVP.
    • +
    • -Работал по Scrum: месячные спринты, таск-трекер YouTrack, оценка задач методом Planning Poker.
    • +
    +
  4. +
  5. +
    март 2021 — июль 2022 · 1 год 5 месяцев
    +

    PHP-разработчик

    +
    фриланс/субподряд · kupisever.ru · удалённо
    +
      +
    • -Дорабатывал бэкенд действующей B2B-платформы (доска объявлений) на Yii2 в качестве субподрядчика, работал самостоятельно на удалённом проекте. Стек: PHP, Yii2, PostgreSQL, RabbitMQ, Docker.
    • +
    • -Разработал модуль email-рассылок с очередями сообщений (RabbitMQ): веб-форма конструктора писем с текстовым редактором и гибкой настройкой параметров рассылки.
    • +
    • -Реализовал модуль категорий объявлений — административную часть (бэкенд) и клиентское меню (фронтенд).
    • +
    +
  6. +
  7. +
    июль 2020 — март 2021 · 9 месяцев
    +

    PHP-разработчик (с обязанностями руководителя группы)

    +
    ИстВуд · Курган
    +
      +
    • -Интернет-магазины на 1С-Битрикс: вёрстка, интеграция готовых модулей, доработка бизнес-логики под задачи клиентов.
    • +
    • -Реализовал интеграции с 1С (обмен товарными каталогами и заказами) и платёжными системами (эквайринг).
    • +
    • -Реализовал нестандартный механизм автоматического получения и обновления каталога товаров (несколько тысяч позиций, ежесуточное обновление) для интернет-магазина на кастомном шаблоне вне типовых решений Bitrix.
    • +
    • -Разработал функционал онлайн-записи на приём к врачу для сайта частной клиники; реализовал интеграцию с фискальным регистратором.
    • +
    • -Участвовал во внедрении Битрикс24: настройка бизнес-процессов и цепочек согласования закупок.
    • +
    • -Фактически руководил командой из 3 разработчиков: распределял задачи, контролировал качество реализации, проводил технические собеседования.
    • +
    +
  8. +
  9. +
    октябрь 2019 — февраль 2020 · 5 месяцев
    +

    Техник по телекоммуникациям

    +
    Урал-М · Курган
    +
      +
    • -Настройка и обслуживание систем СКУД, видеонаблюдения, радиоканальной связи; работа с 1С.
    • +
    +
  10. +
  11. +
    апрель 2014 — июль 2018 · 4 года 4 месяца
    +

    Техник-электрик

    +
    Кирпичный завод, Мясокомбинат, Хлебозавод · Курган
    +
      +
    • -Электромонтажные и наладочные работы на производственных предприятиях.
    • +
    +
  12. +
+
+ +
+

03skills --list

+
+
backend
+
    +
  • PHP8
  • +
  • PHP7
  • +
  • Symfony
  • +
  • Zend Framework
  • +
  • Yii2
  • +
  • PostgreSQL
  • +
  • MySQL
  • +
  • ClickHouse
  • +
  • SQL
  • +
  • RabbitMQ
  • +
  • Docker
  • +
  • Git
  • +
  • REST API
  • +
  • PHPUnit
  • +
  • Composer
  • +
  • ООП
  • +
  • Go
  • +
+
+
+
electrical / automation
+
    +
  • АСУТП
  • +
  • КИПиА
  • +
  • СКУД
  • +
  • Видеонаблюдение
  • +
  • Радиоканальная связь
  • +
  • Электромонтаж
  • +
  • +
+
+
+
soft
+
    +
  • Оптимизация SQL-запросов
  • +
  • Обучение и адаптация junior-разработчиков
  • +
  • Быстрая обучаемость
  • +
+
+
+ +
+

04cat education.txt

+
    +
  • +
    2013
    +
    Неоконченное высшее
    +
    Тюменский государственный нефтегазовый университет (ТюмГНГУ)
    +
    Институт кибернетики, информатики и связи, Электроэнергетика и электротехника
    +
  • +
  • +
    2011
    +
    Свидетельство о квалификации «Электромонтёр 3 разряда»
    +
    ФГБОУ ВПО «Тюменский государственный университет»
    +
  • +
+
+ +
+

05cat contact.txt

+ +
+
+ +
diff --git a/frontend/js/game/battle.js b/frontend/js/game/battle.js index 5f65015..07c70a3 100644 --- a/frontend/js/game/battle.js +++ b/frontend/js/game/battle.js @@ -364,7 +364,7 @@ export function startBattle(networkInstance, payload, ownPlayerId) { const cols = payload.map[0].length; document.getElementById('lobby').style.display = 'none'; - const container = document.getElementById('battlecity-canvas-container'); + const container = document.getElementById('tanks-canvas-container'); container.style.display = 'block'; container.innerHTML = `
diff --git a/frontend/js/game/lobby.js b/frontend/js/game/lobby.js index 5370ca2..e768388 100644 --- a/frontend/js/game/lobby.js +++ b/frontend/js/game/lobby.js @@ -136,7 +136,7 @@ function render() { // Вызывается из battle.js по кнопкам экрана победы/поражения. export function returnToLobbyContainer() { - document.getElementById('battlecity-canvas-container').style.display = 'none'; + document.getElementById('tanks-canvas-container').style.display = 'none'; container.style.display = ''; render(); } diff --git a/frontend/js/projects.js b/frontend/js/projects.js index 85505c3..39e5d30 100644 --- a/frontend/js/projects.js +++ b/frontend/js/projects.js @@ -8,15 +8,15 @@ const DATA = { { name: 'home_automatization', description: - 'Микросервисная платформа умного дома на Go и Laravel. Первая зона — гроубокс (полив, свет, климат), дальше — весь дом.', - tags: ['Go', 'Laravel', 'Docker', 'RabbitMQ', 'ClickHouse', 'gRPC', 'MQTT'], + 'В разработке: архитектура и ТЗ готовы, микросервисы на Go и Laravel собираются. Первая зона — гроубокс (полив, свет, климат), дальше — весь дом.', + tags: ['в разработке', 'Go', 'Laravel', 'Docker', 'RabbitMQ', 'ClickHouse', 'gRPC', 'MQTT'], url: 'https://git.cactoz.su/cacto/home_automatization', linkLabel: 'открыть', }, { name: 'cactoz.su', description: - 'Личный сайт-визитка: резюме, проекты и мультиплеерный клон BattleCity. Тема — Матрица.', + 'Личный сайт-визитка: резюме, проекты и мультиплеерная мини-игра про танки. Тема — Матрица.', tags: ['HTML/CSS/JS', 'C++', 'uWebSockets', 'Quintus.js', 'nginx', 'Docker'], url: 'https://git.cactoz.su/cacto/cactoz.su', linkLabel: 'открыть', @@ -30,15 +30,15 @@ const DATA = { { name: 'home_automatization', description: - 'A microservice smart-home platform on Go and Laravel. First zone is a grow box (watering, lighting, climate), the whole house comes next.', - tags: ['Go', 'Laravel', 'Docker', 'RabbitMQ', 'ClickHouse', 'gRPC', 'MQTT'], + 'Work in progress: architecture and spec are done, Go and Laravel microservices are being built. First zone is a grow box (watering, lighting, climate), the whole house comes next.', + tags: ['in progress', 'Go', 'Laravel', 'Docker', 'RabbitMQ', 'ClickHouse', 'gRPC', 'MQTT'], url: 'https://git.cactoz.su/cacto/home_automatization', linkLabel: 'open', }, { name: 'cactoz.su', description: - 'A personal portfolio site: résumé, projects and a multiplayer BattleCity clone. Matrix theme throughout.', + 'A personal portfolio site: résumé, projects and a small multiplayer tank game. Matrix theme throughout.', tags: ['HTML/CSS/JS', 'C++', 'uWebSockets', 'Quintus.js', 'nginx', 'Docker'], url: 'https://git.cactoz.su/cacto/cactoz.su', linkLabel: 'open', @@ -75,5 +75,10 @@ function render() { .join(''); } -render(); +// index.html-паттерн: projects.html уже содержит серверный RU-рендер этой +// же разметки, перерисовываем через JS только при переключении на EN. +document.title = `${DATA[getLang()].heading} — cacto`; +if (getLang() !== 'ru') { + render(); +} initLangToggle(render); diff --git a/frontend/js/resume.js b/frontend/js/resume.js index 37ed0df..415d82a 100644 --- a/frontend/js/resume.js +++ b/frontend/js/resume.js @@ -8,16 +8,17 @@ const DATA = { statusLabel: 'STATUS: OPEN TO WORK', aboutHeading: 'cat about.txt', about: [ - 'PHP-разработчик с 6-летним коммерческим опытом, специализация — backend, сложные запросы к базам данных, работа с legacy-кодом. Прошёл путь от рядового разработчика до архитектурных и лидерских задач: спроектировал аналитический контур на ClickHouse, ускоривший формирование отчётности в 15-20 раз, неофициально возглавлял разработку модуля документооборота в банковской IT-инфраструктуре, вырос от специалиста без опыта в PHP до фактического руководителя команды за 3 месяца работы в digital-агентстве.', - 'Разносторонний технический бэкграунд: начинал с электротехники и АСУТП, писал управляющий софт для автоматизированных систем — например, для фонтана, который до сих пор работает в центре Кургана под моей программой. Такой путь даёт понимание логики «от электрического сигнала до строчки кода» — это помогает быстро разбираться в сложных legacy-системах и нестандартных задачах.', - 'Разностороннее образование — от электротехники до начального музыкального и театрального — помогает находить нестандартные решения и легко находить общий язык с людьми разного склада.', + 'Backend-разработчик, 6 лет коммерческого опыта на PHP. Работаю с legacy, сложными запросами и архитектурными решениями — там, где «просто добавить фичу» не получается.', + 'Спроектировал аналитический контур на ClickHouse: отчёты формировались 3–4 минуты, стали за 10–15 секунд. Вёл разработку модуля документооборота в банковской IT-инфраструктуре — архитектура, декомпозиция, код-ревью, онбординг разработчиков.', + 'Начинал с электротехники и АСУТП: писал управляющий софт для промышленных систем на ST, поднимал SCADA. Путь «от электрического сигнала до строчки кода» помогает быстро вникать в чужие системы и в задачи на стыке железа и бэкенда.', + 'Ищу позицию Middle+/Senior backend. Основной стек — PHP, параллельно пишу на Go.', ], experienceHeading: 'ls -la experience/', experience: [ { period: 'март 2026 — настоящее время', duration: '5 месяцев', location: 'Екатеринбург', role: 'Программист АСУТП и КИПиА', company: 'Уралэнергоаква', - bullets: ['Временный период вне основной специальности после завершения проекта в ЭТП ГПБ. Продолжаю развиваться как PHP-разработчик, активно ищу позицию по профилю backend-разработки.'], + bullets: ['Временный период вне основной специальности после завершения проекта в ЭТП ГПБ. Ищу позицию backend-разработчика; параллельно — пет-проекты и Go.'], }, { period: 'июль 2022 — март 2026', duration: '3 года 9 месяцев', location: 'Екатеринбург', @@ -67,7 +68,7 @@ const DATA = { ], skillsHeading: 'skills --list', skillGroups: [ - { title: 'backend', items: ['PHP8', 'PHP7', 'Symfony', 'Zend Framework', 'Yii2', 'PostgreSQL', 'MySQL', 'ClickHouse', 'SQL', 'RabbitMQ', 'Docker', 'Git', 'REST API', 'PHPUnit', 'Composer', 'ООП', 'Go (изучаю)'] }, + { title: 'backend', items: ['PHP8', 'PHP7', 'Symfony', 'Zend Framework', 'Yii2', 'PostgreSQL', 'MySQL', 'ClickHouse', 'SQL', 'RabbitMQ', 'Docker', 'Git', 'REST API', 'PHPUnit', 'Composer', 'ООП', 'Go'] }, { title: 'electrical / automation', items: ['АСУТП', 'КИПиА', 'СКУД', 'Видеонаблюдение', 'Радиоканальная связь', 'Электромонтаж', '1С'] }, { title: 'soft', items: ['Оптимизация SQL-запросов', 'Обучение и адаптация junior-разработчиков', 'Быстрая обучаемость'] }, ], @@ -78,6 +79,9 @@ const DATA = { ], contactHeading: 'cat contact.txt', contact: { email: 'cactozzz93@gmail.com', telegram: 't.me/Cactozz', telegramUrl: 'https://t.me/Cactozz' }, + resumeLabel: 'скачать резюме (PDF)', + giteaLabel: 'git.cactoz.su/cacto', + footerHtml: 'P.S. есть ещё ./tanks — мультиплеерная мини-игра, если будет пара свободных минут.', }, en: { name: 'Dmitry Gammel', @@ -86,16 +90,17 @@ const DATA = { statusLabel: 'STATUS: OPEN TO WORK', aboutHeading: 'cat about.txt', about: [ - "PHP developer with 6 years of commercial experience, specializing in backend: complex database queries, legacy code, architecture. Grew from a line developer into architecture and leadership work — designed a ClickHouse analytics pipeline that sped up reporting 15-20x, informally led a new document-workflow module in a bank's IT infrastructure, and went from a PHP beginner to de facto team lead within 3 months at a digital agency.", - "Broad technical background: started in electrical engineering and industrial automation (ACS/KIPiA), writing control software for automated systems — including a fountain that still runs in the center of Kurgan on my program. That path gives an understanding of the full chain, from electrical signal to line of code, which helps me get up to speed fast in complex legacy systems and unfamiliar problems.", - 'A varied education — from electrical engineering to early music and theater — helps find unconventional solutions and get along with people of very different backgrounds.', + "Backend developer, 6 years of commercial PHP experience. I work with legacy code, complex queries, and architecture — the cases where \"just add a feature\" doesn't cut it.", + "Designed a ClickHouse analytics pipeline: reports went from 3–4 minutes to 10–15 seconds. Led development of a document-workflow module in a bank's IT infrastructure — architecture, decomposition, code review, onboarding developers.", + 'Started in electrical engineering and industrial automation: wrote control software for industrial systems in ST, built SCADA systems. The path from electrical signal to line of code helps me get up to speed fast in unfamiliar systems and problems at the intersection of hardware and backend.', + 'Looking for a Middle+/Senior backend position. Main stack is PHP, with Go on the side.', ], experienceHeading: 'ls -la experience/', experience: [ { period: 'Mar 2026 — present', duration: '5 months', location: 'Yekaterinburg', role: 'ACS/KIPiA Programmer (industrial automation)', company: 'Uralenergoakva', - bullets: ["A temporary role outside my core specialty after wrapping up the ETP GPB project. Keep growing as a PHP developer and actively looking for a backend position."], + bullets: ["A temporary role outside my core specialty after wrapping up the ETP GPB project. Looking for a backend position; alongside that — side projects and Go."], }, { period: 'Jul 2022 — Mar 2026', duration: '3 years 9 months', location: 'Yekaterinburg', @@ -145,7 +150,7 @@ const DATA = { ], skillsHeading: 'skills --list', skillGroups: [ - { title: 'backend', items: ['PHP8', 'PHP7', 'Symfony', 'Zend Framework', 'Yii2', 'PostgreSQL', 'MySQL', 'ClickHouse', 'SQL', 'RabbitMQ', 'Docker', 'Git', 'REST API', 'PHPUnit', 'Composer', 'OOP', 'Go (learning)'] }, + { title: 'backend', items: ['PHP8', 'PHP7', 'Symfony', 'Zend Framework', 'Yii2', 'PostgreSQL', 'MySQL', 'ClickHouse', 'SQL', 'RabbitMQ', 'Docker', 'Git', 'REST API', 'PHPUnit', 'Composer', 'OOP', 'Go'] }, { title: 'electrical / automation', items: ['Industrial automation (ACS)', 'KIPiA', 'Access control', 'Video surveillance', 'Radio links', 'Electrical installation', '1C'] }, { title: 'soft', items: ['SQL query optimization', 'Mentoring junior developers', 'Fast learner'] }, ], @@ -156,6 +161,9 @@ const DATA = { ], contactHeading: 'cat contact.txt', contact: { email: 'cactozzz93@gmail.com', telegram: 't.me/Cactozz', telegramUrl: 'https://t.me/Cactozz' }, + resumeLabel: 'download résumé (PDF)', + giteaLabel: 'git.cactoz.su/cacto', + footerHtml: 'P.S. there\'s also ./tanks — a small multiplayer game, if you have a couple of minutes.', }, }; @@ -225,6 +233,10 @@ function render() {

${t.name}

${t.title}

${t.tagline}

+
+ ${t.resumeLabel} + ${t.giteaLabel} +
@@ -255,7 +267,16 @@ function render() {
  • telegram${t.contact.telegram}
  • `; + + const footer = document.getElementById('site-footer'); + if (footer) footer.innerHTML = `

    ${t.footerHtml}

    `; } -render(); +// index.html уже содержит серверный RU-рендер этой же разметки (для +// поисковиков и curl без JS) — перерисовываем через JS только когда +// нужен другой язык, чтобы не терять эту статику зря на каждой загрузке. +document.title = `cacto — ${DATA[getLang()].name}, ${DATA[getLang()].title}`; +if (getLang() !== 'ru') { + render(); +} initLangToggle(render); diff --git a/frontend/projects.html b/frontend/projects.html index 97d485c..2984edd 100644 --- a/frontend/projects.html +++ b/frontend/projects.html @@ -5,6 +5,7 @@ ls projects/ — cacto + @@ -24,18 +25,56 @@
    +
    -

    -

    -
      +

      ls projects/

      +

      Пара вещей, которые я собрал сам, от идеи до продакшена.

      +
        +
      • +
        +
        drwxr-xr-x home_automatization
        + открыть → +
        +

        В разработке: архитектура и ТЗ готовы, микросервисы на Go и Laravel собираются. Первая зона — гроубокс (полив, свет, климат), дальше — весь дом.

        +
          +
        • в разработке
        • +
        • Go
        • +
        • Laravel
        • +
        • Docker
        • +
        • RabbitMQ
        • +
        • ClickHouse
        • +
        • gRPC
        • +
        • MQTT
        • +
        +
      • +
      • +
        +
        drwxr-xr-x cactoz.su
        + открыть → +
        +

        Личный сайт-визитка: резюме, проекты и мультиплеерная мини-игра про танки. Тема — Матрица.

        +
          +
        • HTML/CSS/JS
        • +
        • C++
        • +
        • uWebSockets
        • +
        • Quintus.js
        • +
        • nginx
        • +
        • Docker
        • +
        +
      • +