• Работаем с двухмерной физикой в JavaScript

    • Translation
    Доброго времени суток, друзья!

    Представляю Вашему вниманию перевод статьи Martin Heinz «Implementing 2D Physics in JavaScript».

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

    Хотите узнать, как эти алгоритмы реализуются в JS?



    Примеры можно посмотреть здесь.

    Исходный код находится здесь.
    Читать дальше →
    • +16
    • 6.5k
    • 8
  • Динамическая память в системах жёсткого реального времени

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



      (КДПВ – см. аннотацию к диаграмме в конце)

      Читать дальше →
    • Доступное объяснение алгоритма коллапса волновой функции

      • Translation
      Алгоритм коллапса волновой функции (Wavefunction Collapse Algorithm) учит компьютер импровизировать. На входе он получает архетипичные данные и создаёт процедурно генерируемые данные, похожие на исходные.


      (Источник)

      Чаще всего он используется для создания изображений, но может также строить города, скейтпарки и писать ужасные стихи.


      (Источник)

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

      Большинство реализаций и объяснений коллапса волновой функции — это полная, оптимизированная по скорости версия алгоритма. Разумеется, все они важны и необходимы, но в них сложно разобраться с нуля. В этом посте я буду объяснять всё понятным я простым языком, сосредоточившись на версии Wavefunction с ограничениями, которую я назвал Even Simpler Tiled Model. Кроме того, я выложил пример реализации ESTM на Github. Код в нём неэффективный и медленный, но очень хорошо читаемый и подробно прокомментирован. Как только вы разберётесь в технологии, лежащей в основе ESTM, то станете ближе к пониманию более сложных версий алгоритма. Если хотите понять алгоритм коллапса волновой функции, то эта статья будет хорошим началом.
      Читать дальше →
    • Как же, черт возьми, отсортировать этот список?

        Пусть у нас есть список — содержимое каталога, в котором элементами являются экземпляры классов File и Folder. Задача — отсортировать этот список. Есть два широко известных варианта сортировки структуры каталога — когда сначала идут каталоги, а потом файлы, и когда файлы и каталоги сортируются вперемешку. Нам нужно дать пользователю возможность выбирать любой из этих вариантов.

        Впервые на похожую задачу я наткнулся на прошлой работе. К слову, решена эта задача была методом 3 из данной статьи. «Как неэстетично», — подумал я. — «Дали бы мне эту задачу, я бы точно решил ее в 128 раз лучше. Но… как?»

        С той поры минуло уже 5 лет, а я, время от времени мысленно возвращаясь к данной задаче, так и не придумал к ней идеального решения. Тем не менее, за это время у меня успело накопиться несколько идей, которыми я хочу с вами поделиться.
        Читать дальше →
      • Коронавирус 2019-nCoV. FAQ по защите органов дыхания и дезинфекции

        • Tutorial
        Китайский коронавирус, он же «пневмония Уханя» на неделе стал одной из самых горячих тем. В классической «кто виноват и что делать» меня, традиционно, волнует только вторая часть. Сегодня под катом — статья про дезинфекцию, маски и обеззараживание помещений. Объединил в одной статье несколько заметок из своего телеграм-канала. Кладем в закладки и шлем друзьям!


        cтоп! 2019-nCoV
      • [Конспект админа] Что делать, если программа хочет прав администратора, а вы нет


          (с) Вася Ложкин.


          К сожалению, в работе сисадмина нет-нет да и приходится разрешать пользователям запускать всякий софт с админскими правами. Чаще всего это какие-нибудь странные китайские программы для работы с оборудованием. Но бывают и другие ситуации вроде небезызвестного bnk.exe.


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


          Попробуем разобрать решения, которые позволят и программу запустить, и безопасника с финансистом не обозлить.

          Читать дальше →
        • Автоматизация Undo/Redo функциональности с помощью .NET Generics

          • Translation
          Перевод статьи Automating Undo/Redo with .NET Generics Сергея Архипенко.

          Введение

          Эта статья описывает библиотеку, которая предоставляет undo/redo функциональность для каждого действия в вашем приложении. Вы можете использовать сложные структуры данных и сложные алгоритмы не задумываясь о том, как они будут переведены в предыдущее состояния по запросу пользователя или в результате возникновения ошибки.

          Предпосылки

          Если вы когда-нибудь разрабатывали графический редактор или дизайнер для сложных данных, вы сталкивались с трудоёмкой задачей реализации undo/redo функциональности, которая бы поддерживалась во всём приложении. Реализация парных Do и Undo методов для каждой операции скучный и подверженный ошибкам процесс, когда вы разрабытываете что-либо более серьёзное, чем калькулятор. В результате моих экспериментов я нашёл способ сделать поддержку undo/redo прозрачной для бизнес логики. Чтобы этого добиться, мы будем использовать магию generics.
          Этот проект опубликован на CodePlex, чтобы каждый мог его использовать или внести свой вклад.

          Читать дальше →
        • Undo/Redo — Иллюзия простоты

            Такая простая и привычная функция в любом текстовом и графическом редакторе. Казалось бы, какие могут быть сложности с её реализацией? Впервые столкнувшись с разработкой Undo/Redo для текстового редактора XtraRichEdit, мы задумались, а какой же подход нам избрать?


            Читать дальше →
          • Этот восхитительный Юникод

            • Translation


            Перед вами обновляемый список самых замечательных «вкусностей» Юникода, а также пакетов и ресурсов

            Юникод — это потрясающе! До его появления международная коммуникация была изнурительной: каждый определял свой отдельный расширенный набор символов в верхней половине ASCII (так называемые кодовые страницы). Это порождало конфликты. Просто подумайте, что немцам приходилось договариваться с корейцами, где чья кодовая страница. К счастью, появился Юникод и ввёл общий стандарт. Юникод 8.0 охватывает более 120 000 символов из более 129 письменностей. И современные, и древние, и до сих пор не расшифрованные. Юникод поддерживает текст слева направо и справа налево, наложение символов и включает самые разные культурные, политические, религиозные символы и эмодзи. Юникод потрясающе человечен, а его возможности сильно недооцениваются.
            Читать дальше →
          • Про геометрический смысл кодов Грея


              Коды Грея имеют близкую родственную связь с кривой Гильберта.

              Впрочем, при общении с коллегами выяснилось, что эта несложная зависимость выглядит в их глазах как нечто нетривиальное. Поиск в интернетах навскидку ничего не дал кроме мутной фразы в вики: “кривые Гильберта в пространствах большей размерности являются представителями обобщений кодов Грея”. Поэтому возникло желание раскрыть тему — коротенько, простым языком.

              В результате под катом — «скандалы, интриги, расследования».
              Читать дальше →
              • +33
              • 10.1k
              • 9
            • Нет клещам! Растения против переносчиков болезни Лайма

              • Tutorial
              Сегодня я написал в своем канале заметку про отпугивание клещей растительными заграждениями. А потом подумал, и решил продублировать на хабр. Пусть она и небольшая по размеру, и не совсем подходит под характерные для меня лонгриды. Но ведь не у всех есть телеграм. И именно сейчас лучшее время для поиска и закупки семян различных растительных репеллентов и «клещегонов». Поэтому сегодня под катом — про биобарьеры против боррелиозного клеща. Из каких растений их лучше сделать!


              Защитить дачу от клещей!
            • Адаптивная процедурная генерация при помощи алгоритма WaveFunctionCollapse и априорного распределения вероятностей

              • Translation

              Что такое процедурная генерация?


              Процедурная генерация включает в себя множество генеративных алгоритмов, принцип работы которых заключается в создании данных не вручную, а алгоритмически: вместо ручного изготовления того, что мы хотим создать (карты, музыки, рельефа…), пишется алгоритм, который успешно может создавать различные примеры без многократного выполнения того же процесса. Особенно полезен такой подход в видеоиграх, где случайным образом может генерироваться целая карта или уровень (например, карты в Minecraft, Terraria или Factorio, или схемы уровней в большинстве roguelike).

              Алгоритм коллапса волновой функции и его области применения


              В статье мы исследуем алгоритм коллапса волновой функции (WaveFunctionCollapse, WFC), предложенный Максимом Гуминым (в его Twitter есть коллекция потрясающего контента, созданного при помощи этого алгоритма другими разработчиками!) для процедурной генерации изображений или рельефа при помощи создания изображений, локально схожих с входящим изображением в условиях сетки заданного размера.

              В основе алгоритма лежит идея пошагового создания готового изображения с отслеживанием того, какие тайлы «соответствуют» уже частично построенному изображению. Для изучения подробного описания алгоритма рекомендуем обратиться к исходному репозиторию WFC на Github и четвёртому разделу статьи "WaveFunctionCollapse is Constraint Solving in the Wild".


              Примеры процедурно сгенерированных из seed изображений
              Читать дальше →
              • +11
              • 2.4k
              • 2
            • Прекращаем ставить диод 2

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

                Устройство получилось относительно сложным, хотя и довольно экономичным (ток потребления при использовании современной версии компаратора LM393 получился около 0.5 mA). Читатели обратили внимание на эту сложность и в комментариях предложили другой вариант «идеального диода», который выглядит на порядок более простым. К своему стыду, на тот момент я не был знаком с такой схемой, поэтому решил при удобном случае разобраться с ней подробнее. После серии экспериментов, которые начались с компьютерной симуляции, а закончились макетной платой, было выяснено, что при своей кажущейся простоте, эта схема очень нетривиальна как с позиции понимания всех протекающих в ней процессов, так и с точки зрения подводных камней, которые она в себе таит.


                В общем, предлагаю вашему вниманию другой вариант реализации «идеального диода» с подробным описанием его особенностей.
                Читать дальше →
              • Пишем «калькулятор» на C#. Часть I. Вычисление значения, производная, упрощение, и другие гуси

                  Привет!

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

                  Меньше воды! О чем статья?
                  Здесь будет поверхностно о построении выражения, парсинге из строки, подстановки переменной, аналитической производной, численным решении уравнения и определенного интеграла, рендеринг в формат LaTeX, комплексных числах, компиляцией функций, упрощении, раскрытии скобок, и бла бла бла. Вероятно, не в одной статье.
                  Для тех, кому нужно срочно что-нибудь склонировать, ссылка на репозиторий.

                  Берем оставшиеся с нового года печеньки, и погнали!
                  Читать дальше →
                • Как я чуть не выкинул 150к на ветер или история установки приточной вентиляции в квартире

                    Как я пришел к покупке приточной вентиляции для квартиры с готовым ремонтом. Как купил ее за 150к и чуть не потратил деньги зря. Статья будет полезна тем, кто планирует купить очиститель воздуха, бризер или приточку.


                    Читать дальше →
                  • Поверхностно об основах рыночной архитектуры и алготрейдинге

                    Многие знают, что одно из первых, что говорят в техническом ВУЗе — забыть все, что проходили в школе. Данная рекомендация актуальна и здесь. Полезно иногда с чистого листа начать.

                    На данный момент все рынки автоматизированы. По этой причине какие-то экономические объяснения ценообразования являются некими рудиментами. Рулят алгоритмы + некое ручное вмешательство.

                    Задача каждого торгового алгоритма всегда одна и та же — принести денег владельцу. Алгоритм тем лучше, чем больше денег он в состоянии принести.
                    Читать дальше →
                  • gReebok detected. Сам себе дерматовенеролог

                    • Tutorial
                    Около года назад я опубликовал свою статью Как спастись от «зайцев». Инструкция по борьбе с ультрафиолетом в которой достаточно подробно рассказал про ультрафиолет, его воздействие на ткани человека и способы лучевой защиты. Однажды на досуге я задумался над тем, в какой форме чаще всего приходится сталкиваться с «рукотворным» (т.е. не из спектра Солнца) ультрафиолетом. Вышло, что наиболее популярный УФ — это мягкий УФ и флуоресценция, которую он способен вызывать. Наиболее популярный вариант у моих дружков — это просвечивать друг друга и потом спрашивать у меня, что значит тот или иной цвет пятна на коже, и не грибок ли это. Чтобы раз и навсегда этот вопрос закрыть представляю очередной туториал. На этот раз, по диагностике кожных заболеваний ультрафиолетом лампы Вуда. Так что если интересно, как с помощью «дискотечного ультрафиолета» можно определить наличие чесотки/грибка на ногах/лишая (в том числе у любимого котика), а также про то, как лампа с aliexpress за 5$ может помочь диагностировать рак кожи и бороться с борщевиком — читаем под катом. Только наукоёмкое самоделие, с пожеланием крепкого здоровья в Наступающем 2020 году!
                    Закинь в закладки, %username% :)


                    Проверить себя и того парня лампой Вуда!
                  • Парадокс Эйнштейна — Подольского — Розена на пальцах и… при чём тут эфир

                      Парадокс Эйнштейна — Подольского — Розена сейчас активно изучают в многих лабораториях мира и научных институтах. Пишутся тонны научных статей. Поднято много хайпа в около-научных кругах.


                      Только лишь одна загвоздка, хотя и достаточно парадоксальная. В самой квантовой механике нет ничего парадоксального в парадоксе ЭПР! Ни граммульки!

                      Так почему же его так пристально изучают?

                      И да, при чём тут эфир?!
                      Читать дальше →
                    • Свёрточные текстуры

                      • Translation

                      Самостоятельно обновляемые текстуры


                      Когда существует возможность распараллеливания симуляций или задач рендеринга, то обычно лучше всего выполнять их в GPU. В этой статье я объясню технику, использующую этот факт для создания впечатляющих визуальных трюков с низкими затратами производительности. Все эффекты, которые я продемонстрирую, реализованы при помощи текстур, которые при обновлении "рендерятся сами в себя"; текстура обновляется при рендеринге нового кадра, а следующее состояние текстуры полностью зависит от предыдущего состояния. На этих текстурах можно рисовать, вызывающая определённые изменения, а сама текстура прямо или косвенно может применяться для рендеринга интересных анимаций. Я называю их свёрточными текстурами.


                      Рисунок 1: двойная буферизация свёрточной текстуры

                      Прежде чем двигаться дальше, нам нужно решить одну проблему: текстуру нельзя считывать и записывать одновременно, такие графические API, как OpenGL и DirectX, не позволяют этого делать. Так как следующее состояние текстуры зависит от предыдущего, нам нужно как-то обойти это ограничение. Мне нужно выполнять чтение из другой текстуры, а не из той, в которой выполняется запись.

                      Решением является двойная буферизация. На рисунке 1 показано, как она работает: на самом деле вместо одной текстуры есть две, но в одну из них выполняется запись, а из другой производится чтение. Текстура, в которую выполняется запись, называется back buffer (вторичный буфер), а рендерящаяся текстура — front buffer (первичный буфер). Поскольку свёрточная тестура «записывается в саму себя», вторичный буфер в каждом кадре выполняет запись в первичный буфер, а затем первичный рендерится или используется для рендеринга. В следующем кадре роли меняются и предыдущий первичный буфер используется как источник для следующего первичного буфера.
                      Читать дальше →
                    • Яндекс запустил народное голосование за ретроигры. Финалисты Retro Games Battle 2019

                        В июле команда Музея Яндекса запустила Retro Games Battle 2019 — конкурс по разработке игр для легендарного ZX Spectrum, ориентированный на любителей ретротехники. 5 декабря завершился приём заявок. 19 новых игр дошло до финала.

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



                        Читать дальше →