9 клас — програма модуля

Study.UA · IT Skills · Cloud Services & Documents · 16 уроків · групи 9A, 9B
Один урок на тиждень. Нижче — що саме відбувається на кожному занятті, чого ти навчишся і що в тебе залишиться після нього. Уроки йдуть по порядку: кожен спирається на попередній.

Сьогодні ми працюємо одразу з двома компʼютерами. Перший стоїть перед тобою: ти бачиш його монітор і тримаєш руки на його клавіатурі. Другий стоїть у дата-центрі в іншому місті, і ти його ніколи не побачиш.

На уроці ти навчишся

  • Модуль I · IT Skills (Cloud Services & Documents) · 120 хвилин
  • Того, що стоїть просто перед тобою
  • Програма, яка керує всім іншим
  • Дві системи, з якими ми працюємо сьогодні
  • Одне й те саме місце, два різні записи
Залишається в тебе: Ти хоча б раз зайшов на сервер по SSH; Виданий пароль змінено на власний; Чотири теки кабінету на місці: www, upload, data, notes; Сторінка відповідає кодом 200 і типом text/html
ssh passwd whoami pwd ls cd ~/www cd .. echo "перший
Відкрити урок 01

Ти відкрив свою сторінку в nano, переписав абзац про себе, зберіг і вийшов. Оновив адресу в браузері — половина тексту зникла, а списку з пʼяти пунктів немає взагалі. Ти хочеш побачити те, що було до правки.

На уроці ти навчишся

  • Ситуація, у якій не допоможе жодна команда з першого уроку
  • Три різні речі, які часто складають в одне слово «бекап»
  • Тека, у якій кожен другий файл називається «остання версія»
  • Це головна схема уроку. Половина «незрозумілих» помилок git — це нерозуміння, у якому з трьох місць зараз файл
  • Решту git ти вивчиш тоді, коли впрешся в задачу, яку без неї не розвʼязати
Залишається в тебе: Репозиторій на місці: у ~/data/story-game є тека .git; У ~/www немає теки .git; README.md у репозиторії, щонайменше 20 слів; В index.html проєкту є рядок meta charset="UTF-8"
ssh git cd ~/data/story-game nano index.html nano README.md cp
Відкрити урок 02

Минулого разу твій проєкт отримав історію: коміти на сервері й другу копію — на GitHub або в bare-репозиторії на цьому ж сервері. Історія є — але подивитися на неї можна тільки командами, і щоразу різними.

На уроці ти навчишся

  • Модуль I · IT Skills · тема 2, урок 1 · 120 хвилин
  • Три твердження, кожне з яких виявилося неправдою — і всі три виявилися надто пізно
  • Проблема не в тому, що це складно. Проблема в тому, що це треба робити щоразу
  • Не відчуття «начебто все гаразд», а список фактів, кожен з яких можна дістати командою
  • Кожен рядок — одне питання й одна команда, яка дає на нього відповідь
Залишається в тебе: status.json у ~/www/admin/ читається як JSON: є generated_at і масив rows із 10 рядків; generated_at записаний в ISO 8601 зі зсувом пояса: 2026-09-10T14:22:31+03:00; У кожного рядка є state — рівно одне зі слів ok, warn або bad; Дата й хеш останнього коміту в status.json збігаються зі справжніми в теці проєкту
ssh git mkdir nano ~/bin/status.py python3 nano ~/www/admin/index.html echo "рядок mv
Відкрити урок 03

Твоя сторінка вперше починає приймати дані: однокласник заповнює форму, і в приватному файлі ~/data/responses.csv з'являється новий рядок. Ти верстаєш поля за власним fields.json, надсилаєш відповідь через fetch() без перезавантаження і простежуєш увесь шлях у DevTools. Потім те саме значення надсилається curl-ом повз форму — і видно, чому перевірка в браузері є зручністю, а не захистом.

На уроці ти навчишся

  • зверстати поле анкети так, щоб підпис до нього не зникав під час набору
  • надсилати відповідь, не перезавантажуючи сторінку
  • простежити шлях відповіді від натиснутої кнопки до рядка в CSV
  • обійти власну перевірку одним запитом з термінала
  • викреслити з анкети поле, без якого підсумок не зміниться
Залишається в тебе: Робоча форма ~/www/form/index.html, щонайменше 10 зібраних відповідей у приватному ~/data/responses.csv і stats.json із підсумками; CSV у публічну теку не потрапляє
теги <label>, name та id fetch() з методом POST валідація в браузері проти перевірки на сервері приватні дані і тека ~/data/
Відкрити урок 04

Ти будуєш структуру виступу за даними власного опитування: п'ять частин, у кожної одне питання, заголовок слайда — твердження, а не тема. Далі верстаєш каркас на reveal.js — звичайну веб-сторінку з тегів <section>, яку відкриває браузер. Діаграм ще немає: замість них два порожні <canvas> під наступний урок.

На уроці ти навчишся

  • ділити свій виступ на п'ять частин і давати кожній одне питання
  • переписувати заголовок слайда з теми на твердження
  • рахувати слова на слайді й різати все, що понад 40
  • підбирати колір тексту й тла з контрастом не нижчим за 4,5:1
  • збирати презентацію з тегів <section> і відкривати її браузером
Залишається в тебе: Тека ~/www/deck/ із трьома файлами: index.html на 8+ слайдів із двома порожніми <canvas>, deck.css і outline.md, де теза кожного слайда записана одним реченням
reveal.js і слайд як тег <section> вертикальні підслайди й режим доповідача контраст тексту 4,5:1 локальна бібліотека замість CDN
Відкрити урок 05

Порожні слоти chart1 і chart2 з минулого уроку заповнюються діаграмами, які Chart.js будує з файлу data.json: виправив там число — слайд перемалювався сам. Ти проходиш дерево рішень і добираєш тип діаграми під свої числа. Друга половина уроку — про те, як діаграма викривляє правду обрізаною віссю чи переставленими стовпчиками, і як перевірити власні дві.

На уроці ти навчишся

  • подивитися на свої числа й сказати, яка діаграма їм підходить і чому саме вона
  • упізнати три способи збрехати правдивими числами: обрізана вісь, 3D і «зручний» порядок стовпчиків
  • описати діаграму кодом: що малювати, з яких чисел і як підписати
  • тримати числа в окремому файлі data.json і оновлювати слайд правкою в ньому
  • підписати вісь, одиницю й кількість опитаних так, щоб діаграму можна було перевірити
Залишається в тебе: Презентація в ~/www/deck/ із двома діаграмами різних типів, що будуються з data.json, файл deck.meta.json і локальний assets/chart.min.js — усе працює з вимкненою мережею
Chart.js: type, data, options fetch() до data.json обрізана вісь і спотворення масштабу слайд «звідки дані»
Відкрити урок 06

Ти робиш комікс на шість панелей, і складність не в гарній картинці, а в тому, щоб на всіх шести був той самий герой. Складаєш аркуш канону з восьми вимірюваних ознак, ставиш цей опис у кожен промпт незмінним і міняєш по одному параметру, коли панель не вийшла. Зображення залишаються на твоєму комп'ютері: на сервер їдуть тільки три текстові файли.

На уроці ти навчишся

  • складати аркуш канону героя з восьми ознак, які можна виміряти, а не оцінити на око
  • ділити промпт на сталу частину — опис героя — і змінну, що відбувається саме на цій панелі
  • задавати кадр словами: «крупний план», «камера знизу», «герой у лівій третині»
  • переробити невдалу панель: фіксуєш seed, міняєш одну річ і дивишся, що дала саме вона
  • здавати prompts.json, за яким будь-хто відтворить твої шість панелей
Залишається в тебе: Шість панелей у локальній теці ~/local/comic/images/ і три текстові файли в ~/www/comic/: character.md на 400+ символів, storyboard.md і prompts.json із шістьма записами та seed кожної панелі
канон персонажа і стала частина промпту seed і серія зображень негативний промпт план, ракурс, правило третин
Відкрити урок 07

Шість картинок стають сторінкою, яку читають саме в тому порядку, який ти задумав. Ти розкладаєш панелі сіткою, керуєш темпом читання шириною панелі й жолоба, пишеш текст бульбашок у розмітці, а не всередині картинки. Наприкінці ставиш під коміксом видиму позначку про те, яка модель малювала панелі і що в них зробив ти сам.

На уроці ти навчишся

  • розкладати шість панелей у сітку й робити окремі панелі ширшими за сусідні
  • уповільнювати читача широкою панеллю і ширшим жолобом перед нею
  • писати текст бульбашок прямо на сторінці, щоб було видно, хто говорить і в якому порядку
  • ставити під коміксом видиму позначку .ai-disclosure
  • писати alt, який переказує дію на панелі, а не називає файл
Залишається в тебе: Тека ~/www/comic/ з index.html (6+ панелей, у кожної alt і figcaption, 4+ бульбашки текстом, блок .ai-disclosure), comic.css із сіткою й адаптивом на 390 px та comic.json
CSS Grid і ширина панелі жолоб як проміжок часу атрибут alt і тег <figcaption> маркування AI-контенту
Відкрити урок 08

Музику й ефекти до майбутнього трейлера ти пишеш текстом, а не береш готовим файлом із мережі. У Strudel патерн — це рядок коду: змінив число в setcpm() — і темп змінився одразу, при вчителі. Ефекти збираєш у jsfxr і здаєш їхні числа, а не сам звук: аудіо залишається на твоєму комп'ютері.

На уроці ти навчишся

  • рахувати, скільки секунд гратиме твоя музика, і підганяти її під ролик
  • чути різницю між чотирма формами хвилі й називати потрібну
  • зробити з короткого писку удар барабана або тягучу струну, налаштувавши огинаючу
  • написати музику текстом і зберегти її у файл music.strudel
  • зібрати три звукові ефекти й записати їхні числа у sfx.json
Залишається в тебе: Записана підкладка й ефекти в локальній теці ~/local/av/ і три текстові файли в ~/www/av/: music.strudel із коментарями, sfx.json на 3+ ефекти і sound.md на 500+ символів
BPM і команда setcpm() чотири форми хвилі огинаюча ADSR Strudel і jsfxr
Відкрити урок 09

З панелей коміксу і звуку ти збираєш трейлер на 20–40 секунд, але не мишкою у відеоредакторі, а скриптом build.sh, який робить усе однією командою. Заміниш через тиждень одну панель — просто запустиш скрипт заново, нічого не згадуючи. Друга частина уроку — субтитри WebVTT, щоб ролик зрозумів і той, хто його не почує.

На уроці ти навчишся

  • скласти весь монтаж у один файл, який збирає ролик однією командою
  • зробити так, щоб скрипт зупинявся на першій помилці, а не віддавав зіпсований ролик
  • перезібрати трейлер після заміни однієї панелі, нічого не згадуючи
  • написати репліки з часом показу так, щоб глядач устигав їх прочитати
  • зняти з готового ролика справжні числа через ffprobe і покласти їх у звіт
Залишається в тебе: Файл trailer.mp4 у локальній теці ~/local/av/, який збирається з нуля командою bash build.sh, і чотири текстові файли в ~/www/av/: build.sh, trailer.vtt, probe.txt, av.meta.json
ffmpeg і ffprobe bash-скрипт зі змінними і зупинкою на помилці формат субтитрів WebVTT відтворюваність збірки
Відкрити урок 10

Сирі відповіді з твоєї форми — це порожні клітинки, однакові рядки, «999 хвилин» і три написання одного й того самого слова. Ти пишеш скрипт build_dash.py, який читає CSV, чистить його і складає готові числа у data.json. Заразом рахуєш середнє й медіану на своїх даних і формулюєш кожен показник як відповідь на чиєсь питання.

На уроці ти навчишся

  • розкладати роботу з даними на три кроки — узяти, почистити, покласти — і пояснювати, навіщо їх розділяють
  • чистити дані: обробляти пропуски, знаходити дублікати, помічати викиди
  • рахувати середнє й медіану й показувати числами, чому медіана стійкіша
  • формулювати показник як відповідь на чиєсь питання, а не як просто число
  • читати CSV через csv.DictReader і писати data.json через json.dump
Залишається в тебе: Скрипт ~/bin/build_dash.py, який на сервері створює ~/www/dash/data.json із 4+ метриками і рядом на 7+ точок, та README.md із чотирма парами «питання → метрика»
ETL: extract, transform, load KPI і формулювання показника викиди, дублікати, медіана csv.DictReader і json.dump
Відкрити урок 11

Скрипт із минулого уроку ти ставиш у розклад cron, і дашборд починає оновлюватися без тебе — уночі й на канікулах. Заразом вчишся помічати, коли автоматика зупинилася: сторінка виглядає так само гарно, тільки числа на ній учорашні. Наприкінці сервер видаляє твій data.json і чекає 16 хвилин — це єдиний доказ, що розклад справді працює.

На уроці ти навчишся

  • поставити свій скрипт у розклад сервера й сказати, о котрій він запуститься
  • за три кроки знайти причину, чому «вручну працює, а за розкладом ні»
  • вести лог скрипта: що туди писати, чого не писати і як не дати йому рости вічно
  • показувати на сторінці вік чисел, а не робити вигляд, що вони свіжі
Залишається в тебе: Запис у crontab не рідше ніж раз на 15 хвилин з абсолютними шляхами, лог ~/logs/dash.log із мітками часу і сторінка ~/www/dash/index.html із 4 картками KPI, двома графіками і плашкою «оновлено N хвилин тому»
cron і п'ять полів crontab перенаправлення виводу 2>&1 у лог атомарний запис файлу мітка generated_at і свіжість даних
Відкрити урок 12

Ти збираєш чат-бота, який проводить опитування, і будуєш його як скінченний автомат: порядок питань і збережені відповіді тримає твій код, а модель відповідає тільки за слова. Пишеш системний промпт із межами того, чого бот не робить. Потім сам підсовуєш боту фразу «ігноруй попередні інструкції» і лагодиш те, що зламалося.

На уроці ти навчишся

  • намалювати розмову бота як схему: одне питання — один стан, стрілка до наступного
  • сказати, що в боті рахує твій код, а що віддають моделі, і чому саме так
  • написати боту системний промпт разом зі списком того, чого він не робить
  • підсунути власному боту prompt injection і полагодити те, що зламається
  • перевірити схему на глухі кути: чи з кожного стану є вихід і чи до кожного можна дійти
Залишається в тебе: Чотири текстові файли в ~/www/bot/: bot.json зі сценарієм, index.html, bot.js і SYSTEM.md із трьома транскриптами; відповіді складаються в приватний ~/data/bot_results.jsonl, недоступний по HTTP
скінченний автомат: стан, подія, перехід, fallback системний промпт prompt injection формат JSONL і приватна тека ~/data/
Відкрити урок 13

Тринадцять уроків ти працював сам, а тепер у команди одна тека на трьох-чотирьох і кожен править файли одночасно з рештою. Ти клонуєш репозиторій зі шкільної Gitea, працюєш у власній гілці, відкриваєш pull request і рев'юєш чужий. Разом команда верстає каркас сайту з чотирьох сторінок зі спільною навігацією і одним файлом стилів.

На уроці ти навчишся

  • забрати спільну теку команди до себе на комп'ютер і працювати в ній
  • віддавати свої зміни так, щоб файли однокласників не затерлися
  • підписувати кожну зміну реченням, зрозумілим тобі ж через місяць
  • просити однокласника подивитися твій код і самому писати зауваження до чужого
  • полагодити файл, у який двоє написали різне в один і той самий рядок
Залишається в тебе: Репозиторій команди class9a/team-N у Gitea: чотири сторінки, один файл стилів, README.md і CONTRIB.md; у кожного учасника власна гілка з комітами, щонайменше один pull request і одне рев'ю чужого
git clone, add, commit, push гілки і pull request код-рев'ю конфлікт злиття
Відкрити урок 14

Чотири сторінки від чотирьох людей ти зводиш в один сайт: дослівно однаковий блок меню, один style.css, узгоджені імена файлів. Далі розбираєшся з деплоєм — що відбувається після git push, як спрацьовує вебхук і як за журналом знайти ланку, на якій публікація обірвалася. Наприкінці команда за п'ять хвилин захищає продукт на живому сайті, відкритому з телефона вчителя.

На уроці ти навчишся

  • звести чотири сторінки в один сайт: спільний style.css і дослівно однаковий блок меню
  • відправити зміни командою git push і за кілька секунд побачити їх на адресі сайту
  • перевірити кожну сторінку сайту й відрізнити 404 від 403
  • знайти за журналом, на якій ланці обірвалася публікація
  • показати роботу команди за п'ять хвилин, відкривши живий сайт
Залишається в тебе: Опублікований командний сайт на https://team<N>.<домен>/ з єдиною навігацією, сторінкою media.html, власним інтерактивним елементом і оновленим CONTRIB.md; копія сторінок у ~/www/team/
деплой через вебхук після git push коди відповідей 404 і 403 спільний style.css і узгоджені імена файлів чек-ліст готовності продукту
Відкрити урок 15

Останній урок модуля — це не нова тема, а перевірка того, що ти вже зробив: сайт, форма, дашборд і бот, а разом із ними зайві права на теках, забутий токен у коді й копії чужих відповідей. Ти читаєш рядок drwxr-xr-x, шукаєш командою find файли, доступні на запис усім, і виносиш секрети за межі ~/www. Потім переходиш на вхід за SSH-ключем, рахуєш стійкість пароля в бітах і проходиш тренажер фішингу.

На уроці ти навчишся

  • читати рядок прав drwxr-xr-x і перекладати його в число — і навпаки
  • однією командою знаходити у своїй теці файли, які може переписати будь-хто
  • виносити токен із .js у файл поза ~/www, а той, що вже втік, — відкликати
  • збирати пароль із кількох випадкових слів і рахувати його стійкість у бітах
  • упізнавати фішинговий лист і знаходити у своїх публічних файлах чужі телефони та пошти
Залишається в тебе: Виправлені права на теках, пара SSH-ключів із приватним лише на твоєму комп'ютері, а в ~/www/security/ — report.json із password_entropy_bits, масивом checks і phishing_score та index.html із пам'яткою «5 правил» на 800+ символів
права rwx і chmod команда find для пошуку доступних на запис файлів ентропія пароля в бітах і 2FA SSH-ключі ed25519 і права на ~/.ssh
Відкрити урок 16
Твій сайт: /s/твій-логін/ · вхід на сервер: ssh твій-логін@91.219.61.4 · зміна пароля: passwd