diff options
Diffstat (limited to 'day3')
| -rw-r--r-- | day3/task1/README.md | 18 | ||||
| -rw-r--r-- | day3/task2/README.md | 98 | ||||
| -rw-r--r-- | day3/task3/task2.json | 17 | ||||
| -rw-r--r-- | day3/task3/task2.xml | 16 | ||||
| -rw-r--r-- | day3/task3/task2.yaml | 10 | ||||
| -rw-r--r-- | day3/task4/task4.py | 56 |
6 files changed, 215 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/task3/task2.json b/day3/task3/task2.json new file mode 100644 index 0000000..6ba9ee3 --- /dev/null +++ b/day3/task3/task2.json @@ -0,0 +1,17 @@ +[ + { + "name": "blini", + "ingredient" : { + "milk": 500, + "egs" : 2, + "flour" : 200, + "sugar" : 2 + } + }, + { + "name": "fried eggs", + "ingredient": { + "egs": 3 + } + } +]
\ No newline at end of file diff --git a/day3/task3/task2.xml b/day3/task3/task2.xml new file mode 100644 index 0000000..ba343a1 --- /dev/null +++ b/day3/task3/task2.xml @@ -0,0 +1,16 @@ +<?xml version="1.1" encoding="UTF-8"?> +<meals> + <meal name="blini"> + <ingridients> + <ingridient name="milk" amount="500"/> + <ingridient name="egs" amount="2"/> + <ingridient name="flour" amount="200"/> + <ingridient name="sugar" amount="2"/> + </ingridients> + </meal> + <meal name="fried eggs"> + <ingridients> + <ingridient name="egs" amount="3"/> + </ingridients> + </meal> +</meals>
\ No newline at end of file diff --git a/day3/task3/task2.yaml b/day3/task3/task2.yaml new file mode 100644 index 0000000..42c9c6b --- /dev/null +++ b/day3/task3/task2.yaml @@ -0,0 +1,10 @@ +- name: blini + ingridient: + milk: 500 + egs: 2 + flour: 200 + sugar: 2 + +- name: fried eggs + ingridient: + egs: 3
\ No newline at end of file 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") |