Денис
какой тип у telemetry_values[i].value?
Golodnyi
какой тип у telemetry_values[i].value?
int вроде, сейчас нет под рукой полного кода
Денис
ну так тебе и не нужно тогда конвертить между типами
Денис
тебе нужно парсить данные в инт в соответствии с различными правилами
Golodnyi
Ну так правила определяют ифы в плюсах
Golodnyi
В идеале я бы хотел видеть там цикл и одну строку кода, который преобразует данные, в БД можно хранить любую мета информацию о правиле преобразования данных
Денис
а ты хочешь чтобы компилятор видя строку "I32" волшебным образом понимал, какие правила применять? )
Golodnyi
Не обязательно i32, может есть в расте метод toI32 и я через мета программирование вызываю этот метод над данными, че нить такое нельзя?
Денис
единственное что можно упростить, это использовать вот это — https://docs.rs/bytes/0.4.7/bytes/trait.ByteOrder.html — чтобы ручками не конвертировать
Golodnyi
Воот, мб, если дергать методы этого трейта мета программированием, то хранят имена нужных методов можно магически вжух сделать
Денис
и будет, грубо говоря, dataFlex->telemetry_values[i].value = match dataFlex->telemetry_values[i].type { "I32" => LittleEndian::read_i32(&buff), "U32" => LittleEndian::read_u32(&buff), ... };
Golodnyi
А разве нельзя LittleEndian::(readType)(buff);? Синтаксис не знаю, выше вроде проводили пример вызова метода через переменную
Денис
ну это я условно написал
Денис
но как ты хочешь сделать не получится, потому что у методов сигнатуры разные
Golodnyi
Ну там одинаковый, буфев данных на вход
Макс
Есть вопрос про Rust и Docker. Предыстория: работал с проектом на OSX, после этого попытался тот же самый проект сбилдить на Windows. Посыпались ошибки линкера (не установлен драйвер на postgresql), от них мне стало грустно. Я решил пересесть на докер, и билдить всё сразу в нём. Вроде как правильный CI, локально работать в том же самом окружении, что и в продакшне (ну, почти). Однако тут сразу вылезла проблема: при каждом запуске docker build cargo делает очень длинный и печальный Updating registry. Воспроизводимость без сайд-эффектов это, конечно, хорошо, но ждать билда так долго каждый раз - это уже не очень. Вопрос: как это можно оптимизировать? Сделать базовый докер-образ, где нужные библиотеки будут уже загружены и откомпилированы? Вообще кто-то реально использует такой паттерн (с билдами внутри докера), или я устраиваю себе ненужный лишний гемморой?
doc
Есть вопрос про Rust и Docker. Предыстория: работал с проектом на OSX, после этого попытался тот же самый проект сбилдить на Windows. Посыпались ошибки линкера (не установлен драйвер на postgresql), от них мне стало грустно. Я решил пересесть на докер, и билдить всё сразу в нём. Вроде как правильный CI, локально работать в том же самом окружении, что и в продакшне (ну, почти). Однако тут сразу вылезла проблема: при каждом запуске docker build cargo делает очень длинный и печальный Updating registry. Воспроизводимость без сайд-эффектов это, конечно, хорошо, но ждать билда так долго каждый раз - это уже не очень. Вопрос: как это можно оптимизировать? Сделать базовый докер-образ, где нужные библиотеки будут уже загружены и откомпилированы? Вообще кто-то реально использует такой паттерн (с билдами внутри докера), или я устраиваю себе ненужный лишний гемморой?
1)примонтировать папку с этим регистри 2) создать свой образ со скачанным регистри
Marat
Есть вопрос про Rust и Docker. Предыстория: работал с проектом на OSX, после этого попытался тот же самый проект сбилдить на Windows. Посыпались ошибки линкера (не установлен драйвер на postgresql), от них мне стало грустно. Я решил пересесть на докер, и билдить всё сразу в нём. Вроде как правильный CI, локально работать в том же самом окружении, что и в продакшне (ну, почти). Однако тут сразу вылезла проблема: при каждом запуске docker build cargo делает очень длинный и печальный Updating registry. Воспроизводимость без сайд-эффектов это, конечно, хорошо, но ждать билда так долго каждый раз - это уже не очень. Вопрос: как это можно оптимизировать? Сделать базовый докер-образ, где нужные библиотеки будут уже загружены и откомпилированы? Вообще кто-то реально использует такой паттерн (с билдами внутри докера), или я устраиваю себе ненужный лишний гемморой?
Сейчас скину как надо делать
Marat
Есть вопрос про Rust и Docker. Предыстория: работал с проектом на OSX, после этого попытался тот же самый проект сбилдить на Windows. Посыпались ошибки линкера (не установлен драйвер на postgresql), от них мне стало грустно. Я решил пересесть на докер, и билдить всё сразу в нём. Вроде как правильный CI, локально работать в том же самом окружении, что и в продакшне (ну, почти). Однако тут сразу вылезла проблема: при каждом запуске docker build cargo делает очень длинный и печальный Updating registry. Воспроизводимость без сайд-эффектов это, конечно, хорошо, но ждать билда так долго каждый раз - это уже не очень. Вопрос: как это можно оптимизировать? Сделать базовый докер-образ, где нужные библиотеки будут уже загружены и откомпилированы? Вообще кто-то реально использует такой паттерн (с билдами внутри докера), или я устраиваю себе ненужный лишний гемморой?
RUN USER=root cargo new project_dir COPY Cargo.toml Cargo.lock /project_dir/ WORKDIR /project_dir RUN cargo build --release COPY src ./src RUN cargo build --release
Marat
Как-то так короче
Marat
Тогда он будет перекачивать зависимости только если обновились
doc
можно cargo clean сделать в той же команде
doc
но посыл тот же - чтобы реестр уже был выкачан
Макс
RUN USER=root cargo new project_dir COPY Cargo.toml Cargo.lock /project_dir/ WORKDIR /project_dir RUN cargo build --release COPY src ./src RUN cargo build --release
Но он ведь так будет cargo тоже запускать внутри контейнера, где у него нет никакого кеша, и она тоже будет реестр качать заново каждый раз? Или я что-то не понимаю
Макс
Ладно, я кажется плохо знаю докер, буду читать документацию
doc
Каждая команда кэшируется
Так билд и клин в одной
Макс
Каждая команда кэшируется
Но только внутри контейнера, который как раз новый билдится?
Marat
Но только внутри контейнера, который как раз новый билдится?
Не совсем понимаю вопроса. У докера есть слои, каждая команда это новый слой. Слои могут переиспользоваться, пока ничего не меняется
Marat
Так билд и клин в одной
А зачем clean нужен?
Marat
Вообще я multi-stage builds делаю, чтобы бинарник в итоге в своем контейнере был
doc
Чтобы артефактов Билла не оставалось. Когда в контейнере будешь билдить, будет начисто
Marat
Чтобы артефактов Билла не оставалось. Когда в контейнере будешь билдить, будет начисто
Так я и говорю, что у меня финальный контейнер отдельный вообще
Marat
https://github.com/pepeground/tiemur_bot_rs/blob/master/Dockerfile
Marat
Вот короче если кому интересно, как по хорошему вообще делать
Marat
В итоге получаем отдельный контейнер с бинарником
պլհկ
Есть вопрос про Rust и Docker. Предыстория: работал с проектом на OSX, после этого попытался тот же самый проект сбилдить на Windows. Посыпались ошибки линкера (не установлен драйвер на postgresql), от них мне стало грустно. Я решил пересесть на докер, и билдить всё сразу в нём. Вроде как правильный CI, локально работать в том же самом окружении, что и в продакшне (ну, почти). Однако тут сразу вылезла проблема: при каждом запуске docker build cargo делает очень длинный и печальный Updating registry. Воспроизводимость без сайд-эффектов это, конечно, хорошо, но ждать билда так долго каждый раз - это уже не очень. Вопрос: как это можно оптимизировать? Сделать базовый докер-образ, где нужные библиотеки будут уже загружены и откомпилированы? Вообще кто-то реально использует такой паттерн (с билдами внутри докера), или я устраиваю себе ненужный лишний гемморой?
делать билд в докерфайле это бред делаешь билд контейнер с компилятором и основными зависимостями (типа openssl и проч) делаешь волум /root/.cargo и target после сборки бинарника собираешь новый контейнер со своим докерфайлом и бинарником в нем
Макс
ОК, понял общую суть советов, буду читать доки докера и ссылки. Спасибо
պլհկ
возьми нормальную ci
պլհկ
гитлаб или трэвис
Макс
https://github.com/pepeground/tiemur_bot_rs/blob/master/Dockerfile
кстати, а почему тут используется просто alpine, а не пре-подготовленный rust образ? https://hub.docker.com/_/rust/
Marat
кстати, а почему тут используется просто alpine, а не пре-подготовленный rust образ? https://hub.docker.com/_/rust/
Ну я alpine юзаю потому, что в итоге образ меньше выходит. Стандартный вроде ubuntu юзает
Макс
гитлаб или трэвис
Вот gitlab и хотел взять кстати. В перспективе - автоматически по git push делать докер-образы для aws beanstalk, но пока мне хотя бы чтобы оно просто сбилдилось
Alex
главное чтобы тип был один и тотже
тип элементов. Слайсы одного размера кушать и ок :)
Alex
не понятно как записать цикл
а, пардон, буду читать комменты
Dårk
как жить без mpsc select на stable?
Dårk
хочу забирать событие с одного из каналов
Dårk
а хотя не надо. обходной путь подошел. while let Ok(report) = reports.recv() { if let Err(mpsc::TryRecvError::Disconnected) = ctl_rx.try_recv() { // Game Over break; } // do something with report }
Маjко
Что от меня хочет borrowck?
Маjко
https://play.rust-lang.org/?gist=266f8da9b9ad391be7be67261745e455&version=stable&mode=debug
Filipp
хороший вопрос
Маjко
Ага. Если что, это пример написанный по куску реального кода, просто демонстрация Переписать на итераторах нельзя, надо обходить
Denys
у меня ощущение что ты наткнулся на то что матсакис описивал про текущий борровк и то для чего нужны нлл, но имхо
Filipp
https://play.rust-lang.org/?gist=129bb31af98d120feae9c6c9ec607111&version=stable&mode=debug
Filipp
вот чуть более понятная ошибка
Маjко
вот чуть более понятная ошибка
Это совсем другой кейс же
Filipp
почему?
Маjко
Потому что я не бинжу нигде иммутабельную ссылку
Filipp
так а зачем тебе мутабельная ссылка для сравнения?
Filipp
я думал можно обойти сравнивая по иммутабельной и потом вернуть мутабельную
Filipp
или вопрос был не в том как решить, а почему такое происходит?
Filipp
тогда да, проблема в том, что борроук по скоупам заимствования смотрит
Маjко
так а зачем тебе мутабельная ссылка для сравнения?
В реальном коде вообще нет сравнения, ошибка та же Там на самом деле идет сразу get_mut, сравнивается внутри этого метода и возвращается уже Option<&mut T>
Маjко
А, нет, пизжу
Маjко
С nll проблемы нет
Маjко
Теперь вопрос: как обойти на стейбле?
Denys
кстати а ты как на нлл запускаешь?
Денис
вангую, что #![feature(nll)]
Andrey
https://play.rust-lang.org/?gist=fa893d6ac7fbd549902a182d3068c455&version=stable&mode=debug
Маjко
https://play.rust-lang.org/?gist=fa893d6ac7fbd549902a182d3068c455&version=stable&mode=debug
Нет, не вариант)) Так и было, я этого пытаюсь избежать
Andrey
Ну так надо же как-то ограничить лайфтайм у value.
Денис
Нет, не вариант)) Так и было, я этого пытаюсь избежать
так можно же просто if *v.get(i).unwrap() == key
Маjко
так можно же просто if *v.get(i).unwrap() == key
Один хрен дважды делать get — не вариант
Денис
а блин