Как стать автором
Обновить
0
0

web-dev

Отправить сообщение

Решение Advent of Code на этапе компиляции с использованием макросов Rust

Уровень сложностиПростой
Время на прочтение16 мин
Количество просмотров419

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

В этом году я хотел написать идеальную программу для решения челленджа Advent of Code. Если идеальная программа и может существовать, она должна быть написана на Rust. Давайте помучаем декларативные макросы Rust для получения ответа на задачу первого дня Advent of Code в виде ошибки компиляции.

Читать далее

Как наш мозг мешает нам изучать языки и как убрать эти преграды

Уровень сложностиПростой
Время на прочтение6 мин
Количество просмотров1.9K

Я учился в Гарварде работе мозга, и мы изучали две его части:

1. Префронтальная кора — то, что мы обычно называем мозгом и интеллектом.
2. Амигдала — это его эмоциональная часть, которая не контролируется нами в основном.

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

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

И здесь я расскажу, как именно мешает и как от этого избавиться.

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

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

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

Читать далее

Rust без прикрас: где мы продолжаем ошибаться

Уровень сложностиПростой
Время на прочтение8 мин
Количество просмотров6.8K

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

В предыдущей статье мы разобрали, как не ломать себе карьеру, бездумно используя unwrap() или игнорируя ошибки через let _ =. Но давайте честно: это были цветочки. Настоящие проблемы начинаются там, где ваш код работает «почти идеально», а потом, под грохот продакшена, вы осознаете, что все было далеко не так гладко.

Сегодня вторая часть. Разберем несколько ошибок, которые выглядят безобидно, но тащат за собой баги, утечки памяти и необъяснимые фризы.

Начнем с первой проблемы при работе с .iter() и .iter_mut.

Читать далее

Допустим, вы решили изучить Rust

Уровень сложностиСредний
Время на прочтение8 мин
Количество просмотров18K

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

Посмотрим...

Анализируем простейший усилитель

Уровень сложностиСредний
Время на прочтение26 мин
Количество просмотров27K
В настоящей статье я хочу рассмотреть и проанализировать широко известную и подкупающую своей простотой минимальную схему усилителя на одном биполярном транзисторе:


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

Rust без прикрас: где мы ошибаемся

Уровень сложностиПростой
Время на прочтение6 мин
Количество просмотров15K

Привет, исследователи Rust! Сегодня хочу поделиться своим опытом (не всегда радужным) работы с Rust. Да, язык классный, безопасный, быстрый — все мы это знаем. Но, как и в любом инструменте, здесь есть свои подводные камни, на которые я благополучно наступал.

Читать далее

Небезопасный Rust сложнее C

Уровень сложностиСредний
Время на прочтение19 мин
Количество просмотров22K

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

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

Создание RESTful API с помощью Django и Django REST Framework

Уровень сложностиСложный
Время на прочтение12 мин
Количество просмотров2.4K

В современном мире веб-разработки API (Application Programming Interface) обеспечивает взаимодействия между различными приложениями и сервисами.
REST API, стали стандартом для создания веб-сервисов благодаря их простоте и гибкости.

Наша сегодняшняя цель - подробно разобраться в процессе создания REST API с использованием Django и Django REST Framework, разбираясь в каждом шаге и его значение. Мы также рассмотрим, почему создание API важно и как это может быть полезно в ваших будущих проектах.

Читать далее

Rust custom Triplet

Уровень сложностиСредний
Время на прочтение9 мин
Количество просмотров1.1K

Целевые триплеты описывают платформу, на которой выполняется код, и являются основной концепцией системы сборки GNU. Обычно триплет содержит три поля: название семейства/модели CPU, поставщика и имя операционной системы. Кроме того, триплет может иметь дополнительное поле, отражающее Application Binary Interface (ABI), например: gnu, gnueabihf, gnu_ilp32.

Читать далее

Rust: безопасность памяти без потерь в скорости

Время на прочтение8 мин
Количество просмотров1.4K

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

Читать далее

Разбираем выравнивание данных и структуру памяти в Rust

Уровень сложностиПростой
Время на прочтение8 мин
Количество просмотров1.8K

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

В процессе моей работы я много раз оптимизировал использование памяти датафреймов Python. Не учитывая различные особенности, зачастую наиболее быстрым решением является понижающее приведение — к примеру, конвертация столбца нулей и единиц из int в bool. И хотя это срабатывает, недавно к своему удивлению я узнал, что булевы числа не всегда отображаются в качестве одиночных битов. Так как же отображаются типы данных в памяти?

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

Читать далее

CBLT — безопасный, быстрый и минималистичный веб-сервер на языке программирования Rust

Уровень сложностиСредний
Время на прочтение5 мин
Количество просмотров7K

Для изучения нового языка программирования я использую следующий подход. Сначала я читаю учебник по этому языку программирования, в котором объясняются синтаксис, идиомы, философия и принципы работы языка. После этого я пишу небольшой пет-проект на этом языке программирования. На пет-проекте я немного практикуюсь с новым языком, с его стандартными библиотеками и популярными фреймворками.

Чтобы погрузиться сильнее в язык, вместо пет-проекта я начинаю писать свои библиотеки для работы с базами данных (ORM), JSON, акторами, MVC веб-фреймворком, логированием и т.д. Библиотеки, которые вряд ли будут кому-то нужны, но они помогут мне лучше понять язык программирования. На удивление, с языком Rust я добрался до написания своего веб-сервера. Раньше такого не было. Думаю, это из-за того, что Rust — это язык системного программирования и грех на нём не попробовать заняться оптимизацией перформанса.

В итоге я столкнулся с тем, что Rust не имеет аналогов Nginx, Lighttpd, Caddy, HAProxy, Apache, Tomcat, Jetty и т.д. Все эти веб-сервера написаны на C, Go, Java и т.д. Имеются только веб-фреймворки: Actix, Axum, Rocket, Hyper и т.д.

В целом я прикинул, что обычно я использую Nginx для следующих целей:

1. TLS для доменов

2. Проксирование запросов на бэкэнд

3. Раздача статических файлов

В итоге решил написать свою реализацию веб-сервера на Rust.

Читать далее

Асинхронный Rust в трех частях. Часть первая: Futures

Время на прочтение14 мин
Количество просмотров4.5K

В введении мы посмотрели на пример асинхронного Rust без какого‑либо объяснения, как он работает. Это дало нам несколько вопросов для размышления: Что такое асинхронные функции и возвращаемые ими «future»? Что делает join_all? Чем отличается tokio::time::sleep от std::thread::sleep?

Чтобы ответить на эти вопросы нам потребуется преобразовать каждую из частей в обычный не асинхронный код Rust. Вскоре мы обнаружим, что воспроизвести foo и join_all достаточно просто, а вот со sleep ситуация чуть сложнее. Начнем же.

Читать далее

Асинхронный Rust в трех частях. Часть вторая: Tasks

Уровень сложностиПростой
Время на прочтение12 мин
Количество просмотров2.2K

Во введении мы сказали, что async/await это про futures и задачи. В первой части мы рассмотрели futures и теперь пришло время задач. Благо, мы с ними уже встречались, хоть мы их так и не называли.

Читать далее

Использование Rust в серверах, написанных на других языках, для повышения производительности

Уровень сложностиПростой
Время на прочтение13 мин
Количество просмотров3.6K

В этой статье мы рассмотрим несколько стратегий по постепенному добавлению Rust в сервер, написанный на другом языке, например JavaScript, Python, Java, Go, PHP, Ruby и т. д. Один из возможных кейсов для подобного добавления — вы профилировали сервер, нашли «горячую» функцию, не соответствующую требованиям производительности из‑за боттлнека по CPU, а обычные техники мемоизации или оптимизации алгоритма были бы невозможны или малоэффективны по той или иной причине. После чего вы пришли к выводу, что стоит посмотреть в сторону реализации данной функции на что‑то написанное на более производительном языке, например на Rust. Отлично, данная статья для вас.

Читать далее

Ускоряем браузерные вычисления на коленке с помощью WebAssembly на примере генерации шума

Уровень сложностиСредний
Время на прочтение7 мин
Количество просмотров3.2K

Так ли производителен WebAssembly в сравнении с JavaScript как о нем говорят? Какие подводные камни могут ожидать при попытке ускорить CPU-bound задачи и в каких ситуациях он must have? Автор предлагает рассмотреть один кейс и разобраться в этих вопросах на практике

Приступим

Асинхронный Rust в трех частях. Часть третья: IO

Время на прочтение11 мин
Количество просмотров2.6K

Конечно, async/await были придуманы не для сна. Нашей целью с самого начала был ввод‑вывод (I/O), а в особенности сетевой ввод‑вывод. Вооружившись futures и задачами, теперь мы можем перейти к реальным примерам.

Читать далее

Формы глаголов в английском языке

Время на прочтение2 мин
Количество просмотров13K

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

Каждое из 16 времен (каждое время – в двух вариантах: действительный и страдательный залог) может быть охарактеризовано наличием или отсутствием каждого из следующих 5 признаков.

Читать далее

Попробуйте Tauri

Уровень сложностиСредний
Время на прочтение6 мин
Количество просмотров9.4K

Хочу рассказать про один из моих любимых Opensource проектов: Tauri. Это среда для создания десктопно-мобильных приложений на JavaScript, но быстрых и легковесных. С опциональными дополнениями на Rust, а через него и на всех других языках.

Читать далее

Как написать D-Bus сервис, работающий на системной шине, на Rust

Уровень сложностиСредний
Время на прочтение8 мин
Количество просмотров4.5K

Привет, Хабр! На связи Федотов Максим, ведущий разработчик в "Открытой Мобильной Платформе". В этой статье я хочу поделится нашим опытом создания D-Bus-сервиса на Rust, который работает на системной шине.

Если Вы только недавно начали изучать темы ОС GNU/Linux, Rust и D-Bus, но при этом Вам уже стало тесно в рамках простых базовых примеров и хочется зайти немного поглубже, то эта статья для Вас.

Читать далее
1
23 ...

Информация

В рейтинге
Не участвует
Откуда
Донецкая обл., Украина
Зарегистрирован
Активность