diff --git a/docs/slides/2023-ros-meetup/README.md b/docs/slides/2023-ros-meetup/README.md new file mode 100644 index 0000000..c325274 --- /dev/null +++ b/docs/slides/2023-ros-meetup/README.md @@ -0,0 +1,3 @@ +# Презентация "Nix/NixOS - ОС-независимая сборка пакетов ROS" на ROS-Meetup'2023 + +Для просмотра скопируйте содержимое директории и откройте `ros-meetup-slides.html` в любом браузере. \ No newline at end of file diff --git a/docs/slides/2023-ros-meetup/drv-cryptohash.png b/docs/slides/2023-ros-meetup/drv-cryptohash.png new file mode 100644 index 0000000..1a5488d Binary files /dev/null and b/docs/slides/2023-ros-meetup/drv-cryptohash.png differ diff --git a/docs/slides/2023-ros-meetup/eelco.jpeg b/docs/slides/2023-ros-meetup/eelco.jpeg new file mode 100644 index 0000000..96fe93e Binary files /dev/null and b/docs/slides/2023-ros-meetup/eelco.jpeg differ diff --git a/docs/slides/2023-ros-meetup/map_repo_size_fresh-2018-06-08.svg b/docs/slides/2023-ros-meetup/map_repo_size_fresh-2018-06-08.svg new file mode 100644 index 0000000..30a9c4f --- /dev/null +++ b/docs/slides/2023-ros-meetup/map_repo_size_fresh-2018-06-08.svg @@ -0,0 +1,751 @@ + + + + + + + + + + + + Number of packages in repository + + Number of fresh packages in repository + + + 44000 + 0 + + 0 + 30000 + + + + + DPorts + DPorts + MX Linux MX-17 + MX Linux MX-17 + LEDE trunk AArch64 generic + LEDE trunk AArch64 generic + RPM Fusion Fedora 27 + RPM Fusion Fedora 27 + PlayDeb Yakkety Testing + PlayDeb Yakkety Testing + GetDeb Zesty Testing + GetDeb Zesty Testing + MX Linux MX-15 Testing + MX Linux MX-15 Testing + RPM Fusion EL 7 + RPM Fusion EL 7 + Linuxbrew + Linuxbrew + Stackage LTS Haskell + Stackage LTS Haskell + Libregamewiki + Libregamewiki + GNU Guix + GNU Guix + CRUX 3.3 + CRUX 3.3 + Ubuntu 16.04 + Ubuntu 16.04 + openSUSE Games Tumbleweed + openSUSE Games Tumbleweed + Funtoo + Funtoo + Raspbian Stable + Raspbian Stable + Arch Testing + Arch Testing + Sabayon + Sabayon + Debian Oldstable + Debian Oldstable + CRAN + CRAN + CRUX 3.2 + CRUX 3.2 + SteamOS alchemist + SteamOS alchemist + Debian Stable Backports + Debian Stable Backports + Scoop + Scoop + Trisquel 8.0 backports + Trisquel 8.0 backports + KDE neon Dev Unstable + KDE neon Dev Unstable + UnitedRPMs Fedora 25 + UnitedRPMs Fedora 25 + Trisquel 7.0 + Trisquel 7.0 + Pardus + Pardus + LEDE trunk ARM XScale + LEDE trunk ARM XScale + openSUSE Tumbleweed + openSUSE Tumbleweed + Linux Mint 17.2 + Linux Mint 17.2 + Tails stable + Tails stable + RPM Fusion Fedora 25 + RPM Fusion Fedora 25 + Astra Linux Orel + Astra Linux Orel + MX Linux MX-15 + MX Linux MX-15 + GetDeb Yakkety Testing + GetDeb Yakkety Testing + KaOS + KaOS + HaikuPorts master + HaikuPorts master + Kali Linux Rolling + Kali Linux Rolling + Debian Oldstable Backports + Debian Oldstable Backports + LEDE trunk ARM Cortex A9 VFPv3 + LEDE trunk ARM Cortex A9 VFPv3 + Ubuntu 18.04 Proposed + Ubuntu 18.04 Proposed + pkgsrc current + pkgsrc current + LEDE 17.01 x86_64 + LEDE 17.01 x86_64 + Ubuntu 14.04 + Ubuntu 14.04 + Linux Mint 18.2 + Linux Mint 18.2 + PureOS landing + PureOS landing + Deepin + Deepin + OpenMandriva Cooker + OpenMandriva Cooker + Rudix + Rudix + Deb Multimedia Unstable + Deb Multimedia Unstable + nixpkgs stable + nixpkgs stable + Debian Testing + Debian Testing + Fedora 27 + Fedora 27 + Manjaro Unstable + Manjaro Unstable + RubyGems + RubyGems + Rosa 2016.1 + Rosa 2016.1 + Tails devel + Tails devel + Linux Mint 17.3 + Linux Mint 17.3 + LEDE trunk x86_64 + LEDE trunk x86_64 + Devuan Stable + Devuan Stable + OpenWrt trunk x86 + OpenWrt trunk x86 + HaikuPorts release + HaikuPorts release + PlayDeb Xenial Testing + PlayDeb Xenial Testing + pkgsrc-2018Q1 + pkgsrc-2018Q1 + Ubuntu 18.04 + Ubuntu 18.04 + Manjaro Testing + Manjaro Testing + pkgsrc-2017Q2 + pkgsrc-2017Q2 + UnitedRPMs Fedora 24 + UnitedRPMs Fedora 24 + antiX-16 + antiX-16 + Sparky + Sparky + Vcpkg + Vcpkg + MacPorts + MacPorts + MX Linux MX-17 Testing + MX Linux MX-17 Testing + KDE neon User LTS + KDE neon User LTS + AUR + AUR + Maemo Fremantle + Maemo Fremantle + EPEL 7 + EPEL 7 + Parabola Testing + Parabola Testing + crates.io + crates.io + Trisquel 6.0 + Trisquel 6.0 + SteamOS brewmaster beta + SteamOS brewmaster beta + Linux Mint 18.3 + Linux Mint 18.3 + F-Droid + F-Droid + Manjaro Stable + Manjaro Stable + Trisquel 7.0 backports + Trisquel 7.0 backports + Hyperbola + Hyperbola + Calculate + Calculate + Debian Experimental + Debian Experimental + Entware + Entware + Raspbian Testing + Raspbian Testing + AOSC + AOSC + UnitedRPMs Fedora 26 + UnitedRPMs Fedora 26 + pkgsrc-2017Q1 + pkgsrc-2017Q1 + Linux Mint 17 + Linux Mint 17 + Gentoo overlay Pentoo + Gentoo overlay Pentoo + CentOS 6 + CentOS 6 + Alpine Linux Edge + Alpine Linux Edge + Parrot + Parrot + Sabayon for-gentoo + Sabayon for-gentoo + Antergos Main + Antergos Main + DistroWatch.com + DistroWatch.com + pkgsrc-2017Q3 + pkgsrc-2017Q3 + RPM Fusion EL 6 + RPM Fusion EL 6 + Devuan Testing + Devuan Testing + Arch + Arch + Linux Mint 18 + Linux Mint 18 + RPM Fusion Fedora Rawhide + RPM Fusion Fedora Rawhide + GetDeb Yakkety + GetDeb Yakkety + UnitedRPMs Fedora 28 + UnitedRPMs Fedora 28 + Debian Unstable + Debian Unstable + LEDE trunk MIPS 24Kc + LEDE trunk MIPS 24Kc + CentOS 7 + CentOS 7 + Mageia Cauldron + Mageia Cauldron + Parabola + Parabola + RPM Fusion Fedora 28 + RPM Fusion Fedora 28 + YACP + YACP + pkgsrc-2017Q4 + pkgsrc-2017Q4 + RPM Fusion Fedora 26 + RPM Fusion Fedora 26 + Rosa Server 7.3 + Rosa Server 7.3 + MX Linux MX-16 + MX Linux MX-16 + PlayDeb Zesty + PlayDeb Zesty + PCLinuxOS + PCLinuxOS + Ubuntu 17.10 + Ubuntu 17.10 + Raspbian Oldstable + Raspbian Oldstable + openSUSE Leap 15.0 + openSUSE Leap 15.0 + SteamOS alchemist beta + SteamOS alchemist beta + Rosa Server 6.9 + Rosa Server 6.9 + PlayDeb Zesty Testing + PlayDeb Zesty Testing + Trisquel 8.0 + Trisquel 8.0 + KDE neon User + KDE neon User + Homebrew + Homebrew + OpenBSD Ports + OpenBSD Ports + Fedora 28 + Fedora 28 + CPAN + CPAN + Ubuntu 12.04 + Ubuntu 12.04 + openSUSE Leap 42.3 + openSUSE Leap 42.3 + Stackage Nightly + Stackage Nightly + Devuan Unstable + Devuan Unstable + PlayDeb Xenial + PlayDeb Xenial + KaOS Build + KaOS Build + Hackage + Hackage + Debian Stable + Debian Stable + GetDeb Xenial + GetDeb Xenial + PlayDeb Yakkety + PlayDeb Yakkety + Mageia 6 + Mageia 6 + Gentoo + Gentoo + OpenWrt 15.05.01 ar71xx + OpenWrt 15.05.01 ar71xx + KDE neon Dev Stable + KDE neon Dev Stable + Rosa 2014.1 + Rosa 2014.1 + BlackArch + BlackArch + Fedora 26 + Fedora 26 + Ravenports + Ravenports + SteamOS brewmaster + SteamOS brewmaster + UnitedRPMs Fedora 27 + UnitedRPMs Fedora 27 + Trisquel 6.0 backports + Trisquel 6.0 backports + Linux Mint 17.1 + Linux Mint 17.1 + OpenIndiana packages + OpenIndiana packages + antiX-17 + antiX-17 + Linux Mint 18.1 + Linux Mint 18.1 + SlackBuilds + SlackBuilds + FreeBSD Ports + FreeBSD Ports + Antergos Staging + Antergos Staging + Chocolatey + Chocolatey + OpenWrt 15.05.01 x86 + OpenWrt 15.05.01 x86 + RPM Fusion Fedora 24 + RPM Fusion Fedora 24 + EPEL 6 + EPEL 6 + GoboLinux + GoboLinux + ALT Sisyphus + ALT Sisyphus + OpenMandriva 3.x + OpenMandriva 3.x + Wikidata + Wikidata + PureOS green + PureOS green + openSUSE Leap 42.2 + openSUSE Leap 42.2 + GetDeb Zesty + GetDeb Zesty + GetDeb Xenial Testing + GetDeb Xenial Testing + freshcode.club + freshcode.club + OpenWrt trunk ar71xx + OpenWrt trunk ar71xx + nixpkgs unstable + nixpkgs unstable + Fedora Rawhide + Fedora Rawhide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/slides/2023-ros-meetup/nix-snowflake.svg b/docs/slides/2023-ros-meetup/nix-snowflake.svg new file mode 100644 index 0000000..9a70a14 --- /dev/null +++ b/docs/slides/2023-ros-meetup/nix-snowflake.svg @@ -0,0 +1,513 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/slides/2023-ros-meetup/reproducible-testing.jpg b/docs/slides/2023-ros-meetup/reproducible-testing.jpg new file mode 100644 index 0000000..d1e5958 Binary files /dev/null and b/docs/slides/2023-ros-meetup/reproducible-testing.jpg differ diff --git a/docs/slides/2023-ros-meetup/ros-meetup-slides.md b/docs/slides/2023-ros-meetup/ros-meetup-slides.md new file mode 100644 index 0000000..1cc54ff --- /dev/null +++ b/docs/slides/2023-ros-meetup/ros-meetup-slides.md @@ -0,0 +1,268 @@ +--- +marp: true +theme: uncover +paginate: true + +--- + +# Nix/Nixos +ОС-независимая сборка пакетов ROS + +| + +Брылёв Игорь +robossembler.org + +--- + +# Что же такое ROS? + + + +* Стандарт +* Фреймворк +* Набор форматов +* ... +* Система сборки и дистрибьюции ПО +--- + + + +### Проблемы пакетных менеджеров + +* Апгрейд конфигурации безвозвратно изменяет состояние системы +* Сборки не детерминированы +* Не поддерживаются разные версии бинарников и библиотек +* Конфликты пакетов + +--- + +#### Проблемы управления зависимостями в ROS + +* Зависимость от Ubuntu и её системных зависимостей (apt-пакеты) +* Сложность интеграции с ПО вне ROS-экосистемы +* Подготовить для удобного запуска сложный ROS-проект - трудоёмкая задача + +--- + +# Тренды + +* Из набора библиотек для одного робота ROS становится стандартом для роботизированных кибер-физических систем +* В робототехнику проникают инструменты из других ниш: web, машинное обучение, DevOps + +--- + +# А как же Docker? +--- + +![](reproducible-testing.jpg) + +--- + + +# "В" +воспроизводимость + +--- + + +# Теория +Dockerfile -> Image + +--- + + +# Реальность +Dockerfile -> Image1 || Image2 ... ImageN + +--- + + +# Типичный Dockerfile для ROS + FROM ros:foxy-ros-base-focal + ... + RUN rosdep update && apt-get update + ... + RUN apk add --no-cache python g++ make + ... + RUN curl -sSL http://get.gazebosim.org | sh + ... + CMD [ "ros2", "launch", "app", "app_bringup.launch.py" ] +--- + +# Ключевая идея nix +Описывать сборку в виде _чистой функции_ или уравнения(derivation), результат исполнения строго детерминирован входными параметрами. + +--- + +![](eelco.jpeg) +Eelco Dolstra +## The Purely Functional Software Deployment Model +PhD Thesis'2006 +https://edolstra.github.io/pubs/phd-thesis.pdf + +--- +# Парадигмы программирования +* Императивная (как?) - C, C++, Java +* Декларативная (что?) - Lisp, Prolog, Nix + +--- + + +# Парадигмы конфигурации + +* Императивная конфигурация (apt) + - Изменение состояния (dependency hell, неконсистентные состояния) +* Декларативная конфигурация (nix) + - Пакеты = иммутабельные переменные (нельзя изменить напрямую, только через функцию) + - Одно и то же nix-выражение даёт всегда один и тот же результат + +--- + + { + pname = "hello"; + version = "2.12.1"; + src = fetchurl { + url = "http://github.com/hello-${version}.tar.bz2"; + sha256 = "0x2g1jqy..."; + }; + buildInputs = [ libbar perl ncurses ]; + buildPhase = ''gcc hello.c -o hello''; + installPhase = ''mkdir -p $out/bin && cp hello $out/bin''; + } +--- + { + "builder": "/nix/store/561wgc73s0x1250hrgp7jm22hhv7yfln-bash-5.2-p15/bin/bash", + "env": { + "builder": "/nix/store/561wgc73s0x1250hrgp7jm22hhv7yfln-bash-5.2-p15/bin/bash", + "out": "/nix/store/260q5867crm1xjs4khgqpl6vr9kywql1-hello-2.12.1", + "src": "/nix/store/pa10z4ngm0g83kx9mssrqzz30s84vq7k-hello-2.12.1.tar.gz", + "stdenv": "/nix/store/b09v23lirgvci3wzszh22mbkdfj0h0yq-stdenv-linux", + "version": "2.12.1" + }, + "inputDrvs": { + "/nix/store/0hnjp6s8k71xm62157v37zg3qzwvl8lx-bash-5.2-p15.drv": [ "out" ], + "/nix/store/8n3ib41pb90nkq3vv49z520qinf4q9c0-hello-2.12.1.tar.gz.drv": [ "out" ], + "/nix/store/r2h029bx2fbyxxj84s5hf1abp2vfkah2-stdenv-linux.drv": [ "out" ] + }, + "inputSrcs": [ "/nix/store/6xg259477c90a229xwmb53pdfkn6ig3g-default-builder.sh" ], + "outputs": { + "out": { "path": "/nix/store/260q5867crm1xjs4khgqpl6vr9kywql1-hello-2.12.1" } + }, + "system": "x86_64-linux" + } + } + +--- + + + $ ls /nix/store/ | grep humble + 00z4hg8q0cxhsl5jq4s7iq81zz54j8vy-ros-humble-ament-lint-common-0.12.5-r1 + 01nvrmwbf0zbchb3d25kb49rl8jzspv6-ros-humble-ament-cmake-cppcheck-0.12.5-r1 + 02gdrzn2yrngmqih4hq0j17vj2hgiiz3-ros-humble-unique-identifier-msgs-2.2.1-r3 + 08s5gvg7gaypllyxvzd17w21ijqx3hgd-ros-humble-tf2-msgs-0.25.2-r1 + 0hwva9zk3250hd6spwq11ayk0aq4flnm-ros-humble-control-msgs-4.1.0-r1 + +--- + +![width:900px](drv-cryptohash.png) + +--- + + +# Что это даёт для ROS? + +* Возможность запустить проект ROS на любой ОС, даже без apt +* Контролируемое управление зависимостями +* Возможность использования разных версий одних и тех же пакетов и библиотек +* Детерминированные сборки одной командой +* CACHE!!! + +--- + + +# Основные компоненты nix + +* Nix (менеджер пакетов и язык программирования) +* Nixpkgs (репозиторий пакетов и стандартная библиотека) +* NixOS (операционная система) +* NixOps (DevOps инструмент) + +--- + + +![width:1000px](map_repo_size_fresh-2018-06-08.svg) + +--- + +## Nix ROS Overlay +https://github.com/lopsided98/nix-ros-overlay + +Автоматическая генерация nix-выражений для сборки пакетов ROS из официальных репозиториев (github:ros/rosdistro). + +--- + { lib, buildRosPackage, fetchurl, ament-cmake ... }: + buildRosPackage { + pname = "ros-rolling-std-msgs"; + version = "4.6.1-r1"; + src = fetchurl { + url = "https://github.com/ros2-gbp/common_interfaces/std_msgs/4.6.1-1.tar.gz"; + name = "4.6.1-1.tar.gz"; + sha256 = "87eee895c2c60a8335ae2a63b05f99773f0897e451e5bf7f45a14a6c36295640"; + }; + + buildType = "ament_cmake"; + buildInputs = [ ament-cmake rosidl-default-generators ]; + checkInputs = [ ament-lint-common ]; + propagatedBuildInputs = [ builtin-interfaces rosidl-default-runtime ]; + nativeBuildInputs = [ ament-cmake rosidl-default-generators ]; + + meta = { + description = ''A package containing some standard message definitions.''; + license = with lib.licenses; [ asl20 ]; + }; + } +--- + +# Недостатки + +* Пологая кривая обучения +* Некоторая разрозненность документации +* Не все пакеты ROS адаптированы в nix +* Необходимость сборки мусора + + +--- +# Полезные ресурсы + +![width:200px](nix-snowflake.svg) +Русскоязычное сообщество Telegram +@ru_nixos + +Туториал для новичков +zero-to-nix.com \ No newline at end of file