Наши услуги

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

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 разработчик
Смотреть все

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

Блог

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

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

Статьи

30.09.2026
Оптимизация кода на Perl: разработка игр Perl редко воспринимают как язык для игр, однако его гибкость, богатая библиотека CPAN и высокая скорость прототипирования делают его вполне пригодным для создания текстовых квестов, roguelike-игр и симуляций. Оптимизация кода в таких проектах критична: даже простая логика на больших картах или при высокой частоте кадров может замедлиться. Рассмотрим практические приёмы ускорения Perl-кода без потери читаемости. Профилирование как первый шаг Прежде чем менять код, необходимо найти узкие места. В Perl для этого есть встроенный модуль Devel::NYTProf или более старый Devel::DProf. Запустите игру с профилировщиком и проанализируйте отчёт: какие подпрограммы вызываются чаще всего; сколько времени уходит на регулярные выражения; где происходят лишние копирования структур данных. В играх типичные «горячие точки» — обсчёт коллизий, обновление состояния объектов и рендеринг текстового интерфейса. Оптимизация структур данных Perl-хэши удобны, но на больших объёмах работают медленнее массивов. Для игрового поля (например, тайловой карты) лучше использовать одномерный массив с индексом y * width + x. Это ускоряет доступ в 2–3 раза. Для объектов игрока, врагов и предметов вместо хэшей с произвольными ключами применяйте массивы фиксированной длины или Class::XSAccessor — он генерирует XS-аксессоры, работающие почти как в C. Замените %tile на @tile с известным размером. Избегайте вложенных хэшей там, где хватит плоской структуры. Используйте pack и unpack для хранения больших массивов чисел. Ускорение регулярных выражений Регулярные выражения — мощный инструмент Perl, но в игровом цикле они могут стать тормозом. Если вы парсите команды игрока или диалоги NPC, компилируйте шаблоны один раз с флагом /o или через qr//. Для простых проверок (например, «является ли символ цифрой») используйте index или substr вместо regex. В цикле обновления игры откажитесь от regex вовсе, если это возможно. Управление памятью и копированием Perl копирует данные при передаче в подпрограммы, если не использовать ссылки. В играх с тысячами объектов это критично. Передавайте ссылки на массивы и хэши, а внутри функции работайте с @{$ref}. Избегайте возврата больших списков — возвращайте ссылку. Используйте wantarray для контекстно-зависимого поведения. Применяйте Scalar::Util::refaddr для сравнения ссылок без копирования. Игровой цикл и тайминги Основной цикл игры должен быть максимально лёгким. Разделите логику на фиксированные шаги (например, 60 обновлений в секунду) и рендеринг. Для задержек используйте Time::HiRes::sleep, а не sleep с целыми секундами. Если игра сетевая, выносите тяжёлые вычисления в отдельные процессы через fork или threads. Но помните: потоки в Perl требуют копирования данных, поэтому обмен через очереди должен быть минимальным. Кэширование и мемоизация Многие игровые вычисления повторяются: путь поиска, урон от оружия, генерация случайных чисел с ограничениями. Используйте мемоизацию через Memoize или собственный хэш-кэш. Определите функцию, которая вызывается с одними и теми же аргументами. Сохраните результат в хэше по ключу из аргументов. Перед вычислением проверяйте наличие ключа. Для генерации случайных чисел в играх применяйте Math::Random::MT — он быстрее встроенного rand и даёт лучшие последовательности. Снижение накладных расходов на ООП Классическое ООП в Perl через bless и хэши удобно, но медленно. Для игровых сущностей рассмотрите: Class::XSAccessor — быстрые аксессоры; Mouse или Moo с XS-бэкендом; плоские структуры с функциями вместо методов. Если игра небольшая, откажитесь от объектов вовсе: используйте массивы и подпрограммы, работающие с ними по ссылке. Практический пример: оптимизация коллизий Допустим, у вас есть массив врагов и игрок. Наивная проверка каждого врага с каждым — O(n²). Для 100 врагов это 10 000 проверок за кадр. Решение — пространственное разбиение: Разделите карту на сетку ячеек. Каждый объект привяжите к ячейке. Проверяйте коллизии только внутри соседних ячеек. Это снижает сложность до O(n) и даёт кратный прирост FPS даже на Perl. Итог Оптимизация Perl-кода для игр строится на трёх принципах: измеряй, а не угадывай; избегай копирований и лишних абстракций; используй XS-модули там, где важна скорость. Начните с профилирования, затем перейдите к структурам данных и игровому циклу. Даже скромные изменения — замена хэшей на массивы, компиляция regex и мемоизация — способны ускорить текстовую игру в несколько раз, сохранив гибкость и выразительность Perl.
29.09.2026
Внедрение методологии разработки в ActionScript: руководство для лидера ActionScript, несмотря на завершение официальной поддержки Flash Player, остаётся важным языком для поддержки legacy-проектов, авиационных тренажёров, интерактивных инсталляций и образовательных приложений. Для технического лидера внедрение методологии в такой среде — задача особая: команда часто небольшая, кодовая база унаследована, а сроки сжаты. Ниже — практический план действий. Почему ActionScript требует отдельной методологии Язык имеет ряд особенностей, которые напрямую влияют на организацию процесса: Динамическая типизация при слабом контроле компилятора повышает риск ошибок времени выполнения. Событийная модель на базе EventDispatcher провоцирует запутанные цепочки вызовов, если нет дисциплины. Устаревший инструментарий — Apache Flex SDK, Flash Builder, старые версии Ant и Maven — ограничивает автоматизацию. Дефицит специалистов означает, что знания хранятся у одного-двух разработчиков, а не в команде. Именно поэтому лидеру важно выбрать методологию, устойчивую к неопределённости и не требующую тяжёлой инфраструктуры. Выбор подхода: Kanban с элементами Scrum Для команд ActionScript-разработки оптимален Kanban с ограничением WIP и короткими еженедельными синхронизациями. Полноценный Scrum с двухнедельными спринтами часто не работает из-за непредсказуемых задач по поддержке legacy-кода. Ключевые принципы Визуализируйте поток задач на доске: Backlog, In Progress, Review, Testing, Done. Ограничьте количество одновременных задач на разработчика — не более двух. Введите обязательный code review для каждого изменения в .as и .mxml файлах. Проводите ежедневный стендап на 10 минут и еженедельный обзор метрик. Роль лидера на каждом этапе внедрения Лидер — не наблюдатель, а активный участник. Его задача — снять сопротивление и показать выгоду на конкретных примерах. Первый месяц: диагностика Начните с аудита кодовой базы. Подсчитайте количество файлов, средний размер классов, число FIXME и TODO. Соберите статистику по частоте регрессий. Эти цифры станут основой для аргументации изменений. Второй месяц: пилот Выберите один модуль и примените к нему новую методологию. Покажите команде измеримый результат: снижение числа багов на 20–30% или ускорение релиза. Успех пилота — главный аргумент для масштабирования. Третий месяц: масштабирование Распространите практики на остальные модули. Введите единый шаблон pull request, автоматическую проверку стиля через FlexPMD и обязательное покрытие критичных классов тестами на FlexUnit. Инструменты, которые стоит внедрить Система контроля версий — Git с обязательной стратегией ветвления Git Flow. CI — Jenkins или GitLab CI с шагом сборки через Ant или Maven. Статический анализ — FlexPMD и ASDocs для контроля качества. Тестирование — FlexUnit для юнит-тестов, Selenium с Flash-плагином для приёмочных. Трекинг задач — Jira или YouTrack с настроенными workflow. Типичные ошибки лидера Избегайте крайностей. Не пытайтесь внедрить всё сразу — команда утонет в процессах. Не игнорируйте сопротивление: опытные ActionScript-разработчики часто скептичны к «модным» практикам. Не заменяйте живое общение ритуалами: короткий разговор решает больше, чем формальная встреча. Помните: методология — это инструмент, а не самоцель. Её задача — сделать работу команды предсказуемой, а код — поддерживаемым. Метрики успеха Отслеживайте четыре показателя: Lead Time — время от задачи до релиза. Change Failure Rate — доля релизов, вызвавших инциденты. Deployment Frequency — частота выкаток. Покрытие тестами — доля критичных классов под тестами. Рост первых трёх метрик и увеличение покрытия — объективный признак того, что методология прижилась. Заключение Внедрение методологии в ActionScript-проект — это управление изменениями в среде с ограниченными ресурсами и унаследованным кодом. Лидер должен действовать последовательно: диагностировать, показать результат на пилоте, масштабировать и измерять. Только так команда получит предсказуемый процесс, а продукт — устойчивое развитие, несмотря на устаревающий стек.
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 — это фундамент, на котором строятся в
Открыть все статьи
bg_1
Остались вопросы? Задавайте их немедленно.
мы проконсультируем совершенно бесплатно