Хардкорная веб-разработка - всё, что нужно уметь мощному разработчику под веб
Чтобы быть эффективным веб-разработчиком — неважно, backend, frontend, fullstack — мало знать только синтаксис выбранного языка программирования, например, Python или JavaScript. Для уверенной разработки веб-систем нужно иметь понимание и реальные навыки по всем технологическим блокам, работающим на разных слоях приложения.
Этих слоёв немало — это сам Интернет с его архитектурой и протоколами, это и серверные операционные системы Linux, и бэкенд-стек технологий, включающий в себя выбранный язык программирования, фреймворки, базы данных, системы планирования выполнения и прочее, это и целый спектр фронтенд-технологий.
Вне зависимости от того, работаешь ты бэкенд или фронтенд разработчиком, только фундаментальное понимание всех слоёв системы позволяет тебе быть эффективным, уверенным в своих силах специалистом, способным к красивому и эффективному решению задач веб-разработки.
Плюс — передовые методики разработки ПО. Асинхронные решения, автотесты, информационная безопасть, CI/CD.
Цель этого курса — дать тебе все необходимые навыки и закрепить их на практике.
Для кого этот курс
Этот курс создан специально для тебя, если:
Курс - это практика
Основа этого курса — практика. Подкрепляют практику сотни наглядных видео-уроков и текстовых материалов.
Благодаря наглядным демонстрациям, тебе не придётся сомневаться "как он это установил" или "как именно он это сделал" — ты видишь своими глазами все шаги. С момента установки Python на свой компьютер и до готового опубликованного на своём домене и своих серверах большого проекта (rroom), все шаги со всеми объяснениями.
Тесты и практические задания на курсе делятся на две категории. Одни задания проверяются автоматически платформой курса, которую мы специально разработали для него. Другие задания проверяются лично автором курса. Это и задания со свободной формой ответа, и задания на программирование с код-ревью автора курса, и комплексные большие проекты, которые вы будете делать на курсе.
Вся коммуникация по данному курсу проходит только с автором. С одной стороны, это позволяет тебе получить максимально качественную поддержку и обратную связь во время прохождения курса, с другой — это не позволяет сделать курс дешёвым. В больших образовательных компаниях стоимость курса обусловлена огромными затратами на маркетинг, в нашем же с тобой случае — на подготовку и ведение самого курса.
Как создаются настоящие проекты? (Покажу на курсе)
Изучив язык программирования, какой-то фреймворк и сталкиваясь затем с реальным проектом, зачастую мы не знаем, как к нему подступиться, как его правильно начать и как его правильно сделать.
На курсе я покажу реализацию книжного сервиса rroom.io — от дизайна до готового сайта, которым пользуются люди.
Rroom — это проект для тех, кто читает книги. Регистрация пользователей, ведение книжных подборок, отзывов, комментарии, стены, интеграция интернет-эквайринга для оплат на сервисе, реализация автоматизированной рекламы и многое другое.
Будет показан весь процесс разработки и весь используемый тулинг. Стек: Python, FastAPI, SQLAlchemy, PostgreSQL, Redis, Dramatiq, TypeScript, SolidJS. Конкурирующие фреймворки (Django, React) также найдут отражение в курсе.
А затем и ты на курсе реализуешь свой большой веб-проект, применив все полученные знания и навыки.
Чтобы быть эффективным веб-разработчиком — неважно, backend, frontend, fullstack — мало знать только синтаксис выбранного языка программирования, например, Python или JavaScript. Для уверенной разработки веб-систем нужно иметь понимание и реальные навыки по всем технологическим блокам, работающим на разных слоях приложения.
Этих слоёв немало — это сам Интернет с его архитектурой и протоколами, это и серверные операционные системы Linux, и бэкенд-стек технологий, включающий в себя выбранный язык программирования, фреймворки, базы данных, системы планирования выполнения и прочее, это и целый спектр фронтенд-технологий.
Вне зависимости от того, работаешь ты бэкенд или фронтенд разработчиком, только фундаментальное понимание всех слоёв системы позволяет тебе быть эффективным, уверенным в своих силах специалистом, способным к красивому и эффективному решению задач веб-разработки.
Плюс — передовые методики разработки ПО. Асинхронные решения, автотесты, информационная безопасть, CI/CD.
Цель этого курса — дать тебе все необходимые навыки и закрепить их на практике.
Для кого этот курс
Этот курс создан специально для тебя, если:
- ты готов к хардкорному погружению в веб-разработку
- ты ещё не начал погружаться в тему веб-разработки и хочешь начать это делать правильно — от фундамента к первому этажу и выше
- ты уже начал изучать язык программирования, но как полноценно создавать веб-системы и как они работают, у тебя понимания нет
- ты уже разрабатываешь веб-системы, но хочешь стать более эффективным мощным бойцом, понимающим, как всё работает на всех уровнях приложения
- ты хочешь увидеть, как делаются настоящие большие веб-проекты и хочешь на реальной практике научиться делать такие же
- ты хочешь научиться писать качественный код и выстраивать расширяемую архитектуру своих приложений
- ты стажер, джун, мидл, сеньор, архитектор или президент компании (Билли, Гейтс, ты тоже приходи, потрындим)
Курс - это практика
Основа этого курса — практика. Подкрепляют практику сотни наглядных видео-уроков и текстовых материалов.
Благодаря наглядным демонстрациям, тебе не придётся сомневаться "как он это установил" или "как именно он это сделал" — ты видишь своими глазами все шаги. С момента установки Python на свой компьютер и до готового опубликованного на своём домене и своих серверах большого проекта (rroom), все шаги со всеми объяснениями.
Тесты и практические задания на курсе делятся на две категории. Одни задания проверяются автоматически платформой курса, которую мы специально разработали для него. Другие задания проверяются лично автором курса. Это и задания со свободной формой ответа, и задания на программирование с код-ревью автора курса, и комплексные большие проекты, которые вы будете делать на курсе.
Вся коммуникация по данному курсу проходит только с автором. С одной стороны, это позволяет тебе получить максимально качественную поддержку и обратную связь во время прохождения курса, с другой — это не позволяет сделать курс дешёвым. В больших образовательных компаниях стоимость курса обусловлена огромными затратами на маркетинг, в нашем же с тобой случае — на подготовку и ведение самого курса.
Как создаются настоящие проекты? (Покажу на курсе)
Изучив язык программирования, какой-то фреймворк и сталкиваясь затем с реальным проектом, зачастую мы не знаем, как к нему подступиться, как его правильно начать и как его правильно сделать.
На курсе я покажу реализацию книжного сервиса rroom.io — от дизайна до готового сайта, которым пользуются люди.
Rroom — это проект для тех, кто читает книги. Регистрация пользователей, ведение книжных подборок, отзывов, комментарии, стены, интеграция интернет-эквайринга для оплат на сервисе, реализация автоматизированной рекламы и многое другое.
Будет показан весь процесс разработки и весь используемый тулинг. Стек: Python, FastAPI, SQLAlchemy, PostgreSQL, Redis, Dramatiq, TypeScript, SolidJS. Конкурирующие фреймворки (Django, React) также найдут отражение в курсе.
А затем и ты на курсе реализуешь свой большой веб-проект, применив все полученные знания и навыки.
- Подготовка
- Цели курса
- Как будет проходить курс
- Границы тем курса
- Как потратить время зря
- Как получить от курса максимум
- Многозадачность, сон, скорость
- Задания, Google и ChatGPT
- Разделы КОМП — Как Оно Мне Поможет
- Задавайте вопросы
- Платформа
- Практика — rroom
- Книги!.md
- Как работает компьютер
- Computer Science
- Римские и арабские цифры
- А если бы у нас было шесть пальцев
- Когда ленточка — это всё, что нужно
- Биты-байты
- Шестнадцатеричная система счисления
- Как научить электричество считать
- Цифровая и аналоговая техника
- Как Software меняет правила игры, Assembler
- Hardware — основное компьютерное железо
- Итоги
- Дополнительные материалы
- Программное обеспечение
- Клавиатура, мышь, голос, мысль
- Как достичь слепого набора текста
- Операционные системы
- Установка удобного эмулятора терминала
- Установка GNU/Linux в Windows 10 с WSL
- Переключение версии WSL
- Установка Debian GNU/Linux в Oracle Virtualbox
- Установка Debian GNU/Linux на Apple Silicon Mac с UTM
- SSH-подключение к виртуальной машине
- Искусственный интеллект коровы
- Интеграция Windows и GNU/Linux с WSL
- Кодировки и hex-дампы
- Обходим защиту почтовых программ
- Языки программирования
- Эффективность языков программирования и программ
- Компилятор и интерпретатор
- Алгоритмы
- Пример — бинарный поиск
- Структуры данных
- Как гуглить
- Время, UTC, таймзоны, синхронизация
- Итого
- Дополнительные материалы
- GNU/Linux
- Из чего сделаны облака
- Перемещения в пространстве (во времени будет дальше)
- Маски-шоу
- История команд и невероятные возможности
- Редактирование команд
- Философия Unix
- Стандартный поток вывода
- Стандартный поток вывода ошибок
- Стандартный поток ввода
- Каналы и конвейеры
- Чёрная дыра
- Тройничок — это хорошо
- Создаём и удаляем
- Чистота чисто Тайд
- Консольные текстовые редакторы nano, micro, helix
- Работаем только с нужными частями файла
- Следим за изменениями вывода команды
- Права суперпользователя
- Осваиваем перемещение во времени
- Псевдонимы
- "Помогити!"
- Переменные окружения HOME, USER, PWD
- Переменная окружения PATH, команда type
- Переменная окружения CDPATH
- Основные директории GNU/Linux и их назначение
- Жёсткие и символические ссылки
- Пользователи и группы
- Права доступа
- Битовая маска прав доступа
- Архивирование и разархивирование
- Поиск
- Терминальные мультиплексоры screen, tmux, zellij
- Процессы и утилиты top, htop
- Загрузка файлов из сети
- Оболочки bash, zsh, fish, nushell
- bat и другие современные аналоги
- make-файлы
- Итого
- Дополнительные материалы
- Как работает Интернет и веб — основы
- КОМП
- Компьютерные сети. Сетевые интерфейсы
- Ещё железяки — концентраторы и коммутаторы
- MAC-адреса, слежка АНБ и реклама
- Маршрутизаторы (роутеры), Internet
- Локальные и глобальные сети LAN & WAN
- Клиент-сервер
- Спецификации (протоколы), OSI-модель
- Сетевые протоколы TCP IP
- IP и порт
- NAT
- IPv4, IPv6, DNS
- Прокси-сервера и VPN
- DHCP
- Дополнительные материалы
- DNS
- DNS
- Доменные зоны
- Выбор и покупка домена rroom io
- Система DNS серверов
- DNS-записи
- Как посмотреть DNS записи любого домена
- NS-сервера и DNS-записи
- Файл hosts и доменное имя localhost
- Создание почты в своём домене hi(собака)rroom.io
- HTTP, HTTPs
- Что такое протокол HTTP
- Установка Telnet
- Ещё раз о TCP-портах
- Творим дичь — отправка HTTP-запроса вручную
- HTTP-методы
- Безопасность и идемпотентность веб-сервисов
- HTTP-статусы
- HTTP-заголовки
- Смотрим HTTP-данные в Chrome Developer Tools
- Из чего состоит URL
- Как данные передаются на сервер
- Методология REST
- HTTPs
- Дополнительные материалы
- HTTP2
- Как всё было — HTTP/0.0, HTTP/1.0, HTTP 1.1
- Проблемы HTTP/1.1
- Решения HTTP2
- Что будет дальше
- Сессии, cookies, безопасность
- Аутентификация и авторизация
- Хеш-функции
- Хранение паролей, механизм аутентификации
- Cookies — кто и как устанавливает и использует
- Работа Cookies, безопасность
- Подпись Cookies хешем
- Быстрое погружение во frontend
- Фронтенд и бэкенд Компонены фронта и бэка
- HTML, CSS
- Запуск веб-сервера, абсолютный и относительны
- Делаем свой Интернет
- HTML-формы
- Chrome developer tools
- Смочить лапки в JavaScript
- Хакаем игру с динозавром в Google Chrome
- Python для самых маленьких хардкорщиков
- Собстна, а почему Python?
- Изучение языка программирования
- Как пишутся программы
- Установка Python и настройка VS Code
- Снова о блокноте
- Практика
- Переменные
- Как работают переменные в Python
- Числовые типы данных
- Строки
- Булевы
- Преобразования типов
- Ветвление логики
- Списки
- Циклы
- Бесконечный цикл
- Кортежи
- Множества
- Словари
- Когда какую структуру использовать
- Работа с аргументами командной строки
- Функции
- Рекурсия
- Сортировка данных
- Области видимости переменных
- Нейминг, type hinting, комментарии
- Объекты
- Исключения
- Пакеты, модули
- Синтаксический сахар
- Работа с датами и временем, таймзоны
- Регулярные выражения
- Удобности стандартной библиотеки
- Запуск внешних утилит
- Виртуальные окружения — venv, pip, poetry, pdm
- Баги и работа с ними
- Критерии хорошей программы
- PEP8
- Python для подрастающих хардкорщиков
- Документация
- Процедурное и объектно-ориентированное программирование
- Позиционные и keyword аргументы
- Внутренние и анонимные функции
- Замыкания
- args и kwargs
- Генераторы (не дизельные)
- Декораторы
- Инкапсуляция
- Наследование
- Полиморфизм
- Protected и private атрибуты
- Конструктор и инициализатор
- Геттеры и сеттеры
- Property
- Кэширование результатов функции
- Методы — классов, объектов и статические
- Абстрактные классы и интерфейсы
- Агрегация и композиция
- Важные дандер-методы
- Когда использовать классы
- Датаклассы, attrs, pydantic
- == и is
- Кортежи-таки можно менять
- map, filter, reduce и pythonic-аналоги
- Ссылочные параметры функции
- Функции как объекты
- defaultdict
- Свои исключения
- Строки и байты, BOM
- Сериализация и десериализация данных
- pickle, json, xml, protobuf
- Подсказки типов
- Утиная и гусиная типизация
- Статическая структурная типизация
- Регулярные выражения
- Перегрузка операторов
- Контекстный менеджер
- Pattern matching
- Инструментарий — ruff, black и другие
- Анализ скорости выполнения
- Настройка логирования
- Профилирование
- Дебаг
- Рефакторинг и инструменты
- Pythonic код
- Zen of Python
- Используй распаковку кортежей
- Однострочники
- Используй enumerate
- Используй слайсы
- Хитрая сортировка
- dict.get vs KeyError
- Объединение словарей
- Знай и используй стандартную библиотеку
- Используй pathlib
- Используй моржовый оператор
- Возбуждай исключения
- Используй генераторы
- Используй itertools
- Не пренебрегай функциями перед классами
- Простые геттеры и сеттеры для джавистов
- Используй контекстные менеджеры
- Используй Decimal для точных вычисления
- Используй repr
- Создавай пакеты
- Алгоритмы и структуры данных
- Алгоритмы
- Сложность алгоритма
- О большое
- Сортировка пузырьком
- Быстрая сортировка
- Сортировка слиянием
- Сортировка методом Шелла
- Массивы и связанные списки
- Кортежи
- Словарь
- Множество
- Стек и очередь
- Линейный поиск
- Бинарный поиск
- Алгоритм Дейкстры
- Жадные алгоритмы
- Как мы на практике NP-полную задачу решали
- README
- Как писать хорошо, а нехорошо не писать
- Искусство или навык
- Нейминг
- Форматирование
- Комментарии
- DRY
- KISS
- YAGNI
- Как писать хорошие функции и методы
- Проектирование от функций
- Функции большие и малые
- Отмерять и отрезать
- Закон Деметры
- Принцип единой ответственности
- Принцип окрытости-закрытости
- Принцип подстановки Барбары Лисков
- Принцип разделения интерфейсов
- Принцип инверсии зависимостей
- Low Coupling, High Cohesion
- Принцип наименьшего удивления
- Абстракции
- Смешение уровней абстракции
- Валидации, проверки, исключения
- Оценка качества программы
- Рефакторинг
- Борьба со сложностью
- Термины бизнес-области
- Git
- Git — must-have инструмент любого разработчика
- Установка
- Инициализация Git-репозитория и что происходит под
- Первый коммит
- Список коммитов и информация о коммите
- Индекс и объектное хранилище Git
- Што такое, зачем так сложно, Линус, я недоволен
- Как добавить в репозиторий пустую директорию
- Как закоммитить сразу несколько файлов
- Как включать игнор
- Удобные сокращения git-команд
- Удобная история изменений проекта
- Создание новой ветки
- Сливаем ветки
- Красота и величие указателя HEAD
- GUI для работы с Git
- Merge-коммит и его особенности
- Конфликты слияния
- Изучаем разницу версий
- Откат изменений в рабочей директории или индексе
- Сброс проекта до старого коммита
- Подправить последний коммит
- rebase для предотвращения merge-коммитов
- rebase для объединения коммитов
- Клонируем удалённый репозиторий
- Создаём свой удалённый репозиторий
- Pull Request A.K.A. Merge Request
- Кто, когда и зачем добавил эту строку в проект
- Изменения истории веток, уже отправленных на сервер
- Тайные тайники Git
- cherry-pick и патчи (не корейские)
- Другие возможности Git
- Gitflow, GitHub Flow — организационный процесс работы с Git
- Правила комментирования коммитов
- pre-commit
- Markdown
- Итого
- Дополнительные материалы
- Контейнеризация — Docker, Podman и коллеги
- Что такое контейнеризация?
- Оркестратор, движок контейнеров, OCI рантайм
- Как работают контейнеры
- Образы контейнеров
- Docker vs Podman
- Запуск и остановка контейнера
- Вход в контейнер
- Работа с образами и контейнерами на локальном компьютере
- Dockerfile, Containerfile, сборка образа
- docker-compose, podman pods
- Volumes
- Сеть
- Вопросы безопасности контейнеров
- Пример контейнеризованного Python веб-приложения
- Деплой с контейнерами
- Дополнительные материалы
- Первая практика с FastAPI
- Постановка задачи
- Пишем HTTP сервачелло на голом Python
- О фреймворках и библиотеках
- Пишем Hello World на FastAPI
- Создаём HTML шаблон
- Создаём и стилизуем форму логина
- Принимаем данные формы на бэкенде
- Проверка логина и пароля из формы
- Сохраняем пользователя в Cookies
- Читаем Cookie запись
- Цифровая подпись Cookies
- Хеширование паролей
- JavaScript и AJAX
- SPA и JS фреймворки
- Варианты передачи данных в запросе
- Веб-сокеты
- Git
- Покупка и настройка домена
- Привязка домена к серверу
- Перенос приложения на сервер
- Настройка сертификата
- SQL и PostgreSQL
- О PostgreSQL
- Установка PostgreSQL в контейнере
- Установка PostgreSQL в Linux из пакетного менеджера
- Сборка PostgreSQL из исходников
- Установка PostgreSQL установщиком на маке
- Тулзяшечки — psql, pgcli, DBeaver, PyCharm
- ACID
- Термины — реальные и задротские
- Первичный ключ и внешний ключ
- Основные типы данных
- DDL, DML, DCL, TCL и прочий БДСМ
- Создаём пользователя
- Создаём БД, схему, таблицы, связи
- Комментарии в SQL и к таблицам-колонкам
- Вставка данных
- Простейшие выборки
- Обновление и всякое хитрое удаление данных
- Операторы и фильтрация выборки
- Сортировка выборки
- Ограничение количества возвращаемых данных
- Псевдонимы = алиасы = aliases
- LIKE, ILIKE
- Использование даты и времени
- CASE WHEN
- Выборка из нескольких таблиц — JOIN
- Coalesce и значения NULL
- Подсчет количества результата
- Группировка результатов выборки
- Фильтрация вкупе с группировкой
- Агрегатные функции
- Работа со строками
- Приведение типов
- Подзапросы
- UNION, EXCEPT, INTERSECT
- Вьюшки обычные и материализованные
- CTE
- Оконные функции
- Пример с оконными функциями
- Транзакции
- Read Committed изоляция транзакций
- Repeatable Read изоляция транзакций
- Serializable изоляция транзакций
- Массивы
- JSON и JSONB
- Индексы в PostgreSQL
- Индекс на уникальность
- Индекс по выражению
- Частичные индексы
- Виды индексов PostgreSQL
- Полнотекстовый поиск в PostgreSQL
- Нормализация и денормализация
- Репликация и шардинг
- Что использовать в качестве первичного ключа?
- Временные таблицы
- TRUNCATE
- Триггеры и правила
- EXPLAIN
- OLTP и OLAP
- PL/pgSQL
- Получаем размер базы данных
- Стратегии бэкапов
- Пулер запросов PgBouncer и Yandex Odyssey
- SQLite
- Дополнительные материалы
- Redis
- Зачем нам этот ваш ещё Redis?
- Установка Redis
- Что внутри
- Строки
- Хеши
- Списки
- Множества
- Отсортированные множества
- Транзакции
- Срок жизни ключей
- Pub-sub
- Streams
- Репликация
- Дополнительные материалы
- Асинхронный Python
- Как оно работает обычно
- Процессы, потоки, корутины
- GIL
- Чем поможет нам asyncio
- Concurrency is not parallelism
- Сопрограммы, они же корутины
- Шо за цикл событий такой умный?
- Почему мой код не выполняется быстрее с async-await?
- И как же мне ускорить выполнение кода c конкурентностью?
- asyncio.create_task
- Ожидание окончания выполнения задачи
- Когда использовать и когда не использовать асинхронность
- Способы запустить код асинхронно
- asyncio.gather
- asyncio.TaskGroup
- asyncio.as_completed
- asyncio.wait
- Надо ли обычные функции определять с async def?
- Асинхронно ходим в веб-сервисы
- Асинхронно ходим в СУБД
- Асинхронно ходим в файлы
- Трэш и содомия — пулы процессов
- Семафоры
- asyncio.to_thread
- Контекстные переменные
- throttle и debounce
- Как принудительно отдать управление в цикл событий
- uvloop и замена цикла событий
- Django и как его готовить
- Обзор фреймворка, преимущества и недостатки
- Установка, инициализация, структура
- Первое приложение
- Модели хранилища
- Подцепляем контейнеры
- Миграции
- Великий и ужасный Django ORM
- Какой SQL варганит Django ORM
- Оптимизация использования Django ORM
- Или ну его в пень и пишем голый SQL
- Шаблоны
- Админка
- Реализация CRUD влоб
- Формы
- Function Based и Class Based Views
- Django для SPA и для не SPA
- Аутентификация
- Авторизация
- Аутентификация через внешние сервисы
- CORS в Django
- CRUD с DRF
- Swagger с DRF
- Асинхронность в Django
- Фоновые задачи с Django
- Использование Django apps
- Архитектура Django-проектов
- Стайлгайд
- Two Scoops of Django
- Дополнительные материалы
- FastAPI, SQLAlchemy, Alembic
- Обзор фреймворка, преимущества и недостатки
- Асинхронность в FastAPI
- Запросы-ответы-валидация
- Выуживаем данные запроса
- Return Type
- Статусы ответов
- Swagger с FastAPI
- CORS в FastAPI
- Подцепляем контейнеры
- Асинхронный SQLAlchemy
- Миграции с Alembic
- CRUD c SQLAlchemy
- Фоновые задачи с FastAPI
- Вебсокеты и Server Side Events с FastAPI
- Архитектура FastAPI-проектов
- Автотесты
- Зачем нам автотесты
- Какие есть виды тестов
- Пирамида тестирования
- и при чём тут архитектура
- unittest, pytest, nose
- Структура теста
- Рекомендации по юнит-тестам
- Чем качественные юнит-тесты отличаются от некачественных
- Тесты в Django
- Тесты в FastAPI
- Мокать аль не мокать?
- Школы тестирования
- Test suite для проекта
- Интеграционное тестирование
- E2E тестирование
- База данных в тестах
- Тесты и приватные методы
- Время
- Изучаем Pytest
- Архитектура backend-приложений
- Что такое архитектура и зачем она нам
- Быстрее отгрузить vs Сделать хорошо
- Писать хорошо, а нехорошо не писать
- Что есть зависимость
- Любую зависимость можно инвертировать
- Устойчивость кода
- Отделяем мух от котлет
- Сущности
- Сервисы = сценарии использования
- Репозитории, инфраструктура
- Чистая, гексагональная, портов и адаптеров и прочие архитектуры
- Зависимости
- Сборка всего приложения
- Пример
- 12 факторов
- Один код — разные развёртывания
- Зависимости
- Конфигурация
- Сторонние сервисы
- Сборка, релиз, выполнение
- Процессы
- Port binding
- Параллелизм
- Утилизируемость
- Паритет разработки и работы приложения
- Логи
- Задачи администрирования
- HTML
- Версии HTML
- Структура документа
- Кодировка документа и текста
- Что за что отвечает
- Тэги
- Форматирование текста
- Ссылки
- Списки
- Entities, UTF8 символы
- Разные размеры изображений
- Растровая и векторная графика
- Фоновые изображения
- Пути
- Семантическая разметка, контейнеры
- Таблицы
- Формы
- Комментарии
- Favicon
- Фреймы
- Block и inline элементы
- Canvas
- Интеграция плееров
- Форматирование HTML-кода
- W3C-валидатор
- CSS или как всех достать, раскрасить и распихать
- Что может делать CSS
- Подключение стилей
- Макет страницы
- Что такое стиль
- Codepen
- Достать по тэгу
- Достать по классу
- Достать по идентификатору
- Достать по атрибуту
- Достать сразу нескольких
- Родственные отношения
- Достать потомков
- Достать детей
- Псевдоклассы, псевдоэлементы
- Достать родственничков
- Достать вот этих, но не тех
- Наследование
- Специфичность
- Хак с important
- Сброс стилей
- Шрифты и форматирование текста
- Цвета — RGB, RGBA, HSL, HSLA
- Размеры
- Списки
- Блочная модель
- Схлопывание полей
- Блочные и строчные элементы
- Границы и тени
- Установка размера блочного элемента
- box-sizing
- Overflow, ограничение max размеров
- float
- Изображения фоном
- Несколько фоновых изображений
- Список ссылок, ролловеры
- Трансформация без трансформатора
- Анимации
- Оформление таблиц
- Оформление форм
- Фикс, резина, адаптив
- Как верстать?
- Древняя верстка
- Современность — flexbox
- Позиционирование
- Как делается адаптив
- Контейнерные запросы
- Как узнать, какая тема на устройстве включена?
- Включен ли режим энергоэффективности?
- Как скрыть или показать элемент?
- calc
- min, max, clamp
- CSS-валидатор
- Can I use
- Минимизация CSS
- БЭМ
- Дополнительные материалы
- Мобильные приложения на фронтенд-технологиях
- Cordova
- Ionic
- PWA
- Деплой веб-приложения
- Сколько нам нужно железа
- Арендуем сервачелло
- Присобачиваем домен
- Прокидываем SSH-ключи
- Ставим необходимые пакеты
- Используем контейнеры на проде
- Ставим Python
- Ставим PostgreSQL
- Ставим пулер коннектов для PostgreSQL
- Разворачиваем чудо-приложеньку
- Настраиваем Systemd
- Настраиваем файрвол
- Настраиваем анти-DDoS в Nginx
- Статику раздаёт Nginx, S3 или CDN
- Выносим PostgreSQL на отдельный сервер
- Настраиваем бэкапы
- Настраиваем ротацию логов
- Клонируем application-серваки
- Как запустить это всё в контейнерах
- А теперь подвиньтесь, выходит Ansible
- JavaScript
- Где применяется JavaScript?
- Типы данных
- Управляющие конструкции, печать
- var, let, const
- Функции
- Стрелочные функции
- Объекты, методы, this
- null, undefined
- Глобальные браузерные переменные
- Структуры данных
- Деструктуризация, распространение
- Циклы
- Исключения
- Работа с датой и временем
- Форматирование строк
- Функциональное программирование в JS
- Модули
- Стиль кода
- Асинхронный JS
- Полифилы
- Работа с DOM-деревом на чистом JavaScript
- События в браузере
- MutationObserver
- Fetch и axios
- Cookies и LocalStorage
- node, deno
- Дополнительные материалы
- TypeScript
- Для чего нам TypeScript?
- Установка TypeScript
- Теперь везде ставить типы?
- Основные типы
- Типизация функций
- Интерфейсы и структурная типизация
- Any и запрет Any
- typeof
- Дженерики
- Типизация объектов
- Keyof
- Typeof
- React и SolidJS
- Зачем нам вообще фронтенд-фреймворки?
- Веб-компоненты
- React vs SolidJS
- Создаём React-приложение
- JSX и чем он хорош
- Нарезаем компоненты
- Props
- Условный рендеринг
- Передача данных компонентам вверх и вниз
- Стейт
- Понимание рендера
- Контекст
- Refs
- Жизненный цикл
- Хуки
- Управление стейтом приложения
- Как проблемы React решает Solid?
- Установка Solid
- JSX Solid
- Сигналы Solid
- Эффекты Solid
- Memos Solid
- Порталы, ууу
- Рендер-логика в Solid
- Жизненный цикл в Solid
- События с Solid
- Refs в Solid
- Стилизация
- Удобные хранилища Solid
- Асинхронность в Solid
- TypeScript в Solid
- Архитектура frontend-приложения
- Бэкендерское тут неприменимо?
- Разбираемся с FSD
- Продолжаем разбираться с FSD
- Микрофронтенды
- Практика
- Взлом и защита
- Обзор
- Злодейски угоняем аккаунт
- Защита
- Коварно строим подлянки юзерам
- Защита
- Негодяйски угоняем данные
- Защита
- Подлецки хакаем сервер
- Защита
- Коварно хихикая, фишим
- Защита
- Левой пяткой хакаем Django
- Защита
- Мощнецки дудосим
- Защита
- Обуваем всех подряд
- Защита
- Заметки по безопасности
- CI/CD
- Зачем нам оно
- Подходы к CI/CD
- Сине-зеленое развертывание
- Инструменты
- Демонстрация
- Облачные технологии
- Зачем оно нам?
- Платформы
- Сервера
- S3-хранилища
- CDN
- Управляемые СУБД
- Балансеры
- Serverless Containers
- Lambda
- Инфраструктура как код
- Terraform, Ansible
- Советы по работе в ИТ
- Резюме
- Собеседование
- Опыт работы
- Дизайн в проектах
- Как спрашивать помощи
- Самозванцы и Даннинг-Крюгер
- Тех долг
- Рефакторинг
- Изменяемость и неизменяемость
- Логирование
- Конфиги
- Знай и используй инструментарий
- Code review
- Локализуй проблему
- Задавай вопросы бизнесу
- Обучение
- Документация
- Баланс
- Модненький Agile
- Что всем от вас надо
- Касания с другими людьми
- Помогайте
- Обещания и профессиональная честность
- Мотивация vs Творчество vs Дисциплина
- Привычки
- Удалёнка
- Rroom
- О проекте Rroom, план работ
- Финальный проект
- Задание
- Что дальше
- Что дальше
https://privatelink.de/?https://course.to.digital/