После того как отработал препроцессор, что обработал нам директивы, начинается процесс компиляции в C. Сначала компилятор выполняет лексический и синтаксический анализ исходного кода, чтобы проверить на наличие ошибок. Если ошибок не обнаружено, то компилятор транслирует программу в машинный код. Машинный код — это низкоуровневый код, который может быть напрямую выполнен процессором компьютера. Он представляет собой последовательность чисел, которые являются инструкциями для процессора. Если обнаруживается ошибка, то компилятор выводит сообщение с ошибкой компиляции. Я специально уберу индекс из кода
В terminal
Давайте разберёмся в ошибке. Мы видим, что ошибка в функции
Фаза 4: компоновка
Компоновка (или линковка) в языке C - это процесс, в котором компоновщик собирает различные модули кода, такие как исходные файлы и библиотеки, в один исполняемый файл. Процесс компоновки делится на следующие шаги:
1. Каждый исходный файл C компилируется в отдельный объектный файл (обычно с расширением
2. Компоновщик анализирует объектные файлы и библиотеки, чтобы определить, какие внешние ссылки (например, функции и глобальные переменные, которые определены в других файлах) необходимо разрешить;
3. Компоновщик включает в исполняемый файл библиотеки, необходимые для выполнения программы, и разрешает ссылки на функции и данные, которые определены в этих библиотеках;
4. Если в программе используются ресурсы, такие как изображения или звуки, компоновщик также включает их в исполняемый файл;
5. Наконец, компоновщик генерирует исполняемый файл, который содержит все необходимые машинные инструкции, данные и ресурсы, собранные из объектных файлов и библиотек;
После процесса компоновки у нас с вами получился исполняемый файл
Откроем исполняемый файл
Перед вами первые 10 строк файла
Каждая строка это 64-битное значение в шестнадцатеричной системе счисления. Чтобы понять содержимое файла, нужно знать архитектуру процессора и много чего ещё. Возможно, я затрону эту тему в будущем, но пока вам достаточно того что это машинный код, который выполняет процессор компьютера.
sum_nums += arr_nums[]; чтобы показать как выглядит ошибка при компиляции.В terminal
sum_nums.c: In function ‘main’:
sum_nums.c:9:30: error: expected expression before ‘]’ token
9 | sum_nums += arr_nums[];
| ^
Давайте разберёмся в ошибке. Мы видим, что ошибка в функции
main, в строке 9, видим саму строку с ошибкой error: expected expression before ‘]’ token. Ошибка нам говорит, что компилятор ожидает некое выражение перед закрытием ], что нам намекает на допущенную ошибку в синтаксисе и мы забыли что-то написать. В нашем случае мы не указали переменную i, которая отвечает за индекс. Мы должны были взять элемент по индексу из списка. Я исправлю данный код и продолжу процесс дальше. Машинный код пока рано показывать на данной стадии. Что же касается языка Python, то у него нет этапа компиляции так как это не компилируемый язык. Вместо этого у него есть процесс интерпретации, до которого мы дойдём, когда, наконец, получим исходный файл языка С чтобы сравнить процесс запуска программ.Фаза 4: компоновка
Компоновка (или линковка) в языке C - это процесс, в котором компоновщик собирает различные модули кода, такие как исходные файлы и библиотеки, в один исполняемый файл. Процесс компоновки делится на следующие шаги:
1. Каждый исходный файл C компилируется в отдельный объектный файл (обычно с расширением
.o или .obj), который содержит машинный код и информацию для компоновщика;2. Компоновщик анализирует объектные файлы и библиотеки, чтобы определить, какие внешние ссылки (например, функции и глобальные переменные, которые определены в других файлах) необходимо разрешить;
3. Компоновщик включает в исполняемый файл библиотеки, необходимые для выполнения программы, и разрешает ссылки на функции и данные, которые определены в этих библиотеках;
4. Если в программе используются ресурсы, такие как изображения или звуки, компоновщик также включает их в исполняемый файл;
5. Наконец, компоновщик генерирует исполняемый файл, который содержит все необходимые машинные инструкции, данные и ресурсы, собранные из объектных файлов и библиотек;
После процесса компоновки у нас с вами получился исполняемый файл
sum_nums. Давайте посмотрим как выглядит машинный код у него внутри.Откроем исполняемый файл
sum_nums с помощью sublime text7f45 4c46 0201 0100 0000 0000 0000 0000
0300 3e00 0100 0000 8010 0000 0000 0000
4000 0000 0000 0000 d036 0000 0000 0000
0000 0000 4000 3800 0d00 4000 1f00 1e00
0600 0000 0400 0000 4000 0000 0000 0000
4000 0000 0000 0000 4000 0000 0000 0000
d802 0000 0000 0000 d802 0000 0000 0000
0800 0000 0000 0000 0300 0000 0400 0000
1803 0000 0000 0000 1803 0000 0000 0000
1803 0000 0000 0000 1c00 0000 0000 0000
...
Перед вами первые 10 строк файла
sum_nums из 1002. Естественно, я не мог впихнуть все 1002 строки в данную статью поэтому сократил вывод =)Каждая строка это 64-битное значение в шестнадцатеричной системе счисления. Чтобы понять содержимое файла, нужно знать архитектуру процессора и много чего ещё. Возможно, я затрону эту тему в будущем, но пока вам достаточно того что это машинный код, который выполняет процессор компьютера.
🔥2👍1
В языке Python нет процесса компоновки так как это не компилируемый язык и не требуется генерировать исполняемый файл как в языке C. Однако стоит отметить, что есть такие механизмы как Cython и ctypes. Cython - статический компилятор, который позволяет языку Python компилировать код на C и C++ и вызывать его из Python3. Ctypes - это библиотека для Python, которая позволяет Python взаимодействовать с C кодом, что позволяет Python работать на более низком уровне. Правда, это касается взаимодействия языков C и Python. Это довольно интересная тема и в последующих статьях я обязательно её затрону. Сам же Python по прежнему не нужно компилировать и компоновать. Это касается только C кода, который можно использовать в коде Python.
Фаза 5: загрузка
Для того чтобы программу можно было запустить, её сначала нужно загрузить в оперативную память. В языке C эту операцию выполняет загрузчик, который читает выполняемый образ с диска и копирует его в оперативную память. Также загрузчик производит загрузку необходимых разделяемых библиотек. В языке Python программный код загружается в оперативную память полностью для того чтобы выполниться потом построчно. На этом этапе, если в коде обнаружится ошибка, то программа будет прервана. Теперь самое время запустить наши программы на обоих языках, так как выйти на эту фазу невозможно без запуска программы.
В terminal
В terminal
Фаза 6: выполнение
Наконец, мы дошли до финальной фазы - выполнение кода. На этой фазе компьютер выполняет программу, инструкция за инструкцией в языке C. Давайте посмотрим на вывод программы у программы на языке C.
В terminal
Мы видим, что программа на языке C отработала как нужно. Только вот прежде чем я расскажу, что произойдёт с программой на Python, вас будет ждать небольшой сюрприз с выполнением программы.
В terminal
До этого мы запускали программы на Python из IDE и не испытывали проблем с запуском программ. Сейчас мы видим, что у нас нет прав на файл. Разрешим права на него.
В terminal
Попробуем запустить программу после того как мы выдали права на выполнение файла для всех пользователей.
В terminal
Почему вместо привычного вывода он выводит эти странные предупреждения, ведь у нас нет ошибок в коде? Всё очень просто - это происходит потому что в нашем файле
Давайте запустим нашу программу после изменений и посмотрим на результат её выполнения.
Фаза 5: загрузка
Для того чтобы программу можно было запустить, её сначала нужно загрузить в оперативную память. В языке C эту операцию выполняет загрузчик, который читает выполняемый образ с диска и копирует его в оперативную память. Также загрузчик производит загрузку необходимых разделяемых библиотек. В языке Python программный код загружается в оперативную память полностью для того чтобы выполниться потом построчно. На этом этапе, если в коде обнаружится ошибка, то программа будет прервана. Теперь самое время запустить наши программы на обоих языках, так как выйти на эту фазу невозможно без запуска программы.
В terminal
$ ./sum_nums
В terminal
$ ./sum_nums.py
Фаза 6: выполнение
Наконец, мы дошли до финальной фазы - выполнение кода. На этой фазе компьютер выполняет программу, инструкция за инструкцией в языке C. Давайте посмотрим на вывод программы у программы на языке C.
В terminal
Сумма чисел списка = 78
Мы видим, что программа на языке C отработала как нужно. Только вот прежде чем я расскажу, что произойдёт с программой на Python, вас будет ждать небольшой сюрприз с выполнением программы.
В terminal
bash: ./sum_nums.py: Отказано в доступе
До этого мы запускали программы на Python из IDE и не испытывали проблем с запуском программ. Сейчас мы видим, что у нас нет прав на файл. Разрешим права на него.
В terminal
chmod +x sum_nums.py
Попробуем запустить программу после того как мы выдали права на выполнение файла для всех пользователей.
В terminal
$ ./sum_nums.py
./sum_nums.py: строка 1: nums_list: команда не найдена
./sum_nums.py: строка 2: sum_nums: команда не найдена
./sum_nums.py: строка 5: синтаксическая ошибка рядом с неожиданным маркером «sum_nums»
./sum_nums.py: строка 5: ` sum_nums += num'
Почему вместо привычного вывода он выводит эти странные предупреждения, ведь у нас нет ошибок в коде? Всё очень просто - это происходит потому что в нашем файле
sum_nums.py нет строки, которая бы указывала нам на интерпретатор Python. В Debian или Ubuntu она пытается выполниться как скрипт shell. Именно поэтому мы видим вывод неких ошибок при запуске. Поправим это, добавив на первую строчку кода #!/usr/bin/env python3. Строка #!/usr/bin/env python3 называется шебанг (shebang), которая указывает путь до интерпретатора Python. Таким образом в программе будет информация о нахождении интерпретатора Python, к которому следует обратиться для выполнения программы. Наш код теперь будет выглядеть вот так.#!/usr/bin/env python3
nums_list = [1, 3, 4, 50, 20]
sum_nums = 0
for num in nums_list:
sum_nums += num
print(f'Сумма чисел списка = {sum_nums}')
Давайте запустим нашу программу после изменений и посмотрим на результат её выполнения.
$ ./sum_nums.py
Сумма чисел списка = 78
🔥4
Мы видим, что программа на Python выполнилась успешно, но как же это происходит в итоге?
Процесс загрузки и интерпретации кода Python включает в себя несколько этапов, которые происходят
на лету:
1. Python считывает код построчно, интерпретирует его и преобразует в байт-код;
2. Интерпретатор Python компилирует байт-код в машинный код для выполнения;
3. Машинный код выполняется на процессоре;
Тут мы увидели новое для себя слово байт-код. Что же такое байт-код? Байт-код в Python - это промежуточное представление исходного кода Python, которое интерпретатор Python использует для выполнения программы. Когда вы запускаете Python-скрипт, компилятор Python преобразует исходный код в байт-код, который затем интерпретируется и выполняется виртуальной машиной Python. Этот процесс позволяет Python быть интерпретируемым языком, что делает его более портативным и удобным для разработчиков, поскольку не требуется компиляция исходного кода в машинный код для каждой целевой платформы.
Байт-код Python хранится в файлах с расширением
Использование байт-кода имеет несколько преимуществ:
1. Байт-код может быть быстрее загружен и выполнен, поскольку он уже был скомпилирован;
2. Поскольку байт-код не зависит от конкретной архитектуры процессора, Python-программы могут быть легко перенесены между различными платформами;
3. Байт-код может быть защищен от прямого чтения исходного кода, что может быть полезно для скрытия логики приложения;
Пару слов о виртуальной машине Python, о которой я упомянул выше. Виртуальная машина в Python - это компонент, который интерпретирует байт-код Python и выполняет его. В контексте Python, виртуальная машина - это часть интерпретатора Python, которая преобразует байт-код в исполняемые инструкции.
Поздравляю, мы прошли все фазы от создания программы в ide до её выполнения на процессоре и сравнили фазы на Python и C :)
Выше в данной статье, рассказывая о цикле
Заключение
1. Узнали про отличия цикла
2. Узнали тонкости запуска скрипта на Python;
3. Прошли и сравнили все фазы: от создания программы в IDE до её выполнения на процессоре на Python и C;
Файлы к посту, можно получить в боте по коду: 591950
Пост на сайте
Поддержать проект
#Python #Сравнение_Python_и_C #Компилятор #C #Цикл #Интерпретатор #for
Процесс загрузки и интерпретации кода Python включает в себя несколько этапов, которые происходят
на лету:
1. Python считывает код построчно, интерпретирует его и преобразует в байт-код;
2. Интерпретатор Python компилирует байт-код в машинный код для выполнения;
3. Машинный код выполняется на процессоре;
Тут мы увидели новое для себя слово байт-код. Что же такое байт-код? Байт-код в Python - это промежуточное представление исходного кода Python, которое интерпретатор Python использует для выполнения программы. Когда вы запускаете Python-скрипт, компилятор Python преобразует исходный код в байт-код, который затем интерпретируется и выполняется виртуальной машиной Python. Этот процесс позволяет Python быть интерпретируемым языком, что делает его более портативным и удобным для разработчиков, поскольку не требуется компиляция исходного кода в машинный код для каждой целевой платформы.
Байт-код Python хранится в файлах с расширением
.pyc, которые создаются автоматически при первом запуске скрипта. Эти файлы содержат байт-код, который может быть быстрее загружен и выполнен, поскольку он уже был скомпилирован. Файлы.pyc обычно находятся в подкаталоге __pycache__ рядом с исходными файлами .py.Использование байт-кода имеет несколько преимуществ:
1. Байт-код может быть быстрее загружен и выполнен, поскольку он уже был скомпилирован;
2. Поскольку байт-код не зависит от конкретной архитектуры процессора, Python-программы могут быть легко перенесены между различными платформами;
3. Байт-код может быть защищен от прямого чтения исходного кода, что может быть полезно для скрытия логики приложения;
Пару слов о виртуальной машине Python, о которой я упомянул выше. Виртуальная машина в Python - это компонент, который интерпретирует байт-код Python и выполняет его. В контексте Python, виртуальная машина - это часть интерпретатора Python, которая преобразует байт-код в исполняемые инструкции.
Поздравляю, мы прошли все фазы от создания программы в ide до её выполнения на процессоре и сравнили фазы на Python и C :)
Выше в данной статье, рассказывая о цикле
for, я упомянул о цикле while, пообещав вам рассказать о нём. Раз в данной статье я начал с циклов for, то в следующей статье я продолжу тему циклов. Расскажу вам, чем отличаются цикл while в C от цикла while в Python. Расскажу, для чего эти циклы нужны и покажу их применение на интересной задаче. Дальше будет ещё интереснее :)Заключение
1. Узнали про отличия цикла
for в C от цикла for в Python;2. Узнали тонкости запуска скрипта на Python;
3. Прошли и сравнили все фазы: от создания программы в IDE до её выполнения на процессоре на Python и C;
Файлы к посту, можно получить в боте по коду: 591950
Пост на сайте
Поддержать проект
#Python #Сравнение_Python_и_C #Компилятор #C #Цикл #Интерпретатор #for
🔥3🤯3
Добрый вечер и добро пожаловать в пятницу!
Настало время для заслуженного отдыха после трудовой недели. Ничто не сравнится с уютом дома, чашечкой горячего чая или попкорном в руках, ведь сегодня - идеальный вечер для просмотра фильма. Пусть этот вечер будет наполнен теплом, эмоциями и приятными впечатлениями от просмотра.
В прошлую пятницу мы смотрели последнюю работу оскароносного Гения - Нолана, а в этот раз смотрим его лучший, на мой взгляд, фильм.
Фильм: Начало
Год: 2010
Кобб – талантливый вор, лучший из лучших в опасном искусстве извлечения: он крадет ценные секреты из глубин подсознания во время сна, когда человеческий разум наиболее уязвим. Редкие способности Кобба сделали его ценным игроком в привычном к предательству мире промышленного шпионажа, но они же превратили его в извечного беглеца и лишили всего, что он когда-либо любил.
https://www.sspoisk.ru/film/447301/
Приятного просмотра
Настало время для заслуженного отдыха после трудовой недели. Ничто не сравнится с уютом дома, чашечкой горячего чая или попкорном в руках, ведь сегодня - идеальный вечер для просмотра фильма. Пусть этот вечер будет наполнен теплом, эмоциями и приятными впечатлениями от просмотра.
В прошлую пятницу мы смотрели последнюю работу оскароносного Гения - Нолана, а в этот раз смотрим его лучший, на мой взгляд, фильм.
Фильм: Начало
Год: 2010
Кобб – талантливый вор, лучший из лучших в опасном искусстве извлечения: он крадет ценные секреты из глубин подсознания во время сна, когда человеческий разум наиболее уязвим. Редкие способности Кобба сделали его ценным игроком в привычном к предательству мире промышленного шпионажа, но они же превратили его в извечного беглеца и лишили всего, что он когда-либо любил.
https://www.sspoisk.ru/film/447301/
Приятного просмотра
🔥6
Комментарии
Автор: Иван Ашихмин
Приветствую.
Решил освещать нововведения на сайте отдельными постами и начать с комментариев.
На сайте добавлены комментарии к постам.
Писать комментарии могут только зарегистрированные пользователи.
Автор комментария может его отредактировать или удалить при желании.
Не стесняйтесь писать комментарии с вопросами, предложениями, а также критику работы самих комментариев.
Пост на сайте
Поддержать проект
#новости #Код_на_салфетке #посты #комментарии
Автор: Иван Ашихмин
Приветствую.
Решил освещать нововведения на сайте отдельными постами и начать с комментариев.
На сайте добавлены комментарии к постам.
Писать комментарии могут только зарегистрированные пользователи.
Автор комментария может его отредактировать или удалить при желании.
Не стесняйтесь писать комментарии с вопросами, предложениями, а также критику работы самих комментариев.
Пост на сайте
Поддержать проект
#новости #Код_на_салфетке #посты #комментарии
🔥4👍1
Что выведет код с изображения ниже?
Anonymous Quiz
48%
True True
17%
True False
2%
False True
33%
False False
Forwarded from Заметки на салфетке
Всем привет)
Стрима сегодня не будет потому, что я не придумал тему)
В чате кота появилось несколько идей и чтобы они не потерялись, прошу продублировать их в комментариях к этому посту.
В течении недели буду собирать идеи и будем выбирать, что будем делать в следующее воскресенье.
Стрима сегодня не будет потому, что я не придумал тему)
В чате кота появилось несколько идей и чтобы они не потерялись, прошу продублировать их в комментариях к этому посту.
В течении недели буду собирать идеи и будем выбирать, что будем делать в следующее воскресенье.
🔥2😁1
Вчера мы опубликовали задачу, которая отсылает нас ко второму посту Андрея "== != is". Судя по количеству верных ответов, а их всего 15% или 6 человек из 39-ти, без пояснений не обойтись.
Код задачи:
Разберём задчу.
Создаём четыре меременные -
Затем, вызвав функцию
1.
2.
Что пошло не так?
В результате после проведения математических операций, у нас будет следующие проверки:
- 200 это 200?
- 300 это 300?
49% участников ответили "Да!" и оказались не правы.
"Соль" заключается в способе хранения Python'ом чисел в оперативной памяти. Если говорить максимально просто, то числа от 0 до 255 хранятся в "зарезервированной" памяти, в случае с числами больше 255, каждый раз создаётся своя ячейка.
Проверить это можно следующим образом:
В результате получим следующий вывод:
Как видим, в первых двух строках
Заключение.
Как видим, все не так просто в Python с хранением данных в памяти. Стоит помнить и понимать работу, дабы быть готовым к неожидонностям.
Настоятельно рекомендую прочитать статью Андрея, для закрепления - "== != is"
Код задачи:
a = 200
b = 20
c = 300
d = 30
print(a is b * 10, c is d * 10)
Разберём задчу.
Создаём четыре меременные -
a, b, c и d. В каждую переменную определяем число.Затем, вызвав функцию
print() выводим на экран два выражения:1.
a is b * 10 - Проверяем, что число в переменной a это число из переменной b умноженное на 10.2.
c is d * 10 - Проверяем, что число в переменной c это число из переменной d умноженное на 10.Что пошло не так?
В результате после проведения математических операций, у нас будет следующие проверки:
- 200 это 200?
- 300 это 300?
49% участников ответили "Да!" и оказались не правы.
"Соль" заключается в способе хранения Python'ом чисел в оперативной памяти. Если говорить максимально просто, то числа от 0 до 255 хранятся в "зарезервированной" памяти, в случае с числами больше 255, каждый раз создаётся своя ячейка.
Проверить это можно следующим образом:
a = 200
b = 20
c = 300
d = 30
print(f"{id(a)=}\n{id(b * 10)=}\n{id(c)=}\n{id(d * 10)=}")
В результате получим следующий вывод:
id(a)=140716981156872
id(b * 10)=140716981156872
id(c)=2349489175568
id(d * 10)=2349492150192
Как видим, в первых двух строках
id совпадает, а вторых двух - нет.Заключение.
Как видим, все не так просто в Python с хранением данных в памяти. Стоит помнить и понимать работу, дабы быть готовым к неожидонностям.
Настоятельно рекомендую прочитать статью Андрея, для закрепления - "== != is"
🔥13👍2
Весна – отличное время года. Весной приходит тепло, солнце греет сильнее, сходит снег и появляются первые цветы... Ещё весной рождаются хорошие люди. Одним из таких людей оказалась Кристина Большакова!
Не перечислить сколько всего Кристина делает для Канала и Некого проекта. Организует работу, помогает с делами, придумывает задачи, подкидывает идеи и, конечно же, лупит нас тапком, когда мы начинаем лениться.
В этот замечательный день хочу поздравить Кристину с днём рождения.
Желаю тебе оставаться и дальше такой продуктивной, активной и да не устанет лупящая рука твоя. Пусть твои дети как можно реже болеют и чаще приносят “пятерки” из школы. Пусть каждый день приносит радость и приятные эмоции. Спасибо, что помогаешь нам.
А сейчас передаю слово ГлавВреду Андрею Лебедеву:
Если абстрагироваться от того, что день рождения сегодня у неё и именно она должна принимать поздравления и подарки, то Кристина — сама по себе подарок для всех участников наших проектов. Она не только помогает всем задействованным людям придерживаться взятых на себя обязательств, но и вдохновляет, мотивирует и стоит у истоков всего, что мы делаем.
Наш канал и Некий проект — это инициативы, которые держатся на доброй воле тех, кто ими занимается. И если воля у нас у всех общая, то Кристина отвечает именно за доброту. Для каждого у Кристины найдётся тёплое слово. Любого она найдёт, чем ободрить и поддержать.
Я благодарен всем ребятам за идеи, знания и опыт, которыми мы делимся, работая над проектами. Но конкретно Кристине хочется сказать спасибо за атмосферу и за то, как мы все чувствуем себя. Спасибо тебе большое! Будь здорова, счастлива и любима!
И Артуру Мурзыеву:
Дорогая Кристина! Поздравляю тебя с Днём Рождения! Желаю тебе здоровья, радости, любви, успехов во всех делах. Чтобы всегда оставалась такой же бодрой и энергичной! С Днём Рождения!
Не перечислить сколько всего Кристина делает для Канала и Некого проекта. Организует работу, помогает с делами, придумывает задачи, подкидывает идеи и, конечно же, лупит нас тапком, когда мы начинаем лениться.
В этот замечательный день хочу поздравить Кристину с днём рождения.
Желаю тебе оставаться и дальше такой продуктивной, активной и да не устанет лупящая рука твоя. Пусть твои дети как можно реже болеют и чаще приносят “пятерки” из школы. Пусть каждый день приносит радость и приятные эмоции. Спасибо, что помогаешь нам.
А сейчас передаю слово ГлавВреду Андрею Лебедеву:
Если абстрагироваться от того, что день рождения сегодня у неё и именно она должна принимать поздравления и подарки, то Кристина — сама по себе подарок для всех участников наших проектов. Она не только помогает всем задействованным людям придерживаться взятых на себя обязательств, но и вдохновляет, мотивирует и стоит у истоков всего, что мы делаем.
Наш канал и Некий проект — это инициативы, которые держатся на доброй воле тех, кто ими занимается. И если воля у нас у всех общая, то Кристина отвечает именно за доброту. Для каждого у Кристины найдётся тёплое слово. Любого она найдёт, чем ободрить и поддержать.
Я благодарен всем ребятам за идеи, знания и опыт, которыми мы делимся, работая над проектами. Но конкретно Кристине хочется сказать спасибо за атмосферу и за то, как мы все чувствуем себя. Спасибо тебе большое! Будь здорова, счастлива и любима!
И Артуру Мурзыеву:
Дорогая Кристина! Поздравляю тебя с Днём Рождения! Желаю тебе здоровья, радости, любви, успехов во всех делах. Чтобы всегда оставалась такой же бодрой и энергичной! С Днём Рождения!
🎉7❤2🔥2
Создание резервных копий VPS на Яндекс Диск
Автор: Иван Ашихмин
Бэкапы – больная тема. Разработчики скажут "какие бэкапы? У меня есть git!" и будут правы. Частично. Git, безусловно, позволяет откатиться на прошлую, "рабочую", версию. Но что будет, если откажет накопитель с проектом, который был размещен локально? Или случатся проблемы с сервером, где, помимо файлов проекта, лежит ещё и БД?
Где бэкапы? Где резервные копии? Их нет... Давайте исправим это.
Почему я задумался о бэкапах? Всё просто. У меня на сервере сейчас много всего:
- Сайт https://pressanybutton.ru/
- Telegram-бот для канала и чата https://t.iss.one/press_any_button_bot
- Собственный git-сервер на базе Gitea.
Автор: Иван Ашихмин
Бэкапы – больная тема. Разработчики скажут "какие бэкапы? У меня есть git!" и будут правы. Частично. Git, безусловно, позволяет откатиться на прошлую, "рабочую", версию. Но что будет, если откажет накопитель с проектом, который был размещен локально? Или случатся проблемы с сервером, где, помимо файлов проекта, лежит ещё и БД?
Где бэкапы? Где резервные копии? Их нет... Давайте исправим это.
Почему я задумался о бэкапах? Всё просто. У меня на сервере сейчас много всего:
- Сайт https://pressanybutton.ru/
- Telegram-бот для канала и чата https://t.iss.one/press_any_button_bot
- Собственный git-сервер на базе Gitea.
🔥2
- Собственный почтовый сервер на базе Docker Mailserver.
- Собственная Wiki на базе WikiJS.
- И БД PostgreSQL для всего этого.
Потерять это будет крайне обидно.
Мой VPS приобретён у Timeweb. У них хорошие сервера и поддержка, но я не застрахован от внештатных ситуаций. Они, конечно, предоставляют услугу по созданию резервных копий, но она стоит 180 рублей в месяц при одном бэкапе в день/неделю/месяц. Если нужно хранить 7 копий на всю неделю, это 1260 рублей в месяц, что уже "кусается". Делать же всего одну копию вчерашнего дня или раз в неделю – не так уж эффективно.
С другой стороны, у меня есть подписка на "Яндекс 360", предоставляющая 1ТБ за 2290 рублей в год. Почему бы не воспользоваться этим хранилищем?
В итоге формируется следующая задача: необходимо организовать резервное копирование данных на сервере и отправку их на Яндекс Диск.
В качестве программы для создания резервных копий мы будем использовать Restic.Документация доступна по ссылке: https://restic.readthedocs.io/en/stable/
Яндекс Диск подключим, как удалённое хранилище при помощи rclone.Документация доступна по ссылке: https://rclone.org/
Конфигурация используемого VPS:
- CPU: 2 x 3.3ГГц
- RAM: 4 Гб
- NVMe: 30 Гб
- OS: Debian 12
Все действия производятся в терминале подключенном к VPS по SSH.
Установка и настройка rclone.
Начнём мы с подключения Яндекс Диска в качестве доступного в системе раздела.
Для установки rclone, выполним в терминале команду:
В результате должно быть сообщение как на скриншоте:
После установки нам необходимо установить подключение к Яндекс Диску, создав новое удалённое подключение в rclone.
Настройка выполняется в интерактивном режиме. Для начала настройки необходимо выполнить команду:
Первое сообщение оповещает о том, что у нас нет файла настроек и будет создан новый. Далее предлагается три варианта действий:
-
-
-
Нам необходим первый вариант. Нажимаем клавишу
Следующим действием нас просят указать имя подключения. Вписываем.
Далее отобразится большой список поддерживаемых сервисов, в котором необходимо найти нужный нам Yandex Disk и ввести его номер или краткое название, указанное в скобках. В моём случае это номер 52 и имя
Далее будет три вопроса о вводе client_id, client_secret и расширенные настройки. Первые два оставляем пустыми, а в третьем выбираем
Затем нас попросят выбрать, открыть браузер для авторизации на сайте или нет. Поскольку мы подключились по SSH к VPS, никакого браузера у нас нет, выбираем
И тут возникает сложность. Нам необходимо авторизоваться в Яндекс, а для этого необходимо запустить rclone на локальной машине, где есть возможность открыть браузер.Скачиваем бинарный файл для своей системы на сайте: https://rclone.org/downloads/Пользователи Linux могут воспользоваться командой описанной выше.Локальная машина у меня на Windows, поэтому все действия буду выполнять на ней.
Не разрываем соединение с VPS сервером! Все действия проводим во втором открытом окне терминала!
Скачиваем и распаковываем архив с программой: https://downloads.rclone.org/v1.66.0/rclone-v1.66.0-windows-amd64.zip
Открываем в этой директории терминал.
Копируем команду, указанную в сообщении на VPS, заменив в начале
В браузере откроется страница с авторизацией в Яндекс. Вводим логин и пароль. Затем разрешаем доступ к Диску.
- Собственная Wiki на базе WikiJS.
- И БД PostgreSQL для всего этого.
Потерять это будет крайне обидно.
Мой VPS приобретён у Timeweb. У них хорошие сервера и поддержка, но я не застрахован от внештатных ситуаций. Они, конечно, предоставляют услугу по созданию резервных копий, но она стоит 180 рублей в месяц при одном бэкапе в день/неделю/месяц. Если нужно хранить 7 копий на всю неделю, это 1260 рублей в месяц, что уже "кусается". Делать же всего одну копию вчерашнего дня или раз в неделю – не так уж эффективно.
С другой стороны, у меня есть подписка на "Яндекс 360", предоставляющая 1ТБ за 2290 рублей в год. Почему бы не воспользоваться этим хранилищем?
В итоге формируется следующая задача: необходимо организовать резервное копирование данных на сервере и отправку их на Яндекс Диск.
В качестве программы для создания резервных копий мы будем использовать Restic.Документация доступна по ссылке: https://restic.readthedocs.io/en/stable/
Яндекс Диск подключим, как удалённое хранилище при помощи rclone.Документация доступна по ссылке: https://rclone.org/
Конфигурация используемого VPS:
- CPU: 2 x 3.3ГГц
- RAM: 4 Гб
- NVMe: 30 Гб
- OS: Debian 12
Все действия производятся в терминале подключенном к VPS по SSH.
Установка и настройка rclone.
Начнём мы с подключения Яндекс Диска в качестве доступного в системе раздела.
Для установки rclone, выполним в терминале команду:
sudo -v ; curl https://rclone.org/install.sh | sudo bash
В результате должно быть сообщение как на скриншоте:
После установки нам необходимо установить подключение к Яндекс Диску, создав новое удалённое подключение в rclone.
Настройка выполняется в интерактивном режиме. Для начала настройки необходимо выполнить команду:
rclone config
Первое сообщение оповещает о том, что у нас нет файла настроек и будет создан новый. Далее предлагается три варианта действий:
-
n - Новое подключение-
s - Установить пароль-
q - Выйти из настроек.Нам необходим первый вариант. Нажимаем клавишу
n и отправляем.Следующим действием нас просят указать имя подключения. Вписываем.
Далее отобразится большой список поддерживаемых сервисов, в котором необходимо найти нужный нам Yandex Disk и ввести его номер или краткое название, указанное в скобках. В моём случае это номер 52 и имя
(yandex).Далее будет три вопроса о вводе client_id, client_secret и расширенные настройки. Первые два оставляем пустыми, а в третьем выбираем
n.Затем нас попросят выбрать, открыть браузер для авторизации на сайте или нет. Поскольку мы подключились по SSH к VPS, никакого браузера у нас нет, выбираем
n.И тут возникает сложность. Нам необходимо авторизоваться в Яндекс, а для этого необходимо запустить rclone на локальной машине, где есть возможность открыть браузер.Скачиваем бинарный файл для своей системы на сайте: https://rclone.org/downloads/Пользователи Linux могут воспользоваться командой описанной выше.Локальная машина у меня на Windows, поэтому все действия буду выполнять на ней.
Не разрываем соединение с VPS сервером! Все действия проводим во втором открытом окне терминала!
Скачиваем и распаковываем архив с программой: https://downloads.rclone.org/v1.66.0/rclone-v1.66.0-windows-amd64.zip
Открываем в этой директории терминал.
Копируем команду, указанную в сообщении на VPS, заменив в начале
rclone на .\rclone.exe. Выполняем.В браузере откроется страница с авторизацией в Яндекс. Вводим логин и пароль. Затем разрешаем доступ к Диску.
🔥4
После того, как увидели надпись
Нас попросят подтвердить, что всё верно. Печатаем и отправляем
На этом добавление подключения закончено.
Не отходя от rclone, создадим директорию для хранения бэкапов на диске, выполнив команду:
Где
Установка и настройка Restic.
После того, как мы подключили rclone, можно устанавливать Restic.
Для установки выполним команду:
Далее инициализируем созданное подключение, выполнив команду:
Нас сразу попросят ввести пароль от репозитория, так называются хранилища в Restic. Вводим.
Сохраните пароль! Без него не будет доступа к репозиторию!
Для создания бэкапа используем команду:
Где
Начнётся процесс создания резервной копии. В моём случае на 7 Гб данных из 38 тысяч файлов, заняло чуть меньше 9-ти минут. Дольше всего добавлялись файлы git-сервера. Следующие бэкапы будут производиться быстрее, поскольку тут система похожа с git - создаётся изначальный индекс репозитория, а затем добавляются или удаляются файлы как "коммиты", называемые "снимками".
Всё предельно просто.
Автоматический запуск создания резервной копии.
Автоматизировать создание бэкапов нам поможет cron, но сперва мы напишем простейший скрипт для вызова команды Restic.
Создадим новый файл
Затем откроем его в nano и пропишем следующее содержимое:
В первой строке прописываем так называемый "шебанг". Это строка начинающаяся с
Нажимаем CTRL+S для сохранения и CTRL+X ля выхода.
Далее файлу необходимо дать права на исполнение. Выполним команду:
Затем запустим crontab для редактирования, выполнив команду:
И впишем туда следующую строку:
Стока выше определяет, что скрипт указанный по пути будет запускаться каждый день в 00:30.
Проверить работу и посмотреть список снимков можно командой:
Восстановление резервной копии.
Резервную копию сделали, а как восстанавливать? Всё достаточно просто.
Для того, чтобы восстановить снимок, достаточно выполнить две команды.
Первая команда описана выше, сперва необходимо выбрать идентификатор снимка для восстановления:
Вторая команда непосредственно восстанавливает снимок:
Вместо
Заключение.
Мы подключили к VPS Яндекс Диск и настроили автоматическое создание резервных копий. Тема была интересна, и я надеюсь, что бэкапы так и останутся невосстановленными.
Success!, возвращаемся в терминал и видим несколько строк с токеном. Копируем его и вставляем в терминал VPS.Нас попросят подтвердить, что всё верно. Печатаем и отправляем
y.На этом добавление подключения закончено.
Не отходя от rclone, создадим директорию для хранения бэкапов на диске, выполнив команду:
rclone mkdir yandex_disk:vps_backup
Где
yandex_disk - имя подключения, а vps_backup - имя директории.Установка и настройка Restic.
После того, как мы подключили rclone, можно устанавливать Restic.
Для установки выполним команду:
apt-get install restic
Далее инициализируем созданное подключение, выполнив команду:
restic -r rclone:yandex_disk:vps_backup init
Нас сразу попросят ввести пароль от репозитория, так называются хранилища в Restic. Вводим.
Сохраните пароль! Без него не будет доступа к репозиторию!
Для создания бэкапа используем команду:
restic -r rclone:yandex_disk:vps_backup backup /root
Где
/root - директория, которая будет сохранена в резервной копии.Начнётся процесс создания резервной копии. В моём случае на 7 Гб данных из 38 тысяч файлов, заняло чуть меньше 9-ти минут. Дольше всего добавлялись файлы git-сервера. Следующие бэкапы будут производиться быстрее, поскольку тут система похожа с git - создаётся изначальный индекс репозитория, а затем добавляются или удаляются файлы как "коммиты", называемые "снимками".
Всё предельно просто.
Автоматический запуск создания резервной копии.
Автоматизировать создание бэкапов нам поможет cron, но сперва мы напишем простейший скрипт для вызова команды Restic.
Создадим новый файл
backup_script.sh, вызвав команду:touch backup_script.sh
Затем откроем его в nano и пропишем следующее содержимое:
#!/bin/bash
export RESTIC_PASSWORD="password"
restic -r rclone:yandex_disk:vps_backup backup /root
В первой строке прописываем так называемый "шебанг". Это строка начинающаяся с
#! и указывающая путь к интерпретатору или программе, в которой следует выполнить описанный в файле код.В третьей строке мы передаём пароль от репозитория в переменные окружения.В пятой строке вызываем команду создания бэкапа.Нажимаем CTRL+S для сохранения и CTRL+X ля выхода.
Далее файлу необходимо дать права на исполнение. Выполним команду:
chmod +x backup_script.sh
Затем запустим crontab для редактирования, выполнив команду:
crontab -e
И впишем туда следующую строку:
30 0 * * * /root/backup_script.sh
Стока выше определяет, что скрипт указанный по пути будет запускаться каждый день в 00:30.
Проверить работу и посмотреть список снимков можно командой:
restic -r rclone:yandex_disk:vps_backup snapshots
Восстановление резервной копии.
Резервную копию сделали, а как восстанавливать? Всё достаточно просто.
Для того, чтобы восстановить снимок, достаточно выполнить две команды.
Первая команда описана выше, сперва необходимо выбрать идентификатор снимка для восстановления:
restic -r rclone:yandex_disk:vps_backup snapshots
Вторая команда непосредственно восстанавливает снимок:
restic -r rclone:yandex_disk:vps_backup restore <ID> --target /root
Вместо
<ID> вписываем идентификатор снимка.Заключение.
Мы подключили к VPS Яндекс Диск и настроили автоматическое создание резервных копий. Тема была интересна, и я надеюсь, что бэкапы так и останутся невосстановленными.
🔥9👍1
Приветствую!
Каналу исполнилось 9 месяцев!
За это время:
- Вышло свыше 120 постов.
- На канал подписались 473 человек!
- На сайте примерно 80-100 ежедневных посещений.
- Стримы и другие активности.
Спасибо всем тем, кто читает наши посты. Тем, кто участвует в обсуждении. И тем, кто поддерживает нас.
Впереди много планов, которые по чуть-чуть да воплощаются.
Каналу исполнилось 9 месяцев!
За это время:
- Вышло свыше 120 постов.
- На канал подписались 473 человек!
- На сайте примерно 80-100 ежедневных посещений.
- Стримы и другие активности.
Спасибо всем тем, кто читает наши посты. Тем, кто участвует в обсуждении. И тем, кто поддерживает нас.
Впереди много планов, которые по чуть-чуть да воплощаются.
🔥13❤🔥2☃2❤2🆒1
Отправка поста с Django в AIOgram - обновление
Автор: Иван Ашихмин
В посте "Django + AIOgram3 + Redis - Отправка поста с Django в AIOgram" я рассказывал как отправлять текст поста в AIOgram, обрабатывать и публиковать в Telegram-канале.
Это была первая версия обработчика, которая работала, но была не совсем удобна в использовании.
После нескольких месяцев использования прошлой системы, появилась необходимость "апгрейда" для более удобной публикации постов с сайта в канале.
Обновление основано на файлах из поста: "Django + AIOgram3 + Redis - Отправка поста с Django в AIOgram".
Продолжение в посте на Boosty (платный контент)
Пост на сайте
Поддержать проект
#Python #Django #Гайды #Telegram #AIOgram #Telegram_бот #AIOgram3 #бот #Boosty #автоматический_постинг
Автор: Иван Ашихмин
В посте "Django + AIOgram3 + Redis - Отправка поста с Django в AIOgram" я рассказывал как отправлять текст поста в AIOgram, обрабатывать и публиковать в Telegram-канале.
Это была первая версия обработчика, которая работала, но была не совсем удобна в использовании.
После нескольких месяцев использования прошлой системы, появилась необходимость "апгрейда" для более удобной публикации постов с сайта в канале.
Обновление основано на файлах из поста: "Django + AIOgram3 + Redis - Отправка поста с Django в AIOgram".
Продолжение в посте на Boosty (платный контент)
Пост на сайте
Поддержать проект
#Python #Django #Гайды #Telegram #AIOgram #Telegram_бот #AIOgram3 #бот #Boosty #автоматический_постинг
🔥3👍1
Добрый вечер! Пятница наступила!
Время отключиться от повседневных забот, погрузиться в атмосферу кино и позволить себе почувствовать всю гамму эмоций, которые передают герои на экране. Устройтесь поудобнее и готовьтесь к погружению в мир кинематографа, который позволит вам окунуться в историю и пережить каждый момент вместе с героями.
Фильм: Путь домой
Год: 2010
1940 год, Сибирь. Самый страшный лагерь для политзаключенных. Небольшая группа осужденных смогла вырваться из этого страшного места. Теперь их ждёт долгий и трудный путь домой: выживание в пустыне, переход через горы, столкновение с дикими животными и встречи с незнакомыми людьми. Они идут домой из последних сил, надеясь на встречу со своими близкими.
https://www.sspoisk.ru/film/430638/
Приятного просмотра!
Время отключиться от повседневных забот, погрузиться в атмосферу кино и позволить себе почувствовать всю гамму эмоций, которые передают герои на экране. Устройтесь поудобнее и готовьтесь к погружению в мир кинематографа, который позволит вам окунуться в историю и пережить каждый момент вместе с героями.
Фильм: Путь домой
Год: 2010
1940 год, Сибирь. Самый страшный лагерь для политзаключенных. Небольшая группа осужденных смогла вырваться из этого страшного места. Теперь их ждёт долгий и трудный путь домой: выживание в пустыне, переход через горы, столкновение с дикими животными и встречи с незнакомыми людьми. Они идут домой из последних сил, надеясь на встречу со своими близкими.
https://www.sspoisk.ru/film/430638/
Приятного просмотра!
🔥4
Что выведет код с изображения ниже? №16
Anonymous Quiz
6%
['Желает', 'Знать', 'Охотник', 'Где', 'Сидит', 'Каждый', 'Фазан']
12%
['Каждый', 'Охотник', 'Знать', 'Сидит', 'Желает', 'Где', 'Фазан']
14%
['Каждый', 'Охотник', 'Желает', 'Знать', 'Где', 'Сидит', 'Фазан']
69%
['Где', 'Желает', 'Знать', 'Каждый', 'Охотник', 'Сидит', 'Фазан']
🔥5👍1🤓1
Вчера мы опубликовали задачу на знание основ работы словарей в Python. Задачу верно решило большее число ответивших, а именно 66%.
Код задачи:
Разбор задачи:
Задача состоит из двух шагов:
1. Создаём переменную
2. Выводим на печать отсортированный список значений словаря.
Что происходит в коде?
В переменной
Далее мы хотим его отсортировать, но не указываем по какому параметру, а только лишь передаём в "сортировщик" список (list) со значениями. Возможно, кого-то этот ход обманул: мы действительно просто сортируем список значений словаря, вне всякой зависимости от ключей, которые оказываются просто отброшенными.
В Python сортировка строк осуществляется побуквенно, т.е. строка символов преобразуется в список чисел, где каждый элемент – это число из unicode-таблицы символов. При этом строка из четырёх символов будет всегда считаться меньшей, чем строка из пяти, если четыре первые символа в обеих строках совпадают.
Например,
В нашем же примере слова просто отсортируются по алфавиту:
Где
Желает
Знать
Каждый
Охотник
Сидит
Фазан
Если же мы хотим получить "правильный" порядок, основанный на ключах, то можно воспользоваться сортировкой по ключу:
В примере выше в функцию
Код задачи:
dct = {
"10": "Желает",
"2": "Знать",
"1": "Охотник",
"22": "Где",
"3": "Сидит",
"0": "Каждый",
"30": "Фазан"
}
print(sorted(dct.values()))Разбор задачи:
Задача состоит из двух шагов:
1. Создаём переменную
dct, в которой прописываем словарь.2. Выводим на печать отсортированный список значений словаря.
Что происходит в коде?
В переменной
dct мы прописали словарь, в котором и ключи, и значения – строки. Далее мы хотим его отсортировать, но не указываем по какому параметру, а только лишь передаём в "сортировщик" список (list) со значениями. Возможно, кого-то этот ход обманул: мы действительно просто сортируем список значений словаря, вне всякой зависимости от ключей, которые оказываются просто отброшенными.
В Python сортировка строк осуществляется побуквенно, т.е. строка символов преобразуется в список чисел, где каждый элемент – это число из unicode-таблицы символов. При этом строка из четырёх символов будет всегда считаться меньшей, чем строка из пяти, если четыре первые символа в обеих строках совпадают.
Например,
"абвг" будет идти после "абв" или "Я" будет считаться меньше чем "а".В нашем же примере слова просто отсортируются по алфавиту:
Где
Желает
Знать
Каждый
Охотник
Сидит
Фазан
Если же мы хотим получить "правильный" порядок, основанный на ключах, то можно воспользоваться сортировкой по ключу:
print([v for _, v in sorted(dct.items())])
В примере выше в функцию
sorted() попадёт кортеж (ключ: значение), и сортировка будет по первому элементу – т.е. по ключу. Затем в цикле выводим значение на экран и получаем:['Каждый', 'Охотник', 'Желает', 'Знать', 'Где', 'Сидит', 'Фазан']
🔥6
Django 41. Комментарии к постам
Автор: Иван Ашихмин
В нашем проекте не хватает одного важного элемента – блока комментариев на странице поста. Давайте исправим это.
Что мы сделаем:
- Добавим на страницу поста отображение комментариев.
- Добавим возможность авторизованным пользователям оставлять комментарии.
- Также у автора комментария или администратора должна быть возможность удалить или отредактировать комментарий.
Модель комментария.
Для хранения комментариев нам нужна модель.
Откроем файл
Создадим класс
-
-
Автор: Иван Ашихмин
В нашем проекте не хватает одного важного элемента – блока комментариев на странице поста. Давайте исправим это.
Что мы сделаем:
- Добавим на страницу поста отображение комментариев.
- Добавим возможность авторизованным пользователям оставлять комментарии.
- Также у автора комментария или администратора должна быть возможность удалить или отредактировать комментарий.
Модель комментария.
Для хранения комментариев нам нужна модель.
Откроем файл
models.py в директории приложения blog.Создадим класс
CommentModel, унаследованный от models.Model, и пропишем четыре поля:-
user – Внешний ключ на модель пользователя.-
post – Внешний ключ на модель поста. Для доступа к модели комментария из объекта модели поста указываем аргумент related_name="comments".🔥1