Ось готовий урок, створений за твоїм майстер-промптом.
🏛️ CS50: Конфігурація застосунку та змінні оточення (Environment Variables)
Привіт, друзі! 👋 Це CS50 (умовно 😉), і сьогодні ми поговоримо про річ, яка перетворює ваш код із "домашньої поробки" на професійний, безпечний та гнучкий інструмент.
Сьогоднішня тема — Environment Variables або змінні оточення.
1. 🔥 Вступ: Чому не можна "просто написати в коді"?
Уявіть ситуацію. Ви написали крутого Telegram-бота. Щоб він працював, ви отримали від Telegram секретний токен (набір букв і цифр). Ви вставили його прямо в код:
bot_token = "12345:ABC-SECRET-TOKEN"
Ви залили цей код на GitHub. І знаєте що сталося через 30 секунд? Вам написав незнайомець і сказав, що тепер це ЙОГО бот.
Або інша ситуація: ви розробляєте інтернет-магазин. На вашому ноутбуці база даних називається localhost, а на реальному сервері — prod-db-server.
❓ Питання: Що ви будете робити? Кожного разу перед завантаженням на сервер вручну переписувати рядок коду? А якщо серверів десять?
Це проблема жорсткого кодування (hardcoding).
Аналогія: Уявіть, що ви купили настільну лампу. * Хардкод — це якби дріт від лампи був вмурований у стіну вашої спальні. Ви не можете перенести лампу на кухню, не роздовбавши стіну. * Конфігурація (Env vars) — це звичайна вилка і розетка. Лампа одна й та сама (код), але ви можете "встромити" її в спальні, на кухні або в офісі (різні середовища).
Сьогодні ми навчимося робити ваші програми "переносними" та безпечними.
2. 🧠 Теоретична база: Що це за "змінні"?
Давайте заглянемо під капот. Коли ви запускаєте будь-яку програму (процес) на вашому комп'ютері (неважливо, Windows, MacOS чи Linux), операційна система створює для неї маленький "рюкзачок" із даними. Це і є оточення (Environment).
В цьому "рюкзаку" лежать пари КЛЮЧ=ЗНАЧЕННЯ.
Програма може в будь-який момент залізти в рюкзак і спитати: "Ей, а яка зараз мова системи?" або "Де лежить папка користувача?".
🔑 Що треба зрозуміти інтуїтивно:
Змінні оточення живуть поза вашим кодом. Вони живуть у терміналі, у налаштуваннях сервера або у спеціальних файлах, які не потрапляють у публічний доступ.
📌 Що запам'ятати обов'язково (The 12-Factor App):
Є такий золотий стандарт розробки — "The Twelve-Factor App". Одне з правил говорить:
"Зберігайте конфігурацію в оточенні."
Код залишається незмінним, змінюється лише конфігурація навколо нього.
3. 🧪 Приклади: Від простого до реального
Для прикладів будемо використовувати Python, але логіка однакова і для JavaScript, і для Go, і для PHP.
Приклад 1: Що вже є у вашому "рюкзаку"?
Перш ніж створювати свої змінні, подивимося, що нам дала система.
import os
# Запитуємо у системи: "Хто зараз користувач?"
user = os.environ.get('USER') # На Windows може бути 'USERNAME'
print(f"Привіт, {user}!")
Очікування: Що виведе цей код? Ваше ім'я в системі. Реальність: Програма адаптувалася під вас. Запустіть це на комп'ютері друга — вона привітає друга. Код ми не змінювали!
Приклад 2: Симуляція "Бойового" режиму
Уявіть, що у нас є програма, яка поводиться по-різному: коли ви її тестуєте (DEBUG=True) і коли вона працює для клієнтів (DEBUG=False).
import os
# Читаємо змінну. Якщо її немає, вважаємо, що це False
debug_mode = os.environ.get('MY_APP_DEBUG')
if debug_mode == "True":
print("🔧 РЕЖИМ РОЗРОБНИКА: Показуємо всі помилки і деталі.")
else:
print("users 👀 РЕЖИМ ПРОДАКШН: Все працює тихо і стабільно.")
Як це запустити? У терміналі ми можемо передати змінну прямо перед командою (на Linux/Mac):
MY_APP_DEBUG=True python my_app.py
Результат: "🔧 РЕЖИМ РОЗРОБНИКА..."
python my_app.py
Результат: "👀 РЕЖИМ ПРОДАКШН..."
Бачите? Ми керуємо логікою програми ззовні, не торкаючись файлу .py!
Приклад 3: Файл .env (Як це роблять профі)
Вводити змінні в терміналі щоразу — незручно. Профі використовують файл .env. Це просто текстовий файл.
Крок 1. Створюємо файл .env:
DB_PASSWORD=SuperSecretPassword123
API_KEY=xyz-987-abc
Крок 2. Використовуємо бібліотеку (наприклад, python-dotenv), щоб завантажити ці змінні в програму автоматично.
# Спочатку треба встановити: pip install python-dotenv
import os
from dotenv import load_dotenv
# Ця магія завантажує дані з .env у "рюкзак" програми
load_dotenv()
secret = os.getenv("DB_PASSWORD")
print(f"З'єднуюсь з базою даних використовуючи пароль: {secret}")
Тепер ваш пароль лежить у файлі, а не в коді.
4. 🛠 Практична частина
Час забруднити руки! Виконайте ці завдання:
🔹 Завдання 1: "Hello, Admin"
Напишіть скрипт, який зчитує змінну ADMIN_NAME. Якщо змінна є — виводить "Welcome, Master [Ім'я]". Якщо немає — "Access Denied". Запустіть скрипт, змінюючи значення змінної в терміналі.
🔹 Завдання 2: Файл .env
Створіть проєкт. Створіть файл .env. Запишіть туди COLOR=Green. Напишіть програму, яка читає цей колір і пише "Я люблю [Колір]". Потім змініть у файлі на Red і перезапустіть.
🔹 Завдання 3: "А що, якщо..." (Пріоритети)
У вас є файл .env, де CITY=Kyiv.
Спробуйте запустити програму командою:
CITY=Lviv python main.py
Що виведе програма: Київ чи Львів? Чому? (Це навчить вас пріоритетам змінних).
🔹 Завдання 4: Фатальна помилка (Fix it)
Уявіть код, який підключається до банку:
api_key = os.environ['BANK_KEY']
Якщо змінної немає, програма "впаде" з помилкою KeyError.
Завдання: Перепишіть код так, щоб він перевіряв наявність ключа і, якщо його немає, виводив ввічливе повідомлення "Помилка конфігурації: відсутній ключ банку" і коректно завершував роботу, а не "крашився".
🔹 Завдання 5: .gitignore (Найважливіше!)
Створіть файл .gitignore і додайте туди один рядок: .env.
Перевірте командою git status, чи бачить git ваш файл із секретами. Якщо ні — ви впоралися!
5. 💡 Мислення як у розробника
Як відрізнити новачка від сеньйора в цій темі?
❌ Типова помилка новачка:
Він додає файл .env у репозиторій Git.
Чому це погано: Історія Git пам'ятає все. Навіть якщо ви потім видалите файл, хакери можуть знайти його в історії комітів.
Як думає сеньйор: "Секрети ніколи не потрапляють у контроль версій. У Git лежить тільки файл .env.example, де описано, які змінні потрібні, але без значень (наприклад, DB_PASSWORD=change_me)."
❌ Помилка: Дефолтні значення для всього
Новачок пише: os.getenv('SECRET_KEY', 'default_key').
Як думає сеньйор: "Для критичних речей (паролі, ключі шифрування) дефолтних значень бути не може! Програма має впасти на старті, якщо я забув налаштувати безпеку, а не запуститися з дірявим дефолтним ключем."
💡 Порада з практики:
Уявіть, що ваш код — це рецепт піци 🍕. Змінні оточення — це інгредієнти, які ви купуєте. В Італії ви купите одну моцарелу, в Україні — іншу. Рецепт (код) один, смак (результат) трохи різний залежно від "середовища". Не пишіть у рецепті "Купити сир у магазині АТБ на вулиці Шевченка, 10". Пишіть просто "Сир". А де його взяти — це вже конфігурація.
6. 🧩 Підсумок
Отже, що ми сьогодні зробили? 1. Зрозуміли, що хардкод — це зло. 2. Навчилися виносити налаштування у змінні оточення. 3. Захистили свої паролі за допомогою .env та .gitignore.
Тепер ви вмієте писати код, який можна безпечно викладати на GitHub і легко запускати як на своєму ноуті, так і на потужних серверах Amazon чи Google.
🚀 Тизер наступного уроку: Окей, ми навчилися налаштовувати програму. Але як запустити її так, щоб вона працювала абсолютно однаково на моєму Mac і на твоєму Windows, не встановлюючи купу бібліотек вручну? Наступного разу ми поговоримо про Docker і контейнеризацію. Це як змінні оточення, але для всієї операційної системи!
А поки що — це був CS50! 💻✨