• learnopengl. Урок 1.2 — Создание окна

    • Translation
    • Tutorial
    В прошлом уроке мы разобрались с тем, что такое OpenGL. В этом уроке мы поговорим о причине необходимости использования GLFW, GLEW и CMake, а также рассмотрим как их использовать. А также освежим в памяти, разницу между статической и динамической линковкой.

    Заинтересовавшихся прошу под кат.
    Читать дальше →
  • Блокировки работают не так уж медленно

    • Translation
    • Tutorial
    Блокировки в общем и мьютексы, как их частная реализация, имеют давнюю историю неправильной оценки скорости их работы. Ещё в 1986-ом году в одной из Usenet-конференций Matthew Dillon написал: «Большинство людей ошибочно уяснили себе, что блокировки работают медленно». Сегодня, спустя многие годы, можно констатировать, что ничего не изменилось.

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

    Одна из причин заблуждений о скорости работы блокировок состоит в том, что многие программисты не отличают понятия «легковесный мьютекс» и «мьютекс, как объект ядра ОС». Всегда используйте легковесные мьютексы. К примеру, если вы программируете на С++ под Windows, то ваш выбор это критические секции.

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

    • Translation

    171 слово, которое должен понимать любой программист


    Лицензия MIT – самая популярная лицензия для программ с открытым кодом. Здесь приводится одно из её прочтений, с построчным разбором.

    Читаем лицензию


    Если вы разрабатываете программы с открытым кодом, и не читали эту лицензию подробно – а она состоит всего из 171 слова – вам нужно этим заняться. Особенно, если вы не занимаетесь лицензиями на ежедневной основе. Отметьте всё, что вам непонятно. А я повторю все эти слова, по порядку и по кусочкам, вместе с контекстом и комментариями. При этом важно представлять себе её целиком.
    Читать дальше →
  • Многопоточность в Rust

    • Translation
    Rust начинался как проект, решающий две трудные проблемы:

    • Как обеспечить безопасность (работы с памятью) в системном программировании?
    • Как сделать многопоточное программирование безболезненным?

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

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

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

    С точки зрения многопоточности это означает, что вы можете пользоваться различными парадигмами (передача сообщений, разделяемое состояние, lock-free-структуры данных, чистое функциональное программирование), и Rust позволит избежать наиболее распространённых подводных камней.

    Вот какие особенности у многопоточного программирования в Rust:
    Читать дальше →
  • Какие личностные качества нужны разработчику?

    • Translation

    Начинающий программист Ewa Mitulska-Wójcik описала в недавней публикации на Медиуме свои мысли о необходимых разработчикам личных качествах. Публикуем перевод этой заметки и небольшой комментарий в самом конце.


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



    Коммуникабельность


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


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


    1. Делиться возникшими проблемами с другими ребятами в команде.
    2. Отчитываться о деталях прогресса в системе управления проектами, вроде Jira.
    3. Выражаться ёмко и конкретно, насколько возможно, когда этого требует ситуация.
    4. Уметь слушать и быстро реагировать
    5. Чётко объяснять все потребности, сомнения, риски и прогресс проекта в понятной остальным членам команды, менеджеру или клиенту форме.
    6. Объяснять технические проблемы так, чтобы вас понимали клиенты и члены команды, не связанные с технической частью.
    Читать дальше →
    • +10
    • 26.7k
    • 9
  • Программировать скучно, но…

      Оригинал: Bruno Marnette: Coding is boring, unless…


      Мне не удавалось, как разработчику, задерживаться на одной работе больше двух лет.


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


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


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


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


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


      Вот почему мы заранее предлагаем решение, создавая культуру, которая спасет нас (постучим по дереву!) и сделает так, чтобы никогда не становилось скучно.

      Читать дальше →
    • Математика для искусственных нейронных сетей для новичков, часть 1 — линейная регрессия

      Оглавление

      Часть 1 — линейная регрессия
      Часть 2 — градиентный спуск
      Часть 3 — градиентный спуск продолжение

      Введение


      Этим постом я начну цикл «Нейронные сети для новичков». Он посвящен искусственным нейронным сетям (внезапно). Целью цикла является объяснение данной математической модели. Часто после прочтения подобных статей у меня оставалось чувство недосказанности, недопонимания — НС по-прежнему оставались «черным ящиком» — в общих чертах известно, как они устроены, известно, что делают, известны входные и выходные данные. Но тем не менее полное, всестороннее понимание отсутствует. А современные библиотеки с очень приятными и удобными абстракциями только усиливают ощущение «черного ящика». Не могу сказать, что это однозначно плохо, но и разобраться в используемых инструментах тоже никогда не поздно. Поэтому моей первичной целью является подробное объяснение устройства нейронных сетей так, чтобы абсолютно ни у кого не осталось вопросов об их устройстве; так, чтобы НС не казались волшебством. Так как это не математический трактат, я ограничусь описанием нескольких методов простым языком (но не исключая формул, конечно же), предоставляя поясняющие иллюстрации и примеры.

      Цикл рассчитан на базовый ВУЗовский математический уровень читающего. Код будет написан на Python3.5 с numpy 1.11. Список остальных вспомогательных библиотек будет в конце каждого поста. Абсолютно все будет написано с нуля. В качестве подопытного выбрана база MNIST — это черно-белые, центрированные изображения рукописных цифр размером 28*28 пикселей. По-умолчанию, 60000 изображений отмечены для обучения, а 10000 для тестирования. В примерах я не буду изменять распределения по-умолчанию.
      Читать дальше →
    • Кого волнуют баги продукта, если он успешно продается


        Изображение сайта media.licdn.com

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

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

        Если обратиться к примеру самых успешных технологических стартапов мира (Uber, Airbnb, Snapchat, Pinterest и прочие), мы не увидим сложных программных решений. Зато очевидным преимуществом этих компаний является удачная бизнес-модель. Вкупе с активным продвижением, эти сервисы смогли стать одними из самых востребованных и дорогих стартапов мира. Но вряд ли они нанимали десятки инженеров, чтобы разработать сервис и подготовить его к запуску, сомневается Половетс.
        Читать дальше →
      • О некоторых горячих клавишах в PyCharm

          Хочу поделиться с вами горячими клавишами, которыми пользуюсь или к которым пытаюсь привыкнуть в своей повседневной работе. В современных средах их количество может просто зашкаливать, но постепенное добавление новых сочетаний в копилку, способно значительно повысить вашу продуктивноть. Приведенные сочетания относятся к редактированию, навигации, рефакторингу и справедливы только для раскладки Default for XWin (Linux).

          Читать дальше →
        • Чат на Go (часть 1)

          Начинаем разработку чата на Go. Со стеком технологий пока не определились, но для начала сделаем каркас на Go. Берем за основу стандартный пример и пробуем разобраться, что здесь к чему:


          https://github.com/golang-samples/websocket/tree/master/websocket-chat


          Структура


          Вводим 3 структуры Message, Client, Server, которые определяют сервер, клиента со стороны сервера и сообщение.


          Message


          Сообщение определено структурой:


          type Message struct {
              Author string `json:"author"`
              Body   string `json:"body"`
          }
          
          func (self *Message) String() string {
              return self.Author + " says " + self.Body
          }

          С сообщением все совсем просто… Так, что перейдем сразу к клиенту.

          Читать дальше →
          • +23
          • 31.7k
          • 7
        • Представление движений в 3D моделировании: интерполяция, аппроксимация и алгебры Ли

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

            Сколько существует разных способов представить обыкновенный поворот в трехмерном пространстве? Большинство людей, когда-либо занимавшихся 3D-графикой или 3D-моделированием, сходу назовут три основных широко распространенных варианта:

            • Матрица поворота 3x3;
            • Задание поворота через углы Эйлера;
            • Кватернионы.

            Люди с богатым опытом добавят сюда почему-то не пользующийся популярностью четвертый пункт:
            • Ось поворота и угол.

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

              UPD: 8 января 2017 статья переписана. теперь она понятнее и носит более общий характер, без углубления в одну из моделей понятия


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



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



                / фото Harry Li CC

                Нас в компании «ИТ-ГРАД» очень интересуют вопросы искусственного интеллекта. Мы уже затрагивали тему автопилотируемых автомобилей, а неделю назад публиковали материал, в котором рассказывали о новых достижениях ученых и разработчиков в сфере ИИ, а также об опасениях скептиков.

                Сегодня мы вновь коснемся этого вопроса и поговорим о том, что такое деревья поведения, как они используются в робототехнике и есть ли у них будущее.
                Читать дальше →
                • +17
                • 20.2k
                • 4
              • Agile API — возможно ли?

                • Translation
                Множество статей и книг посвящено тому, как правильно проектировать API, но едва ли кто-то затрагивал тему постоянно меняющихся (гибких) API. Динамично развивающаяся компания зачастую выпускает по несколько релизов в неделю, а иногда и в день. При этом для добавления новых функций необходимо постоянно вносить изменения в существующее API. В этой статье мы расскажем о том, как мы в Badoo решаем эту задачу, какие подходы и идеи мы используем в своей работе.

                Для начала я должен немного подробнее рассказать о Badoo, чтобы вы понимали, кто работает с нашим API и почему оно так часто меняется.

                Читать дальше →
              • Синтезатор речи «для роботов» с нуля

                image

                Давным-давно посетила меня идея создать синтезатор речи с «голосом робота», как, например, в песне Die Roboter группы Kraftwerk. Поиски информации по «голосу робота» привели к историческому факту, что подобное звучание синтетической речи характерно для вокодеров, которые используются для сжатия речи (2400 — 9600 бит/c). Голос человека, синтезированный вокодером, отдает металлическим звучанием и становится похожим на тот самый «голос робота». Музыкантам понравился данный эффект искажения речи, и они стали активно его использовать в своем творчестве.
                Подробнее про реализацию синтезатора речи.
              • Функторы (глава книги «Теория категорий для программистов»)

                • Translation
                • Tutorial

                Это седьмая статья из цикла «Теория категорий для программистов». Предыдущие статьи уже публиковались на Хабре:



                Функторы


                За понятием функтора стоит очень простая, но мощная идея (как бы заезжено это ни прозвучало). Просто теория категорий полна простых и мощных идей. Функтор есть отображение между категориями. Пусть даны две категории C и D, а функтор F отображает объекты из C в объекты из D — это функция над объектами. Если a — это объект из C, то будем обозначать его образ из D как F a (без скобок). Но ведь категория — это не только объекты, но еще и соединяющие их морфизмы. Функтор также отображает и морфизмы — это функция над морфизмами. Но морфизмы отображаются не как попало, а так, чтобы сохранять связи. А именно, если морфизм f из C связывает объект a с объектом b,


                f :: a -> b

                то образ f в D, F f, связывает образ a с образом b:


                F f :: F a -> F b

                (Надеемся, что такая смесь математических обозначений и синтаксиса Haskell понятна читателю. Мы не будем писать скобки, применяя функторы к объектам или морфизмам.)


                Читать дальше →
                • +33
                • 27.7k
                • 2
              • Пишем свой мессенджер P2P


                  На фоне обсуждения будущего интернет мессенджеров и прочтения статьи «Почему ваш любимый мессенджер должен умереть», решил поделиться своим опытом создания P2P приложения для общения независимо от сторонних серверов. Точнее — это просто заготовка, передающая одно сообщение от клиента серверу, дальнейшее расширение функционала зависит только от Вашей фантазии.
                  Читать дальше →
                • MQTT и Modbus: cравнение протоколов, используемых в шлюзах для IoT

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

                  image

                  Сегодня мы расскажем о паре взаимодополняющих протоколов, которые нашли применение в IoT. Первый – это Modbus. Он служит для организации связи между устройствами, расположенными недалеко друг от друга. Второй – MQTT. Он обладает гораздо более широкими возможностями, поддерживает работу в локальных сетях и в Интернете. С его помощью можно организовать обмен данными между «вещами» в глобальных масштабах.
                  Читать дальше →
                • Мысль — материальна: Алан Тьюринг как «универсальный вычислитель»

                    image
                    Источник: geektimes.ru

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

                    Его кругозор распространялся от квантовой теории и принципа относительности до психологии и неврологии. А в качестве способа познания и передачи своих знаний Тьюринг использовал аппарат математики и логики. Он находил решения, казалось бы, нерешаемых задач, но был сильнее всего увлечен идеей «Универсальной машины», способной вычислить всё, что в принципе вычислимо.
                    Читать дальше →
                  • Язык Go, микросервисы и DevOps – хорошая компания?

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

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



                    Интересную статью с обоснованием этого подхода мы нашли в блоге Agile Maverick, и ее перевод размещаем под катом.

                    Приятного чтения!

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