Обновить
22
0.2

Software Engineer

Отправить сообщение

Ну так и сделали бы генератор в обычном смысле (функция (void)->кролик), или систему разных генераторов, и вокруг этого генератора - класс magicians_hat имитирующий корутину и хранящий генератор + копию возвращаемого им значения + ссылки на внутренние переменные генератора если они есть. Чтобы разделить где собственно функционал генератора, и где то что хранится во фрейме корутины.

Иначе возникает много вопросов вида в чём вообще смысл наследоваться от базового класса с парой полей и пустым функционалом, хранить возвращаемого кролика, иметь генератор типа void().

struct Rabbit {};

const int STATE_DONE = 0;


template<class T>
concept RabbitGenerator 
= requires(T &t) {
    { t.gen_rabbit() } -> std::same_as<std::optional<Rabbit>>;
    { t.state() } -> std::same_as<int&>;
};



template<RabbitGenerator G>
class magicians_hat {
public:
    magicians_hat(G&& generator):
        generator_(generator) {}

    void pullout_rabbit() {
        if (generator_.state() == STATE_DONE) return;

        if (auto yielded_rabbit = generator_.gen_rabbit()) {
            yielded_rabbit_ = yielded_rabbit.value();
        }
    }

    // интерфейс coroutine_handle
    Rabbit& promise() { return yielded_rabbit_; }
    void resume();
    void destroy();
    //...
    
private:
    G       generator_;
    Rabbit  yielded_rabbit_;
};

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

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

Если честно объяснение непонятное с самой первой структуры magicians_hat_base.

Int state_ - у структуры 4294967295 состояний? Или всё-таки какие-то из них недостижимые? Или структура сама не знает, какие состояния достижимые и какие нет? Подобные соглашения должны быть в описании класса.

" // Функция возобновления virtual void pullout_rabbit() " - мне казалось что таким именем будет названа функция вытаскивания кролика, а не функция "возобновления" чего-либо? Почему "возобновления"? Если я сделаю pullout_rabbit(); pullout_rabbit(); это 2 раза возобновить что-то? Это ошибка или нет?

Int current_rabbit_ - зачем заводить в структуре поле "вытащенный кролик" если "вытащенный кролик" это по смыслу возвращаемое значение, а не хранимое? В базовом классе нет никакой логики завязанной на это поле, просто взяли в стиле C завели поле без знания как им управлять и без гарантий что потомок это реализует.

Что такое состояния 1, 0, как пользователь должен догадаться что из них что означает? Pullout_rabbit() можно вызывать бесконечно много раз - это баг или фича? Разве pullout_rabbit не должен вести себя по-разному в зависимости от done()?

Ну если вы уж хотите полной аутентичности, то привязываться к языкам дварфов Средиземья следует только если у вас сеттинг по Средиземью. :) В противном случае имхо ничего страшного если вы возьмёте имя из дварфского языка из любого постороннего сеттинга, если язык там достаточно проработан и круто звучит. Можете взять дварфский из Dwarf Fortress https://dfwk.ru/Dwarven_language, это не настоящий язык тк в нём нет грамматики и морфологии (только слова некоторых частей речи), но имена собственные там есть, и фонетика в нём ничего так, а у имён собственных есть значения. Стандартное имя гнома в этом языке будет Urist.

Качество кода - это несколько более широкое понятие, чем просто разбить код на небольшие читаемые куски. Это какая же CI/CD система способна например определить, что код нарушает принцип open/close, или что там захардкожено что-то что захардкожено быть не должно, или что библиотека даёт вызывающему возможность парой вызовов апи привести данные в неконсистентное состояние? Пусть этот код даже разбит на вылизанные куски и снабжён мильоном .md документов?

Минорщина если честно. Кто-нибудь этой опцией nearby sharing пользуется вообще? Есть там в ней рекомендации, нет их, - это капля в море. Есть гораздо более бесящие компоненты с рекомендациями, например Windows Spotlight.

а, не заметил что это BufWriter. Да, всё так, множественный write здесь допусти́м

Метод read возвращает реальное количество прочитаннх байт и это n.

Нет.

"It is not an error if the returned value n is smaller than the buffer size, even when the reader is not at the end of the stream yet".

он остановится, когда written_total будет >= cli.length

Тоже ничего хорошего. Код знает заранее, сколько именно итераций сделать, и при этом делает if внутри каждой итерации.

Странная логика подсчёта сколько байт прочитано из random/urandom.
Ваш код молча предполагает что буфер read_buf заполнится за 1 вызов read, по крайней мере тело while-цикла зовёт read() и далее итерируется по всему read_buf. На деле, реализация трейта Read::read() не даёт никаких гарантий на то, сколько именно байт она запишет за вызов. Может быть 0, 1, ..., размер буфера. Если по каким-то причинам ваша read() прочитает 1 байт, вся логика сломается - цикл будет читать нули из read_buf. Ну и write_all по одному байту это такое себе.

Очень хорошая демонстрация, почему "реализовать фичу" ещё не значит написать её хорошо.

Заглянул в PR, имхо говнокод говнокодом.

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

Это же Palace, нет? Я уже путаться начинаю в этих новых городах.

Новичок смотрит на это и видит криптографию. Битовые маски, регистры... Зачем мне это знать, чтобы мигнуть лампочкой?

Очень странное обоснование зачем нужен ардуино кит. Чтобы избавиться от манипулирования битами, почему бы новичку просто самому, без сторонних либ, не написать человекочитаемую высокоуровневую обёртку:

enum IOMode { INPUT = 0, OUTPUT = 1 };
enum Level { LOW = 0, HIGH = 1 };

static inline void setIOMode(volatile uint8_t* ddr,
                             uint8_t           number,
                             enum IOMode       mode) {
    if (mode == OUTPUT) {
        *ddr |= (1 << number);
    } else {
        *ddr &= ~(1 << number);
    }
}

static inline void setLevel(volatile uint8_t*  port,
                            uint8_t            number,
                            enum Level         level) {
    if (level == HIGH) {
        *port |= (1 << number);
    } else {
        *port &= ~(1 << number);
    }
}

setIOMode(&DDRB, 5, OUTPUT);
setLevel(&PORTB, 5, HIGH);

Раньше, на решение средней проблемы гугл + стэковерфлоу уходило от 10 до 60 мин времени в зависимости от сложности

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

Очень похоже на функциональные мини ЯП из экосистемы Rust, такие как gluon.

In the grim darkness of far future there is only war!

Первый раз вижу, чтобы раннюю валидацию и избегание дублирования bounds check преподносили как какое-то откровение...

ибо внутри цикла reflect и add их больше нет.

Как же нет, у вас там std::max(0.0f, formFactor) внутри, любой std::max это условный переход. Сами же говорите про вызовы валидированных типов и сами же это нарушаете.

Зачем вообще делать std::max с нулём для отбрасывания незначащих малых отрицательных чисел, std::fabs быстрее. https://godbolt.org/z/hbh34zG5d (опуская -ffast-math пока что)

Ну и для кода, думающего о низкоуровневой оптимизации, суммирование sumIncoming очень подозрительное, в цикле sumIncoming переприсваивается значение много раз на основе предыдущего значения, очень похоже на "алгоритм маляра Шлемиэля".

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

Оно и не может нормально выглядеть, откуда вообще взяться сглаживанию в ядерной консоли, которое вы упоминаете в статье? Там шрифт всегда монохромный (https://en.wikipedia.org/wiki/PC_Screen_Font), задаётся битмапом из нулей и единиц (1=закрашено 0=фон). Соответственно нет полутонов и всего остального, нужного для сглаживания. Максимум можно взять шрифт побольше.

Среднестатический CEO атакованной компании be like:
− Так, Дарио Амодеи, пажжи, а откуда у тебя вообще сведения о том, что проникновение удалось, и о деталях атаки, например что были собраны некие наши данные?

1
23 ...

Информация

В рейтинге
2 630-й
Откуда
Россия
Зарегистрирован
Активность