1. C++ / Говнокод #26913

    +3

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    int main()
    {   
        using output1 = Eval<
            Input<'H', 'e', 'l', 'l', 'o'>,
            App<
                ',', '>', ',', '>', ',', '>', ',', '>', ',', '>',
                '<', '.', '<', '.', '<', '.', '<', '.', '<', '.'
            >
        >;
        std::cout << "Hello reverse (read/write): " << SpanToStringContinuous<output1>::value() << std::endl;
    
        using output2 = Eval<
            Input<>,
            App<'+', '+', '+', '[', '-', ']'>
        >;
        std::cout << "Simple loop (empty output): " << SpanToStringContinuous<output2>::value() << std::endl;
    
        // Source: Wikipedia
        using output3 = Eval<
            Input<>,
            App<
                '+', '+', '+', '+', '+', '+', '+', '+', '[', '>', '+', '+', '+',
                '+', '[', '>', '+', '+', '>', '+', '+', '+', '>', '+', '+', '+',
                '>', '+', '<', '<', '<', '<', '-', ']', '>', '+', '>', '+', '>',
                '-', '>', '>', '+', '[', '<', ']', '<', '-', ']', '>', '>', '.',
                '>', '-', '-', '-', '.', '+', '+', '+', '+', '+', '+', '+', '.',
                '.', '+', '+', '+', '.', '>', '>', '.', '<', '-', '.', '<', '.',
                '+', '+', '+', '.', '-', '-', '-', '-', '-', '-', '.', '-', '-',
                '-', '-', '-', '-', '-', '-', '.', '>', '>', '+', '.', '>', '+',
                '+', '.'
            >
        >;
        std::cout << "Hello World (wiki): " << SpanToStringContinuous<output3>::value() << std::endl;
    
    
        return EXIT_SUCCESS;
    }

    https://wandbox.org/permlink/AERueBhsiS4WxGZY, https://pastebin.com/Cywe05JY

    Напейсал полностью компайл-таймовый интерпретатор «Брейнфака» на крестовых шаблонах.

    Запостил: gost, 03 Сентября 2020

    Комментарии (104) RSS

    • Работает так:

      1. Определяем компайл-тайм контейнер (метаконтейнер) для хранения примитивных типов Span<T, T...>. Теперь мы можем объявить компайл-тайм массив: using arr = Span<char, '+', '-', '.'>.
      2. Определяем метафункции для Span: SpanAppend<span1, span2>, SpanPopBack<span>, SpanPushFront<span, value> и так далее.
      3. Определяем метаконтейнер Memory: он будет состоять из левого Span, правого Span и выделенного (current в коде) значения, которое находится между ними. По сути это просто массив, в котором «выделено» значение по какому-то индексу.
      4. Определяем главные метафункции для Memory: MemMoveLeft, MemMoveRight. Они работают вот так:
      // MoveLeft
      // {[1, 2, 3], 4, [5, 6, 7]} -> {[1, 2], 3, [4, 5, 6, 7]}
      
      // MoveRight
      // {[1, 2, 3], 4, [5, 6, 7]} -> {[1, 2, 3, 4], 5, [6, 7]}

      То есть эти функции просто сдвигают выделенный элемент влево/вправо.
      5. Расширяем функции сдвига Memory:
      // MoveLeftInf
      // {[], 1, [2, 3]} -> {[], DefaultValue, [1, 2, 3]}
      
      // MoveRightInf
      // {[1, 2], 3, []} -> {[1, 2, 3], DefaultValue, []}

      Таким нехитрым образом мы получаем бесконечный ленивый метамассив. Думаю, тут уже очевидно, как будет представлена память BF-программы и как реализованы операторы < и >. Нужно заметить, что так наша реализация «Брейнфака» будет полностью Тьюринг-полная, в отличие от анскильных реализаций с ограниченной лентой.
      6. Определяем метафункции для работы с выделенным значением в Memory: MemIncrement, MemGetValue, MemSetValue, etc. Можно определять операторы + и -.
      Ответить
      • 7. Определяем сердце интерпретатора: метаконтейнер состояния.
        template<typename InputSpanT, typename CellsMemT, typename AppMemT, typename OutputSpanT>
        struct BFState {
            using input = InputSpanT;
            using cells = CellsMemT;
            using app = AppMemT;
            using output = OutputSpanT;
        };

        Теперь понятно, как нам реализовывать . и ,: просто делаем SpanPopFront и SpanPushBack на соответствующих массивах.
        8. Определяем метафункции-операторы вот такого вида:
        // +: increment current cell
        template<typename State>
        using OpInc = BFState<
            typename State::input,
            MemIncrement<typename State::cells>,
            MemMoveRightInf<typename State::app, 0>,
            typename State::output
        >;

        То есть эти метафункции получают на вход состояние и отдают его же, но изменённое. Какое ФП )))
        9. Определяем метафункцию, принимающую на вход символ алфавита «Брейнфака» и состояние, и возвращающую изменённое в соответствии с символом состояние:
        template<typename State, char C>
        struct ExecCharImpl {
            using result = OpNop<State>;
        };
        
        template<typename State> struct ExecCharImpl<State, '>'> { using result = OpMoveRight<State>; };
        template<typename State> struct ExecCharImpl<State, '<'> { using result = OpMoveLeft<State>; };
        // Etc, etc.

        10. Определяем метафункцию EvalImpl, которая принимает состояние и будет выполнять текущий выделенный символ программы до тех пор, пока не дойдёт до конца. Когда дойдёт — возвратит вывод программы.
        11. Определяем всяческие хелперы: вывод на экран, App<>, Input<>.

        Вуаля!

        К сожалению, более-менее сложные программы (особенно с циклами) компиляторы не тянут: «Visual Studio» представленный в ТС-коде хелловорлд вообще не компилирует, «GCC» требует «-ftemplate-depth=1024». Нативного преобразования строк в метастроки в кресты так и не завезли, поэтому программы придётся писать посимвольно.
        Ответить
        • > посимвольно

          Ну ты можешь операторами формировать метастроку. Примерно та же логика, что в моей версии. Просто завернуть это в decltype.

          using code = decltype(+ + + BrainFuck);
          Ответить
          • Заебись, спасибо за идею!
            Добавляем:
            template<template <char...> typename Ctor, char... Data>
            struct BFAppFactory {
                Ctor<'+', Data...> operator+();
                Ctor<'-', Data...> operator-();
                Ctor<'>', Data...> operator++();
                Ctor<'<', Data...> operator--();
                Ctor<'.', Data...> operator*();
                Ctor<',', Data...> operator&();
                Ctor<'[', Data...> operator!();
                Ctor<']', Data...> operator~();
            };
            
            template<char... Data>
            struct BFAppImpl : public BFAppFactory<BFAppImpl, Data...> {
            };
            
            template<char Head, char... Tail>
            struct BFAppImpl<Head, Tail...> : public BFAppFactory<BFAppImpl, Head, Tail...> {
                using result = Memory<char, Span<char>, Head, Span<char, Tail...>>;
            };
            
            using BFApp = BFAppImpl<>;


            И течём:
            using output3 = Eval<
                    Input<>,
                    // ++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.
                    decltype(
                        + + + + + + + + ! ++ + + + + ! ++ + + ++
                        + + + ++ + + + ++ + -- -- -- -- - ~ ++ +
                        ++ + ++ - ++ ++ + ! -- ~ -- - ~ ++ ++ *
                        ++ - - - * + + + + + + + * * + + + * ++
                        ++ * -- - * -- * + + + * - - - - - - * -
                        - - - - - - - * ++ ++ + * ++ + + *
                    BFApp{})::result
                >;
                std::cout << "Hello World (wiki): " << SpanToStringContinuous<output3>::value() << std::endl;

            https://wandbox.org/permlink/tj9IUMB5WJ7WTrHu
            Так даже реверсировать программу на BF не надо, просто посимвольно заменить.

            Добрый вечер.
            Ответить
            • Кстати, а зачем ты её переворачивал?
              Ответить
              • Я сначала хотел без буфера сделать, выполняя команды сразу в operatorX(), а унарные операторы справа налево выполняются. Но так не получилось, а push_back() на push_front() (и vector на deque) заменить не догадался.
                Ответить
                • А как циклы без буфера выполнять?
                  Ответить
                  • Да я затупил тогда и перепутал память с программой. Какой анскилл (((
                    Ответить
      • Какой zipper )))
        Ответить
    • Завезли. Пользовательские литералы называется.
      template <char...>
              OutputType operator "" branfuck();
      Ответить
      • Использование: "+++++++++++>["brainfuck;
        Ответить
      • К сожалению, в Стандарт завезли UDL такого вида только для чисел. А вот пропозал с метастроками (литералом с шаблоном template<CharType, CharType...>) ни в «C++17», ни в «C++20» заадопчен не был.
        Ответить
    • Ебать поехавший.
      Ответить
    • @gost, а спать тебе не бывает надо чтоли?
      Ответить
      • С такими бредовыми идеями не спится.
        Ответить
        • Осторожнее с этим:
          http://web.archive.org/web/20190730212526/zhurnal.lib.ru/d/deathwisher/deprivation.shtml

          Из заметки: «Но, конечно, самое интересное это визуальные галлюцинации. В основном, из-за того, что ДС это всё-таки не медикаментозный наркотик, галлюцинации носят ассоциативный характер, в частности, это нарушение (вследствие истощения психико-физиолгических резервов организма) в поступающем по зрительному нерву сигналу, перверсия изображения, среди охотников именуемая "глазной горячкой" - когда глаз видит одно, но из-за нарушения в психике, посылает в мозг сигнал о другом объекте.
          Мои личные закидоны:
          гниющий труп на улице (брезентовый мешок и полиэтиленовые пакеты)
          движущиеся люди в магазине (манекены, стоявшие неподвижно)
          черви в лапше (просто лапша)
          замахивающийся чем-то человек на периферии зрения (никого не было)
          обращающиеся ко мне люди (никто не обращался в действительности)
          моя разлагающаяся рука (тень неудачно упала)
          то же самое с лицом
          плавящаяся в руке авторучка (ничего не было)
          кровь, растекшаяся по поверхности (кусок красной ткани)
          какие-то смутные фигуры в толпе, среди знакомых (никого не было)».
          Ответить
          • Ну это надо как минимум несколько дней подряд не спать чтобы так поехать крышей... От одного дня просто пирфоманс падает.
            Ответить
          • Знакомая хуйня, но до тяжёлых стадий я не доходил. А вот ощущение нереальности и длительные «залипания» на какие-то предметы с непониманием, что это такое, бывали.
            Ответить
            • а на работе как к такому относятся?

              у меня был однажды недолго сотрудник, который за 3 месяца поехал
              Ответить
        • не спиться бы
          Ответить
          • Снится сирени
            Сиреневый сон.
            Снится малине
            Малиновый сон.
            Рябине –—
            Рябиновый снится...
            И только колючке не спится:
            Колючка боится,
            Что сон ей приснится
            Колючий-колючий,
            Как спица.
            Ответить
            • вот уже последний лист осенний
              держится за сук е2-е2
              Ответить
              • Я давно замечал, что много песен про шахматы. Ещё один реальный пример:

                И оркестр укрыт снегом,
                Словно вата, глухим снегом,
                И соната слышна e2-e2.

                Только что это значит? Передумал ходить?
                Ответить
    • показать все, что скрытоvanished
      Ответить
    • Вот до чего отсутствие в языке гомоикон доводит.
      Ответить
    • Пиздец. Такой код я обосрать никак не могу. Переведите на "PHP" сначала.
      Ответить
      • Именно поэтому я за с++.
        Ответить
        • Подтверждаю. Если ревьювер не сможет понять ни единой строчки — то и обосрать у него не получится.
          Ответить
          • Ну да, он ведь не сможет написать "я нихуя не понял", это же удар по самолюбию крестобляди.
            Ответить
          • показать все, что скрытоvanished
            Ответить
            • Ну и зря. Потом не жалуйся, что в коде нихуя не понять. Спросить то о происходящем можно. Или намекнуть, чтобы писали попроще.
              Ответить
              • ничего так не успокаивает на ревью как то что ты уволишься через пару месяцев
                Ответить
          • Поэтому я за методику ревью с помощью метрики "WTF per minute".
            Ответить
            • Не поможет. Метушня вселяет в читателя ужас и он ничего не может произнести пока не закроет код.
              Ответить
              • Просто нужно быть дизайнером высокого левела, чтобы делать спас-бросок на метушню. У меня в прошлой тиме был пожилой чел (один из создателей Erlang HiPE), который метушню в принципе не переносил и заёбывал на смерть любого, кто хоть немного метушился.
                Ответить
                • Не нужно ничего этого. Просто открываешь делфи, садишься поудобнее и код сам собой заскипидариццп
                  Ответить
                • Школа фортрана. Нельзя сказать, что это нормально.

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

                  Давно уже пора шаблонные таблицы уметь делать, живёшь как в каменном веке
                  Ответить
                  • Шаблонные таблицы, это чтобы не копипастить? Можешь дать пример того, как оно должно выглядеть?
                    Ответить
                    • Ну вот у тебя в каждой таблице есть какой-нибудь примари кей, дата вставки и прочая фигня. И ты каждый раз это копипастишь. Вместе с констрейнтами и индексами. А тут хуяк, шоблон параметризовал и течёшь.
                      Ответить
                      • ну расскажи как должно выглядеть то

                        template table foo id(...)
                        table bar:foo
                        так?
                        сейчас в постгре есть наследование таблиц, но Д++ говорит, это харам
                        Ответить
                        • Наследование в рантайме потом превращается в треш. А шаблоны - чистейший препроцессинг, как-будто ты руками накопипастил.
                          Ответить
                          • всё равно не понял как синтаксис должен выглядеть

                            и вообще
                            мне таблицы джанга генерит
                            Ответить
                        • > наследование
                          приведи реальный пример, где тебе оно пригодилось

                          сегодня вот, например, программист, ранее предварительно согласовав вариант с применением наследования в логической иерархии типов, поел говна, напомнив, что наследование это отрыжка (я вчера забыл про такой кейс, когда перечислял, почему наследование это харам)
                          Ответить
                          • Я не про типы. Наследование в ООП это рак.

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

                            Ну вот наш вчерашний разговор про архивы постов: если у поста 10 полей, и есть архив, то было бы удобно использовать что-то, чтобы поля не писались два раза.

                            Другой вопрос, что у наследования есть побочные эффекты, которые (как я понял) перекрывают плюсы
                            Ответить
                            • > много похожих кусков в субд
                              > выносить в отдельные таблицы

                              Джойн на ровном месте? Свалить не связанные друг с другом данные в одну таблицу (шапки постов и шапки комментов, лол)? Нахуй и в пизду. Это реально рак.

                              Наследование - это "является". Т.е. например "чайник" является "товаром". Вот тут, наверное, оно ещё как-то будет работать если ты породишь таблицу чайников от таблицы товаров. Но скорее всего проще какую-нибудь динамическую колонку добавить для таких свойств (json?)
                              Ответить
                              • показать все, что скрытоvanished
                                Ответить
                              • > таблицу чайников от таблицы товаров
                                - малость общих свойств, многость разных
                                Ответить
                                • Ну почему... У всех товаров много общих свойств - название, наличие, цена, габариты, вес и т.п.

                                  А у чайника мощность и объём какие-нибудь в добавок.

                                  Хотя хуйня это всё, конечно. Никто такие детали в структуру базы не тащит походу, задолбаешься таблицы править.

                                  З.Ы. Пусть д++ рассудит.
                                  Ответить
                                  • > Никто такие детали в структуру базы не тащит
                                    Да, я бы тоже наверное не стал добавлять отдельную колонку "вид подошвы", если мой магазин начал бы завтра продавать ботнки
                                    Ответить
                                  • единственно верная схема:
                                    create table goods (
                                      id uuid pk,
                                      good_type enum not null,
                                      ...
                                    );
                                    
                                    create table teapots (
                                      id uuid pk references goods (id) on delete cascade ...,
                                      ...
                                    );
                                    
                                    <now create trigger to delete from goods when deleting from teapots, no orphans needed>
                                    Ответить
                                    • да, тоже бы так сделал
                                      по счастью, удаляются товары редко
                                      Потому что с ними и заказы удаляются, лол
                                      Ответить
                                      • ровно то же самое мы сделали, когда хранили типизированные таски, они порождаются тысячами в день, и вполне себе удаляются, когда полностью исполнены (и сваливаются в архив), тут уж не до "к счастью"
                                        Ответить
                                        • понятно. В джанге тоже очень популярен паттерн, когда ты выносишь доп информацию в отдельную таблицу и делаешь в ней внешний ключ на таблу с "основной" инфорацией.

                                          но да, без триггера никак не гарантировать, что ты не сможешь удалить доп информацию, оставив основную:(

                                          А можно еще пойти дальше, и проверять триггером, что если у тебя тип товара (поле такое) равно "чайник", то у него обязана быть запись именно в чайнике.

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

                                          Я еще видел базу, куда люди ходили исключительно через хранимые процедуры, и эти процедуры гарантировали консистентность, но это адский оверкил
                                          Ответить
                                          • > проверять триггером, что если у тебя тип товара (поле такое) равно "чайник", то у него обязана быть запись именно в чайнике.

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

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

                                            слишком сложно для простой задачи не обосраться на бекенде
                                            Ответить
                                            • да, без деферров никак..

                                              НУ вообще всегда лучше наверное поверх базы иметь бекенд, и пускать в него разные приложения через какойнить RPC, чтобы всю эту логику писать на человеческом языке
                                              Ответить
                              • > Т.е. например "чайник" является "товаром"
                                и именно вот тут постгрес тебе поднасрет, ведь в корзину ты хочешь положить что? товар? т.е. FK на "товар", даже если он "чайник", верно? бугога, обломись, в таблице "товар" нет id=13, хотя он и есть в таблице "чайники"
                                Ответить
                                • ну будет

                                  teapots_info
                                  вид_ручки: ..
                                  item_id: FK to items

                                  Вообще есть мнение, что реляционные СУБД плохо ложатся на ирерахии объектов)
                                  Ответить
                              • >Джойн на ровном месте?
                                нормализация, чувак)

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

                                >Свалить не связанные друг с другом данные в одну таблицу (
                                см пример с архивом
                                Ответить
                            • > чтобы поля не писались два раза
                              для этого идеально, если бы таблица active и archive имели идентичный набор И порядок полей

                              тогда можно в триггере писать
                              insert into archive values (new.*)
                              и течь

                              если в archive есть все поля, что в active, но их может быть больше, и/или порядок хуевый, тогда придется сначала поселектить колонки (с учетом порядка) из information_schema, получить строку вида "id,name,foo,bar" (это несложно), и исполнять уже динамический куери типа
                              execute format($$insert into archive (%s) values ($1.*);$$, col_list) using new;
                              это уже не так красиво выглядит, но всё ещё можно жить

                              а если у тебя набор колонок или семантика уплыла в archive, то, скорее всего, тебе придется руками наебенить по-чесноку, а не писать универсальный триггер

                              но вообще завтра попробую в мичети с наследованием кое-что, посмотрю как будет влиять на порядок полей в дочке, если делать альтер для родительской таблы (думаю, чуда не будет и получится дефрагментация)
                              Ответить
                              • Триггеры это ок, но разве не было бы лучше, если бы в самой БД были для этого удобные средства?

                                >но вообще завтра попробую в мичети с наследованием
                                о, круто)
                                Ответить
                                • > о, круто)
                                  create table common_subset (
                                    foo text
                                  );
                                  
                                  create table one (
                                    id uuid primary key default gen_random_uuid()
                                  ) inherits (common_subset);
                                  
                                  alter table common_subset add column bar text;
                                  
                                  create table two (
                                    id uuid primary key default gen_random_uuid(),
                                    one_id uuid not null references one (id) on delete cascade on update cascade
                                  ) inherits (common_subset);
                                  
                                  select table_name, string_agg(c.column_name, ', ' order by c.ordinal_position) as cols
                                  from information_schema.columns c
                                  where table_name in ('one', 'two')
                                  group by table_name;
                                  
                                  +----------+--------------------+
                                  |table_name|cols                |
                                  +----------+--------------------+
                                  |one       |foo, id, bar        |
                                  |two       |foo, bar, id, one_id|
                                  +----------+--------------------+

                                  как и предполагалось, альтер общего родителя будет вмешиваться в порядок полей, и порядок полей будет зависеть от последовательности, где когда кто был создан (хз как оно должно было бы быть иначе, это ведь база, а не жсон)
                                  Ответить
                                  • Порядок полей это важно?
                                    Ответить
                                    • мой пост выше об этом (про insert new.*, если рекорд идентичен)
                                      это важно, если ты на это хотел бы опираться

                                      но единственный надёжный способ этого добиться - делать иерархию партициями
                                      create table master (<columns and not null constraints here>) partition by <choose relactive/archive criteria>;
                                      create table active (<pk, indices>) partition of master for values default;
                                      create table archive (<pk, indices>) partition of master for values <archive criteria>;

                                      это неплохо работает на проде, но не между несколькими инстансами
                                      Ответить
                              • > в мичети
                                Аллах един!
                                Ответить
                      • показать все, что скрытоvanished
                        Ответить
                        • для каждой таблицы
                          Ответить
                        • При создании новой таблицы. Предлагаешь доверить всё орму, а там нахуевертить метушни средствами языка?
                          Ответить
                          • Давайте срать керпичами от потенциального запрета ESNI

                            https://regulation.gov.ru/projects#npa=108513
                            Ответить
                            • Да похуй, иллюзия безопасности этот ваш ESNI. Только для помоек, где тысячи поддоменов на одном айпи реально что-то меняет.
                              Ответить
                              • Дело не в иллюзии, а в том, что часть сайтов перестанет работаьь
                                Ответить
                                • Ну в браузерах для рашки отключат это расширение, делов то.
                                  Ответить
                                  • а SNI без ESNI заведется в TLS1.3?
                                    Ттогда ок
                                    Ответить
                                    • Дык ESNI - это опять какая-то хуйня с DNS'ом. А раз DNS - явно опциональная. Не будут же все сайты себе запись с ключами лепить.

                                      З.Ы. Кстати, провайдер получается может просто стрипнуть эту запись (е сли не DNSSEC). И всё будет работать прекрасно. И товарищ майор доволен и юзеры.

                                      Остаётся DNSSEC запретить.
                                      Ответить
                                      • стоп

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

                                          Поэтому они тупо привернули ебучий костыль с ключом сервера в DNS.

                                          А самое забавное, что при этом DNS запросы и ответы все прекрасно видят. Т.е. вообще не понятно что скрыть то пытались в этом ESNI.
                                          Ответить
                                          • а почему я не могу дифихельманом ключ сделать?
                                            потом шифрнуть им имя домена
                                            потом послать его
                                            потом получить серт
                                            потом проверить его
                                            ну и дальше поехало
                                            Ответить
                                            • Потому что у тебя нет пруфа, что это реальный сервак а не хакер. А пруф у тебя будет только тогда, когда сервак отдаст тебе серт. А он не может, он не знает какой домен ты хочешь.

                                              Именно поэтому SNI и был реализован плейнтекстом.
                                              Ответить
                                              • >Потому что у тебя нет пруфа, что это реальный сервак а не хакер
                                                а зачем мне такой пруф?

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

                                                напомни, как работает IKE в IPSec? Там разве не DH сначала, а потом уже аутентификация по серту?
                                                Ответить
                                                • > а зачем мне такой пруф?

                                                  Потому что ты ссышь отправить имя домена открытым текстом! А без пруфа ты его отправишь прямо в лапы хакера, с которым согласовал ключ. А дальше он тебя тупо дропнет.

                                                  Ну т.е. твоя схема для защиты SNI не защищает от раскрытия SNI.

                                                  Ты думаешь чуваки реально от хорошей жизни попёрлись в DNS ключи добавлять?
                                                  Ответить
                                                  • Спуфнуть адрес сложнее, чем запустить tcpdump и читать все доменные имена, разве нет?
                                                    Если спуфать каждый мой запрос -- никаких цпу не хватит, пользователей же охулион. А читать плейнтекст легко

                                                    >Ты думаешь чуваки реально от хорошей жизни попёрлись в DNS ключи добавлять?

                                                    Я пытался понять, почему они не сделали через DH. Ну вот твой аргумент мне понятен: от спуфа это не спасет (а от снифа спасет)
                                                    Ответить
                                                    • > от снифа спасет

                                                      В гипотетической ситуации, когда ты вписал маппинг домена на айпишку себе в hosts (чтобы не делать DNS запрос), а на серваке тыща разных доменов крутится (т.е. по айпишке домен не узнать)?

                                                      Блин, я параноик но я реально не вижу никакой проблемы в открытом SNI.
                                                      Ответить
                                                      • проблема очень простая: добрый дядя решил забанить govnokod.ru за пропаганду стертеризма.

                                                        С ESNI ему сделать это будет трудно
                                                        А со SNI -- нет
                                                        Ответить
                                                        • В случае с SNI он забанит один сайт. В случае с ESNI он забанит весь айпишник. Вот и вся разница. И кому лучше стало?

                                                          З.Ы. Уже проходили со всякими ЖЖ экстремистов, серваки целиком только так отлетали, тогда более тонкий бан по SNI ещё никто не умел.
                                                          Ответить
                                                          • > В случае с ESNI он забанит весь айпишник.
                                                            ну пускай он забанит мне ALB* в AWS, лол) Потом у людей будет jupyter.org не открываться

                                                            *это такой лоад балансер -- фронтэнд, где терминируется HTTPS, им управляет AWS, а дальше он идет на мою виртуалку по внутреннему IP уже плейнтекстом.
                                                            Причем AWS может поменять IP не ставя меня в известность, и DNS сам проапдрейтить
                                                            Ответить
                                                            • Да в общем-то решение для провайдера я выше описал - прочистить DNS от всякого лишнего мусора типа "DNSSEC" и "ESNI", тогда браузеры будут честно отправлять SNI и можно ковровых банов избежать.

                                                              З.Ы. А всякие восьмёрки просто забанить. Ибо нехуй.
                                                              Ответить
                                                              • я анскильный, и думал, что ESNI сначала делает ключ по DH.
                                                                Если он его всегда по DNS делает, то да: проще фильтровать DNS.
                                                                Даже если у меня он 8.8.8.8, то он же плейнтекстовый
                                                                Ответить
                                                • > IKE

                                                  Не помню, если честно.
                                                  Ответить
                                                  • https://community.cisco.com/legacyfs/online/legacy/4/0/2/166204-Screen%20Shot%202013-11-12%20at%2010.52.38%20AM.png


                                                    сначала DH и темпоральные ключи
                                                    А потом уже поверх auth

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

    Добавить комментарий