Pull to refresh

Кто убил сетевой коммутатор?

Level of difficultyMedium
Reading time17 min
Views9.7K

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

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

Читать далее
Total votes 8: ↑8 and ↓0+8
Comments1

Как потерять управление оболочкой… Расследование

Level of difficultyMedium
Reading time9 min
Views3.1K

image


Несколько недель назад я занимался хаком языковых серверов в Zed, пытаясь заставить Zed определять, когда заданный бинарник языкового сервера, например gopls, уже присутствует в $PATH. Если так, вместо загрузки нового бинарника Zed должен использовать его.


Трудность: часто $PATH динамически изменяется такими инструментами, как direnv, asdf, mise и другими, которые позволяют в данной папке установить определённый $PATH. Почему эти инструменты так делают? Потому что это даёт возможность, скажем, в начале $PATH добавить ./my_custom_binaries, пока вы находитесь в my-cool-project. Поэтому нельзя просто использовать $PATH, связанный с процессом Zed, нужен $PATH, как он есть, когда выполняется cd в каталог проекта.


Легко, подумал я. Просто запусти $SHELL, выполни cd в проект, чтобы запустить direnv и всё такое, запусти env, сохрани окружение, выбери $PATH, найди в нём бинарники. И это было легко. Вот часть кода, та часть, которая запускает $SHELL, cd и получает env:


fn load_shell_environment(dir: &Path) -> Result<HashMap<String, String>> {
    // Получает $SHELL
    let shell = std::env::var("SHELL")?;

    // Конструирует команду, которую хочется выполнить в $SHELL
    let command = format!("cd {:?}; /usr/bin/env -0;", dir);

    // Запускает $SHELL как интерактивную оболочку (чтобы использовались файлы пользователя rc).
    // и выполняет `command`:
    let output = std::process::Command::new(&shell)
        .args(["-i", "-c", &command])
        .output()?;

    // [... проверка кода выхода, получение stdout, превращение stdout в HashMap и т. д. ...]
}

За исключением одного: после запуска экземпляра Zed в терминале, который выполнял эту функцию, я больше не мог убить Zed, нажав Ctrl-C.

Что?
Total votes 15: ↑13 and ↓2+11
Comments8

Rust — это не «memory safe C»

Level of difficultyMedium
Reading time27 min
Views44K

TL;DR:
— в Rust намного больше достоинств, чем просто скорость и безопасность
— в Rust по умолчанию CDD (compiler-driven development, разработка через компилирование). Это как TDD, только CDD
— Rust — не сложный язык, особенно если не гнаться за максимальной производительностью

В этой статье я бы хотел рассказать:
— почему взгляд на Rust как на "memory safe C" очень сильно сужает область его возможного применения
— почему я смотрю на Rust как на очень удобный в разработке язык высокого уровня, которому просто случайно повезло оказаться невероятно быстрым
— почему разработка на Rust быстрее, чем многие думают
— почему Rust — это один из лучших языков общего назначения

Читать далее
Total votes 174: ↑169 and ↓5+164
Comments552

Кратко про Serde в Rust

Level of difficultyEasy
Reading time6 min
Views3K

Serde — это высокопроизводительная библиотека для сериализации и десериализации данных в Rust. Она поддерживает различные форматы данных, включая JSON, YAML, TOML, BSON и многие другие.

В этой статье рассмотрим основы Serde в Rust.

Читать далее
Total votes 10: ↑6.5 and ↓3.5+3
Comments4

9 полезных крейтов в Rust

Level of difficultyEasy
Reading time11 min
Views5.8K

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

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

Крейты в Rust – это пакеты, которые можно использовать для расширения функциональности проектов.

Читать далее
Total votes 21: ↑16 and ↓5+11
Comments15

Смотрим на современный инструмент для FPGA

Level of difficultyMedium
Reading time9 min
Views3K

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

Читать далее
Total votes 27: ↑27 and ↓0+27
Comments27

В общих чертах про функциональное программирование в Rust

Level of difficultyEasy
Reading time5 min
Views6.7K

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

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

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

Rust поддерживает рекурсию, хотя и без оптимизации хвостовых вызовов, что является отступлением от некоторых традиционных функциональных языков, таких как Haskell. Тем не менее, язык предоставляет мощные абстракции и паттерны, такие как владение и заимствование.

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

Кроме того, Rust имеет поддержку функций высшего порядка и замыканий.

Читать далее
Total votes 18: ↑14 and ↓4+10
Comments6

Shiva — Open Source проект на Rust для парсинга и генерации документов любого типа

Level of difficultyMedium
Reading time3 min
Views9.4K

Идея проекта возникла у меня во время работы над проектом поисковика документов. Существует такая библиотека, как Apache Tika, написанная на Java, которая умеет парсить документы различных типов. Чтобы мой поисковик работал, он должен уметь извлекать текст из документов разных типов (PDF, DOC, XLS, HTML, XML, JSON и т. д.). Сам поисковик я писал на Rust. Но, к сожалению, в мире Rust нет библиотеки, которая умела бы парсить документы всех типов.

Читать далее
Total votes 29: ↑26 and ↓3+23
Comments31

Пишу Minecraft сервера с нуля. Часть 1. Пинг

Reading time6 min
Views8.8K

Этот цикл статей о разработке серверного ПО совместимого с протоколом Minecraft: Java Edition.

В этой части я акцентирую внимание на основных вещах: типы данных, структура пакетов и как клиент получает информацию о сервере.

Читать далее
Total votes 21: ↑21 and ↓0+21
Comments15

Пишем калькулятор на Rust с GUI

Level of difficultyEasy
Reading time18 min
Views12K

Зачем еще один калькулятор? Да незачем, просто как тестовый проект для рассмотрения GUI-библиотеки.

Изначально я хотел попробовать такие крейты, как GPUI, Floem и Xilem, но первая, кажется, пока работает только под MacOS и Linux, вторая не позволяет установить иконку окну и кушает оперативы побольше Webview в Tauri, а до третьей я так и не добрался, узнав об Slint.

Об Slint есть всего несколько новостных постов на Хабре, поэтому, возможно, вам будет интересно посмотреть, что это такое.

Читать далее
Total votes 23: ↑24.5 and ↓-1.5+26
Comments84

Metatron — Open Source библиотека для генерации отчетов на языке Rust

Level of difficultyMedium
Reading time4 min
Views2.4K

Год назад возникла идея переписать весь Java-бекенд на Rust, который я уже несколько лет разрабатываю и поддерживаю. Я нашёл все аналоги библиотек и фреймворков из мира Java в экосистеме Rust:

Читать далее
Total votes 13: ↑13 and ↓0+13
Comments16

Делаем макросы в Rust

Level of difficultyEasy
Reading time6 min
Views5.1K

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

Rust имеет два основных типа макросов: декларативные и процедурные. Каждый из этих типов служит различным целям и предоставляет различные возможности манипуляции с кодом.

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

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

В этой статье мы как раз и рассмотрим то, как их пишут на Rust.

Начнем с декларативных!

Читать далее
Total votes 22: ↑16 and ↓6+10
Comments11

Используйте Arc<[T]> вместо Vec<T>

Level of difficultyMedium
Reading time13 min
Views5.7K

В этой статье я хотел бы поговорить о том, почему вы могли бы предпочесть использование Arc<[T]> вместо Vec<T> в качестве варианта по умолчанию в вашем Rust-коде.

Читать далее
Total votes 19: ↑18 and ↓1+17
Comments17

Библиотеки для реализации алгоритмов сжатия данных в Rust

Level of difficultyEasy
Reading time8 min
Views3.2K

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

Сегодня мы рассмотрим хорошие библиотеки для реализации алгоритмов сжатия данных на ЯП Rust. Сжатие данных позволяет уменьшать объемы данных без потери качества или с минимальными потерями. Различают две основные категории методов сжатия: с потерями и без потерь.

Читать далее
Total votes 12: ↑12 and ↓0+12
Comments10

Практическое руководство по Rust. Бонус

Level of difficultyMedium
Reading time34 min
Views6.8K



Hello world!


Представляю вашему вниманию бонусную часть практического руководства по Rust.



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


Руководство основано на Comprehensive Rust — руководстве по Rust от команды Android в Google и рассчитано на людей, которые уверенно владеют любым современным языком программирования. Еще раз: это руководство не рассчитано на тех, кто только начинает кодить 😉

Читать дальше →
Total votes 28: ↑28 and ↓0+28
Comments12

Практическое руководство по Rust. 4/4

Level of difficultyMedium
Reading time34 min
Views3.9K



Hello world!


Представляю вашему вниманию четвертую и последнюю часть практического руководства по Rust.



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


Руководство основано на Comprehensive Rust — руководстве по Rust от команды Android в Google и рассчитано на людей, которые уверенно владеют любым современным языком программирования. Еще раз: это руководство не рассчитано на тех, кто только начинает кодить 😉

Читать дальше →
Total votes 27: ↑26 and ↓1+25
Comments2

Функции AWS Lambda быстрее всего выполняются на Go и Rust

Reading time2 min
Views4K
Эксперт по Java и любитель AWS Александр Филичкин опубликовал интересные бенчмарки функций AWS Lambda на всех языках программирования, которые официально поддерживаются (плюс ещё два).

AWS Lambda — услуга AWS, которая обеспечивает событийно-ориентированные вычисления. Она активируется в ответ на заданное событие — и автоматически привлекает все необходимые ресурсы для обработки запроса. Другими словами, она позволяет запускать код без выделения серверов и управления ими (бессерверная модель). Вы платите только за фактическое время вычисления.

AWS Lambda официально поддерживает NodeJS, Python, Go, Ruby, .Net и Java, но косвенно поддерживаются и другие языки. Александр добавил к тестам Rust и GraalVM.
Читать дальше →
Total votes 23: ↑22 and ↓1+21
Comments2

Команда модераторов Rust уволилась в полном составе: они хотели возможность банить Core Team и требовали соблюдения CoC

Reading time2 min
Views68K


22 ноября 2021 года члены команды модераторов сообщества Rust объявили, что уходят из проекта в знак протеста в полном составе. Причина отставки Андре, Эндрю и Матье — невозможность влиять на основную команду разработчиков языка Rust и несоблюдение со стороны Rust Core Team кодекса поведения (code of conduct, CoC) разработчиков языка программирования. Ушедшая команда занималась модерацией на протяжении многих лет.
Читать дальше →
Total votes 59: ↑50 and ↓9+41
Comments254

Результаты RustCon Contest 2021 — соревнования для тех, кому интересен Rust

Reading time1 min
Views1.2K

20 ноября завершился RustCon Contest, который мы провели накануне нашей конференции для всех причастных к Rust-разработке. В рамках соревнования можно было сделать пробный заход в Rust, оценить свои хард-скиллы, и, конечно, выиграть призы. Хотим поделиться с вами результатами и интересными наблюдениями.

Всего в соревнованиях приняли участие 40 разработчиков. 

Соревнование состояло из двух частей. Первая часть — решение задач на языке Rust, их было 9 (посмотреть задачи можно тут). Больше всего участников справились с задачей “Сильный программист” (21 из 40), а меньше всего - с задачей “Пасьянс” ( всего 2 участника).  

Вторая часть — Open-source contribution contest. Задачей было внести наибольший вклад в открытые Rust-проекты. Принять участие можно было как в одной части, так и в обеих. Задачи были специально разделены: для новичков и для опытных Rust-разработчиков. Присоединиться можно было в любой момент. 

Кто оценивал задачи? 

Первая часть контеста оценивалась автоматически платформой CodeForces, вторую же часть проверяли судьи - члены программного комитета RustCon. 

Победители I части RustCon Contest 2021:

Денис Кепещук , 9 задач из 9 

Илья Шепрут, 9 задач из 9, но с большим количеством штрафов

Дмитрий Свиридкин, 7 задач и з 9. 

Победители II части RustCon Contest 2021:

Илья Соловьев, 8 704,82 баллов

Евгений Носов, 2 413,47 баллов

Михаил Грачев, 894,10 баллов

------------------

Конференция RustCon Russia пройдёт 3 декабря в Москве. Если вы дочитали до этого места - то вот вам подарок: промокод habr даёт скидку 10% на покупку билета :)

------------------

Читать далее
Total votes 5: ↑4 and ↓1+3
Comments2

Вышла версия 1.0 библиотеки для управления секс-игрушками Buttplug

Reading time1 min
Views25K

После 3,5 лет разработки компания Nonpolynomial обновила открытую библиотеку для секс-игрушек до версии 1.0. Библиотека управляет вибрацией с клавиатур, геймпадов и шлемов виртуальной реальности, а также синхронизирует импульсы с фильмами через плагины для VLC и Kodi.

Читать далее
Total votes 43: ↑43 and ↓0+43
Comments43
1
23 ...