• «Магическая константа» 0x5f3759df

    • Перевод
    В этой статье мы поговорим о «магической» константе 0x5f3759df, лежащей в основе элегантного алгоритмического трюка для быстрого вычисления обратного квадратного корня.

    Вот полная реализация этого алгоритма:

    float FastInvSqrt(float x) {
      float xhalf = 0.5f * x;
      int i = *(int*)&x;  // представим биты float в виде целого числа
      i = 0x5f3759df - (i >> 1);  // какого черта здесь происходит ?
      x = *(float*)&i;
      x = x*(1.5f-(xhalf*x*x));
      return x;
    }

    Этот код вычисляет некоторое (достаточно неплохое) приближение для формулы

    image

    Сегодня данная реализация уже хорошо известна, и стала она такой после появления в коде игры Quake III Arena в 2005 году. Её создание когда-то приписывали Джону Кармаку, но выяснилось, что корни уходят намного дальше – к Ardent Computer, где в середине 80-ых её написал Грег Уолш. Конкретно та версия кода, которая показана выше (с забавными комментариями), действительно из кода Quake.
    В этой статье мы попробуем разобраться с данным хаком, математически вывести эту самую константу и попробовать обобщить данный метод для вычисления произвольных степеней от -1 до 1.

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

      Знакомьтесь, это обычный «литровый» пакет молока:

      image

      • Проверка на внимательность: там 900 грамм. Рядом несколько по 950. Но пакет может быть воспринят как литровый.
      • Проверка на знание физики. Рядом лежит похожий кефир. Объём измеряется в миллилитрах, масса — в граммах. Плотность кефира трагически выше плотности воды. То есть 900 грамм кефира 3,2% жирности — это примерно 874,5 миллилитров.

      Второй пациент:



      25 лет гарантии. Круто, правда? Есть одна проблема. Надо сохранять чек. Проверка, опять же, на знание физики. Чек у них печатается на обычной кассовой термоленте (я проверил на месте). У меня в офисе лежит много чеков. Мы их ксерокопируем, потому что через год-два они полностью выцветают. Самый старый чек, который видел коллега, держался 3 года в папке в архиве. UPD: смотрите самый низ топика, Икея ответила.

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

      Осторожно, трафик: под катом много находок с фотографиями.
      Читать дальше →
    • Git Rebase: руководство по использованию

      • Tutorial
      Rebase — один из двух способов объединить изменения, сделанные в одной ветке, с другой веткой. Начинающие и даже опытные пользователи git иногда испытывают нежелание пользоваться ей, так как не видят смысла осваивать еще один способ объединять изменения, когда уже и так прекрасно владеют операцией merge. В этой статье я бы хотел подробно разобрать теорию и практику использования rebase.

      Теория


      Итак, освежим теоретические знания о том, что же такое rebase. Для начала вкратце — у вас есть две ветки — master и feature, обе локальные, feature была создана от master в состоянии A и содержит в себе коммиты C, D и E. В ветку master после отделения от нее ветки feature был сделан 1 коммит B.


      Читать дальше →
    • Как писать отличные пулл-реквесты

      • Перевод
      С ростом компании, люди и проекты меняются. Для продолжения развития культуры, которую мы хотим иметь в GitHub, мы сочли полезным напомнить самим себе цели, которые преследуем в коммуникациях. Мы недавно представили эти гайдлайны, чтобы помочь самим себе быть лучше, когда мы взаимодействуем через пулл-реквесты.
      Читать дальше →
    • Собираем установочные пакеты из Qt проектов по-взрослому

        Методом проб и ошибок я изобрел очередной велосипед, о котором и собираюсь рассказать Вам ниже.Речь пойдет о сборке пакетов из проектов Qt для Debian и Rpm based систем, Windows из под Ubuntu/Debian. В принципе метод весьма прост, поэтому, думаю, что при небольших изменениях он подойдет и для rpb based дистрибтивов, а для Windows систем потребуется установка cygwin.Кроме того эта тема очень мало обсуждается в интернете, хотя я бы не назвал сборку кроссплатформенных приложений в инсталяционные пакеты простой задачей.Кому будет интересен данный материал:
        • в первую очередь начинающим разработчикам Qt, которые хотят распространять свои приложения в удобном для пользователей виде;
        • разработчикам, использующих другие языки программирования (при небольших изменениях можно получить.
        У меня есть уверенность в том, что все действия, описанные ниже, можно было бы сделать скриптом make, но и текущий вариант тоже неплох и имеет право на существование.Также, если Вы используете любой другой способ для автоматической сборки проектов, опишите его пожалуйста. Хотелось бы собрать в итоге как можно больше информации по этой теме.
        Читать дальше →
      • Шифрование SQLite базы данных в Qt

        • Tutorial
        Для шифрования в SQLite были найдены следующие возможные решения:

        • SEE — официальная реализация.
        • wxSQLite — c++ wxWidgets обертка для шифрования SQLite.
        • SQLCipher — использует в реализации openSSL.
        • SQLiteCrypt — модифицированная реализация API.
        • botansqlite3 — шифрующий кодек для SQLite3 использующий библиотеку botan.
        • SQLiteCrypto — java API для Android, использует AES-256 и SHA-256.
        • QtCipherSqlitePlugin — SQL плагин для Qt с поддержкой шифрования.

        Из рассмотренных решений SEE, SQLiteCrypt and SQLiteCrypto требуют приобретения лицензии. SQLCipher доступен в версии Community Edition, но требует libcrypto.

        Наиболее интересным решением из представленного списка, на мой взгляд, является QtCipherSqlitePlugin.
        Плагин шифрует «на лету» и полностью интегрирован в API Qt.
        хочу шифровать SQLite
      • Введение в CMake

        imageCMake — кроcсплатформенная утилита для автоматической сборки программы из исходного кода. При этом сама CMake непосредственно сборкой не занимается, а представляет из себя front-end. В качестве back-end`a могут выступать различные версии make и Ninja. Так же CMake позволяет создавать проекты для CodeBlocks, Eclipse, KDevelop3, MS VC++ и Xcode. Стоит отметить, что большинство проектов создаются не нативных, а всё с теми же back-end`ами.
        Читать дальше →
      • Облака — ещё дешевле 2. Ответ-продолжение

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

        Содержание



        Итак, допустим, что у нас есть образ и droplet на DigitalOcean.
        Читать дальше →
      • Игрок продолжает соревноваться с умершим отцом и не желает его побеждать, чтобы не стереть призрака

          Это довольно трогательная история, и мне кажется, ей самое место здесь. Потому что делать игры, это тоже очень важно. Итак, представьте: обычное игровое видео, размещенное на youtube. В комментариях обычное обсуждение и гвалт. Но среди них попадается комментарий от пользователя 00WARTHERAPY00, пишущего о том, что он продолжает играть в автосимулятор с покойным отцом.



          Привожу вольный перевод комментария:
          Ну, когда мне было 4 года, отец купил настоящий Xbox.
          Читать дальше →
        • TextMate средствами gedit



            Так вышло, что в офисе я работаю за Маком, а вот ноут — «17 MacBook Pro — не самый лучший, на мой взгляд, вариант в разрезе производительность/цена. Anyway, это тема другого разговора. Ноут под Ubuntu.
            А теперь вопрос: если кодить на Ruby/RoR — кто ваш лучший ТекстовыйПриятель? Все верно, Textmate — Великий Фетиш и Идол всех программистов на Ruby под Mac. Итак задача была предельно проста — найти инструмент под Linux, максимально приближенный к Textmate по тому объему функционала который я использую в работе.
            Читать дальше →
          • Многозадачность в ядре Linux: прерывания и tasklet’ы

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

              На этот раз я хочу подойти к вопросу планирования с другой стороны. А именно, теперь я постараюсь рассказать про планирование не потоков, а их “младших братьев”. Так как статья получилась довольно объемной, в последний момент я решила разбить ее на несколько частей:
              1. Многозадачность в ядре Linux: прерывания и tasklet’ы
              2. Многозадачность в ядре Linux: workqueue
              3. Protothread и кооперативная многозадачность

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

              Рассказывать я постараюсь подробно, описывая основное API и иногда углубляясь в особенности реализации, особо заостряя внимание на задаче планирования.
              Читать дальше →
            • Эмулятор компьютера с linux на JavaScript

                Никакой серверной части. Только JS: полноценный эмулятор компьютера с линуксом на борту.

                bellard.org/jslinux
                (внимание, только хром и FF4)

                Я долго с ним игрался — это не имитация, линукс ведёт себя как настоящий линукс — компилированные программы работают, ошибки в них вызывают segmentation fault, повреждение корневой файловой системы вызывает бурю возмущения в dmesg и т.д.
                Эмулятор PC на JS с линуксом на борту

                dd показывает при работе с памятью более чем приличную производительность — более 40 мб/с (не забываем, что это эмулятор, и что это JS в вашем браузере!).

                Я никогда не думал, что мы доживём до подобного.

                … А теперь начинается оргия:

                * С использованием локального хранилища мы можем организовать диски (каждый key-value соответствует одному сектору).
                * С использованием web-socket мы можем создать паравиртуализированный драйвер сети с выходом на железный машрутизатор и получить нормальную сеть.
                * С использованием существующих технологий (NUMA, DRBD, corosync) можно организовать вычислительный кластер из браузеров.

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

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

                Никто не мешает создать паравиртуализированный драйвер видео с помощью canvas, у вас есть webGL, для которого можно написать свой вариант cuda и получить довольно мощную акселерацию вычислений…

                Ну и финал — запуск хрома внутри эмулируемой виртуальной машины.

                Итак, эмуляция дошла до браузеров…
              • Как удалить bucket с 400 миллионами файлов на Amazon S3

                  Допустим, у вас в бакете скопилось несколько сотен миллионов файлов (всякое бывает) и вы решили их удалить. Удалить бакет без удаления содержимого нельзя. Удаление самих файлов происходит примерно по 1000 за 2 секунды. Несложно посчитать, что 400 миллионов файлов можно удалить за 9 дней работы браузера без выключения, да еще и заплатить придется за каждую операцию (DELETE хоть и бесплатный, но LIST стоит денег).

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

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

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



                  Осторожно: объемы гифок под катом становятся просто нечеловеческими!
                  Читать дальше →
                • Про создание платформера на Unity. Часть вторая, звездная

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

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

                  И да, гифок там еще больше, чем в прошлый раз.



                  Читать дальше →
                • Про создание платформера на Unity. Часть первая, характерная

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

                  Все мы здесь любим качественные пошаговые руководства для начинающих, чего уж греха таить. По платформерам на Unity руководств много, а вот качественных не то что бы и очень. Сегодня мы попробуем добавить в копилку хороших уроков еще один. А создавать мы будем персонажа для 2D-платформера, ни больше, ни меньше.

                  Присоединяйтесь, учитесь, но помните: под катом очень много гифок.

                  Читать дальше →
                • По следам публикации в Google Play/App Store/ Steam Greenlight



                    Началось всё с желания делать свои игры вместо того, чтобы делать чужие.
                    Полгода назад я (программист) и мой товарищ (художник) уволились с работы и решили начать делать проект мечты — раллийный симулятор.
                    Этот проект мы задумывали очень давно, но не хватало опыта и знаний, чтобы начать и закончить.
                    За несколько последних лет мы оба набрались опыта и созрели для того, чтобы наконец сделать этот проект.
                    Но за те 10 лет, что мы пробовали свои силы, наши наработки полностью устарели. Кодовая база оказалась сложно портируемой на мобильные устройства. Контент не соответствовал современным требованиям.
                    Пару месяцев мы ковыряли то, что у нас уже было в надежде понять, что же делать…
                    И пришли к выводу:
                    Надо прощупать почву

                    Нам надо было понять, каким образом ведётся разработка кроссплатформенного движка, способного адекватно работать как на ПК, так и на мобильных ОС. Как публикуется игра? Как ведут себя отдельные площадки и на каких условиях работают?
                    Нам нельзя на проекте мечты совершать детские ошибки. Проект должен разрабатываться и публиковаться с чётким пониманием: как, что и для чего делается.
                    И для этого мы взялись реализовать тестовый проект. Небольшую казуальную игру.
                    Эта статья о том, как мы публиковались на Google Play, как провалили публикацию на Greenlight и какие сюрпризы нас ждали в AppStore.
                    Читать дальше →
                  • Создание игры на ваших глазах — часть 7: 2D-анимации в Unity («как во флэше»)

                    • Tutorial
                    В этой статье поговорим о 2D анимациях в Unity. Я расскажу о своем опыте работы с родными анимациями в юнити, о том, насколько тайм-лайны похожи на флэшевские, об управлении анимациями, event'ах, вложенности, и о том, как художник справляется с анимированием.

                    Для начала, немного теории.

                    В Unity есть две сущности:

                    1. Анимация (то, что отображается в окно «Animation»)
                    2. Mechanim дерево анимаций (то, что отображается в окне «Animator»).



                    Ниже я немного расскажу, что это такое и как нам может приходиться (или не пригодиться).
                    Читать дальше →
                  • Создание игры на ваших глазах — часть 6: Поговорим о пиаре инди игр

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

                      Напомню, что мы делаем стратегию/тайкун с прицелом на ПК (Steam) с премиум монетизацией (никакого фритуплея). Следовательно, в этом ключе я и буду рассказывать.

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

                      По поводу “когда начинать пиариться” там же есть цифра “за пару месяцев до релиза” для мобильного проекта и до полугода для ПК. Это связано с тем, что на всем протяжении вам надо поддерживать интерес потенциального покупателя к вашей игре. И продолжительность этой заинтересованности разная для разных платформ.
                      Читать дальше →
                    • Создание игры на ваших глазах — часть 5: Промежуточный итог (прототип)

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



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

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