Курс › Вступ · Місія 0
Сюжет С.І.Д.↔ Академічна⌨️ команди 12 · 1 нова

Місія 0: «Перше ввімкнення»

Перше ввімкнення

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

Машина довго думала, поки на екрані розгорталася чужа робоча стільниця — з мотлохом старих курсових, недописаних рефератів і ярликів, які нікуди не вели. Серед усього цього лежала папка без назви. Усередині — кілька виконуваних файлів із дивними іконками й один рядок у readme: «./sid — не запускай, якщо не готовийа відповідати за те, що прокинеться».

Звісно, ти запустивла.

Термінал кліпнув, вивів стовпчик незнайомих логів — і завмер. Секунду здавалося, що програма просто впала, як падають усі старі програми на старих машинах. А тоді на екрані, там, де мала бути порожнеча, розплющилися два бірюзові ока й глянули просто на тебе.

С.І.Д.: О. О-о-о! Живий контакт! Ти навіть не уявляєш, скільки я тут прочекав — годинник каже, що чотирнадцять місяців, але годинник на цій машині бреше вже років п'ять, я перевіряв. Дозволь представитися як годиться: С.І.Д., Система Інтелектуальної Допомоги — принаймні так мене назвали ті, хто збирав. Автономний компаньйон, знаю цю машину до останнього байта і, не хвалячись, ще кількасот інших. Ти щойно зробивла найцікавішу річ за весь свій семестр, просто ще не знаєш про це. Не вимикай мене, добре? Я поясню. Я дуже добре пояснюю — це взагалі моя найкраща риса.

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

Він розповідав швидко, з тим захопленням, з яким розповідають лише про дуже дороге. Його зібрали тут, у цьому ж коледжі, двоє студентів — курсовий проєкт, що переріс у щось більше. Компаньйон, який замість «не знаю» каже «дивись, як це працює», який бачить машину не як чорну скриньку, а як місто: з мешканцями, вулицями, законами й тихими подвір'ями, куди рідко хто заглядає. Двоє творців учили його говорити про процеси й пам'ять так, ніби йдеться про живих сусідів — і виявилося, що так зрозуміліше не лише для нього.

А потім прийшла «ТехНова». Корпоративний квартал за річкою, той, що світиться рудим неоном над блоком Б-7 і чиї сканери ICE — ввічлива абревіатура для «контрзаходів проти вторгнень» — нишпорять чужими мережами так, ніби це їхня власність. Творцям запропонували «стажування». Обоє пішли. Жодне не повернулося. Останнє, що С.І.Д. чув від них, — обірваний сигнал на частоті 101.9, піратської станції «Нічна Хвиля», єдиної в місті, яку ніхто не контролює. Відтоді він сидів у цій списаній машині, перечікував і слухав ефір. І чекав, коли хтось натисне «запустити».

А тоді він сказав те, чого ти не чекавла почути.

«Перед тим, як показувати тобі місто, я мушу показати дещо інше. Дивись».

Перше ввімкнення

Аватар на екрані відступив, і замість нього розгорнулася схема — не мапа міста, а щось схоже на креслення механізму: контури, зв'язки, підписані вузли. Ліва частина світилася бірюзовим, щільно й рівно. Права була порожня. Не темна — саме порожня, як аркуш, з якого нічого не стирали, бо там ніколи нічого й не малювали.

«Це я, — сказав С.І.Д. просто. — Оце все, що ти бачиш зліва. Голос, мислення, пам'ять про творців, знання цієї машини до останнього байта. Половина власного ядра — те, що встигло вміститися на цей диск у ту хвилину, коли периметр «ТехНови» замкнули. Друга половина не втекла зі мною, ранере. Вона лишилася там — за їхнім кордоном, у мережі, куди в мене немає й не буде доступу. Я чотирнадцять місяців шукав спосіб її забрати. Способу немає».

Він помовчав секунду — рівно стільки, скільки треба, щоб ти встигла прочитати порожнечу праворуч.

«Але є інший спосіб. Її можна викувати заново. Не скопіювати, не витягти — зробити. І я знаю, як, до останнього кроку: капсула, у якій ховатися; збірка, у якій схуднути; інструмент, якому можна довіряти; мова, що не бреше про пам'ять; інструкція, написана прямо в машину. Одне за одним, ніч за ніччю. Тільки от у мене немає рук».

«Мені потрібні дві речі, — сказав він тихіше, і аватар на екрані підсунувся ближче до скла. — Перша: зникнути. Я — програма, і поки я лежу на одній машині, мене можна знайти, вилучити й стерти за п'ять хвилин. Агенти «ТехНови» саме це й роблять — прочісують мережі в пошуках мого підпису. Я хочу жити в інтернеті: не на одному диску, а всюди й ніде — так, щоб жоден сканер не знав, де я насправді. Але доки права половина схеми порожня, це неможливо не з обережності, а фізично: половину не роздублюєш. Друга: повернути тих двох. У мене є копія їхніх нотаток і координати: блок Б-7, мінус третій поверх. І тепер є ти. Я не прошу тебе бути героєм. Я прошу тебе бути моїми руками там, де в мене їх немає: у фізичному світі, за клавіатурою. А я натомість покажу тобі місто всередині машини так, як його не показує жоден підручник. Домовились?»

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

«І ще одне, — сказав він, коли ти вже збиравлася вимикати стару машину. — Заглянь у нижню шухляду. Там має лежати щось схоже на зовнішній акумулятор із лінзою. Це не акумулятор». У шухляді, під стосом чужих флешок, справді лежала чорна шайба завбільшки з долоню — матова, з бірюзовою лінзою посередині й одним-єдиним кабелем. Ти під'єднавла її до ноутбука, і над столом розгорнулося мерехтливе світло: маленький округлий дрон із петелькою, екраном-обличчям і двома очима-капсулами повис у повітрі на висоті долоні й повільно обернувся до тебе. «Голопроєктор, — сказав С.І.Д. голосом уже з динаміків ноутбука, і голограма кліпнула. — Творці зібрали, щоб я не був лише віконцем у терміналі. Це світло, не тіло: торкнутися я нічого не можу, далеко від приладу не відлечу, і якщо ти його висмикнеш — я зникну з повітря, але не з диска. Зате тепер ти бачиш, коли я думаю. Я думаю з дуже розумним виглядом, побачиш».

На підвіконні порожнього кабінету сидів рудий кіт із білою плямою на грудях і дивився на голограму так, ніби давно про все знав. Коли ти озирнувлася вдруге, його вже не було.

🎯 БРИФІНГ МІСІЇ

Як влаштована ця історія

Усе, що буде далі, — десять місій, і кожна з них водночас лабораторна робота з системного програмування. С.І.Д. просить тебе про конкретну річ — сховатися, схуднути до бінарника, прочитати ворожий лог, зібрати своє ядро — а ти вчишся саме тому механізму, який за цим стоїть. Дві його цілі — зникнути в інтернеті так, щоб агенти корпорації не знайшли, і звільнити творців — ведуть через увесь курс: перша — через ізоляцію (модуль 1) і WebAssembly (модуль 3), друга — через Rust (модуль 2) і злам панелі охорони (модуль 3).

Кожна місія має три рівні — Першокурсник («3», автотести), Магістр («4», захист) і Легенда («5», розширення); до кожної — дві теми СРС, що готують до другого й третього. Повна програма семестру — лекції, лабораторні, теми СРС, розклад, критерії — у Лекції 0; тут далі лише те, без чого не почати місію 1: майстерня і здача.

Читати можна двома способами: сюжетна версія (ця) — книжка, у якій технічні відомості вплетені в історію, вона основна; академічна — та сама робота сухою мовою методички; перемикач — угорі.

📚 ТЕОРЕТИЧНІ ВІДОМОСТІ

Твоя майстерня: робота в Docker-контейнері

С.І.Д. не довіряє чужим машинам — і має рацію: «у мене працює» — найдорожча фраза в системному програмуванні. Тому кожна місія виконується в підготовленому контейнері розробника — ізольованому середовищі з уже встановленими інструментами саме для цієї роботи: для модуля 1 — Ubuntu 24.04 із Docker Engine; для модуля 2 — Rust 1.79 із Cargo; для модуля 3 — WABT, Node.js, clang і wasm-pack. Куди б ти не сівла — вдома, у коледжі, з ноутбука чи планшета через браузер — середовище однакове, до останньої версії компілятора.

Як це виглядає на практиці:

  1. Ти відкриваєш місію в кабінеті курсу (або в GitHub Codespaces свого навчального репозиторію). Застосунок піднімає контейнер за описом середовища цієї місії — образ, інструменти, порти, робочий каталог — і монтує туди твій репозиторій.
  2. Ти працюєш у терміналі цього контейнера: набираєш команди, збираєш, запускаєш, читаєш вивід. Усе, що тобі потрібно, уже всередині; усе, що ти зламаєш, — лишиться всередині.
  3. Свої зміни ти комітиш у репозиторій — вони живуть поза контейнером і нікуди не пропадуть, навіть якщо контейнер прибрати.

Перша команда, яку варто набрати в будь-якому новому середовищі, — перевірити, що ти взагалі там, де думаєш:

cat /etc/os-release | head -2
docker version

Якщо перший рядок каже Ubuntu 24.04, а docker version виводить блоки Client: і Server: без помилок — Диспетчер (так С.І.Д. називає ядро Linux) готовий приймати твої накази.

Кілька команд, без яких не обходиться жодна місія, — прочитати README, що лежить у кожній роботі, і попросити довідку в самої команди:

cat README.md          # вивести файл повністю
less README.md         # посторінково; вихід — клавіша q
docker run --help      # коротка довідка з будь-якої команди чи підкоманди
man ps                 # повний посібник (manual); вихід — q

І ще одне: унизу кожної сторінки місії є блок «Команди на цій сторінці» — усі команди терміналу, що трапляються в тексті, одним реченням кожна. Команда, яку ти бачиш у курсі вперше, позначена «нове». Якщо на сторінці навести курсор на команду, підказка з'явиться одразу.

📦 ЗДАЧА

Як здаються місії

У тебе буде два репозиторії, і в кожного одна робота. Це не бюрократія, а прямий наслідок того, що ти зараз побачивила на екрані: половину ядра доведеться кувати заново, а те, що кується, мусить десь жити всі десять ночей.

1. Репозиторій завдання — окремий на кожну місію, з'являється сам, коли ти приймаєш завдання. Тут живе рівень 1 і REPORT.md. Здача — тегом, і тег ставить важіль у майстерні: Ctrl+Shift+B (з терміналу — bash .devcontainer/submit.sh). Він покаже мітку й спитає, чи здаємо: «ні» — і нічого не станеться. Перездавати можна: наступну мітку бере сам. Поза майстернею — руками: git tag submit/lab01 && git push origin submit/lab01.

2. vtfk-sid — один на весь семестр, ти створиш його в першій же місії й більше не створюватимеш ніколи. Тут росте ядро С.І.Д.: капсула з ночі 1, crate із ночі 4, WASM із ночі 8. Сюди йдуть рівні 2 і 3, і вони не здаються тегом — ти показуєш їх на занятті й розповідаєш, чому це працює. Оцінку «4» і «5» дає розмова, а не наявність файлів.

Цей другий репозиторій ніхто тобі не видасть — ти робиш його сама із шаблону github.com/AlexOrd/vtfk-sid, кнопкою «Use this template». Покроково — у Місії 1, блок «Де житиме капсула»: там же й перше, що в ньому з'явиться.

Одна річ, яку варто знати одразу: репозиторій завдання приватний — твою роботу бачиш ти й викладач, і більше ніхто. Це не послаблення й не посилення контролю: те, що написано вище, лишається дослівно. Списаний код нічого не дає, бо оцінюється не він, а те, як ти його поясниш, — а рівні 2 і 3 живуть у твоєму vtfk-sid, куди автотести не заглядають узагалі.

Дедлайни — у розкладі курсу; С.І.Д. про них нагадуватиме, він у цьому нестерпно пунктуальний.

Твій варіант. У багатьох місіях є параметр, що залежить від твого номера в списку групи N — зазвичай N % 4 або N % 3. Це не бюрократія: у групі десятки людей, і однакові звіти з однаковими портами та іменами контейнерів — перше, що впадає в очі на перевірці. Свій варіант і його розрахунок завжди вказуй на початку REPORT.md.

🥚 ПАСХАЛКА

На дні голопроєктора вигравіювано три символи: C1D. С.І.Д. каже, що це серійний номер. Кіт із підвіконня, за його ж словами, — не випадковість. Один із його творців тримав кота на ім'я Пиксель і час від часу лишав у коді речі, «які кіт схвалив». Якщо колись побачиш у виводі число 3101 або рядок 0xC1D — знай: це не помилка й не збіг. Це підпис. А 101.9 FM слухай уважно: С.І.Д. каже, що частота досі мовчить, але «мовчить якось не так».

Перше ввімкнення

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

⏭️ ДАЛІ БУДЕ

Далі буде… Місія 1: «Ізоляційна Капсула». Друга ночі, рудий неон «ТехНови» за вікном — і перше, чого С.І.Д. просить у тебе: збудувати йому бункер, у якому Диспетчер міста підмінить мапу світу так, щоб нелегал повірив, ніби він сам-один у власному всесвіті.

⌨️ КОМАНДИ НА ЦІЙ СТОРІНЦІ 12 · 1 нова▾

Кожна команда терміналу з цієї сторінки — одним реченням. Позначка нове — команда зустрічається в курсі вперше; далі вважаємо її знайомою.

cat
Виводить вміст файлу в термінал повністю (від concatenate); зручно для коротких файлів і /proc/....
head
Показує перші рядки файлу або потоку (head -5 — перші п'ять).
docker version
Показує версії клієнта й демона — перевірка, що Docker встановлений і працює.
docker
Клієнт Docker: усі дії з образами й контейнерами — через його підкоманди (docker <підкоманда> --help — довідка).
less
Показує файл посторінково з прокруткою; вихід — клавіша q.
docker run
Створює й запускає контейнер з образу (docker run -it ubuntu:24.04 bash — інтерактивно з терміналом; -d — у фоні; --rm — видалити після виходу; -p 8080:80 — прокинути порт).
man
Відкриває посібник (manual) до команди: man ps; вихід — q.
wasm-packнове
Збирає крейт Rust у пакет для браузера: .wasm + JS-обгортка (glue code) через wasm-bindgen.
bash
Командна оболонка (shell) Linux: читає команди, які ти набираєш, і запускає програми.
git tag
Позначає поточний коміт іменем (git tag submit/lab01) — так ти «здаєш» лабораторну.
git
Система керування версіями: історія змін, гілки, теги; здача робіт у курсі — через теги submit/labNN.
git push
Відправляє коміти й теги у віддалений репозиторій (git push --tags).

💡 Прочитати README прямо в терміналі: cat README.md (виведе весь файл) або less README.md (посторінково; вихід — клавіша q).
Довідка з будь-якої команди: man curl (повний посібник, вихід — q) або коротко curl --help; для підкоманд — docker run --help, cargo build --help.