Изучение 26 методов анализа больших данных: часть 1
Изучение 26 методов анализа больших данных: часть 1
Taiga - это бесплатное приложение с открытым исходным кодом для управления проектами. В отличие от других инструментов управления проектами, Taiga использует поэтапный и гибкий подход для управления развитием проекта. Тайга - очень мощное и полностью настраиваемое приложение. Бэкэнд Taiga написан на Python с использованием фреймворка Django. Интерфейс написан на JavaScript с использованием сред CoffeeScript и AngularJS. Тайга включает в себя такие функции, как совместная работа над проектом, доска объявлений Канбан, отслеживание ошибок, создание отчетов, отслеживание времени, задержек, вики и многое другое.
В этом уроке мы будем использовать taiga.example.com
имя домена, указывающее на сервер. Замените все вхождения taiga.example.com
с вашим фактическим доменным именем.
Обновите свою базовую систему, используя руководство Как обновить Ubuntu 16.04 . После обновления системы перейдите к установке PostgreSQL.
PostgreSQL - это объектно-реляционная система баз данных, известная своей стабильностью и скоростью. Тайга использует PostgreSQL для хранения своей базы данных. Добавьте репозиторий PostgreSQL в систему.
echo "deb http://apt.postgresql.org/pub/repos/apt/ xenial-pgdg main" | sudo tee /etc/apt/sources.list.d/pgdg.list
Импортируйте ключ подписи GPG и обновите списки пакетов.
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
sudo apt update
Установите сервер базы данных PostgreSQL.
sudo apt -y install postgresql
Запустите сервер PostgreSQL и включите его автоматический запуск во время загрузки.
sudo systemctl start postgresql
sudo systemctl enable postgresql
Измените пароль для пользователя PostgreSQL по умолчанию.
sudo passwd postgres
Войдите как пользователь PostgreSQL.
sudo su - postgres
Создайте нового пользователя PostgreSQL для Taiga.
createuser taiga
PostgreSQL предоставляет psql
оболочку для выполнения запросов к базе данных. Переключитесь на оболочку PostgreSQL.
psql
Установите пароль для вновь созданного пользователя для базы данных Taiga.
ALTER USER taiga WITH ENCRYPTED password 'DBPassword';
Замените DBPassword
на безопасный пароль. Создайте новую базу данных для установки Тайги.
CREATE DATABASE taiga OWNER taiga;
Выход из psql
оболочки.
\q
Переключиться на sudo
пользователя.
exit
Taiga требует Python версии 3.4 или новее, а Python 3.5 уже предустановлен в дистрибутиве Ubuntu 16.04. Установите еще несколько необходимых пакетов.
sudo apt -y install python3 python3-pip python3-dev python3-dev virtualenvwrapper
Виртуальная среда Python используется для создания изолированной виртуальной среды для проекта Python. Виртуальная среда содержит свои собственные установочные каталоги и не разделяет библиотеки с глобальными и другими виртуальными средами. Как только Python 3 будет успешно установлен, вы сможете проверить его версию.
python3 -V
Вы увидите следующее.
user@vultr:~$ python3 -V
Python 3.5.2
Обновление pip
, которое является приложением менеджера зависимостей.
sudo pip3 install --upgrade setuptools pip
Кроме того, установите несколько инструментов сборки, которые потребуются позже для компиляции зависимостей.
sudo apt -y install build-essential binutils-doc autoconf flex bison libjpeg-dev libfreetype6-dev zlib1g-dev libzmq3-dev libgdbm-dev libncurses5-dev automake libtool libffi-dev curl git tmux gettext
Тайга использует RabbitMQ для обработки очереди сообщений. RabbitMQ требует библиотеки Erlang для работы. Установите Erlang.
sudo apt -y install erlang
Добавьте хранилище RabbitMQ.
echo 'deb http://www.rabbitmq.com/debian/ stable main' | sudo tee /etc/apt/sources.list.d/rabbitmq.list
Импортируйте ключ подписи RabbitMQ GPG.
wget -O- https://www.rabbitmq.com/rabbitmq-release-signing-key.asc | sudo apt-key add -
Обновите информацию о хранилище.
sudo apt update
Установите RabbitMQ.
sudo apt -y install rabbitmq-server
Запустите и включите сервер RabbitMQ.
sudo systemctl start rabbitmq-server
sudo systemctl enable rabbitmq-server
Добавьте пользователя RabbitMQ и vhost. Также предоставьте разрешение пользователю через хост.
sudo rabbitmqctl add_user taiga StrongMQPassword
sudo rabbitmqctl add_vhost taiga
sudo rabbitmqctl set_permissions -p taiga taiga ".*" ".*" ".*"
Обязательно замените его StrongMQPassword
на безопасный пароль.
Node.js версии 7 или новее необходим для компиляции внешнего интерфейса Taiga. Добавьте репозиторий Node.js версии 8.
curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
Установите Node.js и pwgen
утилиту.
sudo apt install -y nodejs pwgen npm
pwgen
будет использоваться позже для генерации сильной секретной строки. Установите CoffeeScript, так как он будет использоваться для компиляции файлов Taiga, написанных в среде CoffeeScript.
sudo npm install -g coffee-script gulp
Добавьте нового системного пользователя для Taiga, чтобы гарантировать, что процессы Taiga работают как непривилегированный пользователь.
sudo adduser taiga
sudo su - taiga
Примечание . С этого момента все команды необходимо запускать как непривилегированный пользователь, taiga
пока вас не попросят вернуться обратно к sudo
пользователю.
Создайте новый каталог для хранения файлов журнала.
mkdir -p ~/logs
Клонируйте хранилище Taiga backend из GitHub и оформите последнюю стабильную ветку.
git clone https://github.com/taigaio/taiga-back.git taiga-back
cd taiga-back
git checkout stable
Теперь создайте новую виртуальную среду для Тайги, используя Python 3.
mkvirtualenv -p /usr/bin/python3 taiga
pip3 install --upgrade setuptools
Установите необходимые зависимости Python, используя pip
.
pip3 install -r requirements.txt
Заполните базу данных необходимыми исходными данными.
python3 manage.py migrate --noinput
python3 manage.py loaddata initial_user
python3 manage.py loaddata initial_project_templates
python3 manage.py compilemessages
python3 manage.py collectstatic --noinput
Вышеуказанные команды будут записывать данные в базу данных PostgreSQL. Тайга также отправляет некоторые демонстрационные данные или образцы данных, которые могут быть полезны для оценки продукта. Если вы хотите установить образец данных, выполните следующее.
python3 manage.py sample_data
Примечание . Установка примеров данных не является обязательной и предназначена только для оценки продукта.
Прежде чем приступить к созданию файла конфигурации для бэкэнда Taiga, нам нужно сгенерировать секретную строку. Эта строка будет использоваться для шифрования данных сеанса.
Генерация случайной строки из 64 символов.
pwgen -s -1 64
Вы должны увидеть результат в виде случайной строки.
(taiga) taiga@vultr:~/taiga-back$ pwgen -s -1 64
fhDfyYVJ4EH3tvAyUzmfWSeCXuf5sy5EEWrMQPaf9t3JSFrpiL6yvUEOWsFOTscP
Создайте новый файл конфигурации для Taiga Backend.
nano ~/taiga-back/settings/local.py
Заполните файл следующим кодом.
from .common import *
MEDIA_URL = "https://taiga.example.com/media/"
STATIC_URL = "https://taiga.example.com/static/"
SITES["front"]["scheme"] = "https"
SITES["front"]["domain"] = "taiga.example.com"
SECRET_KEY = "Generated_Secret_Key"
DEBUG = False
PUBLIC_REGISTER_ENABLED = True
DEFAULT_FROM_EMAIL = "[email protected]"
SERVER_EMAIL = DEFAULT_FROM_EMAIL
#CELERY_ENABLED = True
EVENTS_PUSH_BACKEND = "taiga.events.backends.rabbitmq.EventsPushBackend"
EVENTS_PUSH_BACKEND_OPTIONS = {"url": "amqp://taiga:StrongMQPassword@localhost:5672/taiga"}
# Uncomment and populate with proper connection parameters
# for enable email sending. EMAIL_HOST_USER should end by @domain.tld
#EMAIL_BACKEND = "django.core.mail.backends.smtp.EmailBackend"
#EMAIL_USE_TLS = False
#EMAIL_HOST = "mail.example.com"
#EMAIL_HOST_USER = "[email protected]"
#EMAIL_HOST_PASSWORD = "SMTPPassword"
#EMAIL_PORT = 25
# Uncomment and populate with proper connection parameters
# for enable github login/singin.
#GITHUB_API_CLIENT_ID = "yourgithubclientid"
#GITHUB_API_CLIENT_SECRET = "yourgithubclientsecret"
Убедитесь, что заменили на example domain name
фактический в приведенном выше коде. Также замените Generated_Secret_Key
действительным секретным ключом и StrongMQPassword
действительным паролем для пользователя очереди сообщений «Тайга». Если у вас есть готовый SMTP-сервер и вы хотите немедленно использовать функции отправки электронной почты, вы можете раскомментировать параметры электронной почты и установить соответствующее значение. Если у вас нет готового почтового сервера, вы можете на данный момент пропустить настройку функции электронной почты и настроить ее позже в этом файле конфигурации.
Если вы хотите включить вход в GitHub, создайте приложение в GitHub и предоставьте идентификатор клиента API и секрет клиента.
Чтобы сразу проверить, можно ли запустить бэкэнд Taiga, запустите встроенный сервер Django.
workon taiga
python manage.py runserver
Вы увидите следующий вывод, если сервер успешно запущен.
(taiga) taiga@vultr:~/taiga-back$ workon taiga
(taiga) taiga@vultr:~/taiga-back$ python manage.py runserver
Trying import local.py settings...
Trying import local.py settings...
Performing system checks...
System check identified no issues (0 silenced).
October 28, 2017 - 10:29:38
Django version 1.10.6, using settings 'settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
Чтобы проверить, доступен ли API, откройте другой сеанс терминала и выполните следующее.
curl http://127.0.0.1:8000/api/v1/
Вы увидите похожий вывод, возвращаемый вызовом API.
user@vultr:~$ curl http://127.0.0.1:8000/api/v1/
{"webhooks": "http://127.0.0.1:8000/api/v1/webhooks", "invitations": "http://127.0.0.1:8000/api/v1/invitations", "severities": "http://127.0.0.1:8000/api/v1/severities", "memberships": "http://127.0.0.1:8000/api/v1/memberships", "user-storage": "http://127.0.0.1:8000/api/v1/user-storage", "epics/(?P<resource_id>\\d+)/voters": "http://127.0.0.1:8000/api/v1/epics/(?P<resource_id>\\d+)/voters", "wiki": "http://127.0.0.1:8000/api/v1/wiki", "priorities": "http://127.0.0.1:8000/api/v1/priorities", "userstories/attachments": "http://127.0.0.1:8000/api/v1/userstories/attachments", "epics/(?P<epic>[^/.]+)/related_userstories": "http://127.0.0.1:8000/api/v1/epics/(?P<epic>[^/.]+)/related_userstories", "timeline/user": "http://127.0.0.1:8000/api/v1/timeline/user", "userstories/(?P<resource_id>\\d+)/voters": "http://127.0.0.1:8000/api/v1/userstories/(?P<resource_id>\\d+)/voters", "wiki-links": "http://127.0.0.1:8000/api/v1/wiki-links", "epics/attachments": "http://127.0.0.1:8000/api/v1/epics/attachments", "issues/custom-attributes-values": "http://127.0.0.1:8000/api/v1/issues/custom-attributes-values
Остановите сервер «Тайга», нажав « ctrl + C
», и деактивируйте виртуальную среду.
deactivate
Интерфейс Taiga является компонентом Taiga, который обслуживает веб-интерфейс пользователя. Клонируйте хранилище внешнего интерфейса Taiga от Github и оформите последнюю стабильную ветку.
cd ~
git clone https://github.com/taigaio/taiga-front-dist.git taiga-front-dist
cd taiga-front-dist
git checkout stable
Создайте новый файл конфигурации для интерфейса Taiga.
nano ~/taiga-front-dist/dist/conf.json
Заполните файл.
{
"api": "https://taiga.example.com/api/v1/",
"eventsUrl": "wss://taiga.example.com/events",
"eventsMaxMissedHeartbeats": 5,
"eventsHeartbeatIntervalTime": 60000,
"eventsReconnectTryInterval": 10000,
"debug": true,
"debugInfo": false,
"defaultLanguage": "en",
"themes": ["taiga"],
"defaultTheme": "taiga",
"publicRegisterEnabled": true,
"feedbackEnabled": true,
"privacyPolicyUrl": null,
"termsOfServiceUrl": null,
"maxUploadFileSize": null,
"contribPlugins": [],
"tribeHost": null,
"importers": [],
"gravatar": true
}
Обязательно замените его example domain
на фактический домен. Вы также можете изменить язык по умолчанию и другие параметры в конфигурации выше.
Помимо внешнего интерфейса и внутреннего интерфейса нам также необходимо установить события тайги. События Taiga - это сервер веб-сокетов, и он позволяет интерфейсу Taiga в реальном времени отображать изменения в модулях, таких как backlog, Kanban и другие. Он также использует сервер RabbitMQ для обработки сообщений.
Клон Тайга, хранилище событий от Github.
cd ~
git clone https://github.com/taigaio/taiga-events.git taiga-events
cd taiga-events
Установите зависимости Node.js, используя npm
.
npm install
Создайте новый файл конфигурации для событий Тайги.
nano ~/taiga-events/config.json
Заполните файл.
{
"url": "amqp://taiga:StrongMQPassword@localhost:5672/taiga",
"secret": "Generated_Secret_Key",
"webSocketServer": {
"port": 8888
}
}
Замените Generated_Secret_Key
действительным секретным ключом длиной 64 символа, который вы сгенерировали ранее. Секретный ключ должен совпадать с ключом, который вы указали в файле конфигурации бэкенда Taiga. Также обновите StrongMQPassword
пароль, указав фактический пароль для пользователя очереди сообщений «Тайга».
Circus - менеджер процессов для приложений на Python. Мы будем использовать Цирк для запуска бэкэнда и событий Тайги.
Вернитесь к sudo
пользователю.
exit
Примечание : теперь вам нужно будет запускать команды, используя sudo
пользователя.
sudo apt -y install circus
Создайте новый файл конфигурации Circus для запуска бэкэнда Taiga.
sudo nano /etc/circus/conf.d/taiga.ini
Заполните файл.
[watcher:taiga]
working_dir = /home/taiga/taiga-back
cmd = gunicorn
args = -w 3 -t 60 --pythonpath=. -b 127.0.0.1:8001 taiga.wsgi
uid = taiga
numprocesses = 1
autostart = true
send_hup = true
stdout_stream.class = FileStream
stdout_stream.filename = /home/taiga/logs/gunicorn.stdout.log
stdout_stream.max_bytes = 10485760
stdout_stream.backup_count = 4
stderr_stream.class = FileStream
stderr_stream.filename = /home/taiga/logs/gunicorn.stderr.log
stderr_stream.max_bytes = 10485760
stderr_stream.backup_count = 4
[env:taiga]
PATH = /home/taiga/.virtualenvs/taiga/bin:$PATH
TERM=rxvt-256color
SHELL=/bin/bash
USER=taiga
LANG=en_US.UTF-8
HOME=/home/taiga
PYTHONPATH=/home/taiga/.virtualenvs/taiga/lib/python3.5/site-packages
Создайте новую конфигурацию Цирка для запуска Тайги.
sudo nano /etc/circus/conf.d/taiga-events.ini
Заполните файл.
[watcher:taiga-events]
working_dir = /home/taiga/taiga-events
cmd = /usr/local/bin/coffee
args = index.coffee
uid = taiga
numprocesses = 1
autostart = true
send_hup = true
stdout_stream.class = FileStream
stdout_stream.filename = /home/taiga/logs/taigaevents.stdout.log
stdout_stream.max_bytes = 10485760
stdout_stream.backup_count = 12
stderr_stream.class = FileStream
stderr_stream.filename = /home/taiga/logs/taigaevents.stderr.log
stderr_stream.max_bytes = 10485760
stderr_stream.backup_count = 12
Перезапустите Circus и включите автоматический запуск во время загрузки.
sudo systemctl restart circusd
sudo systemctl enable circusd
Проверьте статус цирка.
circusctl status
Если Цирк запустил все процессы Тайги правильно, то вы увидите следующий вывод.
user@vultr:~$ circusctl status
circusd-stats: active
plugin:flapping: active
taiga: active
taiga-events: active
Если вы видите, что какой-либо процесс не активен, запустите sudo chmod -R 777 /home/taiga/logs
и перезапустите Circus. Еще раз проверьте состояние процессов в Цирке, на этот раз вы обязательно найдете работающий сервис.
Теперь у нас Тайга успешно установлена и работает. Прежде чем мы сможем его использовать, нам нужно выставить установку с использованием любого рабочего веб-сервера.
Мы будем использовать Nginx в качестве обратного прокси-сервера для предоставления приложения пользователям. Мы также получим и установим SSL-сертификаты от Let's Encrypt.
Certbot является официальным клиентом выдачи сертификатов для Let's Encrypt CA. Добавьте в систему репозиторий Certbot PPA.
sudo add-apt-repository ppa:certbot/certbot
sudo apt update
Установите Nginx и Certbot.
sudo apt -y install nginx certbot
Примечание . Чтобы получить сертификаты от Let's Encrypt CA, необходимо убедиться, что домен, для которого вы хотите создать сертификаты, направлен на сервер. Если нет, внесите необходимые изменения в записи DNS вашего домена и дождитесь распространения DNS, прежде чем снова делать запрос сертификата. Certbot проверяет полномочия домена перед предоставлением сертификатов.
Теперь используйте встроенный веб-сервер в Certbot для генерации сертификатов для вашего домена.
sudo certbot certonly --standalone -d taiga.example.com
Сгенерированные сертификаты, вероятно, будут храниться в /etc/letsencrypt/live/taiga.example.com/
каталоге. Сертификат SSL будет сохранен как fullchain.pem
, а закрытый ключ - как privkey.pem
.
Срок действия сертификатов Let's Encrypt истекает через 90 дней, поэтому рекомендуется настроить автоматическое обновление сертификатов с помощью заданий Cron. Cron - это системный сервис, который используется для периодических задач.
Откройте файл задания cron.
sudo crontab -e
Добавьте следующую строку.
0 0 * * * /usr/bin/certbot renew --quiet
Вышеуказанная работа cron будет выполняться ежедневно в полночь. Если срок действия сертификата истекает, он автоматически обновляет сертификаты.
Генерация сильного параметра Диффи-Хеллмана. Это обеспечивает дополнительный уровень безопасности для обмена данными между хостом и сервером.
sudo openssl dhparam -out /etc/ssl/dhparam.pem 2048
Создайте новый серверный блок Nginx для обслуживания внешнего интерфейса Taiga.
sudo nano /etc/nginx/sites-available/taiga
Заполните файл следующим.
server {
listen 80;
server_name taiga.example.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl;
server_name taiga.example.com;
access_log /home/taiga/logs/nginx.access.log;
error_log /home/taiga/logs/nginx.error.log;
large_client_header_buffers 4 32k;
client_max_body_size 50M;
charset utf-8;
index index.html;
# Frontend
location / {
root /home/taiga/taiga-front-dist/dist/;
try_files $uri $uri/ /index.html;
}
# Backend
location /api {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:8001/api;
proxy_redirect off;
}
location /admin {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:8001$request_uri;
proxy_redirect off;
}
# Static files
location /static {
alias /home/taiga/taiga-back/static;
}
# Media files
location /media {
alias /home/taiga/taiga-back/media;
}
location /events {
proxy_pass http://127.0.0.1:8888/events;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_connect_timeout 7d;
proxy_send_timeout 7d;
proxy_read_timeout 7d;
}
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
add_header Public-Key-Pins 'pin-sha256="klO23nT2ehFDXCfx3eHTDRESMz3asj1muO+4aIdjiuY="; pin-sha256="633lt352PKRXbOwf4xSEa1M517scpD3l5f79xMD9r9Q="; max-age=2592000; includeSubDomains';
ssl on;
ssl_certificate /etc/letsencrypt/live/taiga.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/taiga.example.com/privkey.pem;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK';
ssl_session_cache shared:SSL:10m;
ssl_dhparam /etc/ssl/dhparam.pem;
ssl_stapling on;
ssl_stapling_verify on;
}
Обязательно измените domain name
и path to the SSL certificates
. Включить виртуальный хост.
sudo ln -s /etc/nginx/sites-available/taiga /etc/nginx/sites-enabled/taiga
Теперь вы можете перезапустить веб-сервер Nginx и включить его автоматический запуск при загрузке.
sudo systemctl restart nginx
sudo systemctl status nginx
Наконец, исправьте владение и разрешение на файлы Taiga.
sudo chown -R taiga:taiga /home/taiga/
sudo chmod o+x /home/taiga/
Теперь вы можете получить доступ к установке Taiga, перейдя в https://taiga.example.com
. Войдите в систему, используя первоначальную учетную запись администратора с именем пользователя " admin
" и паролем " 123123
". Ваша установка готова к использованию. Начните с создания нового проекта или оценки продукта. Если вы уже управляете проектом на Github, Jira или Trello, вы можете легко импортировать проекты в Taiga с помощью импортеров .
Изучение 26 методов анализа больших данных: часть 1
Многие из вас знают Switch, который выйдет в марте 2017 года, и его новые функции. Для тех, кто не знает, мы подготовили список функций, которые делают «Switch» обязательным гаджетом.
Вы ждете, когда технологические гиганты выполнят свои обещания? проверить, что осталось недоставленным.
Прочтите блог, чтобы узнать о различных уровнях архитектуры больших данных и их функциях самым простым способом.
Прочтите это, чтобы узнать, как искусственный интеллект становится популярным среди небольших компаний и как он увеличивает вероятность их роста и дает преимущество перед конкурентами.
CAPTCHA стало довольно сложно решать пользователям за последние несколько лет. Сможет ли он оставаться эффективным в обнаружении спама и ботов в ближайшем будущем?
По мере того, как наука развивается быстрыми темпами, принимая на себя большую часть наших усилий, также возрастает риск подвергнуться необъяснимой сингулярности. Прочтите, что может значить для нас необычность.
Что такое телемедицина, дистанционное здравоохранение и их влияние на будущее поколение? Это хорошее место или нет в ситуации пандемии? Прочтите блог, чтобы узнать мнение!
Возможно, вы слышали, что хакеры зарабатывают много денег, но задумывались ли вы когда-нибудь о том, как они зарабатывают такие деньги? Давайте обсудим.
Недавно Apple выпустила macOS Catalina 10.15.4, дополнительное обновление для исправления проблем, но похоже, что это обновление вызывает больше проблем, приводящих к поломке компьютеров Mac. Прочтите эту статью, чтобы узнать больше