#common #highload
1. Пост Вадима Кравченко про привычки крутых разрабов.
Тут же есть ссылочка на прикольный доклад про навык приближённых вычислений (так называемую napkin math).
2. Конференция DUMP 2023 выложила записи докладов. Мне честно по темам как-то ничего не зашло, потому не смотрел. Но может вам что-то понравится.
3. Lessons Learned from Twenty Years of Site Reliability Engineering от инженеров Google.
4. Небольшая заметка про написание логов.
5. C++20, Spans, Threads and Fun.
6. Building a reliable notification system.
================================
Понедельник-вторник буду на HIghload++ 2023. Если вдруг зачем-то надо, можно найти меня на одном из стендов Яндекса : )
1. Пост Вадима Кравченко про привычки крутых разрабов.
Тут же есть ссылочка на прикольный доклад про навык приближённых вычислений (так называемую napkin math).
2. Конференция DUMP 2023 выложила записи докладов. Мне честно по темам как-то ничего не зашло, потому не смотрел. Но может вам что-то понравится.
3. Lessons Learned from Twenty Years of Site Reliability Engineering от инженеров Google.
4. Небольшая заметка про написание логов.
5. C++20, Spans, Threads and Fun.
6. Building a reliable notification system.
================================
Понедельник-вторник буду на HIghload++ 2023. Если вдруг зачем-то надо, можно найти меня на одном из стендов Яндекса : )
👍9🔥2❤1 1 1 1 1
#cpp #highload #common
0. У Константина Владимирова есть маленький пост про отличие ключевых слов
1. Trip report от Herb Sutter про собрание комитета C++ на Kona, Usa про прогресс C++26.
2. Новая статья от Вадима Кравченко: Security at Startup.
3. How Pinterest scaled to 11 million users with only 6 engineers.
0. У Константина Владимирова есть маленький пост про отличие ключевых слов
class и struct: t.me/cpp_lects_rus/146 . Развал. 1. Trip report от Herb Sutter про собрание комитета C++ на Kona, Usa про прогресс C++26.
2. Новая статья от Вадима Кравченко: Security at Startup.
3. How Pinterest scaled to 11 million users with only 6 engineers.
👍7❤1🤯1
Собрал посты за этот год.
2022: link.
Посты:
- ещё полезности из опыта;
- о шаблонах из доклада Alexandrescu;
- доклады с highload от 05.2022 и не только: первая часть, вторая часть;
- выжимка с открытой встречи РГ21 C++;
- про инициализацию;
- базово про кодировки;
- some cute tricks;
- про атрибуты;
- первоапрельский пост🤡;
- про проблемы с union и function-try-block;
- про ревью;
- несколько докладов с Saint Highload++ 2022;
- hashcash для пагинации;
- концептуально про рекомендательные системы;
- про разные оптимизации в C++;
- A/B-тестирование;
- чуть-чуть про содержимое gcc;
- С++ Zero Cost Conf 2023: Москва, Белград;
- проект моих ребят: 3music.app;
- про быстрое вычисление линейных дп матрицами;
- “обновил” пост про дженерики;
- про аналитику на фронте;
- про время;
- пачки фактов и ссылок: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 13, 14, 15, 16, 17, 18, 19;
Про поиск:
- про различные задачи поиска;
- что обычно есть в поисковых движках;
- boolean retrieval model;
- про исправление опечаток.
Одна cтатья:
- три движка для одной Лавки: как эволюционировала система поиска в сервисе.
Одно выступление:
- обработка ошибок и C++ на Intern Meetup Week.
Не техническое:
- как я себя мотивирую табличкой в экселе;
- мотивашки на каждый день.
====================================
И про остальное. Фулл версия тут: t.me/dzikart/42
Подался на highload и не прошёл. Зато сгонял на него посмотреть вживую. Раньше таких мероприятий не посещал.
Впервые за много лет выбрался за пределы привычной обстановки и немного (хотя непонятно, почти два месяца вне дома это много или мало) покатался заграницу. Очень сильно разгружает.
Почти весь год ходил к психологу и очень вкачал голову. Всё-таки, если с умом к этому подходить, можно ощутимо продвинуться.
Уволился из универа. Опыт замечательный, но хочется направить силы на более полезные на перспективу занятия.
В этом учебном году это скорее нерегулярная дополнительная активность, чем постоянная нагрузка.
Иногда пишу в @dzikart, иногда что-то пощу в @memesfromhole и недавно открыл @khdocs.
4 раза получал предложения что-то тут порекламить за денюжку. Не поддался (может быть пока).
Особо не болел. Занимался спортом. Наконец-то читал книжки и отрастил бороду.
Взял топ-1 на чемпионате по кикеру в минском офисе Яндекса😼
[Вроде пока] бросил [регулярное] употребление никотина❌
Новых татуировок нет.
Не умер, что особенно приятно.
2022: link.
Посты:
- ещё полезности из опыта;
- о шаблонах из доклада Alexandrescu;
- доклады с highload от 05.2022 и не только: первая часть, вторая часть;
- выжимка с открытой встречи РГ21 C++;
- про инициализацию;
- базово про кодировки;
- some cute tricks;
- про атрибуты;
- первоапрельский пост🤡;
- про проблемы с union и function-try-block;
- про ревью;
- несколько докладов с Saint Highload++ 2022;
- hashcash для пагинации;
- концептуально про рекомендательные системы;
- про разные оптимизации в C++;
- A/B-тестирование;
- чуть-чуть про содержимое gcc;
- С++ Zero Cost Conf 2023: Москва, Белград;
- проект моих ребят: 3music.app;
- про быстрое вычисление линейных дп матрицами;
- “обновил” пост про дженерики;
- про аналитику на фронте;
- про время;
- пачки фактов и ссылок: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 13, 14, 15, 16, 17, 18, 19;
Про поиск:
- про различные задачи поиска;
- что обычно есть в поисковых движках;
- boolean retrieval model;
- про исправление опечаток.
Одна cтатья:
- три движка для одной Лавки: как эволюционировала система поиска в сервисе.
Одно выступление:
- обработка ошибок и C++ на Intern Meetup Week.
Не техническое:
- как я себя мотивирую табличкой в экселе;
- мотивашки на каждый день.
====================================
И про остальное. Фулл версия тут: t.me/dzikart/42
Подался на highload и не прошёл. Зато сгонял на него посмотреть вживую. Раньше таких мероприятий не посещал.
Впервые за много лет выбрался за пределы привычной обстановки и немного (хотя непонятно, почти два месяца вне дома это много или мало) покатался заграницу. Очень сильно разгружает.
Почти весь год ходил к психологу и очень вкачал голову. Всё-таки, если с умом к этому подходить, можно ощутимо продвинуться.
Уволился из универа. Опыт замечательный, но хочется направить силы на более полезные на перспективу занятия.
В этом учебном году это скорее нерегулярная дополнительная активность, чем постоянная нагрузка.
Иногда пишу в @dzikart, иногда что-то пощу в @memesfromhole и недавно открыл @khdocs.
4 раза получал предложения что-то тут порекламить за денюжку. Не поддался (может быть пока).
Особо не болел. Занимался спортом. Наконец-то читал книжки и отрастил бороду.
Взял топ-1 на чемпионате по кикеру в минском офисе Яндекса
[Вроде пока] бросил [регулярное] употребление никотина
Новых татуировок нет.
Не умер, что особенно приятно.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥30❤4❤🔥4👍4
this->notes. pinned «Собрал посты за этот год. 2022: link. Посты: - ещё полезности из опыта; - о шаблонах из доклада Alexandrescu; - доклады с highload от 05.2022 и не только: первая часть, вторая часть; - выжимка с открытой встречи РГ21 C++; - про инициализацию; - базово…»
#cpp
С Новым Годом🥳 Начнём 2024й с простенького.
Curiously recurring template pattern.
CRTP -- типичный подход к реализации статического полиморфизма.
Давайте посмотрим на реализацию:
Тут мы завели родителя, который предоставляет некоторый интерфейс и умеет вызывать метод у ребёнка, кастуя себя к его типу. А вот у ребёнка происходит наследование от родителя, которого мы параметризовали этим самым ребёнком. Потому этот подход так и называется.
Ну и дальше можем использовать наше решение:
Из плюсов мы больше не тратим в рантайме время на то, чтобы прыгать по виртуальным таблицам и поиск нужного метода нужного ребёнка для вызова. Тут есть статья про реальную стоимость виртуальных вызовов, так что иногда это может быть полезной оптимизацией: The true price of virtual functions in C++.
С другой стороны, очевидно, вы не можете класть несколько таких детей в один вектор. Потому что родители разных детей с точки зрения компилятора это разные типы:
Другой тип тут нормально не положишь.
Пользоваться этим нужно аккуратно. Например в реализации выше следующий код -- ub:
А ещё легко словить проблемы, если вдруг вы отнаследуете разные классы от родителя с одним и тем же параметром в шаблоне.
И концептуально важный момент. Исходя из того, как устроен подход, это эмуляция наследования, когда ребёнок расширяет логику родителя (а не наоборот). Так что архитектурно этот подход не везде применим.
Где это используется?
Кроме кейсов выше популярна задача написания "миксинов" -- специальных классов, которые расширяют логику работы класса какими-то конкретными методами. Вообще концептуально подразумевается, что от миксинов не наследуются, а скорее они каким-то образом "инклудятся" в классы, но в плюсах (и других языках, например python), такие вещи всё же реализуют через наследование.
Из примеров подобного -- std::enable_shared_from_this. Представим, что мы хотим сделать метод, который будет возвращать std::shared_ptr на наш класс:
При каждом вызове этого метода будет создаваться новая компонента связности шеред птров, из-за чего будет как минимум double-free. Корректно сделать так:
Обычно такую структуру реализуют с std::weak_ptr внутри, который и раздаёт std::shared_ptr.
Можно продолжить в этом направлении и реализовать, например,
- миксин, который будет добавлять operator>, если у класса есть operator<;
- миксин, при наследовании от которого у вас автоматически считается количество живых в данный момент программы экземпляров ребёнка.
(это простые задачки, так что оставим упражнением).
Для первого даже в буст либу завезли (boost::operators), которая позволяет избежать бойлерплейта при написании операторов.
Тут можно посмотреть больше примеров использования CRTP.
============================
Хорошего года, ребят🥳 🥳 🥳
С Новым Годом
Curiously recurring template pattern.
CRTP -- типичный подход к реализации статического полиморфизма.
Давайте посмотрим на реализацию:
template <typename Child>
struct Parent {
int SomeFunc() {
return static_cast<Child*>(this)->SomeFunc();
}
};
struct Child : Parent<Child> {
int SomeFunc() { return 228; }
};
Тут мы завели родителя, который предоставляет некоторый интерфейс и умеет вызывать метод у ребёнка, кастуя себя к его типу. А вот у ребёнка происходит наследование от родителя, которого мы параметризовали этим самым ребёнком. Потому этот подход так и называется.
static_cast к указателю на ребёнка из this называется "Barton and Nickman trick".
Ну и дальше можем использовать наше решение:
Parent* p = new Child;
std::cout << p->SomeFunc();
Из плюсов мы больше не тратим в рантайме время на то, чтобы прыгать по виртуальным таблицам и поиск нужного метода нужного ребёнка для вызова. Тут есть статья про реальную стоимость виртуальных вызовов, так что иногда это может быть полезной оптимизацией: The true price of virtual functions in C++.
С другой стороны, очевидно, вы не можете класть несколько таких детей в один вектор. Потому что родители разных детей с точки зрения компилятора это разные типы:
std::vector<Parent<Child>> v;
Другой тип тут нормально не положишь.
Пользоваться этим нужно аккуратно. Например в реализации выше следующий код -- ub:
// Parent<Child> p; p.SomeFunc(); // CE!
А ещё легко словить проблемы, если вдруг вы отнаследуете разные классы от родителя с одним и тем же параметром в шаблоне.
И концептуально важный момент. Исходя из того, как устроен подход, это эмуляция наследования, когда ребёнок расширяет логику родителя (а не наоборот). Так что архитектурно этот подход не везде применим.
Где это используется?
Кроме кейсов выше популярна задача написания "миксинов" -- специальных классов, которые расширяют логику работы класса какими-то конкретными методами. Вообще концептуально подразумевается, что от миксинов не наследуются, а скорее они каким-то образом "инклудятся" в классы, но в плюсах (и других языках, например python), такие вещи всё же реализуют через наследование.
Из примеров подобного -- std::enable_shared_from_this. Представим, что мы хотим сделать метод, который будет возвращать std::shared_ptr на наш класс:
struct bad {
std::shared_ptr<bad> get() {
return std::shared_ptr<bad>(this);
}
};
При каждом вызове этого метода будет создаваться новая компонента связности шеред птров, из-за чего будет как минимум double-free. Корректно сделать так:
struct good : std::enable_shared_from_this<good> {
std::shared_ptr<good> get() {
return shared_from_this(); // from enable_shared_from_this
}
};
Обычно такую структуру реализуют с std::weak_ptr внутри, который и раздаёт std::shared_ptr.
Можно продолжить в этом направлении и реализовать, например,
- миксин, который будет добавлять operator>, если у класса есть operator<;
- миксин, при наследовании от которого у вас автоматически считается количество живых в данный момент программы экземпляров ребёнка.
(это простые задачки, так что оставим упражнением).
Для первого даже в буст либу завезли (boost::operators), которая позволяет избежать бойлерплейта при написании операторов.
Тут можно посмотреть больше примеров использования CRTP.
============================
Хорошего года, ребят
Please open Telegram to view this post
VIEW IN TELEGRAM
👍29🍌9❤6🔥2🥰2👎1🗿1
#algo #cpp #highload
0. Продолжаю отсматривать CppCon 2023. Пока закину один доклад, про который вы наверняка знаете от самого автора: A Long Journey of Changing std::sort Implementation at Scale - Danila Kutenin.
1. My favourite memory leak.
Короткий видос (всего 4 минуты), но какая красота..
2. Интересная статья про succinct data structures.
3. Architecture antipatterns.
4. Scrambling Eggs for Spotify with Knuth's Fibonacci Hashing.
Прикольный пост про перемешивание треков и разные подходы к этому.
0. Продолжаю отсматривать CppCon 2023. Пока закину один доклад, про который вы наверняка знаете от самого автора: A Long Journey of Changing std::sort Implementation at Scale - Danila Kutenin.
1. My favourite memory leak.
Короткий видос (всего 4 минуты), но какая красота..
2. Интересная статья про succinct data structures.
3. Architecture antipatterns.
4. Scrambling Eggs for Spotify with Knuth's Fibonacci Hashing.
Прикольный пост про перемешивание треков и разные подходы к этому.
👍3 3 2❤1 1
#highload
Я всё-таки пытаюсь взять себя в руки и разобрать огромную кучу тем, про которые хочется написать, потому
Рейтлимитинг.
https://telegra.ph/Rejtlimiting-01-14
Я всё-таки пытаюсь взять себя в руки и разобрать огромную кучу тем, про которые хочется написать, потому
Рейтлимитинг.
https://telegra.ph/Rejtlimiting-01-14
Telegraph
Рейтлимитинг
Зачем нужно лимитирование нагрузок? Пусть ответ на этот вопрос и является довольно понятным, давайте всё же посмотрим на несколько кейсов: ваш сервис участвует в некотором сезонном событии, которое потенциально приносит огромную нагрузку. Конечно в таком…
👍19 4❤1
#algo #cpp
🥳 Недавно понял, что в статье, где упоминал sparse set, не описал процесс удаления одного элемента из него.
Предположим, у нас есть такой sparse set:
Тут два случая:
- удаляемый элемент находится в конце. Тогда просто уменьшаем размер (удаляем 4):
Мб про sparse set как-нибудь статью на хабр накидаю.
😎 Дальше с CppCon 2023:
- Exceptionally Bad: The Misuse of Exceptions in C++ & How to Do Better;
- The Au C++ Units Library: Handling Physical Units Safely, Quickly, & Broadly;
- C++ Modules: Getting Started Today;
- std::linalg: Linear Algebra coming to Standard C++.
На последнем мы немножко остановимся и глянем, что же там такое есть. cppref с описанием того, что лежит в хедере (правда там все подстраницы пустые ещё).
Хедер включается так:
Докладчик рассказывает про несколько важных кусков, о которых думают, когда речь идёт о библиотеках для линала:
- многомерные массивы и итерация по ним (доступно сейчас в C++17 и расширяется с C++23 (mdspan) и C++26 (submdspan));
- работа и базовые операции с векторами (в математическом смысле) и матрицами (как раз то, что предполагается затянуть в новой либе);
- low-level math problems, такие как решение систем линейных уравнений, поиск собственных значений и прочее (сейчас нет пропозалов по этим кускам в язык, но есть различные third-party либы);
- higher-level math problems: statistical inference и другие штуки.
Единицей работы с объектами является std::mdspan. Из базовых операцией над матрицами вы можете делать:
- scale -- умножение на скаляр;
- conjugated -- получение сопряжённой;
- transposed -- неоижиданно, транспонирование;
- conjugate_transpose.
Для векторов: scale, add, dot, vector_sum_of_squares, vector_two_norm, vector_abs_sum и другие.
Для операций матрица-вектор: matrix_vector_product и другие умножения, а так же какие-то rank-1 update, которые я сходу не осознал ввиду скудности остаточных знаний в математике.
Для матрица-матрица кроме произведения аналогично много всяких других произведений и каких-то апдейтов. Только ещё есть произведение/решение систем для треугольных матриц.
В целом большая часть доклада это рассказ про "стандарт" BLAST, эффективные вычисления и прочее около. В конце чувак показывает, как можно сделать разложение Холецкого с помощью новой либы.
🙂 Хотел недавно на clang 16.xxx + libc++ поюзать
Круто, да? А вот хер там был! Почитайте пояснение. Так сказать, СМОТРЕТЬ ДО КОНЦА🤔 ❌ ❌
🤨 А ещё на днях не обнаружил у
Предположим, у нас есть такой sparse set:
dense: 0 1 2 3 4 |
sparse: 0 1 2 3 4
| показывает текущий конец сета. Тут два случая:
- удаляемый элемент находится в конце. Тогда просто уменьшаем размер (удаляем 4):
dense: 0 1 2 3 | 4
sparse: 0 1 2 3 4
- удаляемый элемент не в конце. Тогда меняем его местами с последним и опять уменьшаем размер (удаляем 1):dense: 0 3 2 | 1 4
sparse: 0 3 2 1 4
Готово! Сделал пр в folly. Мб про sparse set как-нибудь статью на хабр накидаю.
😎 Дальше с CppCon 2023:
- Exceptionally Bad: The Misuse of Exceptions in C++ & How to Do Better;
- The Au C++ Units Library: Handling Physical Units Safely, Quickly, & Broadly;
- C++ Modules: Getting Started Today;
- std::linalg: Linear Algebra coming to Standard C++.
На последнем мы немножко остановимся и глянем, что же там такое есть. cppref с описанием того, что лежит в хедере (правда там все подстраницы пустые ещё).
Хедер включается так:
#include <linalg>Докладчик рассказывает про несколько важных кусков, о которых думают, когда речь идёт о библиотеках для линала:
- многомерные массивы и итерация по ним (доступно сейчас в C++17 и расширяется с C++23 (mdspan) и C++26 (submdspan));
- работа и базовые операции с векторами (в математическом смысле) и матрицами (как раз то, что предполагается затянуть в новой либе);
- low-level math problems, такие как решение систем линейных уравнений, поиск собственных значений и прочее (сейчас нет пропозалов по этим кускам в язык, но есть различные third-party либы);
- higher-level math problems: statistical inference и другие штуки.
Единицей работы с объектами является std::mdspan. Из базовых операцией над матрицами вы можете делать:
- scale -- умножение на скаляр;
- conjugated -- получение сопряжённой;
- transposed -- неоижиданно, транспонирование;
- conjugate_transpose.
Для векторов: scale, add, dot, vector_sum_of_squares, vector_two_norm, vector_abs_sum и другие.
Для операций матрица-вектор: matrix_vector_product и другие умножения, а так же какие-то rank-1 update, которые я сходу не осознал ввиду скудности остаточных знаний в математике.
Для матрица-матрица кроме произведения аналогично много всяких других произведений и каких-то апдейтов. Только ещё есть произведение/решение систем для треугольных матриц.
В целом большая часть доклада это рассказ про "стандарт" BLAST, эффективные вычисления и прочее около. В конце чувак показывает, как можно сделать разложение Холецкого с помощью новой либы.
constexpr std::string. Хотелка в целом понятная и простая: завести constexpr переменную в global scope:constexpr std::string kSomeVal = "string";Круто, да? А вот хер там был! Почитайте пояснение. Так сказать, СМОТРЕТЬ ДО КОНЦА
std::stack метод clear. И что это!Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7 2❤1👍1
#cpp #common
🤔 🤔 🤔
На днях пришла гениальная мысль стандартизировать
Вообще я помню свою небольшую эволюцию в подсчёте единичных битов. Очевидно, можно сделать втупую:
Потом я узнал, что можно считать за кол-во единичных битов (ого как мы ускорились!):
А потом я нашёл статью на хабре и понял, что не знаю ещё очень много. Впрочем, ничего нового.
Там оказывается подвезли много всего. Из понятно-полезного std::has_single_bit -- является ли число степенью двойки.
🤨 🤨 🤨
Ещё недавно решил поюзать
Круто, скажете вы!Не работает, скажу я. Можно почитать тут.
😏 😏 😏
Валера написал интересный пост про реализацию SharedMutex в yaclib: https://news.1rj.ru/str/reverse13/720
☕️ ☕️ ☕️
У Вадима Кравченко недавно вышел хороший пост про код-ревью.
Ну и хватит пока. И вам, и мне.
На днях пришла гениальная мысль стандартизировать
__builtin_popcount. Глупец! В C++20 уже есть std::popcount.Вообще я помню свою небольшую эволюцию в подсчёте единичных битов. Очевидно, можно сделать втупую:
while (n > 0) {
if (n & 1) ++cnt;
n >>= 1;
}Потом я узнал, что можно считать за кол-во единичных битов (ого как мы ускорились!):
while (n > 0) {
n &= n - 1;
}А потом я нашёл статью на хабре и понял, что не знаю ещё очень много. Впрочем, ничего нового.
Там оказывается подвезли много всего. Из понятно-полезного std::has_single_bit -- является ли число степенью двойки.
Ещё недавно решил поюзать
constexpr std::string. Основной кейс юзания у меня это завести константы вродеconstexpr std::string kSomeText = "short_text";Круто, скажете вы!
Валера написал интересный пост про реализацию SharedMutex в yaclib: https://news.1rj.ru/str/reverse13/720
У Вадима Кравченко недавно вышел хороший пост про код-ревью.
Ну и хватит пока. И вам, и мне.
Please open Telegram to view this post
VIEW IN TELEGRAM
#cpp #algo #pub
Написал пост про разреженные структуры данных в дополнение к инфе про sparse set.
https://habr.com/ru/articles/790844/
Написал пост про разреженные структуры данных в дополнение к инфе про sparse set.
https://habr.com/ru/articles/790844/
Хабр
Разреженные структуры данных
Разреженное небо над Дианой и Конём Боджеком Когда-то я писал пост про различные интересные структуры данных . Среди них был т.н. sparse set. Там мы описали его в общих чертах, опустив некоторые...
#cpp #common
0. Интересный докладик о C++20 Nicolai Josuttis с ACCU 2022: My Favourite Code Examples.
1. Прилетел доклад Антона Полухина с C++ Russia 2023: C++ трюки из userver.
Я вообще не то чтобы поклонник его докладов в последнее время, потому что он часто рассказывает примерно одно и то же + внутри слышу про разные штуки сильно раньше, чем снаружи. Повторение одного и того же конечно двигает продукт, о котором рассказывают (userver в данном случае), но никак не двигает сообщество вперёд. Стагнация какая-то. Но этот доклад зашёл. Прикона.
Ну и на осеннем хайлоаде был интересный. И на CppRussia в этом году тоже как будто интересный будет. Может всё не прям так, как я описываю.
2. Parsing Numbers At Compile Time with C++17, C++23, and C++26.
3. Прикольный лайтнинг про проблему нахождение среднего двух чисел: Finding the Average of 2 Integers. И в дополнение вот такой доклад, но уже побольше: std::midpoint? How Hard Could it Be?
не решение (вроде очевидно) и почему
тоже не решение.
4. How to (and how not to) design REST APIs.
0. Интересный докладик о C++20 Nicolai Josuttis с ACCU 2022: My Favourite Code Examples.
1. Прилетел доклад Антона Полухина с C++ Russia 2023: C++ трюки из userver.
Я вообще не то чтобы поклонник его докладов в последнее время, потому что он часто рассказывает примерно одно и то же + внутри слышу про разные штуки сильно раньше, чем снаружи. Повторение одного и того же конечно двигает продукт, о котором рассказывают (userver в данном случае), но никак не двигает сообщество вперёд. Стагнация какая-то. Но этот доклад зашёл. Прикона.
Ну и на осеннем хайлоаде был интересный. И на CppRussia в этом году тоже как будто интересный будет. Может всё не прям так, как я описываю.
2. Parsing Numbers At Compile Time with C++17, C++23, and C++26.
3. Прикольный лайтнинг про проблему нахождение среднего двух чисел: Finding the Average of 2 Integers. И в дополнение вот такой доклад, но уже побольше: std::midpoint? How Hard Could it Be?
std::midpoint -- функция для нахождения среднего двух чисел -- заехала в C++20. В докладе дед рассказывает, почему (a + b) / 2не решение (вроде очевидно) и почему
a + (b - a) / 2тоже не решение.
4. How to (and how not to) design REST APIs.
👍3❤1🤔1
#common
1. У Вадима Кравченко новый пост про заблуждения о быть сеньором. Как всегда, замечательный. В целом поражаюсь этому чуваку, потому что он крепчайше держит высокий уровень. Кайф.
2. И у вастрика новый пост про отличия инди и корпоратов! Пишет конечно хорошо.
Ну и хватит сегодня. Не буду душить количеством.
1. У Вадима Кравченко новый пост про заблуждения о быть сеньором. Как всегда, замечательный. В целом поражаюсь этому чуваку, потому что он крепчайше держит высокий уровень. Кайф.
2. И у вастрика новый пост про отличия инди и корпоратов! Пишет конечно хорошо.
Ну и хватит сегодня. Не буду душить количеством.
❤🔥4👍4❤1🐳1 1
#common #highload
Некоторое время назад мы переписывали внутренний флоу репликации данных, потому что старый подход сломал нам горизонтальное масштабирование одного из кор сервисов.
Что же это за данные, как мы всё починили и немножко базы можно почитать по ссылке : )
https://telegra.ph/Nebolshaya-arhitekturnaya-istoriya-iz-Lavki-03-04
Некоторое время назад мы переписывали внутренний флоу репликации данных, потому что старый подход сломал нам горизонтальное масштабирование одного из кор сервисов.
Что же это за данные, как мы всё починили и немножко базы можно почитать по ссылке : )
https://telegra.ph/Nebolshaya-arhitekturnaya-istoriya-iz-Lavki-03-04
Telegraph
Небольшая архитектурная история из Лавки
Когда вы добавляете в корзину в Лавке товар, фронт дёргает эндпоинт в специальном сервисе (давайте будем называть его cart). Корзина эта хранится в бд сервиса cart. Пару лет назад информация про активные корзины (корзины, которые обновлялись за последние…
👍15🤔5❤🔥2🔥2🤡2 2❤1 1
#cpp
Получился очень загруженный месяц. Чтобы не уходить в новый с одним постом закидываю второй😂
0. C++26 — прогресс и новинки от ISO C++.
1. На reddit есть тред про то, как сложно заставить вектор освободить память.
Давайте предположим, что у нас есть какой-то вектор с данными. Мы хотим его почистить.
Естественным желанием будет вызвать
Ну можно ещё попробовать
Стопроцентным вариантом будет просто присвоить пустой вектор:
Ну или деструктор явно позвать🥳
> Пока копался c вектором, обнаружил новый метод в
2. [видео] Eric Landström: The bugs I remember.
3. Core Guidelines are not Rules.
4. И выцепил пару пропозалов из февральской рассылки:
- inplace_vector
- std::constexpr_v
- std::unitialized<T>
==============================
Там выходит C++Russia 2023 на ютубчик. Не хочу выкладывать по докладу. Подождём ещё какое-то время, пока появятся все доклады, которые мне понравились, и закину пачкой.
Получился очень загруженный месяц. Чтобы не уходить в новый с одним постом закидываю второй
0. C++26 — прогресс и новинки от ISO C++.
1. На reddit есть тред про то, как сложно заставить вектор освободить память.
Давайте предположим, что у нас есть какой-то вектор с данными. Мы хотим его почистить.
Естественным желанием будет вызвать
clear(). Но clear() только установит size_ в ноль (ну конечно ещё почистит объекты). Это в целом логично и естественно, т.к. помогает писать более производительный код. operator= тоже не чистит память. Например можно глянуть на __assign_with_size (одна из веток в операторе копирования). Ну можно ещё попробовать
shrink_to_fit(). И хотя обычно компиляторы честно чистят ненужную память, стандарт говорит, что это non-binding метод (i.e. необязательный). С другой стороны, ну говорит и говорит. Компиляторы обычно чистят, значит норм. Стопроцентным вариантом будет просто присвоить пустой вектор:
vec = std::vector<T>{};Ну или деструктор явно позвать
> Пока копался c вектором, обнаружил новый метод в
std::list: prepend_range (C++23). В других контейнерах подобные тоже подъехали. 2. [видео] Eric Landström: The bugs I remember.
3. Core Guidelines are not Rules.
4. И выцепил пару пропозалов из февральской рассылки:
- inplace_vector
- std::constexpr_v
- std::unitialized<T>
==============================
Там выходит C++Russia 2023 на ютубчик. Не хочу выкладывать по докладу. Подождём ещё какое-то время, пока появятся все доклады, которые мне понравились, и закину пачкой.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15❤4 1 1
#highload
Две недели не читал статьи! Нагоняем.
0. Серия статей про backend for frontend.
Я когда писал про него коротенький пост и на тот момент ещё не прям понимал, зачем такое делать. Сейчас преисполнился чуть больше. Основные юзкейсы, которые я видел, были про формирование готовой разметки для клиента. Почему это не может делать бекенд? Ну может. Есть же всякие разные server side ui и прочее, но в среднем это скорее про околофронтовые знания, которые тесно связаны с нативом, отображением и около. Короче это про хорошее разделение зон ответственности.
Ну и про другие плюсы можно почитать как раз в статьях.
1. Новый пост (ну как, двухнедельной давности) Вадима Кравченко: Mental Health in Software Engineering.
2. Microservices Design Principles You Really Need To Learn.
Вроде понятные штуки, но вдруг кто-то что-то для себя найдёт.
3. Guide on Structured Logs.
Я в целом про такое задумывался, как такое можно сделать и будет ли полезно. Оказывается есть отдельное название и тулзы. Но у нас как будто такое будет не очень полезно.
4. Optimizing Postgres Column Order.
Звучит хорошо конечно, но такое иногда сложно поддерживать. У нас есть таблички, в которые хотя бы раз в месяц добавляется новая колонка. И непонятно, как меинтейнить порядок в случае такой ситуации.
Ну и как будто может понятность страдать, если вдруг в табличку часто смотрят глазами, но наверное это не то, про что стоит думать при проектировании.
Две недели не читал статьи! Нагоняем.
0. Серия статей про backend for frontend.
Я когда писал про него коротенький пост и на тот момент ещё не прям понимал, зачем такое делать. Сейчас преисполнился чуть больше. Основные юзкейсы, которые я видел, были про формирование готовой разметки для клиента. Почему это не может делать бекенд? Ну может. Есть же всякие разные server side ui и прочее, но в среднем это скорее про околофронтовые знания, которые тесно связаны с нативом, отображением и около. Короче это про хорошее разделение зон ответственности.
Ну и про другие плюсы можно почитать как раз в статьях.
1. Новый пост (ну как, двухнедельной давности) Вадима Кравченко: Mental Health in Software Engineering.
2. Microservices Design Principles You Really Need To Learn.
Вроде понятные штуки, но вдруг кто-то что-то для себя найдёт.
3. Guide on Structured Logs.
Я в целом про такое задумывался, как такое можно сделать и будет ли полезно. Оказывается есть отдельное название и тулзы. Но у нас как будто такое будет не очень полезно.
4. Optimizing Postgres Column Order.
Звучит хорошо конечно, но такое иногда сложно поддерживать. У нас есть таблички, в которые хотя бы раз в месяц добавляется новая колонка. И непонятно, как меинтейнить порядок в случае такой ситуации.
Ну и как будто может понятность страдать, если вдруг в табличку часто смотрят глазами, но наверное это не то, про что стоит думать при проектировании.
❤1👍1🤔1
#highload
Выложили записи SaintHighload++ 2023! Делюсь тем, что понравилось.
1. Octree, или Сказ о поиске пути в 3D.
В общих чертах интересно. Всё-таки геймдев крута с точки зрения задач. Жаль, что я в среднем продукт не одобряю.
Есть правда ощущение, что то ли я глупый, то ли чуваки очень много всего проскакали галопом и местами совсем непонятно, что же имеется в виду и как это должно работать.
2. Групповые чаты в Одноклассниках🙂
3. Как сделать поиск в интернет-магазине.
Задача мне хорошо знакомая. Специфика/проблемы тоже. Было интересно.
4. Архитектура ленты и рекомендаций ВКонтакте.
Пару моментов:
- на одном из первых слайдов докладчик говорит, что вот у них в p50 ответ за 600мс. Я чёт угарнул, потому что кто вообще смотрит на p50. Ну p95 ещё с натягом ок. Но как будто p98/p99 гораздо важнее, особенно для таких огромных сервисов. Выглядит как политический ход, т.к. в перцентилях выше какой-то разнос в таймингах.
- на другом слайде был скрин из паблика Душа пацана. Посмеялся.
- я когда-то ранжированием ленты был оч недоволен, потому что у меня паттерн в ВК был зайти и посмотреть 25 записей за последние сутки из трёх пабликов, на которые я подписан. А тут они начали что-то воротить. И отключить емнип первое время было нельзя. Но конечно понятно, что это всё на метрики в целом влияет почти наверняка хорошо.
- в какой-то момент докладчик начал рассказывать, как они генерят PHP код, с поведением эквивалентным поведению ML-модели, который потом по классике транслируется в плюсы. Hahaha, classic☺️
5. 7 петабайт логов в Elastic. Как мы это сделали?
Неплохо про базу эластика рассказали с упором на свой кейс.
Вот так немножко получилось. Как-то остальное либо не заинтересовало, либо просто не понравилось в процессе.
Выложили записи SaintHighload++ 2023! Делюсь тем, что понравилось.
Нужно отметить, что я довольно грубо отсеиваю доклады: сначала выбираю по названию, -- из-за чего могу что-то интересное да упустить. Но смотреть всё подряд в условиях довольно ограниченного времени больно. Так что как есть.
1. Octree, или Сказ о поиске пути в 3D.
В общих чертах интересно. Всё-таки геймдев крута с точки зрения задач. Жаль, что я в среднем продукт не одобряю.
Есть правда ощущение, что то ли я глупый, то ли чуваки очень много всего проскакали галопом и местами совсем непонятно, что же имеется в виду и как это должно работать.
2. Групповые чаты в Одноклассниках
3. Как сделать поиск в интернет-магазине.
Задача мне хорошо знакомая. Специфика/проблемы тоже. Было интересно.
4. Архитектура ленты и рекомендаций ВКонтакте.
Пару моментов:
- на одном из первых слайдов докладчик говорит, что вот у них в p50 ответ за 600мс. Я чёт угарнул, потому что кто вообще смотрит на p50. Ну p95 ещё с натягом ок. Но как будто p98/p99 гораздо важнее, особенно для таких огромных сервисов. Выглядит как политический ход, т.к. в перцентилях выше какой-то разнос в таймингах.
- на другом слайде был скрин из паблика Душа пацана. Посмеялся.
- я когда-то ранжированием ленты был оч недоволен, потому что у меня паттерн в ВК был зайти и посмотреть 25 записей за последние сутки из трёх пабликов, на которые я подписан. А тут они начали что-то воротить. И отключить емнип первое время было нельзя. Но конечно понятно, что это всё на метрики в целом влияет почти наверняка хорошо.
- в какой-то момент докладчик начал рассказывать, как они генерят PHP код, с поведением эквивалентным поведению ML-модели, который потом по классике транслируется в плюсы. Hahaha, classic
5. 7 петабайт логов в Elastic. Как мы это сделали?
Неплохо про базу эластика рассказали с упором на свой кейс.
Вот так немножко получилось. Как-то остальное либо не заинтересовало, либо просто не понравилось в процессе.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2❤1🤔1
#highload #cpp
Микропост.
1. The only two log levels you need are INFO and ERROR.
Сомнительно, но окэй.
2. std::expected - Monadic extensions.
3. Use percentiles to analyze application performance.
Вроде понятно, но на всякий.
4. Lessons after a half-billion GPT tokens.
============================================
Блин, ребят. Знали бы вы, как я отдыхал эти две недели.
Микропост.
1. The only two log levels you need are INFO and ERROR.
Сомнительно, но окэй.
2. std::expected - Monadic extensions.
3. Use percentiles to analyze application performance.
Вроде понятно, но на всякий.
4. Lessons after a half-billion GPT tokens.
============================================
Блин, ребят. Знали бы вы, как я отдыхал эти две недели.
❤8👍2
#cpp #algo #pub
Когда-то (ещё в августе 2023) я хотел написать про одну из возможных реализаций связного списка, а потом как-то разошёлся и написал про все мне известные. Ну как-то вот так и получилось.
https://habr.com/ru/articles/814955/
Когда-то (ещё в августе 2023) я хотел написать про одну из возможных реализаций связного списка, а потом как-то разошёлся и написал про все мне известные. Ну как-то вот так и получилось.
https://habr.com/ru/articles/814955/
Хабр
Многообразие связных списков
Связный список — классическая структура данных, которая позволяет быстрые вставки/удаления, но при этом просаживает другие операции (случайный доступ к элементу). Мы пройдёмся от базовой...
👍24⚡4❤2✍1🔥1🫡1
#cpp
Наконец выложили все интересные мне доклады с C++ Russia 2023. Вот они слева направо:
1. Designing Robust APIs: How to Write C++ Code that's Safe, Extensible, Efficient & Easy to Use🤔
2. Учим Кукушку Летать, или ConcurrentHashMap with Seqlocks🥴
3. Санитайзеры и стандарт не спасут🤨
4. Имплементируем класс tuple в 100 строк кода☺️
5. C++ трюки из userver☺️
6. Как правильно писать компараторы🥳
7. Семантические процессы в C++🤨
8. И два отдельных, которые относительно похожи по теме + немножко расширили сознание про то, какие штуки чуваки делают на плюсах:
- Демосцена: в погоне за wow-фактором🤔
- Sizecoding: взгляд изнутри🤔
Ну напостил, теперь можно и отдыхать.
Наконец выложили все интересные мне доклады с C++ Russia 2023. Вот они слева направо:
1. Designing Robust APIs: How to Write C++ Code that's Safe, Extensible, Efficient & Easy to Use
2. Учим Кукушку Летать, или ConcurrentHashMap with Seqlocks
3. Санитайзеры и стандарт не спасут
4. Имплементируем класс tuple в 100 строк кода
5. C++ трюки из userver
6. Как правильно писать компараторы
7. Семантические процессы в C++
8. И два отдельных, которые относительно похожи по теме + немножко расширили сознание про то, какие штуки чуваки делают на плюсах:
- Демосцена: в погоне за wow-фактором
- Sizecoding: взгляд изнутри
Ну напостил, теперь можно и отдыхать.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤🔥12👍6❤3 2🔥1
[неожиданно] #math #algo
Делюсь небольшой задачей из начала универа. Сильно мне тогда понравилась.
https://telegra.ph/Zadacha-iz-molodosti-05-30
Единственное что пришлось приложить немалые усилия (и попросить помощь у друзей), чтобы восстановить картинку в голове, потому что математик из меня так себе.
Делюсь небольшой задачей из начала универа. Сильно мне тогда понравилась.
https://telegra.ph/Zadacha-iz-molodosti-05-30
Единственное что пришлось приложить немалые усилия (и попросить помощь у друзей), чтобы восстановить картинку в голове, потому что математик из меня так себе.
Telegraph
Задача из молодости
Когда-то на первом курсе (уже 5 лет назад, ого!) мне показали очередную задачу на codeforces. Я её довольно сильно запомнил, потому что она не очень сложная с точки зрения математических рассуждений и красиво сворачивается в понятный ответ (который ещё и…
👍7❤4💅4