Наши услуги

Мы предлагаем

serv2
Сайт визитка - лендинг
Одна шаблонная страница - когда надо сегодня
serv2
Сайт магазин с CRM
Главная страница, каталог товаров/услуг, личный кабинет продавца
serv2
Дизайн для своего сайта
Нарисуем вам новый дизайн
serv2
Доработка существующего сайта
Когда что-то сломалось
serv2
Дизайн печатной продукции
Визитки, баннеры, стикеры и прочее нецифровое, что можно будет потрогать :)
serv2
Не знаю как объяснить - посмотрите сами
И такое делаем :)

Почему мы?

Минимум взаимодействий
Минимум взаимодействий
Из материалов только ваша страница или сайт
Всегда на связи
Всегда на связи
Голосовые, текст, видео - как удобно :)
Бывает и дорого, но есть бесплатно
Бывает и дорого, но есть бесплатно
Качество не зависит от цены
Индивидуальный подход
Индивидуальный подход
Разумеется :)
business
Коротко

О нас

wow5
2015
работаем успешно с
wow3
5
Реализованных проектов

Это начало интересного текста обо мне

Чуть позже напишу тут интересный текст

Партнёров пока нет
Но, ты пиши если что :)

Наши работы

Работа 1
Работа 2

Ознакомьтесь с нашим сервисом и комфортным сотрудничеством

Тарифы

Сайтик фри
0
Точно такой лендинг
checkedВаши фото, контакты и тексты
checkedИмя сайта имя.dencompany.ru
checkedБез мелкого шрифта и камней
Лайт
от
5 000
₽/год
Когда сайт пробник понравился и надо расширяться
checkedСамостоятельное имя сайта
checkedИндивидуальные настройки
checkedCRM (личный кабинет продавца)
checkedБез мелкого шрифта и камней
Хочу всё
от
15 000
₽/мес
Когда налажен процесс или не очень, но надо много и не хочется вникать
checkedСамостоятельное имя сайта
checkedИндивидуальный дизайн
checkedCRM (личный кабинет продавца)
checkedПеренос товаров с текущего сайта
checkedБез мелкого шрифта и камней

Профессионалы своего дела

Наша команда

Фото
Fullstack ведущий программист
Денис

О нас говорят

Отзывы клиентов

Фото отзыв
Я — специалист по SMM
Linda
Дизайнер
Фото отзыв
Отзыв 1
Mark
Backend разработчик
Смотреть все

Все, что нужно знать о бизнесе

Блог

Читать блог
Фото блог
25
09.2026
5 основных инструментов для продвижения интернет-бизнеса
Я — специалист по SMM.
Фото блог
25
09.2026
5 основных инструментов для продвижения интернет-бизнеса
Раньше работала дома.
Фото блог
25
09.2026
5 основных инструментов для продвижения интернет-бизнеса
Я работала дома.

Все, что нужно знать о создании сайтов

Статьи

24.09.2026
Асинхронность в Dart: Event Loop, Future и Stream для мидл-разработчика Dart — однопоточный язык с асинхронной моделью выполнения, построенной на event loop. Понимание этой модели отличает мидл-разработчика от джуниора: джуниор просто пишет await и надеется, что всё сработает, а мидл понимает, почему код выполняется именно в таком порядке, и умеет предсказывать поведение программы под нагрузкой. Однопоточность и изоляты Главный тезис, который нужно усвоить: Dart-код в рамках одного изолята выполняется в одном потоке. Это означает, что никакие две функции не выполняются одновременно. Параллелизм достигается не потоками, а изолятами (isolates), каждый из которых имеет собственную память и собственный event loop. Внутри одного изолята concurrency реализуется через очередь событий. Задача разработчика — не блокировать этот поток долгими синхронными операциями, иначе UI зависнет или сервер перестанет отвечать на другие запросы. Event Loop: две очереди Event loop в Dart обрабатывает две очереди в строго определённом порядке: Microtask queue — очередь микрозадач, обрабатывается до полного опустошения. Event queue — очередь событий: таймеры, I/O, сообщения из портов, колбэки Future. Алгоритм работы цикла: Выполнить весь синхронный код текущего стека. Опустошить microtask queue полностью, включая микрозадачи, добавленные в процессе выполнения. Взять одно событие из event queue и выполнить его. Снова опустошить microtask queue. Повторять шаги 3–4 бесконечно. Отсюда практическое следствие: микрозадачи всегда имеют приоритет над событиями. Если бесконечно добавлять микрозадачи, event queue никогда не будет обработана — поток зависнет. Порядок выполнения на примере Рассмотрим классический пример, который часто спрашивают на собеседовании: print('A') — синхронный код, выполняется первым. Future(() => print('B')) — планирует событие в event queue. Future.microtask(() => print('C')) — планирует микрозадачу. print('D') — синхронный код, выполняется до цикла. Порядок вывода: A, D, C, B. Сначала весь синхронный код, затем microtask, и только потом event. Future: контракт и распространённые ошибки Future<T> — это объект, представляющий результат асинхронной операции, который станет доступен позже. У него три состояния: uncompleted, completed with value, completed with error. Ключевые моменты, которые мидл обязан знать: await не блокирует поток — он приостанавливает выполнение текущей функции и возвращает управление event loop. Ошибка внутри async-функции автоматически оборачивается в Future.error. Необработанная ошибка в Future приводит к unhandled exception и может уронить изолят. Future.wait завершается с ошибкой при первом же отклонённом Future, если не указан параметр eagerError: false. Пример корректной обработки Плохой вариант — ловить ошибку через try/catch вокруг await, но забывать про случаи, когда Future не ожидается. Хороший вариант — явно обрабатывать ошибку на границе: Использовать try/catch вокруг await для синхронного стиля. Использовать .catchError для цепочек без await. Никогда не игнорировать возвращаемый Future без обработки ошибок. Stream: поток данных во времени Stream<T> — это последовательность асинхронных событий. Если Future — это одно значение в будущем, то Stream — это много значений, распределённых во времени. Различают два вида: Single-subscription stream — допускает только одного слушателя, события буферизуются до подписки. Broadcast stream — допускает множество слушателей, события теряются, если никто не слушает. Мидл должен понимать разницу между StreamController и StreamController.broadcast, а также уметь трансформировать потоки через map, where, asyncMap, transform. Backpressure и управление потоком Одна из частых проблем при работе со Stream — backpressure, когда производитель генерирует события быстрее, чем потребитель успевает их обрабатывать. Решения: Использовать await for, который естественным образом приостанавливает обработку. Применять pause() и resume() на подписке. Ограничивать буфер через StreamController с явной стратегией. Zone и перехват асинхронных ошибок Zone — механизм, позволяющий перехватывать и обрабатывать асинхронные ошибки и управлять контекстом выполнения. Фреймворки вроде Flutter используют зоны для перехвата ошибок в кадре рендеринга. Мидл должен знать, что runZonedGuarded позволяет обернуть всё приложение и логировать любые необработанные асинхронные исключения. Практические выводы Не блокируйте event loop синхронными вычислениями — выносите их в изолят через compute или Isolate.run. Помните о приоритете microtask queue: не злоупотребляйте scheduleMicrotask. Всегда обрабатывайте ошибки в Future и Stream — иначе получите молчаливый сбой в продакшене. Различайте single-subscription и broadcast streams и выбирайте подходящий тип осознанно. Используйте Zone для централизованного логирования асинхронных ошибок. Понимание event loop — это фундамент, на котором строятся в
21.09.2026
Как объяснить бабушке внедрение методологии в PHP Представьте, что вы пришли к бабушке на кухню и она печёт пироги. У неё есть проверенный рецепт, любимая скалка и порядок действий, который она повторяет каждый раз. В программировании на PHP такой порядок действий и называется методологией. Внедрить методологию — значит договориться всей командой готовить пироги одинаково, чтобы результат был предсказуемым и вкусным. Что такое методология простыми словами Методология — это свод правил, по которым программисты пишут код. Она отвечает на вопросы: кто что делает, в каком порядке, как проверяем результат и как исправляем ошибки. Без неё каждый разработчик варит свою кашу, и в итоге на кухне хаос. Три кита любой методологии Планирование — сначала решаем, что готовим, потом берёмся за продукты. Повторяемость — один и тот же рецепт даёт один и тот же пирог. Контроль — пробуем блюдо до того, как подать гостям. Зачем это нужно именно в PHP PHP — язык простой и доступный, поэтому на нём легко писать код «как получится». Но когда проект растёт, такой код превращается в клубок спагетти. Методология помогает навести порядок: разделить ответственность, использовать фреймворки, писать тесты и проводить ревью кода. Пример из жизни бабушки Если бабушка печёт одна, ей достаточно памяти. Но если она позовёт внуков на помощь, придётся объяснить: кто месит тесто, кто лепит, кто следит за духовкой. Это и есть внедрение методологии на кухне. Пошаговый план внедрения Выбрать методологию, подходящую команде: Scrum, Kanban или лёгкий Scrumban. Договориться о правилах кода: стандарты PSR, единый стиль, обязательные комментарии. Настроить инструменты: Git, Composer, PHPUnit, статический анализатор. Разбить работу на небольшие задачи и распределить роли. Проводить регулярные встречи: планирование, обзор, ретроспектива. Постепенно улучшать процесс, а не ломать всё сразу. Ошибки, которых стоит избегать Внедрять всё и сразу — команда утонет в правилах. Копировать чужой процесс без учёта своих задач. Забывать про обучение и поддержку новичков. Считать методологию самоцелью, а не инструментом. Как понять, что всё получилось Хороший признак — когда бабушка и внуки пекут пироги вместе, никто не путается, а гости хвалят результат. В программировании это значит: код понятен, ошибок меньше, релизы выходят вовремя, а команда не выгорает. Методология — это не бюрократия, а способ сделать общую работу спокойной и предсказуемой. Внедряйте постепенно, обсуждайте с командой и не бойтесь корректировать правила. Тогда PHP-проект будет радовать и разработчиков, и пользователей.
19.09.2026
Интеграция AI/ML в Bash: автоматизация разработки игр Когда речь заходит о разработке игр, Bash редко воспринимают как основной инструмент. Однако именно сценарии командной оболочки отлично подходят для оркестрации задач, которые окружают AI/ML-пайплайны: подготовки датасетов, запуска обучения, оценки моделей и сборки игровых билдов. В этой статье мы разберём, как связать Bash с машинным обучением и где это даёт реальную пользу в геймдеве. Почему Bash уместен в AI/ML-пайплайне Современный AI/ML-стек чаще всего строится на Python, но сам процесс обучения и подготовки данных состоит из множества шагов, которые удобно автоматизировать именно средствами оболочки. Bash даёт несколько ключевых преимуществ: единый интерфейс запуска для разных утилит — от ffmpeg до python и blender; простое управление переменными окружения, путями и версиями артефактов; встроенные средства перенаправления вывода, конвейеров и фоновых процессов; минимальные накладные расходы при запуске в CI/CD и на серверах обучения. Для разработки игр это особенно важно: ассеты, звуки, текстуры и анимации генерируются десятками инструментов, и Bash становится клеем, который связывает их в один воспроизводимый процесс. Подготовка данных для игровых моделей Первый этап любого ML-проекта — сбор и очистка данных. В игровой студии это могут быть логи геймплея, записи сессий, кадры анимаций или диалоги NPC. Bash позволяет быстро пройтись по тысячам файлов и привести их к единому формату. Массовая обработка ассетов Предположим, у нас есть каталог с текстурами, которые нужно уменьшить до единого разрешения и перевести в формат PNG. Простой цикл решает задачу без единой строки на Python: Пройти по всем файлам с расширением tga в каталоге raw/. Для каждого файла вызвать convert с параметром изменения размера. Сохранить результат в каталог processed/ с тем же именем. Записать список обработанных файлов в лог для последующей проверки. Такой подход легко расширяется: вместо convert можно вызывать любую ML-утилиту, например апскейлер на базе нейросети, который принимает путь к файлу и возвращает улучшенную версию. Генерация датасетов для обучения Если модель должна предсказывать поведение игрока, данные обычно берутся из логов. Bash удобно комбинировать с jq и awk, чтобы вырезать нужные поля и собирать их в CSV или JSONL. Это особенно полезно, когда логов много и они разбиты по дням или сессиям. Фильтрация — оставляем только события определённого типа. Агрегация — считаем статистику по сессиям и уровням. Разбиение — делим данные на train и validation без пересечений по игрокам. Оркестрация обучения и оценки моделей Обучение модели — это не один запуск, а серия экспериментов с разными гиперпараметрами. Bash-скрипт позволяет перебрать конфигурации, сохранить результаты и сравнить метрики. Запуск серии экспериментов Классический паттерн — вложенные циклы по числу эпох, размеру батча и скорости обучения. Каждый запуск пишет чекпоинт и лог в отдельную папку, названную по значениям параметров. Это упрощает воспроизведение и откат. Сформировать имя эксперимента из значений гиперпараметров. Создать директорию под артефакты. Запустить обучение с перенаправлением вывода в лог-файл. После завершения сохранить финальные метрики в общий CSV. Если обучение занимает часы, полезно добавить проверку кода возврата и уведомление об ошибке — например, отправку сообщения в чат студии. Оценка и сравнение Когда эксперименты завершены, нужно выбрать лучшую модель. Bash-скрипт может пройтись по всем логам, вытащить целевую метрику с помощью grep и awk, отсортировать результаты и вывести топ-конфигураций. Это экономит время и снижает риск ручной ошибки. Для игровых задач метрика редко бывает единственной: важны и качество предсказаний, и задержка инференса, и размер модели. Поэтому сравнение удобно вести по нескольким столбцам одновременно. Интеграция моделей в игровой билд Обученная модель должна попасть в игру. В зависимости от движка это может быть ONNX-файл, TensorFlow Lite или собственный формат. Bash помогает автоматизировать упаковку и подстановку артефактов в билд. Сборка и копирование артефактов Типичный сценарий: после успешной оценки модель конвертируется в целевой формат и копируется в каталог ресурсов проекта. Скрипт проверяет контрольную сумму, чтобы избежать подмены файла, и обновляет манифест ресурсов. Конвертация — вызов конвертера с нужными флагами оптимизации. Валидация — проверка размера и хеша файла. Копирование — размещение модели в Assets/Models/. Индексация — обновление манифеста и версии ресурсов. Тестирование на игровых сценариях Финальный шаг — прогон автотестов, которые имитируют игровые ситуации и проверяют, что модель ведёт себя адекватно. Bash может запускать headless-сборку, подавать на вход заранее подготовленные последовательности и сравнивать результат с эталоном. Если тесты проходят, скрипт формирует отчёт и помечает билд как готовый к публикации. Если нет — сохраняет дампы и логи для разбора. Практические рекомендации Чтобы Bash-обвязка вокруг AI/ML не превратилась в хрупкий клубок, стоит придерживаться нескольких правил. Всегда начинайте скрипт с set -euo pipefail, чтобы ошибки не проходили незамеченными. Храните параметры в переменных окружения или отдельном конфиге, а не в теле скрипта. Логируйте
Открыть все статьи
bg_1
Остались вопросы? Задавайте их немедленно.
мы проконсультируем совершенно бесплатно