• Основатель F# сообщества: «ООП и ФП головного мозга должны умереть»// Мы обречены #7

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

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

      Спустя полтора года после статьи я позвал Романа Мельникова на подкаст и обсудил, как все обстоит сейчас.

      Читать дальше →
    • Что делает Rust универсальным языком программирования

        Владей и заимствуй


        Долгое время Rust позиционировался исключительно как язык для системного программирования. Попытки использовать Rust для высокоуровневых прикладных задач зачастую вызывали усмешку у значительной части сообщества: зачем использовать инструмент в том качестве, на которое он не рассчитан? Какая польза от возни с типами и анализатором заимствований (borrow checker), если есть Python и Java со сборкой мусора? Но другая часть сообщества всегда видела потенциал Rust именно как языка прикладного, и даже находила его удобным в использовании для быстрого прототипирования — во многом благодаря его особенностям, а не вопреки им.

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

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


        Рисунок 1. Первые 100, 200, 500, 1000, 2000 и 5000 точек выборки из предлагаемого прогрессивного нестохастического ряда точек (уравнение 11), демонстрирующие почти изотропные характеристики синего шума с быстрой сходимостью QMC и сниженным количеством артефактов. Ряд основан на новой простой псевдослучайной последовательности с низким расхождением $R_2$.

        Введение


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


        Рисунок 2. Сравнение регулярной решётки (слева) с тремя разными псевдослучайными функциями (посередине) и простым случайным распределением (справа). Заметьте, что псевдослучайные распределения выглядят менее регулярными, чем решётка, но имеют не так много скоплений и разрежений точек, как случайное распределение.
        Читать дальше →
        • +19
        • 1.8k
        • 1
      • Оптимизация рендера под Mobile, часть 2. Основные семейства современных мобильных GPU

          Приветствую, дорогие любители и профессионалы, программисты графики! Приступаем ко второй части нашего цикла статей про оптимизацию рендера под Mobile. В этой части мы будем рассматривать основные семейства GPU, представленные у игроков на Mobile.


          Для начала рассмотрим ряд критериев, по которым можно классифицировать мобильные GPU.
          Читать дальше →
          • +19
          • 3.5k
          • 8
        • Радости и горести побед над C: делаем конфетку из прототипа wc на хаскеле

            Привет, Хабр.


            Итак, в прошлый раз мы эмпирически доказали, что на хаскеле можно довольно легко написать этакий игрушечный wc, который при этом существенно быстрее реализации wc из GNU Coreutils. Понятное дело, что это не совсем честное сравнение: наша программа не умеет ничего, кроме подсчёта байт, строк и слов, тогда как настоящий wc куда мощнее: он имеет ещё несколько статистик, поддерживает опции, умеет читать из stdin… Короче, у нас действительно получилась всего лишь игрушка.


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


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



            Основная функция С-версии не влезла на 4k-экран в портретной ориентации 4-м шрифтом.


            Кроме этой модуляризации мы, среди прочего:


            • выразим идею, что некоторые статистики вроде подсчёта числа байт могут работать эффективнее на всём входе целиком, а другие должны смотреть на каждый байт;
            • реализуем ещё больше статистик, наслаждаясь возможностью рассуждать о каждой из них в отдельности (то, что называют local reasoning);
            • напишем немного тестов, наслаждаясь local reasoning'ом ещё раз;
            • испытаем некоторые почти зависимо типизированные техники, успешно получив корректно работающий, но феерически тормозящий код;
            • поиграем с Template Haskell;
            • полюбуемся (не)предсказуемостью и (не)воспроизводимостью производительности результирующего кода.
            Читать дальше →
          • Ноутбучный процессор i9-10980HK может потреблять до 135 Вт

              image

              На прошлой неделе появились спецификации для процессоров Intel на базе Comet Lake. Согласно документам, корпорация установила предел энергопотребления 135 Вт для процессора Core i9-10980HK. Этот показатель на 10 ватт больше, чем у 8-ядерного i9-9980HK
              Читать дальше →
            • Теория вероятностей для физически точного рендеринга

              • Translation
              image

              Введение


              В рендеринге часто используется вычисление многомерных определённых интегралов: например, для определения видимости пространственных источников освещения (area light), светимости, доходящей до области пикселя, светимости, поступающей за период времени и облучения, поступающего через полусферу точки поверхности. Вычисление этих интегралов обычно выполняется при помощи интегрирования Монте-Карло, в котором интеграл заменяется ожиданием стохастического эксперимента.

              В этой статье я подробно расскажу о базовом процессе интегрирования Монте-Карло, а также о нескольких техниках, позволяющих снизить дисперсию методики. Это будет сделано с практической точки зрения — предполагается, что читатель не сильно знаком с теорией вероятностей, но всё равно хочет разрабатывать эффективные и корректные алгоритмы рендеринга.
              Читать дальше →
            • Rust превосходит по производительности C++ согласно результатам Benchmarks Game

                В начале этого месяца случилась маленькая победа. Согласно последним результатам популярного бенчмарка, сравнивающего производительность языков программирования, Rust занимает второе место, разместившись между C и С++:

                image

                Для сравнения производительности используется геометрическое среднее времени выполнения 10 различных программ. Согласно последним результатам Rust превзошел С++ в 6 задачах из 10.

                Под катом некоторое детали и мнение о дальнейших перспективах.
                Читать дальше →
              • Facebook представила Viewpoints — приложение, в котором пользователю платят за участие в опросах



                  Компания Facebook анонсировала запуск нового мобильного приложения Facebook Viewpoints, с помощью которого будет собираться обратная связь от пользователей для улучшения продуктов компании, в том числе это касается социальной сети Facebook, а также других сервисов — Instagram, WhatsApp, Portal и Oculus. После отдельной регистрации в этом приложении, каждый пользователь за участие в разных исследованиях и опросах будет получать в качестве награды определенное количество очков, которые можно будет перевести в денежную форму с помощью сервиса PayPal.
                  Читать дальше →
                • Цепи Маркова для процедурной генерации зданий

                  • Translation
                  image

                  Примечание: полный исходный код этого проекта можно найти [здесь]. Так как он является частью более масштабного проекта, я рекомендую смотреть коммит на момент выпуска этой статьи, или файл /source/helpers/arraymath.h, а также /source/world/blueprint.cpp.

                  В этой статье я хочу подробно рассказать о принципах использования цепей Маркова и статистики для процедурной генерации 3D-зданий и других систем.

                  Я объясню математические основы работы системы и постараюсь сделать объяснение как можно более общим, чтобы вы могли применять эту концепцию в других ситуациях, например, для генерации 2D-подземелий. Объяснение будет сопровождаться изображениями и исходным кодом.

                  Этот метод является обобщённым способом процедурной генерации систем, удовлетворяющих определённым требованиям, поэтому я рекомендую дочитать хотя бы до конца первого раздела, чтобы вы могли понять, сможет ли эта методика быть полезной в вашем случае, потому что ниже я объясняю необходимые требования.
                  Читать дальше →
                  • +30
                  • 9.5k
                  • 5
                • Вычисление 2D-коллизий: алгоритм Гилберта — Джонсона — Кирти

                  • Translation
                  image

                  Я занялся изучением процессов распознавания коллизий, и это привело меня к алгоритму Гилберта — Джонсона — Кирти (Gilbert-Johnson-Keerthi, GJK).

                  Все примеры кода в посте написаны на TypeScript. В примерах используются созданные мной структуры, которые подробно в посте не рассмотрены. Они просты и их можно посмотреть в репозитории GitHub:

                  • Vector
                  • IShape
                  • Collision

                  Весь код из поста хранится в репозитории GitHub:

                  https://github.com/jthomperoo/gjk-ts-implementation

                  Пост написан на основании этой статьи и рекомендованного в ней видео:


                  Введение


                  GJK — это алгоритм, предназначенный для определения пересечения двух выпуклых фигур. Он прост и реализуется при помощи обобщённой «вспомогательной функции», позволяющей использовать более общий подход — аналогичным образом можно обрабатывать многоугольники и фигуры, состоящие из кривых, например, эллипсы.
                  Читать дальше →
                • Data-Oriented Design (или почему, используя ООП, вы, возможно, стреляете себе в ногу)

                  • Translation
                  image

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

                  Такое развитие событий довольно точно описывает почти каждую игру, в разработке которой я участвовал на протяжении последних десяти лет. Причины заключаются не в языках программирования и не в инструментах разработки, и даже не в отсутствии дисциплины. По моему опыту, в большой степени в этом стоит винить объектно-ориентированное программирование (ООП) и окружающую его культуру. ООП может не помогать, а мешать вашим проектам!
                  Читать дальше →
                • Inside The JeMalloc. Базовые Структуры Данных: Pairing Heap & Bitmap Tree

                    image

                    Тема Аллокаторов частенько всплывает на просторах интернета: действительно, аллокатор — эдакий краеугольный камень, сердце любого приложения. В этой серии постов я хочу в подробностях рассказать о одном весьма занимательном и именитом аллокаторе — JeMalloc, поддерживаемый и развиваемый Facebook и используемый, например, в bionic[Android] lib C.

                    В сети мне не удалось найти каких-либо подробностей, полностью раскрывающих душу данного аллокатора, что по итогу сказалось на невозможности сделать какие-либо выводы о применимости JeMalloc при решении той или иной задачи. Материала вышло очень много и, дабы читать его было не утомительно, начать предлагаю с основ: Базовых Структур Данных используемых в JeMalloc.

                    Под катом рассказываю о Pairing Heap и Bitmap Tree, формирующих фундамент JeMalloc. На данном этапе я не затрагиваю тему многопоточности и Fine Grained Locking, однако, продолжая серию постов, обязательно расскажу про эти вещи, ради которых, собственно, и создается разного рода Экзотика, в частности и та, что описывается ниже.
                    Читать дальше →
                    • +17
                    • 3.5k
                    • 1
                  • Уравнение Навье-Стокса и симуляция жидкостей на CUDA

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


                    Читать дальше →
                  • Структуры данных для программистов игр: bulk data

                    • Translation
                    image

                    Любому программисту будет полезно понимание различных структур данных и способов анализа их производительности. Но на практике мне ни разу не пригождались АВЛ-деревья, красно-чёрные деревья, префиксные деревья, списки с пропусками, и т.д. Некоторые структуры данных я использую только для одного конкретного алгоритма и ни для чего больше (например, кучи для реализации очереди с приоритетом в алгоритме поиска пути A*).

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

                    • Общие массивы данных (Bulk data) — способ эффективного хранения большого количества объектов.
                    • Слабые ссылки (Weak reference) (или дескрипторы (handle)) — способ обращения к объектам в bulk data без сбоев программы в случае, если объект удалён.
                    • Индексы — способ быстрого доступа к отдельным подмножествам в bulk data.
                    • Массивы массивов — способ хранения объектов bulk data с динамическими размерами.

                    Я посвящу несколько статей тому, как я обычно реализую все эти структуры. Давайте начнём с простейшей и самой полезной — bulk data.
                    Читать дальше →
                  • Делись, рыбка, быстро и нацело

                    • Tutorial
                    image

                    Деление — одна из самых дорогих операций в современных процессорах. За доказательством далеко ходить не нужно: Agner Fog[1] вещает, что на процессорах Intel / AMD мы легко можем получить Latency в 25-119 clock cycles, а reciprocal throughput — 25-120. В переводе на Русский — МЕДЛЕННО! Тем не менее, возможность избежать инструкции деления в вашем коде — есть. И в этой статье, я расскажу как это работает, в частности в современных компиляторах(они то, умеют так уже лет 20 как), а также, расскажу как полученное знание можно использовать для того чтобы сделать код лучше, быстрее, мощнее.
                    Читать дальше →
                  • Введение в детерминированные сборки на С/С++. Часть 1

                    • Translation
                    Перевод статьи подготовлен специально для студентов курса «Разработчик С++».




                    Что такое детерминированная сборка?


                    Детерминированная сборка — это процесс сборки одного и того же исходного кода с одной и той же средой и инструкциями сборки, при котором создаются одни и те же двоичные файлы в любом случае, даже если они сделаны на разных машинах, в разных каталогах и с разными именами. Такие сборки также иногда называют воспроизводимыми или герметичными сборками, если гарантируется, что они будут создавать одни и те же двоичные файлы даже при компиляции из разных папок.
                    Читать дальше →
                    • +15
                    • 4.2k
                    • 1
                  • И всё же C — низкоуровневый язык


                      За прошедшие с момента появления языка C десятилетия было создано множество интереснейших языков программирования. Какие-то из них используются до сих пор, другие — повлияли на следующие поколения языков, популярность третьих тихо сошла на нет. Между тем архаичный, противоречивый, примитивный, сделанный в худших традициях своего поколения языков C (и его наследники) живее всех живых.


                      Критика C — классический для нашей индустрии эпистолярный жанр. Она звучит то громче, то тише, но в последнее время буквально оглушает. Пример — перевод статьи Дэвида Чизнэлла «C — не низкоуровневый язык», опубликованный в нашем блоге некоторое время назад. Про C можно говорить разное, в дизайне языка действительно много неприятных ошибок, но отказывать C в «низкоуровневости» — это уже слишком!


                      Чтобы не терпеть такую несправедливость, я собрался с духом и постарался определиться с тем, что есть язык программирования низкого уровня и чего хотят от него практики, после чего перебрал аргументы критиков C. Так получилась эта статья.

                      Читать дальше →
                    • 17 способов проникновения во внутреннюю сеть компании

                        Безопасность. Слово означающие защищённость человека или организации от чего-либо/кого-либо. В эпоху кибербезопасности мы всё чаще задумываемся не столько о том, как защитить себя физически, сколько о том, как защитить себя от угроз извне (киберугроз).

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

                        image

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

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


                        (Источник)

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


                        (Источник)

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

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