• Учимся программировать под Андроид

    Привет Хабр! Предлагаю вашему вниманию свободный перевод статьи «How To Learn Android Development» от Amit Shekhar.

    image

    Как изучить разработку приложений под Андроид?

    Я видел много вопросов о том, как начать изучать программирование под Андроид и стать успешным разработчиком. Здесь я попытался охватить большинство важных аспектов в Android Development.
    Читать дальше →
    • +16
    • 57,7k
    • 5
  • Руководство новичка по эксплуатации компоновщика

    David Drysdale, Beginner's guide to linkers (http://www.lurklurk.org/linkers/linkers.html).

    Цель данной статьи — помочь C и C++ программистам понять сущность того, чем занимается компоновщик. За последние несколько лет я объяснил это большому количеству коллег и наконец решил, что настало время перенести этот материал на бумагу, чтоб он стал более доступным (и чтоб мне не пришлось объяснять его снова). [Обновление в марте 2009: добавлена дополнительная информация об особенностях компоновки в Windows, а также более подробно расписано правило одного определения (one-definition rule).

    Типичным примером того, почему ко мне обращались за помощью, служит следующая ошибка компоновки:
    g++ -o test1 test1a.o test1b.o
    test1a.o(.text+0x18): In function `main':
    : undefined reference to `findmax(int, int)'
    collect2: ld returned 1 exit status
    

    Если Ваша реакция — 'наверняка забыл extern «C»', то Вы скорее всего знаете всё, что приведено в этой статье.
    Читать дальше →
  • Как расшифровать данные магнитной дорожки с использованием DUKPT

    Предлагаю читателям «Хабрахабра» перевод статьи «How To Decrypt Magnetic Card Data With DUKPT».

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

    Оказалось, мои считыватели используют схему известную как DUKPT (Derived Unique Key Per Transaction — Определение Уникального Ключа На Транзакцию). Идея этой схемы состоит в том, что для каждой транзакции (или в нашем случае для каждого проката карты) данные шифруются с использованием ключа вычисленного для отдельного проката карты.

    Таким образом, чтобы расшифровать данные, которые были зашифрованы с использованием этой схемы, вы должны уметь вычислять ключ для отдельного проката карты. Процесс вычисления такого ключа (сессионного ключа) далеко не простой.
    Читать далее
    • +11
    • 8,8k
    • 2
  • Как в Сингапуре работают с инновациями: от госрегулирования до ночных клубов

      Привет, Хабр! Меня зовут Сергей Лукашкин, я директор по управлению проектами в управлении цифровой трансформации ДИТ ВТБ. Много лет занимаюсь финтехом и инновациями в финансовой сфере. Конечно, уделяю много времени изучению лучших российских и зарубежных финтех-практик. В мире есть несколько знаковых мест, куда ездят посмотреть на инновационную инфраструктуру и культуру. Одно из таких признанных мест — Сингапур.



      Мне удалось побывать и познакомиться с инновационной инфраструктурой этой удивительной страны в рамках специального тура для ВТБ, организованного коллегами из Generation S, с которыми мы делаем корпоративный акселератор для стартапов. В этом посте я хочу поделиться своими впечатлениями о поездке, оценить финтех-инфраструктуру Сингапура с разных сторон, рассказать, как работают с инновациями в этой стране, да и вообще поделиться самым интересным о тех местах, где побывал.
      Читать дальше →
      • +29
      • 7,7k
      • 8
    • Математики доказали, что многочлены не помогут взломать RSA

      • Перевод

      Недавно в журнале Quanta вышел материал, в котором автор рассказывал про удивительный с точки зрения неискушенных читателей феномен, доказанный математиками. Его суть в том, что почти все многочлены определенного типа — неприводимые, то есть не поддаются разложению. Это доказательство применяется во многих областях чистой математики. Но также это хорошая новость для одного из столпов современной жизни — цифрового шифрования.

      Для надежного хранения цифровой информации широко используется шифрование с помощью алгоритма RSA. Это прокачанная версия схемы, которую может придумать даже семиклассник, чтобы обмениваться сообщениями с друзьями: каждой букве присваивается свой номер, который умножается на некий секретный, заранее оговоренный ключ. Чтобы расшифровать сообщение, достаточно просто поделить его на секретный ключ.

      RSA-шифрование работает схожим образом. Приведем сильно упрощенное объяснение. Пользователь придумывает сообщение и выполняет над ним определенные математические операции, включающие в себя умножение на очень большое число (длиной в несколько сотен цифр). Единственный способ расшифровать сообщение — найти простые множители полученного результата*.
      *
      Простые множители какого-либо числа — это простые числа, которые необходимо перемножить, чтобы получилось это число. Так, для числа 12 это 2*2*3, а для числа 495 это 3, 3, 5 и 11.

      Безопасность RSA-шифрования базируется на том факте, что математике неизвестны быстрые способы найти простые множители очень больших чисел. И если зашифрованное сообщение предназначалось не вам, и у вас нет ключа для его расшифровки, то попытки найти этот ключ могут занять добрую тысячу лет. Причем это справедливо и для самых современных компьютеров, с помощью которых все равно не удастся подобрать правильные простые множители.

      Но есть и обходной путь.
      Читать дальше →
    • Мысли о современном C++ и игровой разработке

      • Перевод
      Новый год для игровых разработчиков начался с волны критики, обрушившейся в адрес комитета по стандартизации C++ после публикации Араса Пранкевичуса «Жалобы по поводу современного C++». Возник серьезный вопрос: действительно ли комитет стандартов потерял связь с реальностью, или все наоборот, и это игровые разработчики откололись от остального С++ сообщества?

      Вашему вниманию предлагается перевод популярного поста Бена Дина, — ветерана игровой индустрии, проработавшего продолжительный срок в компаниях Blizzard, Electronic Arts и Bullfrog в качестве разработчика на C++ и тимлида, — в котором он отвечает на критику с позиции собственного опыта.

      TL;DR: Комитет по стандартизации C++ не имеет скрытой цели игнорировать нужды игровых разработчиков, а «современный» C++ не собирается становиться «неотлаживаемым» языком.
      На протяжении всей прошлой недели в Twitter шла активная дискуссия, в ходе которой многие программисты – особенно те из них, кто работает в сфере игровой разработки – высказались о том, что нынешний вектор развития «современного C++» не отвечает их потребностям. В частности, с позиции обычного игрового разработчика, все выглядит так, будто производительность отладки в языке игнорируется, а оптимизация кода становится ожидаемой и необходимой.

      В силу того, что на 2019 год я успел проработать в игровой индустрии более 23 лет, у меня имеется собственное мнение, основанное на наблюдениях по данной теме применительно к игровой разработке, которым мне и хотелось бы поделиться. Важна ли для игровых разработчиков «отлаживаемость» и почему? В чем заключаются вопросы, связанные с ней?

      Для начала — небольшой экскурс в историю.
      Читать дальше →
    • Курс лекций по JavaScript и Node.js в КПИ

        100 лекций по программированию в Киевском политехническом институте


        Товарищи инженеры, как и было обещано в анонсе, половина лекций (а это 51) уже доступны для просмотра на ютюбе и я продолжу их записывать в 2019 году. Часть из нужно будет перезаписать, потому, что в первых лекциях не самый лучший звук и потому, что очень простые темы у меня пока не очень хорошо получаются. Лучше вышли сложные и актуальные темы, которые мне и самому более интересно рассказывать. Я бы не сказал, что это курс для начинающих, скорее, это курс для тех, кто уже знает синтаксис. За это время поступило множество предложений, как улучшить способ подачи материала: делить на более короткие лекции, подготовить задачи для практического освоения, записывать семинары и ответы на вопросы студентов, добавить в программу разбор целого ряда спорных и холиварных тем. Но не все сразу, я и так посвящаю этому треть жизни.

        Читать дальше →
      • Тесты на C++ без макросов и динамической памяти

        Многие популярные библиотеки для тестирования, например Google Test, Catch2, Boost.Test тяжело завязаны на использование макросов, так что в качестве примера тестов на этих библиотеках вы обычно увидите картину вроде такой:


        namespace {
        
        // Tests the default c'tor.
        TEST(MyString, DefaultConstructor) {
          const MyString s;
          EXPECT_STREQ(nullptr, s.c_string());
          EXPECT_EQ(0u, s.Length());
        }
        
        const char kHelloString[] = "Hello, world!";
        
        // Tests the c'tor that accepts a C string.
        TEST(MyString, ConstructorFromCString) {
          const MyString s(kHelloString);
          EXPECT_EQ(0, strcmp(s.c_string(), kHelloString));
          EXPECT_EQ(sizeof(kHelloString)/sizeof(kHelloString[0]) - 1,
                    s.Length());
        }
        
        // Tests the copy c'tor.
        TEST(MyString, CopyConstructor) {
          const MyString s1(kHelloString);
          const MyString s2 = s1;
          EXPECT_EQ(0, strcmp(s2.c_string(), kHelloString));
        }
        }  // namespace

        К макросам в C++ отношение настороженное, почему же они так процветают в библиотеках для создания тестов?

        Читать дальше →
      • Senior Engineer в поисках работы. Как я прошел 15 технических собеседований и что я об этом думаю

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

        К моему удивлению, предыдущая статья о собеседованиях с рекрутерами и HR вызвала неожиданный интерес: более 100 000 просмотров по всем источникам. Я получил кучу положительного фидбека в личку, мне написали бывшие коллеги, которых я последний раз видел лет 5 назад; героини некоторых историй; парень, которому я несколько недель назад продавал системник через OLX (аналог Slando, — прим. пер.); барабанщик с которым мы в прошлом году играли метал в гараже, и, как это ни странно, довольно много рекрутеров, которые поинтересовались моими мыслями касательно тех или иных аспектов собеседований и найма. 250 человек зачем-то добавились ко мне в LinkedIn :).
        Читать дальше →
      • Редактирование видео в MPC с помощью шейдеров

        Есть задача: Изменить видео “на лету” при воспроизведении — поменять местами правую и левую часть. Не отразить, а именно поменять, т.е. разрезать картинку на две части и поменять их местами. Можно, конечно, сделать с помощью фреймсервера типа AviSynth'a, но это уже не совсем “на лету” — надо писать скрипт для каждого видео файла. Хочется сделать это быстро и без напрягов.

        На фига? Чтобы сделать курс лекций по машинному обучению от Яндекса более удобным для просмотра. Лектор указывает на пункты презентации вживую, и приходится постоянно перескакивать через весь экран взглядом, чтобы понять, о чём речь:

        image
        Читать дальше →
        • +31
        • 8,1k
        • 5
      • Особенности поиска работы в Европе

        Разработчик, с гуманитарным высшим, средним английским (сильный акцент и неправильное произношение), 15 годами опыта в десятке проектов, обремененный семьей – вдруг решил найти работу в Западной Европе.

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

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

          Был у меня в жизни такой опыт автоматизации, за который долгое время было стыдно. Не потому, что система плохо работала, или метаданные кривые были, или ТЗ не соответствовала — ровно наоборот. Все красиво, быстро, с полным внедрением во всей компании. С точки зрения формальных критериев это был полный успех.

          Но компанию, ее культуру это внедрение превратило в ад — бюрократический, системный и бессмысленный.

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

          Обо всем по порядку.
          Читать дальше →
        • Разрушительные исключения

          Ещё раз о том, почему плохо бросать исключения в деструкторах


          Многие знатоки C++ (например, Герб Саттер) учат нас, что бросать исключения в деструкторах плохо, потому что в деструктор можно попасть во время раскрутки стека при уже выброшенном исключении, и если в этот момент будет выброшено ещё одно исключение, в результате будет вызван std::terminate(). Стандарт языка C++17 (здесь и далее я ссылаюсь на свободно доступную версию драфта N4713) на эту тему сообщает нам следующее:

          Читать дальше →
        • Как и зачем красть деревья в git

            trees


            В этой статье я расскажу об одном полезном, но малоизвестном приеме работы с git — как можно легко создать коммит, используя дерево из другого коммита. Проще говоря, как получить нужное состояние проекта на какой-либо ветке, если это состояние уже когда-то и где-то было в репозитории раньше. Будет приведено несколько примеров того, как это позволяет элегантно решать некоторые практические задачи. И в частности я расскажу о найденном мной методе, который позволяет значительно упростить исправление множественных конфликтов при rebase. Кроме того, эта статья — отличный способ понять на практике, что из себя представляет коммит в git-е.

            Читать дальше →
          • Стратегии эффективного обучения для программистов. Часть 1 Установка на рост

            • Перевод
            В начале сентября я рассказал основные тезисы об эффективном обучении для программистов на Kiwi PyCon в Новой Зеландии. Моя лекция состояла из двух частей: одна об образе мышления, а вторая – о некоторых стратегиях, которые мы можем использовать.

            Статьи, которые мы публикуем – это амбициозная и немного отредактированная версия первой части лекции об образе мышления.

            часть 2
            Читать дальше →
            • +8
            • 11,5k
            • 1
          • Внутренняя и внешняя линковка в C++

            • Перевод
            Всем добрый день!

            Представляем вам перевод интересной статьи, который подготовили для вас рамках курса «Разработчик C++». Надеемся, что она будет полезна и интересна для вас, как и нашим слушателям.

            Поехали.

            Сталкивались ли вы когда-нибудь с терминами внутренняя и внешняя связь? Хотите узнать, для чего используется ключевое слово extern, или как объявление чего-то static влияет на глобальную область? Тогда эта статья для вас.

            В двух словах

            В единицу трансляции включены файл реализации (.c/.cpp) и все его заголовочные файлы (.h/.hpp). Если внутри единицы трансляции у объекта или функции есть внутреннее связывание, то этот символ виден компоновщику только внутри этой единицы трансляции. Если же у объекта или функции есть внешнее связывание, то компоновщик сможет видеть его при обработке других единиц трансляции. Использование ключевого слова static в глобальном пространстве имен дает символу внутреннее связывание. Ключевое слово extern дает внешнее связывание.
            Компилятор по умолчанию дает символам следующие связывания:

            • Non-const глобальные переменные — внешнее связывание;
            • Const глобальные переменные — внутреннее связывание;
            • Функции — внешнее связывание.


            Читать дальше →
          • Решение японских кроссвордов с помощью SAT солвера

              На Хабре было несколько статей по решению японских кроссвордов, где авторы придумывали различные способы как такие кроссворды решать. В комментарии к статье Решение цветных японских кроссвордов со скоростью света я высказал мысль, что, поскольку, решение японских кроссвордов является NP-полной задачей, то и решать их надо с использованием соответствующего инструмента, а именно SAT солвером. Поскольку моя идея была встречена весьма скептически, я решил попробовать ее реализовать и сравнить результаты с другими подходами. Что из этого получилось можно узнать под катом.
              Читать дальше →
            • Иди-ка ты на !@# со своей «токсичностью»

                IT — не детский садик. Это место для взрослых, руководствующихся логикой и здравым смыслом. Их не надо опекать, не надо следить за словами, не надо переживать, что у них сформируются комплексы. Если человек некомпетентен, надо дать ему об этом явно понять, а не беречь его нежные чувства в ущерб всем остальным.

                Так какого же чёрта моё прекрасное IT превращается в детский сад «Весёлый Програм-Мишка»?
                Читать дальше →
              • Манифест жёсткого программиста


                  Предисловие


                  Данный текст предполагает, что читатель ознакомлен с т.н. agile-манифестом разработки программного обеспечения и его т.н. основополагающими принципами.


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



                  Содержание


                  1. Манифест жёсткого программиста
                  2. Основополагающие принципы манифеста жёсткого программиста
                  3. Комментарии


                  Манифест жёсткого программиста


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


                  Концепция важнее новых требований
                  Качество важнее скорости
                  Делать как надо важнее, чем делать как просят


                  То есть, не отрицая важности того, что справа, мы всё-таки более ценим то, что слева.

                  Читать дальше →
                • Смарт-карты. Часть 2. APDU

                    Привет, Гиктаймс!

                    После общей информации, описанной в первой части, сегодня поговорим об APDU в формате, описанном в стандарте ISO7816-4.

                    APDU (application protocol data unit) — это формат общения карты и терминала. Терминал посылает Command APDU (C-APDU), а карта отвечает с Response APDU (R-APDU).

                    C-APDU


                    Формат C-APDU таков:
                    Header Body
                    CLA INS P1 P2 [Lc field] [Data field] [Le field]

                    Каждый элемент заголовка (header) сохранен на одном байте и является обязательным. К заголовку вернемся чуть позже, сейчас поговорим о body команды.

                    Элементы body следующие:

                    • Lc: длина элемента Data в байтах.
                    • Data: данные команды.
                    • Le: ожидаемая длина данных ответа в байтах, исключая длину Status Word.


                    Lc и Le, если присутствуют, могут занимать 1 (Short Length) или 3 байта (Extended Length) каждый. При Short Length кодируются значения от 1 до 256. Длина данных на 256 байтов записывается как «00». При Extended Length кодируются значения от 1 до 65536. Первый байт всегда «00» и остальные 2 байта — номер в формате Big Endian. Когда Lc или Le — «00 00 00», то длина данных — 65536 байтов.

                    В зависимости от присутствия или отсутствия элементы body команды можно разделить на 4 категории:

                    • Case 1: Body полностью отсутсвует, то есть команда не содержит в себе никаких данных и не ожидается получение каких либо данных от карты при ответе.
                    • Case 2: В body присутствует только Le, то есть команда не содержит в себе никаких данных, но при этом ожидается получение данных от карты.
                    • Case 3: В body присутствуют Lc и Data, то есть команда содержит в себе данные, но при этом не ожидается получение данных от карты.
                    • Case 4: В body присутствуют все элементы, а значит команда содержит в себе данные и ожидается получение данных от карты.

                    Читать дальше →