Pull to refresh
2
0
Евгений Калашников @kenbo

Программист

Send message

Гексагональные тайловые миры

Level of difficultyHard
Reading time32 min
Views33K

Тайловость в играх – очень распространенное явление, особенно в играх инди сегмента. Чаще всего используют квадратные тайлы – в них проще всего задать необходимые данные, будь то карта уровня или инвентарь. Однако на квадратных и прямоугольных формах возможности подобной системы не ограничиваются.

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

Читать далее
Total votes 80: ↑80 and ↓0+80
Comments12

Паттерн: Сага

Reading time2 min
Views134K

Привет, Хабр! Представляю вашему вниманию перевод статьи "Pattern: Saga" автора Chris Richardson.


Ситуация


Есть приложение, к которому применялся паттерн Database per Service. Теперь у каждого сервиса приложения есть своя собственная база данных. Некоторые бизнес транзакции охватывают сразу несколько сервисов, так что нужен механизм, обеспечивающий согласованность данных между этими сервисами.


Например: давайте представим, что мы разрабатываем интернет магазин, где у клиента есть кредитный лимит. Приложение должно гарантировать, что новый заказ не превышает кредитный лимит клиента. Так как Заказы и Клиенты — различные базы данных, то приложение не может использовать локальные ACID транзакции.


Проблема


Как обеспечить согласованность данных между сервисами?


Решение


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


Сага представляет собой набор локальных транзакций. Каждая локальная транзакция обновляет базу данных и публикует сообщение или событие, инициируя следующую локальную транзакцию в саге. Если транзакция завершилась неудачей, например, из-за нарушения бизнес правил, тогда сага запускает компенсирующие транзакции, которые откатывают изменения, сделанные предшествующими локальными транзакциями.


Читать дальше →
Total votes 11: ↑10 and ↓1+9
Comments10

Как справиться с Debezium + MySql + Spring Could Streams, Part 1

Reading time5 min
Views6.1K

Добрый день, Хаброжители!

Это моя первая статья на Хабре, любые замечания, предложения, пожелания приветствуются!

В этой статье (часть 1), я попытаюсь рассказать и показать как поднять и настрить stand along Debezium CDC + MySql server.

Читать далее
Total votes 5: ↑4 and ↓1+7
Comments9

Шаблоны модернизации приложения с помощью Apache Kafka, Debezium и Kubernetes, часть 1

Reading time11 min
Views4.1K

«Наши компьютеры создаются так же, как и наши города: долго, без планов и на руинах былого». Эллен Ульман (Ellen Ullman) написала это в 1998 году, но сегодня мы именно так и создаем современные приложения: долго, имея лишь краткосрочные планы и поверх унаследованного ПО. В этой статье мы рассмотрим несколько шаблонов и инструментов, которые, на наш взгляд, хорошо подходят для продуманной модернизации унаследованных приложений и создания современных управляемых событиями систем.

Читать дальше: Шаблоны модернизации...
Total votes 5: ↑5 and ↓0+5
Comments2

Производительность PHP: планируем, профилируем, оптимизируем

Reading time16 min
Views40K


Привет, Хабр! Два года назад мы писали о том, как перешли на PHP 7.0 и сэкономили миллион долларов. На нашем профиле нагрузки новая версия оказалась в два раза более эффективной по использованию CPU: ту нагрузку, которую раньше у нас обслуживали ~600 серверов, после перехода начали обслуживать ~300. В результате на протяжении двух лет у нас был запас мощностей.

Но Badoo растёт. Количество активных пользователей постоянно увеличивается. Мы совершенствуемся и развиваем нашу функциональность, благодаря чему пользователи проводят в приложении всё больше времени. А это, в свою очередь, отражается на количестве запросов, которое за два года увеличилось в 2—2,5 раза.

Мы оказались в ситуации, когда двукратный выигрыш в производительности нивелировался более чем двукратным ростом запросов, и мы опять стали приближаться к пределам нашего кластера. В ядре PHP снова ожидаются полезные оптимизации (JIT, предзагрузка), но они запланированы только на PHP 7.4, а эта версия выйдет не раньше, чем через год. Поэтому трюк с переходом сейчас повторить не удастся — нужно оптимизировать сам код приложения.

Под катом я расскажу, как мы подходим к таким задачам, какими пользуемся инструментами, и приведу примеры оптимизаций, идей и подходов, которые мы применяем и которые помогли нам в своё время.
Читать дальше →
Total votes 105: ↑105 and ↓0+105
Comments58

Профилирование и трейсинг с perf

Reading time1 min
Views25K
Учимся дебажить с perf — целых 18 страниц про основные подкоманды, фичи и устройство инструмента. Джулия рекомендует; “Я даже использовала его несколько раз для профилирования Ruby программ!”

Уровень сложности — для суперпродвинутого администратора.

Когда нужно отыскать причину сбоя, не имея доступа к исходным кодам. Все логи уже просмотрены, все debug и verbose-ключи включены, а причина проблем так и не обнаружена — используйте perf. Потребуется навык кодинга на языках типа Си.


Читать дальше →
Total votes 38: ↑34 and ↓4+30
Comments13

Обработка ошибок в C

Reading time13 min
Views84K


Введение


Ошибки, увы, неизбежны, поэтому их обработка занимает очень важное место в программировании. И если алгоритмические ошибки можно выявить и исправить во время написания и тестирования программы, то ошибок времени выполнения избежать нельзя в принципе. Сегодня мы рассмотрим функции стандартной библиотеки (C Standard Library) и POSIX, используемые в обработке ошибок.
Читать дальше →
Total votes 31: ↑26 and ↓5+21
Comments41

Пишем гибкий код, используя SOLID

Reading time9 min
Views22K


От переводчика: опубликовали для вас статью Северина Переса об использовании принципов SOLID в программировании. Информация из статьи будет полезна как новичкам, так и программистам с опытом.

Если вы занимаетесь разработкой, то, скорее всего, слышали о принципах SOLID. Они дают возможность программисту писать чистый, хорошо структурированный и легко обслуживаемый код. Стоит отметить, что в программировании есть несколько подходов к тому, как правильно выполнять ту либо иную работу. У разных специалистов — разные идеи и понимание «правильного пути», все зависит от опыта каждого. Тем не менее, идеи, провозглашенные в SOLID, принимаются практически всеми представителями ИТ-сообщества. Они стали отправной точкой для появления и развития множества хороших методов управления разработкой.

Давайте разберемся с тем, что такое принципы SOLID и как они помогают нам.
Читать дальше →
Total votes 35: ↑26 and ↓9+17
Comments20

SOLID

Reading time5 min
Views270K
SOLID критикует тот, кто думает, что действительно понимает ООП
© Куряшкин Виктор

Я знаком с принципами SOLID уже 6 лет, но только в последний год осознал, что они означают. В этой статье я дам простое объяснение этим принципам. Расскажу о минимальных требованиях к языку программирования для их реализации. Дам ссылки на материалы, которые помогли мне разобраться.

Читать дальше →
Total votes 53: ↑35 and ↓18+17
Comments163

B-tree

Reading time6 min
Views202K

Введение


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

Основные операции в деревьях выполняются за время пропорциональное его высоте. Сбалансированные деревья минимизируют свою высоту (к примеру, высота бинарного сбалансированного дерева с n узлами равна log n). Большинство знакомо с такими сбалансированными деревьями, как «красно-черное дерево», «AVL-дерево», «Декартово дерево», поэтому не будем углубляться.

В чем же проблема этих стандартных деревьев поиска? Рассмотрим огромную базу данных, представленную в виде одного из упомянутых деревьев. Очевидно, что мы не можем хранить всё это дерево в оперативной памяти => в ней храним лишь часть информации, остальное же хранится на стороннем носителе (допустим, на жестком диске, скорость доступа к которому гораздо медленнее). Такие деревья как красно-черное или Декартово будут требовать от нас log n обращений к стороннему носителю. При больших n это очень много. Как раз эту проблему и призваны решить B-деревья!

B-деревья также представляют собой сбалансированные деревья, поэтому время выполнения стандартных операций в них пропорционально высоте. Но, в отличие от остальных деревьев, они созданы специально для эффективной работы с дисковой памятью (в предыдущем примере – сторонним носителем), а точнее — они минимизируют обращения типа ввода-вывода.
Читать дальше →
Total votes 82: ↑75 and ↓7+68
Comments32

select / poll / epoll: практическая разница

Reading time10 min
Views70K
При проектировании высокопроизводительных сетевых приложения с неблокирующими сокетами важно решить, какой именно метод мониторинга сетевых событий мы будем использовать. Их есть несколько и каждый хорош и плох по-своему. Выбор правильного метода может быть критически важной вещью для архитектуры вашего приложения.

В этой статье мы рассмотрим:

  • select()
  • poll()
  • epoll()
  • libevent
Читать дальше →
Total votes 60: ↑55 and ↓5+50
Comments66

Для тех, кто познаёт ушами: подкасты для разработчиков

Reading time6 min
Views53K


Кто сказал, что разработчики могут учиться новому только через книги, видео и анализ чужого кода? Ведь у нас и другие каналы получения информации из окружающего мира. Конечно, речь не о том, чтобы попробовать знания на вкус, пощупать их или понюхать. А вот послушать — самое оно. Мы собрали для вас коллекцию действующих русскоязычных подкастов для разработчиков. Хороший способ дать глазам отдых или занять себя в пробках.
Читать дальше →
Total votes 83: ↑80 and ↓3+77
Comments57

Для оптимизации 3D-моделей недостаточно считать полигоны

Reading time11 min
Views59K
image

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

Введение


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

Я начинал карьеру как 3D-художник ещё в эпоху первой PlayStation, а позже стал программистом графики. Хотел бы я прочитать эту статью перед тем, как впервые начал создавать 3D-модели для игр. Рассмотренные в ней фундаментальные основы пригодятся многим художникам. Хотя бОльшая часть информации из этой статьи не повлияет значительно на продуктивность вашей ежедневной работы, она даст вам базовое понимание того, как графическая карта (graphics processing unit, GPU) отрисовывает создаваемые вами меши.

От количества полигонов в меше обычно зависит скорость его рендеринга. Однако несмотря на то, что количество полигонов часто коррелирует с частотой кадров в секунду (FPS), вы можете обнаружить, что даже после снижения количества полигонов меш по-прежнему рендерится медленно. Но поняв, как рендерятся меши в целом, вы сможете применить набор техник для повышения скорости рендеринга.
Читать дальше →
Total votes 29: ↑28 and ↓1+27
Comments17

С++ exception handling под капотом или как же работают исключения в C++

Reading time15 min
Views69K

От переводчика


В мире победили языки высокого уровня и в мирах руби-питон-js разработчиков остается только разглагольствовать, что в плюсах не стоит использовать то или иное. Например, исключения, потому что они медленные и генерируют много лишнего кода. Стоило спросить "и какой же код он генерирует", как в ответ получил мямленье и мычание. А и правда — как же они работают? Ну что ж, компилируем в g++ с флагом -S, смотрим что получилось. Поверхностно разобраться не сложно, однако то, что остались недопонимания — не давали мне спать. К счастью, готовая статья нашлась.

На хабре есть несколько статей, подробных и не очень (при этом все равно хороших), посвященных тому, как работают exceptions в C++. Однако нет ни одной по-настоящему глубокой, поэтому я решил восполнить этот пробел, благо есть подходящий материал. Кому интересно как работают исключения в C++ на примере gcc — запаситесь pocket-ом или evernote, свободным временем и добро пожаловать под кат.
Читать дальше →
Total votes 38: ↑37 and ↓1+36
Comments10

Исследование фотограмметрии

Reading time8 min
Views37K
Друзья, хочу поделиться опытом, который приобрел в процессе практического изучения дисциплины, как фотограмметрия. Буду рад, если кто-нибудь из вас выскажет свое мнение, поправит меня или укажет на ошибки, которые допустил. Возможно эта статья по изучению мною фотограмметрии поможет и будет полезна Вам. Моя работа описана на примере фотосъемки природы в городском парке, в Центральной полосе России, в период август–сентябрь 2017 г.
Читать дальше →
Total votes 31: ↑31 and ↓0+31
Comments22

А ваша служба является RESTful? Все что необходимо/обязательно знать про веб службы и REST

Reading time18 min
Views145K

Введение


Вот не люблю я изобретать велосипед и статью я бы эту не написал, но пришлось. Про REST сказано уже довольно много. Многие поставщики веб служб готовы клясться, что их службы являются RESTful. Во время собеседования вы точно услышите хотя бы несколько вопросов про REST, независимо от того это собеседования для бэкенд, мобайл или фронтенд разработчика. Я вот помню как-то во время одного собеседования меня задали такой вопрос: «Вот вы написали в своем резюме, что знайте REST․ Ответьте пожалуйста, какой HTTP код вы получите, если при запросе к RESTful сервису ресурс не найден?». Ответ 404 был принят единогласно. Если честно, я так и не понял, как этот вопрос помог понять знаю ли я REST или нет, но одно могу уверенно сказать: REST понимают далеко не все. Вот некоторые вопросы, которые мучали меня долгое время:

  1. Зачем REST стал таким трендовым? Это архитектура была же предложена еще в 2000 году?
  2. Что я получу если моя служба будет RESTful?
  3. Как определить является ли служба RESTful или нет?
  4. Как правильно должны создаваться URL REST служб?
  5. Какие http методы и коды должны быть использованы в RESTful службе?

Если вы не можете дать исчерпывающего ответа хотя бы на один из этих вопросов, то продолжайте чтение. Если вы можете однозначно ответить на все эти вопросы, можете привести формат правильного URL, считайте, что GET, POST, PUT, DELETE обязательно должны соответствовать CRUD операциям с ресурсами, то вам обязательно надо продолжать чтение.
Читать дальше →
Total votes 43: ↑37 and ↓6+31
Comments125

Важнейшие структуры данных, которые вам следует знать к своему собеседованию по программированию

Reading time7 min
Views73K


Никлаус Вирт, швейцарский ученый-информатик, в 1976 году написал книгу под названием «Алгоритмы + Структуры данных = Программы».

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

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

Иногда в вопросах на интервью прямо упоминается та или иная структура данных, например, «дано двоичное дерево». В других случаях задача формулируется более завуалированно, например, «нужно отследить, сколько у нас книг от каждого автора».

Изучение структур данных — незаменимое дело, даже если вы просто стараетесь профессионально совершенствоваться на нынешней работе. Начнем с основ.

Переведено в Alconost
Читать дальше →
Total votes 36: ↑21 and ↓15+6
Comments17

Основы работы с фьютексами

Reading time10 min
Views32K
Фьютекс (futex — сокращение от «Fast userspace mutex») — это механизм, предложенный разработчиками Linux из IBM в 2002 году и вошедший в ядро в конце 2003 года. Основной идеей было предоставить более эффективный способ синхронизации пользовательских потоков с минимальным количеством обращений к ядру ОС.

В этой статье мы сделаем обзор фьютексов, попытаемся понять принципы их работы, а также используем их в качестве кирпичиков для построения более высокоуровневых (и знакомых нам) объектов синхронизации.

Важный момент: фьютексы — это достаточно низкоуровневый инструмент, напрямую его использовать стоит лишь при разработке фундаментальных библиотек, вроде стандартной библиотеки C/C++. Очень маловероятно, что вам понадобится использовать фьютексы в обычном прикладном приложении.
Читать дальше →
Total votes 30: ↑30 and ↓0+30
Comments4

Вся правда о linux epoll

Reading time10 min
Views52K

Ну или почти вся...



Я считаю, что проблема в современном интернете — это переизбыток информации разного качества. Найти материал по интересующей теме не проблема, проблема отличить хороший материал от плохого, если у вас мало опыта в данной области. Я наблюдаю картину, когда очень много обзорной информации "по верхам" (практически на уровне простого перечисления), очень мало углубленных статей и совсем нет переходных статей от простого к сложному. Тем не менее именно знание особенностей того или иного механизма и позволяет нам сделать осознанный выбор при разработке.


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


Anyone can wield an axe, but it takes a true warrior to make it sing melees melody.

Я предполагаю, что читатель знаком с epoll, по крайней мере прочел страницу man. О epoll, poll, select написано достаточно много, чтобы каждый кто разрабатывал под Linux, хоть раз о нем слышал.

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

Простое объяснение принципов SOLID

Reading time7 min
Views286K


Принципы SOLID — это стандарт программирования, который все разработчики должны хорошо понимать, чтобы избегать создания плохой архитектуры. Этот стандарт широко используется в ООП. Если применять его правильно, он делает код более расширяемым, логичным и читабельным. Когда разработчик создаёт приложение, руководствуясь плохой архитектурой, код получается негибким, даже небольшие изменения в нём могут привести к багам. Поэтому нужно следовать принципам SOLID.

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

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

Я буду объяснять SOLID самым простым способом, так что новичкам легче будет разобраться. Будем рассматривать принципы один за другим.
Читать дальше →
Total votes 46: ↑38 and ↓8+30
Comments201

Information

Rating
Does not participate
Location
Ульяновск, Ульяновская обл., Россия
Registered
Activity

Specialization

Backend Developer
Senior
PHP
Git
Docker
Linux
C
MySQL