C++
Примеры частых ошибок (по мотивам статьи C++ Antipatterns)
* Чтение из istream без проверки результата
Всегда нужно проверять, что в итоге прочитали, так как велик шанс получить мусор в переменных
Мы можем уже достигнуть конца потока при чтении, поэтому правильно проверять результат чтения сразу
В примере ниже в случае бросания исключения в секции // do мьютекс не будет освобожден:
Если в процессе вставки происходит переаллоцирование памяти, в результате которого неожиданно не хватит памяти, то будет кинуто исключение std::bad_alloc.
В таком случае умный указатель не будет создан, поэтому объект, созданый через new, утечет.
Правильнее сначала создавать умный указатель, а потом его вставлять в контейнер.
* Реализция оператора меньше (больше, равно и прочее)
Этот код работать не будет:
Дефолтный конструктор уже создает пустую строку, а вот конструктор с const char *, скорей всего, сделает аллокацию памяти.
Примеры частых ошибок (по мотивам статьи C++ Antipatterns)
* Чтение из istream без проверки результата
Всегда нужно проверять, что в итоге прочитали, так как велик шанс получить мусор в переменных
int i, j, k;* Проверка istream.eof() в цикле
if (in >> i >> j >> k)
{
std::cout << calculate(i, j, k);
}
Мы можем уже достигнуть конца потока при чтении, поэтому правильно проверять результат чтения сразу
while (in >> x)* Явная блокировка и разблокировка std::mutex
{
process(x);
}
В примере ниже в случае бросания исключения в секции // do мьютекс не будет освобожден:
std::mutex mtx;Поэтому всегда используем RAII для захвата ресурсов
void func()
{
mtx.lock();
// do
mtx.unlock();
}
{* Вставка в контейнер умного указателя через emplace_back(new X)
std::lock_guard<std::mutex> lock(mtx);
// do...
}
Если в процессе вставки происходит переаллоцирование памяти, в результате которого неожиданно не хватит памяти, то будет кинуто исключение std::bad_alloc.
В таком случае умный указатель не будет создан, поэтому объект, созданый через new, утечет.
Правильнее сначала создавать умный указатель, а потом его вставлять в контейнер.
{Кстати, здесь безразницы что использовать, emplace_back или push_back.
v.push_back(std::make_unique<X>())
}
* Реализция оператора меньше (больше, равно и прочее)
Этот код работать не будет:
inline bool operator<(const X& l, const X& r)Правильный путь, который гарантирует порядок:
{
if (l.a < r.a)
return true;
if (l.b < r.b)
return true;
return false;
}
X x1{1, 2};
X x2{2, 1};
assert( x1 < x2 );
assert( x2 < x1 );
inline bool operator<(const X& l, const X& r)А вот это С++11 try-way
{
return l.a < r.a && l.b < r.b;
}
inline bool operator<(const X& l, const X& r)* Использование std::string("") для создания пустых строк
{
return std::tie(l.a, l.b) < std::tie(r.a, r.b);
}
Дефолтный конструктор уже создает пустую строку, а вот конструктор с const char *, скорей всего, сделает аллокацию памяти.
В машине мне нравится слушать АвтоРадио, где проигрываются хиты (и не только) рок музыки.
И самое приятное что на приемнике я всегда вижу название и исполнителя песни. Но как? Это ведь радио.
Оказывается, есть стандарт RDS, который описывает передачу информационных сообщений по каналам радиовещания.
Благодаря этому стандарту мы как раз и можем принимать названия станций, исполнителей и песен. Кроме этого можно передавать любую другую текстовую информацию - рекламу, расписание передач, заказчика песни, информацию о дорожной обстановке, предупреждение о чрезвычайных ситуациях. Позволяет слушателю осуществлять поиск интересующих его станций по типу (музыка, развлечение, новости и пр), автоматически настраивать громкость и даже осуществлять навигацию транспорта.
Очень рекомендую почитать для ознакомления
Как кодируется и декодируется сигнал
На что способен и чуть подробностей
И самое приятное что на приемнике я всегда вижу название и исполнителя песни. Но как? Это ведь радио.
Оказывается, есть стандарт RDS, который описывает передачу информационных сообщений по каналам радиовещания.
Благодаря этому стандарту мы как раз и можем принимать названия станций, исполнителей и песен. Кроме этого можно передавать любую другую текстовую информацию - рекламу, расписание передач, заказчика песни, информацию о дорожной обстановке, предупреждение о чрезвычайных ситуациях. Позволяет слушателю осуществлять поиск интересующих его станций по типу (музыка, развлечение, новости и пр), автоматически настраивать громкость и даже осуществлять навигацию транспорта.
Очень рекомендую почитать для ознакомления
Как кодируется и декодируется сигнал
На что способен и чуть подробностей
Wikipedia
Radio Data System
Radio Data System (англ. Radio Data System, RDS) — многоцелевой стандарт, предназначенный для передачи информационных сообщений по каналам ЧМ-радиовещания в диапазоне УКВ. Нашёл наиболее широкое применение в автомобильных магнитолах/радиоприёмниках для отображения…
Поделюсь своим любимым факапом.
Года четыре назад у нас наблюдалась проблема со сборками билдов на TeamCity. Не помню почему, но конфигурация не ревертала локальные изменения, сделанные скриптами сборки во все возможных репозиториях. Волевым решением было принято - берем под контроль и пишем свой скрипт. И, конечно же, вызывался писать этот скрипт я.
Все шло чудесно - требования собраны, код написан, юнит-тесты добавлены, комментариями посыпано знатно. Скрипт получился добротный, локальная копия выглядела девственно чистой, как после клона. И вот, перед отправкой на ревью, мне приходит в голову гениальная мысль протестировать весь флоу работы скрипта. Догадались уже что случилось?) Да, он к чертям удалил все мои наработки за день. К счастью, сам скрипт восстановить не составило труда - он был открыт в PyCharm. А вот юнит-тесты с тестовыми данными пришлось накидать снова. Из этой истории я вынес пару уроков - делай коммиты чаще и никогда не тестируй на локальной копии 🙂
Года четыре назад у нас наблюдалась проблема со сборками билдов на TeamCity. Не помню почему, но конфигурация не ревертала локальные изменения, сделанные скриптами сборки во все возможных репозиториях. Волевым решением было принято - берем под контроль и пишем свой скрипт. И, конечно же, вызывался писать этот скрипт я.
Все шло чудесно - требования собраны, код написан, юнит-тесты добавлены, комментариями посыпано знатно. Скрипт получился добротный, локальная копия выглядела девственно чистой, как после клона. И вот, перед отправкой на ревью, мне приходит в голову гениальная мысль протестировать весь флоу работы скрипта. Догадались уже что случилось?) Да, он к чертям удалил все мои наработки за день. К счастью, сам скрипт восстановить не составило труда - он был открыт в PyCharm. А вот юнит-тесты с тестовыми данными пришлось накидать снова. Из этой истории я вынес пару уроков - делай коммиты чаще и никогда не тестируй на локальной копии 🙂
Что нужно знать (веб-)разработчику о взаимодействии в сети?
В первую очередь, это немного базовой теории об устройстве сети в целом (очень интересно!)
Основные сетевые термины и сетевые модели
Протоколы верхнего уровня (по желанию, далее подробнее)
Протоколы нижних уровней (транспортного, сетевого и канального)
Понятие IP адресации, масок подсетей и их расчет
И, конечно же, про конкретные протоколы:
# как работает udp и tcp, знать разницу
# знать на отлично http
# хоть раз скачивать файл по ftp
# понимать основы криптографии, а именно алгоритмы:
* Протокол Диффи — Хеллмана
* RSA
* и держать в уме самую частую уязвимость
# конечно, же знать как работает ssl и tls
# везде на своих сайтах использовать https
# ходить только по ssh
# пользоваться websocket
# и полюбить очереди - amqp
Есть клевая статья на английском, как будут работать протоколы ip/tcp/http/https все вместе.
В принципе все покрывается статьями с теорией, но некоторые выводы стоят того, чтобы прочитать.
Приятно чтения)
В первую очередь, это немного базовой теории об устройстве сети в целом (очень интересно!)
Основные сетевые термины и сетевые модели
Протоколы верхнего уровня (по желанию, далее подробнее)
Протоколы нижних уровней (транспортного, сетевого и канального)
Понятие IP адресации, масок подсетей и их расчет
И, конечно же, про конкретные протоколы:
# как работает udp и tcp, знать разницу
# знать на отлично http
# хоть раз скачивать файл по ftp
# понимать основы криптографии, а именно алгоритмы:
* Протокол Диффи — Хеллмана
* RSA
* и держать в уме самую частую уязвимость
# конечно, же знать как работает ssl и tls
# везде на своих сайтах использовать https
# ходить только по ssh
# пользоваться websocket
# и полюбить очереди - amqp
Есть клевая статья на английском, как будут работать протоколы ip/tcp/http/https все вместе.
В принципе все покрывается статьями с теорией, но некоторые выводы стоят того, чтобы прочитать.
Приятно чтения)
Хабр
Основы компьютерных сетей. Тема №1. Основные сетевые термины и сетевые модели
Всем привет. На днях возникла идея написать статьи про основы компьютерных сетей, разобрать работу самых важных протоколов и как строятся сети простым языком. Заинтересовавшихся приглашаю под кат....
Недавно начал играть и смотреть игры по StarCraft2. Наткнулся на интересную серию игр ИИ DeepMind против прогеймеров:
https://www.youtube.com/watch?v=FEFxLpv-rZM
И соответствующий анализ игры ИИ.
https://www.youtube.com/watch?v=FFJRd9l6kW4
Довольно интересно понимать, какие игровые приемущества получает DeepMind только за счет того, что это компьтер. Например, невидимые юниты становятся для него не такими уж и невидимыми за счет обычного эффекта блюра.
"Я не боюсь ИИ который пройдет тест Тьюринга, я боюсь ИИ, который его намеренно завалит"
В общем, рекомендую.
https://www.youtube.com/watch?v=FEFxLpv-rZM
И соответствующий анализ игры ИИ.
https://www.youtube.com/watch?v=FFJRd9l6kW4
Довольно интересно понимать, какие игровые приемущества получает DeepMind только за счет того, что это компьтер. Например, невидимые юниты становятся для него не такими уж и невидимыми за счет обычного эффекта блюра.
"Я не боюсь ИИ который пройдет тест Тьюринга, я боюсь ИИ, который его намеренно завалит"
В общем, рекомендую.
YouTube
DeepMind ШОКИРУЕТ игроков в Старкрафт: Разгром прогеймеров
Расписание трансляций и подписка на стримы: http://clever.press/streams
DeepMind ШОКИРУЕТ игроков в StarCraft II: Разгром прогеймеров, AlphaStar 10 - 1 Liquid'TLO, Liquid'MaNa
Больше подробностей о том, как работает Deepmind: https://deepmind.com/blog/alphastar…
DeepMind ШОКИРУЕТ игроков в StarCraft II: Разгром прогеймеров, AlphaStar 10 - 1 Liquid'TLO, Liquid'MaNa
Больше подробностей о том, как работает Deepmind: https://deepmind.com/blog/alphastar…
Задача от yandex на вакансию "Разработчик беспилотных автомобилей":
Двое игроков играют в игру с карточной колодой.
Игрок А делит стандартную колоду из 52 карт на две стопки карт по своему усмотрению с единственным ограничением: в каждой стопке должна быть хотя бы одна карта.
Игрок Б случайным образом выбирает одну из двух стопок карт (каждую из стопок он может выбрать с одинаковой вероятностью, 50%), после чего вытаскивает одну случайную карту из выбранной стопки.
Как следует действовать игроку А, чтобы максимизировать вероятность вытаскивания игроком Б карты черной масти, и чему будет равна эта вероятность?
Какой минимальной вероятности вытаскивания можно достичь и каким образом? Ответы обоснуйте.
Нужно максимизировать условие:
Для нашего случая получаем:
Тогда в первой колоде всего 1 черная карта (вероятность вытянуть черную карту 100%),
а в другой 25 черных карт и 26 красных (вероятность 48%)
Двое игроков играют в игру с карточной колодой.
Игрок А делит стандартную колоду из 52 карт на две стопки карт по своему усмотрению с единственным ограничением: в каждой стопке должна быть хотя бы одна карта.
Игрок Б случайным образом выбирает одну из двух стопок карт (каждую из стопок он может выбрать с одинаковой вероятностью, 50%), после чего вытаскивает одну случайную карту из выбранной стопки.
Как следует действовать игроку А, чтобы максимизировать вероятность вытаскивания игроком Б карты черной масти, и чему будет равна эта вероятность?
Какой минимальной вероятности вытаскивания можно достичь и каким образом? Ответы обоснуйте.
Нужно максимизировать условие:
max(P(A)) = ?
где A - событие вытаскивания игроком карты черной масти.
Выразим эту вероятность через другие:P(A) = P(A B1) + P(A B2) = P(A|B1) * P(B1) + P(A|B2) * P(B2)
где P(A|Bi) - вероятность вытащить из i колоды черную карты
P(Bi) - вероятность выбрать i-ую колоду
P(A|Bi) = bi/(bi + ri)
где bi - количество черных карт
ri - количество красных карт
Сумма, очевидно, черных и красных карт должна быть равна 52.Для нашего случая получаем:
P(A|B1) = b1/(b1 + r1)
P(A|B2) = (26-b1)/(52 - b1 - r1)
P(A) = (b1/(b1 + r1) + (26-b1)/(52 - b1 - r1))/2
Максимум достигается при b1 = 1, r1 = 0. Вот тут хз как доказать, вроде очевидно.Тогда в первой колоде всего 1 черная карта (вероятность вытянуть черную карту 100%),
а в другой 25 черных карт и 26 красных (вероятность 48%)
P(A) = (1/(1 + 0) + (26-1)/(52 - 1 - 0))/2= (1 + 25/52)/2 ~ 74%
Если хотим минимизировать, очевидно, вероятность 26%.https://habr.com/ru/post/103467/
Очень простое объясненния парадигмы MapReduce.
Если хочется понять основу того, как делают расчеты больших объемов данных - смотреть в статью!
Очень простое объясненния парадигмы MapReduce.
Если хочется понять основу того, как делают расчеты больших объемов данных - смотреть в статью!
Хабр
MapReduce или подсчеты за пределами возможностей памяти и процессора (попробую без зауми)
Давно хотел рассказать про MapReduce, а то как ни взгляшешь на подобное — такая заумь, что просто ужас берет, а на самом деле очень простой и полезный подход для...
Алгоритмы поиска подстроки в строке:
Алгоритм Кнута-Морриса-Пратта. Сложность O(N+M)
Алгоритм Бойера-Мура-Хорспула. Сложность O(M/|E|)
Алгоритм Кнута-Морриса-Пратта. Сложность O(N+M)
Алгоритм Бойера-Мура-Хорспула. Сложность O(M/|E|)
YouTube
Алгоритм Кнута-Морриса-Пратта
Алгоритм Кнута-Морриса-Пратта (алгоритм КМП) - это один из классических алгоритмов поиска образа в строке или, проще говоря, поиска слова или фразы в тексте. Эффективность алгоритма проявляется при частичном совпадении символов образа и строки. В этом случае…
Показательный пример (по мотивам статьи):
Человек, очень сильно интересующийся парсером питона, создал патч, который уменьшает потребление памяти парсера на 30%. Очень клево, да? Правда, изменений очень много.
Но за полгода этот патч никто так и не поревьювил. А в конце еще и Гвидо ван Россум резюмировал:
"Python's parser wasn't designed to *efficiently* parse huge data tables like that, and if you have that much data, using JSON is the right answer.... Sometimes a change is just not worth the effort."
Мне кажется отличный пример прагматичности, так иногда мы делаем кучу больших, опасных изменений, которые не двигают проект вперед, а служат скорее некой ачивкой для разработчика.
Человек, очень сильно интересующийся парсером питона, создал патч, который уменьшает потребление памяти парсера на 30%. Очень клево, да? Правда, изменений очень много.
Но за полгода этот патч никто так и не поревьювил. А в конце еще и Гвидо ван Россум резюмировал:
"Python's parser wasn't designed to *efficiently* parse huge data tables like that, and if you have that much data, using JSON is the right answer.... Sometimes a change is just not worth the effort."
Мне кажется отличный пример прагматичности, так иногда мы делаем кучу больших, опасных изменений, которые не двигают проект вперед, а служат скорее некой ачивкой для разработчика.
Хабр
Как устроен парсер Python, и как втрое уменьшить потребление им памяти
Любой, кто изучал устройство языков программирования, примерно представляет, как они работают: парсер в соответствии с формальной грамматикой ЯП превращает входн...
Очень часто в проектах вижу использование оператора:
Все бы хорошо, но почти везде его используют для операндов с типом
в С++ нет, поэтому делают такой "хак".
Но нужно понимать. что замена не релевантная и при смене типа у
x &= y
Все бы хорошо, но почти везде его используют для операндов с типом
bool
. Cкорей всего лень писать:x = x && y
, а оператора x &&= y
, как известно,в С++ нет, поэтому делают такой "хак".
Но нужно понимать. что замена не релевантная и при смене типа у
x
или y
- команда будет работать не так, как вы ожидаете.Неожиданно осознал, что в нашем проекте практически никто не использует namedtuple, а это чертовски удобная вещь и часто помогает значительно сократить объем копипасты!
Хабр
Именованные кортежи. Пишем код на Python чище
В стандартной библиотеке питона содержится специализированный тип "namedtuple", который, кажется, не получает того внимания, которое он заслуживает. Это одна из...
Немного про стремные хаки, которые работают:
В проекте dava.engine, в классе файла под андроидом есть код, который 10 раз подряд пытается открыть файл и засыпает на 100 милисекунд, если открыть не получилось. Казалось бы, зачем? Этот код появился после фикса бага в DLC - только что скаченный файл при попытки открытия был недоступен. Эмпирически вывели, что после 8 попыток файл гарантированно открывался. Вот и вставили 10 (на всякий случай!) попыток на открытие.
Стоит отметить, что есть похожий хак в коде хромиума - попытка удаления файла два раза подряд.
К сожалению, наш мир не идеален и нужно понимать, что на файлы - это внешняя среда по отношению к программе, и с этой средой может твориться все что угодно - файлы могут быть использованы другими процессами (вирусы, антивирусы, системы контроля версий и прочие сканеры), баги по работе с файлами в других приложениях и же даже нас может подвести оборудование.
Если с кодом в хромиуме это выглядит как простое решение достаточно сложной проблемы, то в коде dava.engine это грязный хак. Проблема, очевидно, есть и с ней стоило бы разобраться. Почему временная задержка помогает? Может сообщение о завершении скачки файла пришло раньше, чем оно на самом деле произошло? Файловые дескрипторы закончились? Сторонние процессы лочат доступ? К сожалению, узнать это будет уже сложно. Код ведь работает, а если работает - не трожь. 🙂
В проекте dava.engine, в классе файла под андроидом есть код, который 10 раз подряд пытается открыть файл и засыпает на 100 милисекунд, если открыть не получилось. Казалось бы, зачем? Этот код появился после фикса бага в DLC - только что скаченный файл при попытки открытия был недоступен. Эмпирически вывели, что после 8 попыток файл гарантированно открывался. Вот и вставили 10 (на всякий случай!) попыток на открытие.
Стоит отметить, что есть похожий хак в коде хромиума - попытка удаления файла два раза подряд.
К сожалению, наш мир не идеален и нужно понимать, что на файлы - это внешняя среда по отношению к программе, и с этой средой может твориться все что угодно - файлы могут быть использованы другими процессами (вирусы, антивирусы, системы контроля версий и прочие сканеры), баги по работе с файлами в других приложениях и же даже нас может подвести оборудование.
Если с кодом в хромиуме это выглядит как простое решение достаточно сложной проблемы, то в коде dava.engine это грязный хак. Проблема, очевидно, есть и с ней стоило бы разобраться. Почему временная задержка помогает? Может сообщение о завершении скачки файла пришло раньше, чем оно на самом деле произошло? Файловые дескрипторы закончились? Сторонние процессы лочат доступ? К сожалению, узнать это будет уже сложно. Код ведь работает, а если работает - не трожь. 🙂
GitHub
smile4u/dava.engine
Game Engine. Contribute to smile4u/dava.engine development by creating an account on GitHub.
Как в астраномии ведется обмен знанием о событиях взрыва сверхновых, гравитационных волнах и прочее? Мне казалось, что это некие пресс релизы с кучей excel файлов, которые рассылаются по почте. А если что-то срочное - то звонят по телефону или даже скайпу. Не знаю с чем связано такое глупое заблуждение, но я был рад узнать о International Virtual Observatory Alliance.
Смысл этого сообщества в создании "виртуальной обсерватории" для своевременного обмена астрономическими событиями. Эти события имеют описываются в определенном формате - VOEvent (в xml =). Для обмена есть свой собственный протокол поверх TCP/IP VOEvent Transport Protocol. Соответственно, для всего этого есть проект на github.
Зачем это? И что это дает?
Да все просто - обсерватории мира объединены в одну сеть и если какая-либо обсерватория регистрирует событие о, к примеру, гравитационных волнах, то можно автоматически навести телескоп на предполагаемый участок неба и в реальном времени снять другие параметры этого события.
Есть так же и специализированные проекты - для получения сообщений конкретно о гамма-всплесках. Без проблем получилось запустить, посмотрим, сколько нотификаций о событиях я получу =) UPD. За 15 минут - 3 события.
Смысл этого сообщества в создании "виртуальной обсерватории" для своевременного обмена астрономическими событиями. Эти события имеют описываются в определенном формате - VOEvent (в xml =). Для обмена есть свой собственный протокол поверх TCP/IP VOEvent Transport Protocol. Соответственно, для всего этого есть проект на github.
Зачем это? И что это дает?
Да все просто - обсерватории мира объединены в одну сеть и если какая-либо обсерватория регистрирует событие о, к примеру, гравитационных волнах, то можно автоматически навести телескоп на предполагаемый участок неба и в реальном времени снять другие параметры этого события.
Есть так же и специализированные проекты - для получения сообщений конкретно о гамма-всплесках. Без проблем получилось запустить, посмотрим, сколько нотификаций о событиях я получу =) UPD. За 15 минут - 3 события.
Принцип работы алгоритма Код Хаффмана. Используется в архиваторах, изображениях и при передаче данных по HTTP.
Алгоритм простой, и, как по мне, потрясающе красивый, поэтому обязателен к ознакомлению.
Алгоритм простой, и, как по мне, потрясающе красивый, поэтому обязателен к ознакомлению.
https://github.com/kamranahmedse/developer-roadmap
Ветка развития fronend, backend, devops специалиста в картинках) Оргиниальный способ, нужно сказать, так как каждый желающий может выразить свое пожелание создав Issue или pr c фиксом, коих там много)
Ветка развития fronend, backend, devops специалиста в картинках) Оргиниальный способ, нужно сказать, так как каждый желающий может выразить свое пожелание создав Issue или pr c фиксом, коих там много)
GitHub
GitHub - kamranahmedse/developer-roadmap: Interactive roadmaps, guides and other educational content to help developers grow in…
Interactive roadmaps, guides and other educational content to help developers grow in their careers. - kamranahmedse/developer-roadmap
Запилил тут недавно пакет для питона, подробнее в статье:
https://telegra.ph/Idealnyj-proekt-paketa-s-podderzhkoj-raznyh-versij-pitona-04-24
https://telegra.ph/Idealnyj-proekt-paketa-s-podderzhkoj-raznyh-versij-pitona-04-24
Какой смысл несет нижнее подчеркивание в питоне?
https://hackernoon.com/understanding-the-underscore-of-python-309d1a029edc
https://hackernoon.com/understanding-the-underscore-of-python-309d1a029edc
Hackernoon
Understanding the underscore( _ ) of Python
The <em>underscore</em> (_) is special in Python.