LINUX.ORG.RU

Сообщения KivApple

 

Тип-обёртка для ошибок в Rust

Форум — Development

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

use derive_more::Display;
use thiserror::Error;

#[derive(Error, Debug, Display)]
pub struct MyError(#[source] Box<dyn std::error::Error>);

impl<T: std::error::Error> From<T> for MyError {
	fn from(value: T) -> Self {
		Self(Box::new(value))
	}
}

Получаю ошибку компиляции:

error[E0119]: conflicting implementations of trait `From<MyError>` for type `MyError`
 --> src\mod.rs:9:1
  |
9 | impl<T: std::error::Error> From<T> for MyError {
  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  |
  = note: conflicting implementation in crate `core`:
          - impl<T> From<T> for T;

Как я понимаю, проблема в том, что MyError сам по себе реализует трейт Error и получается что-то вроде рекурсии.

Что с этим делать?

 

KivApple
()

Нарисовать граф

Форум — Development

Требуется нарисовать граф (набор кружочков с подписями и связи между ними). При этом требуется, чтобы связи были более кастомизируемы, чем простой выбор стиля штриховки и направления стрелочки. Например, чтобы можно было задавать цвет и толщину обоих концов связи между кружочками и связь рисовалась плавным переходом от одного цвета и толщины к другому. Кружочки тоже неплохо кастомизировать. Например, чтобы помимо подписей в некоторые кружочки можно было вставить картинки.

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

Есть ли какие-то готовые библиотеки с таким функционалом? Graphwiz, как я понимаю, не умеет в тонкую кастомизацию внешнего вида связей.

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

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

 , ,

KivApple
()

Смешивание порошков

Форум — Science & Engineering

Допустим, есть два порошка двух разных веществ. Назовём их порошок А и порошок Б.

Требуется их смешать таким образом, чтобы в 10мл смеси было 1.5 г порошка А (а остальную массу составлял порошок Б).

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

Как я понимаю, главная засада в том, что смесь двух веществ будет иметь другую плотность нежели каждое вещество по отдельности (и при этом не как среднее плотностей ингридиентов с учётом пропорции смешивания). Так что, условно, 10 мл порошка А + 10 мл порошка Б дадут в сумме объём меньше 20 мл, поэтому нельзя решить задачу в лоб (вычислить плотности двух чистых веществ и найти пропорцию смешивания).

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

 ,

KivApple
()

Запихнуть Axum Multipart в S3

Форум — Development

Пишу бекэнд на расте и Axum. Делаю загрузку файла multipart/form-data.

Грузить файл предполагается как-то так:

// Обработчик запроса принимает параметр mut multipart: Multipart
while let Some(mut field) = multipart.next_field().await? {
    if let Some("file") = field.name() { // Ищем нужное имя поля
        while let Some(chunk) = field.chunk().await? {
            // Делаем что-то с очередным куском файла (Bytes)
        }
        // Файл закончился
    }
}

Как я понял по документации, это единственный асинхронный способ. У Field есть ещё методы bytes() и text(), но они грузят содержимое файла полностью в ОЗУ и возвращают целиком Bytes или String.

А библиотека rust-s3 имеет вот такой метод у Bucket:

pub async fn put_object_stream<R: AsyncRead + Unpin>(
    &self,
    reader: &mut R,
    s3_path: impl AsRef<str>,
) -> Result<u16, S3Error>

То есть мне надо как-то превратить field в AsyncRead. При этом я категорически не хочу грузить файл целиком в ОЗУ или сохранять во временный каталог на диск. Хочу напрямую от клиента в S3 пересылать файл (но при этом S3 хранилище напрямую клиенту недоступно, потому что там ещё определённая бизнес-логика навёрнута на загрузке файлов, плюс контроль доступа).

 axum, ,

KivApple
()

Аналог beforeunload для History API

Форум — Web-development

JS позволяет потребовать у юзера подтверждение при закрытии страницы. Например, если на веб-странице содержится какой-нибудь редактор или важная форма и разработчик хочет напомнить юзеру сохранить несохранённое перед выходом. Для этого есть специальное событие beforeunload, в котором можно установить returnValue = true, если мы знаем, что не все данные сохранены.

Однако, beforeunload не работает при навигации с использованием History API. Это не беда для навигации с помощью pushState/replaceState, потому что мы сами вызываем эти функции и можем спросить подтверждение и в случае отказа просто не вызывать эти функции.

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

Есть ли возможность реализовать аналог beforeunload для этой ситуации? Спросить у юзера подтверждение навигации с возможностью отмены, потому что у него есть несохранённые данные.

 ,

KivApple
()

HTML: Две кнопки

Форум — Web-development

Есть две кнопки. В одной одинокий эмоджи, в другой обычный текст:

<div style="position: fixed; right: 0; top: 0">
    <button class="top-button">
        🌎
    </button>
    <button class="top-button">
        Text
    </button> 
</div>

Они отформатированны с помощью CSS:

.top-button {
    display: inline-block;
    cursor: pointer;
    padding: 0.25rem;
    min-width: 2rem;
    min-height: 2rem;
    background-color: rgba(180, 180, 180, 50%);
    border: none;
    box-shadow: 2px 2px 2px darkgray;
    border-radius: 5px;
    margin: 0.1rem;
}

Живой пример: https://playcode.io/1629892

Скриншот: https://i.stack.imgur.com/hCmfL.png

Возникает две проблемы:

1) Кнопка без эмоджи в моём браузере отображается на пару пикселей НИЖЕ, чем кнопка с эмоджи. Очевидно, я хочу, чтобы кнопки были выровнены по горизонтали.

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

 , ,

KivApple
()

ИИ для оценки качества квартиры

Форум — Development

Хочу рассчитать насколько дорожает квартира с ремонтом по сравнению с убитой квартирой при прочих равных. Для этого спарсил 6500 объявлений о продаже недвижимости моего города, включая 22 тысячи фотографий домов и квартир. Я знаю о квартирах всё (район, цена, площадь, энергоэффективность, этаж и т. п.)... кроме того сделан ли там ремонт или нет :-)

Соответственно, нужно по фото квартиры понять в хорошем ли она состоянии. На 70-80% фото внутренности квартиры, но на оставшихся может быть вид из окна, фотография дома, план квартиры, логотип агенства и т. д.

Мне уже посоветовали кормить chatGPT4V такими вопросами, но он в бете, у него даже неизвестно по какой цене будут такие запросы (я готов потратить не больше 10-20 евро на своё исследование).

Второй идеей было использование https://github.com/LAION-AI/aesthetic-predictor. Оно на удивление выдаёт неплохие результаты. В том плане, что фотографии, которым он даёт высокий балл, мне самому тоже нравятся. Но проблема в том, что, наверное, на половине фото есть ватермарки (названия агенств и т. п.) и он их очень сильно за это пессимизирует и ставит низкие оценки даже если квартира на фото хорошо выглядит.

Интересно послушать ваши идеи, лучшие могу попробовать реализовать.

 ,

KivApple
()

Rust, вложенные ссылки и все дела

Форум — Development

Допустим, я хочу хранить данные в SQLite. Также я не хочу дёргать SQLite напрямую из main, а хочу сделать задаче-специфичную обёртку, предоставляющую методы вида «положить яблоки», «запросить количество груш», а не SQL-запросы. Потому что мне в целом не принципиально, что там под капотом и с тем же успехом вместо БД я мог бы использовать текстовый файл (просто БД будет лучше себя вести на большом объёме данных не влезающем в ОЗУ).

Ну что ж, берём SQLite:

let connection = sqlite::open("db.sqlite").unwrap();
let mut statement = connection.prepare("SELECT COUNT(*) FROM pears").unwrap();

А теперь мы хотим положить connection и statement в одну структуру FruitStorage, у которой будет метод count_pears(). И не можем. Потому что statement требует лайфтайм connection. И не позволяет их Rust класть в одну структуру.

Можно, конечно, сделать две структуры. FruitStorage содержащий connection с методом get_fruit_counter, возвращающим FruitCounter, который уже содержит в себе statement и имеет метод count_pears(), при этом имеет лайфтайм FruitStorage. Но это явное очень сильное протекание абстракции. У нас потом могут быть ещё более высокоуровневые абстракции, а деталь реализации «для работы с SQLite нужно два отдельных объекта - соединение и подготовленный запрос» будет и дальше нас приследовать.

Как такое решается?

 ,

KivApple
()

Быстрый локальный key-value и XML SAX парсер

Форум — Development

1. Требуется key-value хранилище. И ключи, и значения строки (ключи до 100 символов, значения могут быть несколько тысяч символов). Несколько миллионов пар. Двухколоночная SQLite таблица весит 2.5 ГБ.

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

SQLite тратит 250 секунд на заполнение таблицы данными и чуть меньше 1 миллисекунды на запрос одного элемента.

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

2. Данные беруться из XML документа простого формата типа:

<items>
    <item>
        <key>Ключ</key>
        <value>Значение</value>
    </item>
    ...
</items>

Так вот, парсинг этого документа занимает 700 секунд (это если закомментировать вставку в таблицу, иначе будет 950 секунд).

Для парсинга используется xml-rs в режиме потокового парсера.

Можете ли посоветовать более быструю библиотеку парсинга? Как я понимаю, xml-rs парсит всякие штуки типа неймспейсов, которые мне не нужны (а вот стандартные xml entity типа < и > мне нужны - они встречаются в ключах и значениях).

 

KivApple
()

Роутер провайдера

Форум — Talks

Просто хочу поделиться наблюдениями. Бесплатный роутер от провайдера во Франции:

- Размером с небольшой неттоп с активным охлаждением (шумит только при включении)

- Есть OLED дисплей отображающий статус загрузки/подключения, после успешного подключения отображает текущее время. Если что-то не работает, пишет не непонятный код ошибки, а номер этапа подключения + человекочитаемое сообщение типа «получение IP-адреса по DHCP». Причём экранчик зелёный, тусклый и является единственным имеющимся индикатором, в темноте комнату не освещает.

- Внутри жёсткий диск на 250 ГБ, снаружи (помимо обычных 4 Ethernet и входа оптоволокна) два порта USB, один порт E-sata и ещё зачем-то аналоговый аудиовход и выход.

- Веб-интерфейс имеет все базовые настройки типа проброса портов, выбора диапазона IP-адресов и т. д.

- Wi-Fi 2.5 и 5 ГГц. Основная сеть и опциональная гостевая сеть с настройкой срока жизни, возможность выбрать «только доступ в интернет» и «доступ к локальной сети + интернет».

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

- Поддержка динамического DNS от DynDNS, No-IP, OVH

- Функция блокировки рекламы

- Возможность создать VPN-сервер на базе роутера для протоколов OpenVPN, PPTP, IPSec, WireGuard с возможностью создать нескольких пользователей с разными именами и пароля

- Возможность подключаться как клиент к вышеуказанным протоколам VPN

- Возможность настраивать локальный DNS (создавать свои домены)

- Встроенный жёсткий диск можно шарить по Samba, какому-то протоколу Apple и FTP

- Это всё имеет API (HTTP и WebSocket), документация к которому открывается локально прямо из веб-интерфейса роутера

- Мобильное приложение для Android/iOS

- Встроенная торрентокачалка. Перетащил торент файл в веб-интерфейс роутера и он запустил загрузку на внутренний диск. Бесплатная ТВ-приставка от провайдера умеет воспроизводить файлы с диска роутера (попутно имея поддержку стриминговых сервисов - Netflix и местный французский Canal+).

- Есть встроенная тестилка скорости подключения

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

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

- Судя по имеющимся настройкам умеет использовать в качестве резевного канала другой Wi-Fi, а также 4G (пишет, что модем не обнаружен, предполагаю, его надо приобретать отдельно и вставлять в USB-порт).

- Это всё выглядит как кастомная разработка с ни на что не похожим веб-интерфейсом.

- Есть раздел со списком использованного свободного ПО с указанием лицензий и прямых ссылок на тарболлы с исходниками, причём с сайта провайдера (вероятно, можно ожидать, что там будут любые внесённые изменения). Примечательно, что ничего похожего на торрент-клиент в списке свободного ПО нет (libtorrent тоже), то есть они, возможно, сами его разработали или взяли какой-то коммерческий (такие существуют?). Причём торрент-клиент умеет всё, что положенно - DHT, шифрование, настройку приоритета загрузки файлов, чёрный список пиров и их автоблокировку (за медленные соединения и т. д.).

А Linux тут при том, что ТВ приставка и роутер работают на Linux (ТВ-приставка имеет процессор Intel, роутер процессор ARM).

И это обычный роутер идущий в комплекте к гигабитному тарифу (к тарифу помедленее идёт роутер без жёсткого диска) за 20€ в месяц. Само собой белый IPv4 и IPv6 подсеть тоже входят в комплект.

 ,

KivApple
()

Google API и приватность

Форум — Talks

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

Google API использует OAuth2 с короткоживущими токенами. Вроде секурно. Но мы также знаем, что когда токены живут мало, обычно есть refresh токены для получения новых без повторной авторизации.

Читаем доку: https://developers.google.com/identity/oauth2/web/guides/use-token-model?hl=en

By design, access tokens have a short lifetime. If the access token expires prior to the end of the user's session, obtain a new token by calling requestAccessToken() from a user-driven event such as a button press.

И «a user-driven event such as a button press» здесь не случайно. При вызове requestAccessToken, если юзер уже залогинен, то всё равно появляется всплывающее окно (которое заблокирует браузер, если оно появляется не в ответ на user-driven event), просто оно само и исчезает, если юзер уже авторизовался, выбрал учётку и дал доступ нашему приложению.

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

При этом в Google API SDK для сервера таких проблем нет. Там есть refresh token и SDK автоматически обновляет токен при любом запросе API, который завершился неудачно из-за протухшего токена.

То есть получается:

Максимальное уважающее приватность пользователя приложения (автор не имеет технической возможности получить доступ к данным пользователя, доступ к данным имеет только само устройство пользователя и Google) будет выкидывать popup каждые несколько минут, а автор будет вынужден по всему коду распихивать костыли для обработки ошибок протухания токена.

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

Или я не осилил их Identity Services?

 

KivApple
()

Где карту открывали, там и закрывайте

Форум — Talks

Было дело, открыл я кредитную карту в Сбербанке. И не простую, а премиальную, за 2500 рублей в год. Потому что нужен был большой лимит, а не премиальная карта давала только маленький лимит. Предвижу крики «кредиты не нужны», но заранее им возражу, что кредитка была нужна не для того, чтобы её тратить, а для того, чтобы с неё сделать выписку для подачи на визу.

Затем за 3 года в моей жизни многое изменилось. Я переехал во Францию, уволился с российской работы, но исправно продолжал платить плату за обслуживание кредитки. А потом в 2022 году ЧТО-ТО случилось и с одной стороны кредитка стала бесполезна чуть менее, чем полностью (найди хоть один магазин во Франции принимающий российские карты), а с другой стороны пополнять её стало уж очень неудобно. В прошлом году пополнил по схеме французский банк => KoronaPay => Тинькофф => Сбер. Но в этом году Тинькофф тоже попал под санкции и теперь адекватных способов пополнения нет. Только криптовалюты, непонятные договорённости со знакомыми в России и т. п. Короче, по всем параметрам выходит надо бы закрыть.

Но не тут то было. Кнопка в приложении предлагает идти в офис. Я бы сходил, но офис в 4 тысячах километрах от меня, далековато идти.

Ну ничего. Не каждый клиент Сбербанка живёт в Ницце, попытаем счастья в чате. В чате перекидывают между операторами, пока в итоге не говорят, что закрывают кредитки только по личному визиту в офис банка. И даже доверенность не прокатит, но «мы работаем над этим». Зато говорят, что можно попробовать убрать плату за обслуживание. Но надо об этом их попросить, когда спишется плата за обслуживание в этом году (а спишется она буквально на днях). Ну ладно, хотите вы нажиться в последний раз моими 2500 рублей, я не жадный.

Дожидаюсь списания, пишу снова в чат. Составляют обращение, говорят в течении 2 недель придёт ответ на е-мейл.

Ответ на е-мейл приходит даже быстрее 2 недель, буквально через несколько дней. И в ответе мне рассказывают, что всё правильно с меня списали, у вас тариф такой (я как бы не удивлён). Зато оказывается, что закрыть можно в офисе не только лично, но и по доверенности. Более того, «в индивидуальном порядке» готовы закрыть по заявлению в свободной форме отправленному в чат с банком.

Ага, новая надежда. Человека с доверенностью у меня в России нет, так что пишу заявление в свободной форме, где подробно описываю ситуацию и указываю все необходимые реквизиты (они попросили указать номер карты которую надо закрыть и номер карты, куда нужно перевести положительный остаток на момент закрытия).

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

Скидываю в чат с банком. И... И ничего. Но дело было вечером, думаю, мб нет никого на месте (плюс в самом чате отобразилось, что операторы заняты и доступны только роботы). Пробую на следующий день. На этот раз появляется «оператор сейчас подключится». И никто не подключается. Пробую ещё через пару дней - сегодня, в будний день, утром. Так теперь даже сообщение «оператор сейчас подключится» не появляется, а напротив моего сообщения одна галочка вместо двух.

То ли я им сломал чат тем что отправил файлы боту не дождавшись ответа живого человека, то ли операторы техподдержки настолько мне завидуют, что никто не может взяться за чат со мной опасаясь emotional damage.

Так или иначе, непонятно как теперь связываться с банком. Ответил на емейл help@sberbank.ru, откуда пришёл ответ на обращение. Так там автоответчик отвечает «при наличии дополнительных вопросов, воспользуйтесь чатом с банком или номером телефона 900».

Вот теперь интересно, какие ещё есть каналы связи со Сбербанком, кроме личного визита в офис и телефонного звонка.

Негативный отзыв на banki.ru уже написал. Но может быть есть более прямые контакты.

UPD: Карту закрыли.

 , ,

KivApple
()

Python + JSON schema

Форум — Development

Допустим, есть некая комплексная структура данных описанная JSON Schema. Нужно работать с ней из Python. Хочется сгенерировать соответствующие классы, причём чтобы были аннотации типов и функции для превращения результата json.loads в эти классы (чтобы не работать с dict напрямую). И хочется всё это не в рантайме, чтобы работал автокомплит в IDE.

 ,

KivApple
()

Оформление загранпаспорта за границей

Форум — Talks

Постоянно проживаю во Франции, хочу оформить второй загранпаспорт. Заполняю анкету. В анкете есть раздел про трудовую деятельность (пожалуй, самый трудоёмкий и неприятный раздел анкеты по моему мнению и отзывам других людей).

Понятное дело, что нужно указывать школу, российский университет, российскую работу по трудовой. Но это всё в прошлом, а последние 2.5 года я проживаю за границей и с российскими частными и государственными организациями не взаимодействую. Но я и не безработный, у меня есть работа во Франции.

Большой соблазн отметить период проживания за границей как «не работал». Технически у них вряд ли есть возможность это проверить, да и зачем им эта информация (насколько я понимаю, российские места работы указываются для удобства проверки на доступ к секретности и т. п., но, очевидно, я не может никакая французская работа влиять на право выезда из России). Но с другой стороны, мне нужно будет предоставить им копию ВНЖ, а по самому факта его наличия, можно сделать вывод, что как минимум с момента его получения у меня есть какая-то работа где-то во Франции. И, наверное, можно на основании этого завернуть моё заявление и мне придётся снова месяцами ждать новое окно для записи в посольство.

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

 

KivApple
()

Type C кабели

Форум — Linux-hardware

Нужно прикупить пару Type C кабелей с хорошими характеристиками:

- Поддержка 100Вт USB PD + длинный (2-3м)

- Поддержка 100Вт USB PD + Thunderbolt (подключение к 4К монитору с USB-портами и 100Вт зарядкой) + не очень длинный (1м)

Проблема в том, что я читал статьи, что слишком noname китайские кабели в сочитании с USB PD могут приводить к выходу техники из строя (раньше таких проблем не было - со всякими телефонными QuickCharge в худшем случае телефон просто не заряжался или заряжался медленно).

Так что реквестирую хорошие бренды кабелей, чтобы искать именно их.

Я пока знаю только Ugreen, но у них нет кабелей второго типа (зато первого типа - на любой вкус и цвет). Ещё знаю Belkin, но это, как я понимаю, оверпрайс.

Локация: EU.

 , , кабели

KivApple
()

Выбор радиосвязи для сети датчиков

Форум — Science & Engineering

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

Встаёт вопрос выбора аппаратной части. Хочется дёшево и компактно. Питаться всё это добро будет от батарейки-таблетки, собирать показания можно, скажем, раз в полчаса. Так что поток данных очень маленький.

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

Мне пока в голову приходит либо NRF24L01 + ATTINY, либо BLE (что-то из линейки NRF51, например - получаем на халяву MCU, бонус к миниатюризации), но хочется послушать ещё варианты.

Датчики температуры/влажности в целом тоже можно советовать.

Собирать данные может ESP с подключенным любым необходимым радиомодулем и уже по Wi-Fi слать данные на мой сервер, а там я могу сделать веб-интерфейс для доступа к данным.

 

KivApple
()

Монитор с USB Type-C: может ли избирательно повредиться разъём

Форум — Linux-hardware

Один из друзей подарил на день рождения вчера 4K монитор с USB Type C, который выполняет сразу 3 функции: монитор, зарядка PD до 90 ватт и USB хаб. Всё благодаря USB Type C.

На двух ноутбуках работает всё, кроме последней функции: происходит ошибка запроса дескриптора USB.

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

Вопрос к знатокам шины USB: может ли разъём так повредиться, что будет работать PD и DisplayPort, но не работать USB?

Я вот знаю, что PD вообще не использует линии данных, а только питание, землю и экран кабеля (но при этом важно, чтобы экран не был закорочен с землёй). А про DisplayPort over USB особо не знаю. В моём представлении устройства стартуют в режиме USB, а уже потом договариваются о всяких alt mode типа displayport или thunderbolt. Соответственно, если бы повредились линии USB 2.0, то и картинки на экране не было бы. Это так или не совсем?

Хочется разделить вероятности аппаратных и программных проблем.

P.S.: Кабель используется комплектный.

 , ,

KivApple
()

Хорошие библиотеки для обработки строк на C++

Форум — Development

А есть ли для C++ хорошие библиотеки для обработки строк в функциональном стиле?

Чтобы можно было, например, решить задачу вида «разбить строку по символу переноса строки, удалить завершающие пробелы, отфильтровать непустые строки, вывести» как-то так:

std::string text = ...;
text.split('\n')
    .map([](auto s) { return s.trim(); })
    .filter([](auto s) { return !s.empty(); })
    .for_each([](auto s) { std::cout << s << std::endl; });

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

 ,

KivApple
()

CEssentials

Форум — Development

Я тут запилил небольшую библиотеку для Plain C:

https://github.com/KivApple/CEssentials

Что в себе содержит:

- Утилиты работы с динамическими строками

- Обобщённый вектор (на макросах)

- Обобщённая хеш-таблица (на макросах) с open adressing и quadratic probing

Обобщённые структуры данных реализованы типобезопасным образом (макросы порождают static inline функции под нужный тип данных, соответственно, у компилятора есть информация о типах).

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

Библиотека распространяется под лицензией MIT и обладает исчерпывающей документацией.

UPD: Переписал в snake_case стиле, плюс перевёл полностью на макросы вместо порождения макросами кучи специализированных функций, потому что оказалось, что на практике глобальное пространство имён быстро засоряется, а других в plain C не завезли.

UPD2: Написал статью по устройству хеш-таблицы из библиотеки: https://habr.com/ru/post/704724/

 ,

KivApple
()

std::any без аллокаций

Форум — Development

Я тут не нашёл ни в STL, ни в Boost версии any позволяющей избегать аллокаций. Точнее в STL есть small value optimization, но на практике размеры буфера очень малы (на GCC это всего лишь 1 указатель, в MSVC 3 указателя), а возможности задать свой размер нет (например, допустим, мы знаем, что большинство объектов меньше 64 байт).

Так что я сделал свой Any: https://pastebin.com/JMS32LNi

Вроде всё хорошо работает, кроме некоторых конструкторов:

int x = 10;
Any<64> v0 = x; // Ошибка

Any<64> v1 = 10; // Работает
Any<128> v2 = v1; // Ошибка

Собственно, в обоих случаях проблема в том, что вызывается конструктор template<typename T> Any(T &&value) вместо template<typename T> Any(const T &value) для первого случая и template<std::size_t N> Any(const Any<N> &value) для второго.

Как можно исправить вызовы конструкторов?

P. S. Такая же проблема с оператором присваивания - всегда выбирается версия с аргументом T, а версии с Any игнорируются.

 ,

KivApple
()

RSS подписка на новые темы