git-ssb — децентрализованный хостинг git-репозиториев

SSB (Secure Scuttlebutt) — это децентрализованная социальная сеть и протокол, на основе которого она работает. git-ssb заворачивает обычные git-репозитории в этот протокол. SSB хочет заменить собой Facebook, а git-ssb — GitHub. Под катом — краткое руководство по git-ssb. Актуально для тех, кому дискомфортна сама идея использования централизованных сервисов в качестве посредника. Своеобразная красная таблетка с полагающимися в этом случае неожиданными последствиями.

Secure Scuttlebutt

Протокол SSB описывает правила синхронизации ваших данных между заинтересованными в них узлами сети. Ваши данные — это история ваших действий в сети, связный список json-объектов. Связь задаётся hash-суммой предыдущего объекта (как в блокчейне). Таким образом, однажды опубликованные объекты неизменяемы и неудаляемы. Добавлять можно только в конец списка. Типичный use case предполагает, что каждый объект в списке — это пост или комментарий в блоге. Картинки и другие тяжёлые объекты хранятся вне списка в виде blob-ов и реплицируются отдельно. Объекты в списке могут на них ссылаться.

Большинство пользователей сети ведут блоги в приложениях Patchwork и Manyverse. Приложений для ведения блогов около десятка, они, в основном, совместимы друг с другом и отличаются интерфейсом. Кроме этого есть шахматы, чат, менеджер пакетов (ssb-npm) и git (git-ssb). Некоторые разработчики SSB используют git-ssb как основной сервис для управления версиями исходников. Мы тоже попробуем.

Установите ssb-server и git-ssb

ssb-server нужен для синхронизации с другими узлами в p2p сети. Он должен быть запущен, когда вы делаете push, pull, fetch, создаёте pull-request или форкаете репозиторий.

Пакет git-ssb включает:

  • программу для управления репозиториями (git-ssb)

  • git-remote-helper, который понимает адреса, начинающиеся с ssb://

  • web-интерфейс, отдалённо напоминающий GitHub

Все три компонента взаимодействуют с запущенным на вашей машине ssb-server.

$ sudo apt install git nodejs npm $ npm install ssb-server git-ssb

ssb-server и git-ssb установятся в папку $HOME/node_modules. Чтобы было удобнее их вызывать, добавьте в конец файла ~/.profile стоки:

if [ -d "$HOME/node_modules/.bin/" ] ; then     PATH="$HOME/node_modules/.bin/:$PATH" fi

Чтобы переменная $PATH обновилась в текущей сессии, наберите

$ source ~/.profile

При логине файл ~/.profile должен исполниться автоматически. Некоторые среды рабочего стола (например, Xfce) этого не делают. Если после перезагрузки переменная $PATH не обновилась, то добавьте в .xsessionrc явный вызов ~/.profile:

. ~/.profile

Запустите ssb-server и оставьте его работающим на время экспериментов.

$ ssb-server start

При первом запуске он создаст identity по умолчанию в папке ~/.ssb.

Получите инвайт и примите его

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

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

$ ssb-server invite.accept <ваш-инвайт-код>

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

Подпишитесь на @cel

@cel — это разработчик git-ssb.

$ ssb-server publish --type contact --contact "@f/6sQ6d2CMxRUhLpspgGIulDxDCwYD7DzFzPNr7u5AU=.ed25519" --following

Сейчас в папку ~/.ssb скачается около 1Gb данных — это его история (там и его git-репозитории) и истории тех пользователей, на которых он подписан. Эта подписка нужна, чтобы последующие примеры у всех работали примерно одинаково.

Установка и настройка завершены. Теперь вы многое можете:

Запустить web-интерфейс

$ git-ssb-web

Перейдя по напечатанной в консоли ссылке вы увидите хронологический список коммитов, issue и других действий в видимых репозиториях. Это, разумеется, не всё, а только то, что скачалось после подписки на предыдущем шаге. Нажав на имя пользователя вы увидите его activity log, нажав на репозиторий — интерфейс, похожий на GitHub.

Репозиторий git-ssb в git-ssb
Репозиторий git-ssb в git-ssb

Все ваши действия в web-интерфейсе (например, комментарий, создание issue или форка) запишутся в вашу историю и уйдут вашим подписчикам при синхронизации. Если вы в данный момент отключены от сети, то этот интерфейс будет продолжать работать: репозитории будут форкаться, issue создаваться и т.д.. ssb-server работает (вы же его ещё не выключили) и отправит все ваши изменения как только сеть появится.

Создать репозиторий

$ mkdir my-new-repo $ cd my-new-repo $ git init Initialized empty Git repository in /tmp/my-new-repo/.git/  $ git-ssb create ssb my-new-repo Created repo: ssb://<hash-code>.sha256 (my-new-repo) Added remote: ssb  $ git remote -v ssb    ssb://<hash-code>.sha256 (fetch) ssb    ssb://<hash-code>.sha256 (push)

К привычному git init добавилась команда git-ssb create ssb my-new-repo, которая запишет в вашу историю факт создания нового репозитория с именем my-new-repo и добавит его URL в качестве remote с именем ssb. Аналогичным образом можно добавить такой remote к любому существующему репозиторию.

Запушить существующий репозиторий

Вы добавили ssb ссылку в качестве дополнительного remote к вашему репозиторию. Теперь можно пушить.

Важно: невозможно удалить что-то из SSB. Не ставьте эксперименты на чувствительных данных.

$ git push ssb master

Если репозиторий большой, то может не получиться. В git-ssb допустимый размер pack-файла зависит от максимального размера blob, а он ограничен 5Mb. Больший размер сеть не примет. Но закоммитить, тем не менее, возможно:

$ git push ssb master -o allow-big

Это не сделает вашу историю невалидной (blob синхронизируются отдельно от истории), но скачать большой pack-файл другие пользователи не смогут, пока не увеличат у себя в настройках максимальный размер blob.

Альтернативный способ вписаться в ограничение на размер pack-файла — это пушить небольшими порциями так, чтобы создаваемые git-ом pack-файлы не превышали 5Mb.

Клонировать репозиторий

Будем ставить эксперименты с git-ssb на репозитории git-ssb. В SSB нет DNS и красивых названий чего бы то ни было. Ссылку на репозиторий ssb://%n92DiQh7ietE+R+X/I403LQoyf2DtR3WQfCkDKlheQU=.sha256 я скопировал из web-интерфейса.

$ git clone ssb://%n92DiQh7ietE+R+X/I403LQoyf2DtR3WQfCkDKlheQU=.sha256 git-ssb $ cd git-ssb $ git remote -v origin    ssb://%n92DiQh7ietE+R+X/I403LQoyf2DtR3WQfCkDKlheQU=.sha256 (fetch) origin    ssb://%n92DiQh7ietE+R+X/I403LQoyf2DtR3WQfCkDKlheQU=.sha256 (push)

В этом репозитории у нас единственный remote, и он из SSB.

Форкнуть репозиторий

$ git-ssb fork my-fork Created repo: ssb://<new-hash-code>.sha256 (git-ssb) Added remote: my-fork $ git remote -v my-fork    ssb://<new-hash-code>.sha256 (fetch) my-fork    ssb://<new-hash-code>.sha256 (push) origin    ssb://%n92DiQh7ietE+R+X/I403LQoyf2DtR3WQfCkDKlheQU=.sha256 (fetch) origin    ssb://%n92DiQh7ietE+R+X/I403LQoyf2DtR3WQfCkDKlheQU=.sha256 (push)

В вашей истории появится запись о создании нового репозитория, а в текущей папке добавится новый remote.

Сделать пулл-реквест

Вы внесли изменения и сделали коммит.

$ git-ssb pull-request

Откроется текстовый редактор, вы напишете описание ваших изменений. После сохранения распечатается новый объект, добавленный в вашу историю.

Пушить в чужой репозиторий

Это не баг, а фича. Согласно документации (git-ssb-intro), это одна из принятых моделей совместной работы. Вы создаёте в чужом репозитории ветку с именем @ваш-юзернейм/master (git checkout -b @ваш-юзернейм/master), пушите в неё (git push ssb), а после делаете пулл-реквест (git ssb pull-request). Но ничто не помешает вам запушить прямо в master без всяких пулл-реквестов.

Возможность асинхронного внесения изменений в одну ветку может привести к конфликту, если при помощи двух разных identity (про identity — см. ниже) были созданы два конкурирующих коммита. Когда git-ssb встречает такие ситуации, он просит пользователя сделать слияние этих альтернативных версий. Всё это происходит локально на вашем компьютере. Если вы не подписаны на ту другую identity, которая пушит в ваш репозиторий, то вы не увидите никакого конфликта. Другие же пользователи, которые на неё подписаны, увидят. Таким образом, один и тот же репозиторий будет выглядеть по-разному в зависимости от того, чьи обновления вы получаете.

Identity задаётся закрытым ключом в файле ~/.$ssb_appname/secret. Если переменная ssb_appname не задана, то будет использована identity по умолчанию (~/.ssb). Если в указанном месте нет файла secret, то ssb-server его создаст со случайным ключом.

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

С другой стороны, это может привести к распространению вредоносного кода: вы делаете что-то полезное, все об этом знают, клонируют и делают sudo make install не глядя в историю коммитов. У одних пользователей установится ваше приложение, а у других — ваше приложение с добавлением зловреда. Возможно, что даже вы сами не увидите, что после очередного git pull у вас появились чужие коммиты. Тогда зловред придёт к каждому, в том числе и к вам.

Обсуждение этой возможности внутри SSB.

Что ещё почитать?

git-ssb-intro: a guide to hacking together on the distributed web

Другие способы децентрализации git:

  • GitTorrent (на основе BitTorrent)

  • HyperGit (на основе Dat)

  • igis-remote (на основе IPFS)

  • ipld-remote (на основе IPFS)

  • GitCenter (на основе ZeroNet)

  • Mango (Ethereum + IPFS)

  • Radicle

  • Gitopia

Первые четыре подробно проанализированы в статье Daniel Aleksandersen «Four P2P distribution tools for Git repositories compared«. К ней есть комментарии разработчиков SSB.

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

Картинка в шапке сгенерирована при помощи сервиса myoctocat.com.

ссылка на оригинал статьи https://habr.com/ru/post/537678/

ОПАСНЫЕ МИФЫ О КЛЕЩАХ

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

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

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

Публикация с мифом
Публикация с мифом

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

Итак, иксодовые клещи являются высокоспециализированными облигатными кровососами, паразитирующие, за небольшим исключением, во всех фазах развития на наземных позвоночных животных. Нападают на хозяев периодически. Ядовитых желёз они не имеют. Однако постоянных паразитов среди них нет. Питаются данные клещи только кровью и лимфой. Свободных жидкостей как правило не принимают. [3] Питание происходит за счёт хоботка, который в свою очередь приспособлен не только для приёма пищи, но и для присасывания и удерживания на хозяине в период кровососания. Он состоит из основания, парных хелицер, щупиков педипальп (пальпы), и непарного гипостома — длинного и массивного выроста, образованного из области несущего органа ротового аппарата (гнатосомы), который покрыт обратно направленными зубчиками. Перед тем как начать есть, клещ внедряет свой хоботок в кожные покровы хозяина, который раскладывается в коже как гарпун. Процесс этот протекает сравнительно медленно, а именно путём последовательного прорезания покровов хелицерами и введения в ранку гипостома, который намертво закрепляется там для ввода в ранку слюны.

a)- хоботок со спинной стороныб) хоботок с брюшной стороны1)-основание хоботка2)-пальпы3) гипостом (часть гнатосомы)4) футляры хелицер5) поровые поля6) спинные корнуа
a)- хоботок со спинной стороныб) хоботок с брюшной стороны1)-основание хоботка2)-пальпы3) гипостом (часть гнатосомы)4) футляры хелицер5) поровые поля6) спинные корнуа

Слюна клещей рода ixodes практически не содержит токсинов, а напротив, как это не парадоксально звучало, она содержит белки, которые можно использовать для лечения потенциально смертельных болезней сердца. [4]
Белки в слюне необходимы также для обезболивания места укуса, и для увеличения проницаемости стенок кровеносных сосудов, с целью предотвращения свёртываемости крови, и в тоже время снятия воспаления, что помогает клещу сосать кровь в течение нескольких недель. [5][6]
Помимо этого, слюна клеща способна участвовать в образовании цементного футляра вокруг хоботка [6], что косвенно указывает на сложность изъятия целого клеща из ранки после длительного присасывания клеща к хозяину.

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

Из этого следует, что удаление клеща невредимым с помощью шприца, банок или других подручных материалов может быть эффективным, если клещ присосался сравнительно недавно, когда он только успел прокусить кожу и не ввёл свой хоботок глубоко в ранку, в иных случаях, все эти действия вероятно могут быть бесполезны, и уж тем более не будут являться гарантом безопасности от боррелиозов, риккетсиозов, энцефалитов и других клещевых инфекций. Тем более не спасёт от вирусов и обработка ранки хлоргексином, поскольку данный антисептик предназначен для защиты от бактерий [8], а доказательных данных по поводу использования антисептиков в процентом соотношении спиртосодержащих веществ ниже 60% на данный момент не обнаружено. [9];[10]
Единственное, что можно добиться втиранием хлоргексина в ранку, это увеличения риска заразиться клещевыми инфекциями при втирании вируса в кожные и около кожные покровы. [11]

И напоследок. Инкубационный период различных инфекций, передаваемых иксодовыми клещами длится в среднем от нескольких часов до 21 дня. Далеко не факт, что удаленный клещ с кожных покровов присосался 5 минут назад, а не несколько часов назад. Возможно укусить могла и нимфа, которую трудно заметить, поэтому удаленных самостоятельно эктопаразитов обязательно следует сдать в специализированные учреждения, и ждать ответа анализов. Пока результаты не станут известны, необходимо мерить температуру утром и вечером, а при подъёме температуры сразу обращаться к врачу. Основной аргумент — это факт посещения леса. Внимательно осматривайте кожные покровы по всему телу, если будет покраснение в любом месте, это может быть эритемой, т.е. симптомом клещевого боррелиоза. [12];[13].

Эритема
Эритема

Следовательно при обнаружении необходимо сразу обратиться к врачу. Берегите себя и своих близких. Проверяйте информацию и не верьте недостоверным источникам! Материал написан мной весной 2020 года и был опубликован в паблике Фанерозой https://vk.com/phanerozoi

Список используемых источников:
1) www.vk.com/wall-185828235273

2) Ссылка на миф: https://vk.com/wall-34229261497960

3) Руководство по медицинской энтомологии. Под редакцией проф.В.П. Дербенеевой-Уховой. Издание Москва «Медицина». 1974 год. Стр. -243.

4) www.cardioprogress.ru/ru/news/kleshh-vyilechit-serdcz..

5) www.nature.com/articles/s41598-017-04378-1

6) Руководство по медицинской энтомологии. Под редакцией проф.В.П. Дербенеевой-Уховой. Издание Москва «Медицина». 1974 год. Стр. -247.

7) Руководство по медицинской энтомологии. Под редакцией проф.В.П. Дербенеевой-Уховой. Издание Москва «Медицина». 1974 год. Стр.-254, 255.

8) www.aif.ru/health/coronavirus/unichtozhaetlihlorgek..

9) www.ncbi.nlm.nih.gov/pmc/articles/PMC3291447/

10) www.ncbi.nlm.nih.gov/pubmed/18207605

11) https://www.rospotrebnadzor.ru/activities/recommendat..

12) www.webcitation.org/669cxo4a6?ur

13) www.citilab.ru/articles/nauka/kleshe…-(bolezn-laima).aspxэ

ссылка на оригинал статьи https://habr.com/ru/post/537680/

Перевод числа в строку с помощью FPU

Введение

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

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

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

Формализуем задачу. Необходимо перевести восьмибайтовое число из формата IEEE-754 в текстовую строку, где указан знак числа, мантисса заданной длины и десятичный порядок с признаком «E» и своим знаком.

Так, если задано число 1234.567890, то строка с мантиссой, например, в 16 знаков должна выглядеть как « 1.23456788999999E+003». Вместо плюса у мантиссы нужно писать пробел, а сама мантисса должна быть не меньше единицы. Кстати, данный пример иллюстрирует дискретность и приближенность представления чисел в формате IEEE-754: приведенное исходное число не может быть точно представлено как «1.23456789000000E+003», что, может быть, интуитивно ожидалось.

Использование команд FPU для преобразования

На первый взгляд, решение выглядит простым. В устройстве FPU (Floating Point Unit) процессора даже имеются команды, явно предназначенные и для перевода чисел из формата IEEE-754 в текст. Это, во-первых, команда EXTRACT разделения числа на мантиссу и порядок, а во-вторых, команда FBSTP выдающая мантиссу сразу в виде двоично-десятичного значения. Однако при ближайшем рассмотрении эти команды не дают нужного результата.

Например, если применить команду FBSTP к указанному выше числу, то получится 10 байт со значением 35 12 00 00 00 00 00 00 00 00, поскольку нецелочисленные значения сначала округляются согласно полю RC управляющего слова FPU. Это двухбитовое поле RC может принимать 4 значения, но среди них нет режима «отключить округление». Поэтому часть мантиссы просто теряется, единственное чего можно добиться режимами округления – это еще получить значение 34 12 при округлении к меньшему.

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

Итак, при использовании возможностей FPU придется решать две задачи.

Во-первых, умножением (или делением) исходного числа на десять нужно «перегнать» всю мантиссу в целочисленную часть числа, тогда команда FBSTP выдаст, наконец, в двоично-десятичном виде все цифры мантиссы.

Во-вторых, нужно определить такой десятичный порядок (опять-таки умножением или делением на десять), при котором результат попадет в диапазон между 1 и 10. Это нужно для представления числа в виде мантиссы с одной цифрой перед точкой и найденным порядком. Увы, совместить эти две задачи в едином цикле умножения/деления невозможно.

Причем есть и «подводный камень» в виде значения числа, максимально приближенного к единице, но не равного единице. Циклом деления или умножения легко можно ошибиться в показателе степени и вместо требуемого в данном случае 9.999…E-001 получить неправильное значение типа 9.999…E+000. К сожалению, при всем богатстве команд FPU обойтись без циклов деления и умножения на десять не удается.

Алгоритм преобразования

При формировании мантиссы для числа типа «double» умножение или деление на 10 продолжаются до тех пор, пока двоичный порядок числа не достигнет (или не станет больше/меньше) 53, поскольку под мантиссу выделено именно 53 двоичных разряда.

При формировании десятичного порядка для числа типа «double» умножение или деление на 10 продолжаются до тех пор, пока двоичный порядок разницы числа и 1 не достигнет (или не станет больше/меньше) -53, что означает максимальное приближение к 1. При этом необходимо еще отслеживать частный случай ближайшего к 1 значения из одних девяток, поскольку цикл умножения или деления в этом случае дает одну «лишнюю» или одну «недостающую» степень.

Пример реализации преобразования

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

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

В частности здесь используются «временные» метки в виде символа «@». Алгоритм их реализации следующий: транслятор имеет внутренний счетчик меток. Когда метка «@» встречается в команде перехода, к ней автоматически дописывается значение этого счетчика (т.е. реально создаются метки @0000, @0001 и т.д.). Когда встречается символ «@» с двоеточием, к нему также автоматически приписывается значение счетчика и после этого счетчик увеличивается на 1.

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

Кроме этого, для команд FPU в RASM не анализируется размер операнда, он имеется прямо в названиях команд в виде значений 16, 32, 64 или 80.

Но вернемся к задаче. Подпрограмме по адресу в EBX передается исходное восьмибайтовое число в формате IEEE-754 и требуемая длина текстовой строки-результата в AL.

В результате работы число записывается в стек в виде текста в «научной» нотации и в AL сохраняется длина этой строки. Другие регистры не сохраняются.

С целью разгрузить конвейеры процессора некоторые команды «рассыпаны» по тексту и не образуют непрерывных логических цепочек, что несколько затрудняет чтение текста. Но таких мест немного. Программа реентерабельна и может быть использована в параллельных вычислениях. При начале работы программы управляющее слово FPU CW=0360.

  1. Сначала в стеке выделяется место для ответа и заполняется «нулевым» шаблоном, т.е. значением « 0.000… E+000».

  2. Затем проверяется знак числа и в зависимости от него формируется мантисса умножением или делением числа на десять.

  3. Командой FBSTP мантисса переписывается в память из FPU в двоично-десятичном виде и ее часть (заданной длины) переносится в ответ.

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

      CSEG PUBLIC ?QFCMW:  ;---- ПОДГОТОВКА МЕСТА В СТЕКЕ ----        MOVZX     ECX,AL          ;ЗАДАННАЯ ДЛИНА СТРОКИ       POP       EAX             ;ДОСТАЛИ АДРЕС ВОЗВРАТА       SUB       ESP,ECX         ;ВЫДЕЛИЛИ МЕСТО В СТЕКЕ       MOV       EDI,ESP         ;ОНО ЖЕ НАЧАЛО СТРОКИ-РЕЗУЛЬТАТА       MOV       ESI,ESP         ;ЗАПОМНИЛИ НАЧАЛО       PUSH      EAX             ;АДРЕС ВОЗВРАТА ВЕРНУЛИ НА МЕСТО       PUSH      ECX             ;ЗАПОМНИЛИ ЗАДАННУЮ ДЛИНУ ОТВЕТА  ;---- СНАЧАЛА ЗАПОЛНЕНИЕ СТРОКИ-РЕЗУЛЬТАТА НУЛЕВЫМ ШАБЛОНОМ ----        MOV       EAX,'0.0 '      ;ЗНАК И ПЕРВОЕ ЧИСЛО С ТОЧКОЙ       STOSD       DEC       EDI             ;ОСТАВЛЯЕМ ПЕРВЫЕ ТРИ СИМВОЛА ШАБЛОНА       SUB       CL,8            ;ВЫЧЛИ СЛУЖЕБНЫЕ ЗНАКИ И ПОРЯДОК       MOV       AL,'0'       JBE       @               ;ОШИБКА, НЕТ МЕСТА ПОД МАНТИССУ       REP       STOSB           ;ЗАПОЛНИЛИ МАНТИССУ НУЛЯМИ @:    MOV       EAX,'00+E'      ;ПОКА ДВА НУЛЯ ПОРЯДКА       STOSD                     ;ЗАПИСАЛИ НУЛЕВОЙ ПОРЯДОК       LEA       EBP,[EDI]-2     ;ЗАПОМНИЛИ АДРЕС ПОРЯДКА       FLD64     [EBX]           ;ЗАГРУЗИЛИ ЗАДАННОЕ ЧИСЛО       MOV       B PTR [EDI],'0' ;ПОКА ТРЕТИЙ НУЛЬ ПОРЯДКА  ;---- ПРОВЕРКА ЗАДАННОГО ЧИСЛА НА ПЛЮС/МИНУС/НОЛЬ ----        FTST                      ;СРАВНИЛИ С НУЛЕМ       FNSTSW    AX       SAHF       JNZ       @               ;ЗАДАННОЕ ЧИСЛО НЕ НОЛЬ  ;---- СРАЗУ ВЫХОД С ЧИСТЫМ НУЛЕМ ----        POP       EAX             ;ВЫХОД С ЗАДАННОЙ ДЛИНОЙ И НУЛЕМ       FSTP      ST              ;ОЧИСТИЛИ FPU ОТ ИСХОДНОГО ЧИСЛА       RET  ;---- ОБРАБОТКА ЗНАКА ЗАДАННОГО ЧИСЛА ----  @:    JNB       @               ;ЕСЛИ ЧИСЛО ПОЛОЖИТЕЛЬНО       MOV       B PTR [ESI],'-' ;ОТМЕТИЛИ ЗНАК ОТРИЦАТЕЛЬНОГО       FABS                      ;УБРАЛИ ЗНАК В САМОМ ЧИСЛЕ @:    MOV       EDX,OFFSET ДЕСЯТЬ ;ДЕСЯТИЧНАЯ СИСТЕМА  ;---- ПРОВЕРКА ВЕЛИЧИНЫ ПОРЯДКА ИСХОДНОГО ЧИСЛА ----        FLD       ST              ;РАЗМНОЖИЛИ ПОЛОЖИТЕЛЬНОЕ ЧИСЛО       POP       ECX             ;ОПЯТЬ ДОСТАЛИ ДЛИНУ СТРОКИ       FXTRACT                   ;РАЗДЕЛИЛИ МАНТИССУ И ПОРЯДОК       PUSH      ECX             ;ОПЯТЬ СОХРАНИЛИ ДЛИНУ СТРОКИ       FSTP      ST              ;ВЫКИНУЛИ МАНТИССУ       SUB       ESP,11          ;ВЫДЕЛИЛИ МЕСТО ПОД МАНТИССУ КАК BCD       FIST32P   [ESP]           ;ЗАПИСАЛИ ПОРЯДОК       CMP       D PTR [ESP],53  ;ОН УЖЕ 53 РАЗРЯДА ?       JE        M0003           ;ТОГДА МАНТИССА УЖЕ ГОТОВА       JL        M0002           ;ИНАЧЕ ЧИСЛО ОЧЕНЬ МАЛО  ;---- УМЕНЬШЕНИЕ ПОРЯДКА ЧИСЛА ОТ ОЧЕНЬ БОЛЬШОГО ----  M0001:FLD       ST              ;РАЗМНОЖИЛИ ЧИСЛО       FXTRACT                   ;РАЗДЕЛИЛИ МАНТИССУ И ПОРЯДОК       FSTP      ST              ;ВЫКИНУЛИ МАНТИССУ       FIST32P   [ESP]           ;ДОСТАЛИ ПОРЯДОК       CMP       D PTR [ESP],53  ;УЖЕ 53 РАЗРЯДА ?       JLE       M0003           ;ТОГДА МАНТИССА УЖЕ ГОТОВА       FIDIV16   [EDX]           ;РАЗДЕЛИЛИ ЧИСЛО НА ДЕСЯТЬ       JMPS      M0001           ;ПРОВЕРЯЕМ НОВЫЙ ПОРЯДОК  ;---- УВЕЛИЧЕНИЕ ПОРЯДКА ЧИСЛА ОТ ОЧЕНЬ МАЛОГО ----  M0002:FLD       ST              ;РАЗМНОЖИЛИ ЧИСЛО       FXTRACT                   ;РАЗДЕЛИЛИ МАНТИССУ И ПОРЯДОК       FSTP      ST              ;ВЫКИНУЛИ МАНТИССУ       FIST32P   [ESP]           ;ДОСТАЛИ ПОРЯДОК       CMP       D PTR [ESP],53  ;УЖЕ 53 РАЗРЯДА ?       JGE       M0003           ;ТОГДА МАНТИССА УЖЕ ГОТОВА       FIMUL16   [EDX]           ;УМНОЖИЛИ ЧИСЛО НА 10       JMPS      M0002           ;ПРОВЕРЯЕМ НОВЫЙ ПОРЯДОК  ;---- ВЫДАЧА МАНТИССЫ В ДВОИЧНО-ДЕСЯТИЧНОМ ВИДЕ ----  M0003:FBSTP     [ESP]+1         ;ЗАПОМНИЛИ МАНТИССУ КАК BCD-ФОРМАТ  ;---- ФОРМИРОВАНИЕ ТЕКСТА ИЗ BCD-МАНТИССЫ ----        LEA       EDI,[ESI]+1     ;АДРЕС ОТВЕТА ПОСЛЕ ЗНАКА       FLD1                      ;ЗАГРУЗИЛИ КОНСТАНТУ 1E0       SUB       CL,7            ;ЗАДАННАЯ ДЛИНА МАНТИССЫ В ОТВЕТЕ       FLD64     [EBX]           ;ОПЯТЬ ЗАГРУЗИЛИ ИСХОДНОЕ ЧИСЛО       LEA       ESI,[ESP]+10    ;АДРЕС ПЕРВЫХ ЦИФР МАНТИССЫ        STD       MOV       DH,0            ;ПОКА НУЛИ НЕ ПИШЕМ       FABS                      ;ЗНАК ИСХОДНОГО ЧИСЛА БОЛЬШЕ НЕ НУЖЕН       MOV       AH,0            ;НАЧИНАЕМ С ЧЕТНОЙ ТЕТРАДЫ       FCOM                      ;ЗАРАНЕЕ СРАВНИВАЕМ ЧИСЛО С 1E0       MOV       BL,1            ;ПОКА ОНО МОЖЕТ БЫТЬ ВБЛИЗИ +1/-1  ;---- ЦИКЛ ПЕРЕПИСИ ПО ВСЕМ ТЕТРАДАМ BCD-МАНТИССЫ ----  M0004:XOR       AH,1            ;ОЧЕРЕДНАЯ ТЕТРАДА       JZ        @               ;ЕСЛИ НЕЧЕТНАЯ ТЕТРАДА       LODSB                     ;ДОСТАЛИ БАЙТ МАНТИССЫ       CMP       ESI,ESP         ;ЗА ПРЕДЕЛАМИ МАНТИССЫ ?       MOV       DL,AL           ;ДВЕ ТЕТРАДЫ МАНТИССЫ       JB        M0007           ;ЗАКОНЧИЛИ ВЫВОД  ;---- ЧЕТНАЯ ТЕТРАДА ----        SHR       AL,4            ;ЧЕТНАЯ ТЕТРАДА BCD       JMPS      M0005  ;---- НЕЧЕТНАЯ ТЕТРАДА ----  @:    MOV       AL,DL       AND       AL,0FH          ;НЕЧЕТНАЯ ТЕТРАДА BCD  ;---- ПРОПУСК ЛИДИРУЮЩИХ НУЛЕЙ МАНТИССЫ ----  M0005:OR        DH,AL           ;ЕЩЕ ИДУТ НУЛИ МАНТИССЫ ?       JNZ       @               ;УЖЕ ИДУТ ЦИФРЫ МАНТИССЫ       INC       ECX             ;НЕ УЧИТЫВАЕМ ЭТОТ НОЛЬ В МАНТИССЕ       JMPS      M0006           ;ПРОПУСКАЕМ НЕЗНАЧАЩИЙ НОЛЬ  ;---- ПРОВЕРКА НА ВСЕ ДЕВЯТКИ (Т.Е. НА ЧИСЛО ВБЛИЗИ +1/-1) ----  @:    CMP       AL,9            ;ИДУТ СПЛОШНЫЕ ДЕВЯТКИ ?       JZ        @               ;ДА, ПРОДОЛЖАЮТСЯ ДЕВЯТКИ       MOV       BL,0            ;УЖЕ НЕ ВБЛИЗИ +1/-1 (НЕ ДЕВЯТКА)  ;---- ПРОПУСК ТОЧКИ, ЗАРАНЕЕ ЗАПИСАННОЙ В ОТВЕТ ----  @:    CMP       B PTR [EDI],'.' ;ЗДЕСЬ В ШАБЛОНЕ ТОЧКА ?       JNZ       @       INC       EDI             ;ПРОПУСКАЕМ ТОЧКУ  ;---- ЗАПИСЬ ОЧЕРЕДНОЙ ЦИФРЫ МАНТИССЫ КАК ТЕКСТА ----  @:    ADD       [EDI],AL        ;ПИШЕМ ОЧЕРЕДНУЮ ЦИФРУ В ОТВЕТ       INC       EDI             ;СЛЕДУЮЩИЙ АДРЕС M0006:LOOP     M0004            ;ЗА СЛЕДУЮЩЕЙ ТЕТРАДОЙ  M0007:CLD  ;---- ФОРМИРОВАНИЕ ВЕЛИЧИНЫ ПОРЯДКА ----        MOV       ESI,OFFSET ДЕСЯТЬ       FNSTSW    AX       XOR       EDX,EDX         ;ПОКА ПОРЯДОК НОЛЬ       SAHF       JZ        M0011           ;ЧИСЛО СТРОГО РАВНО 1 - ПОРЯДОК НОЛЬ       JA        M0009           ;ЧИСЛО БОЛЬШЕ 1 - ПОРЯДОК ПОЛОЖИТЕЛЕН       MOV       B PTR [EBP]-1,'-' ;ОТМЕТИЛИ ОТРИЦАТЕЛЬНЫЙ ПОРЯДОК  ;---- УВЕЛИЧЕНИЕ ПОРЯДКА ДО ЧИСЛА БОЛЬШЕ 1 ----  M0008:FIMUL16   [ESI]           ;УВЕЛИЧИЛИ ЧИСЛО В 10 РАЗ       INC       EDX             ;УВЕЛИЧИЛИ ПОРЯДОК        FCOM                      ;СРАВНИВАЕМ С 1       FNSTSW    AX              ;ЗАПОМНИЛИ РЕЗУЛЬТАТ СРАВНЕНИЯ       SAHF       JZ        M0011           ;СТРОГО РАВНО 1 - НАШЛИ ПОРЯДОК        FLD       ST              ;РАЗМНОЖИЛИ ЧИСЛО       FSUB      ST,ST2          ;РАЗНИЦА С 1       FXTRACT                   ;ДОСТАЛИ МАНТИССУ И ПОРЯДОК       FSTP      ST              ;ВЫБРОСИЛИ МАНТИССУ       FIST32P   [ESP]           ;ПОРЯДОК РАЗНИЦЫ       CMP       D PTR [ESP],-53 ;УЖЕ ВПЛОТНУЮ К 1 ?       JLE       M0010           ;ДА, ВПЛОТНУЮ, БЛИЖЕ НЕ БУДЕТ        SAHF                      ;ОПЯТЬ ДОСТАЛИ ФЛАГИ СРАВНЕНИЯ С 1       JA        M0011           ;УЖЕ БОЛЬШЕ - НАШЛИ ПОРЯДОК       JMPS      M0008           ;ПРОДОЛЖАЕМ УМНОЖАТЬ НА 10  ;---- УМЕНЬШЕНИЕ ПОРЯДКА ДО ЧИСЛА МЕНЬШЕ 1 ----  M0009:FIDIV16   [ESI]           ;УМЕНЬШИЛИ ЧИСЛО В 10 РАЗ       INC       EDX             ;УМЕНЬШИЛИ ПОРЯДОК        FCOM                      ;СРАВНИВАЕМ С 1       FNSTSW    AX              ;ЗАПОМНИЛИ РЕЗУЛЬТАТ СРАВНЕНИЯ       SAHF       JZ        M0011           ;СТРОГО РАВНО 1 - НАШЛИ ПОРЯДОК        FLD       ST              ;РАЗМНОЖИЛИ ЧИСЛО       FSUB      ST,ST2          ;РАЗНИЦА С 1       FXTRACT                   ;ДОСТАЛИ МАНТИССУ И ПОРЯДОК       FSTP      ST              ;ВЫБРОСИЛИ МАНТИССУ       FIST32P   [ESP]           ;ПОРЯДОК РАЗНИЦЫ       CMP       D PTR [ESP],-53 ;УЖЕ ВПЛОТНУЮ К 1 ?       JG        @               ;ЕЩЕ НЕ ВПЛОТНУЮ M0010:INC       EBX             ;ПРИЗНАК НАХОЖДЕНИЯ ВБЛИЗИ 1       JMPS      M0011           ;ПЕРЕСТАЕМ ИСКАТЬ ПОРЯДОК  @:    SAHF                      ;ОПЯТЬ ЗАГРУЗИЛИ ФЛАГИ СРАВНЕНИЯ С 1       JNB       M0009           ;ПРОДОЛЖАЕМ ДЕЛИТЬ НА 10       DEC       EDX             ;ЧИСЛО В ОТВЕТЕ ДОЛЖНО БЫТЬ БОЛЬШЕ 1  M0011:ADD       ESP,11          ;ОСВОБОДИЛИ СТЕК ОТ BCD-МАНТИССЫ  ;---- КОРРЕКТИРОВКА ПОРЯДКА ВБЛИЗИ +/-1 ----        CMP       BL,2            ;БЫЛИ ВСЕ ДЕВЯТКИ И ПОЧТИ 1 ?       XCHG      EAX,EDX         ;ДОСТАЛИ ЗНАЧЕНИЕ ПОРЯДКА       JNZ       @               ;НЕТ, ЧИСЛО НЕ ВБЛИЗИ 1       DEC       EAX             ;ВБЛИЗИ 1 СВЕРХУ, ДЕЛАЕМ 0.999...E+000       CMP       B PTR [EBP]-1,'-' ;ЧИСЛО МЕНЬШЕ 1E0 ?       JNZ       @               ;НЕТ, БОЛЬШЕ       INC       EAX             ;ВЕРНУЛИ ПОРЯДОК       INC       EAX             ;ВБЛИЗИ 1 СНИЗУ,  ДЕЛАЕМ 9.999...E-001  ;---- ЗАПИСЬ СТАРШЕЙ ЦИФРЫ ПОРЯДКА ----  @:    PUSH      100       XOR       EDX,EDX       POP       EBX             ;ДЕЛИМ НА КОНСТАНТУ 100       FSTP      ST              ;ОЧИЩАЕМ FPU ОТ ПОИСКА ПОРЯДКА       DIV       EBX             ;ПОЛУЧАЕМ ЧАСТНОЕ - ПЕРВУЮ ЦИФРУ       ADD       [EBP],AL        ;СТАРШАЯ ЦИФРА ПОРЯДКА  ;---- ЗАПИСЬ ДВУХ МЛАДШИХ ЦИФР ПОРЯДКА ----        MOV       BL,10           ;ДЕЛИМ НА КОНСТАНТУ 10       XCHG      EAX,EDX         ;ОСТАТОК ОТ ДЕЛЕНИЯ НА 100       DIV       BL              ;ЧАСТНОЕ И ОСТАТОК - ДВЕ ЦИФРЫ ПОРЯДКА       FSTP      ST              ;ВЫБРОСИЛИ КОНСТАНТУ 1 ИЗ FPU       ADD       [EBP]+1,AX      ;ДВЕ ОСТАЛЬНЫЕ ЦИФРЫ ПОРЯДКА  ;---- ВЫХОД С ОТВЕТОМ В СТЕКЕ И ДЛИНОЙ СТРОКИ В AL ----        POP       EAX             ;ДЛИНА СТРОКИ ОТВЕТА В СТЕКЕ       RET        DSEG ДЕСЯТЬ DW 10                    ;БАЗА ДЛЯ ПЕРЕВОДА В ДЕСЯТИЧНУЮ СИСТЕМУ

Заключение

Использование команд FPU сделало данную реализацию довольно компактной (326 байт команд) и удовлетворительной по скорости. Например, на компьютере с процессором Intel Core Solo 1.33 GHz сто миллионов преобразований числа 1234.567890 в текст заняли 89 секунд.

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

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

ссылка на оригинал статьи https://habr.com/ru/post/537636/

Пишем мессенджер на Vue в облаке Amazon

Разберем, как использовать облачный сервис Amazon для создания мессенджера Chattyмногопользовательского чат-приложения в реальном времени с одной комнатой с помощью фреймворка Vue и AWS Amplify. Настроим регистрацию пользователей и хранение данных.

Темы, которые мы рассмотрим:

  • Аутентификация

  • GraphQL API с AWS AppSync

  • Настроить Amplify DataStore

  • Развертывание через консоль Amplify

  • Удаление сервисов

  • Приложение и устранение неисправностей

Результат можно увидеть тут: https://master.d58xs5f4j0v44.amplifyapp.com/

Предварительные условия:

  • Регистрация за $1 в сервисах Amazon AWS уже произведена

  • Бесплатный редактор Visual Studio Code установлен, локализован и установлен npm:

    • Node: 14.7.0. Visit Node

    • npm: 6.14.7.

npm install -g npm

Начало работы — Создание приложения

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

npm install -g @vue/cli vue create amplify-datastore
  • Выберите предустановку: по умолчанию [Vue 2] (babel, eslint)

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

cd amplify-datastore  npm run serve

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

Откроем папку проекта C:\Users\Admin\amplify-datastore> в редакторе Visual Studio Code:

Обратите внимание на окончание строк LF
Обратите внимание на окончание строк LF

Мы видим шаблон приложения Vue, и оно работает локально.

Остановим его CTRL+C что бы продолжить.

Давайте теперь установим API AWS Amplify и библиотеку AWS Amplify Vue:

npm install --save aws-amplify @aws-amplify/ui-vue moment

Установка интерфейса командной строки AWS Amplify

Далее мы установим интерфейс командной строки AWS Amplify:

npm install -g @aws-amplify/cli

Теперь нам нужно настроить CLI с нашими учетными данными:

amplify configure

Если вы хотите посмотреть видео-пошаговое руководство по процессу настройки, щелкните здесь .

Здесь мы рассмотрим amplify configureнастройку. После входа в консоль AWS продолжайте:

  • Укажите регион AWS: eu-central-1 (Франкфурт)

  • Укажите имя пользователя нового пользователя IAM: ampify-datastore

В консоли AWS нажмите Далее: Разрешения , Далее: Теги , Далее: Обзор и Создать пользователя, чтобы создать нового пользователя IAM. Затем вернитесь в командную строку и нажмите Enter.

  • Введите ключ доступа вновь созданного пользователя:

    accessKeyId: (<YOURACCESSKEYID>)secretAccessKey: (<YOURSECRETACCESSKEY>)

  • Имя профиля: по умолчанию

Чтобы просмотреть нового созданного пользователя IAM, перейдите на панель управления по адресу https://console.aws.amazon.com/iam/home?region=eu-central-1#/users . Также убедитесь, что ваш регион соответствует вашему выбору.

Инициализация нового проекта

amplify init
  • Введите название проекта: ampifydatastore

  • Введите имя для среды: dev

  • Выберите редактор по умолчанию: Visual Studio Code

  • Выберите тип приложения, которое вы создаете javascript

  • Какую среду JavaScript вы используете vue

  • Путь к исходному каталогу: src

  • Путь к каталогу распространения: dist

  • Команда сборки: npm run-script build

  • Команда запуска: npm run-script serve

  • Вы хотите использовать профиль AWS? да

  • Пожалуйста, выберите профиль, который вы хотите использовать по умолчанию

Теперь интерфейс командной строки AWS Amplify инициировал новый проект, и вы увидите новую папку: ampify . Файлы в этой папке содержат конфигурацию вашего проекта.

<amplify-app>     |_ amplify       |_ .config       |_ #current-cloud-backend       |_ backend       team-provider-info.json

Добавление аутентификации

Чтобы добавить аутентификацию в наш проект Amplify, используем следующую команду:

amplify add auth

При появлении запроса выберите

  • Вы хотите использовать конфигурацию аутентификации и безопасности по умолчанию ?: Конфигурация по умолчанию

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

  • Вы хотите настроить дополнительные параметры? Да, я хочу внести дополнительные изменения.

  • Какие атрибуты необходимы для регистрации? (Нажмите <пробел>, чтобы выбрать, <a>, чтобы переключить все, <i>, чтобы инвертировать выделение): Электронная почта

  • Вы хотите включить какие-либо из следующих возможностей? (Нажмите <пробел>, чтобы выбрать, <a>, чтобы переключить все, <i>, чтобы инвертировать выделение): Нет

Чтобы ничего не выбрать, просто нажмите Enterпоследнюю опцию.

Теперь мы запустим команду push, и облачные ресурсы будут созданы в нашей учетной записи AWS.

amplify push   Current Environment: dev | Category | Resource name      | Operation | Provider plugin   | | -------- | ------------------ | --------- | ----------------- | | Auth     | amplifyappuuid     | Create    | awscloudformation | ? Are you sure you want to continue? Yes

Чтобы быстро проверить созданный пул пользователей Cognito, запустим:

amplify status

Чтобы получить доступ к консоли AWS Cognito в любое время, перейдите на панель управления по адресу https://console.aws.amazon.com/cognito/ .

Настраиваем приложение Vue

Теперь наши ресурсы созданы, и мы можем начать их использовать!

Первое, что нам нужно сделать, это настроить наше приложение Vue, чтобы оно было осведомлено о нашем новом проекте AWS Amplify. Мы можем сделать это, обратившись к автоматически сгенерированному aws-exports.jsфайлу, который теперь находится в srcпапке.

Чтобы настроить приложение, откройте main.js и добавьте следующий код:

import Vue from 'vue' import App from './App.vue'  import Amplify from 'aws-amplify'; import '@aws-amplify/ui-vue'; import aws_exports from './aws-exports';  Amplify.configure(aws_exports);  Vue.config.productionTip = false  new Vue({   render: h => h(App), }).$mount('#app')

Теперь наше приложение готово к использованию сервисов AWS.

Использование компонента аутентификации

AWS Amplify предоставляет компоненты пользовательского интерфейса, которые можно использовать в своем приложении. Добавим эти компоненты в проект

Чтобы использовать компонент Authenticator, добавьте его в src / App.vue :

<template>   <div id="app">     <amplify-authenticator>       <div>         <h1>Hey, {{user.username}}!</h1>         <amplify-sign-out></amplify-sign-out>       </div>     </amplify-authenticator>   </div> </template>

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

Чтобы просмотреть всех созданных пользователей, вернитесь на панель управления Cognito по адресу https://console.aws.amazon.com/cognito/ . 

В качестве альтернативы мы также можем использовать

amplify console auth

Доступ к данным пользователя

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

<script> import { AuthState, onAuthUIStateChange } from '@aws-amplify/ui-components'  export default {   name: 'app',   data() {     return {       user: { },     }   },   created() {     // authentication state managament     onAuthUIStateChange((state, user) => {       // set current user and load data after login       if (state === AuthState.SignedIn) {         this.user = user;       }     })   } } </script>

Добавление GraphQL API

Чтобы добавить GraphQL API, мы можем использовать следующую команду:

amplify add api

Ответьте на следующие вопросы

  • Пожалуйста, выберите одну из нижеуказанных служб GraphQL

  • Укажите имя API: ChattyAPI

  • Выберите тип авторизации по умолчанию для ключа API API

  • Введите описание ключа API: (пусто)

  • Через сколько дней истечет срок действия ключа API (1-365): 7

  • Вы хотите настроить дополнительные параметры для GraphQL API? Да, я хочу внести дополнительные изменения.

  • Настроить дополнительные типы авторизации? N

  • Настроить обнаружение конфликтов? Y

  • Выберите стратегию разрешения по умолчанию Auto Merge

  • Вы хотите изменить настройки по умолчанию для каждой модели? N

  • У вас есть аннотированная схема GraphQL? N

  • Вам нужно управляемое создание схемы? Y

  • Что лучше всего описывает ваш проект: один объект с полями (например, «Todo» с идентификатором, именем, описанием)

  • Вы хотите отредактировать схему сейчас? Y

Чтобы ничего не выбрать, просто нажмите Enter.

При появлении запроса обновите схему до следующего:

type Chatty @model {   id: ID!   user: String!   message: String!   createdAt: AWSDateTime }

Это позволит нам отображать сообщения каждого пользователя вместе с датой и временем создания.

Примечание: не забудьте сохранить изменения в файле схемы!

Затем давайте перенесем конфигурацию в нашу учетную запись:

amplify push
  • Вы уверены что хотите продолжить? да

  • Вы хотите сгенерировать код для недавно созданного GraphQL API? Да

  • Выберите целевой язык генерации кода javascript

  • Введите шаблон имени файла для запросов, мутаций и подписок graphql src / graphql / ** / *. Js

  • Вы хотите сгенерировать / обновить все возможные операции GraphQL — запросы, изменения и подписки? Да

  • Введите максимальную глубину инструкции [увеличьте значение по умолчанию, если ваша схема глубоко вложена] 2

Обратите внимание на конечную точку GraphQL и КЛЮЧ API .

На этом шаге был создан новый API AWS AppSync. Используйте команду ниже, чтобы получить доступ к панели управления AWS AppSync. Убедитесь, что ваш регион правильный.

amplify console api
  • Пожалуйста, выберите одну из нижеуказанных служб GraphQL

Настроить Amplify DataStore

Установка Amplify DataStore

Далее мы установим необходимые зависимости:

npm install --save @aws-amplify/core @aws-amplify/datastore

Генерация модели данных

Затем мы сгенерируем модели для доступа к нашим сообщениям из нашего ChattyAPI.

amplify codegen models

Важно: НЕ забывайте генерировать модели каждый раз, когда вы вносите изменения в свою схему.

Теперь интерфейс командной строки AWS Amplify сгенерировал необходимые модели данных, и вы увидите новую папку в своем источнике: models . Файлы в этой папке содержат классы и схему вашей модели данных.

<amplify-app>     |_ src       |_ models

Самые нетерпеливые могут заглянуть в репозиторий проекта https://github.com/lazy-fox-code/amplify-datastore и уточнить куда какой код добавлять. Основная логика приложения описывается в App.vue и следующие разделы будут разбирать именно этот файл.

Структура App.vue содержит шаблон <template> в котором присутствуют блоки <div id=»app»> с формами, кнопками, авторизацией и прочими деталями приложения. Затем идет раздел <script> в котором импортируются и применяются модели и методы приложения. Затем следуют стили оформления приложения.

Создание сообщения

Теперь, когда GraphQL API и модели данных созданы, мы можем начать с ними взаимодействовать!

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

import { DataStore } from "@aws-amplify/datastore"; import { Chatty } from "./models";  await DataStore.save(new Chatty({   user: "amplify-user",   message: "Hi everyone!",   createdAt: new Date().toISOString() }))

Это создаст запись локально в вашем браузере и синхронизирует ее в фоновом режиме с помощью базового API GraphQL.

Запрос данных

Давайте теперь посмотрим, как мы можем запрашивать данные с помощью Amplify DataStore. Чтобы запросить нашу модель данных, мы будем использовать запрос и предикат, чтобы указать, что нам нужны все записи.

import { DataStore, Predicates } from "@aws-amplify/datastore"; import { Chatty } from "./models";  const messages = await DataStore.query(Chatty, Predicates.ALL);

Это вернет массив сообщений, которые мы можем отобразить в нашем пользовательском интерфейсе.

Предикаты также поддерживают фильтры для распространенных типов, таких как строки, числа и списки.

Найдите все поддерживаемые фильтры в разделе «Запрос с предикатами»

Создание UI

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

<template>   <div v-for="message of sorted" :key="message.id">     <div>{{ message.user }} - {{ moment(message.createdAt).format('YYYY-MM-DD HH:mm:ss')}})</div>     <div>{{ message.message }}</div>   </div> </template> <script> import { Auth } from "aws-amplify"; import { DataStore, Predicates } from "@aws-amplify/datastore"; import { Chatty } from "./models"; import moment from "moment";  export default {   name: 'app',   data() {     return {       user: {},       messages: [],     }   },   computed: {     sorted() {       return [...this.messages].sort((a, b) => -a.createdAt.localeCompare(b.createdAt));     }   },   created() {     this.currentUser();   },   methods: {     moment: () => moment(),     currentUser() {       Auth.currentAuthenticatedUser().then(user => {         this.user = user;         this.loadMessages();       });     },     loadMessages() {       DataStore.query(Chatty, Predicates.ALL).then(messages => {         this.messages = messages;       });     },   } } </script>

Создание сообщения

Теперь давайте посмотрим, как мы можем создавать новые сообщения.

<template>   <form v-on:submit.prevent>     <input v-model="form.message" placeholder="Enter your message..." />     <button @click="sendMessage">Send</button>   </form> </template> <script> export default {   data() {     return {       form: {},     };   },    methods: {     sendMessage() {       const { message } = this.form       if (!message) return;       DataStore.save(new Chatty({         user: this.user.username,         message: message,         createdAt: new Date().toISOString()       })).then(() => {         this.form = { message: '' };         this.loadMessages();       }).catch(e => {         console.log('error creating message...', e);       });     },   } } </script>

Удаление всех сообщений

Одним из основных преимуществ работы с Amplify DataStore является возможность запускать пакетные мутации без использования серии отдельных операций.

См. Ниже, как мы можем использовать delete вместе с предикатом для удаления всех сообщений.

DataStore.delete(Chatty, Predicates.ALL).then(() => {   console.log('messages deleted!'); });

Подписки GraphQL

Затем давайте посмотрим, как мы можем создать подписку, чтобы подписаться на изменения данных в нашем API.

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

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

<script> export default {   data() {     return {       subscription: undefined;     };   },   created() {     //Subscribe to changes     this.subscription = DataStore.observe(Chatty).subscribe(msg => {       console.log(msg.model, msg.opType, msg.element);       this.loadMessages();     });   },    destroyed() {     if (!this.subscription) return;     this.subscription.unsubscribe();   }, } </script>

Развертывание через консоль Amplify

Мы рассмотрели развертывание через категорию хостинга Amplify CLI, но что, если нам нужно непрерывное развертывание CI/CD? Для этого мы можем использовать консоль Amplify для развертывания приложения.

Первое, что нам нужно сделать, это создать новый репозиторий GitHub для этого проекта. После того, как мы создали репо, мы скопируем URL-адрес проекта в буфер обмена и инициализируем git в нашем локальном проекте:

git init  git remote add origin git@github.com:username/project-name.git  git add .  git commit -m 'initial commit'  git push origin master

Затем мы посетим консоль Amplify в нашей учетной записи AWS по адресу https://eu-central-1.console.aws.amazon.com/amplify/home .

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

Затем мы выберем новый репозиторий и ветку для только что созданного проекта и нажмем Next .

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

Наконец, мы можем нажать « Сохранить и развернуть», чтобы развернуть наше приложение!

Теперь мы можем отправлять обновления в Master, чтобы обновить наше приложение.

Удаление сервисов

Если в любое время или в конце этого семинара вы захотите удалить службу из своего проекта и своей учетной записи, вы можете сделать это, выполнив amplify removeкоманду:

amplify remove auth  amplify push

Если вы не знаете, какие службы вы в любой момент включили, вы можете запустить amplify statusкоманду:

amplify status

amplify status предоставит вам список ресурсов, которые в настоящее время включены в вашем приложении.

Приложение

Настройка учетной записи AWS

Чтобы пройти этот урок, необходимо создать и активировать учетную запись Amazon Web Services.

Следуйте инструкциям здесь

Устранение неполадок

Сообщение: для идентификатора ключа доступа AWS требуется подписка на сервис

Решение: убедитесь, что вы подписаны на бесплатный план. Подписывайся

Сообщение: TypeError: fsevents не является конструктором

Решение: npm audit fix --force

Поведение: данные не синхронизируются с облаком и / или наоборот

Решение:

amplify update api amplify push

Убедитесь, что вы ответили на следующие вопросы как

  • Настроить обнаружение конфликтов? Y

  • Выберите стратегию разрешения по умолчанию Auto Merge

  • Вы хотите изменить настройки по умолчанию для каждой модели? N

Послесловие

Надеюсь данный пост поможет легче пройти квест создания приложения Vue в облаке AWS.

Результат работы двух пользователей
Результат работы двух пользователей

Что дальше?

Конечно у разработчика возникнет ряд вопросов по эффективности использования приложения в среде Amplify. Вот некоторые из них:

5 шагов администрирования приложения
5 шагов администрирования приложения

Так же удобно просматривать параметры и настраивать приложение в визуальном инструменте администратора приложения. По мере выполнения команд в консоли пока мы строили приложение, тут появлялись модель данных и API авторизации и содержимого:

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

ссылка на оригинал статьи https://habr.com/ru/post/537654/

Борьба с робозвонками выходит на новый уровень — телекомы США ограничат нежелательную активность

Рассказываем, как развивается борьба с «телефонным спамом» в США, чего уже удалось добиться регуляторам и как они планируют закрепить успехи — далее помогать гражданами отбиваться от усиливающегося шквала нежелательных звонков с рекламными объявлениями и участившимися во время кризиса попытками получения денежных средств обманным путем.

Unsplash / Ray W
Unsplash / Ray W

Многолетнее сопротивление

Пару лет назад Федеральная комиссия по связи США (Federal Communications Commission, FCC) взялась за активную борьбу с нежелательными вызовами. Тогда общее число робозвонков составляло около 50 миллиардов в год, поэтому автоматизировать работу с нарушителями в этой области было достаточно сложно. FCC не обладала полномочиями для всестороннего расследования жалоб и поиска реальных операторов серых телефонных номеров и подставных АТС, с помощью которых осуществлялись массовые спам-звонки. В свою очередь, Министерство юстиции, куда поступали дела о нарушениях, не справлялось с анализом десятков тысяч спорных ситуаций, поэтому из $200 млн выставленных штрафов комиссии удалось собрать менее 1%.

Столь скромные успехи регулятора спровоцировали дальнейший рост числа робозвонков, поэтому FCC вместе с представителями Конгресса США подготовили законопроект о расширении полномочий комиссии. Помимо этого, ее представители обратились к телеком-компаниям с просьбой рассмотреть внедрение SHAKEN/STIR — протокола, позволяющего идентифицировать звонящих еще до установки соединения.

Однако пока шло обсуждение и проводились формальные процедуры по принятию закона, нежелательные робозвонки успели стать наиболее распространенной причиной жалоб граждан в Федеральную торговую комиссию США (Federal Trade Commission, FTC). Более того, сотни тысяч таких жалоб были связаны с участившимися попытками вымогательства, которые — по оценкам экспертов FCC — приводили к ежегодному хищению около $3 млрд частных средств.

Unsplash / Devin Kaselnak
Unsplash / Devin Kaselnak

Как только так называемый «Telephone Robocall Abuse Criminal Enforcement and Deterrence Act» приняли, и комиссия обрела расширенные полномочия, активизировалась работа и на стороне телекомов. Они приняли во внимание рекомендации, c которыми FCC обратились к ним ранее — T-Mobile, Sprint, Comcast и AT&T начали внедрять SHAKEN/STIR. Но этот процесс затянулся, а положительная динамика в работе с нарушителями так и не вышла на заметный уровень.

Что на этот раз

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

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

Unsplash / Engin Akyurt
Unsplash / Engin Akyurt

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

Что дальше

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

Как показывает пример GDPR, подобную практику могут взять на вооружение и регуляторы в других странах, где принято ориентироваться на опыт США, либо адаптировать местные законы.


Что еще почитать у нас в блоге:


ссылка на оригинал статьи https://habr.com/ru/company/vasexperts/blog/537644/