Кресты / Говнокод #26913 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 gost, (Updated )

Комментарии (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) заменить не догадался.
              Ответить
                • Да я затупил тогда и перепутал память с программой. Какой анскилл (((
                  Ответить
  • Завезли. Пользовательские литералы называется.
    template <char...>
            OutputType operator "" branfuck();
    Ответить
    • К сожалению, в Стандарт завезли UDL такого вида только для чисел. А вот пропозал с метастроками (литералом с шаблоном template<CharType, CharType...>) ни в «C++17», ни в «C++20» заадопчен не был.
      Ответить
      • Осторожнее с этим:
        http://web.archive.org/web/20190730212526/zhurnal.lib.ru/d/deathwisher/deprivation.shtml

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

                                З.Ы. Пусть д++ рассудит.
                                Ответить
                                • > Никто такие детали в структуру базы не тащит
                                  Да, я бы тоже наверное не стал добавлять отдельную колонку "вид подошвы", если мой магазин начал бы завтра продавать ботнки
                                  Ответить
                                • единственно верная схема:
                                  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>;

                                    это неплохо работает на проде, но не между несколькими инстансами
                                    Ответить
                      • При создании новой таблицы. Предлагаешь доверить всё орму, а там нахуевертить метушни средствами языка?
                        Ответить
                          • Да похуй, иллюзия безопасности этот ваш ESNI. Только для помоек, где тысячи поддоменов на одном айпи реально что-то меняет.
                            Ответить
                              • Ну в браузерах для рашки отключат это расширение, делов то.
                                Ответить
                                  • Дык 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, то он же плейнтекстовый
                                                              Ответить
                • При чём тут фортран, лол. Подход в том, что если язык позволяет мутить абстракции без метушни (а динамические языки это как правило легко позволяют), то нечего её использовать.
                  Ответить
                  • >мутить
                    А мутить как? А то вот некоторые языки позволяют мутить абстракции копи-пастом, и пусть бы лучше они умели метушню
                    Ответить
                  • в жсе есть мнение что лучше писать мономорфный код а не ебаться с динамикой пушо больше шансов что оптимизируется во что-то путное
                    в других языках не так?
                    Ответить

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

Переведи на "PHP", guest!

    А не использовать ли нам bbcode?


    8