Pull to refresh
0
0
Send message

Магия шаблонов или вычисление факториала на стадии компиляции

Reading time2 min
Views17K
Доброго времени суток, Хабралюди!

Гуру C++, а также люди смыслящие в шаблонном метапрограммировании могут смело пропускать этот топик, ничего нового для себя они здесь не найдут. Однако, если после прочтения заголовка, у вас в голове еще не возникло решение данной задачи (и даже если оно возникло, но не при помощи шаблонов), то милости просим под кат.
Читать дальше →
Total votes 70: ↑48 and ↓22+26
Comments64

Вычисление простых чисел на шаблонах C++

Reading time4 min
Views23K
В этом посте я расскажу как сделать совершенно бесполезную вещь — вычислять простые числа при помощи шаблонов C++.

Алгоритмы проиллюстрированы кодом на Scheme, поэтому осторожно: скобочки!

Читать дальше →
Total votes 46: ↑42 and ↓4+38
Comments44

На что способен PC Speaker

Reading time12 min
Views73K
Известный теперь как «системный динамик», а то и просто «пищалка», PC Speaker появился на свет в 1981 году вместе с первым персональным компьютером IBM. Наследник нескольких поколений больших компьютеров для серьёзных дел, он с рождения был предназначен лишь для подачи простейших системных сигналов, и не мог достойно проявить себя в озвучивании главенствующих на домашнем рынке развлекательных программ. Сильно уступая звуковым чипам специализированных игровых систем, пропадая в тени вскоре появившихся продвинутых звуковых карт, он поддерживался многими разработчиками по остаточному принципу — как опция, выдающая хоть какой-нибудь звук при отсутствии лучших альтернатив. За нечастыми исключениями, через спикер проигрывались грубо упрощённые, полностью одноголосые версии мелодий, изначально сочинённых для гораздо более мощных устройств.

Музыкальный альбом «System Beeps» написан для PC Speaker с использованием той же базовой техники из старых игр, и, согласно типичной формуле ретро-компьютерного около-демосценового творчества, призван раскрыть на многие годы оставшийся неисследованным потенциал этого простейшего звукового устройства. Собственно, послушать результат и составить своё мнение об успешности данного мероприятия можно на Bandcamp или в видео ниже, а дальнейший текст углубляется в устройство спикера, историю проекта и способы достижения подобного результата для тех, кто хочет знать больше.

Читать дальше →
Total votes 87: ↑87 and ↓0+87
Comments67

Рабочее место и 4k@60Hz

Reading time9 min
Views65K

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

Читать дальше →
Total votes 41: ↑38 and ↓3+35
Comments169

Резюме того парня

Reading time14 min
Views30K
Друзья, нам с вами несказанно повезло. Тот парень еще не уехал, и я выпросил у него резюме. Не потому, что хочу взять его на работу — не тот я человек. Просто мне кажется, оно стоит того, чтобы быть опубликованным. Хотя бы потому, что в нем 22k букв. Вы еще где-нибудь такой кошмар встречали?

А этот парень утверждает, что именно так надо писать резюме. Бумажки, заполненные по стандартным формам сайтов, приличные люди читать не будут. Не знаю, прав он, или нет — вам судить. Ну и по факту поглядим, найдет он работу с такой простыней, или нет.

Итак, дальше — сплошная цитата без моих правок.

Я не люблю стандартные резюме. Но объективно понимаю, что вы, скорее всего, обо мне ничего не знаете, и этот пробел надо восполнить. Поэтому я напишу необычное резюме. Резюме-статью.

Наливайте чайку или кофейку, у нас тут лонгрид.
Читать дальше →
Total votes 56: ↑34 and ↓22+12
Comments86

Выбор телевизора себе, любимому, с позиции науки, а не рекламы

Reading time4 min
Views121K

Всем привет.

На написание этой небольшой статьи меня натолкнул спор касательно выбора телевизора.

Сейчас в этой области — равно как в «мегапикселях для камер» — царит маркетинговая вакханалия в погоне за разрешениями: HD Ready давно сменились на Full HD, а уже становятся всё более популярными 4К и даже 8К.

Давайте разберёмся — а что нам реально-то нужно?
Читать дальше →
Total votes 142: ↑124 and ↓18+106
Comments346

Упрощение кода с помощью if constexpr в C++17

Reading time7 min
Views51K

Несколько новых возможностей C++17 позволяют написать более компактный и ясный код. Это особенно важно при шаблонном мета-программировании, результат которого часто выглядит жутко…


Например если вы хотите выразить if, который вычисляется во время компиляции, вы будете вынуждены написать код используя приём SFINAE (например enable_if) или статическую диспетчеризацию (tag dispatching). Такие выражения тяжело понять, и они выглядят как магия для разработчиков, незнакомых с продвинутыми шаблонами мета-программирования.


К счастью, с появлением C++17 мы получаем if constexpr. Теперь большинство приёмов SFINAE и статической диспетчеризации отпадает, и код уменьшается, становится похожим на "обычный" if.


Эта статься демонстрирует несколько приёмов использования if constexpr.

Читать дальше →
Total votes 28: ↑26 and ↓2+24
Comments53

Размышления на тему карьеры в IT и советы начинающим

Reading time3 min
Views24K
Привет, Хабр! Я тут недавно много думал насчёт карьеры, будущего нашей индустрии и так далее. Решил написать статью для тех кто только собирается сюда въезжать, да и вообще возможно кому-то будет интересно, все нижеприведенное чисто мое имхо и многое из того что я скажу применимо к другим сферам, а примерно половина из этого еще и кэпство, но давайте начнем.

  1. Первое что вам нужно знать: многие программисты воспринимают себя как латентные миллионеры, это в корне неправильный подход. Не идите сюда за огромными суммами денег, век стартапов прошел, а отдельно взятый программист мало чего стоит. 95% разработчиков это ресурс, который ничего не решает, он приносит прибыль путем перепродажи его человеко-часов, сливки вашего труда снимать будете не вы, как и во многих профессиях.
  2. Зарплата it-шника всегда имеет потолок, выше которой 99% не прыгнут, они не станут евангелистами, звёздами и прочими техническими директорами.

Читать дальше →
Total votes 45: ↑35 and ↓10+25
Comments98

Про одного парня

Reading time14 min
Views192K
История реальная, я все видел своими глазами.

Несколько лет один парень, как и многие из вас, работал программистом. На всякий случай напишу так: «программистом». Потому что он был 1Сником, на фиксе, производственной компании.

До этого он пробовал разные специальности – 4 года во франче программистом, руководителем проектов, умел закрывать по 200 часов, одновременно получая процент с проекта, за руководство и немного занимаясь продажами. Пробовал самостоятельно разрабатывать продукты, был начальником IT-отдела в большой компании, численностью 6 тысяч человек, примерял разные варианты применения своей кавычечной профессии – программиста 1С.

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

Этому парню стало интересно, как можно зарабатывать больше денег, не занимаясь продажами и не создавая свой собственный бизнес.
Читать дальше →
Total votes 272: ↑239 and ↓33+206
Comments247

Новые возможности лямбд в C++14

Reading time4 min
Views35K
Всем известно, что функциональное программирование распространяется с быстротой огня по современным языкам программирования. Недавние примеры — Java 8 и C++, оба из которых теперь поддерживают лямбда-функции.

Итак, начнём (и да прибудет с нами веселье). Этот текст также доступен в виде слайдов на Slideshare. На написание этой статьи автор был вдохновлён создателем JSON Дугласом Крокфордом.

Функция Identity, которая принимает аргумент и возвращает тот же самый аргумент:

auto Identity = [](auto x) {
  return x;
};
Identity(3); // 3

Примечание переводчика: Новой по сравнению с C++11 является возможность не указывать названия типов.
Более интересные примеры
Total votes 44: ↑41 and ↓3+38
Comments45

Сводная таблица по поддержке C++ 11/14/17

Reading time5 min
Views65K
Как любому C++ разработчику, следящему за новинками в отрасли и стандартами в частности, мне стало интересно, насколько полно вообще поддерживается стандарт C++ 11 (а также 1y и 1z) разными компиляторами? Да, существуют разные сводные таблицы, но чаще всего это сравнение двух компиляторов или двух версий одного компилятора, либо сводная таблица, но уже устаревшая, либо вообще неполный список. В общем, сел я да и сделал полную таблицу (на основе списка Clang-a и GCC) по четырем компиляторам: Clang, GNU C++, MSVC и Intel C++.
Таблица под катом
Total votes 73: ↑71 and ↓2+69
Comments46

Неприятная особенность std::list, о которой не все знают

Reading time3 min
Views55K
Двусвязный список — это фундаментальная структура данных, о которой все знают и повсеместно используют. Все знают почему и в каких случаях он эффективнее вектора, какие операции имеют линейную сложность, а какие — константную…

Хотя постойте, знаете ли вы какова сложность функции size ()?
«Конечно же я знаю — О(1)!», ответят многие из вас, «Что может быть проще?»

size_type  size() const                             
{
       return _size;
}


Тривиально, эффективно и безопасно, не так ли?
Я бы реализовал эту функцию именно так, большинство из вас сделали бы тоже самое.

Однако, те, кто писал реализацию GNU STL, другого мнения на этот счет.
Читать дальше →
Total votes 111: ↑96 and ↓15+81
Comments92

Ликбез по типизации в языках программирования

Reading time12 min
Views514K
image

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

В полной версии находится подробное описание всех видов типизации, приправленное примерами кода, ссылками на популярные языки программирования и показательными картинками.
Читать дальше →
Total votes 239: ↑232 and ↓7+225
Comments180

Революция интерфейсов. USB 3.1 Type-C в деталях. Взгляд электронщика

Reading time10 min
Views330K
image

Редко бывает, что одна лишняя буква в названии стандарта грозит совершить революцию в мире интерфейсов передачи данных и гаджетов, но появление последней разновидности USB 3.1 Type-C похоже как раз тот случай. Что же нам обещает принести очередное обновление старого доброго USB интерфейса?
  • Скорость передачи данных до 10 GBps
  • Возможность запитывания от порта устройств с потребляемой мощностью вплоть до 100Вт
  • Размеры коннектора сравнимые с micro-USB
  • Симметричность разъёма — у него не существует верха и низа, а значит нет ключа, который часто приводит к повреждениям как самих разъёмов, так и подключаемых через них гаджетов
  • С помощью данного интерфейса можно запитывать устройства с напряжением вплоть до 20 вольт
  • Больше не существует разных типов коннекторов — А и В. На обоих концах кабеля стоят совершенно одинаковые разъёмы. Как данные так и питающее напряжение могут передаваться через один и тот же разъём в обоих направлениях. В зависимости от ситуации каждый разъём может выступать в роли ведущего или ведомого
  • Нам обещают, что конструкция разъёма способна выдерживать до 10 000 подключений
  • Возможно использование этого интерфейса для непосредственного подключения вместо некоторых других широко распространённых интерфейсов для быстрого обмена данными.
  • Стандарт совместим сверху вниз как c обычным USB 3 интерфейсом, так и с его младшими братьями. Конечно не на прямую, но с помощью переходника через него возможно подключение скажем USB 2.0 диска

Под катом постараюсь разобрать тему по косточкам — начиная от конструкции разъёма и кабеля, и заканчивая кратким обзором профилей оборудования и новинок чипов для поддержки возможностей данного интерфейса. Я долго думал на какой площадке размещать статью, ведь все предыдущие касающиеся этой темы выходили на GT, но в моей публикации так много технических деталей, что она будет полезней не гикам, а потенциальным разработчикам, которым уже сегодня стоит начинать к нему присматриваться. Поэтому рискнул поселить статью тут.
Читать дальше →
Total votes 77: ↑74 and ↓3+71
Comments138

Спецификатор constexpr в C++11 и в C++14

Reading time16 min
Views219K
Одна из новых возможностей C++11 — спецификатор constexpr. С помощью него можно создавать переменные, функции и даже объекты, которые будут рассчитаны на этапе компиляции. Это удобно, ведь раньше для таких целей приходилось использовать шаблоны. Но тут все не так просто. У тех, кто не так хорошо знаком с constexpr, может сложиться впечатление, что теперь не будет никаких проблем с расчетами на этапе компиляции. Но на constexpr-выражения наложены серьезные ограничения.

В первой части будет рассказано про constexpr, о том, какие будут изменения в стандарте C++14, а во второй части будет пример использования constexpr: библиотека, которая считает результат математического выражения в строке.
С помощью нее можно будет написать следующий код:
constexpr auto x = "(4^2-9)/8+2/3"_solve;
std::cout << "Answer is " << x;

И ответ в виде дроби будет получен на этапе компиляции:
Answer is 37/24
Сразу предупреждаю, код этой библиотеки сложно понять.
Кому эта тема интересна, добро пожаловать под кат!
Читать дальше →
Total votes 53: ↑52 and ↓1+51
Comments45

Ускорение файлового ввода-вывода C/C++, не особо напрягаясь

Reading time4 min
Views25K
image

Предисловие


Есть на свете такая простая и очень полезная утилита — BDelta, и так вышло, что она очень давно укоренилась в нашем производственном процессе (правда её версию установить не удалось, но она точно была не последней доступной). Используем её по прямому назначению — построение бинарных патчей. Если взглянуть, что там в репозитории, — становится слегка грустно: по сути он давным-давно заброшен и многое там сильно устарело (когда-то туда внёс несколько правок мой бывший коллега, но давно это было). В общем, решил я это дело воскресить: форкнулся, выкинул то, что не планирую использовать, перегнал проект на cmake, заинлайнил «горячие» микрофункции, убрал со стека большие массивы (и массивы переменной длины, от которых у меня откровенно «бомбит»), прогнал в очередной раз профилировщик — и узнал, что около 40% времени тратится на fwrite
Читать дальше →
Total votes 43: ↑41 and ↓2+39
Comments34

Как я нашел пасхалку в защите Android и не получил работу в Google

Reading time12 min
Views99K
Гугл любит пасхалки. Любит настолько, что найти их можно практически в каждом продукте компании. Традиция пасхалок в Android тянется с самых первых версий операционной системы (я думаю, все в курсе, что будет, если в настройках несколько раз нажать на строчку с версией Android).

Но бывает и так, что пасхалки обнаруживаются в самых неожиданных местах. Есть даже такая легенда: однажды один программист загуглил «mutex lock», а вместо результатов поиска попал на страницу foo.bar, решил все задачи и устроился на работу в Google.

Реконструкция событий
image

Вот такая же удивительная история (только без хэппи-энда) произошла со мной. Скрытые послания там, где их точно не может быть, реверс Java кода и нативных библиотек, секретная виртуальная машина, прохождение собеседования в Google — все это под катом.
Читать дальше →
Total votes 279: ↑277 and ↓2+275
Comments302

Немного C++ной шаблонной магии и CRTP для контроля за корректностью действий программиста в компайл-тайм

Reading time11 min
Views4.4K

Недавно, работая над новой версией SObjectizer-а, довелось столкнуться задачей контроля в компайл-тайм действий разработчика. Суть была в том, что ранее программист мог делать вызовы вида:


receive(from(ch).empty_timeout(150ms), ...);
receive(from(ch).handle_n(2).no_wait_on_empty(), ...);
receive(from(ch).empty_timeout(2s).extract_n(20).stop_on(...), ...);
receive(from(ch).no_wait_on_empty().stop_on(...), ...);

Операция receive() требовала набор параметров, для указания которых использовались цепочки методов, вроде показанных выше from(ch).empty_timeout(150ms) или from(ch).handle_n(2).no_wait_on_empty(). При этом вызов методов handle_n()/extract_n(), ограничивающих количество извлекаемых/обрабатываемых сообщений, был необязательным. Поэтому все показанные выше цепочки были корректными.


Но в новой версии потребовалось заставить пользователя обязательно явно указывать количество сообщений для извлечения и/или обработки. Т.е. цепочка вида from(ch).empty_timeout(150ms) теперь становилась некорректной. Её следовало заменить на from(ch).handle_all().empty_timeout(150ms).


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


Может ли C++ помочь в этом?


Да. И если кому-то интересно как именно, то милости прошу под кат.

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

14 новинок в Visual Studio 2019

Reading time2 min
Views50K
Всем привет! На связи команда по улучшению продуктивности в .NET (aka. Roslyn). Мы много внимания уделяем улучшению вашего опыта .NET-кодинга. Ведь иногда небольшие дополнения и исправления действительно могут улучшить рабочий процесс. Возможно вы уже видели некоторые улучшения в превью-версиях VS2019. Но мы все равно хотим рассказать о некоторых из них, которые должны помочь вам работать продуктивнее.

Осторожно, много гифок.

Читать дальше →
Total votes 28: ↑28 and ↓0+28
Comments48

Концепты для отчаявшихся

Reading time5 min
Views22K

Всё началось с того, что мне понадобилось написать функцию, принимающую на себя владение произвольным объектом. Казалось бы, что может быть проще:


template <typename T>
void f (T t)
{
    // Завладели экземпляром `t` типа `T`.
    ...

    // Хочешь — переноси.
    g(std::move(t));

    // Не хочешь — не переноси.
    ...
}

Но есть один нюанс: требуется, чтобы принимаемый объект был строго rvalue. Следовательно, нужно:


  1. Сообщать об ошибке компиляции при попытке передать lvalue.
  2. Избежать лишнего вызова конструктора при создании объекта на стеке.

А вот это уже сложнее сделать.


Поясню.

Читать дальше →
Total votes 39: ↑37 and ↓2+35
Comments53

Information

Rating
Does not participate
Registered
Activity