• Пятничный JS: квайн, который играет в крестики-нолики

      Приветствую всех в своей традиционной рубрике, полной лавкрафтианского безумия.

      В процессе написания одной из прошлых статей (не ищите, она была не особенно хороша) я задумался над тем, что квайн… Да, на всякий случай напомню: квайн — это программа, которая выводит свой собственный текст, причём делает это «честно» (не подсмотрев, допустим, этот текст в файле на жёстком диске). В общем, традиционная бессмысленная пузомерка программистов.

      Так вот, я задумался над тем, что квайн, в принципе, может нести произвольную полезную нагрузку. То есть — делать ещё что угодно помимо своей основной функции. И в качестве proof-of-concept я решил написать квайн, который играет в крестики-нолики. И написал. Грязные подробности под катом.

      image
      Но как он может делать что-то ещё, кроме вывода своего текста?
    • У меня нет рта, но я должен кричать. Размышления об ИИ и этике

        Дисклеймер
        Я скептически отношусь к своей способности высказать действительно оригинальную мысль. Скорее всего, я далеко не первый, кто задаёт эти вопросы, и вполне возможно, на них даже уже выработаны какие-то удобоваримые ответы. Поэтому, печатая данный текст, я не жду вашего удивления или восхищения. Я жду, что в комментарии придут люди, знакомые с современной философией сознания, и дадут мне ссылки на работы серьёзных мыслителей с забавными немецкими фамилиями.

        image

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

        Что такое боль?


        Как-то раз у меня болел зуб. Я лежал на диване и пытался не обращать на это внимания. Я думал о том, что боль — это просто сигнал, идущий в мой мозг. Такой же сигнал, как наличие или отсутствие напряжения в проводке, идущем к PS/2 разъёму системного блока. Сам по себе он не несёт никакой семантики, это моё сознание выбирает, как его интерпретировать. Если я перестану воспринимать его как боль, а вместо этого проигнорирую или просто «приму к сведению», мне станет легче.

        Но легче не становилось
      • Функции высших порядков в JS: курс молодого бойца

          Данная статья рассчитана на человека, делающего свои первые робкие шаги на тернистой тропе изучения JavaScript. Несмотря на то, что на дворе 2018 год, я использую синтаксис ES5, дабы статья была понятной юным падаванам, проходящим курс «JavaScript, уровень 1» на HTML Academy.

          Одной из особенностей, отличающих JS от многих других языков программирования, является то, что в этом языке функция — «объект первого класса». Или, говоря по-русски, функция — это значение. Такое же, как число, строка или объект. Мы можем записать функцию в переменную, можем положить её в массив или в свойство объекта. Мы даже можем сложить две функции. На самом деле, ничего осмысленного из этого не получится, но как факт — мы можем!

          function hello(){};
          function world(){};
          console.log(hello + world);
          // кто знает, что получится, тому печеньку
          // кто не знает, пусть попробует в консоли
          

          Самое интересное, что мы можем создавать функции, оперирующие другими функциями — принимающие их в качестве аргументов или возвращающие их как значение. Такие функции называются функциями высшего порядка. И сегодня мы с вами, девочки и мальчики, поговорим о том, как бы эту возможность приспособить на нужды народного хозяйства. Попутно вы узнаете ещё про некоторые полезные особенности функций в JS.
          Читать дальше →
        • Пятничный JS: игра в 0 строк JS и CSS

            Возможно, многие из старожилов помнят эпидемию статей с заголовками вида "%something% в 30 строк JS". А также последовавший за ней эпичный пост "Игра в 0 строк кода на чистом JS", после которого эпидемия резко сошла на нет. Полностью осознавая, что этот шедевр мне никогда не превзойти, я всё же спустя пять лет решил докинуть свои пять копеек.

            Дамы и господа, вашему вниманию предлагается игра «Крестики-нолики» в нуль строк JS, а также, в отличие от игры, упомянутой выше, в нуль строк CSS (включая инлайн стили). Только голый HTML, только хардкор.


            Ссылка на игру

            Выглядит неказисто, зато будет работать в любом браузере. Под катом я расскажу, почему игра без JS оказалась в рубрике «Пятничный JS», а также другие грязные подробности. Впрочем, Америку я никому не открою, если вы опытный кодер, можете под кат даже не заходить
            Читать дальше →
          • Седьмая печаль

              Дисклеймер
              Я не уверен, что этот текст должен быть на Хабре. Тащу его сюда просто потому, что больше нигде не публикуюсь. Если вы полагаете, что сей опус здесь неуместен, вы знаете, что делать.

              Антоний Блок почесал острый подбородок и передвинул фигуру на доске. Партия подходила к концу, и исход её был слишком очевиден. Смерть улыбнулся — страшно, одними губами. Его глаза, не мигая, смотрели из-под нависших надбровных дуг. Бледной рукой Смерть взял свою королеву и поставил вплотную к королю рыцаря. Мат.

              — Говорят, на сарацинском «шах мат» означает «правитель мёртв», — бесстрастно произнёс Антоний.
              — На персидском, — уточнил Смерть.
              — Я не отличаю одних нехристей от других, — сплюнул рыцарь. — Пусть дьявол в преисподней разбирается, кого из них кинуть в какой котёл.
              — Ты веришь в дьявола? — спросил Смерть, буравя Антония своим немигающим взглядом.
              — Я уже ни во что не верю, — Блок горько усмехнулся. — Только в то, что вскоре ты захочешь забрать свой выигрыш.
              — Несомненно, — Смерть улыбнулся снова, и сердце храброго рыцаря замерло в страхе. — Сейчас ты можешь идти, куда захочешь. Но вскоре я вернусь, и тогда ты пойдёшь за мной.
              — Пойду куда?! — воскликнул рыцарь в душевной муке.

              Смерть поправил свой плащ, смахнув с него нанесённую ветром сухую былинку.
              Читать дальше →
            • DocumentFragment: что это такое и как с ним (не) бороться

                Дисклеймер
                Похоже, у меня начинается новая серия статей — немного скучная и сугубо утилитарная. В них будут содержаться разъяснения моментов, которые часто вызывают трудности у моих студентов. Если вы матёрый веб-девелопер, скорее всего, вам будет неинтересно. Если вы ждёте извращений в силе «Пятничного JS», их тут не будет, увы.


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

                image
                Я преисполнен любопытства и желаю читать дальше
              • Пятничный JS: случайное перемешивание

                  Экзамен в школе прапорщиков.
                  — Вот смотрите. Это большой палец, это — указательный, это — средний, это — безымянный, это — мизинец. Мешаем, мешаем, мешаем (двигает пальцами)… Теперь где какой?
                  Всем привет. С ортодоксальной точки зрения сегодня не настоящая пятница — просто день, когда завтра выходной. Поэтому статья в моей традиционной рубрике тоже будет не совсем настоящая, у неё пониженный градус безумия и повышенная полезность. Однако довольно предисловий, перейдём к сути.

                  Перед моими студентами регулярно встаёт задача случайного перемешивания массива. За её решением они, как правило, лезут в гугл. И гугл им подсказывает следующее:

                  var shuffledArr = arr.sort(function(){
                    return Math.random() - 0.5;
                  });
                  

                  Здесь и далее будем называть этот метод случайной сортировкой. Сегодня я решил написать о том, какие преимущества и недостатки есть у такого подхода.
                  Читать дальше →
                • Пятничный JS: минус без минуса

                    И вновь я приветствую всех в моей традиционной рубрике. Сегодня вы узнаете, что же такого особенного произошло 31 декабря 1969 года, ровно за миллисекунду до полуночи. Точнее, вы узнаете не только лишь это, но только к этому примеру я смог подобрать картинку, а развлекательная статья без картинок — нонсенс.

                    image

                    Читать дальше →
                  • Миллион плюс один равно миллион. Теория относительности натурального ряда

                      image

                      К читателю


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

                      Пролог


                      Начало двадцатого века было богато на революции — как политические, так и научные. Например, тогда полным ходом шла аксиоматизация математики. Происходила она бурно, драматично. «Наивную теорию множеств» Кантора похоронил парадокс Рассела, ограниченность аксиоматики Цермело-Френкеля показала — уже в тридцатых годах — теорема Гёделя о неполноте.

                      В физике революцию произвела специальная теория относительности. Открытие Эйнштейна, основанное на работах Максвелла, Лоренца и других учёных, постулировало некоторые контринтуитивные свойства физической реальности, в частности — лоренцево сложение скоростей.
                      Дальше самое интересное, тык сюда
                    • Пятничный JS: reqyire.js и очепятко-ориентированное программирование

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

                        const reqyire = require("reqyire");
                        const http = reqyire("htpp");
                        
                        const server = http.creteServer((req, res) => {
                          res.statusCode = 200;
                          res.setHeader('Content-Type', 'text/plain');
                          res.end('Hello World\n');
                        });
                        
                        server.listem(3000, "127.0.0.1");
                        
                        Вы ведь заметили, что здесь какой-то подвох?
                      • Игры для программистов, часть вторая

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

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

                          Infinifactory


                          image
                          И что же это за майнкрафт такой?
                        • Лучшие головоломки, про которые не знает никто*. Часть вторая

                            *почти

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

                            Volvox




                            Осторожно, пропаганда употребления наркотиков
                          • Пятничный JS: единственно верный способ вычисления факториала

                              Введение


                              Вычисление факториала — одна из традиционных программистских задач для собеседований. Если вдруг кто забыл, факториал натурального числа N обозначается как N! и равняется произведению всех натуральных чисел от единицы до N включительно. Например, $6! = 1 \cdot 2 \cdot 3 \cdot 4 \cdot 5 \cdot 6 = 720$. Казалось бы, что тут сложного? Однако есть свои нюансы.

                              Например, сравним два самых распространённых способа вычисления факториала.

                              Через цикл
                              function factorial(n){
                                  var result = 1;
                                  while(n){
                                      result *= n--;
                                  }
                                  return result;
                              }
                              


                              Через рекурсию
                              function factorial(n, result){
                                  result = result || 1;
                                  if(!n){
                                      return result;
                                  }else{
                                      return factorial(n-1, result*n);
                                  }
                              }
                              


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

                              В любом случае, оба эти способа слишком примитивны, чтобы по ним судить о знаниях кандидата. А вот опытный разработчик на React.js уже может написать что-то в этом роде:
                              Узнать, что же напишет опытный разработчик на React.js
                            • Пятничный JS: как вдохновиться Smalltalk'ом и попасть в ад

                                Когда я читал книгу «Паттерны разработки игр», написанную замечательным человеком по имени Bob Nystrom (я не пишу его имя по-русски, поскольку не имею ни малейшего понятия, как это произносится), в одной из глав мне на глаза попалась небольшая ода языку Smalltalk как праотцу всех современных объектно-ориентированных языков, намного опередившему своё время. Поскольку я по жизни испытываю необоримую приязнь ко всяким винтажным языкам, естественно, я полез про него гуглить. И разумеется, вместо того, чтобы вынести из этого опыта что-то полезное, я научился плохому.


                                Доктор, откуда у вас такие картинки?
                              • Лучшие головоломки, про которые не знает никто*

                                *почти

                                Бодрый день, дамы и господа. Я наконец решил, что негоже мне сидеть в рид-онли, когда у меня в голове зреет столько полезных и нужных комментариев, и пора получить инвайт. А значит, надо писать пост. О чём? Конечно же, о том, что я люблю и знаю — об играх. Конкретно — о головоломках.

                                Огромный недостаток головоломки по сравнения с какими-нибудь ММОРПГ — очень малая реиграбельность. Я всегда думал, что технология стирания памяти в «Вечном сиянии чистого разума» использовалась не по назначению. Вместо того, чтобы изжить из воспоминаний какую-то женщину, не лучше ли забыть своё прохождение любимой игры, а потом пройти её заново? К сожалению, пока что это фантастика. Поэтому всё, что я могу — изнывая от ностальгии, в письменной форме вспоминать все эти прекрасные вещи, вернуться к которым мне, увы, не суждено.

                                Учитывая «одноразовость» головоломок, тем более странно и в чём-то даже преступно, что о замечательнейших представителях этого жанра узнаёшь практически случайно. Мой пост имеет целью исправление этой несправедливости, и я как раз заканчиваю затянувшееся предисловие и перехожу к сути.
                                Читать дальше →
                              • «A» значит «Astral». Интервью с Иваном Поляковым (Apus Software)

                                  Существует определённый круг предметов и явлений, по отношению к которым люди чётко делятся на две категории. Услышав про некое Х, представители первой категории спросят:«А что такое Х? Возможно, я что-то слышал об этом, но ничего конкретного не припоминаю.» Те же, кто относится к категории второй, выдохнут:«О-о, то самое Х!» — и глаза у них загорятся слегка нездоровым энтузиазмом. Только две категории. Никаких полутонов не предусмотрено.

                                  Отличным примером такого явления может служить белорусская компания Apus Software и их серия компьютерных карточных игр, большая часть которых содержит в своём названии слово Astral. Начиная с олдовой Astral Tournament, которая, будь она человеком, в прошлом году уже могла бы получить паспорт, и заканчивая недавно вышедшей Astral Heroes, в которой лучшее из прошлых игр соединилось с лучшим из того, чего в них не было, Apus Software исправно сдают карты тем картёжникам, кому эльфы и единороги милее карманной пары и ловленного мизера.



                                  В далёких уже две тысячи нулевых, коротая ночи за «Турниром в Астрале», вряд ли я мог представить, что когда-нибудь стану брать интервью у его создателя. Однако жизнь — удивительная штука, и сегодня у моего (метафорического, конечно) микрофона — сам Иван Поляков, более известный как Cooler.
                                  Читать дальше →
                                • Что скрывает Array#sort: реверс-инжиниринг подручными средствами

                                    Как вам, возможно, известно, спецификация языка JavaScript не предписывает какой-то определённой реализации метода sort у массивов. Алгоритм, находящийся «под капотом», может отличаться (и отличается) в различных браузерах. Теоретически, можно представить себе ситуацию, когда от того, как именно реализована сортировка массивов в конкретном движке, зависит производительность вашего веб-приложения.
                                    Скрытый текст
                                    Очень сильно сомневаюсь, что так может случиться на практике, но как человек, написавший в своё время определённое количество курсовых и дипломных работ, я просто не смог обойтись без секции «применение в народном хозяйстве».

                                    Если речь идёт о браузере с открытым исходным кодом, то можно просто открыть этот код и посмотреть, какой там использован алгоритм. Однако существуют браузеры с закрытым исходным кодом (не будем показывать пальцем). Что делать в таком случае?

                                    Поскольку мы на Хабре, я готов предположить, что некоторые читатели уже потянулись к своим любимым дизассемблерам, в то время как некоторые другие готовятся звонить своим друзьям из одной небольшой и нетвёрдой компании. Однако сегодня мы не будем копаться в машинном коде или использовать инсайдерскую информацию. Мы будем смотреть весёлые картинки.


                                    Но зачем, сэмпай?
                                  • Фиеричная система счисления, или почему 1 + 10 = 100

                                      «10.01 х 10.01 = 1000.1001»
                                      Джордж Оруэлл. «1010001001001000.1001001000100001»


                                      image


                                      Существует ли позиционная система счисления с иррациональным основанием, в которой все натуральные числа записываются конечным числом цифр? В которой число больше единицы, не имеющее цифр после запятой, наверняка не целое и даже не рациональное? В которой 1 + 10 = 100, а 1 + 1 = 10.01?
                                      Я заинтригован и хочу узнать ответ
                                    • Hydra Slayer: убиваем время и числа

                                        24 марта сего года произошло событие, которого мы все так давно ждали: в сервисе цифровой дистрибуции компьютерных игр Steam вышел очередной шедевр польского игростроя — Hydra Slayer. И хотя шедевр этот местами кривоват, да и ждали его далеко не все, а скорее три с половиной человека, всё же я полагаю его достойным своей статьи на Хабре. «Постойте-ка, любезный автор, — воскликнет сейчас человек по другую сторону монитора от меня, — а не спутали ли вы часом столь уважаемый сайт, как Хабрахабр, с каким-нибудь игровым порталом, где юноши от четырнадцати лет и младше делятся своими успехами в Майнкрафте, обильно используя ненормативную лексику?». Нет, не спутал. Этому материалу суждено особое место в хабе «Математика».

                                        image
                                        И вот почему.
                                      • Про Бурали-Форти, Пуанкаре и то самое определение единицы

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

                                          image

                                          Наверняка также вы задавались вопросом: что, чёрт подери, здесь написано? Формула из этой цитаты интересна тем, что у человека, имеющего высшее математическое образование, этот вопрос возникает столь же неумолимо, как и у любознательного семиклассника. У нелюбознательных семиклассников несколько иной круг интересов, выходящий за рамки данной статьи; однако даже они не откажут себе в удовольствии похихикать над «этими чокнутыми ботаниками», или как оно там формулируется на современном молодёжном сленге.

                                          В нижеследующем тексте я раскрою перед вами тайну этого загадочного сочетания символов. Пожалуйте под кат, однако помните поучительную историю о любопытной Варваре, которой на базаре рассказали про парадокс Банаха-Тарского, отчего она сошла с ума, разрезала себе нос на конечное количество частей и склеила из них рогатую сферу Александера.
                                          N.B. Я предупреждал.