One place for hosting & domains

      Создание сайта Drupal 9 на локальном компьютере с помощью Docker и DDEV


      Автор выбрал Diversity in Tech Fund для получения пожертвования в рамках программы Write for DOnations.

      Введение

      DDEV — это инструмент с открытым исходным кодом, использующий Docker для создания локальной среды разработки для различных структур PHP. Благодаря возможностям контейнеризации DDEV может существенно упростить работу над несколькими проектами, использующими разные технологические комплексы и несколько облачных серверов. В состав DDEV входят шаблоны для WordPress, Laravel, Magento, TYPO3, Drupal и т. д.

      Версия Drupal 9 была выпущена 3 июня 2020 г. для Drupal CMS. Drupal — это популярная структура PHP для создания и обслуживания сайтов и приложений любого масштаба, отличающаяся удобством использования и большой библиотекой модулей и тем.

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

      Предварительные требования

      Для данного обучающего руководства вам потребуется следующее:

      Примечание. Вы можете создать сайт Drupal 9 с помощью DDEV на удаленном сервере, но в этом случае вам потребуется решение для доступа к localhost в браузере. Команда DDEV ddev share работает с ngrok, создавая защищенный туннель к серверу для вас и других пользователей для просмотра сайта в разработке. Для личного использования вы также можете установить графический пользовательский интерфейс на удаленном сервере и подключаться к сайту в разработке через браузер, используя этот интерфейс. Для этого следуйте указаниям руководства по установке и настройке VNC в Ubuntu 20.04. Чтобы графический пользовательский интерфейс был еще быстрее, следуйте указаниям нашего руководства по настройке удаленного рабочего места с помощью X2Go в Ubuntu 20.04.

      Шаг 1 — Установка DDEV

      На этом шаге мы установим DDEV на локальный компьютер. Вариант 1 содержит инструкции для macOS, а Вариант 2 — инструкции для Linux. Мы тестировали этот обучающий модуль с DDEV версии 1.15.0.

      Вариант 1 — Установка DDEV в macOS

      DDEV рекомендует пользователям macOS использовать для установки инструмента диспетчер пакетов Homebrew. Используйте следующую команду brew для установки последнего стабильного выпуска:

      • brew tap drud/ddev && brew install drud/ddev/ddev

      Если вы предпочитаете абсолютно новейшую версию, вы можете использовать brew для установки ddev-edge:

      • brew tap drud/ddev-edge && brew install drud/ddev-edge/ddev

      Если у вас уже установлена версия DDEV или вы хотите обновить имеющуюся версию, закройте DDEV и используйте brew для обновления установки:

      • ddev poweroff
      • brew upgrade ddev

      После установки или обновления DDEV используйте команду ddev version для проверки вашего программного обеспечения:

      Результат должен будет выглядеть следующим образом:

      Output

      DDEV-Local version v1.15.0 commit v1.15.0 db drud/ddev-dbserver-mariadb-10.2:v1.15.0 dba phpmyadmin/phpmyadmin:5 ddev-ssh-agent drud/ddev-ssh-agent:v1.15.0 docker 19.03.8 docker-compose 1.25.5 os darwin router drud/ddev-router:v1.15.0 web drud/ddev-webserver:v1.15.0

      DDEV включает мощный инструмент CLI (или интерфейс командной строки). Запустите ddev, чтобы узнать о самых распространенных командах:

      Результат будет выглядеть следующим образом:

      Output

      Create and maintain a local web development environment. Docs: https://ddev.readthedocs.io Support: https://ddev.readthedocs.io/en/stable/#support Usage: ddev [command] Available Commands: auth A collection of authentication commands composer Executes a composer command within the web container config Create or modify a ddev project configuration in the current directory debug A collection of debugging commands delete Remove all project information (including database) for an existing project describe Get a detailed description of a running ddev project. exec Execute a shell command in the container for a service. Uses the web service by default. export-db Dump a database to a file or to stdout help Help about any command hostname Manage your hostfile entries. import-db Import a sql file into the project. import-files Pull the uploaded files directory of an existing project to the default public upload directory of your project. list List projects logs Get the logs from your running services. pause uses 'docker stop' to pause/stop the containers belonging to a project. poweroff Completely stop all projects and containers pull Pull files and database using a configured provider plugin. restart Restart a project or several projects. restore-snapshot Restore a project's database to the provided snapshot version. sequelpro This command is not available since sequel pro.app is not installed share Share project on the internet via ngrok. snapshot Create a database snapshot for one or more projects. ssh Starts a shell session in the container for a service. Uses web service by default. start Start a ddev project. stop Stop and remove the containers of a project. Does not lose or harm anything unless you add --remove-data. version print ddev version and component versions Flags: -h, --help help for ddev -j, --json-output If true, user-oriented output will be in JSON format. -v, --version version for ddev Use "ddev [command] --help" for more information about a command.

      Дополнительную информацию об использовании DDEV CLI можно найти в официальной документации по DDEV.

      После установки DDEV на локальном компьютере вы будете готовы установить Drupal 9 и начать разработку сайта.

      Вариант 2 — Установка DDEV в Linux

      В операционной системе Linux вы можете установить DDEV, используя Homebrew для Linux или официальный скрипт для установки. Для начала обновите в Ubuntu список пакетов в диспетчере пакетов apt (вы можете использовать apt в Debian или аналогичный диспетчер пакетов для вашего дистрибутива Linux):

      Установите обязательные пакеты из официального репозитория Ubuntu:

      • sudo apt install build-essential apt-transport-https ca-certificates software-properties-common curl

      Эти пакеты позволят вам загрузить сценарий установки DDEV из официального репозитория на GitHub.

      Загрузите скрипт:

      • curl -O https://raw.githubusercontent.com/drud/ddev/master/scripts/install_ddev.sh

      Перед запуском скрипта откройте его в nano или предпочитаемом текстовом редакторе и проверьте его содержимое:

      nano install_ddev.sh
      

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

      Используйте команду chmod, чтобы сделать скрипт исполняемым:

      Запустите скрипт:

      В процессе установки вам может понадобиться подтвердить некоторые настройки или ввести пароль пользователя sudo. После завершения установки DDEV будет доступен в вашей операционной системе Linux.

      Запустите команду ddev version для проверки программного обеспечения:

      Результат должен будет выглядеть следующим образом:

      Output

      DDEV-Local version v1.15.0 commit v1.15.0 db drud/ddev-dbserver-mariadb-10.2:v1.15.0 dba phpmyadmin/phpmyadmin:5 ddev-ssh-agent drud/ddev-ssh-agent:v1.15.0 docker 19.03.8 docker-compose 1.25.5 os linux router drud/ddev-router:v1.15.0 web drud/ddev-webserver:v1.15.0

      DDEV — мощный инструмент CLI (интерфейс командной строки). Запустите команду ddev без опций, чтобы узнать о некоторых распространенных командах:

      Результат будет выглядеть следующим образом:

      Output

      Create and maintain a local web development environment. Docs: https://ddev.readthedocs.io Support: https://ddev.readthedocs.io/en/stable/#support Usage: ddev [command] Available Commands: auth A collection of authentication commands composer Executes a composer command within the web container config Create or modify a ddev project configuration in the current directory debug A collection of debugging commands delete Remove all project information (including database) for an existing project describe Get a detailed description of a running ddev project. exec Execute a shell command in the container for a service. Uses the web service by default. export-db Dump a database to a file or to stdout help Help about any command hostname Manage your hostfile entries. import-db Import a sql file into the project. import-files Pull the uploaded files directory of an existing project to the default public upload directory of your project. list List projects logs Get the logs from your running services. pause uses 'docker stop' to pause/stop the containers belonging to a project. poweroff Completely stop all projects and containers pull Pull files and database using a configured provider plugin. restart Restart a project or several projects. restore-snapshot Restore a project's database to the provided snapshot version. sequelpro This command is not available since sequel pro.app is not installed share Share project on the internet via ngrok. snapshot Create a database snapshot for one or more projects. ssh Starts a shell session in the container for a service. Uses web service by default. start Start a ddev project. stop Stop and remove the containers of a project. Does not lose or harm anything unless you add --remove-data. version print ddev version and component versions Flags: -h, --help help for ddev -j, --json-output If true, user-oriented output will be in JSON format. -v, --version version for ddev Use "ddev [command] --help" for more information about a command.

      Дополнительную информацию об использовании DDEV CLI можно найти в официальной документации по DDEV.

      После установки DDEV на локальном компьютере вы будете готовы установить Drupal 9 и начать разработку сайта.

      Шаг 2 — Развертывание нового сайта Drupal 9 с помощью DDEV

      Запустив DDEV, вы можете использовать его для создания файловой системы Drupal, установки Drupal 9 и создания стандартного проекта сайта.

      Вначале мы создадим корневой каталог проекта и перейдем в него. Все остальные команды мы будем запускать отсюда. В этом обучающем модуле мы будем использовать имя каталога d9test, но вы можете выбрать любое предпочитаемое имя. Обратите внимание, что DDEV не очень хорошо обрабатывает имена с дефисами. Желательно избегать использования таких имен каталогов, как my-project или drupal-site-1.

      Создайте корневой каталог проекта и перейдите в него:

      DDEV отлично создает деревья каталогов, соответствующие определенным платформам CMS. Используйте команду ddev config для создания специальной структуры каталогов для Drupal 9:

      • ddev config --project-type=drupal9 --docroot=web --create-docroot

      Результат должен будет выглядеть следующим образом:

      Output

      Creating a new ddev project config in the current directory (/Users/sammy/d9test) Once completed, your configuration will be written to /Users/sammy/d9test/.ddev/config.yaml Created docroot at /Users/sammy/d9test/web You have specified a project type of drupal9 but no project of that type is found in /Users/sammy/d9test/web Ensuring write permissions for d9new No settings.php file exists, creating one Existing settings.php file includes settings.ddev.php Configuration complete. You may now run 'ddev start'.

      Поскольку вы передали аргумент --project-type=drupal9 в команду ddev config, DDEV создаст несколько подкаталогов и файлов, используемых по умолчанию для организации сайта Drupal. Ваше дерево каталогов проекта теперь будет выглядеть так:

      A Drupal 9 directory tree

      .
      ├── .ddev
      │   ├── .gitignore
      │   ├── config.yaml
      │   ├── db-build
      │   │   └── Dockerfile.example
      │   └── web-build
      │       └── Dockerfile.example
      └── web
          └── sites
              └── default
                  ├── .gitignore
                  ├── settings.ddev.php
                  └── settings.php
      
      6 directories, 7 files
      

      .ddev/ будет главной папкой для конфигурации ddev. web/ будет корневым каталогом документов нового проекта и будет содержать определенные файлы settings. Вы подготовили структуру для создания нового проекта Drupal.

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

      Используйте команду ddev start для инициализации платформы:

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

      Output

      ... Successfully started d9test Project can be reached at http://d9test.ddev.site http://127.0.0.1:32773

      Примечание. Помните, что DDEV запускает контейнеры Docker скрыто. Если вы хотите просмотреть эти контейнеры или убедиться, что они работают, используйте команду docker ps:

      Вместе с другими запущенными контейнерами вы увидите четыре новых контейнера с отдельными образами: php-myadmin, ddev-webserver, ddev-router и ddev-dbserver-mariadb.

      Команда ddev start успешно построила контейнеры и вывела результаты с двумя URL. Хотя в выводимом сообщении говорится, что проект можно найти по URL-адресам http://d9test.ddev.site и http://127.0.0.1:32773, сейчас при попытке открыть любой из этих URL будет выведено сообщение об ошибке. Начиная с Drupal 8, ядро Drupal и модули contrib работают как зависимости. Поэтому нужно предварительно завершить установку Drupal с помощью диспетчера пакетов Composer для проектов PHP, прежде чем в браузере получится что-либо загрузить.

      Одна из самых полезных и элегантных возможностей DDEV — возможность передачи команд Composer через DDEV CLI и в среду с контейнерами. Это означает, что вы можете отделить конфигурацию вашего компьютера от среды разработки. Вам больше не нужно будет управлять путями к различным файлам и зависимостями или решать проблемы с версиями, часто возникающие при разработке PHP на локальном компьютере. Более того, вы сможете быстро и с минимумом трудозатрат переключаться между разными проектами, использующими разные структуры и технологические комплексы.

      Используйте команду ddev composer для загрузки проекта drupal/recommended-project. Она загрузит ядро Drupal, библиотеки и другие связанные ресурсы, а затем создаст проект по умолчанию:

      • ddev composer create "drupal/recommended-project"

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

      Используйте команду ddev composer для установки drush:

      • ddev composer require "drush/drush"

      Мы создали проект Drupal 9 по умолчанию и выполнили установку drush. Теперь мы откроем проект в браузере и настроим параметры сайта.

      Шаг 3 — Настройка проекта Drupal 9

      Вы установили Drupal 9 и теперь можете открыть свой новый проект в браузере. Для этого вы можете повторно запустить команду ddev start и скопировать один из двух выводимых ей URL, или использовать следующую команду, которая автоматически откроет ваш сайт в новом окне браузера:

      Откроется стандартный мастер установки Drupal.

      Установщик Drupal 9 из браузера

      Теперь у вас есть два варианта. Вы можете использовать этот пользовательский интерфейс и следовать указаниям мастера по установке, или вы можете вернуться в терминал и передать команду drush через ddev. Последний вариант автоматизирует процесс установки и задает admin как имя пользователя и пароль.

      Вариант 1 — Использование мастера

      Снова откройте мастер в браузере. В разделе Choose language (Выбор языка) выберите язык из выпадающего меню и нажмите Save and continue (Сохранить и продолжить). Выберите профиль установки. Вы можете выбрать вариант Standard (Стандартный), Minimal (Минимальный) или Demo (Демо). Сделайте выбор и нажмите Save and continue (Сохранить и продолжить). Drupal автоматически проверит ваши требования, настроит базу данных и установит ваш сайт. Последним шагом будет настройка нескольких конфигураций. Добавьте имя сайта и адрес электронной почты сайта с вашим доменом. Затем выберите имя пользователя и пароль. Выберите надежный пароль и сохраните ваши учетные данные в безопасном месте. В заключение добавьте частный адрес электронной почты, который вы регулярно проверяете, внесите региональные настройки и нажмите Save and continue (Сохранить и продолжить).

      Приветственное сообщение Drupal 9 с предупреждением о разрешениях

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

      Вариант 2 — Использование командной строки

      Запустите в корневом каталоге проекта следующую команду ddev exec для установки сайта Drupal по умолчанию с помощью drush:

      • ddev exec drush site:install --account-name=admin --account-pass=admin

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

      Запустите сайт для просмотра в браузере:

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

      Шаг 4 — Проверка разрешений

      Во время установки мастера или при первой загрузке приветственной страницы вы можете увидеть предупреждение о настройках разрешений для каталога /sites/web/default и одного файла внутри этого каталога: settings.php.

      После запуска установочного скрипта Drupal попробует установить для каталога web/sites/default разрешения на чтение и исполнение для всех групп: это параметр разрешений 555. Также он попытается установить для default/settings.php разрешение «только чтение» или 444. Если вы увидите это предупреждение, запустите эти две команды chmod из корневого каталога проекта. В противном случае возникнет риск для безопасности:

      • chmod 555 web/sites/default
      • chmod 444 web/sites/default/settings.php

      Чтобы убедиться в наличии правильных разрешений, запустите эту команду ls с аргументами a, l, h и d:

      • ls -alhd web/sites/default web/sites/default/settings.php

      Убедитесь, что разрешения соответствуют следующему выводу:

      Output

      dr-xr-xr-x 8 sammy staff 256 Jul 21 12:56 web/sites/default -r--r--r-- 1 sammy staff 249 Jul 21 12:12 web/sites/default/settings.php

      Вы готовы начать создание сайта Drupal 9 на локальном компьютере.

      Шаг 5 — Создание первого поста в Drupal

      Чтобы протестировать определенную функцию Drupal, вы создадите пост с помощью пользовательского веб-интерфейса.

      Нажмите на начальной странице сайта кнопку Content (Содержимое) в левом верхнем меню. Нажмите синюю кнопку Add content (Добавить содержимое). Откроется новая страница. Нажмите Article (Статья), и появится еще одна страница.

      Строка создания статьи в Drupal 9

      Добавьте любые предпочитаемые заголовок и содержимое. Также вы можете добавить изображение, например, одни из обоев DigitalOcean. Когда вы будете готовы, нажмите синюю кнопку Save (Сохранить).

      На вашем сайте появится ваш первый пост.

      Созданный пост в Drupal 9

      Теперь вы создаете сайт Drupal 9 на локальном компьютере без взаимодействия с сервером благодаря Docker и DDEV. На следующем шаге мы будем управлять контейнером DDEV с учетом вашего рабочего процесса.

      Шаг 6 — Управление контейнером DDEV

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

      Вы можете остановить DDEV в любое время для освобождения ресурсов. Запустите следующую команду в каталоге вашего проекта:

      DDEV доступен глобально, так что вы сможете запускать команды ddev из любого места, если вы зададите проект DDEV:

      Также вы можете просмотреть все проекты одновременно с помощью команды ddev list:

      В DDEV имеется много других полезных команд.

      Вы можете перезапустить DDEV и продолжить разработку на локальном компьютере в любое время.

      Заключение

      В этом обучающем модуле мы использовали Docker и возможности контейнеризации для разработки сайта Drupal на локальной системе с помощью DDEV. Также DDEV интегрируется с несколькими интегрированными средами разработки и имеет встроенную поддержку отладки PHP для Atom, PHPStorm и Visual Studio Code (vscode). Далее вы можете узнать больше о создании сред разработки для Drupal с DDEV или для разработки с использованием других структур PHP, таких как WordPress.



      Source link

      Создание бота Slackbot на Python в Ubuntu 20.04


      Автор выбрал Tech Education Fund для получения пожертвования в рамках программы Write for DOnations.

      Введение

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

      В этом обучающем модуле мы создадим бот Slackbot на языке программирования Python. Python — это популярный язык программирования, отличающийся простотой и удобством чтения синтаксиса. В Slack имеется функциональный Python Slack API для интеграции со Slack с целью выполнения распространенных задач, в том числе отправки сообщений, добавления эмодзи в сообщения и т. д. Также в Slack имеется Python Slack Events API для интеграции с событиями в Slack, позволяющий выполнять действия при определенных событиях, например отправлять сообщения и делать упоминания.

      В качестве интересного концептуального испытания, которое покажет возможности Python и его Slack API, мы создадим CoinBot — бот Slackbot, отслеживающий канал и бросающий монетку при активации. После этого вы сможете модифицировать свой бот CoinBot для выполнения любого количества _немного _более практичных задач.

      Обратите внимание, что в этом обучающем модуле используется Python 3, и что он не совместим с Python 2.

      Предварительные требования

      Для выполнения этого обучающего руководства вам потребуется следующее:

      • Рабочее пространство Slack Workspace, куда вы можете устанавливать приложения. Если вы создали рабочее пространство, такая возможность у вас есть. Если вы еще не сделали этого, вы можете создать рабочее пространство на сайте Slack.

      • (Необязательно) Сервер или компьютер с публичным IP-адресом для разработки. Мы рекомендуем использовать сервер со свежеустановленной ОС Ubuntu 20.04, пользователем без прав root с привилегиями sudo и поддержкой SSH. Вы можете воспользоваться этим руководством для инициализации сервера и выполнения этих шагов.

      Вы можете проверить этот обучающий модуль на сервере с публичным IP-адресом. Slack потребуется возможность отправлять вашему боту события, в том числе сообщения. Если вы выполняете тестирование на локальном компьютере, вам потребуется порт для пересылки трафика через брандмауэр на локальный компьютер. Если вы ищете способ разработки на облачном сервере, ознакомьтесь с обучающим модулем «Использование Visual Studio Code для удаленной разработки через плагин Remote-SSH».

      Шаг 1 — Создание бота Slackbot в пользовательском интерфейсе Slack

      Для начала создайте приложение Slack в панели управления Slack API. Войдите в рабочее пространство Slack через браузер и перейдите в панель управления API. Нажмите кнопку Create an App (Создать приложение).

      Создание вашего приложения Slack

      Далее вам будет предложено указать название приложения и выбрать рабочее пространство Slack для разработки. Для целей этого обучающего модуля назовите свое приложение CoinBot и выберите рабочее пространство, к которому у вас есть доступ с правами администратора. После этого нажмите кнопку Create App (Создать приложение).

      Именование вашего приложения Slack и выбор рабочего пространства

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

      Панель приложения Slack по умолчанию

      Чтобы ваше приложение могло отправлять сообщения на канал, вы должны предоставить ему разрешения на отправку сообщений. Для этого нажмите кнопку Permissions (Разрешения) на панели управления.

      Кнопка Permissions (Разрешения) на панели управления

      Прокрутите вниз страницу OAuth & Permissions (OAuth и разрешения), пока не найдете раздел Scopes (Области действия). Найдите подраздел Bot Token Scopes (Области действия токена бота) в области действия и нажмите кнопку Add an OAuth Scope (Добавить область действия OAuth).

      Кнопка Add an OAuth Scope (Добавить область действия OAuth)

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

      Добавление разрешения chat:write

      Мы добавили необходимое разрешение и теперь можем установить приложение в рабочее пространство Slack. Прокрутите страницу OAuth & Permissions (OAuth и разрешения) вверх и нажмите кнопку Install App to Workspace (Установить приложение в рабочее пространство) сверху.

      Установка приложения в рабочее пространство

      Нажмите эту кнопку и посмотрите, какие действия приложение может выполнять на канале. После этого нажмите кнопку Allow (Разрешить) для завершения установки.

      Установка приложения в рабочее пространство

      После установки бота вы получите для вашего приложения токен доступа Bot User OAuth Access Token, который оно сможет использовать для выполнения действий в рабочем пространстве. Скопируйте этот токен, поскольку позднее он вам потребуется.

      Сохранение токена доступа

      В заключение добавьте новый бот в канал внутри вашего рабочего пространства. Если вы еще не создали канала, используйте канал #general, который создается по умолчанию в вашем рабочем пространстве Slack. Найдите приложение в разделе Apps (Приложения) на панели навигации клиента Slack и нажмите на него. Затем откройте меню Details (Сведения) в правом верхнем углу. Если ваш клиент Slack открыт не в полноэкранном режиме, значок этого меню будет выглядеть как буква i внутри окружности.

      Значок App Details (Сведения о приложении)

      Чтобы завершить добавление приложения на канал, нажмите кнопку More (Дополнительно) со значком трех точек на странице сведений и выберите Add this app to a channel… (Добавить это приложение в канал…). Введите название канала в открытое модальное окно и нажмите Add (Добавить).

      Добавление приложения в канал

      Вы успешно создали приложение и добавили его в канал в своем рабочем пространстве Slack. Когда вы напишете код своего приложения, оно сможет отправлять сообщения в этот канал. В следующем разделе мы начнем писать код Python, на основе которого будет работать CoinBot.

      Шаг 2 — Настройка среды разработки Python

      Вначале настроим среду разработки Python, чтобы вы могли заняться разработкой Slackbot.

      Откройте терминал и установите в свою систему python3 и необходимые инструменты:

      • sudo apt install python3 python3-venv

      Далее нужно создать виртуальную среду, чтобы изолировать ваши пакеты Python от системной установки Python. Для этого создайте каталог, где вы создадите свою виртуальную среду. Создайте новый каталог ~/.venvs:

      Затем создайте виртуальную среду Python:

      • python3 -m venv ~/.venvs/slackbot

      Затем активируйте виртуальную среду, чтобы использовать установленную версию Python и установочные пакеты:

      • source ~/.venvs/slackbot/bin/activate

      В заголовке командной строки теперь будет отображаться название виртуальной среды (в скобках). Оно будет выглядеть примерно так:

      Используйте pip для установки необходимых пакетов Python в вашу виртуальную среду:

      • pip install slackclient slackeventsapi Flask

      slackclient и slackeventsapi упрощают взаимодействие Python с API Slack. Flask — популярная веб-микроструктура, которую мы используем для развертывания приложения:

      Мы настроили среду разработки и теперь можем приступить к написанию бота Python Slackbot:

      Шаг 3 — Создание класса сообщений Slackbot в Python

      Сообщения в Slack отправляются через полезную нагрузку JSON в определенном формате. Вот пример кода JSON, составляемого Slackbot и отправляемого как сообщение:

      {
         "channel":"channel",
         "blocks":[
            {
               "type":"section",
               "text":{
                  "type":"mrkdwn",
                  "text":"Sure! Flipping a coin....nn"
               }
            },
            {
               "type":"section",
               "text":{
                  "type":"mrkdwn",
                  "text":"*flips coin* The result is Tails."
               }
            }
         ]
      }
      

      Вы можете вручную создать этот код JSON и отправить его, но вместо этого мы создадим класс Python, который не только создает эту полезную нагрузку, но также моделирует бросок монеты.

      Для начала используйте команду touch, чтобы создать файл с именем coinbot.py:

      Затем откройте этот файл с помощью nano или своего любимого редактора:

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

      Добавьте в файл coinbot.py следующие строки, чтобы импортировать все необходимые библиотеки:

      coinbot.py

      # import the random library to help us generate the random numbers
      import random
      

      Затем создайте класс CoinBot и экземпляр этого класса для создания полезной нагрузки сообщения. Добавьте в файл coinbot.py следующие строки, чтобы создать класс CoinBot:

      coinbot.py

      ...
      class CoinBot:
      

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

      Добавьте в файл coinbot.py следующие строки, чтобы создать базовый шаблон полезной нагрузки:

      coinbot.py

      ...
          # Create a constant that contains the default text for the message
          COIN_BLOCK = {
              "type": "section",
              "text": {
                  "type": "mrkdwn",
                  "text": (
                      "Sure! Flipping a coin....nn"
                  ),
              },
          }
      

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

      Добавьте в файл coinbot.py следующие строки для создания конструктора:

      coinbot.py

      ...
          # The constructor for the class. It takes the channel name as the a
          # parameter and sets it as an instance variable.
          def __init__(self, channel):
              self.channel = channel
      

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

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

      coinbot.py

      ...
          # Generate a random number to simulate flipping a coin. Then return the
          # crafted slack payload with the coin flip message.
          def _flip_coin(self):
              rand_int =  random.randint(0,1)
              if rand_int == 0:
                  results = "Heads"
              else:
                  results = "Tails"
      
              text = f"The result is {results}"
      
              return {"type": "section", "text": {"type": "mrkdwn", "text": text}},
      

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

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

      coinbot.py

      ...
          # Craft and return the entire message payload as a dictionary.
          def get_message_payload(self):
              return {
                  "channel": self.channel,
                  "blocks": [
                      self.COIN_BLOCK,
                      *self._flip_coin(),
                  ],
              }
      

      Мы завершили создание класса CoinBot, и теперь он готов к тестированию. Прежде чем продолжить, убедитесь, что готовый файл coinbot.py содержит следующие строки:

      coinbot.py

      # import the random library to help us generate the random numbers
      import random
      
      # Create the CoinBot Class
      class CoinBot:
      
          # Create a constant that contains the default text for the message
          COIN_BLOCK = {
              "type": "section",
              "text": {
                  "type": "mrkdwn",
                  "text": (
                      "Sure! Flipping a coin....nn"
                  ),
              },
          }
      
          # The constructor for the class. It takes the channel name as the a
          # parameter and then sets it as an instance variable
          def __init__(self, channel):
              self.channel = channel
      
          # Generate a random number to simulate flipping a coin. Then return the
          # crafted slack payload with the coin flip message.
          def _flip_coin(self):
              rand_int =  random.randint(0,1)
              if rand_int == 0:
                  results = "Heads"
              else:
                  results = "Tails"
      
              text = f"The result is {results}"
      
              return {"type": "section", "text": {"type": "mrkdwn", "text": text}},
      
          # Craft and return the entire message payload as a dictionary.
          def get_message_payload(self):
              return {
                  "channel": self.channel,
                  "blocks": [
                      self.COIN_BLOCK,
                      *self._flip_coin(),
                  ],
              }
      

      Сохраните и закройте файл.

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

      Шаг 4 — Тестирование вашего сообщения

      Протестируем этот класс и убедимся, что он создает надлежащую полезную нагрузку. Создайте файл с именем coinbot_test.py:

      Добавьте в него следующий код. Обязательно измените имя канала в экземпляре класса coinbot coin_bot = coinbot("#YOUR_CHANNEL_HERE "). Этот код создаст в Python клиент Slack, который будет отправлять сообщение на указанный вами канал, куда вы уже установили приложение:

      coinbot_test.py

      from slack import WebClient
      from coinbot import CoinBot
      import os
      
      # Create a slack client
      slack_web_client = WebClient(token=os.environ.get("SLACK_TOKEN"))
      
      # Get a new CoinBot
      coin_bot = CoinBot("#YOUR_CHANNEL_HERE")
      
      # Get the onboarding message payload
      message = coin_bot.get_message_payload()
      
      # Post the onboarding message in Slack
      slack_web_client.chat_postMessage(**message)
      

      Сохраните и закройте файл.

      Прежде чем вы сможете запустить этот файл, вам нужно будет экспортировать токен Slack, сохраненный на шаге 1, как переменную среды:

      • export SLACK_TOKEN="your_bot_user_token"

      Протестируйте этот файл и запустите в терминале следующий скрипт, чтобы проверить создание и отправку полезной нагрузки. Убедитесь, что ваша виртуальная среда активирована. Чтобы проверить это, посмотрите, отображается ли текст (slackbot) в заголовке командной строки bash. Запустите эту команду, чтобы получить от бота Slackbot сообщение с результатами броска монеты:

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

      Тест броска монеты

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

      Шаг 5 — Создание приложения Flask для запуска бота Slackbot

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

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

      Настроите брандмауэр, чтобы разрешить трафик через порт 3000:

      Проверьте статус ufw:

      Результат должен будет выглядеть следующим образом:

      Output

      Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere 3000 ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) 3000 (v6) ALLOW Anywhere (v6)

      Создайте файл для вашего приложения Flask и присвойте ему имя app.py:

      Откройте этот файл в предпочитаемом текстовом редакторе:

      Добавьте следующие statements импорта. Мы импортируем следующие библиотеки по следующим причинам:

      • import os — доступ к переменным среды
      • import logging — регистрация событий приложения
      • from flask import Flask — создание приложения Flask
      • from slack import WebClient — отправка сообщений через Slack
      • from slackeventsapi import SlackEventAdapter — получение событий Slack и их обработка
      • from coinbot import CoinBot — создание экземпляра CoinBot и генерирование полезной нагрузки сообщения.

      Добавьте в файл app.py следующие строки, чтобы импортировать все необходимые библиотеки:

      app.py

      import os
      import logging
      from flask import Flask
      from slack import WebClient
      from slackeventsapi import SlackEventAdapter
      from coinbot import CoinBot
      

      Теперь создайте приложение Flask и зарегистрируйте в вашем приложении Slack адаптер Slack Event Adapter с конечной точкой /slack/events. В вашем приложении Slack будет создан маршрут для отправки и обработки событий Slack. Для этого вам нужно будет получить от приложения Slack еще один токен, что мы сделаем на следующих шагах этого обучающего модуля. После получения этой переменной мы экспортируем ее как переменную среды с именем SLACK_EVENTS_TOKEN. Теперь напишите код, чтобы прочитать его при создании адаптера SlackEventAdapter, хотя вы еще не задали токен.

      Добавьте в файл app.py следующие строки, чтобы создать приложение Flask и зарегистрировать адаптер событий в этом приложении:

      app.py

      ...
      # Initialize a Flask app to host the events adapter
      app = Flask(__name__)
      
      # Create an events adapter and register it to an endpoint in the slack app for event ingestion.
      slack_events_adapter = SlackEventAdapter(os.environ.get("SLACK_EVENTS_TOKEN"), "/slack/events", app)
      

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

      Добавьте в файл app.py следующую строку для создания slack_web_client:

      app.py

      ...
      # Initialize a Web API client
      slack_web_client = WebClient(token=os.environ.get("SLACK_TOKEN"))
      

      Теперь создайте вызываемую функцию, которая будет создавать экземпляр CoinBot, а затем использовать этот экземпляр для создания полезной нагрузки сообщения и ее передачи в веб-клиент Slack для доставки. Эта функция будет принимать единственный параметр, channel, который будет определять канал, куда будет доставляться сообщение.

      Добавьте в файл app.py следующие строки для создания этой функции:

      app.py

      ...
      def flip_coin(channel):
          """Craft the CoinBot, flip the coin and send the message to the channel
          """
          # Create a new CoinBot
          coin_bot = CoinBot(channel)
      
          # Get the onboarding message payload
          message = coin_bot.get_message_payload()
      
          # Post the onboarding message in Slack
          slack_web_client.chat_postMessage(**message)
      

      Мы создали функцию приложения для работы с сообщениями, а теперь создадим функцию, которая будет отслеживать события Slack на предмет определенных действий, а затем запускать бота. Мы настроим приложение так, чтобы оно отправляло результаты броска монеты в ответ на фразу «Hey Sammy, Flip a coin». Приложение будет отвечать на эту фразу в любом виде независимо от регистра.

      Вначале добавьте в функцию синтаксис @slack_events_adapter.on, позволяющий функции получать события. Укажите, что хотите получать только события message, и разрешите функции принимать параметр полезной нагрузки, содержащий всю необходимую информацию Slack. После получения полезной нагрузки функция будет выполнять синтаксический анализ извлеченного текста, а при обнаружении активирующей фразы приложение будет отправлять результаты броска монеты.

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

      app.py

      # When a 'message' event is detected by the events adapter, forward that payload
      # to this function.
      @slack_events_adapter.on("message")
      def message(payload):
          """Parse the message event, and if the activation string is in the text,
          simulate a coin flip and send the result.
          """
      
          # Get the event data from the payload
          event = payload.get("event", {})
      
          # Get the text from the event that came through
          text = event.get("text")
      
          # Check and see if the activation phrase was in the text of the message.
          # If so, execute the code to flip a coin.
          if "hey sammy, flip a coin" in text.lower():
              # Since the activation phrase was met, get the channel ID that the event
              # was executed on
              channel_id = event.get("channel")
      
              # Execute the flip_coin function and send the results of
              # flipping a coin to the channel
              return flip_coin(channel_id)
      

      В заключение создайте раздел main, создающий регистратор для просмотра внутренних данных приложения и запускающий приложение с внешнего IP-адреса через порт 3000. Чтобы обрабатывать события Slack (например, при отправке нового сообщения), необходимо протестировать приложение на общедоступном IP-адресе.

      Добавьте в файл app.py следующие строки для настройки раздела main:

      app.py

      if __name__ == "__main__":
          # Create the logging object
          logger = logging.getLogger()
      
          # Set the log level to DEBUG. This will increase verbosity of logging messages
          logger.setLevel(logging.DEBUG)
      
          # Add the StreamHandler as a logging handler
          logger.addHandler(logging.StreamHandler())
      
          # Run your app on your externally facing IP address on port 3000 instead of
          # running it on localhost, which is traditional for development.
          app.run(host="0.0.0.0", port=3000)
      

      Мы завершили создание приложения Flask, и теперь оно готово к тестированию. Прежде чем двигаться дальше, убедитесь, что готовый файл app.py содержит следующие строки:

      app.py

      import os
      import logging
      from flask import Flask
      from slack import WebClient
      from slackeventsapi import SlackEventAdapter
      from coinbot import CoinBot
      
      # Initialize a Flask app to host the events adapter
      app = Flask(__name__)
      # Create an events adapter and register it to an endpoint in the slack app for event injestion.
      slack_events_adapter = SlackEventAdapter(os.environ.get("SLACK_EVENTS_TOKEN"), "/slack/events", app)
      
      # Initialize a Web API client
      slack_web_client = WebClient(token=os.environ.get("SLACK_TOKEN"))
      
      def flip_coin(channel):
          """Craft the CoinBot, flip the coin and send the message to the channel
          """
          # Create a new CoinBot
          coin_bot = CoinBot(channel)
      
          # Get the onboarding message payload
          message = coin_bot.get_message_payload()
      
          # Post the onboarding message in Slack
          slack_web_client.chat_postMessage(**message)
      
      
      # When a 'message' event is detected by the events adapter, forward that payload
      # to this function.
      @slack_events_adapter.on("message")
      def message(payload):
          """Parse the message event, and if the activation string is in the text,
          simulate a coin flip and send the result.
          """
      
          # Get the event data from the payload
          event = payload.get("event", {})
      
          # Get the text from the event that came through
          text = event.get("text")
      
          # Check and see if the activation phrase was in the text of the message.
          # If so, execute the code to flip a coin.
          if "hey sammy, flip a coin" in text.lower():
              # Since the activation phrase was met, get the channel ID that the event
              # was executed on
              channel_id = event.get("channel")
      
              # Execute the flip_coin function and send the results of
              # flipping a coin to the channel
              return flip_coin(channel_id)
      
      if __name__ == "__main__":
          # Create the logging object
          logger = logging.getLogger()
      
          # Set the log level to DEBUG. This will increase verbosity of logging messages
          logger.setLevel(logging.DEBUG)
      
          # Add the StreamHandler as a logging handler
          logger.addHandler(logging.StreamHandler())
      
          # Run our app on our externally facing IP address on port 3000 instead of
          # running it on localhost, which is traditional for development.
          app.run(host="0.0.0.0", port=3000)
      

      Сохраните и закройте файл.

      Приложение Flask теперь готово обслуживать ваше приложение, и сейчас мы протестируем это.

      Шаг 6 — Запуск приложения Flask

      В заключение мы соединим все элементы и запустим наше приложение.

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

      Перейдите в раздел Basic Information (Базовая информация) вашего приложения в пользовательском интерфейсе Slack. Прокручивайте экран вниз, пока не найдете раздел App Credentials (Полномочия приложения).

      Секретная подпись Slack

      Скопируйте секретную подпись (Signing Secret) и экспортируйте ее в переменную среды SLACK_EVENTS_TOKEN:

      • export SLACK_EVENTS_TOKEN="MY_SIGNING_SECRET_TOKEN"

      Теперь у вас имеются все необходимые токены API для запуска вашего приложения. Обратитесь к шагу 1, если вам потребуется напоминание о том, как экспортировать SLACK_TOKEN. Теперь вы можете запустить свое приложение и убедиться, что оно действительно работает. Убедитесь, что виртуальная среда активирована, и выполните следующую команду для запуска приложения Flask:

      Результат должен будет выглядеть следующим образом:

      (slackbot) [20:04:03] sammy:coinbot$ python app.py
       * Serving Flask app "app" (lazy loading)
       * Environment: production
         WARNING: This is a development server. Do not use it in a production deployment.
         Use a production WSGI server instead.
       * Debug mode: off
       * Running on http://0.0.0.0:3000/ (Press CTRL+C to quit)
      

      Чтобы убедиться, что ваше приложение работает, откройте новое окно терминала и запустите команду curl с IP-адресом вашего сервера, указав правильный порт /slack/events:

      • curl http://YOUR_IP_ADDRESS:3000/slack/events

      В результате выполнения curl будет получено следующее:

      Output

      These are not the slackbots you're looking for.

      Получение сообщения These are not the slackbots you're looking for. означает, что ваше приложение запущено и работает.

      Оставьте это приложение Flask работать, пока вы не завершите настройку приложения в пользовательском интерфейсе Slack.

      Предоставьте своему приложению необходимые разрешения для мониторинга сообщений и реагирования на них. Откройте раздел Event Subscriptions (Подписка на события) в боковой панели пользовательского интерфейса и нажмите кнопку Enable Events (Активировать события).

      Кнопка Enable Events (Активировать события)

      После этого введите свой IP-адрес, порт и конечную точку /slack/events в поле Request URL (URL-адрес запроса). Не забудьте указать префикс протокола HTTP. Slack попытается выполнить подключение к указанной конечной точке. После успешного подключения вы увидите зеленую отметку со словом Verified (Проверено).

      URL-адрес запроса подписки на события

      Затем откройте раздел Subscribe to bot events (Подписка на события ботов) и добавьте для вашего приложения разрешение message.channels. Это позволит вашему приложению получать сообщения от канала и обрабатывать их.

      Разрешения на подписку на события ботов

      После этого вы увидите событие в списке в разделе Subscribe to bot events (Подписка на события ботов). Затем нажмите зеленую кнопку Save Changes (Сохранить изменения) в правом нижнем углу.

      Подтверждение и сохранение изменений

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

      Баннер переустановки приложения

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

      Подтверждение переустановки

      Теперь ваше приложение должно быть готово к работе. Вернитесь на канал, где вы установили CoinBot, и отправьте сообщение с фразой «Hey Sammy, Flip a coin». Ваш бот смоделирует бросок монеты и ответит с результатами. Поздравляем! Вы создали бота Slackbot!

      Hey Sammy, Flip a coin

      Заключение

      После завершения разработки приложения вам нужно будет развернуть его на сервере для переноса в производственную среду. Это необходимо, потому что сервер разработки Flask не является защищенной производственной средой. Будет лучше, если вы развернете приложение с помощью WSGI и, возможно, закрепите за ним доменное имя и создадите запись DNS для вашего сервера. Существует много вариантов развертывания приложения Flask, некоторые из которых перечислены ниже:

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

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

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



      Source link

      Электронная книга «Программирование на Go»


      Загрузите полную электронную книгу!

      Электронная книга «Программирование на Go» в формате EPUB

      Электронная книга «Программирование на Go» в формате PDF

      Описание электронной книги

      Эта книга расскажет вам о написании программ на языке программирования Go. Вы узнаете, как писать полезные инструменты и приложения, которые можно запускать на удаленных серверах или локальных компьютерах Windows, macOS и Linux для разработки.

      Эта книга основана на серии обучающих модулей «Программирование на Go» сообщества DigitalOcean. В ней освещены следующие темы:

      1. Установка и настройка локальной среды разработки Go на системах под управлением Windows, macOS и Linux

      2. Проектирование программ с условной логикой, в том числе операторами switch для управления ходом выполнения программы

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

      4. Написание собственных функций обработки ошибок

      5. Сборка и установка программ Go для их запуска на разных операционных системах и процессорных архитектурах

      6. Использование флагов для передачи аргументов в программы для переопределения параметров по умолчанию

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

      Загрузить электронную книгу

      Вы можете загрузить электронную книгу в формате EPUB или PDF по одной из следующих ссылок.

      Загрузите полную электронную книгу!

      Электронная книга «Программирование на Go» в формате EPUB

      Электронная книга «Программирование на Go» в формате PDF

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



      Source link