LINUX.ORG.RU

«Ржавая» IP-камера: прошивка на Rust

 , , ,


2

9

Всем привет.

Мы в Эрливидео решили сделать эксперимент и написать прошивку камеры на Rust. В принципе проект своей прошивки у меня в полудохлом состоянии уже года три как, но его не развивали.

Тут я восхитился идеями раста и решил сделать эксперимент, написав стример на расте.

Детали есть в посте на хабре: https://habrahabr.ru/company/erlyvideo/blog/334912/ тут продублирую суть.

Вокруг сишного SDK с помощью bindgen нагенерен код на Rust, который в unsafe настраивает железо, потом получает оттуда видео кадры. Дальше начинается нормальный Rust, который полученное видео упаковывает в транспортный контейнер и рассылает клиентам через tokio.

Результаты пока радуют: ни единого сегфолта и софт не виснет на 3 подключенных клиентах.

Если интересно, могу дальше рассказывать, как у нас происходит ржавый эксперимент.

Ответ на: комментарий от anonymous

Я не сам пилю. После эрланга очень сложно, потому что после простого как топор эрланга, что угодно сложно.

Но раст выглядит именно как сложная и продуманная программа на С.

max_lapshin ★★ ()
Ответ на: комментарий от Dark_SavanT

при том что наследование реализации.

Вы что-то путаете.

QML прибит гвоздями к Qt.

HMTL прибит гвоздями к WebKit.

ЯП нужен не для разметки

Хочу раскрасить строки таблицы случайными цветами. Как язык разметки тут поможет?

RazrFalcon ★★★ ()
Ответ на: комментарий от Dark_SavanT

отказ от наследования реализации сомнительная вещь оказалась,

Вам привиделось. Наследование реализации бывает двух видов, либо когда «есть [чужой] класс, хочу такой же с перламутровыми пуговицами», либо когда строят дерево наследования, размещая нужные элементы реализации в наименьшем общем предке.

Первый вариант - это то, за что в приличном обществе бьют канделябром по голове. Если что-то такое нужно, то рекомендуют наследоваться от интерфейса, а объект старого типа прятать внутри и делегировать всё что надо руками. Такой вариант недружественен играм с instanceof и прочим dynamic_cast'ам, но ООП такие вещи противоречат и в расте оно вынесено в типы суммы и патернматчинг. Раст сделал такой вариант «наследования» через композицию единственно возможным.

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

khrundel ()
Ответ на: комментарий от khrundel

Раст всё это лечит, внутри каждой структуры только те данные, что ей надо.

Я правильно понял, что это означает «в расте единственный выход - копипастить общий код»?

hobbit ★★★★★ ()
Ответ на: комментарий от RazrFalcon

HMTL прибит гвоздями к WebKit.

Чо, правда штоле? Разве что в твоей вселенной. А в нашей HTML универсальный язык разметки, в который умеет любая кофеварка, а QML какое то проприетарное УГ для ублажения крестофанов.

bread ()
Ответ на: комментарий от hobbit

Раст всё это лечит, внутри каждой структуры только те данные, что ей надо.

Я правильно понял, что это означает «в расте единственный выход - копипастить общий код»?

Вроде бы, пока да. Но есть issue с предложением улучшить эту ситуацию, емнип (поправьте, если не прав).

Virtuos86 ★★★★★ ()
Ответ на: комментарий от Dark_SavanT

Это не плохо в том смысле, что решает проблему. Плохо тем, что заметает под ковёр факт отсутствия поддержки фундаментальной фичи в компиляторе. И такой макрос - это не часть Раста, в Rust Book о нём не напишут.

Virtuos86 ★★★★★ ()
Ответ на: комментарий от RazrFalcon

Хочу раскрасить строки таблицы случайными цветами

тут тебе только тёма поможет

если не хочешь, чтобы цвета менялись случайным образом при каждой перерисовке, привязываешь стиль к функции get_color(int row)

MyTrooName ★★★★★ ()
Последнее исправление: MyTrooName (всего исправлений: 1)
Ответ на: комментарий от ymn

Где-нибудь можно про это почитать?

К сожалению нет, так как заказчик просил не выкладывать исходники. На самом деле я приукрасил и ничего хитрого или сложного не было =). Я просто написал небольшую тулзу, которая позволяет обманывать p0f. Ящик для прикручивания nfqueue к tokio может когда-нибудь выложу отдельно, если будет время его доработать (сейчас в коде только минимальная поддержка - только то, что было нужно лично мне). То, что сейчас есть для nfqueue на crates.io - ИМХО очень криво и неюзабельно.

mironov_ivan ★★★★★ ()
Ответ на: комментарий от hobbit

Я правильно понял, что это означает «в расте единственный выход - копипастить общий код»?

Что ты имеешь в виду?

Эта модель, замещающая ООП, благородно стыбрежена из Haskell, и там как-то пишут без копипасты)

dave ★★★★★ ()
Ответ на: комментарий от anonymous

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

А должны были что ли? Зачем это делать?

С другой стороны, отдельные модули или новые проекты на «горе языках» вполне пишут.

DarkEld3r ★★★★★ ()
Ответ на: комментарий от hobbit

Я правильно понял, что это означает «в расте единственный выход - копипастить общий код»?

Если «общий код» = «общие данные в объекте» то да. Ну, разве что объединять по смыслу, например вместо полей ширина и высота запихать одно поле типа Size. Или даже WidgetCommon. Если «общий код» = «методы» , то либо реализуется как шаблон от родительского трейта, либо в отдельной приватной функцией, которая вызывается из реализаций методов. В общем примерно как в крестах, только вместо BaseClass::foo() будет smth::foo(&mut field1, &field2). В общем почти то же, только нет автоматической делегации вызовов базовому классу и придётся ссылки на поля вручную передавать.

khrundel ()
Ответ на: комментарий от bread

Где? Разве что на лоре всех фанбоев собрать. Но у них домашка, егэ, занятой народ.

отличная_шутка.jpg

Желающие вполне находятся, хотя я тоже не уверен, что если набрать толпу «хочу писать на расте» вчерашних студентов, то проект взлетит (лучше чем с аналогичным подходом на плюсах).

DarkEld3r ★★★★★ ()
Ответ на: комментарий от RazrFalcon

Взлетает идея, а не код.

Ты мысль не понял или просто придираешься? Если первое, то уточняй - я её раскрою.

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

DarkEld3r ★★★★★ ()
Ответ на: комментарий от DarkEld3r

Заменить C++ не смогла. Вытеснила его немного из прикладухи, не более того. И то, МС столько усилий вложили в раскрутку этого гогна, работа велась на уровне правительств. И все равно дотнет живет в узенькой нише. А тут нам рассказывают как хипсторская поделка завоюет мир, ага, щаз.

bread ()
Ответ на: комментарий от bread

И все равно дотнет живет в узенькой нише.

Большой вопрос какая ниша уже: плюсовая или джаво-шарповая.

А тут нам рассказывают как хипсторская поделка завоюет мир, ага, щаз.

Глупая постановка вопроса, но ты ведь всё равно (бездарно) троллишь.

DarkEld3r ★★★★★ ()
Ответ на: комментарий от DarkEld3r

Большой вопрос какая ниша уже: плюсовая или джаво-шарповая.

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

bread ()
Ответ на: комментарий от bread

А ты думал, что сисярп попадает в учебные программы вузов и в правительственные учреждения посредством святого духа?

А ты вообще похоже не думал. Зачем в вузах и правительственных учреждениях плюсы?

RedPossum ★★★★★ ()
Ответ на: комментарий от DarkEld3r

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

Пример: dropbox, у которого всё на python. Даже автор питона у них работает. Говорят, у них 0.5B пользователей. И они сейчас активно переписывают бекенд на Go и клиент на rust.

RazrFalcon ★★★ ()
Ответ на: комментарий от RazrFalcon

Практика показывает...

Практика - она разная. Повторюсь: ты мысль понял или как?

Рассуждать о важности быстрого написания прототипа не интересно, речь-то шла о том помогает ли раст «сэкономить» на менее опытной команде.

Ситуацию когда ищутся только опытные плюсовики, которые со временем «заканчиваются» я прочувствовал, как и то сколько времени и внимания требуют новички. Это не обязательно плохо, но это приходится учитывать. Вот и интересно действительно ли даёт тут раст что-то. Сам проверить пока не могу: команда у нас небольшая и опытных людей находить вполне получается, но есть определённые сомнения.

DarkEld3r ★★★★★ ()
Ответ на: комментарий от DarkEld3r

Идея - кто лучше: новички плюсовики или новички растоманы? Эта идея?

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

RazrFalcon ★★★ ()
Ответ на: комментарий от RazrFalcon

Но вот некоторые гоферы уже начинают писать слезливые посты о сложности поддержки go кода.

Шо, опять серебра в пулю не доложили? Одна надежда осталась на руст!

bread ()