Наши услуги

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

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

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

Блог

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

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

Статьи

10.10.2026
Awk для сеньора: оптимизация запросов к базе данных без ORM Когда речь заходит об оптимизации запросов к базе данных, взгляд сеньора обычно устремляется к планам выполнения, индексам и статистике. Но есть инструмент, который незаслуженно остаётся в тени при решении задач ETL, аудита и анализа логов — awk. Это не замена SQL, а мощный слой предобработки и постобработки, способный снять нагрузку с БД ещё до того, как запрос попадёт на сервер. Почему awk актуален в эпоху ORM Современный стек часто строится вокруг ORM: ActiveRecord, Hibernate, SQLAlchemy. Удобство оборачивается генерацией неоптимальных запросов, N+1-проблемами и лишними round-trip'ами. Сеньор понимает: не каждый анализ требует БД. Иногда данные уже лежат в CSV-выгрузке, логе репликации или дампе, и гонять их через PostgreSQL ради агрегации — это сжигать IOPS впустую. Awk обрабатывает поток построчно, держит в памяти только нужное состояние и работает со скоростью, близкой к grep. На гигабайтных выгрузках это даёт выигрыш в десятки раз по сравнению с загрузкой в промежуточную таблицу. Базовый шаблон обработки выгрузки Типичный сценарий: есть CSV с миллионами строк, нужно посчитать метрики по группам без единого запроса к БД. awk -F',' 'NR>1 {sum[$3]+=$5; cnt[$3]++} END {for(k in sum) print k, sum[k]/cnt[k]}' dump.csv Разберём, что здесь важно для сеньора: NR>1 — пропуск заголовка без внешних утилит. sum[$3]+=$5 — хеш-таблица в памяти вместо временной таблицы в БД. END — агрегация выполняется один раз, а не на каждой строке. Такой подход снимает нагрузку с СУБД полностью: сортировка, группировка и join происходят на стороне клиента. Соединение двух источников: awk как in-memory join Классическая задача — обогатить факты измерениями. Если измерение маленькое (справочник стран, тарифов, статусов), его можно загрузить в память и выполнить join без обращения к БД. awk -F',' 'NR==FNR {dim[$1]=$2; next} {print $0, dim[$1]}' dims.csv facts.csv Условие NR==FNR — идиома, которую сеньор обязан знать наизусть: она отличает первый файл от последующих. Это дешевле, чем JOIN в БД, если справочник помещается в RAM и не требует транзакционной согласованности. Оптимизация самого SQL через предварительный фильтр Awk полезен не только как замена агрегации, но и как генератор компактного входного множества. Вместо запроса с огромным IN (...) из сотен тысяч идентификаторов, который ломает планировщик, можно собрать список ключей и передать его через VALUES или временную таблицу. Отфильтровать нужные ID из лога через awk. Записать результат в файл или stdin. Загрузить через COPY в PostgreSQL или LOAD DATA в MySQL. Выполнить join с основной таблицей по индексированному ключу. Такой pipeline превращает неоптимальный запрос с seq scan в индексный доступ. Планировщик получает точную статистику по временной таблице и строит корректный план. Продвинутые приёмы для сеньора Контроль памяти через ограничение хеша Хеш-таблицы в awk растут неограниченно. На датасетах с высокой кардинальностью это приводит к OOM. Решение — предварительная сортировка и потоковая агрегация: sort -t',' -k3,3 dump.csv | awk -F',' '{if($3!=prev){print prev,sum; sum=0; prev=$3} sum+=$5}' Сортировка внешняя, память O(1) по числу групп. Цена — дополнительный проход, но на больших объёмах это выгоднее, чем swap. Использование нескольких проходов вместо сложного состояния Сеньор предпочитает два простых прохода одному запутанному. Awk позволяет читать файл повторно, храня промежуточные результаты в отдельные файлы — это упрощает отладку и снижает риск ошибок в логике. Интеграция с psql и mysql через pipe Комбинация awk и клиента БД даёт гибкость: awk формирует запросы пачками, клиент выполняет их, результат снова проходит через awk для постобработки. Это классический Unix-подход, который в руках сеньора превращается в надёжный ETL-конвейер без тяжёлых фреймворков. Когда awk не подходит Инструмент не универсален. Отказывайтесь от него, если: Нужна транзакционная согласованность и MVCC. Данные не помещаются на диск клиента. Требуется сложная аналитика с оконными функциями. Логика уже реализована в БД и оптимизирована планировщиком. Awk — это скальпель, а не молоток. Его сила в точном применении там, где БД избыточна. Итог Оптимизация запросов к базе данных начинается не с EXPLAIN, а с вопроса: должен ли этот запрос вообще идти в БД. Awk позволяет сеньору перенести часть работы на клиент, снизить нагрузку на сервер и получить результат быстрее, чем любой ORM. Владение awk — это маркер зрелости инженера, понимающего, что лучший запрос к базе данных — тот, который не нужно выполнять.
06.10.2026
SCSS для мидл-разработчика: от синтаксиса до архитектуры SCSS (Sassy CSS) — это один из двух синтаксисов препроцессора Sass, полностью совместимый с обычным CSS. Для разработчика уровня middle недостаточно знать вложенность и переменные: важно понимать компиляцию, организацию кода, работу с миксинами, функциями и модульной архитектурой. Эта статья поможет систематизировать знания и закрыть пробелы, которые часто всплывают на код-ревью и технических интервью. Чем SCSS отличается от Sass и Less Многие путают SCSS и Sass, считая их синонимами, но это разные синтаксисы одного препроцессора. Sass использует отступы вместо фигурных скобок и не требует точек с запятой, тогда как SCSS — это надмножество CSS: любой валидный CSS-файл является валидным SCSS-файлом. Именно поэтому SCSS стал де-факто стандартом в современных проектах. Отличия от Less принципиальнее: Sass реализован на Ruby (и Dart Sass для современной компиляции), имеет более мощную систему функций и модулей, а также строгую типизацию значений. Less ближе к CSS по поведению переменных и не предоставляет такой гибкости в работе с коллекциями и миксинами. Базовый синтаксис, который должен быть доведён до автоматизма Переменные и область видимости Переменные объявляются через $ и имеют лексическую область видимости. Внутри блока переменная, объявленная заново, не перезаписывает внешнюю, если не использовать флаг !global. Локальные переменные видны только внутри блока, где объявлены. Глобальные переменные объявляются на верхнем уровне файла. !default позволяет задать значение по умолчанию, которое можно переопределить до импорта. Вложенность и селектор родителя Вложенность — главная причина проблем с производительностью CSS у начинающих. Мидл-разработчик должен осознанно ограничивать глубину вложенности тремя уровнями и использовать амперсанд & для генерации составных селекторов. Избегайте вложенности ради краткости — она увеличивает специфичность. Применяйте & для псевдоклассов, псевдоэлементов и модификаторов БЭМ. Помните, что & подставляет весь составной селектор, а не только последний элемент. Партиалы, импорт и модули Файлы с префиксом _ называются партиалами и не компилируются в отдельные CSS. Исторически использовался @import, но он устарел: сегодня применяется @use и @forward, которые изолируют пространства имён и предотвращают дублирование кода. @use подключает модуль с собственным неймспейсом. @forward реэкспортирует члены модуля для внешнего использования. @import оставлен для обратной совместимости, но в новых проектах не применяется. Миксины, функции и плейсхолдеры Миксины Миксин — это блок стилей, который можно переиспользовать через @include. В отличие от плейсхолдеров, миксины копируют код в каждое место вызова, поэтому злоупотребление ими раздувает CSS. Миксины стоит применять для параметризуемых конструкций: медиазапросов, генерации сеток, вендорных префиксов. Если стили не принимают аргументов и не зависят от контекста — лучше использовать плейсхолдер %name и @extend. Функции Встроенные функции Sass (map-get, nth, lighten, mix) покрывают большинство задач. Начиная с Dart Sass многие цветовые функции помечены как устаревшие — им на смену пришли модульные аналоги, например color.adjust и color.scale. Пользовательские функции объявляются через @function и обязательно возвращают значение через @return. Их удобно использовать для вычислений на основе карт конфигурации. Плейсхолдеры и @extend Плейсхолдеры не попадают в итоговый CSS, если не были расширены. @extend объединяет селекторы в один список, что уменьшает размер файла, но может непредсказуемо влиять на каскад. Используйте их точечно — например, для базовых классов кнопок или типографики. Структура проекта и архитектура Классический подход — паттерн 7-1: семь директорий (abstracts, base, components, layout, pages, themes, vendors) и один корневой файл main.scss. Такая структура предсказуема для команды и упрощает онбординг новых разработчиков. Abstracts — переменные, миксины, функции, плейсхолдеры. Base — сброс стилей, типографика, базовые теги. Components — независимые UI-блоки: кнопки, карточки, формы. Layout — каркас страницы: хедер, футер, сайдбар, сетка. Pages — стили, специфичные для конкретных страниц. Themes — цветовые схемы и темы оформления. Vendors — сторонние библиотеки и их переопределения. Для мидла важно не просто знать структуру, а уметь обосновать её выбор: где заканчивается компонент и начинается лейаут, как избежать циклических зависимостей между партиалами, почему @use предпочтительнее глобальных переменных. Типичные ошибки и как их избежать Глубокая вложенность — приводит к раздутой специфичности и конфликтам. Использование @import — дублирует CSS и замедляет сборку. Миксины вместо плейсхолдеров — лишний объём итогового файла. Глобальные переменные без !default — усложняют переопределение в темах. Игнорирование source maps — затрудняет отладку в браузере. Отдельно стоит упомянуть производительность: современные
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.
Открыть все статьи
bg_1
Остались вопросы? Задавайте их немедленно.
мы проконсультируем совершенно бесплатно