• Правильные способы исключения файлов в Git

      Иногда встречаю в файле .gitignore то, чего там быть никак не должно. Например, папка .idea, в которой лежат конфиги известных IDE от JetBrains. Это часть вашего рабочего окружения и она никаким боком не относится к проекту и репозиторию. Если над проектом работает несколько человек и каждый из них добавит конфиги своего окружения в .gitignore, то он превратится в нечитаемую помойку.

      В этом топике я расскажу о правильных способах исключения файлов и о том когда какой способ использовать.
      Читать дальше →
    • Введение в OpenSceneGraph

      OpenSceneGraph — это кроссплатформенная библиотека с открытыми исходниками для разработки высокопроизводительных 3D-приложений. Это не игровой движок, связывающий пользователя по рукам и ногам заложенными в него ограничениями, а именно библиотека — набор полезных модулей, которые отлично работают как поодиночке, так и в сборке.



      Ядро OpenSceneGraph, собственно граф сцены, — довольно тонкая обёртка вокруг OpenGL, позволяющая задавать иерархию объектов и выполнять над ними любые желаемые преобразования:
      • изменять характеристики узлов (двигать объекты в пространстве, назначать им материалы, свойства освещённости, шейдеры и прочие режимы и атрибуты OpenGL);
      • перестраивать дерево любым желаемым образом (создавать и удалять объекты, перелинковывать их к другим узлам графа);
      • делать обход графа, выполняя для каждого их узлов какие-либо действия;
      • ну и конечно рендерить сцену при помощи OpenGL.

      Читать дальше →
    • Перенаправление функций в разделяемых ELF-библиотеках

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

        Кстати, нетерпеливые могут все скачать и попробовать прямо сейчас.

        Осторожно, много текста!
      • Android vs iOS на примере одной игры

          Всем привет! Меня зовут Павел и я разработчик инди.
          Я часто читаю разного рода аналитику, там куча графиков про то, сколько сейчас активируется андроид устройств, сколько iOS, как растут рынки и падают доли. К сожалению, проценты и абстрактные цифры редко позволяют точно понять что же на самом деле происходит внутри.
          Скорее всего, я не один сталкиваюсь с такой проблемой, поэтому решил поделиться «живой» статистикой одной моей игры, ставшей довольно популярной на iOS и Android. Сразу оговорюсь, что речь о игре исключительно на русском языке, соответственно играют в неё только русскоязычные пользователи. Для тех, у кого таргет на Европу, США и т.п. пост может быть малоинформативен.
          Читать дальше →
        • Уроки написания утилитки на $1 000 000



            Осенью 2008 года мы с приятелем потратили две-три недели свободного от основной работы времени, чтобы написать маленькую утилитку для бэкапа баз данных (MS SQL Server и потом MySQL). Сегодня она приносит нам около $230 000 в год и можно с уверенностью говорить, что суммарно мы заработаем на ней больше $1 000 000.

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

            Привет всем!

            Чуть менее года назад я включился в процесс строительства устройства, которое находится где-то между авиасимулятором и профессиональным авиатренажером. Это был не первый опыт — в 2009 году мы уже решали такую задачу, поэтому приступая к реализации весьма амбициозной мечты мы постарались не наступить на все возможные грабли. Тут я опишу предысторию с «первым блином», и как она повлияла на второй. Если будет интересно, напишу подробно про наш второй тренажер.

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

            Осторожно, много картинок, вызывающих нервный тик у любителей авиации и инженеров.
            Итак…

            Читать дальше →
          • Удачная модель ветвления для Git

            • Translation
            Перевод статьи Vincent Driessen: A successful Git branching model

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



            В качестве инструмента управления версиями всего исходного кода она использует Git.

            Читать дальше →
          • Знай сложности алгоритмов

            • Translation
            Эта статья рассказывает о времени выполнения и о расходе памяти большинства алгоритмов используемых в информатике. В прошлом, когда я готовился к прохождению собеседования я потратил много времени исследуя интернет для поиска информации о лучшем, среднем и худшем случае работы алгоритмов поиска и сортировки, чтобы заданный вопрос на собеседовании не поставил меня в тупик. За последние несколько лет я проходил интервью в нескольких стартапах из Силиконовой долины, а также в некоторых крупных компаниях таких как Yahoo, eBay, LinkedIn и Google и каждый раз, когда я готовился к интервью, я подумал: «Почему никто не создал хорошую шпаргалку по асимптотической сложности алгоритмов? ». Чтобы сохранить ваше время я создал такую шпаргалку. Наслаждайтесь!
            Читать дальше →
          • О цветовых пространствах

              Я по образованию программист, но по работе мне пришлось столкнуться с обработкой изображений. И тут для меня открылся удивительный и неизведанный мир цветовых пространств. Не думаю, что дизайнеры и фотографы узнают для себя что-то новое, но, возможно, кому-нибудь это знание окажется, как минимум полезно, а в лучшем случае интересно.
              Читать дальше →
            • Бесконечные неповторяющиеся текстуры с помощью мозаики Вана



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

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

                Как же быть? Есть один трюк — непериодические мозаики. Они лишены проблемы повторяемости и достаточно просты в реализации. Одну из таких мозаик придумал китайский математик Ван Хао в 1961 году. Элементы этой мозаики можно представить в виде прямоугольников с разноцветными гранями. Но чтобы понять принцип её работы, надо сначала разобраться в классическом методе заполнения площадей текстурами.
                А классический метод таков...
              • Грабли 2: Виртуальное наследование

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

                  Все основано на реальных событиях, но примеры были максимально упрощены, чтобы в них осталась лишь суть проблемы.
                  Читать дальше →
                • Spatial hashing для самых маленьких



                    Spatial hashing это простая техника, которая используется в базах данных, физических и графических движках, симуляциях частиц и вообще везде, где нужно быстро что-то найти. Если в кратце, то суть в том, что мы разбиваем пространство с объектами на ячейки и складываем в них объекты. Затем вместо поиска по значению очень быстро ищем по хэшу.

                    Предположим, что у вас есть несколько объектов и вам нужно узнать нет ли между ними столкновений. Простейшим решением будет посчитать расстояние от каждого объекта до всех остальных объектов. Однако, при таком подходе количество необходимых вычислений растёт слишком быстро. Если на десятке объектов приходится делать сотню проверок, то на сотне объектов выходит уже десяток тысяч проверок. Это и есть печально известная квадратичная сложность алгоритма.
                    Можно улучшить ситуацию, если...
                  • Десять возможностей C++11, которые должен использовать каждый C++ разработчик

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

                      Сегодня в программе:
                      • auto
                      • nullptr
                      • range-based циклы
                      • override и final
                      • строго-типизированный enum
                      • интеллектуальные указатели
                      • лямбды
                      • non-member begin() и end()
                      • static_assert и классы свойств
                      • семантика перемещения
                      Читать дальше →
                    • Одним махом 100 миллионов убивахом. Или lock-free распределитель памяти

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


                        Один из алгоритмов, который я реализовывал, имел интересные особенности при работе с памятью:
                        • Могло выделяться огромное количество, до десятков и сотен миллионов небольших объектов одного типа.
                        • Объекты представляли собой POD- типы.
                          POD
                          A Plain Old Data Structure in C++ is an aggregate class that contains only PODS as members, has no user-defined destructor, no user-defined copy assignment operator, and no nonstatic members of pointer-to-member type.
                        • Заранее было неизвестно какое количество объектов понадобится, могло так случится, что потребуется сотня, а может и сто миллионов.
                        • Объекты никогда не удаляются по одному, в какой-то момент они становятся не нужны все сразу.
                        • Алгоритм хорошо распараллеливается, по этому выделением объектов занимается одновременно несколько потоков, по количеству ядер процессора(ов).

                        Использование в таких условиях стандартного new – delete приводит к очень большим потерям времени на удаление объектов. Если без отладчика удаление происходило хотя бы за несколько секунд, то в присутствии отладчика освобождение памяти замедляется примерно в 100(!) раз, и отладка проекта становится просто невозможной. Кроме того из-за большого количества выделенных объектов достаточно ощутимым становился перерасход памяти на внутренние данные распределителя памяти.
                        Для решения задачи выделения огромного количества объектов одного типа, и их пакетного удаления, был сделан lock-free контейнер MassAllocator. Код компилируется Visual Studio 2012. Полный код проекта выложен на github.
                        Читать дальше →
                      • Как хвост виляет собакой. Азбука пропаганды

                          Чем доступнее информация, тем больше её вокруг. Чем быстрее она распространяется, тем меньше остаётся времени на то, чтобы её проверить. Постепенно информационная среда превращается в некое подобие «белого шума». Всё труднее строить внутри себя новые информационные фильтры, чтобы отсеять лишнее: убрать в сторону лозунги, агитацию, пропаганду, а оставить только то, что на самом деле кроется за ними. А манипулировать нашими мыслями пытаются постоянно, и я говорю не о 25-ом кадре (он не работает), а о более земных вещах — приёмах пропаганды, которые так умело (а зачастую — очень топорно) используют политики, рекламщики и вообще, все, кому не лень. Об этих приёмах и пойдёт речь в статье.

                          Хвост виляет собакой. ("Wag the dog") — чтобы избежать большого скандала или «замять», оставить незамеченным какое-нибудь важное, но неприятное событие, часто используется простой, но хитрый и ловкий приём, который англоязычные политтехнологи называют «Wag the dog», а русскоязычные — «Хвост виляет собакой». Он заключается в том, чтобы вовремя поднять волну обсуждения вокруг вопроса второстепенной важности, на фоне которой другое, более важное событие или действие пройдёт незаметно.
                          Примеры таких вопросов: Отмена перехода на зимнее время, российское гражданство Депардье, поездка Путина или Саши Грей на Ладе Калине по России, полёты со стерхами и т.д.
                          Своё название этот приём получил в честь английского выражения tail wagging the dog, который, в свою очередь, появился из следующего народного пассажа:
                          — Почему собака виляет хвостом?
                          — Потому, что собака умнее, чем хвост. Если бы хвост был умнее, он вилял бы собакой.

                          Ещё 7 приёмов - под катом
                        • Российское 3D-ядро захабрено. Ответы на ваши вопросы


                            Николай Снытников – руководитель ЛЕДАС-части проекта RGK. Специалист в области параллельных вычислений и геометрического моделирования, кандидат физико-математических наук. Он внимательно ознакомился с дискуссией, развернувшейся в исходном топике о Российском 3D-ядре и постарался ответить на наиболее часто возникающие вопросы читателей Хабрахабр.

                            Были затронуты темы об отличии графических трехмерных движков от CAD ядер, о Linux и Qt, «велосипедах», и причем тут государство.
                            Читать дальше →
                          • Воскресный пост с задачками


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

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

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

                              Я старался, где возможно, разделить ответ и решение. Чтобы вы себе ненароком не испортили кайф от решения задачки.

                              PS. Некоторые из этих задач ОЧЕНЬ известные, но тем не менее, то количество раз, что они мне попадались, обязывает меня написать и их.

                              Погнали?

                              Читать дальше →
                            • OpenGL ES 2.0 обертка для Qt

                                Давным давно, когда я писал игру под адроид, нужно было мне разобраться с OpenGL ES 1.1. Вроде бы ничего сложного, 2D графика, нужно было просто рисовать PNG изображения, с возможностью масштабирования, поворота, добавления прозрачности. Тогда я потратил на это около недели, а может даже и больше, уже не помню. Было сложно, поскольку с OpenGL я никогда дела не имел. Сильно помог исходный код libgdx, в котором, кстати, все низкоуровневые OpenGL функции спрятаны от разработчика.
                                Времена меняются, на смену OpenGL ES 1.1 приходит версия 2.0, которая довольно сильно отличается. Приходится разбираться, что это за шейдеры, и почему без них никак. На это опять уходит несколько дней. Казалось бы, должно быть легко, ведь 2D, все просто. Например, если использовать QML, это делается вот так:
                                Image
                                {
                                    source: "brick.png"
                                    opacity: 0.8
                                    rotation: 90
                                }
                                

                                А если писать все на С++, то получается много-много строк кода, которые сложно понять, если не знаком с OpenGL. Я пытался найти какую-нибудь библиотеку, обертку над OpenGL, как libgdx, только для Qt, но безуспешно. Поэтому решил, после того, как у меня все заработает, я напишу небольшую обертку, которая прячет все OpenGL вызовы и позволяет удобно работать с 2D графикой.
                                Вот что у меня получилось
                                • +9
                                • 15.1k
                                • 5
                              • Экономическая симуляция как игра для программистов

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

                                  Наибольший интерес представляет тут то, что 1000 реальных игроков играющих по сети могут создать достаточно интересную среду. Пример этого я нашел в игре «Виртономика» (о которой вкратце расскажу). Ни какой идеальный симулятор розничных продаж не будет так интересен. А игроки делают ошибки или выбирают те или иные акценты при развитии. Отсюда поведение которое потребуется от автомата управляющим таким предприятием будет не банальным в рамках известных методов, и тут есть что изучать.

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

                                  Читать дальше →
                                • Схема разделения секретной визуальной информации

                                    Доброго времени суток, Хабрапользователи!

                                    Визуальная криптография [1] впервые была введена Мони Наором и Ади Шамиром в 1994 году [3]. Она используется для шифрования изображения или текста, представленного в виде изображения. Основная идея модели визуальной криптографии состоит в разбиении исходного изображения на несколько шифрованных («теневых» изображений, shadow images), каждое из которых не дает никакой информации об исходном изображении кроме, может быть, его размера (изображение – а-ля «белый шум»). При наложении шифрованных изображений друг на друга, можно получить исходное изображение. Таким образом, для декодирования не требуется специальных знаний, высокопроизводительных вычислений и даже компьютера (в случае, если распечатать теневые изображения на прозрачных пленках). В случае использования этого алгоритма в компьютерных системах, наложить все части изображения друг на друга можно используя логические операции AND, OR, XOR (или установив более высокую степень прозрачности в графическом редакторе). Данная технология обладает криптоустойчивостью за счет того, что при разделении исходного изображения на множество шифроизображений происходит случайным образом.

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