Парсинг на python с beautiful soup

Создание веб-приложений на Python с помощью Dash

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

Dash — библиотека пользовательского интерфейса для создания аналитических веб-приложений. Она будет полезна для тех, кто использует Python для анализа и исследования данных, визуализации, моделирования и отчётности.

Dash значительно упрощает создание GUI (графических пользовательских интерфейсов) для анализа данных. Вот пример приложения на Dash из 43 строк кода, который связывает выпадающее меню с графиком D3.js. Когда пользователь выбирает значение в выпадающем списке, код динамически экспортирует данные из Google Finance в Pandas DataFrame:

Код Dash является декларативным и реактивным, что упрощает создание сложных приложений, содержащих множество интерактивных элементов. Вот пример с 5 входными данными, 3 — выходными и с перекрёстной фильтрацией. Это приложение было написано на Python, и в нём всего лишь 160 строк кода:

Приложение на Dash с несколькими входными и выходными данным.

Для каждого элемента приложения можно задать собственные параметры размера, расположения, цвета и шрифта. Приложения на Dash создаются и публикуются в Сети, поэтому к ним можно применить всё, на что способен CSS. Ниже иллюстрируется пример тонко настраиваемого интерактивного приложения отчётности на Dash, выполненного в стиле отчёта финансовой организации Goldman Sachs.

Тонко настраиваемое приложение Dash, созданное в стиле отчёта финансовой организации Goldman Sachs.

Вам не нужно писать какой-либо код на JavaScript или HTML, когда ваше приложение на Dash запущено в веб-браузере. Dash предоставляет богатый набор интерактивных веб-компонентов.

Пример простого ползунка на Dash

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

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

Интенсив «Напишите первую модель машинного обучения за 3 дня»

4–6 февраля, Онлайн, Беcплатно

tproger.ru

События и курсы на tproger.ru

Ваша функция Python может выполнять различные действия с новым входным значением: может фильтровать объект библиотеки Pandas, выполнять SQL-запрос, запускать симуляцию, выполнять вычисления или запускать тестирование. Dash рассчитывает, что ваша функция вернёт новое свойство для какого-нибудь элемента пользовательского интерфейса, будь то новый график, новая таблица или новый текст.

В качестве примера ниже представлено приложение на Dash, которое обновляет текстовый элемент при взаимодействии с графиком. Код приложения фильтрует данные в Pandas на основе выбранной точки:

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

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

Установка Visual Studio CodeInstall Visual Studio Code

При использовании VS Code в качестве текстового редактора или интегрированной среды разработки (IDE) вам доступны IntelliSense (помощь в завершении кода), анализ кода (помогает избежать ошибок в коде), поддержка отладки (помогает находить ошибки в коде после запуска), фрагменты кода (шаблоны для небольших повторно используемых блоков кода) и модульное тестирование (тестирование интерфейса кода с различными типами входных данных).By using VS Code as your text editor / integrated development environment (IDE), you can take advantage of IntelliSense (a code completion aid), Linting (helps avoid making errors in your code), Debug support (helps you find errors in your code after you run it), Code snippets (templates for small reusable code blocks), and Unit testing (testing your code’s interface with different types of input).

VS Code также содержит встроенный терминал, который позволяет открывать командную строку Python с помощью командной строки Windows, PowerShell или любой другой, создавая простой рабочий процесс между редактором кода и командной строкой.VS Code also contains a built-in terminal that enables you to open a Python command line with Windows Command prompt, PowerShell, or whatever you prefer, establishing a seamless workflow between your code editor and command line.

  1. Чтобы установить VS Code, скачайте VS Code для Windows: https://code.visualstudio.com.To install VS Code, download VS Code for Windows: https://code.visualstudio.com.

  2. Установив VS Code, необходимо также установить расширение Python.Once VS Code has been installed, you must also install the Python extension. Для установки расширения Python можно выбрать ссылку на VS Code в Marketplace или открыть VS Code и выполнить поиск по фразе Python в меню расширений (Ctrl+Shift+X).To install the Python extension, you can select the VS Code Marketplace link or open VS Code and search for Python in the extensions menu (Ctrl+Shift+X).

  3. Python — интерпретируемый язык, и для выполнения кода Python необходимо указать VS Code, какой интерпретатор нужно использовать.Python is an interpreted language, and in order to run Python code, you must tell VS Code which interpreter to use. Мы советуем использовать Python 3.7, если только у вас нет конкретной причины для выбора другой программы.We recommend sticking with Python 3.7 unless you have a specific reason for choosing something different. После установки расширения Python выберите интерпретатор Python 3, открыв палитру команд (CTRL+SHIFT+P), и начните вводить команду Python: Select Interpreter (Python: выбор интерпретатора) для поиска, а затем выберите появившуюся команду.Once you’ve installed the Python extension, select a Python 3 interpreter by opening the Command Palette (Ctrl+Shift+P), start typing the command Python: Select Interpreter to search, then select the command. Вы также можете использовать параметр Select Python Environment (Выбрать среду Python) в нижней строке состояния, если она доступна (возможно, уже отображается выбранный интерпретатор).You can also use the Select Python Environment option on the bottom Status Bar if available (it may already show a selected interpreter). Команда предоставляет список доступных интерпретаторов, которые VS Code может найти автоматически, включая виртуальные среды.The command presents a list of available interpreters that VS Code can find automatically, including virtual environments. Если нужный интерпретатор не отображается, перейдите к статье о настройке сред Python.If you don’t see the desired interpreter, see Configuring Python environments.

  4. Чтобы открыть терминал в VS Code, выберите Просмотр > Терминал или используйте клавиши CTRL+` (символ обратного апострофа).To open the terminal in VS Code, select View > Terminal, or alternatively use the shortcut Ctrl+` (using the backtick character). Терминалом по умолчанию является PowerShell.The default terminal is PowerShell.

  5. В окне терминала VS Code откройте Python, просто введя команду: Inside your VS Code terminal, open Python by simply entering the command:

  6. Попробуйте использовать интерпретатор Python, введя: .Try the Python interpreter out by entering: . Python вернет фразу «Hello World».Python will return your statement «Hello World».

Шаг 3: Собираем Python

Выполнив предварительные условия и получив файл tar, вы можете распаковать исходник в папку

Обратите внимание на то, что следующая команда создаст новую папку Python-3.6.5 под той, в которой вы в данный момент находитесь:. Shell

$ wget https://www.python.org/ftp/python/3.6.5/Python-3.6.5.tgz
$ tar xvf Python-3.6.5.tgz
$ cd Python-3.6.5

Shell

$ wget https://www.python.org/ftp/python/3.6.5/Python-3.6.5.tgz
$ tar xvf Python-3.6.5.tgz
$ cd Python-3.6.5

1
2
3

$wget httpswww.python.orgftppython3.6.5Python-3.6.5.tgz

$tar xvf Python-3.6.5.tgz

$cdPython-3.6.5

Теперь вам нужно запустить инструмент ./configure для подготовке к построению Python:

Shell

$ ./configure —enable-optimizations —with-ensurepip=install

1 $.configure—enable-optimizations—with-ensurepip=install

Далее, мы скомпилируем Python при помощи make. Опция –j просто делит компиляцию на параллельные шаги для ускорения компиляции. Даже с параллельным компилированием, этот шаг может занять несколько минут:

Shell

$ make -j 8

1 $make-j8

Далее, вам может понадобиться установить новую версию Python. Используем таргет altinstall, чтобы не перезаписать системную версию Python. Так как вы устанавливаете Python в /usr/bin, вам нужно запустить команду от имени администратора:

Shell

$ sudo make altinstall

1 $sudo makealtinstall

Учебник по некоторым основам работы с Python (на примере Hello World)Hello World tutorial for some Python basics

Python, согласно его создателю Гвидо ван Россуму, — это «язык программирования высокого уровня, и его основная философия проектирования — это удобочитаемость кода и синтаксис, позволяющий программистам выразить концепции в нескольких строках кода».Python, according to its creator Guido van Rossum, is a “high-level programming language, and its core design philosophy is all about code readability and a syntax which allows programmers to express concepts in a few lines of code.”

Python — интерпретируемый язык.Python is an interpreted language. В отличие от скомпилированных языков, в которых написанный код необходимо перевести в машинный код для выполнения процессором компьютера, код Python передается непосредственно интерпретатору и запускается напрямую.In contrast to compiled languages, in which the code you write needs to be translated into machine code in order to be run by your computer’s processor, Python code is passed straight to an interpreter and run directly. Просто введите код и запустите его.You just type in your code and run it. Попробуем сделать это!Let’s try it!

Откройте командную строку PowerShell и введите , чтобы запустить интерпретатор Python 3.With your PowerShell command line open, enter to run the Python 3 interpreter. (В некоторых инструкциях указано использовать команду или , которые также подойдут.)(Some instructions prefer to use the command or , these should also work). Если вы делаете все правильно, появится командная строка с тремя символами «больше, чем» (>>>).You will know that you’re successful because a >>> prompt with three greater-than symbols will display.

Существует несколько встроенных методов, позволяющих вносить изменения в строки в Python.There are several built-in methods that allow you to make modifications to strings in Python. Создайте переменную с помощью команды .Create a variable, with: . Нажмите клавишу ВВОД для создания новой строки.Press Enter for a new line.

Выведите переменную с помощью команды .Print your variable with: . Отобразится текст «Hello World!».This will display the text «Hello World!».

Выясните, сколько символов используется для переменной строки, с помощью команды .Find out the length, how many characters are used, of your string variable with: . Будет показано, что используется 12 символов.This will display that there are 12 characters used

(Обратите внимание, что пробел учитывается как символ в общей длине.)(Note that the blank space it counted as a character in the total length.)

Преобразуйте строковую переменную в буквы верхнего регистра: .Convert your string variable to upper-case letters:. Теперь преобразуйте строковую переменную в буквы нижнего регистра: .Now convert your string variable to lower-case letters: .

Подсчитайте, сколько раз буква «l» используется в строковой переменной: .Count how many times the letter «l» is used in your string variable: .

Найдите определенный символ в вашей строковой переменной

Давайте найдем восклицательный знак с помощью команды .Search for a specific character in your string variable, let’s find the exclamation point, with: . Будет показано, что восклицательный знак находится в позиции 11 строки.This will display that the exclamation point is found in the 11th position character of the string.

Замените восклицательный знак на вопросительный знак: .Replace the exclamation point with a question mark: .

Чтобы выйти из Python, введите , или нажмите клавиши CTRL+Z.To exit Python, you can enter , , or select Ctrl-Z.

Обучение Python с нуля

Начать обучение питону с нуля можно при помощи книг таких как «Программируем на Python» Майкла Доусона, «Изучаем Python» Марка Лутца и других. Но обычно книги используются как справочная информация или руководство по питону.

Книга “Программируем на Python” Майкла Доусона

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

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

Шаг 1 — Разбираем Flask

Flask — это микрофреймворк для веб-разработки. “Микро” означает, что он очень простой. С ним не идет никаких заранее устанавливаемых внешних библиотек и инструментов. Обычно Flask используют с MongoDB, что позволяет лучше управлять базами данных и историей. Думаю, для введения достаточно. Ведь на самом деле нам интересно то, как он работает, верно? Давайте перейдем к этому. Но перед этим нам нужно разобраться с одним фундаментальным понятием, касающимся фреймворка Flask, маршрутизацией.

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

#4: Майнинг данных Twitter

Благодаря интернету, и (все чаще и чаще) интернету вещей (IoT) – у нас есть доступ к огромному количеству данных, о которых не могли мечтать всего десять лет назад. Аналитика – это огромная часть любой сферы, которая связана с данными. О чем люди разговаривают? Какие шаблоны видны в их поведении?

Твиттер – отличное место, чтобы получить ответы на эти вопросы. Если вам интересен анализ данных, тогда майнинг данных в Twitter – отличный способ попробовать свои навыки в Python, чтобы ответить на вопросы об окружающем мире.

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

Вы увидите, как использовать Tweepy для фильтрации твитов, которые вы хотите вытягивать, TextBlob для подсчета настроения этих твитов, Elasticsearch для анализа содержимого этих твитов и Kibana для показа результатов. По окончанию данного руководства, вы уже будете готовы к тому, чтобы заняться другими проектами, которые используют Python для обработки текстов и распознавания речи.

#11: Бросаем вызов!

Если вы не уверены в том, что готовы окунаться в некоторые крупные проекты, упомянутые ранее, при этом мелкие вас не очень интересуют, вы можете думать: а чем еще можно заняться?

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

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

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

Чтобы начать, попробуйте одно из следующих, чтобы оценить свои силы:

  • Python Challenge. Более 20 доступных уровней. Создавайте простые скрипты в Python, чтобы решить уровень. По интернету есть разбросанные подсказки, но старайтесь искать решение самостоятельно!
  • PyBites Code Challenge. Включает в себя 50 задач, и количество растет! Эти задачи направлены на то, чтобы вы научились работать в Python для создания приложений, которые будут решать определенные проблемы.

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

Книга Python Tricks – это отличный источник информации, который поможет при работе с задачами. В книге рассматриваются малоизвестные части Python, на основании которых и формируются задачи.

Шаг 5 — Запуск сайта на реальном сервере

Так, давайте вернемся в нашему сайту. Запустить сайт на Python не так просто, как c HTML и PHP файлами, когда мы перетаскиваем и загружаем файлы при помощи FTP-клиента. Нам нужно делать всё по порядку, будьте терпеливы и внимательно выполняйте каждый шаг.

Шаг 5.1 — Создаем аккаунт Heroku

Создайте аккаунт на Heroku, перейдя по этой ссылке.

Шаг 5.2 — Устанавливаем необходимый инструменты

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

sudo apt install git-all
git config --global user.name "John Doe"git config --global user.email johndoe@example.com

Далее следует, это такой собственный git для Heroku. Для установки:

sudo snap install --classic heroku

Отлично. Теперь у нас есть всё, что нужно. Поехали дальше.

Шаг 5.3 — Настройка Heroku через командную строку

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

Нажмите любую кнопку

Теперь нам нужно создать наше приложение. Хорошо подумайте над его названием, потому что это будет ваше доменное имя после herokuapp.com. Например, . Я хотел использовать своё имя, но такое название было уже занято. Поэтому я выбрал .

Шаг 5.4 — Создаем необходимые файлы (всего 3)

requirements.txt — Содержит список зависимостей (библиотек), которые Heroku должен установить, чтобы наше приложение работало правильно. Для этого, переходим в виртуальную среду, которую мы создали ранее, с помощью pip устанавливаем. Это веб-сервер Python. После этого напишите , чтобы увидеть список зависимостей, а потом , чтобы создать текстовый файл с этим списком. Это нам и нужно. Вы можете найти файл в вашей папке, переместите его туда, где находится наш файл Python.

Список зависимостей

Важное примечание — Пожалуйста, удостоверьтесь, что ваш файл requirements выглядит, как представленный ниже. Иначе Heroku не примет его и выдаст ошибку

Отредактируйте файл, чтобы он выглядел так.

requirements.txt

Procfile — У этого файла нет расширения. Он содержит имя сервера и название приложения. Создайте файл, назовите его и напишите в нем следующее:

web: gunicorn mainscript:app

Здесь, gunicorn — это используемый сервер. — это название файла Python, — это название приложения, которое мы придумали при создании экземпляра класса flask (смотри фрагмент кода в шаге 2). Если ваши названия отличаются, измените их.

runtime.txt — Содержит информацию о версии Python, которую вы хотите использовать. В этом файле напишите:

python-3.7.0

Я использую Python 3.x, поэтому я использовал эту среду. Если вы используете Python 2.x, укажите вместо этого. Отлично, все готово. Теперь нам нужно просто всё загрузить.

Наконец, всё, что нам нужно, в одном месте

Шаг 5.5 — Загрузка всего необходимого

Отлично. Чтобы не объяснять всё по отдельности, к каждой строке дам комментарий. Каждую строку нужно выполнять отдельно.

#Убедитесь, что находитесь в той же директории, где лежит ваш файл Python#Убедитесь, что вы залогинены в heroku#Вызовите свое приложениеheroku git:remote --app dhrumilp#Инициализируйте git, чтобы загрузить все файлыgit init#Добавьте все файлы (это точка в конце, что означает все)git add .#Теперь, зафиксируйте все добавленные файлы на серверgit commit -m "First upload"#Запушьте все в master branchgit push heroku master

Загрузка…

Готово.

Всё готов. Уфф. Поздравляю, если вы смогли добраться до этого этапа. Моё приложение доступно на dhrumilp.herokuapp.com, можете посмотреть.

Получение данных из форм

Итак, во-первых разберёмся с формами. В модуле CGI есть полезный класс: FieldStorage, который содержит в себе переданную в форме информацию. По сути дела этот класс представляет из себя словарь, обладающий теми же свойствами, что и обычный словарь в python.

У класса FieldStorage есть 2 метода получения значений данных формы:

FieldStorage.getfirst(name, default=None) — всегда возвращает только одно значение, связанное с именем поля формы. Метод возвращает только первое значение в том случае, если нехороший пользователь послал более одного значения

Обратите внимание, что порядок, в котором будут получены значения, могут отличаться от браузера к браузеру. Если нет такого поля формы или значение не существует, то метод возвращает default

FieldStorage.getlist(name) — возвращает список значений, связанных с именем поля формы.

Разберём на примере: создадим в нашей папке файл index.html со следующим содержимым (это будет наша форма, данные из которой мы будем обрабатывать):

<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Обработка данных форм</title>
</head>
<body>
    <form action="/cgi-bin/form.py">
        <input type="text" name="TEXT_1">
        <input type="text" name="TEXT_2">
        <input type="submit">
    </form>
</body>
</html>

А в папке cgi-bin/ — файл form.py (обработчик формы)

#!/usr/bin/env python3
import cgi

form = cgi.FieldStorage()
text1 = form.getfirst("TEXT_1", "не задано")
text2 = form.getfirst("TEXT_2", "не задано")

print("Content-type: text/html\n")
print("""<!DOCTYPE HTML>
        <html>
        <head>
            <meta charset="utf-8">
            <title>Обработка данных форм</title>
        </head>
        <body>""")

print("<h1>Обработка данных форм!</h1>")
print("<p>TEXT_1: {}</p>".format(text1))
print("<p>TEXT_2: {}</p>".format(text2))

print("""</body>
        </html>""")

Попробуем это в действии (кто сидит на linux, не забудьте поставить права на выполнение).

Запускаем локальный сервер, и переходим на localhost:8000:

#3: Создание калькулятора

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

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

Если вам интересен UX\UI дизайн, то это руководство вам понравится. Вы будете работать с модулем tkinter, стандартным пакетом графического пользовательского интерфейса, который поставляется вместе с Python.

Модуль tkinter – это обертка вокруг Tcl/Tk, комбинация скриптового языка Tcl и расширения фреймворка графического пользовательского интерфейса Tk. Если у вас есть установленный Python, то у вас уже есть готовый к использованию tkinter. Вам нужно сделать простой вызов перед началом:

Python

<span class=»kn»>from</span> <span class=»nn»>tkinter</span> <span class=»k»>import</span> <span class=»o»>*</span>

1 <span class=»kn»>from<span><span class=»nn»>tkinter<span><span class=»k»>import<span><span class=»o»>*<span>

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

Установка и настройка среды разработки Python/Django

На этом этапе мы видим перед собой приветственное окно приложения с предложением создать новый проект, открыть существующий или же импортировать из системы контроля версий. Нас же пока интересует первый пункт – Create New Project. Нажимаем его и переходим в созданию нового проекта.

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

Вторая строчка Interpreter отвечает за выбор установленного в системе интерпретатора языка Python. Их может быть несколько, но пока мы не будем вдаваться в нюансы. Сразу отмечу, что для каждого проекта лучше создавать отдельную виртуальную среду (VirtualEnv), которая будет содержать установленные модули, необходимые для конкретного проекта и их настройки и версии не будут влиять на другие проекты. Давайте создадим новую VirtualEnv нажав на шестеренке справа и выбрав пункт Create VirtualEnv.

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

Нажимаем ОК и ждем пока закончится процесс создания виртуальной среды. После нажимаем на кнопку Create внизу справа и запускаем процесс создания проекта.

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

Для дальнейших манипуляций открываем Терминал, нажав на кнопку внизу слева.

Оцените статью
Рейтинг автора
5
Материал подготовил
Илья Коршунов
Наш эксперт
Написано статей
134
Добавить комментарий