1. JavaScript / Говнокод #20265

    −38

    1. 1
    function foo() { return typeof null === 'undefined'; } for (var i = 0; i < 1000; i++) console.log(foo());

    Открываем стабильный хром и запускаем в консоли.

    Запостил: defecate-plusplus, 24 Июня 2016

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

    • а можно для тех, кто на работе и кому айтишники разрешают только IE11 использовать хотя бы результат сюда написать?
      Ответить
      • N раз выводится false, потом M = 1000 - N раз выводится true.

        Наблюдавшиеся мной значения N и M:
        134 : 866
        131 : 869
        132 : 868
        262 : 738
        263 : 737

        UPD:
        https://bugs.chromium.org/p/chromium/issues/detail?id=604033
        Ответить
      • Лохыч, как дела?
        Ответить
      • ебать, ты нещасный
        Ответить
    • показать все, что скрыто🔶
      Ответить
    • Я в жаваскрипте не шарю. Поведение этого говнокода неправильное?
      Просто в плюсах, например, тоже можно понаписать говнокода, который будет выдавать рандомные результаты - это называется undefined behavior. Такой код просто не надо писать.
      Возможно сабжевый говнокод - это тоже типа UB?
      Ответить
      • показать все, что скрытов скриптовых ЯПах редко бывает UB
        JS взял "worst from both worlds" просто
        Ответить
      • показать все, что скрыто>который будет выдавать рандомные результаты
        Это наследие низкоуровневых языков, когда в переменные попадает неинициализированная память. Нахуя это в и так тормозных скриптовых языках?
        Ответить
        • Ну в скриптовых языках UB может возникать не из стремления к перфомансу, а из стремления развязать руки реализациям. Если какое-то действие - заведомо хуита, то и не надо заморачиваться над определением поведения этого действия. По памяти же сабжевый говнокод не ездит.
          Ответить
          • > Если какое-то действие - заведомо хуита, то и не надо заморачиваться над определением поведения этого действия.
            А в стандартик таки поднасрали, пользуясь отрицанием этого глубокого утверждения :(
            [undefined].map(x=>1);
            Ответить
            • ну и будет один, что тут такого ?
              Ответить
              • Фу, JS - говно для петушар.
                Имел в виду
                Array(1).map(x=>1);

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

          Лолшто? Большую часть UB в сишках/крестах порождают отнюдь не переменные с мусором, а тот факт что там вокруг UB.
          Даже такая тупая штука как сдвиг и та UB-unsafe.

          uninitialized линтеры отлично отлавливают. Проблемы браузеров - фатальное сочетание чрезмерной их сложности, хуёвых языков и поистине царских питумизаций.
          Ответить
        • показать все, что скрытоvanished
          Ответить
      • >Поведение этого говнокода неправильное?
        1. Однопоточный недетерминизм.

        > typeof null === 'undefined'
        2. Прямое копротивление штандарту.
        Ответить
    • показать все, что скрытомы в дубаи ёптель
      Ответить
    • Для тех, кто боится ко-ко-ко-консоли:
      http://codepen.io/anon/pen/JKERaZ
      Ответить
      • Хром 51.0.2704.103, тысяча false-ов.
        Ответить
        • А ведь действительно, console.log(foo()) даёт случайные результаты, а если результат вызова foo() положить в переменную, то результат ВНЕЗАПНО становится детерминированным.
          Ответить
          • Охщи, мне кажется, мы имеем дело с отсутствием-присутствием наблюдателя и схлопыванием волновой функции (вроде так). Дело куда фундаментальней, чем может показаться на первый взгляд.
            Ответить
          • показать все, что скрытоЛол, мне кажется, это фишка связанная с оптимизацией.
            Ответить
    • показать все, что скрытоА в Амиго нет такой хуйни!
      Ответить
    • показать все, что скрытопофиксал, теперь работает стабильно
      function foo() { return typeof (null === 'undefined'); } for (var i = 0; i < 1000; i++) console.log(foo());
      Ответить
    • function foo() { return typeof null === 'undefined'+''; } for (var i = 0; i < 1000; i++) console.log(foo());
      так тоже работает
      Ответить
      • А почему не должно, ведь 'undefined'+'' === 'undefined'? Или была надежда на то, что 'undefined' — это какое-то магическое значение?
        Ответить
        • если 'undefined'+'' === 'undefined' то почему не работает:

          function foo() { return typeof null === 'undefined'; } for (var i = 0; i < 1000; i++) console.log(foo());

          прикольно просто что в глючный вариант добавляешь часть которая вроде ничего не меняет, а глюк пропадает

          если добавляешь use strict вначале - то уменя в два раза чаще false появляются
          Ответить
          • Такого варианта я ожидать не мог.

            Выходит, что когда выражение без +'', Хром включает какую-то оптимизацию и оптимизатор всё портит?
            Ответить
          • Проверил в клоне Хрома.

            Iron 50:
            typeof null === 'undefined' возвращает 164 раза false и 836 раз true.
            С 'use strict' возвращает 333 раза false и 667 раз true.
            typeof null === 'undefined'+'' всегда возвращает false.

            Iron 49:
            typeof null === 'undefined' всегда возвращает false. Воспроизвести глюк не удалось.

            Что-то сломали в 50-й версии.
            Ответить
    • 'use strict'; добавьте вначале еще
      Ответить
    • Ха-ха-ха, хромоги опять всех подебили.
      Благо у меня:
      1. нет автообновления
      2. не юзаю хром кроме как реплицировать баги
      Ответить
    • показать все, что скрытоБОЯН

      В vk уже несколько дней срут это
      Ответить
    • Хуйня ваш "Chrome", то-ли дело "Firefox"...[/color]
      Ответить
      • Даже 11 ишакэдж и тот лучше.
        Ответить
        • выполни parseInt(new Date().toLocaleString("ru",{day:'numeric '})) в консоли эдж и попробуй не перестать моч
          Ответить
          • В ΙΕ9 и в Опере/Престо будет 25.

            Фуррифокс и Хром матерятся на пробел после слова “numeric” (точнее, они не сообщают, что виноват пробел, они лишь пишут, что значение numeric “out of range”, а лишний пробел можно заметить только при внимательном рассмотрении).

            Сафари (в Windows) молча возвращает NaN. Убрав вызов parseInt, я понял, что Сафари игнорирует параметры toLocaleString. В общем, заставить его сменить формат мне не удалось.

            А что показывает Эдж?
            Ответить
            • P.S. В общем, в Фуррифоксе и в Хроме toLocaleString для даты работает нормально. В других браузерах на реализацию этой функции полагаться не сто́ит.

              Ну хоть что-то в Хроме сделали правильно.
              Ответить
              • > в Фуррифоксе и в Хроме toLocaleString для даты работает нормально
                В Firefox toLocaleString может выдать питушню на час больше. Я такое видел под линуксом, хотя под виндою у меня всё работает, в отличие от других https://bugzilla.mozilla.org/show_bug.cgi?id=1147872
                Ответить
                • показать все, что скрыто> US Ends daylight time Nov 1 so you won't see the error again until April.
                  Лол. Воркэраунд - подождите до ноября.
                  Ответить
                • А это вообще трудноуловимая питушня. В одних программах преобразование дат выполнено через системные библиотеки, в других через ICU (двадцатиметрового роста, в сучках и наростах), в третьих — вообще изобретён велосипед. Может даже так получиться, что toString и toLocaleString реализованы разными способами.

                  В общем, в кино нам обещают самошнурующиеся кроссовки и летающие автомобили, а в реальности в 2016-м году нет стандартного способа обновления таблиц часовых поясов, которые пидорасы-правители меняют каждые полгода, хотя каждый раз обещают, что этот раз последний.
                  Ответить
                  • Ты достучался до моего сердца (см. моё нытьё о телефонных номерах)!
                    Ответить
                • Поймать расхождение на час мне не удалось. Вероятно, у чувака в системе табличка часовых поясов была устаревшая.

                  Зато удалось обнаружить кое-что другое:
                  Opera 12.17
                  toString	        Sat Jun 25 2016 13:01:02 GMT+0300
                  toLocaleString	        25 июня 2016 г. 13:01:02
                  toLocaleString("en")	25 июня 2016 г. 13:01:02
                  toLocaleString("ru")	25 июня 2016 г. 13:01:02
                  
                  IE 9
                  toString                Sat Jun 25 13:01:27 UTC+0300 2016 
                  toLocaleString          25 июня 2016 г. 13:01:27 
                  toLocaleString("en")    25 июня 2016 г. 13:01:27 
                  toLocaleString("ru")    25 июня 2016 г. 13:01:27 
                  
                  Safari 5.1.7
                  toString	        Sat Jun 25 2016 13:03:07 GMT+0300 (RTZ 2 (çèìà))
                  toLocaleString	        Saturday, June 25, 2016 13:03:07
                  toLocaleString("en")	Saturday, June 25, 2016 13:03:07
                  toLocaleString("ru")	Saturday, June 25, 2016 13:03:07
                  Ответить
                  • (продолжение)

                    Iron 9 (Chrome 9)
                    toString	        Sat Jun 25 2016 13:29:02 GMT+0300 (Russia Standard Time)
                    toLocaleString	        Sat Jun 25 2016 13:29:02 GMT+0300 (Russia Standard Time)
                    toLocaleString('en')	Sat Jun 25 2016 13:29:02 GMT+0300 (Russia Standard Time)
                    toLocaleString('ru')	Sat Jun 25 2016 13:29:02 GMT+0300 (Russia Standard Time)
                    
                    Iron 18 (Chrome 18)
                    toString	        Sat Jun 25 2016 13:31:26 GMT+0300 (RTZ 2 (зима))
                    toLocaleString	        Sat Jun 25 2016 13:31:26 GMT+0300 (RTZ 2 (зима))
                    toLocaleString('en')	Sat Jun 25 2016 13:31:26 GMT+0300 (RTZ 2 (зима))
                    toLocaleString('ru')	Sat Jun 25 2016 13:31:26 GMT+0300 (RTZ 2 (зима))
                    
                    Iron 20 (Chrome 20)
                    toString	        Sat Jun 25 2016 13:30:09 GMT+0300 (RTZ 2 (зима))
                    toLocaleString	        6/25/2016 1:30:09 PM
                    toLocaleString('en')	6/25/2016 1:30:09 PM
                    toLocaleString('ru')	25.6.2016 13:30:09
                    
                    Chrome 49
                    toString	        Sat Jun 25 2016 13:02:01 GMT+0300 (RTZ 2 (зима))
                    toLocaleString	        25.06.2016, 13:02:01
                    toLocaleString("en")	6/25/2016, 1:02:01 PM
                    toLocaleString("ru")	25.06.2016, 13:02:02
                    Ответить
                  • (окончание)

                    Palemoon 26 (Fx 45, Goanna/2.1)
                    toString 	        Sat Jun 25 2016 13:03:59 GMT+0300
                    toLocaleString 	        25 Июнь 2016 г. 13:03:59
                    toLocaleString("en") 	25 Июнь 2016 г. 13:03:59
                    toLocaleString("ru") 	25 Июнь 2016 г. 13:03:59
                    
                    Seamonkey 2.40 (Fx 43)
                    toString 	        Sat Jun 25 2016 13:01:05 GMT+0300
                    toLocaleString 	        25.06.2016, 13:01:05
                    toLocaleString("en") 	6/25/2016, 1:01:05 PM
                    toLocaleString("ru") 	25.06.2016, 13:01:05
                    
                    Firefox ESR 24
                    toString	        Sat Jun 25 2016 13:26:02 GMT+0300
                    toLocaleString	        25 Июнь 2016 г. 13:26:02
                    toLocaleString('en')	25 Июнь 2016 г. 13:26:02
                    toLocaleString('ru')	25 Июнь 2016 г. 13:26:02
                    
                    Firefox ESR 31
                    toString	        Sat Jun 25 2016 13:27:35 GMT+0300
                    toLocaleString	        25.06.2016, 13:27:35
                    toLocaleString('en')	6/25/2016, 1:27:35 PM
                    toLocaleString('ru')	25.06.2016, 13:27:35
                    Ответить
                    • И не лень?

                      >интервал между постами < 1 мин.
                      Поделитесь секретом. Какой-нить karma-runner, который запускает тест в N браузерах?
                      Ответить
                      • Нет, но я думал об этом.

                        Продолжим шоу. Тест на удалённых машинах в Линуксе:
                        http://browsershots.org/http://codepen.io/anon/pen/ZOLvGQ

                        Тест на удалённых машинах в Макоси:
                        http://browsershots.org/https://jsfiddle.net/yrqh95qs/

                        Результатов в Макоси пока нет, но вы там держитесь периодически нажимайте кнопку «Extend», пока не дойдёт очередь.

                        Кстати, у кого-нибудь с Говнокода есть доступ к Макоси? Уже стало интересно, как в ней реализовали toLocaleString в разных браузерах.
                        Ответить
                        • Зря я выбрал jsfiddle. По крайней мере, удалось увидеть, что Фуррифокс 29 на Макоси отработал правильно (как у меня Firefox ESR 31), а Фуррифокс 26 вывел примерно как Presto/IE/Safari в Винде (как у меня Firefox ESR 24). То есть в Фуррифоксе полная поддержка toLocaleString появилась между 26 и 29 версией.
                          Ответить
                  • Также обнаружил, что в браузерах с переключаемыми движками под Вебкитом подразумевают разные движки: в браузере Avant Вебкит от Хрома, а в браузере Lunascape Вебкит от Сафари.

                    Выводы:
                    1. В Интернет Эксплорере, в Сафари (под Виндой) и в Престо положили прибор на toLocaleString.

                    2. Вывод toString в разных браузерах может немного отличаться (в IE почему-то год засунули после часового пояса).

                    3. Результат может зависеть от версии: в Хроме до двадцатой версии toLocaleString совпадала с toString; в Фаерфоксе до ≈ 31 версии toLocaleString была реализована костыльно.
                    Ответить
                    • Уточнение к пункту 3: по результатам тестов Фаерфокс начал поддерживать toLocaleString с параметрами, начиная с версии 29.
                      Ответить
            • показать все, что скрытоА эдж, как и ваш сафари, показывает NaN, но по совершенно иной причине, которую мог породить только МС. Без parseInt вы получите с виду нормальную строку типа "25", длины 3 ( АХАХА ЕБАТЬ ), даю время на догадки ( погуглить ), подсказка в названии метода.
              Ответить
              • Thanks for the feedback. I am not able to repro this in IE or Edge using Windows 10. As such this will be closed out at this time to reflect these findings.

                I have attached a screenshot to this showing the output. Please note that we are no longer working on IE feature bugs any longer unless they are security related.

                All the best,
                The MS Edge Team


                *****

                В общем, я сдался и нагуглил, что, например, для португальского языка IE11 между числом и месяцем вставляет предлог «de». Предположил, что Эдж добавляет к числу пробел.

                *****

                Потом ещё погуглил. Всё оказалось страшнее. Уж лучше бы он добавлял пробел.
                Ответить
                • > Потом ещё погуглил. Всё оказалось страшнее. Уж лучше бы он добавлял пробел.
                  Что там?! Не тяни, интересно же!
                  Ответить
                  • LTR (точнее, &lrm;) — символ-индиктор письма слева направо, чтобы у арабов и у евреев число не вывелось задом наперёд.
                    Ответить
                    • P.S. Вообще Unicode — странный стандарт. По идее кодировка должна содержать только семантику (тогда типографика задаётся где-то вне кодировки, например, в языке разметки страниц), либо только типографику, чтобы было удобнее выводить (тогда семантика будет где-то снаружи).

                      В Уникоде же решили скрестить ежа с ужом и в результате получилось ни два, ни полтора: и семантика реализована наполовину, и типографика реализована наполовину.

                      Зачем это всё тащить в toLocaleString, если мне нужно получить только число, а уж как его вывести, я и сам разберусь? Если я сам задал локаль, то по идее я должен знать, слева направо или справа налево должен выводиться результат.
                      Ответить
              • А нахера вообще такую непортабельную фичу юзать? То ли дело typeof

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

                На самом деле для современных браузеров достаточно было бы написать word-wrap: break-word; и разбавлять текст пробелами не понадобилось бы, но, увы, так сделали. Так что приходится критические фрагменты заворачивать в [code], чтобы не разбавлялись.
                Ответить
                • > приходится критические фрагменты заворачивать в [code], чтобы не разбавлялись
                  Неудачник. Можно и проще
                  Ответить
                  • Тауматафакатангихангакоауауотаматеатурипукакапикимаунгахоронукупокаифенуакитанатаху (маори Taumatawhakatangihangakoauauotamateaturipukakapikimaungahoronukupokaiwhenuakitanatahu или более кратко (без подчёркнутой части) – Тауматафакатангихангакоауауотаматеапокаифенуакитанатаху) — холм высотой 305 метров, находящийся в Новой Зеландии.
                    Ответить
                • >длиннее 40 символов разбавляются
                  42
                  Ответить
          • Лучше не означает идеально, лучше это даже не всегда хорошо, на фоне говна.

            Что страшней: самая основа основ языка typeof или расширенная питушня, которую всё-равно не все поддерживают и мало кто пользуется.
            Date.prototype.toLocaleString()
            Feature 	Chrome 	Firefox (Gecko)   IE 	Opera 	Safari
            Basic support 	(Yes) 	(Yes) 	(Yes) 	(Yes) 	(Yes)
            locales and options arguments 	
                              24 	29 (29)  	11    15 	No support
            Ответить
            • Да ладно бы, если бы старые версии Хрома не поддерживали или если бы результат был детерминированным. А то 49 версий typeof работал и только в 50-й версии Хрома решили поломать typeof, к тому же сделав результат недетерминированным. Его теперь можно вместо генератора случайных чисел использовать.

              И ведь ошибка кроется не в реализации typeof, а в самой основе движка — в JIT-компиляторе. Есть вероятность, что могут поломаться и другие функции.
              Ответить
    • показать все, что скрытоТак а из-за чего такая хуйня?
      Ответить
      • показать все, что скрытоИз-за того, что твой пароль - 123.
        Ответить
      • Ап
        Ответить
      • Из-за прокладки между монитором и креслом разработчиков веб-браузеров. Они просто кидаются кодом и текут.
        Ответить
      • Из-за ЖИДа. Сначала foo() N раз выполняется в обычном интерпретаторе, который её эвалирует в false. Потом JIT видит, что эта функция часто вызывается, и конпелирует её в кривой нативный код, в котором (typeof null === 'undefined') === true.
        Ответить
        • Значит, всё из-за того, что ЖИД не эквивалентен интерпретатору.

          Напомнило, как в некоторых компиляторах вычисления в плавающем питухе в компилтайме и в рантайме выполнялись с разной точностью. У «Турбопаскаля» где-то были расхождения между компилтаймом и рантаймом, но я уже не помню, где именно.
          Ответить
        • почему в анальных языках нельзя сразу AOTиться?
          Ответить
          • Зачем тебе AOT в анальных языках?
            Ответить
            • Чтобы анре жид не искал горячие пятнка в моем йажакоде, а сразу генерил нативный код как ngen.exe (нген -- азиатское имя какое-то)

              >TAPAKAH
              Это ты включился в предвыборную гонку в Республике Беларусь?
              Ответить
              • >Because native images are Windows PE files,
                Имеется ввиду конечно Portable Executive, но Макака могла подумать, что речь о WinPE
                https://docs.microsoft.com/en-us/windows-hardware/manufacture/desktop/winpe-intro
                У него есть свой API, и свой subsystem
                https://docs.microsoft.com/en-us/windows-hardware/manufacture/desktop/winpe-create-apps

                Майки умудрились запутать пользователя на пустом месте.
                Сука. Зачем?
                Ответить
                • Далее зомбируемого заставляют смешать «Portable Executive» и «Pre-Install Environment».
                  Ответить
              • Мой персонаж отсюда:
                http://www.botik.ru/~robot/history/chick.htm
                http://www.botik.ru/~robot/sale/robot.htm
                Ответить
                • Баранов был настолько глуп,
                  Что не освоил даже "Дуб".
                  Но он, однако, не баран -
                  Просёк он, все же, Таракан.
                  Ответить
                  • А. Дуванов
                    Какакулин
                    Немилостива

                    Я не могу понять, это реальные люди или «Перекур и Совокюпман»?
                    Ответить
                    • Это реальные люди, работающие или работавшие в каком-то институте славного города Переславль-Залесский.
                      Ответить
                      • Четвертый или пятый?
                        http://www.botik.ru/~robot/sidorov/pic/ris01.gif
                        Ответить
                      • Какая книга))
                        http://www.botik.ru/~robot/ru/books.htm#dhtml
                        Ответить
                        • Я рассказывал про отдельные части «Роботландии». Была там программа «Буквоед»: пользователь выбирал «чёрный ящик», давал ему несколько реальных примеров входных данных и смотрел на результаты. Пользователь должен был угадать алгоритм, после чего ему предлагался экзамен: уже компьютер показывал реальные примеры входных данных, а пользователь в соответствии с разгаданным алгоритмом должен был вычислить результат.

                          Алгоритм №13 принимал на вход строку, у каждого символа увеличивал кодовую позицию на единицу. Школьники любили ему на вход подавать строку «фти» (по ссылке анимашка):
                          https://i.imgur.com/ou24e4K.gif
                          Ответить
                          • А у тебя это в школе было?
                            Ответить
                            • Подтверждаю.
                              Ответить
                              • У меня в школе не было компьютерных тараканов (разве что аналоговые).
                                А чему вас еще учили?

                                Просто интересно: вроде бы школьные программы у всех должны быть похожи, но разброс среди моего поколения огромный: кого-то борланд паскалю учили, кого-то бейсику, кого-то вообще ворду.
                                Ответить
                                • Из ЯП нас учили «Бейсику»: сначала на «Агате» (там был «Бейсик» с номерами строк), потом на 386 (QB 1.0, который шёл вместе с «DOS»).

                                  А из текстовых редакторов мы изучали «MS Works» для «DOS» (в «Ворксе» кроме текстового редактора ещё были электронные таблицы и ещё какая-то офисная питушня).

                                  Мы ещё сдавали зачёт по «Нортон Коммандеру». Офигеть, в то время файловому менеджеру придавали огромное значение.
                                  Ответить
                                  • показать все, что скрытоvanished
                                    Ответить
                                    • > NC описывался и у Фигурнова.
                                      Сначала подумал, что ты про «nc(1)». Удивился, зачем его описывать, когда всё уже описано.
                                      Ответить
                                    • Вспомнил один багор, связанный с «Бейсиком». От школы нас послали на окружную олимпиаду по информатике. Задание можно было сдавать на выбор в одной из сред: «Quick Basic», «Turbo Pascal» и ещё на каком-то языке (возможно, «Турбо Си»). Во всех задачах нужно было что-то прочитать из файла, посчитать какую-то питушню и результат записать в файл. Мы тогда ещё не успели изучить работу с файлами, поэтому пришлось нажать Shift+F1 и быстро-быстро читать справку.

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

                                      После окончания олимпиады нам разрешили записать наши наработки на дискету. Пытаемся открыть файлы из «Кубасика» в своей школе — на экране закорючки. Оказалось, что в той школе был «Quick Basic 4.5», который умел сохранять исходники в зожатом формате, а в нашей был «Quick Basic 1.0», который принимал только plain text. Пришлось искать чувака, у которого был «Quick Basic 4.5», чтобы розжать.

                                      Это был конец 90-х. Где-то в параллельном мире были «Windows 95», «Visual Basic», «Йажа», «Змея», «Яuбу», «Луа», «PHP» но в нашей галактике о них не слышали (слышали разве что только о «Windows»). В учебниках по информатике упоминался «Пролог», который нам даже не показали.
                                      Ответить
                                      • Справедливости ради надо отметить, что в школе не обязательно вот изучать кровавый конец типа Go или Rust, или прямо вот программировать сразу под ios.

                                        Вполне нормально изучать азы программирования на сраном бейсике образца 1979-го года: благо, print и input с тех пор не сильно-то изменились
                                        Ответить
                                        • Именно поэтому я за «сраный бейсик».
                                          Ответить
                                          • А я за пассаль.
                                            Самый удобный язык для школы кмк: по нему куча литературы написана, учебные программы, отточенные годами, внятная типизация, вот это всё.
                                            Ответить
                                            • Типизация в «Паскале» хорошая. Кроме того, нельзя случайно создать переменную на ходу, как в «Бейсике». Если вдруг где-то напишешь pituh вместо petuh, компилятор сразу ругнётся.
                                              Ответить
                                        • Хуже всего учить на какой-нибудь «Йаже» или на «До-диезе»: придётся объяснять, что такое «class», что такое «public static void main», зачем столько фигурных скобочек...

                                          А на «Бейсике» можно сразу написать «PRINT» и течь.
                                          Ответить
                                          • Ща еще молодняк иногда учат сразу вебпитушне на всяких курсах.
                                            То есть они еще даже сортировку пузырьком не прошли, а уже срут что-то в браузер, html там, javascript, mysql, php, представляешь, какая у них каша в голове потом?

                                            Потом вопросы типа "я указал переменную в JS, почему она не видна в PHP?"
                                            Ответить
                                            • Пиздец. Пиздец.
                                              Ответить
                                            • «ASP» с его «runat» или «node» на сервере и «js» же на клиенте — вот это полный пиздец. Можно сразу не понять, на чьей стороне выполняется код.
                                              Ответить
                                              • Да, в такой хуйне немудрено запутаться.
                                                Именно по этому я против изучения ASP.NET без понимания того, как работает уэб.
                                                Ответить
                                            • Кстати, на «Говнокоде» не так давно был смешной пример каши из «JS» и «PHP», где автор не понимал, что выполняется на клиенте, а что — на сервере, и как между клиентом и сервером передаются данные, но при этом его ошибки так удачно легли, что код работал.

                                              Вряд ли нагуглю. Помню, что что-то про отправку форм.
                                              Ответить
                                              • P.S. Вот же он:
                                                https://govnokod.ru/26698

                                                Эмпирическое правило: если видишь <FORM action=""> или <FORM action="index.php">, жди беды.
                                                Ответить
                                                • Школа ПХП.

                                                  Правильные и красивые обращения к БД
                                                  https://school-php.com/tricks/5/pravilnyie-i-krasivyie-obrascheniya-k-bd-mysql

                                                  Правило №6: все данные, уходящие в таблицу защищать.

                                                  Сами читайте, я не могу
                                                  Ответить
                              • А может ты и есть Дуванов
                                Ответить
                            • Про «Буквоеда»: алгоритмы описаны в двоичных файлах. Описание алгоритма №13, который выполняет инкремент каждой буквы в строке, содержит такой фрагмент: «S1E1█>(S1)0(E1)█E1». Для сравнения: в других алгоритмах видно математические формулы:
                              E1█:(E1+1)
                              E1█:(E1*2+1)
                              E1█:(E1/2)
                              E1█:(;(E1)/2)
                              E1█@(E1)A(E1)
                              E1█:(A(E1)-@(E1))
                              E1█0(C(:(E1/2)):(E1/2))

                              А в некоторых, как в 13-м, несколько формул, разделённых символом с кодом ноль. Похоже на паттерн-матчинг:
                              S1S1E1█1+0(E1)█S1E1█0(E1)█E1█0


                              Что это может быть за язык?
                              Ответить
                              • Какой-нибудь кастомный DSL?

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

                                  Сама идея того, что алгоритм можно отсоединить от UI, и сделать такой вот движок -- она суперкрутая для каких-то чуваков из заштатного НИИ 80-х, делавших что-то для школы.
                                  Ответить
                              • P.S. Нагуглил описание, составленное Дувановым:
                                Те  пользователи,  кто немного  программировал  на  РЕФАЛЕ
                                (см., например, Базисный РЕФАЛ и его реализация на вычислитель-
                                ных машинах,  ЦНИПИАСС  Госстроя СССР, 1977г.) несомненно мгно-
                                венно распознают  природу предлагаемого ниже языка. Автор зара-
                                нее просит  извинения  у  отчаянных рефалистов за минимальность
                                семантики и  своеобразие реализации. В качестве оправдания при-
                                водятся несколько  десятков  алгоритмов,  изготовленных на этом
                                языке и, по мнению автора, имеющих достаточно лаконичный вид.
                                     Ниже приводится  неформальное  описание  языка, которое не
                                опирается на знание  РЕФАЛА,  но считает понятие рекурсии инту-
                                итивно  доступным.  (В скобках хочется заметить, что сам  автор
                                относится к рекурсии как к магии и всерьез в нее не верит.)

                                ...
                                Примеры описаний  образцов (левых частей):
                                1) S1(0123456789) - любая цифра, например, "3", "7", "0".
                                2) S1(0123456789)+S2(0123456789) - любые  две цифры, соединенные
                                знаком "+", например, "4+5", "6+8".
                                3) S1(0123456789)+S1(0123456789) - две  одинаковые цифры, соеди-
                                ненные знаком "+", например, "4+4", "6+6".
                                4) S1S2 - любые два символа из тех, что можно ввести с клавиату-
                                ры, например, "23", "аб", "f1", "??" и так далее.
                                5) E1 - абсолютно любое выражение, в том числе и пустое
                                6) S1E1 - любое непустое выражение
                                7) E1E1 - выражение, быть может пустое, состоящее из двух одина-
                                ковых частей, например, "", "22", "молокомолоко", "10/210/2".
                                8) E00 - любое выражение заканчивающееся символом "0", например,
                                "100", "0", "строка0".

                                «Нидлессу» понравится.
                                Ответить
                                • P.P.S. Реальные примеры:
                                  1)
                                  DEFA (NUMBER)   // алгоритм 1
                                  {               // N = n+1
                                    ALGORITHM
                                    DEF A
                                    {
                                      E1 -> calc(E1+1)
                                    }
                                  }
                                  2)
                                  DEFA (NUMBER)   // алгоритм 2
                                  {               // N = n+2
                                    ALGORITHM
                                    DEF A
                                    {
                                      E1 -> calc(E1+2)
                                    }
                                  }
                                  3)
                                  DEFA (NUMBER)   // алгоритм 3
                                  {               // N = n*2+1
                                    ALGORITHM
                                    DEF A
                                    {
                                      E1 -> calc(E1*2+1)
                                    }
                                  }
                                  4)
                                  DEFA (NUMBER)   // алгоритм 4
                                  {               // N = n*2-1
                                    ALGORITHM
                                    DEF A
                                    {
                                      E1 -> calc(E1*2-1)
                                    }
                                  }
                                  5)
                                  DEFA (WORD)     // алгоритм 5
                                  {               // N = число букв в s
                                    ALGORITHM
                                    DEF A
                                    {
                                      E1 -> len(E1)
                                    }
                                  }
                                  6)
                                  DEFA (WORD)     // алгоритм 6
                                  {               // N = число букв "о" в s
                                    ALGORITHM
                                    DEF f
                                    {
                                      оE1  -> оf(E1)
                                      S1E1 -> f(E1)
                                      E   ->
                                    }
                                    DEF A
                                    {
                                      E1 -> len(f(E1))
                                    }
                                  }
                                  7)
                                  DEFA (NUMBER)   // алгоритм 7
                                  {               // N = n*4
                                    ALGORITHM
                                    DEF A
                                    {
                                      E1 -> calc(E1*4)
                                    }
                                  }
                                  8)
                                  DEFA (NUMBER)   // алгоритм 8
                                  {               // N = n*4-1
                                    ALGORITHM
                                    DEF A
                                    {
                                      E1 -> calc(E1*4-1)
                                    }
                                  }
                                  9)
                                  DEFA (WORD)     // алгоритм 9
                                  {               // N = число парных букв в слове
                                    ALGORITHM
                                    DEF f
                                    {
                                      S1S1E1 -> 1+f(E1)
                                      S1E1   -> f(E1)
                                      E1     -> 0
                                    }
                                    DEF A
                                    {
                                      E1 -> calc(f(E1))
                                    }
                                  }
                                  10)
                                  DEFA (NUMBER)   // алгоритм 10
                                  {               // N = n/2
                                    ALGORITHM
                                    DEF A
                                    {
                                      E1 -> calc(E1/2)
                                    }
                                  }
                                  Ответить
                                  • Ого, WORD это слово в кои-то веки, а не число:)
                                    Ответить
                                    • Кроме NUMBER и WORD у них ещё есть SET.
                                      Ответить
                                    • Алгоритм №33:
                                      DEFA (NUMBER)   // алгоритм 33
                                      {               // перевод числа в 16 систему
                                        ALGORITHM
                                        DEF A
                                        {
                                          S1(0123456789) -> S1
                                          10             -> a
                                          11             -> b
                                          12             -> c
                                          13             -> d
                                          14             -> e
                                          15             -> f
                                          E1              -> A(calc(E1!16))A(calc(E1%16))
                                        }
                                      }
                                      Алгоритм №34:
                                      DEFA (NUMBER)   // алгоритм 34
                                      {               // перевод числа в 8 систему
                                        ALGORITHM
                                        DEF A
                                        {
                                          S1(01234567) -> S1
                                          E1              -> A(calc(E1!8))A(calc(E1%8))
                                        }
                                      }
                                      Алгоритм №35:
                                      DEFA (NUMBER)   // алгоритм 35
                                      {               // вычисление n!
                                        ALGORITHM
                                        DEF A
                                        {
                                           0 -> 1
                                           E1 -> calc(E1*A(calc(E1-1)))
                                        }
                                      }
                                      Алгоритм №43:
                                      DEFA (WORD)     // алгоритм 43
                                      {               // упорядочивание символов по возрастанию
                                        ALGORITHM     // дева -> едва
                                        DEF d
                                        {
                                           S1      ->
                                           S1S1E1  -> E1
                                           S1S2E1  -> S2d(S1E1)
                                        }
                                        DEF A
                                        {
                                           S1E1  -> max(S1E1) A(d(max(S1E1)S1E1))
                                             E1  ->
                                        }
                                      }
                                      Ответить
                                    • DEFA (NUMBER)  // алгоритм 50
                                      {              // Наибольший делитель числа
                                        ALGORITHM
                                        DEF t
                                        {
                                           0     -> 0
                                           E1    -> 1
                                        }
                                        DEF f  // проверим делится ли E1 на E2
                                        {
                                           E1#E2 -> t(calc(E1%E2))
                                        }
                                        DEF A
                                        {
                                           0         -> calc(1/0)
                                           1         -> 1
                                           2         -> 1
                                           0#E1#E2   -> E2
                                           S1#E1#E2  -> A(f(E1#calc(E2-1))#E1#calc(E2-1))
                                           E1        -> A(f(E1#calc(E1!2+1))#E1#calc(E1!2+1))
                                        }
                                        TESTS
                                        even(1, 400);
                                      }
                                      Ответить
                              • Хочу думать, что это такой асемблер под какой-то виртуальный машин
                                Ответить
                                • См. выше. Уже нашёл. Это диалект «Рефала», сконпелированный в зожатый бинарный формат (имя каждой стандартной функции обозначается одним байтом).
                                  Ответить
                                  • круть!
                                    Ответить
                                    • Они для игрушки с фиксированным набором алгоритмов написали виртуальную машину «Рефала». Для игрушки под реальный режим «DOS», заметь. В какую-нибудь пару сотен килобайт оперативки должна поместиться эта виртуальная машина и набор заданий; менюшки; графический движок, выводящий шрифты и рисующий анимированного человечка, глотающего буквы; даже ввод текста у них собственный.
                                      Ответить
                                      • показать все, что скрытоvanished
                                        Ответить
                                        • «Роботландию» сконпелировали под две платформы: кроме досовской версии для «IBM PC» была ещё версия для «Агата». «Агат» — это такая питушня на клоне 6502, которую создали под впечатлением от «Apple ][», но только у «Агата» были странные графические режимы: 64×64, 128×128, 256×256. Как ты догадываешься, на мониторе формата 4:3 пиксели будут неквадратными, так что им пришлось перерисовывать всю графику.
                                          Ответить
                                        • Смотрите, что нашёл:
                                          http://agatcomp.ru/Apps/Robotlandia.shtml

                                          Изначально пакет "Роботлания" был написан под КУВТ Yamaha MSX. Авторы: Дуванов и Первин, но официальной версии под Агат не выпускалось.

                                          В период 1988 по 1991 год под руководством преподавателя информатики 716 школы (Москва, Измайлово) (теперь это гимназия 1811) Алексея Анатольевича Муранова, силами учениками-старшеклассниками был создан пакет обучающих программ по мотивам оригинального пакета "Роботлания".
                                          ...

                                          В 1992 году Саша Антонов и Иван Литвин, будучи учениками 10-11 класса, смогли объединить АГАТы-7 в ЛВС при помощи стандартной платы, входящей в стандартную поставку АГАТ-7 - Модуль последовательного и параллельного интерфейса и выпустить сетевую версию Роботландии.

                                          Для обмена информацией использовали выводы параллельного порта + магистральные усилители 109ЛИ1. Был написан свой собственный сетевой протокол. Сервером хранения выступала IBM XT c HDD на 20МБ. Был написан свой "кастомный" BOOT.ROM, который обеспечивал загрузку по сети. Между IBM и сетью из АГАТов стоял еще один буферный АГАТ с двумя принтерными портами. По одному он смотрел в сеть, по другому (всеми 11 линиями параллельного интерфейса) в сторону IBM. На нем крутилась маленькая программа - шлюз. Она брала данные с одного интерфейса и кидала их на другой (запросы к IBM). В ней была основная логика сети - выделение окон времени компьютерам в сети.


                                          Продолжение на форуме:
                                          http://forum.agatcomp.ru/viewtopic.php?id=227
                                          Ответить
                                          • «Роботландию» для «КУВТ» («Ямаха» стандарта «MSX» на базе «Z80») можно взять тут:
                                            http://podrezov.com/temp/robotlan.dsk

                                            Распаковщик образов есть на сайте «old-dos.ru».

                                            «Роботландию» для «Агат-7» можно взять тут:
                                            http://agatcomp.ru/Apps/DSK/AOS/Robotlandia.rar

                                            Распаковщик есть на том же сайте (он называется «dos33»).

                                            «Буквоеда» ни там, ни там не нашёл. Вероятно, он появился только в версии для «IBM PC».

                                            В версии для «Ямахи» бинарники, а вот в версии для «Агата» уже исходники на «Рапире». Реальный пример:
                                            ПPOЦ COKO_БAH;ИMEHA:P,B,PR,И,ИM,Г;975->P;767->B;<32,100,27,141,65,AДPЧ(6994),169,32,133,83,169,0,133,153,169,0,133,152,32,79,187,32,92,27,76,96,27>->PR;ДЛЯ И OT 1 ДO #PR::AДPЗ(P+И,PR[И]);BCE;ДЛЯ Г ИЗ<"1","2">::"S"+Г->ИM;ДЛЯ И OT 1 ДO 30::ECЛИ И>#ИM TO AДPЗ(B+И,160);ИHAЧE AДPЗ(B+И,KOД(ИM[И]));BCE;BCE;AДPBЫЗ(976);BCE;AДPBЫЗ(17548);KHЦ;

                                            Да, именно так, в одну строку без переносов. Можно публиковать отдельным говнокодом.
                                            Ответить
                                    • 9. Устранение неоднозначности отождествления
                                      
                                           Если левая часть какой-либо строки в  описании функции со-
                                      держит две  E-переменные,  то  может  случиться, что существуют
                                      несколько вариантов приписывания этим переменным значений,  ко-
                                      торые  приводят  к отождествлению  конкретизируемого выражения.
                                      Пусть, например, строка функции имеет вид "E1+E2", и на ее вход
                                      поступает выражение "2+3+4".  Очевидно,  что в этом случае воз-
                                      можно два варианта отождествления:
                                                        1 вариант: E1 = 2,   E2 = 3+4
                                                        2 вариант: E1 = 2+3, E2 = 4
                                      Следовательно, необходимо договориться,  как поступает интерпре-
                                      татор при  наличии  такой  неоднозначности.  Мы примем следующее
                                      соглашение: интерпретатор  выбирает тот вариант  отождествления,
                                      при котором  первая  слева E-переменная принимает самое короткое
                                      значение. В нашем примере будет выбран первый вариант.
                                      Ответить
                          • >> (по ссылке анимашка): https://i.imgur.com/ou24e4K.gif

                            Это была версия 1996-го года.

                            А вот версия 1993-го года (там был другой графон):
                            https://i.imgur.com/CnLVInP.gif
                            Ответить
                            • показать все, что скрытоvanished
                              Ответить
                              • «Роботландия» и была рассчитана на «EGA/VGA». Ну хоть не на «CGA». Даже в 1990-х, когда уже появился стандарт «VBE» («VESA» BIOS extensions), все эти SVGA с труколором. Просто тогда в школах, на которые был рассчитан продукт, были старые компы. Я уже рассказывал, что у них была версия и для «Агата» (питушня по мотивам «Apple ][»), и для «КУВТ» («Ямаха» стандарта «MSX»).
                                Ответить
                              • Да, кстати, 640×350 — это именно «EGA» (на «VGA» по вертикали было 480). Они всё лепили в разрешении «EGA», чтобы поддержать как можно большее количество устройств.
                                Ответить
                                • показать все, что скрытоvanished
                                  Ответить
                                  • 13h — это «MCGA». Оно поддерживалось видеоадаптером «VGA», но не поддерживалось адаптером «EGA».

                                    Возможно, авторам разрешение было важнее количества цветов (13h любили за 256 цветов и за «pixel map», которое для гейдева удобнее, чем «plane map»), а возможно, что нужна была поддержка «EGA».

                                    Хотя на «Агате» им приходилось ужиматься в 128×128 при 16 цветах, а на «Ямахе» — в 256×212 (тоже при 16 цветах).
                                    Ответить
                                    • Действительно, в EGA не было 13h. Потому мои программы никогда не запустились бы на компе, выпущенном до 1987-го года.

                                      А любил я его именно за pixel map, потому что plane map это ад на земле
                                      Ответить
                    • Похожи на персонажей Стругацких
                      Ответить
                • Вы можете заказать CD-диск со всеми бесплатными продуктами

                  Стоимость такого CD-диска (с пересылкой по почте) — 300 руб.

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

                  ====

                  Как там было в истории Файка?

                  Говорит девушка парню: «Приходи сегодня вечером ко мне, дома никого не будет». Парень вечером пришёл, а дома никого нет!
                  Ответить
                • http://www.botik.ru/~robot/sidorov/nzam1.htm

                  Первый закон оптимизации гласит: никогда не пользуйтесь атрибутами width и height тега IMG для уменьшения размера картинки на странице документа. Если нужна картинка меньшего размера, чем та, которая есть, уменьшайте ее графическим редактором, но никак не браузером.


                  Не, ну в общем справедливо.

                  Так сколько должна весить страница? Если страница весит больше 50k, надо бить тревогу. Сайт с такими страницами обречен: после первого посещения пользователь ставит на пути к нему большой красный кирпич.
                  Ответить
                  • Server: Apache/1.3.27 (Unix) Debian GNU/Linux mod_ssl/2.8.9 OpenSSL/0.9.7 rus/PL30.16
                    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">


                    какой 2002-й ))
                    Ответить
    • показать все, что скрытоvanished
      Ответить
      • Chrome/49.0: 1000 раз false.

        В более новых движках вроде тоже.
        Ответить
      • Няндекс-браузер (Chrome/57.0): 1000 раз false.
        Ответить
      • Chrome/84.0: 1000 раз false.
        Ответить
      • починили говно
        Ответить
        • В общем, в 49-й версии ещё всё работало, в 50-ю завезли новый ЖИД, и цикл стал давать случайные результаты, а где-то в районе 57-й починили говно. Т. е. под раздачу попали пользователи нескольких версий, начиная с 50-й.
          Ответить
        • А давайте придумаем новую дисциплину: говноведение. Будем описывать историю говна.
          Ответить
    • Знакомьтес, фронтговнокодер из вк, военный петху https://twitter.com/danakt_frost
      Ответить
    • Сейчас воспроизводился?
      Ответить
    • > 24 Июня 2016

      Как будто вчера было ((((((
      Ответить

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