• Нам обещают видео в реальном времени без фризов и дерганий

    • Перевод

    Каждый раз, запуская Skype, Zoom или Hangouts, я с интересом жду свежую порцию косяков с видео и звуком. Технологии редко меня разочаровывают: квакание, фоновые шумы, пропадание голоса, распадение видео на «квадратики», замороженные кадры и другие радости видеоконференций преследуют видеозвонки, сколько я себя помню. Интерес во многом профессиональный: кроме программируемой телефонии для обычных телефонов, веб-страниц и мобильных приложений, мы в Voximplant отгружаем разработчикам видео. Хочется Full HD, в реальном времени, без фризов, в любом браузере и конференция человек на 50. Что интересно, в лабораторных условиях оно именно так и работает. А вот в каком-нибудь парке на 3G видеоконсультация с доктором может превратиться в пошаговую стратегию: пакеты-то теряются! Современный стек технологий пока не позволяет на равных бороться с «мигающим» интернетом, но исследования постоянно ведутся. Под катом — адаптированный для Хабра перевод про Salsify: сплава видеокодека и сетевого протокола, минимизирующего проблемы при передаче видео в реальном времени.
    Читать дальше →
  • Планетарный ландшафт

    • Tutorial
    Трудно поспорить, что ландшафт — неотъемлемая часть большинства компьютерных игр на открытых пространствах. Традиционный метод реализации изменения рельефа окружающей игрока поверхности следующий — берем сетку (Mesh), представляющую из себя плоскость и для каждого примитива в этой сетке производим смещение по нормали к этой плоскости на значение, конкретное для данного примитива. Говоря простыми словами, у нас есть одноканальная текстура размером 256 на 256 пикселей и сетка плоскости. Для каждого примитива по его координатам на плоскости берем значение из текстуры. Теперь просто смещаем по нормали к плоскости координаты примитива на полученное значение(рис.1)


    Рис.1 карта высот + плоскость = ландшафт

    Почему это работает? Если представить, что игрок находится на поверхности сферы, и радиус этой сферы чрезвычайно велик по отношению к размеру игрока, то искривлением поверхности можно пренебречь и использовать плоскость. Но что если не пренебрегать тем фактом, что мы находимся на сфере? Своим опытом построения такого рода ландшафтов я хочу поделиться с читателем в данной статье.
    Читать дальше →
  • Лучшие головоломки, про которые не знает никто*. Часть вторая

      *почти

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

      Volvox




      Осторожно, пропаганда употребления наркотиков
    • О возникновении спиралей в циклическом клеточном автомате

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

      Кратко опишем циклический клеточной автомат.
      Решетка представляет собой замкнутую двумерную ортогональную сетку квадратных клеток, каждая из которых находится в одном из 15 возможных состояний, в пределах от 0 до 14.


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


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



      Как видно из рисунка выше, клеточный автомат проходит три этапа:

      1. Случайное поле.
      2. Цветные области.
      3. Спирали, также известные как демоны.

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


      Выберем несколько (например 12) случайных ячеек и рассмотрим изменение их состояний во времени.
      Читать дальше →
      • +30
      • 6,6k
      • 6
    • Как зарождалась жизнь

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


        Именно здесь на Земле могла зародиться жизнь, картина Зденека Буриана
        Читать дальше →
      • Давайте уже разберемся в DNS

        • Перевод

        image
        Внимательный читатель найдет на этой картинке IPv6


        Люди часто озадачены доменами. Почему мой сайт не работает? Почему эта хрень поломана, ничего не помогает, я просто хочу, чтобы это работало! Обычно, вопрошающий или не знает про DNS, или не понимает фундаментальных идей. Для многих DNS — страшная и непонятная штука. Эта статья — попытка развеять такой страх. DNS — это просто, если понять несколько базовых концепций.


        Что такое DNS


        DNS расшифровывается как Domain Name System. Это глобальное распределенное хранилище ключей и значений. Сервера по всему миру могут предоставить вам значение по ключу, а если им неизвестен ключ, то они попросят помощи у другого сервера.


        Вот и все. Правда. Вы или ваш браузер запрашивает значение для ключа www.example.com, и получает в ответ 1.2.3.4.

        Читать дальше →
      • О трехмерном Z-order замолвите слово


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

          Вы спросите: «Кому вообще интересны эти небесные объекты?» и даже: «Ну и при чём здесь 2ГИС?» и будете отчасти правы. Ведь методы пространственного индексирования являются универсальной ценностью.

          Обычно, имея дело с геоданными, мы работаем с локальной проекцией на плоскость и тем самым отмахиваемся от искажений. В масштабах планеты это сделать труднее — начинают выпирать астрономические проблемы.
          Что касается объёмов данных, уже сейчас в OSM более 4 млрд точек и 300 млн дорог. Это соизмеримо с масштабами, характерными для звёздных объектов. Да и помимо всего прочего, звёздные атласы — отличный стенд для разработки и отладки пространственных алгоритмов.

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

          В мире существует множество библиотек, реализующих сигналы в C++. К сожалению, у всех реализаций, с которыми я сталкивался, есть несколько проблем, которые не позволяют писать простой многопоточный код с использованием этих библиотек. Здесь я расскажу об этих проблемах, и о том, как их можно решить.
          Читать дальше →
          • +19
          • 14k
          • 8
        • Неконстантные константные выражения

          • Перевод
          // <какой-то код>
           
          int main ()
          {
                  constexpr int a = f ();
                  constexpr int b = f ();
           
                  static_assert (!= b, "fail");
          }

          Можно ли в приведенном выше фрагменте вместо комментария вставить такое определение f (), чтобы a получила значение, отличное от b?

          “Разумеется, нет!” — скажете вы, немного подумав. Действительно, обе переменные объявлены со спецификатором constexpr, а значит, f () тоже должна быть constexpr-функцией. Всем известно, что constexpr-функции могут выполняться во время компиляции, и, как следствие, не должны зависеть от глобального состояния программы или изменять его (иными словами, должны быть чистыми). Чистота означает, что функция при каждом вызове с одними и теми же аргументами должна возвращать одно и то же значение. f () оба раза вызывается без аргументов, поэтому должна оба раза вернуть одно и то же значение, которое и будет присвоено переменным a и b… правильно?

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

          Я ошибался.
          Увиденное под катом уже не развидеть
        • Управление ресурсами с помощью явных специализаций шаблонов



            RAII – одна из наиболее важных и полезных идиом в C++. RAII освобождает программиста от ручного управления ресурсами, без неё крайне затруднено написание безопасного с точки зрения исключений кода. Возможно, самое популярное использование RAII – это управление динамически выделяемой памятью с помощью умных указателей, но она также может с успехом применяться и к другим ресурсам, особенно в мире низкоуровневых библиотек. Примеры включают в себя дескрипторы Windows API, файловые дескрипторы POSIX, примитивы OpenGL и тому подобное.
            Читать дальше →
          • Удаленная отладка в Linux при помощи связки GDB-gdbserver

            Как всем нам известно, процесс отладки это такая вещь, важность которой трудно переоценить. Причем, понимая важность таких методов как дебажное моргание светодиодами и вывод дебажных сообщений в порт, я остаюсь при мнении, что эффективнее пошаговой отладки пока ничего не придумано. Однако, задача пошаговой отладки становится не такой тривиальной в случае программирования под Linux на встраиваемых системах (таких как rasbery pi, virt2real или промышленные процессорные модули).

            Данную задачу в Linux призвана решать стандартная связка программ GDB и gdbserver. Идея в том, что пишешь на компе программу (host в терминологии GDB), компилируешь её и заливаешь на целевое устройство (target). Далее запускаешь на целевом устройстве (target) отлаживаемый файл и gdbserver, а на хосте GDB и вперед.
            Читать дальше →
          • Краткий курс компьютерной графики: пишем упрощённый OpenGL своими руками, статья 2 из 6

            • Tutorial

            Содержание курса



            Улучшение кода






            Official translation (with a bit of polishing) is available here.




            Update:


            Внимание, статья 4в даёт новую, более простую версию растеризатора.

            Давайте знакомиться, это я.



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

            В прошлый раз мы нарисовали проволочную сетку трёхмерной модели, в этот раз мы зальём полигоны. Точнее, треугольники, так как OpenGL практически любой полигон триангулирует, поэтому ни к чему разбирать сложный случай. Напоминаю, что этот цикл статей создан для самостоятельного программирования. Время, которое я здесь привожу — это не время чтения моего кода. Это время написания вашего кода с нуля. Мой код здесь только для того, чтобы сравнить ваш (рабочий) код с моим. Я совсем не являюсь хорошим программистом, поэтому ваш код может быть существенно лучше моего. Любая критика приветствуется, любым вопросам рад.

            Пожалуйста, если вы следуете этому туториалу и пишете свой код, выкладывайте его на github.com/code.google.com и им подобные и давайте ссылки в комментариях! Это может хорошо помочь как и вам (другие люди могут чего посоветовать), так и будущим читателям.
            Читать дальше →
          • Анонимизация всего траффика через VPN + TOR/I2P. Собираем миддлбокс с нуля

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



              Это поможет не думать о бесконечных настройках прокси и onion, перестать бояться на тему «а не сливает ли торрент клиент мой реальный IP адрес, так как не полностью поддерживает прокси?» и, наконец, быть застрахованным от законодательного запрета TOR-а в России.

              Когда я говорю «TOR», я подразумеваю «TOR и I2P». По схожей методике сюда можно подключить любой даркнет.

              Статья — «чисто конкретная». Теория уже неплохо изложена в статье Pandoshabrahabr.ru/post/204266. В данном тексте будет дана детальная инструкция «как сделать, чтобы работало».

              Постановка задачи


              1. Мой компьютер должен по нажатию одной кнопки переходить в режим «весь трафик — не русский».

              2. По нажатию второй кнопки он должен переходить в режим «весь траффик идет через TOR»

              3. Третья кнопка — для I2P.

              4. Входная TOR-нода должна находиться за рубежом.

              5. Все это должно работать под linux, windows, android. Заранее: с OS X и iPhone тоже все в порядке, просто у меня их нету, так что протестить не смогу.
              Далее
            • Айтишник на отдыхе: добавим немного астрономии?


                Стремительно приближается лето и сопутствующие ему выезды на природу. Посиделки затягиваются заполночь, и над головой появляются звезды. Но, как правило, зведное небо таинственно и непонятно — астрономию в школах не преподают толком, наверное, уже с конца 80-х, да и кто помнит, чему его учили в школе, если это не использовалось в жизни постоянно? А в небе хватает интересного, особенно если потратить чуть-чуть времени на астрономическое обеспечение выезда на природу.
                Читать дальше →
              • Google Play — работаем легально!

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



                  Сегодня, я хочу рассказать о том как сделать свое хобби по разработке Android-приложений пусть небольшим, но официальным бизнесом. О том, как легально получать деньги, заработанные на Google Play, о «страшном» валютном контроле и «таинственном» паспорте сделки.
                  Читать дальше →
                • Видеолекции по биоинформатике

                    В институте цитологии и генетики ежегодно проводит школу молодых ученых. На школу приглашаются ведущие ученые в области биоинформатики и системной биологии. Мы уже второй год записываем лекции и выкладываем их в публичный доступ.
                    Вот список лекций:
                    • +23
                    • 10,6k
                    • 5
                  • Учим старый-добрый CRTP новым трюкам

                    Иногда мы делаем вещи, ценность которых является весьма сомнительной. Это как раз тот самый случай.

                    Код лучше тысячи слов


                    Не буду тянуть кота за хвост, а перейду сразу к делу. Обычно мы используем CRTP примерно так:
                    template<typename type, typename tag>
                    struct Base
                    {};
                     
                    template<typename type, typename tag>
                    void f(const Base<type, tag>&)
                    {}
                     
                    struct Foo : Base<Foo, void>
                    {};
                     
                    int main()
                    {
                      Foo foo;
                      f(foo); 
                    }
                    

                    Функции f() на самом деле всё равно, какой тэг у её аргумента, и она принимает объект любого типа, унаследованого от Base. Но не будет ли более удобным, если мы просто опустим не интересующий нас тэг? Зацените:
                    template<typename t>
                    struct base_tag { typedef decltype(get_tag((t*)42)) type; };
                     
                    template<typename type,
                             typename tag = typename base_tag<type>::type>
                    struct Base
                    {
                      friend tag get_tag(type*);  //never defined
                    };
                     
                    template<typename type>
                    void f(const Base<type>&)
                    {}
                     
                    struct Foo : Base<Foo, void>
                    {};
                     
                    int main()
                    {
                      Foo foo;
                      f(foo);
                    }
                    

                    Читать дальше →
                  • GCC Profile-guided optimization

                      Profile-guided optimization (далее PGO) — техника оптимизации программы компилятором, нацеленная на увеличение производительности выполнения программы. В отличии от традиционных способов оптимизации анализирующих исключительно исходные коды, PGO использует результаты измерений тестовых запусков оптимизируемой программы для генерации оптимального кода.
                      Читать дальше →
                    • Box2d: анатомия коллизий

                      • Перевод
                      • Tutorial
                      Что такое коллизии?

                      В Box2D принято считать, что друг с другом сталкиваются тела, однако на самом деле при расчете коллизий используются фикстуры (fixtures, переводы слова существуют, но я не уверен, есть ли среди них устоявшийся). Объекты могут сталкиваться разными способами, поэтому библиотека предоставляет большое количество уточняющей информации, которая может быть использована в игровой логике. Например, вы можете захотеть узнать следующее:

                      • Когда столкновение начинается и заканчивается
                      • Точку соприкосновения фикстур
                      • Вектор нормали к линии контакта фикстур
                      • Какая энергия была приложена и результат коллизии

                      Обычно столкновение происходит очень быстро, однако в этой статье мы попытаемся взять одну конкретную коллизию и замедлить ее, чтобы успеть рассмотреть детали происходящего и информацию, которую можно извлечь из события.
                      Читать дальше →
                    • Лагерная игра «Торренты»

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

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



                        За один лагерь обычно приходится провести с десяток различных игр, начиная от больших длинных игр на весь лагерь и оканчивая маленькими короткими игрушками на один отряд в ~20 человек. Именно такой игрой и является игра «Торренты».
                        Я понял, что даже многие мои знакомые вообще себе не представляют, как работает система торрентов. Поэтому я решил наглядно показать их работу на самом поверхностном уровне.
                        Читать дальше →