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

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
  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 j123123, (Updated )

Комментарии (232) 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?
                  Почему? Почему?
                  Ответить
                  • да-да, из этой вашей сишечки даже сообщение в твиттер не отпрравить

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

                            Языку всего 6 лет в продакшене, уже кстати нормально хуевертят, через пару годков тоже можно будет фрактал плохого дизайна писать.
                            Ответить
                              • А что так? Где винда? Да даже если и была винда (и вроде как в обозримом будущем будет), то кроссплатформенный гуй не попишешь. Рантайма 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, но, чтобы тебе было удобно, в замыкание по умолчанию и те и другие захватываются по ссылке.
                                Ответить
                              • Сорян, чот вторую ссылку не так сначала прочитал.

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

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

    Есть пропозал про метаклассы, там как раз предлагались компайл-тайм рефлексия и компайл-тайм оператор для высирания блоков кода.
    Ответить
    • Кстати, я думаю, что это
      #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] имя типа ожидается а не составная хуета.
        Ответить
          • Да в общем-то нет. Тут как раз сишкобляди натащили на ботинках сишных массивов и макросов, а потом жалуются, что воняет.
            Ответить
                • Конпеляторы не поддерживающие GNU C нинужны.

                  Хотят в C2x втащить.
                  Ответить
                  • Гнусь не нужна. Я за Стандарт и портируемость.
                    Ответить
                  • лолшто? как там со столманновскими поделками в вижалси? а в ллвм как?
                    Ответить
                      • а,понятно, то-есть ios, mac os и windows не нужны
                        ок
                        Ответить
                            • Твой коммент расстраивает рубин
                              И клубничный жемчуг
                              Ответить
                                • железный рубин не нужен, как и железный питон (он вообще сломан).

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

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

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

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

                          Да и там же еще GC с жирным рантаймом, так что по любому это говно в пролете
                          Ответить
              • Ну это зависит от рукожопства. Сделай отдельный интерфейс с нужными публичными методами, реализацию в WebService и вызови registerWebInterface на этом интерфейсе.
                router.registerWebInterface!MyInterface( new WebService);
                Ответить
                • > сделай

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

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

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

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

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

                    > у меня случайно в контроллере оказался метод getFoo()
                    Я и предлагаю: бубликовать в вёб только бубличные методы, а приватами не светитить.
                    Ответить
                    • А доки мы читаем жопой. Первая строчка "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/
    Ответить
      • да нет, там опять унылый пиздеж про то, как все оказывается мучались с 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
                  <mchehab@redhat.com> 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.
                  Ответить
                  • >соревнование членососов
                    >отсосать у Microsoft
                    Линус прекрасен
                    Ответить
              • Это правда.
                Моя любимая питушня это 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 фпс. И это реально тестируется.

                            А здесь, как и на ПК, не будет гарантий что новая игра нормально взлетит. Тем более, что стим машины будут делать разные вендоры, да ещё и с разной мощностью.
                            Ответить
                            • после выхода киберпанка комментарий выглядит забавно
                              Ответить
                        • случилось странное: Dishonored 2 на плойку щас дешевле, чем у габена
                          Ответить
                    • > 01.06.2020
                      > Вторая попытка раскрутить steam machine

                      https://www.phoronix.com/scan.php?page=news_item&px=Steam-Deck

                      15 July 2021

                      Following months of rumors about new gaming hardware from Valve, today they announced Steam Deck as a new handheld PC gaming device starting at $399.

                      The Steam Deck is an all-in-one portable PC with a custom AMD SoC and, of course, running SteamOS. Steam Deck is focused, of course, for running Steam but also advertised as an "open PC" that can run other software too.
                      Ответить
                      • а с этой хуйни можно транслировать на нормальный экран?
                        Ответить
                          • именно поэтому

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

                                ни то ни сё

                                и экран маловат, и при этом форм-фактор странный

                                одинаково устанут глаза и руки

                                учитывая, что вальв обосралась с куда более удачным в теории продуктом, кому нужно это, ума не приложу
                                Ответить
                  • андроид тоже, но ведь и гугол это копрорация
                    Ответить
        • предлагаю systemd переписать на javascript, и сделать nodejs неотъемлемой частью линуксовых дистров.

          а управление сделать через телеграм бот. Да. Куда удобнее управлять системой с айфона через телеграм.
          Ответить
    • > 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
      --
      Ответить
  • Лицензионное соглашение

    Общие положения.

    Данный сайт Говнокод.ру (в дальнейшем именуется Сайт) является информационным сайтом, незарегистрированным как СМИ в Российской Федерации;
    Сайт является сайтом с открытой системой регистрации. Любой пользователь с соответствующими учётными записями на других проектах может зарегистрироваться на Сайте и публиковать материалы, изменяя таким образом главную и другие страницы сайта;
    Участники сообщества Сайта могут размещать как части исходных кодов разнообразных программ, являются ли они их авторами или нет с собственным комментарием к данному коду, так и комментарии к каждому конкретному исходному коду;
    Участники сообщества Сайта могут оценивать исходные коды, а также комментарии других пользователей положительно и отрицательно. Данная оценка является полностью информативной и отображает мнение пользователей Сайта, а не мнение авторов проекта (в дальнейшем именуемых Администрацией);
    Участникам сообщества Сайта запрещается публикация материалов, содержащих ненормативную лексику, а также материалы, запрещённые к публикации Законодательством Российской Федерации;
    Участникам сообщества Сайта запрещается публикация материалов, которые являются интеллектуальной собственностью третьих лиц: участникам запрещается публиковать части исходных кодов тех проектов, исходные коды которых защищены законом об интеллектуальной собственности.
    Данные правила всегда находятся по следующему адресу: http://govnokod.ru/page/license.
    Ответить
    • а твой сайт использует куки? а почему не сообщает? Может, мне подать на тебя в суд? Ты нарушил мое прайваси!
      Ответить
        • а разве только гражданин ЕС может подать на Инюё в евроейский суд?
          Ответить
          • ну вроде вся эта канитель про gdpr и куки касается только граждан ЕС. gdpr точно, про куки могу и напиздеть
            Ответить
            • Вообще грусть, конечно

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

              Хорошо бы блядь правительства вообще не говорили бы программистам и админам, что им делать
              Ответить
              • ну gdpr как идея неплох + очередной легальный способ отжима денег у населения копрораций

                а с куки полная чушь, согласен. ещё и согласиться или отказаться обычно невозможно, не включив жабаскрипт. с чем боролись-то?
                Ответить
                • а какой смысл в gdpr? можешь привести реальный кейс, когда он был бы полезен?

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

                        лучше сам почитай gdpr, чтобы не было испорченного телефона
                        Ответить
                        • ну ты можешь сказать компании, что она забыла всё, что о тебе знает

                          да я читал когда-то и помню, что ничего интересного не нашел

                          Просто есть такой тренд в обществе (довольно тупой имхо): все боятся крупных корпораций, которые за тобой следят.

                          То есть ты сначала всю инфу вываливаешь компаниям, а потом ссыш, что они про тебя слишком много знают


                          В общем я пиздец конечно не репрезентативен. Меня не ебет то, что ебет 89% населения

                          И ебет то, что не ебет 89% населения

                          эх((
                          Ответить
                          • идея действительно в том, чтобы сказать компании "забудь меня"

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

                              А еще у долбоёбов могут спиздить базу логинов с паролями, и пароли там плейнтекстом. И за это никаких санкицй нету.
                              Ответить
                              • ну шо ж

                                подумай ещё, сколько раз ты попадаешь на камеру, пока просто за молоком в магазин выходишь
                                Ответить
      • потому что gdpr поебать если ты не занимаешься обработкой personal data по серьезке

        When the regulation does not apply

        Your company is service provider based outside the EU. It provides services to customers outside the EU. Its clients can use its services when they travel to other countries, including within the EU. Provided your company doesn't specifically target its services at individuals in the EU, it is not subject to the rules of the GDPR.

        во-вторых какой долбоеб будет оставлять на говнокоде настоящие личные данные?
        Ответить
        • Вообще люди пишут под гостем или с фейковых аккаунтов потому, что стесняются той хуйни, что они тут пишут.

          Нормальный человек не стесняется назвать свое имя
          Ответить
          • я не стесняюсь хуйни

            я стесняюсь камерунских хуйцов

            но я вообще давно уже на каждом сайте стараюсь новый ник заводить. При том, что я и регаюсь раз в пятилетку
            Ответить
            • А, я понял. Типа ты делаешь себе ник из настоящего ФИО с настоящей фотографией, а потом осетин деает его файку, и пишет про камерун
              Ответить
              • Типа как hormand? Ну от всего не защитишься, это не повод прятаться. Любой твой знакомый может взять фотки с вконтактика и пошутить над тобой. Или написать тебе от имени фейковой тян. Что теперь, не регаться ни в одной соцсети?
                Ответить
                • >пошутить
                  очень оригинальная, остроумная, и тонкая шутка.
                  Ответить
              • > деает его файку

                Сначала прочитал как «даёт его Файку» (Fike).
                Ответить
          • звучит как копипаста про альфа-самцов, которые не стесняются передернуть на трапа
            Ответить
          • > Нормальный человек не стесняется назвать свое имя

            Сказал guest6.
            Ответить
  • > #define krestogovnotypeof(a) std::remove_reference<a>::type
    – какая экономия )))
    Ответить
      • > теперь догадался

        И что оно делает? 😉

        Вообще, крестоговнотайпоф это просто деклтайп. Ремув референс делает немного больше.
        Ответить
        • Возвращает тип говна? Если говно по ссылке, то тип этого говна. Но я не проверял.
          Ответить
        • Это же очевидно что он делает

          Суваешь в него тип ссылка-на-петуха а получаеш тип питух
          Ответить

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

Помни, guest, за тобой могут следить!

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


    8