Использование Github Actions и Bash для создания динамического профиля Github

Использование Github Actions и Bash для создания динамического профиля Github

4 июня 2022 г.

Около года назад Github запустил функцию, которая позволяет добавлять README в профиль пользователя. Чтобы добавить README в свой профиль, вам необходимо:


  • создайте общедоступный репозиторий с именем, совпадающим с вашим именем пользователя Github.

  • поместите README.md в корень репозитория

Вы можете узнать больше об этом в документации Github.


Что такое динамический профиль Github?


Динамический профиль Github обновляется автоматически по какому-либо внешнему событию или по расписанию. Это возможно с использованием Github Actions. Github Actions — еще одна недавно выпущенная функция Github. Github Actions — это, по сути, система CI/CD, которая позволяет создавать и запускать настраиваемые рабочие процессы.


Впервые я узнал о профиле README в этой статье на Hackernoon. Парень использовал PHP для получения и обновления списка последних сообщений в своем блоге. Хотя я эксперт по PHP, я хотел сделать его более сложным. Я понял, что синтаксический анализ XML и замена текста в файле достижимы только с помощью собственных инструментов Bash.


Парсинг RSS-канала


RSS-канал — это обычный XML-файл с простой схемой. Вот пример из моего только что запущенного блога:


```разметка




<канал>


Сообщения в техническом блоге Александра Табакова | атабаков


<ссылка>https://atabakoff.com/posts/


Недавний контент в сообщениях технического блога Александра Табакова | атабаков


<изображение>


https://atabakoff.com/aleksandr_tabakov.jpeg


<ссылка>https://atabakoff.com/aleksandr_tabakov.jpeg



Хьюго -- gohugo.io


Пт, 27 мая 2022 г., 21:33:51 +0200


<элемент>


Как запустить Vaultwarden в Docker/Podman как службу systemd


https://atabakoff.com/how-to-run-vaultwarden-in-podman-as-a-systemd-service/


Пт, 27 мая 2022 г., 21:33:51 +0200


https://atabakoff.com/how-to-run-vaultwarden-in-podman-as-a-systemd-service/


Запуск Vaultwarden в контейнере в качестве службы systemd с использованием Podman. Как установить Podman, запустить Vaultwarden в контейнере, создать конфигурацию systemd для службы Vaultwarden и управлять ею с помощью systemctl.





Каждое сообщение представлено элементом item, где нам нужны title, link и pubDate.


Парсинг RSS-канала с помощью grep


Наивный подход состоит в том, чтобы использовать grep, а затем построить уценку в цикле bash. Давайте сначала попробуем grep:


``` ударить


wget --quiet -O rss.xml https://atabakoff.com/posts/index.xml


кот rss.xml | grep -Po '<(название|ссылка|дата публикации)>[^<]+'


Сообщения в техническом блоге Александра Табакова | атабаков</p><br><p><ссылка>https://atabakoff.com/posts/</p><br><p><ссылка>https://atabakoff.com/aleksandr_tabakov.jpeg</p><br><p><title>Как запустить Vaultwarden в Docker/Podman в качестве службы systemd</p><br><p><ссылка>https://atabakoff.com/how-to-run-vaultwarden-in-podman-as-a-systemd-service/</p><br><p><pubDate>Пт, 27 мая 2022 г. 21:33:51 +0200</p><br><p>Неплохо, но нам нужно избавиться от первых трех строк и открывающего тега:</p><br><p>``` ударить</p><br><p>кот rss.xml | grep -Po '<(title|link|pubDate)>[^<]+' | хвост -n +4 \</p><br><p>| grep -oE '>([^>]+)' | grep -oE '([^>]+)'</p><br><p>Как запустить Vaultwarden в Docker/Podman в качестве службы systemd</p><br><p>https://atabakoff.com/how-to-run-vaultwarden-in-podman-as-a-systemd-service/</p><br><p>Пт, 27 мая 2022 21:33:51 +0200</p><br><p>Просто для проверки grep</p><br><p>https://atabakoff.com/testing-grep/</p><br><p>Пт, 31 мая 2022 18:33:51 +0200</p><br><p>Я добавил один дополнительный элемент, чтобы проверить, работает ли мое выражение с несколькими сообщениями. В этот момент я начинаю думать, что <code>grep</code> может быть не лучшим вариантом. Я быстро написал конвертер для преобразования RSS в уценку, прежде чем исследовать другие варианты:</p><br><p>``` ударить</p><br><h1>!/бин/баш</h1><br><p>items=$( cat rss.xml | grep -Po '<(title|link|pubDate)>[^<]+' | tail -n +4 \</p><br><p>| grep -oE '>([^>]+)' | grep -oE '([^>]+)' )</p><br><p>ЕСЛИ=$'<br>'</p><br><p>количество = 0</p><br><p>для товара в $items</p><br><p>делать</p><br><p>case $(expr $count % 3) в</p><br><p>'0')</p><br><p>название = $ элемент</p><br><p>ссылка = ''</p><br><p>дата публикации = ''</p><br><p>'1')</p><br><p>ссылка=$элемент</p><br><p>'2')</p><br><p>pubDate=$(дата -d "$item" +'%d/%m/%Y' )</p><br><p>кошка<<EOF</p><br><ul> <li>$pubDate <a href="$ссылка">$название</a></li> </ul><br><p>EOF</p><br><p>эсак</p><br><p>количество = $ (($ количество + 1))</p><br><p>Выполнено</p><br><p>Запустите его для проверки:</p><br><p>``` ударить</p><br><p>./test.sh</p><br><ul> <li>05.07.2022 <a href="https://atabakoff.com/how-to-run-vaultwarden-in-podman-as-a-systemd-service/">Как запустить Vaultwarden в Docker/Podman в качестве службы systemd</a></li> </ul><br><ul> <li>05.03.2022 <a href="https://atabakoff.com/testing-grep/">Только для проверки grep</a></li> </ul><br><h3>Проверка производительности</h3><br><p>Моя RSS-лента крошечная. Чтобы измерить производительность, нам нужно запустить парсер много раз. Я создал файл <code>test.sh</code>:</p><br><p>``` ударить</p><br><h1>!/бин/баш</h1><br><p>х=100</p><br><p>в то время как [ "$x" -gt "0" ] ; делать</p><br><p>$(/bin/bash $1) 2>/dev/null</p><br><p>х=$((х-1))</p><br><p>Выполнено</p><br><p>Он принимает файл сценария в качестве параметра и запускает его 100 раз в цикле. Давайте запустим его с <code>time</code>, чтобы увидеть, сколько времени требуется для анализа фида:</p><br><blockquote> <p>время ./test.sh grep-rss.sh</p> </blockquote><br><p>./test.sh grep.sh 1,87 с пользователь 0,72 с система 137% ЦП 1,883 всего</p><br><p>Не очень впечатляюще, но ожидаемо из-за использования регулярных выражений.</p><br><h3>Парсинг RSS-канала в Bash</h3><br><p>Я начал гуглить, есть ли способ разобрать XML в Bash, и нашел это [отличное решение] (https://www.linuxjournal.com/content/parsing-rss-news-feed-bash-script). Здесь описана та же проблема парсинга RSS-канала. Я изменил код для своих нужд и сохранил его в файле <code>parse-rss.sh</code>:</p><br><p>``` ударить</p><br><h1>!/бин/баш</h1><br><p>xmlgetnext () {</p><br><p>местный IFS='>'</p><br><p>read -d '<' ЗНАЧЕНИЕ ТЕГА</p><br><p>кот $1 | пока xmlgetnext ; делать</p><br><p>случай $TAG в</p><br><p>'вещь')</p><br><p>название = ''</p><br><p>ссылка = ''</p><br><p>дата публикации = ''</p><br><p>'заглавие')</p><br><p>название=$ЗНАЧЕНИЕ</p><br><p>'ссылка на сайт')</p><br><p>ссылка=$ЗНАЧЕНИЕ</p><br><p>'дата публикации')</p><br><p>pubDate=$(дата -d "$VALUE" +'%d/%m/%Y' )</p><br><p>'/вещь')</p><br><p>кошка<<EOF</p><br><ul> <li>$pubDate <a href="$ссылка">$название</a></li> </ul><br><p>EOF</p><br><p>эсак</p><br><p>Выполнено</p><br><p>Я провел тот же тест, чтобы сравнить производительность:</p><br><p>``` ударить</p><br><p>время ./test.sh parse-rss.sh</p><br><p>./test.sh parse.sh 0,81 с пользователь 0,33 с система 109% ЦП 1,042 всего</p><br><p>Почти <em>в два раза</em> быстрее: «1042» против «1883». Это последний подход, который я выбрал для обработки RSS-канала.</p><br><h2>Обновление README.md</h2><br><p>Обновление списка постов — это просто замена. Поскольку уценка позволяет использовать HTML-код, мы можем использовать HTML-комментарии, чтобы пометить заполнитель для сообщений:</p><br><p>```разметка</p><br><!--блог:старт--><br><!--блог:конец--><br><p>Стандартным инструментом для замены текста в Bash является <code>sed</code>, но у него есть одно ограничение. Это строковый редактор, обрабатывающий только одну строку за один шаг. В нашем случае и заполнитель, и список постов представляют собой многострочный текст. Вот как я это решил:</p><br><p>``` ударить</p><br><h1>!/бин/баш</h1><br><p>ЧИСЛО=$(($2*3))</p><br><p>POSTS=$(cat $1 | head $NUM | tr '<br>' '\t')</p><br><p>кот README.md | тр '<br>' '\t' \</p><br><p>| sed -E "s#(<!--блог:начало-->).*(<!--блог:конец-->)#\1\t${Публикации}\2#g" \</p><br><p>| tr '\t' '<br>' > README.tmp</p><br><p>mv README.tmp README.md</p><br><p>rm -f rss.xml posts.md</p><br><p>Некоторые вещи, которые стоит пояснить:</p><br><ul> <li><code>NUM=$(($2*3))</code> — количество строк для указанного количества постов; в моем случае я хочу показать пять постов по три строки каждый (название, ссылка, дата)</li> </ul><br><ul> <li><code>tr '<br>' '\t'</code> должен преобразовать текст в одну строку для обработки с помощью <code>sed</code></li> </ul><br><ul> <li><code>tr '\t' '<br>'</code> возвращает символы новой строки</li> </ul><br><h2>Конвейер действий Github</h2><br><p>Теперь у нас есть наши сценарии, и нам нужно поместить их в конвейер. Действия Github просматривают специальный каталог <code>.gihub/workflows</code> и обрабатывают там каждый файл <code>.yaml</code>. Я создал там файл <code>posts.yml</code> со следующим содержимым:</p><br><p>``ямл</p><br><p>name: Обновление сообщений в блоге</p><br><p>на:</p><br><p>толкать:</p><br><p>workflow_dispatch:</p><br><p>расписание:</p><br><ul> <li>cron: '0 0 * <em> </em>'</li> </ul><br><p>вакансии:</p><br><p>обновить-readme-с-последними-сообщениями:</p><br><p>запуски: ubuntu-последняя</p><br><p>шаги:</p><br><ul> <li>имя: Клонировать репозиторий</li> </ul><br><p>использует: action/checkout@v2</p><br><p>с:</p><br><p>глубина выборки: 1</p><br><ul> <li>имя: Получить RSS-канал</li> </ul><br><p>выполнить: wget --quiet -O rss.xml https://atabakoff.com/posts/index.xml</p><br><ul> <li>название: Разобрать RSS-канал</li> </ul><br><p>запустить: |</p><br><p>компакт-диск ${GITHUB_WORKSPACE}</p><br><p>./src/parse-rss.sh rss.xml > posts.md</p><br><ul> <li>название: Обновление README.md</li> </ul><br><p>запустить: |</p><br><p>компакт-диск ${GITHUB_WORKSPACE}</p><br><p>./src/update-readme.sh posts.md 5</p><br><ul> <li>имя: Нажмите изменения</li> </ul><br><p>запустить: |</p><br><p>git config --global user.name "${GITHUB_ACTOR}"</p><br><p>git config --global user.email "${GITHUB_ACTOR}@users.noreply.github.com"</p><br><p>git commit -am "Обновленные сообщения в блоге" | выход 0</p><br><p>git push</p><br><p>Вот что нужно пояснить:</p><br><ul> <li><code>push</code> - запускать по нажатию</li> </ul><br><ul> <li><code>cron: '0 0 * * *'</code> - это расписание, в моем случае каждый день в полночь</li> </ul><br><ul> <li><code>uses: action/checkout@v2</code> клонирует репозиторий</li> </ul><br><p>Затем я разделил получение, синтаксический анализ и обновление на отдельные этапы. Это позволяет мне быстро локализовать проблему, если что-то пойдет не так. Стоит отметить:</p><br><ul> <li><code>cd ${GITHUB_WORKSPACE}</code> должен перейти в текущий рабочий каталог, который является недавно клонированным репозиторием.</li> </ul><br><ul> <li><code>${GITHUB_ACTOR}</code> – ваше имя пользователя</li> </ul><br><ul> <li><code>${GITHUB_ACTOR}@users.noreply.github.com</code> — это специальный адрес электронной почты Github, который можно использовать для отправки изменений в репозиторий.</li> </ul><br><h2>Вывод</h2><br><p>Вы можете найти полное решение в <a href="https://github.com/daydiff/daydiff/">репозиторий моего профиля</a>. Было очень весело решать эту проблему с помощью чистого Bash.</p><br><p>При этом на Github существует множество действий сообщества. Они позволяют создать динамический профиль без написания кода. Все, что вам нужно сделать, это написать немного YAML. Но в этом мало сложностей. Это не путь воина.</p><br><p>Также опубликовано [здесь] (https://atabakoff.com/creating-a-dynamic-github-profile-with-github-actions-and-bash/).</p><br> <hr> <a href="https://hackernoon.com/using-github-actions-and-bash-to-create-dynamic-github-profile" target="_blank" rel="nofollow">Оригинал</a> <!-- Yandex.RTB R-A-1755394-6 --> <div class="row"> <div id="yandex_rtb_R-A-1755394-6" class="col-12"></div> </div> <script>window.yaContextCb.push(() => { Ya.Context.AdvManager.render({ "blockId": "R-A-1755394-6", "renderTo": "yandex_rtb_R-A-1755394-6", "type": "feed" }) }) </script> </div> <div class="col-lg-3 sidebar"> <div class="recent-post"> <h3 class="widget-title">Recent Post</h3> <hr> <!-- Yandex Native Ads C-A-1755394-2 --> <div id="id-C-A-1755394-2"></div> <script>window.yaContextCb.push(() => { Ya.Context.AdvManager.renderWidget({ renderTo: 'id-C-A-1755394-2', blockId: 'C-A-1755394-2' }) })</script> <ul class="top_15"> <li> <a href="/blog/an-alternative-compiler-for-rust-introducing-gccrs/"> <h4 class="title">Альтернативный компилятор для ржавчины: введение GCCR</h4> <span>30 июня 2025 г.</span> </a> </li> <li> <a href="/blog/these-algorithms-were-meant-to-improve-the-human-condition-they-failed/"> <h4 class="title">Эти алгоритмы предназначены для улучшения состояния человека: они потерпели неудачу</h4> <span>30 июня 2025 г.</span> </a> </li> <li> <a href="/blog/use-infinity-instead-of-none-in-python-loops/"> <h4 class="title">Используйте бесконечность, а не в петлях Python</h4> <span>30 июня 2025 г.</span> </a> </li> <li> <a href="/blog/a-practical-guide-to-machine-learning-for-business/"> <h4 class="title">Практическое руководство по машинному обучению для бизнеса</h4> <span>30 июня 2025 г.</span> </a> </li> <li> <a href="/blog/doing-more-with-less-not-without-better-logs-and-better-tools/"> <h4 class="title">Делать больше с меньшими затратами? Не без лучших журналов и лучших инструментов</h4> <span>27 июня 2025 г.</span> </a> </li> </ul> </div> <div class="categories top_45"> <h3 class="widget-title">Categories</h3> <ul class="top_30"> <li><a href="http://coffee-web.ru/blog/category/python/">Python</a></li> <li><a href="http://coffee-web.ru/blog/category/blockchain/">blockchain</a></li> <li><a href="http://coffee-web.ru/blog/category/web/">web</a></li> <li><a href="http://coffee-web.ru/blog/category/hackernoon/">hackernoon</a></li> <li><a href="http://coffee-web.ru/blog/category/computing/">вычисления</a></li> <li><a href="http://coffee-web.ru/blog/category/computing-components/">вычислительные компоненты</a></li> <li><a href="http://coffee-web.ru/blog/category/digital-home/">цифровой дом</a></li> <li><a href="http://coffee-web.ru/blog/category/gaming/">игры</a></li> <li><a href="http://coffee-web.ru/blog/category/audio/">аудио</a></li> <li><a href="http://coffee-web.ru/blog/category/home-cinema/">домашний кинотеатр</a></li> <li><a href="http://coffee-web.ru/blog/category/internet/">Интернет</a></li> <li><a href="http://coffee-web.ru/blog/category/mobile-computing/">Мобильные вычисления</a></li> <li><a href="http://coffee-web.ru/blog/category/networking/">сеть</a></li> <li><a href="http://coffee-web.ru/blog/category/photography-video-capture/">фотосъемка видео</a></li> <li><a href="http://coffee-web.ru/blog/category/portable-devices/">портативные устройства</a></li> <li><a href="http://coffee-web.ru/blog/category/software/">программного обеспечения</a></li> <li><a href="http://coffee-web.ru/blog/category/phone-and-communications/">телефон и связь</a></li> <li><a href="http://coffee-web.ru/blog/category/television/">телевидение</a></li> <li><a href="http://coffee-web.ru/blog/category/video/">видео</a></li> <li><a href="http://coffee-web.ru/blog/category/world-of-tech/">мир технологий</a></li> <li><a href="http://coffee-web.ru/blog/category/smart-persons-guides/">умные гиды</a></li> <li><a href="http://coffee-web.ru/blog/category/cloud/">облако</a></li> <li><a href="http://coffee-web.ru/blog/category/artificial-intelligence/">искусственный интеллект</a></li> <li><a href="http://coffee-web.ru/blog/category/ces/">се</a></li> <li><a href="http://coffee-web.ru/blog/category/samsung/">Samsung</a></li> <li><a href="http://coffee-web.ru/blog/category/smart-cities/">умные города</a></li> <li><a href="http://coffee-web.ru/blog/category/digitaltrends/">digitaltrends</a></li> <li><a href="http://coffee-web.ru/blog/category/oteli/">отели</a></li> <li><a href="http://coffee-web.ru/blog/category/startups/">Startups</a></li> <li><a href="http://coffee-web.ru/blog/category/venture/">Venture</a></li> <li><a href="http://coffee-web.ru/blog/category/cryptocurrency/">Crypto</a></li> <li><a href="http://coffee-web.ru/blog/category/apps/">Apps</a></li> <li><a href="http://coffee-web.ru/blog/category/security/">безопасность</a></li> <li><a href="http://coffee-web.ru/blog/category/tech-and-work/">техника и работа</a></li> <li><a href="http://coffee-web.ru/blog/category/cxo/">cxo</a></li> <li><a href="http://coffee-web.ru/blog/category/mobility/">мобильность</a></li> <li><a href="http://coffee-web.ru/blog/category/developer/">разработчик</a></li> <li><a href="http://coffee-web.ru/blog/category/5g/">5г</a></li> <li><a href="http://coffee-web.ru/blog/category/microsoft/">майкрософт</a></li> <li><a href="http://coffee-web.ru/blog/category/innovation/">инновации</a></li> <li><a href="http://coffee-web.ru/blog/category/prava-i-svobody/">Права и свободы</a></li> <li><a href="http://coffee-web.ru/blog/category/zakonodatelstvo-i-pravo/">Законодательство и право</a></li> <li><a href="http://coffee-web.ru/blog/category/politika-i-obshchestvo/">Политика и общество</a></li> <li><a href="http://coffee-web.ru/blog/category/kosmicheskaia-promyshlennost/">Космическая промышленность</a></li> <li><a href="http://coffee-web.ru/blog/category/informatsionnye-tekhnologii/">Информационные технологии</a></li> <li><a href="http://coffee-web.ru/blog/category/tekhnologii/">Технологии</a></li> <li><a href="http://coffee-web.ru/blog/category/obrazovanie/">Образование</a></li> <li><a href="http://coffee-web.ru/blog/category/nauchnye-issledovaniia/">Научные исследования</a></li> <li><a href="http://coffee-web.ru/blog/category/avtomobilnaia-promyshlennost/">Автомобильная промышленность</a></li> <li><a href="http://coffee-web.ru/blog/category/programmnaia-inzheneriia/">Программная инженерия</a></li> <li><a href="http://coffee-web.ru/blog/category/it-i-tekhnologii/">IT и технологии</a></li> <li><a href="http://coffee-web.ru/blog/category/veb-razrabotka/">Веб-разработка</a></li> <li><a href="http://coffee-web.ru/blog/category/programmirovanie/">Программирование</a></li> <li><a href="http://coffee-web.ru/blog/category/avtomatizatsiia/">Автоматизация</a></li> <li><a href="http://coffee-web.ru/blog/category/karernyi-rost/">Карьерный рост</a></li> <li><a href="http://coffee-web.ru/blog/category/programmirovanie-i-analiz-dannykh/">Программирование и анализ данных</a></li> <li><a href="http://coffee-web.ru/blog/category/trudoustroistvo/">Трудоустройство</a></li> <li><a href="http://coffee-web.ru/blog/category/politika/">Политика</a></li> <li><a href="http://coffee-web.ru/blog/category/iskusstvennyi-intellekt/">Искусственный интеллект</a></li> <li><a href="http://coffee-web.ru/blog/category/it-tekhnologii/">ИТ-технологии</a></li> <li><a href="http://coffee-web.ru/blog/category/programmnoe-obespechenie/">Программное обеспечение</a></li> <li><a href="http://coffee-web.ru/blog/category/ekologicheskaia-politika/">Экологическая политика</a></li> <li><a href="http://coffee-web.ru/blog/category/obrazovanie-i-rynok-truda/">Образование и рынок труда</a></li> <li><a href="http://coffee-web.ru/blog/category/politika-i-pravo/">Политика и право</a></li> <li><a href="http://coffee-web.ru/blog/category/microsoft-teams-i-sharepoint/">Microsoft Teams и SharePoint</a></li> <li><a href="http://coffee-web.ru/blog/category/informatsionnaia-bezopasnost/">Информационная безопасность</a></li> <li><a href="http://coffee-web.ru/blog/category/kiberbezopasnost/">Кибербезопасность</a></li> <li><a href="http://coffee-web.ru/blog/category/nalogi/">Налоги</a></li> <li><a href="http://coffee-web.ru/blog/category/obrazovanie-i-karera/">Образование и карьера</a></li> <li><a href="http://coffee-web.ru/blog/category/internet-i-tekhnologii/">Интернет и технологии</a></li> <li><a href="http://coffee-web.ru/blog/category/tekhnologii-gosudarstvennye-uslugi/">Технологии, Государственные услуги</a></li> <li><a href="http://coffee-web.ru/blog/category/politika-i-tekhnologii/">Политика и технологии</a></li> <li><a href="http://coffee-web.ru/blog/category/razrabotka-programmnogo-obespecheniia/">Разработка программного обеспечения</a></li> <li><a href="http://coffee-web.ru/blog/category/razrabotka-po/">Разработка ПО</a></li> <li><a href="http://coffee-web.ru/blog/category/mashinnoe-obuchenie/">Машинное обучение</a></li> <li><a href="http://coffee-web.ru/blog/category/nalogooblozhenie-tekhnologii-otkrytyi-iskhodnyi-kod/">Налогообложение, технологии, открытый исходный код</a></li> <li><a href="http://coffee-web.ru/blog/category/finansy-i-nalogi/">Финансы и налоги</a></li> <li><a href="http://coffee-web.ru/blog/category/tekhnologii-internet-ekologiia/">Технологии, Интернет, Экология</a></li> <li><a href="http://coffee-web.ru/blog/category/internet-bezopasnost/">Интернет, безопасность</a></li> <li><a href="http://coffee-web.ru/blog/category/tekhnologii-i-politika/">Технологии и политика</a></li> <li><a href="http://coffee-web.ru/blog/category/operatsionnye-sistemy/">Операционные системы</a></li> <li><a href="http://coffee-web.ru/blog/category/professionalnaia-razrabotka/">Профессиональная разработка</a></li> <li><a href="http://coffee-web.ru/blog/category/tekhnologii-bezopasnost/">Технологии, Безопасность</a></li> <li><a href="http://coffee-web.ru/blog/category/internet-i-obshchestvo/">Интернет и общество</a></li> <li><a href="http://coffee-web.ru/blog/category/finansovaia-industriia/">Финансовая индустрия</a></li> <li><a href="http://coffee-web.ru/blog/category/nalogovyi-uchiot/">Налоговый учёт</a></li> <li><a href="http://coffee-web.ru/blog/category/obshchestvennoe-zdravookhranenie/">Общественное здравоохранение</a></li> <li><a href="http://coffee-web.ru/blog/category/tekhnologicheskaia-otrasl/">Технологическая отрасль</a></li> <li><a href="http://coffee-web.ru/blog/category/iurisprudentsiia/">Юриспруденция</a></li> <li><a href="http://coffee-web.ru/blog/category/tekhnologii-i-gosudarstvo/">Технологии и государство</a></li> <li><a href="http://coffee-web.ru/blog/category/zdorove-i-fitnes/">Здоровье и фитнес</a></li> <li><a href="http://coffee-web.ru/blog/category/it-infrastruktura/">IT-инфраструктура</a></li> <li><a href="http://coffee-web.ru/blog/category/tekhnologii-i-ii/">Технологии и ИИ</a></li> <li><a href="http://coffee-web.ru/blog/category/zdravookhranenie/">Здравоохранение</a></li> <li><a href="http://coffee-web.ru/blog/category/it/">IT</a></li> <li><a href="http://coffee-web.ru/blog/category/tekhnologii-ekonomika/">Технологии, Экономика</a></li> <li><a href="http://coffee-web.ru/blog/category/muzyka-i-tekhnologii/">Музыка и технологии</a></li> <li><a href="http://coffee-web.ru/blog/category/zdorove-i-pitanie/">Здоровье и питание</a></li> <li><a href="http://coffee-web.ru/blog/category/it-i-bezopasnost/">IT и безопасность</a></li> <li><a href="http://coffee-web.ru/blog/category/biznes-i-predprinimatelstvo/">Бизнес и предпринимательство</a></li> <li><a href="http://coffee-web.ru/blog/category/tekhnologii-programmnoe-obespechenie/">Технологии, Программное обеспечение</a></li> <li><a href="http://coffee-web.ru/blog/category/tekhnologii-i-innovatsii/">Технологии и инновации</a></li> <li><a href="http://coffee-web.ru/blog/category/tekhnologii-dannye-etika/">Технологии, данные, этика</a></li> <li><a href="http://coffee-web.ru/blog/category/tekhnologii-i-internet/">Технологии и Интернет</a></li> <li><a href="http://coffee-web.ru/blog/category/tekhnologii-i-saas/">Технологии и SaaS</a></li> <li><a href="http://coffee-web.ru/blog/category/meditsina-i-zdravookhranenie/">Медицина и здравоохранение</a></li> <li><a href="http://coffee-web.ru/blog/category/onlain-videoservisy/">Онлайн-видеосервисы</a></li> <li><a href="http://coffee-web.ru/blog/category/finansy-i-tekhnologii/">Финансы и технологии</a></li> <li><a href="http://coffee-web.ru/blog/category/chtenie-i-samorazvitie/">Чтение и саморазвитие</a></li> <li><a href="http://coffee-web.ru/blog/category/ekonomika-i-biznes/">Экономика и бизнес</a></li> <li><a href="http://coffee-web.ru/blog/category/bezopasnost-dannykh/">Безопасность данных</a></li> <li><a href="http://coffee-web.ru/blog/category/udalennaia-rabota/">Удаленная работа</a></li> <li><a href="http://coffee-web.ru/blog/category/aviatsiia-i-tekhnologii/">Авиация и технологии</a></li> <li><a href="http://coffee-web.ru/blog/category/tekhnologii-igry/">Технологии, Игры</a></li> <li><a href="http://coffee-web.ru/blog/category/energetika/">Энергетика</a></li> <li><a href="http://coffee-web.ru/blog/category/sotsialnye-seti-bezopasnost-tekhnologii/">Социальные сети, безопасность, технологии</a></li> <li><a href="http://coffee-web.ru/blog/category/samorazvitie/">Саморазвитие</a></li> <li><a href="http://coffee-web.ru/blog/category/bezopasnost-informatsii/">Безопасность информации</a></li> <li><a href="http://coffee-web.ru/blog/category/biznes-i-karera/">Бизнес и карьера</a></li> <li><a href="http://coffee-web.ru/blog/category/tekhnologii-i-otnosheniia/">Технологии и отношения</a></li> <li><a href="http://coffee-web.ru/blog/category/igrovaia-industriia/">Игровая индустрия</a></li> <li><a href="http://coffee-web.ru/blog/category/kompiuternaia-industriia/">Компьютерная индустрия</a></li> <li><a href="http://coffee-web.ru/blog/category/matematika-iskusstvennyi-intellekt/">Математика, Искусственный интеллект</a></li> <li><a href="http://coffee-web.ru/blog/category/nauka-i-tekhnologii/">Наука и технологии</a></li> <li><a href="http://coffee-web.ru/blog/category/tekhnologii-i-bezopasnost/">Технологии и безопасность</a></li> <li><a href="http://coffee-web.ru/blog/category/tekhnologii-udalennaia-rabota-biznes/">Технологии, Удаленная работа, Бизнес</a></li> <li><a href="http://coffee-web.ru/blog/category/videoigry/">Видеоигры</a></li> <li><a href="http://coffee-web.ru/blog/category/tekhnologii-iskusstvennyi-intellekt-etika/">Технологии, Искусственный интеллект, Этика</a></li> <li><a href="http://coffee-web.ru/blog/category/tekhnologii-sotsialnye-seti-6g/">Технологии, социальные сети, 6G</a></li> <li><a href="http://coffee-web.ru/blog/category/tekhnologii-programmirovanie-ai-razrabotka-po/">Технологии, Программирование, AI, Разработка ПО</a></li> <li><a href="http://coffee-web.ru/blog/category/programmirovanie-razrabotka-po-tekhnologii/">Программирование, Разработка ПО, Технологии</a></li> <li><a href="http://coffee-web.ru/blog/category/zhivotnye/">Животные</a></li> <li><a href="http://coffee-web.ru/blog/category/tekhnologii-iskusstvennyi-intellekt/">Технологии, Искусственный интеллект</a></li> <li><a href="http://coffee-web.ru/blog/category/programmirovanie-karera-tekhnologii-obuchenie/">Программирование, карьера, технологии, обучение</a></li> <li><a href="http://coffee-web.ru/blog/category/biznes-i-tekhnologii/">Бизнес и технологии</a></li> <li><a href="http://coffee-web.ru/blog/category/tekhnologii-bezopasnost-dannykh/">Технологии, Безопасность данных</a></li> <li><a href="http://coffee-web.ru/blog/category/astronomiia-i-fizika/">Астрономия и физика</a></li> <li><a href="http://coffee-web.ru/blog/category/produktivnost-lichnoe-razvitie/">Продуктивность, личное развитие</a></li> <li><a href="http://coffee-web.ru/blog/category/media-i-tekhnologii/">Медиа и Технологии</a></li> <li><a href="http://coffee-web.ru/blog/category/programmirovanie-i-iskusstvennyi-intellekt/">Программирование и Искусственный Интеллект</a></li> <li><a href="http://coffee-web.ru/blog/category/sotsialnye-seti/">Социальные сети</a></li> <li><a href="http://coffee-web.ru/blog/category/politika-i-ekonomika/">Политика и экономика</a></li> <li><a href="http://coffee-web.ru/blog/category/tekhnologii-meditsina-iskusstvennyi-intellekt/">Технологии, Медицина, Искусственный интеллект</a></li> <li><a href="http://coffee-web.ru/blog/category/tekhnologii-i-upravlenie/">Технологии и управление</a></li> <li><a href="http://coffee-web.ru/blog/category/kosmos-i-astronomiia/">Космос и астрономия</a></li> <li><a href="http://coffee-web.ru/blog/category/obshchestvo-i-politika/">Общество и политика</a></li> <li><a href="http://coffee-web.ru/blog/category/kosmicheskie-issledovaniia/">Космические исследования</a></li> <li><a href="http://coffee-web.ru/blog/category/veb-dizain/">Веб-дизайн</a></li> <li><a href="http://coffee-web.ru/blog/category/iskusstvennyi-intellekt-i-bezopasnost-dannykh/">Искусственный интеллект и безопасность данных</a></li> <li><a href="http://coffee-web.ru/blog/category/tekhnologii-bezopasnost-konfidentsialnost/">Технологии, Безопасность, Конфиденциальность</a></li> <li><a href="http://coffee-web.ru/blog/category/ekologicheskaia-problema/">Экологическая проблема</a></li> <li><a href="http://coffee-web.ru/blog/category/tekhnologii-pogoda/">Технологии, Погода</a></li> <li><a href="http://coffee-web.ru/blog/category/aviatsiia/">Авиация</a></li> <li><a href="http://coffee-web.ru/blog/category/transportnaia-sfera/">Транспортная сфера</a></li> <li><a href="http://coffee-web.ru/blog/category/tekhnologii-i-biznes/">Технологии и бизнес</a></li> <li><a href="http://coffee-web.ru/blog/category/igrovaia-promyshlennost/">Игровая промышленность</a></li> <li><a href="http://coffee-web.ru/blog/category/televidenie-i-reklama/">Телевидение и реклама</a></li> <li><a href="http://coffee-web.ru/blog/category/analitika-dannykh/">Аналитика данных</a></li> <li><a href="http://coffee-web.ru/blog/category/tekhnologii-i-kiberbezopasnost/">Технологии и кибербезопасность</a></li> <li><a href="http://coffee-web.ru/blog/category/marketing/">Маркетинг</a></li> <li><a href="http://coffee-web.ru/blog/category/tekhnologii-i-gadzhety/">Технологии и гаджеты</a></li> <li><a href="http://coffee-web.ru/blog/category/tekhnologii-aviatsiia-innovatsii/">Технологии, Авиация, Инновации</a></li> <li><a href="http://coffee-web.ru/blog/category/finansy-i-investitsii/">Финансы и инвестиции</a></li> <li><a href="http://coffee-web.ru/blog/category/tekhnologii-i-obshchestvo/">Технологии и общество</a></li> <li><a href="http://coffee-web.ru/blog/category/rynochnyi-analiz/">Рыночный анализ</a></li> <li><a href="http://coffee-web.ru/blog/category/kosmologiia/">Космология</a></li> <li><a href="http://coffee-web.ru/blog/category/dannye-i-biznes/">Данные и бизнес</a></li> <li><a href="http://coffee-web.ru/blog/category/it-i-programmirovanie/">IT и программирование</a></li> <li><a href="http://coffee-web.ru/blog/category/tekhnologii-i-pravo/">Технологии и право</a></li> <li><a href="http://coffee-web.ru/blog/category/programmirovanie-i-razrabotka/">Программирование и разработка</a></li> <li><a href="http://coffee-web.ru/blog/category/meditsinskie-tekhnologii/">Медицинские технологии</a></li> <li><a href="http://coffee-web.ru/blog/category/aviatsionnaia-promyshlennost/">Авиационная промышленность</a></li> <li><a href="http://coffee-web.ru/blog/category/tekhnologii-i-iskusstvennyi-intellekt/">Технологии и искусственный интеллект</a></li> <li><a href="http://coffee-web.ru/blog/category/geneticheskaia-inzheneriia/">Генетическая инженерия</a></li> <li><a href="http://coffee-web.ru/blog/category/biznes-i-investitsii/">Бизнес и инвестиции</a></li> <li><a href="http://coffee-web.ru/blog/category/kompiuternaia-promyshlennost/">Компьютерная промышленность</a></li> <li><a href="http://coffee-web.ru/blog/category/psikhologiia-i-sotsiologiia/">Психология и социология</a></li> <li><a href="http://coffee-web.ru/blog/category/obrazovanie-i-tekhnologii/">Образование и технологии</a></li> <li><a href="http://coffee-web.ru/blog/category/rynok-truda/">Рынок труда</a></li> <li><a href="http://coffee-web.ru/blog/category/tekhnologii-startapy/">Технологии, Стартапы</a></li> <li><a href="http://coffee-web.ru/blog/category/tekhnologii-privatnost-chtenie/">Технологии, Приватность, Чтение</a></li> <li><a href="http://coffee-web.ru/blog/category/marketing-i-prodazhi/">Маркетинг и продажи</a></li> <li><a href="http://coffee-web.ru/blog/category/virtualnaia-realnost/">Виртуальная реальность</a></li> <li><a href="http://coffee-web.ru/blog/category/tekhnologii-smartfony-marketing/">Технологии, Смартфоны, Маркетинг</a></li> <li><a href="http://coffee-web.ru/blog/category/tekhnologii-biznes-lichnostnyi-rost/">Технологии, Бизнес, Личностный рост</a></li> <li><a href="http://coffee-web.ru/blog/category/ekologicheskie-problemy/">Экологические проблемы</a></li> <li><a href="http://coffee-web.ru/blog/category/ekonomika-i-tekhnologii/">Экономика и технологии</a></li> <li><a href="http://coffee-web.ru/blog/category/it-i-karera/">IT и карьера</a></li> <li><a href="http://coffee-web.ru/blog/category/internet-i-bezopasnost/">Интернет и безопасность</a></li> <li><a href="http://coffee-web.ru/blog/category/razrabotka-i-tekhnologii/">Разработка и технологии</a></li> <li><a href="http://coffee-web.ru/blog/category/biotekhnologii/">Биотехнологии</a></li> <li><a href="http://coffee-web.ru/blog/category/internet-magaziny-kiberbezopasnost/">Интернет-магазины, кибербезопасность</a></li> <li><a href="http://coffee-web.ru/blog/category/finansy/">Финансы</a></li> <li><a href="http://coffee-web.ru/blog/category/bezopasnost-i-tekhnologii/">Безопасность и технологии</a></li> <li><a href="http://coffee-web.ru/blog/category/ekonomika/">Экономика</a></li> <li><a href="http://coffee-web.ru/blog/category/zashchita-dannykh/">Защита данных</a></li> <li><a href="http://coffee-web.ru/blog/category/data-science/">Data Science</a></li> <li><a href="http://coffee-web.ru/blog/category/karera-i-rabota/">Карьера и работа</a></li> <li><a href="http://coffee-web.ru/blog/category/finansovyi-uspekh-moshennichestvo-marketing/">Финансовый успех, мошенничество, маркетинг</a></li> <li><a href="http://coffee-web.ru/blog/category/bezopasnost/">Безопасность</a></li> <li><a href="http://coffee-web.ru/blog/category/ekologiia/">Экология</a></li> <li><a href="http://coffee-web.ru/blog/category/kosmicheskaia-industriia/">Космическая индустрия</a></li> <li><a href="http://coffee-web.ru/blog/category/programmirovanie-python-obuchenie/">Программирование, Python, Обучение</a></li> <li><a href="http://coffee-web.ru/blog/category/tekhnologii-iskusstvennogo-intellekta/">Технологии искусственного интеллекта</a></li> <li><a href="http://coffee-web.ru/blog/category/tekhnologii-dizain-ios/">Технологии, Дизайн, iOS</a></li> <li><a href="http://coffee-web.ru/blog/category/programmirovanie-devops-kubernetes/">Программирование, DevOps, Kubernetes</a></li> <li><a href="http://coffee-web.ru/blog/category/sotsialnye-seti-i-propaganda/">Социальные сети и пропаганда</a></li> <li><a href="http://coffee-web.ru/blog/category/korporativnaia-etika/">Корпоративная этика</a></li> <li><a href="http://coffee-web.ru/blog/category/upravlenie-it-infrastrukturoi/">Управление IT-инфраструктурой</a></li> <li><a href="http://coffee-web.ru/blog/category/zdorove-i-meditsina/">Здоровье и медицина</a></li> <li><a href="http://coffee-web.ru/blog/category/meditsina/">Медицина</a></li> <li><a href="http://coffee-web.ru/blog/category/meditsinskaia-promyshlennost/">Медицинская промышленность</a></li> <li><a href="http://coffee-web.ru/blog/category/razrabotka-i-dizain/">Разработка и дизайн</a></li> <li><a href="http://coffee-web.ru/blog/category/iskusstvennyi-intellekt-diagnostika-sistem/">Искусственный интеллект, Диагностика систем</a></li> <li><a href="http://coffee-web.ru/blog/category/obrazovanie-i-psikhologiia/">Образование и психология</a></li> <li><a href="http://coffee-web.ru/blog/category/tekhnologii-avtomobilnaia-promyshlennost/">Технологии, Автомобильная промышленность</a></li> <li><a href="http://coffee-web.ru/blog/category/avtomobili-i-puteshestviia/">Автомобили и путешествия</a></li> <li><a href="http://coffee-web.ru/blog/category/astronomiia-i-kosmologiia/">Астрономия и космология</a></li> <li><a href="http://coffee-web.ru/blog/category/programmirovanie-i-tekhnologii/">Программирование и технологии</a></li> <li><a href="http://coffee-web.ru/blog/category/it-rabota-v-ofise-emotsionalnyi-intellekt/">IT, работа в офисе, эмоциональный интеллект</a></li> <li><a href="http://coffee-web.ru/blog/category/kompiuternaia-tekhnika/">Компьютерная техника</a></li> <li><a href="http://coffee-web.ru/blog/category/zdorove-i-blagopoluchie/">Здоровье и благополучие</a></li> <li><a href="http://coffee-web.ru/blog/category/upravlenie-personalom/">Управление персоналом</a></li> <li><a href="http://coffee-web.ru/blog/category/politika-i-upravlenie/">Политика и управление</a></li> <li><a href="http://coffee-web.ru/blog/category/biznes-i-ekonomika/">Бизнес и экономика</a></li> <li><a href="http://coffee-web.ru/blog/category/sotsialnye-seti-propaganda-informatsionnaia-bezopasnost/">Социальные сети, Пропаганда, Информационная безопасность</a></li> <li><a href="http://coffee-web.ru/blog/category/tekhnologii-i-avtomatizatsiia/">Технологии и автоматизация</a></li> <li><a href="http://coffee-web.ru/blog/category/geimdizain/">Геймдизайн</a></li> <li><a href="http://coffee-web.ru/blog/category/ekologiia-i-tekhnologii/">Экология и технологии</a></li> <li><a href="http://coffee-web.ru/blog/category/crm-sistemy-it-infrastruktura/">CRM-системы, IT-инфраструктура</a></li> <li><a href="http://coffee-web.ru/blog/category/prava-cheloveka/">Права человека</a></li> <li><a href="http://coffee-web.ru/blog/category/tsifrovaia-tsenzura-svoboda-slova-tekhnologii/">Цифровая цензура, свобода слова, технологии</a></li> <li><a href="http://coffee-web.ru/blog/category/tekhnologii-iskusstvennyi-intellekt-rabota/">Технологии, Искусственный интеллект, Работа</a></li> <li><a href="http://coffee-web.ru/blog/category/nauka-o-dannykh/">Наука о данных</a></li> <li><a href="http://coffee-web.ru/blog/category/astronomiia-nauka/">Астрономия, Наука</a></li> <li><a href="http://coffee-web.ru/blog/category/internet-i-tsifrovye-tekhnologii/">Интернет и цифровые технологии</a></li> <li><a href="http://coffee-web.ru/blog/category/tekhnologii-upravlenie/">Технологии, управление</a></li> <li><a href="http://coffee-web.ru/blog/category/internet-i-sviaz/">Интернет и связь</a></li> <li><a href="http://coffee-web.ru/blog/category/tekhnologii-i-konfidentsialnost/">Технологии и конфиденциальность</a></li> <li><a href="http://coffee-web.ru/blog/category/internet-i-svoboda-slova/">Интернет и свобода слова</a></li> <li><a href="http://coffee-web.ru/blog/category/psikhologiia-i-sotsialnye-nauki/">Психология и социальные науки</a></li> <li><a href="http://coffee-web.ru/blog/category/knigi-i-literatura/">Книги и литература</a></li> <li><a href="http://coffee-web.ru/blog/category/rabota-i-karera/">Работа и карьера</a></li> <li><a href="http://coffee-web.ru/blog/category/finansovye-tekhnologii/">Финансовые технологии</a></li> <li><a href="http://coffee-web.ru/blog/category/psikhologiia-i-samorazvitie/">Психология и саморазвитие</a></li> <li><a href="http://coffee-web.ru/blog/category/it-programmirovanie-seti/">IT, программирование, сети</a></li> <li><a href="http://coffee-web.ru/blog/category/tekhnologii-videoigry/">Технологии, Видеоигры</a></li> <li><a href="http://coffee-web.ru/blog/category/ekologiia-i-energetika/">Экология и энергетика</a></li> <li><a href="http://coffee-web.ru/blog/category/kosmonavtika/">Космонавтика</a></li> </ul> </div> <!-- Yandex.RTB R-A-1755394-7 --> <div id="yandex_rtb_R-A-1755394-7"></div> <script>window.yaContextCb.push(() => { Ya.Context.AdvManager.render({ "blockId": "R-A-1755394-7", "renderTo": "yandex_rtb_R-A-1755394-7" }) }) </script> </div> </div> </div> <div class="col-lg-6 offset-lg-3 top_30"> </div> </div> <div class="left-prev project-nav blog"> <a href="/blog/smart-contract-security-is-complicated-but-totally-worth-it/">PREVIOUS ARTICLE</a> </div> <div class="right-next project-nav blog"> <a href="/blog/propavshii-domen-5-urokov-kotorye-nuzhno-izvlech-iz-khakerskogo-podkhoda-k-upravleniiu-domenami/">NEXT ARTICLE</a> </div> <footer> <div class="copyright float-left"> <p>COPYRIGHT 2020 COFFEE-WEB.RU</p> </div> <!-- Social Links --> <ul class="social float-right"> <li><a href="#"><i class="fab fa-facebook-f"></i> </a></li> <li><a href="#"><i class="fab fa-twitter" aria-hidden="true"></i> </a></li> <li><a href="#"><i class="fab fa-dribbble" aria-hidden="true"></i> </a></li> <li><a href="#"><i class="fab fa-behance" aria-hidden="true"></i> </a></li> </ul> </footer> <div class="container-fluid page-grid page-bg"> <div class="row"> <div class="col-lg-3 line"></div> <div class="col-lg-3 line"></div> <div class="col-lg-3 line"></div> <div class="col-lg-3 line"></div> </div> </div> </div> <!-- Javascripts --> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> <script src="/static/js/jquery.fullpage.js"></script> <script src="/static/js/animsition.min.js"></script> <script src="/static/js/bootstrap.min.js"></script> <script src="/static/js/modernizr.custom.js"></script> <script src="/static/js/jquery.dlmenu.js"></script> <script src="/static/js/jquery.mb.YTPlayer.min.js"></script> <script src="/static/js/main.js"></script> <script type="text/javascript"> jQuery(function () { jQuery("#bgndVideo").YTPlayer(); }); </script> <script src="/static/js/comments.js"></script> <!-- Yandex.Metrika counter --> <script type="text/javascript"> (function (m, e, t, r, i, k, a) { m[i] = m[i] || function () { (m[i].a = m[i].a || []).push(arguments) }; m[i].l = 1 * new Date(); k = e.createElement(t), a = e.getElementsByTagName(t)[0], k.async = 1, k.src = r, a.parentNode.insertBefore(k, a) }) (window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym"); ym(50511013, "init", { clickmap: true, trackLinks: true, accurateTrackBounce: true, webvisor: true }); <!-- Yandex.RTB R-A-1755394-3 --> window.yaContextCb.push(() => { Ya.Context.AdvManager.render({ type: 'fullscreen', platform: 'touch', blockId: 'R-A-1755394-3' }) }) window.yaContextCb.push(()=>{ Ya.Context.AdvManager.render({ "blockId": "R-A-1755394-8", "type": "fullscreen", "platform": "desktop" }) }) </script> <noscript> <div><img src="https://mc.yandex.ru/watch/50511013" style="position:absolute; left:-9999px;" alt=""/></div> </noscript> <!-- /Yandex.Metrika counter --> </body> </html>