• Исследование многократного перезалива JPEG

    • Tutorial

    В VK есть группа со следующим описанием:


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

    Слева исходная картинка, загруженная 7 июня 2012, справа — какая она сейчас.


    КДПВ


    Видео

    Такая разница очень подозрительна. Попробуем разобраться, что происходило в течение этих 7 лет. Для ознакомления есть статья на Медузе про эту группу, но нас будет интересовать только техническая сторона.

    Читать дальше →
  • [CppCon 2017] Matt Godbolt: Что мой компилятор сделал для меня?

    • Tutorial

    Продолжение цикла обзорных статей с конференции CppCon 2017.



    На этот раз очень интересное выступление от автора Compiler Explorer (godbolt.org). Обязательно читать всем, кто для быстроты умножает на 2 с помощью сдвига (по крайней мере, на x86-64). Если вы знакомы с ассемблером x86-64, то можете перемотать до разделов с примерами ("Умножение", "Деление" и т.д). Далее слова автора. Мои комментарии в квадратных скобках курсивом.


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


    Читать дальше →
    • +31
    • 13.9k
    • 3
  • [CppCon 2017] Ларс Кнолл: C++ фреймворк Qt: История, Настоящее и Будущее

      Содержание цикла обзора выступлений CppCon 2017:



      Обзор выступления Ларса Кнолла (Lars Knoll), являющегося техническим директором Qt Company. Не ждите от этого выступления слишком многого. В квадратных скобках курсивом мои примечания.


      Читать дальше →
    • [CppCon 2017] Бьёрн Страуструп: Изучение и преподавание современного C++

        Сейчас проходит конференция CppCon 2017, и на их youtube-канале уже стали появляться видео оттуда. И я подумал, почему бы не попробовать сделать конспекты интересных лекций. Конечно, не очень уверен, надолго ли меня хватит, зависит от того насколько вам это понравится.


        Это первое вступительное видео. Оно не такое интересное для меня, но пропустить тоже не мог, это же Страуструп. Далее, текст от его лица. Заголовки взяты из слайдов.


        Читать дальше →
      • Основные концепции библиотеки chrono (C++)

        • Tutorial

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


        – Слушай, ты не помнишь, мы в sleep передаем секунды или миллисекунды?

        – Блин, оказывается у меня в часе 360 секунд, ноль пропустил.

        Для избежания таких ошибок предусмотрена библиотека chrono (namespace std::chrono). Она была добавлена в C++11 и дорабатывалась в поздних стандартах. Теперь все логично:


        using namespace std::chrono;
        
        int find_answer_to_the_ultimate_question_of_life()
        {
            //Поиск ответа
            std::this_thread::sleep_for(5s); //5 секунд
            return 42;
        }
        
        std::future<int> f = std::async(find_answer_to_the_ultimate_question_of_life);
        
        //Ждем максимум 2.5 секунд
        if (f.wait_for(2500ms) == std::future_status::ready)
            std::cout << "Answer is: " << f.get() << "\n";
        else
            std::cout << "Can't wait anymore\n";

        Библиотека реализует следующие концепции:


        • интервалы времени – duration;
        • моменты времени – time_point;
        • таймеры – clock.
        Читать дальше →
      • Ненормальное программирование: макрос-интерпретатор в Notepad++

          swap


          Обмен значений. Исходный текст и текст после 1-го, 2-го и 3-го выполнения макроса. Далее будут примеры посложнее.


          Идея приспособить макрос для примитивного программирования появлялась у меня несколько раз. То есть, сделать так, чтобы макрос при запуске "читал" строчку с операцией, интерпретировал ее, что-то делал с данными и переходил к следующей строчке.


          На всякий случай напомню: макрос в Notepad++ и в других текстовых редакторах – записанная последовательность действий пользователя над текстом. Макрос можно запускать многократно для быстрого выполнения рутинных операций. Макрос "запоминает" нажатия клавиш и может воспроизводить, например, такие действия:


          • Ввод и удаление символов
          • Перемещение курсора
          • Копирование и вставка
          • Поиск в тексте

          Сначала это казалось невозможным, ведь макрос слишком "глуп" и прямолинеен:


          • Нельзя менять последовательность действий во время выполнения макроса.
          • Искомая строка фиксирована — никакой вставки из буфера обмена.
          • Нельзя выполнить действие переменное количество раз, а также пропустить действие в зависимости от какого-либо условия.
          Читать дальше →
          • +24
          • 7.6k
          • 9
        • Эксперимент: ищем int i = 0xDEADBEEF в дампе физической памяти

          • Tutorial

          КДПВ


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


          int main()
          {
              unsigned i = 0xDEADBEEF;
              std::cout << "address of i is " << std::hex << &i;
              std::cin.get(); //Чтобы процесс не завершился
              return 0;
          }

          Затем попробуем найти физический адрес и просмотреть значение по этому адресу.


          Читать дальше →
          • +38
          • 14.3k
          • 7
        • Подробное введение в rvalue-ссылки для тех, кому не хватило краткого

          • Tutorial

          Вместо КДПВ — короткая драма для привлечения внимания, основанная на реальных событиях. Ее можно смело пропустить и перейти к статье, которая поможет вам разобраться в rvalue-ссылках, конструкторах перемещения, универсальных ссылках, идеальной передаче (perfect forwarding) и т. д.


          Драма в трех действиях


          Действие первое


          Компилятор. Локальный объект x типа T, проживающий на стеке, вы приговариваетесь к изъятию у вас всего имущества в связи с тем, что не будете пользоваться им до конца своей жизни.


          Объект x. Что? Я не какой-то там временный объект, у меня постоянная регистрация, вы не имеете права!


          Компилятор. Никто вас не выселяет. Но согласно одиннадцатой редакции стандартного кодекса, все ваши вещи будут переданы другому объекту, которому они нужны больше.


          Объект x. И как вы это сделаете? Все мои данные надежно инкапсулированы, я не позволю никому бесцеремонно обращаться с ними. Если уж они так вам нужны, то пусть приходит конструктор копирования со своей флешкой, я ему скопирую.


          Читать дальше →
        • Изобретаем JPEG

          • Tutorial

          Вы правильно поняли из названия, что это не совсем обычное описание алгоритма JPEG (формат файла я подробно описывал в статье «Декодирование JPEG для чайников»). В первую очередь, выбранный способ подачи материала предполагает, что мы ничего не знаем не только о JPEG, но и о преобразовании Фурье, и кодировании Хаффмана. И вообще, мало что помним из лекций. Просто взяли картинку и стали думать как же ее можно сжать. Поэтому я попытался доступно выразить только суть, но при которой у читателя будет выработано достаточно глубокое и, главное, интуитивное понимание алгоритма. Формулы и математические выкладки — по самому минимуму, только те, которые важны для понимания происходящего.

          Знание алгоритма JPEG очень полезно не только для сжатия изображений. В нем используется теория из цифровой обработки сигналов, математического анализа, линейной алгебры, теории информации, в частности, преобразование Фурье, кодирование без потерь и др. Поэтому полученные знания могут пригодиться где угодно.

          Если есть желание, то предлагаю пройти те же этапы самостоятельно параллельно со статьей. Проверить, насколько приведенные рассуждения подходят для разных изображений, попытаться внести свои модификации в алгоритм. Это очень интересно. В качестве инструмента могу порекомендовать замечательную связку Python + NumPy + Matplotlib + PIL(Pillow). Почти вся моя работа (в т. ч. графики и анимация), была произведена с помощью них.

          Внимание, трафик! Много иллюстраций, графиков и анимаций (~ 10Мб). По иронии судьбы, в статье про JPEG всего 2 изображения с этим форматом из полусотни.
          Читать дальше →
        • Тонкости оператора switch

          • Tutorial
          Да, это целая статья по самому обычному switch в JDK 7. Бывает так, что накопленный материал кажется интересным и малоизвестным, а потом оказывается, что любая бабка у подъезда уже 50 лет знает об особенностях реализации switch. Но я попробую. Для затравки, предлагаю 3 вопроса:

          1. (Простой) Каков результат работы этого кода?
            switch(5){
            default: System.out.print(0);
            case 1: System.out.print(1); break;
            case 4: System.out.print(4);
            case 2: System.out.print(2);
            }

          2. Следующие 2 варианта практически одинаковы. Немного отличаются литералами.
            //Вариант 1
            switch("BBBBBB"){
            case "AaAaAa": break; 
            case "AaAaBB": break;
            case "AaBBAa": break;
            case "AaBBBB": break;
            case "BBAaAa": break;
            case "BBAaBB": break;
            case "BBBBAa": break;
            case "BBBBBB": break;
            }
            //Вариант 2
            switch("BBBBBB_8"){
            case "AaAaAa_1": break;
            case "AaAaBB_2": break;
            case "AaBBAa_3": break;
            case "AaBBBB_4": break;
            case "BBAaAa_5": break;
            case "BBAaBB_6": break;
            case "BBBBAa_7": break;
            case "BBBBBB_8": break;
            }
            Почему первый switch выполняется в несколько раз медленнее, по крайней мере, с отключенным JIT (-Djava.compiler=NONE)? Сами проверьте в цикле! JIT таким кодом не проведешь, но если немного пошаманить, то небольшая разница будет заметна.
          3. Какова вычислительная сложность алгоритма нахождения совпадающего значения среди n case-ов (по крайней мере, в JDK 7)?
          Читать ответы и статью
        • Жонглирование. Теория. Практика

            Настороженно отношусь к непрофильным топикам, но решил написать этот по следующим причинам:
            • У жонглирования есть своя теория — стройная и математически привлекательная!
            • Мы живем не только работой. Жонглирование — отличное развлечение и разминка после долгого сидения за компом.
            • В пятницу приятно немного расслабиться и почитать не очень серьезные статьи. К тому же, будет чем заняться на выходные, особенно если у вас не было определенных планов.

            Теория


            Утверждать, что жонглирование — это последовательность бросков, все равно, что сказать, что музыка — это просто последовательность нот. Нельзя назвать это неправдой, но любой, хоть немного знакомый с музыкальной теорией, возмутится последним определением — столь поверхностным и недалеким.
            Читать дальше →
          • Декодирование GIF

            • Tutorial
            В прошлый раз мы разобрались как устроен JPEG (Декодирование JPEG для чайников). Вполне логично, что следующим форматом стал GIF. Кстати, он гораздо проще. Его, в отличии от JPEG, можно декодировать имея только ручку с бумажкой. Сначала, продолжая традицию, я захотел закодировать в GIF favicon Гугла, но потом решил, что лучше расписать процесс декодирования всего файла на маленьком изображении. Без всяких «а дальше по аналогии...». Пришлось долго экспериментировать, и картинка получилась неказистой, зато вполне наглядной для изучения.

            Итак, мы будем ковырять вот эту картинку . Видите? :) Тогда она же, увеличенная в 10 раз:


            Внутренности в hex-редакторе:

            Читать дальше →
            • +105
            • 13.1k
            • 9
          • Декодирование JPEG для чайников

            • Tutorial

            [FF D8]


            Вам когда-нибудь хотелось узнать как устроен jpg-файл? Сейчас разберемся! Прогревайте ваш любимый компилятор и hex-редактор, будем декодировать это:


            Jpeg file in hex editor


            Специально взял рисунок поменьше. Это знакомый, но сильно пережатый favicon Гугла: Google favicon


            Последующее описание упрощено, и приведенная информация не полная, но зато потом будет легко понять спецификацию.


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


            [FF D8] — маркер начала. Он всегда находится в начале всех jpg-файлов.


            Следом идут байты [FF FE]. Это маркер, означающий начало секции с комментарием. Следующие 2 байта [00 04] — длина секции (включая эти 2 байта). Значит в следующих двух [3A 29] — сам комментарий. Это коды символов ":" и ")", т.е. обычного смайлика. Вы можете увидеть его в первой строке правой части hex-редактора.

            Читать дальше →
          • Функция без явного определения

              Изучаю C++. Балуясь с указателями придумал интересный для себя пример. Вероятно, опытных людей он не заинтересует, но я все же рискну.
              typedef int (*pf)(int, int);
              char c[] = {85,-119,-27,-117,69,12,3,69,8,93,-61,-112};
              pf sum = (pf)c; //reinterpret_cast здесь не работает.
              cout << sum(2,3); //Вывод 5.


              * This source code was highlighted with Source Code Highlighter.
              Теперь sum — функция сложения, являющаяся аналогом этой:
              int sum(int a, int b){return a+b;}

              Единственное полезное применение которое я могу придумать — пугать опасностью подобных приведений.

              UPD. Как мне подсказал iley, это в общем-то относится к C.

              UPD. Одной строкой:
              cout << ((int (*)(int, int))"\x55\x89\xE5\x8B\x45\x0C\x03\x45\x08\x5D\xC3")(2,3)
              (спасибо 0lympian за мысль и halyavin за поправку)
            • Детская Википедия. Нужна?

                «Почему небо голубое?»
                • Как объяснить это трехлетнему ребенку? Про спектр — еще непонятно. Самое простое объяснение, которое я нашла, подходит для младшего школьного возраста.
                • А если глобально: кто знает подходящую литературу или интернет-порталы? Ответы на детские почемучки о природе, но для 3-4-летних. Или я слишком много хочу?
                • Энциклопедий у нас много, хороших и разных. Но не всегда они помогают. Например, с тем же небом.
                Ветка форума.

                В детстве у меня была такая книга.

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

                Но эта статья не о книжке. Стало интересно, существует ли в Интернете похожий сборник ответов для детей. Оказывается с этим все не очень здорово. Долгий поиск выявил всего 2 вроде бы подходящих сайта: potomy.ru и children.claw.ru. Посмотрим, что они представляют…
                Читать дальше →
              • Раскладка клавиатуры с AltGr

                  Мне, как обычному пользователю, надоело каждый раз переключать русскую раскладку для набора символов типа: [ ] { } < >, одного-двух символов латиницы и т. п. Мне кажется, что в этом я не одинок, и решил поделиться достаточно простым способом (для Windows).


                  На Хабре упоминалась клавиша AltGr и о том, что с ее помощью можно вводить различные спецсимволы. Ничего создавать я не хочу, поэтому качаем готовую раскладку(UPD: 404, см. ниже), устанавливаем, и добавляем раскладку «Русская (AltGr)» (Язык и региональные стандарты > Языки > Подробнее)


                  Все, теперь вместо Ctrl + Shift (или Alt + Shift) можно удерживать AltGr. Надеюсь, кому-нибудь будет полезно.

                  Читать дальше →
                • О математике

                    Несколько лет назад одна моя знакомая с гуманитарным образованием сказала: «Да что у вас в математике, все строго, все открыто, 2+2 всегда равно 4, скукота». К сожалению я еще был школьником и достойно ответить не смог.


                    Сколько же раз, во время подготовки к экзамену, я ворчал: «Ну Коши, блин, напридумывал тут, ничего не понятно, ему делать что ли нечего было». Разумеется, я понимал, что все это не просто так, но порой, от обилия различных абстрактных теорем мне начинало казаться, что это все придумано только чтобы загрузить студентов.

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

                    «Сегодня мы узнаем, что такое синус угла. Синус — это отношение длины противоположного катета к длине гипотенузы… Что, Иванов, у тебя вопрос?… Зачем это нужно? Понимаешь, это основа тригонометрии, которая используется в частности в аналитической геометрии… Иванов! Да ты спишь что ли?»

                    В это время Иванову снился сон, в котором он был великим математиком давних времен:
                    Читать дальше →
                  • Пару слов о программировании и непрограммистах

                      А также о тех, кто хочет научиться этому искусству. Очень субьективно.

                      Я горжусь своей профессией, но очень не люблю говорить людям мало сведущим в программировании и в ИТ в частности, кем я работаю.
                      Люди сходятся во мнении, что программист — это тот, кто связан с компьютерами. На этом сходства заканчиваются. Один думает, что я печатаю бумажки в Ворде, другой то, что ремонтирую компьютеры и прочую периферию. Я это не придумываю. Вот случай произошедший как-то в нашем замечательном военкомате. Узнав род деятельности, прапорщик обрадовался:
                      — О, а у нас принтер не печатает!
                      — Какой принтер?
                      — Ну такой, с лентой.
                      Читать дальше →
                    • Задача про самолет

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

                        «Самолет пролетел 100 км строго на юг, затем 100 км на запад и 100 км на север, после чего оказался в исходной точке. Откуда он вылетел?»

                        Решение не одно!

                        Землю рассматривать как идеальную сферу, высотой полета самолета пренебречь.
                      • Прохождение сапера. Часть 2.

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