summaryrefslogtreecommitdiff
path: root/day3
diff options
context:
space:
mode:
Diffstat (limited to 'day3')
-rw-r--r--day3/task1/README.md18
-rw-r--r--day3/task2/README.md98
-rw-r--r--day3/task3/task2.json17
-rw-r--r--day3/task3/task2.xml16
-rw-r--r--day3/task3/task2.yaml10
-rw-r--r--day3/task4/task4.py56
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")