Search
Write a publication
Pull to refresh
0
0
Перикл Фемиди @pfemidi

Домосед

Send message

Какие изменения нужны языку Rust, чтобы писать асинхронный код стало проще

Reading time13 min
Views14K

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

Здесь я расскажу о некоторых ранее предложенных идеях и свяжу их с новыми предложениями. Я проведу некий мысленный эксперимент и постараюсь ответить на вопрос «Что мы могли бы сделать с асинхронным программированием в Rust, если бы нам дали полный карт-бланш?». 

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

Потоки vs Асинхронность


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

Например, этот echo server написан с использованием потоков. Он работает быстрее своей асинхронной версии — для случая, когда количество одновременных подключений не превышает 100.
Читать дальше →

Наглядно о том, как работает NumPy

Reading time8 min
Views44K

Есть тексты, похожие на вино или динамит: с годами они не стареют, а напротив приобретают вес и значимость. Сегодня, к старту флагманского курса о Data Science, мы решили поделиться переводом визуального учебного руководства о NumPy 2019 года, прочитав которое даже не слишком близкий к математике человек поймёт, как работает эта библиотека Python. Если вы не хотите долго объяснять NumPy, но делать это всё равно приходится, положите статью в закладки и она сэкономит ваше время.

Читать далее

Delphi и SQLite. Альтернатива хранимым процедурам

Reading time3 min
Views12K

SQLite во многих случаях является удобным, незаменимым инструментом. Я уже не могу себе представить - как мы все жили без него. Тем не менее, есть некоторые неудобства при его использовании, связанные с тем, что это легкая встраиваемая СУБД.

Самое большое неудобство для меня, как Delphi-разработчика - отсутствие хранимых процедур. Я очень не люблю смешивать Delphi-код и SQL-скрипты. Это делает код намного менее читабильным, и затрудняет его поддержку.

Предлагаю свой вариант решения проблемы:

Выносим весь SQL-код в отдельный файл ресурсов, подключенный к проекту

Запросы в SQL-файле разделяем маркерами начала с идентификаторами и маркерами конца

Создаем класс - менеджер SQL-запросов. При загрузке приложения он читает SQL-файл из ресурсов и составляет из него список хранимых процедур.

В процессе работы приложения менеджер извлекает текст SQL-запроса по его идентификатору для последующей его передачи на выполнение

Читать далее

Частично рассекречено методическое пособие АНБ по взлому неизвестных шифров

Reading time7 min
Views23K

Скульптура Kryptos у штаб-квартиры ЦРУ

Агентство национальной безопасности США наконец-то рассекретило третью часть известного учебника «Военная криптоаналитика» (MILCRYP), написанного для обучения специалистов АНБ и военных криптоаналитиков во время Холодной войны. Последняя часть трёхтомника опубликована с некоторыми купюрами, но всё равно представляет огромную ценность, ведь у нас не так много практических пособий по взлому шифров. Речь идёт о неизвестных, сложных кодах, которые составлены по непонятным правилам. Как к ним подступиться? Как найти зацепки? Книга отвечает на эти вопросы.

Возможно, учебник АНБ поможет расшифровать тексты, которые в течение многих десятилетий и столетий не поддаются криптоанализу. И даже тысячелетий, как в случае с критской письменностью из III тысячелетия до нашей эры (минойская цивилизация).

О параметре компилятора /SAFESEH

Reading time9 min
Views3.8K

В этой истории я расскажу вам об увлекательном приключении, которое привело меня к решению одной загадки, которую я сам себе загадал. Разгадка являет собой небольшую подробность в механизме загрузчика 32-х разрядных приложений в системе Windows 7 и выше, а процесс разгадки - длинное путешествие воина, который следует по пути сердца.

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

Продолжить путешествие

Контроллер для домашней пивоварни Mega Brewery. Part I

Reading time3 min
Views74K
image Я домашний пивовар.
Начинаю «разработку» контроллера для своего минипивзавода.

Т.к. я нифига не программист, обратился к русскому Arduino сообществу.
С момента желания сделать умный термометр для пивоварения, прошло много времени и возникло новое желание — построить автоматизированную домашнюю пивоварню. Для ее автоматизации необходим блок управления. Решено было отказаться от использования покупных PID контроллеров, для управления ТЭНом, т.к. имеется Arduino, к ней SSR реле — 2шт., дисплей 4 на 20 строк и к нему Serial Board для передачи инфы по одному проводу, не считая землю и питание.
Читать дальше →

Wireshark для всех. Лайфхаки на каждый день

Reading time7 min
Views116K

Пакет с сертификатами от Хабра

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

Rust в ядре Linux

Reading time12 min
Views18K


В более ранней публикации  компания Google объявила, что в Android теперь поддерживается язык программирования Rust, применяемый в разработке этой ОС как таковой. В связи с этим авторы данной публикации также решили оценить, насколько язык Rust востребован в разработке ядра Linux. В этом посте на нескольких простых примерах рассмотрены технические аспекты этой работы.

На протяжении почти полувека C оставался основным языком для разработки ядер, так как C обеспечивает такую степень управляемости и такую предсказуемую производительность, какие и требуются в столь критичном компоненте. Плотность багов, связанных с безопасностью памяти, в ядре Linux обычно весьма низка, поскольку код очень качественный, ревью кода соответствует строгим стандартам, а также в нем тщательно реализуются предохранительные механизмы. Тем не менее, баги, связанные с безопасностью памяти, все равно регулярно возникают. В Android уязвимости ядра обычно считаются серьезным изъяном, так как иногда позволяют обходить модель безопасности в силу того, что ядро работает в привилегированном режиме.
Читать дальше →

Rust — сохраняем безразмерные типы в статической памяти

Reading time10 min
Views6.5K

Не так давно в качестве хобби решил погрузиться в изучение embedded разработки на Rust и через какое-то время мне захотелось сделать себе логгер, который бы просто писал логи через UART, но который бы при этом не знал какая конкретно реализация используется. И вот тут я быстро осознал, именно в этом конкретном случае я не могу полагаться на статический полиморфизм и мономорфизацию, ведь компилятор не знает сколько нужно памяти выделять под конкретную реализацию. Фактически это означает, что нам нужно как-то уметь сохранять типы, размер которых неизвестен на этапе компиляции, и такой способностью обладает тип Box и для решения этой проблемы как раз и возникла идея написать свой аналог типа Box, но который сохраняет обьект не в куче, а в предоставленном пользователем буфере.

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

Указатели сложны, или Что хранится в байте?

Reading time9 min
Views19K

Привет, Хабр! Представляю вашему вниманию перевод статьи "Pointers Are Complicated, or: What's in a Byte?" авторства Ralf Jung.


Этим летом я снова работаю над Rust фуллтайм, и я снова буду работать (помимо прочих вещей) над "моделью памяти" для Rust/MIR. Однако, прежде чем я заговорю о своих идеях, я наконец должен развеять миф, что "указатели просты: они являются просто числами". Обе части этого утверждения ошибочны, по крайней мере в языках с небезопасными фичами, таких как Rust или C: указатели нельзя назвать ни простыми, ни (обычными) числами.


Я бы также хотел обсудить часть модели памяти, которую необходимо затронуть, прежде чем мы можем говорить о более сложных частях: в какой форме данные хранятся в памяти? Память состоит из байтов, минимальных адресуемых единиц и наименьших элементов, к которым можно получить доступ (по крайней мере на большинстве платформ), но каковы возможные значения байта? Опять же, оказывается, что "это просто 8-битное число" не подходит в качестве ответа.

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

Статическая линковка Qt 5.x.x с MinGW32 в Windows (сборка в один exe'шник)

Reading time3 min
Views23K
Доброго времени суток, хабравчане!

Я уверен, что все заметили, когда делали деплой своей программы через windeployqt.exe, программа зависит от разных динамических и qt'шных библиотек. Вследствие чего, развертка на других компьютерах становится неудобной. Почему? Приходится держать сам exe'шник в папке с нужными библиотеками. Разумеется, можно умудриться и без статической линковки решить эту проблему. Согласитесь, неудобно, да и каждый раз нужно лишние телодвижения делать. Проще один раз запариться и потом не делать лишних движений. Еще один плюс статической линковки — размер файла. При динамической линковке сам exe'шник весит примерно от 1 МБ до 7-8 МБ, а с окружением до 70 МБ может спокойно дойти, даже если проект небольшой. При статической линковке есть только exe'шник, который весит примерно в 2 раза меньше, чем окружение при динамической линковке.
Читать дальше →

Обнаружены незадокументированные опкоды в системе инструкций процессора x86

Reading time15 min
Views10K

Венгерский инженер Кан Бёлюк (Can Bölük) из Verilave нашёл неиспользованные и не задокументированные операционные коды в системе инструкций процессора x86-64.

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

Делимся интересным материалом.

Читать далее

14 Python-пакетов, про которые вы скорее всего не знали

Reading time6 min
Views30K


Язык Python предоставляет всем пользователям возможность создавать свои пакеты и делиться ими со всем сообществом. Так появлялись очень популярные библиотеки для работы с данными (Pandas, Numpy, Matplotlib), для машинного обучения (TensorFlow, PyTorch), для веб разработки. Но есть много смешных, полезных или интересных пакетов, про которые вы вероятно никогда не слышали. Именно про них и пойдёт речь дальше.

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

Как и чем живет отдел обнаружения вредоносного ПО в Positive Technologies

Reading time4 min
Views4.3K

Привет, Хабр! Меня зовут Алексей Вишняков. Я возглавляю отдел обнаружения вредоносного программного обеспечения PT Expert Security Center. В одной из прошлых статей мы писали о том, что делают DevOps-инженеры у нас в компании, а сегодня я расскажу, чем занимается мой отдел и какие технические задачи нам приходится решать, поделюсь собственным опытом и выделю компетенции, которыми необходимо обладать, чтобы присоединиться к нашей команде.

Читать

Внутренности Linux: как /proc/self/mem пишет в недоступную для записи память

Reading time7 min
Views9.4K

Странная причудливость псевдофайла /proc/*/mem заключается в его «пробивной» семантике. Операции записи через этот файл будут успешными даже если целевая виртуальная память помечена как недоступная для записи. Это сделано намеренно, и такое поведение активно используется проектами вроде компилятора Julia JIT или отладчика rr.

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

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

Как LLVM оптимизирует суммы степеней

Reading time5 min
Views5.3K
LLVM оптимизирует суммы степеней, например:

int sum(int count)
{
  int result = 0;

  for (int j = 0; j < count; ++j)
    result += j*j;

  return result;
}

генерируя код, вычисляющий результат без цикла (godbolt):

sum(int):
        test    edi, edi
        jle     .LBB0_1
        lea     eax, [rdi - 1]
        lea     ecx, [rdi - 2]
        imul    rcx, rax
        lea     eax, [rdi - 3]
        imul    rax, rcx
        shr     rax
        imul    eax, eax, 1431655766
        add     eax, edi
        shr     rcx
        lea     ecx, [rcx + 2*rcx]
        lea     eax, [rax + rcx]
        add     eax, -1
        ret
.LBB0_1:
        xor     eax, eax
        ret

Также обрабатываются более сложные случаи (godbolt) – то есть оптимизация здесь не просто сравнивает паттерны. В этом посте мы рассмотрим, как выполняется эта оптимизация.
Читать дальше →

Введение в ELF-файлы в Linux: понимание и анализ

Reading time11 min
Views111K
Есть в мире вещи, которые мы принимаем как нечто само собой разумеющееся, хотя они являются истинными шедеврами. Одними из таких вещей являются утилиты Linux, такие, как ls и ps. Хотя они обычно воспринимаются как простые, это оказывается далеко не так, если мы заглянем внутрь. И таким же оказывается ELF, Executable and Linkable Format. Формат файлов, который используется повсеместно, но мало кто его понимает. Это краткое руководство поможет вам достичь понимания.



Прочтя это руководство, вы изучите:

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

Signal: Взлом Cellebrite с атакованного устройства

Reading time6 min
Views19K

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

В список их клиентов входят авторитарные режимы в Беларуси, России, Венесуэле и Китае; отряды смерти в Бангладеш; военные хунты в Мьянме; а также те, кто жаждет насилия и гнёта в Турции, ОАЭ и других странах.

Несколько месяцев назад они объявили, что добавили в своё программное обеспечение поддержку Signal.

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

Читать далее

Создаем процессорный модуль под Ghidra на примере байткода v8

Reading time24 min
Views3.9K

В прошлом году наша команда столкнулась с необходимостью анализа байткода V8. Тогда еще не существовало готовых инструментов, позволявших восстановить такой код и обеспечить удобную навигацию по нему. Было принято решение попробовать написать процессорный модуль под фреймворк Ghidra. Благодаря особенностям используемого языка описания инструкций на выходе мы получили не только читаемый набор инструкций, но и C-подобный декомпилятор. Эта статья — продолжение серии материалов (1, 2) о нашем плагине для Ghidra.

Между написанием процессорного модуля и статьи прошло несколько месяцев. За это время спецификация SLEIGH не изменилась, и описанный модуль работает на версиях 9.1.2–9.2.2, которые были выпущены за последние полгода.

Сейчас на ghidra.re и в приложенной к Ghidra документации есть достаточно хорошее описание возможностей языка — эти материалы стоит почитать перед написанием своих модулей. Отличными примерами могут быть уже готовые процессорные модули разработчиков фреймворка, особенно если вы знаете описываемую в них архитектуру.

В документации можно прочесть, что процессорные модули для Ghidra пишутся на языке SLEIGH, который произошел от языка SLED (Specification Language for Encoding and Decoding) и разрабатывался целенаправленно под Ghidra. Он транслирует машинный код в p-code (промежуточный язык, используемый Ghidra для построения декомпилированного кода). Как у языка, предназначенного для описания инструкций процессора, у него достаточно много ограничений, которые, однако, можно купировать за счет механизма внедрения p-code в java-коде.

Исходный код созданного процессорного модуля представлен на github. В этой статье будут рассматриваться принципы и ключевые понятия, которые использовались при разработке процессорного модуля на чистом SLEIGH на примере некоторых инструкций. Работа с пулом констант, инъекции p-code, анализатор и загрузчик будут или были рассмотрены в других статьях. Также про анализаторы и загрузчики можно почитать в книге The Ghidra Book: The Definitive Guide.

Читать далее

Information

Rating
7,463-rd
Location
Москва и Московская обл., Россия
Registered
Activity