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

    +1

    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
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    // https://godbolt.org/z/QAR_nT
    // https://govnokod.ru/26701#comment550329
    #include <cstddef>
    #include <string>
    #include <cassert>
    
    
    struct assert_failure
    {
        explicit assert_failure(const char *sz)
        {
            std::fprintf(stderr, "Assertion failure: %s\n", sz);
            std::quick_exit(EXIT_FAILURE);
        }
    };
    
    // эта херня не совсем корректно будет обрабатывать всякую хрень вроде ", , , " - оно это посчитает за 4 аргумента,
    // и если считать " скобочки, тогда еще надо запилить обработку эскейп-последовательности, для хуйни типа "pidor\" govno"
    // но мне лень эту хуйню допиливать.
    constexpr std::size_t count_args(const char *s, std::size_t depth = 0, std::size_t pos = 0, std::size_t count = 0)
    {
      if (s[pos] == '\0'){
        if(depth != 0)
          throw assert_failure("kakoi bagor)))\n");
        if(pos == 0)
          return 0;
        return count+1;
      }
      else if(s[pos] == '{')
      {
        return count_args(s, depth + 1, pos + 1, count);
      }
      else if(s[pos] == '}')
      {
        if(depth == 0)
          throw assert_failure("kakoi bagor)))\n");
        return count_args(s, depth - 1, pos + 1, count);
      }
      else if(depth == 0)
      {
        if(s[pos] == ',')
        {
          return count_args(s, depth, pos + 1,  count + 1);
        }
      }
      return count_args(s, depth, pos+1,  count); 
    }
    
    #define TO_STR(...) #__VA_ARGS__
    #define ARGNUM(...) count_args(TO_STR(__VA_ARGS__))
    
    #define krestogovnotypeof(a) std::remove_reference<a>::type
    
    #define FOR_RANGE(type, varname, ...) for(struct {size_t cnt; krestogovnotypeof(type) arr[ ARGNUM(__VA_ARGS__)  ];  } varname = {0, {__VA_ARGS__}}; varname.cnt < sizeof(varname.arr)/sizeof(type); ++varname.cnt )
    
    int main(void)
    {
      FOR_RANGE(int[2], k, {1,2}, {3,4}, {5,6}, {7,8})
        printf("{%d %d},\n", k.arr[k.cnt][0], k.arr[k.cnt][1]);
      return EXIT_SUCCESS;
    }

    Какая крестопараша((( В вижуальхуюдии вроде собирается, но проверить корректность работы не могу. Как вы этим днищекомпилятором вообще пользуетесь?

    Было б круто, если бы были такие constexpr функции, которые в компилтайме могут куски исходного кода высирать как бы прямо в исходник, и потом уже чтоб это компилировалось

    Запостил: j123123, 29 Мая 2020

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

    • Кто-нибудь пробовал на этих констэкспрах парсер крестокода писать вообще?
      Ответить
    • А D умеет код высерать в компайлтайме прямо в исходник.
      Ответить
      • Вот да, надо с сишки на D в режиме better-C переходить (чтоб без GC и жирного рантайма). И через это компилтайм-высирание запилить всю хуйню, которая нужна. А крестоговно закопать нахуй
        Ответить
        • > с сишки на D переходить
          >чтоб без GC и жирного рантайма
          >>на D переходить
          >>без GC

          Ха-ха-ха.

          >D has built-in types that may be difficult to use without the GC: exceptions, strings, dynamic arrays, associative arrays, and delegate closures.

          Вот потому D не взлетел и люди до сих пор пишут на крестах.

          https://wiki.dlang.org/Memory_Management
          Ответить
          • Мы уже обсуждали атрибут @nogc:
            https://govnokod.ru/26609#comment545801

            @nogc void foo()
            {
                auto a = ['a']; // это не скомпилируется, т. к. литерал массива выделяется в памяти, контролируемой gc
                auto aa = ["x":1]; // см. выше
                a.length = 1; // это не скомпилируется, т. к. ресайз может позвать мусоросборщик
                a = a ~ a; // это не скомпилируется, потому что конкатенация вызывает реаллокацию
                a ~= 'c'; // см. выше
            
                aa["abc"] = 0; // это не скомпилируется, потому что добавление ключа в ассоциативный массив вызовет реаллокацию
            
                auto p = new int;  // нью тоже нельзя
            }

            Итого: массивы через литерал создавать нельзя; new нельзя; конкатенацию нельзя; добавить ключ в ассоциативный массив нельзя; вообще всё, что изменяет размер массива, нельзя.
            Ответить
            • Спасибо за линк.
              Примерно как я и думал: превращает все базовые вещи в неюзабельное говно.
              Типа, хуле вы тут со своими умными указателями, RAII — назад в каменный век.
              Ответить
              • RAII и в better C есть
                https://dlang.org/spec/betterc.html
                > RAII (yes, it can work without exceptions)

                Умные указатели это вообще тупая херня с рефкаунтером, которую можно и на сишке реализовать какими-то костылями, а на D так тем более.
                Ответить
                • Да, только половина стандартной либы (строки, массивы, мапы) нахуй сломалась.

                  Всё хорошо прекрасная маркиза.
                  Ответить
                  • «writeln» в «D» тоже без gc не работает. Нужно импортировать сишный «printf» или использовать ещё какую-нибудь стороннюю библиотеку.
                    Ответить
                    • Какой импорт )))
                      Ответить
                    • Они ещё особо хвастаются этими тремя фичами.

                      D offers several capabilities built in to the core language that are implemented as libraries in other languages such as C++:

                      * Dynamic Arrays
                      * Strings
                      * Associative Arrays


                      Только вот в С++ всё работает без ГЦушни.

                      https://dlang.org/articles/builtin.html

                      Сама ссылка достаточно забавна.
                      Поскольку полностью повторят тезис Царя об универсальной, минимальной необходимой и достаточной структуре данных — массиве.

                      Strings

                      C++ has, of course, builtin string support in the form of string literals and char arrays. It's just that they suffer from all the weaknesses of C++ builtin arrays.

                      But after all, what is a string if not an array of characters? If the builtin array problems are fixed, doesn't that resolve the string problems as well? It does. It seems odd at first that D doesn't have a string class, but since manipulating strings is nothing more than manipulating arrays of characters, if arrays work, there's nothing a class adds to it.
                      Ответить
                      • Интересно, можно ли переписать стандартную библиотеку на обычный аллокатор без gc. Правда, поскольку поддержки RAII нет, придётся по коду аккуратно рассовывать вызовы деаллокатора.
                        Ответить
                        • В теории можно написать код без референс циклов: тогда он будет совместим и с референс каунтингом, и с вонючим анскильным ненужным говном ГЦ.

                          Но тогда придется делать слабые ссылки, и тупые гцбляди не смогут своим одноклеточным мозгоМ понять: зачем
                          Ответить
          • > D has built-in types that may be difficult to use without the GC: exceptions, strings, dynamic arrays, associative arrays, and delegate closures.

            В режиме better c этой хуйни нет. https://dlang.org/spec/betterc.html
            Эксепшены вообще говно, ассоциативные массивы, строки и динамические массивы - это вообще и на Си можно сделать, значит можно и в better C режиме на D. А что такое "delegate closures" - вообще хуй знает, похоже что какая-то питушня ненужная, так что нахуй ее.

            Ну и еще как вариант есть Rust, в котором изначально нет никакого GC, только RAII
            Ответить
            • >Ну ассоциативные массивы, строки и динамические массивы - это вообще и на Си можно сделать
              Нахуй тогда супер-навороченный язык чтобы потом изобретать свои велосипеды?
              В 2к20 такое должно быть из коробки.

              >как вариант есть Rust, в котором изначально нет никакого GC, только RAII
              Царь мало сектантов разъёбывал?
              Ответить
              • > Нахуй тогда супер-навороченный язык чтобы потом изобретать свои велосипеды?

                Ну а в чем проблема-то? Напишешь один раз свои велосипеды, выложишь в гитхаб - если велосипеды получатся качественными - будут твоими велосипедами еще пользоваться другие.
                Ответить
                • Почему на Сишке за триллион лет так и не были написаны качественные макросные велосипеды для FOR_EACH, std::tie, std::array и прочих ништяков доступных в крестах?
                  Ответить
                  • > Почему на Сишке за триллион лет так и не были написаны качественные макросные велосипеды для FOR_EACH, std::tie, std::array и прочих ништяков доступных в крестах?

                    Потому что макроговном эта хуйня нормально не решается.
                    Ответить
                • Если ЯВУ существует более 10 лет и ещё не оброс инфраструктурой, мясом из годных либ и стандартной библиотекой.
                  А ради элементарных, базовых вещей нужно городить велосипеды и собирать говняшки по гитхабу.
                  Тогда вопрос: нахуя такой язык вообще нужен?
                  Ответить
                  • > Если ЯВУ существует более 10 лет и ещё не оброс инфраструктурой, мясом из годных либ и стандартной библиотекой.
                    > А ради элементарных, базовых вещей нужно городить велосипеды и собирать говняшки по гитхабу.

                    Вот да, почему мне надо собирать говняшки по гитхабу, чтобы в крестоговне кроссплатформенно создать банальное окошко и отобразить в нем какой-нибудь jpg файл? Или кроссплатформенно отправить UDP пакет? Или воспроизвести такой-то звук из wav файла? Распарсить XML? Работать с UTF8?
                    Почему? Почему?
                    Ответить
                    • Именно поэтому я за «PHP».
                      Ответить
                    • да-да, из этой вашей сишечки даже сообщение в твиттер не отпрравить

                      си не нужен
                      Ответить
                    • Но зато в крестоговне есть функция Бесселя.
                      Зачем? Зачем?
                      Ответить
              • Как будто на плюсах драйверописатели не переизобретают stl. Им видите ли эксепшоны не нравятся. Так что плюсы тоже пованивают
                Ответить
            • Это не режим «better C», это режим «питушня».

              В попытках примазаться к тренду отбросами был сделан «режим как Сишка», но лучше.

              Очевидно, что сваять на Dовне ничего нельзя - поэтому приходится воровать.

              Что потом отребье могло всем сообщить «дак я же как Сишка».

              Nearly the full language remains available. Highlights include:

              Unrestricted use of compile-time features
              Full metaprogramming facilities
              Nested functions, nested structs, delegates and lambdas
              Member functions, constructors, destructors, operating overloading, etc.
              The full module system
              Array slicing, and array bounds checking
              RAII (yes, it can work without exceptions)
              scope(exit)
              Memory safety protections
              Interfacing with C++
              COM classes and C++ classes

              То есть опять оглядка на Сишку и С++.
              Ответить
              • Приведи реальный пример языка, претендующего на замену C и/или C++, но при этом чтоб там было без оглядки на C и/или C++.

                Сделан ли автомобиль с оглядкой на карету? Нужно ли делать автомобили без оглядки на кареты? Зачем?
                Ответить
                • Но подожди, обезьяна бездарная. Ты ведь родила именно что валидную карету. И тут мы приходим к тому, о чём я уже говорил. Автомобиле-сектант это в 95% мразь, а в 5% просто обманутый/неразобравшийся человек. Почему же? Что такое говноавтомобильное колесо? Это ворованное каретное колесо, которое приделано к оси. Обезьяна просто насрала на чертеж рандомными линиями, которые она спастила из каких-то чертежей. Хотя до сих пор не выяснено откуда именно было паста. Концепция явно ворована из кареты(потому как там всё воровано из кареты).

                  Очевидно, тут мы замечает то, что дизайн этого говна бездарного - типичная хуита. Потому обезьяны начнут прикручивать к этому говну электродвинатель и прочее. Но, очевидно, что в нормальном транспорте кони быть должны.
                  Ответить
                  • Девиации на фоне паники? Не нужно прикручивать к говну электродвигателей, смойте его в канализацию.
                    Ответить
                • Эволюция хипстерских недоязычков
                  1. Мы сделали новый модный %lang_name.
                  2. Давайте все программировать на %lang_name!
                  3. Вы ещё не используете %lang_name? Только %lang_name. Пишите на %lang_name. Смотрите как удобно.
                  4. Настало время %lang_name. %lang_name сам себя не напишет. Напиши на %lang_name, напиши ещё раз.
                  5. У нас есть привязки к интерфейсам и классам С++.
                  6. Почему никто по-прежнему не хочет писать на %lang_name?
                  7. У нас есть режим «как в Сишке».
                  8. ...
                  9. Сектанты забыли про %lang_name и форсят новый баззворд (питуха).
                  10. Про %lang_name при случае вспоминают только олдфаги и маргиналы.
                  Ответить
                  • Очень жду, когда js и python отправятся в пункт 9, к руби и пр
                    Ответить
                    • Я тоже верю, что останется только один язык. И что это будут мутировавшие плюсы, куда стащят фичи из всех языков. И без докторской степени в пердолинге в разрабы брать не будут
                      Ответить
                      • не знаю на счет С++, но точно знаю, что всякая скриптопараша и гц-параша не нужна

                        Место джавы, джс, питона, и прочих пхп там же, где и VB: на помойке
                        Ответить
                        • Толсто. На чём тогда прототипировать и реализовывать небольшие проекты?
                          Ответить
                          • На C#-скрипте:
                            https://govnokod.ru/25353#comment457685
                            Ответить
                          • На свифте, например.
                            Там референс каунтинг, но сам язык при этом не такое запутанное сложное говнецо как плюсы
                            Ответить
                            • А в питоне разве не референс каунтинг
                              Ответить
                            • > На свифте
                              - а главное - кроссплатформенно!

                              Языку всего 6 лет в продакшене, уже кстати нормально хуевертят, через пару годков тоже можно будет фрактал плохого дизайна писать.
                              Ответить
                              • https://swift.org/download/
                                https://swiftforwindows.github.io/
                                что не так?

                                расскажи плохое про свифт, кстати
                                Ответить
                                • А что так? Где винда? Да даже если и была винда (и вроде как в обозримом будущем будет), то кроссплатформенный гуй не попишешь. Рантайма ObjC, насколько я знаю, в свифте за пределами мака нет, поправь, если пизжу. В качестве IDE предлагают VS Code. SPM дикая трешевая херня.

                                  > расскажи плохое про свифт, кстати
                                  - ок, вот из недавно прочитанного. Не так давно в язык завезли property wrapper, которые можно охарактеризовать как весьма куцую реализацию паттерна декоратор.

                                  Правда, выяснилось, что с коллекциями они работают не очень.

                                  https://www.donnywals.com/why-your-atomic-property-wrapper-doesnt-work-for-collection-types/

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

                                  При этом яббл придумал семантическое разделение на value types и reference types, но, чтобы тебе было удобно, в замыкание по умолчанию и те и другие захватываются по ссылке.
                                  Ответить
                                • Сорян, чот вторую ссылку не так сначала прочитал.

                                  Но это в любом случае какое-то говно, которое уже два года не обновлялось, плюс сам Яббл не имеет никакого отношения к этому проекту. Там исходники надо в какой-то недотулзе компилировать, лол
                                  Ответить
                                  • У скриптушни тоже с виндой далеко не всегда ОК.

                                    Кто-то собиарется цигвином или мингвином, кого-то собирает коммерческая компания итд.
                                    Ответить
              • Именно поэтому я за «PHP».
                Ответить
    • Вот пример либы для парсинга и генерации кода для Protobuf https://code.dlang.org/packages/dproto
      Ответить
    • > куски исходного кода высирать как бы прямо в исходник

      Есть пропозал про метаклассы, там как раз предлагались компайл-тайм рефлексия и компайл-тайм оператор для высирания блоков кода.
      Ответить
      • Кстати, я думаю, что это
        #define krestogovnotypeof(a) std::remove_reference<a>::type


        Хуйня какая-то. Мне не нужно никакого remove_reference. Я лишь хочу, что если будет говно типа

        krestogovnotypeof(char [3]) some_shit[2] = {{1,2,5}, {3,4,6}};

        то это было то же, что и
        char someshit[2][3]  = {{1,2,5}, {3,4,6}};


        Я думал что можно как-то так
        decltype(char [3]) a[2] = {{1,2,5}, {3,4,6}};

        но это говно так не работает
        Ответить
        • И кстати, такая хуйня
          BOOST_TYPEOF(char [3]) a[2] = {{1,2,5}, {3,4,6}};

          тоже нихуя не работает. Говно этот ваш буст
          Ответить
        • std::type_identity<char[3]>::type если у тебя с++20. Проще вроде никак, парсеропроблемы, в этом месте перед some_shit[2] имя типа ожидается а не составная хуета.
          Ответить
          • КРЕСТОБЛЯДИ СОСНУЛИ

            То ли дело "Си".
            Ответить
            • Да в общем-то нет. Тут как раз сишкобляди натащили на ботинках сишных массивов и макросов, а потом жалуются, что воняет.
              Ответить
              • Перевёл на "Си" вс1 говно выше:
                typeof(char[3]) a[2]
                Ответить
                • На GNU C. Или это уже в стандарт втащили?
                  Ответить
                  • Конпеляторы не поддерживающие GNU C нинужны.

                    Хотят в C2x втащить.
                    Ответить
                    • Гнусь не нужна. Я за Стандарт и портируемость.
                      Ответить
                      • Пошёл нахуй с моей ветки, гандон.
                        Ответить
                        • Пошёл нахуй с моих макрофагов, гандон.
                          Ответить
                          • Пошёл на С++ с моих гнутых расширений, крестоблядь.
                            Ответить
                    • лолшто? как там со столманновскими поделками в вижалси? а в ллвм как?
                      Ответить
                      • Я же сказал, нинужны.
                        Ответить
                        • а,понятно, то-есть ios, mac os и windows не нужны
                          ок
                          Ответить
                          • Под «Windows» можно компилировать в «MinGW».
                            Ответить
                            • Не нужен.
                              Ответить
                              • Твой коммент расстраивает рубин
                                И клубничный жемчуг
                                Ответить
                                • А вдруг он за «Железный рубин» и за «Активный жемчуг»?
                                  Ответить
                                  • железный рубин не нужен, как и железный питон (он вообще сломан).

                                    Под Каркас Точка Сеть (точнее говоря, под Общую Языковую Времени Выполнения) лучше писать на таких языках, как Жулик Си.
                                    Ответить
                          • Lf/
                            Ответить
                      • Кстати шланг кое-что из гну поддерживает, тупеоф в том числе.
                        Ответить
          • А можно ли сделать хуйню, которая б для случая типа
            char some_var[3];
            MY_TYPEOF(some_var) a[2] = {{1,2,5}, {3,4,6}};

            и для случая
            MY_TYPEOF(char [3]) a[2] = {{1,2,5}, {3,4,6}};

            работала?
            Ответить
            • Я думаю нет. А зачем? Если ты не макрос пишешь, то этой проблемы с оборачиванием char[3] во что-нибудь просто нет т.к. у этого типа есть имя.
              Ответить
              • Очевидно - чтоб полностью заменить им гнутый typeof(), ничего не переделывая в коде.
                Ответить
        • А в D работает так:
          char[2] c;
          typeof(c)[3] a = [['a','b'],['c','d'],['e','f']];

          Но тип передать нельзя typeof(char[2]) ибо нефиг. Если знаешь тип, то используй его.
          Ответить
    • тебе в джаву, подключаться к annotation processing
      Ответить
    • А я слышал, что за такие штуки
      #define FOR_RANGE(type, varname, ...)
      в крестокоде
      автору ссут в рот

      это правда?
      Ответить
    • А вообще, почему работа с типами в крестах это такое говно? std::add_const, add_cv, add_volatile, add_lvalue_reference, add_ещекакаятохрень, потом еще remove_const, remove_cv ... что это за поебень вообще? Почему б не сделать, чтобы эту типохерню можно было обходить как некое дерево, и произвольным образом его читать-переписывать, конструируя новые типы через какое-то constexpr-подобное говно?
      Ответить
      • А зачем?
        Ответить
        • Например, чтоб проверить в компилтайме, что какая-то херня (структура) содержит или не содержит какие-то константные или volatile поля, чтоб на основании этого отказаться эту херню компилировать. Например, чтоб проверить, что некая структура не содержит внутри переменных с типом "указатель" и опять таки на основе этого отказаться это компилировать. Можно и другие применения придумать.
          Ответить
          • Ну так это рефлексия, к перечисленным std:: она имеет весьма опосредственное отношение. «Обходом этой типохерни» ты поля структуры никак не получишь.
            И что такого плохого в <add/remove>_const/volatile/<lvalue/rvalue>_reference? По-моему, весьма очевидные метафункции. Разве что «cv» — менее понятный сахарок для «const, volatile».
            Ответить
            • > И что такого плохого в <add/remove>_const/volatile/<lvalue/rvalue>_reference? По-моему, весьма очевидные метафункции. Разве что «cv» — менее понятный сахарок для «const, volatile».

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

            > Можно сконструировать класс, который точно такой же, как и вот тот, но только вот этого публичного метода там нет.
            Звучит как какая-то генератушня.
            Ответить
            • > «Концепты» уже завезли, там в точности это и можно делать.

              А нахуя это делать этими ко-ко-концептами? Почему б не сделать компилтайм обход типов структур как дерева, с возможностью синтеза нового типа таким образом?
              Ответить
              • А нахуя это делать обходом типов структур как дерева с возможностью синтеза, когда можно просто написать «requires { hui.getLength(); } -> int» и потечь*?
                Это же примерно как предложение принимать Object и лезть ручками лезть в дерево наследования, проверяя, реализует ли переданный объект нужный интерфейсу.

                Ну ладно, ладно, крестокомитет как всегда сделал говно; представим, что мы можем написать «requires has_method(hui, getLength, int)»
                Ответить
                • > А нахуя это делать обходом типов структур как дерева с возможностью синтеза, когда можно просто написать «requires { hui.getLength(); } -> int» и потечь*?

                  Это слишком органиченная петушня, но даже она, как ты правильно заметил в примечании, в крестоговне не реализована.
                  Ответить
                  • У концептов очень прозаичная суть на самом деле. Всех заебала утиная типизация в шаблонах и километровые портянки ошибок. Вот и решили добавить немного типизации чтобы ты получал "a - не контейнер" вместо "вот тебе 100500 вариантов всякой хуйни и причины почему они не подошли". Всё, больше никаких задач они не решают.
                    Ответить
        • Например, в сетевой либе на D можно отдать в шаблонную функцию класс, где она прочитает все его методы, создав роуты для хттп сервера с проверкой аргументов https://vibed.org/api/vibe.web.web/registerWebInterface

          Либо создать привязку структуры из кода к результату запроса из базы одним вызовом функции https://code.dlang.org/packages/sqlite3

          Зато в плюсах как и в джаве придется писать тонны бойлерплейта и позориться с макросами
          Ответить
          • И сколько http-траффика за последние 10 лет вызвано кодом, написанным на плюсах и жабе?
            А сколько кодом на D?
            Ответить
            • И сколько на «PHP»?
              Ответить
              • Вот-вот.
                D-отбросы только хвалятся какой у них охуенный язык, пока ПХПшники стиснув зубы делают всю грязную работу.
                Именно поэтому за «PHP».
                Ответить
                • Я ещё раз напоминаю, что на "PHP" написаны такие крупнейшие проекты, как "ВКонтакте", "Facebook", "Wikipedia" и "Авито".
                  Ответить
          • > // automatically mapped to: POST /logout
            > void postLogout()
            Такое говнище и на джаве можно написать.
            Обойти все методы рефлектором и подвязать нужные к нужным ссылкам.
            Возможно в некоторых rest-фреймворках так и реализовано.
            Автовайринг параметров (https://www.baeldung.com/spring-request-param) вон работает по именам переменных.

            > // automatically mapped to: GET /profile
            > void getProfile()
            Кстати неявная магическая питушня, не слишком неочевидная.
            Ответить
            • > Такое говнище и на джаве можно написать.
              А на крестопарашном дерьме это написать можно?
              Ответить
              • Но зачем?
                Ответить
                • Да, зачем. Джава-макакам платят же за кол-во классов и файлов.
                  Ответить
                  • Это правда.

                    Зачем решать задачу в один класс, если можно в восемь?
                    Ответить
                    • Верно, не время решать какие бы то ни было задачи. Но самое время лечь в гроб и лежать там тихо, дожидаясь своего часа.
                      Ответить
            • Что в ней неявного, анскилябр? Открой код и почитай. Или доку.
              Ответить
              • То, что можно залететь как в том же PHP случайно опубликовав то, что не надо было публиковать.

                Именно поэтому я против getProfile().
                Ответить
                • плюсану

                  у жабоебов есть аннотации, почему не использовать их?
                  Ответить
                  • У жабоёбов многие аннотации работают хитро, написал:
                    @WebPituz 
                    class Bagor
                    Процессор аннотаций неявно возьмёт имя класса, но всегда можно написать явно:
                    @WebPituz (name="anotherBagor")
                    class Bagor


                    Или допустим @RequestParam
                    getKoko(@RequestParam int pituzId) //name берётся из имени аргумента
                    // аналогично такому:
                    getKoko(@RequestParam(name="pituzId") int pituzId)

                    https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/bind/annotation/RequestParam.html
                    Ответить
                  • > у жабоебов есть аннотации, почему не использовать их?

                    Это всё полумеры. Никакие жабовские питухации не заменят нормальной гомоиконности, где код как данные, который можно в компилтайме анализировать как дерево и переписывать.
                    Ответить
                    • Кстати а что такое эти аннотации в джаве? Вот в D они называются атрибутами и это просто структуры, значения которых видны в компайлтайме.
                      Ответить
                      • Просто структурки, значения которых видны плагинам конпелятора и иногда рантайму, насколько я помню.
                        Ответить
                      • видны и в комплайн тайме и в рантайме в зависимости от ретеншн
                        https://www.java2novice.com/java-annotations/retention-policy/
                        могут и чисто в сырцах быть доступны если они тока ради доки
                        Ответить
                    • Ну вот кстати джава гомоиконна получается? Ты можешь на джаве написать плагин к конпелятору джавы, который бегает по дереву, читает аннотации, переписывает что-то, срёт байткодом и т.п.
                      Ответить
                      • Плагин к компилятору? В D можно только создавать новый код, но не модифицировать текущий.
                        Ответить
                        • Annotation Processor - это просто класс, который подгружается в конпелятор на определенной фазе конпеляции и имеет доступ к AST.

                          Та самая гомоиконщина, о которой мечтает j123123.

                          К сожалению я их не писал ни разу, поэтому не знаю что они реально могут с этим AST сделать.
                          Ответить
                          • > Та самая гомоиконщина, о которой мечтает j123123.

                            В самой жабе синтаксис негомоиконен (не является фактически человекочитаемым представлением AST) - будет скорее всего хуйня какая-то с его чтением-редактированием.

                            Да и там же еще GC с жирным рантаймом, так что по любому это говно в пролете
                            Ответить
                            • Именно по этому я за XSLT.
                              Любую программу на XSLT можно представить как данные для программы на XSLT
                              Ответить
                      • Вам в груви
                        https://groovy-lang.org/metaprogramming.html#_code_generation_tr ansformations
                        Ответить
                • Ну это зависит от рукожопства. Сделай отдельный интерфейс с нужными публичными методами, реализацию в WebService и вызови registerWebInterface на этом интерфейсе.
                  router.registerWebInterface!MyInterface( new WebService);
                  Ответить
                  • > сделай

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

                        А вот в D же всяко есть какие-нибудь аннотации чтобы явно пометить метод как доступный по хттп. А не по скриптушиному угадывать это из имён.
                        Ответить
                        • Конечно есть. Да и простую регистрацию в роутере никто не отменял.
                          Но да, можно опубликовать чего лишнего случайно.
                          Ответить
                      • мой вариант на плюсах это кодогенерация
                        Ответить
                  • >Сделай отдельный интерфейс с нужными публичными методами, реализацию в WebService и вызови registerWebInterface на этом интерфейсе.

                    Кто-то рассказывал про борьбу с бойлерплейтом.
                    А в итоге предлагается бойлерплейт куда больший, чем явная расстановка аннотаций или ручная подвязка кобенаций http-метод+путь к указателям на нужные функции.
                    Ответить
                • >То, что можно залететь как в том же PHP случайно опубликовав то, что не надо было публиковать.

                  А приватной питушнёй это не фиксится?
                  Ответить
                  • ну офигеть теперь

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

                      > у меня случайно в контроллере оказался метод getFoo()
                      Я и предлагаю: бубликовать в вёб только бубличные методы, а приватами не светитить.
                      Ответить
                      • Предлагаю добавить в язык http public
                        Ответить
                      • А доки мы читаем жопой. Первая строчка "Each public method of the given class instance will be mapped to a HTTP route."
                        Ответить
                        • Дык один чел унаследовал, второй опубликовал, а третий getFoo() добавил. Доку читал только второй по очевидной причине.

                          Архитектура - хуйня. Хрупкая очень. Не хотите учиться на опыте ПХП - ну ваше право, только не жалуйтесь потом что поломали.
                          Ответить
                          • Архитектура чего? Одной функции? Напиши свою, она простая.
                            В данном случае лучший вариант - это описать интерфейс, который потом будет зареган.
                            И вообще это хорошая практика даже в плюсах - разные интерфейсы разным пользователям.
                            Ответить
                            • Архитектура которая "все паблик методы класса" отправляет в хттп блин. Сколько на этом уже пхпшных cms'ок погорело.
                              Ответить
                            • З.Ы. Говно остаётся говном, как ты не обмазывай его хорошими практиками.

                              Разложили грабли на ровном месте и выдумываете как их обойти.
                              Ответить
                          • классы должны быть финальные

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

                        да, говно, но я в процессе рефакторирнга как раз
                        что мне делать?
                        Ответить
                        • Написать отдельный интерфейс, чтобы лишнее не попало
                          Ответить
    • Кстати на хабре свежее мясо подвезли для нелюбителя раста и systemd:
      "Долгое время Rust позиционировался исключительно как язык для системного программирования." https://habr.com/ru/post/504622/
      "Десять лет назад был анонсирован systemd, который устроил революцию в управлении системой..." https://habr.com/ru/post/503816/
      Ответить
      • systemd переписывают на rust?
        Ответить
        • да нет, там опять унылый пиздеж про то, как все оказывается мучались с sysvinit от того, что там порядок надо было цифрами указывать.

          В примерах опять наверное будет долбоёб, у которого sendmail запустился до bind, и чото там не смог порезолвить в момент запуска.

          Поттеринг решил проблему, которая не являлась проблемой.

          Тыж админил прыщи во времена sysvinit? Помнишь bsd-like скрипты на slackware? Сильно ты страдал?
          Ответить
          • > сильно ты страдал

            Да нет, это лучшие годы были. Более простых и понятных скриптов я со времён слаки не видел.
            Ответить
            • То-то и оно.

              Двадцать лет назад прыщи были тупые как три копейки, и в этом была их прелесть. Скрипты на баш и текстовые файлы кругом. Самое сложное место было в устройстве .deb и .rpm пакетов.

              Теперь у нас питушня уровня если не винды, так Solaris SMF точно по сложности.
              Логи надо читать через спец утилиту.
              Логи. Не текстовые. На юникс. Пиздец. Здравствуй ``RegisterEventSource`` родной, здравствуйте Message Files.
              Настройку сервиса systemctl делает через d-bus.
              Чтобы включить/выключить сервис на прыщах нужен демон с сетевым протоколом. Это даже круче SMF с его xml файлами.

              Начинаешь на bsd с их RC скриптами смотреть с нежностью.

              К сожалению, единственный дистр без всего этого -- слака -- находится в глубоком анабизое.
              Ответить
              • Я кстати знаю в чём Проблема.

                Прозвучит довольно нелогично, но корень оверинжинирного зла был посажен когда в Линукс начали приходить корпорации.

                Сначала все радовались: «смотрите, швабодка подебила», мы заставили крупные конторы и энтерпрайз комитить для пользы сообщества.

                Однако посоны не учли момента, что корпорации будут писать то что выгодно и полезно для них.

                >Настройку сервиса systemctl делает через d-bus.
                Какие проблемы? В Линуксе всё энтырпрайзненько.

                >Чтобы включить/выключить сервис на прыщах нужен демон с сетевым протоколом.
                Ынтырпрайз решал свои задачи анального контроля.

                90% ненужной простому юзеру питушни в линукс-мире форсит Шапка.
                Красношапочники не комитят крутые алгоримты в ffmpeg, и не пилят годноту в ядро, они просто ебошат какие-то геттеры/сеттеры, обёрточки, изменения ради изменений.

                Именно поэтому dbus, именно поэтому Network.Minetger, именно поэтому сетевые питухи, именно поэтому PulseAudio со звуком через сеть, итд.

                >Теперь у нас питушня уровня если не винды, так Solaris SMF точно по сложности.
                Enjoy your Enterprise Linux.
                Ответить
                • Какой багор )))
                  Ответить
                  • Линус даёт красношапочнику по шапке.
                    Вот это багор.
                    On Sun, Dec 23, 2012 at 6:08 AM, Mauro Carvalho Chehab
                    <[email protected]> wrote:
                    >
                    > Are you saying that pulseaudio is entering on some weird loop if the
                    > returned value is not -EINVAL? That seems a bug at pulseaudio.
                    
                    Mauro, SHUT THE FUCK UP!
                    
                    It's a bug alright - in the kernel. How long have you been a
                    maintainer? And you *still* haven't learnt the first rule of kernel
                    maintenance?
                    
                    If a change results in user programs breaking, it's a bug in the
                    kernel. We never EVER blame the user programs. How hard can this be to
                    understand?
                    
                    To make matters worse, commit f0ed2ce840b3 is clearly total and utter
                    CRAP even if it didn't break applications. ENOENT is not a valid error
                    return from an ioctl. Never has been, never will be. ENOENT means "No
                    such file and directory", and is for path operations. ioctl's are done
                    on files that have already been opened, there's no way in hell that
                    ENOENT would ever be valid.
                    
                    > So, on a first glance, this doesn't sound like a regression
                    
                    Shut up, Mauro. And I don't _ever_ want to hear that kind of obvious
                    garbage and idiocy from a kernel maintainer again. Seriously.
                    [...]
                    
                    WE DO NOT BREAK USERSPACE!
                    
                    Seriously. How hard is this rule to understand? We particularly don't
                    break user space with TOTAL CRAP. I'm angry, because your whole email
                    was so _horribly_ wrong, and the patch that broke things was so
                    obviously crap. The whole patch is incredibly broken shit. It adds an
                    insane error code (ENOENT), and then because it's so insane, it adds a
                    few places to fix it up ("ret == -ENOENT ? -EINVAL : ret").
                    
                    The fact that you then try to make *excuses* for breaking user space,
                    and blaming some external program that *used* to work, is just
                    shameful. It's not how we work.
                    
                    Fix your f*cking "compliance tool", because it is obviously broken.
                    And fix your approach to kernel programming.
                    
                    Linus

                    https://lkml.org/lkml/2012/12/23/75
                    Ответить
                    • Прелесть. Очень приятно читать.

                      Без сарказма: с питухами, которые ломают юзерспейс, только так и надо!
                      Ответить
                      • Политкорректные выблядки джва года назад загнобили Линуса.
                        Теперь он так не жжёт.
                        Ответить
                        • А политкорректные крестопарашники когда-нибудь попробуют загнобить меня на говнокоде?
                          Ответить
                          • Очередная сводка в лживой газете, замалчивающей мои успехи?
                            Ответить
                  • Или вот, шедевр эпистолярного жанра.
                    Опять шапка тянет каку в ядро.
                    Guys, this is not a dick-sucking contest.
                    
                    If you want to parse PE binaries, go right ahead.
                    
                    If Red Hat wants to deep-throat Microsoft, that's *your* issue.  That
                    has nothing what-so-ever to do with the kernel I maintain. It's
                    trivial for you guys to have a signing machine that parses the PE
                    binary, verifies the signatures, and signs the resulting keys with
                    your own key. You already wrote the code, for chissake, it's in that
                    f*cking pull request.
                    
                    Why should *I* care? Why should the kernel care about some idiotic "we
                    only sign PE binaries" stupidity? We support X.509, which is the
                    standard for signing.
                    
                    Do this in user land on a trusted machine. There is zero excuse for
                    doing it in the kernel.
                    
                                   Linus

                    https://lkml.org/lkml/2013/2/21/228

                    Если бы не Линус, редхатовцы и прочий ынтыпрайзный скам давно бы уже натянули в ядро ненужной дряни, превратив его в очередной systemd.
                    Ответить
                • Это правда.
                  Моя любимая питушня это crypto-policies.
                  Где настраиваются шифры sshd? в sshd_config?
                  хуй. В /etc/crypto-policies/back-ends/opensshserver.config

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

                  Если бы не шляпа, каноникал, суся с новелом и прочие amazonы с ораклами, то популярность линукса была бы на уровне dragonfly bsd кмк.
                  Ответить
                  • Сейчас для Линукса больше всего делает... Valve.
                    Вот там видно что люди делом заняты. Сейчас переписывают directX на вулкан (https://github.com/doitsujin/dxvk)
                    Разработка Wine в последнее время ускорилась просто колоссально, бежит семимильными скачками.
                    Игры работают гораздо быстрее/стабильнее.

                    >без корпораций прыщ бы не выстрелил. Именно они сделали его популярным
                    Google Android, внезапно.
                    Ответить
                    • Кстати, а зачем им это? Вторая попытка раскрутить steam machine, только на этот раз не привлекая разрабов игр?
                      Ответить
                      • > Вторая попытка раскрутить steam machine, только на этот раз не привлекая разрабов игр?
                        Да.
                        Чтобы потом в теории стричь профиты с приставки, ОС и софт для которой не требует лицензий.

                        А пока что +12% рынка в Steam. (10% Mac+2% Linux)
                        Они же поставляют вместе с играми собранный, пропатченный wine.
                        Называется сиё https://en.wikipedia.org/wiki/Valve_Proton
                        Ответить
                        • > 2% linux

                          Ну т.е. реально линуксоидов даже больше, чем эти 2% т.к. часть из них по второму разу за винду в дуалбуте посчитана?
                          Ответить
                      • Щас немного привлекли к себе внимание новой халвой, можно и на линупсе снова попытаться бабки попилить.
                        Ответить
                      • А зачем этот steam machine, учитывая что современные производительные (/me неодобрительно посмотрел на Nintendo Switch) приставки сейчас и так на x86-64 крутятся?
                        Ответить
                        • В стиме игры вдвое дешевле приставочных. Ну и на ПК много всяких эксклюзивов которых никогда не будет на приставках, а на паровых машинах они пойдут.
                          Ответить
                          • Тогда проблему надо решать через взлом этих x86-64 приставок и накатывание туда прошивки для steam machine. Притом на PS4 со старой уязвимой прошивкой как раз так и сделали

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

                              На обычных приставках ты можешь 10 лет без апгрейда смотреть мыльцо в 30 фпс. И это реально тестируется.

                              А здесь, как и на ПК, не будет гарантий что новая игра нормально взлетит. Тем более, что стим машины будут делать разные вендоры, да ещё и с разной мощностью.
                              Ответить
                    • андроид тоже, но ведь и гугол это копрорация
                      Ответить
        • >systemd переписывают на rust
          Говно говна?
          Ура! Ура!
          Ответить
      • > systemd, который устроил революцию в управлении системой

        Теперь хосты через openvpn сами не отрезолвятся в ipшники.
        Ответить
      • Тупая пропаганда как обычно врёт:
        >systemd нестабилен и забагован

        >Вовсе нет. Мейнтейнеры, по мнению Леннарта, внимательно относятся к issues на GitHub, мониторят багтрекеры дистрибутивов Linux и, надо сказать, число багов довольно мало для такого ключевого компонента ОС.

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


        В маркетинговом женерик-спиче ключевая фраза: «по мнению Леннарта».
        Ответить
      • Про openvpn я уже писал.

        Однако же дадим слово Линусу, когда он разъёбывал Kay Sievers (один из ключевых авторов systemd)
        https://www.reddit.com/r/linux/comments/221irz/linus_blocks_all_code_from_kay_sievers_f rom_linux/

        And by "their" you mean Kay Sievers.

        Key, I'm f*cking tired of the fact that you don't fix problems in the
        code *you* write, so that the kernel then has to work around the
        problems you cause.

        Greg - just for your information, I will *not* be merging any code
        from Kay into the kernel until this constant pattern is fixed.

        This has been going on for *years*, and doesn't seem to be getting any
        better. This is relevant to you because I have seen you talk about the
        kdbus patches, and this is a heads-up that you need to keep them
        separate from other work. Let distributions merge it as they need to
        and maybe we can merge it once it has been proven to be stable by
        whatever distro that was willing to play games with the developers.

        But I'm not willing to merge something where the maintainer is known
        to not care about bugs and regressions and then forces people in other
        projects to fix their project. Because I am *not* willing to take
        patches from people who don't clean up after their problems, and don't
        admit that it's their problem to fix.

        Kay - one more time: you caused the problem, you need to fix it. None
        of this "I can do whatever I want, others have to clean up after me"
        crap.

        Linus
        --
        Ответить

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