• Internet of Things: четыре рассказа около технологий



      Иллюстрация Анатолия Сазанова

      Решил поделиться с вами четырьмя рассказами с «интригующими» названиями:

      • Augmented Reality
      • Умный дом
      • A.I.
      • Блокчейн

      Объединяет их (как вы уже заметили) упоминание разных модных IT-слов. Их и так все пихают куда ни попадя, так почему и мне нельзя?

      Немного нетвердой (и не всегда научной) и безрадостной фантастики под катом.
      Читать дальше →
    • Очередное незавоевание теней в Phaser, или польза велосипедов

        Два года назад я уже экспериментировал с веществами тенями в Phaser 2D. На последнем Ludum Dare мы внезапно решили сделать хоррор, а какой же хоррор без теней и света! Хрустнул я костяшками пальцев…

        … и ни черта не успел за LD. В игре конечно есть немного света и теней, но это жалкое подобие того, что должно было быть на самом деле.

        Вернувшись домой уже после отправки игры на конкурс, я решил все-таки “закрыть гештальт” и доделать эти несчастные тени. Что получилось — можно пощупать в игре, поиграться в демке, посмотреть на картинке, и почитать в статье.

        Читать дальше →
        • +12
        • 2.8k
        • 7
      • Трагикомедия в NaN актах: как мы cделали игру на JS и выпустили ее в Steam

          “Эка невидаль”, — скажете вы, — “В топ-100 вашей игры нет, так что нещитово”. Тоже правда. Зато за год разработки Protolife мы поднакопили какой-никакой опыт, которым можем поделиться с потенциальными будущими игроделами. Ветераны индустрии, боюсь, ничего интересного для себя не найдут. Но, может быть, хоть повеселитесь от души.


          Что за игра-то? И кто “мы”?


          Мы — это команда из трех человек (GRaAL, A333, icxon), волею судеб названная Volcanic Giraffe без какого либо умысла. Работали долгое время вместе, несколько раз втроем участвовали в Ludum Dare (соревнования по написанию игр за выходные), и однажды решившие довести до релиза одну из наших поделок под названием Protolife.

          Если коротко: это необычная tower defense, где надо бегать героем-курсором и выстраивать оборону из блоков против постоянно растущей красной биомассы.
          Остальное под катом - осторожно, тяжелые пиксельартные картинки
        • Как я попробовал сделать статический анализатор GLSL (и что пошло не так)

            Однажды я готовился к Ludum Dare и сделал простую игру, где использовал пиксельные шейдеры (других в движок Phaser не завезли).


            Что такое шейдеры?

            Шейдеры — это программы на си-подобном языке GLSL, которые выполняются на видеокарте. Есть два вида шейдеров, в этой статье речь идет про пиксельные (они же “фрагментные”, fragment shaders), которые очень грубо можно представить в таком виде:


            color = pixelShader(x, y, ...other attributes)

            Т.е. шейдер выполняется для каждого пикселя выводимого изображения, определяя или уточняя его цвет.
            Вводную можно почитать на другой статье на хабре — https://habr.com/post/333002/


            Потестировав, кинул ссылку другу, и получил от него вот такой скриншот с вопросом "а это нормально?"



            Нет, это было ненормально. Посмотрев внимательно код шейдера, я обнаружил ошибку в вычислениях:


            if (t < M) {
                realColor = mix(color1,color2, pow(1. - t / R1, 0.5));
            }

            Т.к. константа R1 была меньше чем M, то в некоторых случаях в первом аргументе pow получалось число меньше нуля. Квадратный корень из отрицательного числа — штука загадочная, по крайней мере для стандарта GLSL. Мою видеокарту ничего не смутило, и она как-то выпуталась из этого положения (похоже, вернув из pow 0), а вот у друга она оказалась более разборчивой.


            И тут я задумался: а могу ли я избежать таких проблем в будущем? От ошибок никто не застрахован, особенно таких, которые не воспроизводятся локально. Юнит-тесты на GLSL не напишешь. В то же время преобразования внутри шейдера довольно простые — умножения, деления, синусы, косинусы… Неужели нельзя отследить значения каждой переменной и убедиться, что ни при каких условиях не происходит выхода за допустимые границы значений?


            Так я решил попробовать сделать статический анализ для GLSL. Что из этого получилось — можно прочитать под катом.


            Сразу предупрежу: какого-то законченного продукта получить не удалось, только учебный прототип.

            Читать дальше →
          • «Худой мир». Финал

              Финал фантастической повести. Спасибо всем, кто ждал и поддерживал!

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



              Много фантастики под катом
            • «Худой мир». Глава 9

                Продолжение фантастической повести. Осталось совсем немного — еще два поста, и история будет завершена.

                Марина получает неожиданное предложение…



                Немного фантастики под катом
              • «Худой мир». Глава 8

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


                  Немного фантастики под катом
                • «Худой мир». Глава 3

                    Продолжаем повествование. И на случай, если кто наткнулся на этот пост впервые, это третья глава повести. Первые две можно найти по ссылкам ниже.
                    Предыдущие части

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


                    Немного фантастики под катом
                  • «Худой мир». Глава 2

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

                      Прошу прощения что так долго с ней возился.

                      На случай если кто забыл с чего все начиналось (за два месяца немудрено) — Глава 1.


                      Немного фантастики под катом
                      • +14
                      • 14.1k
                      • 7
                    • LiveReload — обновление javascript без полной перезагрузки страницы (на примере mithril)

                        Вступление


                        Не так давно я начал пользоваться такой полезной штукой как livereload (для тех, кто не знает, что это — есть статья на хабре). Livereload отслеживает изменения в коде веб-приложения и перегружает страницу в браузере при необходимости. При этом со стилями Livereload поступает умнее и заменяет их на лету без перезагрузки, что выглядит волшебно.

                        К сожалению с javascript такой номер не прокатывает — Livereload не знает как гуманно заменить только изменившиеся скрипты и перегружает всю страницу. Это особенно печалит если использовать инструмент вроде mithril, в котором представление (читай — html) задается так же в javascript. Если я меняю модель или контроллер, то тут все понятно, но если я меняю класс у дива в представлении (скажем, подбирая правильное сочетание bootstrap классов), то перезагрузка страницы кажется излишней — ну вот же, я поменял одну функцию, просто перерисуй view с ее помощью!

                        В целом не страшно, конечно (работали же как-то без этого раньше), но почему бы не сделать работу еще немного удобнее?



                        Для тех, кто торопится


                        Читать дальше →
                        • +12
                        • 26.8k
                        • 6
                      • Pattern-matching (еще один) в coffeescript

                        Введение


                        Как-то раз я сидел и грустно смотрел на написанный в рамках изучения эрланговский код. Очень хотелось написать на нем что-нибудь более полезное, чем крестики-нолики, но как назло никаких подходящих задач в голову не приходило. Зато есть JavaScript, в котором есть и функции первого порядка, и каррирование, и map/filter/fold, и, главное, задачу придумать куда проще. А вот pattern matching-а своего нету. Беглый поиск выдал мне несколько библиотек, но предлагаемый ими синтаксис показался мне тяжеловесным. Можно ли сделать лаконичнее, ближе к родному эрланговскому синтаксису?

                        Спойлер: можно, если взять coffeescript, сделать так:

                        fn = Match -> [
                          When {command: “draw”, figure: @figure = {type: “circle”, radius: @radius}}, -> 
                            console.log(@figure, @radius)
                          When {command: “draw”, figure: @figure = {type: “polygon”, points: [@first, @second | @rest]}}, -> 
                            console.log(@figure, @first, @second, @rest);
                        ]
                        fn {command: “draw”, figure: {type: “circle”, radius: 5, color: “red”}}
                        #output: {type: “circle”, radius: 5, color: “red”} 5
                        

                        Кому интересно, как это получилось — добро пожаловать под кат.
                        Читать дальше →
                        • +10
                        • 6.4k
                        • 1