diff options
| -rw-r--r-- | day3/task1/README.md | 18 | ||||
| -rw-r--r-- | day3/task2/README.md | 98 | ||||
| -rw-r--r-- | day3/task4/task4.py | 56 | ||||
| -rw-r--r-- | day4/task1/task1.py | 4 | ||||
| -rw-r--r-- | day5/task1/task1.py | 20 | ||||
| -rw-r--r-- | day5/task2/task2.py | 31 | ||||
| -rw-r--r-- | day5/task3/task3.py | 29 | ||||
| -rw-r--r-- | day6/task1/task1.py | 5 | ||||
| -rw-r--r-- | day6/task2/task2.py | 7 | ||||
| -rw-r--r-- | day6/task3/task3.py | 35 |
10 files changed, 303 insertions, 0 deletions
diff --git a/day3/task1/README.md b/day3/task1/README.md new file mode 100644 index 0000000..5e3ef67 --- /dev/null +++ b/day3/task1/README.md @@ -0,0 +1,18 @@ +# JSON + +Является независимым подмножеством языка Javascript, которое сегодня можно сериализовать/десериализовать практически в +любом языке программирования. + +В сравнении с XML является более лаконичным из-за чего может быть более подходящим для передачи сложных структур по +сети (снижение используемого трафика). + +Является подмножеством YAML. + +# YAML + +Является надмножеством JSON из-за чего включает в себя все его положительные стороны. Концептуально близок к языкам +разметки, но ориентированный на удобство ввода-вывода типичных структур данных многих языков программирования. + +# XML +Язык разметки, разработанный W3C. Во многом многословен из-за чего может оказаться невыгодным для передачи небольших +структур данных по сети, но становится более удобным и эффективным при росте размера и сложности документа. diff --git a/day3/task2/README.md b/day3/task2/README.md new file mode 100644 index 0000000..84298d9 --- /dev/null +++ b/day3/task2/README.md @@ -0,0 +1,98 @@ +# Документ 1 + +> Request URL: https://app.reg.academy/admin + +URL, запрашиваемый у сервера + +> Request Method: GET + +Метод, с помощью которого создается запрос серверу. Далее сервер на своей стороне решает как именно обрабатывать +запрос с данным методом. Действия сервера в соответствии с методом описаный в спецификации, но реальные действия +ею не ограничены и сервер реализовывать ответы на запросы не по спецификации. + +> Status Code: 200 OK + +Статус запроса. Статус 200 означает, что запрос обработан успешно. Используется для того, чтобы клиент мог узнать как +был обработан его запрос и при появлении ошибок знал их причину. + +> Remote Address: 89.108.89.128:443 + +IP-адрес и порт сервера. + +> Referrer Policy: no-referrer-when-downgrade + +Заголовок, который означает, что URL клиента не будет отослан серверу, +если уровень защиты соединения понизился (HTTPS -> HTTP), но будет отослан, если уровень защиты +останется тем же (HTTP -> HTTP, HTTPS -> HTTPS) + +> Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng, + +Список допустимых форматов ресурса. (Обычный текст, и картинки разных форматов). + +> Accept-Encoding: gzip, deflate, br + +Перечень поддерживаемых способов кодирования содержимого сущности при передаче. + +> Accept-Language: en-US,en;q=0.9,ru;q=0.8 + +Список поддерживаемых естественных языков. + +> Cache-Control: no-cache + +Директива для управления кэшем. (не использовать кэш). + +> Connection: keep-alive + +Сведения о проведении соединения. (Сохранять соединение, пока оно не закроется). + +> Cookie: connect.sid=s123123123E + +Cookie-информация. Хранится на компьютере клиента. Используется для сохранения некоторых данных на стороне клиента. +Передается серверу в составе HTTP-запроса. + +> Host: app.reg.academy + +URL сервера. + +> Pragma: no-cache + +Используется как заголовок для обратной совместимости с системами, в которых заголовок Cache-Control не обрабатывается. +Используется аналогично Cache-Control. + +> Referer: https://app.reg.academy/admin/schools + +URL запроса клиента. При переходе по ссылке с одной страницы на другуй Referer будет являться первая. + +> Upgrade-Insecure-Requests: 1 + +Заголовок для сервера, который означает, что клиент предпочитает +защищенное соединение над незащищенным (HTTPS над HTTP). + +> User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36 + +Список названий и версий программ клиента, с помощью которых совершаются запросы и производится +обработка ответов сервера. + +# Документ 2 + +*Описаны только заголовки, отсутствующие в первом документе.* + +> Content-Length: 86 + +Размер передаваемого содержимого в байтах. + +> Content-Type: application/json;charset=UTF-8 + +Тип передаваемого содержимого (JSON-файл в UTF-8 кодировке) + +> csrf-token: bsARqevf-Uc1JBrBCxTuOPVnRgvL2gSEtcys + +Ключ, сгенерированный браузером для защиты от межсайтовой подделки запроса. (CSRF - Сross Site Request Forgery). + +> Origin: https://app.reg.academy + +Заголовок содержит в себе URL сервера + +> X-Requested-With: XMLHttpRequest + +Используется при запросах из JavaScript без перезагрузки страницы. Полезен для имитации AJAX запросов. diff --git a/day3/task4/task4.py b/day3/task4/task4.py new file mode 100644 index 0000000..b02f1fa --- /dev/null +++ b/day3/task4/task4.py @@ -0,0 +1,56 @@ +import re +from datetime import datetime + +f = open('otrs_error.log') + +matcher = re.compile(r'\[(?P<date>.*?)\]\[(?P<type>.*?)\]\[(?P<module>.*?)\]\[(?P<id>.*?)\] (?P<text>.*)') + +match_date_low = datetime(2017, 8, 6, 10, 0) +match_date_high = datetime(2017, 8, 6, 19, 0) +count_module = 'Kernel::System::Ticket::TicketPermission' +counter = 0 + +errors_by_module = {} +errors_by_date = {} + +lines = f.readlines() +for line in lines: + line = line.strip() + match = re.match(matcher, line) + + if match: + try: + date = datetime.strptime(match.group('date'), '%c') + except ValueError: + print(f'Ошибка при разборе строки (Неверный формат даты):\n{line}') + continue + + module = match.group('module') + + if match_date_low <= date <= match_date_high and module == count_module: + counter += 1 + + errors_by_module[module] = errors_by_module.get(module, 0) + 1 + + err_date = datetime(date.year, date.month, date.day) + errors_by_date[err_date] = errors_by_date.get(err_date, []) + [{ + 'date': date, + 'type': match.group('type'), + 'module': module, + 'id': match.group('id'), + 'text': match.group('text') + }] + + else: + print(f'Ошибка при разборе строки:\n{line}') + +print(f'За период с {match_date_low} по {match_date_high} в модуле "{count_module}" произошло {counter} ошибок') + +for module, count in sorted(errors_by_module.items(), key=lambda p: p[1], reverse=True): + print(f'В модуле {module} за все время произошло {count} ошибок') + +for date, errors in errors_by_date.items(): + # Дополняем дни и месяцы до ширины 2 с помощью нулей слева + with open(f'{str(date.day).rjust(2, "0")}.{str(date.month).rjust(2, "0")}.{date.year}.txt', 'w') as f: + for error in errors: + f.write(f"[{date.ctime()}][{error['type']}][{error['module']}][{error['id']}] {error['text']}\n") diff --git a/day4/task1/task1.py b/day4/task1/task1.py new file mode 100644 index 0000000..7b16685 --- /dev/null +++ b/day4/task1/task1.py @@ -0,0 +1,4 @@ +import re + +s = 'this =- is , bad ! text #$%^123%^' +print(re.sub(r'[^a-zA-Zа-яА-ЯёЁ]', ' ', s)) diff --git a/day5/task1/task1.py b/day5/task1/task1.py new file mode 100644 index 0000000..19aee5b --- /dev/null +++ b/day5/task1/task1.py @@ -0,0 +1,20 @@ +def ingredients(func): + def wrapper(*args, **kwargs): + _ingredients = ['хлеб', 'кетчуп', 'сыр'] + for ingredient in _ingredients: + print('---%s---' % ingredient) + + func(*args, **kwargs) + + for ingredient in _ingredients[::-1]: + print('---%s---' % ingredient) + + return wrapper + + +@ingredients +def main_ingredient(meat): + print('---%s---' % meat) + + +main_ingredient('ветчина') diff --git a/day5/task2/task2.py b/day5/task2/task2.py new file mode 100644 index 0000000..e54b4a3 --- /dev/null +++ b/day5/task2/task2.py @@ -0,0 +1,31 @@ +def bread(func): + def wrapper(*args, **kwargs): + print('---хлеб---') + + func(*args, **kwargs) + + print('---хлеб---') + + return wrapper + + +def ingredients(func): + def wrapper(*args, **kwargs): + for ingredient in ['кетчуп', 'сыр']: + print('---%s---' % ingredient) + + func(*args, **kwargs) + + for ingredient in ['кетчуп', 'сыр'][::-1]: + print('---%s---' % ingredient) + + return wrapper + + +@bread +@ingredients +def main_ingredient(meat): + print('---%s---' % meat) + + +main_ingredient('ветчина') diff --git a/day5/task3/task3.py b/day5/task3/task3.py new file mode 100644 index 0000000..d3006e5 --- /dev/null +++ b/day5/task3/task3.py @@ -0,0 +1,29 @@ +# Оригинал +""" +def decor(some_params): + def wrapper(pr_function_like_an_arg): + print(some_params) + return pr_function_like_an_arg + + return wrapper + + +@decor('some_params') +def pr_function(): + print(' hi! ') + + +print('---') + + +pr_function() +""" + + +def pr_function(): + print(' hi! ') + + +print('some_params') +print('---') +pr_function() diff --git a/day6/task1/task1.py b/day6/task1/task1.py new file mode 100644 index 0000000..af3afbf --- /dev/null +++ b/day6/task1/task1.py @@ -0,0 +1,5 @@ +try: + a = int(input()) + print(100 / a) +except: + print('ошибка ввода') diff --git a/day6/task2/task2.py b/day6/task2/task2.py new file mode 100644 index 0000000..a95feae --- /dev/null +++ b/day6/task2/task2.py @@ -0,0 +1,7 @@ +try: + a = input() + print(100 / int(a)) +except ValueError as e: + print(e) +except ZeroDivisionError as e: + print(e) diff --git a/day6/task3/task3.py b/day6/task3/task3.py new file mode 100644 index 0000000..5541d36 --- /dev/null +++ b/day6/task3/task3.py @@ -0,0 +1,35 @@ +def divide(a, b): + if a > b: + import hahaha + + # В задании указано, что строго меньше, + # поэтому не else, а elif a < b + elif a < b: + import sys + + # Проверяем остаток + div, mod = divmod(a, b) + if mod == 0: + return div + else: + raise ArithmeticError(f'{a / b}') + + +try: + a = int(input()) + b = int(input()) + result = divide(a, b) + +except ArithmeticError as e: + print(f'Результат деления с остатком: {e}') + +# В задании написано отлавливать в отдельных except, +# но язык позволяет использовать более разумный синтаксис +except (ValueError, ZeroDivisionError, ModuleNotFoundError) as e: + print(e) + +except: + print('Непредвиденная ошибка') + +else: + print(f'Поделили успешно, вот вам результат: {result}') |