...

суббота, 16 марта 2019 г.

[Из песочницы] Китайский онлайн-ритейлер Gearbest оставил в открытом доступе базу данных с миллионами персональных данных покупателей

Комманда хакеров из VPNMentor обнаружила, что китайский гигант онлайн торговли Gearbest хранит данные покупателей в легкодоступных базах данных.

Ребята из VPNMentor обнаружили несколько незащищенных баз данных (Indices) Elasticsearch с миллионами записей, содержащих персональные данные покупателей, информацию о заказах и данные платежей.

Все это добро поддерживается и используется магазином Gearbest, чей сайт входит в Топ 250 крупнейших вебсайтов всего интернета. Gerbest торгует такими крупными брендами как Asus, Huawei, Intel и Lenovo, осуществляет доставку в более чем 250 стран мира и поддерживает локальные версии магазина на 18 языках.

Всего было найдено три свободно доступных базы данных, суммарно содержащих более 1.5 млн. записей:

  1. База заказов – содержит товары и адреса их доставки, электронная почта покупателей, их имена, и IP-адреса.
  2. База платежей – состоит из номеров заказов, типов платежей, платежной информации, имен покупателей и их IP-адресов.
  3. База покупателей – содержит имена покупателей, их даты рождения, адреса, телефонные номера, емейлы, IP-адреса, паспорта и даже пароли доступа к заказам.

Самое главное, что эта база данных обновляется, т.е. в нее записываются новые строки с данными новых заказов.

Let's block ads! (Why?)

Beego — это уже не Go

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

Хайп Go пришелся где-то на 2014ый год, когда авторы приложений имевших от силы 1000RPM (requests per minute) вдруг как один решили, что им срочно нужен concurrency, потому что вот-вот их 1000RPM превратиться в 1000RPS (что тоже не так много, на самом деле).

Результатом хайпа стало то, что к Go приобщилось много людей, привыкших к MVC архитектуре приложения, буть то Spring, Django или Ruby on Rails. И эту архитектуру, как сову на глобус, они стали натягивать на Go. Так появились кадавры вроде Beego и Revel. Revel благополучно сдох, хотя его и пытаются все еще откачать. А вот о Beego хочется поговорить отдельно.

Немалый вклад в продвижение Beego среди масс вложил Richard Eng своим циклом статей «A word the Beegoist». Практически «Евангелие от Ричарда». Иронично, что не смотря на то, что Ричард оголтело продвигает Go, сам он на нем не пишет.

В свою очередь я с Go, а еще хуже, с Beego, проработал не мало. И могу сказать, что это явно не тот путь, которым должна идти разработка на Go.
Давайте разберем несколько основных аспектов Beego, и почему они противоречат различным best practices в Go, да и в индустрии в целом.

Структура папок


Robert C. Martin, более известный как Uncle Bob, неоднократно озвучивал идею, что структура приложения должна передавать его суть. Он крайне любит приводить пример с кафедральным собором, на который можно посмотреть сверху, и сразу понять, что это кафедральный собор.

Роберт неоднократно критиковал Ruby on Rails за его структуру папок — controllers, models, views, вот этого всего. Проблема такого подхода заключается в том, что приложение по продаже носков «сверху» будет выглядеть точно так же, как приложение для заказа еды. И для того, чтобы понять суть приложения, нужно будет забраться в какую-нибудь папку models, и посмотреть, а с какими же сущностями мы в итоге имеем дело.

Именно это больное поведение Beego и копирует. В то время как тот же Spring ушел в сторону Domain Driver Design и структуры папок передающей суть, Beego навязывает использование структуры, ставшей уже antipattern'ом.

Но проблема даже серьезней. Для Go нет разделения между структурой папок и структурой пакетов (package'ей). Потому в Beego и UsersController и OrdersController будут под одним package'ем — controllers. А если у вас controller'ы двух типов, те, что сервят UI и те, что используются для API, причем последние в приличном обществе принято версионировать? Тогда будьте готовы к уродцам вроде apiv1.

ORM


Довольно странно, что Beego, будучи неудачным клоном Ruby on Rails, при этом не использует ActiveRecord pattern. Его ORM представляет собой крайне странное зрелище. Если для совсем базовых операций, вроде прочесть строку/записать строку, он еще годится, то вот, к примеру, как выглядит простенькая выборка (здесь и далее примеры взяты напрямую из документации):
qs.Filter("profile__age__gte", 18) // WHERE profile.age >= 18

Но основная проблема с Beego ORM даже не в том, что нужно бороться с proprietary языком, а в том, что он использует все худшие практики Go, будь то import sideffect'ов:
import (
    _ "github.com/go-sql-driver/mysql"
    _ "github.com/lib/pq"
    _ "github.com/mattn/go-sqlite3"
)

Или регистрация моделей в init():
func init(){
    orm.RegisterModel(new(User))
}

Сделайте себе одолжение, даже если вы все же решите по какой-то необъяснимой причине работать с Beego, не используйте Beego ORM. Если вам без ORM жизнь не мила (а что вы делаете в мире Go, милейший?), пользуйтесь GORM. Он хотя бы поддерживается. Иначе, «database/sql» вам в помощь.

Bee tool


Из Ruby on Rails скопирован так же command line tool, который зовется просто Bee. Вот только если в мире RoR был rails и был rake, то bee — это такая мусорка для всего. Он и MVC приложение за'boostrap'ит, и миграции прогонит, и file watcher запустит. В последнем и кроется еще одна проблема. Ведь в чем одно из основных достоинств Go? То, что запускается локально, максимально близко к тому, что запустится в production'е. Если вы не используете bee, конечно.

Automatic routing


Go — строго типизированный язык, который при этом не поддерживает ни generics, ни annotations. Как на таком слепить MVC фреймворк? Путем чтения комментов и генерации файлов, конечно.

Выглядит это примерно так:


// @Param   body        body    models.Object   true        "The object content"
// @Success 200 {string} models.Object.Id
// @Failure 403 body is empty
// @router / [post]
func (this *ObjectController) Post() {
    var ob models.Object
    json.Unmarshal(this.Ctx.Input.RequestBody, &ob)
    objectid := models.AddOne(ob)
    this.Data["json"] = map[string]string{"ObjectId": objectid}
    this.ServeJson()
}

Очевидность, как можно видеть, — нулевая. Функция Post() вообще ничего не получает и не возвращает. http.Request? Нет, не слышали.

Ну, а как работает весь routing? При запуске пресловутого bee генерируется еще один файл, commentsRouter_controllers.go, который содержит пример такого замечательного кода:

func init() {
    beego.GlobalControllerRouter["github.com/../../controllers:ObjectController"] = append(beego.GlobalControllerRouter["github.com/../../controllers:ObjectController"],
        beego.ControllerComments{
            Method: "Post",
            Router: `/`,
            AllowHTTPMethods: []string{"post"},
            MethodParams: param.Make(),
            Filters: nil,
            Params: nil})
...
}

Смотрите, не забудьте перегенерировать и за'commit'ить этот файл после каждого изменения. До последнего времени ситуация была еще печальней, и во время тестов этот файл генерировался автоматически, так что о проблемах вы узнавали уже в production'е. Кажется в последних версиях это странное поведение было исправлено.

Component testing


И так мы подходим к теме тестирования. Go, в отличие от большинства других языков программирования, приходит с тестовым фреймворком «из коробки». В целом, философия Go в том, что тест должен сидеть рядом с тестируемым файлом. Но мы же в мире MVC, плевать на философию Go, верно? Потому будьте добры все свои тесты разместить в папочке /test, как завещал нам DHH.

И это не такая уж мелочь, потому что, напомню, в Go package == folder. И если тест находящийся в том же package'е может вызвать private method, то тест находящийся в другом package — уже нет.

Но ладно бы все ограничивалось структурой папок. Код Beego в принципе очень сложно тестировать, поскольку в нем все на свете — это side effect.

Вот так Beego запрашивает routers:

import (
        _ "github.com/../../routers"
)


Та же история и с middleware'ами, и с controller'ами, которые я уже упоминал раньше.

Документация


Это для меня как software architect'а вишенка на торте. Документация в BeeGo хороша настолько, насколько хорош ваш китайский. Нет, от комментов на китайском внутри кода за последние года два уже вроде избавились.

Теперь на китайском остались только некоторые pull request'ы:

image

И в особенности в issues:

Вместо заключения


Если у вас есть команда написателей кода на Ruby/PHP/Python, и вы срочно хотите перевести их на Go, худшее, что вы можете для них сделать — это заставить их перейти на MVC фреймворк на Go. MVC в целом так себе архитектурный паттерн, а в Go он вообще не к месту. Либо, если вы уж совсем уверены, что ничто кроме Go вас не спасет, пусть переучиваются и пишут так, как в Go принято — максимально плоско и explicit. Либо, быть может им видней, при помощи какого инструмента решать поставленные им задачи?

Let's block ads! (Why?)

[Из песочницы] Как одно изменение конфигурации PostgreSQL улучшило производительность медленных запросов в 50 раз

Здравсвуйте, хабровчане! Предлагаю вашему вниманию перевод статьи «How a single PostgreSQL config change improved slow query performance by 50x» автора Pavan Patibandla. Она очень сильно мне помогла улучшить производительность PostgreSQL.

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

Отслеживая задержку на разных уровнях, мы поняли, что одному конкретному запросу PostgreSQL потребовалось 20 секунд для завершения. Для нас это стало неожиданностью, так как обе таблицы имеют индексы в соединяемом столбце.

Медленный запрос

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

План выполнения медленого запроса

image

Я изначально подозревал, что это может быть из-за фрагментации. Но после проверки данных я понял, что в эту таблицу данные только добавляются и практически не удаляются оттуда. Так как очистка места с помощью VACUUM здесь не очень поможет, я начал копать дальше. Затем я попробовал этот же запрос на другом клиенте с хорошим временем ответа. К моему удивлению, план выполнения запроса выглядел совершенно иначе!

План выполнения того же запроса на другом клиенте

image

Интересно, что приложение A получило доступ только к 10 раз большему количеству данных, чем приложение B, но время отклика было в 3000 раз больше.

Чтобы увидеть альтернативные планы запросов PostgreSQL, я отключил хеш-соединение и перезапустил запрос.

Альтернативный план выполнения для медленного запроса

image

Ну вот! Тот же запрос завершается в 50 раз быстрее при использовании вложенного цикла вместо хэш-соединения. Итак, почему PostgreSQL выбрал худший план для приложения A?

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

Это привело меня к параметрам конфигурации random_page_cost и seq_page_cost. Значения PostgreSQL по умолчанию 4 и 1 для random_page_cost, seq_page_cost, которые настроены для HDD, где произвольный доступ к диску дороже, чем последовательный доступ. Однако эти затраты были неточными для нашего развертывания с использованием тома gp2 EBS, которые являются твердотельными накопителями. Для нашего развертывания случайный и последовательный доступ практически одинаков.

Я изменил значение random_page_cost на 1 и повторил запрос. На этот раз PostgreSQL использовал Nested Loop, и запрос выполнялся в 50 раз быстрее. После изменения мы также заметили значительное снижение максимального времени отклика от PostgreSQL.

Общая производительность медленного запроса значительно улучшилась

image

Если вы используете SSD и используете PostgreSQL с конфигурацией по умолчанию, я советую вам попробовать настроить random_page_cost и seq_page_cost. Вы можете быть удивлены сильным улучшением производительности.

От себя добавлю, что я выставил минимальные параметры seq_page_cost = random_page_cost = 0.1, чтобы отдать приоритет данным в памяти над дисковыми, так как у меня выделено большое количество ОЗУ для PostgreSQL (размер ОЗУ превышает размер базы на диске). Не очень понятно, почему сообщество postgres до сих пор использует настройки по-умолчанию, актуальные для сервера с небольшим объемом ОЗУ и дисками HDD, а не для современных серверов. Надеюсь в скором времени это исправят.

Let's block ads! (Why?)

Ретро игровая приставка своими руками

image

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

Меня зовут Серхио Виейра (Sérgio Vieira) я выроc в Португалии в 80-е и 90-е годы, у меня давно ностальгия по ретро-геймингу, особенно по приставкам третьего и четвертого поколения.

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

Я хотел сделать приставку похожую на те которые вызывают у меня ностальгические чувства, я хотел что-то между NES и Super Nintendo, или может между Sega Master System и Mega Drive.

У этих приставок были CPU, оригинальный видео чип (тогда их ещё не называли GPU) и аудио чип, иногда встроеный, а иногда внешний.

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

Изначальный план был сделать приставку со следущими характеристиками:


  • Без эмуляции, игры и программы должны работать на настоящем железе, не обязательно том самом из тех времён, но достаточно быстром для задачи, и не более того.
  • С настоящим ретро CPU.
  • С аналоговым ТВ выходом.
  • Со звуком
  • С поддержкой двух контроллеров
  • Скроллинг бэков и анимация спрайтов
  • С возможностями для поддержки платформерных игр вроде Mario, ну и конечно всяких других игр.
  • С загрузкой игр и программ с SD карт.

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


Видео сигнал

Первое чем я занялся это генерация видео сигнала.

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

И так, я начал использовать микроконтроллер Atmega644 на чистоте 20 Мгц для генерации видеосигнала в формате PAL для телевизора. Мне пришлось бит-бангить протокол PAL, поскольку сам чип не умеет его.

imageVPU Test 1
imageVPU Test 2

Микроконтролл выдаёт 8-битный цвет (RGB332, 3 бита красный, 3 бита зелёный и 2 синий) и пассивный ЦАП преобразует это всё в RGB. К счастью в Португалии почти все телевизоры оборудованы разъёмом SCART и они поддерживают RGB вход.


Правильная графическая подсистема

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

У меня получилось что второй микроконтроллер (PPU, Picture Processing Unit, чип Atmega1284 тоже на 20 МГц) генерировал картинку в микросхему ОЗУ номер 1 (я назвал её VRAM1), а первый в это же время отправлял содержимое второй микросхемы (VRAM2) в телевизор.

После одного кадра, а два кадра в системе PAL это 1/25 секунды, VPU переключает VRAM-ы и они меняются местами, PPU генерирует картинку в VRAM2, а VPU дампит VRAM1 на ТВ вывод.

Видео плата получилась очень сложной поскольку мне пришлось использовать внешнее железо чтобы оба микроконтроллера могли пользоваться обоими модулями памяти и чтобы ускорить доступ к ОЗУ, ведь там тоже бит-бангинг, так что пришлось добавить чипы 74 серии как счётчики, line-селекторы, трансиверы и тд.

Прошивки для VPU и PPU тоже получились громоздкие поскольку пришлось писать много кода чтобы выжать максимум скорости из графики. Сначала всё было написано на ассемблере, потом часть была переписана на Си.

imageVideo Board 1
imageVideo Board 2

В результате PPU генерирует картинку 224x192 пикселей, которая потом отпраляется на ТВ через VPU. Может разрешение вам покажется низким, но вообще-то это почти столько, сколько консоли того времени имели на самом деле, обычно 256x224. Несколько меньшее разрешение зато позволило мне добавить больше фич которые система успевает просчитать за один кадр.

Как и в старину, PPU имеет свою жёсткую механику которой надо уметь пользоваться. Подложка (бэк) рендерится из символов 8x8 пикселей, так же называемых тайлами. Получается что размер бэкграунда 28х24 тайла.

Чтобы бэк могл скролится плавно, попиксельно, я сделал так что всего есть 4 виртуальных экрана, каждый по 28х24 тайла которые идут в памяти последовательно и обёрнуты вокруг друг друга, на картинке это понятнее.

imageBackground
imageVirtual Background

Поверх бэкграунда, PPU может отрендерить 64 спрайта которые могут быть 8 или 16 пикселей по высоте или ширине, то есть 1, 2 или 4 тайла и ещё могут быть флипнуты горизонтально и/или вертикально.

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

Одна "продвинутая" фича в том, что бэк можно скролить не целиком, а каждую линию в отдельности, что позволяет всякие интересные эффекты вроде сплит скрина или почти-параллакса.
Ещё есть таблица аттрибутов, которая позволяет задавать каждому тайлу значение от 0 до 3, и потом можно всем тайлам с одним аттрибутом задать страницу тайлов или инкрементировать их символьное значение. Это удобно когда есть части бэка которые надо регулярно изменять и CPU не придётся обсчитывать каждый тайл в отдельности, ему достаточно только сказать что-то вроде: "все тайлы с аттрибутом 1 инкрементируйте числовое значение своего символа на 2", подобные вещи реализованые разными техниками можно наблюдать, например, в блочных тайлах в Mario где знак вопроса анимируется или в играх где есть водопад в котором все тайлы постоянно меняются создавая эффект падающей воды.


CPU

Когда моя видеоплата заработала, я начал работать с CPU в качестве которого для моей приставки был выбран Zilog 80.

Одна из причин по который был выбран именно Z80, ну кроме того, что это класный ретро CPU, это его способность адресовать два 16 битных пространства, одно для памяти и второе для портов ввода-вывода, не менее легендарный 6502, например, так не может, он может только одно адресовать 16 битное пространство и в него приходится мапить как память так и различные внешние устройства, видео, аудио, джойстики, апаратный генератор случайных чисел и тд. Удобнее иметь два адресных пространства, одно полность отданное на 64 килобайта кода и данных в памяти и второе для доступа к внешним устройствам.

Сначала я подсоединил CPU к EEPROM в котором разместилась моя тестовая программка и ещё присоединил его через пространство ввода-вывода к микроконтроллеру который я установил чтобы можно было общаться с моим компом через RS232, и мониторить как работает CPU и всё остальное. Этот микроконтроллер Atmega324 работающий на 20 МГц я называю IO MCU — input/output microcontroller unit, он отвечает за контроль доступа к игровым контроллерам (джойстикам), SD карт ридеру, клавиатуре PS/2 и коммуникатору по RS232.

imageCPU Board 1

CPU подключается к микросхеме памяти на 128 килобайт, из которых только 56 килобайт доступны, это конечно бред, но я мог достать только микросхемы по 128 или 32 килобайта. Получилось, что память состоит из 8 килобайт ПЗУ и 56 килобайт ОЗУ.

После этого я обновил прошивку IO MCU с помощью этой библиотеки и у меня появилась поддержка SD карт ридера.

Теперь CPU мог ходить по директориям, смотреть что в них лежит, открывать и читать файлы. Всё это делается посредством записи и чтения в определённые адреса пространства ввода-вывода.


Подключение CPU к PPU

Следущее, что я сделал это связь между CPU и PPU. Для этого я применил "простое решение" которое заключалось в приобретении двухпортового ОЗУ, это такая микросхема ОЗУ которую можно подключать сразу к двум разным шинам. Это позволяет избавиться он дополнительных микросхем вроде лайн-селекторов и, к тому-же, позволяет практически одновременный доступ к памяти с обоих чипов. Ещё PPU напрямую может обращаться к CPU на каждом кадре активируя свои немаскируемые прерывания. Получается, что CPU получает прерывание на каждом кадре, что полезно для разных задач по таймингу и для понимания когда пора заняться апдейтом графики.

Каждый кадр взаимодествия CPU, PPU и VPU происходит согласно следующей схеме:


  1. PPU копирует информацию из памяти PPU в внутреннюю память.
  2. PPU отправляет сигнал прерывания на CPU.
  3. Одновременно:
    • CPU прыгает на функцию прерывания и начинает обновлять PPU память новым графическим состоянием. Программа должна вернуться из прерывания до следующего кадра.
    • PPU рендерит картинку на основании информации ранее скопированой в одну из VRAM.
    • VPU отправляет картинку из другой VRAM на ТВ выход.

Примерно тогда же я занялся поддержкой игровых контроллеров, сначала я хотел использовать контроллеры от Nintendo, но сокеты для них проприетарные и вообще их трудно найти, поэтому я остановился на 6-кнопочных контроллерах совместимых с Mega Drive/Genesis, у них стандартные сокеты DB-9 которые везде есть.

imageJoint Board 1


Написание первой настоящей игры

В это время у меня уже был CPU способный контролировать PPU, работать с джойстиками, читать SD карточки… пора было писать первую игру, конечно на ассемблере Z80, у меня на это ушло несколько дней из свободного времени.



Добавляем динамическую графику

Всё было супер, у меня была своя игровая приставка, но мне этого было мало, потому-что приходилось в игре использовать графику прошитую в памяти PPU и нельзя было нарисовать тайлы для конкретной игры и изменить её можно было только перепрошив ПЗУ. Я стал думать как добавить ещё памяти, чтобы CPU в неё мог бы загружать символы для тайлов, а PPU потом мог оттуда это всё считывать и как это сделать попроще поскольку приставка и так уже получалась сложной и большой.

И я придумал следущее: только PPU будет иметь доступ к этой новой памяти, а CPU будет загружать туда данные через PPU и пока этот процесс загрузки происходит, эта память не может быть использована для отрисовки, но можно будет в это время рисовать из ПЗУ.

После конца загрузки CPU переключит внутреннюю ПЗУ память на эту новую память, которую я назвал Character RAM (CHR-RAM) и в этом режиме PPU начнет рисовать динамическую графику, это наверное не лучшее решение, но оно работает. В результате новая память была установлена 128 килобайт и может хранить 1024 символа 8х8 пикселей каждый для бэкаграунда и ещё столько-же символов для спрайтов.

imageJoint Board 2


И наконец звук

До звука руки дошли в последнюю очередь. Сперва я хотел звук наподобие того что есть в Uzebox, то есть чтобы микроконтроллер генерировал 4 канала ШИМ-звука.

Однако, оказалось, что я могу легко достать винтажные чипы и я заказал несколько микросхем FM синтеза YM3438, эти ребята полностью совместимы с YM2612 которые использовались в Mega Drive/Genesis. Установив их можно получить музыку качества Mega Drive и звуковые эффекты производимые микроконтроллером.

Я установил ещё один микроконтроллер и назвал его SPU (Sound Processor Unit), он управляет YM3438 и сам может генерировать звуки. CPU управляет им через двух-портовую память, в этот раз она всего 2 килобайта.

Как и в графическом блоке, звуковой блок имеет 128 килобайта памяти для хранения PCM сэмплов и звуковых патчей, CPU загружает данные в эту память обращаясь к SPU. Получилось, что CPU либо говорит SPU исполнять комманды из этой памяти или обновляет комманды для SPU каждый кадр.

CPU управляет четырьмя ШИМ каналами через четыре циркулярных буфера находящихся в памяти SPU. SPU проходит через эти буферы и исполняет комманды записаные в них. Ещё есть один такой-же буфер для микросхемы FM синтеза.

Итого, как и в графике взаимодействие между CPU и SPU идёт согласно схеме:


  1. SPU копирует данные из памяти SPU во внутреннюю память.
  2. SPU ждёт сигнала прерывания от PPU (это для синхронизации)
  3. Одновременно
    • CPU обновляет буферы ШИМ каналов и буферы FM синтезатора.
    • SPU исполняет комманды в буферах согласно данным во внутренней памяти.
    • Одновременно со всем этим, SPU обновляет ШИМ звуки на частоте 16 килогерц.

imageSound Board 1

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

На макетной плате сейчас (пока) остался только звук.
Вот как всё выглядит на сегодняшний день:

imageConsole 1


Архитектура

Диаграмма иллюстрирует компоненты в каждом блоке и как они взаимодействуют друг с другом. Единственное, что не показано это сигнал от PPU к CPU на каждом кадре в виде прерывания и такой-же сигнал который идёт в SPU.

imageArchitecture


  • CPU: Zilog Z80 на 10 МГц
  • CPU-ROM: 8KB EEPROM, содержит код загрузчика
  • CPU-RAM: 128KB RAM (56KB доступных), код и данные для программ/игр
  • IO MCU: Atmega324, является интерфейсом между CPU и RS232, клавиатурой PS/2, джойстиками и файловой системой SD карт
  • PPU-RAM: 4 килобайта двухпортовой памяти, промежуточная память между CPU и PPU
  • CHR-RAM: 128KB RAM, хранит динамические тайлы для бэка (подложки) и спрайтов (в символах по 8x8 пикселей).
  • VRAM1, VRAM2: 128KB RAM (43008 реально доступно), используются для фреймбуфера в них пишет PPU и читает из них VPU.
  • PPU (Picture Processing Unit): Atmega1284, рисует кадр во фреймбуфер.
  • VPU (Video Processing Unit): Atmega324, читает фреймбуфер и генерирует RGB и PAL сигнал и синхронизацию.
  • SPU-RAM: 2KB двухпортовая RAM, служит интерфейсом между CPU и SPU.
  • SNDRAM: 128KB RAM, хранит ШИМ патчи, PCM сэмплы и блоки инструкций для FM синтезатора.
  • YM3438: YM3438, микросхема FM синтеза.
  • SPU (Sound Processing Unit): Atmega644, генерирует звуки на принципе широтно-импульсной-модуляции (ШИМ) и управляет YM3438.

Окончательные спецификации

CPU:


  • 8-bit CPU Zilog Z80 на частоте 10Mhz.
  • 8KB ROM для загрузчика.
  • 56KB RAM.

IO:


  • Чтение данных с FAT16/FAT32 SD карт ридера.
  • Чтение/запись в порт RS232.
  • 2 MegaDrive/Genesis-совместимых игровых контроллера.
  • Клавиатура PS2.

Видео:


  • Разрешение 224x192 пикселя.
  • 25 кадров в секунду (половина FPS от PAL).
  • 256 цветов (RGB332).
  • 2x2 виртуальная подложка (448x384 пикселей), с двунаправленым по-пиксельным скроллингом, на базе четырёх полноэкранных страниц.
  • 64 спрайта с шириной и высотой 8 или 16 пикселей с возможностью как вертикального так и горизонтального флипа.
  • Подложка и спрайты состоят из символов по 8х8 пикселей каждый.
  • Символьная видеопамять на 1024 символа для бэкграунда и 1024 для спрайтов.
  • 64 независимых горизонтальных скроллинга по задаваемым линиям
  • 8 независимых вертикальных скроллингов по задаваемым линиям
  • Оверлей на 224х48 пикселей с опциональной прозрачностью по цветовому ключу.
  • Таблица аттрибутов бэкграунда.
  • RGB и композитный PAL через разъём SCART.

Звук:


  • ШИМ на 8 бит и 4 канала, с встроенными вейвформами: квадрат, синус, пила, шум и тд.
  • Сэмплы на 8 бит, 8 КГц в одном из ШИМ каналов.
  • Микросхема FM синтеза YM3438 загружаемая инструкциями на частоте 50 герц.

Для приставки был написан загрузчик. Загрузчик помещается в CPU ПЗУ и может занимать до 8 килобайт. Он использует первые 256 байт ОЗУ. Загрузчик это первое, что исполняет CPU. Он нужен чтобы показать программы находящиеся на SD карте.

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

После выбора программы она загружается в память CPU, память CHR и память SPU. После чего программный код исполняется. Максимальный размер кода загружаемого в приставку 56 килобайт, кроме первых 256 байт и конечно надо учесть место для стека и данных.
И этот загрузчик и другие программы написаные для этой приставки создавались одинаковым нижеописаным способом.


Memory/IO Mapping

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

CPU обращается к оперативной и постоянной памяти загрузчика через адресное пространство памяти.

Адресное пространство памяти
imageMemory Mapping

А к PPU-RAM, SPU-RAM и IO MCU через адресное пространство ввода-вывода.

Адресное пространство ввода-вывода
imageIO Mapping

Как видно из таблицы, внутри адресного пространства ввода-вывода выделены адреса для всех устройств, IO MCU, PPU и SPU.


Управление PPU

Из информации в таблице видно, что для управления PPU надо писать в память PPU которая доступна по адресам 1000h-1FFFh в адресном пространстве ввода-вывода.

Распределение адресного пространства PPU

imagePPU Mapping

PPU Status может принимать следущие значения:


  1. Режим вшитой графики
  2. Режим динамической графики (CHR-RAM)
  3. Режим записи в CHR память
  4. Запись завершена, ждём подтверждения режима от CPU

Вот, например, как можно работать со спрайтами:
Приставка может рисовать 64 спрайта одновременно. Данные по ним доступны через CPU через адресное пространство ввода-вывода по адресам 1004h-1143h (320 байт), на каждый спрайт приходится 5 байт информации (5 * 64 = 320):


  1. Байт разных флагов, каждый бит этого байта флаг: Active, Flipped_X, Flipped_Y, PageBit0, PageBit1, AboveOverlay, Width16, Height16.
  2. Байт символа, номер символа из таблицы (определяемой флагами выше).
  3. Байт цветового ключа (то есть какой цвет — прозрачность)
  4. Байт координаты X
  5. Байт координаты Y

Итого, чтобы увидеть спрайт, надо установить флаг Active в 1, и задать координаты X и Y в пределах видимости, координаты 32/32 помещают спрайт в верхний левый угол экрана, меньшие значения спрячут его либо сделают частично видимым.

Потом мы можем установить код символа и цвет прозрачности.

Например, если нам нужно показать спрайт номер 10, то адрес будет 4145 (1004h + (5 x 9)), пишем значение 1 для активирования и координаты, например, x=100 и y=120, пишем по адресу 4148 значение 100 и по адресу 4149 значение 120.


Используем ассемблер

Один из способов программирования для приставки это ассемблер.

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

ORG 2100h

PPU_SPRITES: EQU $1004
SPRITE_CHR: EQU 72
SPRITE_COLORKEY: EQU $1F
SPRITE_INIT_POS_X: EQU 140
SPRITE_INIT_POS_Y: EQU 124

jp main

DS $2166-$
nmi: ; обработчик немаскируемого прерывания (NMI)
    ld bc, PPU_SPRITES + 3
    ld a, (sprite_dir)
    and a, 1
    jr z, subX
    in a, (c) ; увеличить X
    inc a
    out (c), a
    cp 248
    jr nz, updateY
    ld a, (sprite_dir)
    xor a, 1
    ld (sprite_dir), a
    jp updateY
subX:
    in a, (c) ; уменьшить X
    dec a
    out (c), a
    cp 32
    jr nz, updateY    
    ld a, (sprite_dir)
    xor a, 1
    ld (sprite_dir), a
updateY:
    inc bc
    ld a, (sprite_dir)
    and a, 2
    jr z, subY
    in a, (c) ; увеличить Y
    inc a
    out (c), a
    cp 216
    jr nz, moveEnd
    ld a, (sprite_dir)
    xor a, 2
    ld (sprite_dir), a
    jp moveEnd
subY:
    in a, (c) ; уменьшить Y
    dec a
    out (c), a
    cp 32
    jr nz, moveEnd
    ld a, (sprite_dir)
    xor a, 2
    ld (sprite_dir), a
moveEnd:
    ret

main:
    ld bc, PPU_SPRITES
    ld a, 1
    out (c), a  ; активировать спрайт 0
    inc bc
    ld a, SPRITE_CHR
    out (c), a  ; задать символ спрайту 0
    inc bc
    ld a, SPRITE_COLORKEY
    out (c), a  ; установить цветовой ключ спрайту 0
    inc bc
    ld a, SPRITE_INIT_POS_X
    out (c), a  ; установить координату Х спрайту 0
    inc bc
    ld a, SPRITE_INIT_POS_Y
    out (c), a  ; установить координату Y спрайту 0
mainLoop:    
    jp mainLoop

sprite_dir:     DB 0

Использование языка Си

Можно также использовать язык Си, для этого нам понадобится компилятор SDCC и некоторые дополнительные утилиты.

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

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

#include <console.h>

#define SPRITE_CHR 72
#define SPRITE_COLORKEY 0x1F
#define SPRITE_INIT_POS_X 140
#define SPRITE_INIT_POS_Y 124

struct s_sprite sprite = { 1, SPRITE_CHR, SPRITE_COLORKEY, SPRITE_INIT_POS_X, SPRITE_INIT_POS_Y };
uint8_t sprite_dir = 0;

void nmi() {
    if (sprite_dir & 1)
    {
        sprite.x++;
        if (sprite.x == 248)
        {
            sprite_dir ^= 1;
        }
    }
    else
    {
        sprite.x--;
        if (sprite.x == 32)
        {
            sprite_dir ^= 1;
        }
    }

    if (sprite_dir & 2)
    {
        sprite.y++;
        if (sprite.y == 216)
        {
            sprite_dir ^= 2;
        }
    }
    else
    {
        sprite.y--;
        if (sprite.x == 32)
        {
            sprite_dir ^= 2;
        }
    }

    set_sprite(0, sprite);
}

void main() {
    while(1) {
    }
}

Динамическая графика

(В оригинале Custom graphics. прим. пер.)

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

Цель у меня была такая, чтобы вся необходимая графика в бинарной форме сразу грузилась в оперативную память CHR, причём делать это умеет код в загрузчике из ПЗУ. Для этого я сделал несколько кратинок правильного размера с разными полезными символами:

imageSample tile components

Поскольку память динамической графики состоит из 4-х страниц по 256 символов 8х8 пикселей каждый и 4-х страниц таких же символов для спрайтов, я перевёл картинки в PNG формат, удалил повторяющиеся одинаковые:

imageSample character sheet

И потом использовал самописную тулзу чтобы перевести это всё в бинарный формат RGB332 с блоками 8х8.

imageGraphics command line

В результате имеем файлы с символами, где все символы идут последовательно один за другим и каждый занимает по 64 байта.


Звук

Волновые RAW сэмплы переведены в 8-битный 8-килогерцовые PCM сэмплы.

Патчи для звуковых эффектов на ШИМ и музыки пишутся особыми инструкциями.

Что касается микросхемы FM синтеза Yamaha YM3438, то я нашел программку называемую DefleMask которая выдаёт музыку синхронизируемую по PAL и предназначеную для YM2612 микросхемы из Genesis, которая совместима с YM3438.

DefleMask экспортирует музыку в формате VGM и я её конвертирую ещё одной самописной утилитой в свой собственный двоичный формат.

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

imageSound command line


Линковка окончательного файла

Двоичный исполняемый код, графика и звук соединяются в один PRG файл. PRG файл имеет заголовок в котором всё описано, есть ли звуковые и графические данные, сколько они занимают и сами эти данные.

Такой файл можно записать на SD карту и загрузчик приставки считает его и загрузит всё в соотвествующие места и запустит исполняемый код программы.

imagePRG command line


Эмулятор

Я написал эмулятор своей приставки на С++ с применением wxWidgets, чтобы проще было девелопить для неё.

CPU эмулируется библиотекой libz80.

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

По графике, я могу заглянуть в видео память, в таблицы символов и в саму CHR память.

Вот пример программы запущеной на эмуляторе со включёнными средствами отладки.

imageEmulator Demo

Эти видео снимались камерой смартфона направленой на экран ЭЛТ телевизора, прошу прощения за неидеальное качество картинки.

Интерпретатор БЭЙСИКа программируемый с PS/2 клавиатуры, после первой программы, я показываю как писать напрямую в память PPU через адресное пространство ввода-вывода активируя и двигая спрайт:


Демка графики, в этом видео программно скачут 64 спрайта 16х16, на фоне бэкграунда с динамическим скроллингом и оверлеем который двигается под и над спрайтами:


Звуковая демка показывает возможности YM3438 и ШИМ звук, звуковые данные этой демки и FM музыка и ШИМ звуки вместе занимают почти все доступные 128 килобайт звуковой памяти.


Тетрис, для графики использваны почти только возможности бэкграунда, музыка на YM3438, звуковые эффекты на ШИМ патчах.


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

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

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

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

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


Проекты, сайты, каналы Youtube которые вдохновляли меня и помогали мне с техническими знаниями:

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

Спасибо, если дочитали до сюда. :)

Если у вас есть вопросы или фидбек пишите в комментариях внизу (Оригинальной статьи на английском языке на Гитхабе. прим. пер.)

Let's block ads! (Why?)

На IT-фестивале SXSW представлен первый в мире «гендерно-нейтральный» голосовой помощник

На SXSW представили виртуального ассистента, голос которого по звучанию не напоминает ни женский, ни мужской. Рассказываем, как его создавали и посмотрим на перспективы.


Фото Gareth Halfacree / CC BY-SA

Зачем нужен «гендерно-нейтральный» голос


Согласно исследованиям, пользователям умных колонок и голосовых помощников не хватает «нейтрального» варианта голоса без ярко выраженных женских или мужских черт. В опросе R&D лаборатории Space10 почти половина из 12 тысяч респондентов предпочли бы слышать «бесполый» голос ассистента. В таком исполнении люди лучше ассоциируют его с системами ИИ, скрытыми «под капотом» помощника. Нейтральный голос больше подходит образу «машины». Однако такой опции у крупных игроков на этом рынке нет.

Своё решение предложили специалисты агентства Virtue — на конференции SXSW в Остине они представили нового «бесполого» голосового ассистента под названием Q. Его разработали совместно с некоммерческой организацией Equal AI, интерактивными студиями thirtysoundsgood и Koalition Interactive, а также экспертами по лингвистике.

Как устроен ассистент Q и как его создавали


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

Итеративная работа с фокус-группой в четыре с половиной тысячи респондентов привела авторов проекта к «нейтральному» исполнению голоса.

По словам разработчиков, звучание Q кажется людям «бесполым», потому что голос помощника лежит в частотном диапазоне между мужскими и женскими голосами. Для первых спектр частот составляет 80–180 Гц, а для вторых 140–255 Гц. Голос Q попадает в нейтральный диапазон 145–175 Гц, что не позволяет однозначно определить пол.

Послушать, как звучит ассистент, можно в видео по этой ссылке, а также на сайте проекта.


Мнения и потенциал


Журналисты отзываются о проекте Q положительно. По словам колумниста CNBC, помощник звучит достаточно «уверенно», но при этом кажется дружелюбным и отзывчивым. О перспективах помощника высказались и авторы проекта. Они верят в успех идеи, потому что Q расширяет возможности выбора для пользователей умных колонок и голосовых помощников.

Разработчики не планируют запускать собственное устройство или приложение, а хотят привлечь внимание ИТ-компаний и предложить им добавить нейтральный голос для своих ассистентов. В планах у создателей Q — рассказать о своём продукте транспортным компаниям, государственным и другим организациям, которые используют голосовые объявления.

Тем не менее, пока будущее проекта остаётся неясным. Ни одна технологическая компания ещё не объявила о желании поработать с создателями Q, и, возможно, после шума в технологических СМИ «гендерно-нейтральный» помощник будет разработан ИТ-гигантами самостоятельно.

Кто ещё разрабатывает «бесполых» ассистентов


В области голосовых помощников аналогов Q пока нет. Однако возможность выбрать «пол» голоса уже есть во всех заметных проектах в этой сфере. Для англоязычных пользователей в Google Assistant доступны десять разных мужских и женских голосов, а в Siri — мужской и женский голос с разными акцентами. Изменить звучание можно и в Amazon Alexa — разные голоса доступны в «навыках» умной колонки.


Фото Tony Webster / CC BY-SA

Аналоги Q можно найти в области чат-ботов. Один из первых «гендерно-нейтральных» ботов разработали в британской компании Sage — он получил название Pegg. По словам руководительницы проекта Крити Шарма (Kriti Sharma), ассистент сделали «бесполым», чтобы создать для него личность бота, а не «бота, притворяющегося человеком».

«Нейтральных» чат-ботов разрабатывают также для компании GoDaddy и сети магазинов Lowe’s — оба бота будут использовать в сфере клиентского сервиса.

Выводы


Хотя создатели умных колонок и помощников расширяют диапазон доступных голосов, «дефолтное» звучание ассистента оставляют неизменным. Согласно изданию Slate, такое постоянство может быть связано с узнаваемостью бренда — если голос помощника резко изменится, это вызовет негативную реакцию у пользователей, которые привыкли различать разные сервисы на слух.

Скорее всего, «нейтральные» голоса не станут общепринятым стандартом на рынке крупных голосовых ассистентов. Однако популярность подобных решений у пользователей может привести к появлению новых игроков, которые смогут предложить широкое разнообразие образов виртуальных помощников.



Дополнительное чтение — о звуке и музыке из нашего блога и Telegram-канала:

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


Let's block ads! (Why?)

Новый мировой рекорд по вычислению числа пи: 31,4 трлн знаков

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

Вычислительный кластер Google Compute Engine за 121 день на 25 виртуальных машинах рассчитал наибольшее количество цифр в числе пи, установив новый мировой рекорд: 31,4 триллиона знаков после запятой. Это первый раз, когда для расчёта числа пи такой величины использовалось общедоступное облачное программное обеспечение.

Рекорд будет записан на имя Эммы Харуки Ивао (Emma Haruka Iwao) из подразделения высокопроизводительных вычислений в Google. Именно она использовала инфраструктуру Google Cloud для вычислений. Предыдущий мировой рекорд был установлен Питером Трубом в 2016 году, он рассчитал число до 22,4 триллиона цифр на специально сделанном сервере, который тоже спонсировал работодатель.
Как и Труб, инженер Google применила для расчёта y-cruncher. Эта программа использует алгоритм Чудновского, быстрый алгоритм вычисления числа пи. Ещё в 80-е годы сами братья Чудновские с его помощью рассчитали более триллиона знаков после запятой.

В свою очередь, алгоритм основан на свойстве быстрой сходимости гипергеометрического ряда:

Эмма Харука Ивао увлеклась «волшебным» числом, узнав о нём на уроке математики в школе, пишет Wired. В университете один из её профессоров, Дайсуке Такахаси (Daisuke Takahashi), был рекордсменом по количеству рассчитанных цифр числа с помощью суперкомпьютера. Сегодня рекорд может поставить практически любой заинтересованный инженер, у которого есть доступ к серьёзным вычислительным ресурсам и большому дисковому хранилищу (для хранения результата вычислений). Созданная в 2009 году программа y-cruncher предназначена для вычисления математических констант, таких как пи. Она поддерживает массивную многопоточность и триллионные диапазоны. Эта программа фактически коммодитизировала вычисления констант.

«Вам нужен довольно большой компьютер, чтобы побить мировой рекорд, — говорит Ивао. — Не получится сделать это на компьютере из магазина, поэтому раньше люди строили кастомные машины». В сентябре 2018 года Ивао начала рассматривать, как технически будет работать процесс вычисления в диапазоне за пределами рекордного диапазона. Сразу стало понятно, что основной проблемой станет объём данных для хранения. В итоге получилось, что рассчитанный результат занимает 170 терабайт. Вместо сборки кастомного сервера, как предшественники, девушка использовала инфраструктуру Google Cloud.

Ивао подняла 25 виртуальных машин: «Но вместо того, чтобы нажимать эту кнопку виртуальной машины 25 раз, я автоматизировала её, — объясняет она. — Ты можешь сделать это за пару минут, но если тебе нужно так много компьютеров, то потребуется несколько дней, чтобы всё настроить». Затем непрерывно в течение 121 дня Ивао управляла работой y-cruncher на этих 25 виртуальных машинах.

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

«В кранчере и Google Cloud есть системы резервного копирования, и я настроила их так, чтобы вы могли мгновенно снимать копии этих дисков, не останавливая вычисления», — говорит Ивао. Эти данные затем копировались и сохранялись извне, на других дисках, в виде моментальных снимков.

«В начале было несколько параметров, которые я изменила, например, сколько данных вы могли читать или писать за один раз, и как границы будут меняться по мере увеличения», — говорит Ивао.

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

Сейчас завершены и вычисления, и проверка результата: в y-cruncher встроены два базовых алгоритма — один для вычисления самого пи, а другой для проверки. Алгоритм проверки работает параллельно с вычислением, но вычисляет только одну цифру, так что рекорд можно регистрировать официально.



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

Let's block ads! (Why?)

[Из песочницы] Микросервисная архитектура = распределенные вычисления

Приветствую всех читателей Хабра! Меня зовут Игорь Рыбаков и я технический директор в казахстанской IT-компании DAR. Сегодня я поделюсь с вами пониманием и использованием принципов параллельных вычислений в современных информационных системах. Чтобы глубже разобраться в этом, я хотел бы привести аргументы в пользу изучения и практического применения концепций параллельных и распределенных вычислений при разработке современных информационных систем.


Параллельные вычисления или при чем тут основатель Intel

Сначала немного истории. В 1965 году Гордон Мур, один из основателей Intel, обнаружил закономерность: появление новых моделей микросхем наблюдалось спустя примерно год после предшественников, при этом количество транзисторов в них возрастало каждый раз приблизительно вдвое. Получается, что количество транзисторов, размещаемых на кристалле интегральной схемы, удваивалось каждые 24 месяца. Такое наблюдение стало называться законом Мура. Основатель Intel предсказал, что количество элементов в чипе вырастет с 2^6 (порядка 60) в 1965 году до 2^16 (65 тыс.) уже к 1975 году.

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

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

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

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


Применение параллельных вычислений

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

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

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

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


Контроль качества сервисов

Для измерения фактического качества сервисов для клиента используется понятие service-level agreement (SLA), то есть, некоторые статистические метрики производительности системы.

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

Для оценки удовлетворенности пользователей сервисом можно использовать показатель Apdex, который отражает отношение успешных (satisfied) откликов к неудовлетворительным (unsatisfactory). Например, наше пороговое значение SLA = 1,2 секунды, тогда при 95% времени отклика запросов <= 1,2 секунды результат будет успешным. В случае появлении большого числа запросов более 1,2 секунды, но менее 4T (4,8 секунды), результат считается удовлетворительным, а при появлении большого числа запросов превышающим 4T, те > 4,8 секунд результат считается провалом.


Выводы

В итоге хотелось бы сказать, что разработка микросервисов фактически предполагает понимание и практическое применение Распределенных и Параллельных вычислений.

Конечно, при этом придется пожертвовать некоторыми вещами:


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

Взамен этому мы получаем, на мой взгляд, гораздо больше:


  • возможность повторного использования целых модулей, готовых к работе, и, как следствие, быстрый запуск продуктов на рынок.
  • высокую масштабируемость систем, что означает большее количество клиентов без потери SLA,
  • Используя согласованность в конечном счете (eventual consistency), основываясь на CAP теореме, мы получаем возможность управлять огромными массивами данных, опять же, без потели SLA
  • возможность записывать любое изменение в состоянии системы для дальнейшего анализа и машинного обучения.

Let's block ads! (Why?)

Новый стандарт на базе PCIe 5.0 «свяжет» CPU и GPU — что о нем известно

Консорциум CXL представил новый открытый стандарт — Compute Express Link (CXL). Он поможет организовать высокоскоростную связь между процессором и другими устройствами — GPU, FPGA и памятью. В основу CXL 1.0 лег интерфейс PCIe 5.0, спецификация которого ожидается в этом году. Поговорим о технических подробностях и аналогах решения.


/ Wikimedia / CINECA / CC BY

Зачем потребовался новый стандарт


Потребность в обработке и шифровании больших объемов данных, развитие систем ИИ и алгоритмов МО привели к росту популярности гетерогенных решений. В них процессоры общего назначения работают вместе с ускорителями — графическими процессорами, FPGA и микросхемами ASIC. Каждый компонент специализируется на выполнении конкретной задачи, что повышает производительность системы.

При обработке больших объемов данных (например, в дата-центрах), каналы для обмена информацией между гетерогенными компонентами порой становятся «бутылочным горлышком». Чтобы свести задержки к минимуму, консорциум CXL (в который входят облачные провайдеры и разработчики оборудования для ЦОД) представил стандарт Compute Express Link.

Что известно о стандарте


Он основан на интерфейсе PCI Express 5.0, предназначенном для подключения серверных компонентов. Это означает, что стандарт будет поддерживать пропускную способность между вычислительными элементами до 128 Гбайт/с на 16 линиях. При этом будет использоваться экономное кодирование 128b/130b, реализованное еще в PCI Express 3.0.

Схематически подключение можно изобразить следующим образом:


CXL имеет три метода интерфейса. Первый — режим ввода-вывода для передачи команд и обновления статусов устройств. Второй — протокол памяти для разделения RAM между хостом и ускорителем. Третий — интерфейс, который обеспечит когерентность памяти.
О чем мы пишем в корпоративном блоге:

Потенциал и недостатки


Шина PCIe 5.0 специально разработана для решения задач, которые требуют максимальной пропускной способности — работы с графическими процессорами, сетевыми технологиями, высоконагруженными системами. Поэтому разработчики CXL ожидают, что новый стандарт будет пользоваться спросом у институтов, занимающихся машинным обучением, и операторов дата-центров. Поскольку технология «заточена» под GPU, FPGA, ASIC и другие ускорители, в архитектуре пользовательских ПК она, скорее всего, применяться не будет.

В ИТ-сообществе есть мнение, что новый стандарт может не получить широкого распространения. Так как в отрасли и так достаточно аналогичных стандартов и спецификаций, например CCIX и GenZ (о них мы поговорим ниже). Широкой адаптации стандарта может помешать модель его распространения. Хотя Compute Express Link и является открытым стандартом, доступ к его полной спецификации имеют только члены консорциума. И пока непонятно, будут ли они конкурировать друг с другом на рынке после релиза.


/ Wikimedia / BiomedNMR / CC BY-SA

Похожие стандарты


Как мы упоминали выше, у CXL есть несколько аналогов, среди которых GenZ и CCIX.

Спецификация шины GenZ, которую называют «возможным преемником PCIe», вышла в феврале 2018. В ее разработке приняли участие около пятидесяти крупных ИТ-компаний. Цель создания стандарта не отличается от целей CXL — повысить скорость обмена данными между процессором, памятью и графическими картами.

Представители консорциума утверждают, что Gen-Z обходит ограничение связи точка-точка, которое присутствует в PCIe, и обращается к памяти напрямую. Спецификация уже готова и лежит в открытом доступе на сайте консорциума.

CCIX — еще один консорциум, в составе которого числятся именитые корпорации. Первая спецификация одноименного стандарта вышла летом 2018. Она основана на PCIe 4.0, что позволяет добиться пропускной способности в 25 Гбайт/с.

Концепцию архитектуры на базе первой спецификации CCIX уже реализовала компания Xilinx в своем чипе Versal на FPGA. В ближайшее время CCIX планируют внедрить и другие игроки рынка, некоторые из них уже представили тестовые реализации.

Будущее стандарта


Как минимум два консорциума уже опережают CXL по скорости разработки спецификаций. Однако есть шанс, что достоинства стандарта PCIe 5.0 помогут CXL опередить конкурентов и стать отраслевым стандартом для производителей процессоров и гетерогенных систем. Устройства на базе этой технологии помогут ускорить работу с данными в ЦОД и облаке, найдут применение в области разработки систем ИИ и HPC-решений.
Что еще почитать в нашем блоге на Хабре:

Let's block ads! (Why?)

Кандидат в президенты США предложила разделить бизнес Amazon, Google и Facebook для стимулирования конкуренции

Изображение: Unsplash

Сенатор Элизабет Уоррен, которая планирует участвовать в выборах президента США, представила подробный план по разделению бизнеса компаний Amazon, Google и Facebook. По ее мнению эти ИТ-гиганты стали слишком большими и обладают такими ресурсами, что наносят вред американской экономике и ставят под угрозу демократические ценности.

В чем смысл претензий к ИТ-гигантам


Демократ из штата Массачусетс, Элизабет Уоррен, стала не первой, кто говорит о том, что крупнейшие компании Кремниевой Долины в некоторых вопросах пытаются заменять собой правительство. Однако ее случай особенный – когда о таких проблемах говорит сенатор, который будет участвовать в выборах 2020 года – это совсем другое дело.

Суть претензий Уоррен такова – сенатор считает, что некоторые области ИТ-индустрии и сервисы стали столь важными и необходимыми, как коммунальные услуги. Как электричество и вода необходимы для выживания современного человека и должны быть доступны по адекватным ценам, которые регулируются государством. При этом, несмотря на свою цель сделать свои услуги столь же важными – об этом ранее заявляли, например, Марк Цукерберг и Джефф Безос – компании при этом не хотят столь же серьезного регулирования со стороны государства.

Суть новых предложений


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

К примеру, для Alphabet, Google – это и поисковая система и рекламная биржа. Каждое из этих направлений может быть классифицировано как “platform utilities” (сервис, сравнимый по важности с коммунальными услугами), а значит, их нужно отделить от других принадлежащих холдингу продуктов и сервисов. Более мелкие конкуренты сервисов Google неоднократно жаловались на то, что компания понижает их в своей поисковой выдаче.

В предложениях сенатора Уоррен пока не прописано, какое ведомство будет следить за исполнением новых правил, но сказано, что за их нарушение на компании можно будет подать в суд – сделать это смогут как представители властей, так и рядовые граждане. Штрафы могут составить до 5% годовой выручки компании.

Уоррен также назвала ряд недавних сделок по слиянию и поглощению, в отношении которых можно будет применить правило о разделении. В их число вошли покупка Amazon сети супермаркетов Whole Foods, поглощение WhatsApp и Instagram со стороны Facebook, сделки Google по Waze, Nest и DoubleClick

Перспективы регулирования


Аналитики называют предложения сенатора Уоррен отправной точкой в дискуссии о появлении монополий на некоторых рынках. В ходе этой дискуссии предстоит решить множество вопросов, например такой – раньше многие услуги, которые сегодня пользователи ИТ-компаний получают бесплатно, стоили им денег. Разделение компаний только из-за того, что они большие, потребителям никак не поможет, наоборот, они столкнутся с неудобствами и, возможно, финансовыми затратами, заявил президент Information Technology and Innovation Foundation Роб Аткинсон в разговоре с Bloomberg.

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

Другие материалы по теме финансов и фондового рынка от ITI Capital:


Let's block ads! (Why?)

Астрахань избавилась от порнографических QR-кодов

Министерство культуры и туризма региона Астраханской области приняло решение снять с исторических зданий таблички с QR-кодами, которые полгода вели на порносайты или предлагали знакомства в Tinder. При клике владелец устройства автоматически оформлял себе подписку стоимостью 35 рублей в сутки.

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

Сейчас идёт изготовление новых табличек, сообщила Зотеева.

Это не первый случай, когда хакеры подменяют правительственную информацию ссылками на порнографический контент. Например, в 2016 году оказался взломан интернет-портал правительства Красноярского края. В разделе «Развитие гражданского общества» на вкладке «Молодёжная политика» посетители могли увидеть контент непристойного содержания.

По теме:
«Читаем QR код»

Let's block ads! (Why?)

Google Docs — любимый чат у школьников

Как известно, текстовый редактор Google Docs допускает многопользовательскую работу, то есть несколько человек могут редактировать один документ. В том числе одновременно. Может быть кто-то не задумывался, но таким образом можно отправлять друг другу сообщения в реальном режиме времени. Если несколько человек одновременно пишут в один документ, то получается что-то вроде чата. Кроме того, есть штатный чат. Удобно также чатиться в комментариях, потому что их можно быстро удалить (принять).

Неудивительно, что Google Docs стал популярным у американских школьников: «По мере того как в средней и старшей школе у учеников всё больше ноутбуков, учителя зачастую предлагают используют Google Docs для совместных упражнений — и помогают студентам следовать плану урока. Однако сами школьники используют текстовый редактор для организации разговоров за спиной учителей», — пишет The Atlantic.
Таким образом, школьники могут общаться друг с другом прямо под носом учителя, который ничего не заподозрит, ведь ученик вроде бы работает с текстовым документом. Судя по всему, флирт в Google Docs стал очень популярным у школьников. Если вам 20, то вы уже стары для таких развлечений.


Подростки говорят, что используют Google Docs, чтобы общаться в любое время, когда приходится убрать телефон, но в то же время они знают, что друзья тоже сидят на компьютерах. Иногда они используют функцию live-chat, которая не открывается по умолчанию и о существовании которой многие учителя даже не знают. Или они пользуются тем, что Google позволяет пользователям выделять определенные фразы или слова, а затем комментировать их через всплывающее окно с правой стороны: они клонируют общий документ Google учителя, а затем общаются в комментариях, поэтому случайному зрителю кажется, что они просто делают заметки о плане урока. Если учитель подходит поближе, они могут нажать кнопку «Разрешить», и весь поток исчезнет.

Если проект не является совместным, дети просто создают общий документ, где общаются строка за строкой в том, что выглядит как абзац текста. «Люди просто сделают новую страницу и будут говорить разными шрифтами, чтобы вы знали, кто есть кто, — рассказывает Скайлер, 15-летняя девочка, которая представляется ником, как и все остальные подростки её возраста. — У меня был один очень хороший друг, и на том уроке мы были в разных классaх. Поэтому мы посылали друг другу по электронной почте документ и просто чатились о том, что происходит». В конце урока они просто удаляют документ или разрешают все комментарии.

Чат через Google Docs не просто обманывает учителей; он также обманывает родителей. Когда все входят в систему, чтобы вечером делать домашнее задание, чаты Google Docs оживают. Группы детей пишут в документе, в то время как их родители думают, что они работают над школьным проектом. Как рассказали в февральском треде Reddit, чат через Google Docs также является отличным способом обойти родительский запрет на социальные сети.

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

В ноябре 2018 года разработчики Bark (приложение для родительского контроля над использованием телефона детьми) предупредили родителей, что дети объединяются против других детей в Google Docs: «Они работают сообща, чтобы писать плохие или вредные вещи в общем документе Google. В других случаях дети создают закрытые „книги мести” и приглашают других внести свой вклад, оставляя комментарии и издевательские записи о конкретном ребёнке», — сказано в сообщении. Но по словам самих подростков, такое встречается редко. «Люди просто говорят дерьмо об учителях, или типа того, говорят о своих днях. Скучная фигня, но это единственный способ передать сообщение друг другу», — сказала Скайлер.

Если в классе не используется Google Docs, то дети находят применение любой другой программе для совместной работы, которую им рекомендуют учителя. Например, в онлайн-версии Microsoft Word есть функции, аналогичные Google Docs, и она может использоваться таким же образом. Например, в одном классе школьникам сказали пользоваться OneNote. «Поэтому мы просто рисуем картинки хайлайтером и загружаем мемы в общую папку», — рассказывает 16-летний Натан из Филадельфии. По его словам, он с одноклассниками с радостью обнаружили функциональность групповых сообщений в прошлом году, однако недостаток чатов в том, что если много болтать — работа не будет сделана.


В то время как Google Docs популярен для общения в средних и старших классах, большинство подростков отказываются от него, как только попадают в колледж, пишет The Atlantic. 20-летняя Скай из пригорода Бостона говорит, что воспоминания о чатах в Google Docs заставили её ностальгировать: «Общение в Google Docs очень напоминает то время, когда мы были моложе», — говорит она. О бумажных записках девушка вообще не вспоминает: «Я не писала таких записок с пятого класса».

Let's block ads! (Why?)

«Яндекс» будет искать пиратов при помощи робота

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

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

«Яндекс» к середине марта удалил из поиска более 100 000 ссылок, о чем рассказали представители отечественной интернет-компании. В реестре уже более 140 000 ссылок, что подтверждают сотрудники двух медиакомпаний, имеющих доступ к этому списку.

За короткое время «Яндекс» обнаружил несколько миллионов страниц с пиратским контентом, это удалось сделать именно благодаря новой программе роботу. Найдено на порядок больше страниц с нелегальным контентом, чем содержится в реестре.

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

«Это поведение социально ответственного бизнеса. Ждем, когда сможем взглянуть на новую систему», — прокомментировал ситуацию гендиректор «Централ партнершип» (ЦПШ) Вадим Верещагин. Есть и менее оптимистичные взгляды на ситуацию. К примеру, гендиректор Amediateka Дмитрий Сычугов придерживается несколько иного мнения: «Самостоятельная инициатива «Яндекса» так активно чистить поиск от пиратских ссылок выглядит удивительно. Индустрия пока не знакома с новым программным решением поисковика. Хочется его изучить».

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

Кстати, на днях министр культуры Владимир Мединский заявил, что именно из-за пиратского контента, массово размещаемого в сети Россия не может создать свои аналоги таких сервисов, Netflix и HBO.

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

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

Let's block ads! (Why?)

Настройка 802.1X на коммутаторах Cisco с помощью отказоустойчивого NPS (Windows RADIUS with AD)

image
Рассмотрим на практике использование Windows Active Directory + NPS (2 сервера для обеспечения отказоустойчивости) + стандарт 802.1x для контроля доступа и аутентификации пользователей – доменных компьютеров – устройств. Ознакомиться с теорией по стандарту можно в Wikipedia, по ссылке: IEEE 802.1X

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

Стандартных способов синхронизации конфигураций (политик) Windows NPS я не знаю, поэтому будем использовать скрипты PowerShell, запускаемые планировщиком заданий (автор мой бывший коллега). Для аутентификации компьютеров домена и для устройств, не умеющих в 802.1x (телефоны, принтеры и пр), будет настроена групповая политика и созданы группы безопасности.

В конце статьи расскажу о некоторых тонкостях работы с 802.1x – как можно использовать неуправляемые коммутаторы, dynamic ACL и пр. Поделюсь информацией об отловленных “глюках”…
Начнем с установки и настройки failover NPS on Windows Server 2012R2 (на 2016-м все аналогично): через Server Manager -> Add Roles and Features Wizard выбираем лишь Network Policy Server.

image

или с помощью PowerShell:

Install-WindowsFeature NPAS -IncludeManagementTools

Небольшое уточнение – так как для Protected EAP (PEAP) вам обязательно потребуется сертификат, подтверждающий подлинность сервера (с соответствующими правами на использование), который будет в доверенных на клиентских компьютерах, то вам скорее всего потребуется установить еще и роль Certification Authority. Но будем считать, что CA у вас уже установлен…
Сделаем тоже самое и на втором сервере. Создадим папку для скрипта C:\Scripts на обоих серверах и сетевую папку на втором сервере \\SRV2\NPS-config$

На первом сервере создадим PowerShell скрипт C:\Scripts\Export-NPS-config.ps1 со следующим содержанием:

Export-NpsConfiguration -Path "\\SRV2\NPS-config$\NPS.xml"

После этого настроим задание в Task Sheduler: “Export-NpsConfiguration
powershell -executionpolicy unrestricted -f "C:\Scripts\Export-NPS-config.ps1"

Выполнять для всех пользователей — Выполнить с наивысшими правами
Ежедневно — Повторять задачу каждые 10 мин. в течении 8 ч.

На резервном NPS настроим импорт конфигурации (политик):
создадим скрипт PowerShell:

echo Import-NpsConfiguration -Path "c:\NPS-config\NPS.xml" >> C:\Scripts\Import-NPS-config.ps1

и задачу на его выполнение каждые 10 минут:
powershell -executionpolicy unrestricted -f "C:\Scripts\Import-NPS-config.ps1"

Выполнять для всех пользователей — Выполнить с наивысшими правами
Ежедневно — Повторять задачу каждые 10 мин. в течении 8 ч.

Теперь, для проверки, добавим в NPS на одном из серверов(!) пару коммутаторов в RADIUS-клиенты (IP и Shared Secret), две политики запросов на подключение: WIRED-Connect (Условие: “Тип порта NAS – Ethernet”) и WiFi-Enterprise (Условие: “Тип порта NAS – IEEE 802.11”), а также сетевую политику Access Cisco Network Devices (Network Admins):

Условия:
Группы Windows - domain\sg-network-admins
Ограничения:
Методы проверки подлинности - Проверка открытым текстом (PAP, SPAP)
Параметры:
Атрибуты RADIUS: Стандарт - Service-Type - Login
Зависящие от поставщика - Cisco-AV-Pair - Cisco - shell:priv-lvl=15
Со стороны коммутаторов следующие настройки:
aaa new-model
aaa local authentication attempts max-fail 5
!
!
aaa group server radius NPS
 server-private 192.168.38.151 auth-port 1812 acct-port 1813 key %shared_secret%
 server-private 192.168.10.151 auth-port 1812 acct-port 1813 key %shared_secret%
!
aaa authentication login default group NPS local
aaa authentication dot1x default group NPS
aaa authorization console
aaa authorization exec default group NPS local if-authenticated
aaa authorization network default group NPS
!
aaa session-id common
!
identity profile default
!
dot1x system-auth-control
!
!
line vty 0 4
 exec-timeout 5 0
 transport input ssh
 escape-character 99
line vty 5 15
 exec-timeout 5 0
 logging synchronous
 transport input ssh
 escape-character 99


После настройки, спустя 10 минут, все клиенты\политики\параметры должны появиться и на резервном NPS и мы сможем авторизоваться на коммутаторах с помощью учетной записи ActiveDirectory, члена группы domain\sg-network-admins (которую мы создали заранее).

Перейдем к настройке Active Directory – создадим групповую и парольную политики, создадим необходимые группы.

Групповая политика Computers-8021x-Settings:

Computer Configuration (Enabled)
   Policies
     Windows Settings
        Security Settings
          System Services
     Wired AutoConfig (Startup Mode: Automatic)
Wired Network (802.3) Policies

NPS-802-1x
Name       NPS-802-1x
Description     802.1x
Global Settings
SETTING VALUE
Use Windows wired LAN network services for clients      Enabled
Shared user credentials for network authentication      Enabled
Network Profile
Security Settings
Enable use of IEEE 802.1X authentication for network access     Enabled
Enforce use of IEEE 802.1X authentication for network access    Disabled
IEEE 802.1X Settings
Computer Authentication Computer only
Maximum Authentication Failures 10
Maximum EAPOL-Start Messages Sent        
Held Period (seconds)    
Start Period (seconds)   
Authentication Period (seconds)  
Network Authentication Method Properties
Authentication method   Protected EAP (PEAP)
Validate server certificate     Enabled
Connect to these servers         
Do not prompt user to authorize new servers or trusted certification authorities        Disabled
Enable fast reconnect   Enabled
Disconnect if server does not present cryptobinding TLV Disabled
Enforce network access protection       Disabled
Authentication Method Configuration
Authentication method   Secured password (EAP-MSCHAP v2)
Automatically use my Windows logon name and password(and domain if any) Enabled


NPS-802-1x_AD-Policy

Создадим группу безопасности sg-computers-8021x-vl100, куда мы будем добавлять компьютеры, которые мы хотим распределять в влан 100 и настроим фильтрацию для созданной ранее групповой политики на эту группу:

802.1x-Authentication-GPO-Filtering

Убедиться в том, что политика успешно отработала можно открыв “Центр управления сетями и общим доступом (Параметры сети и Интернет) – Изменение параметров адаптера (Настройка параметров адаптера) – Свойства адаптера”, где мы сможем увидеть вкладку “Проверка подлинности”:

Проверка подлинности сетевого доступа для адаптера Ethernet

Когда убедились, что политика успешно применяется – можно переходить к настройке сетевой политики на NPS и портов коммутатора уровня доступа.

Создадим сетевую политику neag-computers-8021x-vl100:

Conditions:
  Windows Groups - sg-computers-8021x-vl100
  NAS Port Type - Ethernet
Constraints:
  Authentication Methods - Microsoft: Protected EAP (PEAP) - Unencrypted authentication (PAP, SPAP)
  NAS Port Type - Ethernet
Settings:
  Standard:
   Framed-MTU 1344
   TunnelMediumType 802 (includes all 802 media plus Ethernet canonical format)
   TunnelPrivateGroupId  100
   TunnelType  Virtual LANs (VLAN)

802.1x Authentication Network Policy

Типовые настройки для порта коммутатора (обращаю внимание, что используется тип аутентификации “мультидомен” – Data & Voice, а также есть возможность аутентификации по mac адресу. на время “переходного периода” есть смысл использовать в параметрах:


authentication event fail action authorize vlan 100
authentication event no-response action authorize vlan 100


влан id не “карантинного”, а того же, куда пользовательский компьютер должен попасть, успешно авторизовавшись – пока не убедимся, что все работает как следует. Эти же параметры могут быть использованы и в других сценариях, например, когда в этот порт воткнут неуправляемый коммутатор и вы хотите, чтобы все устройства, подключенные в него и не прошедшие аутентификацию, попадали в определенный влан (“карантинный”).
настройки порта коммутатора в режиме 802.1x host-mode multi-domain
default int range Gi1/0/39-41
int range Gi1/0/39-41
shu
des PC-IPhone_802.1x
switchport mode access
switchport nonegotiate
switchport voice vlan 55
switchport port-security maximum 2
authentication event fail action authorize vlan 100
authentication event no-response action authorize vlan 100
authentication host-mode multi-domain
authentication port-control auto
authentication violation restrict
mab
dot1x pae authenticator
dot1x timeout quiet-period 15
dot1x timeout tx-period 3
storm-control broadcast level pps 100
storm-control multicast level pps 110
no vtp
lldp receive
lldp transmit
spanning-tree portfast
no shu
exit


Убедиться, что компьютер\телефон успешно прошли аутентификацию можно командой:
sh authentication sessions int Gi1/0/39 det

Теперь создадим группу (например, sg-fgpp-mab ) в Active Directory для телефонов и добавим в нее один аппарат для тестов (в моем случае это Grandstream GXP2160 с мас-адресом 000b.82ba.a7b1 и соотв. учетной записью domain\000b82baa7b1).

Для созданной группы понизим требования парольной политики (используя Fine-Grained Password Policies через Active Directory Administrative Center -> domain -> System -> Password Settings Container) с такими параметрами Password-Settings-for-MAB:

Fine-Grained Password Policies (FGPP) for MAB devices

тем самым разрешим использовать мас-адрес устройств в качестве паролей. После этого мы сможем создать сетевую политику для аутентификации 802.1x method mab, назовем ее neag-devices-8021x-voice. Параметры следующие:

  • NAS Port Type – Ethernet
  • Windows Groups – sg-fgpp-mab
  • EAP Types: Unencrypted authentication (PAP, SPAP)
  • RADIUS Attributes – Vendor Specific: Cisco – Cisco-AV-Pair – Attribute value: device-traffic-class=voice

после успешной аутентификации (не забываем настроить порт коммутатора), посмотрим информацию с порта:
sh authentication se int Gi1/0/34
----------------------------------------
            Interface:  GigabitEthernet1/0/34
          MAC Address:  000b.82ba.a7b1
           IP Address:  172.29.31.89
            User-Name:  000b82baa7b1
               Status:  Authz Success
               Domain:  VOICE
       Oper host mode:  multi-domain
     Oper control dir:  both
        Authorized By:  Authentication Server
      Session timeout:  N/A
         Idle timeout:  N/A
    Common Session ID:  0000000000000EB2000B8C5E
      Acct Session ID:  0x00000134
               Handle:  0xCE000EB3

Runnable methods list:
       Method   State
       dot1x    Failed over
       mab      Authc Success


Теперь, как и обещал рассмотрим пару не совсем очевидных ситуаций. Например, нам требуется подключить компьютеры\устройства пользователей через неуправляемый коммутатор (свитч). В этом случае настройки порта для него будут выглядеть следующим образом:
настройки порта коммутатора в режиме 802.1x host-mode multi-auth
interface GigabitEthernet1/0/1
description *SW – 802.1x – 8 mac*
shu
switchport mode access
switchport nonegotiate
switchport voice vlan 55
switchport port-security maximum 8  ! увеличиваем кол-во допустимых мас-адресов
authentication event fail action authorize vlan 100
authentication event no-response action authorize vlan 100
authentication host-mode multi-auth  ! – режим аутентификации
authentication port-control auto
authentication violation restrict
mab
dot1x pae authenticator
dot1x timeout quiet-period 15
dot1x timeout tx-period 3
storm-control broadcast level pps 100
storm-control multicast level pps 110
no vtp
spanning-tree portfast
no shu


P.S. замечен очень странный глюк – если устройство было подключено через такой свитч, а потом его воткнули в управляемый коммутатор, то оно НЕ заработает, пока мы не перезагрузим(!) свитч Пока других способов решения этой проблемы не нашел.

Еще один момент, связанный с DHCP (если используется ip dhcp snooping) – без таких вот опций:

ip dhcp snooping vlan 1-100
no ip dhcp snooping information option

почему-то корректно ip адрес не получить…хотя может это особенность нашего DHCP сервера

А еще Mac OS & Linux (в которых поддержка 802.1x нативная) пытаются пройти аутентификацию пользователем, даже если настроена аутентификация по мас-адресу.

В следующей части статьи рассмотрим применение 802.1x для Wireless (в зависимости от группы, в которую входит учетная запись пользователя, его будем “закидывать” в соответствующую сеть (влан), хотя подключаться они будут к одному SSID).

Let's block ads! (Why?)