LINUX.ORG.RU
ФорумJob

Писать на Rust прошивку IP-камеры

 ,


4

11

Привет, мы в компании Эрливидео ( https://erlyvideo.ru/ ) помимо серверного софта для трансляций телевидения и массового видеонаблюдения, ещё делаем прошивку для IP-камер: https://habrahabr.ru/company/erlyvideo/blog/334912/

Делаем мы её на Rust, потому что это удобно, надежно и просто мозговзрывательно! Rust работает с железом, принимает видео, раздает клиентам, обслуживает соединения, по JSON API общается с вебмордой.

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

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

Сколько платить денег — вопрос непростой, но раз это требуется, то пусть это будет в широком окне от 100 тыс рублей в месяц до 180.

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

По прочему: мы полностью белая компания, оформление по ТК РФ, вся прочая хурма которую здесь обычно пишут. Если работать в офисе, то у нас новый клевый офис на севере Москвы возле МЦК.

Писать мне max@erlyvideo.org

★★★★★

Последнее исправление: max_lapshin (всего исправлений: 1)

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

Смотря где жить, у нас вон инженеры на производстве 40к получают. А те же инженеры в ДС/ДС2 от 100к.

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

Нет, в расте есть контроль размера массива при обращении. Это дороже чем С

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

Хотя я не спорю что такой разброс неправильный, но, но у приезжих из этих 100к 40 уходит на жильё жрачку и дорогу

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

Просто не будет сегфолта, а будет другая ошибка (или будет реаллокация памяти с 10 на 20? Когда я трогал давныыыым давно у меня валилось с ошибкой какой то) :D можно и на сях сделать пару функций и структуру Array через которые будет контролироваться длинна массива ))

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

В расте несколько разных коллекций, но обычный массив фикс размера вызовет панику при обращении за границы

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

у меня все хорошо, свою вилку в топике на 100 умножьте
а то платите своим разработчикам как уборщицам
а потом плачете что разработчиков не найти

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

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

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

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

лол

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

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

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

int main(int argc, char *argv[])
{
  char ss[11]="hello world";
  ss[20]='H';
    return 0;
}
dron@gnu:~$ gcc -pedantic -std=c11 ./r.c && ./a.out 
Ошибка сегментирования
dron@gnu:~$ 

Я в курсе что объяви как int всё отработает, поведение разное я не спорю.

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

7 лямов в месяц в россии?

какие 7, от 10 до 18 млн в месяц! товарищ настаивает! (боюсь представить, какие вещества)

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

То есть, в расте я могу так же как и в C объявить массив из десяти элементов, а потом записать в 20-й и программа скомпилируется, запустится и будет работать не валясь сразу при этой операции?

Легко

fn main() {
    let mut arr = [0; 10];
    unsafe {
        *arr.get_unchecked_mut(20) = 10;
    }
}

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

Я в курсе что объяви как int всё отработает

А ты в курсе, «hello world» - статическая строка, которая лежит в read-only сегменте? Что твой пример - либо невежество, либо мелкое мошенничество? Думаю, не знаешь.

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

это не мошенничество, это нормальный пример, о котором ты изначально не подумал, поэтому обобщил свое утверждение чуть ширее, чем следовало

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

Знаю, я и говорю про массивы в целом, да и не про си, а про раст что будет в нём при том же поведении что и тут ) Я не знаю как в расте может у него все данные в куче лежат, я не знаю этого вот и поинтересовался в постах выше какое поведение будет в расте при тех же условиях что и в Си. Чё ты вот меня пинаешь то.

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

пример, о котором ты изначально не подумал, поэтому обобщил свое утверждение чуть ширее, чем следовало

Ты говоришь так, будто увидел в моем утверждении то, чего там не было - слова «сегфолта никогда не будет». Это и в самом деле неверно.

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

Зачем, вдруг кто скажет прямо, «а ты в курсе что тут есть вот такое» и даст ссылку для просвящения.

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

я и говорю про массивы в целом, да и не про си

Да неужели?

Просто не будет сегфолта

На Си тоже не будет сегфолта.

Будет ))

И кстати... оно у тебя упало только потому, что ты попытался _писать_ за границу массива. Попробуй читать.

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

Да, всё верно, ну давай перефразирую, хотя уже и незачем так как единственно правильное сейчас касательно меня идти почитать и посмотреть самому как оно там, но я имел в виду что будет в расте в тех случаях когда есть сегфолт на Си. Не в тех случаях когда есть ошибка выхода за границы, но всё «работает»,а именно когда сегфолт. Ты же мне сказал что ничего не будет, а я уточнил про конкретный случай и всего то, ты верно подумал что я тебя передразниваю или что-то в этом роде, но поверь это не так. Я всего лишь интересовался и уточнил, а не тыкнул носом или сказал что ты не прав.

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

вдруг кто скажет прямо, «а ты в курсе что тут есть вот такое» и даст ссылку для просвящения.

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

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

на самом деле sizeof(«hello world») равно 12, а в коде sizeof(ss) действительно равно 11

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

давай конфу. у меня на gcc 6.3.1 и 4.8.5 сегфолтов нет

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

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

:D Но да, если перечитать моё сообщение можно подумать что я эдакая губка которая впитает всё что скажу просвящённые, но нет я просто стараюсь быть вежливым )

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

там же не char *, а нормальный такой массив на стеке. Откуда там вообще сегфолт у товарища - не пойму

Deleted
()
Ответ на: комментарий от Deleted
dron@gnu:~$ uname -a
Linux gnu 4.9.0-4-amd64 #1 SMP Debian 4.9.65-3 (2017-12-03) x86_64 GNU/Linux
dron@gnu:~$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/6/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Debian 6.3.0-18' --with-bugurl=file:///usr/share/doc/gcc-6/README.Bugs --enable-languages=c,ada,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-6 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --enable-default-pie --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-6-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-6-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-6-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --with-target-system-zlib --enable-objc-gc=auto --enable-multiarch --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 6.3.0 20170516 (Debian 6.3.0-18) 
dron@gnu:~$ gcc r.c 
dron@gnu:~$ cat r.c 
#include <stdio.h>
int main(int argc, char *argv[])
{
  char ss[11];
  ss[20]='H';

    return 0;
}
dron@gnu:~$ ./a.out 
Ошибка сегментирования
dron@gnu:~$ 

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

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

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

в смысле, проверка валидности utf8? ее я не считаю навязанной. В отличие от array bounds, она в 99% случаев необходима, т.к. чаще всего происходит при i/o. если проверка не нужна, можно гонять байтики.

MyTrooName ★★★★★
()
Ответ на: комментарий от Deleted
[user@usernb lol]$ uname -a
Linux usernb 3.10.0-693.5.2.el7.x86_64 #1 SMP Fri Oct 20 20:32:50 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
[user@usernb lol]$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/opt/rh/devtoolset-6/root/usr/libexec/gcc/x86_64-redhat-linux/6.3.1/lto-wrapper
Target: x86_64-redhat-linux
Configured with: ../configure --enable-bootstrap --enable-languages=c,c++,fortran,lto --prefix=/opt/rh/devtoolset-6/root/usr --mandir=/opt/rh/devtoolset-6/root/usr/share/man --infodir=/opt/rh/devtoolset-6/root/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-shared --enable-threads=posix --enable-checking=release --enable-multilib --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --enable-plugin --with-linker-hash-style=gnu --enable-initfini-array --disable-libgcj --with-default-libstdcxx-abi=gcc4-compatible --with-isl=/builddir/build/BUILD/gcc-6.3.1-20170216/obj-x86_64-redhat-linux/isl-install --enable-libmpx --enable-gnu-indirect-function --with-tune=generic --with-arch_32=i686 --build=x86_64-redhat-linux
Thread model: posix
gcc version 6.3.1 20170216 (Red Hat 6.3.1-3) (GCC) 
[user@usernb lol]$ cat r.c 
#include <stdio.h>
int main(int argc, char *argv[])
{
  char ss[11];
  ss[20]='H';

    return 0;
}
[user@usernb lol]$ gcc r.c 
[user@usernb lol]$ ./a.out 
[user@usernb lol]$ 
Deleted
()
Ответ на: комментарий от Deleted

давай сравнивать асм

00000000004004d6 <main>:
  4004d6:	55                   	push   %rbp
  4004d7:	48 89 e5             	mov    %rsp,%rbp
  4004da:	89 7d ec             	mov    %edi,-0x14(%rbp)
  4004dd:	48 89 75 e0          	mov    %rsi,-0x20(%rbp)
  4004e1:	c6 45 04 48          	movb   $0x48,0x4(%rbp)
  4004e5:	b8 00 00 00 00       	mov    $0x0,%eax
  4004ea:	5d                   	pop    %rbp
  4004eb:	c3                   	retq   
  4004ec:	0f 1f 40 00          	nopl   0x0(%rax)

делай так, objdump -S --disassemble a.out > r.dump Копипасть оттуда только <main> без лишнего

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

Если ошибка в unsafe коде, то будет то же что и в C, или сегфолт или молча попортит память.

Если ошибка в безопасном коде, то будет или ошибка компиляции, или проверка в рантайме которая вызовет панику.

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

Ну да, то, что там по возврату происходит, не так интересно. Если добавить sleep(3) перед return, то ясно будет видно, что ss[123]='H' не дает сегфолта. Об этом и речь.

Онанизм какой-то

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

Ну да ). Я хотел более явно выделить память и сместить указатель за границу, но решил это, а вообще надо было const char написать ))

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

Это уже UB самое настоящее

Именно! :D

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.