• Знакомство с Python для камрадов, переросших «язык A vs. язык B» и другие предрассудки

      Для всех хабравчан, у которых возникло ощущение дежавю: Написать этот пост меня побудили статья "Введение в Python" и комментарии к ней. К сожалению, качество этого "введения" кхм… не будем о грустном. Но ещё грустнее было наблюдать склоки в комментариях, из разряда "C++ быстрее Python", "Rust ещё быстрее C++", "Python не нужен" и т.д. Удивительно, что не вспомнили Ruby!


      Как сказал Бьярн Страуструп,


      «Есть всего два типа языков программирования: те, на которые люди всё время ругаются, и те, которые никто не использует».

      Добро пожаловать под кат всем, кто хотел бы познакомиться с Python, не опускаясь при этом до грязных ругательств!

      Читать дальше →
    • Топ 20 ошибок при работе с многопоточностью на С++ и способы избежать их

      Привет, Хабр! Предлагаю вашему вниманию перевод статьи «Top 20 C++ multithreading mistakes and how to avoid them» автора Deb Haldar.


      Сцена из фильма «Петля времени» (2012)

      Многопоточность— одна из наиболее сложных областей в программировании, особенно в C++. За годы разработки я совершил множество ошибок. К счастью, большинство из них были выявлены на код ревью и тестировании. Тем не менее, некоторые каким-то образом проскакивали на продуктив, и нам приходилось править эксплуатируемые системы, что всегда дорого.

      В этой статье я попытался категоризировать все известные мне ошибки с возможными решениями. Если вам известны еще какие-то подводные камни, либо имеете предложения по решению описанных ошибок– пожалуйста, оставляйте свои комментарии под статьей.
      Читать дальше →
    • Загрузка ядра Linux. Часть 1

      • Перевод
      От загрузчика к ядру

      Если вы читали предыдущие статьи, то знаете о моём новом увлечении низкоуровневым программированием. Я написал несколько статей о программировании на ассемблере для x86_64 Linux и в то же время начал погружаться в исходный код ядра Linux.

      Мне очень интересно разобраться, как работают низкоуровневые штуки: как программы запускаются на моём компьютере, как они расположены в памяти, как ядро управляет процессами и памятью, как работает сетевой стек на низком уровне и многое другое. Итак, я решил написать еще одну серию статей о ядре Linux для архитектуры x86_64.

      Обратите внимание, что я не профессиональный разработчик ядра и не пишу код ядра на работе. Это всего лишь хобби. Мне просто нравятся низкоуровневые вещи и интересно в них копаться. Поэтому если заметите какую-то путаницу или появилятся вопросы/замечания, свяжитесь со мной в твиттере, по почте или просто создайте тикет. Буду благодарен.
      Читать дальше →
    • Обзор примитивов синхронизации — спинлоки и тайны ядра процессора

        Последняя статья про классические примитивы синхронизации.

        (Наверное, потом напишу ещё одну про совсем уже нетипичную задачу, но это потом.)

        Сегодня мы немножко заглянем в процессор. Чуть-чуть.

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

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

        На уровне процесса всё так и есть — различия между спинлоком и мьютексом — чисто технические, вопрос реализации и производительности.

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

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

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

        Итак, иерархия реализации такова: mutex/cond/sema сделаны на базе спинлоков, спинлоки — на базе атомарных операций, предоставляемых процессором. Мы в них немного заглянем сегодня.

        Как устроен спинлок?
        Читать дальше →
      • Пишем модуль ядра Linux: GPIO с поддержкой IRQ

        • Tutorial
        Хабр, привет!

        Данная статья посвящена разработке GPIO (General-Purpose Input/Output) модуля ядра Linux. Как и в предыдущей статье мы реализуем базовую структуру GPIO драйвера с поддержкой прерываний (IRQ: Interrupt Request).


        Читать дальше →
      • Пишем модуль ядра Linux: I2C

        • Tutorial
        Хабр, привет!

        Данная статья посвящена разработке I2C (Inter-Integrated Circuit) модуля ядра Linux. Далее описан процесс реализация базовой структуры I2C драйвера, в которую можно легко добавить реализацию необходимого функционала.

        Опишем входные данные: I2C блок для нового процессора «зашитый» на ПЛИС, запущенный Linux версии 3.18.19 и периферийные устройства (EEPROM AT24C64 и BME280).

        Принцип работы I2C достаточно прост, но если нужно освежить знания, то можно почитать тут.


        Рисунок 1. Временная диаграмма сигналов шины I2C
        Читать дальше →
        • +52
        • 17,2k
        • 6
      • Балансировочный стенд своими руками на отладочной плате SiLabs C8051F120-TB


        Если вы задумали отбалансировать что-то вращающееся, будь то колесо, винт самолета или летающая тарелка. Или Вам интересна история, как проходят рабочие будни программиста. Увлекательная история по созданию балансировочного стенда…
        Добро пожаловать под хабракат
      • Коротенькое сравнение VHDL и Verilog в помощь начинающим знакомство с ПЛИС

        Исторически так сложилось что ПЛИС я начал изучать только на новой работе.
        Это были серии ПЛИС фирмы Altera.

        Старшие коллеги на перебой рекомендовали как AHDL так и VHDL для программирования этих микросхем.
        В итоге я остановился на языке VHDL, поскольку он является языком высокого уровня, в отличии от ADHL.
        Хоть и листинг у последнего был куда приятнее.

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

        Приведу пример листинга из статьи «Делаем таймер или первый проект на ПЛИС».
        Читать дальше →
      • Junior FPGA Design Engineer: как стать?

          Всем привет!

          Иногда начинающие разработчики не очень хорошо представляют, какую литературу надо читать для серьезного изучения того или иного языка.

          Разработка под FPGA (ПЛИС) — это не просто какой-то язык. Это очень объемная область, с огромным количеством подводных камней и нюансов.

          В этой статье вы найдете:
          • список тем, которые должен освоить начинающий разработчик под FPGA
          • рекомендуемую литературу по каждой из тем
          • набор тестовых вопросов и лабораторных работ
          • классические ошибки новичков (и советы по исправлению)

          Добро пожаловать под кат!
          Читать дальше →
        • Оценка и оптимизация производительности вычислений на многоядерных системах. Часть 2

          • Перевод

          Данная публикация является переводом второй части статьи Characterization and Optimization Methodology Applied to Stencil Computations инженеров компании Intel. В предыдущей части была описана методология для оценки максимальной производительности, которая может быть получена при использовании какого-либо алгоритма на конкретной платформе на примере довольно распространенного вычислительного ядра, используемого при решении 3D акустического изотропного волнового уравнения. Эта часть описывает серию шагов по оптимизации исходного кода для получения производительности, близкой к ожидаемой отметке.
          Читать дальше →
        • Оценка и оптимизация производительности вычислений на многоядерных системах

          • Перевод

          Данная публикация является переводом первой части статьи Characterization and Optimization Methodology Applied to Stencil Computations инженеров компании Intel. Эта часть посвящена анализу производительности и построению roofline модели на примере довольно распространенного вычислительного ядра, которая позволяет оценить перспективы оптимизации приложения на данной платформе.
          Читать дальше →
        • Altera + OpenCL: программируем под FPGA без знания VHDL/Verilog

            image

            Всем привет!

            Altera SDK for OpenCL — это набор библиотек и приложений, который позволяет компилировать код, написанный на OpenCL, в прошивку для ПЛИС фирмы Altera. Это даёт возможность программисту использовать FPGA как ускоритель высокопроизводительных вычислений без знания HDL-языков, а писать на том, что он привык, когда это делает под GPU.

            Я поигрался с этим инструментом на простом примере и хочу об этом вам рассказать.

            План:

            Добро пожаловать под кат! Осторожно, будут картинки!
            Читать дальше →
          • Практическое применение преобразования Фурье для анализа сигналов. Введение для начинающих

            1. Преобразование Фурье и спектр сигнала


            Во многих случаях задача получения (вычисления) спектра сигнала выглядит следующим образом. Имеется АЦП, который с частотой дискретизации Fd преобразует непрерывный сигнал, поступающий на его вход в течение времени Т, в цифровые отсчеты — N штук. Далее массив отсчетов подается в некую программку, которая выдает N/2 каких-то числовых значений (программист, который утянул из инета написал программку, уверяет, что она делает преобразование Фурье).

            Чтобы проверить, правильно ли работает программа, сформируем массив отсчетов как сумму двух синусоид sin(10*2*pi*x)+0,5*sin(5*2*pi*x) и подсунем программке. Программа нарисовала следующее:

            image
            рис.1 График временной функции сигнала

            image
            рис.2 График спектра сигнала

            На графике спектра имеется две палки (гармоники) 5 Гц с амплитудой 0.5 В и 10 Гц — с амплитудой 1 В, все как в формуле исходного сигнала. Все отлично, программист молодец! Программа работает правильно.

            Это значит, что если мы подадим на вход АЦП реальный сигнал из смеси двух синусоид, то мы получим аналогичный спектр, состоящий из двух гармоник.

            Итого, наш реальный измеренный сигнал, длительностью 5 сек, оцифрованный АЦП, то есть представленный дискретными отсчетами, имеет дискретный непериодический спектр.
            С математической точки зрения — сколько ошибок в этой фразе?

            Теперь начальство решило мы решили, что 5 секунд — это слишком долго, давай измерять сигнал за 0.5 сек.
            Читать дальше →
          • Фурье-вычисления для сравнения изображений

              Традиционная техника “начального уровня”, сравнения текущего изображения с эталоном основывается на рассмотрении изображений как двумерных функций яркости (дискретных двумерных матриц интенсивности). При этом измеряется либо расстояние между изображениями, либо мера их близости.

              Как правило, для вычисления расстояний между изображениями используется формула, являющаяся суммой модулей или квадратов разностей интенсивности:
              d(X,Y) = SUM ( X[i,j] — Y[i,j] )^2

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

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

              Наличие большого числа библиотек, реализующих Фурье преобразований (во всевозможных вариантах быстрых версий), делает реализацию алгоритмов сравнения изображений не очень сложной задачей для программирования.
              Читать дальше →
            • Анализ изображений и видео. Классификация изображений и распознавание объектов

                Сегодня мы публикуем седьмую лекцию из курса «Анализ изображений и видео», прочитанного Натальей Васильевой в петербургском Computer Science Center, который создан по совместной инициативе Школы анализа данных Яндекса, JetBrains и CS-клуба.



                Всего в программе девять лекций, из которых уже были опубликованы:
                1. Введение в курс «Анализ изображений и видео»;
                2. Основы пространственной и частотной обработки изображений;
                3. Морфологическая обработка изображений;
                4. Построение признаков и сравнение изображений: глобальные признаки;
                5. Построение признаков и сравнение изображений: локальные признаки;
                6. Поиск по подобию. Поиск нечетких дубликатов.

                Под катом вы найдете план новой лекции и слайды.
                Читать дальше →
              • Лекции Технопарка. 1 семестр. Алгоритмы и структуры данных

                • Tutorial
                Очередной пост в рамках нашего цикла лекций Технопарка. В этот раз мы предлагаем вашему вниманию курс, посвящённый алгоритмам и структурам данных. Автор курса — Степан Мацкевич, сотрудник компании ABBYY.

                Лекция 1. Основы


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


                Читать дальше →
              • Методы сжатия данных

                  Мы с моим научным руководителем готовим небольшую монографию по обработке изображений. Решил представить на суд хабрасообщества главу, посвящённую алгоритмам сжатия изображений. Так как в рамках одного поста целую главу уместить тяжело, решил разбить её на три поста:
                  1. Методы сжатия данных;
                  2. Сжатие изображений без потерь;
                  3. Сжатие изображений с потерями.
                  Ниже вы можете ознакомиться с первым постом серии.
                  Читать дальше →
                • Memory management в ядре Linux. Семинар в Яндексе

                    Привет! Меня зовут Роман Гущин. В Яндексе я занимаюсь ядром Linux. Некторое время назад я провел для системных администраторов семинар, посвященный общему описанию подсистемы управления памятью в Linux, а также некоторым проблемам, с которыми мы сталкивались, и методам их решения. Большая часть информации описывает «ванильное» ядро Linux (3.10), но некоторая часть специфична для ядра, использующегося в Яндексе. Вполне возможно, семинар окажется интересен не только системным администраторам, но и всем, кто хочет узнать, как в Linux устроена работа с памятью.



                    Основные темы, затронутые на семинаре:
                    • Задачи и компоненты подсистемы управления памятью;
                    • Аппаратные возможности платформы x86_64;
                    • Как описывается в ядре физическая и виртуальная память;
                    • API подсистемы управления памятью;
                    • Высвобождение ранее занятой памяти;
                    • Инструменты мониторинга;
                    • Memory Cgroups;
                    • Compaction — дефрагментация физической памяти.

                    Под катом вы найдете более подробный план доклада с раскрытием основных понятий и принципов.
                    Читать дальше →
                  • Как Linux работает с памятью. Семинар в Яндексе

                      Привет. Меня зовут Вячеслав Бирюков. В Яндексе я руковожу группой эксплуатации поиска. Недавно для студентов Курсов информационных технологий Яндекса я прочитал лекцию о работе с памятью в Linux. Почему именно память? Главный ответ: работа с памятью мне нравится. Кроме того, информации о ней довольно мало, а та, что есть, как правило, нерелевантна, потому что эта часть ядра Linux меняется достаточно быстро и не успевает попасть в книги. Рассказывать я буду про архитектуру x86_64 и про Linux­-ядро версии 2.6.32. Местами будет версия ядра 3.х.



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

                      Термины


                      Резидентная память – это тот объем памяти, который сейчас находится в оперативной памяти сервера, компьютера, ноутбука.
                      Анонимная память – это память без учёта файлового кеша и памяти, которая имеет файловый бэкенд на диске.
                      Page fault – ловушка обращения памяти. Штатный механизм при работе с виртуальной памятью.
                      Читать дальше →