Pull to refresh
4
0

Backend

Send message

Вот именно что "делающая вид", тут полностью согласен. Это разочаровывает больше всего ((

Никакой разработки на чистом JS, в современном мире вестись не должно.

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

классная типизация, которая обеспечивает null-safety

Но это же не так. Возьмите элемент из массива по индексу, например. Он при компиляции не будет T | undefined, хотя на рантайме будет именно так.

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

Ошибки и некоторые события тоже не типизируются.

оно не даст скомпилироваться, если был нарушен порядок доступа, поэтому оно работает в comptime, а не runtime.

RefCell работает исключительно в рантайме, например: https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=bbd501e232c54860aeeb5735ba2d299f

fn main() {
    let c = RefCell::new(String::from("test"));

    // Меняем значение по немутабельной ссылке
    change(&c);
    println!("{c:?}");

    // Борровинг немутабельной ссылки на рантайме
    let borrowed = c.borrow();
    println!("borrowed: {borrowed}");

    // Борровинг мутабельной ссылки на рантайме
    // ошибки компиляции не будет, но мы тут словим
    // панику при запуске, потому что переменная borrowed
    // еще не дропнулась
    let mut mut_borrowed = c.borrow_mut();
    mut_borrowed.push_str("-test");
}

fn change(c: &RefCell<String>) {
    let mut s = c.borrow_mut();
    s.push_str("-test");
}

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

Именно поэтому я говорю про "эксклюзивность" вместо "мутабельности", RefCell ломает концепцию мутабельности, позволяя менять данные. Безопасность памяти при этом обеспечивается тем, что RefCell проверяет правила борровинга на рантайме. Не выдаст мутабельную ссылку, если в данный момент существуют какие-то другие ссылки. Поддерживая при этом концепцию о том, что если мы имеем мутабельную ссылку, то в данный момент времени только мы работаем с этим местом в памяти.

Mut же объявляет изменяемость либо переменной, либо данных, на которые она указывает. Так, например, в аргумент функции приходится писать (mut arg: &mut <_>) - одно отвечает за изменяемость переменной. другое - за изменяемость данных по указателю.

Если мы следуем вашей фразе про объявление "изменяемости", то почему у меня в примере получилось изменить данные по ссылке, которую я не объявлял как &mut?

Да ну?

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

В вашем примере мы отдали выполнение в функцию borrow_immutable, пока она выполняется, в main ничего не происходит, ссылка находится внутри borrow_immutable. И так далее с остальными функциями.

Пардон, я почему-то прочитал Arc/Rc, а в голове держал при этом Mutex/RefCell.

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

Например, мы расшарили через Arc/Rc доступ к одному объекту. Он при этом не сможет быть mut, компилятор не позволит. Потому что нет эксклюзивности доступа.

Потом мы взяли и положили внутрь Arc/Rc какой-то из мьютексов. У нас пока нет ссылки на сам объект, только на мьютекс.

Но как только мы сделали lock() на мьютексе, мы получили в ответ уже mut-ссылку, потому что нам на рантайме гарантируется, что пока мьютекс залочен, существует только одна ссылка на этот объект, поэтому она и может быть mut. Как только она дропнется – кто-то другой сможет получить уже свою уникальную ссылку.

Примерно так же с RefCell, у нас нет ссылки на объект, только на сам RefCell. Когда мы вызываем borrow_mut(), на рантайме проверяется, есть ли сейчас другие ссылки, которые еще не дропнуты. Если они есть – мы не получим mut-ссылку. А если нет, то мы ее получим и пока не дропнем – никому другому RefCell не даст получить еще одну.

Поэтому я написал, что фраза про эксклюзивность у автора статьи вполне верна. Без unsafe мы не сможем получить ссылку на объект, если у кого-то уже есть &mut на него.

Под "уникальностью владения" я имел ввиду уникальность обладания &mut на объект, а не обладания самим объектом, криво выразился немного.

Arc/Rc, например, позволяет шарить доступ, давай неуникальное владение объектом

Они как раз обеспечивают уникальность владения. Просто делают это на рантайме, а не при компиляции. Так же как и RefCell.

Если развернуто сказать, то &mut дает гарантию того, что в один момент времени ссылка на это место в памяти есть только в этом месте кода.

Разработчики назвали это mut, чтобы порог входа был ниже. Но на самом деле мутабельность – это просто следствие того, что ссылка только одна. Почитайте про interior mutability, там разъяснено подробнее. https://doc.rust-lang.org/book/ch15-05-interior-mutability.html

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

Спасибо за статью. У вас осталось за кадром то, как при генерации результат прогона промпта через CLIP гайдит детектор шума в сторону нужного промпта. Не знаете, где можно найти хорошие материалы на эту тему?

Даже удивительно, насколько он круче Google Sheets

Мне кажется, это не совсем верное заявление. Они как раз примерно равны, как и говорят многие обзорщики. Пробежался по перечисленным в этой статье фичам, они все есть в Google Sheets

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

Тоже хотел написать, что это очень вредная команда. Лучше использовать команду apg, она все-таки делалась специально для генерации паролей.

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

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

Жаль, что не раскрыта тема русской раскладки для такой клавиатуры. На своем ErgodoxEZ долго пытался расставить клавиши так, чтобы без костылей и удобно было, но не получилось в итоге (( Причем, если бы операционные системы нормально умели в юникод-клавиатуры, проблем было бы сильно меньше.

Если у кого-нибудь есть удачный опыт, поделитесь, пожалуйста.

Разве для Раста нет кодогенератора грамматического парсера на основе какого-нибудь из языков описания грамматик? Было бы гораздо легче декларативно её описать.

Все, я теперь понял. Сначала подумал, что эти роботы разрабатывает сам ГПБ, ибо в статье не написано, что такое UiPath. Теперь ясно, что это платформа от другой компании, которая лицензируется по инстансам, а банк под неё пишет скрипты, все логично.

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

Вы сейчас одним махом назвали все свободное ПО некачественной подделкой? Смелое заявление.

Я бы назвал некачественными вещами приведенные вами в пример MS Windows и MS Office, но ни почему-то лицензируются.

Зачем для каждого робота лицензия? Что там такое используется, что требует лицензирования?

Координаты это как раз случай, когда лучше применить int с фиксированной точкой. Ибо 4 знака после запятой это уже точность около 8м в худшем случае, 5 знаков это уже 80см. Если нужна большая точность, просто добавляем еще знак. То есть, по сути, это достаточно будет хранить целое число от -180000000 до 180000000 для точности 6 знаков (8см разрешение), для этого хватит int32.

Если сделать int64, точность вообще будет даже слишком большая.

Linedock же, хорошо гуглится.
Привет, Женя, спасибо!
На нашлось, я сейчас довольно далеко от картографии на основной работе.
1
23 ...

Information

Rating
Does not participate
Registered
Activity