1.83K subscribers
3.23K photos
127 videos
15 files
3.52K links
Блог со звёздочкой.

Много репостов, немножко программирования.

Небольшое прикольное комьюнити: @decltype_chat_ptr_t
Автор: @insert_reference_here
Download Telegram
#prog #rust #rustlib #serde #amazingopensource

Хозяйке на заметку

Подборка библиотек для работы с serde от замечательного Толяна dtolnay.

erased-serde — трейты из serde со стёртыми типами. Позволяют сделать из (де)сериализаторов трейт-объекты. Обычно это запрещено правилами object safety из-за наличия обобщённых типов.

typetag — сериализация и десериализация трейт-объектов. Работает на костылях.

serde-repr — делегирует (де)сериализацию C-like enum его числовому значению.

serde-stacker — позволяет десериализовывать глубоко вложенные структуры, динамически выделяя память под стек. Работает, увы, не на всех OS: нормально работает на linux и MacOS и течёт на Windows.

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

Меня зовут Антон, я студент человек студенческого возраста и в настоящий момент я работаю программистом, по работе пишу в основном... Да, на Rust, а как вы догадались? Я люблю Rust и ненавижу примерно все остальные языки программирования. Круг моих интересов относительно широк, но на канал изливается в основном программирование (серьёзно, около половины постов с хештегом #prog). Этот канал изначально планировался как удобная свалка ссылок, материалов и #meme-ов, и... Он таковым, в сущности, и остался. В своё оправдание я могу сказать, что все статьи (выкладываемые с хештегом #article) я всегда читаю перед тем, как выложить, так что делюсь я тем, что считаю сто‌ящим своей аудитории.

Также ведение своего канала сподвигнуло меня на написание своих постов (и иногда даже перевод чужих статей), которые я выкладываю под хештегом #моё (как, впрочем, и созданные мною мемы). В их числе я хотел бы отметить:
- написание трейта, гарантирующего нулевой размер типа
- оптимизация размера итератора из стандартной библиотеки Rust (увы, не принятая)
- реализация zero-cost форматировщиков даты
- разбор различных способ реализации полиморфизма, с их достоинствами и недостатками
- эпические "Хроники замыканий" в 3 (пока что) частях: раз, два, три
- деликатный и глубокий анализ недостатков регулярных выражений

Для удобства привожу список всех хештегов на канале (может быть пополнен в будущем):

#3dcg
#abnormalprogramming
#algo
#amazingopensource
#anime
#art
#article
#bash
#bio
#blogrecommendation
#c
#cinema
#clojure
#cpp
#csharp
#db
#demoscene
#design
#dotnet
#erlang
#game
#go
#idris
#itsec
#haskell
#js
#java
#julia
#justrustaceanthings
#kbd
#life
#math
#mechanics
#meme
#menacingopensource
#ml
#mood
#music
#outoflinestorage
#parsing
#performancetrap
#php
#pixelart
#politota
#postgresql
#prog
#psy
#puzzle
#python
#quotes
#regex
#retroit
#r
#rust
#rustasync
#rustforlinux
#rustreleasenotes
#rustlib
#scala
#science
#serde
#shell
#soc
#softskills
#sql
#successstory
#suckassstory
#tips
#typescript
#video
#web
#zig

#бомбёжкипост
#культурнаяпрограмма
#лингво
#моё
#право
#трудовыебудни

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

Добро пожаловать на канал!
👍8🤮1💩1🤡1
#prog #rust #serde #rustlib

В расточате подкинули библиотеку serde_with_macros — пачку полезных фич для serde. В частности, атрибут на структуру, который диктует не сериализовать отсутствующие опциональные поля.

Довольно много постов про библиотеки для serde. Может, ввести отдельный хештег? 🤔
#prog #rust #rustlib #serde #amazingopensource

У Deno вышла новая версия, 1.9. Сам Deno мне мало интересен, но в заметках о релизе упомянули serde_v8 — библиотеку для (де)сериализации между значениями в коде на Rust и V8
#prog #rust #rustlib #serde

Трейт Deserializer имеет методы вида deserialize_type. Трейт Serializer имеет методы вида serialize_type. Что это значит? Это значит, что одно можно непосредственно сцепить с другим, и таким образом перегонять данные из одного формата данных, поддерживаемых serde, в другой, никогда не материализуя экземпляры соответствующих типов в памяти целиком. Собственно, именно это и делает serde-transcode.

Пример из документации (преттификация JSON):

extern crate serde;
extern crate serde_json;
extern crate serde_transcode;

use serde::Serialize;
use serde_json::{Serializer, Deserializer};
use std::io::{Read, Write, BufReader, BufWriter};
use std::fs::File;

fn main() {
let reader = BufReader::new(File::open("input.json").unwrap());
let writer = BufWriter::new(File::create("output.json").unwrap());

let mut deserializer = Deserializer::from_reader(reader);
let mut serializer = Serializer::pretty(writer);
serde_transcode::transcode(&mut deserializer, &mut serializer).unwrap();
serializer.into_inner().flush().unwrap();
}
#prog #rust #serde #article

У serde не самая интуитивная архитектура. В данной паре статей автор попытался показать её на примере. В первой статье автор разбирает код для десериализации, сгенерированный derive для простого примера. Во второй статье автор показывает, как самостоятельно написать десериализатор для простого формата.
#prog #rust #serde

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

1. Value, а также обе разновидности ссылок на него могут быть сравнены на равенство со всеми примитивными числами, bool, str и String.

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

3. Value можно индексировать как строками, так и числовыми индексами, при этом в случае, если индексировать значение таким образом нельзя, иммутабельное индексирование вместо паники возвращает ссылку на Value::Null.

4. Если вам нужно достать глубоко вложенное значение, можно вместо череды индексаций или вызовов get использовать метод pointer/pointer_mut, которые достают значение по указанному строковому пути:

let data = json!({
"x": {
"y": ["z", "zz"]
}
});

assert_eq!(data.pointer("/x/y/1").unwrap(), &json!("zz"));
assert_eq!(data.pointer("/a/b/c"), None);

5. Value и &Value реализуют Deserialize. Это значит, что если у вас есть разобранный JSON в неструктурированном виде, вы можете сконвертировать его в свои типы, реализующие Deserialize — причём в случае со ссылкой у вас при этом останется изначальный JSON. Так можно пробовать десериализовывать поочерёдно в несколько типов, и это может оказаться дешевле, чем парсить всё с нуля.

6. У Value есть собрат RawValue. Этот тип фактически представляет собой синтаксически валидный JSON, который хранится в виде слайса на входную строку. Его можно использовать для того, чтобы проводить манипуляции над JSON и при этом не хранить разобранный JSON в памяти целиком:

use serde::{Deserialize, Serialize};
use serde_json::{Result, value::RawValue};

#[derive(Deserialize)]
struct Input<'a> {
code: u32,
#[serde(borrow)]
payload: &'a RawValue,
}

#[derive(Serialize)]
struct Output<'a> {
info: (u32, &'a RawValue),
}

// Efficiently rearrange JSON input containing separate "code" and "payload"
// keys into a single "info" key holding an array of code and payload.
//
// This could be done equivalently using serde_json::Value as the type for
// payload, but &RawValue will perform better because it does not require
// memory allocation. The correct range of bytes is borrowed from the input
// data and pasted verbatim into the output.
fn rearrange(input: &str) -> Result<String> {
let input: Input = serde_json::from_str(input)?;

let output = Output {
info: (input.code, input.payload),
};

serde_json::to_string(&output)
}

fn main() -> Result<()> {
let out = rearrange(r#" {"code": 200, "payload": {}} "#)?;

assert_eq!(out, r#"{"info":[200,{}]}"#);

Ok(())
}
👍10
👎1
#prog #rust #rustlib

#serde с версии 1.0.180 перешла на edition 2018 и сменила MSRV с 1.19 на 1.31
🎉10🤷1
#prog #rust #serde #rustlib

ijson — более эффективная по памяти альтернатива serde_json::Value.

This crate offers a replacement for serde-json’s Value type, which is significantly more memory efficient.

As a ballpark figure, it will typically use half as much memory as
serde-json when deserializing a value and the memory footprint of cloning a value is more than 7x smaller.

The primary type exposed by this crate is the
IValue type. It is guaranteed to be pointer-sized and has a niche (so Option<IValue> is also guaranteed to be pointer-sized).
5🤣1
#prog #rust #serde #article

Faster Rust Serialization

Или несколько советов о том, как делать меньше лишней работы при сериализации с использованием serde.
👍4👎1
Блог*
😒🤚 miniserde 😏👉 сердечко
#prog #rust #rustlib

miniserde — библиотека для (де)сериализации из/в JSON. В отличие от #serde, довольно ограничена, практически лишена опций для кастомизации и генерирует код, который использует трейт-объекты вместо дженериков. За счёт последнего компилируется значительно быстрее serde и при этом не сильно уступает в производительности.
😍7🤡3👍1🥴1
#prog #rust #article

A Rust API Inspired by Python, Powered by Serde

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

Статья ценна хотя бы примером нетривиального десериализатора для #serde — гайдов на эту тему мало.
🔥5🤔1