← All posts tagged rust

ermine

Что у нас там дальше по плану? SASL? А что у нас уже есть? Тоже наверное придется писать с нуля, реализуя не менее пяти-десятка механизмов шифрами. Ну-ко, пора сходить в магаз за спикером.

ermine

Я не забила на аптерыкса, я наконец дописала PRECIS и JID. До сих пор непонятно, как программировать на Rust, точнее, как экономить на копировании значений — чуть что, так компилятор сразу орет cannot move/borrow и так далее. Ну, если Rust соглашается везде с тем, чтобы я явно копировала эти гребенные значения, значит, я всё правильно делаю!

ermine

А почему на расте нет реализации PRECIS (RFCs 7613)? Как же без готовой реализации этой делать жиды (jids)? На js вон в npm болтается какая-то готовая библиотека даже, А КАК ПЕРЕГНАТЬ js в rust?

ermine

Как в этом долбанутом на всю больную голову безопасности этом вашем ресте понять, почему прога падает? Бэктрейсов на три экрана, но там ни одной ссылки на мой код! Этот ваш unwrap() из Options. Очень безопасно. А вот если говядина падает с паникой — по бэктрейсу все видно, где чинить надо. А тут — фиг. Зато безопасно.

ermine

Как-то дописала парсер земля для аптерыкса. Работает как-то. Даже компилируя. Теперь дописать генератор хмпп. Много узнала, как пишется код, и, видимо, еще много узнаю. Это интереснее, чем всякие джавы, джаваскрипты, тайпскрипты, даже камло (вчера пришлось почитать свой старый код на камне, чуток прослезилась от ностальгии — монады, iteratee чудные на камле!). Так-то. Кстати, зачем мне понадобился код на камле. Там у меня реализован алгоритм енкогдинга utf8. Во всем русте я не нашла, как без напряга читать данные из сокета и постепеннее конвертить в утфы, так, чтобы не потерять хвосты (а их образуется аж две штуки: первый хвост — когда считал из интернета неполный утф8 символ, и второй хвост, когда недопарсив строчку, возвращаешь токен). Есть чем гордиться как домохозяйка-рустистка.

ermine

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

ermine

Пока жуйк в моем макбуке и моем айфоне глючат, написала уже первую тысячу строк кода, на которые компилятор не плюется. Теперь надо культово так писать тесты. Интересно, в vs Code есть для руста такая же крутая штука как для jest? Чтобы подмигивало лампочками и указывало ту строчку, где тест сбоит.

ermine

Расскажите, пожалуйста, как писать кодогенератор на Rust! Шоб по [#derive(XMPPCodec)] генерал мне код имплементации структуры.

@vt отвернись, ты не посоветуешь годного соложена, иди допиши сначала гейжуйк

ermine

Я теперь почти специалист по Rust — почти две недели боролась с Borrow check компилятора и наконец код аптерыкса начал компиляться. Из-за заморочек с борровсами, оказывается, надо писать много лишнего кода — просто так писать код как на сишечке или яваскрипте — низзя, ближе будет ырланковский код или на камне, причем борровчекер особо зверствует в match, не дает сразу маячить и делать изменения в одном и том же self. Не знаю, насколько это удобно, но наверняка всю ответственность за правильность кода можно спихнуть на Rust — я всегда любила парадигму "если код скомпилился — значит будет работать!"
@vt ты уже прочитал книжку по Rust?

ermine

Три дня пыталась скопились свой парсер иксемеля, борясь в основном с ошибкой cannot move out of borrowed content, потом сдалась и набрала сильно упрощенный пример и почти сразу удалось привести его в компилабельный вид. Вот, привожу этот пример с кучей ошибок:

enum S {
A,
B(String),
C(String)
}

struct X {
state: S
}

impl X {
fn parse(&mut self, s: String) {
for ch in s.chars() {
match &self.state {
S::A => {
let mut s = String::new();
self.state = S::B(s)
}

S::C(ref mut z) => {
z.push(ch);
self.state = S::C(*z);
}

S::B(ref mut word) => {
word.push(ch);
continue;
}
}
}
}
}

fn main() {
let mut x = X { state: S::A };
x.parse("abyr".to_string());
}

Ты читал книжку по Rust? Теперь скопили!

ermine

Второй день жру кактус с лайфтаймами раста. Проблемы с ними возникли когда засунула в hashmap в качестве ключа и значения тип &str и потом долго блудила с буковками типа 'a, 'b по коду, пока случайно в гугле не обнаружила хитрое замечание о том, что в некоторых коллекциях раста идиоматично будет использовать тип String. Это помогло. Ну и чудеса! Ведь лайфтаймы — это такая штука, на которых, как говорят, многие мужики сливают из раста. :)

ermine

Как правильно и православно делать кодек utf8 для Tokio, чтобы само автоматически из чанков делало utf8 строки или позволяло итератить массив байтов по utf8 символам? Готового кода не вижу!

ermine

Как в этом хитром расте импортную модуль в другой модуль? Скажем, структура src такова:
a.rs
b.rs
c.rs
lib.rs
Я хочу импортную a.rs во все остальные модули, в этом модуле, скажем, у меня enum, который везде нужен. Компилятор настаивает, чтобы этот модуль был в b/a.rs для b.rs и так для c.rs.

ermine

Посмотрела по диагонали три хмл парсера — xmlparser, quick_xml и xml5ever. Последний непонятно как парить, весь в макросах сидит. Проще читать код Quick_xml. А xmlparser видимо Фреймворк для строительства DOM, что не годится для меня. Но я хотела не об этом написать. Все эти партеры используют обычный fsф с енумерабельным State, хотя я почти два месяца читала о том, как это круто строить fsф на основе zero-cost abstraction, пишешь билдер, который рожает первую структуру начального состояния, в ней имплементишь функцию, которая рожает структуру следующего состояния и так далее. Ну что, завтра попробую пойти этим путем и создам три десятка структур-состояний партера иксемеля, вместо enum. Так. Небось никто не понял, о чем я. Ну, так вам и надо!

ermine

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

ermine

Так, ща буду делать третий кормить в своем сервере — выделить вчера написанный код в main() в отдельный модуль. И сразу возник вопрос — а как на расте делается кластер? А еще я подумала (после советов крутого спеца @oxpa), что буду делать сервер по отдельным частям: c2s как прокси к бэкенду, чтобы пользователь не заметил, что бэкенд упал/обновился/перезагрузился. Трафик, разумеется, будет ходить через лекалхост по тцп (а разве можно иначе в 21 веке?). В Бэкенде (в 21 веке же!) обязательно нужен кластер! И неужели нет ничего круче, чем постгрес, для бэкенда?