From 4014607e2f8fdcee8b53150370ad87a0264ea087 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 13 Feb 2024 10:35:51 +0000 Subject: [PATCH] deploy: 1fa1f6faa7875df193a3c605b37b2cd671087919 --- 404.html | 4 ++-- .../postcondition-ambiguity/index.html | 4 ++-- .../algorithms-and-correctness/index.html | 4 ++-- .../index.html | 4 ++-- algorithms/category/graphs/index.html | 4 ++-- algorithms/category/hash-tables/index.html | 4 ++-- .../category/paths-in-graphs/index.html | 4 ++-- algorithms/category/recursion/index.html | 4 ++-- .../category/red-black-trees/index.html | 4 ++-- algorithms/graphs/bfs-tree/index.html | 4 ++-- .../graphs/iterative-and-iterators/index.html | 4 ++-- algorithms/hash-tables/breaking/index.html | 4 ++-- .../breaking/mitigations/index.html | 4 ++-- .../hash-tables/breaking/python/index.html | 4 ++-- algorithms/index.html | 6 +++--- algorithms/paths/bf-to-astar/astar/index.html | 4 ++-- algorithms/paths/bf-to-astar/bf/index.html | 4 ++-- .../paths/bf-to-astar/dijkstra/index.html | 4 ++-- algorithms/paths/bf-to-astar/index.html | 4 ++-- algorithms/rb-trees/applications/index.html | 4 ++-- algorithms/rb-trees/rules/index.html | 4 ++-- algorithms/recursion/karel/index.html | 4 ++-- .../recursion/karel/solution/index.html | 4 ++-- .../bottom-up-dp/index.html | 4 ++-- .../pyramid-slide-down/greedy/index.html | 4 ++-- .../recursion/pyramid-slide-down/index.html | 4 ++-- .../pyramid-slide-down/naive/index.html | 4 ++-- .../pyramid-slide-down/top-down-dp/index.html | 4 ++-- algorithms/tags/a-star/index.html | 4 ++-- algorithms/tags/applications/index.html | 4 ++-- algorithms/tags/astar/index.html | 4 ++-- algorithms/tags/backtracking/index.html | 4 ++-- algorithms/tags/balanced-trees/index.html | 4 ++-- algorithms/tags/bellman-ford/index.html | 4 ++-- algorithms/tags/bfs/index.html | 4 ++-- algorithms/tags/bottom-up-dp/index.html | 4 ++-- algorithms/tags/brute-force/index.html | 4 ++-- algorithms/tags/c/index.html | 4 ++-- algorithms/tags/cpp/index.html | 4 ++-- algorithms/tags/csharp/index.html | 4 ++-- algorithms/tags/dijkstra/index.html | 4 ++-- algorithms/tags/dynamic-array/index.html | 4 ++-- .../tags/dynamic-programming/index.html | 4 ++-- algorithms/tags/exponential/index.html | 4 ++-- algorithms/tags/graphs/index.html | 4 ++-- algorithms/tags/greedy/index.html | 4 ++-- algorithms/tags/hash-tables/index.html | 4 ++-- algorithms/tags/index.html | 4 ++-- algorithms/tags/iterative/index.html | 4 ++-- algorithms/tags/iterators/index.html | 4 ++-- algorithms/tags/java/index.html | 4 ++-- algorithms/tags/karel/index.html | 4 ++-- algorithms/tags/postconditions/index.html | 4 ++-- algorithms/tags/python/index.html | 4 ++-- algorithms/tags/recursion/index.html | 4 ++-- algorithms/tags/red-black-trees/index.html | 4 ++-- algorithms/tags/solution/index.html | 4 ++-- algorithms/tags/sorting/index.html | 4 ++-- algorithms/tags/testing/index.html | 4 ++-- algorithms/tags/time-complexity/index.html | 4 ++-- algorithms/tags/top-down-dp/index.html | 4 ++-- algorithms/time-complexity/extend/index.html | 4 ++-- assets/js/1535ede8.17b1b191.js | 1 + assets/js/1535ede8.7d1dd96a.js | 1 - assets/js/4200b1a9.6913c230.js | 1 + assets/js/4200b1a9.d9f16397.js | 1 - assets/js/595c7293.ac2cc3dd.js | 1 - assets/js/595c7293.b19d33ce.js | 1 + assets/js/7052c0bc.178970a1.js | 1 - assets/js/7052c0bc.f121b724.js | 1 + assets/js/794ef108.784150bd.js | 1 - assets/js/794ef108.9138634c.js | 1 + assets/js/84d1e0d8.2b167def.js | 1 - assets/js/84d1e0d8.cda49e51.js | 1 + ...35a28.56c5b5ee.js => aa635a28.fa524ef9.js} | 2 +- assets/js/b1288602.201f607c.js | 1 + assets/js/b1288602.8bfe3b88.js | 1 - assets/js/d05e838c.07dceab4.js | 1 + assets/js/d05e838c.e278ca3a.js | 1 - assets/js/d309eaf6.0e21f236.js | 1 - assets/js/d309eaf6.efdd6eb7.js | 1 + .../js/{main.65a0bc7b.js => main.1bf5eb42.js} | 4 ++-- ...CENSE.txt => main.1bf5eb42.js.LICENSE.txt} | 0 ...n.656a7c34.js => runtime~main.99091760.js} | 2 +- blog/2023/08/02/copr/index.html | 4 ++-- blog/2024/01/28/rust-opinion/index.html | 4 ++-- blog/2024/02/07/lts-distros/index.html | 8 ++++---- blog/aoc-2022/1st-week/index.html | 4 ++-- blog/aoc-2022/2nd-week/index.html | 4 ++-- blog/aoc-2022/3rd-week/index.html | 4 ++-- blog/aoc-2022/4th-week/index.html | 4 ++-- blog/aoc-2022/intro/index.html | 4 ++-- blog/archive/index.html | 4 ++-- blog/atom.xml | 4 ++-- blog/feed.json | 2 +- blog/index.html | 6 +++--- blog/leetcode/sort-diagonally/index.html | 4 ++-- blog/rss.xml | 4 ++-- blog/tags/admin/index.html | 4 ++-- blog/tags/advent-of-code-2022/index.html | 4 ++-- blog/tags/advent-of-code/index.html | 4 ++-- blog/tags/copr/index.html | 4 ++-- blog/tags/cpp/index.html | 4 ++-- blog/tags/cult/index.html | 4 ++-- blog/tags/hype/index.html | 4 ++-- blog/tags/index.html | 4 ++-- blog/tags/iterators/index.html | 4 ++-- blog/tags/leetcode/index.html | 4 ++-- blog/tags/linux-distributions/index.html | 6 +++--- blog/tags/lts/index.html | 6 +++--- blog/tags/memory-safety/index.html | 4 ++-- blog/tags/paywall/index.html | 6 +++--- blog/tags/red-hat/index.html | 4 ++-- blog/tags/rust/index.html | 4 ++-- blog/tags/support/index.html | 6 +++--- blog/tags/vps/index.html | 4 ++-- blog/tags/🏭/index.html | 4 ++-- c/bonuses/seminar-03/index.html | 4 ++-- c/bonuses/seminar-04/index.html | 4 ++-- c/bonuses/seminar-05-06/index.html | 6 +++--- c/bonuses/seminar-08/index.html | 6 +++--- c/bonuses/seminar-10/index.html | 6 +++--- c/category/bonuses/index.html | 4 ++-- c/category/practice-exams/index.html | 4 ++-- c/index.html | 6 +++--- c/mr/index.html | 6 +++--- c/pexam/cams/index.html | 4 ++-- c/pexam/garbage_collect/index.html | 4 ++-- contributions/index.html | 4 ++-- cpp/category/exceptions-and-raii/index.html | 4 ++-- cpp/environment/index.html | 4 ++-- .../placeholders/index.html | 4 ++-- cpp/index.html | 6 +++--- .../graphs/iterative-and-iterators.tar.bz2 | Bin 1939 -> 1931 bytes .../graphs/iterative-and-iterators.tar.gz | Bin 1955 -> 1955 bytes files/algorithms/paths/bf-to-astar.tar.bz2 | Bin 3170 -> 3165 bytes files/algorithms/paths/bf-to-astar.tar.gz | Bin 2992 -> 2994 bytes files/algorithms/recursion/karel-1.tar.bz2 | Bin 5896 -> 5879 bytes files/algorithms/recursion/karel-1.tar.gz | Bin 6581 -> 6584 bytes .../recursion/pyramid-slide-down.tar.bz2 | Bin 1546 -> 1545 bytes .../recursion/pyramid-slide-down.tar.gz | Bin 1422 -> 1422 bytes .../algorithms/time-complexity/extend.tar.bz2 | Bin 4071 -> 4080 bytes .../algorithms/time-complexity/extend.tar.gz | Bin 3913 -> 3912 bytes files/c/bonuses/03.tar.bz2 | Bin 2641 -> 2649 bytes files/c/bonuses/03.tar.gz | Bin 2336 -> 2338 bytes files/c/bonuses/04.tar.bz2 | Bin 2536 -> 2546 bytes files/c/bonuses/04.tar.gz | Bin 2499 -> 2500 bytes files/c/bonuses/05-06.tar.bz2 | Bin 3650 -> 3628 bytes files/c/bonuses/05-06.tar.gz | Bin 3484 -> 3487 bytes files/c/bonuses/08.tar.bz2 | Bin 74281 -> 74254 bytes files/c/bonuses/08.tar.gz | Bin 103537 -> 103535 bytes files/c/bonuses/10.tar.bz2 | Bin 234819 -> 234821 bytes files/c/bonuses/10.tar.gz | Bin 230105 -> 230104 bytes index.html | 4 ++-- search/index.html | 4 ++-- talks/index.html | 4 ++-- 156 files changed, 254 insertions(+), 254 deletions(-) create mode 100644 assets/js/1535ede8.17b1b191.js delete mode 100644 assets/js/1535ede8.7d1dd96a.js create mode 100644 assets/js/4200b1a9.6913c230.js delete mode 100644 assets/js/4200b1a9.d9f16397.js delete mode 100644 assets/js/595c7293.ac2cc3dd.js create mode 100644 assets/js/595c7293.b19d33ce.js delete mode 100644 assets/js/7052c0bc.178970a1.js create mode 100644 assets/js/7052c0bc.f121b724.js delete mode 100644 assets/js/794ef108.784150bd.js create mode 100644 assets/js/794ef108.9138634c.js delete mode 100644 assets/js/84d1e0d8.2b167def.js create mode 100644 assets/js/84d1e0d8.cda49e51.js rename assets/js/{aa635a28.56c5b5ee.js => aa635a28.fa524ef9.js} (67%) create mode 100644 assets/js/b1288602.201f607c.js delete mode 100644 assets/js/b1288602.8bfe3b88.js create mode 100644 assets/js/d05e838c.07dceab4.js delete mode 100644 assets/js/d05e838c.e278ca3a.js delete mode 100644 assets/js/d309eaf6.0e21f236.js create mode 100644 assets/js/d309eaf6.efdd6eb7.js rename assets/js/{main.65a0bc7b.js => main.1bf5eb42.js} (98%) rename assets/js/{main.65a0bc7b.js.LICENSE.txt => main.1bf5eb42.js.LICENSE.txt} (100%) rename assets/js/{runtime~main.656a7c34.js => runtime~main.99091760.js} (93%) diff --git a/404.html b/404.html index 6bfed30..b76c70a 100644 --- a/404.html +++ b/404.html @@ -14,8 +14,8 @@ - - + +
Skip to main content

Page Not Found

We could not find what you were looking for.

Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

diff --git a/algorithms/algorithms-correctness/postcondition-ambiguity/index.html b/algorithms/algorithms-correctness/postcondition-ambiguity/index.html index c88b203..953df4b 100644 --- a/algorithms/algorithms-correctness/postcondition-ambiguity/index.html +++ b/algorithms/algorithms-correctness/postcondition-ambiguity/index.html @@ -16,8 +16,8 @@ - - + +
Skip to main content

Vague postconditions and proving correctness of algorithms

Introduction

diff --git a/algorithms/category/algorithms-and-correctness/index.html b/algorithms/category/algorithms-and-correctness/index.html index 10cc1ec..d21586e 100644 --- a/algorithms/category/algorithms-and-correctness/index.html +++ b/algorithms/category/algorithms-and-correctness/index.html @@ -18,8 +18,8 @@ correctness. - - + +

Algorithms and Correctness

Materials related to basic ideas behind algorithms and proofs of their diff --git a/algorithms/category/asymptotic-notation-and-time-complexity/index.html b/algorithms/category/asymptotic-notation-and-time-complexity/index.html index 1346088..66f8a9e 100644 --- a/algorithms/category/asymptotic-notation-and-time-complexity/index.html +++ b/algorithms/category/asymptotic-notation-and-time-complexity/index.html @@ -16,8 +16,8 @@ - - + +

Asymptotic Notation and Time Complexity

Materials related to asymptotic notation and time complexity. diff --git a/algorithms/category/graphs/index.html b/algorithms/category/graphs/index.html index 5387800..3adc729 100644 --- a/algorithms/category/graphs/index.html +++ b/algorithms/category/graphs/index.html @@ -16,8 +16,8 @@ - - + +

Graphs

Materials related to basic graph algorithms and graph problems. diff --git a/algorithms/category/hash-tables/index.html b/algorithms/category/hash-tables/index.html index 12a4ff8..9890b9a 100644 --- a/algorithms/category/hash-tables/index.html +++ b/algorithms/category/hash-tables/index.html @@ -16,8 +16,8 @@ - - + +

Hash Tables

Materials related to hash tables. diff --git a/algorithms/category/paths-in-graphs/index.html b/algorithms/category/paths-in-graphs/index.html index 36733d6..e99ea8a 100644 --- a/algorithms/category/paths-in-graphs/index.html +++ b/algorithms/category/paths-in-graphs/index.html @@ -16,8 +16,8 @@ - - + +

Paths in Graphs

Materials related to finding paths in graphs. diff --git a/algorithms/category/recursion/index.html b/algorithms/category/recursion/index.html index a00b7a1..b2f0c33 100644 --- a/algorithms/category/recursion/index.html +++ b/algorithms/category/recursion/index.html @@ -16,8 +16,8 @@ - - + +

Recursion

Materials related to recursive algorithms and their time complexity. diff --git a/algorithms/category/red-black-trees/index.html b/algorithms/category/red-black-trees/index.html index ca80e4b..f6135fd 100644 --- a/algorithms/category/red-black-trees/index.html +++ b/algorithms/category/red-black-trees/index.html @@ -16,8 +16,8 @@ - - + +

Red-Black Trees

Materials related to red-black trees. diff --git a/algorithms/graphs/bfs-tree/index.html b/algorithms/graphs/bfs-tree/index.html index 92492d8..2a1a744 100644 --- a/algorithms/graphs/bfs-tree/index.html +++ b/algorithms/graphs/bfs-tree/index.html @@ -16,8 +16,8 @@ - - + +

Distance boundaries from BFS tree on undirected graphs

Introduction

diff --git a/algorithms/graphs/iterative-and-iterators/index.html b/algorithms/graphs/iterative-and-iterators/index.html index 2ab4131..dfe82bc 100644 --- a/algorithms/graphs/iterative-and-iterators/index.html +++ b/algorithms/graphs/iterative-and-iterators/index.html @@ -16,8 +16,8 @@ - - + +

Iterative algorithms via iterators

Introduction

diff --git a/algorithms/hash-tables/breaking/index.html b/algorithms/hash-tables/breaking/index.html index 42f4c56..6e7a67e 100644 --- a/algorithms/hash-tables/breaking/index.html +++ b/algorithms/hash-tables/breaking/index.html @@ -16,8 +16,8 @@ - - + +

Breaking Hash Table

We will try to break a hash table and discuss possible ways how to prevent such diff --git a/algorithms/hash-tables/breaking/mitigations/index.html b/algorithms/hash-tables/breaking/mitigations/index.html index 1d6afca..c60d4a4 100644 --- a/algorithms/hash-tables/breaking/mitigations/index.html +++ b/algorithms/hash-tables/breaking/mitigations/index.html @@ -16,8 +16,8 @@ - - + +

Possible Mitigations

There are multiple ways the issues created above can be mitigated. Still we can diff --git a/algorithms/hash-tables/breaking/python/index.html b/algorithms/hash-tables/breaking/python/index.html index 812721e..d9a3e90 100644 --- a/algorithms/hash-tables/breaking/python/index.html +++ b/algorithms/hash-tables/breaking/python/index.html @@ -16,8 +16,8 @@ - - + +

Breaking the Hash Table in Python

diff --git a/algorithms/index.html b/algorithms/index.html index 36568f1..1715498 100644 --- a/algorithms/index.html +++ b/algorithms/index.html @@ -14,8 +14,8 @@ - - + +

Introduction

In this part you can find “random” additional materials I have written over the @@ -23,6 +23,6 @@ course of teaching Algorithms and data structures I.

It is a various mix of stuff that may have been produced as a follow-up on some question asked at the seminar or spontanously.

If you have some ideas for posts, please do not hesitate to submit them as issues -in the linked GitLab.

+in the linked GitLab.

\ No newline at end of file diff --git a/algorithms/paths/bf-to-astar/astar/index.html b/algorithms/paths/bf-to-astar/astar/index.html index 963f0bc..79b2332 100644 --- a/algorithms/paths/bf-to-astar/astar/index.html +++ b/algorithms/paths/bf-to-astar/astar/index.html @@ -16,8 +16,8 @@ - - + +

A* algorithm

Intro

diff --git a/algorithms/paths/bf-to-astar/bf/index.html b/algorithms/paths/bf-to-astar/bf/index.html index 65dd28c..63f5725 100644 --- a/algorithms/paths/bf-to-astar/bf/index.html +++ b/algorithms/paths/bf-to-astar/bf/index.html @@ -18,8 +18,8 @@ something. - - + +

BF

Basic idea

diff --git a/algorithms/paths/bf-to-astar/dijkstra/index.html b/algorithms/paths/bf-to-astar/dijkstra/index.html index cc7f188..f327b31 100644 --- a/algorithms/paths/bf-to-astar/dijkstra/index.html +++ b/algorithms/paths/bf-to-astar/dijkstra/index.html @@ -16,8 +16,8 @@ - - + +

Dijkstra's algorithm

Intro

diff --git a/algorithms/paths/bf-to-astar/index.html b/algorithms/paths/bf-to-astar/index.html index 1016128..9f2e6ff 100644 --- a/algorithms/paths/bf-to-astar/index.html +++ b/algorithms/paths/bf-to-astar/index.html @@ -16,8 +16,8 @@ - - + +

From BF to A*

Intro

diff --git a/algorithms/rb-trees/applications/index.html b/algorithms/rb-trees/applications/index.html index 7513340..b6629dc 100644 --- a/algorithms/rb-trees/applications/index.html +++ b/algorithms/rb-trees/applications/index.html @@ -16,8 +16,8 @@ - - + +

Použití červeno-černých stromů

Použití

diff --git a/algorithms/rb-trees/rules/index.html b/algorithms/rb-trees/rules/index.html index 86f0b2a..01b8753 100644 --- a/algorithms/rb-trees/rules/index.html +++ b/algorithms/rb-trees/rules/index.html @@ -16,8 +16,8 @@ - - + +

On the rules of the red-black tree

Introduction

diff --git a/algorithms/recursion/karel/index.html b/algorithms/recursion/karel/index.html index 8e1e64a..f1ebcba 100644 --- a/algorithms/recursion/karel/index.html +++ b/algorithms/recursion/karel/index.html @@ -16,8 +16,8 @@ - - + +

Recursion and backtracking with Robot Karel

    diff --git a/algorithms/recursion/karel/solution/index.html b/algorithms/recursion/karel/solution/index.html index f6d0e54..5ab59f7 100644 --- a/algorithms/recursion/karel/solution/index.html +++ b/algorithms/recursion/karel/solution/index.html @@ -16,8 +16,8 @@ - - + +

    Solving the maze problem

    diff --git a/algorithms/recursion/pyramid-slide-down/bottom-up-dp/index.html b/algorithms/recursion/pyramid-slide-down/bottom-up-dp/index.html index 91d28b7..2865c13 100644 --- a/algorithms/recursion/pyramid-slide-down/bottom-up-dp/index.html +++ b/algorithms/recursion/pyramid-slide-down/bottom-up-dp/index.html @@ -16,8 +16,8 @@ - - + +

    Bottom-up dynamic programming

    diff --git a/algorithms/recursion/pyramid-slide-down/greedy/index.html b/algorithms/recursion/pyramid-slide-down/greedy/index.html index 070e3cb..1f4968d 100644 --- a/algorithms/recursion/pyramid-slide-down/greedy/index.html +++ b/algorithms/recursion/pyramid-slide-down/greedy/index.html @@ -16,8 +16,8 @@ - - + +

    Greedy solution

    We will try to optimize it a bit. Let's start with a relatively simple greedy diff --git a/algorithms/recursion/pyramid-slide-down/index.html b/algorithms/recursion/pyramid-slide-down/index.html index 1a079e0..cbc1270 100644 --- a/algorithms/recursion/pyramid-slide-down/index.html +++ b/algorithms/recursion/pyramid-slide-down/index.html @@ -16,8 +16,8 @@ - - + +

    Introduction to dynamic programming

    In this series we will try to solve one problem in different ways.

    diff --git a/algorithms/recursion/pyramid-slide-down/naive/index.html b/algorithms/recursion/pyramid-slide-down/naive/index.html index 452cb84..f562cfb 100644 --- a/algorithms/recursion/pyramid-slide-down/naive/index.html +++ b/algorithms/recursion/pyramid-slide-down/naive/index.html @@ -16,8 +16,8 @@ - - + +

    Naïve solution

    Our naïve solution consists of trying out all the possible slides and finding diff --git a/algorithms/recursion/pyramid-slide-down/top-down-dp/index.html b/algorithms/recursion/pyramid-slide-down/top-down-dp/index.html index f05df2d..8095acf 100644 --- a/algorithms/recursion/pyramid-slide-down/top-down-dp/index.html +++ b/algorithms/recursion/pyramid-slide-down/top-down-dp/index.html @@ -16,8 +16,8 @@ - - + +

    Top-down dynamic programming

    diff --git a/algorithms/tags/a-star/index.html b/algorithms/tags/a-star/index.html index b13cf73..f67e747 100644 --- a/algorithms/tags/a-star/index.html +++ b/algorithms/tags/a-star/index.html @@ -14,8 +14,8 @@ - - + +

    One doc tagged with "a star"

    View All Tags

    From BF to A*

    Figuring out shortest-path problem from the BF to the A* algorithm. diff --git a/algorithms/tags/applications/index.html b/algorithms/tags/applications/index.html index 40da89d..c9b4094 100644 --- a/algorithms/tags/applications/index.html +++ b/algorithms/tags/applications/index.html @@ -14,8 +14,8 @@ - - + +

    One doc tagged with "applications"

    View All Tags

    Použití červeno-černých stromů

    Ukázka použití červeno-černých stromů v standardních knižnicích známých jazyků. diff --git a/algorithms/tags/astar/index.html b/algorithms/tags/astar/index.html index 8a35623..d042150 100644 --- a/algorithms/tags/astar/index.html +++ b/algorithms/tags/astar/index.html @@ -14,8 +14,8 @@ - - + +

    One doc tagged with "astar"

    View All Tags

    A* algorithm

    Moving from Dijkstra's algorithm into the A* algorithm. diff --git a/algorithms/tags/backtracking/index.html b/algorithms/tags/backtracking/index.html index fd38275..1fc936c 100644 --- a/algorithms/tags/backtracking/index.html +++ b/algorithms/tags/backtracking/index.html @@ -14,8 +14,8 @@ - - + +

    2 docs tagged with "backtracking"

    View All Tags

    Recursion and backtracking with Robot Karel

    A problem with too many restrictions. diff --git a/algorithms/tags/balanced-trees/index.html b/algorithms/tags/balanced-trees/index.html index 3625ffc..cbdf6ff 100644 --- a/algorithms/tags/balanced-trees/index.html +++ b/algorithms/tags/balanced-trees/index.html @@ -14,8 +14,8 @@ - - + +

    2 docs tagged with "balanced trees"

    View All Tags

    On the rules of the red-black tree

    Shower thoughts on the rules of the red-black tree. diff --git a/algorithms/tags/bellman-ford/index.html b/algorithms/tags/bellman-ford/index.html index ab36281..c043468 100644 --- a/algorithms/tags/bellman-ford/index.html +++ b/algorithms/tags/bellman-ford/index.html @@ -14,8 +14,8 @@ - - + +

    2 docs tagged with "bellman ford"

    View All Tags

    BF

    Solving the shortest path problem with a naïve approach that turns into diff --git a/algorithms/tags/bfs/index.html b/algorithms/tags/bfs/index.html index 65fee0f..1789714 100644 --- a/algorithms/tags/bfs/index.html +++ b/algorithms/tags/bfs/index.html @@ -14,8 +14,8 @@ - - + +

    One doc tagged with "bfs"

    View All Tags

    Distance boundaries from BFS tree on undirected graphs

    Short explanation of distance boundaries deduced from a BFS tree. diff --git a/algorithms/tags/bottom-up-dp/index.html b/algorithms/tags/bottom-up-dp/index.html index a4da25f..3fd1c45 100644 --- a/algorithms/tags/bottom-up-dp/index.html +++ b/algorithms/tags/bottom-up-dp/index.html @@ -14,8 +14,8 @@ - - + +

    2 docs tagged with "bottom-up-dp"

    View All Tags

    Bottom-up DP solution

    Bottom-up DP solution of the Pyramid Slide Down. diff --git a/algorithms/tags/brute-force/index.html b/algorithms/tags/brute-force/index.html index 6006614..6b10af3 100644 --- a/algorithms/tags/brute-force/index.html +++ b/algorithms/tags/brute-force/index.html @@ -14,8 +14,8 @@ - - + +

    2 docs tagged with "brute force"

    View All Tags

    BF

    Solving the shortest path problem with a naïve approach that turns into diff --git a/algorithms/tags/c/index.html b/algorithms/tags/c/index.html index 6d73245..a0ed993 100644 --- a/algorithms/tags/c/index.html +++ b/algorithms/tags/c/index.html @@ -14,8 +14,8 @@ - - + +

    One doc tagged with "c"

    View All Tags

    Time complexity of ‹extend›

    How to make inefficient algorithm unknowingly. diff --git a/algorithms/tags/cpp/index.html b/algorithms/tags/cpp/index.html index 04d5abc..c565cda 100644 --- a/algorithms/tags/cpp/index.html +++ b/algorithms/tags/cpp/index.html @@ -14,8 +14,8 @@ - - + +

    7 docs tagged with "cpp"

    View All Tags

    A* algorithm

    Moving from Dijkstra's algorithm into the A* algorithm. diff --git a/algorithms/tags/csharp/index.html b/algorithms/tags/csharp/index.html index b949447..68794ca 100644 --- a/algorithms/tags/csharp/index.html +++ b/algorithms/tags/csharp/index.html @@ -14,8 +14,8 @@ - - + +

    One doc tagged with "csharp"

    View All Tags

    Iterative algorithms via iterators

    Iterative DFS using iterators. diff --git a/algorithms/tags/dijkstra/index.html b/algorithms/tags/dijkstra/index.html index e631bf9..f1f7411 100644 --- a/algorithms/tags/dijkstra/index.html +++ b/algorithms/tags/dijkstra/index.html @@ -14,8 +14,8 @@ - - + +

    2 docs tagged with "dijkstra"

    View All Tags

    Dijkstra's algorithm

    Moving from Bellman-Ford into the Dijsktra's algorithm. diff --git a/algorithms/tags/dynamic-array/index.html b/algorithms/tags/dynamic-array/index.html index 8083292..1c148b7 100644 --- a/algorithms/tags/dynamic-array/index.html +++ b/algorithms/tags/dynamic-array/index.html @@ -14,8 +14,8 @@ - - + +

    One doc tagged with "dynamic array"

    View All Tags

    Time complexity of ‹extend›

    How to make inefficient algorithm unknowingly. diff --git a/algorithms/tags/dynamic-programming/index.html b/algorithms/tags/dynamic-programming/index.html index 2843be8..5207bbe 100644 --- a/algorithms/tags/dynamic-programming/index.html +++ b/algorithms/tags/dynamic-programming/index.html @@ -14,8 +14,8 @@ - - + +

    7 docs tagged with "dynamic programming"

    View All Tags

    A* algorithm

    Moving from Dijkstra's algorithm into the A* algorithm. diff --git a/algorithms/tags/exponential/index.html b/algorithms/tags/exponential/index.html index 7b97869..35c3f4d 100644 --- a/algorithms/tags/exponential/index.html +++ b/algorithms/tags/exponential/index.html @@ -14,8 +14,8 @@ - - + +

    2 docs tagged with "exponential"

    View All Tags

    Introduction to dynamic programming

    Solving a problem in different ways. diff --git a/algorithms/tags/graphs/index.html b/algorithms/tags/graphs/index.html index bbf5b5d..5f09750 100644 --- a/algorithms/tags/graphs/index.html +++ b/algorithms/tags/graphs/index.html @@ -14,8 +14,8 @@ - - + +

    2 docs tagged with "graphs"

    View All Tags

    Distance boundaries from BFS tree on undirected graphs

    Short explanation of distance boundaries deduced from a BFS tree. diff --git a/algorithms/tags/greedy/index.html b/algorithms/tags/greedy/index.html index a959e66..9450681 100644 --- a/algorithms/tags/greedy/index.html +++ b/algorithms/tags/greedy/index.html @@ -14,8 +14,8 @@ - - + +

    4 docs tagged with "greedy"

    View All Tags

    Dijkstra's algorithm

    Moving from Bellman-Ford into the Dijsktra's algorithm. diff --git a/algorithms/tags/hash-tables/index.html b/algorithms/tags/hash-tables/index.html index 298519f..94597cf 100644 --- a/algorithms/tags/hash-tables/index.html +++ b/algorithms/tags/hash-tables/index.html @@ -14,8 +14,8 @@ - - + +

    3 docs tagged with "hash-tables"

    View All Tags

    Breaking Hash Table

    How to get the linear time complexity in a hash table. diff --git a/algorithms/tags/index.html b/algorithms/tags/index.html index 298059b..289263a 100644 --- a/algorithms/tags/index.html +++ b/algorithms/tags/index.html @@ -14,8 +14,8 @@ - - + +

    diff --git a/algorithms/tags/iterative/index.html b/algorithms/tags/iterative/index.html index 0bb00c0..5073620 100644 --- a/algorithms/tags/iterative/index.html +++ b/algorithms/tags/iterative/index.html @@ -14,8 +14,8 @@ - - + +

    One doc tagged with "iterative"

    View All Tags

    Iterative algorithms via iterators

    Iterative DFS using iterators. diff --git a/algorithms/tags/iterators/index.html b/algorithms/tags/iterators/index.html index 2e55019..e801a20 100644 --- a/algorithms/tags/iterators/index.html +++ b/algorithms/tags/iterators/index.html @@ -14,8 +14,8 @@ - - + +

    One doc tagged with "iterators"

    View All Tags

    Iterative algorithms via iterators

    Iterative DFS using iterators. diff --git a/algorithms/tags/java/index.html b/algorithms/tags/java/index.html index 13b4a26..b602c73 100644 --- a/algorithms/tags/java/index.html +++ b/algorithms/tags/java/index.html @@ -14,8 +14,8 @@ - - + +

    5 docs tagged with "java"

    View All Tags

    Bottom-up DP solution

    Bottom-up DP solution of the Pyramid Slide Down. diff --git a/algorithms/tags/karel/index.html b/algorithms/tags/karel/index.html index 7171b2e..053b498 100644 --- a/algorithms/tags/karel/index.html +++ b/algorithms/tags/karel/index.html @@ -14,8 +14,8 @@ - - + +

    2 docs tagged with "karel"

    View All Tags

    Recursion and backtracking with Robot Karel

    A problem with too many restrictions. diff --git a/algorithms/tags/postconditions/index.html b/algorithms/tags/postconditions/index.html index 8135af7..c53f18b 100644 --- a/algorithms/tags/postconditions/index.html +++ b/algorithms/tags/postconditions/index.html @@ -14,8 +14,8 @@ - - + +

    One doc tagged with "postconditions"

    View All Tags

    Vague postconditions and proving correctness of algorithms

    Debugging and testing with precise postconditions. diff --git a/algorithms/tags/python/index.html b/algorithms/tags/python/index.html index 5fc5d14..8046463 100644 --- a/algorithms/tags/python/index.html +++ b/algorithms/tags/python/index.html @@ -14,8 +14,8 @@ - - + +

    7 docs tagged with "python"

    View All Tags

    Breaking Hash Table

    How to get the linear time complexity in a hash table. diff --git a/algorithms/tags/recursion/index.html b/algorithms/tags/recursion/index.html index d5377cc..fff122e 100644 --- a/algorithms/tags/recursion/index.html +++ b/algorithms/tags/recursion/index.html @@ -14,8 +14,8 @@ - - + +

    5 docs tagged with "recursion"

    View All Tags

    Introduction to dynamic programming

    Solving a problem in different ways. diff --git a/algorithms/tags/red-black-trees/index.html b/algorithms/tags/red-black-trees/index.html index b7846cf..d62a26f 100644 --- a/algorithms/tags/red-black-trees/index.html +++ b/algorithms/tags/red-black-trees/index.html @@ -14,8 +14,8 @@ - - + +

    2 docs tagged with "red-black trees"

    View All Tags

    On the rules of the red-black tree

    Shower thoughts on the rules of the red-black tree. diff --git a/algorithms/tags/solution/index.html b/algorithms/tags/solution/index.html index 8615590..ff62d6b 100644 --- a/algorithms/tags/solution/index.html +++ b/algorithms/tags/solution/index.html @@ -14,8 +14,8 @@ - - + +

    One doc tagged with "solution"

    View All Tags

    Solution to the problem

    Solving the problem introduced in the previous post. diff --git a/algorithms/tags/sorting/index.html b/algorithms/tags/sorting/index.html index 9ce2890..306935e 100644 --- a/algorithms/tags/sorting/index.html +++ b/algorithms/tags/sorting/index.html @@ -14,8 +14,8 @@ - - + +

    One doc tagged with "sorting"

    View All Tags

    Vague postconditions and proving correctness of algorithms

    Debugging and testing with precise postconditions. diff --git a/algorithms/tags/testing/index.html b/algorithms/tags/testing/index.html index 76c58f0..1aad611 100644 --- a/algorithms/tags/testing/index.html +++ b/algorithms/tags/testing/index.html @@ -14,8 +14,8 @@ - - + +

    One doc tagged with "testing"

    View All Tags

    Vague postconditions and proving correctness of algorithms

    Debugging and testing with precise postconditions. diff --git a/algorithms/tags/time-complexity/index.html b/algorithms/tags/time-complexity/index.html index d19a240..fbf008f 100644 --- a/algorithms/tags/time-complexity/index.html +++ b/algorithms/tags/time-complexity/index.html @@ -14,8 +14,8 @@ - - + +

    One doc tagged with "time complexity"

    View All Tags

    Time complexity of ‹extend›

    How to make inefficient algorithm unknowingly. diff --git a/algorithms/tags/top-down-dp/index.html b/algorithms/tags/top-down-dp/index.html index 36a10d2..1b78019 100644 --- a/algorithms/tags/top-down-dp/index.html +++ b/algorithms/tags/top-down-dp/index.html @@ -14,8 +14,8 @@ - - + +

    2 docs tagged with "top-down-dp"

    View All Tags

    Introduction to dynamic programming

    Solving a problem in different ways. diff --git a/algorithms/time-complexity/extend/index.html b/algorithms/time-complexity/extend/index.html index b2226b0..82b3548 100644 --- a/algorithms/time-complexity/extend/index.html +++ b/algorithms/time-complexity/extend/index.html @@ -16,8 +16,8 @@ - - + +

    Time complexity of ‹extend›

    Introduction

    diff --git a/assets/js/1535ede8.17b1b191.js b/assets/js/1535ede8.17b1b191.js new file mode 100644 index 0000000..4afa062 --- /dev/null +++ b/assets/js/1535ede8.17b1b191.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[5376],{44969:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>a,toc:()=>l});var s=t(85893),i=t(11151);const r={id:"seminar-10",title:"10th seminar",description:"Finding bugs in a hangman.\n"},o=void 0,a={id:"bonuses/seminar-10",title:"10th seminar",description:"Finding bugs in a hangman.\n",source:"@site/c/bonuses/10.md",sourceDirName:"bonuses",slug:"/bonuses/seminar-10",permalink:"/c/bonuses/seminar-10",draft:!1,unlisted:!1,editUrl:"https://github.com/mfocko/blog/tree/main/c/bonuses/10.md",tags:[],version:"current",lastUpdatedAt:1707820269,formattedLastUpdatedAt:"Feb 13, 2024",frontMatter:{id:"seminar-10",title:"10th seminar",description:"Finding bugs in a hangman.\n"},sidebar:"autogeneratedBar",previous:{title:"8th seminar",permalink:"/c/bonuses/seminar-08"},next:{title:"Practice Exams",permalink:"/c/category/practice-exams"}},c={},l=[{value:"Introduction",id:"introduction",level:2},{value:"Project",id:"project",level:2},{value:"Summary of the gameplay",id:"summary-of-the-gameplay",level:3},{value:"Suggested workflow",id:"suggested-workflow",level:2},{value:"Tasks",id:"tasks",level:2},{value:"Dictionary",id:"dictionary",level:2},{value:"Submitting",id:"submitting",level:2}];function d(e){const n={a:"a",blockquote:"blockquote",code:"code",em:"em",h2:"h2",h3:"h3",hr:"hr",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.p,{children:(0,s.jsx)(n.a,{href:"pathname:///files/c/bonuses/10.tar.gz",children:"Source"})}),"\n",(0,s.jsx)(n.h2,{id:"introduction",children:"Introduction"}),"\n",(0,s.jsx)(n.p,{children:"For this bonus you are given almost finished project - The Hangman Game. Your\ntask is to try the game, in case you find any bugs point them out and cover as\nmuch of the game as possible with tests."}),"\n",(0,s.jsx)(n.p,{children:"For this bonus you can get at maximum 2 K\u20a1."}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Item"}),(0,s.jsx)(n.th,{children:"Bonus"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Fixing bugs from failing tests"}),(0,s.jsx)(n.td,{children:"0.25"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"word_guessed"})}),(0,s.jsx)(n.td,{children:"0.50"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Hidden bug"}),(0,s.jsx)(n.td,{children:"0.50"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Extending tests, undetectable bugs or evil bug"}),(0,s.jsx)(n.td,{children:"0.37"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Refactor"}),(0,s.jsx)(n.td,{children:"0.38"})]})]})]}),"\n",(0,s.jsx)(n.h2,{id:"project",children:"Project"}),"\n",(0,s.jsxs)(n.p,{children:["Project consists of 2 source files - ",(0,s.jsx)(n.code,{children:"hangman.c"})," and ",(0,s.jsx)(n.code,{children:"main.c"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"main.c"})," is quite short and concise, there is nothing for you to do."]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"hangman.c"})," contains implementation of the game. In case you feel lost, consult\nthe documentation in ",(0,s.jsx)(n.code,{children:"hangman.h"})," that represents an interface that can be used\nfor implementing the game."]}),"\n",(0,s.jsxs)(n.p,{children:["Apart from those sources this project is a bit more complicated. ",(0,s.jsx)(n.em,{children:"Game loop"})," is\nrealised via single encapsulated function that complicates the testing. Because\nof that, there are 2 kinds of tests:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.em,{children:"Unit tests"})," - that are present in ",(0,s.jsx)(n.code,{children:"test_hangman.c"})," and can be run via:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ make check-unit\n"})}),"\n",(0,s.jsx)(n.p,{children:"They cover majorly functions that can be tested easily via testing framework."}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.em,{children:"Functional tests"})," - same as in ",(0,s.jsx)(n.code,{children:"seminar-08"})," and are focused on testing the\nprogram as whole. Basic smoke test is already included in ",(0,s.jsx)(n.code,{children:"usage"})," test case."]}),"\n",(0,s.jsx)(n.p,{children:"They can be run via:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ make check-functional\n"})}),"\n",(0,s.jsxs)(n.p,{children:["When testing ",(0,s.jsx)(n.code,{children:"hangman"})," function (the game loop), it is suggested to create\nfunctional tests."]}),"\n",(0,s.jsx)(n.p,{children:"When submitting the files for review, please leave out functional tests that\nwere given as a part of the assignment, so that it is easier to navigate, I\nwill drag the common files myself. :)"}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:"Whole test suite can be run via:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ make check\n"})}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"summary-of-the-gameplay",children:"Summary of the gameplay"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsx)(n.li,{children:"Secret word gets chosen from the file that's path is given as an argument."}),"\n",(0,s.jsx)(n.li,{children:"You get 8 guesses."}),"\n",(0,s.jsx)(n.li,{children:"Invalid characters don't count."}),"\n",(0,s.jsx)(n.li,{children:"Already guessed characters don't count, even if not included in the secret."}),"\n",(0,s.jsxs)(n.li,{children:["You can guess the whole word at once","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"If you get it right, you won, game ends."}),"\n",(0,s.jsx)(n.li,{children:"If you don't get it right, you get to see the secret, game ends."}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.li,{children:"In case of end of input, game finishes via force."}),"\n",(0,s.jsx)(n.li,{children:"In case of invalid input, no guesses are subtracted, game carries on."}),"\n",(0,s.jsx)(n.li,{children:"Letters and words are not case sensitive."}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"suggested-workflow",children:"Suggested workflow"}),"\n",(0,s.jsxs)(n.p,{children:["As we have talked about on the seminar, I suggest you to follow\n",(0,s.jsx)(n.em,{children:"Test-Driven Development"}),"\nin this case."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"TDD workflow",src:t(27420).Z+"",width:"2814",height:"1652"})}),"\n",(0,s.jsx)(n.p,{children:"In our current scenario we are already in the stage of refactoring and fixing the\nbugs. Therefore try to follow this succession of steps:"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsx)(n.li,{children:"Try to reproduce the bug."}),"\n",(0,s.jsx)(n.li,{children:"Create a test that proves the presence of the bug."}),"\n",(0,s.jsx)(n.li,{children:"Fix the bug."}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["In case you are submitting the bonus via GitLab, it is helpful to commit tests\nbefore commiting the fixes, so that it is apparent that the bug is manifested.\nExample of ",(0,s.jsx)(n.code,{children:"git log"})," (notice that the first line represents latest commit):"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"feat: Implement fizz_buzzer\ntest: Add tests for fizz_buzzer\nfix: Fix NULL-check in print_name\ntest: Add test for NULL in print_name\n"})}),"\n",(0,s.jsx)(n.h2,{id:"tasks",children:"Tasks"}),"\n",(0,s.jsx)(n.p,{children:"As to your tasks, there are multiple things wrong in this project."}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:'There are 2 "bugs" that cannot be detected via tests, i.e. they are not bugs\nthat affect functionality of the game.'}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["There is one evil bug in ",(0,s.jsx)(n.code,{children:"get_word"}),". It is not required to be fixed ;) Assign\nit the lowest priority."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"There are some tests failing. Please try to figure it out, so you have green\ntests for the rest :)"}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["We have gotten a bug report for ",(0,s.jsx)(n.code,{children:"word_guessed"}),", all we got is"]}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsxs)(n.p,{children:["doesn't work when there are too many ",(0,s.jsx)(n.code,{children:"a"}),"s"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Please try to replicate the bug and create a tests, so we don't get any\nregression later on."}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"One hidden bug :) Closely non-specified, we cannot reproduce it and we were\ndrunk while playing the game, so we don't remember a thing. :/"}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Try to cover as much code via the tests as possible. We are not going to look\nat the metrics, but DRY is violated a lot, so as a last task try to remove as\nmuch of the duplicit code as possible."}),"\n",(0,s.jsx)(n.p,{children:"Tests should help you a lot in case there are some regressions."}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.hr,{}),"\n",(0,s.jsxs)(n.p,{children:["In case you wonder why there are always 3 same words in the file with words, it\nis because of the ",(0,s.jsx)(n.code,{children:"get_word"})," bug. It is not a bug that can be easily fixed, so\nit is a not requirement at all and you can still get all points for the bonus ;)"]}),"\n",(0,s.jsx)(n.h2,{id:"dictionary",children:"Dictionary"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/Functional_testing",children:"Functional tests"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/Smoke_testing_%28software%29",children:"Smoke test"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/Don%27t_repeat_yourself",children:"DRY"})}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"submitting",children:"Submitting"}),"\n",(0,s.jsx)(n.p,{children:"In case you have any questions, feel free to reach out to me."}),"\n",(0,s.jsx)(n.hr,{})]})}function h(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},27420:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/tdd_lifecycle-327ad9ee0ed8318ed11e19a28e02b2cc.png"},11151:(e,n,t)=>{t.d(n,{Z:()=>a,a:()=>o});var s=t(67294);const i={},r=s.createContext(i);function o(e){const n=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1535ede8.7d1dd96a.js b/assets/js/1535ede8.7d1dd96a.js deleted file mode 100644 index 8c0c355..0000000 --- a/assets/js/1535ede8.7d1dd96a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[5376],{44969:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>a,toc:()=>l});var s=t(85893),i=t(11151);const r={id:"seminar-10",title:"10th seminar",description:"Finding bugs in a hangman.\n"},o=void 0,a={id:"bonuses/seminar-10",title:"10th seminar",description:"Finding bugs in a hangman.\n",source:"@site/c/bonuses/10.md",sourceDirName:"bonuses",slug:"/bonuses/seminar-10",permalink:"/c/bonuses/seminar-10",draft:!1,unlisted:!1,editUrl:"https://github.com/mfocko/blog/tree/main/c/bonuses/10.md",tags:[],version:"current",lastUpdatedAt:1707323940,formattedLastUpdatedAt:"Feb 7, 2024",frontMatter:{id:"seminar-10",title:"10th seminar",description:"Finding bugs in a hangman.\n"},sidebar:"autogeneratedBar",previous:{title:"8th seminar",permalink:"/c/bonuses/seminar-08"},next:{title:"Practice Exams",permalink:"/c/category/practice-exams"}},c={},l=[{value:"Introduction",id:"introduction",level:2},{value:"Project",id:"project",level:2},{value:"Summary of the gameplay",id:"summary-of-the-gameplay",level:3},{value:"Suggested workflow",id:"suggested-workflow",level:2},{value:"Tasks",id:"tasks",level:2},{value:"Dictionary",id:"dictionary",level:2},{value:"Submitting",id:"submitting",level:2}];function d(e){const n={a:"a",blockquote:"blockquote",code:"code",em:"em",h2:"h2",h3:"h3",hr:"hr",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.p,{children:(0,s.jsx)(n.a,{href:"pathname:///files/c/bonuses/10.tar.gz",children:"Source"})}),"\n",(0,s.jsx)(n.h2,{id:"introduction",children:"Introduction"}),"\n",(0,s.jsx)(n.p,{children:"For this bonus you are given almost finished project - The Hangman Game. Your\ntask is to try the game, in case you find any bugs point them out and cover as\nmuch of the game as possible with tests."}),"\n",(0,s.jsx)(n.p,{children:"For this bonus you can get at maximum 2 K\u20a1."}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Item"}),(0,s.jsx)(n.th,{children:"Bonus"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Fixing bugs from failing tests"}),(0,s.jsx)(n.td,{children:"0.25"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"word_guessed"})}),(0,s.jsx)(n.td,{children:"0.50"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Hidden bug"}),(0,s.jsx)(n.td,{children:"0.50"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Extending tests, undetectable bugs or evil bug"}),(0,s.jsx)(n.td,{children:"0.37"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Refactor"}),(0,s.jsx)(n.td,{children:"0.38"})]})]})]}),"\n",(0,s.jsx)(n.h2,{id:"project",children:"Project"}),"\n",(0,s.jsxs)(n.p,{children:["Project consists of 2 source files - ",(0,s.jsx)(n.code,{children:"hangman.c"})," and ",(0,s.jsx)(n.code,{children:"main.c"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"main.c"})," is quite short and concise, there is nothing for you to do."]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"hangman.c"})," contains implementation of the game. In case you feel lost, consult\nthe documentation in ",(0,s.jsx)(n.code,{children:"hangman.h"})," that represents an interface that can be used\nfor implementing the game."]}),"\n",(0,s.jsxs)(n.p,{children:["Apart from those sources this project is a bit more complicated. ",(0,s.jsx)(n.em,{children:"Game loop"})," is\nrealised via single encapsulated function that complicates the testing. Because\nof that, there are 2 kinds of tests:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.em,{children:"Unit tests"})," - that are present in ",(0,s.jsx)(n.code,{children:"test_hangman.c"})," and can be run via:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ make check-unit\n"})}),"\n",(0,s.jsx)(n.p,{children:"They cover majorly functions that can be tested easily via testing framework."}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.em,{children:"Functional tests"})," - same as in ",(0,s.jsx)(n.code,{children:"seminar-08"})," and are focused on testing the\nprogram as whole. Basic smoke test is already included in ",(0,s.jsx)(n.code,{children:"usage"})," test case."]}),"\n",(0,s.jsx)(n.p,{children:"They can be run via:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ make check-functional\n"})}),"\n",(0,s.jsxs)(n.p,{children:["When testing ",(0,s.jsx)(n.code,{children:"hangman"})," function (the game loop), it is suggested to create\nfunctional tests."]}),"\n",(0,s.jsx)(n.p,{children:"When submitting the files for review, please leave out functional tests that\nwere given as a part of the assignment, so that it is easier to navigate, I\nwill drag the common files myself. :)"}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:"Whole test suite can be run via:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"$ make check\n"})}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"summary-of-the-gameplay",children:"Summary of the gameplay"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsx)(n.li,{children:"Secret word gets chosen from the file that's path is given as an argument."}),"\n",(0,s.jsx)(n.li,{children:"You get 8 guesses."}),"\n",(0,s.jsx)(n.li,{children:"Invalid characters don't count."}),"\n",(0,s.jsx)(n.li,{children:"Already guessed characters don't count, even if not included in the secret."}),"\n",(0,s.jsxs)(n.li,{children:["You can guess the whole word at once","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"If you get it right, you won, game ends."}),"\n",(0,s.jsx)(n.li,{children:"If you don't get it right, you get to see the secret, game ends."}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.li,{children:"In case of end of input, game finishes via force."}),"\n",(0,s.jsx)(n.li,{children:"In case of invalid input, no guesses are subtracted, game carries on."}),"\n",(0,s.jsx)(n.li,{children:"Letters and words are not case sensitive."}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"suggested-workflow",children:"Suggested workflow"}),"\n",(0,s.jsxs)(n.p,{children:["As we have talked about on the seminar, I suggest you to follow\n",(0,s.jsx)(n.em,{children:"Test-Driven Development"}),"\nin this case."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"TDD workflow",src:t(27420).Z+"",width:"2814",height:"1652"})}),"\n",(0,s.jsx)(n.p,{children:"In our current scenario we are already in the stage of refactoring and fixing the\nbugs. Therefore try to follow this succession of steps:"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsx)(n.li,{children:"Try to reproduce the bug."}),"\n",(0,s.jsx)(n.li,{children:"Create a test that proves the presence of the bug."}),"\n",(0,s.jsx)(n.li,{children:"Fix the bug."}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["In case you are submitting the bonus via GitLab, it is helpful to commit tests\nbefore commiting the fixes, so that it is apparent that the bug is manifested.\nExample of ",(0,s.jsx)(n.code,{children:"git log"})," (notice that the first line represents latest commit):"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"feat: Implement fizz_buzzer\ntest: Add tests for fizz_buzzer\nfix: Fix NULL-check in print_name\ntest: Add test for NULL in print_name\n"})}),"\n",(0,s.jsx)(n.h2,{id:"tasks",children:"Tasks"}),"\n",(0,s.jsx)(n.p,{children:"As to your tasks, there are multiple things wrong in this project."}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:'There are 2 "bugs" that cannot be detected via tests, i.e. they are not bugs\nthat affect functionality of the game.'}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["There is one evil bug in ",(0,s.jsx)(n.code,{children:"get_word"}),". It is not required to be fixed ;) Assign\nit the lowest priority."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"There are some tests failing. Please try to figure it out, so you have green\ntests for the rest :)"}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["We have gotten a bug report for ",(0,s.jsx)(n.code,{children:"word_guessed"}),", all we got is"]}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsxs)(n.p,{children:["doesn't work when there are too many ",(0,s.jsx)(n.code,{children:"a"}),"s"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Please try to replicate the bug and create a tests, so we don't get any\nregression later on."}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"One hidden bug :) Closely non-specified, we cannot reproduce it and we were\ndrunk while playing the game, so we don't remember a thing. :/"}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Try to cover as much code via the tests as possible. We are not going to look\nat the metrics, but DRY is violated a lot, so as a last task try to remove as\nmuch of the duplicit code as possible."}),"\n",(0,s.jsx)(n.p,{children:"Tests should help you a lot in case there are some regressions."}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.hr,{}),"\n",(0,s.jsxs)(n.p,{children:["In case you wonder why there are always 3 same words in the file with words, it\nis because of the ",(0,s.jsx)(n.code,{children:"get_word"})," bug. It is not a bug that can be easily fixed, so\nit is a not requirement at all and you can still get all points for the bonus ;)"]}),"\n",(0,s.jsx)(n.h2,{id:"dictionary",children:"Dictionary"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/Functional_testing",children:"Functional tests"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/Smoke_testing_%28software%29",children:"Smoke test"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/Don%27t_repeat_yourself",children:"DRY"})}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"submitting",children:"Submitting"}),"\n",(0,s.jsx)(n.p,{children:"In case you have any questions, feel free to reach out to me."}),"\n",(0,s.jsx)(n.hr,{})]})}function h(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},27420:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/tdd_lifecycle-327ad9ee0ed8318ed11e19a28e02b2cc.png"},11151:(e,n,t)=>{t.d(n,{Z:()=>a,a:()=>o});var s=t(67294);const i={},r=s.createContext(i);function o(e){const n=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/4200b1a9.6913c230.js b/assets/js/4200b1a9.6913c230.js new file mode 100644 index 0000000..dabfc56 --- /dev/null +++ b/assets/js/4200b1a9.6913c230.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[866],{24612:e=>{e.exports=JSON.parse('{"blogPosts":[{"id":"/2024/02/07/lts-distros","metadata":{"permalink":"/blog/2024/02/07/lts-distros","editUrl":"https://github.com/mfocko/blog/tree/main/blog/2024-02-07-lts-distros.md","source":"@site/blog/2024-02-07-lts-distros.md","title":"LTS distributions","description":"Shower thoughts on the LTS Linux distributions.\\n","date":"2024-02-07T00:00:00.000Z","formattedDate":"February 7, 2024","tags":[{"label":"lts","permalink":"/blog/tags/lts"},{"label":"linux distributions","permalink":"/blog/tags/linux-distributions"},{"label":"support","permalink":"/blog/tags/support"},{"label":"paywall","permalink":"/blog/tags/paywall"}],"readingTime":14.515,"hasTruncateMarker":true,"authors":[{"name":"Matej Focko","email":"me+blog@mfocko.xyz","title":"a.k.a. small Fedora maintainer","url":"https://gitlab.com/mfocko","imageURL":"https://github.com/mfocko.png","key":"mf"}],"frontMatter":{"title":"LTS distributions","description":"Shower thoughts on the LTS Linux distributions.\\n","date":"2024-02-07T00:00:00.000Z","authors":[{"key":"mf","title":"a.k.a. small Fedora maintainer"}],"tags":["lts","linux distributions","support","paywall"],"hide_table_of_contents":false},"unlisted":false,"nextItem":{"title":"Mixed feelings on Rust","permalink":"/blog/2024/01/28/rust-opinion"}},"content":"Linux distributions are a common choice for running the servers. There\'s a wide\\nvariety of distributions, but on the servers majority is made by only a few.\\n\\nSome corporations also profit from the support of the \u201cbig\u201d distributions. Let\'s\\ndive into the pros, cons and peculiarities of such _business_.\\n\\nThis post is inspired/triggered by the following Mastodon post:\\n[![Mastodon post about Ubuntu Pro](https://i.imgur.com/mh5RAlV.png)](https://hackers.town/@antijingoist/111864760073049505)\\n\\n\x3c!--truncate--\x3e\\n\\n:::caution Disclaimer\\n\\nYou may take my opinion with a grain of salt, since I\'m affiliated with Red Hat,\\nbut at the same time I\'ve also seen the other side of the fence, so I know how\\nit works from the perspective of the provider/maintainer.\\n\\n:::\\n\\n:::tip\\n\\nIf you are not very oriented in the matters of Linux distributions and\\nmaintaining of packages, I suggest looking at the [glossary](#glossary) at the\\nend to have a better grasp of the terms that are used throughout the post.\\n\\n:::\\n\\n## Point of linux distributions\\n\\nFirst thing I\'d like to point out is the point of the Linux distributions. What\\nbenefit do they provide? And why there are so many of them\u2026\\n\\nAs it has been brought up many times by the _rms_[^1], Linux by itself is not\\nenough, it\'s just the kernel that does the underlying work. We need more\\nsoftware to utilize the hardware. That\'s the gap that Linux distributions bridge\\nby providing the Linux and much more other software that we need.\\n\\nEach distribution is unique in its own way. Some prefer different ways of\\nhandling the software (like Gentoo that allows you to compile it yourself) and\\nothers stable releases of software (like Debian).\\n\\nIn the end it mostly boils down to the packaging. I, as a user, want to do\\nsomething like\\n\\n```\\n$ sudo dnf5 install firefox\\n```\\n\\nand not bother about anything else. I don\'t want to open browser to look the\\nthing up, download it and then click mindlessly 500\xd7 \u201cNext\u201d. I just want to run\\none command and when the maintainers decide it\'s time to move on, another one to\\nupgrade the software to the newer version.\\n\\nOf course, for some use cases you want to minimize the latter. And even make\\nsure that it\'s safe to do it when you need to. You don\'t want to break your\\nproduction deployment just because someone decided it\'s time to push something\\nout.\\n\\nThat\'s when the _maintainers_ come in. They take upon themselves the\\nresponsibility of maintaining the packages. If you\'ve ever used the Debian, you\\nknow very well how _old_ the software is, but that\'s what you might need for\\nyour servers.\\n\\n## Pain of packaging\\n\\nPackaging software _is not_ cost-free. You may as well have 80 % of packages\\nthat don\'t need much care and it\'s rather easy to push them forward, but those\\nremaining, which are complicated and raise issues regularly, will make it up and\\ntake a lot of time and also pain.\\n\\nLibraries are the most common example that might not need much work to be done.\\nOn the other hand, Linux kernel itself is a rather complicated machinery that\\nis patched **a lot** and its build process is not simple either.\\n\\nEven if you consider just those _easily-maintainble_ packages, the process can\\nbe tedious, boring and overall time consuming.\\n\\n:::tip Shameless RHEL-based ecosystem plug\\n\\n[Packit] can help tremendously with the _easily-maintainable_ packages, since it\\n**can** be automated.\\n\\n:::\\n\\n### Packaging whole ecosystems\\n\\nNow it\'s time to talk about whole ecosystems that have some kind of a packaging\\nby themselves. Yes, I mean Python (with its continuous stream of different\\npackage managers), Rust, Go, etc.\\n\\nWhole point of packaging is to have some form of _gating_. In other words, you\\nwant some kind of _quality control_ when pushing changes into the Linux distros.\\n\\nIf you want to package some tool (or even library) from the aforementioned\\necosystems, you need to package all of the dependencies to make sure something\\ndoesn\'t get updated in the meantime (and also that you can safely reproduce the\\nbuilds, if need be).\\n\\nI\'ve tried to package some utilities for EPEL both in Rust and Go. Dependencies\\nform a DAG[^2] and in case of Rust, it\'s _very_ similar to the way `npm` does\\nits packaging.\\n\\n:::danger Spoiler alert\\n\\nYou get a lot of dependencies. And since it\'s a tree of dependencies, there may\\nbe **a lot** of them.\\n\\n:::\\n\\nI have no clue how do the Rust maintainers operate, but I\'m tipping my fedora in\\ntheir direction, since it must be a _pain in the ass_.\\n\\n## Paid distributions\\n\\nYou can find few Linux distributions that are \u201cpaid\u201d. I\'m very well aware of the\\nfact I\'ve used quotes around the word, cause it\'s not that easy and not even\\nsame for all of the distributions that involve some kind of a payment.\\n\\nOne of the first non-free distributions I\'ve come into contact was _[Zorin OS]_\\nwhich basically tries to be the best _transition_ solution when moving away from\\nthe Windows or macOS. If you have a look at the _perks_ of its _Pro_ version\\nthat\'s paid, you may as well decide they are rather questionable\u2026\\n\\nIt\'s time to move into the _Ubuntu Pro_, _RHEL_ and _SLE_ territory. What\'s the\\npoint of those? They definitely offer different kind of, let\'s say,\\n_non-free experience_.\\n\\nWith those you are paying mainly for the support and bug/security patches.\\n\\n:::tip Fun fact\\n\\nThere\'s no mention of any kind of support on the Zorin page\u2026 Apart from the fact\\nthat _you are supporting_ the Zorin development.\\n\\n:::\\n\\n## Repository structure\\n\\nAs I have mentioned above, the three _services_[^3] I mentioned are providing\\nsupport with regards to bugs and security vulnerabilites. Therefore it makes\\nsense to have some kind of a process in place when you\'re pushing changes\\n(either updates, patches or _security_ patches) to the distribution. And yes,\\nthese processes are _in place_.\\n\\nIf you think about the amount of packages that is present in the community\\ndistributions like _archLinux_ (14,830 packages) or _Fedora_ (74,309 packages),\\nit is safe to come to a conclusion that _there\'s no way_ to support all of them.\\n\\n:::tip archLinux\\n\\nIt may seem that archLinux contains rather small set of packages, but one of the\\n_killer features_ of archLinux lies in the AUR (archLinux User Repository) where\\nyou can find additional **93,283** packages.\\n\\n:::\\n\\nThat\'s why the Linux distributions have some structure to their repositories\\nthat contain packages. The way you go around this is rather simple, you choose\\nsome set of _critical_ packages that you guarantee support for (like Linux\\nkernel, openSSL, etc.) and maintain those with all the QA processes in place.\\n\\n:::caution Unpopular opinion\\n\\nThis is also one of the reasons why I\'m quite against packaging anything and\\neverything into the Linux distribution. In my opinion it is impossible to\\n**properly** maintain **huge** set of packages and enforce some kind of\\n**quality control**.\\n\\n:::\\n\\n### Ubuntu\\n\\nUbuntu has pretty granular structure of their repositories, namely:\\n\\n- `main` containing the \u201ccore\u201d of the Ubuntu that is maintained by the Canonical,\\n- `universe` containing literally the \u201cuniverse\u201d, packages that everyone likes,\\n but they\'re not crucial, this repo is maintained mostly by the community,\\n- `multiverse` containing packages with some license or copyright issues, and\\n- `restricted` containing _proprietary_ packages like nvidia drivers and such.\\n\\nBy briefly checking my Ubuntu 23.10 installation, here are stats of packages in\\ntheir respective repositories:\\n\\n- `main` with 6,128 packages,\\n- `universe` with 63,380 packages,\\n- `multiverse` with 997 packages, and finally\\n- `restricted` with 784 packages.\\n\\nAs you can see, if we sum them up, they are relatively similar to the Fedora\\nnumbers.\\n\\n### CentOS\\n\\nCentOS on the other hand has a bit simpler structure with BaseOS for the base\\nand AppStream for additional packages:\\n\\n- `baseos` with 1,058 packages,\\n- `appstream` with 5,646 packages, and\\n- `extras-common` with 42 packages.\\n\\nOverall they make up the similar number as the Ubuntu\'s `main` repository. And\\nyou can also notice that there are no additional repositories.\\n\\n:::tip\\n\\nThere\'s also a CRB (CodeReady Builder) repository with dev packages like headers\\nand such.\\n\\nAnd you can also enable EPEL (Extra Packages for Enterprise Linux) which is\\ncommunity-supported and provides another 19,903 packages.\\n\\n:::\\n\\n## Ubuntu Pro\\n\\nNow it\'s time to get back to the Ubuntu Pro. There are multiple points that need\\nto be taken in account to be either positive or negative about it\u2026\\n\\nWe can start with the way Ubuntu is released and maintained. Ubuntu has regular\\n6-month release cycle and biannual LTS release. Releases are normally supported\\nfor 9 months with the exception of the LTS releases being supported for 5 years.\\n\\nIf you check out the _[Ubuntu Pro]_ website, you can find the following\\nstatement:\\n\\n> **Ubuntu Pro**\\n>\\n> The most comprehensive subscription for open-source software security\\n>\\n> 30-day trial for enterprises. Always free for personal use.\\n\\n:::tip Personal use\\n\\nUbuntu Pro for _personal use_ consists of 5 installations and in case of the\\ncommunity _ambassadors_ 50.\\n\\n:::\\n\\nOverall if you try to find what is included in the Ubuntu Pro:\\n\\n- high and critical patches,\\n- 10 years of maintenance, and\\n- (optional) 24/7 enterprise-grade support.\\n\\nIf we get back to the screenshot all the way at the beginning of the post:\\n[![Mastodon post about Ubuntu Pro](https://i.imgur.com/mh5RAlV.png)](https://hackers.town/@antijingoist/111864760073049505)\\n\\nand try to look up to which repository the packages mentioned in the screenshot\\nbelong, we will find out that they belong to `universe` repository which is\\nmaintained by the community. Not to mention nature of the packages: multimedia.\\n\\nYou may think about this as a scam, but considering repository consisting of 70k\\npackages, it is not an easy task to do. And with LTS releases we\'re talking\\nabout 5+ years of support.\\n\\n:::info Fedora\\n\\nTry to compare this state to Fedora. It also has a 6-month release cycle, but\\nthere are no LTS releases and each release is supported only for a year.\\n\\n:::\\n\\nCommon strategy, at this point, is to pull out the _open-source_. Yes, we are\\nstill dealing with the open-source, but keep in mind that you\'re trying to patch\\nsome issue in a version that\'s 5 years old, upstream definitely doesn\'t care\\nanymore[^4], the development didn\'t stop 5 years ago, it\'s going on and fixing\\nthis issue in a release from 5 years is not the same as fixing it in the current\\nrelease. At this point, if you are paying for such support, you are actually\\npaying for someone to do _software archaeology_ which **can be** _non-trivial_\\nto do.\\n\\nIn the case of Ubuntu Pro we\'re talking about community support and best-effort\\nsupport by Canonical for the paying customers. And that makes sense to me,\\nrunning LTS distro for 5+ years on a desktop seems like an odd choice, even\\nwith the help of _[podman]_ and _[distrobox]_ or _[toolbx]_ that allow us to use\\nstable or LTS distro as a base and containerized development environments on top\\nof that.\\n\\n## RHEL ecosystem\\n\\nRHEL ecosystem is much more complicated in this matter. However it\'s very\\nsimilar to the way SUSE operates with few exceptions.\\n\\nYou can see a flow diagram here:\\n\\n```mermaid\\nflowchart LR;\\n U[upstream] --\x3e FR[Fedora Rawhide];\\n FR --\x3e F[Fedora release];\\n F --\x3e C[CentOS Stream];\\n C --\x3e R[RHEL];\\n```\\n\\nKey things to take and not to take from the flow diagram:\\n\\n- getting from one upstream to its respective downstream is not as simple as the\\n presence of an arrow and it\'s not the same process for all of them\\n- lengths of the arrows are not proportional, specifically:\\n - Fedora Rawhide is _supposed to_ consume updates as soon as possible,\\n - depending on the decision of the maintainer they can, but _don\'t have to_ be\\n included in the currently supported Fedora releases (you can take [Emacs] as\\n an example of such package), but Rawhide eventually becomes the next Fedora\\n release,\\n - CentOS Stream gets branched off a specific Fedora release, and then\\n - ultimately CentOS Stream becomes the next **minor** release of RHEL.\\n- this diagram is simplified by **a lot**\\n\\n:::tip SUSE flow for comparison\\n\\nI\'ll also include a SUSE flow, so you can compare:\\n\\n```mermaid\\nflowchart LR;\\n U[upstream] --\x3e T[openSUSE Tumbleweed];\\n T --\x3e L[openSUSE Leap];\\n L --\x3e S[SUSE Linux Enterprise];\\n S --\x3e L;\\n```\\n\\nYou can notice, as opposed to the RHEL ecosystem, some changes are being\\nbackported to the openSUSE Leap.\\n\\nHowever this is subject to change as there is a new [ALP] project arising which\\nis, more than likely, going to replace the Leap.\\n\\n:::\\n\\n### Change in the model\\n\\nThe flow I\'ve shown above is in effect since late \u201820 and early \u201821. I hope you\\ncan see that it is quite similar to the way SUSE operates too. Before late \u201820\\nthe flow was following:\\n\\n```mermaid\\nflowchart LR;\\n U[upstream] --\x3e FR[Fedora Rawhide];\\n FR --\x3e F[Fedora release];\\n F --\x3e R[RHEL];\\n R --- C[CentOS];\\n```\\n\\nCentOS was the last distribution in that \u201cchain\u201d. This provides some benefits\\nand some negatives.\\n\\n#### Before the change\\n\\nFrom the point of a developer, unless you have some kind of an early access to\\nRHEL, you don\'t see the changes until they land and are already released. This\\nimpairs your ability to test and verify your software before shipping it to your\\nclients that use RHEL.\\n\\nFrom the point of a user, there is one positive, you basically get \u201cfree RHEL\u201d\\nwithout the support. This also allowed you to report bugs against the RHEL,\\nsince they were 1:1 distros (minus the branding and support). So you\'d\\ntechnically get RHEL free of charge.\\n\\nBenefit of such project, except for the cost, is questionable. The main issue,\\nwhich actually became even more apparent after changing the flow, is someone\\nelse repackaging your own product and selling it again.\\n\\n#### After the change\\n\\nFirst of all, the current flow counters the issue mentioned above. You can test\\nyour projects against the _next minor RHEL release_. CentOS Stream is free, so\\nyou can freely incorporate it into your CI pipelines.\\n\\n:::tip Shameless plug pt. 2\\n\\nAgain, [Packit] can help you on upstream to verify that you\'re not breaking your\\nRPM builds and on top of that you can also use [Testing Farm] to run tests on a\\nspecific Fedora or CentOS Stream releases.\\n\\n> Green tests may not be green everywhere and catching such issues as soon as\\n> possible costs much less than catching them further down the chain.\\n\\n:::\\n\\nThere are many people thinking that RHEL has become closed-source. It is not.\\nThe development happens _out in the open_, it\'s more open that it was before.\\nHowever with the cost of not getting the exact same thing for free. You can get\\nthe next minor RHEL, not the same that\'s normally paid for. [Packit] is an\\nexample of a service that is deployed on the CentOS 9 Stream and even used to be\\ndeployed on Fedora, but the regular 6-month release cycle caused some minor\\nissues here and there.\\n\\n_Production-ready_ is something that heavily depends on the context\u2026\\n\\n:::tip Free \u201cclones\u201d\\n\\nAfter this change so-called _free \u201cclones\u201d_ emerged. I have to admit that in\\ncase of _[AlmaLinux]_ I can see some benefits e.g., pushing for live images and\\nsupport of various desktop environments, Raspberry Pi support or even WSL images\\nbeing present in the M$ Store and easy to install.\\n\\n:::\\n\\n## Open-source and paid support\\n\\nOverall I don\'t think that paying for the support of 5 years old _non-critical_\\npackages is going against the open-source. It is a non-trivial work that, in\\nmajority of cases, cannot be included in the upstream, therefore the benefit is\\nreapt only by the paying customers. I have to admit that in the case of the\\nUbuntu Pro it may seem a bit weird (hiding patches behind the paywall). However\\nwe\'re still talking about rather big set of packages that will affect a minority\\nof server workloads, if any.\\n\\n## Glossary\\n\\n- _rolling release_ - continuously released without \u201csignificant milestones\u201d\\n\\n :::tip\\n\\n As an example of rolling distribution you can take archLinux, openSUSE\\n Tumbleweed, Fedora Rawhide, or even CentOS 9 Stream.\\n\\n As en example of **not** rolling distribution you can take Ubuntu, openSUSE\\n Leap or Fedora.\\n\\n :::\\n\\n- _bleeding edge_ - contains the latest versions as they are released on the\\n upstream\\n\\n :::tip\\n\\n As an example you can take archLinux, openSUSE Tumbleweed or Fedora Rawhide.\\n You can also notice how common it is to combine _rolling release_ with\\n _bleeding edge_.\\n\\n :::\\n\\n- _upstream_ & _downstream_\\n\\n You\'re most likely to meet these terms in the meaning of upstream being the\\n project itself and downstream being the packaging of said project in some\\n distribution.\\n\\n However this can also apply to distributions like _openSUSE Tumbleweed_ with\\n _openSUSE Leap_, _Fedora_ with _CentOS Stream_, or even _CentOS Stream_ with\\n _RHEL_. This basically means that the packages/software is being released into\\n the upstream (Tumbleweed, Fedora, or even CentOS) and then after being tested\\n is taken further down into their respective downstreams (Leap, CentOS, RHEL).\\n\\n[almalinux]: https://almalinux.org/\\n[alp]: https://susealp.io/\\n[distrobox]: https://distrobox.it/\\n[emacs]: https://src.fedoraproject.org/rpms/emacs/\\n[packit]: https://packit.dev/\\n[podman]: https://podman.io/\\n[testing farm]: https://docs.testing-farm.io/Testing%20Farm/0.1/index.html\\n[toolbx]: https://containertoolbx.org/\\n[ubuntu pro]: https://ubuntu.com/pro/\\n[zorin os]: https://zorin.com/os/pro/\\n\\n[^1]: Richard Stallman\\n[^2]: directed acyclic graph\\n[^3]:\\n Ubuntu Pro is technically a service whereas the RHEL and SLE are distros\\n with the support included.\\n\\n[^4]:\\n There are upstream projects that keep LTS branches, such as Linux kernel,\\n but even in the case of the kernel itself, they\'re planning on ending it,\\n since the cost outweighs the benefits at this point."},{"id":"/2024/01/28/rust-opinion","metadata":{"permalink":"/blog/2024/01/28/rust-opinion","editUrl":"https://github.com/mfocko/blog/tree/main/blog/2024-01-28-rust-opinion.md","source":"@site/blog/2024-01-28-rust-opinion.md","title":"Mixed feelings on Rust","description":"Discussing my mixed feelings about the Rust language.\\n","date":"2024-01-28T00:00:00.000Z","formattedDate":"January 28, 2024","tags":[{"label":"rust","permalink":"/blog/tags/rust"},{"label":"memory safety","permalink":"/blog/tags/memory-safety"},{"label":"cult","permalink":"/blog/tags/cult"},{"label":"hype","permalink":"/blog/tags/hype"}],"readingTime":15.395,"hasTruncateMarker":true,"authors":[{"name":"Matej Focko","email":"me+blog@mfocko.xyz","title":"a.k.a. passionate language hater","url":"https://gitlab.com/mfocko","imageURL":"https://github.com/mfocko.png","key":"mf"}],"frontMatter":{"title":"Mixed feelings on Rust","description":"Discussing my mixed feelings about the Rust language.\\n","date":"2024-01-28T00:00:00.000Z","authors":[{"key":"mf","title":"a.k.a. passionate language hater"}],"tags":["rust","memory safety","cult","hype"],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"LTS distributions","permalink":"/blog/2024/02/07/lts-distros"},"nextItem":{"title":"How can Copr help with broken dependencies","permalink":"/blog/2023/08/02/copr"}},"content":"Rust has become a rather popular language these days. I\'ve managed to get my\\nhands dirty with it during _[Advent of Code]_ \u201822 and partially \u201823. I\'ve also\\nused it for few rounds of _[Codeforces]_ and I have to try very hard to maintain\\nsome variety of languages for LeetCode challenges along with the Rust. I\'ll\\ndisclaim up front that I won\'t be only positive, since this post is a result of\\nmultiple discussions about Rust and I stand by\\n_\u201cAll that glitters is not gold\u201d_, so if you can\'t stand your favorite language\\nbeing criticized in any way, don\'t even proceed. :wink:\\n\\n\x3c!--truncate--\x3e\\n\\n## Memory safety\\n\\nI\'ll start by kicking the biggest benefit of the language, the memory safety.\\nLet\'s be honest here, majority of the checks rely on the static analysis, cause\\nyou can\'t do anything else during the compile-time, right? Therefore we can\\nbasically say that we are relying on the compiler to \u201csolve\u201d all of our issues.\\n\\n:::warning\\n\\nI\'m not doubting the fact that compiler can prevent **a lot** of the memory\\nerrors, I\'m just saying it\'s not realistic to cover **everything**.\\n\\n:::\\n\\n### Compiler\\n\\nI guess we can safely[^2] agree on the fact that we 100% rely on the compiler to\\n_have our back_. Is the compiler bug-free? I doubt it. This is not meant in an\\noffensive way to the Rust compiler developers, but we need to be realistic here.\\nIt\'s a compiler, even older and larger projects like _gcc_ or _llvm_ can\'t avoid\\nbugs to appear.\\n\\nWhen I was trying out Rust for some of the LeetCode challenges I\'ve stumbled\\nupon the following warning:\\n![Example of a compiler bug](https://i.imgur.com/NfPLF6o.png)\\n\\n:::danger [Issue](https://github.com/rust-lang/rust/issues/59159)\\n\\nThe issue here comes from the fact that we have 2 simultaneous references to the\\nsame memory (one is mutable and one immutable). If you cannot think of any way\\nthis can break, I\'ll give you a rather simple example from C++ where this could\\ncause an issue.\\n\\nImagine a function that has some complex object and also calls a coroutine which\\nutilizes read-only reference to that object. When the coroutine suspends, the\\ncaller can modify the object. This can break the integrity of data read by the\\ncoroutine.\\n\\n- Yes, this **can** cause a memory error.\\n- Yes, this **hasn\'t** been handled until someone noticed it.\\n\\nFixing this bug is not backwards compatible, cause you\'re covering a case that\\nhasn\'t been covered before.\\n\\n:::\\n\\n### Enforcing the safety\\n\\nOne of the ways Rust enforces the safety is by restricting what you can do, like\\nthe example above. Aforementioned issue _can_ happen, but **doesn\'t have to**.\\nRule of the thumb in the Rust compiler is to _\u201cblock\u201d_ anything that can be an\\nissue, static analysis can\'t do much more, it cannot decide whether it\'s safe to\\ndo it or not.\\n\\nSatisfying the Rust compiler is sometimes a brutal pain in the ass, because you\\ncannot do things like you\'re used to, you need to work around them _somehow_.\\n\\n:::tip\\n\\nKey difference between Rust and C or C++ lies in the fact that Rust chooses to\\n_ban_ all \u201cpotentially offensive\u201d actions, C and C++ _relies_ on **you** to be\\nsure it\'s safe to do.\\n\\n![C++ v. Rust](https://i.imgur.com/0vbkYPp.png)\\n\\n:::\\n\\n### Consequences\\n\\nWhere are we heading with this approach of \u201cif it compiles, it runs\u201d though?\\nIn this aspect I have a rather similar opinion as with regards to the ChatGPT\\nand its derivatives.\\n\\nIf you teach people to 100% depend on the compiler, they will do it, cause it\'s\\n_easy_. All you need to do is make the compiler _shut up_[^3]. Giving up the\\n_intellectual masturbation_ about the memory safety will make you lose your edge\\nover the time. When we get to the point of everyone being in the mindset\\nmentioned above, who\'s going to maintain the compiler? This is the place where\\nyou **need to** think about the memory safety and furthermore in a much more\\ngeneral way than in your own projects, because it is the thing that everyone\\n_blindly believes in_ in the end.\\n\\nI\'m not saying that everyone should give up Rust and think about their memory\\nmanagement and potential memory issues. I\'m just saying that going the easy way\\nwill make people _dull_ and they should think about it anyways, that\'s how the\\nissue above has been discovered. If everyone walked past and didn\'t think about\\nit, no one would discover this issue till it bit them hard.\\n\\n:::tip Standard library\\n\\nEven the standard library is littered with `unsafe` blocks that are prefixed\\nwith comments in style:\\n\\n```rs\\n// SAFETY: \u2026\\n```\\n\\nThe fact that the _casual_ Rust dev doesn\'t have to think much about safety,\\ncause the compiler has their back, doesn\'t mean that the Rust compiler dev\\ndoesn\'t either.\\n\\nI gotta admit that I adopted this concept in other languages (even in Python),\\ncause you can encounter situations where it doesn\'t have to be clear _why_ you\\ncan do _what_ you\'re doing.\\n\\n:::\\n\\n## Development & design\\n\\nDevelopment of Rust is\u2026 very fast. One positive is that they\'re trying to be as\\nbackward compatible as possible at least by verifying against all the published\\ncrates in the process. Of course, you cannot be backward compatible about fixing\\nthe bugs that have been found, but such is life.\\n\\n### Fast development cycle\\n\\nOne of the negatives of the fast development cycle is the fact that they\'re\\nusing the latest features already in the next release of the Rust. Yes, it is\\nsomething that you can use for verifying and testing your own changes, but at\\nthe same time it places a requirement of the latest release to compile the next\\none.\\n\\n:::tip\\n\\nIf you check `gcc` for example, they have a requirement of minimal version of\\ncompiler that you need for the build. Though gcc\'s requirement is not so _needy_\\nas the Rust one.\\n\\n:::\\n\\nOne of the other negatives is the introduction of bugs. If you\'re pushing\\nchanges, somewhat mindlessly, at such a fast pace, it is inevitable to introduce\\na bunch bugs in the process. Checking the GitHub issue tracker with\\n\\n```\\nis:issue is:open label:C-bug label:T-compiler\\n```\\n\\nyields **2,224** open issues at the time of writing this post.\\n\\n### RFCs\\n\\nYou can find **a lot** of RFCs for the Rust. Some of them are more questionable\\nthan the others. Fun thing is that a lot of them make it to the nightly builds,\\nso they can be tested and polished off. Even the questionable ones\u2026 I\'ll leave\\nfew examples for a better understanding.\\n\\nOne of such features is the `do yeet` expression:\\n\\n```rust\\n#![feature(yeet_expr)]\\n\\nfn foo() -> Result {\\n do yeet 4;\\n}\\nassert_eq!(foo(), Err(4));\\n\\nfn bar() -> Option {\\n do yeet;\\n}\\nassert_eq!(bar(), None);\\n```\\n\\nIt allows you to \u201cyeet\u201d the errors out of the functions that return `Result` or\\n`Option`.\\n\\n[One](https://github.com/rust-lang/rfcs/pull/3503) of the more recent ones is\\nthe ability to include Cargo manifests into the sources, so you can do something\\nlike:\\n\\n```rust\\n#!/usr/bin/env cargo\\n---\\n[dependencies]\\nclap = { version = \\"4.2\\", features = [\\"derive\\"] }\\n---\\n\\nuse clap::Parser;\\n\\n#[derive(Parser, Debug)]\\n#[clap(version)]\\nstruct Args {\\n #[clap(short, long, help = \\"Path to config\\")]\\n config: Option,\\n}\\n\\nfn main() {\\n let args = Args::parse();\\n println!(\\"{:?}\\", args);\\n}\\n```\\n\\nI would say you can get almost anything into the language\u2026\\n\\n## Community and hype train\\n\\nRust community is a rather unique thing. A lot of people will hate me for this,\\nbut I can\'t help, but to compare them to _militant vegans_. I\'ll go through some\\nof the things related to it, so I can support my opinion at least.\\n\\n_Rust is the best language._ It is not. There is no best language, each has its\\nown positives and negatives, you need to choose the language that\'s **the most**\\n**suitable for your use case**. There are areas where Rust excels, though I have\\nto admit it\'s very close to being a universal hammer regardless of how suitable\\nit is. There is a very steep learning curve to it, beginnings in Rust are very\\npainful.\\n\\n_Rewrite everything in Rust._ Just no. There are multiple feedbacks on doing\\nrewrites, it is very common to fix _N_ bugs with a rewrite while introducing\\n_N + 1_ other bugs in the process. It doesn\'t solve anything unless there are\\nsome strong reasons to go with it. Majority of such suggested rewrites don\'t\\nhave those reasons though.\\n\\n_Language \u2039x\u203a is bad, though in Rust\u2026_ Cherry-picking one specific pain point of\\none language and reflecting how it is better in other language can go both ways.\\nFor example it is rather easy to pick the limitations imposed by Rust compiler\\nand show how it\'s possible in other languages :man_shrugging:\\n\\nI don\'t mind any of those opinions, you\'re free to have them, as long as you\\ndon\'t rub them in my face which is not the usual case\u2026 This experience makes it\\njust worse for me, part of this post may be also influenced by this fact.\\n\\n### Rust in Linux\\n\\n:::caution\\n\\nAs someone who has seen the way Linux kernel is built in the RHEL ecosystem, how\\ncomplex the whole thing is and how much resources you need to proceed, I have\\nvery strong opinions on this topic.\\n\\n:::\\n\\nIt took years of work to even \u201cincorporate\u201d Rust into the Linux codebase, just\\nto get the \u201cHello World!\u201d. I don\'t have anything against the idea of writing\\ndrivers in the Rust, I bet it can catch a lot of common mistakes, but still\\nintroducing Rust to the kernel is another step to enlarge the monster.\\n\\nI have to admit though that the _Apple GPU_ driver for Linux written in Rust is\\nquite impressive. Apart from that there are not so many benefits, yet\u2026\\n\\n## Packaging\\n\\nI\'ll divide the packaging into the packaging of the language itself and the\\nprograms written in Rust.\\n\\nLet\'s start with the `cargo` itself though. Package managers of the languages\\nusually get a lot of hate (you can take `npm` or `pip` as examples[^1]). If\\nyou\'ve ever tried out Rust, I bet you already know where I\'m going with this.\\nYes, I mean the compilation times, or even Cargo downloading _whole_ index of\\ncrates just so you can update that one dependency (and 3 millions of indirect\\ndeps). When I was doing AoC \u201822 in Rust, I\'ve set up `sccache` right away on the\\nfirst day.\\n\\nLet\'s move to the packaging of the Rust itself, it\'s tedious. Rust has a very\\nfast development cycle and doesn\'t even try to make the builds backward\\ncompatible. If there is a new release of Rust, there is a very high chance that\\nyou cannot build that release with anything other than **the latest** Rust\\nrelease. If you have ever touched the packaging, you know that this is something\\nthat can cause a lot of problems, cause you need the second-to-latest version to\\ncompile the latest version, don\'t forget that this applies inductively\u2026 People\\nrunning _Gentoo_ could tell you a lot about this.\\n\\n:::info\\n\\nCompiling the compilers takes usually more time than compiling the kernel\\nitself\u2026\\n\\n:::\\n\\nI cannot speak about packaging of Rust programs in other than RHEL-based\\ndistros, though I can speak about RHEL ecosystem. Fedora packaging guidelines\\nspecify that you need to build each and every dependency of the program\\nseparately. I wanted to try out _AlmaLinux_ and install Alacritty there and I\\nfailed miserably. The solution that worked, consisted of ignoring the packaging\\nguidelines, running `cargo build` and consuming the binaries afterwards.\\nDependencies of the Rust programs are of a similar nature as JS dependencies.\\n\\n> I\'m tipping my fedora[^2] in the general direction of the maintainers of Rust\\n> packages in RHEL ecosystem. I wouldn\'t be able to do this without losing my\\n> sanity.\\n\\n## Likes\\n\\nIf you\'ve come all the way here and you\'re a Rustacean, I believe I\'ve managed\\nto get your blood boiling, so it\'s time to finish this off by stuff I like about\\nRust. I doubt I will be able to cover everything, but I can try at least. You\\nhave to admit it\'s much easier to remember the bad stuff as opposed to the good.\\n:wink:\\n\\n### Workflow and toolchain\\n\\nI prefered using Rust for the _Advent of Code_ and _Codeforces_ as it provides\\na rather easy way to test the solutions before running them with the challenge\\ninput (or test runner). I can give an example from the _Advent of Code_:\\n\\n```rust\\nuse aoc_2023::*;\\n\\ntype Output1 = i32;\\ntype Output2 = Output1;\\n\\nstruct DayXX {}\\nimpl Solution for DayXX {\\n fn new>(pathname: P) -> Self {\\n let lines: Vec = file_to_lines(pathname);\\n\\n todo!()\\n }\\n\\n fn part_1(&mut self) -> Output1 {\\n todo!()\\n }\\n\\n fn part_2(&mut self) -> Output2 {\\n todo!()\\n }\\n}\\n\\nfn main() -> Result<()> {\\n DayXX::main()\\n}\\n\\ntest_sample!(day_XX, DayXX, 42, 69);\\n```\\n\\nThis was the skeleton I\'ve used and the macro at the end is my own creation that\\nexpands to:\\n\\n```rust\\n#[cfg(test)]\\nmod day_XX {\\n use super::*;\\n\\n #[test]\\n fn part_1() {\\n let path = DayXX::get_sample(1);\\n let mut day = DayXX::new(path);\\n assert_eq!(day.part_1(), 42);\\n }\\n\\n #[test]\\n fn part_2() {\\n let path = DayXX::get_sample(2);\\n let mut day = DayXX::new(path);\\n assert_eq!(day.part_2(), 69);\\n }\\n}\\n```\\n\\nWhen you\'re solving the problem, all you need to do is switch between\\n`cargo test` and `cargo run` to check the answer to either sample or the\\nchallenge input itself.\\n\\nIntroduce [bacon] and it gets even better. Bacon is a CLI tool that wraps around\\nthe `cargo` and allows you to check, run, lint or run tests on each file save.\\nIt\'s a very pleasant thing for a so-called _compiler-assisted_ development.\\n\\nSpeaking of linting from within the bacon, you cannot leave out the [clippy].\\nNot only it can whip your ass because of errors, but it can also produce a lot\\nof helpful suggestions, for example passing slices by borrow instead of\\nborrowing the `Vec` itself when you don\'t need it.\\n\\n### Standard library\\n\\nThere\'s **a lot** included in the standard library. It almost feels like you\\nhave all you need[^4]. I like placeholders (like `todo!()`, `unreachable!()`,\\n`unimplemented!()`) to the extent of\\n[implementing](/cpp/exceptions-and-raii/placeholders) them as exceptions in C++.\\n\\nYou can find almost anything. Though you can also hit some very weird issues\\nwith some of the nuances of the type system.\\n\\n### `unsafe`\\n\\nThis might be something that people like to avoid as much as possible. However I\\nthink that forming a habit of commenting posibly unsafe operations in **any**\\nlanguage is a good habit, as I\'ve mentioned above. You should be able to argue\\nwhy you can do something safely, even if the compiler is not kicking your ass\\nbecause of it.\\n\\nExcerpt of such comment from work:\\n\\n```py\\n# SAFETY: Taking first package instead of specific package should be\\n# safe, since we have put a requirement on \xbbone\xab \u2039upstream_project_url\u203a\\n# per Packit config, i.e. even if we\'re dealing with a monorepo, there\\n# is only \xbbone\xab upstream. If there is one upstream, there is only one\\n# set of GPG keys that can be allowed.\\nreturn self.downstream_config.packages[\\n self.downstream_config._first_package\\n].allowed_gpg_keys\\n```\\n\\n### Traits\\n\\nOne of the other things I like are the traits. They are more restrictive than\\ntemplates or concepts in C++, but they\'re doing their job pretty good. If you\\nare building library and require multiple traits to be satisfied it means a lot\\nof copy-paste, but that\'s soon to be fixed by the [trait aliases].\\n\\n:::tip Comparing to other languages\\n\\nOn Wikipedia I\'ve seen trait being defined as a more restrictive type class as\\nyou may know it from the Haskell for example. C++ isn\'t behind either with its\\n_constraints and concepts_. I would say that we can order them in the following\\norder based on the complexity they can express:\\n\\n```\\nRust\'s trait < Haskell\'s type class < C++\'s concept\\n```\\n\\n:::\\n\\nYou can also hit some issues, like me when trying to support conversions between\\nunderlying numeric types of a 2D vectors or support for using an operator from\\nboth sides (I couldn\'t get `c * u` to work in the same way as `u * c` because\\nthe first one requires you to implement the trait of a built-in type).\\n\\n:::warning Implementation\\n\\nImplementing traits lies in\\n\\n```rust\\nimpl SomeTrait for SomeStruct {\\n // implementation goes here\\n}\\n```\\n\\nOne of the things I **would love to** see is being able to define the helper\\nfunctions within the same block. As of now, the only things allowed are the ones\\nthat are required by the trait, which in the end results in a randomly lying\\nfunctions around (or in a implementation of the structure itself). I don\'t like\\nthis mess at all\u2026\\n\\n:::\\n\\n### Influence of functional paradigm\\n\\nYou can see a big influence of the functional paradigm. Not only in iterators,\\nbut also in the other parts of the language. For example I prefer `Option` or\\n`Result` to `null`s and exceptions. Pattern matching together with\\ncompiler both enforces handling of the errors and rather user-friendly way of\\ndoing it.\\n\\nNot to mention `.and_then()` and such. However spending most of the time with\\nthe AoC you get pretty annoyed of the repetitive `.unwrap()` during parsing,\\nsince you are guaranteed correct input.\\n\\n### Macros\\n\\nMacros are a very strong pro of the Rust. And no, we\'re not going to talk about\\nthe procedural macros\u2026\\n\\nAs I\'ve shown above I\'ve managed to \u201ctame\u201d a lot of copy-paste in the tests for\\nthe AoC by utilizing a macro that generated a very basic template for the tests.\\n\\nAs I have mentioned the traits above, I cannot forget to give props to `derive`\\nmacro that allows you to \u201cdeduce\u201d the default implementation. It is very helpful\\nfor a tedious tasks like implementing `Debug` (for printing out the structures)\\nor comparisons, though with the comparisons you need to be careful about the\\ndefault implementation, it has already bitten me once or twice.\\n\\n## Summary\\n\\nOverall there are many things about the Rust I like and would love to see them\\nimplemented in other languages. However there are also many things I don\'t like.\\nNothing is **exclusively** black and white.\\n\\n[advent of code]: https://adventofcode.com\\n[bacon]: https://dystroy.org/bacon/\\n[clippy]: https://github.com/rust-lang/rust-clippy\\n[codeforces]: https://codeforces.com\\n[trait aliases]: https://github.com/rust-lang/rfcs/blob/master/text/1733-trait-alias.md\\n\\n[^1]:\\n not to even mention multiple different packaging standards Python has, which\\n is borderline https://xkcd.com/927/\\n\\n[^2]: pun intended\\n[^3]: It\'s not that easy with the Rust compiler, but OK\u2026\\n[^4]:\\n unlike Python where there\'s whole universe in the language itself, yet there\\n are essential things not present\u2026"},{"id":"/2023/08/02/copr","metadata":{"permalink":"/blog/2023/08/02/copr","editUrl":"https://github.com/mfocko/blog/tree/main/blog/2023-08-02-copr.md","source":"@site/blog/2023-08-02-copr.md","title":"How can Copr help with broken dependencies","description":"Copr comes to save you when maintainer doesn\'t care.","date":"2023-08-02T00:00:00.000Z","formattedDate":"August 2, 2023","tags":[{"label":"\ud83c\udfed","permalink":"/blog/tags/\ud83c\udfed"},{"label":"red-hat","permalink":"/blog/tags/red-hat"},{"label":"copr","permalink":"/blog/tags/copr"},{"label":"admin","permalink":"/blog/tags/admin"},{"label":"vps","permalink":"/blog/tags/vps"}],"readingTime":3.44,"hasTruncateMarker":true,"authors":[{"name":"Matej Focko","email":"me+blog@mfocko.xyz","title":"a.k.a. your opinionated admin","url":"https://gitlab.com/mfocko","imageURL":"https://github.com/mfocko.png","key":"mf"}],"frontMatter":{"title":"How can Copr help with broken dependencies","description":"Copr comes to save you when maintainer doesn\'t care.","date":"2023-08-02T00:00:00.000Z","authors":[{"key":"mf","title":"a.k.a. your opinionated admin"}],"tags":["\ud83c\udfed","red-hat","copr","admin","vps"]},"unlisted":false,"prevItem":{"title":"Mixed feelings on Rust","permalink":"/blog/2024/01/28/rust-opinion"},"nextItem":{"title":"4th week of Advent of Code \'22 in Rust","permalink":"/blog/aoc-2022/4th-week"}},"content":"When you decide to run Fedora on your VPS, you might get screwed over by using\\nrandom repositories\u2026\\n\\n\x3c!--truncate--\x3e\\n\\nWhen I \u201creserved\u201d my VPS[^1] back in June \'20, I slapped Fedora on it without\\nthinking. I bet 99% of people would say that I\'m crazy for doing such thing[^2],\\n**BUT** I\'ve been using Fedora on my PCs for some time already and it felt very\\nstable and natural to just use, even for VPS.\\n\\nOne of the first things I\'ve done was setting up a mail server. You may guess\\nwhat\'s the fun part about having a mail server\u2026 Yes, it\'s all the spam you\\nreceive and only then you realize how much \u201ccrap\u201d gets filtered on free mail\\nservices. To battle this problem I chose to use\\n[rspamd](https://github.com/rspamd/rspamd) that had CentOS support, but someone\\nhad a [Copr](https://copr.fedorainfracloud.org/) repository that I used to\\ninstall it.\\n\\n## How does Copr repositories work?\\n\\nIf you have ever used Ubuntu, you might be familiar with the concept since it is\\nvery close to [PPAs](https://help.ubuntu.com/community/PPA).\\n\\ntl;dr of the whole process consists of\\n\\n1. enabling the Copr repository, and\\n2. installing the desired package.\\n\\nSo in shell you would do\\n\\n```\\n# dnf copr enable \u2039copr-repository\u203a\\n# dnf install \u2039package-from-the-repository\u203a\\n```\\n\\nAnd\u2026 that\'s it! Nothing else needed! Simple, right? And literally same process\\nas you would do for the PPA.\\n\\n:::tip AUR\\n\\nOn the other hand, if you are familiar with the archLinux, you definitely know\\nAUR and what it can do for you. Copr repository is pretty similar, but the\\npackages are prebuilt in Copr and Copr repositories can carry the required\\ndependencies for said packages, which simplifies the distribution, and can even\\nhelp with installing singular packages (when you just need the dependency, not\\neverything).\\n\\n:::\\n\\n## My issue\\n\\nNow you might wonder how would I use it on my VPS. It\'s rather simple, once in\\n6 months a new Fedora release comes out. And you need to upgrade to newer\\nrelease\u2026 You don\'t need to do it right away and for such setup it probably isn\'t\\neven recommended.\\n\\n:::tip\\n\\nFedora releases are supported for a year, i.e. they live 6 months till the next\\nrelease and then another 6 months till another release.\\n\\nSome people prefer to run one version \u201cbehind\u201d. If you ever decide to run it on\\nyour home server or in a similar setup, it might be a pretty good idea to\\nfollow. I\'m using the \u201clatest greatest\u201d, cause why not :smile:\\n\\nOne way or another, you still need to bump the release every six months, unless\\nyou\'d bump 2 releases at once every year, which would be a decision, since, at\\nleast I, cannot see any benefits in it\u2026 You don\'t go for \u201cstability\u201d, cause once\\na year you switch to the latest release and then, before you bump, you use one\\nyear old software, so you\'re not even using the latest.\\n\\n:::\\n\\nFast-forward 2 years in the future, new Fedora release came out (October \'22)\\nand I was doing an upgrade. Dependencies of the rspamd have been updated and\\nrspamd builds in Copr have failed and no one fixed it. Cool, so now I can\\nupgrade, but can either ignore the dependencies or uninstall the rspamd\u2026\\n\\n## How can Copr help?\\n\\nI have managed to find\\n[specfile](https://github.com/rspamd/rspamd/blob/master/rpm/rspamd.spec) for the\\nrspamd package that they use for CentOS. There were some files apart from the\\nspecfile, so I had to make an SRPM locally and then\u2026 I just uploaded the SRPM\\nto the Copr to\\n[build](https://copr.fedorainfracloud.org/coprs/mfocko/rspamd/build/5046567/)\\nan RPM.\\n\\nI have switched the previous Copr repository for rspamd with my own and happily\\nproceeded with the upgrade.\\n\\n## Conclusion\\n\\nCopr is heavily used for testing builds on the upstream with\\n[Packit](https://packit.dev). However, as you can see, it is possible to use it\\n**very well** for packaging your own stuff and avoiding issues (such as the one\\nI have described above), if need be.\\n\\n[^1]: [vpsFree.cz](https://vpsfree.cz)\\n[^2]:\\n Even though I\'ve been running archLinux on some Raspberry Pi\'s and also\\n on one of my \u201chome servers\u201d, before getting the VPS. You could say I like\\n to live on the edge\u2026"},{"id":"aoc-2022/4th-week","metadata":{"permalink":"/blog/aoc-2022/4th-week","editUrl":"https://github.com/mfocko/blog/tree/main/blog/aoc-2022/04-week-4.md","source":"@site/blog/aoc-2022/04-week-4.md","title":"4th week of Advent of Code \'22 in Rust","description":"Surviving fourth week in Rust.","date":"2023-07-07T15:14:00.000Z","formattedDate":"July 7, 2023","tags":[{"label":"advent-of-code","permalink":"/blog/tags/advent-of-code"},{"label":"advent-of-code-2022","permalink":"/blog/tags/advent-of-code-2022"},{"label":"rust","permalink":"/blog/tags/rust"}],"readingTime":15.175,"hasTruncateMarker":true,"authors":[{"name":"Matej Focko","email":"me+blog@mfocko.xyz","title":"a.k.a. @mf","url":"https://gitlab.com/mfocko","imageURL":"https://github.com/mfocko.png","key":"mf"}],"frontMatter":{"title":"4th week of Advent of Code \'22 in Rust","description":"Surviving fourth week in Rust.","date":"2023-07-07T15:14","slug":"aoc-2022/4th-week","authors":"mf","tags":["advent-of-code","advent-of-code-2022","rust"],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"How can Copr help with broken dependencies","permalink":"/blog/2023/08/02/copr"},"nextItem":{"title":"3rd week of Advent of Code \'22 in Rust","permalink":"/blog/aoc-2022/3rd-week"}},"content":"Let\'s go through the fourth week of [_Advent of Code_] in Rust.\\n\\n\x3c!--truncate--\x3e\\n\\n## [Day 22: Monkey Map](https://adventofcode.com/2022/day/22)\\n\\n:::info tl;dr\\n\\nSimulating a movement on a 2D map with given instructions. Map becomes a cube in\\nthe 2nd part\u2026\\n\\n:::\\n\\n:::caution Rant\\n\\nThis was the most obnoxious problem of this year\u2026 and a lot of Rust issues have\\nbeen hit.\\n\\n:::\\n\\n### Solution\\n\\nIt seems like a very simple problem to solve, but with very obnoxious changes in\\nthe 2nd part and also it\'s relatively hard to decompose \xbbproperly\xab.\\n\\n#### Column iterator\\n\\nIn the first part of the problem it was needed to know the boundaries of each\\nrow and column, since I stored them in `Vec>` and padded with spaces\\nto ensure I have a rectangular 2D \u201carray\u201d. However when you wanted to go through\\neach row and column to determine the boundaries, it was very easy to do for the\\nrows (cause each row is a `Vec` element), but not for the columns, since they\\nspan multiple rows.\\n\\nFor this use case I have implemented my own _column iterator_:\\n\\n```rust\\npub struct ColumnIterator<\'a, T> {\\n map: &\'a [Vec],\\n column: usize,\\n\\n i: usize,\\n}\\n\\nimpl<\'a, T> ColumnIterator<\'a, T> {\\n pub fn new(map: &\'a [Vec], column: usize) -> ColumnIterator<\'a, T> {\\n Self { map, column, i: 0 }\\n }\\n}\\n\\nimpl<\'a, T> Iterator for ColumnIterator<\'a, T> {\\n type Item = &\'a T;\\n\\n fn next(&mut self) -> Option {\\n if self.i >= self.map.len() {\\n return None;\\n }\\n\\n self.i += 1;\\n Some(&self.map[self.i - 1][self.column])\\n }\\n}\\n```\\n\\nGiven this piece of an iterator, it is very easy to factor out the common\\nfunctionality between the rows and columns into:\\n\\n```rust\\nlet mut find_boundaries = |constructor: fn(usize) -> Orientation,\\n iterator: &mut dyn Iterator,\\n upper_bound,\\n i| {\\n let mut first_non_empty = iterator.enumerate().skip_while(|&(_, &c)| c == \' \');\\n let start = first_non_empty.next().unwrap().0 as isize;\\n\\n let mut last_non_empty = first_non_empty.skip_while(|&(_, &c)| c != \' \');\\n let end = last_non_empty.next().unwrap_or((upper_bound, &\'_\')).0 as isize;\\n\\n boundaries.insert(constructor(i), start..end);\\n};\\n```\\n\\nAnd then use it as such:\\n\\n```rust\\n// construct all horizontal boundaries\\n(0..map.len()).for_each(|row| {\\n find_boundaries(\\n Orientation::horizontal,\\n &mut map[row].iter(),\\n map[row].len(),\\n row,\\n );\\n});\\n\\n// construct all vertical boundaries\\n(0..map[0].len()).for_each(|col| {\\n find_boundaries(\\n Orientation::vertical,\\n &mut ColumnIterator::new(&map, col),\\n map.len(),\\n col,\\n );\\n});\\n```\\n\\n#### Walking around the map\\n\\nOnce the 2nd part got introduced, you start to think about a way how not to\\ncopy-paste a lot of stuff (I haven\'t avoided it anyways\u2026). In this problem, I\'ve\\nchosen to introduce a trait (i.e. _interface_) for 2D and 3D walker.\\n\\n```rust\\ntrait Wrap: Clone {\\n type State;\\n\\n // simulation\\n fn is_blocked(&self) -> bool;\\n fn step(&mut self, steps: isize);\\n fn turn_left(&mut self);\\n fn turn_right(&mut self);\\n\\n // movement\\n fn next(&self) -> (Self::State, Direction);\\n\\n // final answer\\n fn answer(&self) -> Output;\\n}\\n```\\n\\nEach walker maintains its own state and also provides the functions that are\\nused during the simulation. The \u201cpromised\u201d methods are separated into:\\n\\n- _simulation_-related: that are used during the simulation from the `.fold()`\\n- _movement_-related: just a one method that holds most of the logic differences\\n between 2D and 3D\\n- _final answer_: which extracts the _proof of solution_ from the\\n implementation-specific walker\\n\\nBoth 2D and 3D versions borrow the original input and therefore you must\\nannotate the lifetime of it:\\n\\n```rust\\nstruct Wrap2D<\'a> {\\n input: &\'a Input,\\n position: Position,\\n direction: Direction,\\n}\\nimpl<\'a> Wrap2D<\'a> {\\n fn new(input: &\'a Input) -> Wrap2D<\'a> {\\n// \u2026\\n```\\n\\n#### Problems\\n\\nI have used a lot of closures for this problem and once I introduced a parameter\\nthat was of unknown type (apart from the fact it implements a specific trait), I\\ngot suggested a \u201cfix\u201d for the compilation error that resulted in something that\\nwas not possible to parse, cause it, more than likely, violated the grammar.\\n\\nIn a similar fashion, I have been suggested changes that led to a code that\\ndidn\'t make sense by just looking at it (there was no need to try the changes),\\nfor example one suggested change in the closure parameter caused disapperance of\\nthe parameter name. :smile:\\n\\n#### Clippy\\n\\nI have to admit that Clippy was rather helpful here, I\'ll include two examples\\nof rather smart suggestions.\\n\\nWhen writing the parsing for this problem, the first thing I have spotted on the\\n`char` was the `.is_digit()` function that takes a radix as a parameter. Clippy\\nnoticed that I use `radix = 10` and suggested switching to `.is_ascii_digit()`\\nthat does exactly the same thing:\\n\\n```diff\\n- .take_while(|c| c.is_digit(10))\\n+ .take_while(|c| c.is_ascii_digit())\\n```\\n\\nAnother useful suggestion appeared when working with the iterators and I wanted\\nto get the $n$-th element from it. You know the `.skip()`, you know the\\n`.next()`, just \u201cslap\u201d them together and we\'re done for :grin: Well, I got\\nsuggested to use `.nth()` that does exactly the combination of the two mentioned\\nmethods on iterators:\\n\\n```diff\\n- match it.clone().skip(skip).next().unwrap() {\\n+ match it.clone().nth(skip).unwrap() {\\n```\\n\\n## [Day 23: Unstable Diffusion](https://adventofcode.com/2022/day/23)\\n\\n:::info tl;dr\\n\\nSimulating movement of elves around with a set of specific rules.\\n\\n:::\\n\\n### Solution\\n\\nThere\'s not much to mention since it\'s just a cellular automaton simulation\\n(even though the AoC rules for cellular automatons usually get out of hand\\n:wink:).\\n\\nAlthough I had a need to determine boundaries of the elves\' positions and ended\\nup with a nasty DRY violation. Knowing that you you\'re looking for maximum and\\nminimum that are, of course, exactly the same except for initial values and\\ncomparators, it looks like a rather simple fix, but typing in Rust is something\\nelse, right? In the end I settled for a function that computes both boundaries\\nwithout any duplication while using a closure:\\n\\n```rust\\nfn get_bounds(positions: &Input) -> (Vector2D, Vector2D) {\\n let f = |init, cmp: &dyn Fn(isize, isize) -> isize| {\\n positions\\n .iter()\\n .fold(Vector2D::new(init, init), |acc, elf| {\\n Vector2D::new(cmp(acc.x(), elf.x()), cmp(acc.y(), elf.y()))\\n })\\n };\\n\\n (f(isize::MAX, &min::), f(isize::MIN, &max::))\\n}\\n```\\n\\nThis function returns a pair of 2D vectors that represent opposite points of the\\nbounding rectangle of all elves.\\n\\nYou might ask why would we need a closure and the answer is that `positions`\\ncannot be captured from within the nested function, only via closure. One more\\nfun fact on top of that is the type of the comparator\\n\\n```rust\\n&dyn Fn(isize, isize) -> isize\\n```\\n\\nOnce we remove the `dyn` keyword, compiler yells at us and also includes a way\\nhow to get a more thorough explanation of the error by running\\n\\n $ rustc --explain E0782\\n\\nwhich shows us\\n\\n Trait objects must include the `dyn` keyword.\\n\\n Erroneous code example:\\n\\n ```\\n trait Foo {}\\n fn test(arg: Box) {} // error!\\n ```\\n\\n Trait objects are a way to call methods on types that are not known until\\n runtime but conform to some trait.\\n\\n Trait objects should be formed with `Box`, but in the code above\\n `dyn` is left off.\\n\\n This makes it harder to see that `arg` is a trait object and not a\\n simply a heap allocated type called `Foo`.\\n\\n To fix this issue, add `dyn` before the trait name.\\n\\n ```\\n trait Foo {}\\n fn test(arg: Box) {} // ok!\\n ```\\n\\n This used to be allowed before edition 2021, but is now an error.\\n\\n:::danger Rant\\n\\nNot all of the explanations are helpful though, in some cases they might be even\\nmore confusing than helpful, since they address _very simple_ use cases.\\n\\nAs you can see, even in this case there are two sides to the explanations:\\n\\n- it explains why you need to use `dyn`, but\\n- it still mentions that trait objects need to be heap-allocated via `Box`\\n that, as you can see in my snippet, **does not** apply here :smile: IMO it\'s\\n caused by the fact that we are borrowing it and therefore we don\'t need to\\n care about the size or whereabouts of it.\\n\\n:::\\n\\n:::info C++ parallel\\n\\nIf you dive into the explanation above, you can notice that the `Box`\\npattern is very helpful for using types that are not known during compile-time.\\nYou would use a very similar approach in C++ when parsing some data structure\\nfrom input (let\'s say JSON for example).\\n\\nOn the other hand, in this case, it doesn\'t really make much sense, cause you\\ncan clearly see that the types **are known** during the compile-time, which in\\nC++ could be easily resolved by templating the helper function.\\n\\n:::\\n\\n## [Day 24: Blizzard Basin](https://adventofcode.com/2022/day/24)\\n\\n:::info tl;dr\\n\\nNavigating your way through a basin with series of blizzards that move around\\nyou as you move.\\n\\n:::\\n\\n:::caution\\n\\nIt\'s second to last day and I went \u201c_bonkers_\u201d on the Rust :smile: Proceed to\\nread _Solution_ part on your own risk.\\n\\n:::\\n\\n### Solution\\n\\nYou are given a map with blizzards all over the place and you\'re supposed to\\nfind the minimum time it requires you to walk through the basin without getting\\nin any of the blizzards.\\n\\n#### Breakdown\\n\\nRelatively simple, yet a bit annoying, approach can be taken. It\'s technically\\na shortest-path algorithm implementation with some relaxation restrictions and\\nbeing able to stay on one position for some time, so each _vertex_ of the graph\\nis determined by the position on the map and the _timestamp_. I have chosen to\\nuse `Vector3D`, since `x` and `y` attributes can be used for the position\\nand, well, let\'s use `z` for a timestamp, cause why not, right? :wink:\\n\\n#### Evaluating the blizzards\\n\\n:::caution\\n\\nI think that this is the most perverted abuse of the traits in the whole 4 weeks\\nof AoC in Rust\u2026\\n\\n:::\\n\\nThe blizzards move along their respective directions in time and loop around in\\ntheir respective row/column. Each vertex holds position **and** time, so we can\\n_just_ index the basin with the vertex itself, right? Yes, we can :smiling_imp:\\n\\n:::tip Fun fact\\n\\nWhile writing this part, I\'ve recognized unnecessary verbosity in the code and\\ncleaned it up a bit. The changed version is shown here and the original was just\\nmore verbose.\\n\\n:::\\n\\nI\'ll skip the boring parts of checking bounds and entry/exit of the basin :wink:\\nWe can easily calculate positions of the blizzards using a modular arithmetics:\\n\\n```rust\\nimpl Index for Basin {\\n type Output = char;\\n\\n fn index(&self, index: Position) -> &Self::Output {\\n // \u2039skipped boring parts\u203a\\n\\n // We need to account for the loops of the blizzards\\n let width = self.cols - 2;\\n let height = self.rows - 2;\\n\\n let blizzard_origin = |size, d, t, i| ((i - 1 + size + d * (t % size)) % size + 1) as usize;\\n [\\n (\\n index.y() as usize,\\n blizzard_origin(width, -1, index.z(), index.x()),\\n \'>\',\\n ),\\n (\\n index.y() as usize,\\n blizzard_origin(width, 1, index.z(), index.x()),\\n \'<\',\\n ),\\n (\\n blizzard_origin(height, -1, index.z(), index.y()),\\n index.x() as usize,\\n \'v\',\\n ),\\n (\\n blizzard_origin(height, 1, index.z(), index.y()),\\n index.x() as usize,\\n \'^\',\\n ),\\n ]\\n .iter()\\n .find_map(|&(y, x, direction)| {\\n if self.map[y][x] == direction {\\n Some(&self.map[y][x])\\n } else {\\n None\\n }\\n })\\n .unwrap_or(&\'.\')\\n }\\n}\\n```\\n\\nAs you can see, there is an expression for calculating the original position and\\nit\'s used multiple times, so why not take it out to a lambda, right? :wink:\\n\\nI couldn\'t get the `rustfmt` to format the `for`-loop nicely, so I\'ve just\\ndecided to go with iterating over an elements of a slice. I have used, once\\nagain, a combination of two functions (`find_map` in this case) to do 2 things\\nat once and at the end, if we haven\'t found any blizzard, we just return the\\nempty space.\\n\\nI think it\'s a very _nice_ (and naughty) way how to use the `Index` trait, don\'t\\nyou think?\\n\\n#### Shortest-path algorithm\\n\\nFor the shortest path you can choose and adjust any of the common shortest-path\\nalgorithms, in my case, I have decided to use [_A\\\\*_] instead of Dijkstra\'s\\nalgorithm, since it better reflects the _cost_ function.\\n\\n:::info Comparison of costs\\n\\nWith the Dijkstra\'s algorithm I would proceed with the `time` attribute used as\\na priority for the queue.\\n\\nWhereas with the _A\\\\*_, I have chosen to use both time and Manhattan distance\\nthat promotes vertices closer to the exit **and** with a minimum time taken.\\n\\n:::\\n\\nCost function is, of course, a closure :wink:\\n\\n```rust\\nlet cost = |p: Position| p.z() as usize + exit.y().abs_diff(p.y()) + exit.x().abs_diff(p.x());\\n```\\n\\nAnd also for checking the possible moves from the current vertex, I have\\nimplemented, yet another, closure that yields an iterator with the next moves:\\n\\n```rust\\nlet next_positions = |p| {\\n [(0, 0, 1), (0, -1, 1), (0, 1, 1), (-1, 0, 1), (1, 0, 1)]\\n .iter()\\n .filter_map(move |&(x, y, t)| {\\n let next_p = p + Vector3D::new(x, y, t);\\n\\n if basin[next_p] == \'.\' {\\n Some(next_p)\\n } else {\\n None\\n }\\n })\\n};\\n```\\n\\n#### Min-heap\\n\\nIn this case I had a need to use the priority queue taking the elements with the\\nlowest cost as the prioritized ones. Rust only offers you the [`BinaryHeap`] and\\nthat is a max-heap. One of the ways how to achieve a min-heap is to put the\\nelements in wrapped in a [`Reverse`] (as is even showed in the linked [docs of\\nthe `BinaryHeap`]). However the wrapping affects the type of the heap and also\\npopping the most prioritized elements yields values wrapped in the `Reverse`.\\n\\nFor this purpose I have just taken the max-heap and wrapped it as a whole in a\\nseparate structure providing just the desired methods:\\n\\n```rust\\nuse std::cmp::{Ord, Reverse};\\nuse std::collections::BinaryHeap;\\n\\npub struct MinHeap {\\n heap: BinaryHeap>,\\n}\\n\\nimpl MinHeap {\\n pub fn new() -> MinHeap {\\n MinHeap {\\n heap: BinaryHeap::new(),\\n }\\n }\\n\\n pub fn push(&mut self, item: T) {\\n self.heap.push(Reverse(item))\\n }\\n\\n pub fn pop(&mut self) -> Option {\\n self.heap.pop().map(|Reverse(x)| x)\\n }\\n}\\n\\nimpl Default for MinHeap {\\n fn default() -> Self {\\n Self::new()\\n }\\n}\\n```\\n\\nRest is just the algorithm implementation which is not that interesting.\\n\\n## [Day 25: Full of Hot Air](https://adventofcode.com/2022/day/25)\\n\\n:::info tl;dr\\n\\nPlaying around with a numbers in a _special_ base.\\n\\n:::\\n\\nGetting flashbacks to the _IB111 Foundations of Programming_\u2026 Very nice \u201cproblem\u201d\\nwith a rather easy solution, as the last day always seems to be.\\n\\n### Solution\\n\\nImplementing 2 functions, converting from the _SNAFU base_ and back to the _SNAFU_\\n_base_ representation. Let\'s do a bit more though! I have implemented two functions:\\n\\n- `from_snafu`\\n- `to_snafu`\\n\\nNow it is apparent that all I do is number to string and string to number. Hmm\u2026\\nthat sounds familiar, doesn\'t it? Let\'s introduce a structure for the SNAFU numbers\\nand implement the traits that we need.\\n\\nLet\'s start with a structure:\\n\\n```rust\\n#[derive(Debug, PartialEq, Eq, PartialOrd, Ord)]\\nstruct SNAFU {\\n value: i64,\\n}\\n```\\n\\n#### Converting from `&str`\\n\\nWe will start by implementing the `FromStr` trait that will help us parse our input.\\nThis is rather simple, I can just take the `from_snafu` function, copy-paste it\\ninto the `from_str` method and the number I get will be wrapped in `Result` and\\n`SNAFU` structure.\\n\\n#### Converting to `String`\\n\\nThis is more fun. In some cases you need to implement only one trait and others\\nare automatically implemented using that one trait. In our case, if you look in\\nthe documentation, you can see that `ToString` trait is automatically implemented\\nfor any type that implements `Display` trait.\\n\\nLet\'s implement the `Display` trait then. We should be able to use the `to_snafu`\\nfunction and just take the `self.value` from the `SNAFU` structure.\\n\\nAnd for the convenience of tests, we can also implement a rather simple `From`\\ntrait for the `SNAFU`.\\n\\n#### Adjusting the code\\n\\nAfter those changes we need to adjust the code and tests.\\n\\nParsing of the input is very easy, before we have used the lines, now we parse\\neverything:\\n\\n```diff\\n fn parse_input>(pathname: P) -> Input {\\n- file_to_lines(pathname)\\n+ file_to_structs(pathname)\\n }\\n```\\n\\nPart 1 needs to be adjusted a bit too:\\n\\n```diff\\n fn part_1(input: &Input) -> Output {\\n- to_snafu(input.iter().map(|s| from_snafu(s)).sum())\\n+ SNAFU::from(input.iter().map(|s| s.value).sum::()).to_string()\\n }\\n```\\n\\nYou can also see that it simplifies the meaning a bit and it is more explicit than\\nthe previous versions.\\n\\nAnd for the tests:\\n\\n```diff\\n #[test]\\n fn test_from() {\\n- for (n, s) in EXAMPLES.iter() {\\n- assert_eq!(from_snafu(s), *n);\\n+ for (&n, s) in EXAMPLES.iter() {\\n+ assert_eq!(s.parse::().unwrap().value, n);\\n }\\n }\\n\\n #[test]\\n fn test_to() {\\n- for (n, s) in EXAMPLES.iter() {\\n- assert_eq!(to_snafu(*n), s.to_string());\\n+ for (&n, s) in EXAMPLES.iter() {\\n+ assert_eq!(SNAFU::from(n).to_string(), s.to_string());\\n }\\n```\\n\\n## Summary\\n\\nLet\'s wrap the whole thing up! Keeping in mind both AoC and the Rust\u2026\\n\\n![Finished advent calendar :smile:](/img/blog/aoc-2022/04-week-4/calendar.png)\\n\\n### Advent of Code\\n\\nThis year was quite fun, even though most of the solutions and posts came in\\nlater on (_cough_ in \'23 _cough_). Day 22 was the most obnoxious one\u2026 And also\\nit feels like I used priority queues and tree data structures **a lot** :eyes:\\n\\n### with Rust\\n\\nI must admit that a lot of compiler warnings and errors were very useful. Even\\nthough I still found some instances where they didn\'t help at all or cause even\\nworse issues than I had. Compilation times have been addressed with the caching.\\n\\nBuilding my first tree data structure in Rust has been a very \u201cinteresting\u201d\\njourney. Being able to write a more generic BFS algorithm that allows you to not\\nduplicate code while still mantaining the desired functionality contributes to\\na very readable code.\\n\\nI am definitely much more aware of the basic things that bloated Python is\\nmissing, yet Rust has them\u2026\\n\\nUsing explicit types and writing down placeholder functions with `todo!()`\\nmacros is very pleasant, since it allows you to easily navigate the type system\\nduring the development when you don\'t even need to be sure how are you going to\\nput the smaller pieces together.\\n\\nI have used a plethora of traits and also implemented some of them to either be\\nidiomatic, or exploit the syntactic sugar they offer. Deriving the default trait\\nimplementation is also very helpful in a lot of cases, e.g. debugging output,\\ncopying, equality comparison, etc.\\n\\nI confess to touching more \u201ccursed\u201d parts of the Rust, such as macros to\\ndeclutter the copy-paste for tests or writing my own structures that need to\\ncarry a lifetime for their own fields.\\n\\ntl;dr Relatively pleasant language until you hit brick wall :wink:\\n\\n---\\n\\nSee you next year! Maybe in Rust, maybe not :upside_down_face:\\n\\n[_advent of code_]: https://adventofcode.com\\n[_a\\\\*_]: https://en.wikipedia.org/wiki/A*_search_algorithm\\n[`binaryheap`]: https://doc.rust-lang.org/std/collections/struct.BinaryHeap.html\\n[`reverse`]: https://doc.rust-lang.org/std/cmp/struct.Reverse.html\\n[docs of the `binaryheap`]: https://doc.rust-lang.org/std/collections/struct.BinaryHeap.html#min-heap"},{"id":"aoc-2022/3rd-week","metadata":{"permalink":"/blog/aoc-2022/3rd-week","editUrl":"https://github.com/mfocko/blog/tree/main/blog/aoc-2022/03-week-3.md","source":"@site/blog/aoc-2022/03-week-3.md","title":"3rd week of Advent of Code \'22 in Rust","description":"Surviving third week in Rust.","date":"2023-07-06T21:00:00.000Z","formattedDate":"July 6, 2023","tags":[{"label":"advent-of-code","permalink":"/blog/tags/advent-of-code"},{"label":"advent-of-code-2022","permalink":"/blog/tags/advent-of-code-2022"},{"label":"rust","permalink":"/blog/tags/rust"}],"readingTime":11.57,"hasTruncateMarker":true,"authors":[{"name":"Matej Focko","email":"me+blog@mfocko.xyz","title":"a.k.a. @mf","url":"https://gitlab.com/mfocko","imageURL":"https://github.com/mfocko.png","key":"mf"}],"frontMatter":{"title":"3rd week of Advent of Code \'22 in Rust","description":"Surviving third week in Rust.","date":"2023-07-06T21:00","slug":"aoc-2022/3rd-week","authors":"mf","tags":["advent-of-code","advent-of-code-2022","rust"],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"4th week of Advent of Code \'22 in Rust","permalink":"/blog/aoc-2022/4th-week"},"nextItem":{"title":"Sort the matrix diagonally","permalink":"/blog/leetcode/sort-diagonally"}},"content":"Let\'s go through the third week of [_Advent of Code_] in Rust.\\n\\n\x3c!--truncate--\x3e\\n\\n## [Day 15: Beacon Exclusion Zone](https://adventofcode.com/2022/day/15)\\n\\n:::info tl;dr\\n\\nTriangulating a distress beacon based on the information from the sensors.\\n\\n:::\\n\\n### Solution\\n\\nRelatively easy thing to implement, no major Rust issues hit.\\n\\n## [Day 16: Proboscidea Volcanium](https://adventofcode.com/2022/day/16)\\n\\n:::info tl;dr\\n\\nFinding a max flow in a graph given some time constraints.\\n\\n:::\\n\\n### Solution\\n\\nI have used some interesting things to implement this and make it easier for me.\\n\\n#### Indexing in graph\\n\\nI have come across a situation where I needed to keep more information regarding\\nthe graph\u2026 In that case you can, of course, create a structure and keep it in,\\nbut once you have multiple members in the structure it gets harder to work with\\nsince you need to address the fields in the structure. When you work with graph,\\nyou frequently need to access the vertices and in this case it felt a lot easier\\nto implement the indexing in a graph, rather than explicitly access the\\nunderlying data structure.\\n\\nHere you can see a rather short snippet from the solution that allows you to\\n\u201cindex\u201d the graph:\\n\\n```rust\\nimpl Index<&str> for Graph {\\n type Output = Vertex;\\n\\n fn index(&self, index: &str) -> &Self::Output {\\n &self.g[index]\\n }\\n}\\n```\\n\\n#### Cartesian product\\n\\nDuring the implementation I had to utilize Floyd-Warshall algorithm for finding\\nthe shortest path between pairs of vertices and utilized the `iproduct!` macro\\nfrom the [`itertools`]. It is a very useful higher-order function that allows\\nyou to keep the nesting of the loops at a minimum level while still maintaining\\nthe same functionality.\\n\\n#### \u201cImplementing\u201d an iterator\\n\\nFor the second part, you get to split the work between 2 actors. That way you\\ncan achieve higher efficiency of the whole process that you\'re planning, but it\\nalso makes it harder to evaluate algorithmically, since you need to check the\\ndifferent ways the work can be split.\\n\\nBeing affected by _functional programming brain damage_:tm:, I have chosen to\\ndo this part by function that returns an iterator over the possible ways:\\n\\n```rust\\nfn pairings(\\n valves: &BTreeSet,\\n) -> impl Iterator, BTreeSet)> + \'_ {\\n let mapping = valves.iter().collect_vec();\\n\\n let max_mask = 1 << (valves.len() - 1);\\n\\n (0..max_mask).map(move |mask| {\\n let mut elephant = BTreeSet::new();\\n let mut human = BTreeSet::new();\\n\\n for (i, &v) in mapping.iter().enumerate() {\\n if (mask & (1 << i)) == 0 {\\n human.insert(v.clone());\\n } else {\\n elephant.insert(v.clone());\\n }\\n }\\n\\n (human, elephant)\\n })\\n}\\n```\\n\\n## [Day 17: Pyroclastic Flow](https://adventofcode.com/2022/day/17)\\n\\n:::info tl;dr\\n\\nSimulating an autonomous Tetris where pieces get affected by a series of jets of\\nhot gas.\\n\\n:::\\n\\n### Solution\\n\\nSimilarly to the previous day I have created some iterators :smile:\\n\\n#### Collision detection\\n\\nOnce you need to check for collisions it is very helpful to be able to just\\niterate through the positions that can actually collide with the wall or other\\npiece.\\n\\nTo get the desired behaviour, you can just compose few smaller functions:\\n\\n```rust\\nfn occupied(shape: &[Vec]) -> impl Iterator + \'_ {\\n shape.iter().enumerate().flat_map(|(y, row)| {\\n row.iter().enumerate().filter_map(move |(x, c)| {\\n if c == &\'#\' {\\n Some(Vector2D::new(x as isize, y as isize))\\n } else {\\n None\\n }\\n })\\n })\\n}\\n```\\n\\nIn the end, we get relative positions which we can adjust later when given the\\nspecific positions from iterator. You can see some interesting parts in this:\\n\\n- `.enumerate()` allows us to get both the indices (coordinates) and the line\\n or, later on, the character itself,\\n- `.flat_map()` flattens the iterator, i.e. when we return another iterator,\\n they just get chained instead of iterating over iterators (which sounds pretty\\n disturbing, doesn\'t it?),\\n- and finally `.filter_map()` which is pretty similar to the \u201cbasic\u201d `.map()`\\n with a one, key, difference that it expects the items of an iterator to be\\n mapped to an `Option` from which it ignores nothing (as in `None` :wink:)\\n and also unwraps the values from `Some(\u2026)`.\\n\\n#### Infinite iterator\\n\\nIn the solution we cycle through both Tetris-like shapes that fall down and the\\njets that move our pieces around. Initially I have implemented my own infinite\\niterator that just yields the indices. It is a very simple, yet powerful, piece\\nof code:\\n\\n```rust\\nstruct InfiniteIndex {\\n size: usize,\\n i: usize,\\n}\\n\\nimpl InfiniteIndex {\\n fn new(size: usize) -> InfiniteIndex {\\n InfiniteIndex { size, i: size - 1 }\\n }\\n}\\n\\nimpl Iterator for InfiniteIndex {\\n type Item = usize;\\n\\n fn next(&mut self) -> Option {\\n self.i = (self.i + 1) % self.size;\\n Some(self.i)\\n }\\n}\\n```\\n\\nHowever when I\'m looking at the code now, it doesn\'t really make much sense\u2026\\nGuess what, we can use a built-in function that is implemented on iterators for\\nthat! The function is called `.cycle()`\\n\\nOn the other hand, I am not going to switch to that function, since it would\\nintroduce an another myriad of issues caused by the fact that I create iterators\\nright away in the constructor of my structure and the iterators would borrow\\nboth the jets and shapes which would introduce a lifetime dependency into the\\nstructure.\\n\\n## [Day 18: Boiling Boulders](https://adventofcode.com/2022/day/18)\\n\\n:::info tl;dr\\n\\nLet\'s compute a surface area of some obsidian approximated via coordinates of\\ncubes.\\n\\n:::\\n\\n### Solution\\n\\nThis day is kinda interesting, because it shows how easily you can complicate the\\nproblem and also how much can you screw yourself over with the optimization and\\n\u201csmart\u201d approach.\\n\\nFor the first part you need to find the surface area of an obsidian that is\\napproximated by cubes. Now, that is a very easy thing to do, just keep the track\\nof already added cubes, and check if the newly added cube touches any face of any\\nother cube. Simple, and with a `BTreeSet` relatively efficient way to do it.\\n\\nHowever the second part lets you on a secret that there may be some surface area\\nfrom the \u201cinside\u201d too and you want to know only the one from the outside of the\\nobsidian. I have seen some solutions later, but if you check your data, you might\\nnotice that the bounding box of all the cubes isn\'t that big at all. Therefore I\\nchose to pre-construct the box beforehand, fill in the cubes and then just run a\\nBFS turning all the lava on the outside into the air. Now you just need to check\\ncubes and count how many of their faces touch the air.\\n\\n## [Day 19: Not Enough Minerals](https://adventofcode.com/2022/day/19)\\n\\n:::info tl;dr\\n\\nFinding out the best strategy for building robots to collect geodes.\\n\\n:::\\n\\n### Solution\\n\\nNot much interesting stuff to mention apart from the suggestion to never believe\\nthat the default implementation given by `derive` macro is what you want, it\\ndoesn\'t have to be. :smile:\\n\\n## [Day 20: Grove Positioning System](https://adventofcode.com/2022/day/20)\\n\\n:::info tl;dr\\n\\nShuffling around the _circular linked list_ to find the coordinates.\\n\\n:::\\n\\nNow, small rant for this day is in place. They\'ve never mentioned that coordinates\\ncan repeat and therefore the values are non-unique. This is something that did\\nnot happen in the given sample, but was present in the user input. It took \xbba lot\xab\\nto realize that this is the issue.\\n\\n### Solution\\n\\nI have tried implementing a circular linked list for this\u2026 and I have failed\\nmiserably. To be fair, I still have no clue why. It was \u201cfun\u201d to play around with\\nthe `Rc>`. In the end I failed on _wrong answer_. I have also encountered\\na rather interesting issue with `.borrow_mut()` method being used on `Rc>`.\\n\\n#### `.borrow_mut()`\\n\\nConsider the following snippet of the code (taken from the documentation):\\n\\n```rust\\nuse std::cell::{RefCell, RefMut};\\nuse std::collections::HashMap;\\nuse std::rc::Rc;\\n// use std::borrow::BorrowMut;\\n\\nfn main() {\\n let shared_map: Rc> = Rc::new(RefCell::new(HashMap::new()));\\n // Create a new block to limit the scope of the dynamic borrow\\n {\\n let mut map: RefMut<_> = shared_map.borrow_mut();\\n map.insert(\\"africa\\", 92388);\\n map.insert(\\"kyoto\\", 11837);\\n map.insert(\\"piccadilly\\", 11826);\\n map.insert(\\"marbles\\", 38);\\n }\\n\\n // Note that if we had not let the previous borrow of the cache fall out\\n // of scope then the subsequent borrow would cause a dynamic thread panic.\\n // This is the major hazard of using `RefCell`.\\n let total: i32 = shared_map.borrow().values().sum();\\n println!(\\"{total}\\");\\n}\\n```\\n\\nWe allocate a hash map on the heap and then in the inner block, we borrow it as\\na mutable reference, so that we can use it.\\n\\n:::note\\n\\nIt is a very primitive example for `Rc>` and mutable borrow.\\n\\n:::\\n\\nIf you uncomment the 4th line with `use std::borrow::BorrowMut;`, you cannot\\ncompile the code anymore, because of\\n\\n```\\n Compiling playground v0.0.1 (/playground)\\nerror[E0308]: mismatched types\\n --\x3e src/main.rs:10:34\\n |\\n10 | let mut map: RefMut<_> = shared_map.borrow_mut();\\n | --------- ^^^^^^^^^^^^^^^^^^^^^^^ expected struct `RefMut`, found mutable reference\\n | |\\n | expected due to this\\n |\\n = note: expected struct `RefMut<\'_, _>`\\n found mutable reference `&mut Rc>>`\\n\\nerror[E0599]: no method named `insert` found for struct `RefMut<\'_, _>` in the current scope\\n --\x3e src/main.rs:11:13\\n |\\n11 | map.insert(\\"africa\\", 92388);\\n | ^^^^^^ method not found in `RefMut<\'_, _>`\\n\\nerror[E0599]: no method named `insert` found for struct `RefMut<\'_, _>` in the current scope\\n --\x3e src/main.rs:12:13\\n |\\n12 | map.insert(\\"kyoto\\", 11837);\\n | ^^^^^^ method not found in `RefMut<\'_, _>`\\n\\nerror[E0599]: no method named `insert` found for struct `RefMut<\'_, _>` in the current scope\\n --\x3e src/main.rs:13:13\\n |\\n13 | map.insert(\\"piccadilly\\", 11826);\\n | ^^^^^^ method not found in `RefMut<\'_, _>`\\n\\nerror[E0599]: no method named `insert` found for struct `RefMut<\'_, _>` in the current scope\\n --\x3e src/main.rs:14:13\\n |\\n14 | map.insert(\\"marbles\\", 38);\\n | ^^^^^^ method not found in `RefMut<\'_, _>`\\n\\nSome errors have detailed explanations: E0308, E0599.\\nFor more information about an error, try `rustc --explain E0308`.\\nerror: could not compile `playground` due to 5 previous errors\\n```\\n\\nIt might seem **a bit** ridiculous. However, I got to a point where the compiler\\nsuggested `use std::borrow::BorrowMut;` and it resulted in breaking parts of the\\ncode that worked previously. I think it may be a good idea to go over what is\\nhappening here.\\n\\n##### `.borrow_mut()` on `Rc>`\\n\\nLet\'s consider a variable `x` of type `Rc>`. What happens when you\\ncall `.borrow_mut()` on it? We can look at the `Rc` type, and\u2026 hang on! There is\\nneither `.borrow_mut()` method or `BorrowMut` trait implemented. How can we do it\\nthen?\\n\\nLet\'s go further and we can see that `RefCell` implements a `.borrow_mut()`\\nmethod. OK, but how can we call it on the `Rc`? Easily! `Rc` implements\\n`Deref` and therefore you can call methods on `Rc` objects as if they were\\n`T` objects. If we read on _`Deref` coercion_, we can see the following:\\n\\n> If `T` implements `Deref`, \u2026:\\n>\\n> - \u2026\\n> - `T` implicitly implements all the (immutable) methods of the type `U`.\\n\\nWhat is the requirement for the `.borrow_mut()` on `RefCell`? Well, it needs\\n`&self`, so the `Deref` implements the `.borrow_mut()` for the `Rc>`.\\n\\n##### `BorrowMut` trait\\n\\nI have not been able to find a lot on this trait. My guess is that it provides a\\nmethod instead of a syntactic sugar (`&mut x`) for the mutable borrow. And also\\nit provides default implementations for the types:\\n\\n```rust\\nimpl BorrowMut for String\\n\\nimpl BorrowMut for &mut T\\nwhere\\n T: ?Sized,\\n\\nimpl BorrowMut for T\\nwhere\\n T: ?Sized,\\n\\nimpl BorrowMut<[T]> for Vec\\nwhere\\n A: Allocator,\\n\\nimpl BorrowMut for Box\\nwhere\\n A: Allocator,\\n T: ?Sized,\\n\\nimpl BorrowMut<[T]> for [T; N]\\n```\\n\\n##### Conflict\\n\\nNow the question is why did it break the code\u2026 My first take was that the type\\n`Rc>` has some _specialized_ implementation of the `.borrow_mut()` and\\nthe `use` overrides it with the default, which is true **in a sense**. However\\nthere is no _specialized_ implementation. Let\'s have a look at the trait and the\\ntype signature on the `RefCell`:\\n\\n```rust\\n// trait\\npub trait BorrowMut: Borrow\\nwhere\\n Borrowed: ?Sized,\\n{\\n fn borrow_mut(&mut self) -> &mut Borrowed;\\n}\\n\\n// \u2039RefCell.borrow_mut()\u203a type signature\\npub fn borrow_mut(&self) -> RefMut<\'_, T>\\n```\\n\\nI think that we can definitely agree on the fact that `RefMut<\'_, T>` is not the\\n`RefCell`.\\n\\n**In my opinion**, `RefCell` implements a **separate** `.borrow_mut()` rather\\nthan implementing the interface, because it **cannot** satisfy the type requirements\\nof the trait.\\n\\n:::caution\\n\\nI wonder how are we expected to deal with this conflict, if and when, we need\\nboth the `.borrow_mut()` of the trait and `.borrow_mut()` of the `RefCell`.\\n\\n:::\\n\\n:::tip Fun fact\\n\\nI was suggested by the compiler to do `use std::borrow::BorrowMut;` and break the\\ncode.\\n\\nSo much for the _almighty_ and _helpful_ compiler\u2026\\n\\n:::\\n\\n## [Day 21: Monkey Math](https://adventofcode.com/2022/day/21)\\n\\n:::info tl;dr\\n\\nComputing an expression tree and then also finding ideal value for a node.\\n\\n:::\\n\\n### Solution\\n\\nRelatively simple, until you get to the 2nd part where you start to practice\\na lot of the copy-paste. I have managed to sneak some perverted stuff in there\\nthough :) Let\'s go through the details.\\n\\n#### `Default` trait\\n\\nFor the first time and twice I had a need to have a default value for my types,\\nenumerations in this case. Rust offers a very nice trait[^1] that is described\\nas:\\n\\n> A trait for giving a type a useful default value.\\n\\nI guess it sums it up nicely. The more interesting part about this is the fact\\nthat you can use the _macro machinery_ to save yourself some typing. If you have\\nenumeration of which the default value doesn\'t bear any parameter, you can just\\ndo[^2]:\\n\\n```rust\\n#[derive(Default)]\\nenum Color {\\n #[default]\\n White,\\n Gray,\\n Black,\\n}\\n```\\n\\n#### Abusing negation\\n\\nIf you want to use a _unary minus_ operator on your own type, you can implement\\na `Neg` trait[^3]. I was dealing with a binary tree and needed a way how to look\\nat the other side, so I have just implemented the negation for flipping between\\nleft and right :smile:\\n\\n[^1]: [`Default`](https://doc.rust-lang.org/std/default/trait.Default.html) docs\\n[^2]: Pardon my example from the graph algorithms ;)\\n[^3]: [`Neg`](https://doc.rust-lang.org/std/ops/trait.Neg.html) docs\\n\\n[_advent of code_]: https://adventofcode.com\\n[`itertools`]: https://crates.io/crates/itertools\\n[this reddit post and the comment]: https://www.reddit.com/r/adventofcode/comments/zb98pn/comment/iyq0ono"},{"id":"leetcode/sort-diagonally","metadata":{"permalink":"/blog/leetcode/sort-diagonally","editUrl":"https://github.com/mfocko/blog/tree/main/blog/leetcode/sort-matrix-diagonally.md","source":"@site/blog/leetcode/sort-matrix-diagonally.md","title":"Sort the matrix diagonally","description":"Compiler assisted development.","date":"2023-03-04T23:15:00.000Z","formattedDate":"March 4, 2023","tags":[{"label":"cpp","permalink":"/blog/tags/cpp"},{"label":"leetcode","permalink":"/blog/tags/leetcode"},{"label":"iterators","permalink":"/blog/tags/iterators"}],"readingTime":16.99,"hasTruncateMarker":true,"authors":[{"name":"Matej Focko","email":"me+blog@mfocko.xyz","title":"a.k.a. @mf","url":"https://gitlab.com/mfocko","imageURL":"https://github.com/mfocko.png","key":"mf"}],"frontMatter":{"title":"Sort the matrix diagonally","description":"Compiler assisted development.","date":"2023-03-04T23:15","slug":"leetcode/sort-diagonally","authors":"mf","tags":["cpp","leetcode","iterators"],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"3rd week of Advent of Code \'22 in Rust","permalink":"/blog/aoc-2022/3rd-week"},"nextItem":{"title":"2nd week of Advent of Code \'22 in Rust","permalink":"/blog/aoc-2022/2nd-week"}},"content":"Let\'s try to solve one of the LeetCode challenges in easy and hard mode at the\\nsame time.\\n\\n\x3c!--truncate--\x3e\\n\\n- Link to the problem: https://leetcode.com/problems/sort-the-matrix-diagonally/\\n\\n## Problem description\\n\\nA **matrix diagonal** is a diagonal line of cells starting from some cell in\\neither the topmost row or leftmost column and going in the bottom-right direction\\nuntil reaching the matrix\'s end. For example, the **matrix diagonal** starting\\nfrom `mat[2][0]`, where `mat` is a `6 x 3` matrix, includes cells `mat[2][0]`,\\n`mat[3][1]`, and `mat[4][2]`.\\n\\nGiven an `m x n` matrix `mat` of integers, sort each matrix diagonal in ascending\\norder and return the resulting matrix.\\n\\n### Example\\n\\n![Image describing the problem](https://assets.leetcode.com/uploads/2020/01/21/1482_example_1_2.png)\\n\\n## Skeleton and initial adjustments\\n\\nWe are given the following skeleton for the C++ and the given challenge:\\n\\n```cpp\\nclass Solution {\\npublic:\\n vector> diagonalSort(vector>& mat) {\\n\\n }\\n};\\n```\\n\\nThe task is to sort the passed matrix diagonally and then return it. First of all,\\nI don\'t like to solve this in a web browser, so we\'ll need to adjust it accordingly\\nfor running it locally. We\'ll start by including the `vector` header and using\\nfully-qualified namespaces[^1] and also adding few tests:\\n\\n```cpp\\n#include \\n#include \\n\\nusing matrix = std::vector>;\\n\\nclass Solution {\\npublic:\\n matrix diagonalSort(matrix& mat)\\n {\\n }\\n};\\n\\nstatic void test_case_1()\\n{\\n // Input: mat = [[3,3,1,1],[2,2,1,2],[1,1,1,2]]\\n // Output: [[1,1,1,1],[1,2,2,2],[1,2,3,3]]\\n\\n Solution s;\\n assert((s.diagonalSort(std::vector { std::vector { 3, 3, 1, 1 },\\n std::vector { 2, 2, 1, 2 },\\n std::vector { 1, 1, 1, 2 } })\\n == std::vector { std::vector { 1, 1, 1, 1 },\\n std::vector { 1, 2, 2, 2 },\\n std::vector { 1, 2, 3, 3 } }));\\n}\\n\\nstatic void test_case_2()\\n{\\n // Input: mat =\\n // [[11,25,66,1,69,7],[23,55,17,45,15,52],[75,31,36,44,58,8],[22,27,33,25,68,4],[84,28,14,11,5,50]]\\n // Output:\\n // [[5,17,4,1,52,7],[11,11,25,45,8,69],[14,23,25,44,58,15],[22,27,31,36,50,66],[84,28,75,33,55,68]]\\n\\n Solution s;\\n assert((s.diagonalSort(std::vector { std::vector { 11, 25, 66, 1, 69, 7 },\\n std::vector { 23, 55, 17, 45, 15, 52 },\\n std::vector { 75, 31, 36, 44, 58, 8 },\\n std::vector { 22, 27, 33, 25, 68, 4 },\\n std::vector { 84, 28, 14, 11, 5, 50 } })\\n == std::vector { std::vector { 5, 17, 4, 1, 52, 7 },\\n std::vector { 11, 11, 25, 45, 8, 69 },\\n std::vector { 14, 23, 25, 44, 58, 15 },\\n std::vector { 22, 27, 31, 36, 50, 66 },\\n std::vector { 84, 28, 75, 33, 55, 68 } }));\\n}\\n\\nint main()\\n{\\n test_case_1();\\n test_case_2();\\n\\n return 0;\\n}\\n```\\n\\nWe need to return the matrix, but we\'re given a reference to the input matrix. We\\ncan easily abuse the C++ here and just switch the reference to value, this way\\nthe matrix will be copied when passed to the function, we can sort the copy and\\njust return it back. And we also get yelled by the compiler for the fact that the\\nmethod doesn\'t return anything yet, so to make it \u201cshut up\u201d we will just return\\nthe input for now:\\n\\n```diff\\n- matrix diagonalSort(matrix& mat)\\n+ matrix diagonalSort(matrix mat)\\n {\\n+ return mat;\\n }\\n```\\n\\nNow, we get the copy and we\'re good to go.\\n\\n## Na\xefve solution\\n\\nAs you may know, C++ offers a plethora of functions that can be used to your\\nadvantage, given that you know how to \u201cbend\u201d the data structures accordingly.\\n\\nWhat does that mean for us? Well, we have an `std::sort`, we can use it, right?\\nLet\'s have a look at it:\\n\\n```cpp\\ntemplate< class RandomIt >\\nvoid sort( RandomIt first, RandomIt last );\\n```\\n\\nThis overload is more than we need. What does it do? It just sorts the elements\\nin the range `[first, last)` using `operator<` on them. We can\'t sort the whole\\nmatrix using this, but\u2026 we can sort just \xbbone\xab diagonal without doing much work\\non our end.\\n\\nWhat is the `RandomIt` type though? If we look more into the documentation, we\\ncan easily find the requirements for it and also learn that it\'s a _random access_\\n_iterator_ and allows swapping its values at the same time.\\n\\n:::tip Random access iterator\\n\\nWhat is the _random access iterator_ though? We can find it in a documentation\\nand see the following description:\\n\\n> A **LegacyRandomAccessIterator** is a [LegacyBidirectionalIterator](https://en.cppreference.com/w/cpp/named_req/BidirectionalIterator)\\n> that can be moved to point to any element in constant time.\\n\\nAfter that we can see all the requirements for it being listed. I don\'t feel like\\nreading them right now, so we will just use it and see where the compilation blows\\nup, i.e. \u201c_compiler-assisted development_\u201d[^2] if you will ;)\\n\\n:::\\n\\nNow we know that we can use `std::sort` to sort the diagonal itself, but we also\\nneed to get the diagonals somehow. I\'m rather lazy, so I\'ll just delegate it to\\nsomeone else[^3]. And that way we get\\n\\n```cpp\\nmatrix diagonalSort(matrix mat)\\n{\\n // we iterate over the diagonals\\n for (auto d : diagonals(mat)) {\\n // and we sort each diagonal\\n std::sort(d.begin(), d.end());\\n }\\n\\n // we take the matrix by copy, so we can sort in-situ and return the copy\\n // that we sorted\\n return mat;\\n}\\n```\\n\\nThis solution looks very simple, doesn\'t it? Well, cause it is.\\nLet\'s try compiling it:\\n\\n```\\nmatrix-sort.cpp:11:23: error: use of undeclared identifier \'diagonals\' [clang-diagnostic-error]\\n for (auto d : diagonals(mat)) {\\n ^\\nFound compiler error(s).\\nmake: *** [makefile:14: tidy] Error 1\\n```\\n\\nOK, seems about right. We haven\'t implemented the `diagonals` yet. And based on\\nwhat we\'ve written so far, we need a function or a class `diagonals` that will\\ngive us the diagonals we need.\\n\\n## Implementing the `diagonals`\\n\\nCool, so we need the function that will let us go through each and every diagonal\\nin our matrix. We use the _for-range_ loop, so whatever we get back from the\\n`diagonals` must support `.begin()` and `.end()`. Since I am a masochist, we will\\ndo such functionality for a matrix of any type, not just the `int` from the challenge.\\n\\nAs I said, we need to be able to\\n\\n- construct the object\\n- get the beginning\\n- get the end (the \u201csentinel\u201d)\\n\\n```cpp\\ntemplate \\nclass diagonals {\\n using matrix_t = std::vector>;\\n\\n matrix_t& _matrix;\\n\\npublic:\\n diagonals(matrix_t& m)\\n : _matrix(m)\\n {\\n }\\n diagonals_iter begin()\\n {\\n /* TODO */\\n }\\n diagonals_iter end()\\n {\\n /* TODO */\\n }\\n};\\n```\\n\\nNow we have a `diagonals` that we can use to go through the diagonals. We haven\'t\\nimplemented the core of it yet. Let\'s go through what we have for now.\\n\\nWe have a templated class with templated `T` that is used as a placeholder for any\\ntype we would store in the matrix. Because I\'m lazy, I have defined the `matrix_t`\\ntype that is a \u201cshortcut\u201d for `std::vector>`, so I don\'t have to\\ntype it out all the time. Of course, we need to store the matrix, we are given,\\nas a private attribute. And then just have the constructor and the 2 methods we\\nneed for the _for-range_.\\n\\n### Iterating over diagonals\\n\\nNow that we have an object that will allow us to iterate through the diagonals,\\nwe need to implement the iterating itself. We need to go through all of them, so\\nwe have multiple options how to do so. I have decided to start from the \u201cmain\u201d\\ndiagonal that starts at `(0, 0)` index and then proceed with the diagonals starting\\nin the first row, followed by the rest of the diagonals in the first column.\\n\\nWe need to be able to tell that we\'ve iterated through all of them, and also we\\nneed to know which diagonal is next. For that purpose we will pass the indices\\nof the first cell on the diagonal. That way we can always tell how to move forward.\\n\\nWe will start by updating the `begin` and `end` to reflect our choice accordingly.\\n\\n```cpp\\ndiagonals_iter begin() { return diagonals_iter { _matrix, 0, 0 }; }\\ndiagonals_iter end() { return diagonals_iter { _matrix, 0, _matrix.size() }; }\\n```\\n\\nFor the `begin` we return the first diagonal that starts at `(0, 0)`. And because\\nwe have decided to do the diagonals in the first column at the end, the first\\ndiagonal that is not a valid one is the one at `(0, height)`. Apart from the\\nindices, we also need to pass reference to the matrix itself.\\n\\n:::note\\n\\nYou may have noticed that we also include the diagonals that have length 1,\\nspecifically the ones at `(0, height - 1)` and `(width - 1, 0)`. We are implementing\\nan iterator that **should not** care about the way it\'s being used. Therefore, we\\ndon\'t care about the fact they don\'t need to be sorted.\\n\\n:::\\n\\nCool, let\'s leave the iterator itself to someone else, right?[^4]\\n\\n### Implementing the iterator over diagonals\\n\\nWe can start with a simple skeleton based on the information that we pass from\\nthe `diagonals`. Also to utilize the `matrix_t` and also contain implementation\\ndetails hidden away, we will put this code into the `diagonals` class.\\n\\n```cpp\\nclass diagonals_iter {\\n matrix_t& m;\\n std::size_t x;\\n std::size_t y;\\n\\npublic:\\n diagonals_iter(matrix_t& matrix, std::size_t x, std::size_t y)\\n : m(matrix)\\n , x(x)\\n , y(y)\\n {\\n }\\n};\\n```\\n\\nIn this case we will be implementing a \u201csimple\u201d forward iterator, so we don\'t\\nneed to implement a lot. Notably it will be:\\n\\n- inequality operator (we need to know when we reach the end and have nothing to\\n iterate over)\\n- preincrementation operator (we need to be able to move around the iterable)\\n- dereference operator (we need to be able to retrieve the objects we iterate\\n over)\\n\\n```cpp\\nclass diagonals_iter {\\n matrix_t& m;\\n std::size_t x;\\n std::size_t y;\\n\\npublic:\\n diagonals_iter(matrix_t& matrix, std::size_t x, std::size_t y)\\n : m(matrix)\\n , x(x)\\n , y(y)\\n {\\n }\\n\\n bool operator!=(const diagonals_iter& rhs) const\\n {\\n // iterators are not equal if they reference different matrices, or\\n // their positions differ\\n return m != rhs.m || x != rhs.x || y != rhs.y;\\n }\\n\\n diagonals_iter& operator++()\\n {\\n if (y != 0) {\\n // iterating through diagonals down the first column\\n y++;\\n return *this;\\n }\\n\\n // iterating the diagonals along the first row\\n x++;\\n if (x == m.front().size()) {\\n // switching to diagonals in the first column\\n x = 0;\\n y++;\\n }\\n\\n return *this;\\n }\\n\\n diagonal operator*() const { return diagonal { m, x, y }; }\\n};\\n```\\n\\nLet\'s go one-by-one. Inequality operator is rather simple, just compare iterator\'s\\nattributes field-by-field. If you think about it, checking inequality of two 2D\\nvectors may be a bit inefficient, therefore, we can swap around and check it as\\na last thing.\\n\\n```diff\\n- return m != rhs.m || x != rhs.x || y != rhs.y;\\n+ return x != rhs.x || y != rhs.y || m != rhs.m;\\n```\\n\\nPreincrementation is where the magic happens. If you have a better look, you can\\nsee two branches of this operation:\\n\\n1. When `y != 0` (we\'re iterating over the diagonals in the first column)\\n In this case, we just bump the row and we\'re done.\\n2. When `y == 0` (we\'re iterating over the diagonals in the first row)\\n In this case, we bump the column and check if we haven\'t gotten out of bounds,\\n i.e. the end of the first row. If we get out of the bounds, we\'re continuing\\n with the second diagonal in the first column.\\n\\nDereferencing the iterator must \u201cyield\u201d something. In our case it will be the\\ndiagonal that we want to sort. For sorting we need just the iterators that can\\nmove around said diagonal. The simplest thing, we can do, is to delegate it to\\nsomething else. In our case it will be a class called `diagonal`.\\n\\n## Implementing the `diagonal` itself\\n\\nAfter implementing the iterator over diagonals, we know that all we need to describe\\na diagonal is the matrix itself and the \u201cstart\u201d of the diagonal (row and column).\\nAnd we also know that the diagonal must provide some iterators for the `std::sort`\\nfunction. We can start with the following skeleton:\\n\\n```cpp\\ntemplate \\nclass diagonal {\\n using matrix_t = std::vector>;\\n\\n matrix_t& matrix;\\n std::size_t x;\\n std::size_t y;\\n\\npublic:\\n diagonal(matrix_t& matrix, std::size_t x, std::size_t y)\\n : matrix(matrix)\\n , x(x)\\n , y(y)\\n {\\n }\\n\\n diagonal_iter begin() const { return diagonal_iter { matrix, x, y }; }\\n\\n diagonal_iter end() const\\n {\\n auto max_x = matrix[y].size();\\n auto max_y = matrix.size();\\n\\n // we need to find the distance in which we get out of bounds (either in\\n // column or row)\\n auto steps = std::min(max_x - x, max_y - y);\\n\\n return diagonal_iter { matrix, x + steps, y + steps };\\n }\\n};\\n```\\n\\nInitialization is rather simple, we just \u201ckeep\u201d the stuff we get, `begin` is the\\nsimplest, we just delegate.\\n\\nIn case of the `end`, it gets more complicated. We need to know where is the \u201cend\u201d\\nof the diagonal. Since `end` should point to the first element \u201cafter\u201d the iterable,\\nwe know that it\'s the first position of the iterator where either `y` becomes\\n`matrix.size()` or `x` becomes `matrix[y].size()`. Also we are moving along diagonal,\\nduh, therefore we can deduce the first \u201cposition\u201d afterwards by minimal amount of\\nsteps to get out of the any column or row, hence `std::min(max_x - x, max_y - y)`.\\nFinal position is then computed simply by adding the steps to the beginning of\\nthe diagonal.\\n\\nNow we just need to finish the iterator for the diagonal itself and we\'re done.\\n\\n### Implementing `diagonal_iter`\\n\\nThis part is the hardest from all we need to do. It\'s because of the requirements\\nof the `std::sort` that requires us to implement a _random access iterator_. I have\\nbriefly described it above, and \u201cin a nutshell\u201d it means that we need to implement\\nan iterator that can move in constant time along the diagonal in any amount of\\nsteps.\\n\\nLet\'s go through all of the functionality that our iterator needs to support to\\nbe used in `std::sort`. We need the usual operations like:\\n\\n- equality/inequality\\n- incrementation\\n- dereferencing\\n\\nWe will also add all the types that our iterator uses with the category of the\\niterator, i.e. what interface it supports:\\n\\n```cpp\\nclass diagonal_iter {\\n // we need to keep reference to the matrix itself\\n matrix_t& m;\\n\\n // we need to be able to tell our current position\\n std::size_t x;\\n std::size_t y;\\n\\npublic:\\n using difference_type = std::ptrdiff_t;\\n using value_type = T;\\n using pointer = T*;\\n using reference = T&;\\n using iterator_category = std::random_access_iterator_tag;\\n\\n diagonal_iter(matrix_t& matrix,\\n std::size_t x,\\n std::size_t y)\\n : m(matrix)\\n , x(x)\\n , y(y)\\n {\\n }\\n\\n bool operator==(const diagonal_iter& rhs) const\\n {\\n return x == rhs.x && y == rhs.y && m == rhs.m;\\n }\\n\\n diagonal_iter& operator++()\\n {\\n // we are moving along the diagonal, so we increment both \u2039x\u203a and \u2039y\u203a at\\n // the same time\\n x++;\\n y++;\\n return *this;\\n }\\n\\n reference operator*() const { return m[y][x]; }\\n};\\n```\\n\\nThis is pretty similar to the previous iterator, but now we need to implement the\\nremaining requirements of the _random access iterator_. Let\'s see what those are:\\n\\n- decrementation - cause we need to be able to move backwards too, since _random _\\n _access iterator_ extends the interface of _bidirectional iterator_\\n- moving the iterator in either direction by steps given as an integer\\n- being able to tell the distance between two iterators\\n- define an ordering on the iterators\\n\\nLet\'s fill them in:\\n\\n```cpp\\nclass diagonal_iter {\\n // we need to keep reference to the matrix itself\\n matrix_t& m;\\n\\n // we need to be able to tell our current position\\n std::size_t x;\\n std::size_t y;\\n\\npublic:\\n using difference_type = std::ptrdiff_t;\\n using value_type = T;\\n using pointer = T*;\\n using reference = T&;\\n using iterator_category = std::random_access_iterator_tag;\\n\\n diagonal_iter(matrix_t& matrix,\\n std::size_t x,\\n std::size_t y)\\n : m(matrix)\\n , x(x)\\n , y(y)\\n {\\n }\\n\\n bool operator==(const diagonal_iter& rhs) const\\n {\\n return x == rhs.x && y == rhs.y && m == rhs.m;\\n }\\n\\n diagonal_iter& operator++()\\n {\\n // we are moving along the diagonal, so we increment both \u2039x\u203a and \u2039y\u203a at\\n // the same time\\n x++;\\n y++;\\n return *this;\\n }\\n\\n reference operator*() const { return m[y][x]; }\\n\\n // exactly opposite to the incrementation\\n diagonal_iter operator--()\\n {\\n x--;\\n y--;\\n return *this;\\n }\\n\\n // moving \u2039n\u203a steps back is same as calling decrementation \u2039n\u203a-times, so we\\n // can just return a new iterator and subtract \u2039n\u203a from both coordinates in\\n // the matrix\\n diagonal_iter operator-(difference_type n) const\\n {\\n return diagonal_iter { m, x - n, y - n };\\n }\\n\\n // here we assume that we are given two iterators on the same diagonal\\n difference_type operator-(const diagonal_iter& rhs) const\\n {\\n assert(m == rhs.m);\\n return x - rhs.x;\\n }\\n\\n // counterpart of moving \u2039n\u203a steps backwards\\n diagonal_iter operator+(difference_type n) const\\n {\\n return diagonal_iter { m, x + n, y + n };\\n }\\n\\n // we compare the coordinates, and also assume that those 2 iterators are\\n // lying on the same diagonal\\n bool operator<(const diagonal_iter& rhs) const\\n {\\n assert(m == rhs.m);\\n return x < rhs.x && y < rhs.y;\\n }\\n};\\n```\\n\\nAt this point we could probably try and compile it, right? If we do so, we will\\nget yelled at by a compiler for the following reasons:\\n\\n```\\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1792:11: error: object of type \'diagonal::diagonal_iter\' cannot be assigned because its copy assignment operator is implicitly deleted [clang-diagnostic-error]\\n __last = __next;\\n ^\\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1817:11: note: in instantiation of function template specialization \'std::__unguarded_linear_insert::diagonal_iter, __gnu_cxx::__ops::_Val_less_iter>\' requested here\\n std::__unguarded_linear_insert(__i,\\n ^\\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1849:9: note: in instantiation of function template specialization \'std::__insertion_sort::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>\' requested here\\n std::__insertion_sort(__first, __first + int(_S_threshold), __comp);\\n ^\\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1940:9: note: in instantiation of function template specialization \'std::__final_insertion_sort::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>\' requested here\\n std::__final_insertion_sort(__first, __last, __comp);\\n ^\\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:4820:12: note: in instantiation of function template specialization \'std::__sort::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>\' requested here\\n std::__sort(__first, __last, __gnu_cxx::__ops::__iter_less_iter());\\n ^\\nmatrix-sort.cpp:161:18: note: in instantiation of function template specialization \'std::sort::diagonal_iter>\' requested here\\n std::sort(d.begin(), d.end());\\n ^\\nmatrix-sort.cpp:17:19: note: copy assignment operator of \'diagonal_iter\' is implicitly deleted because field \'m\' is of reference type \'diagonal::matrix_t &\' (aka \'vector> &\')\\n matrix_t& m;\\n ^\\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1830:2: error: no matching function for call to \'__unguarded_linear_insert\' [clang-diagnostic-error]\\n std::__unguarded_linear_insert(__i,\\n ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1850:9: note: in instantiation of function template specialization \'std::__unguarded_insertion_sort::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>\' requested here\\n std::__unguarded_insertion_sort(__first + int(_S_threshold), __last,\\n ^\\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1940:9: note: in instantiation of function template specialization \'std::__final_insertion_sort::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>\' requested here\\n std::__final_insertion_sort(__first, __last, __comp);\\n ^\\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:4820:12: note: in instantiation of function template specialization \'std::__sort::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>\' requested here\\n std::__sort(__first, __last, __gnu_cxx::__ops::__iter_less_iter());\\n ^\\nmatrix-sort.cpp:161:18: note: in instantiation of function template specialization \'std::sort::diagonal_iter>\' requested here\\n std::sort(d.begin(), d.end());\\n ^\\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1782:5: note: candidate template ignored: substitution failure [with _RandomAccessIterator = diagonal::diagonal_iter, _Compare = __gnu_cxx::__ops::_Val_less_iter]\\n __unguarded_linear_insert(_RandomAccessIterator __last,\\n ^\\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1923:11: error: object of type \'diagonal::diagonal_iter\' cannot be assigned because its copy assignment operator is implicitly deleted [clang-diagnostic-error]\\n __last = __cut;\\n ^\\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1937:9: note: in instantiation of function template specialization \'std::__introsort_loop::diagonal_iter, long, __gnu_cxx::__ops::_Iter_less_iter>\' requested here\\n std::__introsort_loop(__first, __last,\\n ^\\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:4820:12: note: in instantiation of function template specialization \'std::__sort::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>\' requested here\\n std::__sort(__first, __last, __gnu_cxx::__ops::__iter_less_iter());\\n ^\\nmatrix-sort.cpp:161:18: note: in instantiation of function template specialization \'std::sort::diagonal_iter>\' requested here\\n std::sort(d.begin(), d.end());\\n ^\\nmatrix-sort.cpp:17:19: note: copy assignment operator of \'diagonal_iter\' is implicitly deleted because field \'m\' is of reference type \'diagonal::matrix_t &\' (aka \'vector> &\')\\n matrix_t& m;\\n ^\\n```\\n\\nThat\'s a lot of noise, isn\'t it? Let\'s focus on the important parts:\\n\\n```\\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1792:11: error: object of type \'diagonal::diagonal_iter\' cannot be assigned because its copy assignment operator is implicitly deleted [clang-diagnostic-error]\\n\u2026\\nmatrix-sort.cpp:17:19: note: copy assignment operator of \'diagonal_iter\' is implicitly deleted because field \'m\' is of reference type \'diagonal::matrix_t &\' (aka \'vector> &\')\\n matrix_t& m;\\n ^\\n```\\n\\nAh! We have a reference in our iterator, and this prevents us from having a copy\\nassignment operator (that is used \u201csomewhere\u201d in the sorting algorithm). Well\u2026\\nLet\'s just wrap it!\\n\\n```diff\\n# we need to keep a different type than reference\\n- matrix_t& m;\\n+ std::reference_wrapper m;\\n\\n# in comparison we need to get the reference out of the wrapper first\\n- return x == rhs.x && y == rhs.y && m == rhs.m;\\n+ return x == rhs.x && y == rhs.y && m.get() == rhs.m.get();\\n\\n# same when we return a reference to the \u201ccell\u201d in the matrix\\n- reference operator*() const { return m[y][x]; }\\n+ reference operator*() const { return m.get()[y][x]; }\\n\\n# and finally in the assertions that we set for the \u201cdistance\u201d and \u201cless than\u201d\\n- assert(m == rhs.m);\\n+ assert(m.get() == rhs.m.get());\\n```\\n\\nWe\'re done now! We have written an iterator over diagonals for a 2D `vector`. You can have a look at the final result [here](pathname:///files/blog/leetcode/sort-matrix-diagonally/matrix-sort.cpp).\\n\\n[^1]: just because I\'m used to it and don\'t care about your opinion ;)\\n[^2]: exercise at your own risk\\n[^3]: me in 5 minutes in fact, but don\'t make me scared\\n[^4]: me in the next section\u2026"},{"id":"aoc-2022/2nd-week","metadata":{"permalink":"/blog/aoc-2022/2nd-week","editUrl":"https://github.com/mfocko/blog/tree/main/blog/aoc-2022/02-week-2.md","source":"@site/blog/aoc-2022/02-week-2.md","title":"2nd week of Advent of Code \'22 in Rust","description":"Surviving second week in Rust.","date":"2022-12-25T23:15:00.000Z","formattedDate":"December 25, 2022","tags":[{"label":"advent-of-code","permalink":"/blog/tags/advent-of-code"},{"label":"advent-of-code-2022","permalink":"/blog/tags/advent-of-code-2022"},{"label":"rust","permalink":"/blog/tags/rust"}],"readingTime":20.875,"hasTruncateMarker":true,"authors":[{"name":"Matej Focko","email":"me+blog@mfocko.xyz","title":"a.k.a. @mf","url":"https://gitlab.com/mfocko","imageURL":"https://github.com/mfocko.png","key":"mf"}],"frontMatter":{"title":"2nd week of Advent of Code \'22 in Rust","description":"Surviving second week in Rust.","date":"2022-12-25T23:15","slug":"aoc-2022/2nd-week","authors":"mf","tags":["advent-of-code","advent-of-code-2022","rust"],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"Sort the matrix diagonally","permalink":"/blog/leetcode/sort-diagonally"},"nextItem":{"title":"1st week of Advent of Code \'22 in Rust","permalink":"/blog/aoc-2022/1st-week"}},"content":"Let\'s go through the second week of [_Advent of Code_] in Rust.\\n\\n\x3c!--truncate--\x3e\\n\\n## [Day 8: Treetop Tree House](https://adventofcode.com/2022/day/8)\\n\\n:::info tl;dr\\n\\nWe get a forest and we want to know how many trees are visible from the outside.\\nApart from that we want to find the best view.\\n\\n:::\\n\\nNothing interesting. We are moving around 2D map though. And indexing can get a\\nbit painful when doing so, let\'s refactor it a bit ;) During the preparation for\\nthe AoC, I have written `Vector2D` and now it\'s time to extend it with indexing\\nof `Vec` of `Vec`s. In my solution I was manipulating with indices in the following\\nway:\\n\\n- swapping them\\n- checking whether they are correct indices for the `Vec>`\\n- indexing `Vec>` with them\\n\\n:::caution\\n\\nI\'m getting familiar with Rust and starting to \u201cabuse\u201d it\u2026 While doing so, I\'m\\nalso uncovering some \u201cfeatures\u201d that I don\'t really like. Therefore I will mark\\nall of my rants with _thicc_ **\xab\u21af\xbb** mark and will try to \u201clock\u201d them into their\\nown \u201cbox of hell\u201d.\\n\\n:::\\n\\n#### Swapping indices\\n\\nRelatively simple implementation, just take the values, swap them and return new\\nvector.\\n\\n```rust\\nimpl Vector2D {\\n pub fn swap(&self) -> Self {\\n Self {\\n x: self.y,\\n y: self.x,\\n }\\n }\\n}\\n```\\n\\nPretty straight-forward implementation, but let\'s talk about the `T: Copy`. We\\nneed to use it, since we are returning a **new** vector, with swapped **values**.\\nIf we had values that cannot be copied, the only thing we could do, would be a\\nvector of references (and it would also introduce a lifetime, to which we\'ll get\\nlater on). This is pretty similar with the operations on sets from the first week.\\n\\n#### Indexing `Vec`\\n\\nI will start with the indexing, cause bound-checking is a bit more\u2026 complicated\\nthan I would like to.\\n\\n```rust\\npub fn index<\'a, T, U>(v: &\'a [Vec], idx: &Vector2D) -> &\'a U\\nwhere\\n usize: TryFrom,\\n >::Error: Debug,\\n T: Copy,\\n{\\n let (x, y): (usize, usize) = (idx.x.try_into().unwrap(), idx.y.try_into().unwrap());\\n &v[y][x]\\n}\\n```\\n\\nLet\'s talk about this mess\u2026 Body of the function is probably the most easy part\\nand should not be hard to understand, we just take the `x` and `y` and convert\\nthem both to `usize` type that can be used later on for indexing.\\n\\nThe type signature of the function is where the fun is at :wink: We are trying\\nto convert unknown type to `usize`, so we must bound the `T` as a type that can\\nbe converted to `usize`, that\'s how we got `usize: TryFrom` which basically\\nsays that `usize` must implement `TryFrom` trait and therefore allows us to\\nconvert the indices to actual `usize` indices. Using `.unwrap()` also forces us\\nto bound the error that can occur when converting `T` into `usize`, that\'s how\\nwe get `>::Error: Debug` which loosely means\\n\\n> error during conversion of `T` into `usize` must implement `Debug`,\\n> i.e. can be printed in some way or other\\n\\n`T: Copy` is required by `.try_into()` which takes `T` by-value.\\n\\nAnd now we are left only with the first line of the definition.\\n\\n:::note\\n\\nSkilled Rustaceans might notice that this implementation is rather flaky and can\\nbreak in multiple places at once. I\'ll get back to it\u2026\\n\\n:::\\n\\nLet\'s split it in multiple parts:\\n\\n- `v: &\'a [Vec]` represents the 2D `Vec`, we are indexing, `Vec` implements\\n `Slice` trait and _clippy_ recommends using `&[T]` to `&Vec`, exact details\\n are unknown to me\\n- `idx: &Vector2D` represents the _indices_ which we use, we take them by\\n reference to avoid an unnecessary copy\\n- `-> &\'a U` means that we are returning a _reference_ to some value of type `U`.\\n Now the question is what does the `\'a` mean, we can also see it as a generic\\n type declared along `T` and `U`. And the answer is _relatively_ simple, `\'a`\\n represents a _lifetime_. We take the `v` by a reference and return a reference,\\n borrow checker validates all of the _borrows_ (or references), so we need to\\n specify that our returned value has _the same lifetime_ as the vector we have\\n taken by a reference, i.e. returned reference must live at least as long as the\\n `v`. This way we can \u201cbe sure\u201d that the returned reference is valid.\\n\\n##### Issues\\n\\nFirst issue that our implementation has is the fact that we cannot get a mutable\\nreference out of that function. This could be easily resolved by introducing new\\nfunction, e.g. `index_mut`. Which I have actually done while writing this part:\\n\\n```rust\\npub fn index_mut<\'a, T, U>(v: &\'a mut [Vec], idx: &Vector2D) -> &\'a mut U\\nwhere\\n usize: TryFrom,\\n >::Error: Debug,\\n T: Copy,\\n{\\n let (x, y): (usize, usize) = (idx.x.try_into().unwrap(), idx.y.try_into().unwrap());\\n &mut v[y][x]\\n}\\n```\\n\\n:::caution **\xab\u21af\xbb** Why can\'t we use one function?\\n\\nWhen we consider a `Vec`, we don\'t need to consider containers as `T`, Rust\\nimplements indexing as traits `Index` and `IndexMut` that do the dirty work\\nbehind syntactic sugar of `container[idx]`.\\n\\nHowever, implementing of traits is not allowed for _external_ types, i.e. types\\nthat you haven\'t defined yourself. This means that you can implement indexing\\nover containers that you have implemented yourself, but you cannot use your own\\ntypes for indexing \u201cbuilt-in\u201d types.\\n\\nAnother part of this rabbit hole is trait `SliceIndex` that is of a relevance\\nbecause of\\n\\n```rust\\nimpl Index for [T]\\nwhere\\n I: SliceIndex<[T]>\\n\\nimpl Index for Vec\\nwhere\\n I: SliceIndex<[T]>,\\n A: Allocator\\n\\nimpl Index for [T; N]\\nwhere\\n [T]: Index\\n```\\n\\nIn other words, if your type implements `SliceIndex` trait, it can be used\\nfor indexing. As of now, this trait has all of its required methods experimental\\nand is marked as `unsafe`.\\n\\n:::\\n\\nAnother problem is a requirement for indexing either `[Vec]` or `Vec>`.\\nThis requirement could be countered by removing inner type `Vec` and constraining\\nit by a trait `Index` (or `IndexMut` respectively) in a following way\\n\\n```rust\\npub fn index<\'a, C, T>(v: &\'a [C], idx: &Vector2D) -> &\'a C::Output\\nwhere\\n usize: TryFrom,\\n >::Error: Debug,\\n T: Copy,\\n C: Index\\n{\\n let (x, y): (usize, usize) = (idx.x.try_into().unwrap(), idx.y.try_into().unwrap());\\n &v[y][x]\\n}\\n```\\n\\nGiven this, we can also give a more meaningful typename for indexing type, such\\nas `I`.\\n\\n#### Checking bounds\\n\\nNow we can get to the boundary checks, it is very similar, but a more\u2026 dirty.\\nFirst approach that came up was to convert the indices in `Vector2D` to `usize`,\\nbut when you add the indices up, e.g. when checking the neighbors, you can end\\nup with negative values which, unlike in C++, causes an error (instead of underflow\\nthat you can use to your advantage; you can easily guess how).\\n\\nSo how can we approach this then? Well\u2026 we will convert the bounds instead of\\nthe indices and that lead us to:\\n\\n```rust\\npub fn in_range(v: &[Vec], idx: &Vector2D) -> bool\\nwhere\\n usize: TryInto,\\n >::Error: Debug,\\n T: PartialOrd + Copy,\\n{\\n idx.y >= 0.try_into().unwrap()\\n && idx.y < v.len().try_into().unwrap()\\n && idx.x >= 0.try_into().unwrap()\\n && idx.x\\n < v[TryInto::::try_into(idx.y).unwrap()]\\n .len()\\n .try_into()\\n .unwrap()\\n}\\n```\\n\\nYou can tell that it\'s definitely a shitty code. Let\'s improve it now! We will\\nget back to the original idea, but do it better. We know that we cannot convert\\nnegative values into `usize`, **but** we also know that conversion like that\\nreturns a `Result` which we can use to our advantage.\\n\\n```rust\\npub fn in_range(v: &[Vec], idx: &Vector2D) -> bool\\nwhere\\n T: Copy,\\n usize: TryFrom,\\n{\\n usize::try_from(idx.y)\\n .and_then(|y| usize::try_from(idx.x).map(|x| y < v.len() && x < v[y].len()))\\n .unwrap_or(false)\\n}\\n```\\n\\n`Result` is a type similar to `Either` in Haskell and it allows us to chain\\nmultiple operations on correct results or propagate the original error without\\ndoing anything. Let\'s dissect it one-by-one.\\n\\n`try_from` is a method implemented in `TryFrom` trait, that allows you to convert\\ntypes and either successfully convert them or fail (with a reasonable error). This\\nmethod returns `Result`.\\n\\nWe call `and_then` on that _result_, let\'s have a look at the type signature of\\n`and_then`, IMO it explains more than enough:\\n\\n```rust\\npub fn and_then(self, op: F) -> Result\\nwhere\\n F: FnOnce(T) -> Result\\n```\\n\\nOK\u2026 So it takes the result and a function and returns another result with\\ndifferent value and different error. However we can see that the function, which\\nrepresents an operation on a result, takes just the value, i.e. it doesn\'t care\\nabout any previous error. To make it short:\\n\\n> `and_then` allows us to run an operation, which can fail, on the correct result\\n\\nWe parsed a `y` index and now we try to convert the `x` index with `try_from`\\nagain, but on that result we use `map` rather than `and_then`, why would that be?\\n\\n```rust\\npub fn map(self, op: F) -> Result\\nwhere\\n F: FnOnce(T) -> U\\n```\\n\\nHuh\u2026 `map` performs an operation that **cannot** fail. And finally we use\\n`unwrap_or` which takes the value from result, or in case of an error returns the\\ndefault that we define.\\n\\nHow does this work then? If `y` is negative, the conversion fails and the error\\npropagates all the way to `unwrap_or`, if `y` can be a correct `usize` value, then\\nwe do the same with `x`. If `x` is negative, we propagate the error as with `y`,\\nand if it\'s not, then we check whether it exceeds the higher bounds or not.\\n\\n### Solution\\n\\nRelatively simple, you just need follow the rules and not get too smart, otherwise\\nit will get back at you.\\n\\n## [Day 9: Rope Bridge](https://adventofcode.com/2022/day/9)\\n\\n:::info tl;dr\\n\\nWe get a rope with knots and we want to track how many different positions are\\nvisited with the rope\'s tail.\\n\\n:::\\n\\nBy this day, I have come to a conclusion that current skeleton for each day\\ngenerates a lot of boilerplate. And even though it can be easily copied, it\'s\\njust a waste of space and unnecessary code. Let\'s \u201csimplify\u201d this (on one end\\nwhile creating monster on the other end). I\'ve gone through what we need in the\\npreparations for the AoC. Let\'s sum up our requirements:\\n\\n- parsing\\n- part 1 & 2\\n- running on sample / input\\n- tests\\n\\nParsing and implementation of both parts is code that changes each day and we\\ncannot do anything about it. However running and testing can be simplified!\\n\\nLet\'s introduce and export a new module `solution` that will take care of all of\\nthis. We will start by introducing a trait for each day.\\n\\n```rust\\npub trait Solution {\\n fn parse_input>(pathname: P) -> Input;\\n\\n fn part_1(input: &Input) -> Output;\\n fn part_2(input: &Input) -> Output;\\n}\\n```\\n\\nThis does a lot of work for us already, we have defined a trait and for each day\\nwe will create a structure representing a specific day. That structure will also\\nimplement the `Solution` trait.\\n\\nNow we need to get rid of the boilerplate, we can\'t get rid of the `main` function,\\nbut we can at least move out the functionality.\\n\\n```rust\\nfn run(type_of_input: &str) -> Result<()>\\nwhere\\n Self: Sized,\\n{\\n tracing_subscriber::fmt()\\n .with_env_filter(EnvFilter::from_default_env())\\n .with_target(false)\\n .with_file(true)\\n .with_line_number(true)\\n .without_time()\\n .compact()\\n .init();\\n color_eyre::install()?;\\n\\n let input = Self::parse_input(format!(\\"{}s/{}.txt\\", type_of_input, Self::day()));\\n\\n info!(\\"Part 1: {}\\", Self::part_1(&input));\\n info!(\\"Part 2: {}\\", Self::part_2(&input));\\n\\n Ok(())\\n}\\n\\nfn main() -> Result<()>\\nwhere\\n Self: Sized,\\n{\\n Self::run(\\"input\\")\\n}\\n```\\n\\nThis is all part of the `Solution` trait, which can implement methods while being\\ndependent on what is provided by the implementing types. In this case, we just\\nneed to bound the `Output` type to implement `Display` that is necessary for the\\n`info!` and format string there.\\n\\nNow we can get to first of the nasty things we are going to do\u2026 And it is the\\n`day()` method that you can see being used when constructing path to the input\\nfile. That method will generate a name of the file, e.g. `day01` and we know that\\nwe can _somehow_ deduce it from the structure name, given we name it reasonably.\\n\\n```rust\\nfn day() -> String {\\n let mut day = String::from(type_name::().split(\\"::\\").next().unwrap());\\n day.make_ascii_lowercase();\\n\\n day.to_string()\\n}\\n```\\n\\n:::caution `type_name`\\n\\nThis feature is still experimental and considered to be internal, it is not\\nadvised to use it any production code.\\n\\n:::\\n\\nAnd now we can get to the nastiest stuff :weary: We will **generate** the tests!\\n\\nWe want to be able to generate tests for sample input in a following way:\\n\\n```rust\\ntest_sample!(day_01, Day01, 42, 69);\\n```\\n\\nThere\'s not much we can do, so we will write a macro to generate the tests for us.\\n\\n```rust\\n#[macro_export]\\nmacro_rules! test_sample {\\n ($mod_name:ident, $day_struct:tt, $part_1:expr, $part_2:expr) => {\\n #[cfg(test)]\\n mod $mod_name {\\n use super::*;\\n\\n #[test]\\n fn test_part_1() {\\n let sample =\\n $day_struct::parse_input(&format!(\\"samples/{}.txt\\", $day_struct::day()));\\n assert_eq!($day_struct::part_1(&sample), $part_1);\\n }\\n\\n #[test]\\n fn test_part_2() {\\n let sample =\\n $day_struct::parse_input(&format!(\\"samples/{}.txt\\", $day_struct::day()));\\n assert_eq!($day_struct::part_2(&sample), $part_2);\\n }\\n }\\n };\\n}\\n```\\n\\nWe have used it in a similar way as macros in C/C++, one of the things that we\\ncan use to our advantage is defining \u201ctype\u201d of the parameters for the macro. All\\nparameters have their name prefixed with `$` sign and you can define various \u201cforms\u201d\\nof your macro. Let\'s go through it!\\n\\nWe have following parameters:\\n\\n- `$mod_name` which represents the name for the module with tests, it is typed\\n with `ident` which means that we want a valid identifier to be passed in.\\n- `$day_struct` represents the structure that will be used for tests, it is typed\\n with `tt` which represents a _token tree_, in our case it is a type.\\n- `$part_X` represents the expected output for the `X`th part and is of type `expr`\\n which literally means an _expression_.\\n\\nApart from that we need to use `#[macro_export]` to mark the macro as exported\\nfor usage outside of the module. Now our skeleton looks like:\\n\\n```rust\\nuse aoc_2022::*;\\n\\ntype Input = String;\\ntype Output = String;\\n\\nstruct DayXX;\\nimpl Solution for DayXX {\\n fn parse_input>(pathname: P) -> Input {\\n file_to_string(pathname)\\n }\\n\\n fn part_1(input: &Input) -> Output {\\n todo!()\\n }\\n\\n fn part_2(input: &Input) -> Output {\\n todo!()\\n }\\n}\\n\\nfn main() -> Result<()> {\\n // DayXX::run(\\"sample\\")\\n DayXX::main()\\n}\\n\\n// test_sample!(day_XX, DayXX, , );\\n```\\n\\n### Solution\\n\\nNot much to talk about, it is relatively easy to simulate.\\n\\n## [Day 10: Cathode-Ray Tube](https://adventofcode.com/2022/day/10)\\n\\n:::info tl;dr\\n\\nEmulating basic arithmetic operations on a CPU and drawing on CRT based on the\\nCPU\'s accumulator.\\n\\n:::\\n\\nIn this day I have discovered an issue with my design of the `Solution` trait.\\nAnd the issue is caused by different types of `Output` for the part 1 and part 2.\\n\\nProblem is relatively simple and consists of simulating a CPU, I have approached\\nit in a following way:\\n\\n```rust\\nfn evaluate_instructions(instructions: &[Instruction], mut out: Output) -> Output {\\n instructions\\n .iter()\\n .fold(State::new(), |state, instruction| {\\n state.execute(instruction, &mut out)\\n });\\n\\n out\\n}\\n```\\n\\nWe just take the instructions, we have some state of the CPU and we execute the\\ninstructions one-by-one. Perfect usage of the `fold` (or `reduce` as you may know\\nit from other languages).\\n\\nYou can also see that we have an `Output` type, so the question is how can we fix\\nthat problem. And the answer is very simple and _functional_. Rust allows you to\\nhave an `enumeration` that can _bear_ some other values apart from the type itself.\\n\\n:::tip\\n\\nWe could\'ve seen something like this with the `Result` type that can be\\ndefined as\\n\\n```rust\\nenum Result {\\n Ok(T),\\n Err(E)\\n}\\n```\\n\\n###### What does that mean though?\\n\\nWhen we have an `Ok` value, it has the result itself, and when we get an `Err`\\nvalue, it has the error. This also allows us to handle _results_ in a rather\\npretty way:\\n\\n```rust\\nmatch do_something(x) {\\n Ok(y) => {\\n println!(\\"SUCCESS: {}\\", y);\\n },\\n Err(y) => {\\n eprintln!(\\"ERROR: {}\\", y);\\n }\\n}\\n```\\n\\n:::\\n\\nMy solution has a following outline:\\n\\n```rust\\nfn execute(&self, i: &Instruction, output: &mut Output) -> State {\\n // execute the instruction\\n\\n // collect results if necessary\\n match output {\\n Output::Part1(x) => self.execute_part_1(y, x),\\n Output::Part2(x) => self.execute_part_2(y, x),\\n }\\n\\n // return the obtained state\\n new_state\\n}\\n```\\n\\nYou might think that it\'s a perfectly reasonable thing to do. Yes, **but** notice\\nthat the `match` statement doesn\'t _collect_ the changes in any way and also we\\npass `output` by `&mut`, so it is shared across each _iteration_ of the `fold`.\\n\\nThe dirty and ingenious thing is that `x`s are passed by `&mut` too and therefore\\nthey are directly modified by the helper functions. To sum it up and let it sit\\n\\n> We are **collecting** the result **into** an **enumeration** that is **shared**\\n> across **all** iterations of `fold`.\\n\\n### Solution\\n\\nSimilar to _Day 9_, but there are some technical details that can get you.\\n\\n## [Day 11: Monkey in the Middle](https://adventofcode.com/2022/day/11)\\n\\n:::info tl;dr\\n\\nSimulation of monkeys throwing stuff around and measuring your stress levels\\nwhile your stuff is being passed around.\\n\\n:::\\n\\nI think I decided to use regular expressions here for the first time, cause\\nparsing the input was a pain.\\n\\nAlso I didn\'t expect to implement Euclidean algorithm in Rust\u2026\\n\\n### Solution\\n\\nAgain, we\'re just running a simulation. Though I must admit it was very easy to\\nmake a small technical mistakes that could affect the final results very late.\\n\\n## [Day 12: Hill Climbing Algorithm](https://adventofcode.com/2022/day/12)\\n\\n:::info tl;dr\\n\\nFinding shortest path up the hill and also shortest path down to the ground while\\nalso rolling down the hill\u2026\\n\\n:::\\n\\nAs I have said in the _tl;dr_, we are looking for the shortest path, but the start\\nand goal differ for the part 1 and 2. So I have decided to refactor my solution\\nto a BFS algorithm that takes necessary parameters via functions:\\n\\n```rust\\nfn bfs(\\n graph: &[Vec], start: &Position, has_edge: F, is_target: G\\n) -> Option\\nwhere\\n F: Fn(&[Vec], &Position, &Position) -> bool,\\n G: Fn(&[Vec], &Position) -> bool\\n```\\n\\nWe pass the initial vertex from the caller and everything else is left to the BFS\\nalgorithm, based on the `has_edge` and `is_target` functions.\\n\\nThis was easy! And that is not very usual in Rust once you want to pass around\\nfunctions. :eyes:\\n\\n### Solution\\n\\nLooking for the shortest path\u2026 Must be Dijkstra, right? **Nope!** Half of the\\nReddit got jebaited though. In all fairness, nothing stops you from implementing\\nthe Dijkstra\'s algorithm for finding the shortest path, **but** if you know that\\nall connected vertices are in a unit (actually $d = 1$) distance from each other,\\nthen you know that running Dijkstra is equivalent to running BFS, only with worse\\ntime complexity, because of the priority heap instead of the queue.\\n\\n## [Day 13: Distress Signal](https://adventofcode.com/2022/day/13)\\n\\n:::info tl;dr\\n\\nProcessing packets with structured data from the distress signal.\\n\\n:::\\n\\nYou can implement a lot of traits if you want to. It is _imperative_ to implement\\nordering on the packets. I had a typo, so I also proceeded to implement a `Display`\\ntrait for debugging purposes:\\n\\n```rust\\nimpl Display for Packet {\\n fn fmt(&self, f: &mut std::fmt::Formatter<\'_>) -> std::fmt::Result {\\n match self {\\n Packet::Integer(x) => write!(f, \\"{x}\\"),\\n Packet::List(lst) => write!(f, \\"[{}]\\", lst.iter().map(|p| format!(\\"{p}\\")).join(\\",\\")),\\n }\\n }\\n}\\n```\\n\\n### Solution\\n\\nA lot of technical details\u2026 Parsing is nasty too\u2026\\n\\n## [Day 14: Regolith Reservoir](https://adventofcode.com/2022/day/14)\\n\\n:::info tl;dr\\n\\nLet\'s simulate falling sand grain-by-grain.\\n\\n:::\\n\\nAgain, both parts are relatively similar with minimal changes, so it is a good\\nidea to refactor it a bit. Similar approach to the [BFS above]. Also this is the\\nfirst day where I ran into efficiency issues and had to redo my solution to speed\\nit up just a bit.\\n\\n### Solution\\n\\nTedious.\\n\\n## Post Mortem\\n\\n### Indexing\\n\\nI was asked about the indexing after publishing the blog. And truly it is rather\\ncomplicated topic, especially after releasing `SliceIndex` trait. I couldn\'t\\nleave it be, so I tried to implement the `Index` and `IndexMut` trait.\\n\\n:::note\\n\\nI have also mentioned that the `SliceIndex` trait is `unsafe`, but truth be told,\\nonly _unsafe_ part are the 2 methods that are named `*unchecked*`. Anyways, I will\\nbe implementing the `Index*` traits for now, rather than the `SliceIndex`.\\n\\n:::\\n\\nIt\'s relatively straightforward\u2026\\n\\n```rust\\nimpl Index> for [C]\\nwhere\\n I: Copy + TryInto,\\n >::Error: Debug,\\n C: Index,\\n{\\n type Output = C::Output;\\n\\n fn index(&self, index: Vector2D) -> &Self::Output {\\n let (x, y): (usize, usize) =\\n (index.x.try_into().unwrap(), index.y.try_into().unwrap());\\n &self[y][x]\\n }\\n}\\n\\nimpl IndexMut> for [C]\\nwhere\\n I: Copy + TryInto,\\n >::Error: Debug,\\n C: IndexMut,\\n{\\n fn index_mut(&mut self, index: Vector2D) -> &mut Self::Output {\\n let (x, y): (usize, usize) =\\n (index.x.try_into().unwrap(), index.y.try_into().unwrap());\\n &mut self[y][x]\\n }\\n}\\n```\\n\\nWe can see a lot of similarities to the implementation of `index` and `index_mut`\\nfunctions. In the end, they are 1:1, just wrapped in the trait that provides a\\nsyntax sugar for `container[idx]`.\\n\\n:::note\\n\\nI have also switched from using the `TryFrom` to `TryInto` trait, since it better\\nmatches what we are using, the `.try_into` rather than `usize::try_from`.\\n\\nAlso implementing `TryFrom` automatically provides you with a `TryInto` trait,\\nsince it is relatively easy to implement. Just compare the following:\\n\\n```rust\\npub trait TryFrom: Sized {\\n type Error;\\n\\n fn try_from(value: T) -> Result;\\n}\\n\\npub trait TryInto: Sized {\\n type Error;\\n\\n fn try_into(self) -> Result;\\n}\\n```\\n\\n:::\\n\\nOK, so we have our trait implemented, we should be able to use `container[index]`,\\nright? Yes\u2026 but actually no :frowning:\\n\\n```\\nerror[E0277]: the type `[std::vec::Vec]` cannot be indexed by `aoc_2022::Vector2D`\\n --\x3e src/bin/day08.rs:26:18\\n |\\n26 | if trees[pos] > tallest {\\n | ^^^ slice indices are of type `usize` or ranges of `usize`\\n |\\n = help: the trait `std::slice::SliceIndex<[std::vec::Vec]>` is not implemented for `aoc_2022::Vector2D`\\n = note: required for `std::vec::Vec>` to implement `std::ops::Index>`\\n\\nerror[E0277]: the type `[std::vec::Vec]` cannot be indexed by `aoc_2022::Vector2D`\\n --\x3e src/bin/day08.rs:30:28\\n |\\n30 | max(tallest, trees[pos])\\n | ^^^ slice indices are of type `usize` or ranges of `usize`\\n |\\n = help: the trait `std::slice::SliceIndex<[std::vec::Vec]>` is not implemented for `aoc_2022::Vector2D`\\n = note: required for `std::vec::Vec>` to implement `std::ops::Index>`\\n\\nerror[E0277]: the type `[std::vec::Vec]` cannot be indexed by `aoc_2022::Vector2D`\\n --\x3e src/bin/day08.rs:52:28\\n |\\n52 | let max_height = trees[position];\\n | ^^^^^^^^ slice indices are of type `usize` or ranges of `usize`\\n |\\n = help: the trait `std::slice::SliceIndex<[std::vec::Vec]>` is not implemented for `aoc_2022::Vector2D`\\n = note: required for `std::vec::Vec>` to implement `std::ops::Index>`\\n```\\n\\nWhy? We have it implemented for the slices (`[C]`), why doesn\'t it work? Well,\\nthe fun part consists of the fact that in other place, where we were using it,\\nwe were passing the `&[Vec]`, but this is coming from a helper functions that\\ntake `&Vec>` instead. And\u2026 we don\'t implement `Index` and `IndexMut` for\\nthose. Just for the slices. \ud83e\udd2f _What are we going to do about it?_\\n\\nWe can either start copy-pasting or be smarter about it\u2026 I choose to be smarter,\\nso let\'s implement a macro! The only difference across the implementations are\\nthe types of the outer containers. Implementation doesn\'t differ **at all**!\\n\\nImplementing the macro can be done in a following way:\\n\\n```rust\\nmacro_rules! generate_indices {\\n ($container:ty) => {\\n impl Index> for $container\\n where\\n I: Copy + TryInto,\\n >::Error: Debug,\\n C: Index,\\n {\\n type Output = C::Output;\\n\\n fn index(&self, index: Vector2D) -> &Self::Output {\\n let (x, y): (usize, usize) =\\n (index.x.try_into().unwrap(), index.y.try_into().unwrap());\\n &self[y][x]\\n }\\n }\\n\\n impl IndexMut> for $container\\n where\\n I: Copy + TryInto,\\n >::Error: Debug,\\n C: IndexMut,\\n {\\n fn index_mut(&mut self, index: Vector2D) -> &mut Self::Output {\\n let (x, y): (usize, usize) =\\n (index.x.try_into().unwrap(), index.y.try_into().unwrap());\\n &mut self[y][x]\\n }\\n }\\n };\\n}\\n```\\n\\nAnd now we can simply do\\n\\n```rust\\ngenerate_indices!(VecDeque);\\ngenerate_indices!([C]);\\ngenerate_indices!(Vec);\\n// generate_indices!([C; N], const N: usize);\\n```\\n\\nThe last type (I took the inspiration from the implementations of the `Index` and\\n`IndexMut` traits) is a bit problematic, because of the `const N: usize` part,\\nwhich I haven\'t managed to be able to parse. And that\'s how I got rid of the error.\\n\\n:::note\\n\\nIf I were to use 2D-indexing over `[C; N]` slices, I\'d probably just go with the\\ncopy-paste, cause the cost of this \u201cmonstrosity\u201d outweighs the benefits of no DRY.\\n\\n:::\\n\\n#### Cause of the problem\\n\\nThis issue is relatively funny. If you don\'t use any type aliases, just the raw\\ntypes, you\'ll get suggested certain changes by the _clippy_. For example if you\\nconsider the following piece of code\\n\\n```rust\\nfn get_sum(nums: &Vec) -> i32 {\\n nums.iter().sum()\\n}\\n\\nfn main() {\\n let nums = vec![1, 2, 3];\\n println!(\\"Sum: {}\\", get_sum(&nums));\\n}\\n```\\n\\nand you run _clippy_ on it, you will get\\n\\n```\\nChecking playground v0.0.1 (/playground)\\nwarning: writing `&Vec` instead of `&[_]` involves a new object where a slice will do\\n --\x3e src/main.rs:1:18\\n |\\n1 | fn get_sum(nums: &Vec) -> i32 {\\n | ^^^^^^^^^ help: change this to: `&[i32]`\\n |\\n = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg\\n = note: `#[warn(clippy::ptr_arg)]` on by default\\n\\nwarning: `playground` (bin \\"playground\\") generated 1 warning\\n Finished dev [unoptimized + debuginfo] target(s) in 0.61s\\n```\\n\\nHowever, if you introduce a type alias, such as\\n\\n```rust\\ntype Numbers = Vec;\\n```\\n\\nThen _clippy_ won\'t say anything, cause there is literally nothing to suggest.\\nHowever the outcome is not the same\u2026\\n\\n[_advent of code_]: https://adventofcode.com\\n[bfs above]: #day-12-hill-climbing-algorithm"},{"id":"aoc-2022/1st-week","metadata":{"permalink":"/blog/aoc-2022/1st-week","editUrl":"https://github.com/mfocko/blog/tree/main/blog/aoc-2022/01-week-1.md","source":"@site/blog/aoc-2022/01-week-1.md","title":"1st week of Advent of Code \'22 in Rust","description":"Surviving first week in Rust.","date":"2022-12-15T01:15:00.000Z","formattedDate":"December 15, 2022","tags":[{"label":"advent-of-code","permalink":"/blog/tags/advent-of-code"},{"label":"advent-of-code-2022","permalink":"/blog/tags/advent-of-code-2022"},{"label":"rust","permalink":"/blog/tags/rust"}],"readingTime":12.4,"hasTruncateMarker":true,"authors":[{"name":"Matej Focko","email":"me+blog@mfocko.xyz","title":"a.k.a. @mf","url":"https://gitlab.com/mfocko","imageURL":"https://github.com/mfocko.png","key":"mf"}],"frontMatter":{"title":"1st week of Advent of Code \'22 in Rust","description":"Surviving first week in Rust.","date":"2022-12-15T01:15","slug":"aoc-2022/1st-week","authors":"mf","tags":["advent-of-code","advent-of-code-2022","rust"],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"2nd week of Advent of Code \'22 in Rust","permalink":"/blog/aoc-2022/2nd-week"},"nextItem":{"title":"Advent of Code \'22 in Rust","permalink":"/blog/aoc-2022/intro"}},"content":"Let\'s go through the first week of [_Advent of Code_] in Rust.\\n\\n\x3c!--truncate--\x3e\\n\\n:::note\\n\\nIf you wish to have a look at the solutions, you can follow them on my [GitLab].\\nMore specifically in the [`/src/bin/`].\\n\\n:::\\n\\nI will try to summarize my experience with using Rust for the AoC. Trying it out\\nages ago, I believe it will be _pain and suffering_, but we will see. For each\\nday I will also try to give a tl;dr of the problem, so that you can better imagine\\nthe relation to my woes or :+1: moments.\\n\\n## [Day 1: Calorie Counting](https://adventofcode.com/2022/day/1)\\n\\n:::info tl;dr\\n\\nAs the name suggests, we get the calories of the food contained in the elves\\nbackpacks and we want to choose the elf that has the most food ;)\\n\\n:::\\n\\n> Wakey wakey!\\n\\nProgramming in Rust at 6am definitely hits. I\'ve also forgotten to mention how I\\nhandle samples. With each puzzle you usually get a sample input and expected\\noutput. You can use them to verify that your solution works, or usually doesn\'t.\\n\\nAt first I\'ve decided to put asserts into my `main`, something like\\n\\n```rust\\nassert_eq!(part_1(&sample), 24000);\\ninfo!(\\"Part 1: {}\\", part_1(&input));\\n\\nassert_eq!(part_2(&sample), 45000);\\ninfo!(\\"Part 2: {}\\", part_2(&input));\\n```\\n\\nHowever, once you get further, the sample input may take some time to run itself.\\nSo in the end, I have decided to turn them into unit tests:\\n\\n```rust\\n#[cfg(test)]\\nmod tests {\\n use super::*;\\n\\n #[test]\\n fn test_part_1() {\\n let sample = parse_input(\\"samples/day01.txt\\");\\n assert_eq!(part_1(&sample), 24000);\\n }\\n\\n #[test]\\n fn test_part_2() {\\n let sample = parse_input(\\"samples/day01.txt\\");\\n assert_eq!(part_2(&sample), 45000);\\n }\\n}\\n```\\n\\nAnd later on I have noticed, it\'s hard to tell the difference between the days,\\nso I further renamed the `mod` from generic `tests` to reflect the days.\\n\\nAlso after finishing the first day puzzle, I have installed an [`sccache`] to\\ncache the builds, so that the build time is lower, cause it was kinda unbearable.\\n\\n### Solution\\n\\nWell, it\'s a pretty simple problem. You just take the input, sum the calories and\\nfind the biggest one. However, if we try to generalize to more than the biggest\\none, the fun appears. We have few options:\\n\\n- keep all the calories, sort them, take what we need\\n- keep all the calories and use max heap\\n- use min heap and maintain at most N calories that we need\\n\\n## [Day 2: Rock Paper Scissors](https://adventofcode.com/2022/day/2)\\n\\n:::info tl;dr\\n\\nYou want to know what score did you achieve while playing _Rock Paper Scissors_.\\nAnd then you want to be strategic about it.\\n\\n:::\\n\\nApart from the technical details of the puzzle, it went relatively smooth.\\n\\n### Solution\\n\\nI took relatively na\xefve approach and then tried to simplify it.\\n\\n## [Day 3: Rucksack Reorganization](https://adventofcode.com/2022/day/3)\\n\\n:::info tl;dr\\n\\nLet\'s go reorganize elves\' backpacks! Each backpacks has 2 compartments and you\\nwant to find the common item among those compartments. Each of them has priority,\\nyou care only about the sum.\\n\\n:::\\n\\nThis is the day where I started to fight the compiler and neither of us decided\\nto give up. Let\'s dive into it \\\\o/\\n\\n:::tip Fun fact\\n\\nFighting the compiler took me 30 minutes.\\n\\n:::\\n\\nWe need to find a common item among 2 collections, that\'s an easy task, right?\\nWe can construct 2 sets and find an intersection:\\n\\n```rust\\nlet top: HashSet = [1, 2, 3].iter().collect();\\nlet bottom: HashSet = [3, 4, 5].iter().collect();\\n```\\n\\nNow, the first issue that we encounter is caused by the fact that we are using\\na slice (the `[\u2026]`), iterator of that returns **references** to the numbers.\\nAnd we get immediately yelled at by the compiler, because the numbers are discarded\\nafter running the `.collect`. To fix this, we can use `.into_iter`:\\n\\n```rust\\nlet top: HashSet = [1, 2, 3].into_iter().collect();\\nlet bottom: HashSet = [3, 4, 5].into_iter().collect();\\n```\\n\\nThis way the numbers will get copied instead of referenced. OK, let\'s find the\\nintersection of those 2 collections:\\n\\n```rust\\nprintln!(\\"Common elements: {:?}\\", top.intersection(&bottom));\\n```\\n\\n```\\nCommon elements: [3]\\n```\\n\\n:::caution\\n\\nNotice that we need to do `&bottom`. It explicitly specifies that `.intersection`\\n**borrows** the `bottom`, i.e. takes an immutable reference to it.\\n\\n:::\\n\\nThat\'s what we want, right? Looks like it! \\\\o/\\n\\nNext part wants us to find the common element among all of the backpacks. OK, so\\nthat should be fairly easy, we have an intersection and we want to find intersection\\nover all of them.\\n\\nLet\'s have a look at the type of the `.intersection`\\n\\n```rust\\npub fn intersection<\'a>(\\n\xa0\xa0\xa0\xa0&\'a self,\\n\xa0\xa0\xa0\xa0other: &\'a HashSet\\n) -> Intersection<\'a, T, S>\\n```\\n\\nOK\u2026 Huh\u2026 But we have an example there!\\n\\n```rust\\nlet intersection: HashSet<_> = a.intersection(&b).collect();\\n```\\n\\nCool, that\'s all we need.\\n\\n```rust\\nlet top: HashSet = [1, 2, 3, 4].into_iter().collect();\\nlet bottom: HashSet = [3, 4, 5, 6].into_iter().collect();\\nlet top_2: HashSet = [2, 3, 4, 5, 6].into_iter().collect();\\nlet bottom_2: HashSet = [4, 5, 6].into_iter().collect();\\n\\nlet intersection: HashSet<_> = top.intersection(&bottom).collect();\\nprintln!(\\"Intersection: {:?}\\", intersection);\\n```\\n\\n```\\nIntersection: {3, 4}\\n```\\n\\nCool, so let\'s do the intersection with the `top_2`:\\n\\n```rust\\nlet top: HashSet = [1, 2, 3, 4].into_iter().collect();\\nlet bottom: HashSet = [3, 4, 5, 6].into_iter().collect();\\nlet top_2: HashSet = [2, 3, 4, 5, 6].into_iter().collect();\\nlet bottom_2: HashSet = [4, 5, 6].into_iter().collect();\\n\\nlet intersection: HashSet<_> = top.intersection(&bottom).collect();\\nlet intersection: HashSet<_> = intersection.intersection(&top_2).collect();\\nprintln!(\\"Intersection: {:?}\\", intersection);\\n```\\n\\nAnd we get yelled at by the compiler:\\n\\n```\\nerror[E0308]: mismatched types\\n --\x3e src/main.rs:10:58\\n |\\n10 | let intersection: HashSet<_> = intersection.intersection(&top_2).collect();\\n | ------------ ^^^^^^ expected `&i32`, found `i32`\\n | |\\n | arguments to this function are incorrect\\n |\\n = note: expected reference `&HashSet<&i32>`\\n found reference `&HashSet`\\n```\\n\\n/o\\\\ What the hell is going on here? Well, the funny thing is, that this operation\\ndoesn\'t return the elements themselves, but the references to them and when we pass\\nthe third set, it has just the values themselves, without any references.\\n\\n:::tip\\n\\nIt may seem as a very weird decision, but in fact it makes some sense\u2026 It allows\\nyou to do intersection of items that may not be possible to copy. Overall this is\\na \u201ctax\u201d for having a borrow checker ~~drilling your ass~~ having your back and\\nmaking sure you\'re not doing something naughty that may cause an **undefined**\\n**behavior**.\\n\\n:::\\n\\nTo resolve this we need to get an iterator that **clones** the elements:\\n\\n```rust\\nlet top: HashSet = [1, 2, 3, 4].into_iter().collect();\\nlet bottom: HashSet = [3, 4, 5, 6].into_iter().collect();\\nlet top_2: HashSet = [2, 3, 4, 5, 6].into_iter().collect();\\nlet bottom_2: HashSet = [4, 5, 6].into_iter().collect();\\n\\nlet intersection: HashSet<_> = top.intersection(&bottom).cloned().collect();\\nlet intersection: HashSet<_> = intersection.intersection(&top_2).cloned().collect();\\nlet intersection: HashSet<_> = intersection.intersection(&bottom_2).cloned().collect();\\nprintln!(\\"Intersection: {:?}\\", intersection);\\n```\\n\\n```\\nIntersection: {4}\\n```\\n\\n### Solution\\n\\nThe approach is pretty simple, if you omit the _1on1 with the compiler_. You just\\nhave some fun with the set operations :)\\n\\n## [Day 4: Camp Cleanup](https://adventofcode.com/2022/day/4)\\n\\n:::info tl;dr\\n\\nElves are cleaning up the camp and they got overlapping sections to clean up.\\nFind how many overlap and can take the day off.\\n\\n:::\\n\\n[`RangeInclusive`] is your friend not an enemy :)\\n\\n### Solution\\n\\nRelatively easy, you just need to parse the input and know what you want. Rust\'s\\n`RangeInclusive` type helped a lot, cause it took care of all abstractions.\\n\\n## [Day 5: Supply Stacks](https://adventofcode.com/2022/day/5)\\n\\n:::info tl;dr\\n\\nLet\'s play with stacks of crates.\\n\\n:::\\n\\nVery easy problem with very annoying input. You can judge yourself:\\n\\n```\\n [D]\\n[N] [C]\\n[Z] [M] [P]\\n 1 2 3\\n\\nmove 1 from 2 to 1\\nmove 3 from 1 to 3\\nmove 2 from 2 to 1\\nmove 1 from 1 to 2\\n```\\n\\nGood luck transforming that into something reasonable :)\\n\\n:::tip Fun fact\\n\\nTook me 40 minutes to parse this reasonably, including fighting the compiler.\\n\\n:::\\n\\n### Solution\\n\\nFor the initial solution I went with a manual solution (as in _I have done all_\\n_the work_. Later on I have decided to explore the `std` and interface of the\\n`std::vec::Vec` and found [`split_off`] which takes an index and splits (duh)\\nthe vector:\\n\\n```rust\\nlet mut vec = vec![1, 2, 3];\\nlet vec2 = vec.split_off(1);\\nassert_eq!(vec, [1]);\\nassert_eq!(vec2, [2, 3]);\\n```\\n\\nThis helped me simplify my solution a lot and also get rid of some _edge cases_.\\n\\n## [Day 6: Tuning Trouble](https://adventofcode.com/2022/day/6)\\n\\n:::info tl;dr\\n\\nFinding start of the message in a very weird protocol. Start of the message is\\ndenoted by $N$ unique consecutive characters.\\n\\n:::\\n\\n### Solution\\n\\nA lot of different approaches, knowing that we are dealing with input consisting\\nsolely of ASCII letters, I bit the bullet and went with sliding window and\\nconstructing sets from that window, checking if the set is as big as the window.\\n\\nOne possible optimization could consist of keeping a bit-vector (i.e. `usize`\\nvariable) of encountered characters and updating it as we go. However this has\\na different issue and that is removal of the characters from the left side of the\\nwindow. We don\'t know if the same character is not included later on.\\n\\nOther option is to do similar thing, but keeping the frequencies of the letters,\\nand again knowing we have only ASCII letters we can optimize by having a vector\\nof 26 elements that keeps count for each lowercase letter.\\n\\n## [Day 7: No Space Left On Device](https://adventofcode.com/2022/day/7)\\n\\n:::info tl;dr\\n\\nLet\'s simulate [`du`] to get some stats about our file system and then pinpoint\\ndirectories that take a lot of space and should be deleted.\\n\\n:::\\n\\n> I was waiting for this moment, and yet it got me!\\n> _imagine me swearing for hours_\\n\\n### Solution\\n\\nWe need to \u201c_build_\u201d a file system from the input that is given in a following form:\\n\\n```\\n$ cd /\\n$ ls\\ndir a\\n14848514 b.txt\\n8504156 c.dat\\ndir d\\n$ cd a\\n$ ls\\ndir e\\n29116 f\\n2557 g\\n62596 h.lst\\n$ cd e\\n$ ls\\n584 i\\n$ cd ..\\n$ cd ..\\n$ cd d\\n$ ls\\n4060174 j\\n8033020 d.log\\n5626152 d.ext\\n7214296 k\\n```\\n\\nThere are few ways in which you can achieve this and also you can assume some\\npreconditions, but why would we do that, right? :)\\n\\nYou can \u201cslap\u201d this in either [`HashMap`] or [`BTreeMap`] and call it a day.\\nAnd that would be boring\u2026\\n\\n:::tip\\n\\n`BTreeMap` is quite fitting for this, don\'t you think?\\n\\n:::\\n\\nI always wanted to try allocation on heap in Rust, so I chose to implement a tree.\\nI fought with the `Box` for some time and was losing\u2026\\n\\nThen I looked up some implementations of trees or linked lists and decided to try\\n`Rc>`. And I got my _ass whopped_ by the compiler once again. /o\\\\\\n\\n:::tip\\n\\n`Box` represents a dynamically allocated memory on heap. It is a single pointer,\\nyou can imagine this as `std::unique_ptr` in C++.\\n\\n`Rc` represents a dynamically allocated memory on heap. On top of that it is\\n_reference counted_ (that\'s what the `Rc` stands for). You can imagine this as\\n`std::shared_ptr` in C++.\\n\\nNow the fun stuff. Neither of them lets you **mutate** the contents of the memory.\\n\\n`Cell` allows you to mutate the memory. Can be used reasonably with types that\\ncan be copied, because the memory safety is guaranteed by copying the contents\\nwhen there is more than one **mutable** reference to the memory.\\n\\n`RefCell` is similar to the `Cell`, but the borrowing rules (how many mutable\\nreferences are present) are checked dynamically.\\n\\nSo in the end, if you want something like `std::shared_ptr` in Rust, you want\\nto have `Rc>`.\\n\\n:::\\n\\nSo, how are we going to represent the file system then? We will use an enumeration,\\nhehe, which is an algebraic data type that can store some stuff in itself :weary:\\n\\n```rust\\ntype FileHandle = Rc>;\\n\\n#[derive(Debug)]\\nenum AocFile {\\n File(usize),\\n Directory(BTreeMap),\\n}\\n```\\n\\nLet\'s go over it! `FileHandle` represents dynamically allocated `AocFile`, not\\nmuch to discuss. What does the `#[derive(Debug)]` do though? It lets us to print\\nout the value of that enumeration, it\'s derived, so it\'s not as good as if we had\\nimplemented it ourselves, but it\'s good enough for debugging, hence the name.\\n\\nNow to the fun part! `AocFile` value can be represented in two ways:\\n\\n- `File(usize)`, e.g. `AocFile::File(123)` and we can pattern match it, if we\\n need to\\n- `Directory(BTreeMap)` will represent the directory and will\\n contain map matching the name of the files (or directories) within to their\\n respective file handles\\n\\nI will omit the details about constructing this file system, cause there are a lot\\nof technicalities introduced by the nature of the input. However if you are\\ninterested, you can have a look at my solution.\\n\\nWe need to find small enough directories and also find the smallest directory that\\nwill free enough space. Now the question is, how could we do that. And there are\\nmultiple ways I will describe.\\n\\nI have chosen to implement [_tree catamorphism_] :weary:. It is basically a fold\\nover a tree data structure. We descent down into the leaves and propagate computed\\nresults all the way to the root. You can also notice that this approach is very\\nsimilar to _dynamic programming_, we find overlapping sections of the computation\\nand try to minimize the additional work (in this case: we need to know sizes of\\nour descendants, but we have already been there).\\n\\nAnother approach that has been suggested to me few days later is running DFS on\\nthe graph. And, funnily enough, we would still need to combine what we found in\\nthe branches where we descent. So in the end, it would work very similarly to my\\nsolution.\\n\\nOne of the more exotic options would be precomputing the required information at\\nthe same time as parsing. That could be done by adding additional fields to the\\nnodes which would allow storing such information and updating it as we construct\\nthe file system.\\n\\n## Post Mortem\\n\\nThings that have been brought up in the discussion later on.\\n\\n### `Rc` vs `Rc>`\\n\\nIt has been brought up that I have a contradicting statement regarding the\\ndynamically allocated memory. Specifically:\\n\\n- You can imagine `Rc` as an `std::shared_ptr` (in C++)\\n- When you want an equivalent of `std::shared_ptr`, you want to use\\n `Rc>`\\n\\nNow, in Rust it is a bit more complicated, because the type that represents the\\n\u201cshared pointer\u201d is `Rc`. What `RefCell` does is making sure that there is\\nonly one \u201cowner\u201d of a mutable reference at a time (and dynamically, as opposed\\nto the `Cell`).\\n\\nTherefore to be precise and correct about the equivalents of `std::shared_ptr`\\nin Rust, we can say that\\n\\n- `Rc` is an equivalent of a `const std::shared_ptr`,\\n- and `Rc>` is an equivalent of a `std::shared_ptr`.\\n\\nYou can easily see that they only differ in the mutability. (And even that is not\\nas simple as it seems, because there is also `Cell`)\\n\\n[_advent of code_]: https://adventofcode.com\\n[gitlab]: https://gitlab.com/mfocko/advent-of-code-2022\\n[`/src/bin/`]: https://gitlab.com/mfocko/advent-of-code-2022/-/tree/main/src/bin\\n[`sccache`]: https://github.com/mozilla/sccache\\n[`rangeinclusive`]: https://doc.rust-lang.org/std/ops/struct.RangeInclusive.html\\n[`split_off`]: https://doc.rust-lang.org/std/vec/struct.Vec.html#method.split_off\\n[`du`]: https://www.man7.org/linux/man-pages/man1/du.1.html\\n[`hashmap`]: https://doc.rust-lang.org/std/collections/struct.HashMap.html\\n[`btreemap`]: https://doc.rust-lang.org/std/collections/struct.BTreeMap.html\\n[_tree catamorphism_]: https://en.wikipedia.org/wiki/Catamorphism#Tree_fold"},{"id":"aoc-2022/intro","metadata":{"permalink":"/blog/aoc-2022/intro","editUrl":"https://github.com/mfocko/blog/tree/main/blog/aoc-2022/00-intro.md","source":"@site/blog/aoc-2022/00-intro.md","title":"Advent of Code \'22 in Rust","description":"Preparing for Advent of Code \'22.","date":"2022-12-14T21:45:00.000Z","formattedDate":"December 14, 2022","tags":[{"label":"advent-of-code","permalink":"/blog/tags/advent-of-code"},{"label":"advent-of-code-2022","permalink":"/blog/tags/advent-of-code-2022"},{"label":"rust","permalink":"/blog/tags/rust"}],"readingTime":8.665,"hasTruncateMarker":true,"authors":[{"name":"Matej Focko","email":"me+blog@mfocko.xyz","title":"a.k.a. @mf","url":"https://gitlab.com/mfocko","imageURL":"https://github.com/mfocko.png","key":"mf"}],"frontMatter":{"title":"Advent of Code \'22 in Rust","description":"Preparing for Advent of Code \'22.","date":"2022-12-14T21:45","slug":"aoc-2022/intro","authors":"mf","tags":["advent-of-code","advent-of-code-2022","rust"],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"1st week of Advent of Code \'22 in Rust","permalink":"/blog/aoc-2022/1st-week"}},"content":"Let\'s talk about the preparations for this year\'s [_Advent of Code_].\\n\\n\x3c!--truncate--\x3e\\n\\n## Choosing a language\\n\\nWhen choosing a language for AoC, you usually want a language that gives you a\\nquick feedback which allows you to iterate quickly to the solution of the puzzle.\\nOne of the most common choices is Python, many people also use JavaScript or Ruby.\\n\\nGiven the competitive nature of the AoC and popularity among competitive programming,\\nC++ might be also a very good choice. Only if you are familiar with it, I guess\u2026\\n\\nIf you want a challenge, you might also choose to rotate the languages each day.\\nThough I prefer to use only one language.\\n\\nFor this year I have been deciding between _Rust_, _C++_ and _Pascal_ or _Ada_.\\n\\nI have tried Rust last year and have survived with it for 3 days and then gave\\nup and switched to _Kotlin_, which was pretty good given it is \u201cJava undercover\u201d.\\nI pretty much like the ideas behind Rust, I am not sure about the whole cult and\\nimplementation of those ideas though. After some years with C/C++, I would say\\nthat Rust feels _too safe_ for my taste and tries to \u201c_punish me_\u201d even for the\\nmost trivial things.\\n\\nC++ is a very robust, but also comes with a wide variety of options providing you\\nthe ability to shoot yourself in the leg. I have tried to solve few days of previous\\nAdvent of Code events, it was _relatively easy_ to solve the problems in C++, given\\nthat I do not admit writing my own iterator for `enumerate`\u2026\\n\\nPascal or Ada were meme choices :) Ada is heavily inspired by Pascal and has a\\npretty nice standard library that offers enough to be able to quickly solve some\\nproblems in it. However the toolkit is questionable :/\\n\\n## Choosing libraries\\n\\n## Preparations for Rust\\n\\nAll of the sources, later on including solutions, can be found at my\\n[GitLab].\\n\\n### Toolkit\\n\\nSince we are using Rust, we are going to use a [Cargo] and more than likely VSCode\\nwith [`rust-analyzer`]. Because of my choice of libraries, we will also introduce\\na `.envrc` file that can be used by [`direnv`], which allows you to set specific\\nenvironment variables when you enter a directory. In our case, we will use\\n\\n```bash\\n# to show nice backtrace when using the color-eyre\\nexport RUST_BACKTRACE=1\\n\\n# to catch logs generated by tracing\\nexport RUST_LOG=trace\\n```\\n\\nAnd for the one of the most obnoxious things ever, we will use a script to download\\nthe inputs instead of \u201c_clicking, opening and copying to a file_\u201d[^1]. There is\\nno need to be _fancy_, so we will adjust Python script by Martin[^2].\\n\\n```py\\n#!/usr/bin/env python3\\n\\nimport datetime\\nimport yaml\\nimport requests\\nimport sys\\n\\n\\ndef load_config():\\n with open(\\"env.yaml\\", \\"r\\") as f:\\n js = yaml.load(f, Loader=yaml.Loader)\\n return js[\\"session\\"], js[\\"year\\"]\\n\\n\\ndef get_input(session, year, day):\\n return requests.get(\\n f\\"https://adventofcode.com/{year}/day/{day}/input\\",\\n cookies={\\"session\\": session},\\n headers={\\n \\"User-Agent\\": \\"{repo} by {mail}\\".format(\\n repo=\\"gitlab.com/mfocko/advent-of-code-2022\\",\\n mail=\\"me@mfocko.xyz\\",\\n )\\n },\\n ).content.decode(\\"utf-8\\")\\n\\n\\ndef main():\\n day = datetime.datetime.now().day\\n if len(sys.argv) == 2:\\n day = sys.argv[1]\\n\\n session, year = load_config()\\n problem_input = get_input(session, year, day)\\n\\n with open(f\\"./inputs/day{day:>02}.txt\\", \\"w\\") as f:\\n f.write(problem_input)\\n\\n\\nif __name__ == \\"__main__\\":\\n main()\\n```\\n\\nIf the script is called without any arguments, it will deduce the day from the\\nsystem, so we do not need to change the day every morning. It also requires a\\nconfiguration file:\\n\\n```yaml\\n# env.yaml\\nsession: \u2039your session cookie\u203a\\nyear: 2022\\n```\\n\\n### Libraries\\n\\nLooking at the list of the libraries, I have chosen \u201ca lot\u201d of them. Let\'s walk\\nthrough each of them.\\n\\n[`tracing`] and [`tracing-subscriber`] are the crates that can be used for tracing\\nand logging of your Rust programs, there are also other crates that can help you\\nwith providing backtrace to the Sentry in case you have deployed your application\\nsomewhere and you want to watch over it. In our use case we will just utilize the\\nmacros for debugging in the terminal.\\n\\n[`thiserror`], [`anyhow`] and [`color-eyre`] are used for error reporting.\\n`thiserror` is a very good choice for libraries, cause it extends the `Error`\\nfrom the `std` and allows you to create more convenient error types. Next is\\n`anyhow` which kinda builds on top of the `thiserror` and provides you with simpler\\nerror handling in binaries[^3]. And finally we have `color-eyre` which, as I found\\nout later, is a colorful (_wink wink_) extension of `eyre` which is fork of `anyhow`\\nwhile supporting customized reports.\\n\\nIn the end I have decided to remove `thiserror` and `anyhow`, since first one is\\nsuitable for libraries and the latter was basically fully replaced by `{color-,}eyre`.\\n\\n[`regex`] and [`lazy_static`] are a very good and also, I hope, self-explanatory\\ncombination. `lazy_static` allows you to have static variables that must be initialized\\nduring runtime.\\n\\n[`itertools`] provides some nice extensions to the iterators from the `std`.\\n\\n### My own \u201clibrary\u201d\\n\\nWhen creating the crate for this year\'s Advent of Code, I have chosen a library\\ntype. Even though standard library is huge, some things might not be included and\\nalso we can follow _KISS_. I have 2 modules that my \u201clibrary\u201d exports, one for\\nparsing and one for 2D vector (that gets used quite often during Advent of Code).\\n\\nKey part is, of course, processing the input and my library exports following\\nfunctions that get used a lot:\\n\\n```rust\\n/// Reads file to the string.\\npub fn file_to_string>(pathname: P) -> String;\\n\\n/// Reads file and returns it as a vector of characters.\\npub fn file_to_chars>(pathname: P) -> Vec;\\n\\n/// Reads file and returns a vector of parsed structures. Expects each structure\\n/// on its own line in the file. And `T` needs to implement `FromStr` trait.\\npub fn file_to_structs, T: FromStr>(pathname: P) -> Vec\\nwhere\\n ::Err: Debug;\\n\\n/// Converts iterator over strings to a vector of parsed structures. `T` needs\\n/// to implement `FromStr` trait and its error must derive `Debug` trait.\\npub fn strings_to_structs(\\n iter: impl Iterator\\n) -> Vec\\nwhere\\n ::Err: std::fmt::Debug,\\n U: Deref;\\n\\n/// Reads file and returns it as a vector of its lines.\\npub fn file_to_lines>(pathname: P) -> Vec;\\n```\\n\\nAs for the vector, I went with a rather simple implementation that allows only\\naddition of the vectors for now and accessing the elements via functions `x()`\\nand `y()`. Also the vector is generic, so we can use it with any numeric type we\\nneed.\\n\\n### Skeleton\\n\\nWe can also prepare a template to quickly bootstrap each of the days. We know\\nthat each puzzle has 2 parts, which means that we can start with 2 functions that\\nwill solve them.\\n\\n```rust\\nfn part1(input: &Input) -> Output {\\n todo!()\\n}\\n\\nfn part2(input: &Input) -> Output {\\n todo!()\\n}\\n```\\n\\nBoth functions take reference to the input and return some output (in majority\\nof puzzles, it is the same type). `todo!()` can be used as a nice placeholder,\\nit also causes a panic when reached and we could also provide some string with\\nan explanation, e.g. `todo!(\\"part 1\\")`. We have not given functions a specific\\ntype and to avoid as much copy-paste as possible, we will introduce type aliases.\\n\\n```rust\\ntype Input = String;\\ntype Output = i32;\\n```\\n\\n:::tip\\n\\nThis allows us to quickly adjust the types only in one place without the need to\\ndo _regex-replace_ or replace them manually.\\n\\n:::\\n\\nFor each day we get a personalized input that is provided as a text file. Almost\\nall the time, we would like to get some structured type out of that input, and\\ntherefore it makes sense to introduce a new function that will provide the parsing\\nof the input.\\n\\n```rust\\nfn parse_input(path: &str) -> Input {\\n todo!()\\n}\\n```\\n\\nThis \u201cparser\u201d will take a path to the file, just in case we would like to run the\\nsample instead of input.\\n\\nOK, so now we can write a `main` function that will take all of the pieces and\\nrun them.\\n\\n```rust\\nfn main() {\\n let input = parse_input(\\"inputs/dayXX.txt\\");\\n\\n println!(\\"Part 1: {}\\", part_1(&input));\\n println!(\\"Part 2: {}\\", part_2(&input));\\n}\\n```\\n\\nThis would definitely do :) But we have installed a few libraries and we want to\\nuse them. In this part we are going to utilize _[`tracing`]_ (for tracing, duh\u2026)\\nand _[`color-eyre`]_ (for better error reporting, e.g. from parsing).\\n\\n```rust\\nfn main() -> Result<()> {\\n tracing_subscriber::fmt()\\n .with_env_filter(EnvFilter::from_default_env())\\n .with_target(false)\\n .with_file(true)\\n .with_line_number(true)\\n .without_time()\\n .compact()\\n .init();\\n color_eyre::install()?;\\n\\n let input = parse_input(\\"inputs/dayXX.txt\\");\\n\\n info!(\\"Part 1: {}\\", part_1(&input));\\n info!(\\"Part 2: {}\\", part_2(&input));\\n\\n Ok(())\\n}\\n```\\n\\nThe first statement will set up tracing and configure it to print out the logs to\\nterminal, based on the environment variable. We also change the formatting a bit,\\nsince we do not need all the _fancy_ features of the logger. Pure initialization\\nwould get us logs like this:\\n\\n```\\n2022-12-11T19:53:19.975343Z INFO day01: Part 1: 0\\n```\\n\\nHowever after running that command, we will get the following:\\n\\n```\\n INFO src/bin/day01.rs:35: Part 1: 0\\n```\\n\\nAnd the `color_eyre::install()?` is quite straightforward. We just initialize the\\nerror reporting by _color eyre_.\\n\\n:::caution\\n\\nNotice that we had to add `Ok(())` to the end of the function and adjust the\\nreturn type of the `main` to `Result<()>`. It is caused by the _color eyre_ that\\ncan be installed only once and therefore it can fail, that is how we got the `?`\\nat the end of the `::install` which _unwraps_ the **\xbbresult\xab** of the installation.\\n\\n:::\\n\\nOverall we will get to a template like this:\\n\\n```rust\\nuse aoc_2022::*;\\n\\nuse color_eyre::eyre::Result;\\nuse tracing::info;\\nuse tracing_subscriber::EnvFilter;\\n\\ntype Input = String;\\ntype Output = i32;\\n\\nfn parse_input(path: &str) -> Input {\\n todo!()\\n}\\n\\nfn part1(input: &Input) -> Output {\\n todo!()\\n}\\n\\nfn part2(input: &Input) -> Output {\\n todo!()\\n}\\n\\nfn main() -> Result<()> {\\n tracing_subscriber::fmt()\\n .with_env_filter(EnvFilter::from_default_env())\\n .with_target(false)\\n .with_file(true)\\n .with_line_number(true)\\n .without_time()\\n .compact()\\n .init();\\n color_eyre::install()?;\\n\\n let input = parse_input(\\"inputs/dayXX.txt\\");\\n\\n info!(\\"Part 1: {}\\", part_1(&input));\\n info!(\\"Part 2: {}\\", part_2(&input));\\n\\n Ok(())\\n}\\n```\\n\\n[^1]:\\n Copy-pasting might be a relaxing thing to do, but you can also discover\\n nasty stuff about your PC. See [this Reddit post and the comment].\\n\\n[^2]: [GitHub profile](https://github.com/martinjonas)\\n[^3]:\\n Even though you can use it even for libraries, but handling errors from\\n libraries using `anyhow` is nasty\u2026 You will be the stinky one ;)\\n\\n[_advent of code_]: https://adventofcode.com\\n[gitlab]: https://gitlab.com/mfocko/advent-of-code-2022\\n[cargo]: https://doc.rust-lang.org/cargo/\\n[`rust-analyzer`]: https://rust-analyzer.github.io/\\n[`direnv`]: https://direnv.net/\\n[`tracing`]: https://crates.io/crates/tracing\\n[`tracing-subscriber`]: https://crates.io/crates/tracing-subscriber\\n[`thiserror`]: https://crates.io/crates/thiserror\\n[`anyhow`]: https://crates.io/crates/anyhow\\n[`color-eyre`]: https://crates.io/crates/color-eyre\\n[`regex`]: https://crates.io/crates/regex\\n[`lazy_static`]: https://crates.io/crates/lazy_static\\n[`itertools`]: https://crates.io/crates/itertools\\n[this reddit post and the comment]: https://www.reddit.com/r/adventofcode/comments/zb98pn/comment/iyq0ono"}]}')}}]); \ No newline at end of file diff --git a/assets/js/4200b1a9.d9f16397.js b/assets/js/4200b1a9.d9f16397.js deleted file mode 100644 index c56f9ac..0000000 --- a/assets/js/4200b1a9.d9f16397.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[866],{24612:e=>{e.exports=JSON.parse('{"blogPosts":[{"id":"/2024/02/07/lts-distros","metadata":{"permalink":"/blog/2024/02/07/lts-distros","editUrl":"https://github.com/mfocko/blog/tree/main/blog/2024-02-07-lts-distros.md","source":"@site/blog/2024-02-07-lts-distros.md","title":"LTS distributions","description":"Shower thoughts on the LTS Linux distributions.\\n","date":"2024-02-07T00:00:00.000Z","formattedDate":"February 7, 2024","tags":[{"label":"lts","permalink":"/blog/tags/lts"},{"label":"linux distributions","permalink":"/blog/tags/linux-distributions"},{"label":"support","permalink":"/blog/tags/support"},{"label":"paywall","permalink":"/blog/tags/paywall"}],"readingTime":14.515,"hasTruncateMarker":true,"authors":[{"name":"Matej Focko","email":"me+blog@mfocko.xyz","title":"a.k.a. small Fedora maintainer","url":"https://gitlab.com/mfocko","imageURL":"https://github.com/mfocko.png","key":"mf"}],"frontMatter":{"title":"LTS distributions","description":"Shower thoughts on the LTS Linux distributions.\\n","date":"2024-02-07T00:00:00.000Z","authors":[{"key":"mf","title":"a.k.a. small Fedora maintainer"}],"tags":["lts","linux distributions","support","paywall"],"hide_table_of_contents":false},"unlisted":false,"nextItem":{"title":"Mixed feelings on Rust","permalink":"/blog/2024/01/28/rust-opinion"}},"content":"Linux distributions are a common choice for running the servers. There\'s a wide\\nvariety of distributions, but on the servers majority is made by only a few.\\n\\nSome corporations also profit from the support of the \u201cbig\u201d distributions. Let\'s\\ndive into the pros, cons and peculiarities of such _business_.\\n\\nThis post is inspired/triggered by the following Mastodon post:\\n[![Mastodon post about Ubuntu Pro](https://cdn.pawb.social/mastodon-fe/media_attachments/files/111/864/549/106/543/961/original/f4dac207fb93ffa8.png)](https://hackers.town/@antijingoist/111864760073049505)\\n\\n\x3c!--truncate--\x3e\\n\\n:::caution Disclaimer\\n\\nYou may take my opinion with a grain of salt, since I\'m affiliated with Red Hat,\\nbut at the same time I\'ve also seen the other side of the fence, so I know how\\nit works from the perspective of the provider/maintainer.\\n\\n:::\\n\\n:::tip\\n\\nIf you are not very oriented in the matters of Linux distributions and\\nmaintaining of packages, I suggest looking at the [glossary](#glossary) at the\\nend to have a better grasp of the terms that are used throughout the post.\\n\\n:::\\n\\n## Point of linux distributions\\n\\nFirst thing I\'d like to point out is the point of the Linux distributions. What\\nbenefit do they provide? And why there are so many of them\u2026\\n\\nAs it has been brought up many times by the _rms_[^1], Linux by itself is not\\nenough, it\'s just the kernel that does the underlying work. We need more\\nsoftware to utilize the hardware. That\'s the gap that Linux distributions bridge\\nby providing the Linux and much more other software that we need.\\n\\nEach distribution is unique in its own way. Some prefer different ways of\\nhandling the software (like Gentoo that allows you to compile it yourself) and\\nothers stable releases of software (like Debian).\\n\\nIn the end it mostly boils down to the packaging. I, as a user, want to do\\nsomething like\\n\\n```\\n$ sudo dnf5 install firefox\\n```\\n\\nand not bother about anything else. I don\'t want to open browser to look the\\nthing up, download it and then click mindlessly 500\xd7 \u201cNext\u201d. I just want to run\\none command and when the maintainers decide it\'s time to move on, another one to\\nupgrade the software to the newer version.\\n\\nOf course, for some use cases you want to minimize the latter. And even make\\nsure that it\'s safe to do it when you need to. You don\'t want to break your\\nproduction deployment just because someone decided it\'s time to push something\\nout.\\n\\nThat\'s when the _maintainers_ come in. They take upon themselves the\\nresponsibility of maintaining the packages. If you\'ve ever used the Debian, you\\nknow very well how _old_ the software is, but that\'s what you might need for\\nyour servers.\\n\\n## Pain of packaging\\n\\nPackaging software _is not_ cost-free. You may as well have 80 % of packages\\nthat don\'t need much care and it\'s rather easy to push them forward, but those\\nremaining, which are complicated and raise issues regularly, will make it up and\\ntake a lot of time and also pain.\\n\\nLibraries are the most common example that might not need much work to be done.\\nOn the other hand, Linux kernel itself is a rather complicated machinery that\\nis patched **a lot** and its build process is not simple either.\\n\\nEven if you consider just those _easily-maintainble_ packages, the process can\\nbe tedious, boring and overall time consuming.\\n\\n:::tip Shameless RHEL-based ecosystem plug\\n\\n[Packit] can help tremendously with the _easily-maintainable_ packages, since it\\n**can** be automated.\\n\\n:::\\n\\n### Packaging whole ecosystems\\n\\nNow it\'s time to talk about whole ecosystems that have some kind of a packaging\\nby themselves. Yes, I mean Python (with its continuous stream of different\\npackage managers), Rust, Go, etc.\\n\\nWhole point of packaging is to have some form of _gating_. In other words, you\\nwant some kind of _quality control_ when pushing changes into the Linux distros.\\n\\nIf you want to package some tool (or even library) from the aforementioned\\necosystems, you need to package all of the dependencies to make sure something\\ndoesn\'t get updated in the meantime (and also that you can safely reproduce the\\nbuilds, if need be).\\n\\nI\'ve tried to package some utilities for EPEL both in Rust and Go. Dependencies\\nform a DAG[^2] and in case of Rust, it\'s _very_ similar to the way `npm` does\\nits packaging.\\n\\n:::danger Spoiler alert\\n\\nYou get a lot of dependencies. And since it\'s a tree of dependencies, there may\\nbe **a lot** of them.\\n\\n:::\\n\\nI have no clue how do the Rust maintainers operate, but I\'m tipping my fedora in\\ntheir direction, since it must be a _pain in the ass_.\\n\\n## Paid distributions\\n\\nYou can find few Linux distributions that are \u201cpaid\u201d. I\'m very well aware of the\\nfact I\'ve used quotes around the word, cause it\'s not that easy and not even\\nsame for all of the distributions that involve some kind of a payment.\\n\\nOne of the first non-free distributions I\'ve come into contact was _[Zorin OS]_\\nwhich basically tries to be the best _transition_ solution when moving away from\\nthe Windows or macOS. If you have a look at the _perks_ of its _Pro_ version\\nthat\'s paid, you may as well decide they are rather questionable\u2026\\n\\nIt\'s time to move into the _Ubuntu Pro_, _RHEL_ and _SLE_ territory. What\'s the\\npoint of those? They definitely offer different kind of, let\'s say,\\n_non-free experience_.\\n\\nWith those you are paying mainly for the support and bug/security patches.\\n\\n:::tip Fun fact\\n\\nThere\'s no mention of any kind of support on the Zorin page\u2026 Apart from the fact\\nthat _you are supporting_ the Zorin development.\\n\\n:::\\n\\n## Repository structure\\n\\nAs I have mentioned above, the three _services_[^3] I mentioned are providing\\nsupport with regards to bugs and security vulnerabilites. Therefore it makes\\nsense to have some kind of a process in place when you\'re pushing changes\\n(either updates, patches or _security_ patches) to the distribution. And yes,\\nthese processes are _in place_.\\n\\nIf you think about the amount of packages that is present in the community\\ndistributions like _archLinux_ (14,830 packages) or _Fedora_ (74,309 packages),\\nit is safe to come to a conclusion that _there\'s no way_ to support all of them.\\n\\n:::tip archLinux\\n\\nIt may seem that archLinux contains rather small set of packages, but one of the\\n_killer features_ of archLinux lies in the AUR (archLinux User Repository) where\\nyou can find additional **93,283** packages.\\n\\n:::\\n\\nThat\'s why the Linux distributions have some structure to their repositories\\nthat contain packages. The way you go around this is rather simple, you choose\\nsome set of _critical_ packages that you guarantee support for (like Linux\\nkernel, openSSL, etc.) and maintain those with all the QA processes in place.\\n\\n:::caution Unpopular opinion\\n\\nThis is also one of the reasons why I\'m quite against packaging anything and\\neverything into the Linux distribution. In my opinion it is impossible to\\n**properly** maintain **huge** set of packages and enforce some kind of\\n**quality control**.\\n\\n:::\\n\\n### Ubuntu\\n\\nUbuntu has pretty granular structure of their repositories, namely:\\n\\n- `main` containing the \u201ccore\u201d of the Ubuntu that is maintained by the Canonical,\\n- `universe` containing literally the \u201cuniverse\u201d, packages that everyone likes,\\n but they\'re not crucial, this repo is maintained mostly by the community,\\n- `multiverse` containing packages with some license or copyright issues, and\\n- `restricted` containing _proprietary_ packages like nvidia drivers and such.\\n\\nBy briefly checking my Ubuntu 23.10 installation, here are stats of packages in\\ntheir respective repositories:\\n\\n- `main` with 6,128 packages,\\n- `universe` with 63,380 packages,\\n- `multiverse` with 997 packages, and finally\\n- `restricted` with 784 packages.\\n\\nAs you can see, if we sum them up, they are relatively similar to the Fedora\\nnumbers.\\n\\n### CentOS\\n\\nCentOS on the other hand has a bit simpler structure with BaseOS for the base\\nand AppStream for additional packages:\\n\\n- `baseos` with 1,058 packages,\\n- `appstream` with 5,646 packages, and\\n- `extras-common` with 42 packages.\\n\\nOverall they make up the similar number as the Ubuntu\'s `main` repository. And\\nyou can also notice that there are no additional repositories.\\n\\n:::tip\\n\\nThere\'s also a CRB (CodeReady Builder) repository with dev packages like headers\\nand such.\\n\\nAnd you can also enable EPEL (Extra Packages for Enterprise Linux) which is\\ncommunity-supported and provides another 19,903 packages.\\n\\n:::\\n\\n## Ubuntu Pro\\n\\nNow it\'s time to get back to the Ubuntu Pro. There are multiple points that need\\nto be taken in account to be either positive or negative about it\u2026\\n\\nWe can start with the way Ubuntu is released and maintained. Ubuntu has regular\\n6-month release cycle and biannual LTS release. Releases are normally supported\\nfor 9 months with the exception of the LTS releases being supported for 5 years.\\n\\nIf you check out the _[Ubuntu Pro]_ website, you can find the following\\nstatement:\\n\\n> **Ubuntu Pro**\\n>\\n> The most comprehensive subscription for open-source software security\\n>\\n> 30-day trial for enterprises. Always free for personal use.\\n\\n:::tip Personal use\\n\\nUbuntu Pro for _personal use_ consists of 5 installations and in case of the\\ncommunity _ambassadors_ 50.\\n\\n:::\\n\\nOverall if you try to find what is included in the Ubuntu Pro:\\n\\n- high and critical patches,\\n- 10 years of maintenance, and\\n- (optional) 24/7 enterprise-grade support.\\n\\nIf we get back to the screenshot all the way at the beginning of the post:\\n[![Mastodon post about Ubuntu Pro](https://cdn.pawb.social/mastodon-fe/media_attachments/files/111/864/549/106/543/961/original/f4dac207fb93ffa8.png)](https://hackers.town/@antijingoist/111864760073049505)\\n\\nand try to look up to which repository the packages mentioned in the screenshot\\nbelong, we will find out that they belong to `universe` repository which is\\nmaintained by the community. Not to mention nature of the packages: multimedia.\\n\\nYou may think about this as a scam, but considering repository consisting of 70k\\npackages, it is not an easy task to do. And with LTS releases we\'re talking\\nabout 5+ years of support.\\n\\n:::info Fedora\\n\\nTry to compare this state to Fedora. It also has a 6-month release cycle, but\\nthere are no LTS releases and each release is supported only for a year.\\n\\n:::\\n\\nCommon strategy, at this point, is to pull out the _open-source_. Yes, we are\\nstill dealing with the open-source, but keep in mind that you\'re trying to patch\\nsome issue in a version that\'s 5 years old, upstream definitely doesn\'t care\\nanymore[^4], the development didn\'t stop 5 years ago, it\'s going on and fixing\\nthis issue in a release from 5 years is not the same as fixing it in the current\\nrelease. At this point, if you are paying for such support, you are actually\\npaying for someone to do _software archaeology_ which **can be** _non-trivial_\\nto do.\\n\\nIn the case of Ubuntu Pro we\'re talking about community support and best-effort\\nsupport by Canonical for the paying customers. And that makes sense to me,\\nrunning LTS distro for 5+ years on a desktop seems like an odd choice, even\\nwith the help of _[podman]_ and _[distrobox]_ or _[toolbx]_ that allow us to use\\nstable or LTS distro as a base and containerized development environments on top\\nof that.\\n\\n## RHEL ecosystem\\n\\nRHEL ecosystem is much more complicated in this matter. However it\'s very\\nsimilar to the way SUSE operates with few exceptions.\\n\\nYou can see a flow diagram here:\\n\\n```mermaid\\nflowchart LR;\\n U[upstream] --\x3e FR[Fedora Rawhide];\\n FR --\x3e F[Fedora release];\\n F --\x3e C[CentOS Stream];\\n C --\x3e R[RHEL];\\n```\\n\\nKey things to take and not to take from the flow diagram:\\n\\n- getting from one upstream to its respective downstream is not as simple as the\\n presence of an arrow and it\'s not the same process for all of them\\n- lengths of the arrows are not proportional, specifically:\\n - Fedora Rawhide is _supposed to_ consume updates as soon as possible,\\n - depending on the decision of the maintainer they can, but _don\'t have to_ be\\n included in the currently supported Fedora releases (you can take [Emacs] as\\n an example of such package), but Rawhide eventually becomes the next Fedora\\n release,\\n - CentOS Stream gets branched off a specific Fedora release, and then\\n - ultimately CentOS Stream becomes the next **minor** release of RHEL.\\n- this diagram is simplified by **a lot**\\n\\n:::tip SUSE flow for comparison\\n\\nI\'ll also include a SUSE flow, so you can compare:\\n\\n```mermaid\\nflowchart LR;\\n U[upstream] --\x3e T[openSUSE Tumbleweed];\\n T --\x3e L[openSUSE Leap];\\n L --\x3e S[SUSE Linux Enterprise];\\n S --\x3e L;\\n```\\n\\nYou can notice, as opposed to the RHEL ecosystem, some changes are being\\nbackported to the openSUSE Leap.\\n\\nHowever this is subject to change as there is a new [ALP] project arising which\\nis, more than likely, going to replace the Leap.\\n\\n:::\\n\\n### Change in the model\\n\\nThe flow I\'ve shown above is in effect since late \u201820 and early \u201821. I hope you\\ncan see that it is quite similar to the way SUSE operates too. Before late \u201820\\nthe flow was following:\\n\\n```mermaid\\nflowchart LR;\\n U[upstream] --\x3e FR[Fedora Rawhide];\\n FR --\x3e F[Fedora release];\\n F --\x3e R[RHEL];\\n R --- C[CentOS];\\n```\\n\\nCentOS was the last distribution in that \u201cchain\u201d. This provides some benefits\\nand some negatives.\\n\\n#### Before the change\\n\\nFrom the point of a developer, unless you have some kind of an early access to\\nRHEL, you don\'t see the changes until they land and are already released. This\\nimpairs your ability to test and verify your software before shipping it to your\\nclients that use RHEL.\\n\\nFrom the point of a user, there is one positive, you basically get \u201cfree RHEL\u201d\\nwithout the support. This also allowed you to report bugs against the RHEL,\\nsince they were 1:1 distros (minus the branding and support). So you\'d\\ntechnically get RHEL free of charge.\\n\\nBenefit of such project, except for the cost, is questionable. The main issue,\\nwhich actually became even more apparent after changing the flow, is someone\\nelse repackaging your own product and selling it again.\\n\\n#### After the change\\n\\nFirst of all, the current flow counters the issue mentioned above. You can test\\nyour projects against the _next minor RHEL release_. CentOS Stream is free, so\\nyou can freely incorporate it into your CI pipelines.\\n\\n:::tip Shameless plug pt. 2\\n\\nAgain, [Packit] can help you on upstream to verify that you\'re not breaking your\\nRPM builds and on top of that you can also use [Testing Farm] to run tests on a\\nspecific Fedora or CentOS Stream releases.\\n\\n> Green tests may not be green everywhere and catching such issues as soon as\\n> possible costs much less than catching them further down the chain.\\n\\n:::\\n\\nThere are many people thinking that RHEL has become closed-source. It is not.\\nThe development happens _out in the open_, it\'s more open that it was before.\\nHowever with the cost of not getting the exact same thing for free. You can get\\nthe next minor RHEL, not the same that\'s normally paid for. [Packit] is an\\nexample of a service that is deployed on the CentOS 9 Stream and even used to be\\ndeployed on Fedora, but the regular 6-month release cycle caused some minor\\nissues here and there.\\n\\n_Production-ready_ is something that heavily depends on the context\u2026\\n\\n:::tip Free \u201cclones\u201d\\n\\nAfter this change so-called _free \u201cclones\u201d_ emerged. I have to admit that in\\ncase of _[AlmaLinux]_ I can see some benefits e.g., pushing for live images and\\nsupport of various desktop environments, Raspberry Pi support or even WSL images\\nbeing present in the M$ Store and easy to install.\\n\\n:::\\n\\n## Open-source and paid support\\n\\nOverall I don\'t think that paying for the support of 5 years old _non-critical_\\npackages is going against the open-source. It is a non-trivial work that, in\\nmajority of cases, cannot be included in the upstream, therefore the benefit is\\nreapt only by the paying customers. I have to admit that in the case of the\\nUbuntu Pro it may seem a bit weird (hiding patches behind the paywall). However\\nwe\'re still talking about rather big set of packages that will affect a minority\\nof server workloads, if any.\\n\\n## Glossary\\n\\n- _rolling release_ - continuously released without \u201csignificant milestones\u201d\\n\\n :::tip\\n\\n As an example of rolling distribution you can take archLinux, openSUSE\\n Tumbleweed, Fedora Rawhide, or even CentOS 9 Stream.\\n\\n As en example of **not** rolling distribution you can take Ubuntu, openSUSE\\n Leap or Fedora.\\n\\n :::\\n\\n- _bleeding edge_ - contains the latest versions as they are released on the\\n upstream\\n\\n :::tip\\n\\n As an example you can take archLinux, openSUSE Tumbleweed or Fedora Rawhide.\\n You can also notice how common it is to combine _rolling release_ with\\n _bleeding edge_.\\n\\n :::\\n\\n- _upstream_ & _downstream_\\n\\n You\'re most likely to meet these terms in the meaning of upstream being the\\n project itself and downstream being the packaging of said project in some\\n distribution.\\n\\n However this can also apply to distributions like _openSUSE Tumbleweed_ with\\n _openSUSE Leap_, _Fedora_ with _CentOS Stream_, or even _CentOS Stream_ with\\n _RHEL_. This basically means that the packages/software is being released into\\n the upstream (Tumbleweed, Fedora, or even CentOS) and then after being tested\\n is taken further down into their respective downstreams (Leap, CentOS, RHEL).\\n\\n[almalinux]: https://almalinux.org/\\n[alp]: https://susealp.io/\\n[distrobox]: https://distrobox.it/\\n[emacs]: https://src.fedoraproject.org/rpms/emacs/\\n[packit]: https://packit.dev/\\n[podman]: https://podman.io/\\n[testing farm]: https://docs.testing-farm.io/Testing%20Farm/0.1/index.html\\n[toolbx]: https://containertoolbx.org/\\n[ubuntu pro]: https://ubuntu.com/pro/\\n[zorin os]: https://zorin.com/os/pro/\\n\\n[^1]: Richard Stallman\\n[^2]: directed acyclic graph\\n[^3]:\\n Ubuntu Pro is technically a service whereas the RHEL and SLE are distros\\n with the support included.\\n\\n[^4]:\\n There are upstream projects that keep LTS branches, such as Linux kernel,\\n but even in the case of the kernel itself, they\'re planning on ending it,\\n since the cost outweighs the benefits at this point."},{"id":"/2024/01/28/rust-opinion","metadata":{"permalink":"/blog/2024/01/28/rust-opinion","editUrl":"https://github.com/mfocko/blog/tree/main/blog/2024-01-28-rust-opinion.md","source":"@site/blog/2024-01-28-rust-opinion.md","title":"Mixed feelings on Rust","description":"Discussing my mixed feelings about the Rust language.\\n","date":"2024-01-28T00:00:00.000Z","formattedDate":"January 28, 2024","tags":[{"label":"rust","permalink":"/blog/tags/rust"},{"label":"memory safety","permalink":"/blog/tags/memory-safety"},{"label":"cult","permalink":"/blog/tags/cult"},{"label":"hype","permalink":"/blog/tags/hype"}],"readingTime":15.395,"hasTruncateMarker":true,"authors":[{"name":"Matej Focko","email":"me+blog@mfocko.xyz","title":"a.k.a. passionate language hater","url":"https://gitlab.com/mfocko","imageURL":"https://github.com/mfocko.png","key":"mf"}],"frontMatter":{"title":"Mixed feelings on Rust","description":"Discussing my mixed feelings about the Rust language.\\n","date":"2024-01-28T00:00:00.000Z","authors":[{"key":"mf","title":"a.k.a. passionate language hater"}],"tags":["rust","memory safety","cult","hype"],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"LTS distributions","permalink":"/blog/2024/02/07/lts-distros"},"nextItem":{"title":"How can Copr help with broken dependencies","permalink":"/blog/2023/08/02/copr"}},"content":"Rust has become a rather popular language these days. I\'ve managed to get my\\nhands dirty with it during _[Advent of Code]_ \u201822 and partially \u201823. I\'ve also\\nused it for few rounds of _[Codeforces]_ and I have to try very hard to maintain\\nsome variety of languages for LeetCode challenges along with the Rust. I\'ll\\ndisclaim up front that I won\'t be only positive, since this post is a result of\\nmultiple discussions about Rust and I stand by\\n_\u201cAll that glitters is not gold\u201d_, so if you can\'t stand your favorite language\\nbeing criticized in any way, don\'t even proceed. :wink:\\n\\n\x3c!--truncate--\x3e\\n\\n## Memory safety\\n\\nI\'ll start by kicking the biggest benefit of the language, the memory safety.\\nLet\'s be honest here, majority of the checks rely on the static analysis, cause\\nyou can\'t do anything else during the compile-time, right? Therefore we can\\nbasically say that we are relying on the compiler to \u201csolve\u201d all of our issues.\\n\\n:::warning\\n\\nI\'m not doubting the fact that compiler can prevent **a lot** of the memory\\nerrors, I\'m just saying it\'s not realistic to cover **everything**.\\n\\n:::\\n\\n### Compiler\\n\\nI guess we can safely[^2] agree on the fact that we 100% rely on the compiler to\\n_have our back_. Is the compiler bug-free? I doubt it. This is not meant in an\\noffensive way to the Rust compiler developers, but we need to be realistic here.\\nIt\'s a compiler, even older and larger projects like _gcc_ or _llvm_ can\'t avoid\\nbugs to appear.\\n\\nWhen I was trying out Rust for some of the LeetCode challenges I\'ve stumbled\\nupon the following warning:\\n![Example of a compiler bug](https://i.imgur.com/NfPLF6o.png)\\n\\n:::danger [Issue](https://github.com/rust-lang/rust/issues/59159)\\n\\nThe issue here comes from the fact that we have 2 simultaneous references to the\\nsame memory (one is mutable and one immutable). If you cannot think of any way\\nthis can break, I\'ll give you a rather simple example from C++ where this could\\ncause an issue.\\n\\nImagine a function that has some complex object and also calls a coroutine which\\nutilizes read-only reference to that object. When the coroutine suspends, the\\ncaller can modify the object. This can break the integrity of data read by the\\ncoroutine.\\n\\n- Yes, this **can** cause a memory error.\\n- Yes, this **hasn\'t** been handled until someone noticed it.\\n\\nFixing this bug is not backwards compatible, cause you\'re covering a case that\\nhasn\'t been covered before.\\n\\n:::\\n\\n### Enforcing the safety\\n\\nOne of the ways Rust enforces the safety is by restricting what you can do, like\\nthe example above. Aforementioned issue _can_ happen, but **doesn\'t have to**.\\nRule of the thumb in the Rust compiler is to _\u201cblock\u201d_ anything that can be an\\nissue, static analysis can\'t do much more, it cannot decide whether it\'s safe to\\ndo it or not.\\n\\nSatisfying the Rust compiler is sometimes a brutal pain in the ass, because you\\ncannot do things like you\'re used to, you need to work around them _somehow_.\\n\\n:::tip\\n\\nKey difference between Rust and C or C++ lies in the fact that Rust chooses to\\n_ban_ all \u201cpotentially offensive\u201d actions, C and C++ _relies_ on **you** to be\\nsure it\'s safe to do.\\n\\n![C++ v. Rust](https://i.imgur.com/0vbkYPp.png)\\n\\n:::\\n\\n### Consequences\\n\\nWhere are we heading with this approach of \u201cif it compiles, it runs\u201d though?\\nIn this aspect I have a rather similar opinion as with regards to the ChatGPT\\nand its derivatives.\\n\\nIf you teach people to 100% depend on the compiler, they will do it, cause it\'s\\n_easy_. All you need to do is make the compiler _shut up_[^3]. Giving up the\\n_intellectual masturbation_ about the memory safety will make you lose your edge\\nover the time. When we get to the point of everyone being in the mindset\\nmentioned above, who\'s going to maintain the compiler? This is the place where\\nyou **need to** think about the memory safety and furthermore in a much more\\ngeneral way than in your own projects, because it is the thing that everyone\\n_blindly believes in_ in the end.\\n\\nI\'m not saying that everyone should give up Rust and think about their memory\\nmanagement and potential memory issues. I\'m just saying that going the easy way\\nwill make people _dull_ and they should think about it anyways, that\'s how the\\nissue above has been discovered. If everyone walked past and didn\'t think about\\nit, no one would discover this issue till it bit them hard.\\n\\n:::tip Standard library\\n\\nEven the standard library is littered with `unsafe` blocks that are prefixed\\nwith comments in style:\\n\\n```rs\\n// SAFETY: \u2026\\n```\\n\\nThe fact that the _casual_ Rust dev doesn\'t have to think much about safety,\\ncause the compiler has their back, doesn\'t mean that the Rust compiler dev\\ndoesn\'t either.\\n\\nI gotta admit that I adopted this concept in other languages (even in Python),\\ncause you can encounter situations where it doesn\'t have to be clear _why_ you\\ncan do _what_ you\'re doing.\\n\\n:::\\n\\n## Development & design\\n\\nDevelopment of Rust is\u2026 very fast. One positive is that they\'re trying to be as\\nbackward compatible as possible at least by verifying against all the published\\ncrates in the process. Of course, you cannot be backward compatible about fixing\\nthe bugs that have been found, but such is life.\\n\\n### Fast development cycle\\n\\nOne of the negatives of the fast development cycle is the fact that they\'re\\nusing the latest features already in the next release of the Rust. Yes, it is\\nsomething that you can use for verifying and testing your own changes, but at\\nthe same time it places a requirement of the latest release to compile the next\\none.\\n\\n:::tip\\n\\nIf you check `gcc` for example, they have a requirement of minimal version of\\ncompiler that you need for the build. Though gcc\'s requirement is not so _needy_\\nas the Rust one.\\n\\n:::\\n\\nOne of the other negatives is the introduction of bugs. If you\'re pushing\\nchanges, somewhat mindlessly, at such a fast pace, it is inevitable to introduce\\na bunch bugs in the process. Checking the GitHub issue tracker with\\n\\n```\\nis:issue is:open label:C-bug label:T-compiler\\n```\\n\\nyields **2,224** open issues at the time of writing this post.\\n\\n### RFCs\\n\\nYou can find **a lot** of RFCs for the Rust. Some of them are more questionable\\nthan the others. Fun thing is that a lot of them make it to the nightly builds,\\nso they can be tested and polished off. Even the questionable ones\u2026 I\'ll leave\\nfew examples for a better understanding.\\n\\nOne of such features is the `do yeet` expression:\\n\\n```rust\\n#![feature(yeet_expr)]\\n\\nfn foo() -> Result {\\n do yeet 4;\\n}\\nassert_eq!(foo(), Err(4));\\n\\nfn bar() -> Option {\\n do yeet;\\n}\\nassert_eq!(bar(), None);\\n```\\n\\nIt allows you to \u201cyeet\u201d the errors out of the functions that return `Result` or\\n`Option`.\\n\\n[One](https://github.com/rust-lang/rfcs/pull/3503) of the more recent ones is\\nthe ability to include Cargo manifests into the sources, so you can do something\\nlike:\\n\\n```rust\\n#!/usr/bin/env cargo\\n---\\n[dependencies]\\nclap = { version = \\"4.2\\", features = [\\"derive\\"] }\\n---\\n\\nuse clap::Parser;\\n\\n#[derive(Parser, Debug)]\\n#[clap(version)]\\nstruct Args {\\n #[clap(short, long, help = \\"Path to config\\")]\\n config: Option,\\n}\\n\\nfn main() {\\n let args = Args::parse();\\n println!(\\"{:?}\\", args);\\n}\\n```\\n\\nI would say you can get almost anything into the language\u2026\\n\\n## Community and hype train\\n\\nRust community is a rather unique thing. A lot of people will hate me for this,\\nbut I can\'t help, but to compare them to _militant vegans_. I\'ll go through some\\nof the things related to it, so I can support my opinion at least.\\n\\n_Rust is the best language._ It is not. There is no best language, each has its\\nown positives and negatives, you need to choose the language that\'s **the most**\\n**suitable for your use case**. There are areas where Rust excels, though I have\\nto admit it\'s very close to being a universal hammer regardless of how suitable\\nit is. There is a very steep learning curve to it, beginnings in Rust are very\\npainful.\\n\\n_Rewrite everything in Rust._ Just no. There are multiple feedbacks on doing\\nrewrites, it is very common to fix _N_ bugs with a rewrite while introducing\\n_N + 1_ other bugs in the process. It doesn\'t solve anything unless there are\\nsome strong reasons to go with it. Majority of such suggested rewrites don\'t\\nhave those reasons though.\\n\\n_Language \u2039x\u203a is bad, though in Rust\u2026_ Cherry-picking one specific pain point of\\none language and reflecting how it is better in other language can go both ways.\\nFor example it is rather easy to pick the limitations imposed by Rust compiler\\nand show how it\'s possible in other languages :man_shrugging:\\n\\nI don\'t mind any of those opinions, you\'re free to have them, as long as you\\ndon\'t rub them in my face which is not the usual case\u2026 This experience makes it\\njust worse for me, part of this post may be also influenced by this fact.\\n\\n### Rust in Linux\\n\\n:::caution\\n\\nAs someone who has seen the way Linux kernel is built in the RHEL ecosystem, how\\ncomplex the whole thing is and how much resources you need to proceed, I have\\nvery strong opinions on this topic.\\n\\n:::\\n\\nIt took years of work to even \u201cincorporate\u201d Rust into the Linux codebase, just\\nto get the \u201cHello World!\u201d. I don\'t have anything against the idea of writing\\ndrivers in the Rust, I bet it can catch a lot of common mistakes, but still\\nintroducing Rust to the kernel is another step to enlarge the monster.\\n\\nI have to admit though that the _Apple GPU_ driver for Linux written in Rust is\\nquite impressive. Apart from that there are not so many benefits, yet\u2026\\n\\n## Packaging\\n\\nI\'ll divide the packaging into the packaging of the language itself and the\\nprograms written in Rust.\\n\\nLet\'s start with the `cargo` itself though. Package managers of the languages\\nusually get a lot of hate (you can take `npm` or `pip` as examples[^1]). If\\nyou\'ve ever tried out Rust, I bet you already know where I\'m going with this.\\nYes, I mean the compilation times, or even Cargo downloading _whole_ index of\\ncrates just so you can update that one dependency (and 3 millions of indirect\\ndeps). When I was doing AoC \u201822 in Rust, I\'ve set up `sccache` right away on the\\nfirst day.\\n\\nLet\'s move to the packaging of the Rust itself, it\'s tedious. Rust has a very\\nfast development cycle and doesn\'t even try to make the builds backward\\ncompatible. If there is a new release of Rust, there is a very high chance that\\nyou cannot build that release with anything other than **the latest** Rust\\nrelease. If you have ever touched the packaging, you know that this is something\\nthat can cause a lot of problems, cause you need the second-to-latest version to\\ncompile the latest version, don\'t forget that this applies inductively\u2026 People\\nrunning _Gentoo_ could tell you a lot about this.\\n\\n:::info\\n\\nCompiling the compilers takes usually more time than compiling the kernel\\nitself\u2026\\n\\n:::\\n\\nI cannot speak about packaging of Rust programs in other than RHEL-based\\ndistros, though I can speak about RHEL ecosystem. Fedora packaging guidelines\\nspecify that you need to build each and every dependency of the program\\nseparately. I wanted to try out _AlmaLinux_ and install Alacritty there and I\\nfailed miserably. The solution that worked, consisted of ignoring the packaging\\nguidelines, running `cargo build` and consuming the binaries afterwards.\\nDependencies of the Rust programs are of a similar nature as JS dependencies.\\n\\n> I\'m tipping my fedora[^2] in the general direction of the maintainers of Rust\\n> packages in RHEL ecosystem. I wouldn\'t be able to do this without losing my\\n> sanity.\\n\\n## Likes\\n\\nIf you\'ve come all the way here and you\'re a Rustacean, I believe I\'ve managed\\nto get your blood boiling, so it\'s time to finish this off by stuff I like about\\nRust. I doubt I will be able to cover everything, but I can try at least. You\\nhave to admit it\'s much easier to remember the bad stuff as opposed to the good.\\n:wink:\\n\\n### Workflow and toolchain\\n\\nI prefered using Rust for the _Advent of Code_ and _Codeforces_ as it provides\\na rather easy way to test the solutions before running them with the challenge\\ninput (or test runner). I can give an example from the _Advent of Code_:\\n\\n```rust\\nuse aoc_2023::*;\\n\\ntype Output1 = i32;\\ntype Output2 = Output1;\\n\\nstruct DayXX {}\\nimpl Solution for DayXX {\\n fn new>(pathname: P) -> Self {\\n let lines: Vec = file_to_lines(pathname);\\n\\n todo!()\\n }\\n\\n fn part_1(&mut self) -> Output1 {\\n todo!()\\n }\\n\\n fn part_2(&mut self) -> Output2 {\\n todo!()\\n }\\n}\\n\\nfn main() -> Result<()> {\\n DayXX::main()\\n}\\n\\ntest_sample!(day_XX, DayXX, 42, 69);\\n```\\n\\nThis was the skeleton I\'ve used and the macro at the end is my own creation that\\nexpands to:\\n\\n```rust\\n#[cfg(test)]\\nmod day_XX {\\n use super::*;\\n\\n #[test]\\n fn part_1() {\\n let path = DayXX::get_sample(1);\\n let mut day = DayXX::new(path);\\n assert_eq!(day.part_1(), 42);\\n }\\n\\n #[test]\\n fn part_2() {\\n let path = DayXX::get_sample(2);\\n let mut day = DayXX::new(path);\\n assert_eq!(day.part_2(), 69);\\n }\\n}\\n```\\n\\nWhen you\'re solving the problem, all you need to do is switch between\\n`cargo test` and `cargo run` to check the answer to either sample or the\\nchallenge input itself.\\n\\nIntroduce [bacon] and it gets even better. Bacon is a CLI tool that wraps around\\nthe `cargo` and allows you to check, run, lint or run tests on each file save.\\nIt\'s a very pleasant thing for a so-called _compiler-assisted_ development.\\n\\nSpeaking of linting from within the bacon, you cannot leave out the [clippy].\\nNot only it can whip your ass because of errors, but it can also produce a lot\\nof helpful suggestions, for example passing slices by borrow instead of\\nborrowing the `Vec` itself when you don\'t need it.\\n\\n### Standard library\\n\\nThere\'s **a lot** included in the standard library. It almost feels like you\\nhave all you need[^4]. I like placeholders (like `todo!()`, `unreachable!()`,\\n`unimplemented!()`) to the extent of\\n[implementing](/cpp/exceptions-and-raii/placeholders) them as exceptions in C++.\\n\\nYou can find almost anything. Though you can also hit some very weird issues\\nwith some of the nuances of the type system.\\n\\n### `unsafe`\\n\\nThis might be something that people like to avoid as much as possible. However I\\nthink that forming a habit of commenting posibly unsafe operations in **any**\\nlanguage is a good habit, as I\'ve mentioned above. You should be able to argue\\nwhy you can do something safely, even if the compiler is not kicking your ass\\nbecause of it.\\n\\nExcerpt of such comment from work:\\n\\n```py\\n# SAFETY: Taking first package instead of specific package should be\\n# safe, since we have put a requirement on \xbbone\xab \u2039upstream_project_url\u203a\\n# per Packit config, i.e. even if we\'re dealing with a monorepo, there\\n# is only \xbbone\xab upstream. If there is one upstream, there is only one\\n# set of GPG keys that can be allowed.\\nreturn self.downstream_config.packages[\\n self.downstream_config._first_package\\n].allowed_gpg_keys\\n```\\n\\n### Traits\\n\\nOne of the other things I like are the traits. They are more restrictive than\\ntemplates or concepts in C++, but they\'re doing their job pretty good. If you\\nare building library and require multiple traits to be satisfied it means a lot\\nof copy-paste, but that\'s soon to be fixed by the [trait aliases].\\n\\n:::tip Comparing to other languages\\n\\nOn Wikipedia I\'ve seen trait being defined as a more restrictive type class as\\nyou may know it from the Haskell for example. C++ isn\'t behind either with its\\n_constraints and concepts_. I would say that we can order them in the following\\norder based on the complexity they can express:\\n\\n```\\nRust\'s trait < Haskell\'s type class < C++\'s concept\\n```\\n\\n:::\\n\\nYou can also hit some issues, like me when trying to support conversions between\\nunderlying numeric types of a 2D vectors or support for using an operator from\\nboth sides (I couldn\'t get `c * u` to work in the same way as `u * c` because\\nthe first one requires you to implement the trait of a built-in type).\\n\\n:::warning Implementation\\n\\nImplementing traits lies in\\n\\n```rust\\nimpl SomeTrait for SomeStruct {\\n // implementation goes here\\n}\\n```\\n\\nOne of the things I **would love to** see is being able to define the helper\\nfunctions within the same block. As of now, the only things allowed are the ones\\nthat are required by the trait, which in the end results in a randomly lying\\nfunctions around (or in a implementation of the structure itself). I don\'t like\\nthis mess at all\u2026\\n\\n:::\\n\\n### Influence of functional paradigm\\n\\nYou can see a big influence of the functional paradigm. Not only in iterators,\\nbut also in the other parts of the language. For example I prefer `Option` or\\n`Result` to `null`s and exceptions. Pattern matching together with\\ncompiler both enforces handling of the errors and rather user-friendly way of\\ndoing it.\\n\\nNot to mention `.and_then()` and such. However spending most of the time with\\nthe AoC you get pretty annoyed of the repetitive `.unwrap()` during parsing,\\nsince you are guaranteed correct input.\\n\\n### Macros\\n\\nMacros are a very strong pro of the Rust. And no, we\'re not going to talk about\\nthe procedural macros\u2026\\n\\nAs I\'ve shown above I\'ve managed to \u201ctame\u201d a lot of copy-paste in the tests for\\nthe AoC by utilizing a macro that generated a very basic template for the tests.\\n\\nAs I have mentioned the traits above, I cannot forget to give props to `derive`\\nmacro that allows you to \u201cdeduce\u201d the default implementation. It is very helpful\\nfor a tedious tasks like implementing `Debug` (for printing out the structures)\\nor comparisons, though with the comparisons you need to be careful about the\\ndefault implementation, it has already bitten me once or twice.\\n\\n## Summary\\n\\nOverall there are many things about the Rust I like and would love to see them\\nimplemented in other languages. However there are also many things I don\'t like.\\nNothing is **exclusively** black and white.\\n\\n[advent of code]: https://adventofcode.com\\n[bacon]: https://dystroy.org/bacon/\\n[clippy]: https://github.com/rust-lang/rust-clippy\\n[codeforces]: https://codeforces.com\\n[trait aliases]: https://github.com/rust-lang/rfcs/blob/master/text/1733-trait-alias.md\\n\\n[^1]:\\n not to even mention multiple different packaging standards Python has, which\\n is borderline https://xkcd.com/927/\\n\\n[^2]: pun intended\\n[^3]: It\'s not that easy with the Rust compiler, but OK\u2026\\n[^4]:\\n unlike Python where there\'s whole universe in the language itself, yet there\\n are essential things not present\u2026"},{"id":"/2023/08/02/copr","metadata":{"permalink":"/blog/2023/08/02/copr","editUrl":"https://github.com/mfocko/blog/tree/main/blog/2023-08-02-copr.md","source":"@site/blog/2023-08-02-copr.md","title":"How can Copr help with broken dependencies","description":"Copr comes to save you when maintainer doesn\'t care.","date":"2023-08-02T00:00:00.000Z","formattedDate":"August 2, 2023","tags":[{"label":"\ud83c\udfed","permalink":"/blog/tags/\ud83c\udfed"},{"label":"red-hat","permalink":"/blog/tags/red-hat"},{"label":"copr","permalink":"/blog/tags/copr"},{"label":"admin","permalink":"/blog/tags/admin"},{"label":"vps","permalink":"/blog/tags/vps"}],"readingTime":3.44,"hasTruncateMarker":true,"authors":[{"name":"Matej Focko","email":"me+blog@mfocko.xyz","title":"a.k.a. your opinionated admin","url":"https://gitlab.com/mfocko","imageURL":"https://github.com/mfocko.png","key":"mf"}],"frontMatter":{"title":"How can Copr help with broken dependencies","description":"Copr comes to save you when maintainer doesn\'t care.","date":"2023-08-02T00:00:00.000Z","authors":[{"key":"mf","title":"a.k.a. your opinionated admin"}],"tags":["\ud83c\udfed","red-hat","copr","admin","vps"]},"unlisted":false,"prevItem":{"title":"Mixed feelings on Rust","permalink":"/blog/2024/01/28/rust-opinion"},"nextItem":{"title":"4th week of Advent of Code \'22 in Rust","permalink":"/blog/aoc-2022/4th-week"}},"content":"When you decide to run Fedora on your VPS, you might get screwed over by using\\nrandom repositories\u2026\\n\\n\x3c!--truncate--\x3e\\n\\nWhen I \u201creserved\u201d my VPS[^1] back in June \'20, I slapped Fedora on it without\\nthinking. I bet 99% of people would say that I\'m crazy for doing such thing[^2],\\n**BUT** I\'ve been using Fedora on my PCs for some time already and it felt very\\nstable and natural to just use, even for VPS.\\n\\nOne of the first things I\'ve done was setting up a mail server. You may guess\\nwhat\'s the fun part about having a mail server\u2026 Yes, it\'s all the spam you\\nreceive and only then you realize how much \u201ccrap\u201d gets filtered on free mail\\nservices. To battle this problem I chose to use\\n[rspamd](https://github.com/rspamd/rspamd) that had CentOS support, but someone\\nhad a [Copr](https://copr.fedorainfracloud.org/) repository that I used to\\ninstall it.\\n\\n## How does Copr repositories work?\\n\\nIf you have ever used Ubuntu, you might be familiar with the concept since it is\\nvery close to [PPAs](https://help.ubuntu.com/community/PPA).\\n\\ntl;dr of the whole process consists of\\n\\n1. enabling the Copr repository, and\\n2. installing the desired package.\\n\\nSo in shell you would do\\n\\n```\\n# dnf copr enable \u2039copr-repository\u203a\\n# dnf install \u2039package-from-the-repository\u203a\\n```\\n\\nAnd\u2026 that\'s it! Nothing else needed! Simple, right? And literally same process\\nas you would do for the PPA.\\n\\n:::tip AUR\\n\\nOn the other hand, if you are familiar with the archLinux, you definitely know\\nAUR and what it can do for you. Copr repository is pretty similar, but the\\npackages are prebuilt in Copr and Copr repositories can carry the required\\ndependencies for said packages, which simplifies the distribution, and can even\\nhelp with installing singular packages (when you just need the dependency, not\\neverything).\\n\\n:::\\n\\n## My issue\\n\\nNow you might wonder how would I use it on my VPS. It\'s rather simple, once in\\n6 months a new Fedora release comes out. And you need to upgrade to newer\\nrelease\u2026 You don\'t need to do it right away and for such setup it probably isn\'t\\neven recommended.\\n\\n:::tip\\n\\nFedora releases are supported for a year, i.e. they live 6 months till the next\\nrelease and then another 6 months till another release.\\n\\nSome people prefer to run one version \u201cbehind\u201d. If you ever decide to run it on\\nyour home server or in a similar setup, it might be a pretty good idea to\\nfollow. I\'m using the \u201clatest greatest\u201d, cause why not :smile:\\n\\nOne way or another, you still need to bump the release every six months, unless\\nyou\'d bump 2 releases at once every year, which would be a decision, since, at\\nleast I, cannot see any benefits in it\u2026 You don\'t go for \u201cstability\u201d, cause once\\na year you switch to the latest release and then, before you bump, you use one\\nyear old software, so you\'re not even using the latest.\\n\\n:::\\n\\nFast-forward 2 years in the future, new Fedora release came out (October \'22)\\nand I was doing an upgrade. Dependencies of the rspamd have been updated and\\nrspamd builds in Copr have failed and no one fixed it. Cool, so now I can\\nupgrade, but can either ignore the dependencies or uninstall the rspamd\u2026\\n\\n## How can Copr help?\\n\\nI have managed to find\\n[specfile](https://github.com/rspamd/rspamd/blob/master/rpm/rspamd.spec) for the\\nrspamd package that they use for CentOS. There were some files apart from the\\nspecfile, so I had to make an SRPM locally and then\u2026 I just uploaded the SRPM\\nto the Copr to\\n[build](https://copr.fedorainfracloud.org/coprs/mfocko/rspamd/build/5046567/)\\nan RPM.\\n\\nI have switched the previous Copr repository for rspamd with my own and happily\\nproceeded with the upgrade.\\n\\n## Conclusion\\n\\nCopr is heavily used for testing builds on the upstream with\\n[Packit](https://packit.dev). However, as you can see, it is possible to use it\\n**very well** for packaging your own stuff and avoiding issues (such as the one\\nI have described above), if need be.\\n\\n[^1]: [vpsFree.cz](https://vpsfree.cz)\\n[^2]:\\n Even though I\'ve been running archLinux on some Raspberry Pi\'s and also\\n on one of my \u201chome servers\u201d, before getting the VPS. You could say I like\\n to live on the edge\u2026"},{"id":"aoc-2022/4th-week","metadata":{"permalink":"/blog/aoc-2022/4th-week","editUrl":"https://github.com/mfocko/blog/tree/main/blog/aoc-2022/04-week-4.md","source":"@site/blog/aoc-2022/04-week-4.md","title":"4th week of Advent of Code \'22 in Rust","description":"Surviving fourth week in Rust.","date":"2023-07-07T15:14:00.000Z","formattedDate":"July 7, 2023","tags":[{"label":"advent-of-code","permalink":"/blog/tags/advent-of-code"},{"label":"advent-of-code-2022","permalink":"/blog/tags/advent-of-code-2022"},{"label":"rust","permalink":"/blog/tags/rust"}],"readingTime":15.175,"hasTruncateMarker":true,"authors":[{"name":"Matej Focko","email":"me+blog@mfocko.xyz","title":"a.k.a. @mf","url":"https://gitlab.com/mfocko","imageURL":"https://github.com/mfocko.png","key":"mf"}],"frontMatter":{"title":"4th week of Advent of Code \'22 in Rust","description":"Surviving fourth week in Rust.","date":"2023-07-07T15:14","slug":"aoc-2022/4th-week","authors":"mf","tags":["advent-of-code","advent-of-code-2022","rust"],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"How can Copr help with broken dependencies","permalink":"/blog/2023/08/02/copr"},"nextItem":{"title":"3rd week of Advent of Code \'22 in Rust","permalink":"/blog/aoc-2022/3rd-week"}},"content":"Let\'s go through the fourth week of [_Advent of Code_] in Rust.\\n\\n\x3c!--truncate--\x3e\\n\\n## [Day 22: Monkey Map](https://adventofcode.com/2022/day/22)\\n\\n:::info tl;dr\\n\\nSimulating a movement on a 2D map with given instructions. Map becomes a cube in\\nthe 2nd part\u2026\\n\\n:::\\n\\n:::caution Rant\\n\\nThis was the most obnoxious problem of this year\u2026 and a lot of Rust issues have\\nbeen hit.\\n\\n:::\\n\\n### Solution\\n\\nIt seems like a very simple problem to solve, but with very obnoxious changes in\\nthe 2nd part and also it\'s relatively hard to decompose \xbbproperly\xab.\\n\\n#### Column iterator\\n\\nIn the first part of the problem it was needed to know the boundaries of each\\nrow and column, since I stored them in `Vec>` and padded with spaces\\nto ensure I have a rectangular 2D \u201carray\u201d. However when you wanted to go through\\neach row and column to determine the boundaries, it was very easy to do for the\\nrows (cause each row is a `Vec` element), but not for the columns, since they\\nspan multiple rows.\\n\\nFor this use case I have implemented my own _column iterator_:\\n\\n```rust\\npub struct ColumnIterator<\'a, T> {\\n map: &\'a [Vec],\\n column: usize,\\n\\n i: usize,\\n}\\n\\nimpl<\'a, T> ColumnIterator<\'a, T> {\\n pub fn new(map: &\'a [Vec], column: usize) -> ColumnIterator<\'a, T> {\\n Self { map, column, i: 0 }\\n }\\n}\\n\\nimpl<\'a, T> Iterator for ColumnIterator<\'a, T> {\\n type Item = &\'a T;\\n\\n fn next(&mut self) -> Option {\\n if self.i >= self.map.len() {\\n return None;\\n }\\n\\n self.i += 1;\\n Some(&self.map[self.i - 1][self.column])\\n }\\n}\\n```\\n\\nGiven this piece of an iterator, it is very easy to factor out the common\\nfunctionality between the rows and columns into:\\n\\n```rust\\nlet mut find_boundaries = |constructor: fn(usize) -> Orientation,\\n iterator: &mut dyn Iterator,\\n upper_bound,\\n i| {\\n let mut first_non_empty = iterator.enumerate().skip_while(|&(_, &c)| c == \' \');\\n let start = first_non_empty.next().unwrap().0 as isize;\\n\\n let mut last_non_empty = first_non_empty.skip_while(|&(_, &c)| c != \' \');\\n let end = last_non_empty.next().unwrap_or((upper_bound, &\'_\')).0 as isize;\\n\\n boundaries.insert(constructor(i), start..end);\\n};\\n```\\n\\nAnd then use it as such:\\n\\n```rust\\n// construct all horizontal boundaries\\n(0..map.len()).for_each(|row| {\\n find_boundaries(\\n Orientation::horizontal,\\n &mut map[row].iter(),\\n map[row].len(),\\n row,\\n );\\n});\\n\\n// construct all vertical boundaries\\n(0..map[0].len()).for_each(|col| {\\n find_boundaries(\\n Orientation::vertical,\\n &mut ColumnIterator::new(&map, col),\\n map.len(),\\n col,\\n );\\n});\\n```\\n\\n#### Walking around the map\\n\\nOnce the 2nd part got introduced, you start to think about a way how not to\\ncopy-paste a lot of stuff (I haven\'t avoided it anyways\u2026). In this problem, I\'ve\\nchosen to introduce a trait (i.e. _interface_) for 2D and 3D walker.\\n\\n```rust\\ntrait Wrap: Clone {\\n type State;\\n\\n // simulation\\n fn is_blocked(&self) -> bool;\\n fn step(&mut self, steps: isize);\\n fn turn_left(&mut self);\\n fn turn_right(&mut self);\\n\\n // movement\\n fn next(&self) -> (Self::State, Direction);\\n\\n // final answer\\n fn answer(&self) -> Output;\\n}\\n```\\n\\nEach walker maintains its own state and also provides the functions that are\\nused during the simulation. The \u201cpromised\u201d methods are separated into:\\n\\n- _simulation_-related: that are used during the simulation from the `.fold()`\\n- _movement_-related: just a one method that holds most of the logic differences\\n between 2D and 3D\\n- _final answer_: which extracts the _proof of solution_ from the\\n implementation-specific walker\\n\\nBoth 2D and 3D versions borrow the original input and therefore you must\\nannotate the lifetime of it:\\n\\n```rust\\nstruct Wrap2D<\'a> {\\n input: &\'a Input,\\n position: Position,\\n direction: Direction,\\n}\\nimpl<\'a> Wrap2D<\'a> {\\n fn new(input: &\'a Input) -> Wrap2D<\'a> {\\n// \u2026\\n```\\n\\n#### Problems\\n\\nI have used a lot of closures for this problem and once I introduced a parameter\\nthat was of unknown type (apart from the fact it implements a specific trait), I\\ngot suggested a \u201cfix\u201d for the compilation error that resulted in something that\\nwas not possible to parse, cause it, more than likely, violated the grammar.\\n\\nIn a similar fashion, I have been suggested changes that led to a code that\\ndidn\'t make sense by just looking at it (there was no need to try the changes),\\nfor example one suggested change in the closure parameter caused disapperance of\\nthe parameter name. :smile:\\n\\n#### Clippy\\n\\nI have to admit that Clippy was rather helpful here, I\'ll include two examples\\nof rather smart suggestions.\\n\\nWhen writing the parsing for this problem, the first thing I have spotted on the\\n`char` was the `.is_digit()` function that takes a radix as a parameter. Clippy\\nnoticed that I use `radix = 10` and suggested switching to `.is_ascii_digit()`\\nthat does exactly the same thing:\\n\\n```diff\\n- .take_while(|c| c.is_digit(10))\\n+ .take_while(|c| c.is_ascii_digit())\\n```\\n\\nAnother useful suggestion appeared when working with the iterators and I wanted\\nto get the $n$-th element from it. You know the `.skip()`, you know the\\n`.next()`, just \u201cslap\u201d them together and we\'re done for :grin: Well, I got\\nsuggested to use `.nth()` that does exactly the combination of the two mentioned\\nmethods on iterators:\\n\\n```diff\\n- match it.clone().skip(skip).next().unwrap() {\\n+ match it.clone().nth(skip).unwrap() {\\n```\\n\\n## [Day 23: Unstable Diffusion](https://adventofcode.com/2022/day/23)\\n\\n:::info tl;dr\\n\\nSimulating movement of elves around with a set of specific rules.\\n\\n:::\\n\\n### Solution\\n\\nThere\'s not much to mention since it\'s just a cellular automaton simulation\\n(even though the AoC rules for cellular automatons usually get out of hand\\n:wink:).\\n\\nAlthough I had a need to determine boundaries of the elves\' positions and ended\\nup with a nasty DRY violation. Knowing that you you\'re looking for maximum and\\nminimum that are, of course, exactly the same except for initial values and\\ncomparators, it looks like a rather simple fix, but typing in Rust is something\\nelse, right? In the end I settled for a function that computes both boundaries\\nwithout any duplication while using a closure:\\n\\n```rust\\nfn get_bounds(positions: &Input) -> (Vector2D, Vector2D) {\\n let f = |init, cmp: &dyn Fn(isize, isize) -> isize| {\\n positions\\n .iter()\\n .fold(Vector2D::new(init, init), |acc, elf| {\\n Vector2D::new(cmp(acc.x(), elf.x()), cmp(acc.y(), elf.y()))\\n })\\n };\\n\\n (f(isize::MAX, &min::), f(isize::MIN, &max::))\\n}\\n```\\n\\nThis function returns a pair of 2D vectors that represent opposite points of the\\nbounding rectangle of all elves.\\n\\nYou might ask why would we need a closure and the answer is that `positions`\\ncannot be captured from within the nested function, only via closure. One more\\nfun fact on top of that is the type of the comparator\\n\\n```rust\\n&dyn Fn(isize, isize) -> isize\\n```\\n\\nOnce we remove the `dyn` keyword, compiler yells at us and also includes a way\\nhow to get a more thorough explanation of the error by running\\n\\n $ rustc --explain E0782\\n\\nwhich shows us\\n\\n Trait objects must include the `dyn` keyword.\\n\\n Erroneous code example:\\n\\n ```\\n trait Foo {}\\n fn test(arg: Box) {} // error!\\n ```\\n\\n Trait objects are a way to call methods on types that are not known until\\n runtime but conform to some trait.\\n\\n Trait objects should be formed with `Box`, but in the code above\\n `dyn` is left off.\\n\\n This makes it harder to see that `arg` is a trait object and not a\\n simply a heap allocated type called `Foo`.\\n\\n To fix this issue, add `dyn` before the trait name.\\n\\n ```\\n trait Foo {}\\n fn test(arg: Box) {} // ok!\\n ```\\n\\n This used to be allowed before edition 2021, but is now an error.\\n\\n:::danger Rant\\n\\nNot all of the explanations are helpful though, in some cases they might be even\\nmore confusing than helpful, since they address _very simple_ use cases.\\n\\nAs you can see, even in this case there are two sides to the explanations:\\n\\n- it explains why you need to use `dyn`, but\\n- it still mentions that trait objects need to be heap-allocated via `Box`\\n that, as you can see in my snippet, **does not** apply here :smile: IMO it\'s\\n caused by the fact that we are borrowing it and therefore we don\'t need to\\n care about the size or whereabouts of it.\\n\\n:::\\n\\n:::info C++ parallel\\n\\nIf you dive into the explanation above, you can notice that the `Box`\\npattern is very helpful for using types that are not known during compile-time.\\nYou would use a very similar approach in C++ when parsing some data structure\\nfrom input (let\'s say JSON for example).\\n\\nOn the other hand, in this case, it doesn\'t really make much sense, cause you\\ncan clearly see that the types **are known** during the compile-time, which in\\nC++ could be easily resolved by templating the helper function.\\n\\n:::\\n\\n## [Day 24: Blizzard Basin](https://adventofcode.com/2022/day/24)\\n\\n:::info tl;dr\\n\\nNavigating your way through a basin with series of blizzards that move around\\nyou as you move.\\n\\n:::\\n\\n:::caution\\n\\nIt\'s second to last day and I went \u201c_bonkers_\u201d on the Rust :smile: Proceed to\\nread _Solution_ part on your own risk.\\n\\n:::\\n\\n### Solution\\n\\nYou are given a map with blizzards all over the place and you\'re supposed to\\nfind the minimum time it requires you to walk through the basin without getting\\nin any of the blizzards.\\n\\n#### Breakdown\\n\\nRelatively simple, yet a bit annoying, approach can be taken. It\'s technically\\na shortest-path algorithm implementation with some relaxation restrictions and\\nbeing able to stay on one position for some time, so each _vertex_ of the graph\\nis determined by the position on the map and the _timestamp_. I have chosen to\\nuse `Vector3D`, since `x` and `y` attributes can be used for the position\\nand, well, let\'s use `z` for a timestamp, cause why not, right? :wink:\\n\\n#### Evaluating the blizzards\\n\\n:::caution\\n\\nI think that this is the most perverted abuse of the traits in the whole 4 weeks\\nof AoC in Rust\u2026\\n\\n:::\\n\\nThe blizzards move along their respective directions in time and loop around in\\ntheir respective row/column. Each vertex holds position **and** time, so we can\\n_just_ index the basin with the vertex itself, right? Yes, we can :smiling_imp:\\n\\n:::tip Fun fact\\n\\nWhile writing this part, I\'ve recognized unnecessary verbosity in the code and\\ncleaned it up a bit. The changed version is shown here and the original was just\\nmore verbose.\\n\\n:::\\n\\nI\'ll skip the boring parts of checking bounds and entry/exit of the basin :wink:\\nWe can easily calculate positions of the blizzards using a modular arithmetics:\\n\\n```rust\\nimpl Index for Basin {\\n type Output = char;\\n\\n fn index(&self, index: Position) -> &Self::Output {\\n // \u2039skipped boring parts\u203a\\n\\n // We need to account for the loops of the blizzards\\n let width = self.cols - 2;\\n let height = self.rows - 2;\\n\\n let blizzard_origin = |size, d, t, i| ((i - 1 + size + d * (t % size)) % size + 1) as usize;\\n [\\n (\\n index.y() as usize,\\n blizzard_origin(width, -1, index.z(), index.x()),\\n \'>\',\\n ),\\n (\\n index.y() as usize,\\n blizzard_origin(width, 1, index.z(), index.x()),\\n \'<\',\\n ),\\n (\\n blizzard_origin(height, -1, index.z(), index.y()),\\n index.x() as usize,\\n \'v\',\\n ),\\n (\\n blizzard_origin(height, 1, index.z(), index.y()),\\n index.x() as usize,\\n \'^\',\\n ),\\n ]\\n .iter()\\n .find_map(|&(y, x, direction)| {\\n if self.map[y][x] == direction {\\n Some(&self.map[y][x])\\n } else {\\n None\\n }\\n })\\n .unwrap_or(&\'.\')\\n }\\n}\\n```\\n\\nAs you can see, there is an expression for calculating the original position and\\nit\'s used multiple times, so why not take it out to a lambda, right? :wink:\\n\\nI couldn\'t get the `rustfmt` to format the `for`-loop nicely, so I\'ve just\\ndecided to go with iterating over an elements of a slice. I have used, once\\nagain, a combination of two functions (`find_map` in this case) to do 2 things\\nat once and at the end, if we haven\'t found any blizzard, we just return the\\nempty space.\\n\\nI think it\'s a very _nice_ (and naughty) way how to use the `Index` trait, don\'t\\nyou think?\\n\\n#### Shortest-path algorithm\\n\\nFor the shortest path you can choose and adjust any of the common shortest-path\\nalgorithms, in my case, I have decided to use [_A\\\\*_] instead of Dijkstra\'s\\nalgorithm, since it better reflects the _cost_ function.\\n\\n:::info Comparison of costs\\n\\nWith the Dijkstra\'s algorithm I would proceed with the `time` attribute used as\\na priority for the queue.\\n\\nWhereas with the _A\\\\*_, I have chosen to use both time and Manhattan distance\\nthat promotes vertices closer to the exit **and** with a minimum time taken.\\n\\n:::\\n\\nCost function is, of course, a closure :wink:\\n\\n```rust\\nlet cost = |p: Position| p.z() as usize + exit.y().abs_diff(p.y()) + exit.x().abs_diff(p.x());\\n```\\n\\nAnd also for checking the possible moves from the current vertex, I have\\nimplemented, yet another, closure that yields an iterator with the next moves:\\n\\n```rust\\nlet next_positions = |p| {\\n [(0, 0, 1), (0, -1, 1), (0, 1, 1), (-1, 0, 1), (1, 0, 1)]\\n .iter()\\n .filter_map(move |&(x, y, t)| {\\n let next_p = p + Vector3D::new(x, y, t);\\n\\n if basin[next_p] == \'.\' {\\n Some(next_p)\\n } else {\\n None\\n }\\n })\\n};\\n```\\n\\n#### Min-heap\\n\\nIn this case I had a need to use the priority queue taking the elements with the\\nlowest cost as the prioritized ones. Rust only offers you the [`BinaryHeap`] and\\nthat is a max-heap. One of the ways how to achieve a min-heap is to put the\\nelements in wrapped in a [`Reverse`] (as is even showed in the linked [docs of\\nthe `BinaryHeap`]). However the wrapping affects the type of the heap and also\\npopping the most prioritized elements yields values wrapped in the `Reverse`.\\n\\nFor this purpose I have just taken the max-heap and wrapped it as a whole in a\\nseparate structure providing just the desired methods:\\n\\n```rust\\nuse std::cmp::{Ord, Reverse};\\nuse std::collections::BinaryHeap;\\n\\npub struct MinHeap {\\n heap: BinaryHeap>,\\n}\\n\\nimpl MinHeap {\\n pub fn new() -> MinHeap {\\n MinHeap {\\n heap: BinaryHeap::new(),\\n }\\n }\\n\\n pub fn push(&mut self, item: T) {\\n self.heap.push(Reverse(item))\\n }\\n\\n pub fn pop(&mut self) -> Option {\\n self.heap.pop().map(|Reverse(x)| x)\\n }\\n}\\n\\nimpl Default for MinHeap {\\n fn default() -> Self {\\n Self::new()\\n }\\n}\\n```\\n\\nRest is just the algorithm implementation which is not that interesting.\\n\\n## [Day 25: Full of Hot Air](https://adventofcode.com/2022/day/25)\\n\\n:::info tl;dr\\n\\nPlaying around with a numbers in a _special_ base.\\n\\n:::\\n\\nGetting flashbacks to the _IB111 Foundations of Programming_\u2026 Very nice \u201cproblem\u201d\\nwith a rather easy solution, as the last day always seems to be.\\n\\n### Solution\\n\\nImplementing 2 functions, converting from the _SNAFU base_ and back to the _SNAFU_\\n_base_ representation. Let\'s do a bit more though! I have implemented two functions:\\n\\n- `from_snafu`\\n- `to_snafu`\\n\\nNow it is apparent that all I do is number to string and string to number. Hmm\u2026\\nthat sounds familiar, doesn\'t it? Let\'s introduce a structure for the SNAFU numbers\\nand implement the traits that we need.\\n\\nLet\'s start with a structure:\\n\\n```rust\\n#[derive(Debug, PartialEq, Eq, PartialOrd, Ord)]\\nstruct SNAFU {\\n value: i64,\\n}\\n```\\n\\n#### Converting from `&str`\\n\\nWe will start by implementing the `FromStr` trait that will help us parse our input.\\nThis is rather simple, I can just take the `from_snafu` function, copy-paste it\\ninto the `from_str` method and the number I get will be wrapped in `Result` and\\n`SNAFU` structure.\\n\\n#### Converting to `String`\\n\\nThis is more fun. In some cases you need to implement only one trait and others\\nare automatically implemented using that one trait. In our case, if you look in\\nthe documentation, you can see that `ToString` trait is automatically implemented\\nfor any type that implements `Display` trait.\\n\\nLet\'s implement the `Display` trait then. We should be able to use the `to_snafu`\\nfunction and just take the `self.value` from the `SNAFU` structure.\\n\\nAnd for the convenience of tests, we can also implement a rather simple `From`\\ntrait for the `SNAFU`.\\n\\n#### Adjusting the code\\n\\nAfter those changes we need to adjust the code and tests.\\n\\nParsing of the input is very easy, before we have used the lines, now we parse\\neverything:\\n\\n```diff\\n fn parse_input>(pathname: P) -> Input {\\n- file_to_lines(pathname)\\n+ file_to_structs(pathname)\\n }\\n```\\n\\nPart 1 needs to be adjusted a bit too:\\n\\n```diff\\n fn part_1(input: &Input) -> Output {\\n- to_snafu(input.iter().map(|s| from_snafu(s)).sum())\\n+ SNAFU::from(input.iter().map(|s| s.value).sum::()).to_string()\\n }\\n```\\n\\nYou can also see that it simplifies the meaning a bit and it is more explicit than\\nthe previous versions.\\n\\nAnd for the tests:\\n\\n```diff\\n #[test]\\n fn test_from() {\\n- for (n, s) in EXAMPLES.iter() {\\n- assert_eq!(from_snafu(s), *n);\\n+ for (&n, s) in EXAMPLES.iter() {\\n+ assert_eq!(s.parse::().unwrap().value, n);\\n }\\n }\\n\\n #[test]\\n fn test_to() {\\n- for (n, s) in EXAMPLES.iter() {\\n- assert_eq!(to_snafu(*n), s.to_string());\\n+ for (&n, s) in EXAMPLES.iter() {\\n+ assert_eq!(SNAFU::from(n).to_string(), s.to_string());\\n }\\n```\\n\\n## Summary\\n\\nLet\'s wrap the whole thing up! Keeping in mind both AoC and the Rust\u2026\\n\\n![Finished advent calendar :smile:](/img/blog/aoc-2022/04-week-4/calendar.png)\\n\\n### Advent of Code\\n\\nThis year was quite fun, even though most of the solutions and posts came in\\nlater on (_cough_ in \'23 _cough_). Day 22 was the most obnoxious one\u2026 And also\\nit feels like I used priority queues and tree data structures **a lot** :eyes:\\n\\n### with Rust\\n\\nI must admit that a lot of compiler warnings and errors were very useful. Even\\nthough I still found some instances where they didn\'t help at all or cause even\\nworse issues than I had. Compilation times have been addressed with the caching.\\n\\nBuilding my first tree data structure in Rust has been a very \u201cinteresting\u201d\\njourney. Being able to write a more generic BFS algorithm that allows you to not\\nduplicate code while still mantaining the desired functionality contributes to\\na very readable code.\\n\\nI am definitely much more aware of the basic things that bloated Python is\\nmissing, yet Rust has them\u2026\\n\\nUsing explicit types and writing down placeholder functions with `todo!()`\\nmacros is very pleasant, since it allows you to easily navigate the type system\\nduring the development when you don\'t even need to be sure how are you going to\\nput the smaller pieces together.\\n\\nI have used a plethora of traits and also implemented some of them to either be\\nidiomatic, or exploit the syntactic sugar they offer. Deriving the default trait\\nimplementation is also very helpful in a lot of cases, e.g. debugging output,\\ncopying, equality comparison, etc.\\n\\nI confess to touching more \u201ccursed\u201d parts of the Rust, such as macros to\\ndeclutter the copy-paste for tests or writing my own structures that need to\\ncarry a lifetime for their own fields.\\n\\ntl;dr Relatively pleasant language until you hit brick wall :wink:\\n\\n---\\n\\nSee you next year! Maybe in Rust, maybe not :upside_down_face:\\n\\n[_advent of code_]: https://adventofcode.com\\n[_a\\\\*_]: https://en.wikipedia.org/wiki/A*_search_algorithm\\n[`binaryheap`]: https://doc.rust-lang.org/std/collections/struct.BinaryHeap.html\\n[`reverse`]: https://doc.rust-lang.org/std/cmp/struct.Reverse.html\\n[docs of the `binaryheap`]: https://doc.rust-lang.org/std/collections/struct.BinaryHeap.html#min-heap"},{"id":"aoc-2022/3rd-week","metadata":{"permalink":"/blog/aoc-2022/3rd-week","editUrl":"https://github.com/mfocko/blog/tree/main/blog/aoc-2022/03-week-3.md","source":"@site/blog/aoc-2022/03-week-3.md","title":"3rd week of Advent of Code \'22 in Rust","description":"Surviving third week in Rust.","date":"2023-07-06T21:00:00.000Z","formattedDate":"July 6, 2023","tags":[{"label":"advent-of-code","permalink":"/blog/tags/advent-of-code"},{"label":"advent-of-code-2022","permalink":"/blog/tags/advent-of-code-2022"},{"label":"rust","permalink":"/blog/tags/rust"}],"readingTime":11.57,"hasTruncateMarker":true,"authors":[{"name":"Matej Focko","email":"me+blog@mfocko.xyz","title":"a.k.a. @mf","url":"https://gitlab.com/mfocko","imageURL":"https://github.com/mfocko.png","key":"mf"}],"frontMatter":{"title":"3rd week of Advent of Code \'22 in Rust","description":"Surviving third week in Rust.","date":"2023-07-06T21:00","slug":"aoc-2022/3rd-week","authors":"mf","tags":["advent-of-code","advent-of-code-2022","rust"],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"4th week of Advent of Code \'22 in Rust","permalink":"/blog/aoc-2022/4th-week"},"nextItem":{"title":"Sort the matrix diagonally","permalink":"/blog/leetcode/sort-diagonally"}},"content":"Let\'s go through the third week of [_Advent of Code_] in Rust.\\n\\n\x3c!--truncate--\x3e\\n\\n## [Day 15: Beacon Exclusion Zone](https://adventofcode.com/2022/day/15)\\n\\n:::info tl;dr\\n\\nTriangulating a distress beacon based on the information from the sensors.\\n\\n:::\\n\\n### Solution\\n\\nRelatively easy thing to implement, no major Rust issues hit.\\n\\n## [Day 16: Proboscidea Volcanium](https://adventofcode.com/2022/day/16)\\n\\n:::info tl;dr\\n\\nFinding a max flow in a graph given some time constraints.\\n\\n:::\\n\\n### Solution\\n\\nI have used some interesting things to implement this and make it easier for me.\\n\\n#### Indexing in graph\\n\\nI have come across a situation where I needed to keep more information regarding\\nthe graph\u2026 In that case you can, of course, create a structure and keep it in,\\nbut once you have multiple members in the structure it gets harder to work with\\nsince you need to address the fields in the structure. When you work with graph,\\nyou frequently need to access the vertices and in this case it felt a lot easier\\nto implement the indexing in a graph, rather than explicitly access the\\nunderlying data structure.\\n\\nHere you can see a rather short snippet from the solution that allows you to\\n\u201cindex\u201d the graph:\\n\\n```rust\\nimpl Index<&str> for Graph {\\n type Output = Vertex;\\n\\n fn index(&self, index: &str) -> &Self::Output {\\n &self.g[index]\\n }\\n}\\n```\\n\\n#### Cartesian product\\n\\nDuring the implementation I had to utilize Floyd-Warshall algorithm for finding\\nthe shortest path between pairs of vertices and utilized the `iproduct!` macro\\nfrom the [`itertools`]. It is a very useful higher-order function that allows\\nyou to keep the nesting of the loops at a minimum level while still maintaining\\nthe same functionality.\\n\\n#### \u201cImplementing\u201d an iterator\\n\\nFor the second part, you get to split the work between 2 actors. That way you\\ncan achieve higher efficiency of the whole process that you\'re planning, but it\\nalso makes it harder to evaluate algorithmically, since you need to check the\\ndifferent ways the work can be split.\\n\\nBeing affected by _functional programming brain damage_:tm:, I have chosen to\\ndo this part by function that returns an iterator over the possible ways:\\n\\n```rust\\nfn pairings(\\n valves: &BTreeSet,\\n) -> impl Iterator, BTreeSet)> + \'_ {\\n let mapping = valves.iter().collect_vec();\\n\\n let max_mask = 1 << (valves.len() - 1);\\n\\n (0..max_mask).map(move |mask| {\\n let mut elephant = BTreeSet::new();\\n let mut human = BTreeSet::new();\\n\\n for (i, &v) in mapping.iter().enumerate() {\\n if (mask & (1 << i)) == 0 {\\n human.insert(v.clone());\\n } else {\\n elephant.insert(v.clone());\\n }\\n }\\n\\n (human, elephant)\\n })\\n}\\n```\\n\\n## [Day 17: Pyroclastic Flow](https://adventofcode.com/2022/day/17)\\n\\n:::info tl;dr\\n\\nSimulating an autonomous Tetris where pieces get affected by a series of jets of\\nhot gas.\\n\\n:::\\n\\n### Solution\\n\\nSimilarly to the previous day I have created some iterators :smile:\\n\\n#### Collision detection\\n\\nOnce you need to check for collisions it is very helpful to be able to just\\niterate through the positions that can actually collide with the wall or other\\npiece.\\n\\nTo get the desired behaviour, you can just compose few smaller functions:\\n\\n```rust\\nfn occupied(shape: &[Vec]) -> impl Iterator + \'_ {\\n shape.iter().enumerate().flat_map(|(y, row)| {\\n row.iter().enumerate().filter_map(move |(x, c)| {\\n if c == &\'#\' {\\n Some(Vector2D::new(x as isize, y as isize))\\n } else {\\n None\\n }\\n })\\n })\\n}\\n```\\n\\nIn the end, we get relative positions which we can adjust later when given the\\nspecific positions from iterator. You can see some interesting parts in this:\\n\\n- `.enumerate()` allows us to get both the indices (coordinates) and the line\\n or, later on, the character itself,\\n- `.flat_map()` flattens the iterator, i.e. when we return another iterator,\\n they just get chained instead of iterating over iterators (which sounds pretty\\n disturbing, doesn\'t it?),\\n- and finally `.filter_map()` which is pretty similar to the \u201cbasic\u201d `.map()`\\n with a one, key, difference that it expects the items of an iterator to be\\n mapped to an `Option` from which it ignores nothing (as in `None` :wink:)\\n and also unwraps the values from `Some(\u2026)`.\\n\\n#### Infinite iterator\\n\\nIn the solution we cycle through both Tetris-like shapes that fall down and the\\njets that move our pieces around. Initially I have implemented my own infinite\\niterator that just yields the indices. It is a very simple, yet powerful, piece\\nof code:\\n\\n```rust\\nstruct InfiniteIndex {\\n size: usize,\\n i: usize,\\n}\\n\\nimpl InfiniteIndex {\\n fn new(size: usize) -> InfiniteIndex {\\n InfiniteIndex { size, i: size - 1 }\\n }\\n}\\n\\nimpl Iterator for InfiniteIndex {\\n type Item = usize;\\n\\n fn next(&mut self) -> Option {\\n self.i = (self.i + 1) % self.size;\\n Some(self.i)\\n }\\n}\\n```\\n\\nHowever when I\'m looking at the code now, it doesn\'t really make much sense\u2026\\nGuess what, we can use a built-in function that is implemented on iterators for\\nthat! The function is called `.cycle()`\\n\\nOn the other hand, I am not going to switch to that function, since it would\\nintroduce an another myriad of issues caused by the fact that I create iterators\\nright away in the constructor of my structure and the iterators would borrow\\nboth the jets and shapes which would introduce a lifetime dependency into the\\nstructure.\\n\\n## [Day 18: Boiling Boulders](https://adventofcode.com/2022/day/18)\\n\\n:::info tl;dr\\n\\nLet\'s compute a surface area of some obsidian approximated via coordinates of\\ncubes.\\n\\n:::\\n\\n### Solution\\n\\nThis day is kinda interesting, because it shows how easily you can complicate the\\nproblem and also how much can you screw yourself over with the optimization and\\n\u201csmart\u201d approach.\\n\\nFor the first part you need to find the surface area of an obsidian that is\\napproximated by cubes. Now, that is a very easy thing to do, just keep the track\\nof already added cubes, and check if the newly added cube touches any face of any\\nother cube. Simple, and with a `BTreeSet` relatively efficient way to do it.\\n\\nHowever the second part lets you on a secret that there may be some surface area\\nfrom the \u201cinside\u201d too and you want to know only the one from the outside of the\\nobsidian. I have seen some solutions later, but if you check your data, you might\\nnotice that the bounding box of all the cubes isn\'t that big at all. Therefore I\\nchose to pre-construct the box beforehand, fill in the cubes and then just run a\\nBFS turning all the lava on the outside into the air. Now you just need to check\\ncubes and count how many of their faces touch the air.\\n\\n## [Day 19: Not Enough Minerals](https://adventofcode.com/2022/day/19)\\n\\n:::info tl;dr\\n\\nFinding out the best strategy for building robots to collect geodes.\\n\\n:::\\n\\n### Solution\\n\\nNot much interesting stuff to mention apart from the suggestion to never believe\\nthat the default implementation given by `derive` macro is what you want, it\\ndoesn\'t have to be. :smile:\\n\\n## [Day 20: Grove Positioning System](https://adventofcode.com/2022/day/20)\\n\\n:::info tl;dr\\n\\nShuffling around the _circular linked list_ to find the coordinates.\\n\\n:::\\n\\nNow, small rant for this day is in place. They\'ve never mentioned that coordinates\\ncan repeat and therefore the values are non-unique. This is something that did\\nnot happen in the given sample, but was present in the user input. It took \xbba lot\xab\\nto realize that this is the issue.\\n\\n### Solution\\n\\nI have tried implementing a circular linked list for this\u2026 and I have failed\\nmiserably. To be fair, I still have no clue why. It was \u201cfun\u201d to play around with\\nthe `Rc>`. In the end I failed on _wrong answer_. I have also encountered\\na rather interesting issue with `.borrow_mut()` method being used on `Rc>`.\\n\\n#### `.borrow_mut()`\\n\\nConsider the following snippet of the code (taken from the documentation):\\n\\n```rust\\nuse std::cell::{RefCell, RefMut};\\nuse std::collections::HashMap;\\nuse std::rc::Rc;\\n// use std::borrow::BorrowMut;\\n\\nfn main() {\\n let shared_map: Rc> = Rc::new(RefCell::new(HashMap::new()));\\n // Create a new block to limit the scope of the dynamic borrow\\n {\\n let mut map: RefMut<_> = shared_map.borrow_mut();\\n map.insert(\\"africa\\", 92388);\\n map.insert(\\"kyoto\\", 11837);\\n map.insert(\\"piccadilly\\", 11826);\\n map.insert(\\"marbles\\", 38);\\n }\\n\\n // Note that if we had not let the previous borrow of the cache fall out\\n // of scope then the subsequent borrow would cause a dynamic thread panic.\\n // This is the major hazard of using `RefCell`.\\n let total: i32 = shared_map.borrow().values().sum();\\n println!(\\"{total}\\");\\n}\\n```\\n\\nWe allocate a hash map on the heap and then in the inner block, we borrow it as\\na mutable reference, so that we can use it.\\n\\n:::note\\n\\nIt is a very primitive example for `Rc>` and mutable borrow.\\n\\n:::\\n\\nIf you uncomment the 4th line with `use std::borrow::BorrowMut;`, you cannot\\ncompile the code anymore, because of\\n\\n```\\n Compiling playground v0.0.1 (/playground)\\nerror[E0308]: mismatched types\\n --\x3e src/main.rs:10:34\\n |\\n10 | let mut map: RefMut<_> = shared_map.borrow_mut();\\n | --------- ^^^^^^^^^^^^^^^^^^^^^^^ expected struct `RefMut`, found mutable reference\\n | |\\n | expected due to this\\n |\\n = note: expected struct `RefMut<\'_, _>`\\n found mutable reference `&mut Rc>>`\\n\\nerror[E0599]: no method named `insert` found for struct `RefMut<\'_, _>` in the current scope\\n --\x3e src/main.rs:11:13\\n |\\n11 | map.insert(\\"africa\\", 92388);\\n | ^^^^^^ method not found in `RefMut<\'_, _>`\\n\\nerror[E0599]: no method named `insert` found for struct `RefMut<\'_, _>` in the current scope\\n --\x3e src/main.rs:12:13\\n |\\n12 | map.insert(\\"kyoto\\", 11837);\\n | ^^^^^^ method not found in `RefMut<\'_, _>`\\n\\nerror[E0599]: no method named `insert` found for struct `RefMut<\'_, _>` in the current scope\\n --\x3e src/main.rs:13:13\\n |\\n13 | map.insert(\\"piccadilly\\", 11826);\\n | ^^^^^^ method not found in `RefMut<\'_, _>`\\n\\nerror[E0599]: no method named `insert` found for struct `RefMut<\'_, _>` in the current scope\\n --\x3e src/main.rs:14:13\\n |\\n14 | map.insert(\\"marbles\\", 38);\\n | ^^^^^^ method not found in `RefMut<\'_, _>`\\n\\nSome errors have detailed explanations: E0308, E0599.\\nFor more information about an error, try `rustc --explain E0308`.\\nerror: could not compile `playground` due to 5 previous errors\\n```\\n\\nIt might seem **a bit** ridiculous. However, I got to a point where the compiler\\nsuggested `use std::borrow::BorrowMut;` and it resulted in breaking parts of the\\ncode that worked previously. I think it may be a good idea to go over what is\\nhappening here.\\n\\n##### `.borrow_mut()` on `Rc>`\\n\\nLet\'s consider a variable `x` of type `Rc>`. What happens when you\\ncall `.borrow_mut()` on it? We can look at the `Rc` type, and\u2026 hang on! There is\\nneither `.borrow_mut()` method or `BorrowMut` trait implemented. How can we do it\\nthen?\\n\\nLet\'s go further and we can see that `RefCell` implements a `.borrow_mut()`\\nmethod. OK, but how can we call it on the `Rc`? Easily! `Rc` implements\\n`Deref` and therefore you can call methods on `Rc` objects as if they were\\n`T` objects. If we read on _`Deref` coercion_, we can see the following:\\n\\n> If `T` implements `Deref`, \u2026:\\n>\\n> - \u2026\\n> - `T` implicitly implements all the (immutable) methods of the type `U`.\\n\\nWhat is the requirement for the `.borrow_mut()` on `RefCell`? Well, it needs\\n`&self`, so the `Deref` implements the `.borrow_mut()` for the `Rc>`.\\n\\n##### `BorrowMut` trait\\n\\nI have not been able to find a lot on this trait. My guess is that it provides a\\nmethod instead of a syntactic sugar (`&mut x`) for the mutable borrow. And also\\nit provides default implementations for the types:\\n\\n```rust\\nimpl BorrowMut for String\\n\\nimpl BorrowMut for &mut T\\nwhere\\n T: ?Sized,\\n\\nimpl BorrowMut for T\\nwhere\\n T: ?Sized,\\n\\nimpl BorrowMut<[T]> for Vec\\nwhere\\n A: Allocator,\\n\\nimpl BorrowMut for Box\\nwhere\\n A: Allocator,\\n T: ?Sized,\\n\\nimpl BorrowMut<[T]> for [T; N]\\n```\\n\\n##### Conflict\\n\\nNow the question is why did it break the code\u2026 My first take was that the type\\n`Rc>` has some _specialized_ implementation of the `.borrow_mut()` and\\nthe `use` overrides it with the default, which is true **in a sense**. However\\nthere is no _specialized_ implementation. Let\'s have a look at the trait and the\\ntype signature on the `RefCell`:\\n\\n```rust\\n// trait\\npub trait BorrowMut: Borrow\\nwhere\\n Borrowed: ?Sized,\\n{\\n fn borrow_mut(&mut self) -> &mut Borrowed;\\n}\\n\\n// \u2039RefCell.borrow_mut()\u203a type signature\\npub fn borrow_mut(&self) -> RefMut<\'_, T>\\n```\\n\\nI think that we can definitely agree on the fact that `RefMut<\'_, T>` is not the\\n`RefCell`.\\n\\n**In my opinion**, `RefCell` implements a **separate** `.borrow_mut()` rather\\nthan implementing the interface, because it **cannot** satisfy the type requirements\\nof the trait.\\n\\n:::caution\\n\\nI wonder how are we expected to deal with this conflict, if and when, we need\\nboth the `.borrow_mut()` of the trait and `.borrow_mut()` of the `RefCell`.\\n\\n:::\\n\\n:::tip Fun fact\\n\\nI was suggested by the compiler to do `use std::borrow::BorrowMut;` and break the\\ncode.\\n\\nSo much for the _almighty_ and _helpful_ compiler\u2026\\n\\n:::\\n\\n## [Day 21: Monkey Math](https://adventofcode.com/2022/day/21)\\n\\n:::info tl;dr\\n\\nComputing an expression tree and then also finding ideal value for a node.\\n\\n:::\\n\\n### Solution\\n\\nRelatively simple, until you get to the 2nd part where you start to practice\\na lot of the copy-paste. I have managed to sneak some perverted stuff in there\\nthough :) Let\'s go through the details.\\n\\n#### `Default` trait\\n\\nFor the first time and twice I had a need to have a default value for my types,\\nenumerations in this case. Rust offers a very nice trait[^1] that is described\\nas:\\n\\n> A trait for giving a type a useful default value.\\n\\nI guess it sums it up nicely. The more interesting part about this is the fact\\nthat you can use the _macro machinery_ to save yourself some typing. If you have\\nenumeration of which the default value doesn\'t bear any parameter, you can just\\ndo[^2]:\\n\\n```rust\\n#[derive(Default)]\\nenum Color {\\n #[default]\\n White,\\n Gray,\\n Black,\\n}\\n```\\n\\n#### Abusing negation\\n\\nIf you want to use a _unary minus_ operator on your own type, you can implement\\na `Neg` trait[^3]. I was dealing with a binary tree and needed a way how to look\\nat the other side, so I have just implemented the negation for flipping between\\nleft and right :smile:\\n\\n[^1]: [`Default`](https://doc.rust-lang.org/std/default/trait.Default.html) docs\\n[^2]: Pardon my example from the graph algorithms ;)\\n[^3]: [`Neg`](https://doc.rust-lang.org/std/ops/trait.Neg.html) docs\\n\\n[_advent of code_]: https://adventofcode.com\\n[`itertools`]: https://crates.io/crates/itertools\\n[this reddit post and the comment]: https://www.reddit.com/r/adventofcode/comments/zb98pn/comment/iyq0ono"},{"id":"leetcode/sort-diagonally","metadata":{"permalink":"/blog/leetcode/sort-diagonally","editUrl":"https://github.com/mfocko/blog/tree/main/blog/leetcode/sort-matrix-diagonally.md","source":"@site/blog/leetcode/sort-matrix-diagonally.md","title":"Sort the matrix diagonally","description":"Compiler assisted development.","date":"2023-03-04T23:15:00.000Z","formattedDate":"March 4, 2023","tags":[{"label":"cpp","permalink":"/blog/tags/cpp"},{"label":"leetcode","permalink":"/blog/tags/leetcode"},{"label":"iterators","permalink":"/blog/tags/iterators"}],"readingTime":16.99,"hasTruncateMarker":true,"authors":[{"name":"Matej Focko","email":"me+blog@mfocko.xyz","title":"a.k.a. @mf","url":"https://gitlab.com/mfocko","imageURL":"https://github.com/mfocko.png","key":"mf"}],"frontMatter":{"title":"Sort the matrix diagonally","description":"Compiler assisted development.","date":"2023-03-04T23:15","slug":"leetcode/sort-diagonally","authors":"mf","tags":["cpp","leetcode","iterators"],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"3rd week of Advent of Code \'22 in Rust","permalink":"/blog/aoc-2022/3rd-week"},"nextItem":{"title":"2nd week of Advent of Code \'22 in Rust","permalink":"/blog/aoc-2022/2nd-week"}},"content":"Let\'s try to solve one of the LeetCode challenges in easy and hard mode at the\\nsame time.\\n\\n\x3c!--truncate--\x3e\\n\\n- Link to the problem: https://leetcode.com/problems/sort-the-matrix-diagonally/\\n\\n## Problem description\\n\\nA **matrix diagonal** is a diagonal line of cells starting from some cell in\\neither the topmost row or leftmost column and going in the bottom-right direction\\nuntil reaching the matrix\'s end. For example, the **matrix diagonal** starting\\nfrom `mat[2][0]`, where `mat` is a `6 x 3` matrix, includes cells `mat[2][0]`,\\n`mat[3][1]`, and `mat[4][2]`.\\n\\nGiven an `m x n` matrix `mat` of integers, sort each matrix diagonal in ascending\\norder and return the resulting matrix.\\n\\n### Example\\n\\n![Image describing the problem](https://assets.leetcode.com/uploads/2020/01/21/1482_example_1_2.png)\\n\\n## Skeleton and initial adjustments\\n\\nWe are given the following skeleton for the C++ and the given challenge:\\n\\n```cpp\\nclass Solution {\\npublic:\\n vector> diagonalSort(vector>& mat) {\\n\\n }\\n};\\n```\\n\\nThe task is to sort the passed matrix diagonally and then return it. First of all,\\nI don\'t like to solve this in a web browser, so we\'ll need to adjust it accordingly\\nfor running it locally. We\'ll start by including the `vector` header and using\\nfully-qualified namespaces[^1] and also adding few tests:\\n\\n```cpp\\n#include \\n#include \\n\\nusing matrix = std::vector>;\\n\\nclass Solution {\\npublic:\\n matrix diagonalSort(matrix& mat)\\n {\\n }\\n};\\n\\nstatic void test_case_1()\\n{\\n // Input: mat = [[3,3,1,1],[2,2,1,2],[1,1,1,2]]\\n // Output: [[1,1,1,1],[1,2,2,2],[1,2,3,3]]\\n\\n Solution s;\\n assert((s.diagonalSort(std::vector { std::vector { 3, 3, 1, 1 },\\n std::vector { 2, 2, 1, 2 },\\n std::vector { 1, 1, 1, 2 } })\\n == std::vector { std::vector { 1, 1, 1, 1 },\\n std::vector { 1, 2, 2, 2 },\\n std::vector { 1, 2, 3, 3 } }));\\n}\\n\\nstatic void test_case_2()\\n{\\n // Input: mat =\\n // [[11,25,66,1,69,7],[23,55,17,45,15,52],[75,31,36,44,58,8],[22,27,33,25,68,4],[84,28,14,11,5,50]]\\n // Output:\\n // [[5,17,4,1,52,7],[11,11,25,45,8,69],[14,23,25,44,58,15],[22,27,31,36,50,66],[84,28,75,33,55,68]]\\n\\n Solution s;\\n assert((s.diagonalSort(std::vector { std::vector { 11, 25, 66, 1, 69, 7 },\\n std::vector { 23, 55, 17, 45, 15, 52 },\\n std::vector { 75, 31, 36, 44, 58, 8 },\\n std::vector { 22, 27, 33, 25, 68, 4 },\\n std::vector { 84, 28, 14, 11, 5, 50 } })\\n == std::vector { std::vector { 5, 17, 4, 1, 52, 7 },\\n std::vector { 11, 11, 25, 45, 8, 69 },\\n std::vector { 14, 23, 25, 44, 58, 15 },\\n std::vector { 22, 27, 31, 36, 50, 66 },\\n std::vector { 84, 28, 75, 33, 55, 68 } }));\\n}\\n\\nint main()\\n{\\n test_case_1();\\n test_case_2();\\n\\n return 0;\\n}\\n```\\n\\nWe need to return the matrix, but we\'re given a reference to the input matrix. We\\ncan easily abuse the C++ here and just switch the reference to value, this way\\nthe matrix will be copied when passed to the function, we can sort the copy and\\njust return it back. And we also get yelled by the compiler for the fact that the\\nmethod doesn\'t return anything yet, so to make it \u201cshut up\u201d we will just return\\nthe input for now:\\n\\n```diff\\n- matrix diagonalSort(matrix& mat)\\n+ matrix diagonalSort(matrix mat)\\n {\\n+ return mat;\\n }\\n```\\n\\nNow, we get the copy and we\'re good to go.\\n\\n## Na\xefve solution\\n\\nAs you may know, C++ offers a plethora of functions that can be used to your\\nadvantage, given that you know how to \u201cbend\u201d the data structures accordingly.\\n\\nWhat does that mean for us? Well, we have an `std::sort`, we can use it, right?\\nLet\'s have a look at it:\\n\\n```cpp\\ntemplate< class RandomIt >\\nvoid sort( RandomIt first, RandomIt last );\\n```\\n\\nThis overload is more than we need. What does it do? It just sorts the elements\\nin the range `[first, last)` using `operator<` on them. We can\'t sort the whole\\nmatrix using this, but\u2026 we can sort just \xbbone\xab diagonal without doing much work\\non our end.\\n\\nWhat is the `RandomIt` type though? If we look more into the documentation, we\\ncan easily find the requirements for it and also learn that it\'s a _random access_\\n_iterator_ and allows swapping its values at the same time.\\n\\n:::tip Random access iterator\\n\\nWhat is the _random access iterator_ though? We can find it in a documentation\\nand see the following description:\\n\\n> A **LegacyRandomAccessIterator** is a [LegacyBidirectionalIterator](https://en.cppreference.com/w/cpp/named_req/BidirectionalIterator)\\n> that can be moved to point to any element in constant time.\\n\\nAfter that we can see all the requirements for it being listed. I don\'t feel like\\nreading them right now, so we will just use it and see where the compilation blows\\nup, i.e. \u201c_compiler-assisted development_\u201d[^2] if you will ;)\\n\\n:::\\n\\nNow we know that we can use `std::sort` to sort the diagonal itself, but we also\\nneed to get the diagonals somehow. I\'m rather lazy, so I\'ll just delegate it to\\nsomeone else[^3]. And that way we get\\n\\n```cpp\\nmatrix diagonalSort(matrix mat)\\n{\\n // we iterate over the diagonals\\n for (auto d : diagonals(mat)) {\\n // and we sort each diagonal\\n std::sort(d.begin(), d.end());\\n }\\n\\n // we take the matrix by copy, so we can sort in-situ and return the copy\\n // that we sorted\\n return mat;\\n}\\n```\\n\\nThis solution looks very simple, doesn\'t it? Well, cause it is.\\nLet\'s try compiling it:\\n\\n```\\nmatrix-sort.cpp:11:23: error: use of undeclared identifier \'diagonals\' [clang-diagnostic-error]\\n for (auto d : diagonals(mat)) {\\n ^\\nFound compiler error(s).\\nmake: *** [makefile:14: tidy] Error 1\\n```\\n\\nOK, seems about right. We haven\'t implemented the `diagonals` yet. And based on\\nwhat we\'ve written so far, we need a function or a class `diagonals` that will\\ngive us the diagonals we need.\\n\\n## Implementing the `diagonals`\\n\\nCool, so we need the function that will let us go through each and every diagonal\\nin our matrix. We use the _for-range_ loop, so whatever we get back from the\\n`diagonals` must support `.begin()` and `.end()`. Since I am a masochist, we will\\ndo such functionality for a matrix of any type, not just the `int` from the challenge.\\n\\nAs I said, we need to be able to\\n\\n- construct the object\\n- get the beginning\\n- get the end (the \u201csentinel\u201d)\\n\\n```cpp\\ntemplate \\nclass diagonals {\\n using matrix_t = std::vector>;\\n\\n matrix_t& _matrix;\\n\\npublic:\\n diagonals(matrix_t& m)\\n : _matrix(m)\\n {\\n }\\n diagonals_iter begin()\\n {\\n /* TODO */\\n }\\n diagonals_iter end()\\n {\\n /* TODO */\\n }\\n};\\n```\\n\\nNow we have a `diagonals` that we can use to go through the diagonals. We haven\'t\\nimplemented the core of it yet. Let\'s go through what we have for now.\\n\\nWe have a templated class with templated `T` that is used as a placeholder for any\\ntype we would store in the matrix. Because I\'m lazy, I have defined the `matrix_t`\\ntype that is a \u201cshortcut\u201d for `std::vector>`, so I don\'t have to\\ntype it out all the time. Of course, we need to store the matrix, we are given,\\nas a private attribute. And then just have the constructor and the 2 methods we\\nneed for the _for-range_.\\n\\n### Iterating over diagonals\\n\\nNow that we have an object that will allow us to iterate through the diagonals,\\nwe need to implement the iterating itself. We need to go through all of them, so\\nwe have multiple options how to do so. I have decided to start from the \u201cmain\u201d\\ndiagonal that starts at `(0, 0)` index and then proceed with the diagonals starting\\nin the first row, followed by the rest of the diagonals in the first column.\\n\\nWe need to be able to tell that we\'ve iterated through all of them, and also we\\nneed to know which diagonal is next. For that purpose we will pass the indices\\nof the first cell on the diagonal. That way we can always tell how to move forward.\\n\\nWe will start by updating the `begin` and `end` to reflect our choice accordingly.\\n\\n```cpp\\ndiagonals_iter begin() { return diagonals_iter { _matrix, 0, 0 }; }\\ndiagonals_iter end() { return diagonals_iter { _matrix, 0, _matrix.size() }; }\\n```\\n\\nFor the `begin` we return the first diagonal that starts at `(0, 0)`. And because\\nwe have decided to do the diagonals in the first column at the end, the first\\ndiagonal that is not a valid one is the one at `(0, height)`. Apart from the\\nindices, we also need to pass reference to the matrix itself.\\n\\n:::note\\n\\nYou may have noticed that we also include the diagonals that have length 1,\\nspecifically the ones at `(0, height - 1)` and `(width - 1, 0)`. We are implementing\\nan iterator that **should not** care about the way it\'s being used. Therefore, we\\ndon\'t care about the fact they don\'t need to be sorted.\\n\\n:::\\n\\nCool, let\'s leave the iterator itself to someone else, right?[^4]\\n\\n### Implementing the iterator over diagonals\\n\\nWe can start with a simple skeleton based on the information that we pass from\\nthe `diagonals`. Also to utilize the `matrix_t` and also contain implementation\\ndetails hidden away, we will put this code into the `diagonals` class.\\n\\n```cpp\\nclass diagonals_iter {\\n matrix_t& m;\\n std::size_t x;\\n std::size_t y;\\n\\npublic:\\n diagonals_iter(matrix_t& matrix, std::size_t x, std::size_t y)\\n : m(matrix)\\n , x(x)\\n , y(y)\\n {\\n }\\n};\\n```\\n\\nIn this case we will be implementing a \u201csimple\u201d forward iterator, so we don\'t\\nneed to implement a lot. Notably it will be:\\n\\n- inequality operator (we need to know when we reach the end and have nothing to\\n iterate over)\\n- preincrementation operator (we need to be able to move around the iterable)\\n- dereference operator (we need to be able to retrieve the objects we iterate\\n over)\\n\\n```cpp\\nclass diagonals_iter {\\n matrix_t& m;\\n std::size_t x;\\n std::size_t y;\\n\\npublic:\\n diagonals_iter(matrix_t& matrix, std::size_t x, std::size_t y)\\n : m(matrix)\\n , x(x)\\n , y(y)\\n {\\n }\\n\\n bool operator!=(const diagonals_iter& rhs) const\\n {\\n // iterators are not equal if they reference different matrices, or\\n // their positions differ\\n return m != rhs.m || x != rhs.x || y != rhs.y;\\n }\\n\\n diagonals_iter& operator++()\\n {\\n if (y != 0) {\\n // iterating through diagonals down the first column\\n y++;\\n return *this;\\n }\\n\\n // iterating the diagonals along the first row\\n x++;\\n if (x == m.front().size()) {\\n // switching to diagonals in the first column\\n x = 0;\\n y++;\\n }\\n\\n return *this;\\n }\\n\\n diagonal operator*() const { return diagonal { m, x, y }; }\\n};\\n```\\n\\nLet\'s go one-by-one. Inequality operator is rather simple, just compare iterator\'s\\nattributes field-by-field. If you think about it, checking inequality of two 2D\\nvectors may be a bit inefficient, therefore, we can swap around and check it as\\na last thing.\\n\\n```diff\\n- return m != rhs.m || x != rhs.x || y != rhs.y;\\n+ return x != rhs.x || y != rhs.y || m != rhs.m;\\n```\\n\\nPreincrementation is where the magic happens. If you have a better look, you can\\nsee two branches of this operation:\\n\\n1. When `y != 0` (we\'re iterating over the diagonals in the first column)\\n In this case, we just bump the row and we\'re done.\\n2. When `y == 0` (we\'re iterating over the diagonals in the first row)\\n In this case, we bump the column and check if we haven\'t gotten out of bounds,\\n i.e. the end of the first row. If we get out of the bounds, we\'re continuing\\n with the second diagonal in the first column.\\n\\nDereferencing the iterator must \u201cyield\u201d something. In our case it will be the\\ndiagonal that we want to sort. For sorting we need just the iterators that can\\nmove around said diagonal. The simplest thing, we can do, is to delegate it to\\nsomething else. In our case it will be a class called `diagonal`.\\n\\n## Implementing the `diagonal` itself\\n\\nAfter implementing the iterator over diagonals, we know that all we need to describe\\na diagonal is the matrix itself and the \u201cstart\u201d of the diagonal (row and column).\\nAnd we also know that the diagonal must provide some iterators for the `std::sort`\\nfunction. We can start with the following skeleton:\\n\\n```cpp\\ntemplate \\nclass diagonal {\\n using matrix_t = std::vector>;\\n\\n matrix_t& matrix;\\n std::size_t x;\\n std::size_t y;\\n\\npublic:\\n diagonal(matrix_t& matrix, std::size_t x, std::size_t y)\\n : matrix(matrix)\\n , x(x)\\n , y(y)\\n {\\n }\\n\\n diagonal_iter begin() const { return diagonal_iter { matrix, x, y }; }\\n\\n diagonal_iter end() const\\n {\\n auto max_x = matrix[y].size();\\n auto max_y = matrix.size();\\n\\n // we need to find the distance in which we get out of bounds (either in\\n // column or row)\\n auto steps = std::min(max_x - x, max_y - y);\\n\\n return diagonal_iter { matrix, x + steps, y + steps };\\n }\\n};\\n```\\n\\nInitialization is rather simple, we just \u201ckeep\u201d the stuff we get, `begin` is the\\nsimplest, we just delegate.\\n\\nIn case of the `end`, it gets more complicated. We need to know where is the \u201cend\u201d\\nof the diagonal. Since `end` should point to the first element \u201cafter\u201d the iterable,\\nwe know that it\'s the first position of the iterator where either `y` becomes\\n`matrix.size()` or `x` becomes `matrix[y].size()`. Also we are moving along diagonal,\\nduh, therefore we can deduce the first \u201cposition\u201d afterwards by minimal amount of\\nsteps to get out of the any column or row, hence `std::min(max_x - x, max_y - y)`.\\nFinal position is then computed simply by adding the steps to the beginning of\\nthe diagonal.\\n\\nNow we just need to finish the iterator for the diagonal itself and we\'re done.\\n\\n### Implementing `diagonal_iter`\\n\\nThis part is the hardest from all we need to do. It\'s because of the requirements\\nof the `std::sort` that requires us to implement a _random access iterator_. I have\\nbriefly described it above, and \u201cin a nutshell\u201d it means that we need to implement\\nan iterator that can move in constant time along the diagonal in any amount of\\nsteps.\\n\\nLet\'s go through all of the functionality that our iterator needs to support to\\nbe used in `std::sort`. We need the usual operations like:\\n\\n- equality/inequality\\n- incrementation\\n- dereferencing\\n\\nWe will also add all the types that our iterator uses with the category of the\\niterator, i.e. what interface it supports:\\n\\n```cpp\\nclass diagonal_iter {\\n // we need to keep reference to the matrix itself\\n matrix_t& m;\\n\\n // we need to be able to tell our current position\\n std::size_t x;\\n std::size_t y;\\n\\npublic:\\n using difference_type = std::ptrdiff_t;\\n using value_type = T;\\n using pointer = T*;\\n using reference = T&;\\n using iterator_category = std::random_access_iterator_tag;\\n\\n diagonal_iter(matrix_t& matrix,\\n std::size_t x,\\n std::size_t y)\\n : m(matrix)\\n , x(x)\\n , y(y)\\n {\\n }\\n\\n bool operator==(const diagonal_iter& rhs) const\\n {\\n return x == rhs.x && y == rhs.y && m == rhs.m;\\n }\\n\\n diagonal_iter& operator++()\\n {\\n // we are moving along the diagonal, so we increment both \u2039x\u203a and \u2039y\u203a at\\n // the same time\\n x++;\\n y++;\\n return *this;\\n }\\n\\n reference operator*() const { return m[y][x]; }\\n};\\n```\\n\\nThis is pretty similar to the previous iterator, but now we need to implement the\\nremaining requirements of the _random access iterator_. Let\'s see what those are:\\n\\n- decrementation - cause we need to be able to move backwards too, since _random _\\n _access iterator_ extends the interface of _bidirectional iterator_\\n- moving the iterator in either direction by steps given as an integer\\n- being able to tell the distance between two iterators\\n- define an ordering on the iterators\\n\\nLet\'s fill them in:\\n\\n```cpp\\nclass diagonal_iter {\\n // we need to keep reference to the matrix itself\\n matrix_t& m;\\n\\n // we need to be able to tell our current position\\n std::size_t x;\\n std::size_t y;\\n\\npublic:\\n using difference_type = std::ptrdiff_t;\\n using value_type = T;\\n using pointer = T*;\\n using reference = T&;\\n using iterator_category = std::random_access_iterator_tag;\\n\\n diagonal_iter(matrix_t& matrix,\\n std::size_t x,\\n std::size_t y)\\n : m(matrix)\\n , x(x)\\n , y(y)\\n {\\n }\\n\\n bool operator==(const diagonal_iter& rhs) const\\n {\\n return x == rhs.x && y == rhs.y && m == rhs.m;\\n }\\n\\n diagonal_iter& operator++()\\n {\\n // we are moving along the diagonal, so we increment both \u2039x\u203a and \u2039y\u203a at\\n // the same time\\n x++;\\n y++;\\n return *this;\\n }\\n\\n reference operator*() const { return m[y][x]; }\\n\\n // exactly opposite to the incrementation\\n diagonal_iter operator--()\\n {\\n x--;\\n y--;\\n return *this;\\n }\\n\\n // moving \u2039n\u203a steps back is same as calling decrementation \u2039n\u203a-times, so we\\n // can just return a new iterator and subtract \u2039n\u203a from both coordinates in\\n // the matrix\\n diagonal_iter operator-(difference_type n) const\\n {\\n return diagonal_iter { m, x - n, y - n };\\n }\\n\\n // here we assume that we are given two iterators on the same diagonal\\n difference_type operator-(const diagonal_iter& rhs) const\\n {\\n assert(m == rhs.m);\\n return x - rhs.x;\\n }\\n\\n // counterpart of moving \u2039n\u203a steps backwards\\n diagonal_iter operator+(difference_type n) const\\n {\\n return diagonal_iter { m, x + n, y + n };\\n }\\n\\n // we compare the coordinates, and also assume that those 2 iterators are\\n // lying on the same diagonal\\n bool operator<(const diagonal_iter& rhs) const\\n {\\n assert(m == rhs.m);\\n return x < rhs.x && y < rhs.y;\\n }\\n};\\n```\\n\\nAt this point we could probably try and compile it, right? If we do so, we will\\nget yelled at by a compiler for the following reasons:\\n\\n```\\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1792:11: error: object of type \'diagonal::diagonal_iter\' cannot be assigned because its copy assignment operator is implicitly deleted [clang-diagnostic-error]\\n __last = __next;\\n ^\\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1817:11: note: in instantiation of function template specialization \'std::__unguarded_linear_insert::diagonal_iter, __gnu_cxx::__ops::_Val_less_iter>\' requested here\\n std::__unguarded_linear_insert(__i,\\n ^\\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1849:9: note: in instantiation of function template specialization \'std::__insertion_sort::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>\' requested here\\n std::__insertion_sort(__first, __first + int(_S_threshold), __comp);\\n ^\\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1940:9: note: in instantiation of function template specialization \'std::__final_insertion_sort::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>\' requested here\\n std::__final_insertion_sort(__first, __last, __comp);\\n ^\\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:4820:12: note: in instantiation of function template specialization \'std::__sort::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>\' requested here\\n std::__sort(__first, __last, __gnu_cxx::__ops::__iter_less_iter());\\n ^\\nmatrix-sort.cpp:161:18: note: in instantiation of function template specialization \'std::sort::diagonal_iter>\' requested here\\n std::sort(d.begin(), d.end());\\n ^\\nmatrix-sort.cpp:17:19: note: copy assignment operator of \'diagonal_iter\' is implicitly deleted because field \'m\' is of reference type \'diagonal::matrix_t &\' (aka \'vector> &\')\\n matrix_t& m;\\n ^\\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1830:2: error: no matching function for call to \'__unguarded_linear_insert\' [clang-diagnostic-error]\\n std::__unguarded_linear_insert(__i,\\n ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1850:9: note: in instantiation of function template specialization \'std::__unguarded_insertion_sort::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>\' requested here\\n std::__unguarded_insertion_sort(__first + int(_S_threshold), __last,\\n ^\\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1940:9: note: in instantiation of function template specialization \'std::__final_insertion_sort::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>\' requested here\\n std::__final_insertion_sort(__first, __last, __comp);\\n ^\\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:4820:12: note: in instantiation of function template specialization \'std::__sort::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>\' requested here\\n std::__sort(__first, __last, __gnu_cxx::__ops::__iter_less_iter());\\n ^\\nmatrix-sort.cpp:161:18: note: in instantiation of function template specialization \'std::sort::diagonal_iter>\' requested here\\n std::sort(d.begin(), d.end());\\n ^\\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1782:5: note: candidate template ignored: substitution failure [with _RandomAccessIterator = diagonal::diagonal_iter, _Compare = __gnu_cxx::__ops::_Val_less_iter]\\n __unguarded_linear_insert(_RandomAccessIterator __last,\\n ^\\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1923:11: error: object of type \'diagonal::diagonal_iter\' cannot be assigned because its copy assignment operator is implicitly deleted [clang-diagnostic-error]\\n __last = __cut;\\n ^\\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1937:9: note: in instantiation of function template specialization \'std::__introsort_loop::diagonal_iter, long, __gnu_cxx::__ops::_Iter_less_iter>\' requested here\\n std::__introsort_loop(__first, __last,\\n ^\\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:4820:12: note: in instantiation of function template specialization \'std::__sort::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>\' requested here\\n std::__sort(__first, __last, __gnu_cxx::__ops::__iter_less_iter());\\n ^\\nmatrix-sort.cpp:161:18: note: in instantiation of function template specialization \'std::sort::diagonal_iter>\' requested here\\n std::sort(d.begin(), d.end());\\n ^\\nmatrix-sort.cpp:17:19: note: copy assignment operator of \'diagonal_iter\' is implicitly deleted because field \'m\' is of reference type \'diagonal::matrix_t &\' (aka \'vector> &\')\\n matrix_t& m;\\n ^\\n```\\n\\nThat\'s a lot of noise, isn\'t it? Let\'s focus on the important parts:\\n\\n```\\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1792:11: error: object of type \'diagonal::diagonal_iter\' cannot be assigned because its copy assignment operator is implicitly deleted [clang-diagnostic-error]\\n\u2026\\nmatrix-sort.cpp:17:19: note: copy assignment operator of \'diagonal_iter\' is implicitly deleted because field \'m\' is of reference type \'diagonal::matrix_t &\' (aka \'vector> &\')\\n matrix_t& m;\\n ^\\n```\\n\\nAh! We have a reference in our iterator, and this prevents us from having a copy\\nassignment operator (that is used \u201csomewhere\u201d in the sorting algorithm). Well\u2026\\nLet\'s just wrap it!\\n\\n```diff\\n# we need to keep a different type than reference\\n- matrix_t& m;\\n+ std::reference_wrapper m;\\n\\n# in comparison we need to get the reference out of the wrapper first\\n- return x == rhs.x && y == rhs.y && m == rhs.m;\\n+ return x == rhs.x && y == rhs.y && m.get() == rhs.m.get();\\n\\n# same when we return a reference to the \u201ccell\u201d in the matrix\\n- reference operator*() const { return m[y][x]; }\\n+ reference operator*() const { return m.get()[y][x]; }\\n\\n# and finally in the assertions that we set for the \u201cdistance\u201d and \u201cless than\u201d\\n- assert(m == rhs.m);\\n+ assert(m.get() == rhs.m.get());\\n```\\n\\nWe\'re done now! We have written an iterator over diagonals for a 2D `vector`. You can have a look at the final result [here](pathname:///files/blog/leetcode/sort-matrix-diagonally/matrix-sort.cpp).\\n\\n[^1]: just because I\'m used to it and don\'t care about your opinion ;)\\n[^2]: exercise at your own risk\\n[^3]: me in 5 minutes in fact, but don\'t make me scared\\n[^4]: me in the next section\u2026"},{"id":"aoc-2022/2nd-week","metadata":{"permalink":"/blog/aoc-2022/2nd-week","editUrl":"https://github.com/mfocko/blog/tree/main/blog/aoc-2022/02-week-2.md","source":"@site/blog/aoc-2022/02-week-2.md","title":"2nd week of Advent of Code \'22 in Rust","description":"Surviving second week in Rust.","date":"2022-12-25T23:15:00.000Z","formattedDate":"December 25, 2022","tags":[{"label":"advent-of-code","permalink":"/blog/tags/advent-of-code"},{"label":"advent-of-code-2022","permalink":"/blog/tags/advent-of-code-2022"},{"label":"rust","permalink":"/blog/tags/rust"}],"readingTime":20.875,"hasTruncateMarker":true,"authors":[{"name":"Matej Focko","email":"me+blog@mfocko.xyz","title":"a.k.a. @mf","url":"https://gitlab.com/mfocko","imageURL":"https://github.com/mfocko.png","key":"mf"}],"frontMatter":{"title":"2nd week of Advent of Code \'22 in Rust","description":"Surviving second week in Rust.","date":"2022-12-25T23:15","slug":"aoc-2022/2nd-week","authors":"mf","tags":["advent-of-code","advent-of-code-2022","rust"],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"Sort the matrix diagonally","permalink":"/blog/leetcode/sort-diagonally"},"nextItem":{"title":"1st week of Advent of Code \'22 in Rust","permalink":"/blog/aoc-2022/1st-week"}},"content":"Let\'s go through the second week of [_Advent of Code_] in Rust.\\n\\n\x3c!--truncate--\x3e\\n\\n## [Day 8: Treetop Tree House](https://adventofcode.com/2022/day/8)\\n\\n:::info tl;dr\\n\\nWe get a forest and we want to know how many trees are visible from the outside.\\nApart from that we want to find the best view.\\n\\n:::\\n\\nNothing interesting. We are moving around 2D map though. And indexing can get a\\nbit painful when doing so, let\'s refactor it a bit ;) During the preparation for\\nthe AoC, I have written `Vector2D` and now it\'s time to extend it with indexing\\nof `Vec` of `Vec`s. In my solution I was manipulating with indices in the following\\nway:\\n\\n- swapping them\\n- checking whether they are correct indices for the `Vec>`\\n- indexing `Vec>` with them\\n\\n:::caution\\n\\nI\'m getting familiar with Rust and starting to \u201cabuse\u201d it\u2026 While doing so, I\'m\\nalso uncovering some \u201cfeatures\u201d that I don\'t really like. Therefore I will mark\\nall of my rants with _thicc_ **\xab\u21af\xbb** mark and will try to \u201clock\u201d them into their\\nown \u201cbox of hell\u201d.\\n\\n:::\\n\\n#### Swapping indices\\n\\nRelatively simple implementation, just take the values, swap them and return new\\nvector.\\n\\n```rust\\nimpl Vector2D {\\n pub fn swap(&self) -> Self {\\n Self {\\n x: self.y,\\n y: self.x,\\n }\\n }\\n}\\n```\\n\\nPretty straight-forward implementation, but let\'s talk about the `T: Copy`. We\\nneed to use it, since we are returning a **new** vector, with swapped **values**.\\nIf we had values that cannot be copied, the only thing we could do, would be a\\nvector of references (and it would also introduce a lifetime, to which we\'ll get\\nlater on). This is pretty similar with the operations on sets from the first week.\\n\\n#### Indexing `Vec`\\n\\nI will start with the indexing, cause bound-checking is a bit more\u2026 complicated\\nthan I would like to.\\n\\n```rust\\npub fn index<\'a, T, U>(v: &\'a [Vec], idx: &Vector2D) -> &\'a U\\nwhere\\n usize: TryFrom,\\n >::Error: Debug,\\n T: Copy,\\n{\\n let (x, y): (usize, usize) = (idx.x.try_into().unwrap(), idx.y.try_into().unwrap());\\n &v[y][x]\\n}\\n```\\n\\nLet\'s talk about this mess\u2026 Body of the function is probably the most easy part\\nand should not be hard to understand, we just take the `x` and `y` and convert\\nthem both to `usize` type that can be used later on for indexing.\\n\\nThe type signature of the function is where the fun is at :wink: We are trying\\nto convert unknown type to `usize`, so we must bound the `T` as a type that can\\nbe converted to `usize`, that\'s how we got `usize: TryFrom` which basically\\nsays that `usize` must implement `TryFrom` trait and therefore allows us to\\nconvert the indices to actual `usize` indices. Using `.unwrap()` also forces us\\nto bound the error that can occur when converting `T` into `usize`, that\'s how\\nwe get `>::Error: Debug` which loosely means\\n\\n> error during conversion of `T` into `usize` must implement `Debug`,\\n> i.e. can be printed in some way or other\\n\\n`T: Copy` is required by `.try_into()` which takes `T` by-value.\\n\\nAnd now we are left only with the first line of the definition.\\n\\n:::note\\n\\nSkilled Rustaceans might notice that this implementation is rather flaky and can\\nbreak in multiple places at once. I\'ll get back to it\u2026\\n\\n:::\\n\\nLet\'s split it in multiple parts:\\n\\n- `v: &\'a [Vec]` represents the 2D `Vec`, we are indexing, `Vec` implements\\n `Slice` trait and _clippy_ recommends using `&[T]` to `&Vec`, exact details\\n are unknown to me\\n- `idx: &Vector2D` represents the _indices_ which we use, we take them by\\n reference to avoid an unnecessary copy\\n- `-> &\'a U` means that we are returning a _reference_ to some value of type `U`.\\n Now the question is what does the `\'a` mean, we can also see it as a generic\\n type declared along `T` and `U`. And the answer is _relatively_ simple, `\'a`\\n represents a _lifetime_. We take the `v` by a reference and return a reference,\\n borrow checker validates all of the _borrows_ (or references), so we need to\\n specify that our returned value has _the same lifetime_ as the vector we have\\n taken by a reference, i.e. returned reference must live at least as long as the\\n `v`. This way we can \u201cbe sure\u201d that the returned reference is valid.\\n\\n##### Issues\\n\\nFirst issue that our implementation has is the fact that we cannot get a mutable\\nreference out of that function. This could be easily resolved by introducing new\\nfunction, e.g. `index_mut`. Which I have actually done while writing this part:\\n\\n```rust\\npub fn index_mut<\'a, T, U>(v: &\'a mut [Vec], idx: &Vector2D) -> &\'a mut U\\nwhere\\n usize: TryFrom,\\n >::Error: Debug,\\n T: Copy,\\n{\\n let (x, y): (usize, usize) = (idx.x.try_into().unwrap(), idx.y.try_into().unwrap());\\n &mut v[y][x]\\n}\\n```\\n\\n:::caution **\xab\u21af\xbb** Why can\'t we use one function?\\n\\nWhen we consider a `Vec`, we don\'t need to consider containers as `T`, Rust\\nimplements indexing as traits `Index` and `IndexMut` that do the dirty work\\nbehind syntactic sugar of `container[idx]`.\\n\\nHowever, implementing of traits is not allowed for _external_ types, i.e. types\\nthat you haven\'t defined yourself. This means that you can implement indexing\\nover containers that you have implemented yourself, but you cannot use your own\\ntypes for indexing \u201cbuilt-in\u201d types.\\n\\nAnother part of this rabbit hole is trait `SliceIndex` that is of a relevance\\nbecause of\\n\\n```rust\\nimpl Index for [T]\\nwhere\\n I: SliceIndex<[T]>\\n\\nimpl Index for Vec\\nwhere\\n I: SliceIndex<[T]>,\\n A: Allocator\\n\\nimpl Index for [T; N]\\nwhere\\n [T]: Index\\n```\\n\\nIn other words, if your type implements `SliceIndex` trait, it can be used\\nfor indexing. As of now, this trait has all of its required methods experimental\\nand is marked as `unsafe`.\\n\\n:::\\n\\nAnother problem is a requirement for indexing either `[Vec]` or `Vec>`.\\nThis requirement could be countered by removing inner type `Vec` and constraining\\nit by a trait `Index` (or `IndexMut` respectively) in a following way\\n\\n```rust\\npub fn index<\'a, C, T>(v: &\'a [C], idx: &Vector2D) -> &\'a C::Output\\nwhere\\n usize: TryFrom,\\n >::Error: Debug,\\n T: Copy,\\n C: Index\\n{\\n let (x, y): (usize, usize) = (idx.x.try_into().unwrap(), idx.y.try_into().unwrap());\\n &v[y][x]\\n}\\n```\\n\\nGiven this, we can also give a more meaningful typename for indexing type, such\\nas `I`.\\n\\n#### Checking bounds\\n\\nNow we can get to the boundary checks, it is very similar, but a more\u2026 dirty.\\nFirst approach that came up was to convert the indices in `Vector2D` to `usize`,\\nbut when you add the indices up, e.g. when checking the neighbors, you can end\\nup with negative values which, unlike in C++, causes an error (instead of underflow\\nthat you can use to your advantage; you can easily guess how).\\n\\nSo how can we approach this then? Well\u2026 we will convert the bounds instead of\\nthe indices and that lead us to:\\n\\n```rust\\npub fn in_range(v: &[Vec], idx: &Vector2D) -> bool\\nwhere\\n usize: TryInto,\\n >::Error: Debug,\\n T: PartialOrd + Copy,\\n{\\n idx.y >= 0.try_into().unwrap()\\n && idx.y < v.len().try_into().unwrap()\\n && idx.x >= 0.try_into().unwrap()\\n && idx.x\\n < v[TryInto::::try_into(idx.y).unwrap()]\\n .len()\\n .try_into()\\n .unwrap()\\n}\\n```\\n\\nYou can tell that it\'s definitely a shitty code. Let\'s improve it now! We will\\nget back to the original idea, but do it better. We know that we cannot convert\\nnegative values into `usize`, **but** we also know that conversion like that\\nreturns a `Result` which we can use to our advantage.\\n\\n```rust\\npub fn in_range(v: &[Vec], idx: &Vector2D) -> bool\\nwhere\\n T: Copy,\\n usize: TryFrom,\\n{\\n usize::try_from(idx.y)\\n .and_then(|y| usize::try_from(idx.x).map(|x| y < v.len() && x < v[y].len()))\\n .unwrap_or(false)\\n}\\n```\\n\\n`Result` is a type similar to `Either` in Haskell and it allows us to chain\\nmultiple operations on correct results or propagate the original error without\\ndoing anything. Let\'s dissect it one-by-one.\\n\\n`try_from` is a method implemented in `TryFrom` trait, that allows you to convert\\ntypes and either successfully convert them or fail (with a reasonable error). This\\nmethod returns `Result`.\\n\\nWe call `and_then` on that _result_, let\'s have a look at the type signature of\\n`and_then`, IMO it explains more than enough:\\n\\n```rust\\npub fn and_then(self, op: F) -> Result\\nwhere\\n F: FnOnce(T) -> Result\\n```\\n\\nOK\u2026 So it takes the result and a function and returns another result with\\ndifferent value and different error. However we can see that the function, which\\nrepresents an operation on a result, takes just the value, i.e. it doesn\'t care\\nabout any previous error. To make it short:\\n\\n> `and_then` allows us to run an operation, which can fail, on the correct result\\n\\nWe parsed a `y` index and now we try to convert the `x` index with `try_from`\\nagain, but on that result we use `map` rather than `and_then`, why would that be?\\n\\n```rust\\npub fn map(self, op: F) -> Result\\nwhere\\n F: FnOnce(T) -> U\\n```\\n\\nHuh\u2026 `map` performs an operation that **cannot** fail. And finally we use\\n`unwrap_or` which takes the value from result, or in case of an error returns the\\ndefault that we define.\\n\\nHow does this work then? If `y` is negative, the conversion fails and the error\\npropagates all the way to `unwrap_or`, if `y` can be a correct `usize` value, then\\nwe do the same with `x`. If `x` is negative, we propagate the error as with `y`,\\nand if it\'s not, then we check whether it exceeds the higher bounds or not.\\n\\n### Solution\\n\\nRelatively simple, you just need follow the rules and not get too smart, otherwise\\nit will get back at you.\\n\\n## [Day 9: Rope Bridge](https://adventofcode.com/2022/day/9)\\n\\n:::info tl;dr\\n\\nWe get a rope with knots and we want to track how many different positions are\\nvisited with the rope\'s tail.\\n\\n:::\\n\\nBy this day, I have come to a conclusion that current skeleton for each day\\ngenerates a lot of boilerplate. And even though it can be easily copied, it\'s\\njust a waste of space and unnecessary code. Let\'s \u201csimplify\u201d this (on one end\\nwhile creating monster on the other end). I\'ve gone through what we need in the\\npreparations for the AoC. Let\'s sum up our requirements:\\n\\n- parsing\\n- part 1 & 2\\n- running on sample / input\\n- tests\\n\\nParsing and implementation of both parts is code that changes each day and we\\ncannot do anything about it. However running and testing can be simplified!\\n\\nLet\'s introduce and export a new module `solution` that will take care of all of\\nthis. We will start by introducing a trait for each day.\\n\\n```rust\\npub trait Solution {\\n fn parse_input>(pathname: P) -> Input;\\n\\n fn part_1(input: &Input) -> Output;\\n fn part_2(input: &Input) -> Output;\\n}\\n```\\n\\nThis does a lot of work for us already, we have defined a trait and for each day\\nwe will create a structure representing a specific day. That structure will also\\nimplement the `Solution` trait.\\n\\nNow we need to get rid of the boilerplate, we can\'t get rid of the `main` function,\\nbut we can at least move out the functionality.\\n\\n```rust\\nfn run(type_of_input: &str) -> Result<()>\\nwhere\\n Self: Sized,\\n{\\n tracing_subscriber::fmt()\\n .with_env_filter(EnvFilter::from_default_env())\\n .with_target(false)\\n .with_file(true)\\n .with_line_number(true)\\n .without_time()\\n .compact()\\n .init();\\n color_eyre::install()?;\\n\\n let input = Self::parse_input(format!(\\"{}s/{}.txt\\", type_of_input, Self::day()));\\n\\n info!(\\"Part 1: {}\\", Self::part_1(&input));\\n info!(\\"Part 2: {}\\", Self::part_2(&input));\\n\\n Ok(())\\n}\\n\\nfn main() -> Result<()>\\nwhere\\n Self: Sized,\\n{\\n Self::run(\\"input\\")\\n}\\n```\\n\\nThis is all part of the `Solution` trait, which can implement methods while being\\ndependent on what is provided by the implementing types. In this case, we just\\nneed to bound the `Output` type to implement `Display` that is necessary for the\\n`info!` and format string there.\\n\\nNow we can get to first of the nasty things we are going to do\u2026 And it is the\\n`day()` method that you can see being used when constructing path to the input\\nfile. That method will generate a name of the file, e.g. `day01` and we know that\\nwe can _somehow_ deduce it from the structure name, given we name it reasonably.\\n\\n```rust\\nfn day() -> String {\\n let mut day = String::from(type_name::().split(\\"::\\").next().unwrap());\\n day.make_ascii_lowercase();\\n\\n day.to_string()\\n}\\n```\\n\\n:::caution `type_name`\\n\\nThis feature is still experimental and considered to be internal, it is not\\nadvised to use it any production code.\\n\\n:::\\n\\nAnd now we can get to the nastiest stuff :weary: We will **generate** the tests!\\n\\nWe want to be able to generate tests for sample input in a following way:\\n\\n```rust\\ntest_sample!(day_01, Day01, 42, 69);\\n```\\n\\nThere\'s not much we can do, so we will write a macro to generate the tests for us.\\n\\n```rust\\n#[macro_export]\\nmacro_rules! test_sample {\\n ($mod_name:ident, $day_struct:tt, $part_1:expr, $part_2:expr) => {\\n #[cfg(test)]\\n mod $mod_name {\\n use super::*;\\n\\n #[test]\\n fn test_part_1() {\\n let sample =\\n $day_struct::parse_input(&format!(\\"samples/{}.txt\\", $day_struct::day()));\\n assert_eq!($day_struct::part_1(&sample), $part_1);\\n }\\n\\n #[test]\\n fn test_part_2() {\\n let sample =\\n $day_struct::parse_input(&format!(\\"samples/{}.txt\\", $day_struct::day()));\\n assert_eq!($day_struct::part_2(&sample), $part_2);\\n }\\n }\\n };\\n}\\n```\\n\\nWe have used it in a similar way as macros in C/C++, one of the things that we\\ncan use to our advantage is defining \u201ctype\u201d of the parameters for the macro. All\\nparameters have their name prefixed with `$` sign and you can define various \u201cforms\u201d\\nof your macro. Let\'s go through it!\\n\\nWe have following parameters:\\n\\n- `$mod_name` which represents the name for the module with tests, it is typed\\n with `ident` which means that we want a valid identifier to be passed in.\\n- `$day_struct` represents the structure that will be used for tests, it is typed\\n with `tt` which represents a _token tree_, in our case it is a type.\\n- `$part_X` represents the expected output for the `X`th part and is of type `expr`\\n which literally means an _expression_.\\n\\nApart from that we need to use `#[macro_export]` to mark the macro as exported\\nfor usage outside of the module. Now our skeleton looks like:\\n\\n```rust\\nuse aoc_2022::*;\\n\\ntype Input = String;\\ntype Output = String;\\n\\nstruct DayXX;\\nimpl Solution for DayXX {\\n fn parse_input>(pathname: P) -> Input {\\n file_to_string(pathname)\\n }\\n\\n fn part_1(input: &Input) -> Output {\\n todo!()\\n }\\n\\n fn part_2(input: &Input) -> Output {\\n todo!()\\n }\\n}\\n\\nfn main() -> Result<()> {\\n // DayXX::run(\\"sample\\")\\n DayXX::main()\\n}\\n\\n// test_sample!(day_XX, DayXX, , );\\n```\\n\\n### Solution\\n\\nNot much to talk about, it is relatively easy to simulate.\\n\\n## [Day 10: Cathode-Ray Tube](https://adventofcode.com/2022/day/10)\\n\\n:::info tl;dr\\n\\nEmulating basic arithmetic operations on a CPU and drawing on CRT based on the\\nCPU\'s accumulator.\\n\\n:::\\n\\nIn this day I have discovered an issue with my design of the `Solution` trait.\\nAnd the issue is caused by different types of `Output` for the part 1 and part 2.\\n\\nProblem is relatively simple and consists of simulating a CPU, I have approached\\nit in a following way:\\n\\n```rust\\nfn evaluate_instructions(instructions: &[Instruction], mut out: Output) -> Output {\\n instructions\\n .iter()\\n .fold(State::new(), |state, instruction| {\\n state.execute(instruction, &mut out)\\n });\\n\\n out\\n}\\n```\\n\\nWe just take the instructions, we have some state of the CPU and we execute the\\ninstructions one-by-one. Perfect usage of the `fold` (or `reduce` as you may know\\nit from other languages).\\n\\nYou can also see that we have an `Output` type, so the question is how can we fix\\nthat problem. And the answer is very simple and _functional_. Rust allows you to\\nhave an `enumeration` that can _bear_ some other values apart from the type itself.\\n\\n:::tip\\n\\nWe could\'ve seen something like this with the `Result` type that can be\\ndefined as\\n\\n```rust\\nenum Result {\\n Ok(T),\\n Err(E)\\n}\\n```\\n\\n###### What does that mean though?\\n\\nWhen we have an `Ok` value, it has the result itself, and when we get an `Err`\\nvalue, it has the error. This also allows us to handle _results_ in a rather\\npretty way:\\n\\n```rust\\nmatch do_something(x) {\\n Ok(y) => {\\n println!(\\"SUCCESS: {}\\", y);\\n },\\n Err(y) => {\\n eprintln!(\\"ERROR: {}\\", y);\\n }\\n}\\n```\\n\\n:::\\n\\nMy solution has a following outline:\\n\\n```rust\\nfn execute(&self, i: &Instruction, output: &mut Output) -> State {\\n // execute the instruction\\n\\n // collect results if necessary\\n match output {\\n Output::Part1(x) => self.execute_part_1(y, x),\\n Output::Part2(x) => self.execute_part_2(y, x),\\n }\\n\\n // return the obtained state\\n new_state\\n}\\n```\\n\\nYou might think that it\'s a perfectly reasonable thing to do. Yes, **but** notice\\nthat the `match` statement doesn\'t _collect_ the changes in any way and also we\\npass `output` by `&mut`, so it is shared across each _iteration_ of the `fold`.\\n\\nThe dirty and ingenious thing is that `x`s are passed by `&mut` too and therefore\\nthey are directly modified by the helper functions. To sum it up and let it sit\\n\\n> We are **collecting** the result **into** an **enumeration** that is **shared**\\n> across **all** iterations of `fold`.\\n\\n### Solution\\n\\nSimilar to _Day 9_, but there are some technical details that can get you.\\n\\n## [Day 11: Monkey in the Middle](https://adventofcode.com/2022/day/11)\\n\\n:::info tl;dr\\n\\nSimulation of monkeys throwing stuff around and measuring your stress levels\\nwhile your stuff is being passed around.\\n\\n:::\\n\\nI think I decided to use regular expressions here for the first time, cause\\nparsing the input was a pain.\\n\\nAlso I didn\'t expect to implement Euclidean algorithm in Rust\u2026\\n\\n### Solution\\n\\nAgain, we\'re just running a simulation. Though I must admit it was very easy to\\nmake a small technical mistakes that could affect the final results very late.\\n\\n## [Day 12: Hill Climbing Algorithm](https://adventofcode.com/2022/day/12)\\n\\n:::info tl;dr\\n\\nFinding shortest path up the hill and also shortest path down to the ground while\\nalso rolling down the hill\u2026\\n\\n:::\\n\\nAs I have said in the _tl;dr_, we are looking for the shortest path, but the start\\nand goal differ for the part 1 and 2. So I have decided to refactor my solution\\nto a BFS algorithm that takes necessary parameters via functions:\\n\\n```rust\\nfn bfs(\\n graph: &[Vec], start: &Position, has_edge: F, is_target: G\\n) -> Option\\nwhere\\n F: Fn(&[Vec], &Position, &Position) -> bool,\\n G: Fn(&[Vec], &Position) -> bool\\n```\\n\\nWe pass the initial vertex from the caller and everything else is left to the BFS\\nalgorithm, based on the `has_edge` and `is_target` functions.\\n\\nThis was easy! And that is not very usual in Rust once you want to pass around\\nfunctions. :eyes:\\n\\n### Solution\\n\\nLooking for the shortest path\u2026 Must be Dijkstra, right? **Nope!** Half of the\\nReddit got jebaited though. In all fairness, nothing stops you from implementing\\nthe Dijkstra\'s algorithm for finding the shortest path, **but** if you know that\\nall connected vertices are in a unit (actually $d = 1$) distance from each other,\\nthen you know that running Dijkstra is equivalent to running BFS, only with worse\\ntime complexity, because of the priority heap instead of the queue.\\n\\n## [Day 13: Distress Signal](https://adventofcode.com/2022/day/13)\\n\\n:::info tl;dr\\n\\nProcessing packets with structured data from the distress signal.\\n\\n:::\\n\\nYou can implement a lot of traits if you want to. It is _imperative_ to implement\\nordering on the packets. I had a typo, so I also proceeded to implement a `Display`\\ntrait for debugging purposes:\\n\\n```rust\\nimpl Display for Packet {\\n fn fmt(&self, f: &mut std::fmt::Formatter<\'_>) -> std::fmt::Result {\\n match self {\\n Packet::Integer(x) => write!(f, \\"{x}\\"),\\n Packet::List(lst) => write!(f, \\"[{}]\\", lst.iter().map(|p| format!(\\"{p}\\")).join(\\",\\")),\\n }\\n }\\n}\\n```\\n\\n### Solution\\n\\nA lot of technical details\u2026 Parsing is nasty too\u2026\\n\\n## [Day 14: Regolith Reservoir](https://adventofcode.com/2022/day/14)\\n\\n:::info tl;dr\\n\\nLet\'s simulate falling sand grain-by-grain.\\n\\n:::\\n\\nAgain, both parts are relatively similar with minimal changes, so it is a good\\nidea to refactor it a bit. Similar approach to the [BFS above]. Also this is the\\nfirst day where I ran into efficiency issues and had to redo my solution to speed\\nit up just a bit.\\n\\n### Solution\\n\\nTedious.\\n\\n## Post Mortem\\n\\n### Indexing\\n\\nI was asked about the indexing after publishing the blog. And truly it is rather\\ncomplicated topic, especially after releasing `SliceIndex` trait. I couldn\'t\\nleave it be, so I tried to implement the `Index` and `IndexMut` trait.\\n\\n:::note\\n\\nI have also mentioned that the `SliceIndex` trait is `unsafe`, but truth be told,\\nonly _unsafe_ part are the 2 methods that are named `*unchecked*`. Anyways, I will\\nbe implementing the `Index*` traits for now, rather than the `SliceIndex`.\\n\\n:::\\n\\nIt\'s relatively straightforward\u2026\\n\\n```rust\\nimpl Index> for [C]\\nwhere\\n I: Copy + TryInto,\\n >::Error: Debug,\\n C: Index,\\n{\\n type Output = C::Output;\\n\\n fn index(&self, index: Vector2D) -> &Self::Output {\\n let (x, y): (usize, usize) =\\n (index.x.try_into().unwrap(), index.y.try_into().unwrap());\\n &self[y][x]\\n }\\n}\\n\\nimpl IndexMut> for [C]\\nwhere\\n I: Copy + TryInto,\\n >::Error: Debug,\\n C: IndexMut,\\n{\\n fn index_mut(&mut self, index: Vector2D) -> &mut Self::Output {\\n let (x, y): (usize, usize) =\\n (index.x.try_into().unwrap(), index.y.try_into().unwrap());\\n &mut self[y][x]\\n }\\n}\\n```\\n\\nWe can see a lot of similarities to the implementation of `index` and `index_mut`\\nfunctions. In the end, they are 1:1, just wrapped in the trait that provides a\\nsyntax sugar for `container[idx]`.\\n\\n:::note\\n\\nI have also switched from using the `TryFrom` to `TryInto` trait, since it better\\nmatches what we are using, the `.try_into` rather than `usize::try_from`.\\n\\nAlso implementing `TryFrom` automatically provides you with a `TryInto` trait,\\nsince it is relatively easy to implement. Just compare the following:\\n\\n```rust\\npub trait TryFrom: Sized {\\n type Error;\\n\\n fn try_from(value: T) -> Result;\\n}\\n\\npub trait TryInto: Sized {\\n type Error;\\n\\n fn try_into(self) -> Result;\\n}\\n```\\n\\n:::\\n\\nOK, so we have our trait implemented, we should be able to use `container[index]`,\\nright? Yes\u2026 but actually no :frowning:\\n\\n```\\nerror[E0277]: the type `[std::vec::Vec]` cannot be indexed by `aoc_2022::Vector2D`\\n --\x3e src/bin/day08.rs:26:18\\n |\\n26 | if trees[pos] > tallest {\\n | ^^^ slice indices are of type `usize` or ranges of `usize`\\n |\\n = help: the trait `std::slice::SliceIndex<[std::vec::Vec]>` is not implemented for `aoc_2022::Vector2D`\\n = note: required for `std::vec::Vec>` to implement `std::ops::Index>`\\n\\nerror[E0277]: the type `[std::vec::Vec]` cannot be indexed by `aoc_2022::Vector2D`\\n --\x3e src/bin/day08.rs:30:28\\n |\\n30 | max(tallest, trees[pos])\\n | ^^^ slice indices are of type `usize` or ranges of `usize`\\n |\\n = help: the trait `std::slice::SliceIndex<[std::vec::Vec]>` is not implemented for `aoc_2022::Vector2D`\\n = note: required for `std::vec::Vec>` to implement `std::ops::Index>`\\n\\nerror[E0277]: the type `[std::vec::Vec]` cannot be indexed by `aoc_2022::Vector2D`\\n --\x3e src/bin/day08.rs:52:28\\n |\\n52 | let max_height = trees[position];\\n | ^^^^^^^^ slice indices are of type `usize` or ranges of `usize`\\n |\\n = help: the trait `std::slice::SliceIndex<[std::vec::Vec]>` is not implemented for `aoc_2022::Vector2D`\\n = note: required for `std::vec::Vec>` to implement `std::ops::Index>`\\n```\\n\\nWhy? We have it implemented for the slices (`[C]`), why doesn\'t it work? Well,\\nthe fun part consists of the fact that in other place, where we were using it,\\nwe were passing the `&[Vec]`, but this is coming from a helper functions that\\ntake `&Vec>` instead. And\u2026 we don\'t implement `Index` and `IndexMut` for\\nthose. Just for the slices. \ud83e\udd2f _What are we going to do about it?_\\n\\nWe can either start copy-pasting or be smarter about it\u2026 I choose to be smarter,\\nso let\'s implement a macro! The only difference across the implementations are\\nthe types of the outer containers. Implementation doesn\'t differ **at all**!\\n\\nImplementing the macro can be done in a following way:\\n\\n```rust\\nmacro_rules! generate_indices {\\n ($container:ty) => {\\n impl Index> for $container\\n where\\n I: Copy + TryInto,\\n >::Error: Debug,\\n C: Index,\\n {\\n type Output = C::Output;\\n\\n fn index(&self, index: Vector2D) -> &Self::Output {\\n let (x, y): (usize, usize) =\\n (index.x.try_into().unwrap(), index.y.try_into().unwrap());\\n &self[y][x]\\n }\\n }\\n\\n impl IndexMut> for $container\\n where\\n I: Copy + TryInto,\\n >::Error: Debug,\\n C: IndexMut,\\n {\\n fn index_mut(&mut self, index: Vector2D) -> &mut Self::Output {\\n let (x, y): (usize, usize) =\\n (index.x.try_into().unwrap(), index.y.try_into().unwrap());\\n &mut self[y][x]\\n }\\n }\\n };\\n}\\n```\\n\\nAnd now we can simply do\\n\\n```rust\\ngenerate_indices!(VecDeque);\\ngenerate_indices!([C]);\\ngenerate_indices!(Vec);\\n// generate_indices!([C; N], const N: usize);\\n```\\n\\nThe last type (I took the inspiration from the implementations of the `Index` and\\n`IndexMut` traits) is a bit problematic, because of the `const N: usize` part,\\nwhich I haven\'t managed to be able to parse. And that\'s how I got rid of the error.\\n\\n:::note\\n\\nIf I were to use 2D-indexing over `[C; N]` slices, I\'d probably just go with the\\ncopy-paste, cause the cost of this \u201cmonstrosity\u201d outweighs the benefits of no DRY.\\n\\n:::\\n\\n#### Cause of the problem\\n\\nThis issue is relatively funny. If you don\'t use any type aliases, just the raw\\ntypes, you\'ll get suggested certain changes by the _clippy_. For example if you\\nconsider the following piece of code\\n\\n```rust\\nfn get_sum(nums: &Vec) -> i32 {\\n nums.iter().sum()\\n}\\n\\nfn main() {\\n let nums = vec![1, 2, 3];\\n println!(\\"Sum: {}\\", get_sum(&nums));\\n}\\n```\\n\\nand you run _clippy_ on it, you will get\\n\\n```\\nChecking playground v0.0.1 (/playground)\\nwarning: writing `&Vec` instead of `&[_]` involves a new object where a slice will do\\n --\x3e src/main.rs:1:18\\n |\\n1 | fn get_sum(nums: &Vec) -> i32 {\\n | ^^^^^^^^^ help: change this to: `&[i32]`\\n |\\n = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg\\n = note: `#[warn(clippy::ptr_arg)]` on by default\\n\\nwarning: `playground` (bin \\"playground\\") generated 1 warning\\n Finished dev [unoptimized + debuginfo] target(s) in 0.61s\\n```\\n\\nHowever, if you introduce a type alias, such as\\n\\n```rust\\ntype Numbers = Vec;\\n```\\n\\nThen _clippy_ won\'t say anything, cause there is literally nothing to suggest.\\nHowever the outcome is not the same\u2026\\n\\n[_advent of code_]: https://adventofcode.com\\n[bfs above]: #day-12-hill-climbing-algorithm"},{"id":"aoc-2022/1st-week","metadata":{"permalink":"/blog/aoc-2022/1st-week","editUrl":"https://github.com/mfocko/blog/tree/main/blog/aoc-2022/01-week-1.md","source":"@site/blog/aoc-2022/01-week-1.md","title":"1st week of Advent of Code \'22 in Rust","description":"Surviving first week in Rust.","date":"2022-12-15T01:15:00.000Z","formattedDate":"December 15, 2022","tags":[{"label":"advent-of-code","permalink":"/blog/tags/advent-of-code"},{"label":"advent-of-code-2022","permalink":"/blog/tags/advent-of-code-2022"},{"label":"rust","permalink":"/blog/tags/rust"}],"readingTime":12.4,"hasTruncateMarker":true,"authors":[{"name":"Matej Focko","email":"me+blog@mfocko.xyz","title":"a.k.a. @mf","url":"https://gitlab.com/mfocko","imageURL":"https://github.com/mfocko.png","key":"mf"}],"frontMatter":{"title":"1st week of Advent of Code \'22 in Rust","description":"Surviving first week in Rust.","date":"2022-12-15T01:15","slug":"aoc-2022/1st-week","authors":"mf","tags":["advent-of-code","advent-of-code-2022","rust"],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"2nd week of Advent of Code \'22 in Rust","permalink":"/blog/aoc-2022/2nd-week"},"nextItem":{"title":"Advent of Code \'22 in Rust","permalink":"/blog/aoc-2022/intro"}},"content":"Let\'s go through the first week of [_Advent of Code_] in Rust.\\n\\n\x3c!--truncate--\x3e\\n\\n:::note\\n\\nIf you wish to have a look at the solutions, you can follow them on my [GitLab].\\nMore specifically in the [`/src/bin/`].\\n\\n:::\\n\\nI will try to summarize my experience with using Rust for the AoC. Trying it out\\nages ago, I believe it will be _pain and suffering_, but we will see. For each\\nday I will also try to give a tl;dr of the problem, so that you can better imagine\\nthe relation to my woes or :+1: moments.\\n\\n## [Day 1: Calorie Counting](https://adventofcode.com/2022/day/1)\\n\\n:::info tl;dr\\n\\nAs the name suggests, we get the calories of the food contained in the elves\\nbackpacks and we want to choose the elf that has the most food ;)\\n\\n:::\\n\\n> Wakey wakey!\\n\\nProgramming in Rust at 6am definitely hits. I\'ve also forgotten to mention how I\\nhandle samples. With each puzzle you usually get a sample input and expected\\noutput. You can use them to verify that your solution works, or usually doesn\'t.\\n\\nAt first I\'ve decided to put asserts into my `main`, something like\\n\\n```rust\\nassert_eq!(part_1(&sample), 24000);\\ninfo!(\\"Part 1: {}\\", part_1(&input));\\n\\nassert_eq!(part_2(&sample), 45000);\\ninfo!(\\"Part 2: {}\\", part_2(&input));\\n```\\n\\nHowever, once you get further, the sample input may take some time to run itself.\\nSo in the end, I have decided to turn them into unit tests:\\n\\n```rust\\n#[cfg(test)]\\nmod tests {\\n use super::*;\\n\\n #[test]\\n fn test_part_1() {\\n let sample = parse_input(\\"samples/day01.txt\\");\\n assert_eq!(part_1(&sample), 24000);\\n }\\n\\n #[test]\\n fn test_part_2() {\\n let sample = parse_input(\\"samples/day01.txt\\");\\n assert_eq!(part_2(&sample), 45000);\\n }\\n}\\n```\\n\\nAnd later on I have noticed, it\'s hard to tell the difference between the days,\\nso I further renamed the `mod` from generic `tests` to reflect the days.\\n\\nAlso after finishing the first day puzzle, I have installed an [`sccache`] to\\ncache the builds, so that the build time is lower, cause it was kinda unbearable.\\n\\n### Solution\\n\\nWell, it\'s a pretty simple problem. You just take the input, sum the calories and\\nfind the biggest one. However, if we try to generalize to more than the biggest\\none, the fun appears. We have few options:\\n\\n- keep all the calories, sort them, take what we need\\n- keep all the calories and use max heap\\n- use min heap and maintain at most N calories that we need\\n\\n## [Day 2: Rock Paper Scissors](https://adventofcode.com/2022/day/2)\\n\\n:::info tl;dr\\n\\nYou want to know what score did you achieve while playing _Rock Paper Scissors_.\\nAnd then you want to be strategic about it.\\n\\n:::\\n\\nApart from the technical details of the puzzle, it went relatively smooth.\\n\\n### Solution\\n\\nI took relatively na\xefve approach and then tried to simplify it.\\n\\n## [Day 3: Rucksack Reorganization](https://adventofcode.com/2022/day/3)\\n\\n:::info tl;dr\\n\\nLet\'s go reorganize elves\' backpacks! Each backpacks has 2 compartments and you\\nwant to find the common item among those compartments. Each of them has priority,\\nyou care only about the sum.\\n\\n:::\\n\\nThis is the day where I started to fight the compiler and neither of us decided\\nto give up. Let\'s dive into it \\\\o/\\n\\n:::tip Fun fact\\n\\nFighting the compiler took me 30 minutes.\\n\\n:::\\n\\nWe need to find a common item among 2 collections, that\'s an easy task, right?\\nWe can construct 2 sets and find an intersection:\\n\\n```rust\\nlet top: HashSet = [1, 2, 3].iter().collect();\\nlet bottom: HashSet = [3, 4, 5].iter().collect();\\n```\\n\\nNow, the first issue that we encounter is caused by the fact that we are using\\na slice (the `[\u2026]`), iterator of that returns **references** to the numbers.\\nAnd we get immediately yelled at by the compiler, because the numbers are discarded\\nafter running the `.collect`. To fix this, we can use `.into_iter`:\\n\\n```rust\\nlet top: HashSet = [1, 2, 3].into_iter().collect();\\nlet bottom: HashSet = [3, 4, 5].into_iter().collect();\\n```\\n\\nThis way the numbers will get copied instead of referenced. OK, let\'s find the\\nintersection of those 2 collections:\\n\\n```rust\\nprintln!(\\"Common elements: {:?}\\", top.intersection(&bottom));\\n```\\n\\n```\\nCommon elements: [3]\\n```\\n\\n:::caution\\n\\nNotice that we need to do `&bottom`. It explicitly specifies that `.intersection`\\n**borrows** the `bottom`, i.e. takes an immutable reference to it.\\n\\n:::\\n\\nThat\'s what we want, right? Looks like it! \\\\o/\\n\\nNext part wants us to find the common element among all of the backpacks. OK, so\\nthat should be fairly easy, we have an intersection and we want to find intersection\\nover all of them.\\n\\nLet\'s have a look at the type of the `.intersection`\\n\\n```rust\\npub fn intersection<\'a>(\\n\xa0\xa0\xa0\xa0&\'a self,\\n\xa0\xa0\xa0\xa0other: &\'a HashSet\\n) -> Intersection<\'a, T, S>\\n```\\n\\nOK\u2026 Huh\u2026 But we have an example there!\\n\\n```rust\\nlet intersection: HashSet<_> = a.intersection(&b).collect();\\n```\\n\\nCool, that\'s all we need.\\n\\n```rust\\nlet top: HashSet = [1, 2, 3, 4].into_iter().collect();\\nlet bottom: HashSet = [3, 4, 5, 6].into_iter().collect();\\nlet top_2: HashSet = [2, 3, 4, 5, 6].into_iter().collect();\\nlet bottom_2: HashSet = [4, 5, 6].into_iter().collect();\\n\\nlet intersection: HashSet<_> = top.intersection(&bottom).collect();\\nprintln!(\\"Intersection: {:?}\\", intersection);\\n```\\n\\n```\\nIntersection: {3, 4}\\n```\\n\\nCool, so let\'s do the intersection with the `top_2`:\\n\\n```rust\\nlet top: HashSet = [1, 2, 3, 4].into_iter().collect();\\nlet bottom: HashSet = [3, 4, 5, 6].into_iter().collect();\\nlet top_2: HashSet = [2, 3, 4, 5, 6].into_iter().collect();\\nlet bottom_2: HashSet = [4, 5, 6].into_iter().collect();\\n\\nlet intersection: HashSet<_> = top.intersection(&bottom).collect();\\nlet intersection: HashSet<_> = intersection.intersection(&top_2).collect();\\nprintln!(\\"Intersection: {:?}\\", intersection);\\n```\\n\\nAnd we get yelled at by the compiler:\\n\\n```\\nerror[E0308]: mismatched types\\n --\x3e src/main.rs:10:58\\n |\\n10 | let intersection: HashSet<_> = intersection.intersection(&top_2).collect();\\n | ------------ ^^^^^^ expected `&i32`, found `i32`\\n | |\\n | arguments to this function are incorrect\\n |\\n = note: expected reference `&HashSet<&i32>`\\n found reference `&HashSet`\\n```\\n\\n/o\\\\ What the hell is going on here? Well, the funny thing is, that this operation\\ndoesn\'t return the elements themselves, but the references to them and when we pass\\nthe third set, it has just the values themselves, without any references.\\n\\n:::tip\\n\\nIt may seem as a very weird decision, but in fact it makes some sense\u2026 It allows\\nyou to do intersection of items that may not be possible to copy. Overall this is\\na \u201ctax\u201d for having a borrow checker ~~drilling your ass~~ having your back and\\nmaking sure you\'re not doing something naughty that may cause an **undefined**\\n**behavior**.\\n\\n:::\\n\\nTo resolve this we need to get an iterator that **clones** the elements:\\n\\n```rust\\nlet top: HashSet = [1, 2, 3, 4].into_iter().collect();\\nlet bottom: HashSet = [3, 4, 5, 6].into_iter().collect();\\nlet top_2: HashSet = [2, 3, 4, 5, 6].into_iter().collect();\\nlet bottom_2: HashSet = [4, 5, 6].into_iter().collect();\\n\\nlet intersection: HashSet<_> = top.intersection(&bottom).cloned().collect();\\nlet intersection: HashSet<_> = intersection.intersection(&top_2).cloned().collect();\\nlet intersection: HashSet<_> = intersection.intersection(&bottom_2).cloned().collect();\\nprintln!(\\"Intersection: {:?}\\", intersection);\\n```\\n\\n```\\nIntersection: {4}\\n```\\n\\n### Solution\\n\\nThe approach is pretty simple, if you omit the _1on1 with the compiler_. You just\\nhave some fun with the set operations :)\\n\\n## [Day 4: Camp Cleanup](https://adventofcode.com/2022/day/4)\\n\\n:::info tl;dr\\n\\nElves are cleaning up the camp and they got overlapping sections to clean up.\\nFind how many overlap and can take the day off.\\n\\n:::\\n\\n[`RangeInclusive`] is your friend not an enemy :)\\n\\n### Solution\\n\\nRelatively easy, you just need to parse the input and know what you want. Rust\'s\\n`RangeInclusive` type helped a lot, cause it took care of all abstractions.\\n\\n## [Day 5: Supply Stacks](https://adventofcode.com/2022/day/5)\\n\\n:::info tl;dr\\n\\nLet\'s play with stacks of crates.\\n\\n:::\\n\\nVery easy problem with very annoying input. You can judge yourself:\\n\\n```\\n [D]\\n[N] [C]\\n[Z] [M] [P]\\n 1 2 3\\n\\nmove 1 from 2 to 1\\nmove 3 from 1 to 3\\nmove 2 from 2 to 1\\nmove 1 from 1 to 2\\n```\\n\\nGood luck transforming that into something reasonable :)\\n\\n:::tip Fun fact\\n\\nTook me 40 minutes to parse this reasonably, including fighting the compiler.\\n\\n:::\\n\\n### Solution\\n\\nFor the initial solution I went with a manual solution (as in _I have done all_\\n_the work_. Later on I have decided to explore the `std` and interface of the\\n`std::vec::Vec` and found [`split_off`] which takes an index and splits (duh)\\nthe vector:\\n\\n```rust\\nlet mut vec = vec![1, 2, 3];\\nlet vec2 = vec.split_off(1);\\nassert_eq!(vec, [1]);\\nassert_eq!(vec2, [2, 3]);\\n```\\n\\nThis helped me simplify my solution a lot and also get rid of some _edge cases_.\\n\\n## [Day 6: Tuning Trouble](https://adventofcode.com/2022/day/6)\\n\\n:::info tl;dr\\n\\nFinding start of the message in a very weird protocol. Start of the message is\\ndenoted by $N$ unique consecutive characters.\\n\\n:::\\n\\n### Solution\\n\\nA lot of different approaches, knowing that we are dealing with input consisting\\nsolely of ASCII letters, I bit the bullet and went with sliding window and\\nconstructing sets from that window, checking if the set is as big as the window.\\n\\nOne possible optimization could consist of keeping a bit-vector (i.e. `usize`\\nvariable) of encountered characters and updating it as we go. However this has\\na different issue and that is removal of the characters from the left side of the\\nwindow. We don\'t know if the same character is not included later on.\\n\\nOther option is to do similar thing, but keeping the frequencies of the letters,\\nand again knowing we have only ASCII letters we can optimize by having a vector\\nof 26 elements that keeps count for each lowercase letter.\\n\\n## [Day 7: No Space Left On Device](https://adventofcode.com/2022/day/7)\\n\\n:::info tl;dr\\n\\nLet\'s simulate [`du`] to get some stats about our file system and then pinpoint\\ndirectories that take a lot of space and should be deleted.\\n\\n:::\\n\\n> I was waiting for this moment, and yet it got me!\\n> _imagine me swearing for hours_\\n\\n### Solution\\n\\nWe need to \u201c_build_\u201d a file system from the input that is given in a following form:\\n\\n```\\n$ cd /\\n$ ls\\ndir a\\n14848514 b.txt\\n8504156 c.dat\\ndir d\\n$ cd a\\n$ ls\\ndir e\\n29116 f\\n2557 g\\n62596 h.lst\\n$ cd e\\n$ ls\\n584 i\\n$ cd ..\\n$ cd ..\\n$ cd d\\n$ ls\\n4060174 j\\n8033020 d.log\\n5626152 d.ext\\n7214296 k\\n```\\n\\nThere are few ways in which you can achieve this and also you can assume some\\npreconditions, but why would we do that, right? :)\\n\\nYou can \u201cslap\u201d this in either [`HashMap`] or [`BTreeMap`] and call it a day.\\nAnd that would be boring\u2026\\n\\n:::tip\\n\\n`BTreeMap` is quite fitting for this, don\'t you think?\\n\\n:::\\n\\nI always wanted to try allocation on heap in Rust, so I chose to implement a tree.\\nI fought with the `Box` for some time and was losing\u2026\\n\\nThen I looked up some implementations of trees or linked lists and decided to try\\n`Rc>`. And I got my _ass whopped_ by the compiler once again. /o\\\\\\n\\n:::tip\\n\\n`Box` represents a dynamically allocated memory on heap. It is a single pointer,\\nyou can imagine this as `std::unique_ptr` in C++.\\n\\n`Rc` represents a dynamically allocated memory on heap. On top of that it is\\n_reference counted_ (that\'s what the `Rc` stands for). You can imagine this as\\n`std::shared_ptr` in C++.\\n\\nNow the fun stuff. Neither of them lets you **mutate** the contents of the memory.\\n\\n`Cell` allows you to mutate the memory. Can be used reasonably with types that\\ncan be copied, because the memory safety is guaranteed by copying the contents\\nwhen there is more than one **mutable** reference to the memory.\\n\\n`RefCell` is similar to the `Cell`, but the borrowing rules (how many mutable\\nreferences are present) are checked dynamically.\\n\\nSo in the end, if you want something like `std::shared_ptr` in Rust, you want\\nto have `Rc>`.\\n\\n:::\\n\\nSo, how are we going to represent the file system then? We will use an enumeration,\\nhehe, which is an algebraic data type that can store some stuff in itself :weary:\\n\\n```rust\\ntype FileHandle = Rc>;\\n\\n#[derive(Debug)]\\nenum AocFile {\\n File(usize),\\n Directory(BTreeMap),\\n}\\n```\\n\\nLet\'s go over it! `FileHandle` represents dynamically allocated `AocFile`, not\\nmuch to discuss. What does the `#[derive(Debug)]` do though? It lets us to print\\nout the value of that enumeration, it\'s derived, so it\'s not as good as if we had\\nimplemented it ourselves, but it\'s good enough for debugging, hence the name.\\n\\nNow to the fun part! `AocFile` value can be represented in two ways:\\n\\n- `File(usize)`, e.g. `AocFile::File(123)` and we can pattern match it, if we\\n need to\\n- `Directory(BTreeMap)` will represent the directory and will\\n contain map matching the name of the files (or directories) within to their\\n respective file handles\\n\\nI will omit the details about constructing this file system, cause there are a lot\\nof technicalities introduced by the nature of the input. However if you are\\ninterested, you can have a look at my solution.\\n\\nWe need to find small enough directories and also find the smallest directory that\\nwill free enough space. Now the question is, how could we do that. And there are\\nmultiple ways I will describe.\\n\\nI have chosen to implement [_tree catamorphism_] :weary:. It is basically a fold\\nover a tree data structure. We descent down into the leaves and propagate computed\\nresults all the way to the root. You can also notice that this approach is very\\nsimilar to _dynamic programming_, we find overlapping sections of the computation\\nand try to minimize the additional work (in this case: we need to know sizes of\\nour descendants, but we have already been there).\\n\\nAnother approach that has been suggested to me few days later is running DFS on\\nthe graph. And, funnily enough, we would still need to combine what we found in\\nthe branches where we descent. So in the end, it would work very similarly to my\\nsolution.\\n\\nOne of the more exotic options would be precomputing the required information at\\nthe same time as parsing. That could be done by adding additional fields to the\\nnodes which would allow storing such information and updating it as we construct\\nthe file system.\\n\\n## Post Mortem\\n\\nThings that have been brought up in the discussion later on.\\n\\n### `Rc` vs `Rc>`\\n\\nIt has been brought up that I have a contradicting statement regarding the\\ndynamically allocated memory. Specifically:\\n\\n- You can imagine `Rc` as an `std::shared_ptr` (in C++)\\n- When you want an equivalent of `std::shared_ptr`, you want to use\\n `Rc>`\\n\\nNow, in Rust it is a bit more complicated, because the type that represents the\\n\u201cshared pointer\u201d is `Rc`. What `RefCell` does is making sure that there is\\nonly one \u201cowner\u201d of a mutable reference at a time (and dynamically, as opposed\\nto the `Cell`).\\n\\nTherefore to be precise and correct about the equivalents of `std::shared_ptr`\\nin Rust, we can say that\\n\\n- `Rc` is an equivalent of a `const std::shared_ptr`,\\n- and `Rc>` is an equivalent of a `std::shared_ptr`.\\n\\nYou can easily see that they only differ in the mutability. (And even that is not\\nas simple as it seems, because there is also `Cell`)\\n\\n[_advent of code_]: https://adventofcode.com\\n[gitlab]: https://gitlab.com/mfocko/advent-of-code-2022\\n[`/src/bin/`]: https://gitlab.com/mfocko/advent-of-code-2022/-/tree/main/src/bin\\n[`sccache`]: https://github.com/mozilla/sccache\\n[`rangeinclusive`]: https://doc.rust-lang.org/std/ops/struct.RangeInclusive.html\\n[`split_off`]: https://doc.rust-lang.org/std/vec/struct.Vec.html#method.split_off\\n[`du`]: https://www.man7.org/linux/man-pages/man1/du.1.html\\n[`hashmap`]: https://doc.rust-lang.org/std/collections/struct.HashMap.html\\n[`btreemap`]: https://doc.rust-lang.org/std/collections/struct.BTreeMap.html\\n[_tree catamorphism_]: https://en.wikipedia.org/wiki/Catamorphism#Tree_fold"},{"id":"aoc-2022/intro","metadata":{"permalink":"/blog/aoc-2022/intro","editUrl":"https://github.com/mfocko/blog/tree/main/blog/aoc-2022/00-intro.md","source":"@site/blog/aoc-2022/00-intro.md","title":"Advent of Code \'22 in Rust","description":"Preparing for Advent of Code \'22.","date":"2022-12-14T21:45:00.000Z","formattedDate":"December 14, 2022","tags":[{"label":"advent-of-code","permalink":"/blog/tags/advent-of-code"},{"label":"advent-of-code-2022","permalink":"/blog/tags/advent-of-code-2022"},{"label":"rust","permalink":"/blog/tags/rust"}],"readingTime":8.665,"hasTruncateMarker":true,"authors":[{"name":"Matej Focko","email":"me+blog@mfocko.xyz","title":"a.k.a. @mf","url":"https://gitlab.com/mfocko","imageURL":"https://github.com/mfocko.png","key":"mf"}],"frontMatter":{"title":"Advent of Code \'22 in Rust","description":"Preparing for Advent of Code \'22.","date":"2022-12-14T21:45","slug":"aoc-2022/intro","authors":"mf","tags":["advent-of-code","advent-of-code-2022","rust"],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"1st week of Advent of Code \'22 in Rust","permalink":"/blog/aoc-2022/1st-week"}},"content":"Let\'s talk about the preparations for this year\'s [_Advent of Code_].\\n\\n\x3c!--truncate--\x3e\\n\\n## Choosing a language\\n\\nWhen choosing a language for AoC, you usually want a language that gives you a\\nquick feedback which allows you to iterate quickly to the solution of the puzzle.\\nOne of the most common choices is Python, many people also use JavaScript or Ruby.\\n\\nGiven the competitive nature of the AoC and popularity among competitive programming,\\nC++ might be also a very good choice. Only if you are familiar with it, I guess\u2026\\n\\nIf you want a challenge, you might also choose to rotate the languages each day.\\nThough I prefer to use only one language.\\n\\nFor this year I have been deciding between _Rust_, _C++_ and _Pascal_ or _Ada_.\\n\\nI have tried Rust last year and have survived with it for 3 days and then gave\\nup and switched to _Kotlin_, which was pretty good given it is \u201cJava undercover\u201d.\\nI pretty much like the ideas behind Rust, I am not sure about the whole cult and\\nimplementation of those ideas though. After some years with C/C++, I would say\\nthat Rust feels _too safe_ for my taste and tries to \u201c_punish me_\u201d even for the\\nmost trivial things.\\n\\nC++ is a very robust, but also comes with a wide variety of options providing you\\nthe ability to shoot yourself in the leg. I have tried to solve few days of previous\\nAdvent of Code events, it was _relatively easy_ to solve the problems in C++, given\\nthat I do not admit writing my own iterator for `enumerate`\u2026\\n\\nPascal or Ada were meme choices :) Ada is heavily inspired by Pascal and has a\\npretty nice standard library that offers enough to be able to quickly solve some\\nproblems in it. However the toolkit is questionable :/\\n\\n## Choosing libraries\\n\\n## Preparations for Rust\\n\\nAll of the sources, later on including solutions, can be found at my\\n[GitLab].\\n\\n### Toolkit\\n\\nSince we are using Rust, we are going to use a [Cargo] and more than likely VSCode\\nwith [`rust-analyzer`]. Because of my choice of libraries, we will also introduce\\na `.envrc` file that can be used by [`direnv`], which allows you to set specific\\nenvironment variables when you enter a directory. In our case, we will use\\n\\n```bash\\n# to show nice backtrace when using the color-eyre\\nexport RUST_BACKTRACE=1\\n\\n# to catch logs generated by tracing\\nexport RUST_LOG=trace\\n```\\n\\nAnd for the one of the most obnoxious things ever, we will use a script to download\\nthe inputs instead of \u201c_clicking, opening and copying to a file_\u201d[^1]. There is\\nno need to be _fancy_, so we will adjust Python script by Martin[^2].\\n\\n```py\\n#!/usr/bin/env python3\\n\\nimport datetime\\nimport yaml\\nimport requests\\nimport sys\\n\\n\\ndef load_config():\\n with open(\\"env.yaml\\", \\"r\\") as f:\\n js = yaml.load(f, Loader=yaml.Loader)\\n return js[\\"session\\"], js[\\"year\\"]\\n\\n\\ndef get_input(session, year, day):\\n return requests.get(\\n f\\"https://adventofcode.com/{year}/day/{day}/input\\",\\n cookies={\\"session\\": session},\\n headers={\\n \\"User-Agent\\": \\"{repo} by {mail}\\".format(\\n repo=\\"gitlab.com/mfocko/advent-of-code-2022\\",\\n mail=\\"me@mfocko.xyz\\",\\n )\\n },\\n ).content.decode(\\"utf-8\\")\\n\\n\\ndef main():\\n day = datetime.datetime.now().day\\n if len(sys.argv) == 2:\\n day = sys.argv[1]\\n\\n session, year = load_config()\\n problem_input = get_input(session, year, day)\\n\\n with open(f\\"./inputs/day{day:>02}.txt\\", \\"w\\") as f:\\n f.write(problem_input)\\n\\n\\nif __name__ == \\"__main__\\":\\n main()\\n```\\n\\nIf the script is called without any arguments, it will deduce the day from the\\nsystem, so we do not need to change the day every morning. It also requires a\\nconfiguration file:\\n\\n```yaml\\n# env.yaml\\nsession: \u2039your session cookie\u203a\\nyear: 2022\\n```\\n\\n### Libraries\\n\\nLooking at the list of the libraries, I have chosen \u201ca lot\u201d of them. Let\'s walk\\nthrough each of them.\\n\\n[`tracing`] and [`tracing-subscriber`] are the crates that can be used for tracing\\nand logging of your Rust programs, there are also other crates that can help you\\nwith providing backtrace to the Sentry in case you have deployed your application\\nsomewhere and you want to watch over it. In our use case we will just utilize the\\nmacros for debugging in the terminal.\\n\\n[`thiserror`], [`anyhow`] and [`color-eyre`] are used for error reporting.\\n`thiserror` is a very good choice for libraries, cause it extends the `Error`\\nfrom the `std` and allows you to create more convenient error types. Next is\\n`anyhow` which kinda builds on top of the `thiserror` and provides you with simpler\\nerror handling in binaries[^3]. And finally we have `color-eyre` which, as I found\\nout later, is a colorful (_wink wink_) extension of `eyre` which is fork of `anyhow`\\nwhile supporting customized reports.\\n\\nIn the end I have decided to remove `thiserror` and `anyhow`, since first one is\\nsuitable for libraries and the latter was basically fully replaced by `{color-,}eyre`.\\n\\n[`regex`] and [`lazy_static`] are a very good and also, I hope, self-explanatory\\ncombination. `lazy_static` allows you to have static variables that must be initialized\\nduring runtime.\\n\\n[`itertools`] provides some nice extensions to the iterators from the `std`.\\n\\n### My own \u201clibrary\u201d\\n\\nWhen creating the crate for this year\'s Advent of Code, I have chosen a library\\ntype. Even though standard library is huge, some things might not be included and\\nalso we can follow _KISS_. I have 2 modules that my \u201clibrary\u201d exports, one for\\nparsing and one for 2D vector (that gets used quite often during Advent of Code).\\n\\nKey part is, of course, processing the input and my library exports following\\nfunctions that get used a lot:\\n\\n```rust\\n/// Reads file to the string.\\npub fn file_to_string>(pathname: P) -> String;\\n\\n/// Reads file and returns it as a vector of characters.\\npub fn file_to_chars>(pathname: P) -> Vec;\\n\\n/// Reads file and returns a vector of parsed structures. Expects each structure\\n/// on its own line in the file. And `T` needs to implement `FromStr` trait.\\npub fn file_to_structs, T: FromStr>(pathname: P) -> Vec\\nwhere\\n ::Err: Debug;\\n\\n/// Converts iterator over strings to a vector of parsed structures. `T` needs\\n/// to implement `FromStr` trait and its error must derive `Debug` trait.\\npub fn strings_to_structs(\\n iter: impl Iterator\\n) -> Vec\\nwhere\\n ::Err: std::fmt::Debug,\\n U: Deref;\\n\\n/// Reads file and returns it as a vector of its lines.\\npub fn file_to_lines>(pathname: P) -> Vec;\\n```\\n\\nAs for the vector, I went with a rather simple implementation that allows only\\naddition of the vectors for now and accessing the elements via functions `x()`\\nand `y()`. Also the vector is generic, so we can use it with any numeric type we\\nneed.\\n\\n### Skeleton\\n\\nWe can also prepare a template to quickly bootstrap each of the days. We know\\nthat each puzzle has 2 parts, which means that we can start with 2 functions that\\nwill solve them.\\n\\n```rust\\nfn part1(input: &Input) -> Output {\\n todo!()\\n}\\n\\nfn part2(input: &Input) -> Output {\\n todo!()\\n}\\n```\\n\\nBoth functions take reference to the input and return some output (in majority\\nof puzzles, it is the same type). `todo!()` can be used as a nice placeholder,\\nit also causes a panic when reached and we could also provide some string with\\nan explanation, e.g. `todo!(\\"part 1\\")`. We have not given functions a specific\\ntype and to avoid as much copy-paste as possible, we will introduce type aliases.\\n\\n```rust\\ntype Input = String;\\ntype Output = i32;\\n```\\n\\n:::tip\\n\\nThis allows us to quickly adjust the types only in one place without the need to\\ndo _regex-replace_ or replace them manually.\\n\\n:::\\n\\nFor each day we get a personalized input that is provided as a text file. Almost\\nall the time, we would like to get some structured type out of that input, and\\ntherefore it makes sense to introduce a new function that will provide the parsing\\nof the input.\\n\\n```rust\\nfn parse_input(path: &str) -> Input {\\n todo!()\\n}\\n```\\n\\nThis \u201cparser\u201d will take a path to the file, just in case we would like to run the\\nsample instead of input.\\n\\nOK, so now we can write a `main` function that will take all of the pieces and\\nrun them.\\n\\n```rust\\nfn main() {\\n let input = parse_input(\\"inputs/dayXX.txt\\");\\n\\n println!(\\"Part 1: {}\\", part_1(&input));\\n println!(\\"Part 2: {}\\", part_2(&input));\\n}\\n```\\n\\nThis would definitely do :) But we have installed a few libraries and we want to\\nuse them. In this part we are going to utilize _[`tracing`]_ (for tracing, duh\u2026)\\nand _[`color-eyre`]_ (for better error reporting, e.g. from parsing).\\n\\n```rust\\nfn main() -> Result<()> {\\n tracing_subscriber::fmt()\\n .with_env_filter(EnvFilter::from_default_env())\\n .with_target(false)\\n .with_file(true)\\n .with_line_number(true)\\n .without_time()\\n .compact()\\n .init();\\n color_eyre::install()?;\\n\\n let input = parse_input(\\"inputs/dayXX.txt\\");\\n\\n info!(\\"Part 1: {}\\", part_1(&input));\\n info!(\\"Part 2: {}\\", part_2(&input));\\n\\n Ok(())\\n}\\n```\\n\\nThe first statement will set up tracing and configure it to print out the logs to\\nterminal, based on the environment variable. We also change the formatting a bit,\\nsince we do not need all the _fancy_ features of the logger. Pure initialization\\nwould get us logs like this:\\n\\n```\\n2022-12-11T19:53:19.975343Z INFO day01: Part 1: 0\\n```\\n\\nHowever after running that command, we will get the following:\\n\\n```\\n INFO src/bin/day01.rs:35: Part 1: 0\\n```\\n\\nAnd the `color_eyre::install()?` is quite straightforward. We just initialize the\\nerror reporting by _color eyre_.\\n\\n:::caution\\n\\nNotice that we had to add `Ok(())` to the end of the function and adjust the\\nreturn type of the `main` to `Result<()>`. It is caused by the _color eyre_ that\\ncan be installed only once and therefore it can fail, that is how we got the `?`\\nat the end of the `::install` which _unwraps_ the **\xbbresult\xab** of the installation.\\n\\n:::\\n\\nOverall we will get to a template like this:\\n\\n```rust\\nuse aoc_2022::*;\\n\\nuse color_eyre::eyre::Result;\\nuse tracing::info;\\nuse tracing_subscriber::EnvFilter;\\n\\ntype Input = String;\\ntype Output = i32;\\n\\nfn parse_input(path: &str) -> Input {\\n todo!()\\n}\\n\\nfn part1(input: &Input) -> Output {\\n todo!()\\n}\\n\\nfn part2(input: &Input) -> Output {\\n todo!()\\n}\\n\\nfn main() -> Result<()> {\\n tracing_subscriber::fmt()\\n .with_env_filter(EnvFilter::from_default_env())\\n .with_target(false)\\n .with_file(true)\\n .with_line_number(true)\\n .without_time()\\n .compact()\\n .init();\\n color_eyre::install()?;\\n\\n let input = parse_input(\\"inputs/dayXX.txt\\");\\n\\n info!(\\"Part 1: {}\\", part_1(&input));\\n info!(\\"Part 2: {}\\", part_2(&input));\\n\\n Ok(())\\n}\\n```\\n\\n[^1]:\\n Copy-pasting might be a relaxing thing to do, but you can also discover\\n nasty stuff about your PC. See [this Reddit post and the comment].\\n\\n[^2]: [GitHub profile](https://github.com/martinjonas)\\n[^3]:\\n Even though you can use it even for libraries, but handling errors from\\n libraries using `anyhow` is nasty\u2026 You will be the stinky one ;)\\n\\n[_advent of code_]: https://adventofcode.com\\n[gitlab]: https://gitlab.com/mfocko/advent-of-code-2022\\n[cargo]: https://doc.rust-lang.org/cargo/\\n[`rust-analyzer`]: https://rust-analyzer.github.io/\\n[`direnv`]: https://direnv.net/\\n[`tracing`]: https://crates.io/crates/tracing\\n[`tracing-subscriber`]: https://crates.io/crates/tracing-subscriber\\n[`thiserror`]: https://crates.io/crates/thiserror\\n[`anyhow`]: https://crates.io/crates/anyhow\\n[`color-eyre`]: https://crates.io/crates/color-eyre\\n[`regex`]: https://crates.io/crates/regex\\n[`lazy_static`]: https://crates.io/crates/lazy_static\\n[`itertools`]: https://crates.io/crates/itertools\\n[this reddit post and the comment]: https://www.reddit.com/r/adventofcode/comments/zb98pn/comment/iyq0ono"}]}')}}]); \ No newline at end of file diff --git a/assets/js/595c7293.ac2cc3dd.js b/assets/js/595c7293.ac2cc3dd.js deleted file mode 100644 index df415a2..0000000 --- a/assets/js/595c7293.ac2cc3dd.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[5634],{58396:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>c,toc:()=>l});var i=t(85893),s=t(11151);const r={id:"seminar-08",title:"8th seminar",description:"Manipulating with files only char-by-char and a magic tree.\n"},o="8th seminar bonus assignment",c={id:"bonuses/seminar-08",title:"8th seminar",description:"Manipulating with files only char-by-char and a magic tree.\n",source:"@site/c/bonuses/08.md",sourceDirName:"bonuses",slug:"/bonuses/seminar-08",permalink:"/c/bonuses/seminar-08",draft:!1,unlisted:!1,editUrl:"https://github.com/mfocko/blog/tree/main/c/bonuses/08.md",tags:[],version:"current",lastUpdatedAt:1707323940,formattedLastUpdatedAt:"Feb 7, 2024",frontMatter:{id:"seminar-08",title:"8th seminar",description:"Manipulating with files only char-by-char and a magic tree.\n"},sidebar:"autogeneratedBar",previous:{title:"5th and 6th seminar",permalink:"/c/bonuses/seminar-05-06"},next:{title:"10th seminar",permalink:"/c/bonuses/seminar-10"}},a={},l=[{value:"Introduction",id:"introduction",level:2},{value:"Warning",id:"warning",level:2},{value:"Testing",id:"testing",level:2},{value:"Task no. 1: Counting (0.75 K\u20a1)",id:"task-no-1-counting-075-k",level:2},{value:"Requirements",id:"requirements",level:3},{value:"Bonus part (0.75 K\u20a1)",id:"bonus-part-075-k",level:3},{value:"Task no. 2: Weird trees (1 K\u20a1)",id:"task-no-2-weird-trees-1-k",level:2},{value:"Submitting",id:"submitting",level:2}];function d(e){const n={a:"a",blockquote:"blockquote",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",hr:"hr",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h1,{id:"8th-seminar-bonus-assignment",children:"8th seminar bonus assignment"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.a,{href:"pathname:///files/c/bonuses/08.tar.gz",children:"Source"})}),"\n",(0,i.jsx)(n.h2,{id:"introduction",children:"Introduction"}),"\n",(0,i.jsx)(n.p,{children:"In this bonus you can implement two tasks, one of them has a bonus part with generic\nsolution."}),"\n",(0,i.jsx)(n.p,{children:"One is focused on counting ananas or in case of generic version any substring in\nthe file, but with a restriction on the function you use."}),"\n",(0,i.jsx)(n.p,{children:"Other one has a more algorithmic spirit."}),"\n",(0,i.jsx)(n.p,{children:"For this bonus you can get at maximum 2.5 K\u20a1."}),"\n",(0,i.jsx)(n.h2,{id:"warning",children:"Warning"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"DO NOT COMMIT test data"})," to your own git repository, since the tests include\nfiles that exceed 10MB by themselves. Even if they are on separate branch, they\ntake up the space."]}),"\n",(0,i.jsx)(n.h2,{id:"testing",children:"Testing"}),"\n",(0,i.jsxs)(n.p,{children:["For testing you are provided with python script (requires ",(0,i.jsx)(n.code,{children:"click"})," to be installed:\n",(0,i.jsx)(n.code,{children:"pip3 install --user click"}),") and ",(0,i.jsx)(n.code,{children:"Makefile"})," that provides following targets:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"check-counting"})," - runs the ",(0,i.jsx)(n.code,{children:"counting"})," tests"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"check-counting-bonus"})," - runs the ",(0,i.jsx)(n.code,{children:"counting"})," tests with bonus implemented"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"check"})," - runs both ",(0,i.jsx)(n.code,{children:"counting"})," and ",(0,i.jsx)(n.code,{children:"counting-bonus"})," tests"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"clean"})," - removes output files from the test runs"]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"task-no-1-counting-075-k",children:"Task no. 1: Counting (0.75 K\u20a1)"}),"\n",(0,i.jsx)(n.p,{children:"Your first task is to make smallish program that counts occurences of specific\n(or given) word from file and writes the number to other file."}),"\n",(0,i.jsx)(n.p,{children:"Usage of the program is:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"Usage: ./counting [string-to-be-counted]\n"})}),"\n",(0,i.jsx)(n.p,{children:"Arguments that are passed to the program represent:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:""})," - path to the file where we count the words"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:""})," - path to the file where we output the count"]}),"\n",(0,i.jsxs)(n.li,{children:["(optional argument) ",(0,i.jsx)(n.code,{children:"[string-to-be-counted]"})," - in case you implement bonus,\notherwise we default to word ",(0,i.jsx)(n.code,{children:"ananas"})," ;)"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"In skeleton you are given 3 empty, but documented, functions to implement."}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"count_anything"})," - function accepts input file and substring to be counted in\nthe file, returns the count."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"count_ananas"})," - same as ",(0,i.jsx)(n.code,{children:"count_anything"}),", but specialized for ananases, the\ndefault implementation from the skeleton expects you to implement ",(0,i.jsx)(n.code,{children:"count_anything"}),"\nand therefore it just calls the other function."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"write_number"})," - function that writes the number to the file, why would you\nneed the function is explained later :)"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"requirements",children:"Requirements"}),"\n",(0,i.jsxs)(n.p,{children:["For manipulation with the files you are only allowed to use ",(0,i.jsx)(n.code,{children:"fopen"}),", ",(0,i.jsx)(n.code,{children:"fclose"}),",\n",(0,i.jsx)(n.code,{children:"fgetc"})," and ",(0,i.jsx)(n.code,{children:"fputc"}),". Functions like ",(0,i.jsx)(n.code,{children:"fprintf"})," (except for ",(0,i.jsx)(n.code,{children:"stderr"})," or logging) and\n",(0,i.jsx)(n.code,{children:"fscanf"})," are ",(0,i.jsx)(n.strong,{children:"forbidden"}),"."]}),"\n",(0,i.jsx)(n.p,{children:"In case you struggle and want to use one of those functions, the solution will be\npenalized by 50% of points."}),"\n",(0,i.jsx)(n.h3,{id:"bonus-part-075-k",children:"Bonus part (0.75 K\u20a1)"}),"\n",(0,i.jsxs)(n.p,{children:["Bonus part of this assignment is to implement ",(0,i.jsx)(n.code,{children:"count_anything"})," rather than ",(0,i.jsx)(n.code,{children:"count_ananas"}),"."]}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsx)(n.p,{children:"Smaller hint: This task does not need dynamic allocation :) You just need one\ngood helper function and the right idea ;)"}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"task-no-2-weird-trees-1-k",children:"Task no. 2: Weird trees (1 K\u20a1)"}),"\n",(0,i.jsxs)(n.p,{children:["In this task we are crossing our paths with ",(0,i.jsx)(n.em,{children:"algorithms and data structures"}),".\nYour task is to write a program that constructs tree from the file that is given\nas an argument and pretty-prints it."]}),"\n",(0,i.jsxs)(n.p,{children:["Input file consists of lines, that include ",(0,i.jsx)(n.code,{children:"key"})," and ",(0,i.jsx)(n.code,{children:"rank"})," in form ",(0,i.jsx)(n.code,{children:"key;rank"}),"\nor ",(0,i.jsx)(n.code,{children:"nil"}),". Why would we have ",(0,i.jsx)(n.code,{children:"nil"})," in a file? The file represents pre-order iteration\nthrough the tree. Leaves never have rank different than 0, so you can safely assume\n2 non-existing ",(0,i.jsx)(n.code,{children:"nil"}),"s in the input after you read such node ;)"]}),"\n",(0,i.jsxs)("table",{children:[(0,i.jsxs)("tr",{children:[(0,i.jsx)("th",{children:"Example input file"}),(0,i.jsx)("th",{children:"Tree it represents"})]}),(0,i.jsxs)("tr",{children:[(0,i.jsx)("td",{children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"8;4\n5;3\n3;2\n2;1\n1;0\nnil\n4;0\n7;1\n6;0\nnil\n11;2\n10;1\n9;0\nnil\n12;0\n"})})}),(0,i.jsx)("td",{children:(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"tree",src:t(30073).Z+"",width:"633",height:"684"})})})]})]}),"\n",(0,i.jsxs)(n.p,{children:["In this task you are only provided with different trees in the ",(0,i.jsx)(n.code,{children:"test-trees"})," directory.\nImplementation and format of the pretty-print is totally up to you. :)"]}),"\n",(0,i.jsx)(n.p,{children:"Example of mine for the tree above:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"8 (rank = 4)\n+-- 5 (rank = 3)\n| +-- 3 (rank = 2)\n| | +-- 2 (rank = 1)\n| | | +-- 1 (rank = 0)\n| | +-- 4 (rank = 0)\n| +-- 7 (rank = 1)\n| +-- 6 (rank = 0)\n+-- 11 (rank = 2)\n +-- 10 (rank = 1)\n | +-- 9 (rank = 0)\n +-- 12 (rank = 0)\n"})}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsx)(n.p,{children:"Can you find out what are those trees? :)"}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"submitting",children:"Submitting"}),"\n",(0,i.jsx)(n.p,{children:"In case you have any questions, feel free to reach out to me."}),"\n",(0,i.jsx)(n.hr,{})]})}function h(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},30073:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/tree-c9e37f87f9095c00fad33ea034485ce6.png"},11151:(e,n,t)=>{t.d(n,{Z:()=>c,a:()=>o});var i=t(67294);const s={},r=i.createContext(s);function o(e){const n=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),i.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/595c7293.b19d33ce.js b/assets/js/595c7293.b19d33ce.js new file mode 100644 index 0000000..ec0ad6a --- /dev/null +++ b/assets/js/595c7293.b19d33ce.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[5634],{58396:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>c,toc:()=>l});var i=t(85893),s=t(11151);const r={id:"seminar-08",title:"8th seminar",description:"Manipulating with files only char-by-char and a magic tree.\n"},o="8th seminar bonus assignment",c={id:"bonuses/seminar-08",title:"8th seminar",description:"Manipulating with files only char-by-char and a magic tree.\n",source:"@site/c/bonuses/08.md",sourceDirName:"bonuses",slug:"/bonuses/seminar-08",permalink:"/c/bonuses/seminar-08",draft:!1,unlisted:!1,editUrl:"https://github.com/mfocko/blog/tree/main/c/bonuses/08.md",tags:[],version:"current",lastUpdatedAt:1707820269,formattedLastUpdatedAt:"Feb 13, 2024",frontMatter:{id:"seminar-08",title:"8th seminar",description:"Manipulating with files only char-by-char and a magic tree.\n"},sidebar:"autogeneratedBar",previous:{title:"5th and 6th seminar",permalink:"/c/bonuses/seminar-05-06"},next:{title:"10th seminar",permalink:"/c/bonuses/seminar-10"}},a={},l=[{value:"Introduction",id:"introduction",level:2},{value:"Warning",id:"warning",level:2},{value:"Testing",id:"testing",level:2},{value:"Task no. 1: Counting (0.75 K\u20a1)",id:"task-no-1-counting-075-k",level:2},{value:"Requirements",id:"requirements",level:3},{value:"Bonus part (0.75 K\u20a1)",id:"bonus-part-075-k",level:3},{value:"Task no. 2: Weird trees (1 K\u20a1)",id:"task-no-2-weird-trees-1-k",level:2},{value:"Submitting",id:"submitting",level:2}];function d(e){const n={a:"a",blockquote:"blockquote",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",hr:"hr",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h1,{id:"8th-seminar-bonus-assignment",children:"8th seminar bonus assignment"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.a,{href:"pathname:///files/c/bonuses/08.tar.gz",children:"Source"})}),"\n",(0,i.jsx)(n.h2,{id:"introduction",children:"Introduction"}),"\n",(0,i.jsx)(n.p,{children:"In this bonus you can implement two tasks, one of them has a bonus part with generic\nsolution."}),"\n",(0,i.jsx)(n.p,{children:"One is focused on counting ananas or in case of generic version any substring in\nthe file, but with a restriction on the function you use."}),"\n",(0,i.jsx)(n.p,{children:"Other one has a more algorithmic spirit."}),"\n",(0,i.jsx)(n.p,{children:"For this bonus you can get at maximum 2.5 K\u20a1."}),"\n",(0,i.jsx)(n.h2,{id:"warning",children:"Warning"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"DO NOT COMMIT test data"})," to your own git repository, since the tests include\nfiles that exceed 10MB by themselves. Even if they are on separate branch, they\ntake up the space."]}),"\n",(0,i.jsx)(n.h2,{id:"testing",children:"Testing"}),"\n",(0,i.jsxs)(n.p,{children:["For testing you are provided with python script (requires ",(0,i.jsx)(n.code,{children:"click"})," to be installed:\n",(0,i.jsx)(n.code,{children:"pip3 install --user click"}),") and ",(0,i.jsx)(n.code,{children:"Makefile"})," that provides following targets:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"check-counting"})," - runs the ",(0,i.jsx)(n.code,{children:"counting"})," tests"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"check-counting-bonus"})," - runs the ",(0,i.jsx)(n.code,{children:"counting"})," tests with bonus implemented"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"check"})," - runs both ",(0,i.jsx)(n.code,{children:"counting"})," and ",(0,i.jsx)(n.code,{children:"counting-bonus"})," tests"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"clean"})," - removes output files from the test runs"]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"task-no-1-counting-075-k",children:"Task no. 1: Counting (0.75 K\u20a1)"}),"\n",(0,i.jsx)(n.p,{children:"Your first task is to make smallish program that counts occurences of specific\n(or given) word from file and writes the number to other file."}),"\n",(0,i.jsx)(n.p,{children:"Usage of the program is:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"Usage: ./counting [string-to-be-counted]\n"})}),"\n",(0,i.jsx)(n.p,{children:"Arguments that are passed to the program represent:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:""})," - path to the file where we count the words"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:""})," - path to the file where we output the count"]}),"\n",(0,i.jsxs)(n.li,{children:["(optional argument) ",(0,i.jsx)(n.code,{children:"[string-to-be-counted]"})," - in case you implement bonus,\notherwise we default to word ",(0,i.jsx)(n.code,{children:"ananas"})," ;)"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"In skeleton you are given 3 empty, but documented, functions to implement."}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"count_anything"})," - function accepts input file and substring to be counted in\nthe file, returns the count."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"count_ananas"})," - same as ",(0,i.jsx)(n.code,{children:"count_anything"}),", but specialized for ananases, the\ndefault implementation from the skeleton expects you to implement ",(0,i.jsx)(n.code,{children:"count_anything"}),"\nand therefore it just calls the other function."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"write_number"})," - function that writes the number to the file, why would you\nneed the function is explained later :)"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"requirements",children:"Requirements"}),"\n",(0,i.jsxs)(n.p,{children:["For manipulation with the files you are only allowed to use ",(0,i.jsx)(n.code,{children:"fopen"}),", ",(0,i.jsx)(n.code,{children:"fclose"}),",\n",(0,i.jsx)(n.code,{children:"fgetc"})," and ",(0,i.jsx)(n.code,{children:"fputc"}),". Functions like ",(0,i.jsx)(n.code,{children:"fprintf"})," (except for ",(0,i.jsx)(n.code,{children:"stderr"})," or logging) and\n",(0,i.jsx)(n.code,{children:"fscanf"})," are ",(0,i.jsx)(n.strong,{children:"forbidden"}),"."]}),"\n",(0,i.jsx)(n.p,{children:"In case you struggle and want to use one of those functions, the solution will be\npenalized by 50% of points."}),"\n",(0,i.jsx)(n.h3,{id:"bonus-part-075-k",children:"Bonus part (0.75 K\u20a1)"}),"\n",(0,i.jsxs)(n.p,{children:["Bonus part of this assignment is to implement ",(0,i.jsx)(n.code,{children:"count_anything"})," rather than ",(0,i.jsx)(n.code,{children:"count_ananas"}),"."]}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsx)(n.p,{children:"Smaller hint: This task does not need dynamic allocation :) You just need one\ngood helper function and the right idea ;)"}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"task-no-2-weird-trees-1-k",children:"Task no. 2: Weird trees (1 K\u20a1)"}),"\n",(0,i.jsxs)(n.p,{children:["In this task we are crossing our paths with ",(0,i.jsx)(n.em,{children:"algorithms and data structures"}),".\nYour task is to write a program that constructs tree from the file that is given\nas an argument and pretty-prints it."]}),"\n",(0,i.jsxs)(n.p,{children:["Input file consists of lines, that include ",(0,i.jsx)(n.code,{children:"key"})," and ",(0,i.jsx)(n.code,{children:"rank"})," in form ",(0,i.jsx)(n.code,{children:"key;rank"}),"\nor ",(0,i.jsx)(n.code,{children:"nil"}),". Why would we have ",(0,i.jsx)(n.code,{children:"nil"})," in a file? The file represents pre-order iteration\nthrough the tree. Leaves never have rank different than 0, so you can safely assume\n2 non-existing ",(0,i.jsx)(n.code,{children:"nil"}),"s in the input after you read such node ;)"]}),"\n",(0,i.jsxs)("table",{children:[(0,i.jsxs)("tr",{children:[(0,i.jsx)("th",{children:"Example input file"}),(0,i.jsx)("th",{children:"Tree it represents"})]}),(0,i.jsxs)("tr",{children:[(0,i.jsx)("td",{children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"8;4\n5;3\n3;2\n2;1\n1;0\nnil\n4;0\n7;1\n6;0\nnil\n11;2\n10;1\n9;0\nnil\n12;0\n"})})}),(0,i.jsx)("td",{children:(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"tree",src:t(30073).Z+"",width:"633",height:"684"})})})]})]}),"\n",(0,i.jsxs)(n.p,{children:["In this task you are only provided with different trees in the ",(0,i.jsx)(n.code,{children:"test-trees"})," directory.\nImplementation and format of the pretty-print is totally up to you. :)"]}),"\n",(0,i.jsx)(n.p,{children:"Example of mine for the tree above:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"8 (rank = 4)\n+-- 5 (rank = 3)\n| +-- 3 (rank = 2)\n| | +-- 2 (rank = 1)\n| | | +-- 1 (rank = 0)\n| | +-- 4 (rank = 0)\n| +-- 7 (rank = 1)\n| +-- 6 (rank = 0)\n+-- 11 (rank = 2)\n +-- 10 (rank = 1)\n | +-- 9 (rank = 0)\n +-- 12 (rank = 0)\n"})}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsx)(n.p,{children:"Can you find out what are those trees? :)"}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"submitting",children:"Submitting"}),"\n",(0,i.jsx)(n.p,{children:"In case you have any questions, feel free to reach out to me."}),"\n",(0,i.jsx)(n.hr,{})]})}function h(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},30073:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/tree-c9e37f87f9095c00fad33ea034485ce6.png"},11151:(e,n,t)=>{t.d(n,{Z:()=>c,a:()=>o});var i=t(67294);const s={},r=i.createContext(s);function o(e){const n=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),i.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/7052c0bc.178970a1.js b/assets/js/7052c0bc.178970a1.js deleted file mode 100644 index d2f0ced..0000000 --- a/assets/js/7052c0bc.178970a1.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[9731],{42286:(t,e,n)=>{n.r(e),n.d(e,{assets:()=>a,contentTitle:()=>c,default:()=>d,frontMatter:()=>i,metadata:()=>s,toc:()=>p});var o=n(85893),r=n(11151);const i={id:"cpp-intro",title:"Introduction",slug:"/"},c=void 0,s={id:"cpp-intro",title:"Introduction",description:"",source:"@site/cpp/00-intro.md",sourceDirName:".",slug:"/",permalink:"/cpp/",draft:!1,unlisted:!1,editUrl:"https://github.com/mfocko/blog/tree/main/cpp/00-intro.md",tags:[],version:"current",lastUpdatedAt:1707323940,formattedLastUpdatedAt:"Feb 7, 2024",sidebarPosition:0,frontMatter:{id:"cpp-intro",title:"Introduction",slug:"/"},sidebar:"autogeneratedBar",next:{title:"Exceptions and RAII",permalink:"/cpp/category/exceptions-and-raii"}},a={},p=[];function u(t){return(0,o.jsx)(o.Fragment,{})}function d(t={}){const{wrapper:e}={...(0,r.a)(),...t.components};return e?(0,o.jsx)(e,{...t,children:(0,o.jsx)(u,{...t})}):u()}},11151:(t,e,n)=>{n.d(e,{Z:()=>s,a:()=>c});var o=n(67294);const r={},i=o.createContext(r);function c(t){const e=o.useContext(i);return o.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function s(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(r):t.components||r:c(t.components),o.createElement(i.Provider,{value:e},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/7052c0bc.f121b724.js b/assets/js/7052c0bc.f121b724.js new file mode 100644 index 0000000..fc9d626 --- /dev/null +++ b/assets/js/7052c0bc.f121b724.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[9731],{42286:(t,e,n)=>{n.r(e),n.d(e,{assets:()=>a,contentTitle:()=>c,default:()=>d,frontMatter:()=>i,metadata:()=>s,toc:()=>p});var o=n(85893),r=n(11151);const i={id:"cpp-intro",title:"Introduction",slug:"/"},c=void 0,s={id:"cpp-intro",title:"Introduction",description:"",source:"@site/cpp/00-intro.md",sourceDirName:".",slug:"/",permalink:"/cpp/",draft:!1,unlisted:!1,editUrl:"https://github.com/mfocko/blog/tree/main/cpp/00-intro.md",tags:[],version:"current",lastUpdatedAt:1707820269,formattedLastUpdatedAt:"Feb 13, 2024",sidebarPosition:0,frontMatter:{id:"cpp-intro",title:"Introduction",slug:"/"},sidebar:"autogeneratedBar",next:{title:"Exceptions and RAII",permalink:"/cpp/category/exceptions-and-raii"}},a={},p=[];function u(t){return(0,o.jsx)(o.Fragment,{})}function d(t={}){const{wrapper:e}={...(0,r.a)(),...t.components};return e?(0,o.jsx)(e,{...t,children:(0,o.jsx)(u,{...t})}):u()}},11151:(t,e,n)=>{n.d(e,{Z:()=>s,a:()=>c});var o=n(67294);const r={},i=o.createContext(r);function c(t){const e=o.useContext(i);return o.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function s(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(r):t.components||r:c(t.components),o.createElement(i.Provider,{value:e},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/794ef108.784150bd.js b/assets/js/794ef108.784150bd.js deleted file mode 100644 index 6befa1d..0000000 --- a/assets/js/794ef108.784150bd.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[3803],{86427:(t,e,n)=>{n.r(e),n.d(e,{assets:()=>a,contentTitle:()=>s,default:()=>l,frontMatter:()=>i,metadata:()=>c,toc:()=>u});var o=n(85893),r=n(11151);const i={id:"c-intro",title:"Introduction",slug:"/"},s=void 0,c={id:"c-intro",title:"Introduction",description:"",source:"@site/c/00-intro.md",sourceDirName:".",slug:"/",permalink:"/c/",draft:!1,unlisted:!1,editUrl:"https://github.com/mfocko/blog/tree/main/c/00-intro.md",tags:[],version:"current",lastUpdatedAt:1707323940,formattedLastUpdatedAt:"Feb 7, 2024",sidebarPosition:0,frontMatter:{id:"c-intro",title:"Introduction",slug:"/"},sidebar:"autogeneratedBar",next:{title:"Bonuses",permalink:"/c/category/bonuses"}},a={},u=[];function d(t){return(0,o.jsx)(o.Fragment,{})}function l(t={}){const{wrapper:e}={...(0,r.a)(),...t.components};return e?(0,o.jsx)(e,{...t,children:(0,o.jsx)(d,{...t})}):d()}},11151:(t,e,n)=>{n.d(e,{Z:()=>c,a:()=>s});var o=n(67294);const r={},i=o.createContext(r);function s(t){const e=o.useContext(i);return o.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function c(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(r):t.components||r:s(t.components),o.createElement(i.Provider,{value:e},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/794ef108.9138634c.js b/assets/js/794ef108.9138634c.js new file mode 100644 index 0000000..ef0b336 --- /dev/null +++ b/assets/js/794ef108.9138634c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[3803],{86427:(t,e,n)=>{n.r(e),n.d(e,{assets:()=>a,contentTitle:()=>s,default:()=>l,frontMatter:()=>i,metadata:()=>c,toc:()=>u});var o=n(85893),r=n(11151);const i={id:"c-intro",title:"Introduction",slug:"/"},s=void 0,c={id:"c-intro",title:"Introduction",description:"",source:"@site/c/00-intro.md",sourceDirName:".",slug:"/",permalink:"/c/",draft:!1,unlisted:!1,editUrl:"https://github.com/mfocko/blog/tree/main/c/00-intro.md",tags:[],version:"current",lastUpdatedAt:1707820269,formattedLastUpdatedAt:"Feb 13, 2024",sidebarPosition:0,frontMatter:{id:"c-intro",title:"Introduction",slug:"/"},sidebar:"autogeneratedBar",next:{title:"Bonuses",permalink:"/c/category/bonuses"}},a={},u=[];function d(t){return(0,o.jsx)(o.Fragment,{})}function l(t={}){const{wrapper:e}={...(0,r.a)(),...t.components};return e?(0,o.jsx)(e,{...t,children:(0,o.jsx)(d,{...t})}):d()}},11151:(t,e,n)=>{n.d(e,{Z:()=>c,a:()=>s});var o=n(67294);const r={},i=o.createContext(r);function s(t){const e=o.useContext(i);return o.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function c(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(r):t.components||r:s(t.components),o.createElement(i.Provider,{value:e},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/84d1e0d8.2b167def.js b/assets/js/84d1e0d8.2b167def.js deleted file mode 100644 index 131abd2..0000000 --- a/assets/js/84d1e0d8.2b167def.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[1885],{49713:(t,e,n)=>{n.r(e),n.d(e,{assets:()=>c,contentTitle:()=>i,default:()=>u,frontMatter:()=>r,metadata:()=>a,toc:()=>d});var o=n(85893),s=n(11151);const r={id:"algorithms-intro",title:"Introduction",slug:"/"},i=void 0,a={id:"algorithms-intro",title:"Introduction",description:"In this part you can find \u201crandom\u201d additional materials I have written over the",source:"@site/algorithms/00-intro.md",sourceDirName:".",slug:"/",permalink:"/algorithms/",draft:!1,unlisted:!1,editUrl:"https://github.com/mfocko/blog/tree/main/algorithms/00-intro.md",tags:[],version:"current",lastUpdatedAt:1707323940,formattedLastUpdatedAt:"Feb 7, 2024",sidebarPosition:0,frontMatter:{id:"algorithms-intro",title:"Introduction",slug:"/"},sidebar:"autogeneratedBar",next:{title:"Algorithms and Correctness",permalink:"/algorithms/category/algorithms-and-correctness"}},c={},d=[];function l(t){const e={a:"a",em:"em",p:"p",...(0,s.a)(),...t.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)(e.p,{children:["In this part you can find \u201crandom\u201d additional materials I have written over the\ncourse of teaching ",(0,o.jsx)(e.em,{children:"Algorithms and data structures I"}),"."]}),"\n",(0,o.jsx)(e.p,{children:"It is a various mix of stuff that may have been produced as a follow-up on some\nquestion asked at the seminar or spontanously."}),"\n",(0,o.jsxs)(e.p,{children:["If you have some ideas for posts, please do not hesitate to submit them as issues\nin the linked ",(0,o.jsx)(e.a,{href:"https://gitlab.fi.muni.cz/xfocko/kb/issues",children:"GitLab"}),"."]})]})}function u(t={}){const{wrapper:e}={...(0,s.a)(),...t.components};return e?(0,o.jsx)(e,{...t,children:(0,o.jsx)(l,{...t})}):l(t)}},11151:(t,e,n)=>{n.d(e,{Z:()=>a,a:()=>i});var o=n(67294);const s={},r=o.createContext(s);function i(t){const e=o.useContext(r);return o.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function a(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(s):t.components||s:i(t.components),o.createElement(r.Provider,{value:e},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/84d1e0d8.cda49e51.js b/assets/js/84d1e0d8.cda49e51.js new file mode 100644 index 0000000..ffc7d66 --- /dev/null +++ b/assets/js/84d1e0d8.cda49e51.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[1885],{49713:(t,e,n)=>{n.r(e),n.d(e,{assets:()=>c,contentTitle:()=>i,default:()=>u,frontMatter:()=>r,metadata:()=>a,toc:()=>d});var o=n(85893),s=n(11151);const r={id:"algorithms-intro",title:"Introduction",slug:"/"},i=void 0,a={id:"algorithms-intro",title:"Introduction",description:"In this part you can find \u201crandom\u201d additional materials I have written over the",source:"@site/algorithms/00-intro.md",sourceDirName:".",slug:"/",permalink:"/algorithms/",draft:!1,unlisted:!1,editUrl:"https://github.com/mfocko/blog/tree/main/algorithms/00-intro.md",tags:[],version:"current",lastUpdatedAt:1707820269,formattedLastUpdatedAt:"Feb 13, 2024",sidebarPosition:0,frontMatter:{id:"algorithms-intro",title:"Introduction",slug:"/"},sidebar:"autogeneratedBar",next:{title:"Algorithms and Correctness",permalink:"/algorithms/category/algorithms-and-correctness"}},c={},d=[];function l(t){const e={a:"a",em:"em",p:"p",...(0,s.a)(),...t.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)(e.p,{children:["In this part you can find \u201crandom\u201d additional materials I have written over the\ncourse of teaching ",(0,o.jsx)(e.em,{children:"Algorithms and data structures I"}),"."]}),"\n",(0,o.jsx)(e.p,{children:"It is a various mix of stuff that may have been produced as a follow-up on some\nquestion asked at the seminar or spontanously."}),"\n",(0,o.jsxs)(e.p,{children:["If you have some ideas for posts, please do not hesitate to submit them as issues\nin the linked ",(0,o.jsx)(e.a,{href:"https://gitlab.fi.muni.cz/xfocko/kb/issues",children:"GitLab"}),"."]})]})}function u(t={}){const{wrapper:e}={...(0,s.a)(),...t.components};return e?(0,o.jsx)(e,{...t,children:(0,o.jsx)(l,{...t})}):l(t)}},11151:(t,e,n)=>{n.d(e,{Z:()=>a,a:()=>i});var o=n(67294);const s={},r=o.createContext(s);function i(t){const e=o.useContext(r);return o.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function a(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(s):t.components||s:i(t.components),o.createElement(r.Provider,{value:e},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/aa635a28.56c5b5ee.js b/assets/js/aa635a28.fa524ef9.js similarity index 67% rename from assets/js/aa635a28.56c5b5ee.js rename to assets/js/aa635a28.fa524ef9.js index 85ef947..6bfd58c 100644 --- a/assets/js/aa635a28.56c5b5ee.js +++ b/assets/js/aa635a28.fa524ef9.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[2321],{72820:(t,e,i)=>{i.r(e),i.d(e,{assets:()=>l,contentTitle:()=>a,default:()=>c,frontMatter:()=>n,metadata:()=>r,toc:()=>u});var o=i(85893),s=i(11151);const n={title:"LTS distributions",description:"Shower thoughts on the LTS Linux distributions.\n",date:new Date("2024-02-07T00:00:00.000Z"),authors:[{key:"mf",title:"a.k.a. small Fedora maintainer"}],tags:["lts","linux distributions","support","paywall"],hide_table_of_contents:!1},a=void 0,r={permalink:"/blog/2024/02/07/lts-distros",editUrl:"https://github.com/mfocko/blog/tree/main/blog/2024-02-07-lts-distros.md",source:"@site/blog/2024-02-07-lts-distros.md",title:"LTS distributions",description:"Shower thoughts on the LTS Linux distributions.\n",date:"2024-02-07T00:00:00.000Z",formattedDate:"February 7, 2024",tags:[{label:"lts",permalink:"/blog/tags/lts"},{label:"linux distributions",permalink:"/blog/tags/linux-distributions"},{label:"support",permalink:"/blog/tags/support"},{label:"paywall",permalink:"/blog/tags/paywall"}],readingTime:14.515,hasTruncateMarker:!0,authors:[{name:"Matej Focko",email:"me+blog@mfocko.xyz",title:"a.k.a. small Fedora maintainer",url:"https://gitlab.com/mfocko",imageURL:"https://github.com/mfocko.png",key:"mf"}],frontMatter:{title:"LTS distributions",description:"Shower thoughts on the LTS Linux distributions.\n",date:"2024-02-07T00:00:00.000Z",authors:[{key:"mf",title:"a.k.a. small Fedora maintainer"}],tags:["lts","linux distributions","support","paywall"],hide_table_of_contents:!1},unlisted:!1,nextItem:{title:"Mixed feelings on Rust",permalink:"/blog/2024/01/28/rust-opinion"}},l={authorsImageUrls:[void 0]},u=[];function d(t){const e={a:"a",em:"em",img:"img",p:"p",...(0,s.a)(),...t.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(e.p,{children:"Linux distributions are a common choice for running the servers. There's a wide\nvariety of distributions, but on the servers majority is made by only a few."}),"\n",(0,o.jsxs)(e.p,{children:["Some corporations also profit from the support of the \u201cbig\u201d distributions. Let's\ndive into the pros, cons and peculiarities of such ",(0,o.jsx)(e.em,{children:"business"}),"."]}),"\n",(0,o.jsxs)(e.p,{children:["This post is inspired/triggered by the following Mastodon post:\n",(0,o.jsx)(e.a,{href:"https://hackers.town/@antijingoist/111864760073049505",children:(0,o.jsx)(e.img,{src:"https://cdn.pawb.social/mastodon-fe/media_attachments/files/111/864/549/106/543/961/original/f4dac207fb93ffa8.png",alt:"Mastodon post about Ubuntu Pro"})})]})]})}function c(t={}){const{wrapper:e}={...(0,s.a)(),...t.components};return e?(0,o.jsx)(e,{...t,children:(0,o.jsx)(d,{...t})}):d(t)}},11151:(t,e,i)=>{i.d(e,{Z:()=>r,a:()=>a});var o=i(67294);const s={},n=o.createContext(s);function a(t){const e=o.useContext(n);return o.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function r(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(s):t.components||s:a(t.components),o.createElement(n.Provider,{value:e},t.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[2321],{72820:(t,e,i)=>{i.r(e),i.d(e,{assets:()=>l,contentTitle:()=>r,default:()=>d,frontMatter:()=>n,metadata:()=>a,toc:()=>u});var o=i(85893),s=i(11151);const n={title:"LTS distributions",description:"Shower thoughts on the LTS Linux distributions.\n",date:new Date("2024-02-07T00:00:00.000Z"),authors:[{key:"mf",title:"a.k.a. small Fedora maintainer"}],tags:["lts","linux distributions","support","paywall"],hide_table_of_contents:!1},r=void 0,a={permalink:"/blog/2024/02/07/lts-distros",editUrl:"https://github.com/mfocko/blog/tree/main/blog/2024-02-07-lts-distros.md",source:"@site/blog/2024-02-07-lts-distros.md",title:"LTS distributions",description:"Shower thoughts on the LTS Linux distributions.\n",date:"2024-02-07T00:00:00.000Z",formattedDate:"February 7, 2024",tags:[{label:"lts",permalink:"/blog/tags/lts"},{label:"linux distributions",permalink:"/blog/tags/linux-distributions"},{label:"support",permalink:"/blog/tags/support"},{label:"paywall",permalink:"/blog/tags/paywall"}],readingTime:14.515,hasTruncateMarker:!0,authors:[{name:"Matej Focko",email:"me+blog@mfocko.xyz",title:"a.k.a. small Fedora maintainer",url:"https://gitlab.com/mfocko",imageURL:"https://github.com/mfocko.png",key:"mf"}],frontMatter:{title:"LTS distributions",description:"Shower thoughts on the LTS Linux distributions.\n",date:"2024-02-07T00:00:00.000Z",authors:[{key:"mf",title:"a.k.a. small Fedora maintainer"}],tags:["lts","linux distributions","support","paywall"],hide_table_of_contents:!1},unlisted:!1,nextItem:{title:"Mixed feelings on Rust",permalink:"/blog/2024/01/28/rust-opinion"}},l={authorsImageUrls:[void 0]},u=[];function c(t){const e={a:"a",em:"em",img:"img",p:"p",...(0,s.a)(),...t.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(e.p,{children:"Linux distributions are a common choice for running the servers. There's a wide\nvariety of distributions, but on the servers majority is made by only a few."}),"\n",(0,o.jsxs)(e.p,{children:["Some corporations also profit from the support of the \u201cbig\u201d distributions. Let's\ndive into the pros, cons and peculiarities of such ",(0,o.jsx)(e.em,{children:"business"}),"."]}),"\n",(0,o.jsxs)(e.p,{children:["This post is inspired/triggered by the following Mastodon post:\n",(0,o.jsx)(e.a,{href:"https://hackers.town/@antijingoist/111864760073049505",children:(0,o.jsx)(e.img,{src:"https://i.imgur.com/mh5RAlV.png",alt:"Mastodon post about Ubuntu Pro"})})]})]})}function d(t={}){const{wrapper:e}={...(0,s.a)(),...t.components};return e?(0,o.jsx)(e,{...t,children:(0,o.jsx)(c,{...t})}):c(t)}},11151:(t,e,i)=>{i.d(e,{Z:()=>a,a:()=>r});var o=i(67294);const s={},n=o.createContext(s);function r(t){const e=o.useContext(n);return o.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function a(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(s):t.components||s:r(t.components),o.createElement(n.Provider,{value:e},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/b1288602.201f607c.js b/assets/js/b1288602.201f607c.js new file mode 100644 index 0000000..2aa0776 --- /dev/null +++ b/assets/js/b1288602.201f607c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[59],{51456:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>a,toc:()=>h});var r=t(85893),s=t(11151);const o={title:"Submitting merge requests"},i="Submitting merge requests for review",a={id:"mr",title:"Submitting merge requests",description:"This tutorial aims to show you how to follow basic git workflow and submit changes",source:"@site/c/mr.md",sourceDirName:".",slug:"/mr",permalink:"/c/mr",draft:!1,unlisted:!1,editUrl:"https://github.com/mfocko/blog/tree/main/c/mr.md",tags:[],version:"current",lastUpdatedAt:1707820269,formattedLastUpdatedAt:"Feb 13, 2024",frontMatter:{title:"Submitting merge requests"},sidebar:"autogeneratedBar",previous:{title:"Practice exam C",permalink:"/c/pexam/cams"}},c={},h=[{value:"Tutorial",id:"tutorial",level:2},{value:"Step #1 - Starting from the clean repository",id:"step-1---starting-from-the-clean-repository",level:3},{value:"Step #2 - Create new branch",id:"step-2---create-new-branch",level:3},{value:"Step #3 - Do the assignment",id:"step-3---do-the-assignment",level:3},{value:"Step #4 - Commit and upload the changes to GitLab",id:"step-4---commit-and-upload-the-changes-to-gitlab",level:3},{value:"Step #5 - Creating a merge request manually",id:"step-5---creating-a-merge-request-manually",level:3},{value:"Step #6 - Set assignees",id:"step-6---set-assignees",level:3},{value:"Step #7 - Return to default branch",id:"step-7---return-to-default-branch",level:3}];function l(e){const n={a:"a",blockquote:"blockquote",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",hr:"hr",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",...(0,s.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h1,{id:"submitting-merge-requests-for-review",children:"Submitting merge requests for review"}),"\n",(0,r.jsxs)(n.p,{children:["This tutorial aims to show you how to follow basic git workflow and submit changes\nthrough ",(0,r.jsx)(n.em,{children:"Merge Requests"})," for review."]}),"\n",(0,r.jsxs)(n.p,{children:["The rudimentary idea behind aims for changes to be present on a separate branch\nthat is supposedly ",(0,r.jsx)(n.em,{children:"merged"})," into the default branch. Till then changes can be reviewed\non ",(0,r.jsx)(n.em,{children:"Merge Request"})," and additional changes may be made based on the reviews. Once\nthe changes satisfy requirements, the merge request is merged."]}),"\n",(0,r.jsx)(n.h2,{id:"tutorial",children:"Tutorial"}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsxs)(n.p,{children:["Use this tutorial only for bonus assignments ",(0,r.jsx)(n.strong,{children:"made by your tutors"})," or in case\nyou need to make up for the absence."]}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"step-1---starting-from-the-clean-repository",children:"Step #1 - Starting from the clean repository"}),"\n",(0,r.jsxs)(n.p,{children:["In your repository (either locally or on aisa) type ",(0,r.jsx)(n.code,{children:"git status"})," and check if your\nrepository is clean and you are present on the main branch (",(0,r.jsx)(n.code,{children:"master"}),", ",(0,r.jsx)(n.code,{children:"main"})," or\n",(0,r.jsx)(n.code,{children:"trunk"}),"). If you do not know what your default branch is, it is probably ",(0,r.jsx)(n.code,{children:"master"}),"\nand you should not be on any other branch."]}),"\n",(0,r.jsx)(n.p,{children:"Output of the command should look like this:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"aisa$ git status\nOn branch master # Or main or trunk.\nYour branch is up to date with 'origin/master'.\n\nnothing to commit, working tree clean\n"})}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsxs)(n.p,{children:["In case you are on different branch or there are uncommitted changes,\n",(0,r.jsx)(n.strong,{children:"do not continue!!!"})," Clean your repository (commit the changes or discard\nthem), before you continue."]}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"step-2---create-new-branch",children:"Step #2 - Create new branch"}),"\n",(0,r.jsx)(n.p,{children:"In your repository write command:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"aisa$ git checkout -b BRANCH\nSwitched to a new branch 'BRANCH'\n"})}),"\n",(0,r.jsxs)(n.p,{children:["Instead of ",(0,r.jsx)(n.code,{children:"BRANCH"})," use some reasonable name for the branch. For example if you\nare working on the seminar from 3rd week, name the branch ",(0,r.jsx)(n.code,{children:"seminar-03"}),"."]}),"\n",(0,r.jsx)(n.h3,{id:"step-3---do-the-assignment",children:"Step #3 - Do the assignment"}),"\n",(0,r.jsx)(n.p,{children:"Download the skeleton for the seminar assignment, extract and program. For example\nif you are working on 3rd seminar, you can do so by:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"aisa$ wget https://www.fi.muni.cz/pb071/seminars/seminar-03/pb071-seminar-03.zip\naisa$ unzip pb071-seminar-03.zip\n# Now you should have directory 'seminar-03'.\naisa$ rm pb071-seminar-03.zip\naisa$ cd seminar-03\n# You can work on the assignment.\n"})}),"\n",(0,r.jsx)(n.h3,{id:"step-4---commit-and-upload-the-changes-to-gitlab",children:"Step #4 - Commit and upload the changes to GitLab"}),"\n",(0,r.jsxs)(n.p,{children:["The same way you ",(0,r.jsx)(n.em,{children:"add"})," and ",(0,r.jsx)(n.em,{children:"commit"})," files for the homework assignments, you do for\nthe seminar."]}),"\n",(0,r.jsxs)(n.p,{children:["Now you can upload the changes to GitLab. ",(0,r.jsx)(n.code,{children:"git push"})," is not enough, since repository\non GitLab does not know your new branch. You can solve this by adding arguments:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"aisa$ git push origin BRANCH\n...\nremote: To create a merge request for BRANCH, visit:\nremote: https://gitlab.fi.muni.cz/login/pb071/merge_requests/new?merge_request%5Bsource_branch%5D=BRANCH\n...\n"})}),"\n",(0,r.jsx)(n.p,{children:"In the output you should have a link for creating a merge request. If you see this\nlink, open it and skip next step."}),"\n",(0,r.jsx)(n.h3,{id:"step-5---creating-a-merge-request-manually",children:"Step #5 - Creating a merge request manually"}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsx)(n.li,{children:"Open your repository on GitLab."}),"\n",(0,r.jsxs)(n.li,{children:["On the left panel click on ",(0,r.jsx)(n.em,{children:"Merge Requests"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:["Click on ",(0,r.jsx)(n.em,{children:"New Merge Request"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:["In ",(0,r.jsx)(n.em,{children:"Source branch"})," select ",(0,r.jsx)(n.code,{children:"login/pb071"})," and ",(0,r.jsx)(n.code,{children:"BRANCH"}),", which you created."]}),"\n",(0,r.jsxs)(n.li,{children:["In ",(0,r.jsx)(n.em,{children:"Target branch"})," select ",(0,r.jsx)(n.code,{children:"login/pb071"})," and your default branch you have seen\nin the output of the first command. (most likely ",(0,r.jsx)(n.code,{children:"master"}),")"]}),"\n",(0,r.jsxs)(n.li,{children:["Click on ",(0,r.jsx)(n.em,{children:"Compare branches and continue"}),"."]}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"step-6---set-assignees",children:"Step #6 - Set assignees"}),"\n",(0,r.jsxs)(n.p,{children:["On the page that is opened, please check at the top that you are creating merge\nrequest ",(0,r.jsx)(n.strong,{children:"from"})," your new branch ",(0,r.jsx)(n.strong,{children:"to"})," your default branch (one of ",(0,r.jsx)(n.code,{children:"master"}),", ",(0,r.jsx)(n.code,{children:"main"}),"\nor ",(0,r.jsx)(n.code,{children:"trunk"}),")."]}),"\n",(0,r.jsxs)(n.p,{children:["Then in the field ",(0,r.jsx)(n.em,{children:"Assignees"})," set your tutors based on the seminar group. You can\nuse login for a quick look up."]}),"\n",(0,r.jsxs)(n.p,{children:["In the end click on ",(0,r.jsx)(n.em,{children:"Submit merge request"}),"."]}),"\n",(0,r.jsx)(n.h3,{id:"step-7---return-to-default-branch",children:"Step #7 - Return to default branch"}),"\n",(0,r.jsx)(n.p,{children:"Homework assignments can be submitted only from branches specified in the rules\nfor the course. Because of that, before you do anything else, you should switch\nback to your default branch."}),"\n",(0,r.jsxs)(n.p,{children:["First of all, same as in step #1, check that your repository is clean with ",(0,r.jsx)(n.code,{children:"git status"}),".\nFor the sake of safety, do not continue without clean repository. Then with command\n",(0,r.jsx)(n.code,{children:"git checkout BRANCH"})," switch to your default branch ",(0,r.jsx)(n.code,{children:"BRANCH"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["If you do not know which branch is your default, try ",(0,r.jsx)(n.code,{children:"git branch"})," that outputs all branches in your repository. Default branch is typically ",(0,r.jsx)(n.code,{children:"master"}),", but can\nbe ",(0,r.jsx)(n.code,{children:"main"})," or ",(0,r.jsx)(n.code,{children:"trunk"}),"."]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"aisa$ git status\n# Check if repository is clean\n\n# If you know, what is your default branch, you can skip next command.\naisa$ git branch\n# Find the default branch in the list; should be one of the `master`, `main` or\n# `trunk` and you should not have more than one of those.\n# In case the list clears the terminal and you cannot see shell prompt, you can\n# press `q` to quit the pager.\n\naisa$ git checkout master\n"})}),"\n",(0,r.jsx)(n.hr,{}),"\n",(0,r.jsxs)(n.p,{children:["Adapted from: ",(0,r.jsx)(n.a,{href:"https://www.fi.muni.cz/~xlacko1/pb071/mr.html",children:"https://www.fi.muni.cz/~xlacko1/pb071/mr.html"})]})]})}function d(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},11151:(e,n,t)=>{t.d(n,{Z:()=>a,a:()=>i});var r=t(67294);const s={},o=r.createContext(s);function i(e){const n=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),r.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b1288602.8bfe3b88.js b/assets/js/b1288602.8bfe3b88.js deleted file mode 100644 index 2b109d7..0000000 --- a/assets/js/b1288602.8bfe3b88.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[59],{51456:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>a,toc:()=>h});var r=t(85893),s=t(11151);const o={title:"Submitting merge requests"},i="Submitting merge requests for review",a={id:"mr",title:"Submitting merge requests",description:"This tutorial aims to show you how to follow basic git workflow and submit changes",source:"@site/c/mr.md",sourceDirName:".",slug:"/mr",permalink:"/c/mr",draft:!1,unlisted:!1,editUrl:"https://github.com/mfocko/blog/tree/main/c/mr.md",tags:[],version:"current",lastUpdatedAt:1707323940,formattedLastUpdatedAt:"Feb 7, 2024",frontMatter:{title:"Submitting merge requests"},sidebar:"autogeneratedBar",previous:{title:"Practice exam C",permalink:"/c/pexam/cams"}},c={},h=[{value:"Tutorial",id:"tutorial",level:2},{value:"Step #1 - Starting from the clean repository",id:"step-1---starting-from-the-clean-repository",level:3},{value:"Step #2 - Create new branch",id:"step-2---create-new-branch",level:3},{value:"Step #3 - Do the assignment",id:"step-3---do-the-assignment",level:3},{value:"Step #4 - Commit and upload the changes to GitLab",id:"step-4---commit-and-upload-the-changes-to-gitlab",level:3},{value:"Step #5 - Creating a merge request manually",id:"step-5---creating-a-merge-request-manually",level:3},{value:"Step #6 - Set assignees",id:"step-6---set-assignees",level:3},{value:"Step #7 - Return to default branch",id:"step-7---return-to-default-branch",level:3}];function l(e){const n={a:"a",blockquote:"blockquote",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",hr:"hr",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",...(0,s.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h1,{id:"submitting-merge-requests-for-review",children:"Submitting merge requests for review"}),"\n",(0,r.jsxs)(n.p,{children:["This tutorial aims to show you how to follow basic git workflow and submit changes\nthrough ",(0,r.jsx)(n.em,{children:"Merge Requests"})," for review."]}),"\n",(0,r.jsxs)(n.p,{children:["The rudimentary idea behind aims for changes to be present on a separate branch\nthat is supposedly ",(0,r.jsx)(n.em,{children:"merged"})," into the default branch. Till then changes can be reviewed\non ",(0,r.jsx)(n.em,{children:"Merge Request"})," and additional changes may be made based on the reviews. Once\nthe changes satisfy requirements, the merge request is merged."]}),"\n",(0,r.jsx)(n.h2,{id:"tutorial",children:"Tutorial"}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsxs)(n.p,{children:["Use this tutorial only for bonus assignments ",(0,r.jsx)(n.strong,{children:"made by your tutors"})," or in case\nyou need to make up for the absence."]}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"step-1---starting-from-the-clean-repository",children:"Step #1 - Starting from the clean repository"}),"\n",(0,r.jsxs)(n.p,{children:["In your repository (either locally or on aisa) type ",(0,r.jsx)(n.code,{children:"git status"})," and check if your\nrepository is clean and you are present on the main branch (",(0,r.jsx)(n.code,{children:"master"}),", ",(0,r.jsx)(n.code,{children:"main"})," or\n",(0,r.jsx)(n.code,{children:"trunk"}),"). If you do not know what your default branch is, it is probably ",(0,r.jsx)(n.code,{children:"master"}),"\nand you should not be on any other branch."]}),"\n",(0,r.jsx)(n.p,{children:"Output of the command should look like this:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"aisa$ git status\nOn branch master # Or main or trunk.\nYour branch is up to date with 'origin/master'.\n\nnothing to commit, working tree clean\n"})}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsxs)(n.p,{children:["In case you are on different branch or there are uncommitted changes,\n",(0,r.jsx)(n.strong,{children:"do not continue!!!"})," Clean your repository (commit the changes or discard\nthem), before you continue."]}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"step-2---create-new-branch",children:"Step #2 - Create new branch"}),"\n",(0,r.jsx)(n.p,{children:"In your repository write command:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"aisa$ git checkout -b BRANCH\nSwitched to a new branch 'BRANCH'\n"})}),"\n",(0,r.jsxs)(n.p,{children:["Instead of ",(0,r.jsx)(n.code,{children:"BRANCH"})," use some reasonable name for the branch. For example if you\nare working on the seminar from 3rd week, name the branch ",(0,r.jsx)(n.code,{children:"seminar-03"}),"."]}),"\n",(0,r.jsx)(n.h3,{id:"step-3---do-the-assignment",children:"Step #3 - Do the assignment"}),"\n",(0,r.jsx)(n.p,{children:"Download the skeleton for the seminar assignment, extract and program. For example\nif you are working on 3rd seminar, you can do so by:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"aisa$ wget https://www.fi.muni.cz/pb071/seminars/seminar-03/pb071-seminar-03.zip\naisa$ unzip pb071-seminar-03.zip\n# Now you should have directory 'seminar-03'.\naisa$ rm pb071-seminar-03.zip\naisa$ cd seminar-03\n# You can work on the assignment.\n"})}),"\n",(0,r.jsx)(n.h3,{id:"step-4---commit-and-upload-the-changes-to-gitlab",children:"Step #4 - Commit and upload the changes to GitLab"}),"\n",(0,r.jsxs)(n.p,{children:["The same way you ",(0,r.jsx)(n.em,{children:"add"})," and ",(0,r.jsx)(n.em,{children:"commit"})," files for the homework assignments, you do for\nthe seminar."]}),"\n",(0,r.jsxs)(n.p,{children:["Now you can upload the changes to GitLab. ",(0,r.jsx)(n.code,{children:"git push"})," is not enough, since repository\non GitLab does not know your new branch. You can solve this by adding arguments:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"aisa$ git push origin BRANCH\n...\nremote: To create a merge request for BRANCH, visit:\nremote: https://gitlab.fi.muni.cz/login/pb071/merge_requests/new?merge_request%5Bsource_branch%5D=BRANCH\n...\n"})}),"\n",(0,r.jsx)(n.p,{children:"In the output you should have a link for creating a merge request. If you see this\nlink, open it and skip next step."}),"\n",(0,r.jsx)(n.h3,{id:"step-5---creating-a-merge-request-manually",children:"Step #5 - Creating a merge request manually"}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsx)(n.li,{children:"Open your repository on GitLab."}),"\n",(0,r.jsxs)(n.li,{children:["On the left panel click on ",(0,r.jsx)(n.em,{children:"Merge Requests"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:["Click on ",(0,r.jsx)(n.em,{children:"New Merge Request"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:["In ",(0,r.jsx)(n.em,{children:"Source branch"})," select ",(0,r.jsx)(n.code,{children:"login/pb071"})," and ",(0,r.jsx)(n.code,{children:"BRANCH"}),", which you created."]}),"\n",(0,r.jsxs)(n.li,{children:["In ",(0,r.jsx)(n.em,{children:"Target branch"})," select ",(0,r.jsx)(n.code,{children:"login/pb071"})," and your default branch you have seen\nin the output of the first command. (most likely ",(0,r.jsx)(n.code,{children:"master"}),")"]}),"\n",(0,r.jsxs)(n.li,{children:["Click on ",(0,r.jsx)(n.em,{children:"Compare branches and continue"}),"."]}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"step-6---set-assignees",children:"Step #6 - Set assignees"}),"\n",(0,r.jsxs)(n.p,{children:["On the page that is opened, please check at the top that you are creating merge\nrequest ",(0,r.jsx)(n.strong,{children:"from"})," your new branch ",(0,r.jsx)(n.strong,{children:"to"})," your default branch (one of ",(0,r.jsx)(n.code,{children:"master"}),", ",(0,r.jsx)(n.code,{children:"main"}),"\nor ",(0,r.jsx)(n.code,{children:"trunk"}),")."]}),"\n",(0,r.jsxs)(n.p,{children:["Then in the field ",(0,r.jsx)(n.em,{children:"Assignees"})," set your tutors based on the seminar group. You can\nuse login for a quick look up."]}),"\n",(0,r.jsxs)(n.p,{children:["In the end click on ",(0,r.jsx)(n.em,{children:"Submit merge request"}),"."]}),"\n",(0,r.jsx)(n.h3,{id:"step-7---return-to-default-branch",children:"Step #7 - Return to default branch"}),"\n",(0,r.jsx)(n.p,{children:"Homework assignments can be submitted only from branches specified in the rules\nfor the course. Because of that, before you do anything else, you should switch\nback to your default branch."}),"\n",(0,r.jsxs)(n.p,{children:["First of all, same as in step #1, check that your repository is clean with ",(0,r.jsx)(n.code,{children:"git status"}),".\nFor the sake of safety, do not continue without clean repository. Then with command\n",(0,r.jsx)(n.code,{children:"git checkout BRANCH"})," switch to your default branch ",(0,r.jsx)(n.code,{children:"BRANCH"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["If you do not know which branch is your default, try ",(0,r.jsx)(n.code,{children:"git branch"})," that outputs all branches in your repository. Default branch is typically ",(0,r.jsx)(n.code,{children:"master"}),", but can\nbe ",(0,r.jsx)(n.code,{children:"main"})," or ",(0,r.jsx)(n.code,{children:"trunk"}),"."]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"aisa$ git status\n# Check if repository is clean\n\n# If you know, what is your default branch, you can skip next command.\naisa$ git branch\n# Find the default branch in the list; should be one of the `master`, `main` or\n# `trunk` and you should not have more than one of those.\n# In case the list clears the terminal and you cannot see shell prompt, you can\n# press `q` to quit the pager.\n\naisa$ git checkout master\n"})}),"\n",(0,r.jsx)(n.hr,{}),"\n",(0,r.jsxs)(n.p,{children:["Adapted from: ",(0,r.jsx)(n.a,{href:"https://www.fi.muni.cz/~xlacko1/pb071/mr.html",children:"https://www.fi.muni.cz/~xlacko1/pb071/mr.html"})]})]})}function d(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},11151:(e,n,t)=>{t.d(n,{Z:()=>a,a:()=>i});var r=t(67294);const s={},o=r.createContext(s);function i(e){const n=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),r.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d05e838c.07dceab4.js b/assets/js/d05e838c.07dceab4.js new file mode 100644 index 0000000..55ae035 --- /dev/null +++ b/assets/js/d05e838c.07dceab4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[6544],{63004:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>d,contentTitle:()=>c,default:()=>a,frontMatter:()=>i,metadata:()=>o,toc:()=>l});var s=r(85893),t=r(11151);const i={id:"seminar-05-06",title:"5th and 6th seminar",description:"200IQ encryption.\n"},c=void 0,o={id:"bonuses/seminar-05-06",title:"5th and 6th seminar",description:"200IQ encryption.\n",source:"@site/c/bonuses/05-06.md",sourceDirName:"bonuses",slug:"/bonuses/seminar-05-06",permalink:"/c/bonuses/seminar-05-06",draft:!1,unlisted:!1,editUrl:"https://github.com/mfocko/blog/tree/main/c/bonuses/05-06.md",tags:[],version:"current",lastUpdatedAt:1707820269,formattedLastUpdatedAt:"Feb 13, 2024",frontMatter:{id:"seminar-05-06",title:"5th and 6th seminar",description:"200IQ encryption.\n"},sidebar:"autogeneratedBar",previous:{title:"4th seminar",permalink:"/c/bonuses/seminar-04"},next:{title:"8th seminar",permalink:"/c/bonuses/seminar-08"}},d={},l=[{value:"Introduction",id:"introduction",level:2},{value:"Task no. 1: Reverse (0.5 K\u20a1)",id:"task-no-1-reverse-05-k",level:3},{value:"Task no. 2: Vigen\xe8re (0.5 K\u20a1)",id:"task-no-2-vigen\xe8re-05-k",level:3},{value:"Bonus part (0.5 K\u20a1)",id:"bonus-part-05-k",level:4},{value:"Task no. 3: Bit madness (0.5 K\u20a1)",id:"task-no-3-bit-madness-05-k",level:3},{value:"Task no. 4: All combined to BMP (0.5 K\u20a1)",id:"task-no-4-all-combined-to-bmp-05-k",level:3},{value:"Submitting",id:"submitting",level:2}];function h(e){const n={a:"a",code:"code",h2:"h2",h3:"h3",h4:"h4",hr:"hr",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,t.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.p,{children:"For this bonus you can get at maximum 2.5 K\u20a1."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.a,{href:"pathname:///files/c/bonuses/05-06.tar.gz",children:"Source"})}),"\n",(0,s.jsx)(n.h2,{id:"introduction",children:"Introduction"}),"\n",(0,s.jsx)(n.p,{children:"In this bonus you will implement few functions that will be used together for\nimplementing a very special cipher."}),"\n",(0,s.jsx)(n.h3,{id:"task-no-1-reverse-05-k",children:"Task no. 1: Reverse (0.5 K\u20a1)"}),"\n",(0,s.jsxs)(n.p,{children:["Write a function ",(0,s.jsx)(n.code,{children:"char* reverse(const char* text)"})," that returns copy of the input\nstring in reversed order (also uppercase)."]}),"\n",(0,s.jsxs)(n.p,{children:["In case you are given ",(0,s.jsx)(n.code,{children:"NULL"}),", return ",(0,s.jsx)(n.code,{children:"NULL"}),"."]}),"\n",(0,s.jsx)(n.p,{children:"Example (more in tests):"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-c",children:'char* reversed = reverse("Hello world!");\n\nprintf("%s\\n", reversed);\n// "!DLROW OLLEH"\n\nif (reversed != NULL) {\n free(reversed);\n}\n'})}),"\n",(0,s.jsx)(n.h3,{id:"task-no-2-vigen\xe8re-05-k",children:"Task no. 2: Vigen\xe8re (0.5 K\u20a1)"}),"\n",(0,s.jsx)(n.p,{children:"Vigen\xe8re cipher is similar to the Caesar cipher, but you also have a key that is\nused for encrypting (or decrypting)."}),"\n",(0,s.jsx)(n.p,{children:"Your task is to write two functions:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"char* vigenere_encrypt(const char* key, const char* text)"})," for encrypting"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"char* vigenere_decrypt(const char* key, const char* text)"})," for decrypting"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"In both of those you should return uppercase characters."}),"\n",(0,s.jsx)(n.p,{children:"Meaning of the parameters you are given:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"key"})," - String that represents key that is used for *crypting. It consists of\none word and can have only characters of the alphabet. Does not matter if they\nare uppercase or lowercase."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"text"})," - String that is to be *crypted."]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["Function returns address of the encrypted (or decrypted) string. Or ",(0,s.jsx)(n.code,{children:"NULL"})," in case\nerror occurs."]}),"\n",(0,s.jsx)(n.p,{children:"Example:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-c",children:'char *encrypted = vigenere_encrypt("CoMPuTeR", "Hello world!");\n\nprintf("%s\\n", encrypted);\n// "JSXAI PSINR!"\n\nif (encrypted != NULL) {\n free(encrypted)\n}\n'})}),"\n",(0,s.jsx)(n.h4,{id:"bonus-part-05-k",children:"Bonus part (0.5 K\u20a1)"}),"\n",(0,s.jsx)(n.p,{children:"If you can utilize helper function that would do both encrypting and decrypting,\nyou can gain 0.5 K\u20a1."}),"\n",(0,s.jsxs)(n.p,{children:["Usage of ",(0,s.jsx)(n.code,{children:"true"}),"/",(0,s.jsx)(n.code,{children:"false"})," to decide path in code is prohibited. It leads to merging\nof both functions into one. Point of this part is to discover a way to do this\ngenerically in such way that there are no separate paths for one or the other. One\nfunction with no branching for both of them, parametrization is your friend :)"]}),"\n",(0,s.jsx)(n.h3,{id:"task-no-3-bit-madness-05-k",children:"Task no. 3: Bit madness (0.5 K\u20a1)"}),"\n",(0,s.jsx)(n.p,{children:"This is a state of the art crypto. Please do not share :)"}),"\n",(0,s.jsx)(n.p,{children:"For encrypting:"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsx)(n.li,{children:"Split the character that is to be encrypted in halves (4 and 4 bits each)."}),"\n",(0,s.jsx)(n.li,{children:"Bits in 1st half are to be split into pairs. Swap bits in those pairs."}),"\n",(0,s.jsxs)(n.li,{children:["Then use the 4 bits that you created in the 2nd step for ",(0,s.jsx)(n.code,{children:"XOR"})," with the other\n4 bits."]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["This simple and ingenious principle will be illustrated on the following example.\nString we want to encrypt is ",(0,s.jsx)(n.code,{children:"Hello world!"}),". We need to encrypt each letter separately,\nso we will demonstrate on letter ",(0,s.jsx)(n.code,{children:"H"}),":"]}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Letter ",(0,s.jsx)(n.code,{children:"H"})," is represented in ASCII as ",(0,s.jsx)(n.code,{children:"72"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"72"})," represented in binary is: ",(0,s.jsx)(n.code,{children:"01001000"}),". So first 4 bits are: ",(0,s.jsx)(n.code,{children:"0100"})," and last\n4 bits are ",(0,s.jsx)(n.code,{children:"1000"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["First half of bits (",(0,s.jsx)(n.code,{children:"0100"}),") consists of 2 pairs (",(0,s.jsx)(n.code,{children:"01"})," and ",(0,s.jsx)(n.code,{children:"00"}),") which we swap\n(",(0,s.jsx)(n.code,{children:"01 ~> 10"})," and ",(0,s.jsx)(n.code,{children:"00 ~> 00"}),"). That way we get ",(0,s.jsx)(n.code,{children:"1000"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"That half is used for xor with the other 4 bits:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:" 1000 // second half\nXOR 1000 // first half after 2nd step\n--------\n 0000\n"})}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Now we combine both halves (first one is ",(0,s.jsx)(n.code,{children:"1000"}),", which we got from the 2nd step\nand second one is ",(0,s.jsx)(n.code,{children:"0000"}),", which we got from the 3rd step) and get ",(0,s.jsx)(n.code,{children:"10000000"}),",\nwhich is encrypted character ",(0,s.jsx)(n.code,{children:"H"})," using this method."]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"In case of decryption, reverse those steps."}),"\n",(0,s.jsx)(n.p,{children:"Your task is to implement functions:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"unsigned char* bit_encrypt(const char* text)"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"char* bit_decrypt(const unsigned char* text)"})}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Example:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-c",children:'unsigned char* encrypted = bit_encrypt("Hello world!");\n\nfor (int i = 0; i < 12;i++) {\n printf("%x ", encrypted[i]);\n //80 9c 95 95 96 11 bc 96 b9 95 9d 10\n}\n\nif (encrypted != NULL) {\n free(encrypted);\n}\n'})}),"\n",(0,s.jsx)(n.h3,{id:"task-no-4-all-combined-to-bmp-05-k",children:"Task no. 4: All combined to BMP (0.5 K\u20a1)"}),"\n",(0,s.jsx)(n.p,{children:"Authors of the BMP cipher are non-disclosed :)"}),"\n",(0,s.jsx)(n.p,{children:"Create pair of functions:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"unsigned char* bmp_encrypt(const char* key, const char* text)"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"char* bmp_decrypt(const char* key, const unsigned char* text)"})}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"BMP cipher consists of following steps for encrypting:"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsx)(n.li,{children:"Reverse the input string"}),"\n",(0,s.jsx)(n.li,{children:"Use Vigenere on the string you got from step #1"}),"\n",(0,s.jsx)(n.li,{children:"Use bit madness on the string you got from step #2"}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"For decrypting, reverse the steps."}),"\n",(0,s.jsx)(n.h2,{id:"submitting",children:"Submitting"}),"\n",(0,s.jsx)(n.p,{children:"In case you have any questions, feel free to reach out to me."}),"\n",(0,s.jsx)(n.hr,{})]})}function a(e={}){const{wrapper:n}={...(0,t.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},11151:(e,n,r)=>{r.d(n,{Z:()=>o,a:()=>c});var s=r(67294);const t={},i=s.createContext(t);function c(e){const n=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:c(e.components),s.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d05e838c.e278ca3a.js b/assets/js/d05e838c.e278ca3a.js deleted file mode 100644 index 4859e0b..0000000 --- a/assets/js/d05e838c.e278ca3a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[6544],{63004:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>d,contentTitle:()=>c,default:()=>a,frontMatter:()=>i,metadata:()=>o,toc:()=>l});var s=r(85893),t=r(11151);const i={id:"seminar-05-06",title:"5th and 6th seminar",description:"200IQ encryption.\n"},c=void 0,o={id:"bonuses/seminar-05-06",title:"5th and 6th seminar",description:"200IQ encryption.\n",source:"@site/c/bonuses/05-06.md",sourceDirName:"bonuses",slug:"/bonuses/seminar-05-06",permalink:"/c/bonuses/seminar-05-06",draft:!1,unlisted:!1,editUrl:"https://github.com/mfocko/blog/tree/main/c/bonuses/05-06.md",tags:[],version:"current",lastUpdatedAt:1707323940,formattedLastUpdatedAt:"Feb 7, 2024",frontMatter:{id:"seminar-05-06",title:"5th and 6th seminar",description:"200IQ encryption.\n"},sidebar:"autogeneratedBar",previous:{title:"4th seminar",permalink:"/c/bonuses/seminar-04"},next:{title:"8th seminar",permalink:"/c/bonuses/seminar-08"}},d={},l=[{value:"Introduction",id:"introduction",level:2},{value:"Task no. 1: Reverse (0.5 K\u20a1)",id:"task-no-1-reverse-05-k",level:3},{value:"Task no. 2: Vigen\xe8re (0.5 K\u20a1)",id:"task-no-2-vigen\xe8re-05-k",level:3},{value:"Bonus part (0.5 K\u20a1)",id:"bonus-part-05-k",level:4},{value:"Task no. 3: Bit madness (0.5 K\u20a1)",id:"task-no-3-bit-madness-05-k",level:3},{value:"Task no. 4: All combined to BMP (0.5 K\u20a1)",id:"task-no-4-all-combined-to-bmp-05-k",level:3},{value:"Submitting",id:"submitting",level:2}];function h(e){const n={a:"a",code:"code",h2:"h2",h3:"h3",h4:"h4",hr:"hr",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,t.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.p,{children:"For this bonus you can get at maximum 2.5 K\u20a1."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.a,{href:"pathname:///files/c/bonuses/05-06.tar.gz",children:"Source"})}),"\n",(0,s.jsx)(n.h2,{id:"introduction",children:"Introduction"}),"\n",(0,s.jsx)(n.p,{children:"In this bonus you will implement few functions that will be used together for\nimplementing a very special cipher."}),"\n",(0,s.jsx)(n.h3,{id:"task-no-1-reverse-05-k",children:"Task no. 1: Reverse (0.5 K\u20a1)"}),"\n",(0,s.jsxs)(n.p,{children:["Write a function ",(0,s.jsx)(n.code,{children:"char* reverse(const char* text)"})," that returns copy of the input\nstring in reversed order (also uppercase)."]}),"\n",(0,s.jsxs)(n.p,{children:["In case you are given ",(0,s.jsx)(n.code,{children:"NULL"}),", return ",(0,s.jsx)(n.code,{children:"NULL"}),"."]}),"\n",(0,s.jsx)(n.p,{children:"Example (more in tests):"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-c",children:'char* reversed = reverse("Hello world!");\n\nprintf("%s\\n", reversed);\n// "!DLROW OLLEH"\n\nif (reversed != NULL) {\n free(reversed);\n}\n'})}),"\n",(0,s.jsx)(n.h3,{id:"task-no-2-vigen\xe8re-05-k",children:"Task no. 2: Vigen\xe8re (0.5 K\u20a1)"}),"\n",(0,s.jsx)(n.p,{children:"Vigen\xe8re cipher is similar to the Caesar cipher, but you also have a key that is\nused for encrypting (or decrypting)."}),"\n",(0,s.jsx)(n.p,{children:"Your task is to write two functions:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"char* vigenere_encrypt(const char* key, const char* text)"})," for encrypting"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"char* vigenere_decrypt(const char* key, const char* text)"})," for decrypting"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"In both of those you should return uppercase characters."}),"\n",(0,s.jsx)(n.p,{children:"Meaning of the parameters you are given:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"key"})," - String that represents key that is used for *crypting. It consists of\none word and can have only characters of the alphabet. Does not matter if they\nare uppercase or lowercase."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"text"})," - String that is to be *crypted."]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["Function returns address of the encrypted (or decrypted) string. Or ",(0,s.jsx)(n.code,{children:"NULL"})," in case\nerror occurs."]}),"\n",(0,s.jsx)(n.p,{children:"Example:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-c",children:'char *encrypted = vigenere_encrypt("CoMPuTeR", "Hello world!");\n\nprintf("%s\\n", encrypted);\n// "JSXAI PSINR!"\n\nif (encrypted != NULL) {\n free(encrypted)\n}\n'})}),"\n",(0,s.jsx)(n.h4,{id:"bonus-part-05-k",children:"Bonus part (0.5 K\u20a1)"}),"\n",(0,s.jsx)(n.p,{children:"If you can utilize helper function that would do both encrypting and decrypting,\nyou can gain 0.5 K\u20a1."}),"\n",(0,s.jsxs)(n.p,{children:["Usage of ",(0,s.jsx)(n.code,{children:"true"}),"/",(0,s.jsx)(n.code,{children:"false"})," to decide path in code is prohibited. It leads to merging\nof both functions into one. Point of this part is to discover a way to do this\ngenerically in such way that there are no separate paths for one or the other. One\nfunction with no branching for both of them, parametrization is your friend :)"]}),"\n",(0,s.jsx)(n.h3,{id:"task-no-3-bit-madness-05-k",children:"Task no. 3: Bit madness (0.5 K\u20a1)"}),"\n",(0,s.jsx)(n.p,{children:"This is a state of the art crypto. Please do not share :)"}),"\n",(0,s.jsx)(n.p,{children:"For encrypting:"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsx)(n.li,{children:"Split the character that is to be encrypted in halves (4 and 4 bits each)."}),"\n",(0,s.jsx)(n.li,{children:"Bits in 1st half are to be split into pairs. Swap bits in those pairs."}),"\n",(0,s.jsxs)(n.li,{children:["Then use the 4 bits that you created in the 2nd step for ",(0,s.jsx)(n.code,{children:"XOR"})," with the other\n4 bits."]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["This simple and ingenious principle will be illustrated on the following example.\nString we want to encrypt is ",(0,s.jsx)(n.code,{children:"Hello world!"}),". We need to encrypt each letter separately,\nso we will demonstrate on letter ",(0,s.jsx)(n.code,{children:"H"}),":"]}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Letter ",(0,s.jsx)(n.code,{children:"H"})," is represented in ASCII as ",(0,s.jsx)(n.code,{children:"72"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"72"})," represented in binary is: ",(0,s.jsx)(n.code,{children:"01001000"}),". So first 4 bits are: ",(0,s.jsx)(n.code,{children:"0100"})," and last\n4 bits are ",(0,s.jsx)(n.code,{children:"1000"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["First half of bits (",(0,s.jsx)(n.code,{children:"0100"}),") consists of 2 pairs (",(0,s.jsx)(n.code,{children:"01"})," and ",(0,s.jsx)(n.code,{children:"00"}),") which we swap\n(",(0,s.jsx)(n.code,{children:"01 ~> 10"})," and ",(0,s.jsx)(n.code,{children:"00 ~> 00"}),"). That way we get ",(0,s.jsx)(n.code,{children:"1000"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"That half is used for xor with the other 4 bits:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:" 1000 // second half\nXOR 1000 // first half after 2nd step\n--------\n 0000\n"})}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Now we combine both halves (first one is ",(0,s.jsx)(n.code,{children:"1000"}),", which we got from the 2nd step\nand second one is ",(0,s.jsx)(n.code,{children:"0000"}),", which we got from the 3rd step) and get ",(0,s.jsx)(n.code,{children:"10000000"}),",\nwhich is encrypted character ",(0,s.jsx)(n.code,{children:"H"})," using this method."]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"In case of decryption, reverse those steps."}),"\n",(0,s.jsx)(n.p,{children:"Your task is to implement functions:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"unsigned char* bit_encrypt(const char* text)"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"char* bit_decrypt(const unsigned char* text)"})}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Example:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-c",children:'unsigned char* encrypted = bit_encrypt("Hello world!");\n\nfor (int i = 0; i < 12;i++) {\n printf("%x ", encrypted[i]);\n //80 9c 95 95 96 11 bc 96 b9 95 9d 10\n}\n\nif (encrypted != NULL) {\n free(encrypted);\n}\n'})}),"\n",(0,s.jsx)(n.h3,{id:"task-no-4-all-combined-to-bmp-05-k",children:"Task no. 4: All combined to BMP (0.5 K\u20a1)"}),"\n",(0,s.jsx)(n.p,{children:"Authors of the BMP cipher are non-disclosed :)"}),"\n",(0,s.jsx)(n.p,{children:"Create pair of functions:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"unsigned char* bmp_encrypt(const char* key, const char* text)"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"char* bmp_decrypt(const char* key, const unsigned char* text)"})}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"BMP cipher consists of following steps for encrypting:"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsx)(n.li,{children:"Reverse the input string"}),"\n",(0,s.jsx)(n.li,{children:"Use Vigenere on the string you got from step #1"}),"\n",(0,s.jsx)(n.li,{children:"Use bit madness on the string you got from step #2"}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"For decrypting, reverse the steps."}),"\n",(0,s.jsx)(n.h2,{id:"submitting",children:"Submitting"}),"\n",(0,s.jsx)(n.p,{children:"In case you have any questions, feel free to reach out to me."}),"\n",(0,s.jsx)(n.hr,{})]})}function a(e={}){const{wrapper:n}={...(0,t.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},11151:(e,n,r)=>{r.d(n,{Z:()=>o,a:()=>c});var s=r(67294);const t={},i=s.createContext(t);function c(e){const n=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:c(e.components),s.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d309eaf6.0e21f236.js b/assets/js/d309eaf6.0e21f236.js deleted file mode 100644 index b9be668..0000000 --- a/assets/js/d309eaf6.0e21f236.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[6995],{54506:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>h,contentTitle:()=>a,default:()=>c,frontMatter:()=>o,metadata:()=>r,toc:()=>l});var i=t(85893),s=t(11151);const o={title:"LTS distributions",description:"Shower thoughts on the LTS Linux distributions.\n",date:new Date("2024-02-07T00:00:00.000Z"),authors:[{key:"mf",title:"a.k.a. small Fedora maintainer"}],tags:["lts","linux distributions","support","paywall"],hide_table_of_contents:!1},a=void 0,r={permalink:"/blog/2024/02/07/lts-distros",editUrl:"https://github.com/mfocko/blog/tree/main/blog/2024-02-07-lts-distros.md",source:"@site/blog/2024-02-07-lts-distros.md",title:"LTS distributions",description:"Shower thoughts on the LTS Linux distributions.\n",date:"2024-02-07T00:00:00.000Z",formattedDate:"February 7, 2024",tags:[{label:"lts",permalink:"/blog/tags/lts"},{label:"linux distributions",permalink:"/blog/tags/linux-distributions"},{label:"support",permalink:"/blog/tags/support"},{label:"paywall",permalink:"/blog/tags/paywall"}],readingTime:14.515,hasTruncateMarker:!0,authors:[{name:"Matej Focko",email:"me+blog@mfocko.xyz",title:"a.k.a. small Fedora maintainer",url:"https://gitlab.com/mfocko",imageURL:"https://github.com/mfocko.png",key:"mf"}],frontMatter:{title:"LTS distributions",description:"Shower thoughts on the LTS Linux distributions.\n",date:"2024-02-07T00:00:00.000Z",authors:[{key:"mf",title:"a.k.a. small Fedora maintainer"}],tags:["lts","linux distributions","support","paywall"],hide_table_of_contents:!1},unlisted:!1,nextItem:{title:"Mixed feelings on Rust",permalink:"/blog/2024/01/28/rust-opinion"}},h={authorsImageUrls:[void 0]},l=[{value:"Point of linux distributions",id:"point-of-linux-distributions",level:2},{value:"Pain of packaging",id:"pain-of-packaging",level:2},{value:"Packaging whole ecosystems",id:"packaging-whole-ecosystems",level:3},{value:"Paid distributions",id:"paid-distributions",level:2},{value:"Repository structure",id:"repository-structure",level:2},{value:"Ubuntu",id:"ubuntu",level:3},{value:"CentOS",id:"centos",level:3},{value:"Ubuntu Pro",id:"ubuntu-pro",level:2},{value:"RHEL ecosystem",id:"rhel-ecosystem",level:2},{value:"Change in the model",id:"change-in-the-model",level:3},{value:"Before the change",id:"before-the-change",level:4},{value:"After the change",id:"after-the-change",level:4},{value:"Open-source and paid support",id:"open-source-and-paid-support",level:2},{value:"Glossary",id:"glossary",level:2}];function d(e){const n={a:"a",admonition:"admonition",blockquote:"blockquote",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",img:"img",li:"li",mermaid:"mermaid",ol:"ol",p:"p",pre:"pre",section:"section",strong:"strong",sup:"sup",ul:"ul",...(0,s.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.p,{children:"Linux distributions are a common choice for running the servers. There's a wide\nvariety of distributions, but on the servers majority is made by only a few."}),"\n",(0,i.jsxs)(n.p,{children:["Some corporations also profit from the support of the \u201cbig\u201d distributions. Let's\ndive into the pros, cons and peculiarities of such ",(0,i.jsx)(n.em,{children:"business"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["This post is inspired/triggered by the following Mastodon post:\n",(0,i.jsx)(n.a,{href:"https://hackers.town/@antijingoist/111864760073049505",children:(0,i.jsx)(n.img,{src:"https://cdn.pawb.social/mastodon-fe/media_attachments/files/111/864/549/106/543/961/original/f4dac207fb93ffa8.png",alt:"Mastodon post about Ubuntu Pro"})})]}),"\n",(0,i.jsx)(n.admonition,{title:"Disclaimer",type:"caution",children:(0,i.jsx)(n.p,{children:"You may take my opinion with a grain of salt, since I'm affiliated with Red Hat,\nbut at the same time I've also seen the other side of the fence, so I know how\nit works from the perspective of the provider/maintainer."})}),"\n",(0,i.jsx)(n.admonition,{type:"tip",children:(0,i.jsxs)(n.p,{children:["If you are not very oriented in the matters of Linux distributions and\nmaintaining of packages, I suggest looking at the ",(0,i.jsx)(n.a,{href:"#glossary",children:"glossary"})," at the\nend to have a better grasp of the terms that are used throughout the post."]})}),"\n",(0,i.jsx)(n.h2,{id:"point-of-linux-distributions",children:"Point of linux distributions"}),"\n",(0,i.jsx)(n.p,{children:"First thing I'd like to point out is the point of the Linux distributions. What\nbenefit do they provide? And why there are so many of them\u2026"}),"\n",(0,i.jsxs)(n.p,{children:["As it has been brought up many times by the ",(0,i.jsx)(n.em,{children:"rms"}),(0,i.jsx)(n.sup,{children:(0,i.jsx)(n.a,{href:"#user-content-fn-1-e115ff",id:"user-content-fnref-1-e115ff","data-footnote-ref":!0,"aria-describedby":"footnote-label",children:"1"})}),", Linux by itself is not\nenough, it's just the kernel that does the underlying work. We need more\nsoftware to utilize the hardware. That's the gap that Linux distributions bridge\nby providing the Linux and much more other software that we need."]}),"\n",(0,i.jsx)(n.p,{children:"Each distribution is unique in its own way. Some prefer different ways of\nhandling the software (like Gentoo that allows you to compile it yourself) and\nothers stable releases of software (like Debian)."}),"\n",(0,i.jsx)(n.p,{children:"In the end it mostly boils down to the packaging. I, as a user, want to do\nsomething like"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"$ sudo dnf5 install firefox\n"})}),"\n",(0,i.jsx)(n.p,{children:"and not bother about anything else. I don't want to open browser to look the\nthing up, download it and then click mindlessly 500\xd7 \u201cNext\u201d. I just want to run\none command and when the maintainers decide it's time to move on, another one to\nupgrade the software to the newer version."}),"\n",(0,i.jsx)(n.p,{children:"Of course, for some use cases you want to minimize the latter. And even make\nsure that it's safe to do it when you need to. You don't want to break your\nproduction deployment just because someone decided it's time to push something\nout."}),"\n",(0,i.jsxs)(n.p,{children:["That's when the ",(0,i.jsx)(n.em,{children:"maintainers"})," come in. They take upon themselves the\nresponsibility of maintaining the packages. If you've ever used the Debian, you\nknow very well how ",(0,i.jsx)(n.em,{children:"old"})," the software is, but that's what you might need for\nyour servers."]}),"\n",(0,i.jsx)(n.h2,{id:"pain-of-packaging",children:"Pain of packaging"}),"\n",(0,i.jsxs)(n.p,{children:["Packaging software ",(0,i.jsx)(n.em,{children:"is not"})," cost-free. You may as well have 80 % of packages\nthat don't need much care and it's rather easy to push them forward, but those\nremaining, which are complicated and raise issues regularly, will make it up and\ntake a lot of time and also pain."]}),"\n",(0,i.jsxs)(n.p,{children:["Libraries are the most common example that might not need much work to be done.\nOn the other hand, Linux kernel itself is a rather complicated machinery that\nis patched ",(0,i.jsx)(n.strong,{children:"a lot"})," and its build process is not simple either."]}),"\n",(0,i.jsxs)(n.p,{children:["Even if you consider just those ",(0,i.jsx)(n.em,{children:"easily-maintainble"})," packages, the process can\nbe tedious, boring and overall time consuming."]}),"\n",(0,i.jsx)(n.admonition,{title:"Shameless RHEL-based ecosystem plug",type:"tip",children:(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.a,{href:"https://packit.dev/",children:"Packit"})," can help tremendously with the ",(0,i.jsx)(n.em,{children:"easily-maintainable"})," packages, since it\n",(0,i.jsx)(n.strong,{children:"can"})," be automated."]})}),"\n",(0,i.jsx)(n.h3,{id:"packaging-whole-ecosystems",children:"Packaging whole ecosystems"}),"\n",(0,i.jsx)(n.p,{children:"Now it's time to talk about whole ecosystems that have some kind of a packaging\nby themselves. Yes, I mean Python (with its continuous stream of different\npackage managers), Rust, Go, etc."}),"\n",(0,i.jsxs)(n.p,{children:["Whole point of packaging is to have some form of ",(0,i.jsx)(n.em,{children:"gating"}),". In other words, you\nwant some kind of ",(0,i.jsx)(n.em,{children:"quality control"})," when pushing changes into the Linux distros."]}),"\n",(0,i.jsx)(n.p,{children:"If you want to package some tool (or even library) from the aforementioned\necosystems, you need to package all of the dependencies to make sure something\ndoesn't get updated in the meantime (and also that you can safely reproduce the\nbuilds, if need be)."}),"\n",(0,i.jsxs)(n.p,{children:["I've tried to package some utilities for EPEL both in Rust and Go. Dependencies\nform a DAG",(0,i.jsx)(n.sup,{children:(0,i.jsx)(n.a,{href:"#user-content-fn-2-e115ff",id:"user-content-fnref-2-e115ff","data-footnote-ref":!0,"aria-describedby":"footnote-label",children:"2"})})," and in case of Rust, it's ",(0,i.jsx)(n.em,{children:"very"})," similar to the way ",(0,i.jsx)(n.code,{children:"npm"})," does\nits packaging."]}),"\n",(0,i.jsx)(n.admonition,{title:"Spoiler alert",type:"danger",children:(0,i.jsxs)(n.p,{children:["You get a lot of dependencies. And since it's a tree of dependencies, there may\nbe ",(0,i.jsx)(n.strong,{children:"a lot"})," of them."]})}),"\n",(0,i.jsxs)(n.p,{children:["I have no clue how do the Rust maintainers operate, but I'm tipping my fedora in\ntheir direction, since it must be a ",(0,i.jsx)(n.em,{children:"pain in the ass"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"paid-distributions",children:"Paid distributions"}),"\n",(0,i.jsx)(n.p,{children:"You can find few Linux distributions that are \u201cpaid\u201d. I'm very well aware of the\nfact I've used quotes around the word, cause it's not that easy and not even\nsame for all of the distributions that involve some kind of a payment."}),"\n",(0,i.jsxs)(n.p,{children:["One of the first non-free distributions I've come into contact was ",(0,i.jsx)(n.em,{children:(0,i.jsx)(n.a,{href:"https://zorin.com/os/pro/",children:"Zorin OS"})}),"\nwhich basically tries to be the best ",(0,i.jsx)(n.em,{children:"transition"})," solution when moving away from\nthe Windows or macOS. If you have a look at the ",(0,i.jsx)(n.em,{children:"perks"})," of its ",(0,i.jsx)(n.em,{children:"Pro"})," version\nthat's paid, you may as well decide they are rather questionable\u2026"]}),"\n",(0,i.jsxs)(n.p,{children:["It's time to move into the ",(0,i.jsx)(n.em,{children:"Ubuntu Pro"}),", ",(0,i.jsx)(n.em,{children:"RHEL"})," and ",(0,i.jsx)(n.em,{children:"SLE"})," territory. What's the\npoint of those? They definitely offer different kind of, let's say,\n",(0,i.jsx)(n.em,{children:"non-free experience"}),"."]}),"\n",(0,i.jsx)(n.p,{children:"With those you are paying mainly for the support and bug/security patches."}),"\n",(0,i.jsx)(n.admonition,{title:"Fun fact",type:"tip",children:(0,i.jsxs)(n.p,{children:["There's no mention of any kind of support on the Zorin page\u2026 Apart from the fact\nthat ",(0,i.jsx)(n.em,{children:"you are supporting"})," the Zorin development."]})}),"\n",(0,i.jsx)(n.h2,{id:"repository-structure",children:"Repository structure"}),"\n",(0,i.jsxs)(n.p,{children:["As I have mentioned above, the three ",(0,i.jsx)(n.em,{children:"services"}),(0,i.jsx)(n.sup,{children:(0,i.jsx)(n.a,{href:"#user-content-fn-3-e115ff",id:"user-content-fnref-3-e115ff","data-footnote-ref":!0,"aria-describedby":"footnote-label",children:"3"})})," I mentioned are providing\nsupport with regards to bugs and security vulnerabilites. Therefore it makes\nsense to have some kind of a process in place when you're pushing changes\n(either updates, patches or ",(0,i.jsx)(n.em,{children:"security"})," patches) to the distribution. And yes,\nthese processes are ",(0,i.jsx)(n.em,{children:"in place"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["If you think about the amount of packages that is present in the community\ndistributions like ",(0,i.jsx)(n.em,{children:"archLinux"})," (14,830 packages) or ",(0,i.jsx)(n.em,{children:"Fedora"})," (74,309 packages),\nit is safe to come to a conclusion that ",(0,i.jsx)(n.em,{children:"there's no way"})," to support all of them."]}),"\n",(0,i.jsx)(n.admonition,{title:"archLinux",type:"tip",children:(0,i.jsxs)(n.p,{children:["It may seem that archLinux contains rather small set of packages, but one of the\n",(0,i.jsx)(n.em,{children:"killer features"})," of archLinux lies in the AUR (archLinux User Repository) where\nyou can find additional ",(0,i.jsx)(n.strong,{children:"93,283"})," packages."]})}),"\n",(0,i.jsxs)(n.p,{children:["That's why the Linux distributions have some structure to their repositories\nthat contain packages. The way you go around this is rather simple, you choose\nsome set of ",(0,i.jsx)(n.em,{children:"critical"})," packages that you guarantee support for (like Linux\nkernel, openSSL, etc.) and maintain those with all the QA processes in place."]}),"\n",(0,i.jsx)(n.admonition,{title:"Unpopular opinion",type:"caution",children:(0,i.jsxs)(n.p,{children:["This is also one of the reasons why I'm quite against packaging anything and\neverything into the Linux distribution. In my opinion it is impossible to\n",(0,i.jsx)(n.strong,{children:"properly"})," maintain ",(0,i.jsx)(n.strong,{children:"huge"})," set of packages and enforce some kind of\n",(0,i.jsx)(n.strong,{children:"quality control"}),"."]})}),"\n",(0,i.jsx)(n.h3,{id:"ubuntu",children:"Ubuntu"}),"\n",(0,i.jsx)(n.p,{children:"Ubuntu has pretty granular structure of their repositories, namely:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"main"})," containing the \u201ccore\u201d of the Ubuntu that is maintained by the Canonical,"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"universe"})," containing literally the \u201cuniverse\u201d, packages that everyone likes,\nbut they're not crucial, this repo is maintained mostly by the community,"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"multiverse"})," containing packages with some license or copyright issues, and"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"restricted"})," containing ",(0,i.jsx)(n.em,{children:"proprietary"})," packages like nvidia drivers and such."]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"By briefly checking my Ubuntu 23.10 installation, here are stats of packages in\ntheir respective repositories:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"main"})," with 6,128 packages,"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"universe"})," with 63,380 packages,"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"multiverse"})," with 997 packages, and finally"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"restricted"})," with 784 packages."]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"As you can see, if we sum them up, they are relatively similar to the Fedora\nnumbers."}),"\n",(0,i.jsx)(n.h3,{id:"centos",children:"CentOS"}),"\n",(0,i.jsx)(n.p,{children:"CentOS on the other hand has a bit simpler structure with BaseOS for the base\nand AppStream for additional packages:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"baseos"})," with 1,058 packages,"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"appstream"})," with 5,646 packages, and"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"extras-common"})," with 42 packages."]}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["Overall they make up the similar number as the Ubuntu's ",(0,i.jsx)(n.code,{children:"main"})," repository. And\nyou can also notice that there are no additional repositories."]}),"\n",(0,i.jsxs)(n.admonition,{type:"tip",children:[(0,i.jsx)(n.p,{children:"There's also a CRB (CodeReady Builder) repository with dev packages like headers\nand such."}),(0,i.jsx)(n.p,{children:"And you can also enable EPEL (Extra Packages for Enterprise Linux) which is\ncommunity-supported and provides another 19,903 packages."})]}),"\n",(0,i.jsx)(n.h2,{id:"ubuntu-pro",children:"Ubuntu Pro"}),"\n",(0,i.jsx)(n.p,{children:"Now it's time to get back to the Ubuntu Pro. There are multiple points that need\nto be taken in account to be either positive or negative about it\u2026"}),"\n",(0,i.jsx)(n.p,{children:"We can start with the way Ubuntu is released and maintained. Ubuntu has regular\n6-month release cycle and biannual LTS release. Releases are normally supported\nfor 9 months with the exception of the LTS releases being supported for 5 years."}),"\n",(0,i.jsxs)(n.p,{children:["If you check out the ",(0,i.jsx)(n.em,{children:(0,i.jsx)(n.a,{href:"https://ubuntu.com/pro/",children:"Ubuntu Pro"})})," website, you can find the following\nstatement:"]}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Ubuntu Pro"})}),"\n",(0,i.jsx)(n.p,{children:"The most comprehensive subscription for open-source software security"}),"\n",(0,i.jsx)(n.p,{children:"30-day trial for enterprises. Always free for personal use."}),"\n"]}),"\n",(0,i.jsx)(n.admonition,{title:"Personal use",type:"tip",children:(0,i.jsxs)(n.p,{children:["Ubuntu Pro for ",(0,i.jsx)(n.em,{children:"personal use"})," consists of 5 installations and in case of the\ncommunity ",(0,i.jsx)(n.em,{children:"ambassadors"})," 50."]})}),"\n",(0,i.jsx)(n.p,{children:"Overall if you try to find what is included in the Ubuntu Pro:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"high and critical patches,"}),"\n",(0,i.jsx)(n.li,{children:"10 years of maintenance, and"}),"\n",(0,i.jsx)(n.li,{children:"(optional) 24/7 enterprise-grade support."}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["If we get back to the screenshot all the way at the beginning of the post:\n",(0,i.jsx)(n.a,{href:"https://hackers.town/@antijingoist/111864760073049505",children:(0,i.jsx)(n.img,{src:"https://cdn.pawb.social/mastodon-fe/media_attachments/files/111/864/549/106/543/961/original/f4dac207fb93ffa8.png",alt:"Mastodon post about Ubuntu Pro"})})]}),"\n",(0,i.jsxs)(n.p,{children:["and try to look up to which repository the packages mentioned in the screenshot\nbelong, we will find out that they belong to ",(0,i.jsx)(n.code,{children:"universe"})," repository which is\nmaintained by the community. Not to mention nature of the packages: multimedia."]}),"\n",(0,i.jsx)(n.p,{children:"You may think about this as a scam, but considering repository consisting of 70k\npackages, it is not an easy task to do. And with LTS releases we're talking\nabout 5+ years of support."}),"\n",(0,i.jsx)(n.admonition,{title:"Fedora",type:"info",children:(0,i.jsx)(n.p,{children:"Try to compare this state to Fedora. It also has a 6-month release cycle, but\nthere are no LTS releases and each release is supported only for a year."})}),"\n",(0,i.jsxs)(n.p,{children:["Common strategy, at this point, is to pull out the ",(0,i.jsx)(n.em,{children:"open-source"}),". Yes, we are\nstill dealing with the open-source, but keep in mind that you're trying to patch\nsome issue in a version that's 5 years old, upstream definitely doesn't care\nanymore",(0,i.jsx)(n.sup,{children:(0,i.jsx)(n.a,{href:"#user-content-fn-4-e115ff",id:"user-content-fnref-4-e115ff","data-footnote-ref":!0,"aria-describedby":"footnote-label",children:"4"})}),", the development didn't stop 5 years ago, it's going on and fixing\nthis issue in a release from 5 years is not the same as fixing it in the current\nrelease. At this point, if you are paying for such support, you are actually\npaying for someone to do ",(0,i.jsx)(n.em,{children:"software archaeology"})," which ",(0,i.jsx)(n.strong,{children:"can be"})," ",(0,i.jsx)(n.em,{children:"non-trivial"}),"\nto do."]}),"\n",(0,i.jsxs)(n.p,{children:["In the case of Ubuntu Pro we're talking about community support and best-effort\nsupport by Canonical for the paying customers. And that makes sense to me,\nrunning LTS distro for 5+ years on a desktop seems like an odd choice, even\nwith the help of ",(0,i.jsx)(n.em,{children:(0,i.jsx)(n.a,{href:"https://podman.io/",children:"podman"})})," and ",(0,i.jsx)(n.em,{children:(0,i.jsx)(n.a,{href:"https://distrobox.it/",children:"distrobox"})})," or ",(0,i.jsx)(n.em,{children:(0,i.jsx)(n.a,{href:"https://containertoolbx.org/",children:"toolbx"})})," that allow us to use\nstable or LTS distro as a base and containerized development environments on top\nof that."]}),"\n",(0,i.jsx)(n.h2,{id:"rhel-ecosystem",children:"RHEL ecosystem"}),"\n",(0,i.jsx)(n.p,{children:"RHEL ecosystem is much more complicated in this matter. However it's very\nsimilar to the way SUSE operates with few exceptions."}),"\n",(0,i.jsx)(n.p,{children:"You can see a flow diagram here:"}),"\n",(0,i.jsx)(n.mermaid,{value:"flowchart LR;\n U[upstream] --\x3e FR[Fedora Rawhide];\n FR --\x3e F[Fedora release];\n F --\x3e C[CentOS Stream];\n C --\x3e R[RHEL];"}),"\n",(0,i.jsx)(n.p,{children:"Key things to take and not to take from the flow diagram:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"getting from one upstream to its respective downstream is not as simple as the\npresence of an arrow and it's not the same process for all of them"}),"\n",(0,i.jsxs)(n.li,{children:["lengths of the arrows are not proportional, specifically:","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Fedora Rawhide is ",(0,i.jsx)(n.em,{children:"supposed to"})," consume updates as soon as possible,"]}),"\n",(0,i.jsxs)(n.li,{children:["depending on the decision of the maintainer they can, but ",(0,i.jsx)(n.em,{children:"don't have to"})," be\nincluded in the currently supported Fedora releases (you can take ",(0,i.jsx)(n.a,{href:"https://src.fedoraproject.org/rpms/emacs/",children:"Emacs"})," as\nan example of such package), but Rawhide eventually becomes the next Fedora\nrelease,"]}),"\n",(0,i.jsx)(n.li,{children:"CentOS Stream gets branched off a specific Fedora release, and then"}),"\n",(0,i.jsxs)(n.li,{children:["ultimately CentOS Stream becomes the next ",(0,i.jsx)(n.strong,{children:"minor"})," release of RHEL."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["this diagram is simplified by ",(0,i.jsx)(n.strong,{children:"a lot"})]}),"\n"]}),"\n",(0,i.jsxs)(n.admonition,{title:"SUSE flow for comparison",type:"tip",children:[(0,i.jsx)(n.p,{children:"I'll also include a SUSE flow, so you can compare:"}),(0,i.jsx)(n.mermaid,{value:"flowchart LR;\n U[upstream] --\x3e T[openSUSE Tumbleweed];\n T --\x3e L[openSUSE Leap];\n L --\x3e S[SUSE Linux Enterprise];\n S --\x3e L;"}),(0,i.jsx)(n.p,{children:"You can notice, as opposed to the RHEL ecosystem, some changes are being\nbackported to the openSUSE Leap."}),(0,i.jsxs)(n.p,{children:["However this is subject to change as there is a new ",(0,i.jsx)(n.a,{href:"https://susealp.io/",children:"ALP"})," project arising which\nis, more than likely, going to replace the Leap."]})]}),"\n",(0,i.jsx)(n.h3,{id:"change-in-the-model",children:"Change in the model"}),"\n",(0,i.jsx)(n.p,{children:"The flow I've shown above is in effect since late \u201820 and early \u201821. I hope you\ncan see that it is quite similar to the way SUSE operates too. Before late \u201820\nthe flow was following:"}),"\n",(0,i.jsx)(n.mermaid,{value:"flowchart LR;\n U[upstream] --\x3e FR[Fedora Rawhide];\n FR --\x3e F[Fedora release];\n F --\x3e R[RHEL];\n R --- C[CentOS];"}),"\n",(0,i.jsx)(n.p,{children:"CentOS was the last distribution in that \u201cchain\u201d. This provides some benefits\nand some negatives."}),"\n",(0,i.jsx)(n.h4,{id:"before-the-change",children:"Before the change"}),"\n",(0,i.jsx)(n.p,{children:"From the point of a developer, unless you have some kind of an early access to\nRHEL, you don't see the changes until they land and are already released. This\nimpairs your ability to test and verify your software before shipping it to your\nclients that use RHEL."}),"\n",(0,i.jsx)(n.p,{children:"From the point of a user, there is one positive, you basically get \u201cfree RHEL\u201d\nwithout the support. This also allowed you to report bugs against the RHEL,\nsince they were 1:1 distros (minus the branding and support). So you'd\ntechnically get RHEL free of charge."}),"\n",(0,i.jsx)(n.p,{children:"Benefit of such project, except for the cost, is questionable. The main issue,\nwhich actually became even more apparent after changing the flow, is someone\nelse repackaging your own product and selling it again."}),"\n",(0,i.jsx)(n.h4,{id:"after-the-change",children:"After the change"}),"\n",(0,i.jsxs)(n.p,{children:["First of all, the current flow counters the issue mentioned above. You can test\nyour projects against the ",(0,i.jsx)(n.em,{children:"next minor RHEL release"}),". CentOS Stream is free, so\nyou can freely incorporate it into your CI pipelines."]}),"\n",(0,i.jsxs)(n.admonition,{title:"Shameless plug pt. 2",type:"tip",children:[(0,i.jsxs)(n.p,{children:["Again, ",(0,i.jsx)(n.a,{href:"https://packit.dev/",children:"Packit"})," can help you on upstream to verify that you're not breaking your\nRPM builds and on top of that you can also use ",(0,i.jsx)(n.a,{href:"https://docs.testing-farm.io/Testing%20Farm/0.1/index.html",children:"Testing Farm"})," to run tests on a\nspecific Fedora or CentOS Stream releases."]}),(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsx)(n.p,{children:"Green tests may not be green everywhere and catching such issues as soon as\npossible costs much less than catching them further down the chain."}),"\n"]})]}),"\n",(0,i.jsxs)(n.p,{children:["There are many people thinking that RHEL has become closed-source. It is not.\nThe development happens ",(0,i.jsx)(n.em,{children:"out in the open"}),", it's more open that it was before.\nHowever with the cost of not getting the exact same thing for free. You can get\nthe next minor RHEL, not the same that's normally paid for. ",(0,i.jsx)(n.a,{href:"https://packit.dev/",children:"Packit"})," is an\nexample of a service that is deployed on the CentOS 9 Stream and even used to be\ndeployed on Fedora, but the regular 6-month release cycle caused some minor\nissues here and there."]}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.em,{children:"Production-ready"})," is something that heavily depends on the context\u2026"]}),"\n",(0,i.jsx)(n.admonition,{title:"Free \u201cclones\u201d",type:"tip",children:(0,i.jsxs)(n.p,{children:["After this change so-called ",(0,i.jsx)(n.em,{children:"free \u201cclones\u201d"})," emerged. I have to admit that in\ncase of ",(0,i.jsx)(n.em,{children:(0,i.jsx)(n.a,{href:"https://almalinux.org/",children:"AlmaLinux"})})," I can see some benefits e.g., pushing for live images and\nsupport of various desktop environments, Raspberry Pi support or even WSL images\nbeing present in the M$ Store and easy to install."]})}),"\n",(0,i.jsx)(n.h2,{id:"open-source-and-paid-support",children:"Open-source and paid support"}),"\n",(0,i.jsxs)(n.p,{children:["Overall I don't think that paying for the support of 5 years old ",(0,i.jsx)(n.em,{children:"non-critical"}),"\npackages is going against the open-source. It is a non-trivial work that, in\nmajority of cases, cannot be included in the upstream, therefore the benefit is\nreapt only by the paying customers. I have to admit that in the case of the\nUbuntu Pro it may seem a bit weird (hiding patches behind the paywall). However\nwe're still talking about rather big set of packages that will affect a minority\nof server workloads, if any."]}),"\n",(0,i.jsx)(n.h2,{id:"glossary",children:"Glossary"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.em,{children:"rolling release"})," - continuously released without \u201csignificant milestones\u201d"]}),"\n",(0,i.jsxs)(n.admonition,{type:"tip",children:[(0,i.jsx)(n.p,{children:"As an example of rolling distribution you can take archLinux, openSUSE\nTumbleweed, Fedora Rawhide, or even CentOS 9 Stream."}),(0,i.jsxs)(n.p,{children:["As en example of ",(0,i.jsx)(n.strong,{children:"not"})," rolling distribution you can take Ubuntu, openSUSE\nLeap or Fedora."]})]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.em,{children:"bleeding edge"})," - contains the latest versions as they are released on the\nupstream"]}),"\n",(0,i.jsx)(n.admonition,{type:"tip",children:(0,i.jsxs)(n.p,{children:["As an example you can take archLinux, openSUSE Tumbleweed or Fedora Rawhide.\nYou can also notice how common it is to combine ",(0,i.jsx)(n.em,{children:"rolling release"})," with\n",(0,i.jsx)(n.em,{children:"bleeding edge"}),"."]})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.em,{children:"upstream"})," & ",(0,i.jsx)(n.em,{children:"downstream"})]}),"\n",(0,i.jsx)(n.p,{children:"You're most likely to meet these terms in the meaning of upstream being the\nproject itself and downstream being the packaging of said project in some\ndistribution."}),"\n",(0,i.jsxs)(n.p,{children:["However this can also apply to distributions like ",(0,i.jsx)(n.em,{children:"openSUSE Tumbleweed"})," with\n",(0,i.jsx)(n.em,{children:"openSUSE Leap"}),", ",(0,i.jsx)(n.em,{children:"Fedora"})," with ",(0,i.jsx)(n.em,{children:"CentOS Stream"}),", or even ",(0,i.jsx)(n.em,{children:"CentOS Stream"})," with\n",(0,i.jsx)(n.em,{children:"RHEL"}),". This basically means that the packages/software is being released into\nthe upstream (Tumbleweed, Fedora, or even CentOS) and then after being tested\nis taken further down into their respective downstreams (Leap, CentOS, RHEL)."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.section,{"data-footnotes":!0,className:"footnotes",children:[(0,i.jsx)(n.h2,{className:"sr-only",id:"footnote-label",children:"Footnotes"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{id:"user-content-fn-1-e115ff",children:["\n",(0,i.jsxs)(n.p,{children:["Richard Stallman ",(0,i.jsx)(n.a,{href:"#user-content-fnref-1-e115ff","data-footnote-backref":"","aria-label":"Back to reference 1",className:"data-footnote-backref",children:"\u21a9"})]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{id:"user-content-fn-2-e115ff",children:["\n",(0,i.jsxs)(n.p,{children:["directed acyclic graph ",(0,i.jsx)(n.a,{href:"#user-content-fnref-2-e115ff","data-footnote-backref":"","aria-label":"Back to reference 2",className:"data-footnote-backref",children:"\u21a9"})]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{id:"user-content-fn-3-e115ff",children:["\n",(0,i.jsxs)(n.p,{children:["Ubuntu Pro is technically a service whereas the RHEL and SLE are distros\nwith the support included. ",(0,i.jsx)(n.a,{href:"#user-content-fnref-3-e115ff","data-footnote-backref":"","aria-label":"Back to reference 3",className:"data-footnote-backref",children:"\u21a9"})]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{id:"user-content-fn-4-e115ff",children:["\n",(0,i.jsxs)(n.p,{children:["There are upstream projects that keep LTS branches, such as Linux kernel,\nbut even in the case of the kernel itself, they're planning on ending it,\nsince the cost outweighs the benefits at this point. ",(0,i.jsx)(n.a,{href:"#user-content-fnref-4-e115ff","data-footnote-backref":"","aria-label":"Back to reference 4",className:"data-footnote-backref",children:"\u21a9"})]}),"\n"]}),"\n"]}),"\n"]})]})}function c(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},11151:(e,n,t)=>{t.d(n,{Z:()=>r,a:()=>a});var i=t(67294);const s={},o=i.createContext(s);function a(e){const n=i.useContext(o);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),i.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d309eaf6.efdd6eb7.js b/assets/js/d309eaf6.efdd6eb7.js new file mode 100644 index 0000000..f30f0e9 --- /dev/null +++ b/assets/js/d309eaf6.efdd6eb7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[6995],{54506:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>h,contentTitle:()=>a,default:()=>d,frontMatter:()=>o,metadata:()=>r,toc:()=>l});var i=t(85893),s=t(11151);const o={title:"LTS distributions",description:"Shower thoughts on the LTS Linux distributions.\n",date:new Date("2024-02-07T00:00:00.000Z"),authors:[{key:"mf",title:"a.k.a. small Fedora maintainer"}],tags:["lts","linux distributions","support","paywall"],hide_table_of_contents:!1},a=void 0,r={permalink:"/blog/2024/02/07/lts-distros",editUrl:"https://github.com/mfocko/blog/tree/main/blog/2024-02-07-lts-distros.md",source:"@site/blog/2024-02-07-lts-distros.md",title:"LTS distributions",description:"Shower thoughts on the LTS Linux distributions.\n",date:"2024-02-07T00:00:00.000Z",formattedDate:"February 7, 2024",tags:[{label:"lts",permalink:"/blog/tags/lts"},{label:"linux distributions",permalink:"/blog/tags/linux-distributions"},{label:"support",permalink:"/blog/tags/support"},{label:"paywall",permalink:"/blog/tags/paywall"}],readingTime:14.515,hasTruncateMarker:!0,authors:[{name:"Matej Focko",email:"me+blog@mfocko.xyz",title:"a.k.a. small Fedora maintainer",url:"https://gitlab.com/mfocko",imageURL:"https://github.com/mfocko.png",key:"mf"}],frontMatter:{title:"LTS distributions",description:"Shower thoughts on the LTS Linux distributions.\n",date:"2024-02-07T00:00:00.000Z",authors:[{key:"mf",title:"a.k.a. small Fedora maintainer"}],tags:["lts","linux distributions","support","paywall"],hide_table_of_contents:!1},unlisted:!1,nextItem:{title:"Mixed feelings on Rust",permalink:"/blog/2024/01/28/rust-opinion"}},h={authorsImageUrls:[void 0]},l=[{value:"Point of linux distributions",id:"point-of-linux-distributions",level:2},{value:"Pain of packaging",id:"pain-of-packaging",level:2},{value:"Packaging whole ecosystems",id:"packaging-whole-ecosystems",level:3},{value:"Paid distributions",id:"paid-distributions",level:2},{value:"Repository structure",id:"repository-structure",level:2},{value:"Ubuntu",id:"ubuntu",level:3},{value:"CentOS",id:"centos",level:3},{value:"Ubuntu Pro",id:"ubuntu-pro",level:2},{value:"RHEL ecosystem",id:"rhel-ecosystem",level:2},{value:"Change in the model",id:"change-in-the-model",level:3},{value:"Before the change",id:"before-the-change",level:4},{value:"After the change",id:"after-the-change",level:4},{value:"Open-source and paid support",id:"open-source-and-paid-support",level:2},{value:"Glossary",id:"glossary",level:2}];function c(e){const n={a:"a",admonition:"admonition",blockquote:"blockquote",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",img:"img",li:"li",mermaid:"mermaid",ol:"ol",p:"p",pre:"pre",section:"section",strong:"strong",sup:"sup",ul:"ul",...(0,s.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.p,{children:"Linux distributions are a common choice for running the servers. There's a wide\nvariety of distributions, but on the servers majority is made by only a few."}),"\n",(0,i.jsxs)(n.p,{children:["Some corporations also profit from the support of the \u201cbig\u201d distributions. Let's\ndive into the pros, cons and peculiarities of such ",(0,i.jsx)(n.em,{children:"business"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["This post is inspired/triggered by the following Mastodon post:\n",(0,i.jsx)(n.a,{href:"https://hackers.town/@antijingoist/111864760073049505",children:(0,i.jsx)(n.img,{src:"https://i.imgur.com/mh5RAlV.png",alt:"Mastodon post about Ubuntu Pro"})})]}),"\n",(0,i.jsx)(n.admonition,{title:"Disclaimer",type:"caution",children:(0,i.jsx)(n.p,{children:"You may take my opinion with a grain of salt, since I'm affiliated with Red Hat,\nbut at the same time I've also seen the other side of the fence, so I know how\nit works from the perspective of the provider/maintainer."})}),"\n",(0,i.jsx)(n.admonition,{type:"tip",children:(0,i.jsxs)(n.p,{children:["If you are not very oriented in the matters of Linux distributions and\nmaintaining of packages, I suggest looking at the ",(0,i.jsx)(n.a,{href:"#glossary",children:"glossary"})," at the\nend to have a better grasp of the terms that are used throughout the post."]})}),"\n",(0,i.jsx)(n.h2,{id:"point-of-linux-distributions",children:"Point of linux distributions"}),"\n",(0,i.jsx)(n.p,{children:"First thing I'd like to point out is the point of the Linux distributions. What\nbenefit do they provide? And why there are so many of them\u2026"}),"\n",(0,i.jsxs)(n.p,{children:["As it has been brought up many times by the ",(0,i.jsx)(n.em,{children:"rms"}),(0,i.jsx)(n.sup,{children:(0,i.jsx)(n.a,{href:"#user-content-fn-1-e115ff",id:"user-content-fnref-1-e115ff","data-footnote-ref":!0,"aria-describedby":"footnote-label",children:"1"})}),", Linux by itself is not\nenough, it's just the kernel that does the underlying work. We need more\nsoftware to utilize the hardware. That's the gap that Linux distributions bridge\nby providing the Linux and much more other software that we need."]}),"\n",(0,i.jsx)(n.p,{children:"Each distribution is unique in its own way. Some prefer different ways of\nhandling the software (like Gentoo that allows you to compile it yourself) and\nothers stable releases of software (like Debian)."}),"\n",(0,i.jsx)(n.p,{children:"In the end it mostly boils down to the packaging. I, as a user, want to do\nsomething like"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"$ sudo dnf5 install firefox\n"})}),"\n",(0,i.jsx)(n.p,{children:"and not bother about anything else. I don't want to open browser to look the\nthing up, download it and then click mindlessly 500\xd7 \u201cNext\u201d. I just want to run\none command and when the maintainers decide it's time to move on, another one to\nupgrade the software to the newer version."}),"\n",(0,i.jsx)(n.p,{children:"Of course, for some use cases you want to minimize the latter. And even make\nsure that it's safe to do it when you need to. You don't want to break your\nproduction deployment just because someone decided it's time to push something\nout."}),"\n",(0,i.jsxs)(n.p,{children:["That's when the ",(0,i.jsx)(n.em,{children:"maintainers"})," come in. They take upon themselves the\nresponsibility of maintaining the packages. If you've ever used the Debian, you\nknow very well how ",(0,i.jsx)(n.em,{children:"old"})," the software is, but that's what you might need for\nyour servers."]}),"\n",(0,i.jsx)(n.h2,{id:"pain-of-packaging",children:"Pain of packaging"}),"\n",(0,i.jsxs)(n.p,{children:["Packaging software ",(0,i.jsx)(n.em,{children:"is not"})," cost-free. You may as well have 80 % of packages\nthat don't need much care and it's rather easy to push them forward, but those\nremaining, which are complicated and raise issues regularly, will make it up and\ntake a lot of time and also pain."]}),"\n",(0,i.jsxs)(n.p,{children:["Libraries are the most common example that might not need much work to be done.\nOn the other hand, Linux kernel itself is a rather complicated machinery that\nis patched ",(0,i.jsx)(n.strong,{children:"a lot"})," and its build process is not simple either."]}),"\n",(0,i.jsxs)(n.p,{children:["Even if you consider just those ",(0,i.jsx)(n.em,{children:"easily-maintainble"})," packages, the process can\nbe tedious, boring and overall time consuming."]}),"\n",(0,i.jsx)(n.admonition,{title:"Shameless RHEL-based ecosystem plug",type:"tip",children:(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.a,{href:"https://packit.dev/",children:"Packit"})," can help tremendously with the ",(0,i.jsx)(n.em,{children:"easily-maintainable"})," packages, since it\n",(0,i.jsx)(n.strong,{children:"can"})," be automated."]})}),"\n",(0,i.jsx)(n.h3,{id:"packaging-whole-ecosystems",children:"Packaging whole ecosystems"}),"\n",(0,i.jsx)(n.p,{children:"Now it's time to talk about whole ecosystems that have some kind of a packaging\nby themselves. Yes, I mean Python (with its continuous stream of different\npackage managers), Rust, Go, etc."}),"\n",(0,i.jsxs)(n.p,{children:["Whole point of packaging is to have some form of ",(0,i.jsx)(n.em,{children:"gating"}),". In other words, you\nwant some kind of ",(0,i.jsx)(n.em,{children:"quality control"})," when pushing changes into the Linux distros."]}),"\n",(0,i.jsx)(n.p,{children:"If you want to package some tool (or even library) from the aforementioned\necosystems, you need to package all of the dependencies to make sure something\ndoesn't get updated in the meantime (and also that you can safely reproduce the\nbuilds, if need be)."}),"\n",(0,i.jsxs)(n.p,{children:["I've tried to package some utilities for EPEL both in Rust and Go. Dependencies\nform a DAG",(0,i.jsx)(n.sup,{children:(0,i.jsx)(n.a,{href:"#user-content-fn-2-e115ff",id:"user-content-fnref-2-e115ff","data-footnote-ref":!0,"aria-describedby":"footnote-label",children:"2"})})," and in case of Rust, it's ",(0,i.jsx)(n.em,{children:"very"})," similar to the way ",(0,i.jsx)(n.code,{children:"npm"})," does\nits packaging."]}),"\n",(0,i.jsx)(n.admonition,{title:"Spoiler alert",type:"danger",children:(0,i.jsxs)(n.p,{children:["You get a lot of dependencies. And since it's a tree of dependencies, there may\nbe ",(0,i.jsx)(n.strong,{children:"a lot"})," of them."]})}),"\n",(0,i.jsxs)(n.p,{children:["I have no clue how do the Rust maintainers operate, but I'm tipping my fedora in\ntheir direction, since it must be a ",(0,i.jsx)(n.em,{children:"pain in the ass"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"paid-distributions",children:"Paid distributions"}),"\n",(0,i.jsx)(n.p,{children:"You can find few Linux distributions that are \u201cpaid\u201d. I'm very well aware of the\nfact I've used quotes around the word, cause it's not that easy and not even\nsame for all of the distributions that involve some kind of a payment."}),"\n",(0,i.jsxs)(n.p,{children:["One of the first non-free distributions I've come into contact was ",(0,i.jsx)(n.em,{children:(0,i.jsx)(n.a,{href:"https://zorin.com/os/pro/",children:"Zorin OS"})}),"\nwhich basically tries to be the best ",(0,i.jsx)(n.em,{children:"transition"})," solution when moving away from\nthe Windows or macOS. If you have a look at the ",(0,i.jsx)(n.em,{children:"perks"})," of its ",(0,i.jsx)(n.em,{children:"Pro"})," version\nthat's paid, you may as well decide they are rather questionable\u2026"]}),"\n",(0,i.jsxs)(n.p,{children:["It's time to move into the ",(0,i.jsx)(n.em,{children:"Ubuntu Pro"}),", ",(0,i.jsx)(n.em,{children:"RHEL"})," and ",(0,i.jsx)(n.em,{children:"SLE"})," territory. What's the\npoint of those? They definitely offer different kind of, let's say,\n",(0,i.jsx)(n.em,{children:"non-free experience"}),"."]}),"\n",(0,i.jsx)(n.p,{children:"With those you are paying mainly for the support and bug/security patches."}),"\n",(0,i.jsx)(n.admonition,{title:"Fun fact",type:"tip",children:(0,i.jsxs)(n.p,{children:["There's no mention of any kind of support on the Zorin page\u2026 Apart from the fact\nthat ",(0,i.jsx)(n.em,{children:"you are supporting"})," the Zorin development."]})}),"\n",(0,i.jsx)(n.h2,{id:"repository-structure",children:"Repository structure"}),"\n",(0,i.jsxs)(n.p,{children:["As I have mentioned above, the three ",(0,i.jsx)(n.em,{children:"services"}),(0,i.jsx)(n.sup,{children:(0,i.jsx)(n.a,{href:"#user-content-fn-3-e115ff",id:"user-content-fnref-3-e115ff","data-footnote-ref":!0,"aria-describedby":"footnote-label",children:"3"})})," I mentioned are providing\nsupport with regards to bugs and security vulnerabilites. Therefore it makes\nsense to have some kind of a process in place when you're pushing changes\n(either updates, patches or ",(0,i.jsx)(n.em,{children:"security"})," patches) to the distribution. And yes,\nthese processes are ",(0,i.jsx)(n.em,{children:"in place"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["If you think about the amount of packages that is present in the community\ndistributions like ",(0,i.jsx)(n.em,{children:"archLinux"})," (14,830 packages) or ",(0,i.jsx)(n.em,{children:"Fedora"})," (74,309 packages),\nit is safe to come to a conclusion that ",(0,i.jsx)(n.em,{children:"there's no way"})," to support all of them."]}),"\n",(0,i.jsx)(n.admonition,{title:"archLinux",type:"tip",children:(0,i.jsxs)(n.p,{children:["It may seem that archLinux contains rather small set of packages, but one of the\n",(0,i.jsx)(n.em,{children:"killer features"})," of archLinux lies in the AUR (archLinux User Repository) where\nyou can find additional ",(0,i.jsx)(n.strong,{children:"93,283"})," packages."]})}),"\n",(0,i.jsxs)(n.p,{children:["That's why the Linux distributions have some structure to their repositories\nthat contain packages. The way you go around this is rather simple, you choose\nsome set of ",(0,i.jsx)(n.em,{children:"critical"})," packages that you guarantee support for (like Linux\nkernel, openSSL, etc.) and maintain those with all the QA processes in place."]}),"\n",(0,i.jsx)(n.admonition,{title:"Unpopular opinion",type:"caution",children:(0,i.jsxs)(n.p,{children:["This is also one of the reasons why I'm quite against packaging anything and\neverything into the Linux distribution. In my opinion it is impossible to\n",(0,i.jsx)(n.strong,{children:"properly"})," maintain ",(0,i.jsx)(n.strong,{children:"huge"})," set of packages and enforce some kind of\n",(0,i.jsx)(n.strong,{children:"quality control"}),"."]})}),"\n",(0,i.jsx)(n.h3,{id:"ubuntu",children:"Ubuntu"}),"\n",(0,i.jsx)(n.p,{children:"Ubuntu has pretty granular structure of their repositories, namely:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"main"})," containing the \u201ccore\u201d of the Ubuntu that is maintained by the Canonical,"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"universe"})," containing literally the \u201cuniverse\u201d, packages that everyone likes,\nbut they're not crucial, this repo is maintained mostly by the community,"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"multiverse"})," containing packages with some license or copyright issues, and"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"restricted"})," containing ",(0,i.jsx)(n.em,{children:"proprietary"})," packages like nvidia drivers and such."]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"By briefly checking my Ubuntu 23.10 installation, here are stats of packages in\ntheir respective repositories:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"main"})," with 6,128 packages,"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"universe"})," with 63,380 packages,"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"multiverse"})," with 997 packages, and finally"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"restricted"})," with 784 packages."]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"As you can see, if we sum them up, they are relatively similar to the Fedora\nnumbers."}),"\n",(0,i.jsx)(n.h3,{id:"centos",children:"CentOS"}),"\n",(0,i.jsx)(n.p,{children:"CentOS on the other hand has a bit simpler structure with BaseOS for the base\nand AppStream for additional packages:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"baseos"})," with 1,058 packages,"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"appstream"})," with 5,646 packages, and"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"extras-common"})," with 42 packages."]}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["Overall they make up the similar number as the Ubuntu's ",(0,i.jsx)(n.code,{children:"main"})," repository. And\nyou can also notice that there are no additional repositories."]}),"\n",(0,i.jsxs)(n.admonition,{type:"tip",children:[(0,i.jsx)(n.p,{children:"There's also a CRB (CodeReady Builder) repository with dev packages like headers\nand such."}),(0,i.jsx)(n.p,{children:"And you can also enable EPEL (Extra Packages for Enterprise Linux) which is\ncommunity-supported and provides another 19,903 packages."})]}),"\n",(0,i.jsx)(n.h2,{id:"ubuntu-pro",children:"Ubuntu Pro"}),"\n",(0,i.jsx)(n.p,{children:"Now it's time to get back to the Ubuntu Pro. There are multiple points that need\nto be taken in account to be either positive or negative about it\u2026"}),"\n",(0,i.jsx)(n.p,{children:"We can start with the way Ubuntu is released and maintained. Ubuntu has regular\n6-month release cycle and biannual LTS release. Releases are normally supported\nfor 9 months with the exception of the LTS releases being supported for 5 years."}),"\n",(0,i.jsxs)(n.p,{children:["If you check out the ",(0,i.jsx)(n.em,{children:(0,i.jsx)(n.a,{href:"https://ubuntu.com/pro/",children:"Ubuntu Pro"})})," website, you can find the following\nstatement:"]}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Ubuntu Pro"})}),"\n",(0,i.jsx)(n.p,{children:"The most comprehensive subscription for open-source software security"}),"\n",(0,i.jsx)(n.p,{children:"30-day trial for enterprises. Always free for personal use."}),"\n"]}),"\n",(0,i.jsx)(n.admonition,{title:"Personal use",type:"tip",children:(0,i.jsxs)(n.p,{children:["Ubuntu Pro for ",(0,i.jsx)(n.em,{children:"personal use"})," consists of 5 installations and in case of the\ncommunity ",(0,i.jsx)(n.em,{children:"ambassadors"})," 50."]})}),"\n",(0,i.jsx)(n.p,{children:"Overall if you try to find what is included in the Ubuntu Pro:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"high and critical patches,"}),"\n",(0,i.jsx)(n.li,{children:"10 years of maintenance, and"}),"\n",(0,i.jsx)(n.li,{children:"(optional) 24/7 enterprise-grade support."}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["If we get back to the screenshot all the way at the beginning of the post:\n",(0,i.jsx)(n.a,{href:"https://hackers.town/@antijingoist/111864760073049505",children:(0,i.jsx)(n.img,{src:"https://i.imgur.com/mh5RAlV.png",alt:"Mastodon post about Ubuntu Pro"})})]}),"\n",(0,i.jsxs)(n.p,{children:["and try to look up to which repository the packages mentioned in the screenshot\nbelong, we will find out that they belong to ",(0,i.jsx)(n.code,{children:"universe"})," repository which is\nmaintained by the community. Not to mention nature of the packages: multimedia."]}),"\n",(0,i.jsx)(n.p,{children:"You may think about this as a scam, but considering repository consisting of 70k\npackages, it is not an easy task to do. And with LTS releases we're talking\nabout 5+ years of support."}),"\n",(0,i.jsx)(n.admonition,{title:"Fedora",type:"info",children:(0,i.jsx)(n.p,{children:"Try to compare this state to Fedora. It also has a 6-month release cycle, but\nthere are no LTS releases and each release is supported only for a year."})}),"\n",(0,i.jsxs)(n.p,{children:["Common strategy, at this point, is to pull out the ",(0,i.jsx)(n.em,{children:"open-source"}),". Yes, we are\nstill dealing with the open-source, but keep in mind that you're trying to patch\nsome issue in a version that's 5 years old, upstream definitely doesn't care\nanymore",(0,i.jsx)(n.sup,{children:(0,i.jsx)(n.a,{href:"#user-content-fn-4-e115ff",id:"user-content-fnref-4-e115ff","data-footnote-ref":!0,"aria-describedby":"footnote-label",children:"4"})}),", the development didn't stop 5 years ago, it's going on and fixing\nthis issue in a release from 5 years is not the same as fixing it in the current\nrelease. At this point, if you are paying for such support, you are actually\npaying for someone to do ",(0,i.jsx)(n.em,{children:"software archaeology"})," which ",(0,i.jsx)(n.strong,{children:"can be"})," ",(0,i.jsx)(n.em,{children:"non-trivial"}),"\nto do."]}),"\n",(0,i.jsxs)(n.p,{children:["In the case of Ubuntu Pro we're talking about community support and best-effort\nsupport by Canonical for the paying customers. And that makes sense to me,\nrunning LTS distro for 5+ years on a desktop seems like an odd choice, even\nwith the help of ",(0,i.jsx)(n.em,{children:(0,i.jsx)(n.a,{href:"https://podman.io/",children:"podman"})})," and ",(0,i.jsx)(n.em,{children:(0,i.jsx)(n.a,{href:"https://distrobox.it/",children:"distrobox"})})," or ",(0,i.jsx)(n.em,{children:(0,i.jsx)(n.a,{href:"https://containertoolbx.org/",children:"toolbx"})})," that allow us to use\nstable or LTS distro as a base and containerized development environments on top\nof that."]}),"\n",(0,i.jsx)(n.h2,{id:"rhel-ecosystem",children:"RHEL ecosystem"}),"\n",(0,i.jsx)(n.p,{children:"RHEL ecosystem is much more complicated in this matter. However it's very\nsimilar to the way SUSE operates with few exceptions."}),"\n",(0,i.jsx)(n.p,{children:"You can see a flow diagram here:"}),"\n",(0,i.jsx)(n.mermaid,{value:"flowchart LR;\n U[upstream] --\x3e FR[Fedora Rawhide];\n FR --\x3e F[Fedora release];\n F --\x3e C[CentOS Stream];\n C --\x3e R[RHEL];"}),"\n",(0,i.jsx)(n.p,{children:"Key things to take and not to take from the flow diagram:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"getting from one upstream to its respective downstream is not as simple as the\npresence of an arrow and it's not the same process for all of them"}),"\n",(0,i.jsxs)(n.li,{children:["lengths of the arrows are not proportional, specifically:","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Fedora Rawhide is ",(0,i.jsx)(n.em,{children:"supposed to"})," consume updates as soon as possible,"]}),"\n",(0,i.jsxs)(n.li,{children:["depending on the decision of the maintainer they can, but ",(0,i.jsx)(n.em,{children:"don't have to"})," be\nincluded in the currently supported Fedora releases (you can take ",(0,i.jsx)(n.a,{href:"https://src.fedoraproject.org/rpms/emacs/",children:"Emacs"})," as\nan example of such package), but Rawhide eventually becomes the next Fedora\nrelease,"]}),"\n",(0,i.jsx)(n.li,{children:"CentOS Stream gets branched off a specific Fedora release, and then"}),"\n",(0,i.jsxs)(n.li,{children:["ultimately CentOS Stream becomes the next ",(0,i.jsx)(n.strong,{children:"minor"})," release of RHEL."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["this diagram is simplified by ",(0,i.jsx)(n.strong,{children:"a lot"})]}),"\n"]}),"\n",(0,i.jsxs)(n.admonition,{title:"SUSE flow for comparison",type:"tip",children:[(0,i.jsx)(n.p,{children:"I'll also include a SUSE flow, so you can compare:"}),(0,i.jsx)(n.mermaid,{value:"flowchart LR;\n U[upstream] --\x3e T[openSUSE Tumbleweed];\n T --\x3e L[openSUSE Leap];\n L --\x3e S[SUSE Linux Enterprise];\n S --\x3e L;"}),(0,i.jsx)(n.p,{children:"You can notice, as opposed to the RHEL ecosystem, some changes are being\nbackported to the openSUSE Leap."}),(0,i.jsxs)(n.p,{children:["However this is subject to change as there is a new ",(0,i.jsx)(n.a,{href:"https://susealp.io/",children:"ALP"})," project arising which\nis, more than likely, going to replace the Leap."]})]}),"\n",(0,i.jsx)(n.h3,{id:"change-in-the-model",children:"Change in the model"}),"\n",(0,i.jsx)(n.p,{children:"The flow I've shown above is in effect since late \u201820 and early \u201821. I hope you\ncan see that it is quite similar to the way SUSE operates too. Before late \u201820\nthe flow was following:"}),"\n",(0,i.jsx)(n.mermaid,{value:"flowchart LR;\n U[upstream] --\x3e FR[Fedora Rawhide];\n FR --\x3e F[Fedora release];\n F --\x3e R[RHEL];\n R --- C[CentOS];"}),"\n",(0,i.jsx)(n.p,{children:"CentOS was the last distribution in that \u201cchain\u201d. This provides some benefits\nand some negatives."}),"\n",(0,i.jsx)(n.h4,{id:"before-the-change",children:"Before the change"}),"\n",(0,i.jsx)(n.p,{children:"From the point of a developer, unless you have some kind of an early access to\nRHEL, you don't see the changes until they land and are already released. This\nimpairs your ability to test and verify your software before shipping it to your\nclients that use RHEL."}),"\n",(0,i.jsx)(n.p,{children:"From the point of a user, there is one positive, you basically get \u201cfree RHEL\u201d\nwithout the support. This also allowed you to report bugs against the RHEL,\nsince they were 1:1 distros (minus the branding and support). So you'd\ntechnically get RHEL free of charge."}),"\n",(0,i.jsx)(n.p,{children:"Benefit of such project, except for the cost, is questionable. The main issue,\nwhich actually became even more apparent after changing the flow, is someone\nelse repackaging your own product and selling it again."}),"\n",(0,i.jsx)(n.h4,{id:"after-the-change",children:"After the change"}),"\n",(0,i.jsxs)(n.p,{children:["First of all, the current flow counters the issue mentioned above. You can test\nyour projects against the ",(0,i.jsx)(n.em,{children:"next minor RHEL release"}),". CentOS Stream is free, so\nyou can freely incorporate it into your CI pipelines."]}),"\n",(0,i.jsxs)(n.admonition,{title:"Shameless plug pt. 2",type:"tip",children:[(0,i.jsxs)(n.p,{children:["Again, ",(0,i.jsx)(n.a,{href:"https://packit.dev/",children:"Packit"})," can help you on upstream to verify that you're not breaking your\nRPM builds and on top of that you can also use ",(0,i.jsx)(n.a,{href:"https://docs.testing-farm.io/Testing%20Farm/0.1/index.html",children:"Testing Farm"})," to run tests on a\nspecific Fedora or CentOS Stream releases."]}),(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsx)(n.p,{children:"Green tests may not be green everywhere and catching such issues as soon as\npossible costs much less than catching them further down the chain."}),"\n"]})]}),"\n",(0,i.jsxs)(n.p,{children:["There are many people thinking that RHEL has become closed-source. It is not.\nThe development happens ",(0,i.jsx)(n.em,{children:"out in the open"}),", it's more open that it was before.\nHowever with the cost of not getting the exact same thing for free. You can get\nthe next minor RHEL, not the same that's normally paid for. ",(0,i.jsx)(n.a,{href:"https://packit.dev/",children:"Packit"})," is an\nexample of a service that is deployed on the CentOS 9 Stream and even used to be\ndeployed on Fedora, but the regular 6-month release cycle caused some minor\nissues here and there."]}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.em,{children:"Production-ready"})," is something that heavily depends on the context\u2026"]}),"\n",(0,i.jsx)(n.admonition,{title:"Free \u201cclones\u201d",type:"tip",children:(0,i.jsxs)(n.p,{children:["After this change so-called ",(0,i.jsx)(n.em,{children:"free \u201cclones\u201d"})," emerged. I have to admit that in\ncase of ",(0,i.jsx)(n.em,{children:(0,i.jsx)(n.a,{href:"https://almalinux.org/",children:"AlmaLinux"})})," I can see some benefits e.g., pushing for live images and\nsupport of various desktop environments, Raspberry Pi support or even WSL images\nbeing present in the M$ Store and easy to install."]})}),"\n",(0,i.jsx)(n.h2,{id:"open-source-and-paid-support",children:"Open-source and paid support"}),"\n",(0,i.jsxs)(n.p,{children:["Overall I don't think that paying for the support of 5 years old ",(0,i.jsx)(n.em,{children:"non-critical"}),"\npackages is going against the open-source. It is a non-trivial work that, in\nmajority of cases, cannot be included in the upstream, therefore the benefit is\nreapt only by the paying customers. I have to admit that in the case of the\nUbuntu Pro it may seem a bit weird (hiding patches behind the paywall). However\nwe're still talking about rather big set of packages that will affect a minority\nof server workloads, if any."]}),"\n",(0,i.jsx)(n.h2,{id:"glossary",children:"Glossary"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.em,{children:"rolling release"})," - continuously released without \u201csignificant milestones\u201d"]}),"\n",(0,i.jsxs)(n.admonition,{type:"tip",children:[(0,i.jsx)(n.p,{children:"As an example of rolling distribution you can take archLinux, openSUSE\nTumbleweed, Fedora Rawhide, or even CentOS 9 Stream."}),(0,i.jsxs)(n.p,{children:["As en example of ",(0,i.jsx)(n.strong,{children:"not"})," rolling distribution you can take Ubuntu, openSUSE\nLeap or Fedora."]})]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.em,{children:"bleeding edge"})," - contains the latest versions as they are released on the\nupstream"]}),"\n",(0,i.jsx)(n.admonition,{type:"tip",children:(0,i.jsxs)(n.p,{children:["As an example you can take archLinux, openSUSE Tumbleweed or Fedora Rawhide.\nYou can also notice how common it is to combine ",(0,i.jsx)(n.em,{children:"rolling release"})," with\n",(0,i.jsx)(n.em,{children:"bleeding edge"}),"."]})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.em,{children:"upstream"})," & ",(0,i.jsx)(n.em,{children:"downstream"})]}),"\n",(0,i.jsx)(n.p,{children:"You're most likely to meet these terms in the meaning of upstream being the\nproject itself and downstream being the packaging of said project in some\ndistribution."}),"\n",(0,i.jsxs)(n.p,{children:["However this can also apply to distributions like ",(0,i.jsx)(n.em,{children:"openSUSE Tumbleweed"})," with\n",(0,i.jsx)(n.em,{children:"openSUSE Leap"}),", ",(0,i.jsx)(n.em,{children:"Fedora"})," with ",(0,i.jsx)(n.em,{children:"CentOS Stream"}),", or even ",(0,i.jsx)(n.em,{children:"CentOS Stream"})," with\n",(0,i.jsx)(n.em,{children:"RHEL"}),". This basically means that the packages/software is being released into\nthe upstream (Tumbleweed, Fedora, or even CentOS) and then after being tested\nis taken further down into their respective downstreams (Leap, CentOS, RHEL)."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.section,{"data-footnotes":!0,className:"footnotes",children:[(0,i.jsx)(n.h2,{className:"sr-only",id:"footnote-label",children:"Footnotes"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{id:"user-content-fn-1-e115ff",children:["\n",(0,i.jsxs)(n.p,{children:["Richard Stallman ",(0,i.jsx)(n.a,{href:"#user-content-fnref-1-e115ff","data-footnote-backref":"","aria-label":"Back to reference 1",className:"data-footnote-backref",children:"\u21a9"})]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{id:"user-content-fn-2-e115ff",children:["\n",(0,i.jsxs)(n.p,{children:["directed acyclic graph ",(0,i.jsx)(n.a,{href:"#user-content-fnref-2-e115ff","data-footnote-backref":"","aria-label":"Back to reference 2",className:"data-footnote-backref",children:"\u21a9"})]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{id:"user-content-fn-3-e115ff",children:["\n",(0,i.jsxs)(n.p,{children:["Ubuntu Pro is technically a service whereas the RHEL and SLE are distros\nwith the support included. ",(0,i.jsx)(n.a,{href:"#user-content-fnref-3-e115ff","data-footnote-backref":"","aria-label":"Back to reference 3",className:"data-footnote-backref",children:"\u21a9"})]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{id:"user-content-fn-4-e115ff",children:["\n",(0,i.jsxs)(n.p,{children:["There are upstream projects that keep LTS branches, such as Linux kernel,\nbut even in the case of the kernel itself, they're planning on ending it,\nsince the cost outweighs the benefits at this point. ",(0,i.jsx)(n.a,{href:"#user-content-fnref-4-e115ff","data-footnote-backref":"","aria-label":"Back to reference 4",className:"data-footnote-backref",children:"\u21a9"})]}),"\n"]}),"\n"]}),"\n"]})]})}function d(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},11151:(e,n,t)=>{t.d(n,{Z:()=>r,a:()=>a});var i=t(67294);const s={},o=i.createContext(s);function a(e){const n=i.useContext(o);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),i.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/main.65a0bc7b.js b/assets/js/main.1bf5eb42.js similarity index 98% rename from assets/js/main.65a0bc7b.js rename to assets/js/main.1bf5eb42.js index ee32173..90a4e9f 100644 --- a/assets/js/main.65a0bc7b.js +++ b/assets/js/main.1bf5eb42.js @@ -1,2 +1,2 @@ -/*! For license information please see main.65a0bc7b.js.LICENSE.txt */ -(self.webpackChunkfi=self.webpackChunkfi||[]).push([[179],{20830:(e,t,n)=>{"use strict";n.d(t,{W:()=>a});var r=n(67294);function a(){return r.createElement("svg",{width:"20",height:"20",className:"DocSearch-Search-Icon",viewBox:"0 0 20 20"},r.createElement("path",{d:"M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"}))}},723:(e,t,n)=>{"use strict";n.d(t,{Z:()=>p});n(67294);var r=n(68356),a=n.n(r),o=n(16887);const i={"0123bc76":[()=>n.e(3734).then(n.t.bind(n,76554,19)),"~docs/algorithms/tag-algorithms-tags-c-e22.json",76554],"0178f9ad":[()=>n.e(9898).then(n.bind(n,35610)),"@site/algorithms/08-rb-trees/2022-04-05-applications.md",35610],"01a85c17":[()=>Promise.all([n.e(532),n.e(4013)]).then(n.bind(n,24524)),"@theme/BlogTagsListPage",24524],"0220f5fc":[()=>n.e(1378).then(n.t.bind(n,85804,19)),"/home/runner/work/blog/blog/.docusaurus/docusaurus-plugin-content-blog/blog/plugin-route-context-module-100.json",85804],"0608d96f":[()=>n.e(7568).then(n.t.bind(n,77158,19)),"~blog/blog/blog-tags-vps-843-list.json",77158],"06c4a8fc":[()=>n.e(2125).then(n.t.bind(n,4697,19)),"~docs/algorithms/tag-algorithms-tags-testing-0c4.json",4697],"0816068a":[()=>n.e(2948).then(n.t.bind(n,17702,19)),"~blog/blog/blog-tags-hype-1ee.json",17702],"087808f1":[()=>n.e(3731).then(n.bind(n,48157)),"@site/algorithms/12-hash-tables/2023-11-28-breaking/index.md",48157],"08dfa3a2":[()=>n.e(2606).then(n.t.bind(n,32412,19)),"~docs/algorithms/tag-algorithms-tags-astar-f6e.json",32412],"0bfe45d5":[()=>n.e(4269).then(n.t.bind(n,13847,19)),"~blog/blog/blog-tags-rust-0c9-list.json",13847],"0fcbc6ca":[()=>Promise.all([n.e(532),n.e(1851)]).then(n.bind(n,39900)),"@site/src/pages/talks.tsx",39900],"146d9b84":[()=>n.e(9300).then(n.t.bind(n,96671,19)),"~blog/blog/blog-tags-admin-b05-list.json",96671],"14eb3368":[()=>Promise.all([n.e(532),n.e(9817)]).then(n.bind(n,34228)),"@theme/DocCategoryGeneratedIndexPage",34228],"1535ede8":[()=>n.e(5376).then(n.bind(n,44969)),"@site/c/bonuses/10.md",44969],15966941:[()=>n.e(8326).then(n.bind(n,16721)),"@site/algorithms/12-hash-tables/2023-11-28-breaking/02-mitigations.md",16721],"16cbc838":[()=>n.e(1494).then(n.t.bind(n,98252,19)),"~docs/algorithms/tag-algorithms-tags-iterative-d5b.json",98252],17896441:[()=>Promise.all([n.e(532),n.e(9365),n.e(7918)]).then(n.bind(n,15154)),"@theme/DocItem",15154],"182b5a8d":[()=>n.e(6048).then(n.bind(n,32582)),"@site/blog/2024-01-28-rust-opinion.md?truncated=true",32582],"19d7c045":[()=>n.e(4637).then(n.t.bind(n,67772,19)),"~blog/blog/blog-tags-advent-of-code-49f.json",67772],"1a4e3797":[()=>Promise.all([n.e(532),n.e(7920)]).then(n.bind(n,48852)),"@theme/SearchPage",48852],"1a606400":[()=>n.e(494).then(n.t.bind(n,82400,19)),"/home/runner/work/blog/blog/.docusaurus/docusaurus-plugin-content-docs/algorithms/plugin-route-context-module-100.json",82400],"1acf65cc":[()=>n.e(8529).then(n.bind(n,34568)),"@site/c/pexam/b-garbage_collect.md",34568],"1cd58e77":[()=>n.e(1547).then(n.bind(n,32090)),"@site/algorithms/04-recursion/2023-08-17-pyramid-slide-down/04-bottom-up-dp.md",32090],"22a175ec":[()=>Promise.all([n.e(532),n.e(6890)]).then(n.bind(n,40707)),"@site/src/pages/contributions.tsx",40707],"24fecc0a":[()=>n.e(3707).then(n.bind(n,69383)),"@site/algorithms/03-time-complexity/2021-03-31-extend.md",69383],"257fa000":[()=>n.e(9595).then(n.t.bind(n,35455,19)),"~blog/blog/blog-tags-cult-e97-list.json",35455],"28d80ff8":[()=>n.e(6435).then(n.t.bind(n,7465,19)),"~docs/algorithms/tag-algorithms-tags-sorting-d73.json",7465],29694455:[()=>n.e(3388).then(n.t.bind(n,39828,19)),"~blog/blog/blog-tags-iterators-977-list.json",39828],"2af5d0a7":[()=>n.e(3979).then(n.t.bind(n,53703,19)),"~docs/algorithms/tag-algorithms-tags-a-star-775.json",53703],"2b89902a":[()=>n.e(6342).then(n.t.bind(n,45443,19)),"~docs/algorithms/tag-algorithms-tags-recursion-1bd.json",45443],"2ca64e35":[()=>n.e(281).then(n.bind(n,99544)),"@site/algorithms/04-recursion/2022-11-29-karel/index.md",99544],"2fcf0558":[()=>n.e(4638).then(n.t.bind(n,69470,19)),"~docs/algorithms/category-algorithms-autogeneratedbar-category-hash-tables-062.json",69470],"3011a4c0":[()=>n.e(7926).then(n.t.bind(n,31670,19)),"~blog/blog/blog-tags-copr-70b-list.json",31670],30814625:[()=>n.e(115).then(n.bind(n,78416)),"@site/algorithms/04-recursion/2022-11-29-karel/2023-12-24-solution.md",78416],"3238adfd":[()=>n.e(7285).then(n.t.bind(n,16107,19)),"~blog/blog/blog-tags-lts-b6c.json",16107],"34ab65f4":[()=>n.e(3220).then(n.t.bind(n,28865,19)),"~docs/algorithms/tag-algorithms-tags-postconditions-1f3.json",28865],"34df9f28":[()=>n.e(9977).then(n.t.bind(n,59267,19)),"~blog/blog/blog-tags-paywall-11b.json",59267],"354a7b72":[()=>n.e(9414).then(n.bind(n,46617)),"@site/algorithms/10-graphs/2022-04-30-bfs-tree.md",46617],"3720c009":[()=>Promise.all([n.e(532),n.e(3751)]).then(n.bind(n,10727)),"@theme/DocTagsListPage",10727],"377f3aa1":[()=>n.e(1011).then(n.bind(n,7582)),"@site/blog/aoc-2022/02-week-2.md",7582],"3adcbc3a":[()=>n.e(5701).then(n.bind(n,62535)),"@site/algorithms/11-paths/2024-01-01-bf-to-astar/01-bf.md",62535],"3d92ba6e":[()=>n.e(8236).then(n.t.bind(n,77778,19)),"~docs/algorithms/tag-algorithms-tags-dijkstra-48e.json",77778],"3da4b779":[()=>n.e(2177).then(n.bind(n,28737)),"@site/blog/aoc-2022/04-week-4.md",28737],"4200b1a9":[()=>n.e(866).then(n.t.bind(n,24612,19)),"~blog/blog/blog-archive-80c.json",24612],"45c9e308":[()=>n.e(7084).then(n.bind(n,53181)),"@site/cpp/07-exceptions-and-raii/2023-11-24-placeholders.md",53181],"4621632b":[()=>n.e(3519).then(n.t.bind(n,29760,19)),"~blog/blog/blog-tags-cpp-7c7-list.json",29760],"48b268a6":[()=>n.e(1648).then(n.t.bind(n,35067,19)),"~docs/c/category-c-autogeneratedbar-category-bonuses-216.json",35067],"493c0536":[()=>n.e(7292).then(n.bind(n,45594)),"@site/algorithms/11-paths/2024-01-01-bf-to-astar/03-astar.md",45594],"4e546705":[()=>n.e(4327).then(n.t.bind(n,61795,19)),"~docs/c/version-current-metadata-prop-751.json",61795],"4edd2021":[()=>n.e(5975).then(n.t.bind(n,21705,19)),"~blog/blog/blog-tags-cpp-7c7.json",21705],"4f96b16e":[()=>n.e(6306).then(n.bind(n,24693)),"@site/c/pexam/c-cams.md",24693],"4fd4011a":[()=>n.e(565).then(n.t.bind(n,43050,19)),"~blog/blog/blog-tags-lts-b6c-list.json",43050],51624505:[()=>n.e(4394).then(n.bind(n,32609)),"@site/blog/aoc-2022/00-intro.md",32609],"520f8175":[()=>n.e(8058).then(n.t.bind(n,24353,19)),"~docs/algorithms/tag-algorithms-tags-cpp-0d2.json",24353],"52f2a5bf":[()=>n.e(5430).then(n.t.bind(n,61387,19)),"~blog/blog/blog-tags-red-hat-df4.json",61387],"534d4833":[()=>n.e(9771).then(n.bind(n,93019)),"@site/algorithms/02-algorithms-correctness/2021-03-18-postcondition-ambiguity.md",93019],"57ac6224":[()=>n.e(2698).then(n.t.bind(n,35340,19)),"~blog/blog/blog-tags-linux-distributions-991-list.json",35340],"595c7293":[()=>n.e(5634).then(n.bind(n,58396)),"@site/c/bonuses/08.md",58396],"5c15401e":[()=>n.e(9579).then(n.t.bind(n,43761,19)),"~docs/algorithms/tag-algorithms-tags-bellman-ford-731.json",43761],"5ca803d2":[()=>n.e(9173).then(n.t.bind(n,24890,19)),"/home/runner/work/blog/blog/.docusaurus/docusaurus-plugin-content-docs/c/plugin-route-context-module-100.json",24890],"5e91a78c":[()=>n.e(1033).then(n.t.bind(n,82547,19)),"~blog/blog/blog-tags-linux-distributions-991.json",82547],"5e95c892":[()=>n.e(9661).then(n.bind(n,41892)),"@theme/DocsRoot",41892],"5e9f5e1a":[()=>Promise.resolve().then(n.bind(n,36809)),"@generated/docusaurus.config",36809],"62d847b3":[()=>n.e(8520).then(n.t.bind(n,91901,19)),"~blog/blog/blog-tags-advent-of-code-2022-3db-list.json",91901],"66d5ef6c":[()=>n.e(9228).then(n.t.bind(n,4087,19)),"~blog/blog/blog-tags-tags-4c2.json",4087],"686a7a89":[()=>n.e(728).then(n.t.bind(n,77507,19)),"~docs/algorithms/tag-algorithms-tags-graphs-31d.json",77507],"6875c492":[()=>Promise.all([n.e(532),n.e(9365),n.e(130),n.e(8610)]).then(n.bind(n,41714)),"@theme/BlogTagsPostsPage",41714],"698e2076":[()=>n.e(3713).then(n.bind(n,38961)),"@site/algorithms/11-paths/2024-01-01-bf-to-astar/02-dijkstra.md",38961],"6bc697d0":[()=>n.e(5287).then(n.t.bind(n,68529,19)),"/home/runner/work/blog/blog/.docusaurus/docusaurus-plugin-content-docs/cpp/plugin-route-context-module-100.json",68529],"6e3cbca1":[()=>n.e(3276).then(n.t.bind(n,29538,19)),"~docs/algorithms/version-current-metadata-prop-751.json",29538],"7052c0bc":[()=>n.e(9731).then(n.bind(n,42286)),"@site/cpp/00-intro.md",42286],"70a4540f":[()=>n.e(9249).then(n.bind(n,44493)),"@site/algorithms/04-recursion/2023-08-17-pyramid-slide-down/01-naive.md",44493],"75cccf44":[()=>n.e(4256).then(n.bind(n,98215)),"@site/blog/leetcode/sort-matrix-diagonally.md?truncated=true",98215],"765ea78b":[()=>n.e(3039).then(n.t.bind(n,83010,19)),"~blog/blog/blog-tags-\ud83c\udfed-551.json",83010],"769debb9":[()=>n.e(9931).then(n.t.bind(n,33792,19)),"~blog/blog/blog-tags-paywall-11b-list.json",33792],"794ef108":[()=>n.e(3803).then(n.bind(n,86427)),"@site/c/00-intro.md",86427],"7a5bb070":[()=>n.e(4582).then(n.t.bind(n,64863,19)),"~blog/blog/blog-tags-memory-safety-1ae.json",64863],"7ce7faac":[()=>n.e(6064).then(n.t.bind(n,12884,19)),"~docs/algorithms/tag-algorithms-tags-solution-61b.json",12884],"7e6d325b":[()=>n.e(3184).then(n.t.bind(n,26139,19)),"~docs/cpp/version-current-metadata-prop-751.json",26139],"84d1e0d8":[()=>n.e(1885).then(n.bind(n,49713)),"@site/algorithms/00-intro.md",49713],"86cd1460":[()=>n.e(1235).then(n.t.bind(n,38968,19)),"~blog/blog/blog-tags-leetcode-042.json",38968],"8a25f659":[()=>n.e(7728).then(n.bind(n,73212)),"@site/algorithms/04-recursion/2023-08-17-pyramid-slide-down/03-top-down-dp.md",73212],"8b1802c5":[()=>n.e(8480).then(n.t.bind(n,60832,19)),"~blog/blog/blog-tags-advent-of-code-49f-list.json",60832],"8c0e532b":[()=>n.e(822).then(n.t.bind(n,73968,19)),"~blog/blog/blog-tags-vps-843.json",73968],"8d31a880":[()=>n.e(9066).then(n.t.bind(n,72232,19)),"~docs/algorithms/tag-algorithms-tags-python-48f.json",72232],"8e6bb954":[()=>n.e(5775).then(n.t.bind(n,76206,19)),"~docs/algorithms/tag-algorithms-tags-exponential-60a.json",76206],"9287eafd":[()=>n.e(5521).then(n.t.bind(n,90716,19)),"~blog/blog/blog-tags-rust-0c9.json",90716],"933b95b3":[()=>n.e(3887).then(n.t.bind(n,7405,19)),"~docs/algorithms/category-algorithms-autogeneratedbar-category-recursion-257.json",7405],"947341b7":[()=>n.e(1145).then(n.t.bind(n,2897,19)),"~docs/algorithms/tag-algorithms-tags-bfs-69f.json",2897],"95b96bb9":[()=>n.e(3561).then(n.t.bind(n,24577,19)),"~blog/blog/blog-post-list-prop-blog.json",24577],"95f41f0b":[()=>n.e(9385).then(n.bind(n,93195)),"@site/blog/aoc-2022/01-week-1.md?truncated=true",93195],"962da50c":[()=>n.e(2264).then(n.t.bind(n,9705,19)),"~docs/c/category-c-autogeneratedbar-category-practice-exams-e97.json",9705],"976c4f3b":[()=>n.e(4562).then(n.t.bind(n,69019,19)),"~docs/algorithms/tag-algorithms-tags-java-6c3.json",69019],"97a42631":[()=>n.e(1464).then(n.t.bind(n,77343,19)),"~docs/algorithms/tags-list-current-prop-15a.json",77343],"9a3dc578":[()=>n.e(655).then(n.t.bind(n,9916,19)),"~docs/algorithms/tag-algorithms-tags-dynamic-array-5d3.json",9916],"9b91a88c":[()=>n.e(2545).then(n.bind(n,19466)),"@site/algorithms/04-recursion/2023-08-17-pyramid-slide-down/index.md",19466],"9df0e937":[()=>n.e(2210).then(n.t.bind(n,55256,19)),"~docs/algorithms/category-algorithms-autogeneratedbar-category-graphs-2e2.json",55256],"9e4087bc":[()=>n.e(3608).then(n.bind(n,63169)),"@theme/BlogArchivePage",63169],a082abd3:[()=>n.e(8786).then(n.t.bind(n,73276,19)),"~blog/blog/blog-tags-admin-b05.json",73276],a2ba8888:[()=>n.e(8289).then(n.t.bind(n,55941,19)),"~docs/algorithms/tag-algorithms-tags-brute-force-3cb.json",55941],a4c10cf4:[()=>n.e(4382).then(n.t.bind(n,30685,19)),"~docs/algorithms/tag-algorithms-tags-time-complexity-c50.json",30685],a6a48ea2:[()=>n.e(3618).then(n.bind(n,1176)),"@site/blog/aoc-2022/02-week-2.md?truncated=true",1176],a6aa9e1f:[()=>Promise.all([n.e(532),n.e(9365),n.e(130),n.e(3089)]).then(n.bind(n,80046)),"@theme/BlogListPage",80046],a7098721:[()=>n.e(1050).then(n.t.bind(n,26615,19)),"~blog/blog/blog-c06.json",26615],a7bd4aaa:[()=>n.e(8518).then(n.bind(n,8564)),"@theme/DocVersionRoot",8564],a80747a0:[()=>n.e(5824).then(n.t.bind(n,4464,19)),"~blog/blog/blog-tags-advent-of-code-2022-3db.json",4464],a94703ab:[()=>Promise.all([n.e(532),n.e(4368)]).then(n.bind(n,12674)),"@theme/DocRoot",12674],aa24fd5d:[()=>n.e(7257).then(n.bind(n,90251)),"@site/algorithms/12-hash-tables/2023-11-28-breaking/01-python.md",90251],aa635a28:[()=>n.e(2321).then(n.bind(n,72820)),"@site/blog/2024-02-07-lts-distros.md?truncated=true",72820],ab2721d4:[()=>n.e(7755).then(n.bind(n,53037)),"@site/blog/aoc-2022/04-week-4.md?truncated=true",53037],af8b72a7:[()=>n.e(5658).then(n.bind(n,10507)),"@site/blog/2023-08-02-copr.md?truncated=true",10507],b0291f37:[()=>n.e(6097).then(n.t.bind(n,7085,19)),"/home/runner/work/blog/blog/.docusaurus/docusaurus-theme-search-algolia/default/plugin-route-context-module-100.json",7085],b1288602:[()=>n.e(59).then(n.bind(n,51456)),"@site/c/mr.md",51456],b25fbc58:[()=>n.e(9197).then(n.t.bind(n,75617,19)),"~blog/blog/blog-tags-\ud83c\udfed-551-list.json",75617],b45dccf0:[()=>n.e(9679).then(n.t.bind(n,58296,19)),"~blog/blog/blog-tags-copr-70b.json",58296],b5a32f14:[()=>n.e(2433).then(n.bind(n,31976)),"@site/blog/2023-08-02-copr.md",31976],b8cbf382:[()=>n.e(7438).then(n.t.bind(n,74632,19)),"~docs/algorithms/tag-algorithms-tags-greedy-02f.json",74632],b9f7f5c4:[()=>n.e(9179).then(n.bind(n,76699)),"@site/cpp/environment.md",76699],bb882650:[()=>n.e(8091).then(n.bind(n,66765)),"@site/blog/aoc-2022/03-week-3.md?truncated=true",66765],bb984793:[()=>n.e(6864).then(n.t.bind(n,82505,19)),"~docs/algorithms/tag-algorithms-tags-karel-df7.json",82505],bc0c9d90:[()=>n.e(354).then(n.bind(n,50476)),"@site/c/bonuses/04.md",50476],bc2d22bc:[()=>n.e(6519).then(n.t.bind(n,70428,19)),"~docs/algorithms/tag-algorithms-tags-bottom-up-dp-4f9.json",70428],c4c4056e:[()=>n.e(635).then(n.bind(n,61381)),"@site/algorithms/11-paths/2024-01-01-bf-to-astar/index.md",61381],c4f5d8e4:[()=>Promise.all([n.e(532),n.e(4195)]).then(n.bind(n,53261)),"@site/src/pages/index.js",53261],c580b66a:[()=>n.e(6573).then(n.t.bind(n,45021,19)),"~docs/algorithms/tag-algorithms-tags-top-down-dp-c2f.json",45021],c90b7ff3:[()=>n.e(3602).then(n.t.bind(n,44960,19)),"~blog/blog/blog-tags-hype-1ee-list.json",44960],ccc49370:[()=>Promise.all([n.e(532),n.e(9365),n.e(130),n.e(6103)]).then(n.bind(n,65203)),"@theme/BlogPostPage",65203],cfa2b263:[()=>n.e(3086).then(n.bind(n,34437)),"@site/blog/leetcode/sort-matrix-diagonally.md",34437],d05e838c:[()=>n.e(6544).then(n.bind(n,63004)),"@site/c/bonuses/05-06.md",63004],d255bd7f:[()=>n.e(6292).then(n.t.bind(n,60341,19)),"~docs/algorithms/tag-algorithms-tags-red-black-trees-c61.json",60341],d309b5b1:[()=>n.e(8908).then(n.t.bind(n,26102,19)),"~docs/algorithms/category-algorithms-autogeneratedbar-category-algorithms-and-correctness-d51.json",26102],d309eaf6:[()=>n.e(6995).then(n.bind(n,54506)),"@site/blog/2024-02-07-lts-distros.md",54506],d4b1e057:[()=>n.e(1492).then(n.t.bind(n,12842,19)),"~docs/algorithms/tag-algorithms-tags-balanced-trees-b3e.json",12842],d57b4369:[()=>n.e(6179).then(n.t.bind(n,52715,19)),"~docs/algorithms/tag-algorithms-tags-csharp-d1d.json",52715],d675395f:[()=>n.e(2741).then(n.t.bind(n,15745,19)),"/home/runner/work/blog/blog/.docusaurus/docusaurus-plugin-content-pages/default/plugin-route-context-module-100.json",15745],d79dd549:[()=>n.e(5169).then(n.t.bind(n,29261,19)),"~blog/blog/blog-tags-red-hat-df4-list.json",29261],d7f7fb17:[()=>n.e(1171).then(n.bind(n,3455)),"@site/blog/aoc-2022/00-intro.md?truncated=true",3455],d8f4410e:[()=>n.e(2997).then(n.t.bind(n,41941,19)),"~docs/algorithms/tag-algorithms-tags-hash-tables-b36.json",41941],dd841e73:[()=>n.e(2482).then(n.t.bind(n,40155,19)),"~docs/algorithms/tag-algorithms-tags-dynamic-programming-3e6.json",40155],ddc7679f:[()=>n.e(569).then(n.bind(n,64322)),"@site/algorithms/10-graphs/2021-05-18-iterative-and-iterators.md",64322],dead8108:[()=>n.e(8807).then(n.bind(n,21431)),"@site/c/bonuses/03.md",21431],decbf9d1:[()=>n.e(2445).then(n.t.bind(n,88876,19)),"~docs/algorithms/category-algorithms-autogeneratedbar-category-asymptotic-notation-and-time-complexity-e0d.json",88876],df078f58:[()=>n.e(7743).then(n.t.bind(n,88298,19)),"~docs/algorithms/category-algorithms-autogeneratedbar-category-paths-in-graphs-202.json",88298],df0885f0:[()=>n.e(4343).then(n.t.bind(n,34175,19)),"~docs/algorithms/tag-algorithms-tags-iterators-13a.json",34175],df203c0f:[()=>Promise.all([n.e(532),n.e(9924)]).then(n.bind(n,40491)),"@theme/DocTagDocListPage",40491],dff2ebad:[()=>n.e(146).then(n.bind(n,42492)),"@site/blog/aoc-2022/01-week-1.md",42492],e1717305:[()=>n.e(70).then(n.t.bind(n,96377,19)),"~blog/blog/blog-tags-support-474-list.json",96377],e1d2ae23:[()=>n.e(1475).then(n.t.bind(n,36302,19)),"~docs/algorithms/tag-algorithms-tags-applications-020.json",36302],e31003e9:[()=>n.e(1960).then(n.t.bind(n,81695,19)),"~docs/cpp/category-cpp-autogeneratedbar-category-exceptions-and-raii-6e9.json",81695],e89da83e:[()=>n.e(8757).then(n.t.bind(n,97416,19)),"~blog/blog/blog-tags-leetcode-042-list.json",97416],eba2374c:[()=>n.e(8387).then(n.t.bind(n,47662,19)),"~docs/algorithms/tag-algorithms-tags-backtracking-bb2.json",47662],f44abc07:[()=>n.e(2204).then(n.t.bind(n,39006,19)),"~blog/blog/blog-tags-cult-e97.json",39006],f48be158:[()=>n.e(4064).then(n.bind(n,12326)),"@site/blog/aoc-2022/03-week-3.md",12326],f5d65bd1:[()=>n.e(5617).then(n.t.bind(n,66775,19)),"~blog/blog/blog-tags-support-474.json",66775],f71d1f68:[()=>n.e(6069).then(n.bind(n,13068)),"@site/blog/2024-01-28-rust-opinion.md",13068],f75910c4:[()=>n.e(5934).then(n.bind(n,1910)),"@site/algorithms/04-recursion/2023-08-17-pyramid-slide-down/02-greedy.md",1910],f7d29e9b:[()=>n.e(7959).then(n.t.bind(n,89266,19)),"~blog/blog/blog-tags-memory-safety-1ae-list.json",89266],fb4361d3:[()=>n.e(6327).then(n.t.bind(n,9631,19)),"~docs/algorithms/category-algorithms-autogeneratedbar-category-red-black-trees-d8a.json",9631],ff472cd9:[()=>n.e(8643).then(n.t.bind(n,7122,19)),"~blog/blog/blog-tags-iterators-977.json",7122],ff82dde7:[()=>Promise.all([n.e(532),n.e(8472)]).then(n.bind(n,63935)),"@site/algorithms/08-rb-trees/2023-06-10-rules.md",63935]};var s=n(85893);function l(e){let{error:t,retry:n,pastDelay:r}=e;return t?(0,s.jsxs)("div",{style:{textAlign:"center",color:"#fff",backgroundColor:"#fa383e",borderColor:"#fa383e",borderStyle:"solid",borderRadius:"0.25rem",borderWidth:"1px",boxSizing:"border-box",display:"block",padding:"1rem",flex:"0 0 50%",marginLeft:"25%",marginRight:"25%",marginTop:"5rem",maxWidth:"50%",width:"100%"},children:[(0,s.jsx)("p",{children:String(t)}),(0,s.jsx)("div",{children:(0,s.jsx)("button",{type:"button",onClick:n,children:"Retry"})})]}):r?(0,s.jsx)("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"},children:(0,s.jsx)("svg",{id:"loader",style:{width:128,height:110,position:"absolute",top:"calc(100vh - 64%)"},viewBox:"0 0 45 45",xmlns:"http://www.w3.org/2000/svg",stroke:"#61dafb",children:(0,s.jsxs)("g",{fill:"none",fillRule:"evenodd",transform:"translate(1 1)",strokeWidth:"2",children:[(0,s.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,s.jsx)("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,s.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,s.jsx)("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,s.jsx)("circle",{cx:"22",cy:"22",r:"8",children:(0,s.jsx)("animate",{attributeName:"r",begin:"0s",dur:"1.5s",values:"6;1;2;3;4;5;6",calcMode:"linear",repeatCount:"indefinite"})})]})})}):null}var c=n(99670),u=n(30226);function d(e,t){if("*"===e)return a()({loading:l,loader:()=>n.e(1772).then(n.bind(n,51772)),modules:["@theme/NotFound"],webpack:()=>[51772],render(e,t){const n=e.default;return(0,s.jsx)(u.z,{value:{plugin:{name:"native",id:"default"}},children:(0,s.jsx)(n,{...t})})}});const r=o[`${e}-${t}`],d={},p=[],f=[],g=(0,c.Z)(r);return Object.entries(g).forEach((e=>{let[t,n]=e;const r=i[n];r&&(d[t]=r[0],p.push(r[1]),f.push(r[2]))})),a().Map({loading:l,loader:d,modules:p,webpack:()=>f,render(t,n){const a=JSON.parse(JSON.stringify(r));Object.entries(t).forEach((t=>{let[n,r]=t;const o=r.default;if(!o)throw new Error(`The page component at ${e} doesn't have a default export. This makes it impossible to render anything. Consider default-exporting a React component.`);"object"!=typeof o&&"function"!=typeof o||Object.keys(r).filter((e=>"default"!==e)).forEach((e=>{o[e]=r[e]}));let i=a;const s=n.split(".");s.slice(0,-1).forEach((e=>{i=i[e]})),i[s[s.length-1]]=o}));const o=a.__comp;delete a.__comp;const i=a.__context;return delete a.__context,(0,s.jsx)(u.z,{value:i,children:(0,s.jsx)(o,{...a,...n})})}})}const p=[{path:"/blog/",component:d("/blog/","a14"),exact:!0},{path:"/blog/2023/08/02/copr/",component:d("/blog/2023/08/02/copr/","69d"),exact:!0},{path:"/blog/2024/01/28/rust-opinion/",component:d("/blog/2024/01/28/rust-opinion/","98d"),exact:!0},{path:"/blog/2024/02/07/lts-distros/",component:d("/blog/2024/02/07/lts-distros/","7f0"),exact:!0},{path:"/blog/aoc-2022/1st-week/",component:d("/blog/aoc-2022/1st-week/","df4"),exact:!0},{path:"/blog/aoc-2022/2nd-week/",component:d("/blog/aoc-2022/2nd-week/","783"),exact:!0},{path:"/blog/aoc-2022/3rd-week/",component:d("/blog/aoc-2022/3rd-week/","7c5"),exact:!0},{path:"/blog/aoc-2022/4th-week/",component:d("/blog/aoc-2022/4th-week/","1ac"),exact:!0},{path:"/blog/aoc-2022/intro/",component:d("/blog/aoc-2022/intro/","ada"),exact:!0},{path:"/blog/archive/",component:d("/blog/archive/","22d"),exact:!0},{path:"/blog/leetcode/sort-diagonally/",component:d("/blog/leetcode/sort-diagonally/","d97"),exact:!0},{path:"/blog/tags/",component:d("/blog/tags/","f23"),exact:!0},{path:"/blog/tags/\ud83c\udfed/",component:d("/blog/tags/\ud83c\udfed/","ffd"),exact:!0},{path:"/blog/tags/admin/",component:d("/blog/tags/admin/","d3a"),exact:!0},{path:"/blog/tags/advent-of-code-2022/",component:d("/blog/tags/advent-of-code-2022/","7bd"),exact:!0},{path:"/blog/tags/advent-of-code/",component:d("/blog/tags/advent-of-code/","313"),exact:!0},{path:"/blog/tags/copr/",component:d("/blog/tags/copr/","959"),exact:!0},{path:"/blog/tags/cpp/",component:d("/blog/tags/cpp/","770"),exact:!0},{path:"/blog/tags/cult/",component:d("/blog/tags/cult/","73d"),exact:!0},{path:"/blog/tags/hype/",component:d("/blog/tags/hype/","d35"),exact:!0},{path:"/blog/tags/iterators/",component:d("/blog/tags/iterators/","2eb"),exact:!0},{path:"/blog/tags/leetcode/",component:d("/blog/tags/leetcode/","e31"),exact:!0},{path:"/blog/tags/linux-distributions/",component:d("/blog/tags/linux-distributions/","2be"),exact:!0},{path:"/blog/tags/lts/",component:d("/blog/tags/lts/","fa3"),exact:!0},{path:"/blog/tags/memory-safety/",component:d("/blog/tags/memory-safety/","d15"),exact:!0},{path:"/blog/tags/paywall/",component:d("/blog/tags/paywall/","9e7"),exact:!0},{path:"/blog/tags/red-hat/",component:d("/blog/tags/red-hat/","a58"),exact:!0},{path:"/blog/tags/rust/",component:d("/blog/tags/rust/","bfd"),exact:!0},{path:"/blog/tags/support/",component:d("/blog/tags/support/","5f8"),exact:!0},{path:"/blog/tags/vps/",component:d("/blog/tags/vps/","1b8"),exact:!0},{path:"/contributions/",component:d("/contributions/","541"),exact:!0},{path:"/search/",component:d("/search/","c7b"),exact:!0},{path:"/talks/",component:d("/talks/","819"),exact:!0},{path:"/algorithms/",component:d("/algorithms/","c61"),routes:[{path:"/algorithms/",component:d("/algorithms/","b39"),routes:[{path:"/algorithms/tags/",component:d("/algorithms/tags/","bb8"),exact:!0},{path:"/algorithms/tags/a-star/",component:d("/algorithms/tags/a-star/","83e"),exact:!0},{path:"/algorithms/tags/applications/",component:d("/algorithms/tags/applications/","b32"),exact:!0},{path:"/algorithms/tags/astar/",component:d("/algorithms/tags/astar/","08b"),exact:!0},{path:"/algorithms/tags/backtracking/",component:d("/algorithms/tags/backtracking/","e2d"),exact:!0},{path:"/algorithms/tags/balanced-trees/",component:d("/algorithms/tags/balanced-trees/","591"),exact:!0},{path:"/algorithms/tags/bellman-ford/",component:d("/algorithms/tags/bellman-ford/","2bc"),exact:!0},{path:"/algorithms/tags/bfs/",component:d("/algorithms/tags/bfs/","334"),exact:!0},{path:"/algorithms/tags/bottom-up-dp/",component:d("/algorithms/tags/bottom-up-dp/","9e5"),exact:!0},{path:"/algorithms/tags/brute-force/",component:d("/algorithms/tags/brute-force/","99b"),exact:!0},{path:"/algorithms/tags/c/",component:d("/algorithms/tags/c/","cc5"),exact:!0},{path:"/algorithms/tags/cpp/",component:d("/algorithms/tags/cpp/","f5b"),exact:!0},{path:"/algorithms/tags/csharp/",component:d("/algorithms/tags/csharp/","7a9"),exact:!0},{path:"/algorithms/tags/dijkstra/",component:d("/algorithms/tags/dijkstra/","aa8"),exact:!0},{path:"/algorithms/tags/dynamic-array/",component:d("/algorithms/tags/dynamic-array/","00e"),exact:!0},{path:"/algorithms/tags/dynamic-programming/",component:d("/algorithms/tags/dynamic-programming/","f82"),exact:!0},{path:"/algorithms/tags/exponential/",component:d("/algorithms/tags/exponential/","a74"),exact:!0},{path:"/algorithms/tags/graphs/",component:d("/algorithms/tags/graphs/","d5b"),exact:!0},{path:"/algorithms/tags/greedy/",component:d("/algorithms/tags/greedy/","079"),exact:!0},{path:"/algorithms/tags/hash-tables/",component:d("/algorithms/tags/hash-tables/","ae4"),exact:!0},{path:"/algorithms/tags/iterative/",component:d("/algorithms/tags/iterative/","783"),exact:!0},{path:"/algorithms/tags/iterators/",component:d("/algorithms/tags/iterators/","1bc"),exact:!0},{path:"/algorithms/tags/java/",component:d("/algorithms/tags/java/","2b4"),exact:!0},{path:"/algorithms/tags/karel/",component:d("/algorithms/tags/karel/","79f"),exact:!0},{path:"/algorithms/tags/postconditions/",component:d("/algorithms/tags/postconditions/","a27"),exact:!0},{path:"/algorithms/tags/python/",component:d("/algorithms/tags/python/","eb2"),exact:!0},{path:"/algorithms/tags/recursion/",component:d("/algorithms/tags/recursion/","2b0"),exact:!0},{path:"/algorithms/tags/red-black-trees/",component:d("/algorithms/tags/red-black-trees/","9ca"),exact:!0},{path:"/algorithms/tags/solution/",component:d("/algorithms/tags/solution/","fa0"),exact:!0},{path:"/algorithms/tags/sorting/",component:d("/algorithms/tags/sorting/","7ca"),exact:!0},{path:"/algorithms/tags/testing/",component:d("/algorithms/tags/testing/","2af"),exact:!0},{path:"/algorithms/tags/time-complexity/",component:d("/algorithms/tags/time-complexity/","2d3"),exact:!0},{path:"/algorithms/tags/top-down-dp/",component:d("/algorithms/tags/top-down-dp/","779"),exact:!0},{path:"/algorithms/",component:d("/algorithms/","b7c"),routes:[{path:"/algorithms/",component:d("/algorithms/","9b0"),exact:!0,sidebar:"autogeneratedBar"},{path:"/algorithms/algorithms-correctness/postcondition-ambiguity/",component:d("/algorithms/algorithms-correctness/postcondition-ambiguity/","c18"),exact:!0,sidebar:"autogeneratedBar"},{path:"/algorithms/category/algorithms-and-correctness/",component:d("/algorithms/category/algorithms-and-correctness/","ea2"),exact:!0,sidebar:"autogeneratedBar"},{path:"/algorithms/category/asymptotic-notation-and-time-complexity/",component:d("/algorithms/category/asymptotic-notation-and-time-complexity/","fba"),exact:!0,sidebar:"autogeneratedBar"},{path:"/algorithms/category/graphs/",component:d("/algorithms/category/graphs/","a92"),exact:!0,sidebar:"autogeneratedBar"},{path:"/algorithms/category/hash-tables/",component:d("/algorithms/category/hash-tables/","ddd"),exact:!0,sidebar:"autogeneratedBar"},{path:"/algorithms/category/paths-in-graphs/",component:d("/algorithms/category/paths-in-graphs/","7c7"),exact:!0,sidebar:"autogeneratedBar"},{path:"/algorithms/category/recursion/",component:d("/algorithms/category/recursion/","61f"),exact:!0,sidebar:"autogeneratedBar"},{path:"/algorithms/category/red-black-trees/",component:d("/algorithms/category/red-black-trees/","0c0"),exact:!0,sidebar:"autogeneratedBar"},{path:"/algorithms/graphs/bfs-tree/",component:d("/algorithms/graphs/bfs-tree/","2fb"),exact:!0,sidebar:"autogeneratedBar"},{path:"/algorithms/graphs/iterative-and-iterators/",component:d("/algorithms/graphs/iterative-and-iterators/","bfd"),exact:!0,sidebar:"autogeneratedBar"},{path:"/algorithms/hash-tables/breaking/",component:d("/algorithms/hash-tables/breaking/","319"),exact:!0,sidebar:"autogeneratedBar"},{path:"/algorithms/hash-tables/breaking/mitigations/",component:d("/algorithms/hash-tables/breaking/mitigations/","4c2"),exact:!0,sidebar:"autogeneratedBar"},{path:"/algorithms/hash-tables/breaking/python/",component:d("/algorithms/hash-tables/breaking/python/","3d1"),exact:!0,sidebar:"autogeneratedBar"},{path:"/algorithms/paths/bf-to-astar/",component:d("/algorithms/paths/bf-to-astar/","050"),exact:!0,sidebar:"autogeneratedBar"},{path:"/algorithms/paths/bf-to-astar/astar/",component:d("/algorithms/paths/bf-to-astar/astar/","b4d"),exact:!0,sidebar:"autogeneratedBar"},{path:"/algorithms/paths/bf-to-astar/bf/",component:d("/algorithms/paths/bf-to-astar/bf/","e9c"),exact:!0,sidebar:"autogeneratedBar"},{path:"/algorithms/paths/bf-to-astar/dijkstra/",component:d("/algorithms/paths/bf-to-astar/dijkstra/","fe4"),exact:!0,sidebar:"autogeneratedBar"},{path:"/algorithms/rb-trees/applications/",component:d("/algorithms/rb-trees/applications/","46a"),exact:!0,sidebar:"autogeneratedBar"},{path:"/algorithms/rb-trees/rules/",component:d("/algorithms/rb-trees/rules/","21a"),exact:!0,sidebar:"autogeneratedBar"},{path:"/algorithms/recursion/karel/",component:d("/algorithms/recursion/karel/","4cf"),exact:!0,sidebar:"autogeneratedBar"},{path:"/algorithms/recursion/karel/solution/",component:d("/algorithms/recursion/karel/solution/","115"),exact:!0,sidebar:"autogeneratedBar"},{path:"/algorithms/recursion/pyramid-slide-down/",component:d("/algorithms/recursion/pyramid-slide-down/","236"),exact:!0,sidebar:"autogeneratedBar"},{path:"/algorithms/recursion/pyramid-slide-down/bottom-up-dp/",component:d("/algorithms/recursion/pyramid-slide-down/bottom-up-dp/","00d"),exact:!0,sidebar:"autogeneratedBar"},{path:"/algorithms/recursion/pyramid-slide-down/greedy/",component:d("/algorithms/recursion/pyramid-slide-down/greedy/","4bf"),exact:!0,sidebar:"autogeneratedBar"},{path:"/algorithms/recursion/pyramid-slide-down/naive/",component:d("/algorithms/recursion/pyramid-slide-down/naive/","c1b"),exact:!0,sidebar:"autogeneratedBar"},{path:"/algorithms/recursion/pyramid-slide-down/top-down-dp/",component:d("/algorithms/recursion/pyramid-slide-down/top-down-dp/","fe9"),exact:!0,sidebar:"autogeneratedBar"},{path:"/algorithms/time-complexity/extend/",component:d("/algorithms/time-complexity/extend/","250"),exact:!0,sidebar:"autogeneratedBar"}]}]}]},{path:"/c/",component:d("/c/","dae"),routes:[{path:"/c/",component:d("/c/","fc8"),routes:[{path:"/c/",component:d("/c/","1c4"),routes:[{path:"/c/",component:d("/c/","a0f"),exact:!0,sidebar:"autogeneratedBar"},{path:"/c/bonuses/seminar-03/",component:d("/c/bonuses/seminar-03/","aaa"),exact:!0,sidebar:"autogeneratedBar"},{path:"/c/bonuses/seminar-04/",component:d("/c/bonuses/seminar-04/","ffe"),exact:!0,sidebar:"autogeneratedBar"},{path:"/c/bonuses/seminar-05-06/",component:d("/c/bonuses/seminar-05-06/","4cd"),exact:!0,sidebar:"autogeneratedBar"},{path:"/c/bonuses/seminar-08/",component:d("/c/bonuses/seminar-08/","09a"),exact:!0,sidebar:"autogeneratedBar"},{path:"/c/bonuses/seminar-10/",component:d("/c/bonuses/seminar-10/","b9e"),exact:!0,sidebar:"autogeneratedBar"},{path:"/c/category/bonuses/",component:d("/c/category/bonuses/","17e"),exact:!0,sidebar:"autogeneratedBar"},{path:"/c/category/practice-exams/",component:d("/c/category/practice-exams/","009"),exact:!0,sidebar:"autogeneratedBar"},{path:"/c/mr/",component:d("/c/mr/","4c5"),exact:!0,sidebar:"autogeneratedBar"},{path:"/c/pexam/cams/",component:d("/c/pexam/cams/","a10"),exact:!0,sidebar:"autogeneratedBar"},{path:"/c/pexam/garbage_collect/",component:d("/c/pexam/garbage_collect/","44e"),exact:!0,sidebar:"autogeneratedBar"}]}]}]},{path:"/cpp/",component:d("/cpp/","269"),routes:[{path:"/cpp/",component:d("/cpp/","187"),routes:[{path:"/cpp/",component:d("/cpp/","102"),routes:[{path:"/cpp/",component:d("/cpp/","fcd"),exact:!0,sidebar:"autogeneratedBar"},{path:"/cpp/category/exceptions-and-raii/",component:d("/cpp/category/exceptions-and-raii/","cfa"),exact:!0,sidebar:"autogeneratedBar"},{path:"/cpp/environment/",component:d("/cpp/environment/","e0b"),exact:!0,sidebar:"autogeneratedBar"},{path:"/cpp/exceptions-and-raii/placeholders/",component:d("/cpp/exceptions-and-raii/placeholders/","9b3"),exact:!0,sidebar:"autogeneratedBar"}]}]}]},{path:"/",component:d("/","dfb"),exact:!0},{path:"*",component:d("*")}]},98934:(e,t,n)=>{"use strict";n.d(t,{_:()=>o,t:()=>i});var r=n(67294),a=n(85893);const o=r.createContext(!1);function i(e){let{children:t}=e;const[n,i]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{i(!0)}),[]),(0,a.jsx)(o.Provider,{value:n,children:t})}},97221:(e,t,n)=>{"use strict";var r=n(67294),a=n(20745),o=n(73727),i=n(70405),s=n(10412);const l=[n(32497),n(3310),n(18320),n(57800),n(7439)];var c=n(723),u=n(16550),d=n(18790),p=n(85893);function f(e){let{children:t}=e;return(0,p.jsx)(p.Fragment,{children:t})}var g=n(35742),h=n(52263),m=n(44996),b=n(86668),y=n(10833),v=n(94711),w=n(19727),k=n(43320),x=n(18780),S=n(90197);function _(){const{i18n:{currentLocale:e,defaultLocale:t,localeConfigs:n}}=(0,h.Z)(),r=(0,v.l)(),a=n[e].htmlLang,o=e=>e.replace("-","_");return(0,p.jsxs)(g.Z,{children:[Object.entries(n).map((e=>{let[t,{htmlLang:n}]=e;return(0,p.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:n},t)})),(0,p.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:"x-default"}),(0,p.jsx)("meta",{property:"og:locale",content:o(a)}),Object.values(n).filter((e=>a!==e.htmlLang)).map((e=>(0,p.jsx)("meta",{property:"og:locale:alternate",content:o(e.htmlLang)},`meta-og-${e.htmlLang}`)))]})}function E(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,h.Z)(),r=function(){const{siteConfig:{url:e,baseUrl:t,trailingSlash:n}}=(0,h.Z)(),{pathname:r}=(0,u.TH)();return e+(0,x.applyTrailingSlash)((0,m.Z)(r),{trailingSlash:n,baseUrl:t})}(),a=t?`${n}${t}`:r;return(0,p.jsxs)(g.Z,{children:[(0,p.jsx)("meta",{property:"og:url",content:a}),(0,p.jsx)("link",{rel:"canonical",href:a})]})}function C(){const{i18n:{currentLocale:e}}=(0,h.Z)(),{metadata:t,image:n}=(0,b.L)();return(0,p.jsxs)(p.Fragment,{children:[(0,p.jsxs)(g.Z,{children:[(0,p.jsx)("meta",{name:"twitter:card",content:"summary_large_image"}),(0,p.jsx)("body",{className:w.h})]}),n&&(0,p.jsx)(y.d,{image:n}),(0,p.jsx)(E,{}),(0,p.jsx)(_,{}),(0,p.jsx)(S.Z,{tag:k.HX,locale:e}),(0,p.jsx)(g.Z,{children:t.map(((e,t)=>(0,p.jsx)("meta",{...e},t)))})]})}const T=new Map;function A(e){if(T.has(e.pathname))return{...e,pathname:T.get(e.pathname)};if((0,d.f)(c.Z,e.pathname).some((e=>{let{route:t}=e;return!0===t.exact})))return T.set(e.pathname,e.pathname),e;const t=e.pathname.trim().replace(/(?:\/index)?\.html$/,"")||"/";return T.set(e.pathname,t),{...e,pathname:t}}var j=n(98934),N=n(58940),L=n(20469);function P(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r{const r=t.default?.[e]??t[e];return r?.(...n)}));return()=>a.forEach((e=>e?.()))}const I=function(e){let{children:t,location:n,previousLocation:r}=e;return(0,L.Z)((()=>{r!==n&&(!function(e){let{location:t,previousLocation:n}=e;if(!n)return;const r=t.pathname===n.pathname,a=t.hash===n.hash,o=t.search===n.search;if(r&&a&&!o)return;const{hash:i}=t;if(i){const e=decodeURIComponent(i.substring(1)),t=document.getElementById(e);t?.scrollIntoView()}else window.scrollTo(0,0)}({location:n,previousLocation:r}),P("onRouteDidUpdate",{previousLocation:r,location:n}))}),[r,n]),t};function R(e){const t=Array.from(new Set([e,decodeURI(e)])).map((e=>(0,d.f)(c.Z,e))).flat();return Promise.all(t.map((e=>e.route.component.preload?.())))}class O extends r.Component{previousLocation;routeUpdateCleanupCb;constructor(e){super(e),this.previousLocation=null,this.routeUpdateCleanupCb=s.Z.canUseDOM?P("onRouteUpdate",{previousLocation:null,location:this.props.location}):()=>{},this.state={nextRouteHasLoaded:!0}}shouldComponentUpdate(e,t){if(e.location===this.props.location)return t.nextRouteHasLoaded;const n=e.location;return this.previousLocation=this.props.location,this.setState({nextRouteHasLoaded:!1}),this.routeUpdateCleanupCb=P("onRouteUpdate",{previousLocation:this.previousLocation,location:n}),R(n.pathname).then((()=>{this.routeUpdateCleanupCb(),this.setState({nextRouteHasLoaded:!0})})).catch((e=>{console.warn(e),window.location.reload()})),!1}render(){const{children:e,location:t}=this.props;return(0,p.jsx)(I,{previousLocation:this.previousLocation,location:t,children:(0,p.jsx)(u.AW,{location:t,render:()=>e})})}}const F=O,M="__docusaurus-base-url-issue-banner-container",D="__docusaurus-base-url-issue-banner",B="__docusaurus-base-url-issue-banner-suggestion-container";function z(e){return`\ndocument.addEventListener('DOMContentLoaded', function maybeInsertBanner() {\n var shouldInsert = typeof window['docusaurus'] === 'undefined';\n shouldInsert && insertBanner();\n});\n\nfunction insertBanner() {\n var bannerContainer = document.createElement('div');\n bannerContainer.id = '${M}';\n var bannerHtml = ${JSON.stringify(function(e){return`\n
    \n

    Your Docusaurus site did not load properly.

    \n

    A very common reason is a wrong site baseUrl configuration.

    \n

    Current configured baseUrl = ${e} ${"/"===e?" (default value)":""}

    \n

    We suggest trying baseUrl =

    \n
    \n`}(e)).replace(/{if("undefined"==typeof document)return void n();const r=document.createElement("link");r.setAttribute("rel","prefetch"),r.setAttribute("href",e),r.onload=()=>t(),r.onerror=()=>n();const a=document.getElementsByTagName("head")[0]??document.getElementsByName("script")[0]?.parentNode;a?.appendChild(r)}))}:function(e){return new Promise(((t,n)=>{const r=new XMLHttpRequest;r.open("GET",e,!0),r.withCredentials=!0,r.onload=()=>{200===r.status?t():n()},r.send(null)}))};var Y=n(99670);const Q=new Set,X=new Set,J=()=>navigator.connection?.effectiveType.includes("2g")||navigator.connection?.saveData,ee={prefetch(e){if(!(e=>!J()&&!X.has(e)&&!Q.has(e))(e))return!1;Q.add(e);const t=(0,d.f)(c.Z,e).flatMap((e=>{return t=e.route.path,Object.entries(q).filter((e=>{let[n]=e;return n.replace(/-[^-]+$/,"")===t})).flatMap((e=>{let[,t]=e;return Object.values((0,Y.Z)(t))}));var t}));return Promise.all(t.map((e=>{const t=n.gca(e);return t&&!t.includes("undefined")?K(t).catch((()=>{})):Promise.resolve()})))},preload:e=>!!(e=>!J()&&!X.has(e))(e)&&(X.add(e),R(e))},te=Object.freeze(ee),ne=Boolean(!0);if(s.Z.canUseDOM){window.docusaurus=te;const e=document.getElementById("__docusaurus"),t=(0,p.jsx)(i.B6,{children:(0,p.jsx)(o.VK,{children:(0,p.jsx)(G,{})})}),n=(e,t)=>{console.error("Docusaurus React Root onRecoverableError:",e,t)},s=()=>{if(ne)r.startTransition((()=>{a.hydrateRoot(e,t,{onRecoverableError:n})}));else{const o=a.createRoot(e,{onRecoverableError:n});r.startTransition((()=>{o.render(t)}))}};R(window.location.pathname).then(s)}},58940:(e,t,n)=>{"use strict";n.d(t,{_:()=>d,M:()=>p});var r=n(67294),a=n(36809);const o=JSON.parse('{"docusaurus-plugin-content-docs":{"cpp":{"path":"/cpp","versions":[{"name":"current","label":"Next","isLast":true,"path":"/cpp","mainDocId":"cpp-intro","docs":[{"id":"cpp-intro","path":"/cpp/","sidebar":"autogeneratedBar"},{"id":"environment","path":"/cpp/environment","sidebar":"autogeneratedBar"},{"id":"exceptions-and-raii/2023-11-24-placeholders","path":"/cpp/exceptions-and-raii/placeholders","sidebar":"autogeneratedBar"},{"id":"/category/exceptions-and-raii","path":"/cpp/category/exceptions-and-raii","sidebar":"autogeneratedBar"}],"draftIds":[],"sidebars":{"autogeneratedBar":{"link":{"path":"/cpp/","label":"cpp-intro"}}}}],"breadcrumbs":true},"c":{"path":"/c","versions":[{"name":"current","label":"Next","isLast":true,"path":"/c","mainDocId":"c-intro","docs":[{"id":"bonuses/seminar-03","path":"/c/bonuses/seminar-03","sidebar":"autogeneratedBar"},{"id":"bonuses/seminar-04","path":"/c/bonuses/seminar-04","sidebar":"autogeneratedBar"},{"id":"bonuses/seminar-05-06","path":"/c/bonuses/seminar-05-06","sidebar":"autogeneratedBar"},{"id":"bonuses/seminar-08","path":"/c/bonuses/seminar-08","sidebar":"autogeneratedBar"},{"id":"bonuses/seminar-10","path":"/c/bonuses/seminar-10","sidebar":"autogeneratedBar"},{"id":"c-intro","path":"/c/","sidebar":"autogeneratedBar"},{"id":"mr","path":"/c/mr","sidebar":"autogeneratedBar"},{"id":"pexam/b-garbage_collect","path":"/c/pexam/garbage_collect","sidebar":"autogeneratedBar"},{"id":"pexam/c-cams","path":"/c/pexam/cams","sidebar":"autogeneratedBar"},{"id":"/category/bonuses","path":"/c/category/bonuses","sidebar":"autogeneratedBar"},{"id":"/category/practice-exams","path":"/c/category/practice-exams","sidebar":"autogeneratedBar"}],"draftIds":[],"sidebars":{"autogeneratedBar":{"link":{"path":"/c/","label":"c-intro"}}}}],"breadcrumbs":true},"algorithms":{"path":"/algorithms","versions":[{"name":"current","label":"Next","isLast":true,"path":"/algorithms","mainDocId":"algorithms-intro","docs":[{"id":"algorithms-correctness/postcondition-ambiguity","path":"/algorithms/algorithms-correctness/postcondition-ambiguity","sidebar":"autogeneratedBar"},{"id":"algorithms-intro","path":"/algorithms/","sidebar":"autogeneratedBar"},{"id":"graphs/bfs-tree","path":"/algorithms/graphs/bfs-tree","sidebar":"autogeneratedBar"},{"id":"graphs/iterative-and-iterators","path":"/algorithms/graphs/iterative-and-iterators","sidebar":"autogeneratedBar"},{"id":"hash-tables/2023-11-28-breaking/breaking","path":"/algorithms/hash-tables/breaking","sidebar":"autogeneratedBar"},{"id":"hash-tables/2023-11-28-breaking/mitigations","path":"/algorithms/hash-tables/breaking/mitigations","sidebar":"autogeneratedBar"},{"id":"hash-tables/2023-11-28-breaking/python","path":"/algorithms/hash-tables/breaking/python","sidebar":"autogeneratedBar"},{"id":"paths/2024-01-01-bf-to-astar/astar","path":"/algorithms/paths/bf-to-astar/astar","sidebar":"autogeneratedBar"},{"id":"paths/2024-01-01-bf-to-astar/bf","path":"/algorithms/paths/bf-to-astar/bf","sidebar":"autogeneratedBar"},{"id":"paths/2024-01-01-bf-to-astar/dijkstra","path":"/algorithms/paths/bf-to-astar/dijkstra","sidebar":"autogeneratedBar"},{"id":"paths/2024-01-01-bf-to-astar/index","path":"/algorithms/paths/bf-to-astar","sidebar":"autogeneratedBar"},{"id":"rb-trees/applications","path":"/algorithms/rb-trees/applications","sidebar":"autogeneratedBar"},{"id":"rb-trees/rules","path":"/algorithms/rb-trees/rules","sidebar":"autogeneratedBar"},{"id":"recursion/2022-11-29-karel/karel","path":"/algorithms/recursion/karel","sidebar":"autogeneratedBar"},{"id":"recursion/2022-11-29-karel/solution","path":"/algorithms/recursion/karel/solution","sidebar":"autogeneratedBar"},{"id":"recursion/2023-08-17-pyramid-slide-down/bottom-up-dp","path":"/algorithms/recursion/pyramid-slide-down/bottom-up-dp","sidebar":"autogeneratedBar"},{"id":"recursion/2023-08-17-pyramid-slide-down/greedy","path":"/algorithms/recursion/pyramid-slide-down/greedy","sidebar":"autogeneratedBar"},{"id":"recursion/2023-08-17-pyramid-slide-down/naive","path":"/algorithms/recursion/pyramid-slide-down/naive","sidebar":"autogeneratedBar"},{"id":"recursion/2023-08-17-pyramid-slide-down/pyramid-slide-down","path":"/algorithms/recursion/pyramid-slide-down","sidebar":"autogeneratedBar"},{"id":"recursion/2023-08-17-pyramid-slide-down/top-down-dp","path":"/algorithms/recursion/pyramid-slide-down/top-down-dp","sidebar":"autogeneratedBar"},{"id":"time-complexity/extend","path":"/algorithms/time-complexity/extend","sidebar":"autogeneratedBar"},{"id":"/category/algorithms-and-correctness","path":"/algorithms/category/algorithms-and-correctness","sidebar":"autogeneratedBar"},{"id":"/category/asymptotic-notation-and-time-complexity","path":"/algorithms/category/asymptotic-notation-and-time-complexity","sidebar":"autogeneratedBar"},{"id":"/category/recursion","path":"/algorithms/category/recursion","sidebar":"autogeneratedBar"},{"id":"/category/red-black-trees","path":"/algorithms/category/red-black-trees","sidebar":"autogeneratedBar"},{"id":"/category/graphs","path":"/algorithms/category/graphs","sidebar":"autogeneratedBar"},{"id":"/category/paths-in-graphs","path":"/algorithms/category/paths-in-graphs","sidebar":"autogeneratedBar"},{"id":"/category/hash-tables","path":"/algorithms/category/hash-tables","sidebar":"autogeneratedBar"}],"draftIds":[],"sidebars":{"autogeneratedBar":{"link":{"path":"/algorithms/","label":"algorithms-intro"}}}}],"breadcrumbs":true}}}'),i=JSON.parse('{"defaultLocale":"en","locales":["en"],"path":"i18n","currentLocale":"en","localeConfigs":{"en":{"label":"English","direction":"ltr","htmlLang":"en","calendar":"gregory","path":"en"}}}');var s=n(57529);const l=JSON.parse('{"docusaurusVersion":"3.1.1","siteVersion":"0.0.0","pluginVersions":{"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"3.1.1"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"3.1.1"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"3.1.1"},"docusaurus-theme-search-algolia":{"type":"package","name":"@docusaurus/theme-search-algolia","version":"3.1.1"},"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"3.1.1"},"docusaurus-plugin-content-blog":{"type":"package","name":"@docusaurus/plugin-content-blog","version":"3.1.1"},"docusaurus-plugin-sass":{"type":"package","name":"docusaurus-plugin-sass","version":"0.2.5"},"docusaurus-plugin-client-redirects":{"type":"package","name":"@docusaurus/plugin-client-redirects","version":"3.1.1"},"docusaurus-theme-mermaid":{"type":"package","name":"@docusaurus/theme-mermaid","version":"3.1.1"}}}');var c=n(85893);const u={siteConfig:a.default,siteMetadata:l,globalData:o,i18n:i,codeTranslations:s},d=r.createContext(u);function p(e){let{children:t}=e;return(0,c.jsx)(d.Provider,{value:u,children:t})}},44763:(e,t,n)=>{"use strict";n.d(t,{Z:()=>f});var r=n(67294),a=n(10412),o=n(35742),i=n(18780),s=n(80647),l=n(85893);function c(e){let{error:t,tryAgain:n}=e;return(0,l.jsxs)("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"flex-start",minHeight:"100vh",width:"100%",maxWidth:"80ch",fontSize:"20px",margin:"0 auto",padding:"1rem"},children:[(0,l.jsx)("h1",{style:{fontSize:"3rem"},children:"This page crashed"}),(0,l.jsx)("button",{type:"button",onClick:n,style:{margin:"1rem 0",fontSize:"2rem",cursor:"pointer",borderRadius:20,padding:"1rem"},children:"Try again"}),(0,l.jsx)(u,{error:t})]})}function u(e){let{error:t}=e;const n=(0,i.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return(0,l.jsx)("p",{style:{whiteSpace:"pre-wrap"},children:n})}function d(e){let{error:t,tryAgain:n}=e;return(0,l.jsxs)(f,{fallback:()=>(0,l.jsx)(c,{error:t,tryAgain:n}),children:[(0,l.jsx)(o.Z,{children:(0,l.jsx)("title",{children:"Page Error"})}),(0,l.jsx)(s.Z,{children:(0,l.jsx)(c,{error:t,tryAgain:n})})]})}const p=e=>(0,l.jsx)(d,{...e});class f extends r.Component{constructor(e){super(e),this.state={error:null}}componentDidCatch(e){a.Z.canUseDOM&&this.setState({error:e})}render(){const{children:e}=this.props,{error:t}=this.state;if(t){const e={error:t,tryAgain:()=>this.setState({error:null})};return(this.props.fallback??p)(e)}return e??null}}},10412:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const r="undefined"!=typeof window&&"document"in window&&"createElement"in window.document,a={canUseDOM:r,canUseEventListeners:r&&("addEventListener"in window||"attachEvent"in window),canUseIntersectionObserver:r&&"IntersectionObserver"in window,canUseViewport:r&&"screen"in window}},35742:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});n(67294);var r=n(70405),a=n(85893);function o(e){return(0,a.jsx)(r.ql,{...e})}},33692:(e,t,n)=>{"use strict";n.d(t,{Z:()=>f});var r=n(67294),a=n(73727),o=n(18780),i=n(52263),s=n(13919),l=n(10412),c=n(28138),u=n(44996),d=n(85893);function p(e,t){let{isNavLink:n,to:p,href:f,activeClassName:g,isActive:h,"data-noBrokenLinkCheck":m,autoAddBaseUrl:b=!0,...y}=e;const{siteConfig:{trailingSlash:v,baseUrl:w}}=(0,i.Z)(),{withBaseUrl:k}=(0,u.C)(),x=(0,c.Z)(),S=(0,r.useRef)(null);(0,r.useImperativeHandle)(t,(()=>S.current));const _=p||f;const E=(0,s.Z)(_),C=_?.replace("pathname://","");let T=void 0!==C?(A=C,b&&(e=>e.startsWith("/"))(A)?k(A):A):void 0;var A;T&&E&&(T=(0,o.applyTrailingSlash)(T,{trailingSlash:v,baseUrl:w}));const j=(0,r.useRef)(!1),N=n?a.OL:a.rU,L=l.Z.canUseIntersectionObserver,P=(0,r.useRef)(),I=()=>{j.current||null==T||(window.docusaurus.preload(T),j.current=!0)};(0,r.useEffect)((()=>(!L&&E&&null!=T&&window.docusaurus.prefetch(T),()=>{L&&P.current&&P.current.disconnect()})),[P,T,L,E]);const R=T?.startsWith("#")??!1,O=!y.target||"_self"===y.target,F=!T||!E||!O||R;return m||!R&&F||x.collectLink(T),y.id&&x.collectAnchor(y.id),F?(0,d.jsx)("a",{ref:S,href:T,..._&&!E&&{target:"_blank",rel:"noopener noreferrer"},...y}):(0,d.jsx)(N,{...y,onMouseEnter:I,onTouchStart:I,innerRef:e=>{S.current=e,L&&e&&E&&(P.current=new window.IntersectionObserver((t=>{t.forEach((t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(P.current.unobserve(e),P.current.disconnect(),null!=T&&window.docusaurus.prefetch(T))}))})),P.current.observe(e))},to:T,...n&&{isActive:h,activeClassName:g}})}const f=r.forwardRef(p)},95999:(e,t,n)=>{"use strict";n.d(t,{Z:()=>c,I:()=>l});var r=n(67294),a=n(85893);function o(e,t){const n=e.split(/(\{\w+\})/).map(((e,n)=>{if(n%2==1){const n=t?.[e.slice(1,-1)];if(void 0!==n)return n}return e}));return n.some((e=>(0,r.isValidElement)(e)))?n.map(((e,t)=>(0,r.isValidElement)(e)?r.cloneElement(e,{key:t}):e)).filter((e=>""!==e)):n.join("")}var i=n(57529);function s(e){let{id:t,message:n}=e;if(void 0===t&&void 0===n)throw new Error("Docusaurus translation declarations must have at least a translation id or a default translation message");return i[t??n]??n??t}function l(e,t){let{message:n,id:r}=e;return o(s({message:n,id:r}),t)}function c(e){let{children:t,id:n,values:r}=e;if(t&&"string"!=typeof t)throw console.warn("Illegal children",t),new Error("The Docusaurus component only accept simple string values");const i=s({message:t,id:n});return(0,a.jsx)(a.Fragment,{children:o(i,r)})}},29935:(e,t,n)=>{"use strict";n.d(t,{m:()=>r});const r="default"},13919:(e,t,n)=>{"use strict";function r(e){return/^(?:\w*:|\/\/)/.test(e)}function a(e){return void 0!==e&&!r(e)}n.d(t,{Z:()=>a,b:()=>r})},44996:(e,t,n)=>{"use strict";n.d(t,{C:()=>i,Z:()=>s});var r=n(67294),a=n(52263),o=n(13919);function i(){const{siteConfig:{baseUrl:e,url:t}}=(0,a.Z)(),n=(0,r.useCallback)(((n,r)=>function(e,t,n,r){let{forcePrependBaseUrl:a=!1,absolute:i=!1}=void 0===r?{}:r;if(!n||n.startsWith("#")||(0,o.b)(n))return n;if(a)return t+n.replace(/^\//,"");if(n===t.replace(/\/$/,""))return t;const s=n.startsWith(t)?n:t+n.replace(/^\//,"");return i?e+s:s}(t,e,n,r)),[t,e]);return{withBaseUrl:n}}function s(e,t){void 0===t&&(t={});const{withBaseUrl:n}=i();return n(e,t)}},28138:(e,t,n)=>{"use strict";n.d(t,{Z:()=>i});var r=n(67294);n(85893);const a=r.createContext({collectAnchor:()=>{},collectLink:()=>{}}),o=()=>(0,r.useContext)(a);function i(){return o()}},52263:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(67294),a=n(58940);function o(){return(0,r.useContext)(a._)}},72389:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(67294),a=n(98934);function o(){return(0,r.useContext)(a._)}},20469:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});var r=n(67294);const a=n(10412).Z.canUseDOM?r.useLayoutEffect:r.useEffect},99670:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const r=e=>"object"==typeof e&&!!e&&Object.keys(e).length>0;function a(e){const t={};return function e(n,a){Object.entries(n).forEach((n=>{let[o,i]=n;const s=a?`${a}.${o}`:o;r(i)?e(i,s):t[s]=i}))}(e),t}},30226:(e,t,n)=>{"use strict";n.d(t,{_:()=>o,z:()=>i});var r=n(67294),a=n(85893);const o=r.createContext(null);function i(e){let{children:t,value:n}=e;const i=r.useContext(o),s=(0,r.useMemo)((()=>function(e){let{parent:t,value:n}=e;if(!t){if(!n)throw new Error("Unexpected: no Docusaurus route context found");if(!("plugin"in n))throw new Error("Unexpected: Docusaurus topmost route context has no `plugin` attribute");return n}const r={...t.data,...n?.data};return{plugin:t.plugin,data:r}}({parent:i,value:n})),[i,n]);return(0,a.jsx)(o.Provider,{value:s,children:t})}},80143:(e,t,n)=>{"use strict";n.d(t,{Iw:()=>b,gA:()=>f,WS:()=>g,_r:()=>d,Jo:()=>y,zh:()=>p,yW:()=>m,gB:()=>h});var r=n(16550),a=n(52263),o=n(29935);function i(e,t){void 0===t&&(t={});const n=function(){const{globalData:e}=(0,a.Z)();return e}()[e];if(!n&&t.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin.`);return n}const s=e=>e.versions.find((e=>e.isLast));function l(e,t){const n=s(e);return[...e.versions.filter((e=>e!==n)),n].find((e=>!!(0,r.LX)(t,{path:e.path,exact:!1,strict:!1})))}function c(e,t){const n=l(e,t),a=n?.docs.find((e=>!!(0,r.LX)(t,{path:e.path,exact:!0,strict:!1})));return{activeVersion:n,activeDoc:a,alternateDocVersions:a?function(t){const n={};return e.versions.forEach((e=>{e.docs.forEach((r=>{r.id===t&&(n[e.name]=r)}))})),n}(a.id):{}}}const u={},d=()=>i("docusaurus-plugin-content-docs")??u,p=e=>function(e,t,n){void 0===t&&(t=o.m),void 0===n&&(n={});const r=i(e),a=r?.[t];if(!a&&n.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin with id "${t}".`);return a}("docusaurus-plugin-content-docs",e,{failfast:!0});function f(e){void 0===e&&(e={});const t=d(),{pathname:n}=(0,r.TH)();return function(e,t,n){void 0===n&&(n={});const a=Object.entries(e).sort(((e,t)=>t[1].path.localeCompare(e[1].path))).find((e=>{let[,n]=e;return!!(0,r.LX)(t,{path:n.path,exact:!1,strict:!1})})),o=a?{pluginId:a[0],pluginData:a[1]}:void 0;if(!o&&n.failfast)throw new Error(`Can't find active docs plugin for "${t}" pathname, while it was expected to be found. Maybe you tried to use a docs feature that can only be used on a docs-related page? Existing docs plugin paths are: ${Object.values(e).map((e=>e.path)).join(", ")}`);return o}(t,n,e)}function g(e){void 0===e&&(e={});const t=f(e),{pathname:n}=(0,r.TH)();if(!t)return;return{activePlugin:t,activeVersion:l(t.pluginData,n)}}function h(e){return p(e).versions}function m(e){const t=p(e);return s(t)}function b(e){const t=p(e),{pathname:n}=(0,r.TH)();return c(t,n)}function y(e){const t=p(e),{pathname:n}=(0,r.TH)();return function(e,t){const n=s(e);return{latestDocSuggestion:c(e,t).alternateDocVersions[n.name],latestVersionSuggestion:n}}(t,n)}},18320:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>o});var r=n(74865),a=n.n(r);a().configure({showSpinner:!1});const o={onRouteUpdate(e){let{location:t,previousLocation:n}=e;if(n&&t.pathname!==n.pathname){const e=window.setTimeout((()=>{a().start()}),200);return()=>window.clearTimeout(e)}},onRouteDidUpdate(){a().done()}}},3310:(e,t,n)=>{"use strict";n.r(t);var r=n(14965),a=n(36809);!function(e){const{themeConfig:{prism:t}}=a.default,{additionalLanguages:r}=t;globalThis.Prism=e,r.forEach((e=>{"php"===e&&n(96854),n(30218)(`./prism-${e}`)})),delete globalThis.Prism}(r.p1)},92503:(e,t,n)=>{"use strict";n.d(t,{Z:()=>u});n(67294);var r=n(36905),a=n(95999),o=n(86668),i=n(33692),s=n(28138);const l={anchorWithStickyNavbar:"anchorWithStickyNavbar_LWe7",anchorWithHideOnScrollNavbar:"anchorWithHideOnScrollNavbar_WYt5"};var c=n(85893);function u(e){let{as:t,id:n,...u}=e;const d=(0,s.Z)(),{navbar:{hideOnScroll:p}}=(0,o.L)();if("h1"===t||!n)return(0,c.jsx)(t,{...u,id:void 0});d.collectAnchor(n);const f=(0,a.I)({id:"theme.common.headingLinkTitle",message:"Direct link to {heading}",description:"Title for link to heading"},{heading:"string"==typeof u.children?u.children:n});return(0,c.jsxs)(t,{...u,className:(0,r.Z)("anchor",p?l.anchorWithHideOnScrollNavbar:l.anchorWithStickyNavbar,u.className),id:n,children:[u.children,(0,c.jsx)(i.Z,{className:"hash-link",to:`#${n}`,"aria-label":f,title:f,children:"\u200b"})]})}},39471:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});n(67294);const r={iconExternalLink:"iconExternalLink_nPIU"};var a=n(85893);function o(e){let{width:t=13.5,height:n=13.5}=e;return(0,a.jsx)("svg",{width:t,height:n,"aria-hidden":"true",viewBox:"0 0 24 24",className:r.iconExternalLink,children:(0,a.jsx)("path",{fill:"currentColor",d:"M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"})})}},80647:(e,t,n)=>{"use strict";n.d(t,{Z:()=>At});var r=n(67294),a=n(36905),o=n(44763),i=n(10833),s=n(16550),l=n(95999),c=n(85936),u=n(85893);const d="__docusaurus_skipToContent_fallback";function p(e){e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")}function f(){const e=(0,r.useRef)(null),{action:t}=(0,s.k6)(),n=(0,r.useCallback)((e=>{e.preventDefault();const t=document.querySelector("main:first-of-type")??document.getElementById(d);t&&p(t)}),[]);return(0,c.S)((n=>{let{location:r}=n;e.current&&!r.hash&&"PUSH"===t&&p(e.current)})),{containerRef:e,onClick:n}}const g=(0,l.I)({id:"theme.common.skipToMainContent",description:"The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation",message:"Skip to main content"});function h(e){const t=e.children??g,{containerRef:n,onClick:r}=f();return(0,u.jsx)("div",{ref:n,role:"region","aria-label":g,children:(0,u.jsx)("a",{...e,href:`#${d}`,onClick:r,children:t})})}var m=n(35281),b=n(19727);const y={skipToContent:"skipToContent_fXgn"};function v(){return(0,u.jsx)(h,{className:y.skipToContent})}var w=n(86668),k=n(59689);function x(e){let{width:t=21,height:n=21,color:r="currentColor",strokeWidth:a=1.2,className:o,...i}=e;return(0,u.jsx)("svg",{viewBox:"0 0 15 15",width:t,height:n,...i,children:(0,u.jsx)("g",{stroke:r,strokeWidth:a,children:(0,u.jsx)("path",{d:"M.75.75l13.5 13.5M14.25.75L.75 14.25"})})})}const S={closeButton:"closeButton_CVFx"};function _(e){return(0,u.jsx)("button",{type:"button","aria-label":(0,l.I)({id:"theme.AnnouncementBar.closeButtonAriaLabel",message:"Close",description:"The ARIA label for close button of announcement bar"}),...e,className:(0,a.Z)("clean-btn close",S.closeButton,e.className),children:(0,u.jsx)(x,{width:14,height:14,strokeWidth:3.1})})}const E={content:"content_knG7"};function C(e){const{announcementBar:t}=(0,w.L)(),{content:n}=t;return(0,u.jsx)("div",{...e,className:(0,a.Z)(E.content,e.className),dangerouslySetInnerHTML:{__html:n}})}const T={announcementBar:"announcementBar_mb4j",announcementBarPlaceholder:"announcementBarPlaceholder_vyr4",announcementBarClose:"announcementBarClose_gvF7",announcementBarContent:"announcementBarContent_xLdY"};function A(){const{announcementBar:e}=(0,w.L)(),{isActive:t,close:n}=(0,k.nT)();if(!t)return null;const{backgroundColor:r,textColor:a,isCloseable:o}=e;return(0,u.jsxs)("div",{className:T.announcementBar,style:{backgroundColor:r,color:a},role:"banner",children:[o&&(0,u.jsx)("div",{className:T.announcementBarPlaceholder}),(0,u.jsx)(C,{className:T.announcementBarContent}),o&&(0,u.jsx)(_,{onClick:n,className:T.announcementBarClose})]})}var j=n(93163),N=n(12466);var L=n(902),P=n(13102);const I=r.createContext(null);function R(e){let{children:t}=e;const n=function(){const e=(0,j.e)(),t=(0,P.HY)(),[n,a]=(0,r.useState)(!1),o=null!==t.component,i=(0,L.D9)(o);return(0,r.useEffect)((()=>{o&&!i&&a(!0)}),[o,i]),(0,r.useEffect)((()=>{o?e.shown||a(!0):a(!1)}),[e.shown,o]),(0,r.useMemo)((()=>[n,a]),[n])}();return(0,u.jsx)(I.Provider,{value:n,children:t})}function O(e){if(e.component){const t=e.component;return(0,u.jsx)(t,{...e.props})}}function F(){const e=(0,r.useContext)(I);if(!e)throw new L.i6("NavbarSecondaryMenuDisplayProvider");const[t,n]=e,a=(0,r.useCallback)((()=>n(!1)),[n]),o=(0,P.HY)();return(0,r.useMemo)((()=>({shown:t,hide:a,content:O(o)})),[a,o,t])}function M(e){let{header:t,primaryMenu:n,secondaryMenu:r}=e;const{shown:o}=F();return(0,u.jsxs)("div",{className:"navbar-sidebar",children:[t,(0,u.jsxs)("div",{className:(0,a.Z)("navbar-sidebar__items",{"navbar-sidebar__items--show-secondary":o}),children:[(0,u.jsx)("div",{className:"navbar-sidebar__item menu",children:n}),(0,u.jsx)("div",{className:"navbar-sidebar__item menu",children:r})]})]})}var D=n(92949),B=n(72389);function z(e){return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:24,height:24,...e,children:(0,u.jsx)("path",{fill:"currentColor",d:"M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"})})}function $(e){return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:24,height:24,...e,children:(0,u.jsx)("path",{fill:"currentColor",d:"M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"})})}const U={toggle:"toggle_vylO",toggleButton:"toggleButton_gllP",darkToggleIcon:"darkToggleIcon_wfgR",lightToggleIcon:"lightToggleIcon_pyhR",toggleButtonDisabled:"toggleButtonDisabled_aARS"};function Z(e){let{className:t,buttonClassName:n,value:r,onChange:o}=e;const i=(0,B.Z)(),s=(0,l.I)({message:"Switch between dark and light mode (currently {mode})",id:"theme.colorToggle.ariaLabel",description:"The ARIA label for the navbar color mode toggle"},{mode:"dark"===r?(0,l.I)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"}):(0,l.I)({message:"light mode",id:"theme.colorToggle.ariaLabel.mode.light",description:"The name for the light color mode"})});return(0,u.jsx)("div",{className:(0,a.Z)(U.toggle,t),children:(0,u.jsxs)("button",{className:(0,a.Z)("clean-btn",U.toggleButton,!i&&U.toggleButtonDisabled,n),type:"button",onClick:()=>o("dark"===r?"light":"dark"),disabled:!i,title:s,"aria-label":s,"aria-live":"polite",children:[(0,u.jsx)(z,{className:(0,a.Z)(U.toggleIcon,U.lightToggleIcon)}),(0,u.jsx)($,{className:(0,a.Z)(U.toggleIcon,U.darkToggleIcon)})]})})}const H=r.memo(Z),V={darkNavbarColorModeToggle:"darkNavbarColorModeToggle_X3D1"};function W(e){let{className:t}=e;const n=(0,w.L)().navbar.style,r=(0,w.L)().colorMode.disableSwitch,{colorMode:a,setColorMode:o}=(0,D.I)();return r?null:(0,u.jsx)(H,{className:t,buttonClassName:"dark"===n?V.darkNavbarColorModeToggle:void 0,value:a,onChange:o})}var G=n(21327);function q(){return(0,u.jsx)(G.Z,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function K(){const e=(0,j.e)();return(0,u.jsx)("button",{type:"button","aria-label":(0,l.I)({id:"theme.docs.sidebar.closeSidebarButtonAriaLabel",message:"Close navigation bar",description:"The ARIA label for close button of mobile sidebar"}),className:"clean-btn navbar-sidebar__close",onClick:()=>e.toggle(),children:(0,u.jsx)(x,{color:"var(--ifm-color-emphasis-600)"})})}function Y(){return(0,u.jsxs)("div",{className:"navbar-sidebar__brand",children:[(0,u.jsx)(q,{}),(0,u.jsx)(W,{className:"margin-right--md"}),(0,u.jsx)(K,{})]})}var Q=n(33692),X=n(44996),J=n(13919),ee=n(98022),te=n(39471);function ne(e){let{activeBasePath:t,activeBaseRegex:n,to:r,href:a,label:o,html:i,isDropdownLink:s,prependBaseUrlToHref:l,...c}=e;const d=(0,X.Z)(r),p=(0,X.Z)(t),f=(0,X.Z)(a,{forcePrependBaseUrl:!0}),g=o&&a&&!(0,J.Z)(a),h=i?{dangerouslySetInnerHTML:{__html:i}}:{children:(0,u.jsxs)(u.Fragment,{children:[o,g&&(0,u.jsx)(te.Z,{...s&&{width:12,height:12}})]})};return a?(0,u.jsx)(Q.Z,{href:l?f:a,...c,...h}):(0,u.jsx)(Q.Z,{to:d,isNavLink:!0,...(t||n)&&{isActive:(e,t)=>n?(0,ee.F)(n,t.pathname):t.pathname.startsWith(p)},...c,...h})}function re(e){let{className:t,isDropdownItem:n=!1,...r}=e;const o=(0,u.jsx)(ne,{className:(0,a.Z)(n?"dropdown__link":"navbar__item navbar__link",t),isDropdownLink:n,...r});return n?(0,u.jsx)("li",{children:o}):o}function ae(e){let{className:t,isDropdownItem:n,...r}=e;return(0,u.jsx)("li",{className:"menu__list-item",children:(0,u.jsx)(ne,{className:(0,a.Z)("menu__link",t),...r})})}function oe(e){let{mobile:t=!1,position:n,...r}=e;const a=t?ae:re;return(0,u.jsx)(a,{...r,activeClassName:r.activeClassName??(t?"menu__link--active":"navbar__link--active")})}var ie=n(86043),se=n(48596),le=n(52263);const ce={dropdownNavbarItemMobile:"dropdownNavbarItemMobile_S0Fm"};function ue(e,t){return e.some((e=>function(e,t){return!!(0,se.Mg)(e.to,t)||!!(0,ee.F)(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)))}function de(e){let{items:t,position:n,className:o,onClick:i,...s}=e;const l=(0,r.useRef)(null),[c,d]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{const e=e=>{l.current&&!l.current.contains(e.target)&&d(!1)};return document.addEventListener("mousedown",e),document.addEventListener("touchstart",e),document.addEventListener("focusin",e),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("touchstart",e),document.removeEventListener("focusin",e)}}),[l]),(0,u.jsxs)("div",{ref:l,className:(0,a.Z)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===n,"dropdown--show":c}),children:[(0,u.jsx)(ne,{"aria-haspopup":"true","aria-expanded":c,role:"button",href:s.to?void 0:"#",className:(0,a.Z)("navbar__link",o),...s,onClick:s.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),d(!c))},children:s.children??s.label}),(0,u.jsx)("ul",{className:"dropdown__menu",children:t.map(((e,t)=>(0,r.createElement)(He,{isDropdownItem:!0,activeClassName:"dropdown__link--active",...e,key:t})))})]})}function pe(e){let{items:t,className:n,position:o,onClick:i,...l}=e;const c=function(){const{siteConfig:{baseUrl:e}}=(0,le.Z)(),{pathname:t}=(0,s.TH)();return t.replace(e,"/")}(),d=ue(t,c),{collapsed:p,toggleCollapsed:f,setCollapsed:g}=(0,ie.u)({initialState:()=>!d});return(0,r.useEffect)((()=>{d&&g(!d)}),[c,d,g]),(0,u.jsxs)("li",{className:(0,a.Z)("menu__list-item",{"menu__list-item--collapsed":p}),children:[(0,u.jsx)(ne,{role:"button",className:(0,a.Z)(ce.dropdownNavbarItemMobile,"menu__link menu__link--sublist menu__link--sublist-caret",n),...l,onClick:e=>{e.preventDefault(),f()},children:l.children??l.label}),(0,u.jsx)(ie.z,{lazy:!0,as:"ul",className:"menu__list",collapsed:p,children:t.map(((e,t)=>(0,r.createElement)(He,{mobile:!0,isDropdownItem:!0,onClick:i,activeClassName:"menu__link--active",...e,key:t})))})]})}function fe(e){let{mobile:t=!1,...n}=e;const r=t?pe:de;return(0,u.jsx)(r,{...n})}var ge=n(94711);function he(e){let{width:t=20,height:n=20,...r}=e;return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:t,height:n,"aria-hidden":!0,...r,children:(0,u.jsx)("path",{fill:"currentColor",d:"M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"})})}const me="iconLanguage_nlXk";var be=n(73935);function ye(){return r.createElement("svg",{width:"15",height:"15",className:"DocSearch-Control-Key-Icon"},r.createElement("path",{d:"M4.505 4.496h2M5.505 5.496v5M8.216 4.496l.055 5.993M10 7.5c.333.333.5.667.5 1v2M12.326 4.5v5.996M8.384 4.496c1.674 0 2.116 0 2.116 1.5s-.442 1.5-2.116 1.5M3.205 9.303c-.09.448-.277 1.21-1.241 1.203C1 10.5.5 9.513.5 8V7c0-1.57.5-2.5 1.464-2.494.964.006 1.134.598 1.24 1.342M12.553 10.5h1.953",strokeWidth:"1.2",stroke:"currentColor",fill:"none",strokeLinecap:"square"}))}var ve=n(20830),we=["translations"];function ke(){return ke=Object.assign||function(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,r=new Array(t);n=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var Ee="Ctrl";var Ce=r.forwardRef((function(e,t){var n=e.translations,a=void 0===n?{}:n,o=_e(e,we),i=a.buttonText,s=void 0===i?"Search":i,l=a.buttonAriaLabel,c=void 0===l?"Search":l,u=xe((0,r.useState)(null),2),d=u[0],p=u[1];return(0,r.useEffect)((function(){"undefined"!=typeof navigator&&(/(Mac|iPhone|iPod|iPad)/i.test(navigator.platform)?p("\u2318"):p(Ee))}),[]),r.createElement("button",ke({type:"button",className:"DocSearch DocSearch-Button","aria-label":c},o,{ref:t}),r.createElement("span",{className:"DocSearch-Button-Container"},r.createElement(ve.W,null),r.createElement("span",{className:"DocSearch-Button-Placeholder"},s)),r.createElement("span",{className:"DocSearch-Button-Keys"},null!==d&&r.createElement(r.Fragment,null,r.createElement("kbd",{className:"DocSearch-Button-Key"},d===Ee?r.createElement(ye,null):d),r.createElement("kbd",{className:"DocSearch-Button-Key"},"K"))))})),Te=n(35742),Ae=n(66177),je=n(239),Ne=n(43320);const Le={button:{buttonText:(0,l.I)({id:"theme.SearchBar.label",message:"Search",description:"The ARIA label and placeholder for search button"}),buttonAriaLabel:(0,l.I)({id:"theme.SearchBar.label",message:"Search",description:"The ARIA label and placeholder for search button"})},modal:{searchBox:{resetButtonTitle:(0,l.I)({id:"theme.SearchModal.searchBox.resetButtonTitle",message:"Clear the query",description:"The label and ARIA label for search box reset button"}),resetButtonAriaLabel:(0,l.I)({id:"theme.SearchModal.searchBox.resetButtonTitle",message:"Clear the query",description:"The label and ARIA label for search box reset button"}),cancelButtonText:(0,l.I)({id:"theme.SearchModal.searchBox.cancelButtonText",message:"Cancel",description:"The label and ARIA label for search box cancel button"}),cancelButtonAriaLabel:(0,l.I)({id:"theme.SearchModal.searchBox.cancelButtonText",message:"Cancel",description:"The label and ARIA label for search box cancel button"})},startScreen:{recentSearchesTitle:(0,l.I)({id:"theme.SearchModal.startScreen.recentSearchesTitle",message:"Recent",description:"The title for recent searches"}),noRecentSearchesText:(0,l.I)({id:"theme.SearchModal.startScreen.noRecentSearchesText",message:"No recent searches",description:"The text when no recent searches"}),saveRecentSearchButtonTitle:(0,l.I)({id:"theme.SearchModal.startScreen.saveRecentSearchButtonTitle",message:"Save this search",description:"The label for save recent search button"}),removeRecentSearchButtonTitle:(0,l.I)({id:"theme.SearchModal.startScreen.removeRecentSearchButtonTitle",message:"Remove this search from history",description:"The label for remove recent search button"}),favoriteSearchesTitle:(0,l.I)({id:"theme.SearchModal.startScreen.favoriteSearchesTitle",message:"Favorite",description:"The title for favorite searches"}),removeFavoriteSearchButtonTitle:(0,l.I)({id:"theme.SearchModal.startScreen.removeFavoriteSearchButtonTitle",message:"Remove this search from favorites",description:"The label for remove favorite search button"})},errorScreen:{titleText:(0,l.I)({id:"theme.SearchModal.errorScreen.titleText",message:"Unable to fetch results",description:"The title for error screen of search modal"}),helpText:(0,l.I)({id:"theme.SearchModal.errorScreen.helpText",message:"You might want to check your network connection.",description:"The help text for error screen of search modal"})},footer:{selectText:(0,l.I)({id:"theme.SearchModal.footer.selectText",message:"to select",description:"The explanatory text of the action for the enter key"}),selectKeyAriaLabel:(0,l.I)({id:"theme.SearchModal.footer.selectKeyAriaLabel",message:"Enter key",description:"The ARIA label for the Enter key button that makes the selection"}),navigateText:(0,l.I)({id:"theme.SearchModal.footer.navigateText",message:"to navigate",description:"The explanatory text of the action for the Arrow up and Arrow down key"}),navigateUpKeyAriaLabel:(0,l.I)({id:"theme.SearchModal.footer.navigateUpKeyAriaLabel",message:"Arrow up",description:"The ARIA label for the Arrow up key button that makes the navigation"}),navigateDownKeyAriaLabel:(0,l.I)({id:"theme.SearchModal.footer.navigateDownKeyAriaLabel",message:"Arrow down",description:"The ARIA label for the Arrow down key button that makes the navigation"}),closeText:(0,l.I)({id:"theme.SearchModal.footer.closeText",message:"to close",description:"The explanatory text of the action for Escape key"}),closeKeyAriaLabel:(0,l.I)({id:"theme.SearchModal.footer.closeKeyAriaLabel",message:"Escape key",description:"The ARIA label for the Escape key button that close the modal"}),searchByText:(0,l.I)({id:"theme.SearchModal.footer.searchByText",message:"Search by",description:"The text explain that the search is making by Algolia"})},noResultsScreen:{noResultsText:(0,l.I)({id:"theme.SearchModal.noResultsScreen.noResultsText",message:"No results for",description:"The text explains that there are no results for the following search"}),suggestedQueryText:(0,l.I)({id:"theme.SearchModal.noResultsScreen.suggestedQueryText",message:"Try searching for",description:"The text for the suggested query when no results are found for the following search"}),reportMissingResultsText:(0,l.I)({id:"theme.SearchModal.noResultsScreen.reportMissingResultsText",message:"Believe this query should return results?",description:"The text for the question where the user thinks there are missing results"}),reportMissingResultsLinkText:(0,l.I)({id:"theme.SearchModal.noResultsScreen.reportMissingResultsLinkText",message:"Let us know.",description:"The text for the link to report missing results"})}},placeholder:(0,l.I)({id:"theme.SearchModal.placeholder",message:"Search docs",description:"The placeholder of the input of the DocSearch pop-up modal"})};let Pe=null;function Ie(e){let{hit:t,children:n}=e;return(0,u.jsx)(Q.Z,{to:t.url,children:n})}function Re(e){let{state:t,onClose:n}=e;const r=(0,Ae.M)();return(0,u.jsx)(Q.Z,{to:r(t.query),onClick:n,children:(0,u.jsx)(l.Z,{id:"theme.SearchBar.seeAll",values:{count:t.context.nbHits},children:"See all {count} results"})})}function Oe(e){let{contextualSearch:t,externalUrlRegex:a,...o}=e;const{siteMetadata:i}=(0,le.Z)(),l=(0,je.l)(),c=function(){const{locale:e,tags:t}=(0,Ne._q)();return[`language:${e}`,t.map((e=>`docusaurus_tag:${e}`))]}(),d=o.searchParameters?.facetFilters??[],p=t?function(e,t){const n=e=>"string"==typeof e?[e]:e;return[...n(e),...n(t)]}(c,d):d,f={...o.searchParameters,facetFilters:p},g=(0,s.k6)(),h=(0,r.useRef)(null),m=(0,r.useRef)(null),[b,y]=(0,r.useState)(!1),[v,w]=(0,r.useState)(void 0),k=(0,r.useCallback)((()=>Pe?Promise.resolve():Promise.all([n.e(1426).then(n.bind(n,61426)),Promise.all([n.e(532),n.e(6945)]).then(n.bind(n,46945)),Promise.all([n.e(532),n.e(8894)]).then(n.bind(n,18894))]).then((e=>{let[{DocSearchModal:t}]=e;Pe=t}))),[]),x=(0,r.useCallback)((()=>{k().then((()=>{h.current=document.createElement("div"),document.body.insertBefore(h.current,document.body.firstChild),y(!0)}))}),[k,y]),S=(0,r.useCallback)((()=>{y(!1),h.current?.remove()}),[y]),_=(0,r.useCallback)((e=>{k().then((()=>{y(!0),w(e.key)}))}),[k,y,w]),E=(0,r.useRef)({navigate(e){let{itemUrl:t}=e;(0,ee.F)(a,t)?window.location.href=t:g.push(t)}}).current,C=(0,r.useRef)((e=>o.transformItems?o.transformItems(e):e.map((e=>({...e,url:l(e.url)}))))).current,T=(0,r.useMemo)((()=>e=>(0,u.jsx)(Re,{...e,onClose:S})),[S]),A=(0,r.useCallback)((e=>(e.addAlgoliaAgent("docusaurus",i.docusaurusVersion),e)),[i.docusaurusVersion]);return function(e){var t=e.isOpen,n=e.onOpen,a=e.onClose,o=e.onInput,i=e.searchButtonRef;r.useEffect((function(){function e(e){var r;(27===e.keyCode&&t||"k"===(null===(r=e.key)||void 0===r?void 0:r.toLowerCase())&&(e.metaKey||e.ctrlKey)||!function(e){var t=e.target,n=t.tagName;return t.isContentEditable||"INPUT"===n||"SELECT"===n||"TEXTAREA"===n}(e)&&"/"===e.key&&!t)&&(e.preventDefault(),t?a():document.body.classList.contains("DocSearch--active")||document.body.classList.contains("DocSearch--active")||n()),i&&i.current===document.activeElement&&o&&/[a-zA-Z0-9]/.test(String.fromCharCode(e.keyCode))&&o(e)}return window.addEventListener("keydown",e),function(){window.removeEventListener("keydown",e)}}),[t,n,a,o,i])}({isOpen:b,onOpen:x,onClose:S,onInput:_,searchButtonRef:m}),(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(Te.Z,{children:(0,u.jsx)("link",{rel:"preconnect",href:`https://${o.appId}-dsn.algolia.net`,crossOrigin:"anonymous"})}),(0,u.jsx)(Ce,{onTouchStart:k,onFocus:k,onMouseOver:k,onClick:x,ref:m,translations:Le.button}),b&&Pe&&h.current&&(0,be.createPortal)((0,u.jsx)(Pe,{onClose:S,initialScrollY:window.scrollY,initialQuery:v,navigator:E,transformItems:C,hitComponent:Ie,transformSearchClient:A,...o.searchPagePath&&{resultsFooterComponent:T},...o,searchParameters:f,placeholder:Le.placeholder,translations:Le.modal}),h.current)]})}function Fe(){const{siteConfig:e}=(0,le.Z)();return(0,u.jsx)(Oe,{...e.themeConfig.algolia})}const Me={navbarSearchContainer:"navbarSearchContainer_Bca1"};function De(e){let{children:t,className:n}=e;return(0,u.jsx)("div",{className:(0,a.Z)(n,Me.navbarSearchContainer),children:t})}var Be=n(80143),ze=n(53438);var $e=n(60373);const Ue=e=>e.docs.find((t=>t.id===e.mainDocId));const Ze={default:oe,localeDropdown:function(e){let{mobile:t,dropdownItemsBefore:n,dropdownItemsAfter:r,queryString:a="",...o}=e;const{i18n:{currentLocale:i,locales:c,localeConfigs:d}}=(0,le.Z)(),p=(0,ge.l)(),{search:f,hash:g}=(0,s.TH)(),h=[...n,...c.map((e=>{const n=`${`pathname://${p.createUrl({locale:e,fullyQualified:!1})}`}${f}${g}${a}`;return{label:d[e].label,lang:d[e].htmlLang,to:n,target:"_self",autoAddBaseUrl:!1,className:e===i?t?"menu__link--active":"dropdown__link--active":""}})),...r],m=t?(0,l.I)({message:"Languages",id:"theme.navbar.mobileLanguageDropdown.label",description:"The label for the mobile language switcher dropdown"}):d[i].label;return(0,u.jsx)(fe,{...o,mobile:t,label:(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(he,{className:me}),m]}),items:h})},search:function(e){let{mobile:t,className:n}=e;return t?null:(0,u.jsx)(De,{className:n,children:(0,u.jsx)(Fe,{})})},dropdown:fe,html:function(e){let{value:t,className:n,mobile:r=!1,isDropdownItem:o=!1}=e;const i=o?"li":"div";return(0,u.jsx)(i,{className:(0,a.Z)({navbar__item:!r&&!o,"menu__list-item":r},n),dangerouslySetInnerHTML:{__html:t}})},doc:function(e){let{docId:t,label:n,docsPluginId:r,...a}=e;const{activeDoc:o}=(0,Be.Iw)(r),i=(0,ze.vY)(t,r),s=o?.path===i?.path;return null===i||i.unlisted&&!s?null:(0,u.jsx)(oe,{exact:!0,...a,isActive:()=>s||!!o?.sidebar&&o.sidebar===i.sidebar,label:n??i.id,to:i.path})},docSidebar:function(e){let{sidebarId:t,label:n,docsPluginId:r,...a}=e;const{activeDoc:o}=(0,Be.Iw)(r),i=(0,ze.oz)(t,r).link;if(!i)throw new Error(`DocSidebarNavbarItem: Sidebar with ID "${t}" doesn't have anything to be linked to.`);return(0,u.jsx)(oe,{exact:!0,...a,isActive:()=>o?.sidebar===t,label:n??i.label,to:i.path})},docsVersion:function(e){let{label:t,to:n,docsPluginId:r,...a}=e;const o=(0,ze.lO)(r)[0],i=t??o.label,s=n??(e=>e.docs.find((t=>t.id===e.mainDocId)))(o).path;return(0,u.jsx)(oe,{...a,label:i,to:s})},docsVersionDropdown:function(e){let{mobile:t,docsPluginId:n,dropdownActiveClassDisabled:r,dropdownItemsBefore:a,dropdownItemsAfter:o,...i}=e;const{search:c,hash:d}=(0,s.TH)(),p=(0,Be.Iw)(n),f=(0,Be.gB)(n),{savePreferredVersionName:g}=(0,$e.J)(n),h=[...a,...f.map((e=>{const t=p.alternateDocVersions[e.name]??Ue(e);return{label:e.label,to:`${t.path}${c}${d}`,isActive:()=>e===p.activeVersion,onClick:()=>g(e.name)}})),...o],m=(0,ze.lO)(n)[0],b=t&&h.length>1?(0,l.I)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):m.label,y=t&&h.length>1?void 0:Ue(m).path;return h.length<=1?(0,u.jsx)(oe,{...i,mobile:t,label:b,to:y,isActive:r?()=>!1:void 0}):(0,u.jsx)(fe,{...i,mobile:t,label:b,to:y,items:h,isActive:r?()=>!1:void 0})}};function He(e){let{type:t,...n}=e;const r=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(t,n),a=Ze[r];if(!a)throw new Error(`No NavbarItem component found for type "${t}".`);return(0,u.jsx)(a,{...n})}function Ve(){const e=(0,j.e)(),t=(0,w.L)().navbar.items;return(0,u.jsx)("ul",{className:"menu__list",children:t.map(((t,n)=>(0,r.createElement)(He,{mobile:!0,...t,onClick:()=>e.toggle(),key:n})))})}function We(e){return(0,u.jsx)("button",{...e,type:"button",className:"clean-btn navbar-sidebar__back",children:(0,u.jsx)(l.Z,{id:"theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel",description:"The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)",children:"\u2190 Back to main menu"})})}function Ge(){const e=0===(0,w.L)().navbar.items.length,t=F();return(0,u.jsxs)(u.Fragment,{children:[!e&&(0,u.jsx)(We,{onClick:()=>t.hide()}),t.content]})}function qe(){const e=(0,j.e)();var t;return void 0===(t=e.shown)&&(t=!0),(0,r.useEffect)((()=>(document.body.style.overflow=t?"hidden":"visible",()=>{document.body.style.overflow="visible"})),[t]),e.shouldRender?(0,u.jsx)(M,{header:(0,u.jsx)(Y,{}),primaryMenu:(0,u.jsx)(Ve,{}),secondaryMenu:(0,u.jsx)(Ge,{})}):null}const Ke={navbarHideable:"navbarHideable_m1mJ",navbarHidden:"navbarHidden_jGov"};function Ye(e){return(0,u.jsx)("div",{role:"presentation",...e,className:(0,a.Z)("navbar-sidebar__backdrop",e.className)})}function Qe(e){let{children:t}=e;const{navbar:{hideOnScroll:n,style:o}}=(0,w.L)(),i=(0,j.e)(),{navbarRef:s,isNavbarVisible:d}=function(e){const[t,n]=(0,r.useState)(e),a=(0,r.useRef)(!1),o=(0,r.useRef)(0),i=(0,r.useCallback)((e=>{null!==e&&(o.current=e.getBoundingClientRect().height)}),[]);return(0,N.RF)(((t,r)=>{let{scrollY:i}=t;if(!e)return;if(i=s?n(!1):i+c{if(!e)return;const r=t.location.hash;if(r?document.getElementById(r.substring(1)):void 0)return a.current=!0,void n(!1);n(!0)})),{navbarRef:i,isNavbarVisible:t}}(n);return(0,u.jsxs)("nav",{ref:s,"aria-label":(0,l.I)({id:"theme.NavBar.navAriaLabel",message:"Main",description:"The ARIA label for the main navigation"}),className:(0,a.Z)("navbar","navbar--fixed-top",n&&[Ke.navbarHideable,!d&&Ke.navbarHidden],{"navbar--dark":"dark"===o,"navbar--primary":"primary"===o,"navbar-sidebar--show":i.shown}),children:[t,(0,u.jsx)(Ye,{onClick:i.toggle}),(0,u.jsx)(qe,{})]})}var Xe=n(69690);const Je="right";function et(e){let{width:t=30,height:n=30,className:r,...a}=e;return(0,u.jsx)("svg",{className:r,width:t,height:n,viewBox:"0 0 30 30","aria-hidden":"true",...a,children:(0,u.jsx)("path",{stroke:"currentColor",strokeLinecap:"round",strokeMiterlimit:"10",strokeWidth:"2",d:"M4 7h22M4 15h22M4 23h22"})})}function tt(){const{toggle:e,shown:t}=(0,j.e)();return(0,u.jsx)("button",{onClick:e,"aria-label":(0,l.I)({id:"theme.docs.sidebar.toggleSidebarButtonAriaLabel",message:"Toggle navigation bar",description:"The ARIA label for hamburger menu button of mobile navigation"}),"aria-expanded":t,className:"navbar__toggle clean-btn",type:"button",children:(0,u.jsx)(et,{})})}const nt={colorModeToggle:"colorModeToggle_DEke"};function rt(e){let{items:t}=e;return(0,u.jsx)(u.Fragment,{children:t.map(((e,t)=>(0,u.jsx)(Xe.QW,{onError:t=>new Error(`A theme navbar item failed to render.\nPlease double-check the following navbar item (themeConfig.navbar.items) of your Docusaurus config:\n${JSON.stringify(e,null,2)}`,{cause:t}),children:(0,u.jsx)(He,{...e})},t)))})}function at(e){let{left:t,right:n}=e;return(0,u.jsxs)("div",{className:"navbar__inner",children:[(0,u.jsx)("div",{className:"navbar__items",children:t}),(0,u.jsx)("div",{className:"navbar__items navbar__items--right",children:n})]})}function ot(){const e=(0,j.e)(),t=(0,w.L)().navbar.items,[n,r]=function(e){function t(e){return"left"===(e.position??Je)}return[e.filter(t),e.filter((e=>!t(e)))]}(t),a=t.find((e=>"search"===e.type));return(0,u.jsx)(at,{left:(0,u.jsxs)(u.Fragment,{children:[!e.disabled&&(0,u.jsx)(tt,{}),(0,u.jsx)(q,{}),(0,u.jsx)(rt,{items:n})]}),right:(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(rt,{items:r}),(0,u.jsx)(W,{className:nt.colorModeToggle}),!a&&(0,u.jsx)(De,{children:(0,u.jsx)(Fe,{})})]})})}function it(){return(0,u.jsx)(Qe,{children:(0,u.jsx)(ot,{})})}function st(e){let{item:t}=e;const{to:n,href:r,label:a,prependBaseUrlToHref:o,...i}=t,s=(0,X.Z)(n),l=(0,X.Z)(r,{forcePrependBaseUrl:!0});return(0,u.jsxs)(Q.Z,{className:"footer__link-item",...r?{href:o?l:r}:{to:s},...i,children:[a,r&&!(0,J.Z)(r)&&(0,u.jsx)(te.Z,{})]})}function lt(e){let{item:t}=e;return t.html?(0,u.jsx)("li",{className:"footer__item",dangerouslySetInnerHTML:{__html:t.html}}):(0,u.jsx)("li",{className:"footer__item",children:(0,u.jsx)(st,{item:t})},t.href??t.to)}function ct(e){let{column:t}=e;return(0,u.jsxs)("div",{className:"col footer__col",children:[(0,u.jsx)("div",{className:"footer__title",children:t.title}),(0,u.jsx)("ul",{className:"footer__items clean-list",children:t.items.map(((e,t)=>(0,u.jsx)(lt,{item:e},t)))})]})}function ut(e){let{columns:t}=e;return(0,u.jsx)("div",{className:"row footer__links",children:t.map(((e,t)=>(0,u.jsx)(ct,{column:e},t)))})}function dt(){return(0,u.jsx)("span",{className:"footer__link-separator",children:"\xb7"})}function pt(e){let{item:t}=e;return t.html?(0,u.jsx)("span",{className:"footer__link-item",dangerouslySetInnerHTML:{__html:t.html}}):(0,u.jsx)(st,{item:t})}function ft(e){let{links:t}=e;return(0,u.jsx)("div",{className:"footer__links text--center",children:(0,u.jsx)("div",{className:"footer__links",children:t.map(((e,n)=>(0,u.jsxs)(r.Fragment,{children:[(0,u.jsx)(pt,{item:e}),t.length!==n+1&&(0,u.jsx)(dt,{})]},n)))})})}function gt(e){let{links:t}=e;return function(e){return"title"in e[0]}(t)?(0,u.jsx)(ut,{columns:t}):(0,u.jsx)(ft,{links:t})}var ht=n(19965);const mt={footerLogoLink:"footerLogoLink_BH7S"};function bt(e){let{logo:t}=e;const{withBaseUrl:n}=(0,X.C)(),r={light:n(t.src),dark:n(t.srcDark??t.src)};return(0,u.jsx)(ht.Z,{className:(0,a.Z)("footer__logo",t.className),alt:t.alt,sources:r,width:t.width,height:t.height,style:t.style})}function yt(e){let{logo:t}=e;return t.href?(0,u.jsx)(Q.Z,{href:t.href,className:mt.footerLogoLink,target:t.target,children:(0,u.jsx)(bt,{logo:t})}):(0,u.jsx)(bt,{logo:t})}function vt(e){let{copyright:t}=e;return(0,u.jsx)("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:t}})}function wt(e){let{style:t,links:n,logo:r,copyright:o}=e;return(0,u.jsx)("footer",{className:(0,a.Z)("footer",{"footer--dark":"dark"===t}),children:(0,u.jsxs)("div",{className:"container container-fluid",children:[n,(r||o)&&(0,u.jsxs)("div",{className:"footer__bottom text--center",children:[r&&(0,u.jsx)("div",{className:"margin-bottom--sm",children:r}),o]})]})})}function kt(){const{footer:e}=(0,w.L)();if(!e)return null;const{copyright:t,links:n,logo:r,style:a}=e;return(0,u.jsx)(wt,{style:a,links:n&&n.length>0&&(0,u.jsx)(gt,{links:n}),logo:r&&(0,u.jsx)(yt,{logo:r}),copyright:t&&(0,u.jsx)(vt,{copyright:t})})}const xt=r.memo(kt),St=(0,L.Qc)([D.S,k.pl,N.OC,$e.L5,i.VC,function(e){let{children:t}=e;return(0,u.jsx)(P.n2,{children:(0,u.jsx)(j.M,{children:(0,u.jsx)(R,{children:t})})})}]);function _t(e){let{children:t}=e;return(0,u.jsx)(St,{children:t})}var Et=n(92503);function Ct(e){let{error:t,tryAgain:n}=e;return(0,u.jsx)("main",{className:"container margin-vert--xl",children:(0,u.jsx)("div",{className:"row",children:(0,u.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,u.jsx)(Et.Z,{as:"h1",className:"hero__title",children:(0,u.jsx)(l.Z,{id:"theme.ErrorPageContent.title",description:"The title of the fallback page when the page crashed",children:"This page crashed."})}),(0,u.jsx)("div",{className:"margin-vert--lg",children:(0,u.jsx)(Xe.Cw,{onClick:n,className:"button button--primary shadow--lw"})}),(0,u.jsx)("hr",{}),(0,u.jsx)("div",{className:"margin-vert--md",children:(0,u.jsx)(Xe.aG,{error:t})})]})})})}const Tt={mainWrapper:"mainWrapper_z2l0"};function At(e){const{children:t,noFooter:n,wrapperClassName:r,title:s,description:l}=e;return(0,b.t)(),(0,u.jsxs)(_t,{children:[(0,u.jsx)(i.d,{title:s,description:l}),(0,u.jsx)(v,{}),(0,u.jsx)(A,{}),(0,u.jsx)(it,{}),(0,u.jsx)("div",{id:d,className:(0,a.Z)(m.k.wrapper.main,Tt.mainWrapper,r),children:(0,u.jsx)(o.Z,{fallback:e=>(0,u.jsx)(Ct,{...e}),children:t})}),!n&&(0,u.jsx)(xt,{})]})}},21327:(e,t,n)=>{"use strict";n.d(t,{Z:()=>u});n(67294);var r=n(33692),a=n(44996),o=n(52263),i=n(86668),s=n(19965),l=n(85893);function c(e){let{logo:t,alt:n,imageClassName:r}=e;const o={light:(0,a.Z)(t.src),dark:(0,a.Z)(t.srcDark||t.src)},i=(0,l.jsx)(s.Z,{className:t.className,sources:o,height:t.height,width:t.width,alt:n,style:t.style});return r?(0,l.jsx)("div",{className:r,children:i}):i}function u(e){const{siteConfig:{title:t}}=(0,o.Z)(),{navbar:{title:n,logo:s}}=(0,i.L)(),{imageClassName:u,titleClassName:d,...p}=e,f=(0,a.Z)(s?.href||"/"),g=n?"":t,h=s?.alt??g;return(0,l.jsxs)(r.Z,{to:f,...p,...s?.target&&{target:s.target},children:[s&&(0,l.jsx)(c,{logo:s,alt:h,imageClassName:u}),null!=n&&(0,l.jsx)("b",{className:d,children:n})]})}},90197:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});n(67294);var r=n(35742),a=n(85893);function o(e){let{locale:t,version:n,tag:o}=e;const i=t;return(0,a.jsxs)(r.Z,{children:[t&&(0,a.jsx)("meta",{name:"docusaurus_locale",content:t}),n&&(0,a.jsx)("meta",{name:"docusaurus_version",content:n}),o&&(0,a.jsx)("meta",{name:"docusaurus_tag",content:o}),i&&(0,a.jsx)("meta",{name:"docsearch:language",content:i}),n&&(0,a.jsx)("meta",{name:"docsearch:version",content:n}),o&&(0,a.jsx)("meta",{name:"docsearch:docusaurus_tag",content:o})]})}},19965:(e,t,n)=>{"use strict";n.d(t,{Z:()=>u});var r=n(67294),a=n(788),o=n(72389),i=n(92949);const s={themedComponent:"themedComponent_mlkZ","themedComponent--light":"themedComponent--light_NVdE","themedComponent--dark":"themedComponent--dark_xIcU"};var l=n(85893);function c(e){let{className:t,children:n}=e;const c=(0,o.Z)(),{colorMode:u}=(0,i.I)();return(0,l.jsx)(l.Fragment,{children:(c?"dark"===u?["dark"]:["light"]:["light","dark"]).map((e=>{const o=n({theme:e,className:(0,a.Z)(t,s.themedComponent,s[`themedComponent--${e}`])});return(0,l.jsx)(r.Fragment,{children:o},e)}))})}function u(e){const{sources:t,className:n,alt:r,...a}=e;return(0,l.jsx)(c,{className:n,children:e=>{let{theme:n,className:o}=e;return(0,l.jsx)("img",{src:t[n],alt:r,className:o,...a})}})}},86043:(e,t,n)=>{"use strict";n.d(t,{u:()=>c,z:()=>b});var r=n(67294),a=n(10412),o=n(20469),i=n(91442),s=n(85893);const l="ease-in-out";function c(e){let{initialState:t}=e;const[n,a]=(0,r.useState)(t??!1),o=(0,r.useCallback)((()=>{a((e=>!e))}),[]);return{collapsed:n,setCollapsed:a,toggleCollapsed:o}}const u={display:"none",overflow:"hidden",height:"0px"},d={display:"block",overflow:"visible",height:"auto"};function p(e,t){const n=t?u:d;e.style.display=n.display,e.style.overflow=n.overflow,e.style.height=n.height}function f(e){let{collapsibleRef:t,collapsed:n,animation:a}=e;const o=(0,r.useRef)(!1);(0,r.useEffect)((()=>{const e=t.current;function r(){const t=e.scrollHeight,n=a?.duration??function(e){if((0,i.n)())return 1;const t=e/36;return Math.round(10*(4+15*t**.25+t/5))}(t);return{transition:`height ${n}ms ${a?.easing??l}`,height:`${t}px`}}function s(){const t=r();e.style.transition=t.transition,e.style.height=t.height}if(!o.current)return p(e,n),void(o.current=!0);return e.style.willChange="height",function(){const t=requestAnimationFrame((()=>{n?(s(),requestAnimationFrame((()=>{e.style.height=u.height,e.style.overflow=u.overflow}))):(e.style.display="block",requestAnimationFrame((()=>{s()})))}));return()=>cancelAnimationFrame(t)}()}),[t,n,a])}function g(e){if(!a.Z.canUseDOM)return e?u:d}function h(e){let{as:t="div",collapsed:n,children:a,animation:o,onCollapseTransitionEnd:i,className:l,disableSSRStyle:c}=e;const u=(0,r.useRef)(null);return f({collapsibleRef:u,collapsed:n,animation:o}),(0,s.jsx)(t,{ref:u,style:c?void 0:g(n),onTransitionEnd:e=>{"height"===e.propertyName&&(p(u.current,n),i?.(n))},className:l,children:a})}function m(e){let{collapsed:t,...n}=e;const[a,i]=(0,r.useState)(!t),[l,c]=(0,r.useState)(t);return(0,o.Z)((()=>{t||i(!0)}),[t]),(0,o.Z)((()=>{a&&c(t)}),[a,t]),a?(0,s.jsx)(h,{...n,collapsed:l}):null}function b(e){let{lazy:t,...n}=e;const r=t?m:h;return(0,s.jsx)(r,{...n})}},59689:(e,t,n)=>{"use strict";n.d(t,{nT:()=>h,pl:()=>g});var r=n(67294),a=n(72389),o=n(50012),i=n(902),s=n(86668),l=n(85893);const c=(0,o.WA)("docusaurus.announcement.dismiss"),u=(0,o.WA)("docusaurus.announcement.id"),d=()=>"true"===c.get(),p=e=>c.set(String(e)),f=r.createContext(null);function g(e){let{children:t}=e;const n=function(){const{announcementBar:e}=(0,s.L)(),t=(0,a.Z)(),[n,o]=(0,r.useState)((()=>!!t&&d()));(0,r.useEffect)((()=>{o(d())}),[]);const i=(0,r.useCallback)((()=>{p(!0),o(!0)}),[]);return(0,r.useEffect)((()=>{if(!e)return;const{id:t}=e;let n=u.get();"annoucement-bar"===n&&(n="announcement-bar");const r=t!==n;u.set(t),r&&p(!1),!r&&d()||o(!1)}),[e]),(0,r.useMemo)((()=>({isActive:!!e&&!n,close:i})),[e,n,i])}();return(0,l.jsx)(f.Provider,{value:n,children:t})}function h(){const e=(0,r.useContext)(f);if(!e)throw new i.i6("AnnouncementBarProvider");return e}},92949:(e,t,n)=>{"use strict";n.d(t,{I:()=>b,S:()=>m});var r=n(67294),a=n(10412),o=n(902),i=n(50012),s=n(86668),l=n(85893);const c=r.createContext(void 0),u="theme",d=(0,i.WA)(u),p={light:"light",dark:"dark"},f=e=>e===p.dark?p.dark:p.light,g=e=>a.Z.canUseDOM?f(document.documentElement.getAttribute("data-theme")):f(e),h=e=>{d.set(f(e))};function m(e){let{children:t}=e;const n=function(){const{colorMode:{defaultMode:e,disableSwitch:t,respectPrefersColorScheme:n}}=(0,s.L)(),[a,o]=(0,r.useState)(g(e));(0,r.useEffect)((()=>{t&&d.del()}),[t]);const i=(0,r.useCallback)((function(t,r){void 0===r&&(r={});const{persist:a=!0}=r;t?(o(t),a&&h(t)):(o(n?window.matchMedia("(prefers-color-scheme: dark)").matches?p.dark:p.light:e),d.del())}),[n,e]);(0,r.useEffect)((()=>{document.documentElement.setAttribute("data-theme",f(a))}),[a]),(0,r.useEffect)((()=>{if(t)return;const e=e=>{if(e.key!==u)return;const t=d.get();null!==t&&i(f(t))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)}),[t,i]);const l=(0,r.useRef)(!1);return(0,r.useEffect)((()=>{if(t&&!n)return;const e=window.matchMedia("(prefers-color-scheme: dark)"),r=()=>{window.matchMedia("print").matches||l.current?l.current=window.matchMedia("print").matches:i(null)};return e.addListener(r),()=>e.removeListener(r)}),[i,t,n]),(0,r.useMemo)((()=>({colorMode:a,setColorMode:i,get isDarkTheme(){return a===p.dark},setLightTheme(){i(p.light)},setDarkTheme(){i(p.dark)}})),[a,i])}();return(0,l.jsx)(c.Provider,{value:n,children:t})}function b(){const e=(0,r.useContext)(c);if(null==e)throw new o.i6("ColorModeProvider","Please see https://docusaurus.io/docs/api/themes/configuration#use-color-mode.");return e}},60373:(e,t,n)=>{"use strict";n.d(t,{J:()=>v,L5:()=>b,Oh:()=>w});var r=n(67294),a=n(80143),o=n(29935),i=n(86668),s=n(53438),l=n(902),c=n(50012),u=n(85893);const d=e=>`docs-preferred-version-${e}`,p={save:(e,t,n)=>{(0,c.WA)(d(e),{persistence:t}).set(n)},read:(e,t)=>(0,c.WA)(d(e),{persistence:t}).get(),clear:(e,t)=>{(0,c.WA)(d(e),{persistence:t}).del()}},f=e=>Object.fromEntries(e.map((e=>[e,{preferredVersionName:null}])));const g=r.createContext(null);function h(){const e=(0,a._r)(),t=(0,i.L)().docs.versionPersistence,n=(0,r.useMemo)((()=>Object.keys(e)),[e]),[o,s]=(0,r.useState)((()=>f(n)));(0,r.useEffect)((()=>{s(function(e){let{pluginIds:t,versionPersistence:n,allDocsData:r}=e;function a(e){const t=p.read(e,n);return r[e].versions.some((e=>e.name===t))?{preferredVersionName:t}:(p.clear(e,n),{preferredVersionName:null})}return Object.fromEntries(t.map((e=>[e,a(e)])))}({allDocsData:e,versionPersistence:t,pluginIds:n}))}),[e,t,n]);return[o,(0,r.useMemo)((()=>({savePreferredVersion:function(e,n){p.save(e,t,n),s((t=>({...t,[e]:{preferredVersionName:n}})))}})),[t])]}function m(e){let{children:t}=e;const n=h();return(0,u.jsx)(g.Provider,{value:n,children:t})}function b(e){let{children:t}=e;return s.cE?(0,u.jsx)(m,{children:t}):(0,u.jsx)(u.Fragment,{children:t})}function y(){const e=(0,r.useContext)(g);if(!e)throw new l.i6("DocsPreferredVersionContextProvider");return e}function v(e){void 0===e&&(e=o.m);const t=(0,a.zh)(e),[n,i]=y(),{preferredVersionName:s}=n[e];return{preferredVersion:t.versions.find((e=>e.name===s))??null,savePreferredVersionName:(0,r.useCallback)((t=>{i.savePreferredVersion(e,t)}),[i,e])}}function w(){const e=(0,a._r)(),[t]=y();function n(n){const r=e[n],{preferredVersionName:a}=t[n];return r.versions.find((e=>e.name===a))??null}const r=Object.keys(e);return Object.fromEntries(r.map((e=>[e,n(e)])))}},1116:(e,t,n)=>{"use strict";n.d(t,{V:()=>c,b:()=>l});var r=n(67294),a=n(902),o=n(85893);const i=Symbol("EmptyContext"),s=r.createContext(i);function l(e){let{children:t,name:n,items:a}=e;const i=(0,r.useMemo)((()=>n&&a?{name:n,items:a}:null),[n,a]);return(0,o.jsx)(s.Provider,{value:i,children:t})}function c(){const e=(0,r.useContext)(s);if(e===i)throw new a.i6("DocsSidebarProvider");return e}},74477:(e,t,n)=>{"use strict";n.d(t,{E:()=>l,q:()=>s});var r=n(67294),a=n(902),o=n(85893);const i=r.createContext(null);function s(e){let{children:t,version:n}=e;return(0,o.jsx)(i.Provider,{value:n,children:t})}function l(){const e=(0,r.useContext)(i);if(null===e)throw new a.i6("DocsVersionProvider");return e}},93163:(e,t,n)=>{"use strict";n.d(t,{M:()=>p,e:()=>f});var r=n(67294),a=n(13102),o=n(87524),i=n(91980),s=n(86668),l=n(902),c=n(85893);const u=r.createContext(void 0);function d(){const e=function(){const e=(0,a.HY)(),{items:t}=(0,s.L)().navbar;return 0===t.length&&!e.component}(),t=(0,o.i)(),n=!e&&"mobile"===t,[l,c]=(0,r.useState)(!1);(0,i.Rb)((()=>{if(l)return c(!1),!1}));const u=(0,r.useCallback)((()=>{c((e=>!e))}),[]);return(0,r.useEffect)((()=>{"desktop"===t&&c(!1)}),[t]),(0,r.useMemo)((()=>({disabled:e,shouldRender:n,toggle:u,shown:l})),[e,n,u,l])}function p(e){let{children:t}=e;const n=d();return(0,c.jsx)(u.Provider,{value:n,children:t})}function f(){const e=r.useContext(u);if(void 0===e)throw new l.i6("NavbarMobileSidebarProvider");return e}},13102:(e,t,n)=>{"use strict";n.d(t,{HY:()=>l,Zo:()=>c,n2:()=>s});var r=n(67294),a=n(902),o=n(85893);const i=r.createContext(null);function s(e){let{children:t}=e;const n=(0,r.useState)({component:null,props:null});return(0,o.jsx)(i.Provider,{value:n,children:t})}function l(){const e=(0,r.useContext)(i);if(!e)throw new a.i6("NavbarSecondaryMenuContentProvider");return e[0]}function c(e){let{component:t,props:n}=e;const o=(0,r.useContext)(i);if(!o)throw new a.i6("NavbarSecondaryMenuContentProvider");const[,s]=o,l=(0,a.Ql)(n);return(0,r.useEffect)((()=>{s({component:t,props:l})}),[s,t,l]),(0,r.useEffect)((()=>()=>s({component:null,props:null})),[s]),null}},19727:(e,t,n)=>{"use strict";n.d(t,{h:()=>a,t:()=>o});var r=n(67294);const a="navigation-with-keyboard";function o(){(0,r.useEffect)((()=>{function e(e){"keydown"===e.type&&"Tab"===e.key&&document.body.classList.add(a),"mousedown"===e.type&&document.body.classList.remove(a)}return document.addEventListener("keydown",e),document.addEventListener("mousedown",e),()=>{document.body.classList.remove(a),document.removeEventListener("keydown",e),document.removeEventListener("mousedown",e)}}),[])}},66177:(e,t,n)=>{"use strict";n.d(t,{K:()=>s,M:()=>l});var r=n(67294),a=n(52263),o=n(91980);const i="q";function s(){return(0,o.Nc)(i)}function l(){const{siteConfig:{baseUrl:e,themeConfig:t}}=(0,a.Z)(),{algolia:{searchPagePath:n}}=t;return(0,r.useCallback)((t=>`${e}${n}?${i}=${encodeURIComponent(t)}`),[e,n])}},87524:(e,t,n)=>{"use strict";n.d(t,{i:()=>s});var r=n(67294),a=n(10412);const o={desktop:"desktop",mobile:"mobile",ssr:"ssr"},i=996;function s(e){let{desktopBreakpoint:t=i}=void 0===e?{}:e;const[n,s]=(0,r.useState)((()=>"ssr"));return(0,r.useEffect)((()=>{function e(){s(function(e){if(!a.Z.canUseDOM)throw new Error("getWindowSize() should only be called after React hydration");return window.innerWidth>e?o.desktop:o.mobile}(t))}return e(),window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e)}}),[t]),n}},35281:(e,t,n)=>{"use strict";n.d(t,{k:()=>r});const r={page:{blogListPage:"blog-list-page",blogPostPage:"blog-post-page",blogTagsListPage:"blog-tags-list-page",blogTagPostListPage:"blog-tags-post-list-page",docsDocPage:"docs-doc-page",docsTagsListPage:"docs-tags-list-page",docsTagDocListPage:"docs-tags-doc-list-page",mdxPage:"mdx-page"},wrapper:{main:"main-wrapper",blogPages:"blog-wrapper",docsPages:"docs-wrapper",mdxPages:"mdx-wrapper"},common:{editThisPage:"theme-edit-this-page",lastUpdated:"theme-last-updated",backToTopButton:"theme-back-to-top-button",codeBlock:"theme-code-block",admonition:"theme-admonition",unlistedBanner:"theme-unlisted-banner",admonitionType:e=>`theme-admonition-${e}`},layout:{},docs:{docVersionBanner:"theme-doc-version-banner",docVersionBadge:"theme-doc-version-badge",docBreadcrumbs:"theme-doc-breadcrumbs",docMarkdown:"theme-doc-markdown",docTocMobile:"theme-doc-toc-mobile",docTocDesktop:"theme-doc-toc-desktop",docFooter:"theme-doc-footer",docFooterTagsRow:"theme-doc-footer-tags-row",docFooterEditMetaRow:"theme-doc-footer-edit-meta-row",docSidebarContainer:"theme-doc-sidebar-container",docSidebarMenu:"theme-doc-sidebar-menu",docSidebarItemCategory:"theme-doc-sidebar-item-category",docSidebarItemLink:"theme-doc-sidebar-item-link",docSidebarItemCategoryLevel:e=>`theme-doc-sidebar-item-category-level-${e}`,docSidebarItemLinkLevel:e=>`theme-doc-sidebar-item-link-level-${e}`},blog:{}}},91442:(e,t,n)=>{"use strict";function r(){return window.matchMedia("(prefers-reduced-motion: reduce)").matches}n.d(t,{n:()=>r})},53438:(e,t,n)=>{"use strict";n.d(t,{LM:()=>g,MN:()=>T,SN:()=>C,_F:()=>y,cE:()=>p,f:()=>w,jA:()=>h,lO:()=>S,oz:()=>_,s1:()=>x,vY:()=>E,xz:()=>f});var r=n(67294),a=n(16550),o=n(18790),i=n(80143),s=n(60373),l=n(74477),c=n(1116),u=n(67392),d=n(48596);const p=!!i._r;function f(e){const t=(0,l.E)();if(!e)return;const n=t.docs[e];if(!n)throw new Error(`no version doc found by id=${e}`);return n}function g(e){return"link"!==e.type||e.unlisted?"category"===e.type?function(e){if(e.href&&!e.linkUnlisted)return e.href;for(const t of e.items){const e=g(t);if(e)return e}}(e):void 0:e.href}function h(){const{pathname:e}=(0,a.TH)(),t=(0,c.V)();if(!t)throw new Error("Unexpected: cant find current sidebar in context");const n=k({sidebarItems:t.items,pathname:e,onlyCategories:!0}).slice(-1)[0];if(!n)throw new Error(`${e} is not associated with a category. useCurrentSidebarCategory() should only be used on category index pages.`);return n}const m=(e,t)=>void 0!==e&&(0,d.Mg)(e,t),b=(e,t)=>e.some((e=>y(e,t)));function y(e,t){return"link"===e.type?m(e.href,t):"category"===e.type&&(m(e.href,t)||b(e.items,t))}function v(e,t){switch(e.type){case"category":return y(e,t)||e.items.some((e=>v(e,t)));case"link":return!e.unlisted||y(e,t);default:return!0}}function w(e,t){return(0,r.useMemo)((()=>e.filter((e=>v(e,t)))),[e,t])}function k(e){let{sidebarItems:t,pathname:n,onlyCategories:r=!1}=e;const a=[];return function e(t){for(const o of t)if("category"===o.type&&((0,d.Mg)(o.href,n)||e(o.items))||"link"===o.type&&(0,d.Mg)(o.href,n)){return r&&"category"!==o.type||a.unshift(o),!0}return!1}(t),a}function x(){const e=(0,c.V)(),{pathname:t}=(0,a.TH)(),n=(0,i.gA)()?.pluginData.breadcrumbs;return!1!==n&&e?k({sidebarItems:e.items,pathname:t}):null}function S(e){const{activeVersion:t}=(0,i.Iw)(e),{preferredVersion:n}=(0,s.J)(e),a=(0,i.yW)(e);return(0,r.useMemo)((()=>(0,u.j)([t,n,a].filter(Boolean))),[t,n,a])}function _(e,t){const n=S(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.sidebars?Object.entries(e.sidebars):[])),r=t.find((t=>t[0]===e));if(!r)throw new Error(`Can't find any sidebar with id "${e}" in version${n.length>1?"s":""} ${n.map((e=>e.name)).join(", ")}".\nAvailable sidebar ids are:\n- ${t.map((e=>e[0])).join("\n- ")}`);return r[1]}),[e,n])}function E(e,t){const n=S(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.docs)),r=t.find((t=>t.id===e));if(!r){if(n.flatMap((e=>e.draftIds)).includes(e))return null;throw new Error(`Couldn't find any doc with id "${e}" in version${n.length>1?"s":""} "${n.map((e=>e.name)).join(", ")}".\nAvailable doc ids are:\n- ${(0,u.j)(t.map((e=>e.id))).join("\n- ")}`)}return r}),[e,n])}function C(e){let{route:t}=e;const n=(0,a.TH)(),r=(0,l.E)(),i=t.routes,s=i.find((e=>(0,a.LX)(n.pathname,e)));if(!s)return null;const c=s.sidebar,u=c?r.docsSidebars[c]:void 0;return{docElement:(0,o.H)(i),sidebarName:c,sidebarItems:u}}function T(e){return e.filter((e=>!("category"===e.type||"link"===e.type)||!!g(e)))}},69690:(e,t,n)=>{"use strict";n.d(t,{aG:()=>u,Ac:()=>c,Cw:()=>l,QW:()=>d});var r=n(67294),a=n(95999),o=n(18780);const i={errorBoundaryError:"errorBoundaryError_a6uf",errorBoundaryFallback:"errorBoundaryFallback_VBag"};var s=n(85893);function l(e){return(0,s.jsx)("button",{type:"button",...e,children:(0,s.jsx)(a.Z,{id:"theme.ErrorPageContent.tryAgain",description:"The label of the button to try again rendering when the React error boundary captures an error",children:"Try again"})})}function c(e){let{error:t,tryAgain:n}=e;return(0,s.jsxs)("div",{className:i.errorBoundaryFallback,children:[(0,s.jsx)("p",{children:t.message}),(0,s.jsx)(l,{onClick:n})]})}function u(e){let{error:t}=e;const n=(0,o.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return(0,s.jsx)("p",{className:i.errorBoundaryError,children:n})}class d extends r.Component{componentDidCatch(e,t){throw this.props.onError(e,t)}render(){return this.props.children}}},82128:(e,t,n)=>{"use strict";n.d(t,{p:()=>a});var r=n(52263);function a(e){const{siteConfig:t}=(0,r.Z)(),{title:n,titleDelimiter:a}=t;return e?.trim().length?`${e.trim()} ${a} ${n}`:n}},91980:(e,t,n)=>{"use strict";n.d(t,{Nc:()=>l,Rb:()=>i,_X:()=>s});var r=n(67294),a=n(16550),o=n(902);function i(e){!function(e){const t=(0,a.k6)(),n=(0,o.zX)(e);(0,r.useEffect)((()=>t.block(((e,t)=>n(e,t)))),[t,n])}(((t,n)=>{if("POP"===n)return e(t,n)}))}function s(e){return function(e){const t=(0,a.k6)();return(0,r.useSyncExternalStore)(t.listen,(()=>e(t)),(()=>e(t)))}((t=>null===e?null:new URLSearchParams(t.location.search).get(e)))}function l(e){const t=s(e)??"",n=function(){const e=(0,a.k6)();return(0,r.useCallback)(((t,n,r)=>{const a=new URLSearchParams(e.location.search);n?a.set(t,n):a.delete(t),(r?.push?e.push:e.replace)({search:a.toString()})}),[e])}();return[t,(0,r.useCallback)(((t,r)=>{n(e,t,r)}),[n,e])]}},67392:(e,t,n)=>{"use strict";function r(e,t){return void 0===t&&(t=(e,t)=>e===t),e.filter(((n,r)=>e.findIndex((e=>t(e,n)))!==r))}function a(e){return Array.from(new Set(e))}n.d(t,{j:()=>a,l:()=>r})},10833:(e,t,n)=>{"use strict";n.d(t,{FG:()=>f,d:()=>d,VC:()=>g});var r=n(67294),a=n(788),o=n(35742),i=n(30226);function s(){const e=r.useContext(i._);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}var l=n(44996),c=n(82128),u=n(85893);function d(e){let{title:t,description:n,keywords:r,image:a,children:i}=e;const s=(0,c.p)(t),{withBaseUrl:d}=(0,l.C)(),p=a?d(a,{absolute:!0}):void 0;return(0,u.jsxs)(o.Z,{children:[t&&(0,u.jsx)("title",{children:s}),t&&(0,u.jsx)("meta",{property:"og:title",content:s}),n&&(0,u.jsx)("meta",{name:"description",content:n}),n&&(0,u.jsx)("meta",{property:"og:description",content:n}),r&&(0,u.jsx)("meta",{name:"keywords",content:Array.isArray(r)?r.join(","):r}),p&&(0,u.jsx)("meta",{property:"og:image",content:p}),p&&(0,u.jsx)("meta",{name:"twitter:image",content:p}),i]})}const p=r.createContext(void 0);function f(e){let{className:t,children:n}=e;const i=r.useContext(p),s=(0,a.Z)(i,t);return(0,u.jsxs)(p.Provider,{value:s,children:[(0,u.jsx)(o.Z,{children:(0,u.jsx)("html",{className:s})}),n]})}function g(e){let{children:t}=e;const n=s(),r=`plugin-${n.plugin.name.replace(/docusaurus-(?:plugin|theme)-(?:content-)?/gi,"")}`;const o=`plugin-id-${n.plugin.id}`;return(0,u.jsx)(f,{className:(0,a.Z)(r,o),children:t})}},902:(e,t,n)=>{"use strict";n.d(t,{D9:()=>s,Qc:()=>u,Ql:()=>c,i6:()=>l,zX:()=>i});var r=n(67294),a=n(20469),o=n(85893);function i(e){const t=(0,r.useRef)(e);return(0,a.Z)((()=>{t.current=e}),[e]),(0,r.useCallback)((function(){return t.current(...arguments)}),[])}function s(e){const t=(0,r.useRef)();return(0,a.Z)((()=>{t.current=e})),t.current}class l extends Error{constructor(e,t){super(),this.name="ReactContextError",this.message=`Hook ${this.stack?.split("\n")[1]?.match(/at (?:\w+\.)?(?\w+)/)?.groups.name??""} is called outside the <${e}>. ${t??""}`}}function c(e){const t=Object.entries(e);return t.sort(((e,t)=>e[0].localeCompare(t[0]))),(0,r.useMemo)((()=>e),t.flat())}function u(e){return t=>{let{children:n}=t;return(0,o.jsx)(o.Fragment,{children:e.reduceRight(((e,t)=>(0,o.jsx)(t,{children:e})),n)})}}},98022:(e,t,n)=>{"use strict";function r(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}n.d(t,{F:()=>r})},48596:(e,t,n)=>{"use strict";n.d(t,{Mg:()=>i,Ns:()=>s});var r=n(67294),a=n(723),o=n(52263);function i(e,t){const n=e=>(!e||e.endsWith("/")?e:`${e}/`)?.toLowerCase();return n(e)===n(t)}function s(){const{baseUrl:e}=(0,o.Z)().siteConfig;return(0,r.useMemo)((()=>function(e){let{baseUrl:t,routes:n}=e;function r(e){return e.path===t&&!0===e.exact}function a(e){return e.path===t&&!e.exact}return function e(t){if(0===t.length)return;return t.find(r)||e(t.filter(a).flatMap((e=>e.routes??[])))}(n)}({routes:a.Z,baseUrl:e})),[e])}},12466:(e,t,n)=>{"use strict";n.d(t,{Ct:()=>h,OC:()=>u,RF:()=>f,o5:()=>g});var r=n(67294),a=n(10412),o=n(72389),i=n(20469),s=n(902),l=n(85893);const c=r.createContext(void 0);function u(e){let{children:t}=e;const n=function(){const e=(0,r.useRef)(!0);return(0,r.useMemo)((()=>({scrollEventsEnabledRef:e,enableScrollEvents:()=>{e.current=!0},disableScrollEvents:()=>{e.current=!1}})),[])}();return(0,l.jsx)(c.Provider,{value:n,children:t})}function d(){const e=(0,r.useContext)(c);if(null==e)throw new s.i6("ScrollControllerProvider");return e}const p=()=>a.Z.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null;function f(e,t){void 0===t&&(t=[]);const{scrollEventsEnabledRef:n}=d(),a=(0,r.useRef)(p()),o=(0,s.zX)(e);(0,r.useEffect)((()=>{const e=()=>{if(!n.current)return;const e=p();o(e,a.current),a.current=e},t={passive:!0};return e(),window.addEventListener("scroll",e,t),()=>window.removeEventListener("scroll",e,t)}),[o,n,...t])}function g(){const e=d(),t=function(){const e=(0,r.useRef)({elem:null,top:0}),t=(0,r.useCallback)((t=>{e.current={elem:t,top:t.getBoundingClientRect().top}}),[]),n=(0,r.useCallback)((()=>{const{current:{elem:t,top:n}}=e;if(!t)return{restored:!1};const r=t.getBoundingClientRect().top-n;return r&&window.scrollBy({left:0,top:r}),e.current={elem:null,top:0},{restored:0!==r}}),[]);return(0,r.useMemo)((()=>({save:t,restore:n})),[n,t])}(),n=(0,r.useRef)(void 0),a=(0,r.useCallback)((r=>{t.save(r),e.disableScrollEvents(),n.current=()=>{const{restored:r}=t.restore();if(n.current=void 0,r){const t=()=>{e.enableScrollEvents(),window.removeEventListener("scroll",t)};window.addEventListener("scroll",t)}else e.enableScrollEvents()}}),[e,t]);return(0,i.Z)((()=>{queueMicrotask((()=>n.current?.()))})),{blockElementScrollPositionUntilNextRender:a}}function h(){const e=(0,r.useRef)(null),t=(0,o.Z)()&&"smooth"===getComputedStyle(document.documentElement).scrollBehavior;return{startScroll:n=>{e.current=t?function(e){return window.scrollTo({top:e,behavior:"smooth"}),()=>{}}(n):function(e){let t=null;const n=document.documentElement.scrollTop>e;return function r(){const a=document.documentElement.scrollTop;(n&&a>e||!n&&at&&cancelAnimationFrame(t)}(n)},cancelScroll:()=>e.current?.()}}},43320:(e,t,n)=>{"use strict";n.d(t,{HX:()=>i,_q:()=>l,os:()=>s});var r=n(80143),a=n(52263),o=n(60373);const i="default";function s(e,t){return`docs-${e}-${t}`}function l(){const{i18n:e}=(0,a.Z)(),t=(0,r._r)(),n=(0,r.WS)(),l=(0,o.Oh)();const c=[i,...Object.keys(t).map((function(e){const r=n?.activePlugin.pluginId===e?n.activeVersion:void 0,a=l[e],o=t[e].versions.find((e=>e.isLast));return s(e,(r??a??o).name)}))];return{locale:e.currentLocale,tags:c}}},50012:(e,t,n)=>{"use strict";n.d(t,{Nk:()=>u,WA:()=>c});var r=n(67294);const a="localStorage";function o(e){let{key:t,oldValue:n,newValue:r,storage:a}=e;if(n===r)return;const o=document.createEvent("StorageEvent");o.initStorageEvent("storage",!1,!1,t,n,r,window.location.href,a),window.dispatchEvent(o)}function i(e){if(void 0===e&&(e=a),"undefined"==typeof window)throw new Error("Browser storage is not available on Node.js/Docusaurus SSR process.");if("none"===e)return null;try{return window[e]}catch(n){return t=n,s||(console.warn("Docusaurus browser storage is not available.\nPossible reasons: running Docusaurus in an iframe, in an incognito browser session, or using too strict browser privacy settings.",t),s=!0),null}var t}let s=!1;const l={get:()=>null,set:()=>{},del:()=>{},listen:()=>()=>{}};function c(e,t){if("undefined"==typeof window)return function(e){function t(){throw new Error(`Illegal storage API usage for storage key "${e}".\nDocusaurus storage APIs are not supposed to be called on the server-rendering process.\nPlease only call storage APIs in effects and event handlers.`)}return{get:t,set:t,del:t,listen:t}}(e);const n=i(t?.persistence);return null===n?l:{get:()=>{try{return n.getItem(e)}catch(t){return console.error(`Docusaurus storage error, can't get key=${e}`,t),null}},set:t=>{try{const r=n.getItem(e);n.setItem(e,t),o({key:e,oldValue:r,newValue:t,storage:n})}catch(r){console.error(`Docusaurus storage error, can't set ${e}=${t}`,r)}},del:()=>{try{const t=n.getItem(e);n.removeItem(e),o({key:e,oldValue:t,newValue:null,storage:n})}catch(t){console.error(`Docusaurus storage error, can't delete key=${e}`,t)}},listen:t=>{try{const r=r=>{r.storageArea===n&&r.key===e&&t(r)};return window.addEventListener("storage",r),()=>window.removeEventListener("storage",r)}catch(r){return console.error(`Docusaurus storage error, can't listen for changes of key=${e}`,r),()=>{}}}}}function u(e,t){const n=(0,r.useRef)((()=>null===e?l:c(e,t))).current(),a=(0,r.useCallback)((e=>"undefined"==typeof window?()=>{}:n.listen(e)),[n]);return[(0,r.useSyncExternalStore)(a,(()=>"undefined"==typeof window?null:n.get()),(()=>null)),n]}},94711:(e,t,n)=>{"use strict";n.d(t,{l:()=>i});var r=n(52263),a=n(16550),o=n(18780);function i(){const{siteConfig:{baseUrl:e,url:t,trailingSlash:n},i18n:{defaultLocale:i,currentLocale:s}}=(0,r.Z)(),{pathname:l}=(0,a.TH)(),c=(0,o.applyTrailingSlash)(l,{trailingSlash:n,baseUrl:e}),u=s===i?e:e.replace(`/${s}/`,"/"),d=c.replace(e,"");return{createUrl:function(e){let{locale:n,fullyQualified:r}=e;return`${r?t:""}${function(e){return e===i?`${u}`:`${u}${e}/`}(n)}${d}`}}}},85936:(e,t,n)=>{"use strict";n.d(t,{S:()=>i});var r=n(67294),a=n(16550),o=n(902);function i(e){const t=(0,a.TH)(),n=(0,o.D9)(t),i=(0,o.zX)(e);(0,r.useEffect)((()=>{n&&t!==n&&i({location:t,previousLocation:n})}),[i,t,n])}},86668:(e,t,n)=>{"use strict";n.d(t,{L:()=>a});var r=n(52263);function a(){return(0,r.Z)().siteConfig.themeConfig}},6278:(e,t,n)=>{"use strict";n.d(t,{L:()=>a});var r=n(52263);function a(){const{siteConfig:{themeConfig:e}}=(0,r.Z)();return e}},239:(e,t,n)=>{"use strict";n.d(t,{l:()=>s});var r=n(67294),a=n(98022),o=n(44996),i=n(6278);function s(){const{withBaseUrl:e}=(0,o.C)(),{algolia:{externalUrlRegex:t,replaceSearchResultPathname:n}}=(0,i.L)();return(0,r.useCallback)((r=>{const o=new URL(r);if((0,a.F)(t,o.href))return r;const i=`${o.pathname+o.hash}`;return e(function(e,t){return t?e.replaceAll(new RegExp(t.from,"g"),t.to):e}(i,n))}),[e,t,n])}},8802:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){const{trailingSlash:n,baseUrl:r}=t;if(e.startsWith("#"))return e;if(void 0===n)return e;const[a]=e.split(/[#?]/),o="/"===a||a===r?a:(i=a,n?function(e){return e.endsWith("/")?e:`${e}/`}(i):function(e){return e.endsWith("/")?e.slice(0,-1):e}(i));var i;return e.replace(a,o)}},54143:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=void 0,t.getErrorCausalChain=function e(t){return t.cause?[t,...e(t.cause)]:[t]}},18780:function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=t.applyTrailingSlash=t.blogPostContainerID=void 0,t.blogPostContainerID="__blog-post-container";var a=n(8802);Object.defineProperty(t,"applyTrailingSlash",{enumerable:!0,get:function(){return r(a).default}});var o=n(54143);Object.defineProperty(t,"getErrorCausalChain",{enumerable:!0,get:function(){return o.getErrorCausalChain}})},99318:(e,t,n)=>{"use strict";n.d(t,{lX:()=>w,q_:()=>C,ob:()=>f,PP:()=>A,Ep:()=>p});var r=n(87462);function a(e){return"/"===e.charAt(0)}function o(e,t){for(var n=t,r=n+1,a=e.length;r=0;p--){var f=i[p];"."===f?o(i,p):".."===f?(o(i,p),d++):d&&(o(i,p),d--)}if(!c)for(;d--;d)i.unshift("..");!c||""===i[0]||i[0]&&a(i[0])||i.unshift("");var g=i.join("/");return n&&"/"!==g.substr(-1)&&(g+="/"),g};var s=n(38776);function l(e){return"/"===e.charAt(0)?e:"/"+e}function c(e){return"/"===e.charAt(0)?e.substr(1):e}function u(e,t){return function(e,t){return 0===e.toLowerCase().indexOf(t.toLowerCase())&&-1!=="/?#".indexOf(e.charAt(t.length))}(e,t)?e.substr(t.length):e}function d(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function p(e){var t=e.pathname,n=e.search,r=e.hash,a=t||"/";return n&&"?"!==n&&(a+="?"===n.charAt(0)?n:"?"+n),r&&"#"!==r&&(a+="#"===r.charAt(0)?r:"#"+r),a}function f(e,t,n,a){var o;"string"==typeof e?(o=function(e){var t=e||"/",n="",r="",a=t.indexOf("#");-1!==a&&(r=t.substr(a),t=t.substr(0,a));var o=t.indexOf("?");return-1!==o&&(n=t.substr(o),t=t.substr(0,o)),{pathname:t,search:"?"===n?"":n,hash:"#"===r?"":r}}(e),o.state=t):(void 0===(o=(0,r.Z)({},e)).pathname&&(o.pathname=""),o.search?"?"!==o.search.charAt(0)&&(o.search="?"+o.search):o.search="",o.hash?"#"!==o.hash.charAt(0)&&(o.hash="#"+o.hash):o.hash="",void 0!==t&&void 0===o.state&&(o.state=t));try{o.pathname=decodeURI(o.pathname)}catch(s){throw s instanceof URIError?new URIError('Pathname "'+o.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):s}return n&&(o.key=n),a?o.pathname?"/"!==o.pathname.charAt(0)&&(o.pathname=i(o.pathname,a.pathname)):o.pathname=a.pathname:o.pathname||(o.pathname="/"),o}function g(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,r,a){if(null!=e){var o="function"==typeof e?e(t,n):e;"string"==typeof o?"function"==typeof r?r(o,a):a(!0):a(!1!==o)}else a(!0)},appendListener:function(e){var n=!0;function r(){n&&e.apply(void 0,arguments)}return t.push(r),function(){n=!1,t=t.filter((function(e){return e!==r}))}},notifyListeners:function(){for(var e=arguments.length,n=new Array(e),r=0;rt?n.splice(t,n.length-t,a):n.push(a),d({action:r,location:a,index:t,entries:n})}}))},replace:function(e,t){var r="REPLACE",a=f(e,t,h(),w.location);u.confirmTransitionTo(a,r,n,(function(e){e&&(w.entries[w.index]=a,d({action:r,location:a}))}))},go:v,goBack:function(){v(-1)},goForward:function(){v(1)},canGo:function(e){var t=w.index+e;return t>=0&&t{"use strict";var r=n(59864),a={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},o={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},i={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},s={};function l(e){return r.isMemo(e)?i:s[e.$$typeof]||a}s[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},s[r.Memo]=i;var c=Object.defineProperty,u=Object.getOwnPropertyNames,d=Object.getOwnPropertySymbols,p=Object.getOwnPropertyDescriptor,f=Object.getPrototypeOf,g=Object.prototype;e.exports=function e(t,n,r){if("string"!=typeof n){if(g){var a=f(n);a&&a!==g&&e(t,a,r)}var i=u(n);d&&(i=i.concat(d(n)));for(var s=l(t),h=l(n),m=0;m{"use strict";e.exports=function(e,t,n,r,a,o,i,s){if(!e){var l;if(void 0===t)l=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var c=[n,r,a,o,i,s],u=0;(l=new Error(t.replace(/%s/g,(function(){return c[u++]})))).name="Invariant Violation"}throw l.framesToPop=1,l}}},5826:e=>{e.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},7439:(e,t,n)=>{"use strict";n.r(t)},32497:(e,t,n)=>{"use strict";n.r(t)},57800:(e,t,n)=>{"use strict";n.r(t)},74865:function(e,t,n){var r,a;r=function(){var e,t,n={version:"0.2.0"},r=n.settings={minimum:.08,easing:"ease",positionUsing:"",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,showSpinner:!0,barSelector:'[role="bar"]',spinnerSelector:'[role="spinner"]',parent:"body",template:'
    '};function a(e,t,n){return en?n:e}function o(e){return 100*(-1+e)}function i(e,t,n){var a;return(a="translate3d"===r.positionUsing?{transform:"translate3d("+o(e)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+o(e)+"%,0)"}:{"margin-left":o(e)+"%"}).transition="all "+t+"ms "+n,a}n.configure=function(e){var t,n;for(t in e)void 0!==(n=e[t])&&e.hasOwnProperty(t)&&(r[t]=n);return this},n.status=null,n.set=function(e){var t=n.isStarted();e=a(e,r.minimum,1),n.status=1===e?null:e;var o=n.render(!t),c=o.querySelector(r.barSelector),u=r.speed,d=r.easing;return o.offsetWidth,s((function(t){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),l(c,i(e,u,d)),1===e?(l(o,{transition:"none",opacity:1}),o.offsetWidth,setTimeout((function(){l(o,{transition:"all "+u+"ms linear",opacity:0}),setTimeout((function(){n.remove(),t()}),u)}),u)):setTimeout(t,u)})),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var e=function(){setTimeout((function(){n.status&&(n.trickle(),e())}),r.trickleSpeed)};return r.trickle&&e(),this},n.done=function(e){return e||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(e){var t=n.status;return t?("number"!=typeof e&&(e=(1-t)*a(Math.random()*t,.1,.95)),t=a(t+e,0,.994),n.set(t)):n.start()},n.trickle=function(){return n.inc(Math.random()*r.trickleRate)},e=0,t=0,n.promise=function(r){return r&&"resolved"!==r.state()?(0===t&&n.start(),e++,t++,r.always((function(){0==--t?(e=0,n.done()):n.set((e-t)/e)})),this):this},n.render=function(e){if(n.isRendered())return document.getElementById("nprogress");u(document.documentElement,"nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=r.template;var a,i=t.querySelector(r.barSelector),s=e?"-100":o(n.status||0),c=document.querySelector(r.parent);return l(i,{transition:"all 0 linear",transform:"translate3d("+s+"%,0,0)"}),r.showSpinner||(a=t.querySelector(r.spinnerSelector))&&f(a),c!=document.body&&u(c,"nprogress-custom-parent"),c.appendChild(t),t},n.remove=function(){d(document.documentElement,"nprogress-busy"),d(document.querySelector(r.parent),"nprogress-custom-parent");var e=document.getElementById("nprogress");e&&f(e)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var e=document.body.style,t="WebkitTransform"in e?"Webkit":"MozTransform"in e?"Moz":"msTransform"in e?"ms":"OTransform"in e?"O":"";return t+"Perspective"in e?"translate3d":t+"Transform"in e?"translate":"margin"};var s=function(){var e=[];function t(){var n=e.shift();n&&n(t)}return function(n){e.push(n),1==e.length&&t()}}(),l=function(){var e=["Webkit","O","Moz","ms"],t={};function n(e){return e.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(e,t){return t.toUpperCase()}))}function r(t){var n=document.body.style;if(t in n)return t;for(var r,a=e.length,o=t.charAt(0).toUpperCase()+t.slice(1);a--;)if((r=e[a]+o)in n)return r;return t}function a(e){return e=n(e),t[e]||(t[e]=r(e))}function o(e,t,n){t=a(t),e.style[t]=n}return function(e,t){var n,r,a=arguments;if(2==a.length)for(n in t)void 0!==(r=t[n])&&t.hasOwnProperty(n)&&o(e,n,r);else o(e,a[1],a[2])}}();function c(e,t){return("string"==typeof e?e:p(e)).indexOf(" "+t+" ")>=0}function u(e,t){var n=p(e),r=n+t;c(n,t)||(e.className=r.substring(1))}function d(e,t){var n,r=p(e);c(e,t)&&(n=r.replace(" "+t+" "," "),e.className=n.substring(1,n.length-1))}function p(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function f(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return n},void 0===(a="function"==typeof r?r.call(t,n,t,e):r)||(e.exports=a)},85795:()=>{Prism.languages.ada={comment:/--.*/,string:/"(?:""|[^"\r\f\n])*"/,number:[{pattern:/\b\d(?:_?\d)*#[\dA-F](?:_?[\dA-F])*(?:\.[\dA-F](?:_?[\dA-F])*)?#(?:E[+-]?\d(?:_?\d)*)?/i},{pattern:/\b\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:E[+-]?\d(?:_?\d)*)?\b/i}],attribute:{pattern:/\b'\w+/,alias:"attr-name"},keyword:/\b(?:abort|abs|abstract|accept|access|aliased|all|and|array|at|begin|body|case|constant|declare|delay|delta|digits|do|else|elsif|end|entry|exception|exit|for|function|generic|goto|if|in|interface|is|limited|loop|mod|new|not|null|of|or|others|out|overriding|package|pragma|private|procedure|protected|raise|range|record|rem|renames|requeue|return|reverse|select|separate|some|subtype|synchronized|tagged|task|terminate|then|type|until|use|when|while|with|xor)\b/i,boolean:/\b(?:false|true)\b/i,operator:/<[=>]?|>=?|=>?|:=|\/=?|\*\*?|[&+-]/,punctuation:/\.\.?|[,;():]/,char:/'.'/,variable:/\b[a-z](?:\w)*\b/i}},57874:()=>{!function(e){var t="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",n={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},r={bash:n,environment:{pattern:RegExp("\\$"+t),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+t),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?:\.\w+)*(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},parameter:{pattern:/(^|\s)-{1,2}(?:\w+:[+-]?)?\w+(?:\.\w+)*(?=[=\s]|$)/,alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:r},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:n}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:r},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:r.entity}}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:r.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cargo|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|java|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|sysctl|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},n.inside=e.languages.bash;for(var a=["comment","function-name","for-or-select","assign-left","parameter","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],o=r.variable[1].inside,i=0;i{!function(e){function t(e,t){return e.replace(/<<(\d+)>>/g,(function(e,n){return"(?:"+t[+n]+")"}))}function n(e,n,r){return RegExp(t(e,n),r||"")}function r(e,t){for(var n=0;n>/g,(function(){return"(?:"+e+")"}));return e.replace(/<>/g,"[^\\s\\S]")}var a="bool byte char decimal double dynamic float int long object sbyte short string uint ulong ushort var void",o="class enum interface record struct",i="add alias and ascending async await by descending from(?=\\s*(?:\\w|$)) get global group into init(?=\\s*;) join let nameof not notnull on or orderby partial remove select set unmanaged value when where with(?=\\s*{)",s="abstract as base break case catch checked const continue default delegate do else event explicit extern finally fixed for foreach goto if implicit in internal is lock namespace new null operator out override params private protected public readonly ref return sealed sizeof stackalloc static switch this throw try typeof unchecked unsafe using virtual volatile while yield";function l(e){return"\\b(?:"+e.trim().replace(/ /g,"|")+")\\b"}var c=l(o),u=RegExp(l(a+" "+o+" "+i+" "+s)),d=l(o+" "+i+" "+s),p=l(a+" "+o+" "+s),f=r(/<(?:[^<>;=+\-*/%&|^]|<>)*>/.source,2),g=r(/\((?:[^()]|<>)*\)/.source,2),h=/@?\b[A-Za-z_]\w*\b/.source,m=t(/<<0>>(?:\s*<<1>>)?/.source,[h,f]),b=t(/(?!<<0>>)<<1>>(?:\s*\.\s*<<1>>)*/.source,[d,m]),y=/\[\s*(?:,\s*)*\]/.source,v=t(/<<0>>(?:\s*(?:\?\s*)?<<1>>)*(?:\s*\?)?/.source,[b,y]),w=t(/[^,()<>[\];=+\-*/%&|^]|<<0>>|<<1>>|<<2>>/.source,[f,g,y]),k=t(/\(<<0>>+(?:,<<0>>+)+\)/.source,[w]),x=t(/(?:<<0>>|<<1>>)(?:\s*(?:\?\s*)?<<2>>)*(?:\s*\?)?/.source,[k,b,y]),S={keyword:u,punctuation:/[<>()?,.:[\]]/},_=/'(?:[^\r\n'\\]|\\.|\\[Uux][\da-fA-F]{1,8})'/.source,E=/"(?:\\.|[^\\"\r\n])*"/.source,C=/@"(?:""|\\[\s\S]|[^\\"])*"(?!")/.source;e.languages.csharp=e.languages.extend("clike",{string:[{pattern:n(/(^|[^$\\])<<0>>/.source,[C]),lookbehind:!0,greedy:!0},{pattern:n(/(^|[^@$\\])<<0>>/.source,[E]),lookbehind:!0,greedy:!0}],"class-name":[{pattern:n(/(\busing\s+static\s+)<<0>>(?=\s*;)/.source,[b]),lookbehind:!0,inside:S},{pattern:n(/(\busing\s+<<0>>\s*=\s*)<<1>>(?=\s*;)/.source,[h,x]),lookbehind:!0,inside:S},{pattern:n(/(\busing\s+)<<0>>(?=\s*=)/.source,[h]),lookbehind:!0},{pattern:n(/(\b<<0>>\s+)<<1>>/.source,[c,m]),lookbehind:!0,inside:S},{pattern:n(/(\bcatch\s*\(\s*)<<0>>/.source,[b]),lookbehind:!0,inside:S},{pattern:n(/(\bwhere\s+)<<0>>/.source,[h]),lookbehind:!0},{pattern:n(/(\b(?:is(?:\s+not)?|as)\s+)<<0>>/.source,[v]),lookbehind:!0,inside:S},{pattern:n(/\b<<0>>(?=\s+(?!<<1>>|with\s*\{)<<2>>(?:\s*[=,;:{)\]]|\s+(?:in|when)\b))/.source,[x,p,h]),inside:S}],keyword:u,number:/(?:\b0(?:x[\da-f_]*[\da-f]|b[01_]*[01])|(?:\B\.\d+(?:_+\d+)*|\b\d+(?:_+\d+)*(?:\.\d+(?:_+\d+)*)?)(?:e[-+]?\d+(?:_+\d+)*)?)(?:[dflmu]|lu|ul)?\b/i,operator:/>>=?|<<=?|[-=]>|([-+&|])\1|~|\?\?=?|[-+*/%&|^!=<>]=?/,punctuation:/\?\.?|::|[{}[\];(),.:]/}),e.languages.insertBefore("csharp","number",{range:{pattern:/\.\./,alias:"operator"}}),e.languages.insertBefore("csharp","punctuation",{"named-parameter":{pattern:n(/([(,]\s*)<<0>>(?=\s*:)/.source,[h]),lookbehind:!0,alias:"punctuation"}}),e.languages.insertBefore("csharp","class-name",{namespace:{pattern:n(/(\b(?:namespace|using)\s+)<<0>>(?:\s*\.\s*<<0>>)*(?=\s*[;{])/.source,[h]),lookbehind:!0,inside:{punctuation:/\./}},"type-expression":{pattern:n(/(\b(?:default|sizeof|typeof)\s*\(\s*(?!\s))(?:[^()\s]|\s(?!\s)|<<0>>)*(?=\s*\))/.source,[g]),lookbehind:!0,alias:"class-name",inside:S},"return-type":{pattern:n(/<<0>>(?=\s+(?:<<1>>\s*(?:=>|[({]|\.\s*this\s*\[)|this\s*\[))/.source,[x,b]),inside:S,alias:"class-name"},"constructor-invocation":{pattern:n(/(\bnew\s+)<<0>>(?=\s*[[({])/.source,[x]),lookbehind:!0,inside:S,alias:"class-name"},"generic-method":{pattern:n(/<<0>>\s*<<1>>(?=\s*\()/.source,[h,f]),inside:{function:n(/^<<0>>/.source,[h]),generic:{pattern:RegExp(f),alias:"class-name",inside:S}}},"type-list":{pattern:n(/\b((?:<<0>>\s+<<1>>|record\s+<<1>>\s*<<5>>|where\s+<<2>>)\s*:\s*)(?:<<3>>|<<4>>|<<1>>\s*<<5>>|<<6>>)(?:\s*,\s*(?:<<3>>|<<4>>|<<6>>))*(?=\s*(?:where|[{;]|=>|$))/.source,[c,m,h,x,u.source,g,/\bnew\s*\(\s*\)/.source]),lookbehind:!0,inside:{"record-arguments":{pattern:n(/(^(?!new\s*\()<<0>>\s*)<<1>>/.source,[m,g]),lookbehind:!0,greedy:!0,inside:e.languages.csharp},keyword:u,"class-name":{pattern:RegExp(x),greedy:!0,inside:S},punctuation:/[,()]/}},preprocessor:{pattern:/(^[\t ]*)#.*/m,lookbehind:!0,alias:"property",inside:{directive:{pattern:/(#)\b(?:define|elif|else|endif|endregion|error|if|line|nullable|pragma|region|undef|warning)\b/,lookbehind:!0,alias:"keyword"}}}});var T=E+"|"+_,A=t(/\/(?![*/])|\/\/[^\r\n]*[\r\n]|\/\*(?:[^*]|\*(?!\/))*\*\/|<<0>>/.source,[T]),j=r(t(/[^"'/()]|<<0>>|\(<>*\)/.source,[A]),2),N=/\b(?:assembly|event|field|method|module|param|property|return|type)\b/.source,L=t(/<<0>>(?:\s*\(<<1>>*\))?/.source,[b,j]);e.languages.insertBefore("csharp","class-name",{attribute:{pattern:n(/((?:^|[^\s\w>)?])\s*\[\s*)(?:<<0>>\s*:\s*)?<<1>>(?:\s*,\s*<<1>>)*(?=\s*\])/.source,[N,L]),lookbehind:!0,greedy:!0,inside:{target:{pattern:n(/^<<0>>(?=\s*:)/.source,[N]),alias:"keyword"},"attribute-arguments":{pattern:n(/\(<<0>>*\)/.source,[j]),inside:e.languages.csharp},"class-name":{pattern:RegExp(b),inside:{punctuation:/\./}},punctuation:/[:,]/}}});var P=/:[^}\r\n]+/.source,I=r(t(/[^"'/()]|<<0>>|\(<>*\)/.source,[A]),2),R=t(/\{(?!\{)(?:(?![}:])<<0>>)*<<1>>?\}/.source,[I,P]),O=r(t(/[^"'/()]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|<<0>>|\(<>*\)/.source,[T]),2),F=t(/\{(?!\{)(?:(?![}:])<<0>>)*<<1>>?\}/.source,[O,P]);function M(t,r){return{interpolation:{pattern:n(/((?:^|[^{])(?:\{\{)*)<<0>>/.source,[t]),lookbehind:!0,inside:{"format-string":{pattern:n(/(^\{(?:(?![}:])<<0>>)*)<<1>>(?=\}$)/.source,[r,P]),lookbehind:!0,inside:{punctuation:/^:/}},punctuation:/^\{|\}$/,expression:{pattern:/[\s\S]+/,alias:"language-csharp",inside:e.languages.csharp}}},string:/[\s\S]+/}}e.languages.insertBefore("csharp","string",{"interpolation-string":[{pattern:n(/(^|[^\\])(?:\$@|@\$)"(?:""|\\[\s\S]|\{\{|<<0>>|[^\\{"])*"/.source,[R]),lookbehind:!0,greedy:!0,inside:M(R,I)},{pattern:n(/(^|[^@\\])\$"(?:\\.|\{\{|<<0>>|[^\\"{])*"/.source,[F]),lookbehind:!0,greedy:!0,inside:M(F,O)}],char:{pattern:RegExp(_),greedy:!0}}),e.languages.dotnet=e.languages.cs=e.languages.csharp}(Prism)},60397:()=>{!function(e){var t="(?:"+[/[a-zA-Z_\x80-\uFFFF][\w\x80-\uFFFF]*/.source,/-?(?:\.\d+|\d+(?:\.\d*)?)/.source,/"[^"\\]*(?:\\[\s\S][^"\\]*)*"/.source,/<(?:[^<>]|(?!)*>/.source].join("|")+")",n={markup:{pattern:/(^<)[\s\S]+(?=>$)/,lookbehind:!0,alias:["language-markup","language-html","language-xml"],inside:e.languages.markup}};function r(e,n){return RegExp(e.replace(//g,(function(){return t})),n)}e.languages.dot={comment:{pattern:/\/\/.*|\/\*[\s\S]*?\*\/|^#.*/m,greedy:!0},"graph-name":{pattern:r(/(\b(?:digraph|graph|subgraph)[ \t\r\n]+)/.source,"i"),lookbehind:!0,greedy:!0,alias:"class-name",inside:n},"attr-value":{pattern:r(/(=[ \t\r\n]*)/.source),lookbehind:!0,greedy:!0,inside:n},"attr-name":{pattern:r(/([\[;, \t\r\n])(?=[ \t\r\n]*=)/.source),lookbehind:!0,greedy:!0,inside:n},keyword:/\b(?:digraph|edge|graph|node|strict|subgraph)\b/i,"compass-point":{pattern:/(:[ \t\r\n]*)(?:[ewc_]|[ns][ew]?)(?![\w\x80-\uFFFF])/,lookbehind:!0,alias:"builtin"},node:{pattern:r(/(^|[^-.\w\x80-\uFFFF\\])/.source),lookbehind:!0,greedy:!0,inside:n},operator:/[=:]|-[->]/,punctuation:/[\[\]{};,]/},e.languages.gv=e.languages.dot}(Prism)},81295:()=>{Prism.languages.haskell={comment:{pattern:/(^|[^-!#$%*+=?&@|~.:<>^\\\/])(?:--(?:(?=.)[^-!#$%*+=?&@|~.:<>^\\\/].*|$)|\{-[\s\S]*?-\})/m,lookbehind:!0},char:{pattern:/'(?:[^\\']|\\(?:[abfnrtv\\"'&]|\^[A-Z@[\]^_]|ACK|BEL|BS|CAN|CR|DC1|DC2|DC3|DC4|DEL|DLE|EM|ENQ|EOT|ESC|ETB|ETX|FF|FS|GS|HT|LF|NAK|NUL|RS|SI|SO|SOH|SP|STX|SUB|SYN|US|VT|\d+|o[0-7]+|x[0-9a-fA-F]+))'/,alias:"string"},string:{pattern:/"(?:[^\\"]|\\(?:\S|\s+\\))*"/,greedy:!0},keyword:/\b(?:case|class|data|deriving|do|else|if|in|infixl|infixr|instance|let|module|newtype|of|primitive|then|type|where)\b/,"import-statement":{pattern:/(^[\t ]*)import\s+(?:qualified\s+)?(?:[A-Z][\w']*)(?:\.[A-Z][\w']*)*(?:\s+as\s+(?:[A-Z][\w']*)(?:\.[A-Z][\w']*)*)?(?:\s+hiding\b)?/m,lookbehind:!0,inside:{keyword:/\b(?:as|hiding|import|qualified)\b/,punctuation:/\./}},builtin:/\b(?:abs|acos|acosh|all|and|any|appendFile|approxRational|asTypeOf|asin|asinh|atan|atan2|atanh|basicIORun|break|catch|ceiling|chr|compare|concat|concatMap|const|cos|cosh|curry|cycle|decodeFloat|denominator|digitToInt|div|divMod|drop|dropWhile|either|elem|encodeFloat|enumFrom|enumFromThen|enumFromThenTo|enumFromTo|error|even|exp|exponent|fail|filter|flip|floatDigits|floatRadix|floatRange|floor|fmap|foldl|foldl1|foldr|foldr1|fromDouble|fromEnum|fromInt|fromInteger|fromIntegral|fromRational|fst|gcd|getChar|getContents|getLine|group|head|id|inRange|index|init|intToDigit|interact|ioError|isAlpha|isAlphaNum|isAscii|isControl|isDenormalized|isDigit|isHexDigit|isIEEE|isInfinite|isLower|isNaN|isNegativeZero|isOctDigit|isPrint|isSpace|isUpper|iterate|last|lcm|length|lex|lexDigits|lexLitChar|lines|log|logBase|lookup|map|mapM|mapM_|max|maxBound|maximum|maybe|min|minBound|minimum|mod|negate|not|notElem|null|numerator|odd|or|ord|otherwise|pack|pi|pred|primExitWith|print|product|properFraction|putChar|putStr|putStrLn|quot|quotRem|range|rangeSize|read|readDec|readFile|readFloat|readHex|readIO|readInt|readList|readLitChar|readLn|readOct|readParen|readSigned|reads|readsPrec|realToFrac|recip|rem|repeat|replicate|return|reverse|round|scaleFloat|scanl|scanl1|scanr|scanr1|seq|sequence|sequence_|show|showChar|showInt|showList|showLitChar|showParen|showSigned|showString|shows|showsPrec|significand|signum|sin|sinh|snd|sort|span|splitAt|sqrt|subtract|succ|sum|tail|take|takeWhile|tan|tanh|threadToIOResult|toEnum|toInt|toInteger|toLower|toRational|toUpper|truncate|uncurry|undefined|unlines|until|unwords|unzip|unzip3|userError|words|writeFile|zip|zip3|zipWith|zipWith3)\b/,number:/\b(?:\d+(?:\.\d+)?(?:e[+-]?\d+)?|0o[0-7]+|0x[0-9a-f]+)\b/i,operator:[{pattern:/`(?:[A-Z][\w']*\.)*[_a-z][\w']*`/,greedy:!0},{pattern:/(\s)\.(?=\s)/,lookbehind:!0},/[-!#$%*+=?&@|~:<>^\\\/][-!#$%*+=?&@|~.:<>^\\\/]*|\.[-!#$%*+=?&@|~.:<>^\\\/]+/],hvariable:{pattern:/\b(?:[A-Z][\w']*\.)*[_a-z][\w']*/,inside:{punctuation:/\./}},constant:{pattern:/\b(?:[A-Z][\w']*\.)*[A-Z][\w']*/,inside:{punctuation:/\./}},punctuation:/[{}[\];(),.:]/},Prism.languages.hs=Prism.languages.haskell},52503:()=>{!function(e){var t=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record(?!\s*[(){}[\]<>=%~.:,;?+\-*/&|^])|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,n=/(?:[a-z]\w*\s*\.\s*)*(?:[A-Z]\w*\s*\.\s*)*/.source,r={pattern:RegExp(/(^|[^\w.])/.source+n+/[A-Z](?:[\d_A-Z]*[a-z]\w*)?\b/.source),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}},punctuation:/\./}};e.languages.java=e.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"/,lookbehind:!0,greedy:!0},"class-name":[r,{pattern:RegExp(/(^|[^\w.])/.source+n+/[A-Z]\w*(?=\s+\w+\s*[;,=()]|\s*(?:\[[\s,]*\]\s*)?::\s*new\b)/.source),lookbehind:!0,inside:r.inside},{pattern:RegExp(/(\b(?:class|enum|extends|implements|instanceof|interface|new|record|throws)\s+)/.source+n+/[A-Z]\w*\b/.source),lookbehind:!0,inside:r.inside}],keyword:t,function:[e.languages.clike.function,{pattern:/(::\s*)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0},constant:/\b[A-Z][A-Z_\d]+\b/}),e.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"},char:{pattern:/'(?:\\.|[^'\\\r\n]){1,6}'/,greedy:!0}}),e.languages.insertBefore("java","class-name",{annotation:{pattern:/(^|[^.])@\w+(?:\s*\.\s*\w+)*/,lookbehind:!0,alias:"punctuation"},generics:{pattern:/<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&))*>)*>)*>)*>/,inside:{"class-name":r,keyword:t,punctuation:/[<>(),.:]/,operator:/[?&|]/}},import:[{pattern:RegExp(/(\bimport\s+)/.source+n+/(?:[A-Z]\w*|\*)(?=\s*;)/.source),lookbehind:!0,inside:{namespace:r.inside.namespace,punctuation:/\./,operator:/\*/,"class-name":/\w+/}},{pattern:RegExp(/(\bimport\s+static\s+)/.source+n+/(?:\w+|\*)(?=\s*;)/.source),lookbehind:!0,alias:"static",inside:{namespace:r.inside.namespace,static:/\b\w+$/,punctuation:/\./,operator:/\*/,"class-name":/\w+/}}],namespace:{pattern:RegExp(/(\b(?:exports|import(?:\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\s+)(?!)[a-z]\w*(?:\.[a-z]\w*)*\.?/.source.replace(//g,(function(){return t.source}))),lookbehind:!0,inside:{punctuation:/\./}}})}(Prism)},96854:()=>{!function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,r,a,o){if(n.language===r){var i=n.tokenStack=[];n.code=n.code.replace(a,(function(e){if("function"==typeof o&&!o(e))return e;for(var a,s=i.length;-1!==n.code.indexOf(a=t(r,s));)++s;return i[s]=e,a})),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,r){if(n.language===r&&n.tokenStack){n.grammar=e.languages[r];var a=0,o=Object.keys(n.tokenStack);!function i(s){for(var l=0;l=o.length);l++){var c=s[l];if("string"==typeof c||c.content&&"string"==typeof c.content){var u=o[a],d=n.tokenStack[u],p="string"==typeof c?c:c.content,f=t(r,u),g=p.indexOf(f);if(g>-1){++a;var h=p.substring(0,g),m=new e.Token(r,e.tokenize(d,n.grammar),"language-"+r,d),b=p.substring(g+f.length),y=[];h&&y.push.apply(y,i([h])),y.push(m),b&&y.push.apply(y,i([b])),"string"==typeof c?s.splice.apply(s,[l,1].concat(y)):c.content=y}}else c.content&&i(c.content)}return s}(n.tokens)}}}})}(Prism)},58704:()=>{Prism.languages.nix={comment:{pattern:/\/\*[\s\S]*?\*\/|#.*/,greedy:!0},string:{pattern:/"(?:[^"\\]|\\[\s\S])*"|''(?:(?!'')[\s\S]|''(?:'|\\|\$\{))*''/,greedy:!0,inside:{interpolation:{pattern:/(^|(?:^|(?!'').)[^\\])\$\{(?:[^{}]|\{[^}]*\})*\}/,lookbehind:!0,inside:null}}},url:[/\b(?:[a-z]{3,7}:\/\/)[\w\-+%~\/.:#=?&]+/,{pattern:/([^\/])(?:[\w\-+%~.:#=?&]*(?!\/\/)[\w\-+%~\/.:#=?&])?(?!\/\/)\/[\w\-+%~\/.:#=?&]*/,lookbehind:!0}],antiquotation:{pattern:/\$(?=\{)/,alias:"important"},number:/\b\d+\b/,keyword:/\b(?:assert|builtins|else|if|in|inherit|let|null|or|then|with)\b/,function:/\b(?:abort|add|all|any|attrNames|attrValues|baseNameOf|compareVersions|concatLists|currentSystem|deepSeq|derivation|dirOf|div|elem(?:At)?|fetch(?:Tarball|url)|filter(?:Source)?|fromJSON|genList|getAttr|getEnv|hasAttr|hashString|head|import|intersectAttrs|is(?:Attrs|Bool|Function|Int|List|Null|String)|length|lessThan|listToAttrs|map|mul|parseDrvName|pathExists|read(?:Dir|File)|removeAttrs|replaceStrings|seq|sort|stringLength|sub(?:string)?|tail|throw|to(?:File|JSON|Path|String|XML)|trace|typeOf)\b|\bfoldl'\B/,boolean:/\b(?:false|true)\b/,operator:/[=!<>]=?|\+\+?|\|\||&&|\/\/|->?|[?@]/,punctuation:/[{}()[\].,:;]/},Prism.languages.nix.string.inside.interpolation.inside=Prism.languages.nix},13210:()=>{Prism.languages.pascal={directive:{pattern:/\{\$[\s\S]*?\}/,greedy:!0,alias:["marco","property"]},comment:{pattern:/\(\*[\s\S]*?\*\)|\{[\s\S]*?\}|\/\/.*/,greedy:!0},string:{pattern:/(?:'(?:''|[^'\r\n])*'(?!')|#[&$%]?[a-f\d]+)+|\^[a-z]/i,greedy:!0},asm:{pattern:/(\basm\b)[\s\S]+?(?=\bend\s*[;[])/i,lookbehind:!0,greedy:!0,inside:null},keyword:[{pattern:/(^|[^&])\b(?:absolute|array|asm|begin|case|const|constructor|destructor|do|downto|else|end|file|for|function|goto|if|implementation|inherited|inline|interface|label|nil|object|of|operator|packed|procedure|program|record|reintroduce|repeat|self|set|string|then|to|type|unit|until|uses|var|while|with)\b/i,lookbehind:!0},{pattern:/(^|[^&])\b(?:dispose|exit|false|new|true)\b/i,lookbehind:!0},{pattern:/(^|[^&])\b(?:class|dispinterface|except|exports|finalization|finally|initialization|inline|library|on|out|packed|property|raise|resourcestring|threadvar|try)\b/i,lookbehind:!0},{pattern:/(^|[^&])\b(?:absolute|abstract|alias|assembler|bitpacked|break|cdecl|continue|cppdecl|cvar|default|deprecated|dynamic|enumerator|experimental|export|external|far|far16|forward|generic|helper|implements|index|interrupt|iochecks|local|message|name|near|nodefault|noreturn|nostackframe|oldfpccall|otherwise|overload|override|pascal|platform|private|protected|public|published|read|register|reintroduce|result|safecall|saveregisters|softfloat|specialize|static|stdcall|stored|strict|unaligned|unimplemented|varargs|virtual|write)\b/i,lookbehind:!0}],number:[/(?:[&%]\d+|\$[a-f\d]+)/i,/\b\d+(?:\.\d+)?(?:e[+-]?\d+)?/i],operator:[/\.\.|\*\*|:=|<[<=>]?|>[>=]?|[+\-*\/]=?|[@^=]/,{pattern:/(^|[^&])\b(?:and|as|div|exclude|in|include|is|mod|not|or|shl|shr|xor)\b/,lookbehind:!0}],punctuation:/\(\.|\.\)|[()\[\]:;,.]/},Prism.languages.pascal.asm.inside=Prism.languages.extend("pascal",{asm:void 0,keyword:void 0,operator:void 0}),Prism.languages.objectpascal=Prism.languages.pascal},80366:()=>{Prism.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},Prism.languages.python["string-interpolation"].inside.interpolation.inside.rest=Prism.languages.python,Prism.languages.py=Prism.languages.python},59385:()=>{!function(e){e.languages.ruby=e.languages.extend("clike",{comment:{pattern:/#.*|^=begin\s[\s\S]*?^=end/m,greedy:!0},"class-name":{pattern:/(\b(?:class|module)\s+|\bcatch\s+\()[\w.\\]+|\b[A-Z_]\w*(?=\s*\.\s*new\b)/,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:BEGIN|END|alias|and|begin|break|case|class|def|define_method|defined|do|each|else|elsif|end|ensure|extend|for|if|in|include|module|new|next|nil|not|or|prepend|private|protected|public|raise|redo|require|rescue|retry|return|self|super|then|throw|undef|unless|until|when|while|yield)\b/,operator:/\.{2,3}|&\.|===||[!=]?~|(?:&&|\|\||<<|>>|\*\*|[+\-*/%<>!^&|=])=?|[?:]/,punctuation:/[(){}[\].,;]/}),e.languages.insertBefore("ruby","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}});var t={pattern:/((?:^|[^\\])(?:\\{2})*)#\{(?:[^{}]|\{[^{}]*\})*\}/,lookbehind:!0,inside:{content:{pattern:/^(#\{)[\s\S]+(?=\}$)/,lookbehind:!0,inside:e.languages.ruby},delimiter:{pattern:/^#\{|\}$/,alias:"punctuation"}}};delete e.languages.ruby.function;var n="(?:"+[/([^a-zA-Z0-9\s{(\[<=])(?:(?!\1)[^\\]|\\[\s\S])*\1/.source,/\((?:[^()\\]|\\[\s\S]|\((?:[^()\\]|\\[\s\S])*\))*\)/.source,/\{(?:[^{}\\]|\\[\s\S]|\{(?:[^{}\\]|\\[\s\S])*\})*\}/.source,/\[(?:[^\[\]\\]|\\[\s\S]|\[(?:[^\[\]\\]|\\[\s\S])*\])*\]/.source,/<(?:[^<>\\]|\\[\s\S]|<(?:[^<>\\]|\\[\s\S])*>)*>/.source].join("|")+")",r=/(?:"(?:\\.|[^"\\\r\n])*"|(?:\b[a-zA-Z_]\w*|[^\s\0-\x7F]+)[?!]?|\$.)/.source;e.languages.insertBefore("ruby","keyword",{"regex-literal":[{pattern:RegExp(/%r/.source+n+/[egimnosux]{0,6}/.source),greedy:!0,inside:{interpolation:t,regex:/[\s\S]+/}},{pattern:/(^|[^/])\/(?!\/)(?:\[[^\r\n\]]+\]|\\.|[^[/\\\r\n])+\/[egimnosux]{0,6}(?=\s*(?:$|[\r\n,.;})#]))/,lookbehind:!0,greedy:!0,inside:{interpolation:t,regex:/[\s\S]+/}}],variable:/[@$]+[a-zA-Z_]\w*(?:[?!]|\b)/,symbol:[{pattern:RegExp(/(^|[^:]):/.source+r),lookbehind:!0,greedy:!0},{pattern:RegExp(/([\r\n{(,][ \t]*)/.source+r+/(?=:(?!:))/.source),lookbehind:!0,greedy:!0}],"method-definition":{pattern:/(\bdef\s+)\w+(?:\s*\.\s*\w+)?/,lookbehind:!0,inside:{function:/\b\w+$/,keyword:/^self\b/,"class-name":/^\w+/,punctuation:/\./}}}),e.languages.insertBefore("ruby","string",{"string-literal":[{pattern:RegExp(/%[qQiIwWs]?/.source+n),greedy:!0,inside:{interpolation:t,string:/[\s\S]+/}},{pattern:/("|')(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|(?!\1)[^\\#\r\n])*\1/,greedy:!0,inside:{interpolation:t,string:/[\s\S]+/}},{pattern:/<<[-~]?([a-z_]\w*)[\r\n](?:.*[\r\n])*?[\t ]*\1/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<[-~]?[a-z_]\w*|\b[a-z_]\w*$/i,inside:{symbol:/\b\w+/,punctuation:/^<<[-~]?/}},interpolation:t,string:/[\s\S]+/}},{pattern:/<<[-~]?'([a-z_]\w*)'[\r\n](?:.*[\r\n])*?[\t ]*\1/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<[-~]?'[a-z_]\w*'|\b[a-z_]\w*$/i,inside:{symbol:/\b\w+/,punctuation:/^<<[-~]?'|'$/}},string:/[\s\S]+/}}],"command-literal":[{pattern:RegExp(/%x/.source+n),greedy:!0,inside:{interpolation:t,command:{pattern:/[\s\S]+/,alias:"string"}}},{pattern:/`(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|[^\\`#\r\n])*`/,greedy:!0,inside:{interpolation:t,command:{pattern:/[\s\S]+/,alias:"string"}}}]}),delete e.languages.ruby.string,e.languages.insertBefore("ruby","number",{builtin:/\b(?:Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Fixnum|Float|Hash|IO|Integer|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|Stat|String|Struct|Symbol|TMS|Thread|ThreadGroup|Time|TrueClass)\b/,constant:/\b[A-Z][A-Z0-9_]*(?:[?!]|\b)/}),e.languages.rb=e.languages.ruby}(Prism)},70767:()=>{!function(e){for(var t=/\/\*(?:[^*/]|\*(?!\/)|\/(?!\*)|)*\*\//.source,n=0;n<2;n++)t=t.replace(//g,(function(){return t}));t=t.replace(//g,(function(){return/[^\s\S]/.source})),e.languages.rust={comment:[{pattern:RegExp(/(^|[^\\])/.source+t),lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/b?"(?:\\[\s\S]|[^\\"])*"|b?r(#*)"(?:[^"]|"(?!\1))*"\1/,greedy:!0},char:{pattern:/b?'(?:\\(?:x[0-7][\da-fA-F]|u\{(?:[\da-fA-F]_*){1,6}\}|.)|[^\\\r\n\t'])'/,greedy:!0},attribute:{pattern:/#!?\[(?:[^\[\]"]|"(?:\\[\s\S]|[^\\"])*")*\]/,greedy:!0,alias:"attr-name",inside:{string:null}},"closure-params":{pattern:/([=(,:]\s*|\bmove\s*)\|[^|]*\||\|[^|]*\|(?=\s*(?:\{|->))/,lookbehind:!0,greedy:!0,inside:{"closure-punctuation":{pattern:/^\||\|$/,alias:"punctuation"},rest:null}},"lifetime-annotation":{pattern:/'\w+/,alias:"symbol"},"fragment-specifier":{pattern:/(\$\w+:)[a-z]+/,lookbehind:!0,alias:"punctuation"},variable:/\$\w+/,"function-definition":{pattern:/(\bfn\s+)\w+/,lookbehind:!0,alias:"function"},"type-definition":{pattern:/(\b(?:enum|struct|trait|type|union)\s+)\w+/,lookbehind:!0,alias:"class-name"},"module-declaration":[{pattern:/(\b(?:crate|mod)\s+)[a-z][a-z_\d]*/,lookbehind:!0,alias:"namespace"},{pattern:/(\b(?:crate|self|super)\s*)::\s*[a-z][a-z_\d]*\b(?:\s*::(?:\s*[a-z][a-z_\d]*\s*::)*)?/,lookbehind:!0,alias:"namespace",inside:{punctuation:/::/}}],keyword:[/\b(?:Self|abstract|as|async|await|become|box|break|const|continue|crate|do|dyn|else|enum|extern|final|fn|for|if|impl|in|let|loop|macro|match|mod|move|mut|override|priv|pub|ref|return|self|static|struct|super|trait|try|type|typeof|union|unsafe|unsized|use|virtual|where|while|yield)\b/,/\b(?:bool|char|f(?:32|64)|[ui](?:8|16|32|64|128|size)|str)\b/],function:/\b[a-z_]\w*(?=\s*(?:::\s*<|\())/,macro:{pattern:/\b\w+!/,alias:"property"},constant:/\b[A-Z_][A-Z_\d]+\b/,"class-name":/\b[A-Z]\w*\b/,namespace:{pattern:/(?:\b[a-z][a-z_\d]*\s*::\s*)*\b[a-z][a-z_\d]*\s*::(?!\s*<)/,inside:{punctuation:/::/}},number:/\b(?:0x[\dA-Fa-f](?:_?[\dA-Fa-f])*|0o[0-7](?:_?[0-7])*|0b[01](?:_?[01])*|(?:(?:\d(?:_?\d)*)?\.)?\d(?:_?\d)*(?:[Ee][+-]?\d+)?)(?:_?(?:f32|f64|[iu](?:8|16|32|64|size)?))?\b/,boolean:/\b(?:false|true)\b/,punctuation:/->|\.\.=|\.{1,3}|::|[{}[\];(),:]/,operator:/[-+*\/%!^]=?|=[=>]?|&[&=]?|\|[|=]?|<>?=?|[@?]/},e.languages.rust["closure-params"].inside.rest=e.languages.rust,e.languages.rust.attribute.inside.string=e.languages.rust.string}(Prism)},30218:(e,t,n)=>{var r={"./prism-ada":85795,"./prism-bash":57874,"./prism-csharp":79016,"./prism-dot":60397,"./prism-haskell":81295,"./prism-java":52503,"./prism-nix":58704,"./prism-pascal":13210,"./prism-python":80366,"./prism-ruby":59385,"./prism-rust":70767};function a(e){var t=o(e);return n(t)}function o(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}a.keys=function(){return Object.keys(r)},a.resolve=o,e.exports=a,a.id=30218},92703:(e,t,n)=>{"use strict";var r=n(50414);function a(){}function o(){}o.resetWarningCache=a,e.exports=function(){function e(e,t,n,a,o,i){if(i!==r){var s=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw s.name="Invariant Violation",s}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:o,resetWarningCache:a};return n.PropTypes=n,n}},45697:(e,t,n)=>{e.exports=n(92703)()},50414:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},64448:(e,t,n)=>{"use strict";var r=n(67294),a=n(63840);function o(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n

If we get back to the screenshot all the way at the beginning of the post: -Mastodon post about Ubuntu Pro

+Mastodon post about Ubuntu Pro

and try to look up to which repository the packages mentioned in the screenshot belong, we will find out that they belong to universe repository which is maintained by the community. Not to mention nature of the packages: multimedia.

diff --git a/blog/aoc-2022/1st-week/index.html b/blog/aoc-2022/1st-week/index.html index d8e0d2e..8a6c471 100644 --- a/blog/aoc-2022/1st-week/index.html +++ b/blog/aoc-2022/1st-week/index.html @@ -14,8 +14,8 @@ - - + +

1st week of Advent of Code '22 in Rust

· 13 min read
Matej Focko

Let's go through the first week of Advent of Code in Rust.

diff --git a/blog/aoc-2022/2nd-week/index.html b/blog/aoc-2022/2nd-week/index.html index d28e8f2..eae37ab 100644 --- a/blog/aoc-2022/2nd-week/index.html +++ b/blog/aoc-2022/2nd-week/index.html @@ -14,8 +14,8 @@ - - + +

2nd week of Advent of Code '22 in Rust

· 21 min read
Matej Focko

Let's go through the second week of Advent of Code in Rust.

diff --git a/blog/aoc-2022/3rd-week/index.html b/blog/aoc-2022/3rd-week/index.html index a90e5b4..84f8bbb 100644 --- a/blog/aoc-2022/3rd-week/index.html +++ b/blog/aoc-2022/3rd-week/index.html @@ -14,8 +14,8 @@ - - + +

3rd week of Advent of Code '22 in Rust

· 12 min read
Matej Focko

Let's go through the third week of Advent of Code in Rust.

diff --git a/blog/aoc-2022/4th-week/index.html b/blog/aoc-2022/4th-week/index.html index 40a984d..4dac8a6 100644 --- a/blog/aoc-2022/4th-week/index.html +++ b/blog/aoc-2022/4th-week/index.html @@ -14,8 +14,8 @@ - - + +

4th week of Advent of Code '22 in Rust

· 16 min read
Matej Focko

Let's go through the fourth week of Advent of Code in Rust.

diff --git a/blog/aoc-2022/intro/index.html b/blog/aoc-2022/intro/index.html index 6c90cab..ea45a04 100644 --- a/blog/aoc-2022/intro/index.html +++ b/blog/aoc-2022/intro/index.html @@ -14,8 +14,8 @@ - - + +

Advent of Code '22 in Rust

· 9 min read
Matej Focko

Let's talk about the preparations for this year's Advent of Code.

diff --git a/blog/archive/index.html b/blog/archive/index.html index 1a8a599..1d8cd2e 100644 --- a/blog/archive/index.html +++ b/blog/archive/index.html @@ -14,8 +14,8 @@ - - + + diff --git a/blog/atom.xml b/blog/atom.xml index f87bb3a..43461f4 100644 --- a/blog/atom.xml +++ b/blog/atom.xml @@ -19,7 +19,7 @@ variety of distributions, but on the servers majority is made by only a few.

Some corporations also profit from the support of the “big” distributions. Let's dive into the pros, cons and peculiarities of such business.

This post is inspired/triggered by the following Mastodon post: -Mastodon post about Ubuntu Pro

+Mastodon post about Ubuntu Pro

Disclaimer

You may take my opinion with a grain of salt, since I'm affiliated with Red Hat, but at the same time I've also seen the other side of the fence, so I know how it works from the perspective of the provider/maintainer.

@@ -168,7 +168,7 @@ community ambassadors 50.

  • (optional) 24/7 enterprise-grade support.
  • If we get back to the screenshot all the way at the beginning of the post: -Mastodon post about Ubuntu Pro

    +Mastodon post about Ubuntu Pro

    and try to look up to which repository the packages mentioned in the screenshot belong, we will find out that they belong to universe repository which is maintained by the community. Not to mention nature of the packages: multimedia.

    diff --git a/blog/feed.json b/blog/feed.json index 08e6900..fe40a1b 100644 --- a/blog/feed.json +++ b/blog/feed.json @@ -6,7 +6,7 @@ "items": [ { "id": "https://blog.mfocko.xyz/blog/2024/02/07/lts-distros", - "content_html": "

    Linux distributions are a common choice for running the servers. There's a wide\nvariety of distributions, but on the servers majority is made by only a few.

    \n

    Some corporations also profit from the support of the “big” distributions. Let's\ndive into the pros, cons and peculiarities of such business.

    \n

    This post is inspired/triggered by the following Mastodon post:\n\"Mastodon

    \n
    Disclaimer

    You may take my opinion with a grain of salt, since I'm affiliated with Red Hat,\nbut at the same time I've also seen the other side of the fence, so I know how\nit works from the perspective of the provider/maintainer.

    \n
    tip

    If you are not very oriented in the matters of Linux distributions and\nmaintaining of packages, I suggest looking at the glossary at the\nend to have a better grasp of the terms that are used throughout the post.

    \n

    Point of linux distributions

    \n

    First thing I'd like to point out is the point of the Linux distributions. What\nbenefit do they provide? And why there are so many of them…

    \n

    As it has been brought up many times by the rms1, Linux by itself is not\nenough, it's just the kernel that does the underlying work. We need more\nsoftware to utilize the hardware. That's the gap that Linux distributions bridge\nby providing the Linux and much more other software that we need.

    \n

    Each distribution is unique in its own way. Some prefer different ways of\nhandling the software (like Gentoo that allows you to compile it yourself) and\nothers stable releases of software (like Debian).

    \n

    In the end it mostly boils down to the packaging. I, as a user, want to do\nsomething like

    \n
    $ sudo dnf5 install firefox
    \n

    and not bother about anything else. I don't want to open browser to look the\nthing up, download it and then click mindlessly 500× “Next”. I just want to run\none command and when the maintainers decide it's time to move on, another one to\nupgrade the software to the newer version.

    \n

    Of course, for some use cases you want to minimize the latter. And even make\nsure that it's safe to do it when you need to. You don't want to break your\nproduction deployment just because someone decided it's time to push something\nout.

    \n

    That's when the maintainers come in. They take upon themselves the\nresponsibility of maintaining the packages. If you've ever used the Debian, you\nknow very well how old the software is, but that's what you might need for\nyour servers.

    \n

    Pain of packaging

    \n

    Packaging software is not cost-free. You may as well have 80 % of packages\nthat don't need much care and it's rather easy to push them forward, but those\nremaining, which are complicated and raise issues regularly, will make it up and\ntake a lot of time and also pain.

    \n

    Libraries are the most common example that might not need much work to be done.\nOn the other hand, Linux kernel itself is a rather complicated machinery that\nis patched a lot and its build process is not simple either.

    \n

    Even if you consider just those easily-maintainble packages, the process can\nbe tedious, boring and overall time consuming.

    \n
    Shameless RHEL-based ecosystem plug

    Packit can help tremendously with the easily-maintainable packages, since it\ncan be automated.

    \n

    Packaging whole ecosystems

    \n

    Now it's time to talk about whole ecosystems that have some kind of a packaging\nby themselves. Yes, I mean Python (with its continuous stream of different\npackage managers), Rust, Go, etc.

    \n

    Whole point of packaging is to have some form of gating. In other words, you\nwant some kind of quality control when pushing changes into the Linux distros.

    \n

    If you want to package some tool (or even library) from the aforementioned\necosystems, you need to package all of the dependencies to make sure something\ndoesn't get updated in the meantime (and also that you can safely reproduce the\nbuilds, if need be).

    \n

    I've tried to package some utilities for EPEL both in Rust and Go. Dependencies\nform a DAG2 and in case of Rust, it's very similar to the way npm does\nits packaging.

    \n
    Spoiler alert

    You get a lot of dependencies. And since it's a tree of dependencies, there may\nbe a lot of them.

    \n

    I have no clue how do the Rust maintainers operate, but I'm tipping my fedora in\ntheir direction, since it must be a pain in the ass.

    \n

    Paid distributions

    \n

    You can find few Linux distributions that are “paid”. I'm very well aware of the\nfact I've used quotes around the word, cause it's not that easy and not even\nsame for all of the distributions that involve some kind of a payment.

    \n

    One of the first non-free distributions I've come into contact was Zorin OS\nwhich basically tries to be the best transition solution when moving away from\nthe Windows or macOS. If you have a look at the perks of its Pro version\nthat's paid, you may as well decide they are rather questionable…

    \n

    It's time to move into the Ubuntu Pro, RHEL and SLE territory. What's the\npoint of those? They definitely offer different kind of, let's say,\nnon-free experience.

    \n

    With those you are paying mainly for the support and bug/security patches.

    \n
    Fun fact

    There's no mention of any kind of support on the Zorin page… Apart from the fact\nthat you are supporting the Zorin development.

    \n

    Repository structure

    \n

    As I have mentioned above, the three services3 I mentioned are providing\nsupport with regards to bugs and security vulnerabilites. Therefore it makes\nsense to have some kind of a process in place when you're pushing changes\n(either updates, patches or security patches) to the distribution. And yes,\nthese processes are in place.

    \n

    If you think about the amount of packages that is present in the community\ndistributions like archLinux (14,830 packages) or Fedora (74,309 packages),\nit is safe to come to a conclusion that there's no way to support all of them.

    \n
    archLinux

    It may seem that archLinux contains rather small set of packages, but one of the\nkiller features of archLinux lies in the AUR (archLinux User Repository) where\nyou can find additional 93,283 packages.

    \n

    That's why the Linux distributions have some structure to their repositories\nthat contain packages. The way you go around this is rather simple, you choose\nsome set of critical packages that you guarantee support for (like Linux\nkernel, openSSL, etc.) and maintain those with all the QA processes in place.

    \n
    Unpopular opinion

    This is also one of the reasons why I'm quite against packaging anything and\neverything into the Linux distribution. In my opinion it is impossible to\nproperly maintain huge set of packages and enforce some kind of\nquality control.

    \n

    Ubuntu

    \n

    Ubuntu has pretty granular structure of their repositories, namely:

    \n
      \n
    • main containing the “core” of the Ubuntu that is maintained by the Canonical,
    • \n
    • universe containing literally the “universe”, packages that everyone likes,\nbut they're not crucial, this repo is maintained mostly by the community,
    • \n
    • multiverse containing packages with some license or copyright issues, and
    • \n
    • restricted containing proprietary packages like nvidia drivers and such.
    • \n
    \n

    By briefly checking my Ubuntu 23.10 installation, here are stats of packages in\ntheir respective repositories:

    \n
      \n
    • main with 6,128 packages,
    • \n
    • universe with 63,380 packages,
    • \n
    • multiverse with 997 packages, and finally
    • \n
    • restricted with 784 packages.
    • \n
    \n

    As you can see, if we sum them up, they are relatively similar to the Fedora\nnumbers.

    \n

    CentOS

    \n

    CentOS on the other hand has a bit simpler structure with BaseOS for the base\nand AppStream for additional packages:

    \n
      \n
    • baseos with 1,058 packages,
    • \n
    • appstream with 5,646 packages, and
    • \n
    • extras-common with 42 packages.
    • \n
    \n

    Overall they make up the similar number as the Ubuntu's main repository. And\nyou can also notice that there are no additional repositories.

    \n
    tip

    There's also a CRB (CodeReady Builder) repository with dev packages like headers\nand such.

    And you can also enable EPEL (Extra Packages for Enterprise Linux) which is\ncommunity-supported and provides another 19,903 packages.

    \n

    Ubuntu Pro

    \n

    Now it's time to get back to the Ubuntu Pro. There are multiple points that need\nto be taken in account to be either positive or negative about it…

    \n

    We can start with the way Ubuntu is released and maintained. Ubuntu has regular\n6-month release cycle and biannual LTS release. Releases are normally supported\nfor 9 months with the exception of the LTS releases being supported for 5 years.

    \n

    If you check out the Ubuntu Pro website, you can find the following\nstatement:

    \n
    \n

    Ubuntu Pro

    \n

    The most comprehensive subscription for open-source software security

    \n

    30-day trial for enterprises. Always free for personal use.

    \n
    \n
    Personal use

    Ubuntu Pro for personal use consists of 5 installations and in case of the\ncommunity ambassadors 50.

    \n

    Overall if you try to find what is included in the Ubuntu Pro:

    \n
      \n
    • high and critical patches,
    • \n
    • 10 years of maintenance, and
    • \n
    • (optional) 24/7 enterprise-grade support.
    • \n
    \n

    If we get back to the screenshot all the way at the beginning of the post:\n\"Mastodon

    \n

    and try to look up to which repository the packages mentioned in the screenshot\nbelong, we will find out that they belong to universe repository which is\nmaintained by the community. Not to mention nature of the packages: multimedia.

    \n

    You may think about this as a scam, but considering repository consisting of 70k\npackages, it is not an easy task to do. And with LTS releases we're talking\nabout 5+ years of support.

    \n
    Fedora

    Try to compare this state to Fedora. It also has a 6-month release cycle, but\nthere are no LTS releases and each release is supported only for a year.

    \n

    Common strategy, at this point, is to pull out the open-source. Yes, we are\nstill dealing with the open-source, but keep in mind that you're trying to patch\nsome issue in a version that's 5 years old, upstream definitely doesn't care\nanymore4, the development didn't stop 5 years ago, it's going on and fixing\nthis issue in a release from 5 years is not the same as fixing it in the current\nrelease. At this point, if you are paying for such support, you are actually\npaying for someone to do software archaeology which can be non-trivial\nto do.

    \n

    In the case of Ubuntu Pro we're talking about community support and best-effort\nsupport by Canonical for the paying customers. And that makes sense to me,\nrunning LTS distro for 5+ years on a desktop seems like an odd choice, even\nwith the help of podman and distrobox or toolbx that allow us to use\nstable or LTS distro as a base and containerized development environments on top\nof that.

    \n

    RHEL ecosystem

    \n

    RHEL ecosystem is much more complicated in this matter. However it's very\nsimilar to the way SUSE operates with few exceptions.

    \n

    You can see a flow diagram here:

    \n\n

    Key things to take and not to take from the flow diagram:

    \n
      \n
    • getting from one upstream to its respective downstream is not as simple as the\npresence of an arrow and it's not the same process for all of them
    • \n
    • lengths of the arrows are not proportional, specifically:\n
        \n
      • Fedora Rawhide is supposed to consume updates as soon as possible,
      • \n
      • depending on the decision of the maintainer they can, but don't have to be\nincluded in the currently supported Fedora releases (you can take Emacs as\nan example of such package), but Rawhide eventually becomes the next Fedora\nrelease,
      • \n
      • CentOS Stream gets branched off a specific Fedora release, and then
      • \n
      • ultimately CentOS Stream becomes the next minor release of RHEL.
      • \n
      \n
    • \n
    • this diagram is simplified by a lot
    • \n
    \n
    SUSE flow for comparison

    I'll also include a SUSE flow, so you can compare:

    You can notice, as opposed to the RHEL ecosystem, some changes are being\nbackported to the openSUSE Leap.

    However this is subject to change as there is a new ALP project arising which\nis, more than likely, going to replace the Leap.

    \n

    Change in the model

    \n

    The flow I've shown above is in effect since late ‘20 and early ‘21. I hope you\ncan see that it is quite similar to the way SUSE operates too. Before late ‘20\nthe flow was following:

    \n\n

    CentOS was the last distribution in that “chain”. This provides some benefits\nand some negatives.

    \n

    Before the change

    \n

    From the point of a developer, unless you have some kind of an early access to\nRHEL, you don't see the changes until they land and are already released. This\nimpairs your ability to test and verify your software before shipping it to your\nclients that use RHEL.

    \n

    From the point of a user, there is one positive, you basically get “free RHEL”\nwithout the support. This also allowed you to report bugs against the RHEL,\nsince they were 1:1 distros (minus the branding and support). So you'd\ntechnically get RHEL free of charge.

    \n

    Benefit of such project, except for the cost, is questionable. The main issue,\nwhich actually became even more apparent after changing the flow, is someone\nelse repackaging your own product and selling it again.

    \n

    After the change

    \n

    First of all, the current flow counters the issue mentioned above. You can test\nyour projects against the next minor RHEL release. CentOS Stream is free, so\nyou can freely incorporate it into your CI pipelines.

    \n
    Shameless plug pt. 2

    Again, Packit can help you on upstream to verify that you're not breaking your\nRPM builds and on top of that you can also use Testing Farm to run tests on a\nspecific Fedora or CentOS Stream releases.

    \n

    Green tests may not be green everywhere and catching such issues as soon as\npossible costs much less than catching them further down the chain.

    \n
    \n

    There are many people thinking that RHEL has become closed-source. It is not.\nThe development happens out in the open, it's more open that it was before.\nHowever with the cost of not getting the exact same thing for free. You can get\nthe next minor RHEL, not the same that's normally paid for. Packit is an\nexample of a service that is deployed on the CentOS 9 Stream and even used to be\ndeployed on Fedora, but the regular 6-month release cycle caused some minor\nissues here and there.

    \n

    Production-ready is something that heavily depends on the context…

    \n
    Free “clones”

    After this change so-called free “clones” emerged. I have to admit that in\ncase of AlmaLinux I can see some benefits e.g., pushing for live images and\nsupport of various desktop environments, Raspberry Pi support or even WSL images\nbeing present in the M$ Store and easy to install.

    \n

    Open-source and paid support

    \n

    Overall I don't think that paying for the support of 5 years old non-critical\npackages is going against the open-source. It is a non-trivial work that, in\nmajority of cases, cannot be included in the upstream, therefore the benefit is\nreapt only by the paying customers. I have to admit that in the case of the\nUbuntu Pro it may seem a bit weird (hiding patches behind the paywall). However\nwe're still talking about rather big set of packages that will affect a minority\nof server workloads, if any.

    \n

    Glossary

    \n
      \n
    • \n

      rolling release - continuously released without “significant milestones”

      \n
      tip

      As an example of rolling distribution you can take archLinux, openSUSE\nTumbleweed, Fedora Rawhide, or even CentOS 9 Stream.

      As en example of not rolling distribution you can take Ubuntu, openSUSE\nLeap or Fedora.

      \n
    • \n
    • \n

      bleeding edge - contains the latest versions as they are released on the\nupstream

      \n
      tip

      As an example you can take archLinux, openSUSE Tumbleweed or Fedora Rawhide.\nYou can also notice how common it is to combine rolling release with\nbleeding edge.

      \n
    • \n
    • \n

      upstream & downstream

      \n

      You're most likely to meet these terms in the meaning of upstream being the\nproject itself and downstream being the packaging of said project in some\ndistribution.

      \n

      However this can also apply to distributions like openSUSE Tumbleweed with\nopenSUSE Leap, Fedora with CentOS Stream, or even CentOS Stream with\nRHEL. This basically means that the packages/software is being released into\nthe upstream (Tumbleweed, Fedora, or even CentOS) and then after being tested\nis taken further down into their respective downstreams (Leap, CentOS, RHEL).

      \n
    • \n
    \n

    Footnotes

    \n
      \n
    1. \n

      Richard Stallman

      \n
    2. \n
    3. \n

      directed acyclic graph

      \n
    4. \n
    5. \n

      Ubuntu Pro is technically a service whereas the RHEL and SLE are distros\nwith the support included.

      \n
    6. \n
    7. \n

      There are upstream projects that keep LTS branches, such as Linux kernel,\nbut even in the case of the kernel itself, they're planning on ending it,\nsince the cost outweighs the benefits at this point.

      \n
    8. \n
    \n
    ", + "content_html": "

    Linux distributions are a common choice for running the servers. There's a wide\nvariety of distributions, but on the servers majority is made by only a few.

    \n

    Some corporations also profit from the support of the “big” distributions. Let's\ndive into the pros, cons and peculiarities of such business.

    \n

    This post is inspired/triggered by the following Mastodon post:\n\"Mastodon

    \n
    Disclaimer

    You may take my opinion with a grain of salt, since I'm affiliated with Red Hat,\nbut at the same time I've also seen the other side of the fence, so I know how\nit works from the perspective of the provider/maintainer.

    \n
    tip

    If you are not very oriented in the matters of Linux distributions and\nmaintaining of packages, I suggest looking at the glossary at the\nend to have a better grasp of the terms that are used throughout the post.

    \n

    Point of linux distributions

    \n

    First thing I'd like to point out is the point of the Linux distributions. What\nbenefit do they provide? And why there are so many of them…

    \n

    As it has been brought up many times by the rms1, Linux by itself is not\nenough, it's just the kernel that does the underlying work. We need more\nsoftware to utilize the hardware. That's the gap that Linux distributions bridge\nby providing the Linux and much more other software that we need.

    \n

    Each distribution is unique in its own way. Some prefer different ways of\nhandling the software (like Gentoo that allows you to compile it yourself) and\nothers stable releases of software (like Debian).

    \n

    In the end it mostly boils down to the packaging. I, as a user, want to do\nsomething like

    \n
    $ sudo dnf5 install firefox
    \n

    and not bother about anything else. I don't want to open browser to look the\nthing up, download it and then click mindlessly 500× “Next”. I just want to run\none command and when the maintainers decide it's time to move on, another one to\nupgrade the software to the newer version.

    \n

    Of course, for some use cases you want to minimize the latter. And even make\nsure that it's safe to do it when you need to. You don't want to break your\nproduction deployment just because someone decided it's time to push something\nout.

    \n

    That's when the maintainers come in. They take upon themselves the\nresponsibility of maintaining the packages. If you've ever used the Debian, you\nknow very well how old the software is, but that's what you might need for\nyour servers.

    \n

    Pain of packaging

    \n

    Packaging software is not cost-free. You may as well have 80 % of packages\nthat don't need much care and it's rather easy to push them forward, but those\nremaining, which are complicated and raise issues regularly, will make it up and\ntake a lot of time and also pain.

    \n

    Libraries are the most common example that might not need much work to be done.\nOn the other hand, Linux kernel itself is a rather complicated machinery that\nis patched a lot and its build process is not simple either.

    \n

    Even if you consider just those easily-maintainble packages, the process can\nbe tedious, boring and overall time consuming.

    \n
    Shameless RHEL-based ecosystem plug

    Packit can help tremendously with the easily-maintainable packages, since it\ncan be automated.

    \n

    Packaging whole ecosystems

    \n

    Now it's time to talk about whole ecosystems that have some kind of a packaging\nby themselves. Yes, I mean Python (with its continuous stream of different\npackage managers), Rust, Go, etc.

    \n

    Whole point of packaging is to have some form of gating. In other words, you\nwant some kind of quality control when pushing changes into the Linux distros.

    \n

    If you want to package some tool (or even library) from the aforementioned\necosystems, you need to package all of the dependencies to make sure something\ndoesn't get updated in the meantime (and also that you can safely reproduce the\nbuilds, if need be).

    \n

    I've tried to package some utilities for EPEL both in Rust and Go. Dependencies\nform a DAG2 and in case of Rust, it's very similar to the way npm does\nits packaging.

    \n
    Spoiler alert

    You get a lot of dependencies. And since it's a tree of dependencies, there may\nbe a lot of them.

    \n

    I have no clue how do the Rust maintainers operate, but I'm tipping my fedora in\ntheir direction, since it must be a pain in the ass.

    \n

    Paid distributions

    \n

    You can find few Linux distributions that are “paid”. I'm very well aware of the\nfact I've used quotes around the word, cause it's not that easy and not even\nsame for all of the distributions that involve some kind of a payment.

    \n

    One of the first non-free distributions I've come into contact was Zorin OS\nwhich basically tries to be the best transition solution when moving away from\nthe Windows or macOS. If you have a look at the perks of its Pro version\nthat's paid, you may as well decide they are rather questionable…

    \n

    It's time to move into the Ubuntu Pro, RHEL and SLE territory. What's the\npoint of those? They definitely offer different kind of, let's say,\nnon-free experience.

    \n

    With those you are paying mainly for the support and bug/security patches.

    \n
    Fun fact

    There's no mention of any kind of support on the Zorin page… Apart from the fact\nthat you are supporting the Zorin development.

    \n

    Repository structure

    \n

    As I have mentioned above, the three services3 I mentioned are providing\nsupport with regards to bugs and security vulnerabilites. Therefore it makes\nsense to have some kind of a process in place when you're pushing changes\n(either updates, patches or security patches) to the distribution. And yes,\nthese processes are in place.

    \n

    If you think about the amount of packages that is present in the community\ndistributions like archLinux (14,830 packages) or Fedora (74,309 packages),\nit is safe to come to a conclusion that there's no way to support all of them.

    \n
    archLinux

    It may seem that archLinux contains rather small set of packages, but one of the\nkiller features of archLinux lies in the AUR (archLinux User Repository) where\nyou can find additional 93,283 packages.

    \n

    That's why the Linux distributions have some structure to their repositories\nthat contain packages. The way you go around this is rather simple, you choose\nsome set of critical packages that you guarantee support for (like Linux\nkernel, openSSL, etc.) and maintain those with all the QA processes in place.

    \n
    Unpopular opinion

    This is also one of the reasons why I'm quite against packaging anything and\neverything into the Linux distribution. In my opinion it is impossible to\nproperly maintain huge set of packages and enforce some kind of\nquality control.

    \n

    Ubuntu

    \n

    Ubuntu has pretty granular structure of their repositories, namely:

    \n
      \n
    • main containing the “core” of the Ubuntu that is maintained by the Canonical,
    • \n
    • universe containing literally the “universe”, packages that everyone likes,\nbut they're not crucial, this repo is maintained mostly by the community,
    • \n
    • multiverse containing packages with some license or copyright issues, and
    • \n
    • restricted containing proprietary packages like nvidia drivers and such.
    • \n
    \n

    By briefly checking my Ubuntu 23.10 installation, here are stats of packages in\ntheir respective repositories:

    \n
      \n
    • main with 6,128 packages,
    • \n
    • universe with 63,380 packages,
    • \n
    • multiverse with 997 packages, and finally
    • \n
    • restricted with 784 packages.
    • \n
    \n

    As you can see, if we sum them up, they are relatively similar to the Fedora\nnumbers.

    \n

    CentOS

    \n

    CentOS on the other hand has a bit simpler structure with BaseOS for the base\nand AppStream for additional packages:

    \n
      \n
    • baseos with 1,058 packages,
    • \n
    • appstream with 5,646 packages, and
    • \n
    • extras-common with 42 packages.
    • \n
    \n

    Overall they make up the similar number as the Ubuntu's main repository. And\nyou can also notice that there are no additional repositories.

    \n
    tip

    There's also a CRB (CodeReady Builder) repository with dev packages like headers\nand such.

    And you can also enable EPEL (Extra Packages for Enterprise Linux) which is\ncommunity-supported and provides another 19,903 packages.

    \n

    Ubuntu Pro

    \n

    Now it's time to get back to the Ubuntu Pro. There are multiple points that need\nto be taken in account to be either positive or negative about it…

    \n

    We can start with the way Ubuntu is released and maintained. Ubuntu has regular\n6-month release cycle and biannual LTS release. Releases are normally supported\nfor 9 months with the exception of the LTS releases being supported for 5 years.

    \n

    If you check out the Ubuntu Pro website, you can find the following\nstatement:

    \n
    \n

    Ubuntu Pro

    \n

    The most comprehensive subscription for open-source software security

    \n

    30-day trial for enterprises. Always free for personal use.

    \n
    \n
    Personal use

    Ubuntu Pro for personal use consists of 5 installations and in case of the\ncommunity ambassadors 50.

    \n

    Overall if you try to find what is included in the Ubuntu Pro:

    \n
      \n
    • high and critical patches,
    • \n
    • 10 years of maintenance, and
    • \n
    • (optional) 24/7 enterprise-grade support.
    • \n
    \n

    If we get back to the screenshot all the way at the beginning of the post:\n\"Mastodon

    \n

    and try to look up to which repository the packages mentioned in the screenshot\nbelong, we will find out that they belong to universe repository which is\nmaintained by the community. Not to mention nature of the packages: multimedia.

    \n

    You may think about this as a scam, but considering repository consisting of 70k\npackages, it is not an easy task to do. And with LTS releases we're talking\nabout 5+ years of support.

    \n
    Fedora

    Try to compare this state to Fedora. It also has a 6-month release cycle, but\nthere are no LTS releases and each release is supported only for a year.

    \n

    Common strategy, at this point, is to pull out the open-source. Yes, we are\nstill dealing with the open-source, but keep in mind that you're trying to patch\nsome issue in a version that's 5 years old, upstream definitely doesn't care\nanymore4, the development didn't stop 5 years ago, it's going on and fixing\nthis issue in a release from 5 years is not the same as fixing it in the current\nrelease. At this point, if you are paying for such support, you are actually\npaying for someone to do software archaeology which can be non-trivial\nto do.

    \n

    In the case of Ubuntu Pro we're talking about community support and best-effort\nsupport by Canonical for the paying customers. And that makes sense to me,\nrunning LTS distro for 5+ years on a desktop seems like an odd choice, even\nwith the help of podman and distrobox or toolbx that allow us to use\nstable or LTS distro as a base and containerized development environments on top\nof that.

    \n

    RHEL ecosystem

    \n

    RHEL ecosystem is much more complicated in this matter. However it's very\nsimilar to the way SUSE operates with few exceptions.

    \n

    You can see a flow diagram here:

    \n\n

    Key things to take and not to take from the flow diagram:

    \n
      \n
    • getting from one upstream to its respective downstream is not as simple as the\npresence of an arrow and it's not the same process for all of them
    • \n
    • lengths of the arrows are not proportional, specifically:\n
        \n
      • Fedora Rawhide is supposed to consume updates as soon as possible,
      • \n
      • depending on the decision of the maintainer they can, but don't have to be\nincluded in the currently supported Fedora releases (you can take Emacs as\nan example of such package), but Rawhide eventually becomes the next Fedora\nrelease,
      • \n
      • CentOS Stream gets branched off a specific Fedora release, and then
      • \n
      • ultimately CentOS Stream becomes the next minor release of RHEL.
      • \n
      \n
    • \n
    • this diagram is simplified by a lot
    • \n
    \n
    SUSE flow for comparison

    I'll also include a SUSE flow, so you can compare:

    You can notice, as opposed to the RHEL ecosystem, some changes are being\nbackported to the openSUSE Leap.

    However this is subject to change as there is a new ALP project arising which\nis, more than likely, going to replace the Leap.

    \n

    Change in the model

    \n

    The flow I've shown above is in effect since late ‘20 and early ‘21. I hope you\ncan see that it is quite similar to the way SUSE operates too. Before late ‘20\nthe flow was following:

    \n\n

    CentOS was the last distribution in that “chain”. This provides some benefits\nand some negatives.

    \n

    Before the change

    \n

    From the point of a developer, unless you have some kind of an early access to\nRHEL, you don't see the changes until they land and are already released. This\nimpairs your ability to test and verify your software before shipping it to your\nclients that use RHEL.

    \n

    From the point of a user, there is one positive, you basically get “free RHEL”\nwithout the support. This also allowed you to report bugs against the RHEL,\nsince they were 1:1 distros (minus the branding and support). So you'd\ntechnically get RHEL free of charge.

    \n

    Benefit of such project, except for the cost, is questionable. The main issue,\nwhich actually became even more apparent after changing the flow, is someone\nelse repackaging your own product and selling it again.

    \n

    After the change

    \n

    First of all, the current flow counters the issue mentioned above. You can test\nyour projects against the next minor RHEL release. CentOS Stream is free, so\nyou can freely incorporate it into your CI pipelines.

    \n
    Shameless plug pt. 2

    Again, Packit can help you on upstream to verify that you're not breaking your\nRPM builds and on top of that you can also use Testing Farm to run tests on a\nspecific Fedora or CentOS Stream releases.

    \n

    Green tests may not be green everywhere and catching such issues as soon as\npossible costs much less than catching them further down the chain.

    \n
    \n

    There are many people thinking that RHEL has become closed-source. It is not.\nThe development happens out in the open, it's more open that it was before.\nHowever with the cost of not getting the exact same thing for free. You can get\nthe next minor RHEL, not the same that's normally paid for. Packit is an\nexample of a service that is deployed on the CentOS 9 Stream and even used to be\ndeployed on Fedora, but the regular 6-month release cycle caused some minor\nissues here and there.

    \n

    Production-ready is something that heavily depends on the context…

    \n
    Free “clones”

    After this change so-called free “clones” emerged. I have to admit that in\ncase of AlmaLinux I can see some benefits e.g., pushing for live images and\nsupport of various desktop environments, Raspberry Pi support or even WSL images\nbeing present in the M$ Store and easy to install.

    \n

    Open-source and paid support

    \n

    Overall I don't think that paying for the support of 5 years old non-critical\npackages is going against the open-source. It is a non-trivial work that, in\nmajority of cases, cannot be included in the upstream, therefore the benefit is\nreapt only by the paying customers. I have to admit that in the case of the\nUbuntu Pro it may seem a bit weird (hiding patches behind the paywall). However\nwe're still talking about rather big set of packages that will affect a minority\nof server workloads, if any.

    \n

    Glossary

    \n
      \n
    • \n

      rolling release - continuously released without “significant milestones”

      \n
      tip

      As an example of rolling distribution you can take archLinux, openSUSE\nTumbleweed, Fedora Rawhide, or even CentOS 9 Stream.

      As en example of not rolling distribution you can take Ubuntu, openSUSE\nLeap or Fedora.

      \n
    • \n
    • \n

      bleeding edge - contains the latest versions as they are released on the\nupstream

      \n
      tip

      As an example you can take archLinux, openSUSE Tumbleweed or Fedora Rawhide.\nYou can also notice how common it is to combine rolling release with\nbleeding edge.

      \n
    • \n
    • \n

      upstream & downstream

      \n

      You're most likely to meet these terms in the meaning of upstream being the\nproject itself and downstream being the packaging of said project in some\ndistribution.

      \n

      However this can also apply to distributions like openSUSE Tumbleweed with\nopenSUSE Leap, Fedora with CentOS Stream, or even CentOS Stream with\nRHEL. This basically means that the packages/software is being released into\nthe upstream (Tumbleweed, Fedora, or even CentOS) and then after being tested\nis taken further down into their respective downstreams (Leap, CentOS, RHEL).

      \n
    • \n
    \n

    Footnotes

    \n
      \n
    1. \n

      Richard Stallman

      \n
    2. \n
    3. \n

      directed acyclic graph

      \n
    4. \n
    5. \n

      Ubuntu Pro is technically a service whereas the RHEL and SLE are distros\nwith the support included.

      \n
    6. \n
    7. \n

      There are upstream projects that keep LTS branches, such as Linux kernel,\nbut even in the case of the kernel itself, they're planning on ending it,\nsince the cost outweighs the benefits at this point.

      \n
    8. \n
    \n
    ", "url": "https://blog.mfocko.xyz/blog/2024/02/07/lts-distros", "title": "LTS distributions", "summary": "Shower thoughts on the LTS Linux distributions.\n", diff --git a/blog/index.html b/blog/index.html index 0b379a8..43a27b4 100644 --- a/blog/index.html +++ b/blog/index.html @@ -14,8 +14,8 @@ - - + +
    Mastodon post about Ubuntu Pro

    · 16 min read
    Matej Focko

    Rust has become a rather popular language these days. I've managed to get my hands dirty with it during [Advent of Code] ‘22 and partially ‘23. I've also used it for few rounds of [Codeforces] and I have to try very hard to maintain diff --git a/blog/leetcode/sort-diagonally/index.html b/blog/leetcode/sort-diagonally/index.html index e5dfb0f..9347b98 100644 --- a/blog/leetcode/sort-diagonally/index.html +++ b/blog/leetcode/sort-diagonally/index.html @@ -14,8 +14,8 @@ - - + +

    Sort the matrix diagonally

    · 17 min read
    Matej Focko

    Let's try to solve one of the LeetCode challenges in easy and hard mode at the diff --git a/blog/rss.xml b/blog/rss.xml index ec9dbaa..22f4b88 100644 --- a/blog/rss.xml +++ b/blog/rss.xml @@ -20,7 +20,7 @@ variety of distributions, but on the servers majority is made by only a few.

    Some corporations also profit from the support of the “big” distributions. Let's dive into the pros, cons and peculiarities of such business.

    This post is inspired/triggered by the following Mastodon post: -Mastodon post about Ubuntu Pro

    +Mastodon post about Ubuntu Pro

    Disclaimer

    You may take my opinion with a grain of salt, since I'm affiliated with Red Hat, but at the same time I've also seen the other side of the fence, so I know how it works from the perspective of the provider/maintainer.

    @@ -169,7 +169,7 @@ community ambassadors 50.

  • (optional) 24/7 enterprise-grade support.
  • If we get back to the screenshot all the way at the beginning of the post: -Mastodon post about Ubuntu Pro

    +Mastodon post about Ubuntu Pro

    and try to look up to which repository the packages mentioned in the screenshot belong, we will find out that they belong to universe repository which is maintained by the community. Not to mention nature of the packages: multimedia.

    diff --git a/blog/tags/admin/index.html b/blog/tags/admin/index.html index f7e1f28..ac16d7c 100644 --- a/blog/tags/admin/index.html +++ b/blog/tags/admin/index.html @@ -14,8 +14,8 @@ - - + +

    One post tagged with "admin"

    View All Tags

    · 4 min read
    Matej Focko

    When you decide to run Fedora on your VPS, you might get screwed over by using diff --git a/blog/tags/advent-of-code-2022/index.html b/blog/tags/advent-of-code-2022/index.html index a1d1843..8c0898c 100644 --- a/blog/tags/advent-of-code-2022/index.html +++ b/blog/tags/advent-of-code-2022/index.html @@ -14,8 +14,8 @@ - - + +

    5 posts tagged with "advent-of-code-2022"

    View All Tags
    diff --git a/blog/tags/advent-of-code/index.html b/blog/tags/advent-of-code/index.html index bb421c5..ccfe1b2 100644 --- a/blog/tags/advent-of-code/index.html +++ b/blog/tags/advent-of-code/index.html @@ -14,8 +14,8 @@ - - + +

    5 posts tagged with "advent-of-code"

    View All Tags
    diff --git a/blog/tags/copr/index.html b/blog/tags/copr/index.html index 8292494..d508e4a 100644 --- a/blog/tags/copr/index.html +++ b/blog/tags/copr/index.html @@ -14,8 +14,8 @@ - - + +

    One post tagged with "copr"

    View All Tags

    · 4 min read
    Matej Focko

    When you decide to run Fedora on your VPS, you might get screwed over by using diff --git a/blog/tags/cpp/index.html b/blog/tags/cpp/index.html index 045ce7c..aecd9ca 100644 --- a/blog/tags/cpp/index.html +++ b/blog/tags/cpp/index.html @@ -14,8 +14,8 @@ - - + +

    One post tagged with "cpp"

    View All Tags

    · 17 min read
    Matej Focko

    Let's try to solve one of the LeetCode challenges in easy and hard mode at the diff --git a/blog/tags/cult/index.html b/blog/tags/cult/index.html index 351db64..f0b0239 100644 --- a/blog/tags/cult/index.html +++ b/blog/tags/cult/index.html @@ -14,8 +14,8 @@ - - + +

    One post tagged with "cult"

    View All Tags
    - - + +

    One post tagged with "hype"

    View All Tags
    - - + + diff --git a/blog/tags/iterators/index.html b/blog/tags/iterators/index.html index 96282c5..0e4109c 100644 --- a/blog/tags/iterators/index.html +++ b/blog/tags/iterators/index.html @@ -14,8 +14,8 @@ - - + +

    One post tagged with "iterators"

    View All Tags

    · 17 min read
    Matej Focko

    Let's try to solve one of the LeetCode challenges in easy and hard mode at the diff --git a/blog/tags/leetcode/index.html b/blog/tags/leetcode/index.html index 84dbcde..1f3bee8 100644 --- a/blog/tags/leetcode/index.html +++ b/blog/tags/leetcode/index.html @@ -14,8 +14,8 @@ - - + +

    One post tagged with "leetcode"

    View All Tags

    · 17 min read
    Matej Focko

    Let's try to solve one of the LeetCode challenges in easy and hard mode at the diff --git a/blog/tags/linux-distributions/index.html b/blog/tags/linux-distributions/index.html index 827bd17..0401b9a 100644 --- a/blog/tags/linux-distributions/index.html +++ b/blog/tags/linux-distributions/index.html @@ -14,8 +14,8 @@ - - + +

    +Mastodon post about Ubuntu Pro

    \ No newline at end of file diff --git a/blog/tags/lts/index.html b/blog/tags/lts/index.html index 21e4cd0..e09d7b1 100644 --- a/blog/tags/lts/index.html +++ b/blog/tags/lts/index.html @@ -14,8 +14,8 @@ - - + +
    +Mastodon post about Ubuntu Pro

    \ No newline at end of file diff --git a/blog/tags/memory-safety/index.html b/blog/tags/memory-safety/index.html index c29379b..1b26cd1 100644 --- a/blog/tags/memory-safety/index.html +++ b/blog/tags/memory-safety/index.html @@ -14,8 +14,8 @@ - - + +

    One post tagged with "memory safety"

    View All Tags
    - - + +
    +Mastodon post about Ubuntu Pro

    \ No newline at end of file diff --git a/blog/tags/red-hat/index.html b/blog/tags/red-hat/index.html index 216f96c..7ac6c2c 100644 --- a/blog/tags/red-hat/index.html +++ b/blog/tags/red-hat/index.html @@ -14,8 +14,8 @@ - - + +

    One post tagged with "red-hat"

    View All Tags

    · 4 min read
    Matej Focko

    When you decide to run Fedora on your VPS, you might get screwed over by using diff --git a/blog/tags/rust/index.html b/blog/tags/rust/index.html index ba3b2bf..5eead4d 100644 --- a/blog/tags/rust/index.html +++ b/blog/tags/rust/index.html @@ -14,8 +14,8 @@ - - + +

    6 posts tagged with "rust"

    View All Tags
    - - + +
    +Mastodon post about Ubuntu Pro

    \ No newline at end of file diff --git a/blog/tags/vps/index.html b/blog/tags/vps/index.html index 81454a6..ab52efc 100644 --- a/blog/tags/vps/index.html +++ b/blog/tags/vps/index.html @@ -14,8 +14,8 @@ - - + +

    One post tagged with "vps"

    View All Tags

    · 4 min read
    Matej Focko

    When you decide to run Fedora on your VPS, you might get screwed over by using diff --git a/blog/tags/🏭/index.html b/blog/tags/🏭/index.html index 7270622..f865ff3 100644 --- a/blog/tags/🏭/index.html +++ b/blog/tags/🏭/index.html @@ -14,8 +14,8 @@ - - + +

    One post tagged with "🏭"

    View All Tags

    · 4 min read
    Matej Focko

    When you decide to run Fedora on your VPS, you might get screwed over by using diff --git a/c/bonuses/seminar-03/index.html b/c/bonuses/seminar-03/index.html index 523d47e..44d4571 100644 --- a/c/bonuses/seminar-03/index.html +++ b/c/bonuses/seminar-03/index.html @@ -16,8 +16,8 @@ - - + +

    3rd seminar

    caution

    Deadline for the submission of the bonus is March 16th 24:00.

    diff --git a/c/bonuses/seminar-04/index.html b/c/bonuses/seminar-04/index.html index 08e2aa1..8ddd8a5 100644 --- a/c/bonuses/seminar-04/index.html +++ b/c/bonuses/seminar-04/index.html @@ -16,8 +16,8 @@ - - + +

    4th seminar

    caution

    Deadline for the submission of the bonus is March 23th 24:00.

    diff --git a/c/bonuses/seminar-05-06/index.html b/c/bonuses/seminar-05-06/index.html index fec7cdf..8b2b09d 100644 --- a/c/bonuses/seminar-05-06/index.html +++ b/c/bonuses/seminar-05-06/index.html @@ -16,8 +16,8 @@ - - + +

    5th and 6th seminar

    For this bonus you can get at maximum 2.5 K₡.

    @@ -114,6 +114,6 @@ which is encrypted character H using this method.

    For decrypting, reverse the steps.

    Submitting

    In case you have any questions, feel free to reach out to me.

    -
    +
    \ No newline at end of file diff --git a/c/bonuses/seminar-08/index.html b/c/bonuses/seminar-08/index.html index 836bf9a..15c22d6 100644 --- a/c/bonuses/seminar-08/index.html +++ b/c/bonuses/seminar-08/index.html @@ -16,8 +16,8 @@ - - + + +
    \ No newline at end of file diff --git a/c/bonuses/seminar-10/index.html b/c/bonuses/seminar-10/index.html index 6d9d938..31fdd89 100644 --- a/c/bonuses/seminar-10/index.html +++ b/c/bonuses/seminar-10/index.html @@ -16,8 +16,8 @@ - - + +

    10th seminar

    Source

    @@ -136,6 +136,6 @@ it is a not requirement at all and you can still get all points for the bonus ;)

    Submitting

    In case you have any questions, feel free to reach out to me.

    -
    +
    \ No newline at end of file diff --git a/c/category/bonuses/index.html b/c/category/bonuses/index.html index 9f7aba2..094560b 100644 --- a/c/category/bonuses/index.html +++ b/c/category/bonuses/index.html @@ -16,8 +16,8 @@ - - + +

    Bonuses

    Bonus assignments for Kontr Coins. diff --git a/c/category/practice-exams/index.html b/c/category/practice-exams/index.html index 66b4cbb..378d366 100644 --- a/c/category/practice-exams/index.html +++ b/c/category/practice-exams/index.html @@ -16,8 +16,8 @@ - - + +

    Practice Exams

    Practice exams for training for the final exam. diff --git a/c/index.html b/c/index.html index 6506733..d9fc4b4 100644 --- a/c/index.html +++ b/c/index.html @@ -14,10 +14,10 @@ - - + + -

    + \ No newline at end of file diff --git a/c/mr/index.html b/c/mr/index.html index f8b2ba1..80e2d16 100644 --- a/c/mr/index.html +++ b/c/mr/index.html @@ -14,8 +14,8 @@ - - + +

    Submitting merge requests for review

    @@ -87,6 +87,6 @@ For the sake of safety, do not continue without clean repository. Then with comm be main or trunk.

    aisa$ git status
    # Check if repository is clean

    # If you know, what is your default branch, you can skip next command.
    aisa$ git branch
    # Find the default branch in the list; should be one of the `master`, `main` or
    # `trunk` and you should not have more than one of those.
    # In case the list clears the terminal and you cannot see shell prompt, you can
    # press `q` to quit the pager.

    aisa$ git checkout master

    -

    Adapted from: https://www.fi.muni.cz/~xlacko1/pb071/mr.html

    +

    Adapted from: https://www.fi.muni.cz/~xlacko1/pb071/mr.html

    \ No newline at end of file diff --git a/c/pexam/cams/index.html b/c/pexam/cams/index.html index f07d5f0..448d27c 100644 --- a/c/pexam/cams/index.html +++ b/c/pexam/cams/index.html @@ -16,8 +16,8 @@ - - + +

    Watching Cams

    diff --git a/c/pexam/garbage_collect/index.html b/c/pexam/garbage_collect/index.html index f89f65e..613115c 100644 --- a/c/pexam/garbage_collect/index.html +++ b/c/pexam/garbage_collect/index.html @@ -16,8 +16,8 @@ - - + +

    Garbage Collection

    diff --git a/contributions/index.html b/contributions/index.html index 73aabb7..59c7563 100644 --- a/contributions/index.html +++ b/contributions/index.html @@ -14,8 +14,8 @@ - - + +

    Contributions

    Many of my contributions to open-source projects.

    tmt

    Description

    The tmt tool provides a user-friendly way to work with tests. You can comfortably create new tests, safely and easily run tests across different environments, review test results, debug test code and enable tests in the CI using a consistent and concise config.

    Contribution

    Just a smallish contribution to the docs related to the changes implemented on the Packit side.

    Fedora Infrastructure Ansible

    Description

    Collection of Ansible playbooks that powers the Fedora Infrastructure.

    Contribution

    I have adjusted the groups in the Bodhi playbooks after Packit has been granted the privileges to propose updates without restrictions.

    Bodhi

    Description

    Bodhi is a web-system that facilitates the process of publishing updates for a Fedora-based software distribution.

    Contribution

    I have adjusted the client, so that it doesn't show secrets in terminal when you log in to the Bodhi via browser.

    Gluetool Modules Collection

    Description

    Modules for gluetool — a command line centric framework usable for glueing modules into a pipeline.

    Contribution
    • I have proposed a possible implementation of git merging that was later on extended.
    • I have tried to help out with Copr module after they deprecated older version of their API.

    Pagure

    Description

    Pagure is a git-centered forge, python based using pygit2.

    Contribution

    I have added an API endpoint for reopening pull requests.

    Copr

    Description

    RPM build system - upstream for Copr.

    Contribution
    • Supporting external repositories for custom SRPM build method.
    • Allowing admins of Copr repositories to build without the need to ask for explicit builder permissions.

    python-gitlab

    Description

    A python wrapper for the GitLab API.

    Contribution

    I have contributed support for the merge_ref on merge requests that hasn't been supported, yet it was present in the GitLab API.

    PatternFly React

    Description

    A set of React components for the PatternFly project.

    Contribution

    When working on Packit Dashboard, I have spotted smaller bugs that were present in this project and fixed them upstream to provide better experience for our users.

    Fira Code

    Description

    Free monospaced font with programming ligatures.

    Contribution

    I have set up a GitHub Action for building the font on each push to the default branch allowing users to install bleeding edge version of the font.

    nixpkgs

    Description

    Nixpkgs is a collection of over 80,000 software packages that can be installed with the Nix package manager. It also implements NixOS, a purely-functional Linux distribution.

    Contribution

    When I was trying out the nixpkgs, I have tried to bump .NET Core to the latest version. My changes haven't been accepted as they required bumping of multiple more packages that depended upon the .NET Core.

    Darcula

    Description

    A theme for Visual Studio Code based on Darcula theme from Jetbrains IDEs.

    Contribution

    I have contributed support for diff files, though the project doesn't seem to be live anymore, so it hasn't been accepted as of now.

    Packit

    Description

    An open source project aiming to ease the integration of your project with Fedora Linux, CentOS Stream and other distributions.

    Contribution

    Have a look at my pull requests.

    Snitch

    Description

    Language agnostic tool that collects TODOs in the source code and reports them as Issues.

    Contribution
    • Environment variable support for self-hosted GitLab instances
    • GitLab support

    Karel the Robot

    Description

    Karel the robot is in general an educational programming language for beginners, created by Richard E. Pattis. This is implementation of Karel the Robot for C programming language.

    This project is used for educational purposes at TUKE.

    Contribution

    I have contributed some refactoring tips to the author of the library.

    diff --git a/cpp/category/exceptions-and-raii/index.html b/cpp/category/exceptions-and-raii/index.html index c49266b..253d67b 100644 --- a/cpp/category/exceptions-and-raii/index.html +++ b/cpp/category/exceptions-and-raii/index.html @@ -16,8 +16,8 @@ - - + +

    Exceptions and RAII

    Materials related to the exceptions or RAII in C++. diff --git a/cpp/environment/index.html b/cpp/environment/index.html index aefe7ee..54aa63a 100644 --- a/cpp/environment/index.html +++ b/cpp/environment/index.html @@ -16,8 +16,8 @@ - - + +

    Environment

    Required tools per OS

    diff --git a/cpp/exceptions-and-raii/placeholders/index.html b/cpp/exceptions-and-raii/placeholders/index.html index d5f980d..2ca9aaa 100644 --- a/cpp/exceptions-and-raii/placeholders/index.html +++ b/cpp/exceptions-and-raii/placeholders/index.html @@ -16,8 +16,8 @@ - - + +

    Placeholders

    Here we will try to implement some placeholders that you can find in other diff --git a/cpp/index.html b/cpp/index.html index b163ebc..532651a 100644 --- a/cpp/index.html +++ b/cpp/index.html @@ -14,10 +14,10 @@ - - + + -

    + \ No newline at end of file diff --git a/files/algorithms/graphs/iterative-and-iterators.tar.bz2 b/files/algorithms/graphs/iterative-and-iterators.tar.bz2 index 7e1c512de4fcaa9adfd062c0e3e274d30e373b14..b54556d89673f4aa449d29cb57331cc39ede7a4e 100644 GIT binary patch delta 1919 zcmV-_2Y~pK4~q{DLRx4!F+o`-Q(1fxImD3;BYzK`Etu?#0M!%<1E8P+kdm5&8iq{| zP&>Ar@8UO$h zD1RVDJW1)GNsLp}(-73t!A~cuF%1Fg4K&fGs0V0^z3ZvSC*wyWf?)jA49Up}rw9Z| zEmoFTZPiR{C4|8(0tv;2I`hWiP)x^}ip69|qERRS#DanT4oLP8kdcvKsGz{G5=Qx+ zpBt*Qkhzg$i5M0XmSQNtvXn+fV3q=4nSUAy6opkeM$HO^R6|z9%B%&~1sW2{FwPK# zO9p73P_$t|b%_8};3NbDs0c=23f_ux2rZ1)1D<*zCn?Ia=(TBbwE`uV8pdj5lXps{ z=FGL{Q71EZdi-|~OkjND4GA{qMG-+GIMStJ+u6b^3|A7{a+G2;OBdmWE)6D`GJoyH z)eSSQRH2bBQTv9?3&MmY3JticQ)h74ZN@Y^_!OxN6d_X!H7HXw-WjyOal^qBtSj0z zN>)w%;}Z7JIH`^RT_N5nYgnz)sX7K!DM$v$lCHu@JT!6S%t0xI79$|ECfRXv3e02>I7<0JaIleZb83WSm4eg@2eGAVlpsRT zcvE1}u$Dx~&W>YPXA~BTTJ;k_K(e7^^8ksI$)In>w{ zj|Qa<1r6cFPCbQi8x480ki1rc`tvj30n~GaYmLj($r(_y%Z34s>81gPa_Lsa~X4`ry0M20Et!d{WOA%CNdZaWiWzkLY5{9NuBLV$w4n_ z1BPSZ^5F9w_jC@pn@+xm)nxEN_zdKgYf96_r355=u=xnK?)7T1w;e~feyfN4uAzH7 z1AgF?DN9W+Ln{<7CKkmHP(&SZOeymE4MolPK0Jr$pll~YV3;b!>3>qR(7y<=fmzB4 zjLSli&mb}mpik7s^1}r@@3O5(+LvH%LevaM1|*WQO6$ITs{m@}h7oB#M*z|Hb=6f> zOJs1I4{4x64TA9?-W~+d;%r$iNL-_O(D*3S!_TJlh*r4gH}A}@4iJ?p$abFPYhE#m zX2Utlr4X<%hG8I{=zob zNOgIapo9)vXg@#P8i4TS%qOHyY?Xu|1>8JiaF53V5Ro9p5)kA$IwHW3O=e+G=(Nk= z9iw6kiaiKiTz`(@C#0%VsZYFkJc_~SIy=G8_Gmv4M5qC6rNb|Xj(1l&tLDc*#f5c#@5IGvjz=-fRfLvY>ww+^)QrEPIA1jKcZDq%sW z8GqguKKVEvZ^myXY6`fNC{#qS)k!5}&X0-sLUvV;{wRL zHI-H&B|xfClpIFMU_Dy^vl3a5F#7`#3_&m865;3IuG49N27*{=tePfQDijDYuNczl z^l%feaD41?EAK_9x&lz%daQGIIT%7fkzo*^e1>6ReBfcoIutjj$Ws*MJvp9FRQQXxF)4Fgix6=Q_zGwezFk19#AR5v>@E$(!*dRLqa9PHv&m>B=OS1G*Sl|ykJC-ZUsiFv=pfI z8-jsUE7$k8*a?8V;}JHRCHAA&sIK+_z=A=X<QVe^)SN!ibGi7Bu2C=+;D!A;bF&KF9o#-^HRSPH?Zvj<7qlC=^%^gJ;|ze7kjoNaT|L7ji{7P>_5Q FImE)qT6h2e delta 1927 zcmV;22YC3450eiLLRx4!F+o`-Q(1az@V=1_BYz(rCDv@U01apcfam}Mft1vOWW>pu zn9!b+CX7ZS27($iz>N(WFhkHWO-4zkgl$HR8UO$Q00000G5|O-4H^K+rXi+-AjB|% zpfqA)Gyni4JxD?ksPzv}Xda*d05oXO02(yWp`ZhUAkm-Rz!*=5`YXyC?DkGk9dTHjEeC6r;DAqtiZ z(L6zD!h-Gz094u}1O%uEo$w#G#>6l7l&82qerchTlj5>{KTGvfS+&cNV@WjR+uzvw zY)fus5^-()ugOvgj1P=qzLRQmq7nfEP*!Nm{pth~MHuBt{*1_*knss5ma93bVSnJh zv9LTE%XaN>Ec2X96lFwa|$c2oPzFs`hMGk*unfp!cS=MiHql zOJ%c6cs9p=JLp_-RD_m|~o*2r7o=h+dZ%r@^H*S?~x#HF7 z8@?erNXDK>k1~3F2SBY-0=E+nhoI_(Yy2(=fRG@Nep4|seyaL;gr1=>64_RiMxsL$ z_2DJ)`Q`;7rg&Bf^iBaGg@44yG%ak9z)dC{tOV4|guZf21is=HvAKwqQW{`bN>=oO zVFbn+4@ZjcDcp2{*AsZ_=Y1AVh&{78C0f$7_w=BIkBS~LEx0e;H{|7)mT z_jopMgrQ1WX?hu0p?NU2D0%`Q?nN-C!R9p=HemQNA6)}kJRY)%cz@#ym#-E%I2jkF zu!f^uO1}7p={f?RLmSHs6!N~BwIga>fxd;P7?2CaX(XJ;Nnr55oU%p_4qAsZ!wyG0SO6rr=j z$kFh_tH`|MAaYwl_`d+u2Toj~dBo+(SV9n8@!}hVdmus*BpAX%9A_UqSP}`iW)%*5 zOuJ*eHXyj8&VPl)$lXNql}dFf_>R|&SUl%HXgS{YgWm|104=;+GVhVj>gQE_nCKi~ z$Q%5H5h)lDLW%sqsQzGCI>4-924oQrhq?j4>(>u9`1eeP;lKHBj^cUJwz!xAVmpJ# zm{4i};B9{Y-z%#p@+Z8U!0 z+84B+roBW>*`jR^nBiY(2w#gR6x&)5ZgFX0uo5Am65*SHB)O7!DPbBZ1BqTBB1ks^ zqg7f8RC{w?)_U@tJlP2)tq@;!Qr>|h&6BpJ+I0}#d7k{M7aPp}X5#6LN$ zT5u2hT!h~bc^T)RS{4+h|HEI3Ksnx!xTqsAR2V8?^0KiC4l1B-x}6n5+NA N+>uTcBp#alFMt4#Xl4Ka diff --git a/files/algorithms/graphs/iterative-and-iterators.tar.gz b/files/algorithms/graphs/iterative-and-iterators.tar.gz index 6e2eb98743b2ec0cc47f89201efa63a514f5c368..e29dbacd17cc48f82e9176e8b43a6e9c72e1db23 100644 GIT binary patch delta 1948 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 delta 3150 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 diff --git a/files/algorithms/recursion/karel-1.tar.gz b/files/algorithms/recursion/karel-1.tar.gz index f1ae0e0deec4adedd0de99a175f6cd25542f121d..06a151e691e2019dd5594d1604e3c16a32f2ca66 100644 GIT binary patch delta 5408 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 TQ{3!LfdmwLkGAm`A$b1-U-y4= diff --git a/files/algorithms/recursion/pyramid-slide-down.tar.bz2 b/files/algorithms/recursion/pyramid-slide-down.tar.bz2 index 9ed397543c16bb01768c12b1835cfbe55d02cb3c..280d8e451873b04c172ea01be5aa540294f867ec 100644 GIT binary patch delta 1430 zcmV;H1!?+<42cX5LRx4!F+o`-Q&}-)Qz4NKhJQ4m00000000004FCWYBp^ZpX{L-S zpPCa1s%;Nc-l)^siRv0NBsQnC(lq;ztnijUHma(DSrI3XugBL%X=3KglrtQ}lt{5; zL*`ESqNt@xZhkbS6?@3Ba>CXsm1>rytW-M86t&o%J6S5_v5Km)_9Dd+QAB^&?yTAx z$$t^JsF0k+A|zr&k@o%`p!!GNKaAB$^3c&OYkoAR8O>ahTa5n~G=ER2>w6_k6qH<| zPLhQS;;NNJiLuhp(vs#qESSn)HvLo)yK=f?))^z zK7Ae^q-8OcoAh@cQ=PtXJe22SqO#rm>3?eCJ?$pH%(VHr=~B|U?Jy~uvf&{)CNV959% z0>)>+quOjy>w9}b!oq~+^R40@41B1=*=s2y#hTE=CRbEnPo#Q%2MaW``aGOGZhx;O zH|^=&i`QPuvh^D@(>)cDIx^Q9+riHX>E}DS^>W~YiecJy7dcBEhhby1T%)we!P;2C zp^=$JW~POViYU=1&kDIT){@BrpCsFjeksvG$_o}T{&l%$^bsC;S$Yf+U3GO~WAFtzqkwqFe z@*H#j961ZDQdpxiB9Ae~SfaxSWtE2FiMXJm#fR2Zj#EQZaj}t+MUDpb&41Jvp>oB9 z*sE{min$Z!T`c}yD5C`t z!v+mXD5G()gE5gtv__O{Yha^OVYs6OQC5o!lwQXXa$bbk$jsnmZ#5V;H8V3f6kNfu zxnksv&5cb>OwCOV#(#$6V?xHpV6mxU#>Pg549X;CW>|l(e0lt~^ZD%;sGap^ z`z>m}J&WVN4g1Y!m)(ERDtjojtH;G;o^nK+CO|oaN(7cfo>Mk$5D0=00)Z;_0|E4~ zye%SCKZLC>^(*Z6WOC1g>JtapAFyjQ-NM;!|GDpf?CA$`r>(f?l`69H+C{7U2Pv}GqOnzDALf!gGds>Mv->@hdziHBwEB!6*tBvXY60~Td65bxc*6aWAK delta 1432 zcmV;J1!ww+42ld6LRx4!F+o`-Q(0+b?l_SShJOkG003wj00E%T007Vc0a8K;AZnhN zj4FAdFq)Z7KUDUp)7qM7XpbZ|r?k>E`_HKG7C%O+s)1P%CvR6~mM(S_UD%vKo;`W~06RKZC_ z$|UG0P`)auR9Lx23lcF!${?bMp+u63B%+BFQAG%%f{GG~B8nvxN<9OO$=h6fyT1R& zOmNSi!Sf8JGP8D$vj#`F z_ZBlf#U8U^N2TlS3kwPpo65IH`7!XL4^^zBj-1wp88W(}`h3IB<~P};r_18s;eT~_ zsk>*NZZBPX7iH)+G}Ap5kva0$8r$UI3FqKA5-OoU{pK+x7^zbH`}s&1FSRN*!k92 zm^KTRE=b-eTv0A;H8nLeHGecVnj1}qg^h+_v8iIl!y`imWfC(pEI;SIJia@5e71|! zPWrR=t!lpu7sq}Zw;InMvi~@#>Y~!G9`%wYMomMI4`UL+1(65JbGL9{L=0dS2w$)q z2vb8a#ETQ{m8JfLeV)vYS?+xTVEY5<8qGHEwp)Ls_P_Rb@cau&$A3tmsC%(X)QkMJ zg6~hH{kG`8wj%4(Ra*Xxrgpe`bI_`k`=^Zfr=RN|xO1E|X3Zpbm^{ab<}5KWBjB4R zli%?V%0$~9%I?T{%bs;knjQ4LS$L{i(dON>uvCP5A9?l|c63qWDQfAw3>+IzAjn~K z=#nmngL&~bJkopxLVs!*ME=~+{10I9eA%3mP@Nh!7lV|J@x9F#lB7}Aa7h=4Zr@c= z__KD7zs+Natnnhdtk>{en7xXoSwjO@JTPkDWaT*s;HX&q?mXGSaMnH|P}(+0#42)1 zs@~`hCC#$|{*p1Z zq-zwT`~Q#8iMmv(%gbpNuhcnBi(ZPwRg8bSNbpSWIJ(d9^-a!V)TvpXL$EyI#^hBw zWi1@_Rw}mOUw`YIjziJu-&5Fg%t>*aAF$qYRN=s#0N`Rq(AYm_=;=_JX^ISl#Dz&J zN)9O|$x4xjq6~)DBiLV+xH?19)2oo!AEBP1(&I{THW-6+N<^0GrgQDQUGnGEZLFmv mjVCZ@L#&Ye;>Ekp!Pq+`WL&VYg^3^JUC9*TLP4dIxB=jwzQW!B diff --git a/files/algorithms/recursion/pyramid-slide-down.tar.gz b/files/algorithms/recursion/pyramid-slide-down.tar.gz index 4fff66f4c9cd83b41cf9bc498e7182d9fec52a4b..47449124493cc05cdcf7178c22e6f560ee7abd43 100644 GIT binary patch delta 1325 zcmV+|1=9MC3yuqr8GncRZrChT+ig{?+U!=QY|6`P8(c)9w``f?q5B2~Z;o3Go8lGc_ z--hRjBf{2A>%g!b*K}>uwVVUpa2?k=0DT|McVU@kegbfiEPun0CGB$4X!6gt{%;h) zB94*__)zzjSupRtO%i{Vo*o{?%g^&*0+YF)rjXAGxIYAh>ci4ycnHD_=219fX?D)1 z(N8#wI(YJOd^v_#POz@h#3G zcU%x%)pV8PntByKG`SUrovN?leVDNsOL}MTKm7IQ+kf9a{agZu1El;9b)_EwGwHO?qQfO`?Uyw~$woJmJxIV^@lvQ%&WpWb*Q&{*x*g4OVAe`YO z@RM0u9HjGAnz2PMT4uc%MY7J(1uiQ1&Ug(+g|Mq)^RQD}fBAai3#~p2?!khG`Xaao zPXoKT$A82g4cz9=z6Op41C5*ARI3ZaA($2p`B98l5jH)-Aw0VBgE=;f^SLc=bN_jJ zPICqWjNffZ-QZQhZ{KX`$Mh}K@1u;Nx0Fv8_3N9`l-m-9fi*NVESiRqqE-B~1l32U zXv{-n9+yU&cyPUz^ak9g2*E@}7ro%u!=MH&Nq^ZG2LGBU=is-G)@_vU>r&5ZnL$Di zU3ey!k=a_j?Ma^l9>Snm*Wrn9eOpFr@`&-=0M9vSV}LdsY#S{#;c*#;^vl!Ci^B)d zCdLiT1{gRE%53PC-mZ!+)aER$}_)OHEYxfKlUl(Rgf}C|s-7x=PBb zCMvXzTt43{Z*;eC(Wh?NR6y;{@jpl3=8(uQkzXReM1G0<{=d+`|33J^4cjCAdk+88 z9h>;yOQ6L6#K?bT`Zuc4KjdMYvAh92ZI9)C8Po^e;0;f+6EvX56>t=rr9km_3>2IqGcg|iBw z-QkQ&mzi|y z40&&_^vqmMiDEzgJgrmnZ*XT&%y@iR%&+}U^(#?elnFDW!|AVV)mfLd;gb&q1_6AN j76mB}V;gJx-0AFE8R}J~Tx`^nP6ap!MAQ2g08jt`NAs_@ delta 1325 zcmV+|1=9MC3yuqr8Gpz11!LGORNHM;t=jBXO|~x)s=P2EZjEi(CJD;szxT|=;435% zn|7u13FN_Z?lWV)u^q1xZ{g2Q(!igwlUZ~de*a^XWzphOtpDxZcn5ocf#~;o{Ajw4 zDSn%-D~^bsVc7>}&*>YkZQ3@TH~Ws`9)PhA=ew{>GcN%+NPm`L$dY!sSv37;TmLr- ze-TGX27IXXW#$L^+a&Q;>FMENy!;&aQP#((Ig1 zqn~gVb@1fnV_ur|N5XA7*UM68-G`hrj-O`+wV~pX=db4KNKj9>JNHUF!?) zt|Ri*@+7)toriK+i^1_Jh2}Q$1=)mU%Oos{8x#CUStVCqCO45kgN5gZo%1a5!#Pd@ zFPW#sK{{Wh8C&SlGSg!e$vQ_DxTxSe^EDh5!mf%1VW+nK^7X_QT74GWgAEV$MQ{(U z2EFDU3x9hw=r?x`G;lN+YTWFmT3r~8z_M}3k7B%vu-Op~;n9`n2iPpm=eE49{pamE z%^3_a{(ej9Ca(&92Ubfzrf;ME0A)<0rF@2{-@uZl`YmCYSVL38qG=c@TE$OGPy=*| z##}V!a%r@QhrZjA-jMqgAy}x`M=$twF{oinQhz-RgMTfQbMQMr>pheo7*fw}nL$Di zUAPvPk=fe3?Mk0R9>TC$*Wrn9{ho~0;t}JyA)a&4#t>~d*fv{g!s9Yc>6fRO7l#j^ z%Lj>9VIY4yZIv=*4BVfsWX+z8fyd(TxsHA;m*>HAZMGvuqc0Z?sti!n5d(x~4HXu4 z_kV|S-tf}eW=ly?jAuVkUTv||#NZ92rJ*f@6&~bFvr6M5*P>~-z1Gzz#10=0|7%J@ zctON<{{KtD*le{o_P>+=+da#u@_);6i2uI?N-STF{IfZ}CZv!s$;LDaO0541I)d~z z5N5N=R293*Nigb7F45kkk&1E4*eQtVcz;w>+Dc5ne5r{FA24n_FB*@H6NPKlT31O~ z)kKB1k;~_s<&EwZF8b6hn+mAiIsWGu+Z+=4CGtz;m&h-X-~SgH_}>T5zhQf%f6w86 zhGP)_dkK{IpBVYCO#j9;`iDG>GnO}C1GZpcmcqMe5qpXEIbd&cg>m8E zNx6}lT#{Wxom>!-+S7AI}znQ3>ih1SrB^!fh)&eVdtezHOlJ&(en7mF!iR_tSr4AjaW4*Z*!=Z z8S-Ae^vqmMiDEzgJgrmnZ*XT&%y@EH%&+}U^(#?elnFDW!|AVV)mfLd;gb&q1_64L j76mB}XB%t#-0AFE8R}J~Tx{HvP6ap!RL6-&08jt`1e2Ua diff --git a/files/algorithms/time-complexity/extend.tar.bz2 b/files/algorithms/time-complexity/extend.tar.bz2 index 6bd49e67e0527146507dff3a51f8f32c0e37dca2..0dd18fa4d3148cb4d8cdff4c464f88b3a9c41b75 100644 GIT binary patch delta 4054 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 I2WLcxV1X2FF8}}l delta 4045 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 W)Tci6sZV{{_w;`#l}`fzpa1~uEXZa6 literal 3913 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 Xed$YI`qG!a?0fk?Kx7C$0H6Q>gy^X~ diff --git a/files/c/bonuses/03.tar.bz2 b/files/c/bonuses/03.tar.bz2 index 02a2320c29e78456db581f7863e6b43b46253d1d..b93f7905722021e78711567deef12f911591ca74 100644 GIT binary patch delta 2610 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 U7FlAVAO0@nif{&@A^$^0P_N<$<^TWy delta 2601 zcmV+^3fA@66wwq8LRx4!F+o`-Q(0T~pFoig96 zO$LUBhDLy70imEY(U1TG35X322AXN0(9qDx&XO0_E$-}u)r;3fIV&=9#97h*Lux2*Od;EX8}kmL|IW(g#2d5-u_>WU;FFz zP^CV?l%&b*R9#c`DWB?fYk!09O_fxtZ{5RDdQzqpSC?F>s+g9#VK7-k&x`4P=hXG7 z%5HeRmM@+ASUxL%RyTiEO0m%%xi4%shfVxv__)X8UM zMdGR|lX)4jQu2j-a>X4a=>jX*X;lM7MdXyI&=6>vysxvBJSUrBvVTOeXzZN|ozv3D zEN00}YE-qE-cJS$9%7m{b`+XY%UC{txA^PW;BvZW&i2ilo%Qt6={S_+E;Dl|`WZ4Z zl)bQB-$^r~r4DBw7x3vGc&G7MW^=DCA!;+|$aP~Y1{agIW@|hPU7phfiSEB!so$IN zy|SkO<5+wt=WZ^t&VS~PwmI=KPDb}kQn(krnXyWqjs~UAA;98iC8N>py!VaN&&%e? zF5Ns{)s{Z#uk&KFdx4`!j)giCslN(&IPqmNaV*)U3ez^Ta$u@vZ+kRww8QjUvr;=dHuFoB?x94^-a9g5!oeWQL%bd8nhkUXVN2%F?UA{GZ4`@b&=?u;~~8c>K9wtc^mkXns83X9iCh#GsdZe$(5OH zIi{^M6!MRC(b4|T=5WV}N#T#=|4kUoeRW-nwjZWYZc>(dAD$2FsVrCOSosQ>sZy1q zoe1elCt&MU6_orRz5E}r!w+!Rx@k6WGU?zgYdTwRw*pg!Sba)Tl&DcX zt!DFd`!6)S%+p<0Ty~2VGj%}iIec{K%B-DEqeCm~wDCW^8g> z7CVrKcdOIuhY0pZ>Vr1z*?v!Cq%`IAE|ncAD zDu2bKHBo6(<*N$=lTNf;jBE?CuyY5CW)5zeA z(V(5ZC5}lWaJL_w(AK#`-a;FxKxQSo9)GU>1CW&c%7$pr(NWNtM<2Bxfyl$mj$~z` z&&@GgP>(%(Z*bicoa9hgpka_e_NnYanHGM>)pZo(=J(&NbMm=j=wj@h=<$>N(d>9A z@DzmKl2uLhxabIx|r932R>Nit5D?^+lN zj&JA|c(LTN>w!jZ6ns2UHoN5p)6gz~#aF>7rWIVHngsuu(F!Sy+p<|UgC-HC63J17 zq!eUmWCz~7w`v9gqhbwK1g9VoDHwQ zP_k4~JRcFn+)4Pd%1%>L@K9XAH96WiT2bkT6{oyE$wFA!QY5nKkg)hFGY!Ia(myF2 z3{JjTXmA5*fOU-ryq;m;ZGSRF4^Oes(5i__R6KNsYigLOqe;Tbd@bv*CW{L+o(}3N z)k;^bg9CAbQl-+PmO{xKj)Pa7gNYf(!!c5M7`L=aKRHPwGilWk-yJrU(Y>}lslYxD zer{Ua^@Kw6 z2M83Itu#?VVOd3@>ZK&PNogZR5-`FI9Lagj8z8{Dhiwi=}W9q9)IiH8Sk=@DKUj7T=jUjB45yXB+Wkg_=fHnH;P2w$*k~PS zQZ!joswqfw%SF56XLC{%P#C4P8JD@pD$ewB94sf+`#>HBtMH47lolW+#sg#pc3M5IuV6a?; zMH>#h-eS-@RGboMGm|GOQ)Idtm#J$-By**ZHkMShUqWEf9jmd4Dnzhv+%r;zNm6Fx zCUL5Esx8M13PtmHv>#N>=i-^fO^JkmDgCDRwbYoY#!j4RtCfm$6dk3Oj#sI^T{p#= zuPCIW&n*^e2oV+((bgf7yk^4#LNwA+iaQi6lX^trki3fWqJzM?#fu7ve{pvt LQ-uiyziIRUQWEdP diff --git a/files/c/bonuses/03.tar.gz b/files/c/bonuses/03.tar.gz index 399e2c57bb9f93a8e499b6bb63262d42856dbd67..4008bd8c1be00f6290f7b5aec11820e91f0398fc 100644 GIT binary patch delta 2219 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 diff --git a/files/c/bonuses/04.tar.bz2 b/files/c/bonuses/04.tar.bz2 index 56ff0debb8ee051bfcb8593f224b187faaa5dbc9..5de1f4c44e476c4c5edfdcf3804f6c95d8fe41a2 100644 GIT binary patch delta 2543 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 diff --git a/files/c/bonuses/04.tar.gz b/files/c/bonuses/04.tar.gz index 57de5e4ef7d74047e73fb35515e90a5aab8c4c85..84d0ba1fc4f4f20179fb1b43d8c7c5cedbeab972 100644 GIT binary patch literal 2500 zcmV;#2|M;5iwFP!000001MM1rbJ{wxfAc9c^yUgFAwWqo(~`_l;$O<(aC zTYxUM%th^$3%(8pb zAM}*puA3L=edoHEL+CkjIS@t+Ph1n+P2!hOb2c-vN6TjDeXAvx_8n%^iFt>(JDI?y zvGE#FEW|_mpD<%KgJnX40qb`c&G&tjU+zT?+@pQ&7$+0zR;z%hnWjMh<}eNI&#<9U zhv@lY4x1bcanmHZ?0;;9Mfpg$tC_G_*B~}(y?hCC5J?m4sJ=c`1CPP4gr{&IzqI!~ zy6Uw*HU|n)TfKqWhw+}GcDm}Ba@A8>Fi~8U@bl+D#)BDV7U7)C@jg2ER7VHO2QI~+ z1{oK?u<-9?yYv2&AhFAi)a$;YN(yST({HQ&!CAX|QeATRZ%6FILZyD-h0Uk_^;QG>TB_ToW=i>KwA8dY}*tWASNktsx@fkt=8oxwSe zG-@EzzQs&X9N8{4%98d>W15A=gmDMz4~;p<9!pYC-o;;H5;48oF)ZQ-`^@aUdT(9q>SYKnuzKMaoi= zdn}fGWI=DNL3I{TumOYJ5{?C{gB499b-8x~?;G9W>V%k(Ki;=+5&uF$+eA@-mF0gBCaA zz^rT05ZXfh;ye_CYDg(727tYlmTH!=mJlc3vFdnIE#CHEXUi90xs6Sh5k{as)xjbf z?Ah}NFJ^dH|A|_SQRNhq$<#p~yr0eL?!g~eZUm|l8^T6Zw=GYDF>4Y-MyN!fZxl+X zx9p+HU=bvLG+@-xoeJ8+-wLsI@pQ0w4O?lWk)&J9AS-$;XSzqocLREFJ;6h~odg^u z`EenC2@GEULG#5oa(E1_WMR2ibOHsMd}#Ri^6llzBJ#*YafG@hj(BKzJCHA{C<4M# z=`Ld!s>BoYPZ02nV7TWy*h_)^^-XRCSM;0r)=tc^cXNPGnEh$SOOLZKRR?^n+yY*BRN=A=JgI zYwuT09PkT#BgAw`aj~gCXs|19GBN?QF?B5jZMZ5TSw@Fu-aJZZg@ReU`i)Mf+fjbC zUMHykr;o`ax&E(Jq2^z!|EpR3{}ixN*PCP{i}+}u`B5SKza*dDb+0>T>bdfJ_;t`z zn*HmZzodITP`mHcw_>XA4YfP(+MV`5Q7^jPt5WX%O|+P~VzM}v_qU?>_sX@A?F45( zaiSIGCHyT)f$uoBv~2mu%woVtkfg&HizI>07EjAPK=n7)bRsTpMg0jx^22%KH2-iF z)xqP|4Qu*-j~!uVB+a~{6{L+tF+K&EMUve`>uqt-s+sXx58A9K_Ldev(71`=5uOk# zuI$U`ciV;Ik0On8*OFzRZZkoGidIkZ2K2dRx;WKfu%`&U?TBr#?T?cSYGP#@<4Cm- zO86AIRVd`98VAK-P@K3c7afTqh*}zTp{u>~9PJ6t(l@`eaRHzm-}oJO7^o;_m+^acf=&dHLaY(54` ze^3}{oan(0`qyveAfIWsl&dyX9cZ7p%dq$DaoMA;sHl)1l=HFO7ee`RIbSTTO;*;2 zpm$s!tZg;4TCJ`0TQ6UIti zkCA#FBlWAThBnwR@KbJESQUW)rO}$ZI!qH@ue!4|4WvlD~yHmj~n)kU}OolWODzcYKgp(`ZI33ROp?lJVtK7qwTihs0a4iJ+!@?SkCJEbh zRC^qJS=AiXnPPQuPnTL2{a`P#ZB@NpFA*p0L+monCjWc8^w0ky+K)@AkG|j2!N!9- zvD+Ayhg+wE-P?`iKp<59zhZE7@&DhWApwnNS`&SmTn#4(ADac@WZ%8nT={Mjn+h## z5Z6kRakGfSSSjLa_TAkuT?(kk*NgR48Rk3NDb`81J+dCkPC`P=(tR}J|@k^48?2d*ZQiTK?WIQkU<6+WRO7y8Dx+_1{q|KK?WIQkU<6+WRSt% O75)PJrW?}$PyhhFi0=vj literal 2499 zcmV;!2|V^6iwFP!000001MM1rbJ{wxfAc9c^yUgFA&`({rX`u9#A%r%kO!pgo4(>P zwg6phnUieN^i96|Tgf&UV{A&3++Ck{CdHPtyV{@Hm0PLpHLtW=d`Y;&%g#6F#p6Q- z;HXv;zt!Wzs(h~=AIo3ySUcK(QLP;wRgMp;2L~`-J*e&Pzd)5I*vksI+|d|9FPKXy zX6x4(wtky5|9=X)1;$q`LW$*CD#QPA3ByL=qtflQI&E}Nt`u{*m*|?=|Hit5beoRI z*kzhSY?_;TqXmwEfW|7d-JwlgzH4dUaWTiSQ|NVWx=p2r#7KGK{pjA5@>yx#^c(Lk z738f4Hp(}wyN)(AaZWP~70+J_VhQ@kpFX_@Kp|96iY#+5chu-wm;~PQDS-yOn!YF) zgtDf@#0=eOj1oHLIWj_p=2hcDQJZSBb9LRiRJv;G3|%$)%?}_>)70n~b-KVMX4wPk z^}EV%H;qg5zI{{7A@mZt90((Z$F2$PCh<$CF`b&&qh&MnzS)#Zdk(Yd*t|#F9gktt z*m#2|7UH4ZPna>A!7`!2fc5!h<9!e17kiNd4``P=#>tqv)hZxrrYX?BIZQ*lQ*3C| zA$q=;!zRZ<+%!q9dLNr%Q9csxY9?&fHHeLxuV2F)MA8^Ls;^Jgz$5T0;VB%*FYNt* zuDh*|jlP1^X1A~QV7#lS?T&h;Tz8cwOca+T{QNnPac_#5MK~ujyo>fe)zF^uflD!{ zK}H2IEc|=bYQO&^NNlqs^`@t&l7iZ3_gZSNf7a@pR2Lln+Y$S?P^s;Cq4bnIlJkG1 zTCGI#fAtuCvi$!H@RCs7bPbI1UW(2`Y7B7R2lsuB-zg9b{t;GLP7XQxzY4Ja_ZBt}`n4}OMVo(yuM6tKC zlS4b`UqeRl2sI~IzvT$(i>VDM1WGLV3nP>hz;q@US=h1}6gyL_lM%rN8r~y!3gMWpO0|vVz91B)^Iq+Mk;E*s7x+BhnP*v)P7obQ7DfJ2X^^Q+DJS4a* zkHE%)oW8e%`kk|mVDJ#NW)H*8_s;;;W(E}eP*De(_stvDlBG?Ttpk{`x|H=;SfNrg z+BCfEju_4aeUkqIIh$g{?7M(+WU-j(xX#pd&`e`QR?c^zJI~+5EEpZi%P@`(T3n9< zv#v!$Xmj<8^H2<`A*C!C0QOc|s9DNdLY#cZs^dvDf7^kbEna}-CN^0_7=ij!2a9O1 zXU`wJnBiglCu%iDl@mL=SLBKD9;g0WMuLbtkx49);(R0pmPUd+a%0d7KYv~hIn5!plk*;x!UJYKo zS(%Z#avibF!mIWxUrkXMGOXRMPI+W!X=Hm_kv&Z#t87KKo<{c550ZUYWn@!_P!}(+ zeONYez%THP5Yq+4`KJD$!LGc?$OO>F)U^<_;i`ya86BE=`y`Hf|EseU+)!uuK_6%p~+h6LS{6zuI|ImlAC*qNK{#W;F z)s^qRmFiJ;{yzuA-T%q2WEeH!1ixyu+KY?6y!?_1OTw2QvYA&I=C0`!LaD<~23zHh z5?aYm_}df^@%-b%$^tJ>o_L8&?m#x80spV1FmIpfJW~mZjb2ab_6t6plLbfFeDsxG zzcAD|(SsfIZr;g3KGp6hS8b{~&^~dOVei}HqDNg)Q6b+i=VQAsg!1KbzF1nBtgH?} z@3=a+ztPZgwYJoAt%`Ju?^C3?cnoONRjdfHE_J4-G530VMz`9j;0%V z4fH_-*s?Sds+Q0`Ja53$u~p{XBy7p|Lh#)$$pDv3tEChl2bLxtrE$Di&r)!#9+t$# zQ3A`rw??*U+IL)?XHy>aFh5HsZs)XIo+UX@qIX@aog9?Q^*G0p)*-IFF<d(T9qQ*IN)cDHZ|{cbQb0w%TC6Y2Fx%Qru}-?_k@Z-15)xvT?u*IoSE8KaT-pw| z3`b?GmNrfDF=;ktC|*my)>r)uGRPo<3^K?dgA6jrAcG7t$RL9ZGRPo<3^K?dgAD$z N@E80i3}XOL008%+@kIat diff --git a/files/c/bonuses/05-06.tar.bz2 b/files/c/bonuses/05-06.tar.bz2 index 22b1be05e63c096874cf863c14815eca8fe38c48..3884df2f41c28ed748402a380ee79ae93a44d086 100644 GIT binary patch literal 3628 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 literal 3650 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 U|Asxnf`9nCk}1N3gLWv3Sdw++IRF3v diff --git a/files/c/bonuses/05-06.tar.gz b/files/c/bonuses/05-06.tar.gz index d21ba796fe1e22c75b91b48bc3ef377c452ecdd8..99c151da16bf509b56999957deb3a123e45f5276 100644 GIT binary patch delta 3378 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 delta 3351 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 diff --git a/files/c/bonuses/08.tar.bz2 b/files/c/bonuses/08.tar.bz2 index 2d8837bfdf93dac61a132e761dd5ba15468f2dac..36a5623957b56bb242a02f419b479db9027ded5b 100644 GIT binary patch delta 73857 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 *v!TajUs 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∓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 z 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 M$rRy2Los^uU^JHrivR!s diff --git a/files/c/bonuses/08.tar.gz b/files/c/bonuses/08.tar.gz index 29c6425589cf2a6a5919ce6582b42710592a0486..6932acb5ecc584b519123313dd78b578e0e5e4b1 100644 GIT binary patch delta 64317 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

    gx-qfZ{!-va()A#Wt5va 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

      yPH{K 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 delta 64317 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%0A|L~MIniTwN^6zuG+H92(NA#;47ORsG<6JTn` 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 diff --git a/files/c/bonuses/10.tar.gz b/files/c/bonuses/10.tar.gz index 46cff80abd4af27ee4e1bed4e96f6493fca93c69..5b15e32e4682c5d2c206aa9768936089ed1bc4b3 100644 GIT binary patch delta 196448 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

      $()v)yYU>TIgrGbf{UOBW8AV8J{I; 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ℜ$MX zxRKAx>ym)Rgv+U0dIq41H^Ly2fIujZ@WIgLV2k-oc;AoJ=xDXC>|NI#kFyzfv(xQ~ zGV?y#)|uPo{6};`BQW&ckW;(l?h4#W{Gk6Hi$~7$g4VlP*kS2-ld0ecw9$3K9$_Yj z7_aMHld}^8evdgS3*xgT3R{R#e~bl4EsZs|dk8`!$AA3EvqGm(j~;`DBC(H+km^xX zsc9#_W5<`fswyhRxu_r1JQ0G3{O2bhq^FZ&0Dwp-J1-Pq`@g^Vs(hlip77`GB9OD) z<&S>MZX($9{Oxp*dI&Cn7gx~02(o`o#yXX0`(Sk~fy>*sr;^NwcqGXGf05~-sqXH# zJW-%xGdDNSOgD^tX3;;=()=pJ`Jy1V1^!^5@zJ8=;W8FLbAI(1%!!!V%I+4~kXlz( zgxo&0TF>yX>Z~!dXvt)ouqVqs#WuVOg&%Iq)=2~h0MPt+w17zDIKNlGV$;r+_wLlX zFfe%R`0%N;wDhqC%)eda>y3fr=Rp#WeV*{Qh3 z1T*2<|Nh3f=ksW0E`c3A$G|C=QsAKY(;{lV8!;H0n-SZ4AMN(P@WJ*Sw<8`b&d94J znOlNnnS%!_PZe1K07IG5OLJxVj@!Dst39=y?w;F->Ho#jwhLi;f21<)FH76GCQ-|E z&05gmQm2MN?wR=48jS*p)EI!@OKn4gsdwp}76L23k3GdzF~F>|`h~u3_87iJ{ky6;Sl@BnJa4Ye^swqGDH;)9pc$7wjw1q2X%S-+& zv!xNHPq|nKFPJFpwC))ZUa*b-a+(5{@3(~3PM=>qzpy4ff8usilvD`pSusHY=-BE3 zN${){vzgQQ=x5jI#6W&B(=@x`=VbZe+j+cpmlN3L)7$JMvuWrw%?AbV]Kof5&Md55%}=)QWkKKUPy?Vg_S>3sZO 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

      mf

      blog and additional materials for courses at φ

      About Me

      I'm working in Red Hat in the Packit team and studying at FI MUNI while also tutoring some courses there.

      Content

      On this page you can find my blog or unofficial materials I have written over the course of teaching multiple courses at the FI.

      Mastodon

      Feel free to contact me on any of the following Mastodon accounts: Fosstodon or Hachyderm.io

      diff --git a/search/index.html b/search/index.html index 121eed5..a012160 100644 --- a/search/index.html +++ b/search/index.html @@ -14,8 +14,8 @@ - - + + diff --git a/talks/index.html b/talks/index.html index 580caca..0ef9f8f 100644 --- a/talks/index.html +++ b/talks/index.html @@ -14,8 +14,8 @@ - - + +

      Talks

      Featured talks I presented on various events.

      Shift Left Testing with Packit and Testing Farm

      In today's fast-paced software development landscape, ensuring the quality and reliability of upstream contributions is crucial. The traditional approach of testing at the end of the development cycle is no longer sufficient. To address this challenge, we present "Shift Left Your Testing with Packit and Testing Farm", a talk that introduces two powerful tools designed to simplify and enhance the testing process for the upstream contributions.

      Packit and Testing Farm provide a dead simple way to build and test your upstream contributions against both public or internal Red Hat testing infrastructure. In this talk, we will explore the capabilities of both tools and demonstrate how they can be seamlessly integrated into your development workflow.

      In addition to the current capabilities, we will share our plans for Packit and Testing.

      • QEcamp23
      • virtual
      • 11/2023

      Packit: RPM integration, all in one

      Do you want to automate how you build and test your RPM packages? Do you maintain any package in Fedora and want to automate the releases? Or are you just interested in CI/CD on GitHub or GitLab, Fedora and integration of upstream projects with RPM-based Linux distributions? In this session, we are going to deep-dive into features of Packit that can help you do your day-to-day job.
      • DevConf.cz
      • Brno, Czechia
      • 6/2023

      Also presented on:

      • DevConf.cz Mini in Brno, Czechia (3/2023)

      Credits to Paweł Kosiec for implementing his own React components for talks.

      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 Lcr;if6xja)jdgB4 diff --git a/index.html b/index.html index b6c3471..5f57c02 100644 --- a/index.html +++ b/index.html @@ -14,8 +14,8 @@ - - + +