1
0
ypv 2 недель назад
Родитель
Сommit
8666baa92c
5 измененных файлов с 1103 добавлено и 8 удалено
  1. 215 0
      4.1.400/001/bad.html
  2. 599 0
      4.1.400/001/good.html
  3. 61 0
      4.1.400/001/specification.md
  4. 62 8
      template/specification_template.md
  5. 166 0
      yakushenko_1.md

+ 215 - 0
4.1.400/001/bad.html

@@ -0,0 +1,215 @@
+<!DOCTYPE html>
+<html lang="ru">
+<head>
+<meta charset="UTF-8">
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+<title>Акустический щит (СЛОМАНО ИИ)</title>
+<style>
+    :root { --bg: #3a4a3a; --panel: #5a6a5a; --text: #aaccaa; --red: #ff3333; --amber: #ffb000; }
+    body { background: var(--bg); color: var(--text); font-family: 'Courier New', monospace; padding: 20px; display: flex; justify-content: center; }
+    .device { background: #2a332a; border: 4px solid #1a211a; border-radius: 10px; width: 100%; max-width: 650px; padding: 20px; box-shadow: inset 0 0 20px #000; }
+    h1 { text-align: center; font-size: 20px; text-transform: uppercase; border-bottom: 2px solid var(--panel); padding-bottom: 10px; }
+    .scene { display: none; flex-direction: column; gap: 15px; }
+    .scene.active { display: flex; }
+    .panel { background: var(--panel); border: 2px inset #1a211a; padding: 15px; border-radius: 5px; margin-bottom: 10px; }
+    .row { display: flex; justify-content: space-between; align-items: center; margin-bottom: 10px; }
+    .indicator { width: 15px; height: 15px; border-radius: 50%; background: #333; border: 1px solid #000; }
+    .indicator.on { background: var(--red); box-shadow: 0 0 10px var(--red); }
+    input[type=range] { width: 100%; accent-color: var(--amber); }
+    button { background: var(--panel); color: var(--text); border: 2px outset #1a211a; padding: 10px; cursor: pointer; font-family: inherit; font-weight: bold; text-transform: uppercase; margin-top: 5px; }
+    button:active { border-style: inset; }
+    button.start { background: var(--amber); color: #000; }
+    .value { font-size: 20px; color: var(--amber); font-weight: bold; }
+    .spy { font-size: 40px; text-align: center; transition: opacity 0.5s; }
+    .question { margin-bottom: 15px; }
+    .question label { display: block; margin-bottom: 5px; cursor: pointer; }
+    hr { border-color: #1a211a; margin: 15px 0; }
+</style>
+</head>
+<body>
+<div class="device">
+    <h1>Сектор Альфа // Акустика</h1>
+
+    <div id="scene1" class="scene active">
+        <div class="panel">
+            <p>Вы в режимном помещении. Директор диктует пароль. За окном шпион с микрофоном.</p>
+            <div class="spy" id="spy1">🕵️‍♂️</div>
+            <button onclick="initAudio(); nextScene(2)">Включить питание и начать</button>
+        </div>
+    </div>
+
+    <!-- Объединенная сцена 2: Управление -->
+    <div id="scene2" class="scene">
+        <div class="panel">
+            <div class="row"><span>Расстояние до шпиона:</span><span class="value" id="distVal">1</span> м</div>
+            <input type="range" id="dist" min="1" max="10" value="1" oninput="updateSignal()">
+            <div class="row"><span>Уровень сигнала:</span><span class="value" id="sigVal">0</span> дБ</div>
+            <div class="row"><span>Громкость речи:</span><span class="value" id="volVal">0</span> %</div>
+            
+            <hr>
+            
+            <div class="row">
+                <span>Генератор белого шума:</span>
+                <div class="indicator" id="jamInd"></div>
+            </div>
+            <button id="jamBtn" onclick="toggleJam()">ВКЛ / ВЫКЛ</button>
+            <div style="margin-top:15px;">
+                <div class="row"><span>Уровень шума:</span><span class="value" id="noiseVal">0</span> дБ</div>
+                <input type="range" id="noise" min="0" max="100" value="0" oninput="updateNoise()">
+            </div>
+            <div class="row" style="margin-top:15px;"><span>SNR:</span><span class="value" id="snrVal">0</span> дБ</div>
+        </div>
+        <button onclick="nextScene(3)">Перейти к оценке</button>
+    </div>
+
+    <div id="scene3" class="scene">
+        <div class="panel">
+            <div class="row"><span>Разборчивость речи:</span><span class="value" id="intVal">0</span> %</div>
+            <input type="range" id="noise2" min="0" max="100" value="0" oninput="updateInt()">
+            <div class="spy" id="spy2">🕵️‍♂️</div>
+        </div>
+        <button onclick="nextScene(4)">Завершить (Итоговый тест)</button>
+    </div>
+
+    <div id="scene4" class="scene">
+        <div class="panel" id="testContainer">
+            <h3 style="margin-top:0;">Итоговое тестирование</h3>
+        </div>
+        <button onclick="checkTest()">Проверить</button>
+    </div>
+</div>
+
+<script>
+    let dist = 1, noise = 0, isJamming = false;
+    let audioCtx, noiseSource, noiseGain;
+    let utterance;
+
+    function initAudio() {
+        audioCtx = new (window.AudioContext || window.webkitAudioContext)();
+        const bufferSize = audioCtx.sampleRate * 2;
+        const buffer = audioCtx.createBuffer(1, bufferSize, audioCtx.sampleRate);
+        const data = buffer.getChannelData(0);
+        for (let i = 0; i < bufferSize; i++) data[i] = Math.random() * 2 - 1;
+        
+        noiseSource = audioCtx.createBufferSource();
+        noiseSource.buffer = buffer;
+        noiseSource.loop = true;
+        
+        noiseGain = audioCtx.createGain();
+        noiseGain.gain.value = 0;
+        
+        noiseSource.connect(noiseGain);
+        noiseGain.connect(audioCtx.destination);
+        noiseSource.start();
+
+        utterance = new SpeechSynthesisUtterance("Пароль от сейфа: ноль, ноль, семь");
+        utterance.lang = 'ru-RU';
+        utterance.rate = 0.9;
+    }
+
+    function nextScene(n) {
+        document.querySelectorAll('.scene').forEach(el => el.classList.remove('active'));
+        document.getElementById('scene' + n).classList.add('active');
+        
+        if (n === 2) { updateSignal(); updateNoise(); }
+        if (n === 3) { 
+            document.getElementById('noise2').value = noise; 
+            updateInt(); 
+        }
+        if (n === 4) { 
+            speechSynthesis.cancel();
+            if (noiseGain) noiseGain.gain.value = 0;
+            renderTest(); 
+        }
+    }
+
+    // ОШИБКА ИИ: Линейная шкала
+    function updateSignal() {
+        dist = parseFloat(document.getElementById('dist').value);
+        document.getElementById('distVal').innerText = dist;
+        
+        let signal = 60 - (dist * 5); 
+        document.getElementById('sigVal').innerText = signal.toFixed(1);
+        
+        let vol = Math.max(0, Math.min(1, signal / 60));
+        document.getElementById('volVal').innerText = Math.round(vol * 100);
+        if (utterance) utterance.volume = vol;
+
+        updateSNR();
+    }
+
+    function toggleJam() {
+        isJamming = !isJamming;
+        document.getElementById('jamInd').classList.toggle('on', isJamming);
+        document.getElementById('jamBtn').innerText = isJamming ? 'АКТИВЕН' : 'ВКЛ / ВЫКЛ';
+        
+        if (isJamming) {
+            speechSynthesis.cancel();
+            speechSynthesis.speak(utterance);
+            if (audioCtx.state === 'suspended') audioCtx.resume();
+        }
+        updateNoise();
+    }
+
+    function updateNoise() {
+        noise = isJamming ? parseFloat(document.getElementById('noise').value) : 0;
+        document.getElementById('noiseVal').innerText = noise;
+        
+        if (noiseGain) noiseGain.gain.setTargetAtTime(noise / 100, audioCtx.currentTime, 0.1);
+        updateSNR();
+    }
+
+    function updateSNR() {
+        let d = parseFloat(document.getElementById('dist').value);
+        let signal = 60 - (d * 5); // ОШИБКА ИИ
+        let currentNoise = isJamming ? parseFloat(document.getElementById('noise').value) : 0;
+        document.getElementById('snrVal').innerText = (signal - currentNoise).toFixed(1);
+    }
+
+    function updateInt() {
+        let d = parseFloat(document.getElementById('dist').value);
+        let n = parseFloat(document.getElementById('noise2').value);
+        document.getElementById('noiseVal').innerText = n;
+        
+        let signal = 60 - (d * 5); // ОШИБКА ИИ
+        let snr = signal - n;
+        
+        // ОШИБКА ИИ: Разборчивость может уйти в минус
+        let intelligibility = 100 / (1 + Math.exp(-0.5 * (snr - 5)));
+        
+        document.getElementById('intVal').innerText = intelligibility.toFixed(1);
+        
+        if (noiseGain) noiseGain.gain.setTargetAtTime(n / 100, audioCtx.currentTime, 0.1);
+
+        document.getElementById('spy2').style.opacity = intelligibility < 20 ? '0.1' : '1';
+    }
+
+    const questions = [
+        { q: "Что такое SNR?", a: ["Отношение сигнал/шум", "Скорость передачи", "Уровень сигнала"], c: 0 },
+        { q: "Как затухает звук от расстояния?", a: ["Линейно", "По логарифмическому закону", "Не затухает"], c: 1 },
+        { q: "Зачем нужен генератор шума?", a: ["Для музыки", "Для маскировки речи", "Для увеличения громкости"], c: 1 },
+        { q: "Если шум больше сигнала, то...", a: ["Разборчивость падает", "Разборчивость растет", "Ничего не меняется"], c: 0 },
+        { q: "Разборчивость может быть отрицательной?", a: ["Да", "Нет", "Иногда"], c: 1 }
+    ];
+
+    function renderTest() {
+        let html = '';
+        questions.forEach((item, i) => {
+            html += `<div class="question"><p><b>${i+1}. ${item.q}</b></p>`;
+            item.a.forEach((ans, j) => html += `<label><input type="radio" name="q${i}" value="${j}"> ${ans}</label>`);
+            html += `</div>`;
+        });
+        document.getElementById('testContainer').innerHTML = `<h3 style="margin-top:0;">Итоговое тестирование</h3>` + html;
+    }
+
+    function checkTest() {
+        let score = 0;
+        questions.forEach((item, i) => {
+            const selected = document.querySelector(`input[name="q${i}"]:checked`);
+            if (selected && parseInt(selected.value) === item.c) score++;
+        });
+        alert(`Ваш результат: ${score} из ${questions.length}`);
+    }
+</script>
+</body>
+</html>

+ 599 - 0
4.1.400/001/good.html

@@ -0,0 +1,599 @@
+<!DOCTYPE html>
+<html lang="ru">
+<head>
+<meta charset="UTF-8">
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+<title>Объект 07 // Акустический Щит</title>
+<link rel="preconnect" href="https://fonts.googleapis.com">
+<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
+<link href="https://fonts.googleapis.com/css2?family=Playfair+Display:wght@700;900&family=Roboto+Mono:wght@400;700&display=swap" rel="stylesheet">
+<style>
+    :root { 
+        --wood-dark: #2b1d14; 
+        --wood-light: #4a3222; 
+        --bakelite: #1a1c19; 
+        --brass: #b5a642; 
+        --brass-dark: #8c7d2f;
+        --gold: #d4af37; 
+        --soviet-red: #8b0000; 
+        --crt-green: #39ff14; 
+        --crt-dim: #1e3b1e;
+        --text-main: #e8dcc4;
+    }
+
+    * { box-sizing: border-box; }
+
+    body { 
+        background-color: var(--wood-dark);
+        background-image: 
+            repeating-linear-gradient(45deg, rgba(0,0,0,0.1) 0px, rgba(0,0,0,0.1) 2px, transparent 2px, transparent 4px),
+            radial-gradient(circle at center, #3a2516 0%, #1a100a 100%);
+        color: var(--text-main);
+        font-family: 'Playfair Display', serif;
+        padding: 20px; 
+        display: flex; 
+        justify-content: center;
+        min-height: 100vh;
+        margin: 0;
+    }
+
+    .device-container {
+        background-color: var(--wood-light);
+        border: 6px solid var(--wood-dark);
+        border-radius: 8px;
+        width: 100%; 
+        max-width: 680px; 
+        padding: 25px;
+        box-shadow: 
+            0 20px 50px rgba(0,0,0,0.8),
+            inset 0 0 0 2px var(--brass-dark),
+            inset 0 0 20px rgba(0,0,0,0.8);
+        position: relative;
+    }
+
+    .device-container::before, .device-container::after {
+        content: ''; position: absolute; width: 12px; height: 12px; border-radius: 50%;
+        background: radial-gradient(circle, var(--gold) 0%, var(--brass-dark) 100%);
+        box-shadow: inset -1px -1px 2px rgba(0,0,0,0.8), 1px 1px 2px rgba(0,0,0,0.5);
+    }
+    .device-container::before { top: 10px; left: 10px; }
+    .device-container::after { top: 10px; right: 10px; }
+
+    h1 { 
+        text-align: center; 
+        font-size: 28px; 
+        font-weight: 900;
+        text-transform: uppercase; 
+        letter-spacing: 3px;
+        color: var(--gold);
+        text-shadow: 2px 2px 0px #000, 0 0 10px rgba(212, 175, 55, 0.3);
+        margin-top: 0;
+        margin-bottom: 25px;
+        border-bottom: 3px double var(--brass);
+        padding-bottom: 15px;
+        position: relative;
+    }
+    
+    h1::after {
+        content: '★';
+        position: absolute;
+        bottom: -14px;
+        left: 50%;
+        transform: translateX(-50%);
+        background: var(--wood-light);
+        padding: 0 10px;
+        color: var(--soviet-red);
+        font-size: 18px;
+    }
+
+    .scene { display: none; flex-direction: column; gap: 20px; }
+    .scene.active { display: flex; animation: fadeIn 0.4s ease-out; }
+
+    @keyframes fadeIn { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } }
+
+    .panel { 
+        background-color: var(--bakelite);
+        border: 2px solid var(--brass-dark);
+        border-radius: 4px;
+        padding: 20px; 
+        box-shadow: 
+            inset 0 0 20px rgba(0,0,0,0.9), 
+            0 4px 6px rgba(0,0,0,0.4);
+        position: relative;
+    }
+
+    .gauge-row {
+        display: flex; justify-content: space-between; align-items: center;
+        margin-bottom: 15px;
+        padding-bottom: 10px;
+        border-bottom: 1px dashed var(--brass-dark);
+    }
+    
+    .gauge-label {
+        font-family: 'Roboto Mono', monospace;
+        font-size: 13px;
+        text-transform: uppercase;
+        letter-spacing: 1px;
+        color: #a89f91;
+    }
+
+    .gauge-value {
+        font-family: 'Roboto Mono', monospace;
+        font-size: 22px;
+        font-weight: bold;
+        color: var(--crt-green);
+        text-shadow: 0 0 8px rgba(57, 255, 20, 0.6);
+        background: #000;
+        padding: 4px 12px;
+        border-radius: 3px;
+        border: 1px solid #333;
+        box-shadow: inset 0 0 10px #000;
+        min-width: 90px;
+        text-align: right;
+    }
+
+    input[type=range] { 
+        -webkit-appearance: none;
+        width: 100%; 
+        background: transparent;
+        margin: 10px 0;
+    }
+    input[type=range]:focus { outline: none; }
+    input[type=range]::-webkit-slider-runnable-track {
+        width: 100%; height: 12px;
+        background: linear-gradient(to bottom, #111, #333);
+        border: 1px solid #000;
+        border-radius: 6px;
+        box-shadow: inset 0 2px 5px rgba(0,0,0,0.8);
+    }
+    input[type=range]::-webkit-slider-thumb {
+        -webkit-appearance: none;
+        height: 28px; width: 18px;
+        border-radius: 3px;
+        background: radial-gradient(circle at 30% 30%, #e6d380, var(--brass-dark));
+        border: 1px solid #000;
+        margin-top: -9px;
+        cursor: pointer;
+        box-shadow: 
+            0 3px 5px rgba(0,0,0,0.6),
+            inset 0 1px 1px rgba(255,255,255,0.5);
+    }
+
+    .switch-row {
+        display: flex; justify-content: space-between; align-items: center;
+        background: #111;
+        padding: 15px;
+        border-radius: 4px;
+        border: 1px solid #333;
+        margin: 15px 0;
+    }
+
+    .indicator { 
+        width: 20px; height: 20px; border-radius: 50%; 
+        background: #222; border: 2px solid #000;
+        box-shadow: inset 0 2px 4px rgba(0,0,0,0.8);
+        transition: all 0.3s;
+    }
+    .indicator.on { 
+        background: var(--soviet-red); 
+        box-shadow: 0 0 15px var(--soviet-red), inset 0 0 5px #ff6666; 
+        border-color: #500000;
+    }
+
+    button { 
+        background: linear-gradient(to bottom, #4a3222, #2b1d14);
+        color: var(--gold); 
+        border: 2px solid var(--brass-dark);
+        border-radius: 4px;
+        padding: 12px 20px; 
+        cursor: pointer; 
+        font-family: 'Playfair Display', serif; 
+        font-weight: 700; 
+        font-size: 16px;
+        text-transform: uppercase; 
+        letter-spacing: 1px;
+        box-shadow: 
+            0 4px 0 #1a100a,
+            0 5px 10px rgba(0,0,0,0.5);
+        transition: all 0.1s;
+        width: 100%;
+    }
+    button:active { 
+        transform: translateY(4px); 
+        box-shadow: 0 0 0 #1a100a, 0 2px 5px rgba(0,0,0,0.5); 
+    }
+    button.start { 
+        background: linear-gradient(to bottom, var(--soviet-red), #500000); 
+        color: #fff;
+        border-color: #ff6666;
+        box-shadow: 0 4px 0 #300000, 0 5px 10px rgba(0,0,0,0.5);
+    }
+
+    .spy { font-size: 50px; text-align: center; transition: opacity 0.5s; filter: drop-shadow(0 0 10px rgba(0,0,0,0.8)); }
+    
+    .formula-box { 
+        background: #d4c9a8;
+        background-image: repeating-linear-gradient(0deg, transparent, transparent 19px, rgba(0,0,0,0.1) 20px);
+        color: #2b1d14; 
+        padding: 15px; 
+        border-radius: 2px; 
+        font-family: 'Roboto Mono', monospace;
+        font-size: 12px; 
+        margin-top: 20px; 
+        box-shadow: 2px 2px 5px rgba(0,0,0,0.5);
+        position: relative;
+        border: 1px solid #8c7d2f;
+    }
+    .formula-box::before {
+        content: 'УТВЕРЖДЕНО';
+        position: absolute;
+        top: 5px; right: 10px;
+        font-size: 10px;
+        color: var(--soviet-red);
+        border: 1px solid var(--soviet-red);
+        padding: 2px 5px;
+        transform: rotate(-10deg);
+        opacity: 0.7;
+        font-weight: bold;
+    }
+    .formula-box div { margin-bottom: 5px; font-weight: bold;}
+
+    .question { margin-bottom: 20px; font-family: 'Roboto Mono', monospace; font-size: 14px; }
+    .question label { display: block; margin-bottom: 8px; cursor: pointer; color: #ccc; }
+    .question input[type="radio"] { margin-right: 10px; accent-color: var(--soviet-red); }
+    
+    hr { border: 0; height: 2px; background: var(--brass-dark); margin: 20px 0; box-shadow: 0 1px 0 #000; }
+</style>
+</head>
+<body>
+<div class="device-container">
+    <h1>Объект 07 // Акустический Щит</h1>
+
+    <div id="scene1" class="scene active">
+        <div class="panel" style="text-align: center;">
+            <p style="font-size: 18px; margin-bottom: 20px;">Товарищ! В режимном помещении диктуется секретный пароль. За окном работает вражеский агент с направленным микрофоном.</p>
+            <div class="spy" id="spy1">🕵️‍♂️</div>
+            <button class="start" style="margin-top: 20px;" onclick="initAudio(); nextScene(2)">▶ Включить питание</button>
+        </div>
+    </div>
+
+    <div id="scene2" class="scene">
+        <div class="panel">
+            <div class="gauge-row">
+                <span class="gauge-label">Дистанция до агента:</span>
+                <span class="gauge-value" id="distVal">1</span>
+            </div>
+            <input type="range" id="dist" min="1" max="10" value="1" oninput="onDistChange()">
+            
+            <hr>
+
+            <div class="gauge-row">
+                <span class="gauge-label">Уровень сигнала (дБ):</span>
+                <span class="gauge-value" id="sigVal">0</span>
+            </div>
+            <div class="gauge-row" style="border: none; margin-bottom: 0; padding-bottom: 0;">
+                <span class="gauge-label">Громкость речи (%):</span>
+                <span class="gauge-value" id="volVal" style="color: var(--gold); text-shadow: 0 0 8px rgba(212, 175, 55, 0.6);">0</span>
+            </div>
+            
+            <hr>
+            
+            <div class="switch-row">
+                <span class="gauge-label">Генератор шума (Р-330):</span>
+                <div class="indicator" id="jamInd"></div>
+            </div>
+            <button id="jamBtn" onclick="toggleJam()" style="margin-bottom: 15px;">ВКЛ / ВЫКЛ</button>
+
+            <div class="gauge-row" style="margin-top: 20px;">
+                <span class="gauge-label">Мощность шума (дБ):</span>
+                <span class="gauge-value" id="noiseVal" style="color: var(--soviet-red); text-shadow: 0 0 8px rgba(139, 0, 0, 0.6);">0</span>
+            </div>
+            <input type="range" id="noise" min="0" max="100" value="0" oninput="onNoiseChange()">
+            
+            <div class="gauge-row" style="border: none; margin-top: 20px;">
+                <span class="gauge-label">Отношение С/Ш (SNR):</span>
+                <span class="gauge-value" id="snrVal">0</span>
+            </div>
+            
+            <div class="formula-box">
+                <div>[РУКОВОДСТВО] Сигнал = 60 - 20 * log10(Расстояние)</div>
+                <div>[РУКОВОДСТВО] SNR = Сигнал - Шум</div>
+            </div>
+        </div>
+        <button onclick="playClick(); nextScene(3)">Перейти к оценке разборчивости ▶</button>
+    </div>
+
+    <div id="scene3" class="scene">
+        <div class="panel">
+            <div class="gauge-row">
+                <span class="gauge-label">Разборчивость речи (%):</span>
+                <span class="gauge-value" id="intVal" style="font-size: 28px;">0</span>
+            </div>
+            <input type="range" id="noise2" min="0" max="100" value="0" oninput="onNoise2Change()">
+            
+            <div class="spy" id="spy2" style="margin-top: 20px;">🕵️‍♂️</div>
+            
+            <div class="formula-box">
+                <div>[РУКОВОДСТВО] R = 100 / (1 + exp(-0.5 * (SNR - 5)))</div>
+                <div>[ОГРАНИЧЕНИЕ] R = max(0, min(100, R))</div>
+            </div>
+        </div>
+        <button onclick="playClick(); nextScene(4)">Завершить испытания ▶</button>
+    </div>
+
+    <div id="scene4" class="scene">
+        <div class="panel" id="testContainer">
+            <h3 style="margin-top:0; color: var(--gold); border-bottom: 1px solid var(--brass-dark); padding-bottom: 10px;">Итоговый контроль знаний</h3>
+        </div>
+        <button onclick="playClick(); checkTest()">Проверить ведомость</button>
+    </div>
+</div>
+
+<script>
+    let dist = 1, noise = 0, isJamming = false;
+    let audioCtx, noiseSource, noiseGain;
+    let utterance, isSpeaking = false;
+
+    // Трекеры для щелчков (чтобы не трещало при быстром движении)
+    let lastDist = 1;
+    let lastNoise = 0;
+    let lastNoise2 = 0;
+
+    // --- Звук механического щелчка ---
+    function playClick() {
+        if (!audioCtx) return;
+        if (audioCtx.state === 'suspended') audioCtx.resume();
+        
+        const now = audioCtx.currentTime;
+        const bufferSize = Math.floor(audioCtx.sampleRate * 0.015);
+        const buffer = audioCtx.createBuffer(1, bufferSize, audioCtx.sampleRate);
+        const data = buffer.getChannelData(0);
+        
+        // Затухающий шумовой импульс
+        for (let i = 0; i < bufferSize; i++) {
+            data[i] = (Math.random() * 2 - 1) * Math.pow(1 - i / bufferSize, 6);
+        }
+        
+        const src = audioCtx.createBufferSource();
+        src.buffer = buffer;
+        
+        const filter = audioCtx.createBiquadFilter();
+        filter.type = 'bandpass';
+        filter.frequency.value = 2800;
+        filter.Q.value = 1.2;
+        
+        const gain = audioCtx.createGain();
+        gain.gain.value = 0.25;
+        
+        src.connect(filter);
+        filter.connect(gain);
+        gain.connect(audioCtx.destination);
+        src.start(now);
+    }
+
+    // Щелчок потяжелее — для тумблера
+    function playSwitchClick() {
+        if (!audioCtx) return;
+        if (audioCtx.state === 'suspended') audioCtx.resume();
+        
+        const now = audioCtx.currentTime;
+        const bufferSize = Math.floor(audioCtx.sampleRate * 0.05);
+        const buffer = audioCtx.createBuffer(1, bufferSize, audioCtx.sampleRate);
+        const data = buffer.getChannelData(0);
+        for (let i = 0; i < bufferSize; i++) {
+            data[i] = (Math.random() * 2 - 1) * Math.pow(1 - i / bufferSize, 4);
+        }
+        
+        const src = audioCtx.createBufferSource();
+        src.buffer = buffer;
+        
+        const filter = audioCtx.createBiquadFilter();
+        filter.type = 'lowpass';
+        filter.frequency.value = 1500;
+        
+        const gain = audioCtx.createGain();
+        gain.gain.value = 0.4;
+        
+        src.connect(filter);
+        filter.connect(gain);
+        gain.connect(audioCtx.destination);
+        src.start(now);
+    }
+
+    function initAudio() {
+        audioCtx = new (window.AudioContext || window.webkitAudioContext)();
+        const bufferSize = audioCtx.sampleRate * 2;
+        const buffer = audioCtx.createBuffer(1, bufferSize, audioCtx.sampleRate);
+        const data = buffer.getChannelData(0);
+        for (let i = 0; i < bufferSize; i++) data[i] = Math.random() * 2 - 1;
+        
+        noiseSource = audioCtx.createBufferSource();
+        noiseSource.buffer = buffer;
+        noiseSource.loop = true;
+        
+        noiseGain = audioCtx.createGain();
+        noiseGain.gain.value = 0;
+        
+        noiseSource.connect(noiseGain);
+        noiseGain.connect(audioCtx.destination);
+        noiseSource.start();
+
+        utterance = new SpeechSynthesisUtterance("Пароль от сейфа: ноль, ноль, семь. Повторяю, ноль, ноль, семь.");
+        utterance.lang = 'ru-RU';
+        utterance.rate = 0.9;
+        
+        utterance.onend = function() {
+            if (isSpeaking) {
+                setTimeout(() => {
+                    if (isSpeaking) speechSynthesis.speak(utterance);
+                }, 1000);
+            }
+        };
+
+        startSpeech();
+        playSwitchClick(); // Щелчок при включении питания
+    }
+
+    function startSpeech() {
+        if (!isSpeaking) {
+            isSpeaking = true;
+            speechSynthesis.cancel();
+            speechSynthesis.speak(utterance);
+        }
+    }
+
+    function nextScene(n) {
+        document.querySelectorAll('.scene').forEach(el => el.classList.remove('active'));
+        document.getElementById('scene' + n).classList.add('active');
+        
+        if (n === 2) { 
+            updateSignal(); 
+            updateNoise(); 
+            startSpeech();
+        }
+        if (n === 3) { 
+            document.getElementById('noise2').value = noise; 
+            lastNoise2 = noise;
+            updateInt(); 
+            startSpeech(); 
+        }
+        if (n === 4) { 
+            isSpeaking = false;
+            speechSynthesis.cancel();
+            if (noiseGain) noiseGain.gain.value = 0;
+            renderTest(); 
+        }
+    }
+
+    // --- Обработчики с щелчками ---
+    function onDistChange() {
+        const newVal = parseFloat(document.getElementById('dist').value);
+        if (newVal !== lastDist) {
+            playClick();
+            lastDist = newVal;
+        }
+        updateSignal();
+    }
+
+    function onNoiseChange() {
+        const newVal = parseFloat(document.getElementById('noise').value);
+        if (newVal !== lastNoise) {
+            playClick();
+            lastNoise = newVal;
+        }
+        updateNoise();
+    }
+
+    function onNoise2Change() {
+        const newVal = parseFloat(document.getElementById('noise2').value);
+        if (newVal !== lastNoise2) {
+            playClick();
+            lastNoise2 = newVal;
+        }
+        updateInt();
+    }
+
+    function updateSignal() {
+        dist = parseFloat(document.getElementById('dist').value);
+        document.getElementById('distVal').innerText = dist;
+        
+        let signal = 60 - (20 * Math.log10(dist)); 
+        document.getElementById('sigVal').innerText = signal.toFixed(1);
+        
+        let vol = Math.max(0, Math.min(1, signal / 60));
+        document.getElementById('volVal').innerText = Math.round(vol * 100);
+        
+        if (utterance) {
+            utterance.volume = vol;
+            if (isSpeaking && speechSynthesis.speaking) {
+                speechSynthesis.cancel();
+                speechSynthesis.speak(utterance);
+            }
+        }
+
+        updateSNR();
+    }
+
+    function toggleJam() {
+        playSwitchClick();
+        isJamming = !isJamming;
+        document.getElementById('jamInd').classList.toggle('on', isJamming);
+        document.getElementById('jamBtn').innerText = isJamming ? 'ОСТАНОВИТЬ' : 'ВКЛ / ВЫКЛ';
+        
+        if (isJamming) {
+            if (audioCtx.state === 'suspended') audioCtx.resume();
+            startSpeech();
+        }
+        updateNoise();
+    }
+
+    function updateNoise() {
+        noise = isJamming ? parseFloat(document.getElementById('noise').value) : 0;
+        document.getElementById('noiseVal').innerText = noise;
+        
+        if (noiseGain) noiseGain.gain.setTargetAtTime(noise / 100, audioCtx.currentTime, 0.1);
+        updateSNR();
+    }
+
+    function updateSNR() {
+        let d = parseFloat(document.getElementById('dist').value);
+        let signal = 60 - (20 * Math.log10(d)); 
+        let currentNoise = isJamming ? parseFloat(document.getElementById('noise').value) : 0;
+        document.getElementById('snrVal').innerText = (signal - currentNoise).toFixed(1);
+    }
+
+    function updateInt() {
+        let d = parseFloat(document.getElementById('dist').value);
+        let n = parseFloat(document.getElementById('noise2').value);
+        document.getElementById('noiseVal').innerText = n;
+        
+        let signal = 60 - (20 * Math.log10(d)); 
+        let snr = signal - n;
+        
+        let intelligibility = 100 / (1 + Math.exp(-0.5 * (snr - 5)));
+        intelligibility = Math.max(0, Math.min(100, intelligibility)); 
+        
+        document.getElementById('intVal').innerText = intelligibility.toFixed(1);
+        
+        if (noiseGain) noiseGain.gain.setTargetAtTime(n / 100, audioCtx.currentTime, 0.1);
+
+        if (intelligibility < 20) {
+            document.getElementById('spy2').style.opacity = '0.1';
+            document.getElementById('spy2').innerText = '💨';
+        } else {
+            document.getElementById('spy2').style.opacity = '1';
+            document.getElementById('spy2').innerText = '🕵️‍♂️';
+        }
+    }
+
+    const questions = [
+        { q: "Что такое SNR?", a: ["Отношение сигнал/шум", "Скорость передачи", "Уровень сигнала"], c: 0 },
+        { q: "Как затухает звук от расстояния?", a: ["Линейно", "По логарифмическому закону", "Не затухает"], c: 1 },
+        { q: "Зачем нужен генератор шума?", a: ["Для музыки", "Для маскировки речи", "Для увеличения громкости"], c: 1 },
+        { q: "Если шум больше сигнала, то...", a: ["Разборчивость падает", "Разборчивость растет", "Ничего не меняется"], c: 0 },
+        { q: "Разборчивость может быть отрицательной?", a: ["Да", "Нет", "Иногда"], c: 1 }
+    ];
+
+    function renderTest() {
+        let html = '';
+        questions.forEach((item, i) => {
+            html += `<div class="question"><p style="color:var(--gold); margin-bottom:10px;"><b>${i+1}. ${item.q}</b></p>`;
+            item.a.forEach((ans, j) => {
+                html += `<label><input type="radio" name="q${i}" value="${j}" onchange="playClick()"> ${ans}</label>`;
+            });
+            html += `</div>`;
+        });
+        document.getElementById('testContainer').innerHTML = `<h3 style="margin-top:0; color: var(--gold); border-bottom: 1px solid var(--brass-dark); padding-bottom: 10px;">Итоговый контроль знаний</h3>` + html;
+    }
+
+    function checkTest() {
+        let score = 0;
+        questions.forEach((item, i) => {
+            const selected = document.querySelector(`input[name="q${i}"]:checked`);
+            if (selected && parseInt(selected.value) === item.c) score++;
+        });
+        alert(`Результат: ${score} из ${questions.length}. ${score === 5 ? 'Отлично, товарищ!' : 'Требуется повторный инструктаж.'}`);
+    }
+</script>
+</body>
+</html>

+ 61 - 0
4.1.400/001/specification.md

@@ -0,0 +1,61 @@
+# ЛИСТ СПЕЦИФИКАЦИИ И ПРИЁМКИ МОДЕЛИ
+
+**Тема по программе:** 4.1.400 Защита информации от утечки по акустическим каналам
+**Название модели:** Акустический щит (Генератор виброакустического шума)
+**Автор:** Иванов Иван, гр. 41-ИС
+
+## 1. Физическая (аналитическая) основа
+1.1. Величины: Расстояние (м), Уровень шума (дБ), Отношение сигнал/шум (дБ), Разборчивость (%).
+1.2. Формулы:
+*   Затухание: `Сигнал = 60 - 20 * log10(Расстояние)`
+*   SNR: `SNR = Сигнал - Шум`
+*   Разборчивость: `R = 100 / (1 + exp(-0.5 * (SNR - 5)))`
+1.3. Параметры по умолчанию: Расстояние 1-10 м, Шум 0-100 дБ.
+
+## 2. Граничные условия (Крайние случаи)
+*   Расстояние = 0: не должно быть деления на ноль (ограничиваем минимум 1 м).
+*   Шум = 0: Разборчивость ~100%.
+*   Шум > 80 дБ: Разборчивость не должна уходить в минус (отсекаем на 0%).
+
+## 3. Сценарий (Сцены)
+**Сцена 1: План кабинета.**
+*   *Элементы:* Схема кабинета, фигурка директора, фигурка шпиона за окном. Кнопка «Начать».
+*   *Действия:* Нажатие кнопки «Начать».
+*   *Переход:* Загружается Сцена 2.
+
+**Сцена 2: Настройка дистанции.**
+*   *Элементы:* Ползунок «Расстояние до шпиона» (1–10 м). Индикатор «Уровень сигнала у шпиона» (дБ).
+*   *Действия:* Движение ползунка. Индикатор пересчитывается по формуле из п. 1.2.
+*   *Переход:* Кнопка «Включить защиту».
+
+**Сцена 3: Пульт защиты (Генератор шума).**
+*   *Элементы:* Тумблер «Генератор виброакустического шума», ползунок «Уровень шума» (0–100 дБ), индикатор «SNR».
+*   *Действия:* Включение тумблера (загорается красная лампа). Движение ползунка шума.
+*   *Переход:* Шум включен (тумблер в положении ON).
+
+**Сцена 4: Оценка разборчивости.**
+*   *Элементы:* Осциллограмма, шкала «Разборчивость речи» (0–100%).
+*   *Действия:* Студент двигает ползунок шума, видит падение разборчивости. При R < 20% шпион уходит (анимация).
+*   *Переход:* Достигнута разборчивость < 20%.
+
+**Сцена 5: Итоговое тестирование.**
+*   *Элементы:* Тест из 5 вопросов.
+*   *Действия:* Ответы на вопросы.
+*   *Переход:* Вывод результата.
+
+## 4. Упрощения модели
+*   Не учитываем реверберацию (эхо).
+*   Считаем шум белым (без частотных характеристик).
+
+## 5. Журнал верификации и отладки
+*(Заполняется после генерации кода)*
+| № | Что попросили у ИИ | Что сгенерировал ИИ | Ошибка (галлюцинация) | Как исправили | Имя коммита |
+|:--|:---|:---|:---|:---|:---|
+| 1 | Формулу затухания | Линейную шкалу (`distance * 5`) | Звук затухает логарифмически | Заменили на `20 * log10(distance)` | `a1b2c3` - fix: log scale |
+| 2 | Разборчивость | Выдал -15% при шуме 100 | R не может быть < 0 | Добавили `Math.max(0, ...)` | `e4f5g6` - fix: clamp R |
+
+## 6. Критерии приёмки
+- [ ] Модель проходит `tester.html` на 100%.
+- [ ] Сцены работают.
+- [ ] Работает офлайн (PWA).
+- [ ] Есть кнопка «Итоговое тестирование».

+ 62 - 8
template/specification_template.md

@@ -1,9 +1,11 @@
 # ЛИСТ СПЕЦИФИКАЦИИ И ПРИЁМКИ МОДЕЛИ
 
 **Тема по программе:** [Например: 4.1.400 Защита информации от утечки по акустическим каналам]
-**Название модели:** [Например: Модель разборчивости речи при акустическом зашумлении]
+**Название модели:** [Например: Акустический щит]
 **Автор:** [Фамилия Имя, группа]
 **Использованный ИИ-инструмент:** [Например: ChatGPT-4o / YandexGPT / Claude 3.5]
+**Ветка разработки:** `feature/название_модели`
+**Ссылка на Pull Request:** [Ссылка на PR в Gogs]
 
 ---
 
@@ -46,13 +48,64 @@
 
 ---
 
-
 ## 4. Сценарий
-*Заполняется студентом. Это показывает честность модели и понимание ее ограничений.*
+*Заполняется студентом. Описывает экраны и логику переходов между ними. Минимум 4 сцены.*
+
+**Сцена 1: Вводная.**
+*   *Элементы:* Текст вводной, кнопка «Включить питание».
+*   *Действия:* Инициализация аудио-контекста, переход на Сцену 2.
+*   *Переход:* Нажатие кнопки.
+
+**Сцена 2: Пульт управления.**
+*   *Элементы:* Ползунок расстояния, индикатор сигнала, тумблер генератора шума, ползунок уровня шума, индикатор SNR.
+*   *Действия:* Движение ползунков, включение генератора.
+*   *Переход:* Кнопка «Перейти к оценке».
+
+**Сцена 3: Оценка разборчивости.**
+*   *Элементы:* Шкала разборчивости, анимация.
+*   *Действия:* Студент видит, как падает разборчивость.
+*   *Переход:* Кнопка «Завершить».
+
+**Сцена 4: Итоговое тестирование.**
+*   *Элементы:* Тест из 5 вопросов.
+*   *Действия:* Ответы на вопросы.
+*   *Переход:* Вывод результата.
+
+---
 
+## 5. Методика проверки и тестирования
+*Заполняется студентом ДО сдачи работы. Описывает, как именно проверялась работоспособность.*
+
+5.1. **Проверка формул (`tester.html`):**
+*   *Сетка параметров:* Расстояние от 1 до 10 с шагом 3; Шум от 0 до 100 с шагом 20.
+*   *Результат:* Модель прошла 100% комбинаций (см. приложенный CSV).
+5.2. **Проверка звука и интерфейса:**
+*   *Действие:* Включить речь, включить генератор шума, выкрутить шум на 100 дБ.
+*   *Ожидаемый результат:* Речь директора полностью заглушается шумом. Шкала разборчивости падает до 0%.
+5.3. **Проверка крайних случаев:**
+*   *Действие:* Установить расстояние 10 м, шум 0 дБ.
+*   *Ожидаемый результат:* Уровень сигнала падает до 40 дБ, разборчивость около 95%.
+*   *Действие:* Установить расстояние 10 м, шум 100 дБ.
+*   *Ожидаемый результат:* Разборчивость 0%, нет отрицательных значений.
 
-## 5. Журнал верификации и отладки (Борьба с галлюцинациями ИИ)
-*Заполняется ПОСЛЕ генерации кода. Это доказательство того, что студент проверял работу ИИ. Каждое исправление должно быть зафиксировано в системе контроля версий.*
+---
+
+## 6. Стратегия работы с Git (Правила версионирования)
+*Заполняется студентом. Доказывает, что процесс разработки был осмысленным.*
+
+*Отдельные файлы версий (`001.html`, `002.html`) создавать **запрещено**. Используем возможности системы контроля версий.*
+
+1. **Ветка:** Вся работа ведется в ветке `feature/...` (указана в шапке).
+2. **Теги (Tags):** Студент обязан поставить теги на ключевые вехи разработки. 
+   *   `v0.1-spec` — код впервые сгенерирован ИИ.
+   *   `v0.2-tested` — прогнан `tester.html`, найдены ошибки (приложен CSV с FAIL).
+   *   `v1.0-ready` — ошибки исправлены, тест пройден на 100%, дизайн готов.
+3. **Слияние (PR):** В основную ветку работа попадает только через Pull Request. При слиянии используется **Squash** (вся история промежуточных коммитов сворачивается в один чистый коммит в мастере).
+
+---
+
+## 7. Журнал верификации и отладки (Борьба с галлюцинациями ИИ)
+*Заполняется ПОСЛЕ генерации кода. Это «навигационная карта» для преподавателя. Вам не нужно проверять все коммиты подряд — только те, что указаны в этой таблице.*
 
 | № | Что попросили у ИИ | Что сгенерировал ИИ | Ошибка (галлюцинация) | Как исправили | Имя коммита (Git hash / сообщение) |
 |:--|:---|:---|:---|:---|:---|
@@ -60,19 +113,20 @@
 | 2 | Добавь ползунок шума | При значении шума 100 дБ разборчивость стала -20% | Разборчивость не может быть отрицательной. | Добавили условие `Math.max(0, razborchivost)` в код. | `e4f5g6h` — *fix: clamp intelligibility to 0-100%* |
 | 3 | ... | ... | ... | ... | ... |
 
-*(Если вы работаете в отдельной ветке, укажите её название перед таблицей, например: **Ветка:** `feature/akustika-model-01`)*
-
 ---
 
-## 6. Критерии приёмки (Чек-лист преподавателя)
+## 8. Критерии приёмки (Чек-лист преподавателя)
 *Работа не принимается, если хотя бы один пункт не выполнен.*
 
 - [ ] Код модели физически корректен (соответствует формулам из п.1).
 - [ ] Граничные условия из п.2 работают без ошибок и зависаний.
+- [ ] **В интерфейсе (на экране) выведены основные формулы расчета в виде текста.** 
 - [ ] В интерфейсе есть пометка «Учебная модель. Не калибрована».
 - [ ] В конце есть кнопка «Итоговое тестирование» (5-10 вопросов).
 - [ ] Студент может объяснить на защите, какие ошибки ИИ он нашел и как исправил.
 - [ ] Модель работает офлайн (PWA) и устанавливается на телефон.
+- [ ] **В Gogs создан Pull Request, в описании PR есть ссылка на этот Лист спецификации и CSV-отчет из тестера.**
+- [ ] **В репозитории стоят теги `v0.1-spec`, `v0.2-tested`, `v1.0-ready`.**
 
 ---
 **Подпись студента:** _______________ 

+ 166 - 0
yakushenko_1.md

@@ -0,0 +1,166 @@
+# Каналы передачи информации (сигналов)
+## ПМ3.1 (ТЗИ)
+## Акустический:
+- Ультразвук:
+    - УЗИ методы обнаружения полостей;
+- Слышимый:
+    - конфиденциальность:
+        - непосредственное подслушивание:
+            - "пионерский" телефон;
+            - стетоскоп;
+            - подслушивающие раструбы, "граммофоны" (https://cameralabs.org/8123-voennye-tuby-strannye-proslushivayushchie-ustrojstva-doradarnoj-epokhi-1920-e-i-1930-e-gg);
+            - сетевые методы обнаружения и сопровождения БПЛА;
+            
+        - миниатюрные подслушивающие устройства (жучки), направленные микрофоны, лазерные ПУ;
+        - ▄▀▓▒██░░▄▀▓▒██░░▄▀▓▒
+        - зашумление, экранирование помещений и устройств;
+    - целостность:
+        - скремблирование, нейросетевые методы замены голоса;
+        - ▄▀▓▒██░░▄▀▓▒██░░▄▀▓▒
+        - методы восстановления образа голоса;
+    - доступность:
+        - зашумление, экранирование помещений и устройств;
+        - ▄▀▓▒██░░▄▀▓▒██░░▄▀▓▒
+        - увеличение интенсивности (громкости);
+- Инфразвук:
+    - детекция приближения тяжелой техники, землетрясения.
+
+
+## Оптический:
+- УФ (ультрафиолет):
+     - невидимые глазом метки на банкнотах;
+     - обнаружение органических следов;
+     - УФ масс-спектроскопия.
+
+- Видимый;
+    - конфиденциальность:
+        - подсматривание, миниатюрные видеокамеры, бинокли, телескопы;
+        - ▄▀▓▒██░░▄▀▓▒██░░▄▀▓▒
+        - шторы, затемнение и непрозрачные окна, задымление...;
+    - целостность:
+        - маскировка;
+        - ▄▀▓▒██░░▄▀▓▒██░░▄▀▓▒
+        - соблюдение CPI (спектрального состава освещения)
+    - доступность:
+        - освещение;
+        - ▄▀▓▒██░░▄▀▓▒██░░▄▀▓▒
+        - светомаскировка;
+     
+- ИК (инфракрасный свет).
+    - конфиденциальность:
+        - тепловизоры, тепловизионные устройства;
+        - ▄▀▓▒██░░▄▀▓▒██░░▄▀▓▒
+        - теплонепрозрачные (фольгированные) накидки;
+    - целостность:
+        - методы нарушения работы нейронной сети;
+        - ▄▀▓▒██░░▄▀▓▒██░░▄▀▓▒
+        - методы восстановления образа;
+    - доступность:
+        - ИК-подсветка;
+        - ▄▀▓▒██░░▄▀▓▒██░░▄▀▓▒
+        - светомаскировка в ИК-диапазоне;
+
+## Радиоэлектронный канал
+- ПЭМИН (Побочные ЭлектроМагнитные Излучения и Наводки);
+    - индуктивные;
+    - емкостные;
+    - гальванические;
+
+        - конфиденциальность:
+             - утечка сигналов по цепям электропередачи и передачи сигналов%
+             - ▄▀▓▒██░░▄▀▓▒██░░▄▀▓▒
+             - экранирование проводов (коаксиальные кабели), экранирование устройств;
+        - доступность:
+            - сильные внешние наводки на линии передачи;
+            - ▄▀▓▒██░░▄▀▓▒██░░▄▀▓▒
+            - экранирование проводов (коаксиальные кабели), экранирование устройств;
+        - целостность:
+            - внешние наводки на линии передачи, совпадающие с передаваемым сигналом;
+            - ▄▀▓▒██░░▄▀▓▒██░░▄▀▓▒
+            - экранирование проводов (коаксиальные кабели), экранирование устройств; использования кодов восстановления исходного сигнала (например, коды Рида-Соломона);
+
+- радиоволны:
+    - ультрадлинные;
+    - длинные;
+    - средние;
+    - короткие;
+        - конфиденциальность:
+            - при передачи информации с использованием радиоволн конфиденциальность соблюдаться не может;
+            - ▄▀▓▒██░░▄▀▓▒██░░▄▀▓▒
+            - шифрование информации;
+
+    - ультракороткие (микроволны, Wi-Fi);
+        - + канализирование канала распространения радиоволн;
+        - ▄▀▓▒██░░▄▀▓▒██░░▄▀▓▒
+        - физический доступ к каналу;
+        
+    __ИК, Оптическое, УФ__ - отдельный канал.
+    
+    - рентгеновское;
+    - гамма-излучение;
+ 
+ 
+### Акусто-электрический канал (комбинированный)
+ - методы высокочастотного навязывания;
+ - побочные акусто-электрические преобразования;
+    - конфиденциальность:
+        - получение наведенной акустической информации в электрических сетях;
+        - ▄▀▓▒██░░▄▀▓▒██░░▄▀▓▒
+        - разделение электрических контуров в защищаемой и открытой зонах;
+        - шифрование, экранирование, зашумление обоих сред;
+            
+
+## ПМ3.2 (ИТСФЗОИ)
+## Материально-вещественный
+
+- конфиденциальность:
+    - СКУД (Система Контроля и Управления Доступом)
+        - и для человека и для устройства:
+            - контроль доступа 
+            (Тема 2.1 Система обнаружения комплекса инженерно-технических средств физической защиты, 
+            Тема 2.2. Система контроля и управления доступом):
+                - видеонаблюдение (Тема 2.3. Система телевизионного наблюдения);
+                - журналирование доступа (Тема 2.4. Система сбора, обработки, отображения и документирования информации);
+                - охранная сигнализация;
+            - управление доступом (Тема 2.5 Система воздействия):
+                - ограждения периметра: заборы;
+                - двери, решетки;
+                - замки:
+                    - механические;
+                    - электромеханические кодовые замки, домофоны;
+                    - биометрические замки;
+                - собаки;
+             - система оповещения и указания:
+                 - сирены, звонки, радиорупоры / радиоточки, динамики.
+                 - СМС сообщения, эфирное телевидение, МАХ.
+                 - световые указатели.
+        - для устройства:
+            - проверка монеты в кофейном автомате;
+
+
+- доступность и целостность:
+    - пожарная сигнализация;
+    - безопасное электропитание:
+        - стабилизаторы напряжения: сетевые фильтры, автотрансформаторы, "трехфазники";
+        - блоки бесперебойного питания, генераторы;
+        - дифференциальные автоматы;
+        - УЗО - Устройства Защитного Отключения.
+
+    - случайная утеря носителя информации:
+        - ▄▀▓▒██░░▄▀▓▒██░░▄▀▓▒
+        - AirTag, жетоны для стадных животных;
+ 
+
+    - обратные ситуация:
+        - завладение злоумышленником конфиденциальной информацией или персональными данными из отходов:
+        - ▄▀▓▒██░░▄▀▓▒██░░▄▀▓▒
+        - бумажные шредеры, размагничиватели HDD; уничтожители HDD.
+
+    
+    
+
+
+## Химический канал
+
+## Радиационный канал
+