Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
61 commits
Select commit Hold shift + click to select a range
74fed2b
Initial commit
dpylypen Feb 24, 2026
2fe184f
chore: scaffold C++ dev container
yevhenkuznetsov Apr 21, 2026
6851e1f
fix: make devcontainer initialize script cross-platform
yevhenkuznetsov Apr 21, 2026
ef74c78
fix: create nested WORKSPACE_FOLDER path in Dockerfile
yevhenkuznetsov Apr 21, 2026
5f8e4e7
chore: recommend Dev Containers extension via .vscode/extensions.json
yevhenkuznetsov Apr 21, 2026
f8e41b0
chore: add macOS host prep script for Docker via Colima
yevhenkuznetsov Apr 21, 2026
93f889a
chore: add Linux and Windows host prep scripts
yevhenkuznetsov Apr 21, 2026
49d7702
lesson1
yevhenkuznetsov Apr 21, 2026
ff09b43
docs: replace preps/ shell scripts with platform notes
yevhenkuznetsov Apr 21, 2026
44e8acb
revert: remove block2-lesson1/ subdirectory
yevhenkuznetsov Apr 21, 2026
df13fe5
feat: add lesson starter CMake project at repo root
yevhenkuznetsov Apr 21, 2026
4e62365
docs(preps): rework clone flow and add Windows troubleshooting
yevhenkuznetsov Apr 22, 2026
d92dca4
fix(devcontainer): create ~/.ssh in initialize to prevent mount failure
yevhenkuznetsov Apr 22, 2026
8859f96
fix(devcontainer): free UID 1000 by removing default ubuntu user
yevhenkuznetsov Apr 22, 2026
f5dd838
feat(homework-04): add wheel odometry starter (CMake, main stub, samp…
yevhenkuznetsov Apr 23, 2026
8302d4a
Merge block-2-lesson-2 into main
yevhenkuznetsov Apr 23, 2026
50a58c3
feat(devcontainer): add ssh and git packages
yevhenkuznetsov Apr 23, 2026
672ebcb
Merge pull request #3 from yevhenkuznetsov/feature/devcontainer-add-p…
yevhenkuznetsov Apr 23, 2026
26b4e16
chore(devcontainer): pin ubuntu base image by digest
yevhenkuznetsov Apr 24, 2026
5f6fb29
build(cmake): include homework_04 from root
yevhenkuznetsov Apr 24, 2026
c840527
ci(build): add workflow using devcontainers/ci
yevhenkuznetsov Apr 24, 2026
4de1dcd
ci(build): disable image push in devcontainers/ci
yevhenkuznetsov Apr 24, 2026
5629146
ci(build): limit push trigger to main to avoid duplicate PR runs
yevhenkuznetsov Apr 24, 2026
08661c1
Merge pull request #4 from robot-dreams-code/ci/devcontainer-github-a…
yevhenkuznetsov Apr 24, 2026
0f42450
chore(devcontainer): drop hardcoded UID 1000, rely on updateRemoteUse…
yevhenkuznetsov Apr 24, 2026
666102d
Merge pull request #5 from robot-dreams-code/chore/devcontainer-simpl…
yevhenkuznetsov Apr 24, 2026
2b28f49
build(cmake): drop root main.cpp and app target
yevhenkuznetsov Apr 24, 2026
bf3f0b6
docs(readme): rewrite root README
yevhenkuznetsov Apr 24, 2026
72cbca1
docs(readme): document template workflow and upstream updates
yevhenkuznetsov Apr 24, 2026
4824e85
docs(changelog): add CHANGELOG.md with recent merged PRs
yevhenkuznetsov Apr 24, 2026
2bdaf06
docs(readme): tell Windows students to clone inside WSL
yevhenkuznetsov Apr 24, 2026
c8ff677
docs(readme): recommend Docker Engine over Docker Desktop
yevhenkuznetsov Apr 24, 2026
5366eca
docs(readme): note how to give lecturer access for review
yevhenkuznetsov Apr 24, 2026
8b2e71b
Merge pull request #6 from robot-dreams-code/chore/root-cleanup
yevhenkuznetsov Apr 24, 2026
7249afd
docs(readme): add farnblack as second lecturer contact
yevhenkuznetsov Apr 24, 2026
4340d4e
Merge pull request #7 from robot-dreams-code/docs/add-second-lecturer…
yevhenkuznetsov Apr 24, 2026
0231823
docs(readme): drop git-sync recipes, route updates through Slack
yevhenkuznetsov Apr 26, 2026
fc44fe5
Merge pull request #8 from robot-dreams-code/docs/fix-upstream-update…
yevhenkuznetsov Apr 26, 2026
ac61115
docs(preps): align setup docs with template flow
yevhenkuznetsov Apr 30, 2026
58851e7
chore(clangd): wire clangd to CMake compile database
yevhenkuznetsov Apr 30, 2026
760f005
chore(clang-tools): add clang-tidy course config
yevhenkuznetsov Apr 30, 2026
274ca56
chore(devcontainer): add debug tools for diagnostics
yevhenkuznetsov Apr 30, 2026
ce36e67
docs(config): document student-facing setup files
yevhenkuznetsov Apr 30, 2026
54eaef8
docs(homework): keep C++ comments in English
yevhenkuznetsov Apr 30, 2026
e183e71
Merge pull request #9 from robot-dreams-code/chore/setup-course-tooling
yevhenkuznetsov Apr 30, 2026
8dbff8a
chore(vscode): add build and clean tasks
yevhenkuznetsov Apr 30, 2026
00ffa67
Merge pull request #10 from robot-dreams-code/chore/add-vscode-build-…
yevhenkuznetsov Apr 30, 2026
43a14f2
docs(changelog): record tooling updates
yevhenkuznetsov Apr 30, 2026
ff56262
feat(block-2-lesson-2-4): add local and remote GDB demo
yevhenkuznetsov Apr 30, 2026
3669355
feat(block-2-lesson-2-4): add homework 05 telemetry starter
yevhenkuznetsov Apr 30, 2026
1dfb382
chore(block-2-lesson-2-4): add debug presets and launch tooling
yevhenkuznetsov Apr 30, 2026
501d0c9
docs(block-2-lesson-2-4): document debug demo and homework starter
yevhenkuznetsov Apr 30, 2026
b901eee
fix(block-2-lesson-2-4): align debug_probe demo naming
yevhenkuznetsov Apr 30, 2026
2f9f8d5
chore(block-2-lesson-2-4): enable core dump debugging in devcontainer
yevhenkuznetsov Apr 30, 2026
117412f
Merge pull request #11 from robot-dreams-code/feat/homework-05-debug-…
yevhenkuznetsov Apr 30, 2026
c9ef455
fix(block-2-lesson-2-4): add clang sanitizer runtime to devcontainer
yevhenkuznetsov Apr 30, 2026
b28b2b0
Merge remote-tracking branch 'course/main' into merge-from-course
mandelbroo Apr 30, 2026
92611ef
fix(block-2-lesson-2-4): adjust devcontainer diagnostics setup
yevhenkuznetsov Apr 30, 2026
4afc60b
Merge pull request #13 from robot-dreams-code/fix/block-2-lesson-2-4-…
yevhenkuznetsov Apr 30, 2026
93f819e
docs(block-2-lesson-2-4): document course update sync flow
yevhenkuznetsov Apr 30, 2026
421319b
Merge remote-tracking branch 'course/main' into HEAD
mandelbroo May 1, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion .devcontainer/.clang-format
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
---
Language: Cpp
# BasedOnStyle: Google
# Єдиний стиль форматування C++ прикладів у курсі.
# Файл копіюється в корінь devcontainer-а, щоб clang-format знаходив його
# незалежно від директорії, з якої запускається команда.
# BasedOnStyle: Google
AccessModifierOffset: -2
AlignAfterOpenBracket: Align
AlignConsecutiveMacros: false
Expand Down
52 changes: 52 additions & 0 deletions .devcontainer/.clang-tidy
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
# clang-tidy використовується як static analysis шар для C++ коду.
# Набір перевірок навмисно широкий, але не всі warning-и є помилками:
# частину сигналу студенти мають навчитися читати поступово.
Checks: >
-*,
bugprone-*,
clang-analyzer-*,
cppcoreguidelines-*,
modernize-*,
performance-*,
readability-*,
-readability-avoid-const-params-in-decls,
-readability-function-cognitive-complexity,
misc-unused-using-decls,

# Аналізувати лише код домашніх робіт і типові source/include директорії,
# а не системні headers або сторонні бібліотеки.
HeaderFilterRegex: '(^|/)(homework_[0-9]+|include|src)/'

# Помилки analyzer/core-guidelines/modernize мають ламати перевірку.
# Readability і performance лишаються попередженнями, щоб не блокувати
# навчальні ітерації надто рано.
WarningsAsErrors: clang-analyzer-*,
cppcoreguidelines-*,
modernize-*,

# Naming rules формують один стиль для прикладів курсу.
CheckOptions:
- key: readability-identifier-naming.FunctionCase
value: lower_case
- key: readability-identifier-naming.VariableCase
value: lower_case
- key: readability-identifier-naming.ConstantCase
value: CamelCase
- key: readability-identifier-naming.ConstantPrefix
value: k
- key: readability-identifier-naming.LocalVariableCase
value: lower_case
- key: readability-identifier-naming.ParameterCase
value: lower_case
- key: readability-identifier-naming.MemberCase
value: lower_case
- key: readability-identifier-naming.MemberSuffix
value: _
- key: readability-identifier-naming.PrivateMemberCase
value: lower_case
- key: readability-identifier-naming.PrivateMemberSuffix
value: _
- key: readability-identifier-naming.ClassCase
value: CamelCase
- key: readability-identifier-naming.StructCase
value: CamelCase
13 changes: 13 additions & 0 deletions .devcontainer/.clangd
Original file line number Diff line number Diff line change
@@ -1,4 +1,17 @@
# clangd працює як language server у VS Code.
# Основна інформація про include paths і compile flags береться з
# compile_commands.json, який генерує root CMakeLists.txt.
InlayHints:
Enabled: Yes
# Імена параметрів у викликах не показуються, щоб не перевантажувати
# екран на простих прикладах.
ParameterNames: No
# Типи, виведені через auto, корисно бачити під час навчання C++.
DeducedTypes: Yes

# clang-tidy конфіг лежить у repo/container, але diagnostics вимкнено до
# заняття 2.6, де static analysis буде окремою темою.
Diagnostics:
ClangTidy:
Remove:
- '*'
5 changes: 5 additions & 0 deletions .devcontainer/.cmake-format.json
Original file line number Diff line number Diff line change
@@ -1,4 +1,9 @@
{
"_course_note": [
"Конфіг cmake-format для CMakeLists.txt у курсі.",
"Файл копіюється в корінь devcontainer-а, щоб formatter знаходив",
"його незалежно від поточної директорії запуску."
],
"_help_parse": "Options affecting listfile parsing",
"parse": {
"_help_additional_commands": [
Expand Down
7 changes: 4 additions & 3 deletions .devcontainer/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
# docker inspect --format='{{index .RepoDigests 0}}' ubuntu:noble
FROM ubuntu:noble@sha256:c4a8d5503dfb2a3eb8ab5f807da5bc69a85730fb49b5cfca2330194ebcc41c7b

# Noninteractive frontend, щоб apt не зависнув чекаючи відповіді на
# Неінтерактивний frontend, щоб apt не зависнув чекаючи відповіді на
# питання (часовий пояс, клавіатура, kernel upgrade prompt). У Dockerfile
# інтерактивного stdin немає - без цього build може зависнути назавжди.
ARG DEBIAN_FRONTEND="noninteractive"
Expand All @@ -39,10 +39,11 @@ RUN apt update && \
# запуску - тобто вони знайдуться незалежно від того, де всередині
# контейнера змонтовано проєкт.
COPY .clang-format /.clang-format
COPY .clang-tidy /.clang-tidy
COPY .clangd /.clangd
COPY .cmake-format.json /.cmake-format.json

# Environment:
# Змінні середовища:
# - TZ: UTC як нейтральний дефолт. Логи завжди в UTC, без суперечок з
# літнім часом різних регіонів.
# - LC_ALL / LANG / LANGUAGE: en_US.UTF-8 щоб stdout/stderr коректно
Expand All @@ -52,7 +53,7 @@ ENV LC_ALL=en_US.UTF-8
ENV LANG=en_US.UTF-8
ENV LANGUAGE=en_US:en

# Passwordless sudo для dev-контейнера: зручно для apt install на ходу,
# sudo без пароля для dev-контейнера: зручно для apt install на ходу,
# debug tools, etc. У прод-образах ніколи - там контейнер має жорстко
# визначений набір прав.
RUN echo "ALL ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
Expand Down
18 changes: 18 additions & 0 deletions .devcontainer/apt-packages.in
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
# Базові пакети для стабільної роботи Ubuntu image.
ca-certificates
curl
locales
Expand All @@ -6,9 +7,26 @@ tzdata
ssh
git

# C++ toolchain і language server для редактора.
gcc
clang
clangd
clang-tidy

# Runtime-бібліотеки Clang sanitizer-ів і symbolizer для читабельного ASan/UBSan output.
libclang-rt-18-dev
llvm-18

# Крос-тулчейн для ARM64-пристроїв: RPi4, Radxa ROCK 5B+, Jetson.
g++-aarch64-linux-gnu

# Інструменти для заняття 2.4: локальний і remote debug, memory diagnostics.
gdb
gdbserver
gdb-multiarch
valgrind

# Інструменти збірки і форматери, які використовуються в лекціях та CI.
make
cmake
clang-format
Expand Down
56 changes: 44 additions & 12 deletions .devcontainer/devcontainer.json
Original file line number Diff line number Diff line change
@@ -1,43 +1,72 @@
{
// Назва, яка показується у VS Code Dev Containers UI.
"name": "CPP MilTech",
// Image збирається з локального Dockerfile. Аргументи потрібні, щоб
// container user і workspace path збігалися з host-сесією.
"build": {
"dockerfile": "Dockerfile",
"args": {
"WORKSPACE_FOLDER": "${localEnv:HOME}/${localWorkspaceFolderBasename}",
"CONTAINER_USER": "${localEnv:USER}"
}
},
// VS Code відкриває контейнер від імені того самого користувача, що й host.
// Це зменшує проблеми з ownership файлів у bind mount.
"remoteUser": "${localEnv:USER}",
// Проєкт монтується у домашню директорію користувача всередині контейнера.
// Так шляхи виглядають однаково на Linux, macOS і Windows+WSL.
"workspaceMount": "source=${localWorkspaceFolder},target=${localEnv:HOME}/${localWorkspaceFolderBasename},type=bind",
"workspaceFolder": "${localEnv:HOME}/${localWorkspaceFolderBasename}",
// SSH ключі потрібні для git operations. bash_history винесено на host,
// щоб історія команд переживала rebuild контейнера.
"mounts": [
"source=${localEnv:HOME}/.ssh,target=/home/${localEnv:USER}/.ssh,type=bind,readonly,consistency=cached",
"source=${localEnv:HOME}/.devcontainers/${localWorkspaceFolderBasename}/.bash_history,target=/home/${localEnv:USER}/.bash_history,type=bind,consistency=delegated",
"source=${localEnv:HOME}/.devcontainers/${localWorkspaceFolderBasename}/.bash_history,target=/home/${localEnv:USER}/.bash_history,type=bind,consistency=delegated"
],
// initialize створює host-side директорії для mounts до старту container-а.
// Запуск через bash робить команду стійкою до копіювання без executable bit.
"initializeCommand": [
"bash",
".devcontainer/scripts/initialize"
],
// host network спрощує SSH/debug сценарії для занять з target-пристроями.
// SYS_PTRACE і seccomp=unconfined потрібні для стабільної роботи GDB
// всередині контейнера, особливо коли debug-сесія attach-иться до процесу.
// ulimit core=-1 дозволяє процесам у контейнері створювати core dump.
// Сам шлях/формат core-файла все одно визначає host kernel через
// /proc/sys/kernel/core_pattern; у WSL це налаштовується окремо на host.
"runArgs": [
"--network=host",
"--cap-add=SYS_PTRACE",
"--security-opt=seccomp=unconfined",
"--ulimit=core=-1",
"--hostname=devcontainer",
"--add-host=devcontainer:127.0.1.1"
],
// Усе всередині customizations.vscode застосовується саме до VS Code
// сесії в контейнері. Це не те саме, що .vscode/extensions.json на host.
"customizations": {
"vscode": {
// Extensions встановлюються в devcontainer, щоб tooling був однаковий
// у всіх студентів незалежно від host VS Code.
"extensions": [
"josetr.cmake-language-support-vscode",
"cheshirekow.cmake-format",
"ms-vscode.cpptools",
"llvm-vs-code-extensions.vscode-clangd"
],
"settings": {
// clangd читає build/debug/compile_commands.json з debug preset.
// clang-tidy конфіг лишається в репозиторії, але автоматичний запуск
// через clangd буде увімкнено пізніше, після заняття 2.6.
"clangd.path": "/usr/bin/clangd",
"clangd.arguments": [
"--compile-commands-dir=ada_ws/build/x86_64/",
"--clang-tidy",
"--compile-commands-dir=build/debug",
"--background-index"
],
"clangd.restartAfterCrash": true,
// IntelliSense від Microsoft C++ extension вимкнено, щоб не було двох
// C++ language server-ів одночасно. Основний engine - clangd.
"C_Cpp.intelliSenseEngine": "disabled",
"[cpp]": {
"editor.defaultFormatter": "llvm-vs-code-extensions.vscode-clangd",
Expand All @@ -50,18 +79,21 @@
"[cmake]": {
"editor.defaultFormatter": "cheshirekow.cmake-format"
},
// cmake-format читає конфіг, який Dockerfile копіює в /.
"cmakeFormat.args": [
"--config-file=/.cmake-format.json"
],
"cmakeFormat.exePath": "/usr/bin/cmake-format"
}
},
"terminal.integrated.shell.linux": "bash",
"terminal.integrated.profiles.linux": {
"bash (container default)": {
"path": "/bin/bash",
"overrideName": true
"cmakeFormat.exePath": "/usr/bin/cmake-format",
// Єдиний bash profile у container terminal. Історія команд монтується
// окремо через mounts вище.
"terminal.integrated.defaultProfile.linux": "bash (container default)",
"terminal.integrated.profiles.linux": {
"bash (container default)": {
"path": "/bin/bash",
"overrideName": true
}
}
}
}
}
}
}
10 changes: 5 additions & 5 deletions .devcontainer/scripts/initialize
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
#!/usr/bin/env bash
set -euo pipefail

# Runs on the host (macOS, Linux, WSL2) before the container starts.
# Creates a bash history file under the host's home so shell history
# persists across container rebuilds.
# Скрипт виконується на host-системі (macOS, Linux, WSL2) до старту
# контейнера. Тут створюються host-side файли, які потім монтуються
# у devcontainer.
DEVCONTAINER_DATA_ON_HOST="${HOME}/.devcontainers/$(basename "${PWD}")"
mkdir -p "${DEVCONTAINER_DATA_ON_HOST}"
touch "${DEVCONTAINER_DATA_ON_HOST}/.bash_history"

# Ensure ~/.ssh exists so the bind-mount in devcontainer.json does not fail
# on fresh machines where the user never generated SSH keys yet.
# ~/.ssh має існувати до bind mount з devcontainer.json. На свіжих машинах
# SSH ключів може ще не бути, і без цієї директорії container start падає.
[ -d "${HOME}/.ssh" ] || mkdir -m 700 "${HOME}/.ssh"
5 changes: 5 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -1,9 +1,14 @@
# Нормалізувати текстові файли до LF, щоб приклади однаково працювали на
# Linux, macOS і Windows+WSL.
* text=auto eol=lf

# Shell scripts і devcontainer hooks завжди мають LF, інакше bash у Linux
# контейнері може падати на CRLF.
*.sh text eol=lf
.devcontainer/scripts/* text eol=lf
Dockerfile text eol=lf

# Бінарні assets не проходять text normalization.
*.png binary
*.jpg binary
*.jpeg binary
Expand Down
13 changes: 8 additions & 5 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -39,9 +39,10 @@ jobs:
# 4. Монтує checkout у workspaceFolder.
# 5. Виконує runCmd від імені remoteUser.
#
# -G Ninja: явно обираємо Ninja-генератор. ninja-build уже є у
# devcontainer-і, швидший за Make на проєктах з багатьма файлами
# (кращий паралелізм, менше overhead-у на запуск shell-команд).
# CMake preset debug тримає локальну і CI-збірку в одному місці:
# build/debug. Це також збігається з clangd compile_commands і
# VS Code debug launch config. ARM64 preset додатково перевіряє,
# що demo-код можна крос-компілювати для SBC target-а.
- name: Build inside dev container
uses: devcontainers/ci@v0.3
with:
Expand All @@ -51,5 +52,7 @@ jobs:
# на runner-і для runCmd.
push: never
runCmd: |
cmake -S . -B build -G Ninja
cmake --build build
cmake --preset debug
cmake --build --preset debug
cmake --preset aarch64-debug
cmake --build --preset aarch64-debug
Loading
Loading