1. Python / Говнокод #27985

    0

    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
    # Python 2.7
    import cgi
    print(cgi.parse_qs('a=bagor;+kakoi'))
    # {'a': ['bagor']}
    
    # Python 3.7.3
    import urllib.parse
    print(urllib.parse.parse_qs('a=bagor;+kakoi'))
    # {'a': ['bagor']}
    
    # Python 3.9.10
    import urllib.parse
    print(urllib.parse.parse_qs('a=bagor;+kakoi'))
    # {'a': ['bagor; kakoi']}

    Что, блядь, это за хуета???
    Переводил программу на Python3 и пол дня потратил в попытках понять почему блядь тесты сломались.
    Какой-то петух завязался, на ';' сепаратор, который обрезается.

    https://docs.python.org/3/library/urllib.parse.html
    Changed in version 3.10: Added separator parameter with the default value of &. Python versions earlier than Python 3.10 allowed using both ; and & as query parameter separator. This has been changed to allow only a single separator key, with & as the default separator.

    И у меня не 3.10, но да похуй.
    Как мне теперь закостылять это говно, не меняя данные?

    Запостил: 3_dar, 03 Февраля 2022

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

    • Тред отсоса прыщеблядей.
      Ответить
    • Передай ';' сепаратором, раз он у тебя используется.
      Ответить
      • & тоже как сепаратор используется
        Ответить
        • Найди того, кто пользуется двумя видами сепараторов и нассы ему на лицо.
          Либо перед тем, как парсить, определяй, каким сепаратором пользуется питух.
          Ответить
          • Нассал тебе в лицо
            Ответить
            • За использование _ и @ как сепараторов?
              Ответить
              • За сепаратизм ща срок дают
                On the second thought это хотя смотря в какую сторону это сепаратизм
                Ответить
          • Нассать некому, исправлять придётся мне.
            Ответить
            • Есть реальный пример запроса, в котором используются оба сепаратора?
              Ответить
              • Автор запроса и не думал использовать 2 сепаратора. Просто его код завязан на то, что сервер распарсит параметр "a", как 'bagor', а не 'bagor; kakoi'.
                Ответить
                • Т.е. функция юзалась не по прямому назначению, просто формат случайно похожий оказался?
                  Ответить
                • 1: спихнуть поддержку кода, завязанного на ; на кого-то другого
                  2: объявить, что в связи с учащением обнаружения уязвимостей, связанных с недостаточно строгой обработке входных данных, для безопасности разделители кроме & не принимаются
                  3: ???????
                  4: PROFIT
                  Ответить
                • Напиши BNF для запросов, реально попадающих в этот код.
                  Ответить
                  • Переведи на ускорение::спирт.
                    Ответить
                  • КОКОКО, БНФ, КОКОКО, КУКАРЕТИКА, КОКОКО, МА-ТЕ-МАТИКА, КОКОКО, ПИДА-РАШКИ
                    Ответить
                    • ХРЮ-ХРЮ, UML-ДИАГРАММЫ, ХРЮ-ХРЮ, ЮНИТ-ТЕСТЫ, ХРЮ-ХРЮ, АСИМПТОТИЧЕСКАЯ СЛОЖНОСТЬ, ХРЮ-ХРЮ, АЛГОРИТМ ШЛЕМИЭЛЯ, ХРЮ-ХРЮ, ПАРСЕРЫ И ЛЕКСЕРЫ, ХРЮ-ХРЮ, РЕГУЛЯРКА С БЕКТРЕКИНГОМ
                      Ответить
                      • Спасибо, вы приняты.

                        Ваше первое задание. Есть код
                        $user_name_escaped = mysql_real_escape($_GET['user_name']);
                        $user_password_escaped = mysql_real_escape($_GET['user_password']);
                        $user_age_escaped = mysql_real_escape($_GET['user_age']);

                        и код
                        <label><input type="text"  value="<?=$user_age;?>">возраст</label>
                        <label><input type="text"  value="<?=$user_name;?>">имя</label>

                        итд

                        нужно добавить цвет глаз
                        Ответить
                        • <?php
                          $user_name_escaped = mysql_real_escape_string($_GET['user_name']);
                          $user_password_escaped = mysql_real_escape_string($_GET['user_password']);
                          $user_age_escaped = mysql_real_escape_string($_GET['user_age']);
                          $user_eyecolor_escaped = mysql_real_escape_string($_GET['user_eyecolor']);
                          ?>
                          <label><input type="text"  value="<?=$user_age;?>">возраст</label>
                          <label><input type="text"  value="<?=$user_name;?>">имя</label>
                          
                          <label><input type="text"  value="<?=$user_eyecolor;?>">цвет глаза</label>
                          
                          <label><input type="text"  value="<?=$user_password;?>">Пароль</label>
                          
                          <label><input type="submit" value="отправить" class="btn" ></label>
                          </form>
                          
                              <div class="login_box_foot">
                                  <span class="forgot_pass"><?=__("forgot password?", "default");?></span>
                              </div>
                          
                          </div>
                          
                          <?php if (count($authErr) == 0) {
                          
                          if (!isset($user_name) || !isset($user_age) || !isset($user_eyecolor))
                          {
                          ?>
                              <div class="login_box_foot_box">
                              <div class="login_box_foot_box_text">
                                  <h2><?=__("Fill all fields", "default");?></h2>
                                  <?php echo $text_warning;?>
                                  </div>
                              </div>
                          
                          <?php }
                          } else {
                              include 'includes/menu.php';
                              include 'includes/menu_item_info.php';
                          }
                          ?>
                          
                          <?php include 'includes/footer.php';?>
                          
                          </body>
                          </html>
                          Ответить
                          • О_о. Она реально сама перевела user_eyecolor в цвет глаз?
                            Ответить
                            • Так точно!
                              Ответить
                            • Кажется, пэхапэшников уже можно сокращать.
                              Ответить
                            • В цвет глаза. В принципе, так даже лучше. Одноглазые не оскорбятся.
                              Ответить
                              • Я не придумал, что делать в случае гетерохромии. Хранить массив из двух цветов?
                                Ответить
                                • Это оскорбит небинарное количество глаз.

                                  Храни кортеж неопределенного заранее размера
                                  Ответить
                          • <html>
                            <head>
                            <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
                            <title>Function template ratio_lt_100</title>
                            <link rel="stylesheet" href="../../../../../doc/src/boostbook.css" type="text/css">
                            <meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
                            <link rel="home" href="../../index.html" title="The Boost Algorithm Library">
                            <link rel="up" href="../../header/boost/algorithm/math/hpp.html" title="Header <boost/algorithm/math/hpp.hpp>">
                            <link rel="prev" href="../../header/boost/algorithm/math/hpp.html" title="Header <boost/algorithm/math/hpp.hpp>">
                            <link rel="next" href="../../header/boost/algorithm/math/hpp.html" title="Header <boost/algorithm/math/hpp.hpp>">
                            </head>
                            <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
                            <table cellpadding="2" width="100%"><tr>
                            <td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../boost.png"></td>
                            <td align="center"><a href="../../../../../index.html">Home</a></td>
                            <td align="center"><a href="../../../../../libs/libraries.htm">Libraries</a></td>
                            <td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
                            <td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
                            <td align="center"><a href="../../../../../more/index.htm">More</a></td>
                            </tr></table>
                            <hr>
                            <div class="spirit-nav">
                            <a accesskey="p" href="../../header/boost/algorithm/math/hpp.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../../header/boost/algorithm/math/hpp.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../../header/boost/algorithm/math/hpp.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
                            </div>
                            Ответить
                • Ещё можно выпиливать из запросов точку с запятой и всё после неё.
                  Ответить
                  • Топикстартер молчит, как партизан.

                    Тут много вариантов:
                    1. Обрезать запрос по точке с запятой до передачи в parse_qs.
                    2. Обрезать каждое значение по точке с запятой после разбора parse_qs.
                    3. Использовать два яруса: делить строку на части по точке с запятой, потом каждую подстроку передавать в parse_qs либо наоборот, делить строку на части по амперсанду, потом каждую часть передавать в parse_qs, передав последним аргументом точку с запятой.

                    Невозможно решить задачу, если у неё нет постановки.
                    Ответить
                    • > Обрезать каждое значение по точке с запятой после разбора parse_qs.
                      Я так и сделал, да.

                      Это не продакшен код, поэтому так костылять можно.
                      Ответить
                      • А вдруг там a=foo;b=bar;+baz

                        Совместимость не 100% по сравнению с replace(';', '&').
                        Ответить
                  • Заменить точку с запятой на амперсанд, тогда задача сведётся к предыдущей.
                    Ответить
                • Но вариант найти человека (он же не пропал без вести) и взглянуть ему в глаза сжечь представляется наиболее оптимальным.
                  Ответить
                  • Блядь, да это работало уже 5 лет, пока я не начал переписывать скрипт. Автор кода уже сменился во втором поколении.
                    Ответить
                    • ТЫ же знаешь, что писать код нужно так, как будто поддерживать его будет психопат, который знаешь, где ты живёшь.

                      У тебя есть шанс стать этим психопатом! Этот случай может войти в легенды, его будут приводить в пример, и пугать тобой каждого говнокодера!

                      5 лет прошло... Ну и что? Это не срок. Людей и после 50 лет находят, а он же не в джунглях исчез.
                      Ответить
                      • Это так не работает.

                        Допустим, сполежуй-говноед построил дом и говна и соплей.
                        Дом стоял, пока ты рядом с ним не хлопнул в ладоши.

                        Но ты хлопнул, и дом упал.

                        Теперь соплежуй-говноед -- молодец. Он построил дом.
                        А ты мудак, потому что ты его сломал.

                        Хорошие дома не падают от хлопков в ладоши, но кого это ебет?
                        Ответить
                        • Что не мешает насрать ему под дверь.
                          Ответить
                        • На Х-ре вспомнили случай, когда рванул газопровод 1966-го года постройки. Осудили сварщика и его начальника. Правда, посмертно.

                          Наказание нашло их спустя более 50 лет.

                          Представь, что бы с ними сделали, если бы они были живыми?
                          Ответить
                          • Какой blameless postmortem )))
                            Ответить
                            • Не могли вечный газопровод построить, чтобы его вообще обслуживать не надо было!
                              Ответить
                            • Скорее уж postmortem blame.
                              Ответить
                          • Потому и осудили, что посмертно.

                            Погугли "Железнодорожная катастрофа под Уфой", когда долбоёбы газом целую низину наполнили, и ни один долбоёб и глазом не моргнул. Там вроде никого особо не посадили нормально
                            Ответить
                        • > Это так не работает.
                          А всё от недостаточного количества ритуальных сожжений говнокодеров.

                          Хочу заметить, что исходя из исторических фактов, после показательного выпиливания, выпиленых молодцами не называют. А если кто и называет, то тут есть корреляция между нипи, и выпиленными во вторую очередь.
                          Ответить
    • vanished
      Ответить
    • HTML-форма собирает строку запроса с помощью &.

      А точка с запятой где используется? Только при сборке запроса вручную? Видел эту хуету на сайтах, но не могу понять, откуда она берётся.
      Ответить
      • А что, в #27975 спамить закончил?
        Ответить
      • какой стандарт вообще это описывает?
        Ответить
        • Ты не поверишь...

          The enctype and formenctype content attributes are enumerated attributes with the following keywords and states:

          • The "application/x-www-form-urlencoded" keyword and corresponding state.
          • The "multipart/form-data" keyword and corresponding state.
          • The "text/plain" keyword and corresponding state.
          The enctype attribute's invalid value default and missing value default are both the application/x-www-form-urlencoded state.

          Первый формат описан тут:
          https://url.spec.whatwg.org/#application/x-www-form-urlencoded

          Парсинг описан так: «Let sequences be the result of splitting input on 0x26 (&).»

          Второй формат описан тут: https://datatracker.ietf.org/doc/html/rfc7578

          Он громоздкий (с мимими-boundary), поэтому обычно используется только для отправки файлов.

          Что за формат text/plain, я не знаю. Нужно почитать повнимательнее.
          Ответить
        • Вот для HTML4:

          https://www.w3.org/TR/html4/interact/forms.html#h-17.13.3.2

          Либо application/x-www-form-urlencoded с разделителем &, либо multipart/form-data с мимими-boundary.
          Ответить
    • Эти долбоёбы решили повторить судьбу руби?

      Ломающие изменения в минорных версиях всегда плохо заканчиваются.
      Ответить
      • >Ломающие изменения в минорных версиях всегда плохо заканчиваются.

        Могли бы собрать всё что они хотят сломать в кучу и выпустить Python 4.

        А потом ещё лет 10 переходить на него с тройки. Стало бы лучше?
        Ответить
        • Да. По крайней мере это не такой выстрел в ногу, как смена семантики функций на ровном месте.

          Руби в 1.9 тоже подобной хуйнёй стало страдать. И где теперь руби?
          Ответить
          • Ну ты же не хочешь сказать, что руби сгубило именно это?:)
            Ответить
            • А мне почему-то кажется, что именно это её и добило.
              Ответить
              • Это уже пятая версия про руб, которую я слышал. Было так же:
                * Тормознутость
                * Плохое реноме после ухода с руби на скалку какого-то вебговна (твитера штоле)
                * Сложность, и наличие магии
                * Непопулярность у гуглов-яндексов-phd (в отличие от пиздона)

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

                Нету простого ответа.

                И кстати. Вон, в Perl никто совместимость не ломал, а что с ним случилось?
                Ответить
                • Патча Бармина все испугались.
                  Ответить
                • Да просто очередное кетайское скриптухоговно.

                  Нинужно никому кроме кегданов.

                  >уход со сцены языка
                  Так сказал, будто бы он был на сцене.
                  Ответить
                  • > Так сказал, будто бы он был на сцене.
                    Ты о Яибу или о Пёрл?

                    Яибу и рельса научили вебмакак континиус деливери, CI и конфигурейшен эз коду.
                    Он был королем веб разработки. Года два.

                    Перл был (а в тяжелых случаях) и остается пламбер ленгвиджем прыщей и прочих юниксов, ну и он был дефакто скриптухой и вебCGIговном в промежутке 1996-2001 где-то
                    Ответить
                    • > Яибу и рельса научили вебмакак континиус деливери, CI и конфигурейшен эз коду.
                      Хуй-ня. Сказать что PHPшники научили мир монорепам и stateless-серверам будет и то большей правдой.
                      Яибу — язык одного фреймворка с парой удачных идей, которые очень быстро реплицировали.

                      > Он был королем веб разработки. Года два.
                      Король Чуханов.
                      Ответить
                      • Разумеется, не хуйня. Всё ровно так и было.
                        Ответить
                        • https://meta.stackexchange.com/questions/10372/is-stackoverflow-com-written-in-ruby-on-rails

                          Разъёб Яибу-мрази.

                          Сектант: Прастити, а переполнениестека.ком написано на Яибу?
                          .NETчики: Пошёл вон отсюда, гадина ебучая!
                          Ответить
                          • Очевидно, стековерфлоу написан на PHP, это же веб-сайт
                            Ответить
                            • Вообще не понимаю, какой смысл писать сайты не на «PHP», когда можно на «PHP».
                              Ответить
                              • Если написать сайт на «РНР», то его будет невозможно переписать на «РНР» в будущем. Нужно смотреть на шаг вперёд.
                                Ответить
                          • «In case you don't know, the question asker is a notable figure in the Ruby community, so this question is quite a compliment!»

                            Подумал, что это файка Маца. Перехожу по ссылке, а там какой-то пидор.
                            Ответить
                            • Мац вебговном не занимаеца, тогда уж DHH
                              Ответить
                              • Да, как-то и забыл, что Мац придумал Руби для других целей, а на вебговно Руби натянул DHH.
                                Ответить
                          • Ну и где разъёб? Я бы на месте Джеффа топикстартера просто на хуй послал бы, а он перед ним реверансы делает.
                            Ответить
                            • Джефф ему ответил вежливо, ибо на западе можно получить кучу проблем на ровном месте, если открыто слать людей нахуй.

                              Но при этом Яибушник выставил себя анскильным кретином, который хотел дешевой пропаганды чтобы похвалить своё болото. А в итоге ему объяснили, что рельсоподелка никому не нужна.
                              Ответить
                            • Да неплохо он его подъебнул.

                              Типа ты известный чувак, книжки по рельсам пилишь, а своих клиентов так и не выучил.
                              Ответить
                  • Руби клевый для всяких мелких скриптов (и приятней питона, даже несмотря на то что у него своя пизданутость с do ... end / { |x| multiply(x) }). Для всяких вебов действительно не знаю зачем он нужен, кроме как замена жс там, где можно дать пользователю залить свой скрипт, но сам по себе он в разы приятнее соседей.
                    Ответить
                    • Хер знает, для меня это как перл -- или юзать всю жизнь или не юзать никогда. Ибо очень сложный и многообразный язык, сходу не прочитаешь.
                      Ответить
                      • Ну с Перлом по нечитаемости разве что J может сравниться.
                        Ответить
                        • Я не понимаю нахрюков на перл, да и на руби. Достаточно понять суть, и 80% кода станет вполне понятным. Не нужно просто писать с изъебами
                          Ответить
                          • Я не понимаю нахрюков на с++, да и на j. Достаточно понять суть и 80% кода станет вполне понятным. Не нужно просто метушить с изъёбами.
                            Ответить
                            • Подтверждаю, если писать на «C++» как на «Better C», то всё понятно.
                              Ответить
                            • А я против нахрюков на плюсы, кстати. Почти всё, с чем я сталкивался в крестах, было документировано, и имело какой-то смысл, хотя бы исторический.

                              Кому плохо в крестах или перле, тот пусть покушает наш наколенный DSL для CI, нихуя никем никогда не документированный, без возможсности проверять изменения локально (только на CI) где в случае ошибки билд у тебя всё равно зеленый, но в дебрях лога пара мегабайт XMLя с ошибками высирается.

                              Вот это треш, а не плюсы с перлами
                              Ответить
                              • А я против нахрюков на Brainfuck, кстати. Почти всё, с чем я сталкивался в Brainfuck, было документировано, и имело какой-то смысл, хотя бы исторический.

                                А я против нахрюков на Malbolge, кстати. Почти всё, с чем я сталкивался в Malbolge, было документировано, и имело какой-то смысл, хотя бы исторический.
                                Ответить
                                • Твоя сишка для пыхпера или смузиёба-джаваскриптера точно такой же Brainfuck
                                  Ответить
                                  • А я против нахрюков на "PHP", кстати. Почти всё, с чем я сталкивался в "PHP", было документировано, и имело какой-то смысл, хотя бы исторический.

                                    А я против нахрюков на JS, кстати. Почти всё, с чем я сталкивался в JS, было документировано, и имело какой-то смысл, хотя бы исторический.
                                    Ответить
                                    • Кстати, это не правда: многие вещи в PHP смысла не имеют
                                      Ответить
                                      • > Кстати, это не правда: многие вещи в PHP смысла не имеют

                                        В "C++" тоже многие вещи смысла не имеют.
                                        Да и всегда можно заявить, что в этом есть некий "исторический смысл"
                                        Ответить
                                        • Например?
                                          Ответить
                                          • > Например?

                                            Например, какой смысл не давать возможность определять свойство short-circuit для перегруженных "||", "&&" операторов?
                                            Ответить
                                            • А как?
                                              Ответить
                                              • > А как?

                                                Определить множество значений, на которых цепочка из "&&", "||" прерывается, и дальше ничего не вычисляется
                                                Ответить
                                                • Напиши своему классу оператор bool(), который "определяет множество значений, на которых цепочка прерывается" и юзай стандартные && да ||. Профит!
                                                  Ответить
                                                  • > и юзай стандартные && да ||

                                                    А если мне надо именно операции "&&" и "||" перегружать, чтобы от них были побочные эффекты в зависимости от типа? Ну например в целях логирования и отладки какой-то хуйни
                                                    Ответить
                                                    • Ну пропихни в стандарт унарный оператор &&, который зовётся после вычисления первого аргумента для бинарного оператора && и позволяет прервать цепочку если вернёт false...

                                                      Или пусть && лямбды-продолжения принимает.

                                                      Я не знаю как это красиво сделать.
                                                      Ответить
                                                      • > Ну пропихни в стандарт

                                                        Делать мне больше нехуй

                                                        > Я не знаю как это красиво сделать.

                                                        Поэтому я против крестов
                                                        Ответить
                                                      • Тут меня еще забавляет наплевательское отношение комитета к этому. Ну типа "бля, так, че у нас тут, операторы && и ||, епта. Short-circuit какой-то блядь, ну нахуй, чет сложно, давайте лучше их перегрузку хуйнем как обычные бинарные операторы, нах!"
                                                        Ответить
                                          • > Например?

                                            Например, почему в "std::vector" нет "push_front", "emplace_front" и "pop_front", но при этом есть "emplace", "insert" и "erase"?
                                            Ответить
                                            • Потому что вектор это массив под капотом, а добавляьть что-то в голову массива не комильфо.

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

                                              Точно так же, как в list нельзя обратиться по индексу.

                                              Я как раз тут согласен с плюсами. Джавка со своим List куда хуже.
                                              Ответить
                                              • > Потому что вектор это массив под капотом, а добавляьть что-то в голову массива не комильфо.

                                                А добавлять/удалять в середину комильфо? Если б не было и "emplace", "insert" и "erase", у меня б вопроса не возникало.
                                                Ответить
                                                • insert же не только в голову добавляет, а куда скажешь.

                                                  А ты бы хотел, чтобы был заранее неоптимальный метод, который к тому же легко эмулировать через другой, более общий?
                                                  Ответить
                                                  • > А ты бы хотел, чтобы был заранее неоптимальный метод, который к тому же легко эмулировать через другой, более общий?

                                                    Ну блядь, если добавлять в середину официально можно, на кой хер не разрешать добавлять в голову? Не один ли хер? Логика тут где?
                                                    Ответить
                                                    • > Ну блядь, если добавлять в середину официально можно, на кой хер не разрешать добавлять в голову?
                                                      Так ведь можно.
                                                      vec.insert(vec.begin(), pitux)
                                                      Ответить
                                                      • > Так ведь можно.
                                                        > vec.insert(vec.begin(), pitux)

                                                        Можно-то можно, но мы тут вроде говорим о какой-то логичности. Какая логика не давать метод добавления сразу в голову, если вставлять в середину один хрен можно?
                                                        Ответить
                                                        • Так для логичности надо выкинуть push_back, а не добавлять push_front!

                                                          insert -- это универсальный метод. Его нельзя выкинуть т.к. многие операции над вектором станут невозможными без ручной ёбли.

                                                          А вот push_back и push_front -- частные случаи, которые вполне так выражаются через insert. И push_back там исключительно ради удобства и оптимизации. На полноту интерфейса он не влияет.
                                                          Ответить
                                                        • А какая логика не давать метода для вставления элемента ровно в середину?
                                                          Вторым?
                                                          Предпоследним?
                                                          Ответить
                                                          • > А какая логика не давать метода для вставления элемента ровно в середину?

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

                                                              ДАвайте.
                                                              Не существует метода вставки в начало у массива. Убрали
                                                              Ответить
                                                              • > Не существует метода вставки в начало у массива. Убрали

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

                                                                  А поскольку вектор растет с нахлестом (в джаве, думаю и в С++ так) имея впереди себя немного свободного места, то обычно это легко.

                                                                  Ну а начало и конец для связанных списков отлично реализуется, для них вообще нет разницы куда вставлять
                                                                  Ответить
                                                                  • > Вставка в конец у массива относительно легкая: тебе не нужно двигать массив, если там есть местечко.

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

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

                                                      Вангую, что добавление в листа компилятор может как-то оптимизировать.

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

                                                      Точно так же я не могу получить Nый элемент листа, но через итератор со счетчиком могу же.

                                                      То есть я явно говорю: "сделай неоптимально, я беру на себя ответственность"
                                                      Ответить
                                                      • > То есть я явно говорю: "сделай неоптимально, я беру на себя ответственность"

                                                        Т.е. надо заставить программиста писать какие-то лишние буковки, если ему надо вставлять в голову массива? Ну так почему б тогда и insert аналогичным образом не усложнить? Пусть лишние буковки понапишет, ну типа увеличит размер вектора, сдвинет кусок вектора руками после места вставки, и потом вставляет
                                                        Ответить
                                                        • >Тогда и insert для вектора быть не должно

                                                          тогда не выполнится правило "но если хочешь, то можно".

                                                          Зачем добавлять метод, который лучше никогда не использовать? Для чего он?

                                                          insert не обязательно же плохой, если ты добавляешь в хвост, то наверное компилятор может как-то остальной массив не трогать.
                                                          Ответить
                                                          • > insert не обязательно же плохой, если ты добавляешь в хвост, то наверное компилятор может как-то остальной массив не трогать.

                                                            push_front/pop_front тоже не обязательно плохой, если вектора малого размера
                                                            Ответить
                                                            • >сли вектора малого размера

                                                              Это правда. Да и на современных процах подвинуть массив не так уж и страшно, всё железо же на массивы заточено.

                                                              Однако в общем случае это не так
                                                              Ответить
                                                              • > Однако в общем случае это не так

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

                                                          Да, именно.

                                                          > Ну так почему б тогда и insert аналогичным образом не усложнить?

                                                          Зачем? Почему бы не добавить метод, который шлет сообщение в тикток? Потому что он не нужен.

                                                          И этот метод тоже не нужен
                                                          Ответить
                                                          • > Зачем? Почему бы не добавить метод, который шлет сообщение в тикток? Потому что он не нужен.

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

                                                              Какой смысл добавлять push_front у вектора?

                                                              Минус я вижу сразу: усложнение интерфейса.
                                                              А плюс какой? Экономия пяти байт по сравнению с вызовом insert для того 1% случаев, когда кто-то захочет им пользоваться?
                                                              Ответить
                                                              • > Я тебя не понял. Я против метода "push_front" у массива, потому что это не родная операция для этой структуры данных, и я считаю, что лучше бы в голову массива ничего не добавлять.

                                                                Следуя такой логике, и метода insert у вектора быть не должно. А он есть
                                                                Ответить
                                                                • insert к сожалению иногда нужен.
                                                                  push_front ничего бы не дал по сравнению с insert, потому что его трудно оптимизировать

                                                                  Можно спросить "а зачем push_front у листа? Почему не оставить один insert?"

                                                                  Как я написал выше, я предполоагаю, что его можно как-то оптимизироовать по сравнению с более обшим insert.

                                                                  Алсо, им пользуются намного чаще, чем вставляют в голову массива, так что экономия пол строчки тут дает выгоду
                                                                  Ответить
                                                                  • > insert к сожалению иногда нужен.

                                                                    Тогда не вижу проблемы добавить и push_front

                                                                    > push_front ничего бы не дал по сравнению с insert, потому что его трудно оптимизировать

                                                                    Почему ты так решил? Это зависит от того, как реализована динамическая память, можем ли мы выделить память сразу перед этим самым вектором и как-то это заюзать. Ну т.е. это явно проще, чем insert куда-то в середину
                                                                    Ответить
                                                                    • >Тогда не вижу проблемы добавить и push_front

                                                                      А видишь ли ты проблему с добавлением метода для отправки видео в тик-ток?

                                                                      >Это зависит от того, как реализована динамическая память, можем ли мы выделить память сразу перед этим самым вектором

                                                                      Ты предлагаешь перед массивом сделать специальный гэп? А какой?
                                                                      Ответить
                                                                      • > Ты предлагаешь перед массивом сделать специальный гэп? А какой?

                                                                        Специально можно никакого гэпа не делать, это уж как повезет. Если в виртуальном адресном пространстве перед вектором нет места, можно тупо mremap-нуть страницу с вектором в другое место, и сразу перед ним mmap-нуть еще страницу, и туда насрать.
                                                                        Ответить
                                                                        • Этому придется обучить аллокатор?
                                                                          Ответить
                                                                          • Для этого надо редизайнить херню с аллокаторами, да.
                                                                            Ответить
                                                                        • Хотя конечно крестобляди обделались со своими говноаллокаторами, и поддержку mremap не завезли. https://govnokod.ru/27474#comment636512
                                                                          Ответить
                                                                          • > mremap

                                                                            А есть реальные замеры на каком размере вектора это становится эффективнее передвигания элементов?

                                                                            Хотя раз в тыщу элементов наверное норм.
                                                                            Ответить
                                                                          • Кстати, такой вопрос: если у меня массиву некуда расти, и надо переносить его в другое место (например, у меня память на сегментах, и сегмент кончился). Внутри массива лежат объекты, которые не тривиально копируются. Мне надо копирующие или муваюшие конструкторы у них у всех вызывать?

                                                                            Это же блядский ад получается. А если вставлять в голову массива, то такая ситуация будет еще чаще?
                                                                            Ответить
                                                                            • > Внутри массива лежат объекты, которые не тривиально копируются. Мне надо копирующие или муваюшие конструкторы у них у всех вызывать?

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

                                                                              Или вопрос "надо ли тебе руками специально что-то вызывать, или оно само разберется"?
                                                                              Ответить
                                                                              • Разберется оно само, это понятно. Но это вероятно ответ, почему remap не работает
                                                                                Ответить
                                                                                • Вектора из тривиально копируемой хуеты довольно часто встречаются. Ради них можно что-то привернуть.

                                                                                  Просто сам по себе realloc, а тем более ремап, довольно спорные вещи. Гарантированно realloc помогает разве что с одним потоком и последнему блоку. А у ремапа гранулярность большая и он не везде есть. Сложно оптимизировать алгоритмы под них.
                                                                                  Ответить
                                                                                  • А как провернуть, кстати? Сделать спецификации шаблона для тривиальных типов?

                                                                                    По идее же компилятор это может сделать не нарушив стандарт
                                                                                    Ответить
                                                                                    • Да, специализацией. Trivially copyable на то и trivially, что их memcpy можно без нарушения контрактов.

                                                                                      realloc/remap на них тоже бы прокатили если бы не прокрустово ложе крестовых "аллокаторов".
                                                                                      Ответить
                                                                                  • > последнему блоку

                                                                                    Даже если аллокатор держит "большие" объекты в отдельных страничках, там не так уж много места для роста.
                                                                                    Ответить
                                                                    • Для быстрого пушфронта там другой класс есть. И да, это не лист.
                                                                      Ответить
                                                                      • > Для быстрого пушфронта там другой класс есть. И да, это не лист.

                                                                        Про deque я знаю, только это и для vector можно быстро реализовать. Куда быстрее вставки в середину для жирного массива
                                                                        Ответить
                                                                        • С мифическим аллокатором, который абузит 64-битное адресное пространство?
                                                                          Ответить
                                                                          • > С мифическим аллокатором, который абузит 64-битное адресное пространство?

                                                                            Почему бы и нет? Но учитывая что комитет mremap() не осилил, это вряд ли
                                                                            Ответить
                                                                            • Я думаю это не самая лучшая идея для стандартной либы и general-purpose контейнеров.

                                                                              Сделай свою либу с такими контейнерами, может популярной станет. Или в буст втащи.
                                                                              Ответить
                                                                            • > почему бы и нет

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

                                                                          Кстати, почему в крестоговне нет такого варианта вектора, которому можно делать push_front но нельзя push_back? Т.е. чтобы он рос от старших адресов к младшим.
                                                                          Ответить
                                                                      • > Для быстрого пушфронта там другой класс есть. И да, это не лист.

                                                                        А что плохого в том, чтобы привернуть быстрый pop_front для std::vector? Типа там будет лишняя говнопроверка "тут честный вектор, или такой вектор, где будут пустоты вначале, и поэтому надо как-то по особому его освобождать, ведь указатель на нулевой элемент такого вектора не совпадает с началом куска памяти" А есть ли некий сверхбыстрый метод конвертирования std::vector в std::deque?
                                                                        Ответить
                                                                        • давайте сделаем контейнер, что будет списком подмассивов.
                                                                          вставки в начало/конец за O(1)
                                                                          можно в критических местах подмассивы соединять, или разъединять например.
                                                                          Ответить
                                                                          • > давайте сделаем контейнер, что будет списком подмассивов.

                                                                            Это называется "unrolled linked list"
                                                                            Ответить
                                                                      • > Для быстрого пушфронта там другой класс есть. И да, это не лист.

                                                                        Ну и что касается std::deque, там не гарантируется непрерывность хуйни:
                                                                        https://en.cppreference.com/w/cpp/container/deque
                                                                        > As opposed to std::vector, the elements of a deque are not stored contiguously: typical implementations use a sequence of individually allocated fixed-size arrays, with additional bookkeeping, which means indexed access to deque must perform two pointer dereferences, compared to vector's indexed access which performs only one.

                                                                        Что уже по-сути говно для некоторых задач. Как вариант можно было б сделать что-то типа std::vector с запасом в начале для запушивания в голову
                                                                        Ответить
                                                                        • так в этом и есть суть std::deque, что позволяет пушить за O(1), в чем приеб?
                                                                          Ответить
                                                                          • > так в этом и есть суть std::deque, что позволяет пушить за O(1), в чем приеб?

                                                                            В том, что чтоб пушить в массив за O(1), его делить на два или более куска совершенно не нужно. Условие непрерывности куска памяти вполне можно соблюсти
                                                                            Ответить
                                                                            • Если юзать это как очередь (а дек так и юзают обычно), то не окажутся ли периодические перемещения массива дороже чем двухуровневая адресация? Я думаю чуваки всё-таки бенчили.

                                                                              А зачем ещё нужна эффективная вставка в начало вектора?
                                                                              Ответить
                                                                              • Смотря насколько эти периодические перемещения частые, смотря как дорого это перемещение обходится. Для нетривиально-копируемой хуйни оно будет дорого т.к. надо всю срань передвигать, ну и еще говнокомитет не осилил realloc() и mremap() так что передвигать надо будет выделением новой памяти и копированием, что анскилл. Т.е. тут опять проявляется говнистая суть крестов.

                                                                                Но вообще если достаточно много запаса вначале и в конце хуйни сделать, перемещения можно уменьшить
                                                                                Ответить
                                                                                • > mremap

                                                                                  Он ведь тоже не такой дешёвый, как кажется.

                                                                                  TLB чистить вилкой. Фрагментация и оверхед пейджтейблов растёт если неплотно странички выделять. Давление на TLB растёт опять же.
                                                                                  Ответить
                                                                                  • А можно ли включить huge pages на уровне одного приложения?
                                                                                    Ответить
                                                                                    • А их можно разве на все включить?
                                                                                      Ответить
                                                                                      • Я не знаю просто какой там АПИ в операционке: надо чтобы админ эту фичу включил на уровне ОС, чтобы приложения стали мочь (как в случае AWE например) или это каждое приложение может попросить, и там будет галочка в дескрипторе страничек
                                                                                        Ответить
                                                                                        • Там вроде в момент аллокации надо флажок.

                                                                                          З.Ы. А, можно и всем зафорсить автоматом. Только нахуй это надо?
                                                                                          Ответить
                                                                                          • ды, ты прав
                                                                                            mmap(2)
                                                                                            MAP_HUGETLB (since Linux 2.6.32)

                                                                                            VirtualAlloc
                                                                                            MEM_LARGE_PAGES

                                                                                            но в случае спермы надо еще надо попросить ``SeLockMemoryPrivilege ``

                                                                                            а на прыщах вроде ничего не нада
                                                                                            Ответить
                                                                                          • >Только нахуй это надо?

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

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

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

                                                                          Догадываешься, почему?
                                                                          Ответить
                                                                          • > Догадываешься, почему?

                                                                            [color=auto]Потому что кресты - говно, где неосилили заюзать realloc() и mremap(), очевидно.[/color]
                                                                            Ответить
                                                                          • > Есть Неуловимый Джо, а этот класс можно назвать Нереализованный Джо.

                                                                            Кстати, почему в крестах нет класса кольцевого буфера, но зато есть функция Бесселя? Функция Бесселя нужнее?
                                                                            Ответить
                                                                            • в бусте есть
                                                                              Ответить
                                                                              • В бусте много чего есть. Но тащить буст в зависимости ради кольцевого буфера - идея немного сомнительная.
                                                                                Если в стдлибе есть всякие мапы и связные списки, удивительно видеть там отсутствие такой банальной хрени, как кольцевой буфер
                                                                                Ответить
                                                                                • можно в предложку кинуть, там определенно объяснят почему это в stl не нужно.
                                                                                  Ответить
                                                                                  • > там определенно объяснят почему это в stl не нужно

                                                                                    А почему функция Бесселя нужна - тоже объяснят?
                                                                                    Ответить
                                                                                    • Кстати внезапно соглашусь: циклический буфер куда полезнее функции Бесселя. Но возможно, его невозможно реализовать достаточно эффективно на всех платформах.. Хотя я конечно не могу сразу понять проблему, вроде он элементарно делается
                                                                                      Ответить
                                                                            • > Кстати, почему в крестах нет класса кольцевого буфера, но зато есть функция Бесселя? Функция Бесселя нужнее?
                                                                              Потому что «функция Бесселя» нужна только «ма-те-ма-ти-кам». «Ма-те-ма-ти-ки» не хотят программировать, они хотят взять готовые функции и заниматься «ма-те-ма-ти-кой».
                                                                              А «кольцевой буфер» нужен только «микроконтроллерщикам». «Микроконтроллерщикам» же что не давай — они всё равно скажут, у них в «микроконтроллерах» такой хуйни нет, и будут пилить свой велосипед на сишке.
                                                                              Поэтому и смысла нет добавлять в «STL» «кольцевой буфер».
                                                                              Ответить
                                                                        • > Ну и что касается std::deque, там не гарантируется непрерывность хуйни:
                                                                          > Что уже по-сути говно для некоторых задач
                                                                          Так кольцевой буфер тоже нихуя не гарантируент непрерывность хуйни, нет?
                                                                          Ответить
                                                                          • Непрерывный кольцевой буфер можно сделать только имея бесконечную память
                                                                            Ответить
                                                                            • Непрерывный кольцевой буфер можно сделать только не делая его кольцевым.
                                                                              Ответить
                                                                              • Если в качестве адреса взять код грея, то можно сделать непрерывный кольцевой буфер. Разрывов в адресации не найдёшь.
                                                                                Ответить
                                                                                • Это типа

                                                                                  Кот, тко, отк, кот?
                                                                                  Ответить
                                                                                  • 000 001 011 010 110 111 101 100

                                                                                    Всегда только один бит меняется, нету резких перепадов. Собственно поэтому его на крутилках-энкодерах и юзают.
                                                                                    Ответить
                                                                                    • Ну я это и изобразил же)

                                                                                      На самом деле разрыв всё равно будет виден, потому что в какой-то момент N+1 станет больше, чем N
                                                                                      Ответить
                                                                                      • > в какой-то момент N+1 станет больше, чем N

                                                                                        А ты отбрось позиционное исчисление, представь, что это просто 3 независимых бита. Можешь даже переставить биты местами или инвертировать и всё продолжит работать.
                                                                                        Ответить
                                                                                        • Да я бы может и отбросил, только вот префетчер сосет память последовательно, и набивает ею кеш.

                                                                                          И контроллер памяти сосент память последовательно (в рамках одного ранка). Мир-то последовательный, его не наебешь
                                                                                          Ответить
                                                                                          • > префетчер сосет память последовательно

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

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

                                                                                            Т.е. даже DRAM обходить кодом грея вполне возможно, главное чтобы "медленные" биты попали на строчки (в любом порядке), а "быстрые" на колонки (тоже в любом порядке).

                                                                                            А SRAM и подавно. И джвухпортовую SRAM с адресацией по Грею используют на практике для кольцевых буферов, стоящих на границе между джвумя частотными доменами.
                                                                                            Ответить
                                                                                            • Ну окей, если научить всю подсистему памяти грею, то наверное будет работать.

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

                                                                                              DRAM тоже можно сделать "двухпортовым" если память двухканальная, и тогда когда у тебя кончится один канал, ты начнешь как раз читать из другого, а он уже перезаряжен, и открыт..
                                                                                              Ответить
                                                                                    • > Всегда только один бит меняется, нету резких перепадов

                                                                                      Для "зацикленности" этого как бы и не нужно. Ну т.е. достаточно перегрузить операции, чтоб вместо "ptr+a" делалось "start_ptr+((ptr-start_ptr+a)%sz)"

                                                                                      Только memcpy надо на будет на две части разрезать
                                                                                      Ответить
                                                                              • Но если у меня кольцо бесконечного диаметра, то как понять, кольцо ли оно?
                                                                                Ответить
                                                                          • > Так кольцевой буфер тоже нихуя не гарантируент непрерывность хуйни, нет?

                                                                            А где я утверждал, что кольцевой буфер гарантирует какую-то там непрерывность?
                                                                            Ответить
                                                                            • Ну ты в этом треде выступаешь против использования «std::deque» как коллекции с O(1) вставкой спереди, аргументируя тем, что оно не-непрерывное, при этом жалуешься, что в стдлибе нет «кольцевого буфера». Ну так он тоже не-непрерывный.
                                                                              Ответить
                                                                              • Если я жалуюсь на отсутствие "кольцевого буфера", из этого никак не следует, что я считаю его непрерывным. Даже если перед этим я жаловался на то, что "std::deque" не непрерывный
                                                                                Ответить
                                                                              • Кстати, касательно кольцевого буфера, там можно дважды ммапнуть одну и ту же страницу подряд в адресном пространстве, и тогда можно очень удобно писать и читать туда через memcpy. Например тут https://abhinavag.medium.com/a-fast-circular-ring-buffer-4d102ef4d4a3 это описывается
                                                                                Т.е. если мы читаем или пишем около хвоста такого буфера, не нужно делать специальной хуйни "этот кусок берем от головы, а вот этот - от хвоста". Но это конечно тоже не означает никакой непрерывности
                                                                                Ответить
                                                              • >Какой смысл добавлять push_front у вектора?

                                                                Единообразие методов у разных контейнеров.
                                                                Ответить
                                                                • >Единообразие методов у разных контейнеров.

                                                                  А зачем такое единообразие, если паттерны использования их ОБЫЧНО различны?

                                                                  Если уж человек берет кресты, то явно он упарывается по перфыормансу (иначе писал бы на пхп) а значит ему не всё равно, вектор тут или лист
                                                                  Ответить
                                                                  • > А зачем такое единообразие, если паттерны использования их ОБЫЧНО различны?

                                                                    Для тех случаев, когда они НЕ различны
                                                                    Ответить
                                                                    • Когда они не различны, ты можешь взять итератор:) Это наименьшее общее для всех видов контейнеров.

                                                                      Часто ли вообще в крестах ты оказываешься в ситуации, что тебе пофиг что там: лист или массив?
                                                                      Ответить
                                                                      • > Часто ли вообще в крестах ты оказываешься в ситуации, что тебе пофиг что там: лист или массив?

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

                                                  Ну иногда нужно ведь... А push_back добавили как оптимизацию для того случая, который можно сделать чуть-чуть быстрее чем общий случай через insert(). Если бы конпелятор сам догадался и сократил проверки, он был бы нинужен.
                                                  Ответить
                        • J синтаксически гораздо проще многих скриптух, и устроен проще. Есть сложность в восприятии тацитных определений для новичков (типа +/ % # => sum(y) / len(y)). А встроенные примитивы состоят из 1-2 символов и все можно подсмотреть здесь https://www.jsoftware.com/docs/help807/dictionary/vocabul.htm
                          Ответить
                    • А мне нравятся эти фигурные скобочки. Напоминает запись множеств в ма-те-ма-ти-ке. Хотя сейчас для ма-те-ма-ти-ки Питон удобнее, потому что там bigint из коробки...
                      Ответить
                • В далеком прошлом модное говно перестало быть модным и хомячки разбежались, всё просто. И несчастно остались невероятные мелкие современники с хорошей другим историей, не дожидаясь будущих охотников. Но в мае 2017 года мелкие прогрессисты произнесли непростой холуйский очередной победитель премии «Обыкновенный говноклассник», отмечая 60-летие под реконструкцией «Бастиона хорошего говна» в Берлине.

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

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

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

                    На самом деле там соснул перформанс. У Руби действительно очень много хуйни делалось в рантайме, а джита не было, и потому MRI из всей скриптушни был самым медленным
                    Ответить
                    • Скала тоже не блещет перфомансом, т.к. из-за мультипарадигменности ни типичные функциональные, ни императивные оптимизации применить нельзя. Худшее из двух миров. Разработчик компилятора в том известном видео на эту тему бугуртил.
                      Ответить
                      • Ну я сам не бенчмаркил, и за что купил, за то и продаю. Это такое коммон нолидж, что они ушли с RoR на скалку.

                        Может быть прогретый JIT JVM всё таки лучше MRI: Руби вообще не делался изначально с прицелом на перформанс, первой задачей его было "написать что угодно в малое количество строк", и Мац наверное охуел, когда DHH притащил его в веб, и поставил на рельсы.

                        JVM правда тоже не делался до хотспота, но он случился давно.

                        Впрочем, может соснули у них именно рельсы, а не сам руби, надо гуглить.
                        Ответить
                        • > JVM правда тоже не делался до хотспота

                          Проблема в том что скала такое говнище, что сливает и так не очень быстрой Йаже раз в 5-10. Это происходит на той же JVM с тем же Хосподом.

                          Из-за всяких функциональных примочек, лямбд, ленивостей и прочего ФП-говна, под которое JVM не затачивалась.
                          Ответить
                        • Вот бенч где фунциклоп Йажа сливает раз в 5 Йаже с импреациями.
                          https://www.overops.com/wp-content/uploads/2020/09/functional.benchmark.png

                          А Скала и «компилируется»* раз в 10 дольше Жовы, из-за тонн синтаксиального сахара и свистопеределок, которые нужно распарсить.
                          И работает раз в 5-10 медленее.

                          * Хотя мы знаем что там и никакой оптимизирующей компиляции толком ни жавак, ни скалак не делают.
                          Они просто и без затей транслируют в байт-код жвм. А оптимизации делает Хотстоп
                          Ответить
                          • у скалки есть достойный конкурент в виде коко, он тоже любит компилираться в двадцать раз дольше ЙАЖЫ

                            долго типы выводит, долго ищет эксиеншн методы
                            Ответить
                            • Слалка хуже. Там вообще отборная мразь.

                              Хорошо помню как фп-отбросы форсили эту заедуху лет 10 назад: Яжа как Какскель, Яже как Каксель.

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

                              У Хаскеля хотя бы была цельность языка и свежесть концепций. Да и компилится он быстрее.
                              Ответить
                        • Ну как, погуглил?
                          Ответить
                      • > Худшее из двух миров.

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

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

          В итоге надо обновляться в цейтноте и фиксить баги из-за этих сраных идеалистов, а не заниматься своей задачей.

          В случае с питоном 4 параллельно жили бы 2 ветки. Да 10 лет, да с анальной болью. Но это не издевательство над программистом.
          Ответить
          • > потому что минорная хуйня по-любому не будет получать багфиксы

            Final regular bugfix release with binary installers: 3.9.12: Monday, 2022-05-16.
            After that, it is expected that security updates (source only) will be released until 5 years after the release of 3.9 final, so until approximately October 2025.

            Что и требовалось доказать. Особенно весело будет на винде.
            Ответить
            • > Особенно весело будет на винде.

              Самое гнусное что всё больше системных либ перепиливают свои системы сборки на meson.

              Причём новые его версии.

              А meson опчему-то не хочет работать на 3.4, 3.5, 3.6, итд ему нужны всё более и более новые версии Притона.
              Потому будут багры как с браузерами и придётся угадывать версию это параши:
              на слишком старом не работает, а в новом уже всё сломано

              https://docs.mesa3d.org/meson.html
              Mesa’s Meson build system is generally considered stable and ready for production.
              
              Mesa requires Meson >= 0.53.0 to build.

              Пиздец просто. Скоро начнём вспоминать кошмарный autotools с теплотой и любовью.
              Ответить
              • > опчему-то не хочет

                Потому что поддержать несколько версий при такой стабильной стандартной либе -- это на грани фантастики?

                Хуй с ним, можно в докере собирать.
                Ответить
                • > Хуй с ним, можно в докере собирать.

                  mesa-драйвер для видеокарты??
                  Ответить
                  • А что не так?
                    Ответить
                    • А как драйвер будет в докере работать?

                      Если во внешней системе у либ немного другие ABI, то будет пиздец.

                      >А что не так?
                      Было:
                      хочешь собрать руками софт: поставил autotools/cmake и радуешься.

                      Стало:
                      ставишь docker
                      ставишь python
                      ставишь meson
                      ...
                      ПИРДОЛЬ
                      Ответить
                      • А зачем ему там работать? Мы чисто о сборке в контролируемом окружении.
                        Ответить
                        • Ну так если это докер, то по идее он должен быть легко клонируемым.

                          Только проблема в том что собирая одним докером mesa под разные платформы, и разные дистры, с разными версиями либ, она нахуй развалится.

                          То есть придётся каждому пилить сборку в докере "падсибя".
                          Ответить
          • >В случае с питоном 4 параллельно жили бы 2 ветки. Да 10 лет, да с анальной болью.

            Три!!! У меня в дистре python до сих пор резолвится в двойку.

            >> с анальной болью
            >> не издевательство над программистом
            Мсье знает толк.
            Ответить
      • Это не минорная версия.

        Минорная это когда 3.10.1 на 3.10.2 обнвлябля
        Ответить
        • Первая цифра -- мажорная версия, единственный момент, где можно ломать обратную совместимость.
          Вторая цифра -- минорная версия, можно добавлять новые фичи, но не ломать старые.
          Третья цифра -- номер багфикса, должна быть совместима и вперёд и назад.

          У питонят другое понимание этих циферок?
          Ответить
          • кмк не, потому что старые фичи в тройке депрекейтят и ломают постоянно

            влегкую код из 3.4 может сломаться в 3.9. Свинтаксис не, а стандартная либа -- да
            Ответить
            • > депрекейтят

              Т.е. мне надо при выходе каждой "мажорной" версии тройки прочитать весь чейнжлог и пофиксить в моём коде все места, которые могут поломаться? Да, с учётом динамичности языка и отсутствия каких-либо инструментов для этого.

              Замечательная работа, если больше нечем заняться. Сизиф со своим камнем нервно курит в сторонке.
              Ответить
              • Ну типа да, а что?
                https://docs.python.org/3/whatsnew/3.8.html#deprecated

                >he asyncio.coroutine() decorator is deprecated and will be removed in version 3.10.

                The function platform.popen() has been removed, after having been deprecated since Python 3.3: use os.popen() instead. (Contributed by Victor Stinner in bpo-35345.)

                Removed the doctype() method of XMLParser. (Contributed by Serhiy Storchaka in bpo-29209.)
                Ответить
                • > Ну типа да, а что?

                  Видимо мне надо чаще пить смузи и общаться в твиттере.
                  Ответить
                  • Ну справедливости ради, они депрекейтяд говно заранее, то есть лет семь у тебя есть на очистку говна.

                    Но будем честны: в достаточно крупном коммерческом проекте есть много интересных дел, более интересных, чем менять "petuhz()" на "kurochka()" потому, что петухза задепрекейтили
                    Ответить
                    • > они депрекейтяд говно заранее

                      Ну это примерно как опсосы предупреждают про изменения тарифа заранее. Где-то в жопе своего сайта, который надо не забывать читать.
                      Ответить
                      • Мы делаем так: у сипайтона есть ключ чтобы тритить варнинги как ерроры, мы его включаем, и прогоняем тесты

                        то есть тесты у нас падают за пять лет до того, как упадет реальный код

                        депрекейт вызывает ворнинг
                        Ответить
                        • У питона есть ворнинги?! Как включить?

                          Хотя... вот эту хуйню про сепараторы никакие ворнинги не спасут. Тут надо было удалять старую функцию и вводить новую, а не тупо портить семантику.
                          Ответить
                          • >У питона есть ворнинги?!
                            >>> asyncio.coroutine(None)
                            <stdin>:1: DeprecationWarning: "@coroutine" decorator is deprecated since Python 3.8, use "async def" instead
                            <function coroutine.<locals>.coro at 0x7f24045069d0>

                            https://docs.python.org/3/library/warnings.html

                            >Как включить?
                            https://docs.python.org/3/using/cmdline.html#cmdoption-W

                            >портить семантику
                            тут да

                            Торвальдс_и_меммов
                            Ответить
              • Именно поэтому я за Си.
                Ответить
                • Ну да, там хотя бы есть ворнинги про deprecated функции, а когда их всё-таки удалят -- просто ломается конпеляция и достаточно легко всё пофиксить.
                  Ответить
                • MSный компилятор отказывается всякие небезопасные функции вызывать, если ты ему явно не скажешь ключом, чтоб от заткнулся.

                  Правда небезопасность этих функций была признана еще в 90-е вроде, и ключик вот есть
                  Ответить
                  • Тут они перегнули палку, конечно. Потому что у них там почти все функции стандартной либы заявлены как небезопасные и надо юзать их _s версии.
                    Ответить
                    • Там вроде политика партии всегда гласила "пишите на плюсах, и не трогайте вот это вот лоу левел говно", не?
                      Ответить
                      • «Пишите на дотнете, и не трогайте вот это вот лоу левел говно»

                        Пофиксил
                        Ответить
                        • :) ну имелось ввиду "если уж вам нужно лезть в лолевел".

                          Так-то да: даже книжку про программирование под виндавоз Пецольд на C#/CLR перевел. Ну а Рихтер свой Windows via C/C++ на CLR via C# перевел еще раньше
                          Ответить
                  • > отказывается
                    Дык он же просто ворнинг выдаёт.

                    Но да, _CRT_SECURE_NO_WARNINGS — если память не подводит — приходится прописывать в каждом проекте.
                    Ответить
                    • Так то функции прикольные. memcpy_s(), к примеру, принимает и размер входного буфера и размер выходного.

                      Но из-за нестандартности и непереносимости юзать их совсем не хочется.
                      Ответить
                      • > Но из-за нестандартности и непереносимости юзать их совсем не хочется.
                        Подтверждаю.
                        Ответить
                      • > memcpy_s(), к примеру, принимает и размер входного буфера и размер выходного.

                        А нахуя? Если мне надо проверить, имею ли я право скопировать столько-то байтиков оттуда туда, я просто напишу проверку через if()

                        В любом случае такая говнообертка пишется элементарно
                        Ответить
                        • наверное чтобы не вылезти за пределы выходного буфера?
                          Ответить
                          • Ну вот представим что я пишу код вида
                            char * someshit(char *buf, size_t buf_len)
                            {
                              char *buf2 = malloc(buf_len);
                              if (!buf2) return buf2;
                              memcpy(buf2, buf, buf_len);
                              // ... дальше некоторая хуйня
                            }


                            И вот нахуя мне тут нужно писать memcpy_s() и указывать размеры входного и выходного буфера? Это абсолютно бессмысленные и нахуй не нужные в этом случае говнопроверки
                            Ответить
                            • Если же где-то у меня будут сомнения в том, достаточно ли там места, чтобы оттуда скопировать, и достаточно ли там места, чтобы туда скопировать, я могу воспользоваться такой мегафичей языка Си, как "if()"
                              Ответить
                      • > Так то функции прикольные. memcpy_s(), к примеру, принимает и размер входного буфера и размер выходного.

                        https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/memcpy-s-wmemcpy-s?view=msvc-170х

                        Нет. Только размер выходного и количество копируемых байт.

                        errno_t memcpy_s(
                           void *dest,
                           size_t destSize,
                           const void *src,
                           size_t count
                        );
                        Ответить
      • Время жизни среднестатистического проекта на «Python» не превышает период между минорными обновлениями, поэтому всё в порядке.
        Ответить
    • Кто без гуглёжки вспомнит HTML-элемент, генерирующий строку запроса с ровно двумя параметрами, разделёнными запятой?
      Ответить
      • Какой-нибудь слайдер с двумя бегунками?
        Ответить
        • Нет там бегунков.
          Ответить
        • в html есть слайдер??
          Ответить
          • Неибу, если честно. Его руками скриптуют, получается?
            Ответить
            • Готговый есть в куче разных фрейммворков, но вроде в голом HTML нет.
              Ответить
            • Вообще есть <input type="range">, но применяется редко, потому что разные браузеры его по-разному отображают, что не нравится дизайнерам.

              https://developer.mozilla.org/ru/docs/Web/HTML/Element/Input/range
              Ответить
              • Это новодел какой-то.
                https://developer.mozilla.org/ru/docs/Web/HTML/Element/Input/range

                вон, даже в девятом IE не работает.
                Ответить
                • В Опере и в Фуррифоксе с древнейших времён работал. На сайтах не использовали, потому что было слишком много пользователей IE.
                  Ответить
        • Сдаёшься или ещё погадаешь? У количества параметров есть простое обоснование.
          Ответить
      • image map?
        Ответить
        • Так точно!

          Карт два типа: client-side (когда нарезаешь фигуры в HTML) и server-side (когда сервер обрабатывает координаты).

          Server-side image map отправляет две координаты, разделённые запятой.
          Ответить
          • Бля, как же я давно это не юзал
            Ответить
            • А для чего оно используется на практике? На какой-нибудь карте города кликать?
              Ответить
              • Был когда-то в начале 2000х сайт с большим черным квадратом, где каждый пиксель отправлял тебя на какой-то сайт.
                В принципе, можно кнопки и вообще интерфейс какой угодно сложной формы рисовать, а на сервере разбирать, куда кликнули. Но без всяких подсветок при наведении и прочих плюшек, это оказалось нахрен не нужным.
                Ответить
                • Дело не в плюшках, а просто очередной говностартап сгнил. Это крупнейшая в мире производительная платформа на русском языке, которая так тащит цены. Речь идет о BHive — гигантской платформе на русском, которая позволяет вам использовать не только большие вычислительные трудоустройства, но и новые вакансии и доходы. Как учат из ИИ в компьютерах молодые люди, заработавшие немного меньше денег, так и сотрудники концерна IBM, которые � 25 млн рублей, создали русское экосистемное инвестирование.

                  Проект решил заменить голого планшета на производство компьютеров, которые могут распознавать фразы и продукты и отправлять стихи каждому участнику раз в неделю. Без участия стариков и полицейских, проверяющих правоохранительные органы, каждый мог почитать стихи без контроля и внести обновления в текст. Реализация сделала это проще и быстрее. Помимо стихов, большие компьютеры также распознают и выдают последовательно обратно запись любого пользователя в сеть для посещения места сооб�щения, предоставляя доступ к многим экспертизам и декоммуникациям пользователей. Это можно сделать так, чтобы пользователи могли увидеть прогресс за один день, а средства слежения позволили задержать неисправимого по причине бессовести. Эта система распределилась по всему миру через несколько недель.
                  Ответить
    • кто-то пользуется https://docs.ceph.com/ ?
      Ответить
    • # Python 3.5 - 4.3
      import pypparse.requestor
      print(s(pypparse.requierters()))
      {"sport":["nba,cub football,wc football]","a,k\\":[]
      {"a":['bagor, kikir'],"_":[["1,2;4"]]},''
      }
      
      # Perl 5 and 6
      use LWP ();
      
      my $uri =  https:''
      qr->param('q=foo`+bar&pf=">~$%^?@\u0002+'..']); do '%s.{'} ->
         grep {/([\\\x20-\x20]+?)=>([\w']*?)(+=[)]/, map("&", '?q=>$2', "$1.");
      close SQS('s.\{0\}', 'f='.Qq{qq/}[0] );`
      /([\\\x20--@`])+?(?:+&[0|-]?\S+=$[0]=).*/dmg for
      q->grep {/foo=([*&'\(\)+?\/\[]+$f.g[4][0],"%/'}@m
      '^%[-/:=]?a?=((\S)*=".($f(".(?!/\Z)", "$2)?")?))') {my/}[3],m$m->d[3];s/(@\Km$(/s->;
      my s@(/(\.b)/g)[g->s=g] ;e s'($f'('.r[3]}($2')),$/ ;bq{;r\}$s{1/);\Q"|" s/"|/dmg;
      $/ !=~ $0 -> print;}'{print}'$uri?r;}gmy $_<1/ for
      $! = do
      $_!;
      my ($nameref!, $methodname,);
      {say "Hello, "s=>(sub{ print;() })->$meth();
      sub hello(){ ()-> print(' World!!!'); return("ok"); }}->$s->$t($t(m$s,'',0));
      ($m->($s), "$name, "$0)<(3,) for map {qq{ $_ ?q[
      .l=() q,+
      } $^m, $^x,  $m.$m, ($m=$@)|$b .=qq $c=~[
      [].s<([[:alnum]+<!(:a=_:_])@.
      |-([[\W(]s:;>\d|-s<(\W.d);$^s=(sub()->$r;
      ((s/(.*)_=/)=~"\G(s)\K(=.*)" || die $_))() ),.{$z)()}($b:=~"(.)$f=");()->.y:$q.);/i,s]))q]@<[^,>]/,
      $f = $g.$e,q(.)/$&=() }<x->q();($b).y.c->z.h->y->z.);
      {
      ($h-><t)
      .l='s"$x">%s'.d,q/$h; $p:=(-:!^@*; $e:=[<s*>
      $k->q . $h.'*
      %x';$l=~$d=~$w=`q@g'(,q(<-s)*$t> $f.)d($@):/ $a=()<d{%b $t=~(:$j='&s;<($;{$'
      q($g@g), $y.)&;lq>{l;};q() );/'{' $a$g=~($w.$z.$g=~y.
      d=([] $c=~qq);&>$;
      Ответить
      • Код в целом логичный и понятный любому, кто знает Perl, но есть вопросы по седьмой строчке
        Ответить
    • Файк тоже недавно жаловался что в 3.10 притоношлюхи сломали кал-лекции.

      https://govnokod.ru/27914#comment756889

      Похоже там засели какие-то неадекваты, решившие всё развалить нахуй.

      Мне в общем насрать, но ужасает что сборка всех сишных либ в последнее время переводится на сраный meson.
      Ответить
    • Changed in version 3.10: Added separator parameter with the default value of &. Python versions earlier than Python 3.10 allowed using both ; and & as query parameter separator. This has been changed to allow only a single separator key, with & as the default separator.
      > python3 --version
      Python 3.9.7
      > urllib.parse.parse_qs('a=foo;b=bar')
      {'a': ['foo;b=bar']}
      Т.е. они даже не знают, в какой версии сломали совместимость...
      Ответить
      • А если открыть доку от 3.9, то там видно весь ужас ситуации:

        Changed in version 3.9.2: Added separator parameter with the default value of &. Python versions earlier than Python 3.9.2 allowed using both ; and & as query parameter separator. This has been changed to allow only a single separator key, with & as the default separator.

        Т.е. это не опечатка, а намеренная попытка скрыть факты и замести своё говно под ковёр.
        Ответить
      • Минор сломали из-за CVE-2021-23336
        https://bugs.python.org/issue42967
        https://github.com/python/cpython/commit/fcbe0cb04d35189401c0c880ebfb4311e952d776
        
        Adam, SHUT THE FUCK UP!
        And I don't _ever_ want to hear that kind of obvious
        garbage and idiocy from a python maintainer again. Seriously.
        
        WE DO NOT BREAK USERCODE!!!
        Ответить
        • But the W3C standards evolved and now suggest against considering semicolon (";") as a separator.

          When the attacker can separate query parameters using a semicolon (;), they can cause a difference in the interpretation of the request between the proxy (running with default configuration) and the server.

          Какой же пиздец всё-таки этот веб... Устроили проблему на ровном месте.
          Ответить
          • Ради исправления говнофрейморков вроде Bottle (CVE-2020-28473) и Tornado сломали поведение для всех остальных.

            Уёб-мразь добровольно села наBottle.

            Я теперь понял что питонист Сёма имел ввиду когда говорил сесть набутылку.
            https://snyk.io/vuln/SNYK-PYTHON-BOTTLE-1017108
            Ответить
            • Тут скорее вопрос, а нахуй вообще было в изначальной спеке HTML джва сепаратора делать?
              Ответить
              • — Слышь, что будем делать сепаратором, ; или & ?
                — Пиши пока оба, там разберёмся.

                Это вопрос из ряда «а какого хуя в comma-separated values сепаратором выступает не запятая»
                Ответить
              • А где они были? HTML4 только & допускает. Неужели в тройке было два сепаратора?
                Ответить
                • Говорят, что в HTML 4 где-то в сноске ";" ещё упоминалась.
                  Ответить
                  • Нашёл в HTML2:
                    https://datatracker.ietf.org/doc/html/rfc1866#page-40

                    Этот стандарт тоже требует, чтобы браузер при отправке формы разделял паметры знаком &.

                    Однако, он допускает, что сервер может обрабатывать точку с запятой наравне с &, чтобы в готовых ссылках в HTML-коде не нужно было экранировать амперсанды через &amp;

                    HTTP server implementors, and in particular, CGI
                    implementors are encouraged to support the use of
                    `;' in place of `&' to save users the trouble of
                    escaping `&' characters this way.
                    Ответить
                    • Я раньше!
                      Ответить
                    • А теперь возникает вопрос: а нахуя они выбрали "&" в качестве сепаратора для форм, если он явно конфликтовал с использованием "&" в HTML?
                      Ответить
                      • Видимо, не подумали, что кто-то будет генерировать такие URL не формами, а захочет вставить ссылку с готовыми собранными get-параметрами.

                        Чтобы было труднее делать CSRF: злоумышленник забудет заменить & на &amp; и обломается.
                        Ответить
                        • А браузеры ведь парсят незаэкранированные ссылки...
                          Ответить
                          • Верное замечание. Необходимо срочно запретить браузеры во избежание.
                            Ответить
                          • И то верно. Валидатор посылает ня хуй, а браузеры прощают ошибки.
                            Ответить
                • Ну вот в RFC 1866 (HTML 2.0) есть такая заметка:

                  HTTP server implementors, and in particular, CGI implementors are encouraged to support the use of `;' in place of `&' to save users the trouble of escaping `&' characters this way.

                  Веб-макаки ленились &amp; писать в ссылках, в общем.
                  Ответить
        • > Минор сломали из-за CVE

          Почему бы тогда честно не написать в доке, что изменение вступило в силу в 3.9.2?
          Ответить
          • постеснялись, и соврали. А потом стеснялись признаться, что соврали. Как в сказке про маленького Ленина, который сказал неправду
            Ответить
            • Бабалоба старательно темнит когда вопрос касается красных:

              Q: Как понять, что коммунист лжет? Помогите, пожалуйста, ответьте, что я могу вообще сказать по поводу этого.

              Ответ: Понимайте один час. Чем коммунист лжет? Проще всего заканчивать этот вопрос с тем, что коммунист — это только работник нерушительной коммунистической партии. Он часто спорит с теми, кто считает коммунистическую партию нерушительной. Он считает ее нерушительной потому, что не преступники �? ведь она не прибыла в целом к программам коммунизма для того, чтобы наживаться на деньгах. Посмотрите ее коммунистическую программу и вы убедитесь, что не наживается на деньгах.
              Ответить
      • > urllib.parse.parse_qsl
        > urllib.parse.parse_qs

        Что мешало сделать новую функцию:
        urllib.parse.parse_amp

        А старую задепрекейтить?
        Ответить
    • Остросюжетный угандийский боевик более всего поражает спец-эффектами
      https://youtu.be/uYD5japaxsg?t=72
      Ответить

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