Один урок на тиждень. Нижче — що саме відбувається на кожному занятті, чого ти навчишся і що в тебе залишиться після нього. Уроки йдуть по порядку: кожен спирається на попередній.
01
Операційні системи, Linux і твій сервер
Ти отримуєш акаунт на шкільному сервері — комп'ютері в дата-центрі, який працює цілодобово. Розбираєшся, як влаштоване одне дерево тек у Linux, як писати абсолютний і відносний шлях і чим відрізняються теки www/, data/ та upload/. Наприкінці кладеш свою першу сторінку в www/ і відкриваєш її за власною адресою в інтернеті.
Після уроку ти
- вмієш заходити на сервер по SSH зі свого комп'ютера й давати йому команди текстом
- вмієш знаходити свої файли серед чужих і писати шлях до будь-якого з них
- вмієш класти сторінку в теку www/ так, щоб її відкрив будь-хто в інтернеті
- вмієш ховати чернетки в теку data/, куди не зазирне сусід по класу
- вмієш полагодити сторінку, на якій замість слова «Київ» показані нечитабельні символи
Залишається в тебе: Акаунт на сервері зі зміненим паролем і сторінка index.html у готовій теці www/, яка відкривається за особистою адресою, і README.md з описом кабінету
SSH і команда passwd
абсолютний і відносний шлях
права на теки www/ та data/
кодування UTF-8
Відкрити урок 01
02
LLM як співавтор: промпт, температура, граф сюжету
Ти робиш історію, де внизу кожної сцени стоять кнопки і від вибору читача залежить кінцівка. Тексти сцен генеруєш через шкільну модель запитом POST /api/llm, а потім щонайменше один абзац переписуєш руками. Сюжет спершу малюєш схемою зі стрілок, щоб не лишилося сцен, у які не веде жоден вибір.
Після уроку ти
- вмієш міняти температуру і top-p так, щоб з того самого завдання виходив то рівний, то несподіваний текст
- вмієш писати завдання для моделі так, щоб вона віддавала текст потрібної довжини й у потрібному вигляді
- вмієш ловити вигаданий факт у відповіді моделі й перевіряти його за джерелом
- вмієш малювати сюжет схемою зі стрілок і знаходити сцени, у які не веде жоден вибір
- вмієш зібрати сцени у story.json і показати історію на своїй сторінці
Залишається в тебе: Тека ~/www/story/ з файлами story.json щонайменше на 8 сцен, index.html, meta.json і README.md; історія проходиться двома різними маршрутами до двох різних кінцівок
температура і top-p
токени і контекстне вікно
граф сюжету: сцена, вибір, кінцівка
fetch() і JSON
Відкрити урок 02
03
Таблиця як база даних: типи, формули, CSV
Ти формулюєш три дослідницькі питання про клас і будуєш під них таблицю в Grist. Розбираєшся, чому колонка з годинами, яку таблиця вважає текстом, не дасть ні суми, ні середнього, і як записувати дати, щоб сортування працювало. Заразом відкриваєш CSV Блокнотом і бачиш, чим саме розділені колонки і що таке BOM.
Після уроку ти
- вмієш добирати тип під кожну колонку своєї анкети
- вмієш записувати дати так, щоб таблиця сортувала їх правильно
- вмієш чистити колонку, у якій «Київ» і «київ» стали двома різними значеннями
- вмієш відкривати таблицю Блокнотом і бачити роздільник, лапки й кодування
- вмієш писати fields.json — опис полів анкети для машини
Залишається в тебе: Таблиця в Grist із заданими типами колонок і трьома формулами, а в ~/www/form/ — fields.json з описом полів і README.md з поясненням опитування
запис, поле, ключ
типи даних і формат дати ISO 8601
CSV: роздільник, лапки, BOM
формули SUM, COUNTIF, IF
Відкрити урок 03
04
Власна форма: від кліку до рядка в CSV
Твоя сторінка вперше починає приймати дані: однокласник заповнює форму, і в приватному файлі ~/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
05
Драматургія і композиція: каркас презентації на reveal.js
Ти будуєш структуру виступу за даними власного опитування: п'ять частин, у кожної одне питання, заголовок слайда — твердження, а не тема. Далі верстаєш каркас на 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
06
Дані малюють себе самі: Chart.js із data.json
Порожні слоти 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
07
Промпт-інженерія зображень і канон героя
Ти робиш комікс на шість панелей, і складність не в гарній картинці, а в тому, щоб на всіх шести був той самий герой. Складаєш аркуш канону з восьми вимірюваних ознак, ставиш цей опис у кожен промпт незмінним і міняєш по одному параметру, коли панель не вийшла. Зображення залишаються на твоєму комп'ютері: на сервер їдуть тільки три текстові файли.
Після уроку ти
- вмієш складати аркуш канону героя з восьми ознак, які можна виміряти, а не оцінити на око
- вмієш ділити промпт на сталу частину — опис героя — і змінну, що відбувається саме на цій панелі
- вмієш задавати кадр словами: «крупний план», «камера знизу», «герой у лівій третині»
- вмієш переробити невдалу панель: фіксуєш seed, міняєш одну річ і дивишся, що дала саме вона
- вмієш здавати prompts.json, за яким будь-хто відтворить твої шість панелей
Залишається в тебе: Шість панелей у локальній теці ~/local/comic/images/ і три текстові файли в ~/www/comic/: character.md на 400+ символів, storyboard.md і prompts.json із шістьма записами та seed кожної панелі
канон персонажа і стала частина промпту
seed і серія зображень
негативний промпт
план, ракурс, правило третин
Відкрити урок 07
08
Верстка коміксу: панелі, бульбашки, маркування AI
Шість картинок стають сторінкою, яку читають саме в тому порядку, який ти задумав. Ти розкладаєш панелі сіткою, керуєш темпом читання шириною панелі й жолоба, пишеш текст бульбашок у розмітці, а не всередині картинки. Наприкінці ставиш під коміксом видиму позначку про те, яка модель малювала панелі і що в них зробив ти сам.
Після уроку ти
- вмієш розкладати шість панелей у сітку й робити окремі панелі ширшими за сусідні
- вмієш уповільнювати читача широкою панеллю і ширшим жолобом перед нею
- вмієш писати текст бульбашок прямо на сторінці, щоб було видно, хто говорить і в якому порядку
- вмієш ставити під коміксом видиму позначку .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
09
Цифровий звук: музика кодом і звукові ефекти
Музику й ефекти до майбутнього трейлера ти пишеш текстом, а не береш готовим файлом із мережі. У 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
10
Монтаж без кнопок: ffmpeg, субтитри, build.sh
З панелей коміксу і звуку ти збираєш трейлер на 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
11
Від сирих даних до KPI: конвеєр ETL
Сирі відповіді з твоєї форми — це порожні клітинки, однакові рядки, «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
12
Дашборд, який оновлюється сам: cron, логи, свіжість
Скрипт із минулого уроку ти ставиш у розклад cron, і дашборд починає оновлюватися без тебе — уночі й на канікулах. Заразом вчишся помічати, коли автоматика зупинилася: сторінка виглядає так само гарно, тільки числа на ній учорашні. Наприкінці сервер видаляє твій data.json і чекає 16 хвилин — це єдиний доказ, що розклад справді працює.
Після уроку ти
- вмієш поставити свій скрипт у розклад сервера й сказати, о котрій він запуститься
- вмієш за три кроки знайти причину, чому «вручну працює, а за розкладом ні»
- вмієш вести лог скрипта: що туди писати, чого не писати і як не дати йому рости вічно
- вмієш показувати на сторінці вік чисел, а не робити вигляд, що вони свіжі
Залишається в тебе: Запис у crontab не рідше ніж раз на 15 хвилин з абсолютними шляхами, лог ~/logs/dash.log із мітками часу і сторінка ~/www/dash/index.html із 4 картками KPI, двома графіками і плашкою «оновлено N хвилин тому»
cron і п'ять полів crontab
перенаправлення виводу 2>&1 у лог
атомарний запис файлу
мітка generated_at і свіжість даних
Відкрити урок 12
13
Чат-бот-опитувальник: автомат, промпт, ін'єкції
Ти збираєш чат-бота, який проводить опитування, і будуєш його як скінченний автомат: порядок питань і збережені відповіді тримає твій код, а модель відповідає тільки за слова. Пишеш системний промпт із межами того, чого бот не робить. Потім сам підсовуєш боту фразу «ігноруй попередні інструкції» і лагодиш те, що зламалося.
Після уроку ти
- вмієш намалювати розмову бота як схему: одне питання — один стан, стрілка до наступного
- вмієш сказати, що в боті рахує твій код, а що віддають моделі, і чому саме так
- вмієш написати боту системний промпт разом зі списком того, чого він не робить
- вмієш підсунути власному боту prompt injection і полагодити те, що зламається
- вмієш перевірити схему на глухі кути: чи з кожного стану є вихід і чи до кожного можна дійти
Залишається в тебе: Чотири текстові файли в ~/www/bot/: bot.json зі сценарієм, index.html, bot.js і SYSTEM.md із трьома транскриптами; відповіді складаються в приватний ~/data/bot_results.jsonl, недоступний по HTTP
скінченний автомат: стан, подія, перехід, fallback
системний промпт
prompt injection
формат JSONL і приватна тека ~/data/
Відкрити урок 13
14
Команда і Gitea: гілки, PR, код-рев'ю, каркас сайту
Тринадцять уроків ти працював сам, а тепер у команди одна тека на трьох-чотирьох і кожен править файли одночасно з рештою. Ти клонуєш репозиторій зі шкільної Gitea, працюєш у власній гілці, відкриваєш pull request і рев'юєш чужий. Разом команда верстає каркас сайту з чотирьох сторінок зі спільною навігацією і одним файлом стилів.
Після уроку ти
- вмієш забрати спільну теку команди до себе на комп'ютер і працювати в ній
- вмієш віддавати свої зміни так, щоб файли однокласників не затерлися
- вмієш підписувати кожну зміну реченням, зрозумілим тобі ж через місяць
- вмієш просити однокласника подивитися твій код і самому писати зауваження до чужого
- вмієш полагодити файл, у який двоє написали різне в один і той самий рядок
Залишається в тебе: Репозиторій команди class9a/team-N у Gitea: чотири сторінки, один файл стилів, README.md і CONTRIB.md; у кожного учасника власна гілка з комітами, щонайменше один pull request і одне рев'ю чужого
git clone, add, commit, push
гілки і pull request
код-рев'ю
конфлікт злиття
Відкрити урок 14
15
Складання продукту: інтеграція артефактів, деплой, захист
Чотири сторінки від чотирьох людей ти зводиш в один сайт: дослівно однаковий блок меню, один 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
16
Кібербезпека: аудит власного акаунта
Останній урок модуля — це не нова тема, а перевірка того, що ти вже зробив: сайт, форма, дашборд і бот, а разом із ними зайві права на теках, забутий токен у коді й копії чужих відповідей. Ти читаєш рядок 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