resort
This commit is contained in:
Binary file not shown.
@@ -1,114 +0,0 @@
|
||||
* {
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
body {
|
||||
margin: 0;
|
||||
/* отключить стандартные отступы браузера */
|
||||
font-family: Arial, sans-serif;
|
||||
line-height: 1.5;
|
||||
color: #1f2933;
|
||||
background: #f5f7fa;
|
||||
}
|
||||
|
||||
.container {
|
||||
max-width: 900px;
|
||||
margin: 0;
|
||||
/* внешний отступ */
|
||||
padding: 0 16px;
|
||||
/* внутренний отступ */
|
||||
}
|
||||
|
||||
header {
|
||||
background: #2b6a8a;
|
||||
color: #fff;
|
||||
padding: 16px 0;
|
||||
}
|
||||
|
||||
main {
|
||||
padding: 20px 0;
|
||||
}
|
||||
|
||||
section,
|
||||
.article-block {
|
||||
background: #fff;
|
||||
border: 1px solid #d6dee6;
|
||||
border-radius: 8px;
|
||||
padding: 14px;
|
||||
margin-bottom: 14px;
|
||||
}
|
||||
|
||||
h1,
|
||||
h2 {
|
||||
margin: 0 0 10px;
|
||||
}
|
||||
|
||||
.nav-list {
|
||||
list-style: none;
|
||||
/* убрать маркеры */
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
display: flex;
|
||||
/* флексбокс для горизонтального расположения */
|
||||
flex-wrap: wrap;
|
||||
|
||||
gap: 8px;
|
||||
/* расстояние между элементами */
|
||||
}
|
||||
|
||||
.nav-list a,
|
||||
a.inline-link {
|
||||
color: #0b5f8a;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.nav-list a:hover,
|
||||
a.inline-link:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
.city-image {
|
||||
width: 100%;
|
||||
max-width: 460px;
|
||||
display: block;
|
||||
margin: 10px 0;
|
||||
border: 1px solid #ccd6e0;
|
||||
}
|
||||
|
||||
table {
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
/* объединение границ таблицы */
|
||||
}
|
||||
|
||||
th,
|
||||
td {
|
||||
border: 1px solid #c9d3de;
|
||||
padding: 8px;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
th {
|
||||
background: #eaf1f7;
|
||||
}
|
||||
|
||||
.positive {
|
||||
color: #0d7a3a;
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
.negative {
|
||||
color: #b02a2a;
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
footer {
|
||||
padding: 12px 0 20px;
|
||||
}
|
||||
|
||||
@media (max-width: 640px) {
|
||||
.nav-list {
|
||||
flex-direction: column;
|
||||
/* вертикальное расположение */
|
||||
}
|
||||
}
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 3.3 MiB |
Binary file not shown.
|
Before Width: | Height: | Size: 3.1 MiB |
@@ -1,77 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="ru">
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Мурманск - главная</title>
|
||||
<link rel="stylesheet" href="css/style.css">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<header>
|
||||
<div class="container">
|
||||
<h1>Мурманск</h1>
|
||||
<p>Красивейший город за Полярным кругом</p>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main class="container">
|
||||
<section>
|
||||
<h2>Навигация</h2>
|
||||
<nav aria-label="Навигация по страницам">
|
||||
<!-- метка для скринридеров -->
|
||||
<ul class="nav-list">
|
||||
<!-- маркированный список -->
|
||||
<li><a href="index.html">Главная</a></li>
|
||||
<li><a href="pages/page1.html">История</a></li>
|
||||
<li><a href="pages/page2.html">Климат</a></li>
|
||||
<li><a href="pages/page3.html">Население</a></li>
|
||||
</ul>
|
||||
</nav>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2>Кратко о городе</h2>
|
||||
<p>Мурманск основан в 1916 году. Это крупнейший город мира за Полярным кругом и важный незамерзающий порт
|
||||
России.</p>
|
||||
<img class="city-image" src="img/murmansk.png" alt="Мурманск, порт и северный город">
|
||||
<img class="city-image" src="img/murmansk2.png" alt="Мурманск, монумент Защитникам Советского Заполярья">
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2>Основные сведения</h2>
|
||||
<table>
|
||||
<thead>
|
||||
<!-- заголовок таблицы -->
|
||||
<tr>
|
||||
<th>Параметр</th>
|
||||
<th>Значение</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>Год основания</td>
|
||||
<td>1916</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Регион</td>
|
||||
<td>Мурманская область</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Население (2025)</td>
|
||||
<td>264 339 человек</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</section>
|
||||
</main>
|
||||
|
||||
<footer>
|
||||
<div class="container">
|
||||
<p>Антипенко Д.А. С22-712</p>
|
||||
</div>
|
||||
</footer>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -1,47 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="ru">
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Мурманск - история</title>
|
||||
<link rel="stylesheet" href="../css/style.css">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<header>
|
||||
<div class="container">
|
||||
<h1>Мурманск: история</h1>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main class="container">
|
||||
<section>
|
||||
<h2>Навигация</h2>
|
||||
<nav aria-label="Навигация">
|
||||
<ul class="nav-list">
|
||||
<li><a href="../index.html">Главная</a></li>
|
||||
<li><a href="page1.html">История</a></li>
|
||||
<li><a href="page2.html">Климат</a></li>
|
||||
<li><a href="page3.html">Население</a></li>
|
||||
</ul>
|
||||
</nav>
|
||||
</section>
|
||||
|
||||
<section class="article-block">
|
||||
<h2>История города</h2>
|
||||
<p>Мурманск основан в 1916 году как порт Романов-на-Мурмане. В 1917 году получил современное название.</p>
|
||||
<p>Город быстро вырос благодаря незамерзающему порту. В годы Великой Отечественной войны Мурманск стал
|
||||
важным центром приема северных конвоев.</p>
|
||||
<img class="city-image" src="../img/murmansk.png" alt="Мурманск, морской порт">
|
||||
</section>
|
||||
</main>
|
||||
|
||||
<footer>
|
||||
<div class="container">
|
||||
<p><a class="inline-link" href="../index.html">Вернуться на главную</a></p>
|
||||
</div>
|
||||
</footer>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -1,116 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="ru">
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Мурманск - климат</title>
|
||||
<link rel="stylesheet" href="../css/style.css">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<header>
|
||||
<div class="container">
|
||||
<h1>Мурманск: климат</h1>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main class="container">
|
||||
<section>
|
||||
<h2>Навигация</h2>
|
||||
<nav aria-label="Навигация">
|
||||
<ul class="nav-list">
|
||||
<li><a href="../index.html">Главная</a></li>
|
||||
<li><a href="page1.html">История</a></li>
|
||||
<li><a href="page2.html">Климат</a></li>
|
||||
<li><a href="page3.html">Население</a></li>
|
||||
</ul>
|
||||
</nav>
|
||||
</section>
|
||||
|
||||
<section class="article-block">
|
||||
<h2>Климат города</h2>
|
||||
<p>Климат Мурманска субарктический морской: зима долгая, лето короткое и прохладное.</p>
|
||||
<img class="city-image" src="../img/murmansk2.png" alt="Мурманск, монумент Защитникам Советского Заполярья">
|
||||
<table>
|
||||
<caption>Климат Мурманска за последние 10 лет (2015-2024 гг)</caption>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Показатель</th>
|
||||
<th>Янв.</th>
|
||||
<th>Февр.</th>
|
||||
<th>Март</th>
|
||||
<th>Апр.</th>
|
||||
<th>Май</th>
|
||||
<th>Июнь</th>
|
||||
<th>Июль</th>
|
||||
<th>Авг.</th>
|
||||
<th>Сент.</th>
|
||||
<th>Окт.</th>
|
||||
<th>Нояб.</th>
|
||||
<th>Дек.</th>
|
||||
<th>Год</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>Макс., °C</td>
|
||||
<td>-8,3</td>
|
||||
<td>-6,2</td>
|
||||
<td>-1,4</td>
|
||||
<td>2,9</td>
|
||||
<td>9,3</td>
|
||||
<td>14,4</td>
|
||||
<td>18,4</td>
|
||||
<td>16,4</td>
|
||||
<td>11,7</td>
|
||||
<td>3,6</td>
|
||||
<td>-1,9</td>
|
||||
<td>-5,3</td>
|
||||
<td>4,5</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Средн., °C</td>
|
||||
<td>-10,2</td>
|
||||
<td>-8,1</td>
|
||||
<td>-4</td>
|
||||
<td>0,2</td>
|
||||
<td>5,9</td>
|
||||
<td>10,6</td>
|
||||
<td>14,5</td>
|
||||
<td>13,0</td>
|
||||
<td>9,0</td>
|
||||
<td>2,1</td>
|
||||
<td>-3,3</td>
|
||||
<td>-7</td>
|
||||
<td>1,9</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Мин., °C</td>
|
||||
<td>-12,1</td>
|
||||
<td>-10,1</td>
|
||||
<td>-6,7</td>
|
||||
<td>-2,5</td>
|
||||
<td>2,5</td>
|
||||
<td>6,8</td>
|
||||
<td>10,6</td>
|
||||
<td>9,6</td>
|
||||
<td>6,4</td>
|
||||
<td>0,7</td>
|
||||
<td>-4,6</td>
|
||||
<td>-8,6</td>
|
||||
<td>-0,7</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</section>
|
||||
</main>
|
||||
|
||||
<footer>
|
||||
<div class="container">
|
||||
<p><a class="inline-link" href="../index.html">Вернуться на главную</a></p>
|
||||
</div>
|
||||
</footer>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -1,151 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="ru">
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Мурманск - население</title>
|
||||
<link rel="stylesheet" href="../css/style.css">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<header>
|
||||
<div class="container">
|
||||
<h1>Мурманск: население</h1>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main class="container">
|
||||
<section>
|
||||
<h2>Навигация</h2>
|
||||
<nav aria-label="Навигация">
|
||||
<ul class="nav-list">
|
||||
<li><a href="../index.html">Главная</a></li>
|
||||
<li><a href="page1.html">История</a></li>
|
||||
<li><a href="page2.html">Климат</a></li>
|
||||
<li><a href="page3.html">Население</a></li>
|
||||
</ul>
|
||||
</nav>
|
||||
</section>
|
||||
|
||||
<section class="article-block">
|
||||
<h2>Динамика населения по актуальным данным</h2>
|
||||
<p>По данным из таблицы видно общее снижение численности населения с отдельными годами роста.</p>
|
||||
<table>
|
||||
<caption>Население Мурманска: 2006-2025</caption>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Год</th>
|
||||
<th>Количество жителей</th>
|
||||
<th>Изменение</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>2006</td>
|
||||
<td>321 000</td>
|
||||
<td>-</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>2007</td>
|
||||
<td>317 500</td>
|
||||
<td class="negative">уменьшилось</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>2008</td>
|
||||
<td>314 800</td>
|
||||
<td class="negative">уменьшилось</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>2009</td>
|
||||
<td>311 209</td>
|
||||
<td class="negative">уменьшилось</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>2010</td>
|
||||
<td>307 257</td>
|
||||
<td class="negative">уменьшилось</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>2011</td>
|
||||
<td>307 310</td>
|
||||
<td class="positive">выросло</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>2012</td>
|
||||
<td>305 034</td>
|
||||
<td class="negative">уменьшилось</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>2013</td>
|
||||
<td>302 468</td>
|
||||
<td class="negative">уменьшилось</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>2014</td>
|
||||
<td>299 148</td>
|
||||
<td class="negative">уменьшилось</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>2015</td>
|
||||
<td>305 236</td>
|
||||
<td class="positive">выросло</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>2016</td>
|
||||
<td>301 572</td>
|
||||
<td class="negative">уменьшилось</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>2017</td>
|
||||
<td>298 096</td>
|
||||
<td class="negative">уменьшилось</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>2018</td>
|
||||
<td>295 374</td>
|
||||
<td class="negative">уменьшилось</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>2019</td>
|
||||
<td>292 465</td>
|
||||
<td class="negative">уменьшилось</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>2020</td>
|
||||
<td>287 847</td>
|
||||
<td class="negative">уменьшилось</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>2021</td>
|
||||
<td>270 384</td>
|
||||
<td class="negative">уменьшилось</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>2023</td>
|
||||
<td>267 422</td>
|
||||
<td class="negative">уменьшилось</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>2024</td>
|
||||
<td>266 681</td>
|
||||
<td class="negative">уменьшилось</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>2025</td>
|
||||
<td>264 339</td>
|
||||
<td class="negative">уменьшилось</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</section>
|
||||
</main>
|
||||
|
||||
<footer>
|
||||
<div class="container">
|
||||
<p><a class="inline-link" href="../index.html">Вернуться на главную</a></p>
|
||||
</div>
|
||||
</footer>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -1,389 +0,0 @@
|
||||
@import url('https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,100..900;1,100..900&display=swap');
|
||||
|
||||
* {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
|
||||
|
||||
body {
|
||||
/* font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; */
|
||||
font-family: 'Roboto', 'Arimo', sans-serif;
|
||||
line-height: 1.6;
|
||||
color: #333;
|
||||
background-color: #f4f4f4;
|
||||
}
|
||||
|
||||
/* Навигация */
|
||||
.navbar {
|
||||
background-color: #2c3e50;
|
||||
color: white;
|
||||
padding: 1rem 2rem;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
position: sticky;
|
||||
top: 0;
|
||||
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
.logo {
|
||||
font-size: 1.5rem;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.nav-links {
|
||||
list-style: none;
|
||||
display: flex;
|
||||
gap: 2rem;
|
||||
}
|
||||
|
||||
.nav-links a {
|
||||
color: white;
|
||||
text-decoration: none;
|
||||
transition: color 0.3s;
|
||||
}
|
||||
|
||||
.nav-links a:hover {
|
||||
color: #3498db;
|
||||
}
|
||||
|
||||
/* Главная секция */
|
||||
.hero {
|
||||
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
||||
color: white;
|
||||
padding: 5rem 2rem;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.hero-content h1 {
|
||||
font-size: 3rem;
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
|
||||
.hero-content p {
|
||||
font-size: 1.2rem;
|
||||
margin-bottom: 2rem;
|
||||
}
|
||||
|
||||
/* Кнопки */
|
||||
.btn {
|
||||
padding: 0.75rem 1.5rem;
|
||||
border: none;
|
||||
border-radius: 5px;
|
||||
cursor: pointer;
|
||||
font-size: 1rem;
|
||||
transition: all 0.3s;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.btn-primary {
|
||||
background-color: #3498db;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.btn-primary:hover {
|
||||
background-color: #2980b9;
|
||||
transform: translateY(-2px);
|
||||
}
|
||||
|
||||
.btn-secondary {
|
||||
background-color: #95a5a6;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.btn-secondary:hover {
|
||||
background-color: #7f8c8d;
|
||||
}
|
||||
|
||||
.btn-success {
|
||||
background-color: #27ae60;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.btn-success:hover {
|
||||
background-color: #229954;
|
||||
}
|
||||
|
||||
/* О нас */
|
||||
.about {
|
||||
background-color: white;
|
||||
padding: 4rem 2rem;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.about h2 {
|
||||
font-size: 2.5rem;
|
||||
margin-bottom: 3rem;
|
||||
color: #2c3e50;
|
||||
}
|
||||
|
||||
.about-content {
|
||||
display: flex;
|
||||
gap: 2rem;
|
||||
justify-content: center;
|
||||
flex-wrap: wrap;
|
||||
max-width: 1200px;
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
.about-card {
|
||||
background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
|
||||
padding: 2rem;
|
||||
border-radius: 8px;
|
||||
flex: 0 1 300px;
|
||||
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
|
||||
transition: transform 0.3s;
|
||||
}
|
||||
|
||||
.about-card:hover {
|
||||
transform: translateY(-5px);
|
||||
}
|
||||
|
||||
.about-card h3 {
|
||||
font-size: 1.5rem;
|
||||
margin-bottom: 1rem;
|
||||
color: #2c3e50;
|
||||
}
|
||||
|
||||
/* Возможности */
|
||||
.features {
|
||||
background-color: #ecf0f1;
|
||||
padding: 4rem 2rem;
|
||||
}
|
||||
|
||||
.features h2 {
|
||||
font-size: 2.5rem;
|
||||
text-align: center;
|
||||
margin-bottom: 3rem;
|
||||
color: #2c3e50;
|
||||
}
|
||||
|
||||
.features h3 {
|
||||
font-size: 1.8rem;
|
||||
margin: 2rem 0 1rem 0;
|
||||
color: #2c3e50;
|
||||
}
|
||||
|
||||
/* Списки */
|
||||
.list-container {
|
||||
display: flex;
|
||||
gap: 2rem;
|
||||
margin-bottom: 2rem;
|
||||
justify-content: center;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
.list-column {
|
||||
background: white;
|
||||
padding: 1.5rem;
|
||||
border-radius: 5px;
|
||||
flex: 0 1 250px;
|
||||
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
.list-column h4 {
|
||||
margin-bottom: 1rem;
|
||||
color: #2c3e50;
|
||||
}
|
||||
|
||||
.list-column ul,
|
||||
.list-column ol {
|
||||
margin-left: 1.5rem;
|
||||
}
|
||||
|
||||
.list-column li {
|
||||
margin-bottom: 0.5rem;
|
||||
}
|
||||
|
||||
/* Таблица */
|
||||
.data-table {
|
||||
width: 100%;
|
||||
max-width: 600px;
|
||||
margin: 1.5rem auto;
|
||||
border-collapse: collapse;
|
||||
background: white;
|
||||
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
|
||||
border-radius: 5px;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.data-table thead {
|
||||
background-color: #3498db;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.data-table th,
|
||||
.data-table td {
|
||||
padding: 1rem;
|
||||
text-align: left;
|
||||
border-bottom: 1px solid #ddd;
|
||||
}
|
||||
|
||||
.data-table tbody tr:nth-child(even) {
|
||||
background-color: #f9f9f9;
|
||||
}
|
||||
|
||||
.data-table tbody tr:hover {
|
||||
background-color: #ecf0f1;
|
||||
}
|
||||
|
||||
/* Цветовая палитра */
|
||||
.color-palette {
|
||||
display: flex;
|
||||
gap: 1rem;
|
||||
justify-content: center;
|
||||
flex-wrap: wrap;
|
||||
margin: 2rem 0;
|
||||
}
|
||||
|
||||
.color-box {
|
||||
width: 100px;
|
||||
height: 100px;
|
||||
border-radius: 8px;
|
||||
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
|
||||
transition: transform 0.3s;
|
||||
}
|
||||
|
||||
.color-box:hover {
|
||||
transform: scale(1.1);
|
||||
}
|
||||
|
||||
.color-box.primary {
|
||||
background-color: #3498db;
|
||||
}
|
||||
|
||||
.color-box.secondary {
|
||||
background-color: #2c3e50;
|
||||
}
|
||||
|
||||
.color-box.success {
|
||||
background-color: #27ae60;
|
||||
}
|
||||
|
||||
.color-box.warning {
|
||||
background-color: #f39c12;
|
||||
}
|
||||
|
||||
.color-box.danger {
|
||||
background-color: #e74c3c;
|
||||
}
|
||||
|
||||
/* Форма */
|
||||
.contact {
|
||||
background-color: white;
|
||||
padding: 4rem 2rem;
|
||||
}
|
||||
|
||||
.contact h2 {
|
||||
font-size: 2.5rem;
|
||||
text-align: center;
|
||||
margin-bottom: 2rem;
|
||||
color: #2c3e50;
|
||||
}
|
||||
|
||||
.form {
|
||||
max-width: 500px;
|
||||
margin: 0 auto;
|
||||
background-color: #f9f9f9;
|
||||
padding: 2rem;
|
||||
border-radius: 8px;
|
||||
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
.form-group {
|
||||
margin-bottom: 1.5rem;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.form-group label {
|
||||
margin-bottom: 0.5rem;
|
||||
font-weight: bold;
|
||||
color: #2c3e50;
|
||||
}
|
||||
|
||||
.form-group input[type="text"],
|
||||
.form-group input[type="email"],
|
||||
.form-group textarea,
|
||||
.form-group select {
|
||||
padding: 0.75rem;
|
||||
border: 1px solid #ddd;
|
||||
border-radius: 5px;
|
||||
font-size: 1rem;
|
||||
font-family: inherit;
|
||||
transition: border-color 0.3s;
|
||||
}
|
||||
|
||||
.form-group input[type="text"]:focus,
|
||||
.form-group input[type="email"]:focus,
|
||||
.form-group textarea:focus,
|
||||
.form-group select:focus {
|
||||
outline: none;
|
||||
border-color: #3498db;
|
||||
box-shadow: 0 0 5px rgba(52, 152, 219, 0.3);
|
||||
}
|
||||
|
||||
.form-group.checkbox {
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
gap: 0.5rem;
|
||||
}
|
||||
|
||||
.form-group.checkbox input[type="checkbox"] {
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.form-group.checkbox label {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
.form .btn {
|
||||
margin-right: 1rem;
|
||||
}
|
||||
|
||||
/* Подвал */
|
||||
.footer {
|
||||
background-color: #2c3e50;
|
||||
color: white;
|
||||
text-align: center;
|
||||
padding: 2rem;
|
||||
}
|
||||
|
||||
/* Адаптивность */
|
||||
@media (max-width: 768px) {
|
||||
.navbar {
|
||||
flex-direction: column;
|
||||
gap: 1rem;
|
||||
}
|
||||
|
||||
.nav-links {
|
||||
flex-direction: column;
|
||||
gap: 1rem;
|
||||
}
|
||||
|
||||
.hero-content h1 {
|
||||
font-size: 2rem;
|
||||
}
|
||||
|
||||
.about-content {
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.list-container {
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.color-palette {
|
||||
gap: 0.5rem;
|
||||
}
|
||||
|
||||
.color-box {
|
||||
width: 80px;
|
||||
height: 80px;
|
||||
}
|
||||
}
|
||||
@@ -1,166 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="ru">
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Демонстрация HTML и CSS</title>
|
||||
<link rel="stylesheet" href="css/main.css">
|
||||
<style>
|
||||
@import url('https://fonts.googleapis.com/css2?family=Arimo:ital,wght@0,400..700;1,400..700&display=swap');
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<!-- Навигация -->
|
||||
<nav class="navbar">
|
||||
<h1 class="logo">MyWebsite</h1>
|
||||
<ul class="nav-links">
|
||||
<li><a href="#home">Главная</a></li>
|
||||
<li><a href="#about">О нас</a></li>
|
||||
<li><a href="#features">Возможности</a></li>
|
||||
<li><a href="#contact">Контакт</a></li>
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
<!-- Главная секция -->
|
||||
<section id="home" class="hero">
|
||||
<div class="hero-content">
|
||||
<h1>Добро пожаловать!</h1>
|
||||
<p>Это демонстрация различных HTML элементов и CSS свойств</p>
|
||||
<button class="btn btn-primary">Узнать больше</button>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- О нас -->
|
||||
<section id="about" class="about">
|
||||
<h2>О сайте</h2>
|
||||
<div class="about-content">
|
||||
<div class="about-card">
|
||||
<h3>📝 Текст</h3>
|
||||
<p>Это обычный параграф демонстрирует стиль текста с использованием CSS свойств как color, font-size и
|
||||
line-height.</p>
|
||||
</div>
|
||||
<div class="about-card">
|
||||
<h3>🎨 Дизайн</h3>
|
||||
<p>Рассказывает о использовании цветов, отступов, границ и других стилей для создания интересного
|
||||
визуального оформления.</p>
|
||||
</div>
|
||||
<div class="about-card">
|
||||
<h3>📦 Макет</h3>
|
||||
<p>Демонстрирует Flexbox layout для создания гибкого и адаптивного дизайна страницы на различных
|
||||
экранах.</p>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Возможности -->
|
||||
<section id="features" class="features">
|
||||
<h2>Возможности</h2>
|
||||
|
||||
<h3>Типы списков</h3>
|
||||
<div class="list-container">
|
||||
<div class="list-column">
|
||||
<h4>Неупорядоченный список:</h4>
|
||||
<ul>
|
||||
<li>Первый элемент</li>
|
||||
<li>Второй элемент</li>
|
||||
<li>Третий элемент</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="list-column">
|
||||
<h4>Упорядоченный список:</h4>
|
||||
<ol>
|
||||
<li>Шаг первый</li>
|
||||
<li>Шаг второй</li>
|
||||
<li>Шаг третий</li>
|
||||
</ol>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Таблица -->
|
||||
<h3>Таблица данных</h3>
|
||||
<table class="data-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Имя</th>
|
||||
<th>Возраст</th>
|
||||
<th>Город</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>Иван</td>
|
||||
<td>25</td>
|
||||
<td>Москва</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Мария</td>
|
||||
<td>30</td>
|
||||
<td>Санкт-Петербург</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Петр</td>
|
||||
<td>28</td>
|
||||
<td>Казань</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<!-- Цветовая палитра -->
|
||||
<h3>Цветовая палитра</h3>
|
||||
<div class="color-palette">
|
||||
<div class="color-box primary"></div>
|
||||
<div class="color-box secondary"></div>
|
||||
<div class="color-box success"></div>
|
||||
<div class="color-box warning"></div>
|
||||
<div class="color-box danger"></div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Форма -->
|
||||
<section id="contact" class="contact">
|
||||
<h2>Контактная форма</h2>
|
||||
<form class="form">
|
||||
<div class="form-group">
|
||||
<label for="name">Имя:</label>
|
||||
<input type="text" id="name" name="name" placeholder="Введите ваше имя" required>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="email">Email:</label>
|
||||
<input type="email" id="email" name="email" placeholder="Введите вашу почту" required>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="message">Сообщение:</label>
|
||||
<textarea id="message" name="message" rows="5" placeholder="Напишите ваше сообщение"></textarea>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="country">Страна:</label>
|
||||
<select id="country" name="country">
|
||||
<option>Россия</option>
|
||||
<option>Беларусь</option>
|
||||
<option>Казахстан</option>
|
||||
<option>Украина</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="form-group checkbox">
|
||||
<input type="checkbox" id="agree" name="agree">
|
||||
<label for="agree">Я согласен с условиями</label>
|
||||
</div>
|
||||
|
||||
<button type="submit" class="btn btn-success">Отправить</button>
|
||||
<button type="reset" class="btn btn-secondary">Очистить</button>
|
||||
</form>
|
||||
</section>
|
||||
|
||||
<!-- Подвал -->
|
||||
<footer class="footer">
|
||||
<p>© 2026 MyWebsite. Все права защищены.</p>
|
||||
</footer>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -1 +0,0 @@
|
||||
3.12
|
||||
@@ -1,22 +0,0 @@
|
||||
#!/usr/bin/env python
|
||||
"""Django's command-line utility for administrative tasks."""
|
||||
import os
|
||||
import sys
|
||||
|
||||
|
||||
def main():
|
||||
"""Run administrative tasks."""
|
||||
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mephi_app.settings')
|
||||
try:
|
||||
from django.core.management import execute_from_command_line
|
||||
except ImportError as exc:
|
||||
raise ImportError(
|
||||
"Couldn't import Django. Are you sure it's installed and "
|
||||
"available on your PYTHONPATH environment variable? Did you "
|
||||
"forget to activate a virtual environment?"
|
||||
) from exc
|
||||
execute_from_command_line(sys.argv)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
@@ -1,16 +0,0 @@
|
||||
"""
|
||||
ASGI config for mephi_app project.
|
||||
|
||||
It exposes the ASGI callable as a module-level variable named ``application``.
|
||||
|
||||
For more information on this file, see
|
||||
https://docs.djangoproject.com/en/6.0/howto/deployment/asgi/
|
||||
"""
|
||||
|
||||
import os
|
||||
|
||||
from django.core.asgi import get_asgi_application
|
||||
|
||||
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mephi_app.settings')
|
||||
|
||||
application = get_asgi_application()
|
||||
@@ -1,107 +0,0 @@
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
# Build paths inside the project like this: BASE_DIR / 'subdir'.
|
||||
BASE_DIR = Path(__file__).resolve().parent.parent
|
||||
|
||||
|
||||
# Quick-start development settings - unsuitable for production
|
||||
# See https://docs.djangoproject.com/en/6.0/howto/deployment/checklist/
|
||||
|
||||
# SECURITY WARNING: keep the secret key used in production secret!
|
||||
SECRET_KEY = 'django-insecure-#pk6j+5iy8gxi!4o2ll&aci==cbj4e)kxx7f%7u8!#s^o2qb61'
|
||||
|
||||
# SECURITY WARNING: don't run with debug turned on in production!
|
||||
DEBUG = True
|
||||
|
||||
ALLOWED_HOSTS = []
|
||||
|
||||
|
||||
# Application definition
|
||||
|
||||
INSTALLED_APPS = [
|
||||
'django.contrib.admin',
|
||||
'django.contrib.auth',
|
||||
'django.contrib.contenttypes',
|
||||
'django.contrib.sessions',
|
||||
'django.contrib.messages',
|
||||
'django.contrib.staticfiles',
|
||||
'polls.apps.PollsConfig',
|
||||
]
|
||||
|
||||
MIDDLEWARE = [
|
||||
'django.middleware.security.SecurityMiddleware',
|
||||
'django.contrib.sessions.middleware.SessionMiddleware',
|
||||
'django.middleware.common.CommonMiddleware',
|
||||
'django.middleware.csrf.CsrfViewMiddleware',
|
||||
'django.contrib.auth.middleware.AuthenticationMiddleware',
|
||||
'django.contrib.messages.middleware.MessageMiddleware',
|
||||
'django.middleware.clickjacking.XFrameOptionsMiddleware',
|
||||
]
|
||||
|
||||
ROOT_URLCONF = 'mephi_app.urls'
|
||||
|
||||
TEMPLATES = [
|
||||
{
|
||||
'BACKEND': 'django.template.backends.django.DjangoTemplates',
|
||||
'DIRS': [],
|
||||
'APP_DIRS': True,
|
||||
'OPTIONS': {
|
||||
'context_processors': [
|
||||
'django.template.context_processors.request',
|
||||
'django.contrib.auth.context_processors.auth',
|
||||
'django.contrib.messages.context_processors.messages',
|
||||
],
|
||||
},
|
||||
},
|
||||
]
|
||||
|
||||
WSGI_APPLICATION = 'mephi_app.wsgi.application'
|
||||
|
||||
|
||||
# Database
|
||||
# https://docs.djangoproject.com/en/6.0/ref/settings/#databases
|
||||
|
||||
DATABASES = {
|
||||
'default': {
|
||||
'ENGINE': 'django.db.backends.sqlite3',
|
||||
'NAME': BASE_DIR / 'db.sqlite3',
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
# Password validation
|
||||
# https://docs.djangoproject.com/en/6.0/ref/settings/#auth-password-validators
|
||||
|
||||
AUTH_PASSWORD_VALIDATORS = [
|
||||
{
|
||||
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
|
||||
},
|
||||
{
|
||||
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
|
||||
},
|
||||
{
|
||||
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
|
||||
},
|
||||
{
|
||||
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
|
||||
},
|
||||
]
|
||||
|
||||
|
||||
# Internationalization
|
||||
# https://docs.djangoproject.com/en/6.0/topics/i18n/
|
||||
|
||||
LANGUAGE_CODE = 'ru-ru'
|
||||
|
||||
TIME_ZONE = 'UTC'
|
||||
|
||||
USE_I18N = True
|
||||
|
||||
USE_TZ = True
|
||||
|
||||
|
||||
# Static files (CSS, JavaScript, Images)
|
||||
# https://docs.djangoproject.com/en/6.0/howto/static-files/
|
||||
|
||||
STATIC_URL = 'static/'
|
||||
@@ -1,22 +0,0 @@
|
||||
"""
|
||||
URL configuration for mephi_app project.
|
||||
|
||||
The `urlpatterns` list routes URLs to views. For more information please see:
|
||||
https://docs.djangoproject.com/en/6.0/topics/http/urls/
|
||||
Examples:
|
||||
Function views
|
||||
1. Add an import: from my_app import views
|
||||
2. Add a URL to urlpatterns: path('', views.home, name='home')
|
||||
Class-based views
|
||||
1. Add an import: from other_app.views import Home
|
||||
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
|
||||
Including another URLconf
|
||||
1. Import the include() function: from django.urls import include, path
|
||||
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
|
||||
"""
|
||||
from django.contrib import admin
|
||||
from django.urls import path
|
||||
|
||||
urlpatterns = [
|
||||
path('admin/', admin.site.urls),
|
||||
]
|
||||
@@ -1,7 +0,0 @@
|
||||
import os
|
||||
|
||||
from django.core.wsgi import get_wsgi_application
|
||||
|
||||
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mephi_app.settings')
|
||||
|
||||
application = get_wsgi_application()
|
||||
@@ -1,20 +0,0 @@
|
||||
from django.contrib import admin
|
||||
|
||||
class ChoiceInline(admin.TabularInline):
|
||||
model = Choice
|
||||
extra = 2
|
||||
|
||||
admin.site.register(Choice)
|
||||
# Register your models here.
|
||||
class QuestionAdmin(admin.ModelAdmin):
|
||||
list_display = ('question_text', 'pub_date')
|
||||
list_display_links = ('question_text', 'pub_date')
|
||||
search_fields = ('question_text',)
|
||||
|
||||
admin.site.register(Question, QuestionAdmin)
|
||||
|
||||
class ChoiceAdmin(admin.ModelAdmin):
|
||||
list_display = ('choice_text', 'question', 'votes')
|
||||
list_display_links = ('choice_text', 'question')
|
||||
search_fields = ('choice_text',)
|
||||
admin.site.register(Choice, ChoiceAdmin)
|
||||
@@ -1,5 +0,0 @@
|
||||
from django.apps import AppConfig
|
||||
|
||||
|
||||
class PollsConfig(AppConfig):
|
||||
name = 'polls'
|
||||
@@ -1,22 +0,0 @@
|
||||
# Generated by Django 6.0.4 on 2026-04-08 10:39
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
initial = True
|
||||
|
||||
dependencies = [
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='Question',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('question_text', models.CharField(max_length=200, verbose_name='Вопрос')),
|
||||
('pub_date', models.DateTimeField(verbose_name='Дата публикации')),
|
||||
],
|
||||
),
|
||||
]
|
||||
@@ -1,23 +0,0 @@
|
||||
# Generated by Django 6.0.4 on 2026-04-08 10:43
|
||||
|
||||
import django.db.models.deletion
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('polls', '0001_initial'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='Choice',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('choice_text', models.CharField(max_length=200, verbose_name='Ответ')),
|
||||
('votes', models.IntegerField(default=0, verbose_name='Количество голосов')),
|
||||
('question', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='polls.question')),
|
||||
],
|
||||
),
|
||||
]
|
||||
@@ -1,12 +0,0 @@
|
||||
from django.db import models
|
||||
|
||||
# Create your models here.
|
||||
class Question(models.Model):
|
||||
question_text = models.CharField(verbose_name='Вопрос', max_length=200)
|
||||
pub_date = models.DateTimeField(verbose_name='Дата публикации')
|
||||
|
||||
class Choice(models.Model):
|
||||
question = models.ForeignKey(Question, on_delete=models.CASCADE)
|
||||
choice_text = models.CharField(verbose_name='Ответ', max_length=200)
|
||||
votes = models.IntegerField(verbose_name='Количество голосов', default=0)
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
from django.test import TestCase
|
||||
|
||||
# Create your tests here.
|
||||
@@ -1,8 +0,0 @@
|
||||
from djano.urls import path
|
||||
|
||||
urlpatterns = [
|
||||
# path('', views.index, name='index'),
|
||||
# path('<int:question_id>/', views.detail, name='detail'),
|
||||
# path('<int:question_id>/results/', views.results, name='results'),
|
||||
# path('<int:question_id>/vote/', views.vote, name='vote'),
|
||||
]
|
||||
@@ -1,3 +0,0 @@
|
||||
from django.shortcuts import render
|
||||
|
||||
# Create your views here.
|
||||
@@ -1,9 +0,0 @@
|
||||
[project]
|
||||
name = "web-django"
|
||||
version = "0.1.0"
|
||||
description = "Add your description here"
|
||||
readme = "README.md"
|
||||
requires-python = ">=3.12"
|
||||
dependencies = [
|
||||
"django>=6.0.4",
|
||||
]
|
||||
Generated
-55
@@ -1,55 +0,0 @@
|
||||
version = 1
|
||||
revision = 3
|
||||
requires-python = ">=3.12"
|
||||
|
||||
[[package]]
|
||||
name = "asgiref"
|
||||
version = "3.11.1"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/63/40/f03da1264ae8f7cfdbf9146542e5e7e8100a4c66ab48e791df9a03d3f6c0/asgiref-3.11.1.tar.gz", hash = "sha256:5f184dc43b7e763efe848065441eac62229c9f7b0475f41f80e207a114eda4ce", size = 38550, upload-time = "2026-02-03T13:30:14.33Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/5c/0a/a72d10ed65068e115044937873362e6e32fab1b7dce0046aeb224682c989/asgiref-3.11.1-py3-none-any.whl", hash = "sha256:e8667a091e69529631969fd45dc268fa79b99c92c5fcdda727757e52146ec133", size = 24345, upload-time = "2026-02-03T13:30:13.039Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "django"
|
||||
version = "6.0.4"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
dependencies = [
|
||||
{ name = "asgiref" },
|
||||
{ name = "sqlparse" },
|
||||
{ name = "tzdata", marker = "sys_platform == 'win32'" },
|
||||
]
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/60/b9/4155091ad1788b38563bd77a7258c0834e8c12a7f56f6975deaf54f8b61d/django-6.0.4.tar.gz", hash = "sha256:8cfa2572b3f2768b2e84983cf3c4811877a01edb64e817986ec5d60751c113ac", size = 10907407, upload-time = "2026-04-07T13:55:44.961Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/e9/47/3d61d611609764aa71a37f7037b870e7bfb22937366974c4fd46cada7bab/django-6.0.4-py3-none-any.whl", hash = "sha256:14359c809fc16e8f81fd2b59d7d348e4d2d799da6840b10522b6edf7b8afc1da", size = 8368342, upload-time = "2026-04-07T13:55:37.999Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "sqlparse"
|
||||
version = "0.5.5"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/90/76/437d71068094df0726366574cf3432a4ed754217b436eb7429415cf2d480/sqlparse-0.5.5.tar.gz", hash = "sha256:e20d4a9b0b8585fdf63b10d30066c7c94c5d7a7ec47c889a2d83a3caa93ff28e", size = 120815, upload-time = "2025-12-19T07:17:45.073Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/49/4b/359f28a903c13438ef59ebeee215fb25da53066db67b305c125f1c6d2a25/sqlparse-0.5.5-py3-none-any.whl", hash = "sha256:12a08b3bf3eec877c519589833aed092e2444e68240a3577e8e26148acc7b1ba", size = 46138, upload-time = "2025-12-19T07:17:46.573Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tzdata"
|
||||
version = "2026.1"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/19/f5/cd531b2d15a671a40c0f66cf06bc3570a12cd56eef98960068ebbad1bf5a/tzdata-2026.1.tar.gz", hash = "sha256:67658a1903c75917309e753fdc349ac0efd8c27db7a0cb406a25be4840f87f98", size = 197639, upload-time = "2026-04-03T11:25:22.002Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/b0/70/d460bd685a170790ec89317e9bd33047988e4bce507b831f5db771e142de/tzdata-2026.1-py2.py3-none-any.whl", hash = "sha256:4b1d2be7ac37ceafd7327b961aa3a54e467efbdb563a23655fbfe0d39cfc42a9", size = 348952, upload-time = "2026-04-03T11:25:20.313Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "web-django"
|
||||
version = "0.1.0"
|
||||
source = { virtual = "." }
|
||||
dependencies = [
|
||||
{ name = "django" },
|
||||
]
|
||||
|
||||
[package.metadata]
|
||||
requires-dist = [{ name = "django", specifier = ">=6.0.4" }]
|
||||
@@ -1,277 +0,0 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "5ffc18fc",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# Генераторы массивов"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "17f0549b",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]\n",
|
||||
"{0, 1, 2}\n",
|
||||
"(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19)\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"\n",
|
||||
"n = 20\n",
|
||||
"a = [i for i in range(n)]\n",
|
||||
"b = {i%3 for i in range(n)}\n",
|
||||
"c = tuple(i for i in range(n))\n",
|
||||
"print(a)\n",
|
||||
"print(b)\n",
|
||||
"print(c)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "f64d6b65",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"[62, 64, 58, 6, 28, 8, 3, 4, 8, 2, 94, 65, 4, 23, 26, 38, 67, 4, 72, 82]\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"# Модуль random\n",
|
||||
"import random as rd\n",
|
||||
"a = [rd.randint(0, 100) for i in range(n)]\n",
|
||||
"print(a)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 3,
|
||||
"id": "a03afa9b",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81, 10: 100, 11: 121, 12: 144, 13: 169, 14: 196, 15: 225, 16: 256, 17: 289, 18: 324, 19: 361}\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"# Генерация словаря\n",
|
||||
"d = {i: i**2 for i in range(n)}\n",
|
||||
"print(d)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "1523bfb5",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# Сортировка"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "0e5b7a6e",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"[-98, -96, -92, -60, -49, -42, -32, -18, -10, -10, 42, 53, 55, 64, 73, 75, 78, 81, 81, 98]\n",
|
||||
"[98, 81, 81, 78, 75, 73, 64, 55, 53, 42, -10, -10, -18, -32, -42, -49, -60, -92, -96, -98]\n",
|
||||
"[-10, -10, -18, -32, 42, -42, -49, 53, 55, -60, 64, 73, 75, 78, 81, 81, -92, -96, -98, 98]\n",
|
||||
"[-98, -96, -92, -60, -49, -42, -32, -18, -10, -10, 42, 53, 55, 64, 73, 75, 78, 81, 81, 98]\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"# sort и sorted\n",
|
||||
"\n",
|
||||
"a = [rd.randint(-100, 100) for i in range(n)]\n",
|
||||
"\n",
|
||||
"b = sorted(a) # Возвращает новый отсортированный список\n",
|
||||
"print(b)\n",
|
||||
"\n",
|
||||
"c = sorted(a, reverse=True) # Сортирует в обратном порядке\n",
|
||||
"print(c)\n",
|
||||
"\n",
|
||||
"e = sorted(a, key=lambda x: abs(x)) # Сортирует по ключу, в данном случае по абсолютному значению\n",
|
||||
"print(e)\n",
|
||||
"\n",
|
||||
"a.sort() # Сортирует список на месте, ничего не возвращает\n",
|
||||
"print(a)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "9b186915",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"[-98, -96, -92, -60, -42, -32, -18, -10, -10, 42, 64, 78, 98]\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"# метод filter\n",
|
||||
"\n",
|
||||
"f = filter(lambda x: x % 2 == 0, a) # Фильтрует элементы, оставляя только четные\n",
|
||||
"print(list(f))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "8966f584",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# Операции со строками"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 25,
|
||||
"id": "886e6200",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"['fefef', '', '', '', '', 'egege', 'wpdwpfwof', '', '', '', 'eijoifwmfkwmfl', '', '', '', 'dwpdwpekwp']\n",
|
||||
"['fefef', 'egege', 'wpdwpfwof', 'eijoifwmfkwmfl', 'dwpdwpekwp']\n",
|
||||
"['Fefef', 'Egege', 'Wpdwpfwof', 'Eijoifwmfkwmfl', 'Dwpdwpekwp']\n",
|
||||
"Fefef Egege Wpdwpfwof Eijoifwmfkwmfl Dwpdwpekwp\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"s = \"fefef egege wpdwpfwof eijoifwmfkwmfl dwpdwpekwp\"\n",
|
||||
"s1 = s.split(' ') # Разделяет строку по пробелам и преовращает в список слов\n",
|
||||
"print(s1)\n",
|
||||
"\n",
|
||||
"s2 = list(filter(lambda x: x, s1))\n",
|
||||
"print(s2)\n",
|
||||
"\n",
|
||||
"s3 = [x.capitalize() for x in s2] # Преобразует каждое слово в строку с заглавной первой буквой\n",
|
||||
"print(s3)\n",
|
||||
"\n",
|
||||
"s4 = ' '.join(s3) # Соединяет элементы списка в строку, используя ' ' в качестве разделителя\n",
|
||||
"print(s4)\n",
|
||||
"# print(' '.join(['a', 'b', 'c'])) # Соединяет элементы списка в строку, используя пробел в качестве разделителя"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 26,
|
||||
"id": "41ab72cf",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Hello, World!\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"st = ' Hello, World! '\n",
|
||||
"print(st.strip()) # Удаляет пробелы в начале и конце строки"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "7ff78577",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# Распаковка и запаковка"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 34,
|
||||
"id": "d39d6026",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"3.0\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"def average(*nums):\n",
|
||||
" return sum(nums) / len(nums) if nums else None\n",
|
||||
"\n",
|
||||
"print(average(1, 2, 3, 4, 5)) # Вывод: 3.0"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "e3997fbd",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"<a href=\"https://ada-dev.ru\" target=\"_blank\"></a>\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"# Функция, которая принимает первым аргументом тег, а затем именованные параметры, и возвращает строку в виде HTML-тега с этими параметрами\n",
|
||||
"def create_html(tag, **attributes):\n",
|
||||
" attr_str = ' '.join(f'{key}=\"{value}\"' for key, value in attributes.items())\n",
|
||||
" return f'<{tag} {attr_str}></{tag}>'\n",
|
||||
"\n",
|
||||
"print(create_html('a', href='https://ada-dev.ru', target='_blank'))"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"kernelspec": {
|
||||
"display_name": ".venv",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.14.3"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 5
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
# print('Test')
|
||||
|
||||
# Генераторы массивов
|
||||
@@ -1,13 +0,0 @@
|
||||
.git
|
||||
.venv
|
||||
__pycache__
|
||||
**/__pycache__
|
||||
*.pyc
|
||||
*.pyo
|
||||
*.pyd
|
||||
.pytest_cache
|
||||
.mypy_cache
|
||||
.ipynb_checkpoints
|
||||
LR2/
|
||||
LR1/
|
||||
data/montcoalert/
|
||||
@@ -1,5 +0,0 @@
|
||||
# Local datasets and databases
|
||||
/data/montcoalert/
|
||||
*.db
|
||||
*.sqlite
|
||||
*.sqlite3
|
||||
@@ -1 +0,0 @@
|
||||
3.12
|
||||
@@ -1,15 +0,0 @@
|
||||
FROM python:3.12-slim
|
||||
|
||||
ENV PYTHONDONTWRITEBYTECODE=1 \
|
||||
PYTHONUNBUFFERED=1
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
RUN pip install --no-cache-dir "flask>=3.1.2"
|
||||
|
||||
COPY LR3 /app/LR3
|
||||
COPY data /app/data
|
||||
|
||||
EXPOSE 5000
|
||||
|
||||
CMD ["flask", "--app", "LR3/irfm_lr3.py", "run", "--host=0.0.0.0", "--port=5000"]
|
||||
@@ -1 +0,0 @@
|
||||
3.12
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,299 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
|
||||
<xsl:output method="html" encoding="UTF-8" indent="yes"/>
|
||||
|
||||
<xsl:key name="k-level" match="object/level" use="."/>
|
||||
<xsl:key name="k-level-id" match="object/level-id" use="."/>
|
||||
<xsl:key name="k-generation" match="object/generation" use="."/>
|
||||
<xsl:key name="k-generation-id" match="object/generation-id" use="."/>
|
||||
<xsl:key name="k-type" match="object/type" use="."/>
|
||||
<xsl:key name="k-type-id" match="object/type-id" use="."/>
|
||||
|
||||
<xsl:template name="show-not-null">
|
||||
<xsl:param name="empty-count"/>
|
||||
<xsl:if test="$empty-count = 0">
|
||||
<div>Нужен: NOT NULL</div>
|
||||
</xsl:if>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template name="sql-not-null">
|
||||
<xsl:param name="empty-count"/>
|
||||
<xsl:if test="$empty-count = 0">
|
||||
<xsl:text> NOT NULL</xsl:text>
|
||||
</xsl:if>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template name="sql-check-text">
|
||||
<xsl:param name="field-name"/>
|
||||
<xsl:param name="items"/>
|
||||
<xsl:param name="count"/>
|
||||
<xsl:if test="$count >= 2 and $count <= 5">
|
||||
<xsl:text> CHECK (</xsl:text>
|
||||
<xsl:value-of select="$field-name"/>
|
||||
<xsl:text> IN (</xsl:text>
|
||||
<xsl:for-each select="$items">
|
||||
<xsl:text>'</xsl:text>
|
||||
<xsl:value-of select="."/>
|
||||
<xsl:text>'</xsl:text>
|
||||
<xsl:if test="position() != last()">
|
||||
<xsl:text>, </xsl:text>
|
||||
</xsl:if>
|
||||
</xsl:for-each>
|
||||
<xsl:text>))</xsl:text>
|
||||
</xsl:if>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template name="sql-check-int">
|
||||
<xsl:param name="field-name"/>
|
||||
<xsl:param name="items"/>
|
||||
<xsl:param name="count"/>
|
||||
<xsl:if test="$count >= 2 and $count <= 5">
|
||||
<xsl:text> CHECK (</xsl:text>
|
||||
<xsl:value-of select="$field-name"/>
|
||||
<xsl:text> IN (</xsl:text>
|
||||
<xsl:for-each select="$items">
|
||||
<xsl:value-of select="normalize-space(.)"/>
|
||||
<xsl:if test="position() != last()">
|
||||
<xsl:text>, </xsl:text>
|
||||
</xsl:if>
|
||||
</xsl:for-each>
|
||||
<xsl:text>))</xsl:text>
|
||||
</xsl:if>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template name="field-id">
|
||||
<xsl:variable name="empty-count" select="count(objects/object/id[not(normalize-space())])"/>
|
||||
<div class="block">
|
||||
<div class="field-title">Анализ поля id</div>
|
||||
<div>Тип данных: integer</div>
|
||||
<div>Число пустых: <xsl:value-of select="$empty-count"/></div>
|
||||
<xsl:call-template name="show-not-null"><xsl:with-param name="empty-count" select="$empty-count"/></xsl:call-template>
|
||||
</div>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template name="field-name">
|
||||
<xsl:variable name="empty-count" select="count(objects/object/name[not(normalize-space())])"/>
|
||||
<div class="block">
|
||||
<div class="field-title">Анализ поля name</div>
|
||||
<div>Тип данных: Текст</div>
|
||||
<div>Самый длинный элемент:
|
||||
<xsl:for-each select="objects/object/name">
|
||||
<xsl:sort select="string-length(.)" data-type="number" order="descending"/>
|
||||
<xsl:if test="position() = 1"><xsl:value-of select="."/><xsl:text> , длина: </xsl:text><xsl:value-of select="string-length(.)"/></xsl:if>
|
||||
</xsl:for-each>
|
||||
</div>
|
||||
<div>Число пустых: <xsl:value-of select="$empty-count"/></div>
|
||||
<xsl:call-template name="show-not-null"><xsl:with-param name="empty-count" select="$empty-count"/></xsl:call-template>
|
||||
</div>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template name="field-code">
|
||||
<xsl:variable name="empty-count" select="count(objects/object/code[not(normalize-space())])"/>
|
||||
<div class="block">
|
||||
<div class="field-title">Анализ поля code</div>
|
||||
<div>Тип данных: Текст</div>
|
||||
<div>Самый длинный элемент:
|
||||
<xsl:for-each select="objects/object/code">
|
||||
<xsl:sort select="string-length(.)" data-type="number" order="descending"/>
|
||||
<xsl:if test="position() = 1"><xsl:value-of select="."/><xsl:text> , длина: </xsl:text><xsl:value-of select="string-length(.)"/></xsl:if>
|
||||
</xsl:for-each>
|
||||
</div>
|
||||
<div>Число пустых: <xsl:value-of select="$empty-count"/></div>
|
||||
<xsl:call-template name="show-not-null"><xsl:with-param name="empty-count" select="$empty-count"/></xsl:call-template>
|
||||
</div>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template name="field-level">
|
||||
<xsl:variable name="empty-count" select="count(objects/object/level[not(normalize-space())])"/>
|
||||
<div class="block">
|
||||
<div class="field-title">Анализ поля level</div>
|
||||
<div>Тип данных: Текст</div>
|
||||
<div>Самый длинный элемент:
|
||||
<xsl:for-each select="objects/object/level">
|
||||
<xsl:sort select="string-length(.)" data-type="number" order="descending"/>
|
||||
<xsl:if test="position() = 1"><xsl:value-of select="."/><xsl:text> , длина: </xsl:text><xsl:value-of select="string-length(.)"/></xsl:if>
|
||||
</xsl:for-each>
|
||||
</div>
|
||||
<div>Число пустых: <xsl:value-of select="$empty-count"/></div>
|
||||
<xsl:call-template name="show-not-null"><xsl:with-param name="empty-count" select="$empty-count"/></xsl:call-template>
|
||||
<div>Нужен: CHECK (level IN(
|
||||
<xsl:for-each select="objects/object/level[generate-id() = generate-id(key('k-level', .)[1])]">
|
||||
<xsl:text> '</xsl:text><xsl:value-of select="."/><xsl:text>' </xsl:text>
|
||||
<xsl:if test="position() != last()"><xsl:text>, </xsl:text></xsl:if>
|
||||
</xsl:for-each>
|
||||
))</div>
|
||||
</div>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template name="field-level-id">
|
||||
<xsl:variable name="empty-count" select="count(objects/object/level-id[not(normalize-space())])"/>
|
||||
<div class="block">
|
||||
<div class="field-title">Анализ поля level-id</div>
|
||||
<div>Тип данных: integer</div>
|
||||
<div>Число пустых: <xsl:value-of select="$empty-count"/></div>
|
||||
<xsl:call-template name="show-not-null"><xsl:with-param name="empty-count" select="$empty-count"/></xsl:call-template>
|
||||
<div>Нужен: CHECK (level_id IN(
|
||||
<xsl:for-each select="objects/object/level-id[generate-id() = generate-id(key('k-level-id', .)[1])]">
|
||||
<xsl:text> '</xsl:text><xsl:value-of select="."/><xsl:text>' </xsl:text>
|
||||
<xsl:if test="position() != last()"><xsl:text>, </xsl:text></xsl:if>
|
||||
</xsl:for-each>
|
||||
))</div>
|
||||
</div>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template name="field-generation">
|
||||
<xsl:variable name="empty-count" select="count(objects/object/generation[not(normalize-space())])"/>
|
||||
<div class="block">
|
||||
<div class="field-title">Анализ поля generation</div>
|
||||
<div>Тип данных: Текст</div>
|
||||
<div>Самый длинный элемент:
|
||||
<xsl:for-each select="objects/object/generation">
|
||||
<xsl:sort select="string-length(.)" data-type="number" order="descending"/>
|
||||
<xsl:if test="position() = 1"><xsl:value-of select="."/><xsl:text> , длина: </xsl:text><xsl:value-of select="string-length(.)"/></xsl:if>
|
||||
</xsl:for-each>
|
||||
</div>
|
||||
<div>Число пустых: <xsl:value-of select="$empty-count"/></div>
|
||||
<xsl:call-template name="show-not-null"><xsl:with-param name="empty-count" select="$empty-count"/></xsl:call-template>
|
||||
<div>Нужен: CHECK (generation IN(
|
||||
<xsl:for-each select="objects/object/generation[generate-id() = generate-id(key('k-generation', .)[1])]">
|
||||
<xsl:text> '</xsl:text><xsl:value-of select="."/><xsl:text>' </xsl:text>
|
||||
<xsl:if test="position() != last()"><xsl:text>, </xsl:text></xsl:if>
|
||||
</xsl:for-each>
|
||||
))</div>
|
||||
</div>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template name="field-generation-id">
|
||||
<xsl:variable name="empty-count" select="count(objects/object/generation-id[not(normalize-space())])"/>
|
||||
<div class="block">
|
||||
<div class="field-title">Анализ поля generation-id</div>
|
||||
<div>Тип данных: integer</div>
|
||||
<div>Число пустых: <xsl:value-of select="$empty-count"/></div>
|
||||
<xsl:call-template name="show-not-null"><xsl:with-param name="empty-count" select="$empty-count"/></xsl:call-template>
|
||||
<div>Нужен: CHECK (generation_id IN(
|
||||
<xsl:for-each select="objects/object/generation-id[generate-id() = generate-id(key('k-generation-id', .)[1])]">
|
||||
<xsl:text> '</xsl:text><xsl:value-of select="."/><xsl:text>' </xsl:text>
|
||||
<xsl:if test="position() != last()"><xsl:text>, </xsl:text></xsl:if>
|
||||
</xsl:for-each>
|
||||
))</div>
|
||||
</div>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template name="field-type">
|
||||
<xsl:variable name="empty-count" select="count(objects/object/type[not(normalize-space())])"/>
|
||||
<div class="block">
|
||||
<div class="field-title">Анализ поля type</div>
|
||||
<div>Тип данных: Текст</div>
|
||||
<div>Самый длинный элемент:
|
||||
<xsl:for-each select="objects/object/type">
|
||||
<xsl:sort select="string-length(.)" data-type="number" order="descending"/>
|
||||
<xsl:if test="position() = 1"><xsl:value-of select="."/><xsl:text> , длина: </xsl:text><xsl:value-of select="string-length(.)"/></xsl:if>
|
||||
</xsl:for-each>
|
||||
</div>
|
||||
<div>Число пустых: <xsl:value-of select="$empty-count"/></div>
|
||||
<xsl:call-template name="show-not-null"><xsl:with-param name="empty-count" select="$empty-count"/></xsl:call-template>
|
||||
<div>Нужен: CHECK (type IN(
|
||||
<xsl:for-each select="objects/object/type[generate-id() = generate-id(key('k-type', .)[1])]">
|
||||
<xsl:text> '</xsl:text><xsl:value-of select="."/><xsl:text>' </xsl:text>
|
||||
<xsl:if test="position() != last()"><xsl:text>, </xsl:text></xsl:if>
|
||||
</xsl:for-each>
|
||||
))</div>
|
||||
</div>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template name="field-type-id">
|
||||
<xsl:variable name="empty-count" select="count(objects/object/type-id[not(normalize-space())])"/>
|
||||
<div class="block">
|
||||
<div class="field-title">Анализ поля type-id</div>
|
||||
<div>Тип данных: integer</div>
|
||||
<div>Число пустых: <xsl:value-of select="$empty-count"/></div>
|
||||
<xsl:call-template name="show-not-null"><xsl:with-param name="empty-count" select="$empty-count"/></xsl:call-template>
|
||||
<div>Нужен: CHECK (type_id IN(
|
||||
<xsl:for-each select="objects/object/type-id[generate-id() = generate-id(key('k-type-id', .)[1])]">
|
||||
<xsl:text> '</xsl:text><xsl:value-of select="."/><xsl:text>' </xsl:text>
|
||||
<xsl:if test="position() != last()"><xsl:text>, </xsl:text></xsl:if>
|
||||
</xsl:for-each>
|
||||
))</div>
|
||||
</div>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="/">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
|
||||
<title>Анализ данных файла specialities.xml</title>
|
||||
<style type="text/css">
|
||||
body { font-family: Arial, sans-serif; font-size: 16px; line-height: 1.45; background: #ffffff; color: #000000; margin: 24px; }
|
||||
h1 { font-size: 24px; margin: 0 0 18px 0; }
|
||||
h2 { font-size: 20px; margin: 26px 0 10px 0; }
|
||||
.block { margin-bottom: 18px; }
|
||||
.field-title { font-weight: bold; margin-bottom: 4px; }
|
||||
.sql { white-space: pre-wrap; border: 1px solid #bfbfbf; padding: 12px; margin-top: 8px; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Анализ данных файла specialities.xml (specialities.xml)</h1>
|
||||
|
||||
<xsl:call-template name="field-id"/>
|
||||
<xsl:call-template name="field-name"/>
|
||||
<xsl:call-template name="field-code"/>
|
||||
<xsl:call-template name="field-level"/>
|
||||
<xsl:call-template name="field-level-id"/>
|
||||
<xsl:call-template name="field-generation"/>
|
||||
<xsl:call-template name="field-generation-id"/>
|
||||
<xsl:call-template name="field-type"/>
|
||||
<xsl:call-template name="field-type-id"/>
|
||||
|
||||
<h2>SQL-файл</h2>
|
||||
<div class="sql"><xsl:text>DROP TABLE IF EXISTS specialities;
|
||||
DROP SEQUENCE IF EXISTS specialities_id_seq;
|
||||
|
||||
CREATE SEQUENCE specialities_id_seq
|
||||
START WITH 1
|
||||
INCREMENT BY 1;
|
||||
|
||||
CREATE TABLE specialities (
|
||||
id INTEGER</xsl:text><xsl:call-template name="sql-not-null"><xsl:with-param name="empty-count" select="count(objects/object/id[not(normalize-space())])"/></xsl:call-template><xsl:text>,
|
||||
|
||||
name VARCHAR(</xsl:text><xsl:for-each select="objects/object/name"><xsl:sort select="string-length(.)" data-type="number" order="descending"/><xsl:if test="position() = 1"><xsl:value-of select="string-length(.)"/></xsl:if></xsl:for-each>
|
||||
<xsl:text>)</xsl:text><xsl:call-template name="sql-not-null"><xsl:with-param name="empty-count" select="count(objects/object/name[not(normalize-space())])"/></xsl:call-template><xsl:text>,
|
||||
|
||||
code VARCHAR(</xsl:text><xsl:for-each select="objects/object/code"><xsl:sort select="string-length(.)" data-type="number" order="descending"/><xsl:if test="position() = 1"><xsl:value-of select="string-length(.)"/></xsl:if></xsl:for-each>
|
||||
<xsl:text>)</xsl:text><xsl:call-template name="sql-not-null"><xsl:with-param name="empty-count" select="count(objects/object/code[not(normalize-space())])"/></xsl:call-template><xsl:text>,
|
||||
|
||||
level VARCHAR(</xsl:text><xsl:for-each select="objects/object/level"><xsl:sort select="string-length(.)" data-type="number" order="descending"/><xsl:if test="position() = 1"><xsl:value-of select="string-length(.)"/></xsl:if></xsl:for-each>
|
||||
<xsl:text>)</xsl:text><xsl:call-template name="sql-not-null"><xsl:with-param name="empty-count" select="count(objects/object/level[not(normalize-space())])"/></xsl:call-template><xsl:call-template name="sql-check-text"><xsl:with-param name="field-name" select="'level'"/><xsl:with-param name="items" select="objects/object/level[generate-id() = generate-id(key('k-level', .)[1])]"/><xsl:with-param name="count" select="count(objects/object/level[generate-id() = generate-id(key('k-level', .)[1])])"/></xsl:call-template><xsl:text>,
|
||||
|
||||
level_id INTEGER</xsl:text><xsl:call-template name="sql-not-null"><xsl:with-param name="empty-count" select="count(objects/object/level-id[not(normalize-space())])"/></xsl:call-template><xsl:call-template name="sql-check-int"><xsl:with-param name="field-name" select="'level_id'"/><xsl:with-param name="items" select="objects/object/level-id[generate-id() = generate-id(key('k-level-id', .)[1])]"/><xsl:with-param name="count" select="count(objects/object/level-id[generate-id() = generate-id(key('k-level-id', .)[1])])"/></xsl:call-template><xsl:text>,
|
||||
|
||||
generation VARCHAR(</xsl:text><xsl:for-each select="objects/object/generation"><xsl:sort select="string-length(.)" data-type="number" order="descending"/><xsl:if test="position() = 1"><xsl:value-of select="string-length(.)"/></xsl:if></xsl:for-each>
|
||||
<xsl:text>)</xsl:text><xsl:call-template name="sql-not-null"><xsl:with-param name="empty-count" select="count(objects/object/generation[not(normalize-space())])"/></xsl:call-template><xsl:call-template name="sql-check-text"><xsl:with-param name="field-name" select="'generation'"/><xsl:with-param name="items" select="objects/object/generation[generate-id() = generate-id(key('k-generation', .)[1])]"/><xsl:with-param name="count" select="count(objects/object/generation[generate-id() = generate-id(key('k-generation', .)[1])])"/></xsl:call-template><xsl:text>,
|
||||
|
||||
generation_id INTEGER</xsl:text><xsl:call-template name="sql-not-null"><xsl:with-param name="empty-count" select="count(objects/object/generation-id[not(normalize-space())])"/></xsl:call-template><xsl:call-template name="sql-check-int"><xsl:with-param name="field-name" select="'generation_id'"/><xsl:with-param name="items" select="objects/object/generation-id[generate-id() = generate-id(key('k-generation-id', .)[1])]"/><xsl:with-param name="count" select="count(objects/object/generation-id[generate-id() = generate-id(key('k-generation-id', .)[1])])"/></xsl:call-template><xsl:text>,
|
||||
|
||||
type VARCHAR(</xsl:text><xsl:for-each select="objects/object/type"><xsl:sort select="string-length(.)" data-type="number" order="descending"/><xsl:if test="position() = 1"><xsl:value-of select="string-length(.)"/></xsl:if></xsl:for-each>
|
||||
<xsl:text>)</xsl:text><xsl:call-template name="sql-not-null"><xsl:with-param name="empty-count" select="count(objects/object/type[not(normalize-space())])"/></xsl:call-template><xsl:call-template name="sql-check-text"><xsl:with-param name="field-name" select="'type'"/><xsl:with-param name="items" select="objects/object/type[generate-id() = generate-id(key('k-type', .)[1])]"/><xsl:with-param name="count" select="count(objects/object/type[generate-id() = generate-id(key('k-type', .)[1])])"/></xsl:call-template><xsl:text>,
|
||||
|
||||
type_id INTEGER</xsl:text><xsl:call-template name="sql-not-null"><xsl:with-param name="empty-count" select="count(objects/object/type-id[not(normalize-space())])"/></xsl:call-template><xsl:call-template name="sql-check-int"><xsl:with-param name="field-name" select="'type_id'"/><xsl:with-param name="items" select="objects/object/type-id[generate-id() = generate-id(key('k-type-id', .)[1])]"/><xsl:with-param name="count" select="count(objects/object/type-id[generate-id() = generate-id(key('k-type-id', .)[1])])"/></xsl:call-template><xsl:text>,
|
||||
CONSTRAINT pk_specialities PRIMARY KEY (id)
|
||||
);</xsl:text></div>
|
||||
|
||||
<h2>SQL: INSERT-запросы, сформированные из XML</h2>
|
||||
<xsl:for-each select="objects/object">
|
||||
<div class="sql"><xsl:text>INSERT INTO specialities (id, name, code, level, level_id, generation, generation_id, type, type_id)
|
||||
VALUES (
|
||||
nextval('specialities_id_seq'),
|
||||
'</xsl:text><xsl:value-of select="name"/><xsl:text>',
|
||||
'</xsl:text><xsl:value-of select="code"/><xsl:text>',
|
||||
'</xsl:text><xsl:value-of select="level"/><xsl:text>',
|
||||
</xsl:text><xsl:value-of select="level-id"/><xsl:text>,
|
||||
'</xsl:text><xsl:value-of select="generation"/><xsl:text>',
|
||||
</xsl:text><xsl:value-of select="generation-id"/><xsl:text>,
|
||||
'</xsl:text><xsl:value-of select="type"/><xsl:text>',
|
||||
</xsl:text><xsl:value-of select="type-id"/><xsl:text>
|
||||
);</xsl:text></div>
|
||||
</xsl:for-each>
|
||||
</body>
|
||||
</html>
|
||||
</xsl:template>
|
||||
</xsl:stylesheet>
|
||||
@@ -1,14 +0,0 @@
|
||||
from lxml import etree
|
||||
|
||||
xml = etree.parse("specialities.xml")
|
||||
|
||||
xslt = etree.parse("specialities.xsl")
|
||||
|
||||
transform = etree.XSLT(xslt)
|
||||
|
||||
result = transform(xml)
|
||||
|
||||
with open("specialities.html", "wb") as f:
|
||||
f.write(etree.tostring(result, pretty_print=True, encoding="UTF-8"))
|
||||
|
||||
print("HTML успешно создан: specialities.html")
|
||||
@@ -1,681 +0,0 @@
|
||||
{
|
||||
"metadata": {
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3",
|
||||
"name": "python3",
|
||||
"language": "python"
|
||||
},
|
||||
"language_info": {
|
||||
"name": "python",
|
||||
"version": "3.12.13",
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"pygments_lexer": "ipython3",
|
||||
"mimetype": "text/x-python",
|
||||
"nbconvert_exporter": "python",
|
||||
"file_extension": ".py"
|
||||
},
|
||||
"colab": {
|
||||
"provenance": []
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 5,
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "code",
|
||||
"id": "2e2f8a4c-7063-4650-ace5-8f230c8d994a",
|
||||
"metadata": {
|
||||
"id": "5tecyK1Y5y_0"
|
||||
},
|
||||
"execution_count": 1,
|
||||
"source": [
|
||||
"import pandas as pd\n",
|
||||
"import seaborn as sns\n",
|
||||
"import matplotlib.pyplot as plt\n",
|
||||
"import numpy as np\n",
|
||||
"from scipy.stats import pearsonr, spearmanr, kendalltau\n",
|
||||
"import sqlite3\n",
|
||||
"import kagglehub\n"
|
||||
],
|
||||
"outputs": [
|
||||
{
|
||||
"output_type": "stream",
|
||||
"name": "stdout",
|
||||
"text": [
|
||||
"/home/ada/Documents/Files/files_mephi/Работы/ИРФМ/.venv/lib/python3.12/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not\n",
|
||||
" found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n",
|
||||
" from .autonotebook import tqdm as notebook_tqdm\n"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"id": "8f16c784-75c9-44a1-8f9c-6555bdf38a08",
|
||||
"metadata": {
|
||||
"id": "-kxc18fy5gMU",
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/"
|
||||
},
|
||||
"outputId": "3db947c3-f4c3-4449-91eb-1a5722ba2deb"
|
||||
},
|
||||
"execution_count": 2,
|
||||
"source": [
|
||||
"# https://www.kaggle.com/datasets/ziya07/financial-transaction-dataset-for-risk-prediction?select=financial_transactions.csv\n",
|
||||
"dataset_dir = kagglehub.dataset_download(\n",
|
||||
" \"mchirico/montcoalert\",\n",
|
||||
" output_dir=\"../data/montcoalert\",\n",
|
||||
" # force_download=True, # раскомментируйте, если нужно перекачать датасет\n",
|
||||
")\n",
|
||||
"\n",
|
||||
"print(\"Path to dataset files:\", dataset_dir)\n"
|
||||
],
|
||||
"outputs": [
|
||||
{
|
||||
"output_type": "stream",
|
||||
"name": "stdout",
|
||||
"text": [
|
||||
"Path to dataset files: ../data/montcoalert\n"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"id": "8228deb7-1ef3-4b6a-b16d-795c5b80a10b",
|
||||
"metadata": {
|
||||
"id": "jjxxafuj5twF",
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/",
|
||||
"height": 597
|
||||
},
|
||||
"outputId": "07ffb386-df17-4830-daa5-20e36a68e0c5"
|
||||
},
|
||||
"execution_count": 3,
|
||||
"source": [
|
||||
"import os\n",
|
||||
"\n",
|
||||
"df = pd.read_csv(os.path.join(dataset_dir, \"911.csv\"))\n",
|
||||
"df\n"
|
||||
],
|
||||
"outputs": []
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"id": "bcd5db7c-b149-4e05-a1c5-d5df628572d4",
|
||||
"metadata": {
|
||||
"id": "JFENAQ6x6M-2",
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/",
|
||||
"height": 424
|
||||
},
|
||||
"outputId": "69f2c9f2-256e-4184-f6cc-7895b3065557"
|
||||
},
|
||||
"execution_count": 4,
|
||||
"source": [
|
||||
"df = df.drop(columns=['desc', 'zip', 'addr', 'e'])\n",
|
||||
"df['town'] = df['twp']\n",
|
||||
"df = df.drop(columns=['twp'])\n",
|
||||
"df\n"
|
||||
],
|
||||
"outputs": []
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"id": "8322a532-24e5-406f-b019-cbf264676259",
|
||||
"metadata": {
|
||||
"id": "kjx88uH06yXh",
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/",
|
||||
"height": 241
|
||||
},
|
||||
"outputId": "b4525822-dc37-4baf-ef06-2429efb9d9b9"
|
||||
},
|
||||
"execution_count": 5,
|
||||
"source": [
|
||||
"df.isnull().sum()\n"
|
||||
],
|
||||
"outputs": [
|
||||
{
|
||||
"output_type": "display_data",
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"lat 0\n",
|
||||
"lng 0\n",
|
||||
"title 0\n",
|
||||
"timeStamp 0\n",
|
||||
"town 293\n",
|
||||
"dtype: int64\n"
|
||||
]
|
||||
},
|
||||
"metadata": {}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"id": "9ea98f73-7ab5-4b31-a3c7-d4031b65636c",
|
||||
"metadata": {
|
||||
"id": "CVwu4mZY7j38",
|
||||
"outputId": "10c839ff-e230-4429-8ec1-dd1160e0e52a",
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/",
|
||||
"height": 241
|
||||
}
|
||||
},
|
||||
"execution_count": 6,
|
||||
"source": [
|
||||
"df = df.dropna()\n",
|
||||
"df.isnull().sum()\n"
|
||||
],
|
||||
"outputs": [
|
||||
{
|
||||
"output_type": "display_data",
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"lat 0\n",
|
||||
"lng 0\n",
|
||||
"title 0\n",
|
||||
"timeStamp 0\n",
|
||||
"town 0\n",
|
||||
"dtype: int64\n"
|
||||
]
|
||||
},
|
||||
"metadata": {}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"id": "1e0859b5-80a7-45d3-b681-4e3f5e97944f",
|
||||
"metadata": {
|
||||
"id": "BVziGRoT74je",
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/",
|
||||
"height": 300
|
||||
},
|
||||
"outputId": "cb96454a-a04b-4ea0-d044-981fdddcc008"
|
||||
},
|
||||
"execution_count": 7,
|
||||
"source": [
|
||||
"df.describe()\n",
|
||||
"\n",
|
||||
"# штат Пенсильвания (PA) находится примерно в следующих координатах:\n",
|
||||
"# Широта (lat): от 39.7° N до 42.5° N\n",
|
||||
"# Долгота (lng): от -80.5° W до -74.7° W\n"
|
||||
],
|
||||
"outputs": []
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"id": "6931cd95-26a2-43da-98f0-90d69e3a7afe",
|
||||
"metadata": {
|
||||
"id": "YZyG4DIl8uQE",
|
||||
"outputId": "0f7ec0ed-aeed-426b-f367-640113d8057d",
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/",
|
||||
"height": 300
|
||||
}
|
||||
},
|
||||
"execution_count": 8,
|
||||
"source": [
|
||||
"df_clean = df[\n",
|
||||
" (df['lat'].between(39.7, 42.5)) &\n",
|
||||
" (df['lng'].between(-80.5, -74.7))\n",
|
||||
"]\n",
|
||||
"df_clean.describe()\n"
|
||||
],
|
||||
"outputs": []
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"id": "76fd2b05-51a2-420d-a7c4-6a41cf922cfb",
|
||||
"metadata": {
|
||||
"id": "9UHU8d6s8597",
|
||||
"outputId": "f822f2bb-1bcb-44b2-9371-e1bd0480a509",
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/",
|
||||
"height": 424
|
||||
}
|
||||
},
|
||||
"execution_count": 9,
|
||||
"source": [
|
||||
"df_grouped = df_clean.groupby('town').size().reset_index(name='count')\n",
|
||||
"df_grouped = df_grouped[df_grouped['count'] >= 5]\n",
|
||||
"df_grouped.sort_values(by='count', ascending=False)\n"
|
||||
],
|
||||
"outputs": []
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"id": "7204f62a-c6a3-4b60-8a6c-ae055c771276",
|
||||
"metadata": {
|
||||
"id": "8XxEu-5I_6oz",
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/",
|
||||
"height": 526
|
||||
},
|
||||
"outputId": "831e0639-0ffe-4a9d-e309-e6d19745375a"
|
||||
},
|
||||
"execution_count": 10,
|
||||
"source": [
|
||||
"plt.figure(figsize=(8, 6))\n",
|
||||
"sns.boxplot(y=df_grouped['count'])\n",
|
||||
"plt.title('Распределение количества вызовов по городам')\n",
|
||||
"plt.ylabel('Количество вызовов')\n",
|
||||
"plt.show()\n"
|
||||
],
|
||||
"outputs": []
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"id": "8e69711f-ea64-4139-bd42-bab3ffe02750",
|
||||
"metadata": {
|
||||
"id": "hL-4vAqy_gsN",
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/",
|
||||
"height": 300
|
||||
},
|
||||
"outputId": "50f07e22-0a9c-4b43-87a4-94c18e7601e6"
|
||||
},
|
||||
"execution_count": 11,
|
||||
"source": [
|
||||
"df_grouped.describe()\n"
|
||||
],
|
||||
"outputs": []
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"id": "2f9d95cf-4449-4b59-918e-7662c1eba9da",
|
||||
"metadata": {
|
||||
"id": "lFjeZjICF-C-",
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/"
|
||||
},
|
||||
"outputId": "9c2c08fa-ae97-4b74-f3a4-92148999c037"
|
||||
},
|
||||
"execution_count": 12,
|
||||
"source": [
|
||||
"df_grouped = df_grouped.sort_values(by='count')\n",
|
||||
"counts = df_grouped['count'].values\n",
|
||||
"towns = df_grouped['town'].values\n",
|
||||
"n = len(counts)\n",
|
||||
"\n",
|
||||
"total_range = counts.max() - counts.min() # Размах\n",
|
||||
"gap_threshold = 0.1 * total_range # Порог\n",
|
||||
"\n",
|
||||
"# Отсекаем нижние и верхние 10% по порядку наблюдений\n",
|
||||
"bottom_10_idx = int(n * 0.10)\n",
|
||||
"top_10_idx = int(n * 0.90)\n",
|
||||
"\n",
|
||||
"towns_to_drop = set()\n",
|
||||
"\n",
|
||||
"# Проверка нижних 10% (идем от центра к краям)\n",
|
||||
"# Ищем разрыв между y (индекс i) и соседом ближе к центру (индекс i+1)\n",
|
||||
"for i in range(bottom_10_idx, -1, -1): # (6, 5, 4, 3, 2, 1, 0)\n",
|
||||
" if i + 1 < n:\n",
|
||||
" gap = counts[i+1] - counts[i]\n",
|
||||
" if gap > gap_threshold:\n",
|
||||
" # Нашли разрыв. Удаляем всё от y до края\n",
|
||||
" for j in range(i, -1, -1):\n",
|
||||
" towns_to_drop.add(towns[j])\n",
|
||||
" break\n",
|
||||
"\n",
|
||||
"# Проверка верхних 10% (идем от центра к краям)\n",
|
||||
"# Ищем разрыв между y (индекс i) и соседом ближе к центру (индекс i-1)\n",
|
||||
"for i in range(top_10_idx, n):\n",
|
||||
" if i - 1 >= 0:\n",
|
||||
" gap = counts[i] - counts[i-1]\n",
|
||||
" if gap > gap_threshold:\n",
|
||||
" # Нашли разрыв. Удаляем всё от y до края\n",
|
||||
" for j in range(i, n):\n",
|
||||
" towns_to_drop.add(towns[j])\n",
|
||||
" break\n",
|
||||
"\n",
|
||||
"towns_to_drop\n"
|
||||
],
|
||||
"outputs": [
|
||||
{
|
||||
"output_type": "display_data",
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"{'LOWER MERION'}\n"
|
||||
]
|
||||
},
|
||||
"metadata": {}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"id": "401fa973-2d94-440b-ae9a-65b7fa31c5e2",
|
||||
"metadata": {
|
||||
"id": "2Nch3p_tHwOf",
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/"
|
||||
},
|
||||
"outputId": "cd95841f-df8d-496f-a39e-a6c4877e067a"
|
||||
},
|
||||
"execution_count": 13,
|
||||
"source": [
|
||||
"df_clean = df_clean[~df_clean['town'].isin(towns_to_drop)]\n",
|
||||
"\n",
|
||||
"df_clean.info()\n"
|
||||
],
|
||||
"outputs": [
|
||||
{
|
||||
"output_type": "stream",
|
||||
"name": "stdout",
|
||||
"text": [
|
||||
"<class 'pandas.DataFrame'>\n",
|
||||
"Index: 607557 entries, 0 to 663520\n",
|
||||
"Data columns (total 5 columns):\n",
|
||||
" # Column Non-Null Count Dtype\n",
|
||||
"--- ------ -------------- -----\n",
|
||||
" 0 lat 607557 non-null float64\n",
|
||||
" 1 lng 607557 non-null float64\n",
|
||||
" 2 title 607557 non-null str\n",
|
||||
" 3 timeStamp 607557 non-null str\n",
|
||||
" 4 town 607557 non-null str\n",
|
||||
"dtypes: float64(2), str(3)\n",
|
||||
"memory usage: 27.8 MB\n"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"id": "a71317e7-7d15-4878-88f0-f201c15bf64d",
|
||||
"metadata": {
|
||||
"id": "pORHOk6xAe6b",
|
||||
"outputId": "4151cbca-371f-4cab-d8e1-b91e9712703a",
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/",
|
||||
"height": 526
|
||||
}
|
||||
},
|
||||
"execution_count": 14,
|
||||
"source": [
|
||||
"df_clean_grouped = df_clean.groupby('town').size().reset_index(name='count')\n",
|
||||
"plt.figure(figsize=(8, 6))\n",
|
||||
"sns.boxplot(y=df_clean_grouped['count'])\n",
|
||||
"plt.title('Распределение количества вызовов по городам')\n",
|
||||
"plt.ylabel('Количество вызовов')\n",
|
||||
"plt.show()\n"
|
||||
],
|
||||
"outputs": []
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"id": "29af2c22-e4b2-401d-80bc-43c812867c4e",
|
||||
"metadata": {
|
||||
"id": "xFeEAU27DVWV",
|
||||
"outputId": "d26f3a5f-6857-45e7-fc33-dce0818419f1",
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/",
|
||||
"height": 300
|
||||
}
|
||||
},
|
||||
"execution_count": 15,
|
||||
"source": [
|
||||
"df_clean_grouped.describe()\n"
|
||||
],
|
||||
"outputs": []
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"id": "6c425257-1b4d-41e8-8c17-1b26ade1bbeb",
|
||||
"metadata": {
|
||||
"id": "bace27bc",
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/"
|
||||
},
|
||||
"outputId": "6f3cd65b-abb6-4e9d-c880-c0d3162bb064"
|
||||
},
|
||||
"execution_count": 16,
|
||||
"source": [
|
||||
"df_clean['timeStamp'] = pd.to_datetime(df_clean['timeStamp'])\n",
|
||||
"df_clean.info()\n"
|
||||
],
|
||||
"outputs": [
|
||||
{
|
||||
"output_type": "stream",
|
||||
"name": "stdout",
|
||||
"text": [
|
||||
"<class 'pandas.DataFrame'>\n",
|
||||
"Index: 607557 entries, 0 to 663520\n",
|
||||
"Data columns (total 5 columns):\n",
|
||||
" # Column Non-Null Count Dtype\n",
|
||||
"--- ------ -------------- -----\n",
|
||||
" 0 lat 607557 non-null float64\n",
|
||||
" 1 lng 607557 non-null float64\n",
|
||||
" 2 title 607557 non-null str\n",
|
||||
" 3 timeStamp 607557 non-null datetime64[us]\n",
|
||||
" 4 town 607557 non-null str\n",
|
||||
"dtypes: datetime64[us](1), float64(2), str(2)\n",
|
||||
"memory usage: 27.8 MB\n"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"id": "cc0a488b-ce3f-4860-ac73-cc086623ad68",
|
||||
"metadata": {
|
||||
"id": "9d0eeaf8",
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/",
|
||||
"height": 206
|
||||
},
|
||||
"outputId": "d158ac82-85e5-464c-854b-f1264a32406b"
|
||||
},
|
||||
"execution_count": 17,
|
||||
"source": [
|
||||
"df_clean['hour'] = df_clean['timeStamp'].dt.hour\n",
|
||||
"df_clean.head()\n"
|
||||
],
|
||||
"outputs": []
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"id": "36b114ae-9647-4555-84ad-96cc3ca7ace4",
|
||||
"metadata": {
|
||||
"id": "91a1edc3",
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/",
|
||||
"height": 206
|
||||
},
|
||||
"outputId": "04806088-c1be-4fae-e382-0240b286ffe5"
|
||||
},
|
||||
"execution_count": 18,
|
||||
"source": [
|
||||
"calls_by_hour = df_clean.groupby('hour').size().reset_index(name='count')\n",
|
||||
"calls_by_hour.head()\n"
|
||||
],
|
||||
"outputs": []
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"id": "153435e0-d311-47ce-9934-527aa4918935",
|
||||
"metadata": {
|
||||
"id": "0ef31758",
|
||||
"outputId": "4a0e5512-4174-4037-f749-697c2ca60963",
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/",
|
||||
"height": 607
|
||||
}
|
||||
},
|
||||
"execution_count": 19,
|
||||
"source": [
|
||||
"plt.figure(figsize=(10, 6))\n",
|
||||
"sns.lineplot(x='hour', y='count', data=calls_by_hour, marker='o', label='Calls Count')\n",
|
||||
"plt.title('Общее количество вызовов 911 по часам суток')\n",
|
||||
"plt.xlabel('Час суток')\n",
|
||||
"plt.ylabel('Количество вызовов')\n",
|
||||
"plt.xticks(calls_by_hour['hour'])\n",
|
||||
"plt.grid(True, linestyle='--', alpha=0.7)\n",
|
||||
"plt.legend()\n",
|
||||
"plt.tight_layout()\n",
|
||||
"plt.show()\n"
|
||||
],
|
||||
"outputs": []
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"id": "fe76bee3-d0a0-4dad-9867-ce6c3c711d08",
|
||||
"metadata": {
|
||||
"id": "jg4PAmmUQ_9o",
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/"
|
||||
},
|
||||
"outputId": "512127d4-5308-419f-a7dd-cab7399473af"
|
||||
},
|
||||
"execution_count": 20,
|
||||
"source": [
|
||||
"def analyze_correlations(df, col1, col2):\n",
|
||||
" x = df[col1].values\n",
|
||||
" y = df[col2].values\n",
|
||||
"\n",
|
||||
" results = {\n",
|
||||
" 'Пирсон': pearsonr(x, y),\n",
|
||||
" 'Спирмен': spearmanr(x, y),\n",
|
||||
" 'Кендалл': kendalltau(x, y)\n",
|
||||
" }\n",
|
||||
"\n",
|
||||
" for method, (corr, p_value) in results.items():\n",
|
||||
" abs_corr = abs(corr)\n",
|
||||
"\n",
|
||||
" if method == 'Кендалл':\n",
|
||||
" thresholds = [0.2, 0.4, 0.6, 0.8]\n",
|
||||
" else:\n",
|
||||
" thresholds = [0.3, 0.5, 0.7, 0.9]\n",
|
||||
"\n",
|
||||
" if abs_corr < thresholds[0]:\n",
|
||||
" strength = \"слабая (или отсутствует)\"\n",
|
||||
" elif abs_corr < thresholds[1]:\n",
|
||||
" strength = \"умеренная\"\n",
|
||||
" elif abs_corr < thresholds[2]:\n",
|
||||
" strength = \"заметная\"\n",
|
||||
" elif abs_corr < thresholds[3]:\n",
|
||||
" strength = \"высокая\"\n",
|
||||
" else:\n",
|
||||
" strength = \"весьма высокая\"\n",
|
||||
"\n",
|
||||
" status = \"Значима\" if p_value < 0.05 else \"НЕ значима\"\n",
|
||||
" direction = \"положительная\" if corr > 0 else \"отрицательная\"\n",
|
||||
"\n",
|
||||
" print(f\"[{method}]\")\n",
|
||||
" print(f\" Коэффициент: {corr:.4f} ({direction})\")\n",
|
||||
" print(f\" P-value: {p_value:.4e} ({status})\")\n",
|
||||
"\n",
|
||||
" if p_value < 0.05:\n",
|
||||
" print(f\" Вывод: Наблюдается {strength} связь.\")\n",
|
||||
" else:\n",
|
||||
" print(f\" Вывод: Недостаточно данных для подтверждения связи.\")\n",
|
||||
" print(\"-\" * 40)\n",
|
||||
"\n",
|
||||
"analyze_correlations(calls_by_hour, 'hour', 'count')\n"
|
||||
],
|
||||
"outputs": [
|
||||
{
|
||||
"output_type": "stream",
|
||||
"name": "stdout",
|
||||
"text": [
|
||||
"[Пирсон]\n",
|
||||
" Коэффициент: 0.5114 (положительная)\n",
|
||||
" P-value: 1.0638e-02 (Значима)\n",
|
||||
" Вывод: Наблюдается заметная связь.\n",
|
||||
"----------------------------------------\n",
|
||||
"[Спирмен]\n",
|
||||
" Коэффициент: 0.4991 (положительная)\n",
|
||||
" P-value: 1.3028e-02 (Значима)\n",
|
||||
" Вывод: Наблюдается умеренная связь.\n",
|
||||
"----------------------------------------\n",
|
||||
"[Кендалл]\n",
|
||||
" Коэффициент: 0.3623 (положительная)\n",
|
||||
" P-value: 1.2905e-02 (Значима)\n",
|
||||
" Вывод: Наблюдается умеренная связь.\n",
|
||||
"----------------------------------------\n"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"id": "8ee4c692-afde-4bad-b7a5-bb0dda83a5aa",
|
||||
"metadata": {},
|
||||
"execution_count": 24,
|
||||
"source": [
|
||||
"conn = sqlite3.connect('../data/calls.db')\n",
|
||||
"df_clean.to_sql('calls', conn, if_exists='replace', index=False)\n",
|
||||
"conn.close()\n"
|
||||
],
|
||||
"outputs": []
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"id": "4e3cb3c7-62d9-4d2b-b7d0-5d209464fac2",
|
||||
"metadata": {
|
||||
"id": "1e5d291c",
|
||||
"outputId": "783c15e5-5dce-46e2-c666-1f917a832051",
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/"
|
||||
}
|
||||
},
|
||||
"execution_count": 25,
|
||||
"source": [
|
||||
"conn = sqlite3.connect('../data/calls.db')\n",
|
||||
"query = \"SELECT * FROM calls LIMIT 5\"\n",
|
||||
"curr = conn.cursor()\n",
|
||||
"\n",
|
||||
"data = curr.execute(query).fetchall()\n",
|
||||
"\n",
|
||||
"conn.close()\n",
|
||||
"data\n"
|
||||
],
|
||||
"outputs": [
|
||||
{
|
||||
"output_type": "display_data",
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"[(40.2978759,\n",
|
||||
" -75.5812935,\n",
|
||||
" 'EMS: BACK PAINS/INJURY',\n",
|
||||
" '2015-12-10 17:10:52',\n",
|
||||
" 'NEW HANOVER',\n",
|
||||
" 17),\n",
|
||||
" (40.2580614,\n",
|
||||
" -75.2646799,\n",
|
||||
" 'EMS: DIABETIC EMERGENCY',\n",
|
||||
" '2015-12-10 17:29:21',\n",
|
||||
" 'HATFIELD TOWNSHIP',\n",
|
||||
" 17),\n",
|
||||
" (40.1211818,\n",
|
||||
" -75.3519752,\n",
|
||||
" 'Fire: GAS-ODOR/LEAK',\n",
|
||||
" '2015-12-10 14:39:21',\n",
|
||||
" 'NORRISTOWN',\n",
|
||||
" 14),\n",
|
||||
" (40.116153,\n",
|
||||
" -75.343513,\n",
|
||||
" 'EMS: CARDIAC EMERGENCY',\n",
|
||||
" '2015-12-10 16:47:36',\n",
|
||||
" 'NORRISTOWN',\n",
|
||||
" 16),\n",
|
||||
" (40.251492,\n",
|
||||
" -75.6033497,\n",
|
||||
" 'EMS: DIZZINESS',\n",
|
||||
" '2015-12-10 16:56:52',\n",
|
||||
" 'LOWER POTTSGROVE',\n",
|
||||
" 16)]\n"
|
||||
]
|
||||
},
|
||||
"metadata": {}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,168 +0,0 @@
|
||||
import json
|
||||
|
||||
import requests
|
||||
|
||||
|
||||
BASE_URL = "http://127.0.0.1:5000"
|
||||
|
||||
|
||||
def ask_format() -> str:
|
||||
"""Запрашивает желаемый формат ответа и возвращает json или wsdl."""
|
||||
raw = input("Формат ответа (json/wsdl) [json]: ").strip().lower()
|
||||
return raw if raw in {"json", "wsdl"} else "json"
|
||||
|
||||
|
||||
def print_response(resp: requests.Response) -> None:
|
||||
"""Печатает HTTP-статус и тело ответа в JSON или сыром виде."""
|
||||
print(f"\nHTTP {resp.status_code}")
|
||||
try:
|
||||
print(json.dumps(resp.json(), ensure_ascii=False, indent=2))
|
||||
except ValueError:
|
||||
print(resp.text)
|
||||
|
||||
|
||||
def input_payload() -> dict:
|
||||
"""Собирает поля объекта из консоли и возвращает payload для POST/PUT."""
|
||||
print("Оставьте поле пустым, если не хотите его передавать")
|
||||
payload = {}
|
||||
|
||||
lat = input("lat: ").strip()
|
||||
if lat:
|
||||
payload["lat"] = float(lat)
|
||||
|
||||
lng = input("lng: ").strip()
|
||||
if lng:
|
||||
payload["lng"] = float(lng)
|
||||
|
||||
title = input("title: ").strip()
|
||||
if title:
|
||||
payload["title"] = title
|
||||
|
||||
timestamp = input("timeStamp (YYYY-MM-DD HH:MM:SS): ").strip()
|
||||
if timestamp:
|
||||
payload["timeStamp"] = timestamp
|
||||
|
||||
town = input("town: ").strip()
|
||||
if town:
|
||||
payload["town"] = town
|
||||
|
||||
hour = input("hour (0-23): ").strip()
|
||||
if hour:
|
||||
payload["hour"] = int(hour)
|
||||
|
||||
return payload
|
||||
|
||||
|
||||
def list_calls() -> None:
|
||||
"""Запрашивает и выводит пагинированный список объектов calls."""
|
||||
page = input("page [1]: ").strip() or "1"
|
||||
per_page = input("per_page [20]: ").strip() or "20"
|
||||
fmt = ask_format()
|
||||
|
||||
resp = requests.get(
|
||||
f"{BASE_URL}/api/calls",
|
||||
params={"page": page, "per_page": per_page, "format": fmt},
|
||||
timeout=30,
|
||||
)
|
||||
print_response(resp)
|
||||
|
||||
|
||||
def get_call() -> None:
|
||||
"""Запрашивает и выводит один объект calls по ID."""
|
||||
call_id = input("ID объекта: ").strip()
|
||||
fmt = ask_format()
|
||||
resp = requests.get(
|
||||
f"{BASE_URL}/api/calls/{call_id}", params={"format": fmt}, timeout=30
|
||||
)
|
||||
print_response(resp)
|
||||
|
||||
|
||||
def create_call() -> None:
|
||||
"""Создает новый объект calls из введенных пользователем данных."""
|
||||
payload = input_payload()
|
||||
fmt = ask_format()
|
||||
resp = requests.post(
|
||||
f"{BASE_URL}/api/calls", params={"format": fmt}, json=payload, timeout=30
|
||||
)
|
||||
print_response(resp)
|
||||
|
||||
|
||||
def update_call() -> None:
|
||||
"""Обновляет существующий объект calls по ID введенными полями."""
|
||||
call_id = input("ID объекта: ").strip()
|
||||
payload = input_payload()
|
||||
fmt = ask_format()
|
||||
resp = requests.put(
|
||||
f"{BASE_URL}/api/calls/{call_id}",
|
||||
params={"format": fmt},
|
||||
json=payload,
|
||||
timeout=30,
|
||||
)
|
||||
print_response(resp)
|
||||
|
||||
|
||||
def delete_call() -> None:
|
||||
"""Удаляет объект calls по ID и выводит результат операции."""
|
||||
call_id = input("ID объекта: ").strip()
|
||||
fmt = ask_format()
|
||||
resp = requests.delete(
|
||||
f"{BASE_URL}/api/calls/{call_id}", params={"format": fmt}, timeout=30
|
||||
)
|
||||
print_response(resp)
|
||||
|
||||
|
||||
def stats_by_hour() -> None:
|
||||
"""Запрашивает статистику количества обращений по выбранному часу."""
|
||||
hour = input("Час (0-23): ").strip()
|
||||
fmt = ask_format()
|
||||
resp = requests.get(
|
||||
f"{BASE_URL}/api/stats/hour/{hour}", params={"format": fmt}, timeout=30
|
||||
)
|
||||
print_response(resp)
|
||||
|
||||
|
||||
def show_wsdl() -> None:
|
||||
"""Получает и выводит WSDL-описание API."""
|
||||
resp = requests.get(f"{BASE_URL}/api/wsdl", timeout=30)
|
||||
print_response(resp)
|
||||
|
||||
|
||||
def menu() -> None:
|
||||
"""Запускает интерактивное меню CLI и обрабатывает выбор пользователя."""
|
||||
actions = {
|
||||
"1": ("Список объектов", list_calls),
|
||||
"2": ("Один объект по ID", get_call),
|
||||
"3": ("Добавить объект", create_call),
|
||||
"4": ("Изменить объект", update_call),
|
||||
"5": ("Удалить объект", delete_call),
|
||||
"6": ("Общее число обращений в час", stats_by_hour),
|
||||
"7": ("Показать WSDL", show_wsdl),
|
||||
"0": ("Выход", None),
|
||||
}
|
||||
|
||||
while True:
|
||||
print("\n=== CLI для API LR3 ===")
|
||||
for key, (name, _) in actions.items():
|
||||
print(f"{key}. {name}")
|
||||
|
||||
choice = input("Выберите метод: ").strip()
|
||||
action = actions.get(choice)
|
||||
|
||||
if not action:
|
||||
print("Неизвестный пункт меню")
|
||||
continue
|
||||
|
||||
if choice == "0":
|
||||
print("Завершение работы")
|
||||
break
|
||||
|
||||
try:
|
||||
action[1]()
|
||||
except requests.RequestException as exc:
|
||||
print(f"Ошибка запроса: {exc}")
|
||||
except ValueError as exc:
|
||||
print(f"Ошибка ввода: {exc}")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
menu()
|
||||
@@ -1,300 +0,0 @@
|
||||
import sqlite3
|
||||
from pathlib import Path
|
||||
from xml.etree.ElementTree import Element, SubElement, tostring
|
||||
|
||||
from flask import Flask, Response, jsonify, request
|
||||
|
||||
BASE_DIR = Path(__file__).resolve().parent.parent
|
||||
DB_PATH = BASE_DIR / "data" / "calls.db"
|
||||
|
||||
app = Flask(__name__)
|
||||
|
||||
|
||||
ALLOWED_FIELDS = ("lat", "lng", "title", "timeStamp", "town", "hour")
|
||||
|
||||
|
||||
def parse_positive_int(raw_value: str, field_name: str) -> tuple[int | None, str | None]:
|
||||
"""Преобразует строку в положительное целое число или возвращает текст ошибки."""
|
||||
try:
|
||||
value = int(raw_value)
|
||||
except (TypeError, ValueError):
|
||||
return None, f"{field_name} должен быть целым числом"
|
||||
|
||||
if value <= 0:
|
||||
return None, f"{field_name} должен быть положительным целым числом"
|
||||
|
||||
return value, None
|
||||
|
||||
|
||||
def get_db_connection() -> sqlite3.Connection:
|
||||
"""Создает и возвращает подключение к SQLite с доступом к колонкам по имени."""
|
||||
conn = sqlite3.connect(DB_PATH)
|
||||
conn.row_factory = sqlite3.Row
|
||||
return conn
|
||||
|
||||
|
||||
def wants_wsdl() -> bool:
|
||||
"""Проверяет, запросил ли клиент XML/WSDL-формат через query-параметр format."""
|
||||
return request.args.get("format", "json").lower() == "wsdl"
|
||||
|
||||
|
||||
def dict_to_xml(payload: dict) -> bytes:
|
||||
"""Преобразует словарь (включая вложенные dict/list) в XML-документ."""
|
||||
root = Element("response")
|
||||
|
||||
for key, value in payload.items():
|
||||
if isinstance(value, dict):
|
||||
obj_node = SubElement(root, str(key))
|
||||
for child_key, child_value in value.items():
|
||||
child = SubElement(obj_node, str(child_key))
|
||||
child.text = "" if child_value is None else str(child_value)
|
||||
continue
|
||||
|
||||
if isinstance(value, list):
|
||||
list_node = SubElement(root, str(key))
|
||||
for item in value:
|
||||
item_node = SubElement(list_node, "item")
|
||||
if isinstance(item, dict):
|
||||
for item_key, item_value in item.items():
|
||||
child = SubElement(item_node, str(item_key))
|
||||
child.text = "" if item_value is None else str(item_value)
|
||||
else:
|
||||
item_node.text = "" if item is None else str(item)
|
||||
continue
|
||||
|
||||
node = SubElement(root, str(key))
|
||||
node.text = "" if value is None else str(value)
|
||||
|
||||
return tostring(root, encoding="utf-8", xml_declaration=True)
|
||||
|
||||
|
||||
def format_response(payload: dict, status: int = 200) -> Response:
|
||||
"""Формирует ответ API: XML при format=wsdl, иначе JSON."""
|
||||
if wants_wsdl():
|
||||
xml_payload = dict_to_xml(payload)
|
||||
return Response(xml_payload, status=status, mimetype="application/wsdl+xml")
|
||||
resp = jsonify(payload)
|
||||
resp.status_code = status
|
||||
return resp
|
||||
|
||||
|
||||
def fetch_call_by_id(conn: sqlite3.Connection, call_id: int):
|
||||
"""Возвращает запись calls по rowid или None, если запись не найдена."""
|
||||
query = """
|
||||
SELECT rowid AS id, lat, lng, title, timeStamp, town, hour
|
||||
FROM calls
|
||||
WHERE rowid = ?
|
||||
"""
|
||||
return conn.execute(query, (call_id,)).fetchone()
|
||||
|
||||
|
||||
def parse_payload() -> tuple[dict, str | None]:
|
||||
"""Читает JSON-тело запроса, валидирует и оставляет только разрешенные поля."""
|
||||
if not request.is_json:
|
||||
return {}, "Body должен быть в формате JSON"
|
||||
|
||||
payload = request.get_json(silent=True)
|
||||
if not isinstance(payload, dict):
|
||||
return {}, "Некорректный JSON-объект"
|
||||
|
||||
filtered = {k: payload[k] for k in ALLOWED_FIELDS if k in payload}
|
||||
if not filtered:
|
||||
return {}, "Не переданы поля для записи"
|
||||
|
||||
return filtered, None
|
||||
|
||||
|
||||
@app.get("/api/calls")
|
||||
def list_calls() -> Response:
|
||||
"""Возвращает пагинированный список объектов calls."""
|
||||
page = max(request.args.get("page", default=1, type=int), 1)
|
||||
per_page = min(max(request.args.get("per_page", default=20, type=int), 1), 100)
|
||||
offset = (page - 1) * per_page
|
||||
|
||||
conn = get_db_connection()
|
||||
total = conn.execute("SELECT COUNT(*) AS total FROM calls").fetchone()["total"]
|
||||
rows = conn.execute(
|
||||
"""
|
||||
SELECT rowid AS id, lat, lng, title, timeStamp, town, hour
|
||||
FROM calls
|
||||
ORDER BY rowid
|
||||
LIMIT ? OFFSET ?
|
||||
""",
|
||||
(per_page, offset),
|
||||
).fetchall()
|
||||
conn.close()
|
||||
|
||||
payload = {
|
||||
"page": page,
|
||||
"per_page": per_page,
|
||||
"total": total,
|
||||
"items": [dict(row) for row in rows],
|
||||
}
|
||||
return format_response(payload)
|
||||
|
||||
|
||||
@app.get("/api/calls/<int:call_id>")
|
||||
def get_call(call_id: int) -> Response:
|
||||
"""Возвращает один объект calls по его идентификатору."""
|
||||
if call_id <= 0:
|
||||
return format_response({"error": "id должен быть положительным целым числом"}, status=400)
|
||||
|
||||
conn = get_db_connection()
|
||||
row = fetch_call_by_id(conn, call_id)
|
||||
conn.close()
|
||||
|
||||
if row is None:
|
||||
return format_response({"error": "Объект не найден"}, status=404)
|
||||
|
||||
return format_response({"item": dict(row)})
|
||||
|
||||
|
||||
@app.post("/api/calls")
|
||||
def create_call() -> Response:
|
||||
"""Создает новый объект calls из данных JSON-тела запроса."""
|
||||
payload, error = parse_payload()
|
||||
if error:
|
||||
return format_response({"error": error}, status=400)
|
||||
|
||||
columns = ", ".join(payload.keys())
|
||||
placeholders = ", ".join(["?"] * len(payload))
|
||||
|
||||
conn = get_db_connection()
|
||||
cur = conn.execute(
|
||||
f"INSERT INTO calls ({columns}) VALUES ({placeholders})",
|
||||
tuple(payload.values()),
|
||||
)
|
||||
conn.commit()
|
||||
created_id = cur.lastrowid
|
||||
if created_id is None:
|
||||
conn.close()
|
||||
return format_response({"error": "Не удалось создать объект"}, status=500)
|
||||
|
||||
created_row = fetch_call_by_id(conn, int(created_id))
|
||||
conn.close()
|
||||
if created_row is None:
|
||||
return format_response(
|
||||
{"error": "Не удалось получить созданный объект"}, status=500
|
||||
)
|
||||
|
||||
return format_response({"item": dict(created_row)}, status=201)
|
||||
|
||||
|
||||
@app.put("/api/calls/<int:call_id>")
|
||||
def update_call(call_id: int) -> Response:
|
||||
"""Обновляет существующий объект calls по id частичным набором полей."""
|
||||
if call_id <= 0:
|
||||
return format_response({"error": "id должен быть положительным целым числом"}, status=400)
|
||||
|
||||
payload, error = parse_payload()
|
||||
if error:
|
||||
return format_response({"error": error}, status=400)
|
||||
|
||||
assignments = ", ".join([f"{key} = ?" for key in payload.keys()])
|
||||
values = tuple(payload.values()) + (call_id,)
|
||||
|
||||
conn = get_db_connection()
|
||||
exists = fetch_call_by_id(conn, call_id)
|
||||
if exists is None:
|
||||
conn.close()
|
||||
return format_response({"error": "Объект не найден"}, status=404)
|
||||
|
||||
conn.execute(f"UPDATE calls SET {assignments} WHERE rowid = ?", values)
|
||||
conn.commit()
|
||||
updated_row = fetch_call_by_id(conn, call_id)
|
||||
conn.close()
|
||||
if updated_row is None:
|
||||
return format_response(
|
||||
{"error": "Не удалось получить обновленный объект"}, status=500
|
||||
)
|
||||
|
||||
return format_response({"item": dict(updated_row)})
|
||||
|
||||
|
||||
@app.delete("/api/calls/<int:call_id>")
|
||||
def delete_call(call_id: int) -> Response:
|
||||
"""Удаляет объект calls по id и возвращает статус операции."""
|
||||
if call_id <= 0:
|
||||
return format_response({"error": "id должен быть положительным целым числом"}, status=400)
|
||||
|
||||
conn = get_db_connection()
|
||||
exists = fetch_call_by_id(conn, call_id)
|
||||
if exists is None:
|
||||
conn.close()
|
||||
return format_response({"error": "Объект не найден"}, status=404)
|
||||
|
||||
conn.execute("DELETE FROM calls WHERE rowid = ?", (call_id,))
|
||||
conn.commit()
|
||||
conn.close()
|
||||
|
||||
return format_response({"message": f"Объект {call_id} удален"})
|
||||
|
||||
|
||||
@app.get("/api/stats/hour/<int:hour>")
|
||||
def stats_by_hour(hour: int) -> Response:
|
||||
"""Возвращает количество обращений в таблице calls для заданного часа (0-23)."""
|
||||
if hour < 0 or hour > 23:
|
||||
return format_response({"error": "Час должен быть от 0 до 23"}, status=400)
|
||||
|
||||
conn = get_db_connection()
|
||||
total = conn.execute(
|
||||
"SELECT COUNT(*) AS total FROM calls WHERE hour = ?", (hour,)
|
||||
).fetchone()["total"]
|
||||
conn.close()
|
||||
|
||||
payload = {
|
||||
"hour": hour,
|
||||
"total_calls": total,
|
||||
}
|
||||
return format_response(payload)
|
||||
|
||||
|
||||
@app.route("/api/calls/<call_id>", methods=["GET", "PUT", "DELETE"])
|
||||
def invalid_call_id(call_id: str) -> Response:
|
||||
"""Возвращает понятную ошибку, если id в URL не является корректным числом."""
|
||||
_, error = parse_positive_int(call_id, "id")
|
||||
if error:
|
||||
return format_response({"error": error}, status=400)
|
||||
return format_response({"error": "Некорректный запрос"}, status=400)
|
||||
|
||||
|
||||
@app.get("/api/stats/hour/<hour>")
|
||||
def invalid_hour(hour: str) -> Response:
|
||||
"""Возвращает понятную ошибку, если hour в URL задан некорректно."""
|
||||
try:
|
||||
parsed_hour = int(hour)
|
||||
except (TypeError, ValueError):
|
||||
return format_response({"error": "Час должен быть целым числом"}, status=400)
|
||||
|
||||
if parsed_hour < 0 or parsed_hour > 23:
|
||||
return format_response({"error": "Час должен быть от 0 до 23"}, status=400)
|
||||
|
||||
return format_response({"error": "Некорректный запрос"}, status=400)
|
||||
|
||||
|
||||
@app.get("/api/wsdl")
|
||||
def wsdl_description() -> Response:
|
||||
"""Отдает статическое WSDL-описание доступных операций сервиса."""
|
||||
wsdl = """<?xml version=\"1.0\" encoding=\"UTF-8\"?>
|
||||
<definitions name=\"CallsService\"
|
||||
targetNamespace=\"http://localhost:5000/calls\"
|
||||
xmlns:tns=\"http://localhost:5000/calls\"
|
||||
xmlns=\"http://schemas.xmlsoap.org/wsdl/\">
|
||||
<service name=\"CallsService\">
|
||||
<documentation>REST API для сущности calls из LR2.</documentation>
|
||||
</service>
|
||||
<portType name=\"CallsPortType\">
|
||||
<operation name=\"listCalls\" />
|
||||
<operation name=\"getCall\" />
|
||||
<operation name=\"createCall\" />
|
||||
<operation name=\"updateCall\" />
|
||||
<operation name=\"deleteCall\" />
|
||||
<operation name=\"statsByHour\" />
|
||||
</portType>
|
||||
</definitions>
|
||||
"""
|
||||
return Response(wsdl, mimetype="application/wsdl+xml")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
app.run(debug=True)
|
||||
Binary file not shown.
@@ -1,70 +0,0 @@
|
||||
# LR3: REST API на Flask
|
||||
|
||||
Реализация находится в папке `LR3`:
|
||||
|
||||
- `LR3/irfm_lr3.py` - Flask REST API для таблицы `calls` из `data/calls.db`
|
||||
- `LR3/cli_client.py` - CLI-клиент для ручного взаимодействия с API
|
||||
|
||||
## Возможности API
|
||||
|
||||
1. Получение списка объектов с пагинацией: `GET /api/calls?page=1&per_page=20`
|
||||
2. Получение одного объекта по ключу (ID = `rowid`): `GET /api/calls/<id>`
|
||||
3. Добавление объекта: `POST /api/calls`
|
||||
4. Редактирование объекта: `PUT /api/calls/<id>`
|
||||
5. Удаление объекта: `DELETE /api/calls/<id>`
|
||||
6. Дополнительный метод (общее число обращений за час): `GET /api/stats/hour/<hour>`
|
||||
|
||||
Формат ответа:
|
||||
|
||||
- JSON (по умолчанию)
|
||||
- WSDL/XML: передайте `?format=wsdl` (или `Accept: application/wsdl+xml`)
|
||||
- Отдельное описание WSDL: `GET /api/wsdl`
|
||||
|
||||
## Запуск
|
||||
|
||||
```bash
|
||||
uv sync
|
||||
uv run python LR3/irfm_lr3.py
|
||||
```
|
||||
|
||||
Сервер поднимется на `http://127.0.0.1:5000`.
|
||||
|
||||
## Запуск CLI
|
||||
|
||||
В отдельном терминале (при запущенном сервере):
|
||||
|
||||
```bash
|
||||
uv run python LR3/cli_client.py
|
||||
```
|
||||
|
||||
CLI позволяет вручную выбрать метод API, указать входные данные и формат ответа.
|
||||
|
||||
## Docker (для передачи коллеге)
|
||||
|
||||
Собрать образ из корня проекта:
|
||||
|
||||
```bash
|
||||
docker build -t irfm-lr3-api .
|
||||
```
|
||||
|
||||
Запустить контейнер:
|
||||
|
||||
```bash
|
||||
docker run --rm -p 5000:5000 irfm-lr3-api
|
||||
```
|
||||
|
||||
API будет доступен по адресу `http://localhost:5000`.
|
||||
|
||||
Проверка:
|
||||
|
||||
```bash
|
||||
curl http://localhost:5000/api/calls?page=1&per_page=3
|
||||
```
|
||||
|
||||
Важно: база `data/calls.db` копируется внутрь образа на этапе сборки. Если нужно сохранять изменения между перезапусками контейнера, можно примонтировать внешний файл базы:
|
||||
|
||||
```bash
|
||||
docker run --rm -p 5000:5000 \
|
||||
-v $(pwd)/data/calls.db:/app/data/calls.db \
|
||||
irfm-lr3-api
|
||||
```
|
||||
@@ -1,6 +0,0 @@
|
||||
def main():
|
||||
print("Hello from irfm!")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -1,17 +0,0 @@
|
||||
[project]
|
||||
name = "irfm"
|
||||
version = "0.1.0"
|
||||
description = "Add your description here"
|
||||
readme = "README.md"
|
||||
requires-python = ">=3.12"
|
||||
dependencies = [
|
||||
"flask>=3.1.2",
|
||||
"jupyterlab>=4.5.6",
|
||||
"kagglehub>=1.0.0",
|
||||
"matplotlib>=3.10.8",
|
||||
"numpy>=2.4.4",
|
||||
"pandas>=3.0.2",
|
||||
"requests>=2.32.5",
|
||||
"scipy>=1.17.1",
|
||||
"seaborn>=0.13.2",
|
||||
]
|
||||
Generated
-2141
File diff suppressed because it is too large
Load Diff
@@ -1,223 +0,0 @@
|
||||
<mxfile host="Electron" agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/29.6.6 Chrome/144.0.7559.236 Electron/40.8.4 Safari/537.36" version="29.6.6">
|
||||
<diagram name="Страница-1" id="ZezJyX5oU3Hq0j9lJ0Or">
|
||||
<mxGraphModel dx="1554" dy="626" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
|
||||
<root>
|
||||
<mxCell id="0" />
|
||||
<mxCell id="1" parent="0" />
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-5" edge="1" parent="1" source="u2X0bofjWXizP0d6YU9M-1" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="u2X0bofjWXizP0d6YU9M-2">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-6" edge="1" parent="1" source="u2X0bofjWXizP0d6YU9M-1" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="u2X0bofjWXizP0d6YU9M-4">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-7" edge="1" parent="1" source="u2X0bofjWXizP0d6YU9M-1" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" target="u2X0bofjWXizP0d6YU9M-3">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-1" parent="1" style="rounded=1;whiteSpace=wrap;html=1;" value="Выбор технологии для backend-разработки" vertex="1">
|
||||
<mxGeometry height="40" width="320" x="280" y="40" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-2" parent="1" style="rounded=1;whiteSpace=wrap;html=1;" value="Экономика разработки" vertex="1">
|
||||
<mxGeometry height="80" width="160" x="160" y="120" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-3" parent="1" style="rounded=1;whiteSpace=wrap;html=1;" value="Технические характеристики" vertex="1">
|
||||
<mxGeometry height="80" width="160" x="360" y="120" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-4" parent="1" style="rounded=1;whiteSpace=wrap;html=1;" value="Риски и устойчивость" vertex="1">
|
||||
<mxGeometry height="80" width="160" x="560" y="120" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-8" parent="1" style="rounded=1;whiteSpace=wrap;html=1;" value="Время разработки" vertex="1">
|
||||
<mxGeometry height="80" width="120" x="140" y="280" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-9" parent="1" style="rounded=1;whiteSpace=wrap;html=1;" value="<font style="font-size: 11px;">Производительность&nbsp;</font>" vertex="1">
|
||||
<mxGeometry height="80" width="120" x="300" y="280" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-10" parent="1" style="rounded=1;whiteSpace=wrap;html=1;" value="Зрелость экосистемы" vertex="1">
|
||||
<mxGeometry height="80" width="120" x="460" y="280" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-12" parent="1" style="rounded=1;whiteSpace=wrap;html=1;" value="Стабильность в продакшене" vertex="1">
|
||||
<mxGeometry height="80" width="120" x="620" y="280" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-19" edge="1" parent="1" source="u2X0bofjWXizP0d6YU9M-3" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="u2X0bofjWXizP0d6YU9M-9" value="">
|
||||
<mxGeometry height="50" relative="1" width="50" as="geometry">
|
||||
<mxPoint x="430" y="330" as="sourcePoint" />
|
||||
<mxPoint x="480" y="280" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-20" edge="1" parent="1" source="u2X0bofjWXizP0d6YU9M-3" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="u2X0bofjWXizP0d6YU9M-10" value="">
|
||||
<mxGeometry height="50" relative="1" width="50" as="geometry">
|
||||
<mxPoint x="630" y="290" as="sourcePoint" />
|
||||
<mxPoint x="550" y="370" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-21" edge="1" parent="1" source="u2X0bofjWXizP0d6YU9M-3" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="u2X0bofjWXizP0d6YU9M-12" value="">
|
||||
<mxGeometry height="50" relative="1" width="50" as="geometry">
|
||||
<mxPoint x="660" y="240" as="sourcePoint" />
|
||||
<mxPoint x="580" y="320" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-22" edge="1" parent="1" style="endArrow=classic;html=1;rounded=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="u2X0bofjWXizP0d6YU9M-8" value="">
|
||||
<mxGeometry height="50" relative="1" width="50" as="geometry">
|
||||
<mxPoint x="440" y="200" as="sourcePoint" />
|
||||
<mxPoint x="680" y="320" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-23" edge="1" parent="1" source="u2X0bofjWXizP0d6YU9M-4" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.75;entryY=0;entryDx=0;entryDy=0;" target="u2X0bofjWXizP0d6YU9M-12" value="">
|
||||
<mxGeometry height="50" relative="1" width="50" as="geometry">
|
||||
<mxPoint x="800" y="220" as="sourcePoint" />
|
||||
<mxPoint x="720" y="300" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-24" edge="1" parent="1" source="u2X0bofjWXizP0d6YU9M-4" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.75;entryY=0;entryDx=0;entryDy=0;" target="u2X0bofjWXizP0d6YU9M-10" value="">
|
||||
<mxGeometry height="50" relative="1" width="50" as="geometry">
|
||||
<mxPoint x="840" y="260" as="sourcePoint" />
|
||||
<mxPoint x="760" y="340" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-25" edge="1" parent="1" style="endArrow=classic;html=1;rounded=0;entryX=0.75;entryY=0;entryDx=0;entryDy=0;" target="u2X0bofjWXizP0d6YU9M-9" value="">
|
||||
<mxGeometry height="50" relative="1" width="50" as="geometry">
|
||||
<mxPoint x="640" y="200" as="sourcePoint" />
|
||||
<mxPoint x="790" y="300" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-26" edge="1" parent="1" style="endArrow=classic;html=1;rounded=0;entryX=0.75;entryY=0;entryDx=0;entryDy=0;" target="u2X0bofjWXizP0d6YU9M-8" value="">
|
||||
<mxGeometry height="50" relative="1" width="50" as="geometry">
|
||||
<mxPoint x="640" y="200" as="sourcePoint" />
|
||||
<mxPoint x="610" y="480" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-27" edge="1" parent="1" source="u2X0bofjWXizP0d6YU9M-2" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.25;entryY=0;entryDx=0;entryDy=0;" target="u2X0bofjWXizP0d6YU9M-8" value="">
|
||||
<mxGeometry height="50" relative="1" width="50" as="geometry">
|
||||
<mxPoint x="630" y="410" as="sourcePoint" />
|
||||
<mxPoint x="550" y="490" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-28" edge="1" parent="1" style="endArrow=classic;html=1;rounded=0;entryX=0.25;entryY=0;entryDx=0;entryDy=0;" target="u2X0bofjWXizP0d6YU9M-9" value="">
|
||||
<mxGeometry height="50" relative="1" width="50" as="geometry">
|
||||
<mxPoint x="240" y="200" as="sourcePoint" />
|
||||
<mxPoint x="320" y="490" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-29" edge="1" parent="1" style="endArrow=classic;html=1;rounded=0;entryX=0.25;entryY=0;entryDx=0;entryDy=0;" target="u2X0bofjWXizP0d6YU9M-10" value="">
|
||||
<mxGeometry height="50" relative="1" width="50" as="geometry">
|
||||
<mxPoint x="240" y="200" as="sourcePoint" />
|
||||
<mxPoint x="460" y="520" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-30" edge="1" parent="1" style="endArrow=classic;html=1;rounded=0;entryX=0.25;entryY=0;entryDx=0;entryDy=0;" target="u2X0bofjWXizP0d6YU9M-12" value="">
|
||||
<mxGeometry height="50" relative="1" width="50" as="geometry">
|
||||
<mxPoint x="240" y="200" as="sourcePoint" />
|
||||
<mxPoint x="550" y="520" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-31" parent="1" style="rounded=1;whiteSpace=wrap;html=1;" value="Python (FastAPI)" vertex="1">
|
||||
<mxGeometry height="80" width="120" x="140" y="440" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-32" parent="1" style="rounded=1;whiteSpace=wrap;html=1;" value="Node.js (Nest/Express)" vertex="1">
|
||||
<mxGeometry height="80" width="120" x="300" y="440" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-33" parent="1" style="rounded=1;whiteSpace=wrap;html=1;" value="Java (Spring)" vertex="1">
|
||||
<mxGeometry height="80" width="120" x="460" y="440" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-34" parent="1" style="rounded=1;whiteSpace=wrap;html=1;" value="Go" vertex="1">
|
||||
<mxGeometry height="80" width="120" x="620" y="440" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-36" edge="1" parent="1" source="u2X0bofjWXizP0d6YU9M-8" style="endArrow=classic;html=1;rounded=0;entryX=0.25;entryY=0;entryDx=0;entryDy=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" target="u2X0bofjWXizP0d6YU9M-31" value="">
|
||||
<mxGeometry height="50" relative="1" width="50" as="geometry">
|
||||
<mxPoint x="210" y="420" as="sourcePoint" />
|
||||
<mxPoint x="480" y="280" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-38" edge="1" parent="1" source="u2X0bofjWXizP0d6YU9M-8" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.25;entryY=0;entryDx=0;entryDy=0;" target="u2X0bofjWXizP0d6YU9M-32" value="">
|
||||
<mxGeometry height="50" relative="1" width="50" as="geometry">
|
||||
<mxPoint x="430" y="330" as="sourcePoint" />
|
||||
<mxPoint x="480" y="280" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-39" edge="1" parent="1" style="endArrow=classic;html=1;rounded=0;entryX=0.25;entryY=0;entryDx=0;entryDy=0;" target="u2X0bofjWXizP0d6YU9M-33" value="">
|
||||
<mxGeometry height="50" relative="1" width="50" as="geometry">
|
||||
<mxPoint x="200" y="360" as="sourcePoint" />
|
||||
<mxPoint x="310" y="490" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-40" edge="1" parent="1" source="u2X0bofjWXizP0d6YU9M-8" style="endArrow=classic;html=1;rounded=0;entryX=0.25;entryY=0;entryDx=0;entryDy=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" target="u2X0bofjWXizP0d6YU9M-34" value="">
|
||||
<mxGeometry height="50" relative="1" width="50" as="geometry">
|
||||
<mxPoint x="500" y="440" as="sourcePoint" />
|
||||
<mxPoint x="470" y="520" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-41" edge="1" parent="1" source="u2X0bofjWXizP0d6YU9M-9" style="endArrow=classic;html=1;rounded=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" target="u2X0bofjWXizP0d6YU9M-31" value="">
|
||||
<mxGeometry height="50" relative="1" width="50" as="geometry">
|
||||
<mxPoint x="790" y="400" as="sourcePoint" />
|
||||
<mxPoint x="760" y="480" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-42" edge="1" parent="1" source="u2X0bofjWXizP0d6YU9M-9" style="endArrow=classic;html=1;rounded=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" target="u2X0bofjWXizP0d6YU9M-32" value="">
|
||||
<mxGeometry height="50" relative="1" width="50" as="geometry">
|
||||
<mxPoint x="400" y="430" as="sourcePoint" />
|
||||
<mxPoint x="370" y="510" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-43" edge="1" parent="1" source="u2X0bofjWXizP0d6YU9M-9" style="endArrow=classic;html=1;rounded=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" target="u2X0bofjWXizP0d6YU9M-33" value="">
|
||||
<mxGeometry height="50" relative="1" width="50" as="geometry">
|
||||
<mxPoint x="560" y="380" as="sourcePoint" />
|
||||
<mxPoint x="530" y="460" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-44" edge="1" parent="1" style="endArrow=classic;html=1;rounded=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="u2X0bofjWXizP0d6YU9M-34" value="">
|
||||
<mxGeometry height="50" relative="1" width="50" as="geometry">
|
||||
<mxPoint x="360" y="360" as="sourcePoint" />
|
||||
<mxPoint x="530" y="430" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-45" edge="1" parent="1" source="u2X0bofjWXizP0d6YU9M-10" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" value="">
|
||||
<mxGeometry height="50" relative="1" width="50" as="geometry">
|
||||
<mxPoint x="750" y="380" as="sourcePoint" />
|
||||
<mxPoint x="680" y="440" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-46" edge="1" parent="1" source="u2X0bofjWXizP0d6YU9M-10" style="endArrow=classic;html=1;rounded=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" target="u2X0bofjWXizP0d6YU9M-33" value="">
|
||||
<mxGeometry height="50" relative="1" width="50" as="geometry">
|
||||
<mxPoint x="800" y="390" as="sourcePoint" />
|
||||
<mxPoint x="770" y="470" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-47" edge="1" parent="1" source="u2X0bofjWXizP0d6YU9M-10" style="endArrow=classic;html=1;rounded=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" target="u2X0bofjWXizP0d6YU9M-32" value="">
|
||||
<mxGeometry height="50" relative="1" width="50" as="geometry">
|
||||
<mxPoint x="630" y="400" as="sourcePoint" />
|
||||
<mxPoint x="600" y="480" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-48" edge="1" parent="1" source="u2X0bofjWXizP0d6YU9M-10" style="endArrow=classic;html=1;rounded=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" target="u2X0bofjWXizP0d6YU9M-31" value="">
|
||||
<mxGeometry height="50" relative="1" width="50" as="geometry">
|
||||
<mxPoint x="630" y="430" as="sourcePoint" />
|
||||
<mxPoint x="600" y="510" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-49" edge="1" parent="1" source="u2X0bofjWXizP0d6YU9M-12" style="endArrow=classic;html=1;rounded=0;entryX=0.75;entryY=0;entryDx=0;entryDy=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" target="u2X0bofjWXizP0d6YU9M-34" value="">
|
||||
<mxGeometry height="50" relative="1" width="50" as="geometry">
|
||||
<mxPoint x="590" y="430" as="sourcePoint" />
|
||||
<mxPoint x="560" y="510" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-50" edge="1" parent="1" style="endArrow=classic;html=1;rounded=0;entryX=0.75;entryY=0;entryDx=0;entryDy=0;" target="u2X0bofjWXizP0d6YU9M-33" value="">
|
||||
<mxGeometry height="50" relative="1" width="50" as="geometry">
|
||||
<mxPoint x="680" y="360" as="sourcePoint" />
|
||||
<mxPoint x="760" y="530" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-51" edge="1" parent="1" style="endArrow=classic;html=1;rounded=0;entryX=0.75;entryY=0;entryDx=0;entryDy=0;" target="u2X0bofjWXizP0d6YU9M-32" value="">
|
||||
<mxGeometry height="50" relative="1" width="50" as="geometry">
|
||||
<mxPoint x="680" y="360" as="sourcePoint" />
|
||||
<mxPoint x="620" y="530" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-53" edge="1" parent="1" style="endArrow=classic;html=1;rounded=0;entryX=0.75;entryY=0;entryDx=0;entryDy=0;" target="u2X0bofjWXizP0d6YU9M-31" value="">
|
||||
<mxGeometry height="50" relative="1" width="50" as="geometry">
|
||||
<mxPoint x="680" y="360" as="sourcePoint" />
|
||||
<mxPoint x="600" y="550" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
</root>
|
||||
</mxGraphModel>
|
||||
</diagram>
|
||||
</mxfile>
|
||||
Binary file not shown.
@@ -1,269 +0,0 @@
|
||||
<mxfile host="Electron" agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/29.6.6 Chrome/144.0.7559.236 Electron/40.8.4 Safari/537.36" version="29.6.6">
|
||||
<diagram name="Страница-1" id="ZezJyX5oU3Hq0j9lJ0Or">
|
||||
<mxGraphModel dx="991" dy="883" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
|
||||
<root>
|
||||
<mxCell id="0" />
|
||||
<mxCell id="1" parent="0" />
|
||||
<mxCell id="kfE8Fl9dejhre-8OG5cC-8" edge="1" parent="1" source="u2X0bofjWXizP0d6YU9M-2" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.25;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="Tm8-Nqc982zNK1wqos-Y-16">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="kfE8Fl9dejhre-8OG5cC-9" edge="1" parent="1" source="u2X0bofjWXizP0d6YU9M-2" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.25;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="Tm8-Nqc982zNK1wqos-Y-17">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<Array as="points">
|
||||
<mxPoint x="70" y="220" />
|
||||
<mxPoint x="170" y="220" />
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-2" parent="1" style="rounded=1;whiteSpace=wrap;html=1;" value="<b>C1 </b>— Идентификация и управление доступом " vertex="1">
|
||||
<mxGeometry height="80" width="160" x="30" y="120" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="kfE8Fl9dejhre-8OG5cC-10" edge="1" parent="1" source="u2X0bofjWXizP0d6YU9M-3" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.25;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="Tm8-Nqc982zNK1wqos-Y-18">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="kfE8Fl9dejhre-8OG5cC-11" edge="1" parent="1" source="u2X0bofjWXizP0d6YU9M-3" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="Tm8-Nqc982zNK1wqos-Y-19">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="kfE8Fl9dejhre-8OG5cC-12" edge="1" parent="1" source="u2X0bofjWXizP0d6YU9M-3" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.75;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="Tm8-Nqc982zNK1wqos-Y-20">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-3" parent="1" style="rounded=1;whiteSpace=wrap;html=1;" value="<b>C2 </b>— Техническая защита и инфраструктура" vertex="1">
|
||||
<mxGeometry height="80" width="160" x="340" y="120" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="kfE8Fl9dejhre-8OG5cC-13" edge="1" parent="1" source="u2X0bofjWXizP0d6YU9M-4" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.25;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="Tm8-Nqc982zNK1wqos-Y-21">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<Array as="points">
|
||||
<mxPoint x="680" y="210" />
|
||||
<mxPoint x="570" y="210" />
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="kfE8Fl9dejhre-8OG5cC-14" edge="1" parent="1" source="u2X0bofjWXizP0d6YU9M-4" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="Tm8-Nqc982zNK1wqos-Y-22">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<Array as="points">
|
||||
<mxPoint x="720" y="220" />
|
||||
<mxPoint x="670" y="220" />
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="kfE8Fl9dejhre-8OG5cC-15" edge="1" parent="1" source="u2X0bofjWXizP0d6YU9M-4" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.75;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="Tm8-Nqc982zNK1wqos-Y-23">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-4" parent="1" style="rounded=1;whiteSpace=wrap;html=1;" value="<b>C3 </b>— Мониторинг и реагирование " vertex="1">
|
||||
<mxGeometry height="80" width="160" x="640" y="120" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="kfE8Fl9dejhre-8OG5cC-16" edge="1" parent="1" source="Tm8-Nqc982zNK1wqos-Y-1" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.25;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="kfE8Fl9dejhre-8OG5cC-1">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="kfE8Fl9dejhre-8OG5cC-17" edge="1" parent="1" source="Tm8-Nqc982zNK1wqos-Y-1" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="kfE8Fl9dejhre-8OG5cC-2">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<Array as="points">
|
||||
<mxPoint x="1020" y="230" />
|
||||
<mxPoint x="966" y="230" />
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="kfE8Fl9dejhre-8OG5cC-18" edge="1" parent="1" source="Tm8-Nqc982zNK1wqos-Y-1" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.75;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="kfE8Fl9dejhre-8OG5cC-3">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="Tm8-Nqc982zNK1wqos-Y-1" parent="1" style="rounded=1;whiteSpace=wrap;html=1;" value="<b>C4 </b>— Организационные меры" vertex="1">
|
||||
<mxGeometry height="80" width="160" x="940" y="120" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="Tm8-Nqc982zNK1wqos-Y-6" edge="1" parent="1" source="Tm8-Nqc982zNK1wqos-Y-4" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" target="Tm8-Nqc982zNK1wqos-Y-1">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="Tm8-Nqc982zNK1wqos-Y-7" edge="1" parent="1" source="Tm8-Nqc982zNK1wqos-Y-4" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="u2X0bofjWXizP0d6YU9M-4">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="Tm8-Nqc982zNK1wqos-Y-8" edge="1" parent="1" source="Tm8-Nqc982zNK1wqos-Y-4" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="u2X0bofjWXizP0d6YU9M-3">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="Tm8-Nqc982zNK1wqos-Y-9" edge="1" parent="1" source="Tm8-Nqc982zNK1wqos-Y-4" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="u2X0bofjWXizP0d6YU9M-2">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="Tm8-Nqc982zNK1wqos-Y-4" parent="1" style="rounded=0;whiteSpace=wrap;html=1;" value="Оценка и выбор оптимального варианта обеспечения безопасности значимого объекта КИИ в соответствии с требованиями ФСТЭК №239" vertex="1">
|
||||
<mxGeometry height="60" width="320" x="420" y="20" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="kfE8Fl9dejhre-8OG5cC-30" edge="1" parent="1" source="Tm8-Nqc982zNK1wqos-Y-16" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="kfE8Fl9dejhre-8OG5cC-19">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="Tm8-Nqc982zNK1wqos-Y-16" parent="1" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;" value="<b><font>K1</font></b><div><font>Аутентификация</font></div>" vertex="1">
|
||||
<mxGeometry height="80" width="120" x="10" y="240" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="kfE8Fl9dejhre-8OG5cC-31" edge="1" parent="1" source="Tm8-Nqc982zNK1wqos-Y-17" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="kfE8Fl9dejhre-8OG5cC-20">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="Tm8-Nqc982zNK1wqos-Y-17" parent="1" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;" value="<b><font>K2</font></b><div><font>Разграничение доступа</font></div>" vertex="1">
|
||||
<mxGeometry height="80" width="120" x="110" y="280" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="kfE8Fl9dejhre-8OG5cC-32" edge="1" parent="1" source="Tm8-Nqc982zNK1wqos-Y-18" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="kfE8Fl9dejhre-8OG5cC-21">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="Tm8-Nqc982zNK1wqos-Y-18" parent="1" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;" value="<b><font>K3</font></b><div><font>Антивирусная защита</font></div>" vertex="1">
|
||||
<mxGeometry height="80" width="120" x="210" y="240" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="kfE8Fl9dejhre-8OG5cC-33" edge="1" parent="1" source="Tm8-Nqc982zNK1wqos-Y-19" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="kfE8Fl9dejhre-8OG5cC-22">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="Tm8-Nqc982zNK1wqos-Y-19" parent="1" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;" value="<b><font>K4</font></b><div>Защита сети</div>" vertex="1">
|
||||
<mxGeometry height="80" width="120" x="310" y="280" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="kfE8Fl9dejhre-8OG5cC-34" edge="1" parent="1" source="Tm8-Nqc982zNK1wqos-Y-20" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="kfE8Fl9dejhre-8OG5cC-23">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="Tm8-Nqc982zNK1wqos-Y-20" parent="1" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;" value="<b><font>K5</font></b><div>Контроль целостности</div>" vertex="1">
|
||||
<mxGeometry height="80" width="120" x="410" y="240" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="kfE8Fl9dejhre-8OG5cC-35" edge="1" parent="1" source="Tm8-Nqc982zNK1wqos-Y-21" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="kfE8Fl9dejhre-8OG5cC-24">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="Tm8-Nqc982zNK1wqos-Y-21" parent="1" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;" value="<b><font>K6</font></b><div>Журналирование</div>" vertex="1">
|
||||
<mxGeometry height="80" width="120" x="510" y="280" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="kfE8Fl9dejhre-8OG5cC-36" edge="1" parent="1" source="Tm8-Nqc982zNK1wqos-Y-22" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="kfE8Fl9dejhre-8OG5cC-25">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="Tm8-Nqc982zNK1wqos-Y-22" parent="1" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;" value="<b><font>K7</font></b><div><font>Обнаружение инцидентов</font></div>" vertex="1">
|
||||
<mxGeometry height="80" width="120" x="610" y="240" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="kfE8Fl9dejhre-8OG5cC-37" edge="1" parent="1" source="Tm8-Nqc982zNK1wqos-Y-23" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="kfE8Fl9dejhre-8OG5cC-26">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="Tm8-Nqc982zNK1wqos-Y-23" parent="1" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;strokeWidth=1;size=20;" value="<b>K8</b><div>Реагирование</div>" vertex="1">
|
||||
<mxGeometry height="80" width="117" x="710" y="280" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="kfE8Fl9dejhre-8OG5cC-38" edge="1" parent="1" source="kfE8Fl9dejhre-8OG5cC-1" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="kfE8Fl9dejhre-8OG5cC-27">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="kfE8Fl9dejhre-8OG5cC-1" parent="1" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;" value="<b><font>K9</font></b><div><font>Наличие регламентов</font></div>" vertex="1">
|
||||
<mxGeometry height="80" width="120" x="807" y="240" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="kfE8Fl9dejhre-8OG5cC-39" edge="1" parent="1" source="kfE8Fl9dejhre-8OG5cC-2" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="kfE8Fl9dejhre-8OG5cC-28">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="kfE8Fl9dejhre-8OG5cC-2" parent="1" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;strokeWidth=1;size=20;" value="<b>K10</b><div>Контроль выполнения</div>" vertex="1">
|
||||
<mxGeometry height="80" width="117" x="907" y="280" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="kfE8Fl9dejhre-8OG5cC-40" edge="1" parent="1" source="kfE8Fl9dejhre-8OG5cC-3" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="kfE8Fl9dejhre-8OG5cC-29">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="kfE8Fl9dejhre-8OG5cC-3" parent="1" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;" value="<b><font>K11</font></b><div><font>Назначение ответственных</font></div>" vertex="1">
|
||||
<mxGeometry height="80" width="120" x="1004" y="240" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="kfE8Fl9dejhre-8OG5cC-4" parent="1" style="shape=process;whiteSpace=wrap;html=1;backgroundOutline=1;" value="<b>A1</b><div>Минимальный уровень защиты (только обязательные меры)</div>" vertex="1">
|
||||
<mxGeometry height="80" width="160" x="30" y="560" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="kfE8Fl9dejhre-8OG5cC-5" parent="1" style="shape=process;whiteSpace=wrap;html=1;backgroundOutline=1;" value="<b>A2</b><div>Базовый уровень (частичная реализация)</div>" vertex="1">
|
||||
<mxGeometry height="80" width="160" x="340" y="560" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="kfE8Fl9dejhre-8OG5cC-6" parent="1" style="shape=process;whiteSpace=wrap;html=1;backgroundOutline=1;" value="<b>A3</b><div>Повышенный уровень (полная реализация требований)</div>" vertex="1">
|
||||
<mxGeometry height="80" width="160" x="640" y="560" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="kfE8Fl9dejhre-8OG5cC-7" parent="1" style="shape=process;whiteSpace=wrap;html=1;backgroundOutline=1;" value="<b>A4</b><div>Максимальный уровень (расширенная защита + мониторинг)</div>" vertex="1">
|
||||
<mxGeometry height="80" width="160" x="940" y="560" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="kfE8Fl9dejhre-8OG5cC-65" edge="1" parent="1" source="kfE8Fl9dejhre-8OG5cC-19" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="kfE8Fl9dejhre-8OG5cC-7">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="kfE8Fl9dejhre-8OG5cC-72" edge="1" parent="1" source="kfE8Fl9dejhre-8OG5cC-19" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="kfE8Fl9dejhre-8OG5cC-4">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="kfE8Fl9dejhre-8OG5cC-19" parent="1" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;" value="<b><font>M1</font></b><div>% пользователей с MFA</div>" vertex="1">
|
||||
<mxGeometry height="80" width="120" x="10" y="360" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="kfE8Fl9dejhre-8OG5cC-64" edge="1" parent="1" source="kfE8Fl9dejhre-8OG5cC-20" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="kfE8Fl9dejhre-8OG5cC-7">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="kfE8Fl9dejhre-8OG5cC-73" edge="1" parent="1" source="kfE8Fl9dejhre-8OG5cC-20" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="kfE8Fl9dejhre-8OG5cC-4">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="kfE8Fl9dejhre-8OG5cC-20" parent="1" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;" value="<b><font>M2</font></b><div><font>% корректно настроенных</font></div><div><font>прав</font></div>" vertex="1">
|
||||
<mxGeometry height="80" width="120" x="110" y="400" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="kfE8Fl9dejhre-8OG5cC-63" edge="1" parent="1" source="kfE8Fl9dejhre-8OG5cC-21" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<mxPoint x="1020" y="560" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="kfE8Fl9dejhre-8OG5cC-74" edge="1" parent="1" source="kfE8Fl9dejhre-8OG5cC-21" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<mxPoint x="110" y="560" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="kfE8Fl9dejhre-8OG5cC-21" parent="1" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;" value="<b><font>M3</font></b><div><font>% покрытых</font></div><div><font>узлов</font></div>" vertex="1">
|
||||
<mxGeometry height="80" width="120" x="210" y="360" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="kfE8Fl9dejhre-8OG5cC-62" edge="1" parent="1" source="kfE8Fl9dejhre-8OG5cC-22" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<mxPoint x="1020" y="560" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="kfE8Fl9dejhre-8OG5cC-75" edge="1" parent="1" source="kfE8Fl9dejhre-8OG5cC-22" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<mxPoint x="110" y="560" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="kfE8Fl9dejhre-8OG5cC-22" parent="1" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;" value="<b><font>M4</font></b><div>% сегментированных узлов</div>" vertex="1">
|
||||
<mxGeometry height="80" width="120" x="310" y="400" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="kfE8Fl9dejhre-8OG5cC-61" edge="1" parent="1" source="kfE8Fl9dejhre-8OG5cC-23" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="kfE8Fl9dejhre-8OG5cC-7">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="kfE8Fl9dejhre-8OG5cC-67" edge="1" parent="1" source="kfE8Fl9dejhre-8OG5cC-23" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="kfE8Fl9dejhre-8OG5cC-5">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="kfE8Fl9dejhre-8OG5cC-77" edge="1" parent="1" source="kfE8Fl9dejhre-8OG5cC-23" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="kfE8Fl9dejhre-8OG5cC-5">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="kfE8Fl9dejhre-8OG5cC-23" parent="1" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;" value="<b><font>M5</font></b><div>% контролируемых файлов</div>" vertex="1">
|
||||
<mxGeometry height="80" width="120" x="410" y="360" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="kfE8Fl9dejhre-8OG5cC-60" edge="1" parent="1" source="kfE8Fl9dejhre-8OG5cC-24" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="kfE8Fl9dejhre-8OG5cC-7">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="kfE8Fl9dejhre-8OG5cC-24" parent="1" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;" value="<b><font>M6</font></b><div>% систем с логированием</div>" vertex="1">
|
||||
<mxGeometry height="80" width="120" x="510" y="400" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="kfE8Fl9dejhre-8OG5cC-59" edge="1" parent="1" source="kfE8Fl9dejhre-8OG5cC-25" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<mxPoint x="1020" y="560" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="kfE8Fl9dejhre-8OG5cC-25" parent="1" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;" value="<b><font>M7</font></b><div>&nbsp;среднее</div><div>&nbsp;время</div><div>&nbsp;обнаружения</div><div>(мин)</div>" vertex="1">
|
||||
<mxGeometry height="80" width="120" x="610" y="360" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="kfE8Fl9dejhre-8OG5cC-58" edge="1" parent="1" source="kfE8Fl9dejhre-8OG5cC-26" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<mxPoint x="1020" y="560" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="kfE8Fl9dejhre-8OG5cC-66" edge="1" parent="1" source="kfE8Fl9dejhre-8OG5cC-26" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="kfE8Fl9dejhre-8OG5cC-6">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="kfE8Fl9dejhre-8OG5cC-26" parent="1" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;strokeWidth=1;size=20;" value="<b>M8</b><div>среднее время реакции (мин)</div>" vertex="1">
|
||||
<mxGeometry height="80" width="117" x="710" y="400" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="kfE8Fl9dejhre-8OG5cC-57" edge="1" parent="1" source="kfE8Fl9dejhre-8OG5cC-27" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="kfE8Fl9dejhre-8OG5cC-7">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="kfE8Fl9dejhre-8OG5cC-27" parent="1" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;" value="<b><font>M9</font></b><div>% реализованных документов</div>" vertex="1">
|
||||
<mxGeometry height="80" width="120" x="807" y="360" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="kfE8Fl9dejhre-8OG5cC-56" edge="1" parent="1" source="kfE8Fl9dejhre-8OG5cC-28" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<mxPoint x="1020" y="560" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="kfE8Fl9dejhre-8OG5cC-28" parent="1" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;strokeWidth=1;size=20;" value="<b>M10</b><div>% проверенных процессов</div>" vertex="1">
|
||||
<mxGeometry height="80" width="117" x="907" y="400" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="kfE8Fl9dejhre-8OG5cC-55" edge="1" parent="1" source="kfE8Fl9dejhre-8OG5cC-29" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="kfE8Fl9dejhre-8OG5cC-7">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="kfE8Fl9dejhre-8OG5cC-29" parent="1" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;" value="<b><font>M11</font></b><div>% назначенных ролей</div>" vertex="1">
|
||||
<mxGeometry height="80" width="120" x="1004" y="360" as="geometry" />
|
||||
</mxCell>
|
||||
</root>
|
||||
</mxGraphModel>
|
||||
</diagram>
|
||||
</mxfile>
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 144 KiB |
@@ -1,223 +0,0 @@
|
||||
<mxfile host="Electron" agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/29.6.6 Chrome/144.0.7559.236 Electron/40.8.4 Safari/537.36" version="29.6.6">
|
||||
<diagram name="Страница-1" id="ZezJyX5oU3Hq0j9lJ0Or">
|
||||
<mxGraphModel dx="1554" dy="626" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
|
||||
<root>
|
||||
<mxCell id="0" />
|
||||
<mxCell id="1" parent="0" />
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-5" edge="1" parent="1" source="u2X0bofjWXizP0d6YU9M-1" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="u2X0bofjWXizP0d6YU9M-2">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-6" edge="1" parent="1" source="u2X0bofjWXizP0d6YU9M-1" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="u2X0bofjWXizP0d6YU9M-4">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-7" edge="1" parent="1" source="u2X0bofjWXizP0d6YU9M-1" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" target="u2X0bofjWXizP0d6YU9M-3">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-1" parent="1" style="rounded=1;whiteSpace=wrap;html=1;" value="Выбор технологии для backend-разработки" vertex="1">
|
||||
<mxGeometry height="40" width="320" x="280" y="40" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-2" parent="1" style="rounded=1;whiteSpace=wrap;html=1;" value="Экономика разработки" vertex="1">
|
||||
<mxGeometry height="80" width="160" x="160" y="120" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-3" parent="1" style="rounded=1;whiteSpace=wrap;html=1;" value="Технические характеристики" vertex="1">
|
||||
<mxGeometry height="80" width="160" x="360" y="120" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-4" parent="1" style="rounded=1;whiteSpace=wrap;html=1;" value="Риски и устойчивость" vertex="1">
|
||||
<mxGeometry height="80" width="160" x="560" y="120" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-8" parent="1" style="rounded=1;whiteSpace=wrap;html=1;" value="Время разработки" vertex="1">
|
||||
<mxGeometry height="80" width="120" x="140" y="280" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-9" parent="1" style="rounded=1;whiteSpace=wrap;html=1;" value="<font style="font-size: 11px;">Производительность&nbsp;</font>" vertex="1">
|
||||
<mxGeometry height="80" width="120" x="300" y="280" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-10" parent="1" style="rounded=1;whiteSpace=wrap;html=1;" value="Зрелость экосистемы" vertex="1">
|
||||
<mxGeometry height="80" width="120" x="460" y="280" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-12" parent="1" style="rounded=1;whiteSpace=wrap;html=1;" value="Стабильность в продакшене" vertex="1">
|
||||
<mxGeometry height="80" width="120" x="620" y="280" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-19" edge="1" parent="1" source="u2X0bofjWXizP0d6YU9M-3" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="u2X0bofjWXizP0d6YU9M-9" value="">
|
||||
<mxGeometry height="50" relative="1" width="50" as="geometry">
|
||||
<mxPoint x="430" y="330" as="sourcePoint" />
|
||||
<mxPoint x="480" y="280" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-20" edge="1" parent="1" source="u2X0bofjWXizP0d6YU9M-3" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="u2X0bofjWXizP0d6YU9M-10" value="">
|
||||
<mxGeometry height="50" relative="1" width="50" as="geometry">
|
||||
<mxPoint x="630" y="290" as="sourcePoint" />
|
||||
<mxPoint x="550" y="370" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-21" edge="1" parent="1" source="u2X0bofjWXizP0d6YU9M-3" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="u2X0bofjWXizP0d6YU9M-12" value="">
|
||||
<mxGeometry height="50" relative="1" width="50" as="geometry">
|
||||
<mxPoint x="660" y="240" as="sourcePoint" />
|
||||
<mxPoint x="580" y="320" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-22" edge="1" parent="1" style="endArrow=classic;html=1;rounded=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="u2X0bofjWXizP0d6YU9M-8" value="">
|
||||
<mxGeometry height="50" relative="1" width="50" as="geometry">
|
||||
<mxPoint x="440" y="200" as="sourcePoint" />
|
||||
<mxPoint x="680" y="320" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-23" edge="1" parent="1" source="u2X0bofjWXizP0d6YU9M-4" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.75;entryY=0;entryDx=0;entryDy=0;" target="u2X0bofjWXizP0d6YU9M-12" value="">
|
||||
<mxGeometry height="50" relative="1" width="50" as="geometry">
|
||||
<mxPoint x="800" y="220" as="sourcePoint" />
|
||||
<mxPoint x="720" y="300" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-24" edge="1" parent="1" source="u2X0bofjWXizP0d6YU9M-4" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.75;entryY=0;entryDx=0;entryDy=0;" target="u2X0bofjWXizP0d6YU9M-10" value="">
|
||||
<mxGeometry height="50" relative="1" width="50" as="geometry">
|
||||
<mxPoint x="840" y="260" as="sourcePoint" />
|
||||
<mxPoint x="760" y="340" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-25" edge="1" parent="1" style="endArrow=classic;html=1;rounded=0;entryX=0.75;entryY=0;entryDx=0;entryDy=0;" target="u2X0bofjWXizP0d6YU9M-9" value="">
|
||||
<mxGeometry height="50" relative="1" width="50" as="geometry">
|
||||
<mxPoint x="640" y="200" as="sourcePoint" />
|
||||
<mxPoint x="790" y="300" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-26" edge="1" parent="1" style="endArrow=classic;html=1;rounded=0;entryX=0.75;entryY=0;entryDx=0;entryDy=0;" target="u2X0bofjWXizP0d6YU9M-8" value="">
|
||||
<mxGeometry height="50" relative="1" width="50" as="geometry">
|
||||
<mxPoint x="640" y="200" as="sourcePoint" />
|
||||
<mxPoint x="610" y="480" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-27" edge="1" parent="1" source="u2X0bofjWXizP0d6YU9M-2" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.25;entryY=0;entryDx=0;entryDy=0;" target="u2X0bofjWXizP0d6YU9M-8" value="">
|
||||
<mxGeometry height="50" relative="1" width="50" as="geometry">
|
||||
<mxPoint x="630" y="410" as="sourcePoint" />
|
||||
<mxPoint x="550" y="490" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-28" edge="1" parent="1" style="endArrow=classic;html=1;rounded=0;entryX=0.25;entryY=0;entryDx=0;entryDy=0;" target="u2X0bofjWXizP0d6YU9M-9" value="">
|
||||
<mxGeometry height="50" relative="1" width="50" as="geometry">
|
||||
<mxPoint x="240" y="200" as="sourcePoint" />
|
||||
<mxPoint x="320" y="490" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-29" edge="1" parent="1" style="endArrow=classic;html=1;rounded=0;entryX=0.25;entryY=0;entryDx=0;entryDy=0;" target="u2X0bofjWXizP0d6YU9M-10" value="">
|
||||
<mxGeometry height="50" relative="1" width="50" as="geometry">
|
||||
<mxPoint x="240" y="200" as="sourcePoint" />
|
||||
<mxPoint x="460" y="520" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-30" edge="1" parent="1" style="endArrow=classic;html=1;rounded=0;entryX=0.25;entryY=0;entryDx=0;entryDy=0;" target="u2X0bofjWXizP0d6YU9M-12" value="">
|
||||
<mxGeometry height="50" relative="1" width="50" as="geometry">
|
||||
<mxPoint x="240" y="200" as="sourcePoint" />
|
||||
<mxPoint x="550" y="520" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-31" parent="1" style="rounded=1;whiteSpace=wrap;html=1;" value="Python (FastAPI)" vertex="1">
|
||||
<mxGeometry height="80" width="120" x="140" y="440" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-32" parent="1" style="rounded=1;whiteSpace=wrap;html=1;" value="Node.js (Nest/Express)" vertex="1">
|
||||
<mxGeometry height="80" width="120" x="300" y="440" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-33" parent="1" style="rounded=1;whiteSpace=wrap;html=1;" value="Java (Spring)" vertex="1">
|
||||
<mxGeometry height="80" width="120" x="460" y="440" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-34" parent="1" style="rounded=1;whiteSpace=wrap;html=1;" value="Go" vertex="1">
|
||||
<mxGeometry height="80" width="120" x="620" y="440" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-36" edge="1" parent="1" source="u2X0bofjWXizP0d6YU9M-8" style="endArrow=classic;html=1;rounded=0;entryX=0.25;entryY=0;entryDx=0;entryDy=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" target="u2X0bofjWXizP0d6YU9M-31" value="">
|
||||
<mxGeometry height="50" relative="1" width="50" as="geometry">
|
||||
<mxPoint x="210" y="420" as="sourcePoint" />
|
||||
<mxPoint x="480" y="280" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-38" edge="1" parent="1" source="u2X0bofjWXizP0d6YU9M-8" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.25;entryY=0;entryDx=0;entryDy=0;" target="u2X0bofjWXizP0d6YU9M-32" value="">
|
||||
<mxGeometry height="50" relative="1" width="50" as="geometry">
|
||||
<mxPoint x="430" y="330" as="sourcePoint" />
|
||||
<mxPoint x="480" y="280" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-39" edge="1" parent="1" style="endArrow=classic;html=1;rounded=0;entryX=0.25;entryY=0;entryDx=0;entryDy=0;" target="u2X0bofjWXizP0d6YU9M-33" value="">
|
||||
<mxGeometry height="50" relative="1" width="50" as="geometry">
|
||||
<mxPoint x="200" y="360" as="sourcePoint" />
|
||||
<mxPoint x="310" y="490" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-40" edge="1" parent="1" source="u2X0bofjWXizP0d6YU9M-8" style="endArrow=classic;html=1;rounded=0;entryX=0.25;entryY=0;entryDx=0;entryDy=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" target="u2X0bofjWXizP0d6YU9M-34" value="">
|
||||
<mxGeometry height="50" relative="1" width="50" as="geometry">
|
||||
<mxPoint x="500" y="440" as="sourcePoint" />
|
||||
<mxPoint x="470" y="520" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-41" edge="1" parent="1" source="u2X0bofjWXizP0d6YU9M-9" style="endArrow=classic;html=1;rounded=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" target="u2X0bofjWXizP0d6YU9M-31" value="">
|
||||
<mxGeometry height="50" relative="1" width="50" as="geometry">
|
||||
<mxPoint x="790" y="400" as="sourcePoint" />
|
||||
<mxPoint x="760" y="480" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-42" edge="1" parent="1" source="u2X0bofjWXizP0d6YU9M-9" style="endArrow=classic;html=1;rounded=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" target="u2X0bofjWXizP0d6YU9M-32" value="">
|
||||
<mxGeometry height="50" relative="1" width="50" as="geometry">
|
||||
<mxPoint x="400" y="430" as="sourcePoint" />
|
||||
<mxPoint x="370" y="510" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-43" edge="1" parent="1" source="u2X0bofjWXizP0d6YU9M-9" style="endArrow=classic;html=1;rounded=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" target="u2X0bofjWXizP0d6YU9M-33" value="">
|
||||
<mxGeometry height="50" relative="1" width="50" as="geometry">
|
||||
<mxPoint x="560" y="380" as="sourcePoint" />
|
||||
<mxPoint x="530" y="460" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-44" edge="1" parent="1" style="endArrow=classic;html=1;rounded=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="u2X0bofjWXizP0d6YU9M-34" value="">
|
||||
<mxGeometry height="50" relative="1" width="50" as="geometry">
|
||||
<mxPoint x="360" y="360" as="sourcePoint" />
|
||||
<mxPoint x="530" y="430" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-45" edge="1" parent="1" source="u2X0bofjWXizP0d6YU9M-10" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" value="">
|
||||
<mxGeometry height="50" relative="1" width="50" as="geometry">
|
||||
<mxPoint x="750" y="380" as="sourcePoint" />
|
||||
<mxPoint x="680" y="440" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-46" edge="1" parent="1" source="u2X0bofjWXizP0d6YU9M-10" style="endArrow=classic;html=1;rounded=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" target="u2X0bofjWXizP0d6YU9M-33" value="">
|
||||
<mxGeometry height="50" relative="1" width="50" as="geometry">
|
||||
<mxPoint x="800" y="390" as="sourcePoint" />
|
||||
<mxPoint x="770" y="470" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-47" edge="1" parent="1" source="u2X0bofjWXizP0d6YU9M-10" style="endArrow=classic;html=1;rounded=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" target="u2X0bofjWXizP0d6YU9M-32" value="">
|
||||
<mxGeometry height="50" relative="1" width="50" as="geometry">
|
||||
<mxPoint x="630" y="400" as="sourcePoint" />
|
||||
<mxPoint x="600" y="480" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-48" edge="1" parent="1" source="u2X0bofjWXizP0d6YU9M-10" style="endArrow=classic;html=1;rounded=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" target="u2X0bofjWXizP0d6YU9M-31" value="">
|
||||
<mxGeometry height="50" relative="1" width="50" as="geometry">
|
||||
<mxPoint x="630" y="430" as="sourcePoint" />
|
||||
<mxPoint x="600" y="510" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-49" edge="1" parent="1" source="u2X0bofjWXizP0d6YU9M-12" style="endArrow=classic;html=1;rounded=0;entryX=0.75;entryY=0;entryDx=0;entryDy=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" target="u2X0bofjWXizP0d6YU9M-34" value="">
|
||||
<mxGeometry height="50" relative="1" width="50" as="geometry">
|
||||
<mxPoint x="590" y="430" as="sourcePoint" />
|
||||
<mxPoint x="560" y="510" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-50" edge="1" parent="1" style="endArrow=classic;html=1;rounded=0;entryX=0.75;entryY=0;entryDx=0;entryDy=0;" target="u2X0bofjWXizP0d6YU9M-33" value="">
|
||||
<mxGeometry height="50" relative="1" width="50" as="geometry">
|
||||
<mxPoint x="680" y="360" as="sourcePoint" />
|
||||
<mxPoint x="760" y="530" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-51" edge="1" parent="1" style="endArrow=classic;html=1;rounded=0;entryX=0.75;entryY=0;entryDx=0;entryDy=0;" target="u2X0bofjWXizP0d6YU9M-32" value="">
|
||||
<mxGeometry height="50" relative="1" width="50" as="geometry">
|
||||
<mxPoint x="680" y="360" as="sourcePoint" />
|
||||
<mxPoint x="620" y="530" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="u2X0bofjWXizP0d6YU9M-53" edge="1" parent="1" style="endArrow=classic;html=1;rounded=0;entryX=0.75;entryY=0;entryDx=0;entryDy=0;" target="u2X0bofjWXizP0d6YU9M-31" value="">
|
||||
<mxGeometry height="50" relative="1" width="50" as="geometry">
|
||||
<mxPoint x="680" y="360" as="sourcePoint" />
|
||||
<mxPoint x="600" y="550" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
</root>
|
||||
</mxGraphModel>
|
||||
</diagram>
|
||||
</mxfile>
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 83 KiB |
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1 +0,0 @@
|
||||
3.13
|
||||
File diff suppressed because one or more lines are too long
@@ -1,8 +0,0 @@
|
||||
# %%
|
||||
|
||||
# %%
|
||||
|
||||
|
||||
# %%
|
||||
|
||||
# %%
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 54 KiB |
@@ -1,10 +0,0 @@
|
||||
[project]
|
||||
name = "lab3"
|
||||
version = "0.1.0"
|
||||
description = "Add your description here"
|
||||
readme = "README.md"
|
||||
requires-python = ">=3.13"
|
||||
dependencies = [
|
||||
"jupyterlab>=4.5.6",
|
||||
"matplotlib>=3.10.8",
|
||||
]
|
||||
Generated
-1742
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user