Αλεχ Zhukovsky:
https://superuser.com/questions/1273927/word-link-in-slack
Вафель:
У телеги очень, очень много проблем. Я бы сказал "лучшая из худших".
К примеру:
— ебанутый (и возможно небезопасный) протокол
— спорный интерфейс в некоторых местах
— проблемы с большими чатами (такое сложно решить ибо как в дискорде тоже не айс)
— кривое bot-api
— ужасная документация
— в десктопной телеге нельзя открыть 2 окна с чатами
и т.д. и т.п.
Αλεχ Zhukovsky:
1. протокол пофиг, ты работаешь через вебапи, которое адекватное (когда я писал бота проблем у меня не возникло)
2. Хз, вроде интерфейс как интерфейс
3. Большие чаты в слаке просто не работают. В телеге же в мейне 3000 человек и проблем с этим нет
4. уже сказал выше
5. более-менее нормальная. Я когда делал бота на расте не было нормальных телеграм либ еще и я пилил сам по доке. Особых проблем не возникло
6. никогда не возникало такой нужды
Вафель:
1. протокол не пофиг, если пишешь клиент/враппер над bot-api. +это влияет на то как добавляют новые фичи. +это влияет на скорость работы/безопасность/потребление инета.
2. как я ниже добавил — нельзя открыть 2 окна; поиск всратый; в каналах лишняя кнопка mute/unmute которая занимает много места;
5.1 дока совершенно не для машин, сгенерить по ней апи не тревиально.
5.2 всё странно структурированно (имхо)
5.3 у них битность инта определяется в ОПИСАНИИ ПОЛЯ
5.4 многие поля которые по логике u32 определены как i32
5.5 про битность float'ов вообще ни слова
5.6 разрабы не умеют в сум типы — некоторые типы сериализуются очень странно
6. если надо в одном чате что-то посмотреть а потом прогнав через мозг кинуть в другой это полезно. Так-же это очень удобно чтобы не искать один и тот же чат каждый раз (а с системой телеги где сверху у тебя сплошные чаты 10кк сообщений/сек это особенно актуально)
Αλεχ Zhukovsky:
лепота)
ну у нас как минимум:
#![feature(option_result_contains)]
#![feature(core_intrinsics)]
#![feature(type_alias_impl_trait)]
#![feature(try_blocks)]
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=a51688e00d9d9b31576eeca19441c9cf
сигнатура функции
fn foo() -> [closure@src/lib.rs:2:5: 2:10] {}
Mike Lubinets:
Попробуйте лучше trait_alias вместо type alias impl trait
Типа там трейт алиасы можно делать как trait NewTrait = OldTrait и оно разворачивается в что-то типа
trait NewTrait: OldTrait {}
impl<T: OldTrait> NewTrait for T {}
Два чая
Kitsu:
Опч какая милота, а заработает с trait T = Y<impl F>?
Mike Lubinets:
Ноуп :((
Αλεχ Zhukovsky:
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=fcf73e6be1544af12ae1be3a2dbf168a
правда развернуть и сделать фн возвращающий итератор уже низя
Stanislav Popov:
расходимся посоны раст ничего не может
red75prime:
Хмм. Длину можно регулировать
#![feature(type_alias_impl_trait)]
type Foo = impl Fn();
type Bar = impl Fn() -> Foo;
fn foo() -> Bar {
||||()
}
https://superuser.com/questions/1273927/word-link-in-slack
Вафель:
У телеги очень, очень много проблем. Я бы сказал "лучшая из худших".
К примеру:
— ебанутый (и возможно небезопасный) протокол
— спорный интерфейс в некоторых местах
— проблемы с большими чатами (такое сложно решить ибо как в дискорде тоже не айс)
— кривое bot-api
— ужасная документация
— в десктопной телеге нельзя открыть 2 окна с чатами
и т.д. и т.п.
Αλεχ Zhukovsky:
1. протокол пофиг, ты работаешь через вебапи, которое адекватное (когда я писал бота проблем у меня не возникло)
2. Хз, вроде интерфейс как интерфейс
3. Большие чаты в слаке просто не работают. В телеге же в мейне 3000 человек и проблем с этим нет
4. уже сказал выше
5. более-менее нормальная. Я когда делал бота на расте не было нормальных телеграм либ еще и я пилил сам по доке. Особых проблем не возникло
6. никогда не возникало такой нужды
Вафель:
1. протокол не пофиг, если пишешь клиент/враппер над bot-api. +это влияет на то как добавляют новые фичи. +это влияет на скорость работы/безопасность/потребление инета.
2. как я ниже добавил — нельзя открыть 2 окна; поиск всратый; в каналах лишняя кнопка mute/unmute которая занимает много места;
5.1 дока совершенно не для машин, сгенерить по ней апи не тревиально.
5.2 всё странно структурированно (имхо)
5.3 у них битность инта определяется в ОПИСАНИИ ПОЛЯ
5.4 многие поля которые по логике u32 определены как i32
5.5 про битность float'ов вообще ни слова
5.6 разрабы не умеют в сум типы — некоторые типы сериализуются очень странно
6. если надо в одном чате что-то посмотреть а потом прогнав через мозг кинуть в другой это полезно. Так-же это очень удобно чтобы не искать один и тот же чат каждый раз (а с системой телеги где сверху у тебя сплошные чаты 10кк сообщений/сек это особенно актуально)
Αλεχ Zhukovsky:
лепота)
ну у нас как минимум:
#![feature(option_result_contains)]
#![feature(core_intrinsics)]
#![feature(type_alias_impl_trait)]
#![feature(try_blocks)]
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=a51688e00d9d9b31576eeca19441c9cf
сигнатура функции
fn foo() -> [closure@src/lib.rs:2:5: 2:10] {}
Mike Lubinets:
Попробуйте лучше trait_alias вместо type alias impl trait
Типа там трейт алиасы можно делать как trait NewTrait = OldTrait и оно разворачивается в что-то типа
trait NewTrait: OldTrait {}
impl<T: OldTrait> NewTrait for T {}
Два чая
Kitsu:
Опч какая милота, а заработает с trait T = Y<impl F>?
Mike Lubinets:
Ноуп :((
Αλεχ Zhukovsky:
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=fcf73e6be1544af12ae1be3a2dbf168a
правда развернуть и сделать фн возвращающий итератор уже низя
Stanislav Popov:
расходимся посоны раст ничего не может
red75prime:
Хмм. Длину можно регулировать
#![feature(type_alias_impl_trait)]
type Foo = impl Fn();
type Bar = impl Fn() -> Foo;
fn foo() -> Bar {
||||()
}
Super User
Word link in Slack
How can I create a word link in Slack?
By word link I mean a link which is attached to the word. For instance, in SO it is achieved by typing the word in brackets and after that the link in parent...
By word link I mean a link which is attached to the word. For instance, in SO it is achieved by typing the word in brackets and after that the link in parent...
Forwarded from 🇻🇦Agrailag
ишь чего придумали, владение, заимствование, лайфтаймы, иммьютабл, набор каких то слов бесполезных, нормальный программист никогда не ошибётся и два раза не напишет фри или не начнёт мутировать из 2 ух потоков данные без синхронизации, в общем только сишечка. а эти ваши игрушки пусть в аду горят
Forwarded from Stanislav Popov
топ статья https://habr.com/ru/post/476916/
Хабр
Я больше не хочу работать, никогда и ни над чем. Но из меня научились выжимать результаты
Дерьмовое утро удалёнщика всегда начинается одинаково. Если детский плач не смог вытащить меня из кровати, то нытье жены сделает это с гарантией. Сумасшедшие девять утра, через час дейли-синк-ап, а за...
Forwarded from Денис
pub fn run<F, I>(f: F) -> CpuFuture<I>
where
F: FnOnce() -> I + Send + 'static,
I: Send + 'static,
{
let (tx, rx) = oneshot::channel();
POOL.with(|pool| {
pool.execute(move || {
if !tx.is_canceled() {
let _ = tx.send(f());
}
})
});
CpuFuture { rx }
}Forwarded from Денис
типа если конец канала дропнули до того, как фактически началось выполнение, то оно и не начнётся
Александр Мещеряков:
Всем привет! Помогите разобраться с ошибкой десериализации в serde:
Делаю так:
#[derive(Debug, PartialEq, Eq, Clone, Copy, Serialize, Deserialize)]
#[serde(try_from = "String")]
pub struct CurrencyId(&'static str);
impl TryFrom<String> for CurrencyId {
type Error = String;
fn try_from(value: String) -> Result<Self, Self::Error> {
Ok(Self(Box::leak(value.into_boxed_str())))
}
}
Но при компиляции простой структуры, которая содержит поле CurrencyId, получаю ошибку:
error[E0495]: cannot infer an appropriate lifetime for lifetime parameter
--> test/src/mod.rs:62:5
|
62 | pub currency_id: CurrencyId,
| ^^^
|
note: first, the lifetime cannot outlive the lifetime 'de as defined on the impl at 60:50...
--> test/src/mod.rs:60:50
|
60 | #[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)]
| ^^^^^^^^^^^
= note: ...so that the types are compatible:
expected matching::_IMPL_DESERIALIZE_FOR_MatchingStatus::_serde::de::SeqAccess<'_>
found matching::_IMPL_DESERIALIZE_FOR_MatchingStatus::_serde::de::SeqAccess<'de>
= note: but, the lifetime must be valid for the static lifetime...
= note: ...so that the types are compatible:
expected matching::_IMPL_DESERIALIZE_FOR_MatchingStatus::_serde::Deserialize<'_>
found matching::_IMPL_DESERIALIZE_FOR_MatchingStatus::_serde::Deserialize<'static>
Kitsu:
Нельзя десериализовывать static в принципе, это невалидно. 'static - то, что известно на этапе компиляции. Вам подойдет либо owned структура (String), либо строчка с лайфтаймом (&'a str) от того места, откуда идет десериализации (см. доку серде по аттрибутам).
лан, на самом деле на счет "известно на этапе компиляции" я преувеличил, но истина где-то рядом
Александр Мещеряков:
Но там же стоит #[serde(try_from = "String")], какая ему разница, как я получу данный тип из строки? И да, я могу получить статический строковый срез на этапе выполнения.
Kitsu:
А когда вызвать деструктор у строки?
Этот вариант подразумевает, что в коде будет что-то типо:
fn deserialize<D: Deserialize>(d: D) -> Result<MyType> {
let s: String = d.deserialize_string()?;
let my_type = s.try_from()?;
Ok(my_type)
}
s: String - умерла при выходе из функции, а my_type — нет
red75prime:
Главный вопрос. Куда &str должен указывать? serde по понятным причинам не делает Box::leak(), чтобы получить 'static ссылки.
Александр Мещеряков:
try_from делает Box::leak(value.into_boxed_str()), или я не понял, что вы имеете ввиду
Ну у меня есть TryFrom который гарантированно работает - переводит String в CurrencyId, что-то не пойму, почему этого не достаточно
red75prime:
А зачем такое... неортодоксальное решение? Почему не String или Box<str>?
Александр Мещеряков:
Ну мне нужен именно &'static str в CurrencyId, и этот срез будет браться из статического сервиса, но для упрощения примера я сделал Box::leak для получения &'static str из String
Сути ошибки это не изменило...
red75prime:
Хм. Разве что попробовать #[serde(bound(deserialize = "T: DeserializeOwned"))] на поле currency_id. Даже лучше на типе CurrencyId
Александр Мещеряков:
red75prime @kitsu В общем, единственно работающим вариантом оказалось написать собственный десериализатор:
impl<'de> Deserialize<'de> for CurrencyId {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
let value = String::deserialize(deserializer)?;
CurrencyId::try_from(value).map_err(<D::Error as de::Error>::custom)
}
}
Мне кажется это баг в serde, он по идее не должен был вообще учитывать статический лайфтайм если я использую TryFrom. Наверное стоит создать issue.
Всем привет! Помогите разобраться с ошибкой десериализации в serde:
Делаю так:
#[derive(Debug, PartialEq, Eq, Clone, Copy, Serialize, Deserialize)]
#[serde(try_from = "String")]
pub struct CurrencyId(&'static str);
impl TryFrom<String> for CurrencyId {
type Error = String;
fn try_from(value: String) -> Result<Self, Self::Error> {
Ok(Self(Box::leak(value.into_boxed_str())))
}
}
Но при компиляции простой структуры, которая содержит поле CurrencyId, получаю ошибку:
error[E0495]: cannot infer an appropriate lifetime for lifetime parameter
'de due to conflicting requirements--> test/src/mod.rs:62:5
|
62 | pub currency_id: CurrencyId,
| ^^^
|
note: first, the lifetime cannot outlive the lifetime 'de as defined on the impl at 60:50...
--> test/src/mod.rs:60:50
|
60 | #[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)]
| ^^^^^^^^^^^
= note: ...so that the types are compatible:
expected matching::_IMPL_DESERIALIZE_FOR_MatchingStatus::_serde::de::SeqAccess<'_>
found matching::_IMPL_DESERIALIZE_FOR_MatchingStatus::_serde::de::SeqAccess<'de>
= note: but, the lifetime must be valid for the static lifetime...
= note: ...so that the types are compatible:
expected matching::_IMPL_DESERIALIZE_FOR_MatchingStatus::_serde::Deserialize<'_>
found matching::_IMPL_DESERIALIZE_FOR_MatchingStatus::_serde::Deserialize<'static>
Kitsu:
Нельзя десериализовывать static в принципе, это невалидно. 'static - то, что известно на этапе компиляции. Вам подойдет либо owned структура (String), либо строчка с лайфтаймом (&'a str) от того места, откуда идет десериализации (см. доку серде по аттрибутам).
лан, на самом деле на счет "известно на этапе компиляции" я преувеличил, но истина где-то рядом
Александр Мещеряков:
Но там же стоит #[serde(try_from = "String")], какая ему разница, как я получу данный тип из строки? И да, я могу получить статический строковый срез на этапе выполнения.
Kitsu:
А когда вызвать деструктор у строки?
Этот вариант подразумевает, что в коде будет что-то типо:
fn deserialize<D: Deserialize>(d: D) -> Result<MyType> {
let s: String = d.deserialize_string()?;
let my_type = s.try_from()?;
Ok(my_type)
}
s: String - умерла при выходе из функции, а my_type — нет
red75prime:
Главный вопрос. Куда &str должен указывать? serde по понятным причинам не делает Box::leak(), чтобы получить 'static ссылки.
Александр Мещеряков:
try_from делает Box::leak(value.into_boxed_str()), или я не понял, что вы имеете ввиду
Ну у меня есть TryFrom который гарантированно работает - переводит String в CurrencyId, что-то не пойму, почему этого не достаточно
red75prime:
А зачем такое... неортодоксальное решение? Почему не String или Box<str>?
Александр Мещеряков:
Ну мне нужен именно &'static str в CurrencyId, и этот срез будет браться из статического сервиса, но для упрощения примера я сделал Box::leak для получения &'static str из String
Сути ошибки это не изменило...
red75prime:
Хм. Разве что попробовать #[serde(bound(deserialize = "T: DeserializeOwned"))] на поле currency_id. Даже лучше на типе CurrencyId
Александр Мещеряков:
red75prime @kitsu В общем, единственно работающим вариантом оказалось написать собственный десериализатор:
impl<'de> Deserialize<'de> for CurrencyId {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
let value = String::deserialize(deserializer)?;
CurrencyId::try_from(value).map_err(<D::Error as de::Error>::custom)
}
}
Мне кажется это баг в serde, он по идее не должен был вообще учитывать статический лайфтайм если я использую TryFrom. Наверное стоит создать issue.