1. PHP / Говнокод #25358

    +2

    1. 1
    2. 2
    3. 3
    4. 4
    https://www.quora.com/As-a-software-engineer-in-your-opinion-what-are-the-biggest-bottlenecks-and-or-inefficiencies-in-programming-today
    
    
    The key to overcoming this bottleneck, I believe, is live coding, whereby you can inspect and modify code and data while the program is running. Detect a bug? No problem. Immediately inspect the code and data to determine the cause. Make the appropriate changes. Continue execution. No need to save the code, compile the code and rerun the program from the beginning.

    оказывается то, что делали пхпшники начала нулевых, правя по FTP в Notepad++ файлы на живом сервере это т.н. "Live coding", и за этим будущее

    Запостил: gueest8, 06 Февраля 2019

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

    • seo: Peace door ball
      Ответить
    • Именно поэтому я за «PHP».
      Ответить
    • Это хуйея, вот в S" Forth" действительно S" Live coding" определения можно вводить и отлаживать интерактивно, и в форт-систему может быть даже встроен какой-нибудь редактор, жаль только, что редактор и способы сохранения системы не стандартизированы и везде разные.
      Ответить
    • да здравствует php 7.3 с поддержкой JIT compilation failed: no more memory
      Ответить
      • > PHP 7.3
        > Новые возможности
        > ...
        > - Добавление функций array_key_first() и array_key_last()

        Ебать мой хуй! Свершилось!
        Ответить
        • Это шо? Итераторы?
          Ответить
          • <?php
            $array = ['a' => 1, 'b' => 2, 'c' => 3];
            
            $firstKey = array_key_first($array);
            
            var_dump($firstKey);//string(1) "a"
            ?>

            http://php.net/manual/en/function.array-key-first.php
            Ответить
          • array_key_first — Получает первый ключ массива
            array_key_last — Получает последний ключ массива

            Раньше можно было только получить значение первого или последнего элемента функциями reset и end соответственно. Правда, очевидные названия?

            Ну ещё для получения ключа первого элемента можно было использовать такую кобенацию:
            foreach($mosiv as $key=>value) {return $key;}

            С получением ключа последнего элемента (если массив разреженный) было хуже, потому что цикла в обратном направлении нет.
            Ответить
            • Понятно. Спасибо.
              Длинные какие-то названия. То ли дело «begin()» и «end()»! Именно по этому я за «C++».
              Ответить
              • То ли дело «Питон», где выражение a[-1] возвращает последний элемент массива. Можно даже предпоследний достать через a[-2]. И предпредпоследний...
                Ответить
                • А побитовое отрицание позволяет индексировать массив с конца:
                  >>> a = [1,2,3]        
                  >>> a[0], a[1], a[2]   
                  (1, 2, 3)              
                  >>> a[~0], a[~1], a[~2]
                  (3, 2, 1)
                  Ответить
                  • <?php
                    
                    class MyArray implements ArrayAccess  {
                      private $data = array ();
                      private function realOffset($offset) {
                        return $offset + count($this->data) * intval($offset < 0);
                      }
                      public function offsetGet ($offset) {
                        return $this->data[$this->realOffset($offset)];
                      }
                      public function offsetExists ($offset) {
                        return array_key_exists( $offset, $this->data) 
                            || array_key_exists(~$offset, $this->data);
                      }
                      public function offsetSet ($offset, $value) {
                        $this->data[$this->realOffset($offset)] = $value;
                      }
                      public function offsetUnset ($offset) {
                        unset($this->data[$this->realOffset($offset)]);
                      }
                      public function __construct() {
                        $this->data = func_get_args();
                      }
                     }
                    
                    $m = new MyArray(4, 5, 6);
                    echo sprintf("m[0] =%d, m[1] =%d, m[2] =%d\n", $m[0],  $m[1],  $m[2]);
                    echo sprintf("m[~0]=%d, m[~1]=%d, m[~2]=%d\n", $m[~0], $m[~1], $m[~2]);


                    https://ideone.com/viiqHn
                    Ответить
                  • Замечу что в 'J' нет побитовых операций, а значит сам язык не привязан к двоичным конпуктерам.
                    Ответить
                  • Гениально. Надо будет в жс в некоторых slice-подобных функциях такое попробовать.
                    Ответить
                  • Удваиваю 1024--. Тильда добавляет элегантности.

                    Обычно с её помощью -1 приводят к false.
                    if(~arr.indexOf(something)){
                    Ответить
                    • Помница, меня тут ругали за такие хацкерские проверки.
                      Ответить
                      • Кто ругал? Набежали адепты сишных и крестовых стандартов, которые сказали, что это implementation defined behaviour, потому что не будет работать на машинах с прямым и обратным (one's complement) кодом?
                        Ответить
                        • хороший коммент
                          http://govnokod.xyz/_25358/#comment-434913

                          и вывод классный
                          Ответить
                        • В S" Forth" числа должны быть представлены в допойнитейном коде. Именно поэтму я за S" Forth".
                          Ответить
                      • хороший коммент
                        http://govnokod.xyz/_25358/#comment-434913

                        и вывод классный
                        Ответить
                        • Какой багор )))
                          Какой багор )))
                          Какой багор )))

                          А как это получилось?
                          Ответить
                          • Тест:
                            NB. ну и, конечно, отрицательные индексы тоже работают:
                               _1{i.5
                            4
                               _2{i.5
                            3
                            Ответить
                            • Ещё тест:
                              _2{i.5
                              3
                              Ответить
                            • NB. ну и, конечно, отрицательные индексы тоже работают:
                              _1{i.5
                              4
                              _2{i.5
                              3
                              Ответить
                              • Без тега CODE не распидорашивает. Нужно в CODE завернуть:

                                NB. ну и, конечно, отрицательные индексы тоже работают:
                                   _1{i.5
                                4
                                   _2{i.5
                                3
                                Ответить
                            • Тест:
                              NB. ну и, конечно, отрицательные индексы тоже работают:
                                 _1{i.5
                              4
                                 _2{i.5
                              3
                              Ответить
                          • Кстати, на РУ хуйлайтер распознал код как «avrasm», а на ХУЗ –— как «xml».
                            Ответить
                        • Test
                          {{
                          Ответить
                • То ли дело 'J', в котором есть встроенные глаголы для получения/отбрасывания первого/последнего элемента:
                  i.5
                  0 1 2 3 4
                     {.i.5
                  0
                     {:i.5
                  4
                     }.i.5
                  1 2 3 4
                     }:i.5
                  0 1 2 3
                     NB. ну и, конечно, отрицательные индексы тоже работают:
                     _1{i.5
                  4
                     _2{i.5
                  3
                  Ответить
                  • То ли дело «car» и «cdr»…

                    А есть в «J» бесконечные списки?
                    Ответить
                    • Нет, никаких бесконечностей и ленивостей я в нём не нашёл.
                      Ответить
                      • А в руби есть и бесконечность и ленивость
                        (1..Float::INFINITY).first(42)
                        
                        интересно что
                        (1..Float::INFINITY).select {|n| n % 10 == 0}
                        поставит систему роком
                        
                        но если ее сделать ленивой то...
                        (1..Float::INFINITY).lazy.select {|n| n % 10 == 0}.first(42)


                        Именно потому я за "Ruby'
                        Ответить
                    • Но вообще 'J' умеет оптимизировать и не вычислять лишнего:
                      3 {. i.5000000
                      NB. работает значительно быстрее чем
                      i.5000000
                      Наверное первый вариант сокращается до i.3

                      Интересно, ([email protected]*:) сделает джва прохода по массиву или сунет эти операции в один цикл. К сожалению исходники плохо поддаются онализу:(
                      Ответить
                      • Но на limit error всё равно можно нарваться.
                        Ответить
                      • Простите, я напиздел, оно тормозило из-за вывода, a =: i.5000000 работает быстро.
                        Ответить
                        • 20-летняя студентка Аруши Дуа из Индии написала письмо Марку Цукербергу, в котором попросила его добавить в фейсбуке кнопку On my period («У меня менструация»).
                          Ответить
                          • Почему бы просто в статусе об этом не написать?
                            Ответить
                            • Вероятно речь о нормализации. Зачем писать длинное сообщение (да и к тому же разное у всех) когда можно просто сделать булев флажок?
                              Флажок вообще может занимать один бит.

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

                              Если период хранить битом то это вообще один AND, плёвая операция
                              Ответить
                          • Это не я.
                            Ответить
                          • Предлагаю добавить кнопки "У меня геморрой", " У меня понос", "Дрочу", "Ссу/сру".
                            Ответить
                            • почему для ссу и сру одна кнопка? что за экономия?
                              Ответить
                              • У петухов клоака, поэтому помёт с мочой смешивается.
                                Ответить
                              • memcpy/memccy
                                Ответить
                                • CCY - compare copy? Что-то типа compare exchange?
                                  Ответить
                                  • Может "C" —– это "CHAR"? Типа как в S" Forth" есть ' MOVE ( перемещает адресуемые элементы ) и есть ' CMOVE ( перемещает символы ).

                                    ЗЫ. в сях есть аналог ' CMOVE> ( перемешает от наибольших адресов к наименьшим )?
                                    Ответить
                                    • В сях есть memcpy() с неопределённым поведением если буфера пересеклись и memmove(), который выбирает направление чтобы сделать заебись (как-будто через временный буфер).

                                      Явно направление задать нельзя. А надо ли?
                                      Ответить
                                      • > memcpy() с неопределённым поведением если буфера пересеклись

                                        В S" Forth" ' CMOVE и ' CMOVE> с фиксированным направлением , а ' MOVE сам выбирает направление, никакого UB в этом случае. Именно поэтому я за S" Forth".

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

                                        В общем, действительно, положение неопределённое.
                                        Ответить
                                      • >> Явно направление задать нельзя. А надо ли?

                                        В случае MMIO или ещё каких-нибудь побочных эффектов направление может оказаться важным.
                                        Ответить
                                        • Если ты работаешь с MMIO посредством memcpy то ты немного рискуешь кмк.

                                          memcpy больше для идемпотентной памяти
                                          Ответить
                                        • > MMIO
                                          В MMIO области вообще страшно без volatile писать. А аргумент memcpy() не volatile.

                                          З.Ы. На stm32f4 прикольно сделана mmio зона для usb. Она несколько килобайт, но оффсет внутри неё ни на что не влияет - твои данные тупо падают в очередь на отправку.
                                          Ответить
    • {kokoko
      Ответить
    • kokoko}kokoko
      Ответить

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