• Выбираем хранилище данных для Prometheus: Thanos vs VictoriaMetrics

      Всем привет. Ниже представлена расшифровка доклада с Big Monitoring Meetup 4.


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


      В докладе будет сравнение Thanos и VictoriaMetrics — проектов для долгосрочного хранения метрик Prometheus.

      Читать дальше →
      • +11
      • 7,6k
      • 9
    • Курс MIT «Безопасность компьютерных систем». Лекция 2: «Контроль хакерских атак», часть 1

      • Перевод
      • Tutorial

      Массачусетский Технологический институт. Курс лекций #6.858. «Безопасность компьютерных систем». Николай Зельдович, Джеймс Микенс. 2014 год


      Computer Systems Security — это курс о разработке и внедрении защищенных компьютерных систем. Лекции охватывают модели угроз, атаки, которые ставят под угрозу безопасность, и методы обеспечения безопасности на основе последних научных работ. Темы включают в себя безопасность операционной системы (ОС), возможности, управление потоками информации, языковую безопасность, сетевые протоколы, аппаратную защиту и безопасность в веб-приложениях.

      Лекция 1: «Вступление: модели угроз» Часть 1 / Часть 2 / Часть 3
      Лекция 2: «Контроль хакерских атак» Часть 1 / Часть 2 / Часть 3
      Читать дальше →
      • +13
      • 17,9k
      • 1
    • Курс MIT «Безопасность компьютерных систем». Лекция 13: «Сетевые протоколы», часть 2

      • Перевод
      • Tutorial

      Массачусетский Технологический институт. Курс лекций #6.858. «Безопасность компьютерных систем». Николай Зельдович, Джеймс Микенс. 2014 год


      Computer Systems Security — это курс о разработке и внедрении защищенных компьютерных систем. Лекции охватывают модели угроз, атаки, которые ставят под угрозу безопасность, и методы обеспечения безопасности на основе последних научных работ. Темы включают в себя безопасность операционной системы (ОС), возможности, управление потоками информации, языковую безопасность, сетевые протоколы, аппаратную защиту и безопасность в веб-приложениях.

      Лекция 1: «Вступление: модели угроз» Часть 1 / Часть 2 / Часть 3
      Лекция 2: «Контроль хакерских атак» Часть 1 / Часть 2 / Часть 3
      Лекция 3: «Переполнение буфера: эксплойты и защита» Часть 1 / Часть 2 / Часть 3
      Лекция 4: «Разделение привилегий» Часть 1 / Часть 2 / Часть 3
      Лекция 5: «Откуда берутся ошибки систем безопасности» Часть 1 / Часть 2
      Лекция 6: «Возможности» Часть 1 / Часть 2 / Часть 3
      Лекция 7: «Песочница Native Client» Часть 1 / Часть 2 / Часть 3
      Лекция 8: «Модель сетевой безопасности» Часть 1 / Часть 2 / Часть 3
      Лекция 9: «Безопасность Web-приложений» Часть 1 / Часть 2 / Часть 3
      Лекция 10: «Символьное выполнение» Часть 1 / Часть 2 / Часть 3
      Лекция 11: «Язык программирования Ur/Web» Часть 1 / Часть 2 / Часть 3
      Лекция 12: «Сетевая безопасность» Часть 1 / Часть 2 / Часть 3
      Лекция 13: «Сетевые протоколы» Часть 1 / Часть 2 / Часть 3
      Читать дальше →
    • История соревнований ИИ по Starcraft

      • Перевод
      image

      Введение


      Начиная с первого Starcraft AI Competition, проведённого в 2010 году, тема искусственного интеллекта в стратегиях реального времени (RTS) становится всё более популярной. Участники таких соревнований представляют своих ИИ-ботов Starcraft, которые сражаются в стандартной версии Starcraft: Broodwar. Эти соревнования по играм RTS, вдохновлённые предыдущими соревнованиями, такими как Open RTS (ORTS), стали примерами демонстрации текущего состояния искусственного интеллекта в стратегических играх реального времени. ИИ-боты Starcraft управляются с помощью интерфейса Brood War Application Programming Interface (BWAPI), разработанного в 2009 году в качестве способа взаимодействия и управления Starcraft: Broodwar с помощью языка C++. С ростом функционала и популярности BWAPI начали появляться первые ИИ-боты (агенты) для Starcraft и появилась возможность организации настоящего соревнования ИИ по Starcraft. Мы подробно расскажем о каждом крупном соревновании ИИ по Starcraft, а также о развитии UAlbertaBot, нашего бота, участвующего в этих соревнованиях. Следует учесть, что я был организатором соревнований AIIDE с 2011 года и, естественно, имею больше информации об этих соревнованиях. Каждое соревнование будет рассматриваться в хронологическом порядке проведения, с указанием полных результатов и ссылок на скачивание исходных кодов ботов и файлов ответов соревнований AIIDE и CIG.
      Читать дальше →
    • Масштабирование ClickHouse, управление миграциями и отправка запросов из PHP в кластер

      • Tutorial

      В предыдущей статье мы поделились своим опытом внедрения и использования СУБД ClickHouse в компании СМИ2. В текущей статье мы затронем вопросы масштабирования, которые возникают с увеличением объема анализируемых данных и ростом нагрузки, когда данные уже не могут храниться и обрабатываться в рамках одного физического сервера. Также мы расскажем о разработанном нами инструменте для миграции DDL-запросов в ClickHouse-кластер.


      Два шарда по две реплики


      Читать дальше →
    • Как я Дота-лигу открывал. Часть 2


        Начало здесь: Как я Дота-лигу открывал. Часть 1

        Конец 2007-го, снова зима, и снова время развиваться. Мы успешно перенесли лигу из умирающего Battle.Net в восходящий Good Game Client (позднее — Garena). Новые игроки приходят каждый день, лига растёт, всех радует отсутствие читеров, отличный пинг и лёгкий процесс начала игры. Игроки зазывали своих друзей в эту платформу из Battle.net, из локальных сетей и пиратских серверов — все шли в Garena. Холодный декабрь побуждал людей оставаться дома и играть. Постоянный онлайн игроков Warcraft на этой платформе в СНГ-секторе вырос с 1000 до 10 000 игроков. Очень скоро, Garena стояла в каждом компьютерном клубе, а онлайн-турниры проводились только на ней.
        Всё отлично, и у нас был единственный и самый крутой бот на этой планете платформе…
        Читать дальше →
      • Введение в модулярную арифметику

          В обычной жизни мы обычно пользуемся позиционной системой счисления. В позиционной системе счисления значение каждого числового знака (цифры) в записи числа зависит от его позиции (разряда) [1]. Однако существуют и так называемые «непозиционные системы счисления», к одной из которых относится «система остаточных классов» (СОК) (или в оригинале Residue Number System (RNS)), являющаяся основой модулярной арифметики. Модулярная арифметика базируется на «Китайской теореме об остатках» [2], которая для нашего случая звучит следующим образом:
          Для любой системы взаимно простых чисел p1, … pn, любое число X из диапазона [0; M), где M = p1*p2*…*pn взаимооднозначно представимо в виде вектора (a1, a2, …, an), где ai = X%pi (здесь и далее «%» — операция взятия остатка от целочисленного деления X на pi).
          p1, … pn – модули системы
          a1, a2, …, an – остатки (вычеты) числа по заданной системе модулей

          Читать дальше →
        • Программное обеспечение для умного дома

          Всем добрый день. В качестве хобби написал программу, которую можно использовать как часть системы “умный дом”. Чтобы сразу заинтересовать читателя, продемонстрирую некоторую малую часть сценариев использования ПО:

          image
          Просмотр
        • Краш-курс по интерфейсам в Go

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

          В этой статье вы узнаете:

          • в чем отличие от интерфейсов в Java
          • важные и неочевидные последствия этих отличий
          • как устроены интерфейсы под капотом
          • вспомним про пустой интерфейс (interface{})
          • затронем сакральную тему про дженерики
          • разберемся, кто и зачем должен создавать интерфейс
          • и постараемся научиться не абьюзить интерфейсы и начать жить

          Header
          (artwork by Svitlana Agudova)
          Читать дальше →
        • О функциональности Go

            Насколько объектно Go ориентирован многократно и эмоционально обсуждалось. Попробуем теперь оценить насколько он функционален. Заметим сразу, оптимизацию хвостовой рекурсии компилятор не делает. Почему бы? «Это не нужно в языке с циклами. Когда программист пишет рекурсивный код, он хочет представлять стек вызовов или он пишет цикл.» — замечает в переписке Russ Cox. В языке зато есть полноценные lambda, closure, рекурсивные типы и ряд особенностей. Попробуем их применить функциональным манером. Примеры покажутся синтетическими оттого, что во первых написаны немедленно исполняемыми в песочнице и написаны на процедурном все же языке во вторых. Предполагается знакомство как с Go так и с функциональным программированием, разъяснений мало но код комментирован.
            Читать дальше →
            • +16
            • 13,9k
            • 6
          • Публичные собеседования на позицию веб-разработчика в прямом эфире

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

              Мы в Хекслете делаем не только практические курсы по программированию, но и готовим людей к карьере программиста. Например, недавно запустили полную программу обучения «Профессия PHP-программист», куда входят основы программирования, частично книга СИКП, веб, базы данных, деплой, управление конфигурацией и многое другое, что мы считаем важным для настоящего разработчика. По завершению учебной программы мы помогаем людям получить первый опыт и устроиться на работу.

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

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

              Собеседование 1: Денис Кривощеков


              Занимается фрилансом, изучает Ruby on Rails.

              Читать дальше →
            • Изучаем net/context в Go

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


              Читать дальше →
              • +20
              • 47,8k
              • 8
            • Возможности PostgreSQL, которых нет в MySQL, и наоборот



              Многие боятся переходить с «мускуля» на «посгрес» из-за того, что лишь смутно понимают, что это даст. Некоторых останавливает мысль, что наверно Postgres — это слишком сложная база и требует обучения. А также, что возможно чего-то придется лишиться в связи с переходом. Попробую немного прояснить ситуацию.
              Читать дальше →
            • Про модель, логику, ООП, разработку и остальное

                Часто ли вы задумываетесь – почему что-то сделано так или иначе? Почему у вас микросервисы или монолит, двухзвенка или трехзвенка? Зачем вам многослойная архитектура и сколько у вас вообще слоев? Что такое бизнес-логика, логика приложения, презентационная логика и почему все так разделено? Посмотрите на свое приложение – как оно вообще спроектировано? Что в нем и где находится, почему это сделано именно так?
                Потому что так написано в книжках или так говорят авторитетные личности? Какие ВАШИ проблемы решает тот или иной подход/паттерн?
                Даже то, что на первый взгляд кажется очевидным, порой бывает очень сложно объяснить. А иногда, в попытке объяснения, приходит понимание того, что очевидные мысли были и вовсе ошибочны.
                Давайте попробуем взять какой-нибудь пример и изучить на нем эти вопросы со всех сторон.
                Читать дальше →
              • Понимание ООП в JavaScript [Часть 1]

                • Перевод
                • Tutorial
                — Прототипное наследование — это прекрасно
                JavaScript — это объектно-ориентированный (ОО) язык, уходящий корнями в язык Self, несмотря на то, что внешне он выглядит как Java. Это обстоятельство делает язык действительно мощным благодаря некоторым приятным особенностям.

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

                К счастью, в ECMAScript 5 появилось множество вещей, которые позволили поставить язык на правильный путь (некоторые из них раскрыты в этой статье). Также будет рассказано о недостатках дизайна JavaScript и будет произведено небольшое сравнение с классической моделью прототипного ОО (включая его достоинства и недостатки).
                Читать дальше →
              • JavaScript — шаблоны наследования

                • Перевод
                Примечание переводчика: Тема наследования в JavaScript является одной из самых тяжелых для новичков. С добавлением нового синтаксиса с ключевым словом class, понимание наследования явно не стало проще, хотя кардинально нового ничего не появилось. В данной статье не затрагиваются нюансы реализации прототипного наследования в JavaScript, поэтому если у читателя возникли вопросы, то рекомендую прочитать следующие статьи: Основы и заблуждения насчет JavaScript и Понимание ООП в JavaScript [Часть 1]

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

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

                  Объекты, классы, конструкторы

                  ECMAScript, будучи высоко-абстрактным объектно-ориентированным языком программирования, оперирует объектами. Существуют также и примитивы, но и они, когда требуется, также преобразуются в объекты. Объект — это коллекция свойств, имеющая также связанный с ней объект-прототип. Прототипом является либо также объект, или же значение null.
                  В JavaScript нет привычных классов, но есть функции-конструкторы, порождающие объекты по определенным алгоритмам (см. Оператор new).

                  Прототипное делегирующее наследование


                  Классическое наследование очень похоже на то, как люди наследуют гены своих предков. Есть какие-то базовые особенности: люди могут ходить, говорить… И есть характерные черты для для каждого человека. Люди не в состоянии изменить себя — свой класс (но могут поменять собственные свойства) и бабушки, дедушки, мамы и папы не могут динамически повлиять на гены детей и внуков. Все очень по земному.

                  Теперь представим другую планету, на которой не такое как на Земле генное наследование. Там обитают мутанты с «телепатическим наследованием», которые способны изменять гены своих потомков.
                  Разберем пример. Отец наследует гены от Дедушки, а Сын наследует гены от Отца, который наследует от Дедушки. Каждый мутант может свободно мутировать, и может менять гены своих потомков. Например у Дедушки был зеленый цвет кожи, Отец цвет унаследовал, Сын тоже унаследовал цвет. И вдруг Дед решил: «надоело мне ходить зеленым — хочу стать сними», смутировал (изменил прототип своего класса) и «телепатически» распространил эту мутацию Отцу и Сыну, вобщем посинели все. Тут Отец подумал: «Дед на старости лет совсем двинулся» и поменял свой цвет в генах обратно на зеленый(изменил прототип своего класса), и распространил «телепатически» свой цвет сыну. Отец и Сын зеленые, Дед синий. Теперь как бы дед ни старался Отец и сын цвет не поменяют, т.к сейчас Отец в своем прототипе прописал цвет, а Сын в первую очередь унаследует от Прототипа Отца. Теперь Сын решает: «Поменяю ка я свой цвет на черный, а моё потомство пусть наследует цвет от Отца» и прописал собственное свойство, которое не влияет на потомство. И так далее.
                  Читать дальше →
                • 36 млн запросов в час, 10000+ постоянно работающих клиентов, на одном сервере, nginx+mysql

                  Сложилась ситуация, что участвую в проекте, который работает с достаточно большой нагрузкой. Как уже написал — 36 млн запросов в час. Я много чего прочитал и перепробовал за последний месяц, настраивая сервер; хотелось бы просто сжато и компактно выдать тезисно то, что работает хорошо в такой конфигурации.

                  Первое, что я заметил — множество советов как все настроить под большую нагрузку. Читайте их внимательно, обычно в тексте найдете, что речь про «высокую нагрузку» в 15-20 тысяч клиентов в сутки. У нас клиентов примерно миллион, активных, ежедневных.

                  У нас нет денег и мы все делаем за свой счет, поэтому экономим. Итог — весь миллион клиентов обслуживается на одном сервере, вот на таком — EX-60 на hetzner.
                  Читать дальше →
                • Windows Azure Media Services vs. Amazon Elastic Transcoder. Часть 2: Amazon Elastic Transcoder

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

                  Напомню, что в прошлом году я поставил задачу сравнить сервисы для обработки видео облачных провайдеров от Microsoft и Amazon. Что ж сегодня пришло время описать работу с Amazon Elastic Transcoder. Итак, поехали!

                  Несмотря на то, что с версией 2.0, SDK для работы с сервисами Amazon на платформе .NET, перешел в General Availability состояние, в нем все же есть несколько досадных багов. О них я расскажу, когда мы столкнемся с реализацией соответствующего функционала. Чтобы обойти их нам понадобится сделать несколько операций через UI или утилиты командной строки. Но обо всем по порядку.

                  Amazon Web Services


                  Итак, первое, что нам необходимо сделать прежде чем использовать Amazon Elastic Transcoder, это создать аккаунт хранилища. В нем будут храниться загруженные для конвертации файлы. По аналогии с Windows Azure, где файлы хранятся в блобах, в Amazon файлы хранятся в корзинах (bucket). Нам необходимо создать одну.
                  Для того чтобы создать корзину заходим в Amazon Management Console и переходим в раздел Services -> Storage & Content Delivery -> S3.



                  Читать дальше →
                • Кластеризация веб приложений на хостинге Amazon Web Services

                  Тема высоконагруженных приложений у всех на слуху. Тоже решил вставить свои 5 копеек и поделиться опытом создания высоконагруженного приложения на инфраструктуре AWS.


                  Сначала, буду банален и повторю всем известные истины. Есть 2 пути масштабирования приложения:
                  1) вертикальное масштабирование — это увеличение производительности каждого компонента системы (процессор, оперативная память, прочие компоненты);
                  2) горизонтальное, когда соединяют несколько элементов воедино, а система в целом состоит из множества вычислительных узлов, решающих общую задачу, тем самым увеличивая общую надежность и доступность системы. А увеличение производительности достигается добавлением в систему дополнительных узлов.

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

                  Недавно мы в очередной раз постигали все прелести горизонтального масштабирования на практике: строили высоконадежный социальный сервис для болельщиков американского футбола, выдерживающий пиковую нагрузку в 200 000 запросов в минуту. Поэтому хочу рассказать о нашем опыте создания высокомасштабируемой системы на инфраструктуре Amazon Web Services.

                  Обычно, архитектура веб приложения выглядит следующим образом:

                  Рис. 1. Типичная архитектура веб приложения

                  • первым пользователя “встречает” веб-сервер, на его плечи возлагаются задачи отдачи статических ресурсов и передачи запросов приложению;
                  • далее эстафета передается приложению, где протекает вся бизнес-логика и взаимодействие с базой данных.


                  Чаще всего узкими местами системы являются код приложения и база данных, следовательно, стоит предусмотреть возможности их распараллеливания. Мы использовали:
                  • development language and core framework — java 7 and rest jersey
                  • application server — tomcat 7
                  • database — MongoDB (NoSQL)
                  • cache system — memcached


                  Как это было, или через тернии к high load

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