• Мультиплеер в быстрых играх (части I, II)



    1. Части I, II (синглплеер с авторитарным сервером)
    2. Часть III (Появление врага)
    3. Часть IV (Хэдшот!)


    Предлагаю вашему вниманию перевод статьи Fast-Paced Multiplayer (Part I): Introduction.

    Разработка игры — само по себе непростое занятие. Но мультиплеерные игры создают совершенно новые проблемы, требующие разрешения. Забавно, что у наших проблем всего две причины: человеческая натура и законы физики. Законы физики привнесут проблемы из области теории относительности, а человеческая натура не даст нам доверять сообщениям с клиента.
    Читать дальше →
  • Повесть о создании классической RTS в домашних условиях с нуля + разбор основных этапов разработки (AI, сеть и т.д.)

    image

    В статье речь пойдет об одном очень не новом проекте, который создавался совсем в другое время и совсем в других условиях. Это моя старенькая RTS под названием Земля онимодов (Onimod land). Чтобы было сразу понятно, что она собой представляет, можно посмотреть коротенькое видео:
    Читать дальше →
  • Нечёткий поиск в тексте и словаре

      Введение


      Алгоритмы нечеткого поиска (также известного как поиск по сходству или fuzzy string search) являются основой систем проверки орфографии и полноценных поисковых систем вроде Google или Yandex. Например, такие алгоритмы используются для функций наподобие «Возможно вы имели в виду …» в тех же поисковых системах.

      В этой обзорной статье я рассмотрю следующие понятия, методы и алгоритмы:
      • Расстояние Левенштейна
      • Расстояние Дамерау-Левенштейна
      • Алгоритм Bitap с модификациями от Wu и Manber
      • Алгоритм расширения выборки
      • Метод N-грамм
      • Хеширование по сигнатуре
      • BK-деревья
      А также проведу сравнительное тестирование качества и производительности алгоритмов.
      Читать дальше →
    • Нечеткий поиск в словаре с универсальным автоматом Левенштейна. Часть 1



      Нечеткий поиск строк является весьма дорогостоящей в смысле вычислительных ресурсов задачей, особенно если вам необходима высокая точность получаемых результатов. В статье описан алгоритм нечеткого поиска в словаре, который обеспечивает высокую скорость поиска при сохранении 100% точности и сравнительно низком потреблении памяти. Именно автомат Левенштейна позволил разработчикам Lucene повысить скорость нечеткого поиска на два порядка
      Читать дальше →
      • +49
      • 47.1k
      • 7
    • Нейросеть в 11 строчек на Python

      • Translation

      О чём статья


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

      Дайте код!


      X = np.array([ [0,0,1],[0,1,1],[1,0,1],[1,1,1] ])
      y = np.array([[0,1,1,0]]).T
      syn0 = 2*np.random.random((3,4)) - 1
      syn1 = 2*np.random.random((4,1)) - 1
      for j in xrange(60000):
          l1 = 1/(1+np.exp(-(np.dot(X,syn0))))
          l2 = 1/(1+np.exp(-(np.dot(l1,syn1))))
          l2_delta = (y - l2)*(l2*(1-l2))
          l1_delta = l2_delta.dot(syn1.T) * (l1 * (1-l1))
          syn1 += l1.T.dot(l2_delta)
          syn0 += X.T.dot(l1_delta)
      


      Слишком сжато? Давайте разобьём его на более простые части.
      Читать дальше →
    • Нейросеть на Python, часть 2: градиентный спуск

      • Translation
      Часть 1

      Давай сразу код!


      import numpy as np
      X = np.array([ [0,0,1],[0,1,1],[1,0,1],[1,1,1] ])
      y = np.array([[0,1,1,0]]).T
      alpha,hidden_dim = (0.5,4)
      synapse_0 = 2*np.random.random((3,hidden_dim)) - 1
      synapse_1 = 2*np.random.random((hidden_dim,1)) - 1
      for j in xrange(60000):
          layer_1 = 1/(1+np.exp(-(np.dot(X,synapse_0))))
          layer_2 = 1/(1+np.exp(-(np.dot(layer_1,synapse_1))))
          layer_2_delta = (layer_2 - y)*(layer_2*(1-layer_2))
          layer_1_delta = layer_2_delta.dot(synapse_1.T) * (layer_1 * (1-layer_1))
          synapse_1 -= (alpha * layer_1.T.dot(layer_2_delta))
          synapse_0 -= (alpha * X.T.dot(layer_1_delta))
      

      Часть 1: Оптимизация


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

      Суть происходящего в том, что обратное распространение не вносит в работу сети оптимизацию. Оно перемещает неверную информацию с конца сети на все веса внутри, чтобы другой алгоритм уже смог оптимизировать эти веса так, чтобы они соответствовали нашим данным. Но в принципе, у нас в изобилии присутствуют и другие методы нелинейной оптимизации, которые мы можем использовать с обратным распространением:
      Читать дальше →
      • +23
      • 48.2k
      • 5
    • Обработка ошибок в Rust

      • Translation

      Как и многие языки программирования, Rust призывает разработчика определенным способом обрабатывать ошибки. Вообще, существует два общих подхода обработки ошибок: с помощью исключений и через возвращаемые значения. И Rust предпочитает возвращаемые значения.



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



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


      Читать дальше →
    • Зачем нужны все эти функторы и монады?

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

        Это статья попытка показать, что сила функциональных языков и в первую очередь Хаскеля — это в том числе и силе функторов и монад.

        Читать дальше →
      • Как я, в итоге, написал новую RTOS, протестированную и стабильную

          Я работаю со встраиваемыми системами в течение нескольких лет: наша компания разрабатывает и производит бортовые компьютеры для автомобилей, зарядные устройства, и т.д.

          image


          Процессоры, используемые в наших продуктах — это, в основном, 16- и 32-битные микроконтроллеры Microchip, имеющие RAM от 8 до 32 кБ, и ROM от 128 до 512 кБ, без MMU. Иногда, для самых простых устройств, используются еще более скромные 8-битные чипы.

          Очевидно, что у нас нет (разумных) шансов использовать ядро Linux. Так что нам нужна какая-нибудь RTOS (Real-Time Operating System). Находятся даже люди, которые не используют никаких ОС в микроконтроллерах, но я не считаю это хорошей практикой: если железо позволяет мне использовать ОС, я ее использую.

          Несколько лет назад, когда мы переходили с 8-битников на более мощные 16-битные микроконтроллеры, мои коллеги, которые были гораздо более опытными, чем я, рекомендовали вытесняющюю RTOS TNKernel. Так что это — та ОС, которую я использовал в разных проектах в течение пары лет.

          Не то, чтобы я был очень доволен ею: например, в ней нет таймеров. И она не позволяет потоку ждать сообщения сразу из нескольких очередей. И в ней нет программного контроля переполнения стека (это действительно напрягало). Но она работала, так что я продолжал ее использовать.
          Читать дальше →
        • Шпаргалка Java программиста 2: Триста пятьдесят самых популярных не мобильных Java opensource проектов на github

            Что это и зачем оно надо: Как известно, главное преимущество Java мира в том в нем существует огромное количество open-source проектов на на все случаи жизни, однако найти нужный на github'e не так просто, так как описание проекта часто мало информативно, зачастую сложно даже понять этот проект для Android'a или нет. В этой статье я автоматически и полуавтоматически собрал Java проекты, убрал старые и проекты только для Android'a, выбрал 350 набравших больше всего звезд, разделил по категориям и перевел описания.

            Если вы хотите убедиться что базы данных пишут не только на C, найти проекты для работы с большими данными или нейронными сетями, пишите свой язык программирования для JVM и хотите посмотреть как это уже сделано или же просто хотите узнать какие новые возможности можно найти в Java мире open-source то это статья вам, думаю, может пригодится.

            В чем смысл серии статей 'Шпаргалки Java программиста'
            За время работы Java программистом я заметил, что как правило программисты постоянно и планомерно используют от силы 10-20% от возможностей той или иной технологии, при этом остальные возможности быстро забываются и при появлении новых требований, переходе на новую работу или подготовке к техническому интервью приходится перечитывать все документации и спецификации с нуля. Зато наличие краткого конспекта особенностей тех или иных технологий (шпаргалок) позволяет быстро освежить в памяти особенности той или иной технологии.


            Другие статьи серии: часть 1. JPA и Hibernate в вопросах и ответах

            Update: Внимание, актуальная версия со много большим количеством ссылок, находиться теперь в моем github'e проекте useful-java-links, по этой ссылке.


            Читать дальше →
          • Автоматическая сборка модулей ядра при помощи DKMS

              В некоторых случаях ручная сборка модулей ядра нецелесообразна, поскольку удобнее использовать Dynamic Kernel Module Support (DKMS)
              Технология DKMS позволяет в том числе производить автоматическую сборку модулей системы при обновлении ядра.

              В данной статье рассматривается автоматическое управление при помощи DKMS на примере модулей шины CAN.
              Читать дальше →
              • +12
              • 11.1k
              • 2
            • Как разобрать обезьяньи кишки на составные части. Изучаем цветовую деконволюцию


                Как многие помнят, я работаю в лаборатории, где мы работаем с живыми и не очень организмами. Науку двигаем, короче. Обычно вперед. Иногда в качестве образцов нам достаются мертвые обезьяны, ткани которых потом идут на экспериментальные задачи. Выглядит обычно это крайне жизнерадостно. Раздается звонок в 11 часов вечера, и тебе сообщают, что в питомнике обезьянка убилась. Почти не поврежденная, соседи только сердце съели. Вздыхаем, лезем в расписание рейсов и едем в аэропорт. На месте тебе выдают нужные запчасти убиенной и складывают в прозрачный контейнер с консервационным раствором. В аэропорт с этим тащиться уже нельзя, так как ограничен провоз жидкостей. Идем на ж/д вокзал на экспресс до Краснодара. Милые девушки на контроле как правило приобретают восхитительный салатовый оттенок при виде медленно кружащихся органов в нежно-розовом растворе.
                В-общем, привезли, нарезали все, что нужно ломтиками, покрасили… Но тут оказывается, что полученные исходники нужно обработать и посчитать в автоматическом режиме… Сразу хочу уточнить, что я врач-исследователь, а не профессиональный программист или математик. Поэтому, если что-то покажется ошибочным — буду рад правкам.
                Читать дальше →
              • Создание искусственного интеллекта для игр — от проектирования до оптимизации

                • Translation

                Сегодня – первое сентября. А значит, многие читатели хабры начинают прохождение нового уровня одной древней известной игры – той самой, в которой требуется прокачать интеллект, и, в итоге, получить магический артефакт – аттестат или диплом, подтверждающий ваше образование. К этому дню мы сделали реферативный перевод статьи про реализацию искусственного интеллекта (ИИ) для игр – от его проектирования до оптимизации производительности. Надеемся, что она будет полезна как начинающим, так и продвинутым разработчикам игр.
                Читать дальше →
                • +40
                • 119k
                • 3
              • Прекратите скручивать!

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

                Дальше много текста, фотографий, разборок. Ну все как обычно
              • Создание собственных драйверов под Linux



                  Многие мои друзья и знакомые крутят пальцем у виска или задаются вопросом: не жмёт ли мне череп, когда узнают, что я пишу драйвера под Linux. Слово “драйвер” окутано каким-то почти мистическим смыслом, и постичь Дао его написания способны лишь избранные гуру.
                  К счастью это не так. Не знаю, как обстоят дела с написанием драйверов под другие операционные системы, в т.ч. и наиболее популярные, но под linux, вне зависимости от аппаратной архитектуры драйвера пишутся очень просто. Для написания драйвера необходимы базовые знания языка си, представление о работе ОС линукс (базовые), понимание того, что мы хотим получить, желание чтения документации и исходных кодов, ну и усидчивость. Всё.
                  Вы хотите посмотреть как написать драйвер для своего устройства? Тогда ныряйте под кат!
                  Читать дальше →
                • Как работает мозг?

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

                    История компьютерных наук в целом сводится к тому, что учёные пытаются понять, как работает человеческий мозг, и воссоздать нечто аналогичное по своим возможностям. Как именно учёные его исследуют? Представим, что в XXI веке на Землю прилетают инопланетяне, никогда не видевшие привычных нам компьютеров, и пытаются исследовать устройство такого компьютера. Скорее всего, они начнут с измерения напряжений на проводниках, и обнаружат, что данные передаются в двоичном виде: точное значение напряжения не важно, важно только его наличие либо отсутствие. Затем, возможно, они поймут, что все электронные схемы составлены из одинаковых «логических вентилей», у которых есть вход и выход, и сигнал внутри схемы всегда передаётся в одном направлении. Если инопланетяне достаточно сообразительные, то они смогут разобраться, как работают комбинационные схемы — одних их достаточно, чтобы построить сравнительно сложные вычислительные устройства. Может быть, инопланетяне разгадают роль тактового сигнала и обратной связи; но вряд ли они смогут, изучая современный процессор, распознать в нём фон-неймановскую архитектуру с общей памятью, счётчиком команд, набором регистров и т.п. Дело в том, что по итогам сорока лет погони за производительностью в процессорах появилась целая иерархия «памятей» с хитроумными протоколами синхронизации между ними; несколько параллельных конвейеров, снабжённых предсказателями переходов, так что понятие «счётчика команд» фактически теряет смысл; с каждой командой связано собственное содержимое регистров, и т.д. Для реализации микропроцессора достаточно нескольких тысяч транзисторов; чтобы его производительность достигла привычного нам уровня, требуются сотни миллионов. Смысл этого примера в том, что для ответа на вопрос «как работает компьютер?» не нужно разбираться в работе сотен миллионов транзисторов: они лишь заслоняют собой простую идею, лежащую в основе архитектуры наших ЭВМ.

                    Моделирование нейронов


                    Кора человеческого мозга состоит из порядка ста миллиардов нейронов. Исторически сложилось так, что учёные, исследующие работу мозга, пытались охватить своей теорией всю эту колоссальную конструкцию. Строение мозга описано иерархически: кора состоит из долей, доли — из «гиперколонок», те — из «миниколонок»… Миниколонка состоит из примерно сотни отдельных нейронов.



                    По аналогии с устройством компьютера, абсолютное большинство этих нейронов нужны для скорости и эффективности работы, для устойчивости ко сбоям, и т.п.; но основные принципы устройства мозга так же невозможно обнаружить при помощи микроскопа, как невозможно обнаружить счётчик команд, рассматривая под микроскопом микропроцессор. Поэтому более плодотворный подход — попытаться понять устройство мозга на самом низком уровне, на уровне отдельных нейронов и их колонок; и затем, опираясь на их свойства — попытаться предположить, как мог бы работать мозг целиком. Примерно так пришельцы, поняв работу логических вентилей, могли бы со временем составить из них простейший процессор, — и убедиться, что он эквивалентен по своим способностям настоящим процессорам, даже хотя те намного сложнее и мощнее.
                    Читать дальше →
                  • BLE от Nordic Semiconductor. Начало работы со стеком с применением чипа nRF51822


                    Здравствуйте.

                    Какое-то время я вынашивал идею написать статью о данном стеке, его особенностях и применении с использованием чипа nRF51822. А недавняя публикация "BLE стек от TI" заставила меня сесть и попытаться превратить идею в что-то материальное.

                    Nordic Semiconductor предоставляет очень интересное, на мой взгляд, решение. С одной стороны мощный чип на ядре ARM Cortex-M0, с другой стороны постоянно развивающееся ПО стека и набора библиотек, входящих в состав SDK.

                    К сожалению, на Хабре нет статей, посвященных тематике BLE на NORDIC-е, как в прочем, практически нет их и в рунете, поэтому надеюсь, что статья будет полезна тем, кто начинает использовать продукцию этой фирмы в части, касающейся BLE, а также тем, кто увлекается технологией Bluetooth и BLE в частности.
                    Читать дальше →
                  • Портативная игровая консоль на основе Raspberry Pi

                      Добрый день!

                      Случайно наткнулся на интересный проект, основанный на Raspberry Pi. На этот раз малину использовали в качестве «мозга» для портативной игровой приставки. На фоне других проектов использующих Raspberry Pi, данный проект выделяет действительно законченный вид. В своих видео, автор проекта Ben Heck показывает все этапы создания приставки с разъяснениями(видео на английском языке).
                      Читать дальше →
                      • +6
                      • 26.4k
                      • 9
                    • Atari Portfolio — ноутбук Джона Коннора

                        Наверняка вы обратили внимание на компьютер, с помощью которого юный Джон Коннор в Терминаторе-2 взламывал PIN-код банкомата, и код доступа в лабораторию. Этим компьютером был Atari Portfolio. На момент выхода фильма (1991-й год) он казался чем-то за гранью фантастики. Мне посчастливилось его найти, и хочу поделится с вами его обзором.
                        Читать дальше →
                      • Жонглирование. Теория. Практика

                          Настороженно отношусь к непрофильным топикам, но решил написать этот по следующим причинам:
                          • У жонглирования есть своя теория — стройная и математически привлекательная!
                          • Мы живем не только работой. Жонглирование — отличное развлечение и разминка после долгого сидения за компом.
                          • В пятницу приятно немного расслабиться и почитать не очень серьезные статьи. К тому же, будет чем заняться на выходные, особенно если у вас не было определенных планов.

                          Теория


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