#prog #rust #rustlib #article
Announcing error-stack, a context-aware error library for Rust that supports arbitrary attached user data
Вы не поверите, но ещё одна Rust-библиотека для ошибок. Вместе со статьёй, в которой описывается мотивация для её создания и дизайна
Announcing error-stack, a context-aware error library for Rust that supports arbitrary attached user data
Вы не поверите, но ещё одна Rust-библиотека для ошибок. Вместе со статьёй, в которой описывается мотивация для её создания и дизайна
HASH for Developers
Announcing error-stack – HASH Developer Blog
A context-aware error library for Rust that supports arbitrary attached user data
👍2🎉1
#prog #rust #serde
В serde_json есть тип Value, который может представить любое валидное JSON-значение. Есть парочка вещей, которые не столь известны и стоят упоминания.
1.
2. В
3.
4. Если вам нужно достать глубоко вложенное значение, можно вместо череды индексаций или вызовов
6. У
В 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(())
}
docs.rs
Value in serde_json - Rust
Represents any valid JSON value.
👍10
Блог*
#science #article Прекрасная интерактивная статья, рассказывающая о том, как работает GPS, с поэтапным учётом всё новых и новых обстоятельств. (thanks @jemalloc)
#mechanics #article
Статья от того же автора. Покрывает не только часть, отвечающую за равномерный ход часов, но и также устройство механизма для показывания дня месяца, устройство головки часов, позволяющей заводить, корректировать время и день одной деталью, и механизм для автоподзавода часов. Крайне рекомендую к прочтению, часы — это восхитительный механизм.
(thanks @theLastOfCats)
Статья от того же автора. Покрывает не только часть, отвечающую за равномерный ход часов, но и также устройство механизма для показывания дня месяца, устройство головки часов, позволяющей заводить, корректировать время и день одной деталью, и механизм для автоподзавода часов. Крайне рекомендую к прочтению, часы — это восхитительный механизм.
(thanks @theLastOfCats)
ciechanow.ski
Mechanical Watch – Bartosz Ciechanowski
Interactive article explaining how a mechanical watch works.
❤5🤯3🔥1
Forwarded from dev optozorax
Какой же питон лютое говнище. Редактирую простой код 5 минут, и час отлаживаю ошибки типов. На расте я бы уже тыщу раз написал объявление структур и тыщу раз скомпилировал это. Откуда люди вообще взяли что на нём код быстро пишется.
👍21👎16❤4🥰1
Forwarded from Технологический Болт Генона
After a long time it’s time for a big upgrade of my computer hardware orchestra. Here it is! The bigger and better Floppotron 3.0. 512 floppy disk drives, 4 scanners and 16 hard disk drives.
The Floppotron 3.0
https://silent.org.pl/home/2022/06/13/the-floppotron-3-0/
🔥5🤩2🎉1
#prog #c #ruby #article
An in-depth look at CVE-2018-8778 or why integer overflows are still a thing!
An in-depth look at CVE-2018-8778 or why integer overflows are still a thing!
Sqreen Blog
An in-depth look at CVE-2018-8778 or why integer overflows are still a thing! - Sqreen Blog
CVE-2018-8778 is a Buffer under-read that is triggered by `String#unpack`. In this article, we will do a deep dive into the vulnerability, show how to exploit it and how to mitigate it.