• Как сделать поиск по файлоболотам в 104 строки кода на python

      Продолжая тематику коротких полезных скриптов, хотелось бы познакомить читателей с возможностью построения поиска по контенту файлов и изображений в 104 строки. Это конечно не будет умопомрачительным по качеству решением — но вполне годным для простых нужд. Также в статье не будет ничего изобретаться — все пакеты open source.

      И да — пустые строки в коде тоже считаются. Небольшая демонстрация работы приведена в конце статьи.
      Читать дальше →
    • Go и кэши CPU

      • Translation

      Источник: unsplash.com

      По словам Джеки Стюарта, трехкратного чемпиона мира по гонкам Формулы-1, понимание автомобиля помогло ему стать лучшим пилотом: «Гонщику не обязательно быть инженером, но нужен интерес к механике».

      Мартин Томпсон (создатель LMAX Disruptor) применил эту концепцию к программированию. Если в двух словах, то понимание базового оборудования улучшит ваши навыки, когда речь заходит о разработке алгоритмов, структур данных и так далее.

      Команда Mail.ru Cloud Solutions перевела статью, автор которой углубился в устройство процессора и рассмотрел, как понимание некоторых концепций CPU помогает принимать оптимальные решения.
      Читать дальше →
    • Древности: Nokia E90, последний коммуникатор

        Давным-давно, лет пятнадцать назад, производители смартфонов не стеснялись экспериментировать с формой: им казалось, что «следующая крутая штука» обязательно должна иметь какие-то особые изгибы корпуса, иное расположение кнопок. Из настоящего времени, из мира примерно одинаковых широкоэкранных лопат, это кажется странным: ну что они суетились, ведь очевидно было, что главное в смартфоне — большой дисплей. А все остальное достигается софтом. Ретрофанату такое разнообразие устройств конца девяностых и нулевых только в радость. Особый интерес представляют артефакты, выделявшиеся своим дизайном уже тогда. Из смартфонов первого десятилетия двадцать первого века, Nokia E90 — это такой аппарат, мимо которого невозможно пройти. Дело не в его популярности или даже полезности. Уж слишком он непохож на любые другие устройства, выпускавшиеся в те времена. Заложенные в него идеи реализуются скорее сейчас, в настоящем, и то робко и с непонятными перспективами.


        Простите, Nokia E90 — это не смартфон. Это коммуникатор. Последний представитель особого класса носимых компьютеров, изобретенного финской компанией Nokia и просуществовавшего с 1996 по 2007 год. Уникальный гибрид носимого компьютера и обычного мобильника. Раскладушка, созданная для бизнеса, для высшего начальства, но желанная скорее среди технарей. В 2020 году этот телефон не так просто добыть за разумные деньги, но для любого фаната цифрового ретро это обязательный экспонат в коллекции. Я не смог пройти мимо, купил пару устройств и две недели пытался заставить работать хотя бы одно. Приставить к делу такой аппарат не получится: слишком стар. Я поставил перед собой иную задачу: хотелось эту Нокию оживить, настроить правильно ее штатные службы так, чтобы хоть что-нибудь работало. Посмотреть на эталон носимого устройства для бизнесмена 13-летней давности. И вот что у меня получилось.
        Читать дальше →
      • 68 непрошеных советов

        • Translation
        Это перевод самого недавнего поста Кевина Келли, со-основателя журнала Wired, писателя, фотографа, футуролога.


        Сегодня мой день рождения. Мне 68. Хочется пододвинуть кресло-качалку и пораздавать советы юнцам. Вот 68 непрошеных советов, которые я предлагаю всем вам как подарок ко дню рождения.

        • Научитесь учиться у тех, с кем вы не согласны, или даже тех, кто вас раздражает. Нет ли истины в их убеждениях?
        • Энтузиазм эквивалентен 25 баллам IQ.
        • Всегда требуйте дедлайн. Дедлайн избавляет от лишнего и заурядного. Он останавливает попытки достичь совершенного, поэтому вам приходится делать необычное. Необычное лучше.

        Читать дальше →
      • Стажировки в международных компаниях: как не завалить интервью и получить заветный оффер

          Эта статья является переделанной и дополненной версией моего рассказа про стажировку в Google.

          Привет, Хабр!

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

          Почему вы должны меня слушать? Не должны. Но за последние два года я побывал на стажировках в Google, Nvidia, Lyft Level5 и Amazon. Собеседуясь в компании в прошлом году, получил 7 офферов: от Amazon, Nvidia, Lyft, Stripe, Twitter, Facebook и Coinbase. Так что у меня есть кое-какой опыт в этом вопросе, который, возможно, окажется полезным.


          Читать дальше →
          • +9
          • 8.6k
          • 5
        • Математический пакет для Android — «Микро-Математика» — теперь с открытым исходным кодом

            Некоторое время назад я писал здесь о «Микро-Математике» — математическом пакете для Android, который я разработал в качестве хобби-поделки. Этим летом исполняется три года с тех пор, как «Микро-Математика» была выложена в Google Play на всеобщее обозрение. С тех пор программа развивалась дальше, и вот настал момент, когда доход от Google Play окупил разработку. В связи с этим я не вижу смысла дальше утаивать исходный код от общественности и перевожу проект в разряд Open Source. Тех, кому интересно познакомиться с репозиторием «Микро-Математики» на github, и, быть может, поучаствовать в дальнейшем развитии проекта, прошу под кат.

            Читать дальше →
          • Как я отказался от вычисления квадратного корня



            Очень часто при цифровой обработке сигналов необходимо вычислить длину вектора, обычно это делается по формуле A=SQRТ(X^2+Y^2). Здесь возвести в квадрат значение не сложно, но операция вычисления квадратного корня не является простой операцией, особенно для микроконтроллеров. Кроме того, алгоритмы вычисления корня выполняются не стабильное время, и для алгоритмов, в которых таких вычислений много, становится сложно прогнозировать время, необходимое для вычислений.

            С такой задачей столкнулся и я. О том, как я отказался от процедуры вычисления корня, читайте ниже.
            Читать дальше →
          • Сети для самых маленьких. Часть ой, всё

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



              Я не могу похвастаться тем, что за 7 лет я затронул все темы сетевой сферы или тем, что хотя бы одну из них раскрыл полностью. Но это и не было целью. А целью этой серии статей было ввести юного студента за руку в этот мир и проводить его шаг за шагом по основной галерее, давая общее представление, и уберечь от болезненных скитаний по тёмным уголкам сознания Олифера и Олифера в мучительных попытках найти ответ на вопрос, как всё это применить в жизни.
              СДСМ планировался коротким практическим курсом «как научиться в сети за месяц», а вылился в 16 (на самом деле 19) длинных выпусков, которые мы уже даже переименовали в «Сети Для Самых Суровых». Общее количество символов перевалило за 1 000 000.
              Читать дальше →
            • Bloody hell, или Как ругаться на английском, чтобы тебя приняли за культурного человека

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

                Но есть ситуации, когда без «крепкого словца» не обойтись. И чтобы не потерять свой имидж культурного человека, мы предлагаем вам целую коллекцию «mild curses» — легких ругательств и идиоматических выражений на английском языке, которые не считаются матами, но при этом помогут выразить всю палитру эмоций. Поехали!


                Читать дальше →
              • Понимание итераторов в Python

                Python — особенный язык в плане итераций и их реализации, в этой статье мы подробно разберём устройство итерируемых объектов и пресловутого цикла for.


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


                1. Использование генератора дважды


                >>> numbers = [1,2,3,4,5]
                
                >>> squared_numbers = (number**2 for number in numbers)
                
                >>> list(squared_numbers)
                [1, 4, 9, 16, 25]
                
                >>> list(squared_numbers)
                []

                Как мы видим в этом примере, использование переменной squared_numbers дважды, дало ожидаемый результат в первом случае, и, для людей незнакомых с Python в достаточной мере, неожиданный результат во втором.


                2. Проверка вхождения элемента в генератор


                Возьмём всё те же переменные:


                >>> numbers = [1,2,3,4,5]
                >>> squared_numbers = (number**2 for number in numbers)

                А теперь, дважды проверим, входит ли элемент в последовательность:


                >>> 4 in squared_numbers
                True
                >>> 4 in squared_numbers
                False
                Читать дальше →
              • Полигоны Another World

                • Translation

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


                Хорошим выбором для этого мог бы стать DOOM. Мегахит 1994 года от id Software был портирован на всё, что только можно. Игра спроектирована вокруг ядра, чётко разделённого на слои. Обычно легко найти и прочитать реализацию шести подсистем ввода-вывода.


                Другим выбором могла бы стать Another World 1991 года от Эрика Шайи, в Северной Америке более известная под именем Out Of This World. Я бы сказал, что на самом деле её интереснее изучать, чем DOOM, из-за полигональной графики, подходящей для диких оптимизаций. В некоторых случаях хитрые трюки позволяли игре работать на оборудовании, созданном за пять лет до выхода игры.



                Читать дальше →
              • Простой расчет контрольной суммы

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



                Чтобы упростить алгоритм, без потери качества, нужно немного «битовой магии», что интересная тема сама по себе.
                Читать дальше →
              • На моей визитке работает Linux

                • Translation
                Перевод статьи из блога инженера Джорджа Хиллиарда


                Кликабельно

                Я инженер встроенных систем. В свободное время я часто ищу то, что можно будет использовать в проектировании будущих систем, или что-то из разряда моих интересов.

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

                Я подумал: «Эти процессоры настолько дешёвые, что их практически можно раздавать даром». И через некоторое время ко мне пришла идея сделать голую карточку для Linux в форм-факторе визитной карточки.
                Читать дальше →
              • Статическая подписка с использованием шаблона Наблюдатель на примере С++ и микроконтроллера Cortex M4


                  Всем доброго здравия!


                  В преддверии Нового года хочу продолжить рассказывать про использование С++ на микроконтроллерах, на этот раз попытаюсь рассказать про использование шаблона Наблюдатель (но далее я буду называть его Издатель-Подписчик или просто Подписчик, такой вот каламбур), а также реализацию статической подписки на С++17 и преимущества этого подхода в некоторых приложениях.

                  Читать дальше →
                • Как работает видеокодек. Часть 1. Основы

                  • Translation

                  Вторая часть: Принципы работы видеокодека




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

                  Если рассматривать итоговый цвет как комбинацию т.н. основных цветов (красного, зеленого и синего), в нашей трёхмерной матрице определяем три плоскости: первая для красного цвета, вторая для зеленого и последняя для синего.
                  3D матрица RGB

                  Будем называть каждую точку в этой матрице пикселем (элементом изображения). Каждый пиксель содержит информацию об интенсивности (обычно в виде числового значение) каждого цвета. Например, красный пиксель означает, что в нём 0 зеленого цвета, 0 синего и максимум красного. Пиксель розового цвета может быть сформирован с помощью комбинации трех цветов. Используя числовой диапазон от 0 до 255, розовый пиксель определяется как Красный = 255, Зелёный = 192 и Синий = 203.
                  Читать дальше →
                • CreateRemoteThread для Linux

                  • Tutorial

                  Мицуха несёт новые потокиВ WinAPI есть функция CreateRemoteThread, позволяющая запустить новый поток в адресном пространстве другого процесса. Её можно использовать для разнообразных DLL-инъекций как с нехорошими целями (читы в играх, кража паролей, и т. д.), так и для того, чтобы на лету исправить баг в работающей программе, или добавить плагины туда, где они не были предусмотрены.


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


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


                  Для понимания текста потребуются базовые знания о системном программировании под Linux: язык Си, написание и отладка программ на нём, осознание роли машинного кода и памяти в работе компьютера, понятие системных вызовов, знакомство с основными библиотеками, навык чтения документации.

                  Читать дальше →
                • Точки входа в Python

                  • Translation
                  • Tutorial
                  Многие думают, что точки входа это такие инструкции в setup.py, которые позволяют сделать пакет доступным для запуска из командной строки. Это, в целом, верно, но возможности точек входа не ограничиваются этим.

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



                  Осторожно: специфический юмор далее по тексту.
                  Читать дальше →
                  • +39
                  • 16.7k
                  • 6
                • Как выглядит zip-архив и что мы с этим можем сделать

                    Доброго времени суток, уважаемый Хабр!

                    За последние пол года кривая дорожка моих пет-проектов завела меня в такие дебри, откуда до сих пор выбраться не представляется возможным. И начиналось-то все безобидно — сайт с картинками, но чувство перфекционизма, погоня за халявой, а также некоторые особенности моего склада ума превратили эту, как изначально планировалось, маленькую прогулку, в настоящее длинное путешествие. Ну и ладно, как говорил один довольно картавый революционер: «Учиться, учиться и еще раз учиться», а мне, волей-неволей, приходится этому напутствию следовать.

                    Ой, что-то мы отвлеклись от основной темы. Не буду больше вас утомлять пространными речами, а перейду к делу.
                    Читать дальше →
                  • Инициализация в современном C++


                      Общеизвестно, что семантика инициализации — одна из наиболее сложных частей C++. Существует множество видов инициализации, описываемых разным синтаксисом, и все они взаимодействуют сложным и вызывающим вопросы способом. C++11 принес концепцию «универсальной инициализации». К сожалению, она привнесла еще более сложные правила, и в свою очередь, их перекрыли в C++14, C++17 и снова поменяют в C++20.


                      Под катом — видео и перевод доклада Тимура Домлера (Timur Doumler) с конференции C++ Russia. Тимур вначале подводит исторические итоги эволюции инициализации в С++, дает системный обзор текущего варианта правила инициализации, типичных проблем и сюрпризов, объясняет, как использовать все эти правила эффективно, и, наконец, рассказывает о свежих предложениях в стандарт, которые могут сделать семантику инициализации C++20 немного более удобной. Далее повествование — от его лица.

                      Читать дальше →
                    • Встраиваем Lua интерпретатор в проект для микроконтроллера (stm32)

                      • Tutorial


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

                      Так как большинство программ для микроконтроллеров пишется на С/C++, то для этих целей обычно используют абстрактные классы, предоставляющие интерфейсы к низкоуровневым сущностям (в случае, если проект пишется только с использованием C, то зачастую используются структуры указателей на функции). Данный подход предоставляет требуемый уровень абстракции над железом, однако чреват надобностью в постоянной повторной компиляции проекта с последующим программированием энергонезависимой памяти микроконтроллера бинарным файлом прошивки большого объема.

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

                      В качестве скриптового языка я выбрал Lua.
                      Читать дальше →