Реальный Код
25 subscribers
42 photos
6 videos
55 links
The Real Coding - твой проводник в мир разработки ПО.

Делюсь реальным опытом разработки с новичками.

Практические знания и советы по:
- Python
- Selenium
- командная строка
- C++
- много других интересностей, которые пригодятся вам в профессии
Download Telegram
This media is not supported in your browser
VIEW IN TELEGRAM
Умножаем строки в Питоне

#python #string
👍3👎1🔥1🤔1
This media is not supported in your browser
VIEW IN TELEGRAM
Встроенный календарь в Питоне 🗓️

Знали ли вы, что в Питоне уже есть встроенный календарь, который можно легко вывести вызовом одной функции?


import calendar

# печатает месяц
calendar.prmonth(2024, 2)

# печатает весь календарный год
calendar.prcal(2024)


Сможете написать такой сами?

#python #calendar
👍1👎1🔥1🤔1
🐶 ауффффф

хочу сегодня поделиться с вами ТГ-ботом, написанным вчера на скорую руку просто по фану

@dp_doggy_dog_bot

бот делает ровно одну конкретную вещь – показывает рандомную фото рандомной собаки + также рандомный факт о собаках

кому интересно, код здесь https://github.com/DiPaolo/doggy-dog-bot. Там все предельно просто – 1 файлик, сгенеренный на основе моего темплейта для ТГ-ботов (который вы также можете найти на моем ГитХабе) + дергаем стороннюю открытую АПИшку + выкачал ~400 рандомных фактов, перевел утилитой, завернул в список и положил его в pickle-файлик

наслаждайтесь милотой ☺️

#telegramBot #python #fun #dogs
👍1👎1🔥1🤔1
Как работает веб-сервер 🤔 объясняю на пальцах

расскажу сегодня простыми словами, как работают сайты и как получается, что после ввода адреса своего любимого сайта в браузерной строке у тебя появляется страница

1. браузер берет введенный адрес (по сути это адресат, как на конверте) и идет по нему куда-то там на сервер

2. запущенная на сервере (специальный или даже обычный компьютер) программа получает запрос вида “а дай-ка мне страницу – там пользователь просит”, формирует исходный код страницы на языке HTML (это такой язык разметки веб-страниц) и отдает обратно отправителю

3. далее по сетям этот ответ идет обратно и возвращается к нам в браузер. После чего тот красиво рисует сайт на основе полученного описания в формате HTML

код тут 👉 https://github.com/DiPaolo/the-real-coding/blob/main/python/simplest_web_server/simplest_web_server.py

берите и запускайте свой первый собственный веб-сервер 💪

#python #webServer #howItWorks #наПальцах
👍2👎1🤔1
Реальный Код
Как работает веб-сервер 🤔 объясняю на пальцах расскажу сегодня простыми словами, как работают сайты и как получается, что после ввода адреса своего любимого сайта в браузерной строке у тебя появляется страница 1. браузер берет введенный адрес (по сути это…
продолжим… и поиграемся немного с нашим сервером

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

например, выведем календарь на текущий месяц. Мы уже делали это выше стандартными средствами Питона 👆 https://t.me/the_real_coding/28

просто переиспульзуем ту же функцию + завернем ее вывод в формат HTML

код в итоге стал не сильно сложнее + там есть мои комменты – обязательно посмотрите. При этом мы продвинулись вперед и добавили нашему серверу чуть больше полезности

а впереди еще интереснее! 😉

код: https://github.com/DiPaolo/the-real-coding/blob/main/python/simplest_web_server_ext/simplest_web_server_calendar.py






import calendar
import datetime
import http
from http.server import BaseHTTPRequestHandler, HTTPServer

Handler = http.server.SimpleHTTPRequestHandler


class HelloWorldServer(BaseHTTPRequestHandler):
def do_GET(self):
# печатаем текущий месяц и сохраняем в строку
today = datetime.datetime.today()
month_calendar_str = calendar.month(today.year, today.month)

# в HTML есть ряд особенностей вывода текста; обрабатываем их:
# 1. переход на новую строку в HTML осуществляется не с помощью символа '\n',
# а добавлением тега '<br>'
month_calendar_str = month_calendar_str.replace('\n', '<br>')
# 2. несколько пробелов подряд выводятся как один, потому вместо каждого
# пробела ставим спец. символ, принудительно вставляющего пробел
month_calendar_str = month_calendar_str.replace(' ', ' ')

# добавляем в наш HTML-код страницы пункт, указывающий, какая кодировка
# используется на странице:
# <meta charset="UTF-8">
# это нужно, чтобы корректно отображались русские символы

# еще один нюанс - используем тег '<tt>' (телетайп, то есть моноширинный шрифт),
# чтобы наши строки не съезжали и все понедельники были друг под другом,
# а субботы - под субботами

html_page = \
f"""
<html>
<head>
<title>Hello, World!</title>
<meta charset="UTF-8">
</head>
<body>
<h1 align='center'>Календарь</h1>
<tt>
{month_calendar_str}
</tt>
</body>
</html>
"""
body = html_page.encode('UTF-8', 'replace')

self.send_response(200)
self.send_header("Content-type", "text/html")
self.send_header('Content-Length', str(len(body)))
self.end_headers()

self.wfile.write(body)


if __name__ == "__main__":
webServer = HTTPServer(server_address=('127.0.0.1', 8080),
RequestHandlerClass=HelloWorldServer)
print('Server started')

try:
webServer.serve_forever()
except KeyboardInterrupt:
pass
except Exception as ex:
print(f'Server unexpectedly finished ({ex})')

webServer.server_close()
print('Server stopped')


запустите сами и проверьте у себя. Вам нужен только лишь Питон, даже IDE не потребуется 👌

#python #calendar #webServer #играемся
👍1👎1🔥1🤔1
совершенствуем наш календарь 🗓️

- отметим красным цветом выходные дни, для чего напишем собственную функцию
- используем тег <table>, чтобы дни недели были выровнены друг под другом
- используем русские названия дней недели и месяцев
- выделим текущий день
- выведем весь календарный год

полный код 👉 https://github.com/DiPaolo/the-real-coding/blob/main/python/simplest_web_server_ext/simplest_web_server_calendar_full_year.py

смотрите-изучайте-задавайте вопросы 🙌

PS запилил пост и потом понял, что ошибочка затесалась – не отображались последние дни месяцев 😅 недотестировал 😁

#python #calendar #webServer #играемся
👍2👎1🤔1
+ АПИшку давайте прикрутим, чё уж там 😁

дернем публичное АПИ для получения списка праздников, чтобы отметить красным официальные выходные дни

тут в канале все как всегда просто, когда двигаемся маленькими шагами step-by-step –  берем requests, получаем ответ по URL-адресу для России, ответ преобразуем в питоновский объект списка, а оттуда выдираем список дат-праздников. Далее, если выводимая дата находится в этом списке, то отмечаем ее красным также, как и выходные дни:


def get_public_holidays(year: int) -> List[datetime.date]:
out = list()

res = requests.get(f'https://date.nager.at/api/v3/PublicHolidays/{year}/ru')
if not res.ok:
return out

holiday_list_data = res.json()
for holiday in holiday_list_data:
date_str = holiday['date']
date = datetime.datetime.strptime(date_str, '%Y-%m-%d')
out.append(date.date())

return out


код 👉 https://github.com/DiPaolo/the-real-coding/blob/main/python/simplest_web_server_ext/simplest_web_server_calendar_full_year_with_public_holidays.py

#python #publicApi #requests #webServer #calendar #играемся
👍3👎1🤔1
«Что будет проще для понимания условного гуманитария: js или питон?»



#вопросОтвет #расскажуЗаМинуту #python #js #вкатывание
👍3👎1🤔1
спешу поделиться с вами радостью!

в совсем недавно вышедший питон 3.13 вошел мой фикс 😃 ууууууррррааааааа 🥳 несказанно счастлив и горжусь 💪

бага была зарепорчена мною еще года три назад, и пофикшена тогда же:

argparse incorrectly shows help string on a new line in case of long command string (https://github.com/python/cpython/issues/87041)

а вот и сам фикс: https://github.com/python/cpython/commit/8d3a0fecbe2edb69cf66db82f1c59601aac94651

так что вот, приложил свою руку 😎☺️

#python
🔥3👍2👎21👏1🤔1🤓1
что же касается самого релиза, то я для себя отметил следующее:

- PEP 703 – Making the Global Interpreter Lock Optional in CPython (https://peps.python.org/pep-0703/)
- вместо него есть штука Free-threaded CPython (https://docs.python.org/3/whatsnew/3.13.html#free-threaded-cpython)
- A better interactive interpreter (https://docs.python.org/3/whatsnew/3.13.html#whatsnew313-better-interactive-interpreter)
- PEP 730 – Adding iOS as a supported platform (https://peps.python.org/pep-0730/)
- PEP 738 – Adding Android as a supported platform (https://peps.python.org/pep-0738/)

полный список фич и обновлений тут https://www.python.org/downloads/release/python-3130/

🐍

#python #release
👍5👎2🤔2
как ускорить своего бота в 10x раз 🚀

сегодня покажу одну маленькую вещь, которая может значительно ускорить вашу систему. Эта вещь – кэширование. Кэширование активно применяется на всех уровнях: от кэша процессора L1/L2/L3 и до кэширующих баз данных типа Redis

вкратце, суть такова: если есть сложные вычисления либо доступ к данным занимает длительное время, и данные какое-то время будут актуальны – можно их сохранить «поближе» к себе в более скоростном месте

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

надеюсь, тут все понятно. теперь к мааааааааленькому одному конкретному примеру, как я это сделал на практике

есть у меня бот, который показывает погоду в нескольких городах. Погоду он берет с некоторого погодного АПИ. На каждый город (допустим их 4) нужно сходить с запросом к серверу

но мы понимаем, что в течение часа погода сильно не изменится. Потому я решаю е ходить в течение часа за погодой в том же регионе, а сохранить ее у себя. ВАЖНО я бы не мог сделать такое допущение, если бы это был сервис предупреждения о бурях и другой непогоде где-нибудь в горах. Мой бот позволяет мне пренебречь этим и показывать «старую» погода в пределах часа

в Питоне есть встроенный удобные декоратор – @lru_cache (https://docs.python.org/3/library/functools.html). Однако в нем нету TTL (time to live – то есть сколько наши данные не будут «протухшими» по времени)

чтобы не городить огород самому с этим TTL вокруг стандартной функции, я легко нашел и воспользовался библиотеку с такой функциональностью – https://pypi.org/project/cachetools/

вот что получилось:


@cached(cache=TTLCache(maxsize=512, ttl=60*60))
def get_weather_at_location(latitude, longitude):
ret = requests.get(
f"https://api.open-meteo.com/v1/forecast?latitude={latitude}&longitude={longitude}"
f"&hourly=temperature_2m,weather_code,wind_speed_10m&wind_speed_unit=ms&current_weather=true&timezone=Asia%2FNovosibirsk")

return ret.json()


теперь, сделав запрос один раз, декоратор у себя в мапяти(!) сохранят значение (да-да! прямо JSON). И в следующий раз приобращении к этой функции с теми же аргументами, не будет выполнять код функции, а вместо этого вернет уже готовый результат. При этом, чере час он очистит кэш для этих входных аргументов функции, чтобы снова сходить на сервер по АПИ и получить актуальную погоду

вот результат – 10x в скорости ответа. А это значит, что мои пользователи увидят ответ значительно быстрее 😀

вот запрос первый раз (некэшированные данные)

2024-11-04 13:57:58,786 - root - INFO - request stats (chat_id=218988127, message_id=121, time_sec=1.85)


после этого запроса они закэшировались, и то же обращение за погодой отрабатывает уже в 10 раз быстрее!


2024-11-04 13:58:02,425 - root - INFO - request stats (chat_id=218988127, message_id=123, time_sec=0.17)


и так происходит в течение часа (обратите внимание на время):

2024-11-04 14:18:35,425 - root - INFO - request stats (chat_id=218988127, message_id=133, time_sec=0.139)


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


2024-11-04 15:10:33,043 - root - INFO - request stats (chat_id=218988127, message_id=137, time_sec=1.89)


после чего – опять быстро выдаем ответ пользователю:


2024-11-04 15:10:36,277 - root - INFO - request stats (chat_id=218988127, message_id=139, time_sec=0.215)


вот такие дела… на все про все – 15 минут и 10x быстрее работа бота 😎

#python #cache #ускоряем #боты
👍3👎2🔥2🤔1🤓1