Pull to refresh
44
0.1
Несмеянов Кирилл @SerafimArts

Руководитель Отдела Сокрытия Раскрытых Рептилоидов

Send message

Паттерн Aggregate Outside

Level of difficulty Medium
Reading time 5 min
Views 6K

Руслан Гнатовский aka @Number55 в свой статье Когда ни туда, ни сюда, или в поисках оптимальной границы Domain слоя описал известную проблему протекания бизнес-логики из агрегата, в случае если эта логика зависит от данных которые находятся вне агрегата, и предложил несколько решений этой проблемы, каждое из которых не лишено недостатков. Многие из этих недостатков были описаны в статье а также в комментариях поэтому я не буду здесь дублировать эту информацию а попытаюсь предложить решение которое этих недостатков лишено.

Читать далее
Total votes 25: ↑25 and ↓0 +25
Comments 17

DreamBerd — идеальный язык программирования

Reading time 12 min
Views 25K

DreamBerd - идеальный язык программирования. Вот его фичи!

Когда вы закончите знакомиться со всеми фичами, ознакомьтесь с примерами.

Восклицательные знаки!

Будьте смелее! Заканчивайте каждое утверждение восклицательным знаком!

print("Hello world")!

Если вы чувствуете себя особенно смелым, вы можете использовать еще больше!!!

print("Hello world")!!!

Если вы не уверены, ничего страшного. Вместо этого вы можете поставить вопросительный знак в конце строки. Он выводит для вас отладочную информацию об этой строке в консоль.

print("Hello world")?

Возможно, вам интересно, что Dreambird использует для оператора "не", который в большинстве других языков является восклицательным знаком. Это просто - вместо оператора 'не' используется точка с запятой.

if (;false) {

   print("Hello world")!

}

Читать далее
Total votes 89: ↑86 and ↓3 +83
Comments 45

Игровой программный рендеринг в 2022-м году

Reading time 28 min
Views 25K


Программный рендеринг был широко распространён в играх на ПК до повсеместного распространения т. н. 3d-ускорителей (видеокарт). Каждая игра содержала свой собственный код рендеринга, каждая игра имела свои уникальные особенности в нём. Но с распространением видеокарт программный рендеринг в играх умер.


Я раньше задавался вопросом, а что было бы, если бы программный рендеринг был бы до сих пор распространён? В конечном итоге, я решил реализовать свой программный рендеринг, нацеленный на современные процессоры, чтобы это узнать.

Читать дальше →
Total votes 196: ↑196 and ↓0 +196
Comments 57

Раз нормально, два нормально… Или имитация объема в плоскости

Reading time 24 min
Views 5.9K

В прошлом мы уже рассказывали о том, какие существуют карты для моделей и как они используются. А также поведали о том, как сделать имитацию плоского изображения из объёмного с помощью целлшейдинга. Теперь настала очередь сделать объём из плоскости.
Читать дальше →
Total votes 46: ↑45 and ↓1 +44
Comments 1

Как работает ConcurrentHashMap

Reading time 5 min
Views 164K
В октябре на хабре появилась замечательная статья про работу HashMap. Продолжая данную тему, я собираюсь рассказать о реализации java.util.concurrent.ConcurrentHashMap.
Итак, как же появился ConcurrentHashMap, какие у него есть преимущества и как он был реализован.
Читать дальше →
Total votes 105: ↑100 and ↓5 +95
Comments 14

Как стать мидлом или сеньором-разработчиком, обучаясь на любых курсах по программированию?

Reading time 1 min
Views 122K

Подробно рассказываем, как стать мидлом или сеньором-разработчиком, ежедневно обучаясь на курсах по программированию в течение года или даже двух.

Читать далее
Total votes 546: ↑508 and ↓38 +470
Comments 178

Обзор расширения OPCache для PHP

Reading time 33 min
Views 121K


PHP — это скриптовый язык, который по умолчанию компилирует те файлы, которые вам нужно запустить. Во время компилирования он извлекает опкоды, исполняет их, а затем немедленно уничтожает. PHP был так разработан: когда он переходит к выполнению запроса R, то «забывает» всё, что было выполнено в ходе запроса R-1.

Очень маловероятно, что на production-серверах PHP-код изменится между выполнением нескольких запросов. Так что можно считать, что при компилированиях всегда считывается один и тот же исходный код, а значит и опкод будет точно таким же. И если извлекать его для каждого скрипта, то получается бесполезная трата времени и ресурсов.
Читать дальше →
Total votes 56: ↑55 and ↓1 +54
Comments 25

Vulkan. Руководство разработчика. Проходы рендера (Render passes)

Reading time 9 min
Views 5K


Меня зовут Александра, я работаю в IT-компании CG Tribe в Ижевске и занимаюсь переводом Vulkan Tutorial на русский язык (ссылка на источник — vulkan-tutorial.com).

Сегодня хочу поделиться переводом заключительных глав раздела, посвященного графическому конвейеру (Graphics pipeline basics), — Render passes и Conclusion.

Содержание
Читать дальше →
Total votes 5: ↑5 and ↓0 +5
Comments 0

Spring bean custom scope

Reading time 5 min
Views 37K
Я попробую привести пример, когда бывает нужен Spring custom scope.

Мы — компания B2B и SAAS, и у нас бегут по таймеру некие долгие процессы для каждого из клиентов.
У каждого из клиентов есть какие то свойства (имя, тип подписки и т.д.).
Раньше мы делали наши сервисы prototype бинами и передавали каждому из них в конструкторе все необходимые свойства клиента и запущенного процесса (flow — имеется ввиду логический процесс, job, а не процесс ОС):
Как плохо было и как хорошо стало, когда мы сделали свой spring bean scope
Total votes 7: ↑6 and ↓1 +5
Comments 7

Двоичные и побитовые операции в PHP

Reading time 12 min
Views 12K

Недавно я обратил внимание, что в разных проектах мне приходится активно писать побитовые операции на PHP. Это очень интересное и полезное умение, которое пригодится начиная с чтения двоичных файлов до эмуляции процессоров.

В PHP есть много инструментов, помогающих манипулировать двоичными данными, но хочу сразу предупредить: если вам нужно супернизкоуровневая эффективность, то этот язык не для вас.

А теперь к делу! В этой статье я расскажу много интересного о побитовых операциях, двоичной и шестнадцатеричной обработке, которые будут полезны в ЛЮБОМ языке.
Читать дальше →
Total votes 41: ↑38 and ↓3 +35
Comments 11

Этот восхитительный Юникод

Reading time 27 min
Views 92K


Перед вами обновляемый список самых замечательных «вкусностей» Юникода, а также пакетов и ресурсов

Юникод — это потрясающе! До его появления международная коммуникация была изнурительной: каждый определял свой отдельный расширенный набор символов в верхней половине ASCII (так называемые кодовые страницы). Это порождало конфликты. Просто подумайте, что немцам приходилось договариваться с корейцами, где чья кодовая страница. К счастью, появился Юникод и ввёл общий стандарт. Юникод 8.0 охватывает более 120 000 символов из более 129 письменностей. И современные, и древние, и до сих пор не расшифрованные. Юникод поддерживает текст слева направо и справа налево, наложение символов и включает самые разные культурные, политические, религиозные символы и эмодзи. Юникод потрясающе человечен, а его возможности сильно недооцениваются.
Читать дальше →
Total votes 64: ↑64 and ↓0 +64
Comments 56

Хорошее публичное выступление: 11 простых советов

Reading time 5 min
Views 42K

Дисклеймер


Это список не конечен и не претендует на истину в последней инстанции — я структурировал свой опыт публичных выступлений и выбрал самые универсальные советы, выполнение которых позволит почти гарантированно сделать выступление как минимум неплохим.

1. Структура доклада


Парадоксально, но многие докладчики даже на крутых конференциях зачастую не делят своё выступление на три основные части – формулировка проблемы, предпринятые шаги, выводы. Структура может быть сложнее, но базовая она почти всегда такая, даже если вывод – «у нас ничего не получилось».

Ключевая проблема для слушателя – отсутствие вводной части. Выводы он может сделать и сам, а вот стартовать с опозданием сложно и неприятно. Он ещё не понял, что вы будете про пищеварение, а уже нужно вникать в строение эпителия тонкого кишечника. Результат – ваш доклад попадает в слушателя не на все 100%, а имеет шансы и вовсе пролететь мимо.
Читать дальше →
Total votes 67: ↑64 and ↓3 +61
Comments 36

Shader — это не магия. Написание шейдеров в Unity. Введение

Reading time 5 min
Views 38K
Всем привет! Меня зовут Дядиченко Григорий, и я основатель и CTO студии Foxsys. Сегодня хочется поговорить про шейдеры. Умение писать шейдеры (и в целом работать с рендером) очень важно при разработке под мобильные платформы или AR/VR, если хочется добиться крутой графики. Многие разработчики считают, что шейдеры — это магия. Что по ним мало хорошей информации, и что чтобы их писать нужно иметь, как мимимум, звание кандидата наук. Да, разработка шейдеров по своим принципам сильно отличается от клиентской разработки. Но основное понимать базовые принципы работы шейдеров, а так же знать их суть, чтобы в этом не было ничего магического и поиск информации по этой теме был простой задачей. Данная серия статей рассчитана на новичков, так что если вы разбираетесь в программировании шейдеров, данная серия вам не будет интересна. Всем же кто хочет разобраться в этой теме — добро пожаловать под кат!


Total votes 17: ↑17 and ↓0 +17
Comments 17

Реализация PEG парсера

Reading time 8 min
Views 5.2K

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



В этом разделе я закладываю основы для понимания работы парсера, на примере простой самописной реализации игрушечной грамматики из прошлой статьи.

Читать дальше →
Total votes 16: ↑16 and ↓0 +16
Comments 3

PEG парсеры

Reading time 7 min
Views 13K

Несколько лет назад меня кто-то спросил имеет ли смысл превести Python на PEG-парсер (или на грамматику PEG; я не помню точно кто и когда это было). Тогда я немного посмотрел на него, но так и не пришёл к какому-либо выводу, а потому и отбросил эту тему. Недавно я узнал больше о PEG (Parsing Expression Grammars, грамматике по парсингу выражений), и теперь я думаю, что это интересная альтернатива самописному генератору парсеров, который был разработан 30 лет назад, когда только начинал работать над Python. Я назвал его «pgen», и это был, наверно, первым фрагментом кода, который я написал для Python.



Причина, по которой я сейчас заинтересован в парсере PEG, заключается в том, что меня несколько раздражают ограничения pgen. Он построен на собственной реализации LL(1), которая имеет ряд допущений. Например, мне не нравились грамматические правила, которые могли бы генерировать пустые строки, поэтому я запретил их. И тем самым упростил алгоритм для создания таблиц синтаксического анализа. Я также изобрёл свою собственную EBNF-подобную грамматическую нотацию, которая мне до сих пор очень нравится.

Читать дальше →
Total votes 25: ↑25 and ↓0 +25
Comments 9

FFI: пишем на Rust в PHP-программе

Reading time 7 min
Views 18K

В PHP 7.4 появится FFI, т.е. можно подключать библиотеки на языке C (или, например, Rust) напрямую, без необходимости писать целый extension и разбираться в его многочисленных нюансах.


Давайте попробуем написать код на Rust, и используем его в PHP-программе
Читать дальше →
Total votes 76: ↑76 and ↓0 +76
Comments 23

Асинхронный PHP и история одного велосипеда

Reading time 12 min
Views 29K

После выхода PHP7 появилась возможность сравнительно небольшой ценой писать долгоживущие приложения. Для программистов стали доступны такие проекты, как prooph, broadway, tactician, messenger, авторы которых берут на себя решение наиболее частых проблем. Но что если сделать небольшой шаг вперёд, углубившись в вопрос?


Попробуем разобрать судьбу ещё одного велосипеда, который позволяет реализовать Publish/Subscribe приложение.

Читать дальше →
Total votes 36: ↑35 and ↓1 +34
Comments 44

Краткий и бодрый обзор архитектуры компиляторов

Reading time 19 min
Views 33K

Большинство компиляторов имеют следующую архитектуру:



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

Целевая аудитория статьи — люди, чье представление о работе компиляторов крайне ограничено (максимум — то, что они занимаются компилированием). Однако я жду, что читатель разбирается в структурах и алгоритмах данных.

Статья ни в коем случае не посвящена современным производственным компиляторам с миллионами строк кода — нет, это краткий курс «компиляторы для чайников», помогающий разобраться, что такое компилятор.
Читать дальше →
Total votes 68: ↑63 and ↓5 +58
Comments 38

Включаем поддержку TLS v1.3 в Nginx на примере Debian 9

Reading time 6 min
Views 36K
Всем доброго времени суток!

Данный пост написан вследствие победы желания докопаться до сути над усталостью, сонливостью, соблазном опрокинуть очередную бутылочку пива пятничным вечером. Сразу скажу, что ничего супер сложного не раскрываю, всего лишь включение TLS v1.3 в Nginx.

image

Наверняка на Хабре найдутся те, кто уже 100 раз это делал, поэтому данная статья — больше для новичков или для тех, кто хочет найти готовое решение в виде мануала, не тратя много времени на поиски, как я, например. Вспомнив, что давно не писал на Хабре и поставив статье метку «tutorial», принялся за дело.
Читать далее
Total votes 26: ↑20 and ↓6 +14
Comments 11

Регулярные выражения: никакой магии

Reading time 13 min
Views 35K
image

Код этого поста, как и сам пост, выложен на github.

До недавнего времени регулярные выражения казались мне какой-то магией. Я никак не мог понять, как можно определить, соответствует ли строка заданному регулярному выражению. А теперь я это понял! Ниже представлена реализация простого движка регулярных выражений менее чем в 200 строках кода.

Часть 1: Парсинг


Спецификация


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

  • . — соответствие любому символу
  • | — соответствие abc или cde
  • + — соответствие одному или более предыдущего паттерна
  • * — соответствие 0 или более предыдущего паттерна
  • ( и ) — для группировки

Хотя набор опций невелик, с его помощью можно создать интересные regex-ы, например, m (t|n| ) | b позволяющий найти субтитры к Star Wars без субтитров к Star Trek, или (..)* для нахождения множества всех строк чётной длины.

План атаки


Мы будем анализировать регулярные выражения в три этапа:

  1. Парсинг (синтаксический анализ) регулярного выражения в синтаксическое дерево
  2. Преобразование синтаксического дерева в конечный автомат
  3. Анализ конечного автомата для нашей строки

Для анализа регулярных выражений (подробнее об этом ниже) мы будем использовать конечный автомат под названием NFA. На высоком уровне NFA будет представлять наш regex. При получении входных данных мы будем перемещаться в NFA от состояния к состоянию. Если мы придём в точку, из которой невозможно совершить допустимого перехода, то регулярное выражение не соответствует строке.
Читать дальше →
Total votes 27: ↑27 and ↓0 +27
Comments 5

Information

Rating
2,670-th
Location
Москва, Москва и Московская обл., Россия
Date of birth
Registered
Activity