diff options
| -rw-r--r-- | content/posts/2024-03-10-the-abysmal-state-of-linux-in-the-year-2024.md | 259 | ||||
| -rwxr-xr-x | templates/base.html | 13 |
2 files changed, 266 insertions, 6 deletions
diff --git a/content/posts/2024-03-10-the-abysmal-state-of-linux-in-the-year-2024.md b/content/posts/2024-03-10-the-abysmal-state-of-linux-in-the-year-2024.md index d3b7bc9..da526c7 100644 --- a/content/posts/2024-03-10-the-abysmal-state-of-linux-in-the-year-2024.md +++ b/content/posts/2024-03-10-the-abysmal-state-of-linux-in-the-year-2024.md | |||
| @@ -1,11 +1,13 @@ | |||
| 1 | --- | 1 | --- |
| 2 | title: "The abysmal state of Linux in the year 2024" | 2 | title: "The abysmal state of Linux in the year 2024 and a case against shared object libraries" |
| 3 | url: the-abysmal-state-of-linux-in-the-year-2024.html | 3 | url: the-abysmal-state-of-linux-in-the-year-2024-and-a-case-against-shared-object-libraries.html |
| 4 | date: 2024-03-10T21:41:52+01:00 | 4 | date: 2024-03-10T21:41:52+01:00 |
| 5 | type: post | 5 | type: post |
| 6 | draft: false | 6 | draft: false |
| 7 | --- | 7 | --- |
| 8 | 8 | ||
| 9 | ## Personal critique | ||
| 10 | |||
| 9 | This is in part difficult to write, but then I think it is necessary. How | 11 | This is in part difficult to write, but then I think it is necessary. How |
| 10 | come Linux is worse than it was 10 years ago. This may very well be | 12 | come Linux is worse than it was 10 years ago. This may very well be |
| 11 | a subjective opinion, or maybe I am looking at the situation with | 13 | a subjective opinion, or maybe I am looking at the situation with |
| @@ -61,6 +63,248 @@ tried to solve some of these things, but until a distribution comes out | |||
| 61 | that is completely devoid of shared dependencies, we will still live in | 63 | that is completely devoid of shared dependencies, we will still live in |
| 62 | this purgatory. | 64 | this purgatory. |
| 63 | 65 | ||
| 66 | Let's compare these two distributions when it comes to packages sizes | ||
| 67 | and shared object libraries and see they fair. | ||
| 68 | |||
| 69 | ## Debian | ||
| 70 | |||
| 71 | ```ini | ||
| 72 | root@debian: cat /etc/os-release | ||
| 73 | |||
| 74 | PRETTY_NAME="Debian GNU/Linux 12 (bookworm)" | ||
| 75 | NAME="Debian GNU/Linux" | ||
| 76 | VERSION_ID="12" | ||
| 77 | VERSION="12 (bookworm)" | ||
| 78 | VERSION_CODENAME=bookworm | ||
| 79 | ID=debian | ||
| 80 | HOME_URL="https://www.debian.org/" | ||
| 81 | SUPPORT_URL="https://www.debian.org/support" | ||
| 82 | BUG_REPORT_URL="https://bugs.debian.org/" | ||
| 83 | ``` | ||
| 84 | |||
| 85 | ### Top 20 packages by size | ||
| 86 | |||
| 87 | ```sh | ||
| 88 | dpkg-query -W --showformat='${Installed-Size}\t${Package}\n' | sort -nr | head -n 20 | awk '{size=$1;unit="KB"; if (size >= 1024) {size=size/1024; unit="MB"}; if (size >= 1024) {size=size/1024; unit="GB"}; printf "%.2f %s\t%s\n", size, unit, $2}' | ||
| 89 | ``` | ||
| 90 | |||
| 91 | | Size | Package | | ||
| 92 | |-----------|----------------------------| | ||
| 93 | | 651.87 MB | libwine | | ||
| 94 | | 389.26 MB | linux-image-6.1.0-18-amd64 | | ||
| 95 | | 345.76 MB | brave-browser | | ||
| 96 | | 323.74 MB | google-chrome-stable | | ||
| 97 | | 265.31 MB | llvm-14-dev | | ||
| 98 | | 225.76 MB | firefox-esr | | ||
| 99 | | 141.77 MB | fluid-soundfont-gm | | ||
| 100 | | 114.67 MB | libreoffice-core | | ||
| 101 | | 113.41 MB | containerd.io | | ||
| 102 | | 112.77 MB | libnvidia-rtcore | | ||
| 103 | | 111.92 MB | libllvm15 | | ||
| 104 | | 106.56 MB | ibus-data | | ||
| 105 | | 104.92 MB | libllvm14 | | ||
| 106 | | 99.20 MB | docker-ce | | ||
| 107 | | 77.39 MB | docker-buildx-plugin | | ||
| 108 | | 72.00 MB | libwebkit2gtk-4.1-0 | | ||
| 109 | | 71.93 MB | libwebkit2gtk-4.0-37 | | ||
| 110 | | 70.51 MB | libwebkitgtk-6.0-4 | | ||
| 111 | | 69.25 MB | nvidia-kernel-dkms | | ||
| 112 | | 66.64 MB | gcc-12 | | ||
| 113 | |||
| 114 | This is more or less fresh system that is being used daily for work. | ||
| 115 | |||
| 116 | ### Number of packages installed | ||
| 117 | |||
| 118 | ```sh | ||
| 119 | dpkg -l | grep '^ii' | wc -l | ||
| 120 | |||
| 121 | 2217 | ||
| 122 | ``` | ||
| 123 | |||
| 124 | ### Number of shared object libraries on system (*.so) | ||
| 125 | |||
| 126 | *Note: Some of them could be symlinks to each other so take this with | ||
| 127 | a grain of salt.* | ||
| 128 | |||
| 129 | ```sh | ||
| 130 | find /lib /lib64 /usr/lib /usr/lib64 -follow -type f -name "*.so.*" | wc -l | ||
| 131 | |||
| 132 | 5156 | ||
| 133 | ``` | ||
| 134 | |||
| 135 | ### Shared objects sorted by size | ||
| 136 | |||
| 137 | ```sh | ||
| 138 | find /lib /lib64 /usr/lib /usr/lib64 -type f -name "*.so.*" -exec du -h {} + | sort -rh | head -n 20 | ||
| 139 | ``` | ||
| 140 | |||
| 141 | | Size | Package | | ||
| 142 | |------|----------------------------------------------------------------| | ||
| 143 | | 113M | /usr/lib/x86_64-linux-gnu/libnvidia-rtcore.so.525.147.05 | | ||
| 144 | | 112M | /usr/lib/x86_64-linux-gnu/libLLVM-15.so.1 | | ||
| 145 | | 105M | /usr/lib/x86_64-linux-gnu/libLLVM-14.so.1 | | ||
| 146 | | 70M | /usr/lib/x86_64-linux-gnu/libwebkit2gtk-4.1.so.0.12.8 | | ||
| 147 | | 70M | /usr/lib/x86_64-linux-gnu/libwebkit2gtk-4.0.so.37.67.8 | | ||
| 148 | | 69M | /usr/lib/x86_64-linux-gnu/libwebkitgtk-6.0.so.4.4.8 | | ||
| 149 | | 57M | /usr/lib/llvm-14/lib/libclang-cpp.so.14 | | ||
| 150 | | 45M | /usr/lib/x86_64-linux-gnu/libnode.so.108 | | ||
| 151 | | 43M | /usr/lib/x86_64-linux-gnu/libnvidia-glcore.so.525.147.05 | | ||
| 152 | | 41M | /usr/lib/x86_64-linux-gnu/libnvidia-eglcore.so.525.147.05 | | ||
| 153 | | 31M | /usr/lib/x86_64-linux-gnu/libmozjs-102.so.102.15.1 | | ||
| 154 | | 30M | /usr/lib/x86_64-linux-gnu/libicudata.so.72.1 | | ||
| 155 | | 30M | /usr/lib/x86_64-linux-gnu/libclang-14.so.14.0.6 | | ||
| 156 | | 29M | /usr/lib/x86_64-linux-gnu/nvidia/current/libcuda.so.525.147.05 | | ||
| 157 | | 28M | /usr/lib/x86_64-linux-gnu/libjavascriptcoregtk-6.0.so.1.1.14 | | ||
| 158 | | 28M | /usr/lib/x86_64-linux-gnu/libjavascriptcoregtk-4.1.so.0.4.14 | | ||
| 159 | | 28M | /usr/lib/x86_64-linux-gnu/libjavascriptcoregtk-4.0.so.18.23.14 | | ||
| 160 | | 24M | /usr/lib/x86_64-linux-gnu/libnvidia-glvkspirv.so.525.147.05 | | ||
| 161 | | 23M | /usr/lib/x86_64-linux-gnu/libz3.so.4 | | ||
| 162 | | 22M | /usr/lib/x86_64-linux-gnu/libgs.so.10.00 | | ||
| 163 | |||
| 164 | ## Fedora | ||
| 165 | |||
| 166 | ```ini | ||
| 167 | root@fedora: cat /etc/os-release | ||
| 168 | |||
| 169 | NAME="Fedora Linux" | ||
| 170 | VERSION="36 (Workstation Edition)" | ||
| 171 | ID=fedora | ||
| 172 | VERSION_ID=36 | ||
| 173 | VERSION_CODENAME="" | ||
| 174 | PLATFORM_ID="platform:f36" | ||
| 175 | PRETTY_NAME="Fedora Linux 36 (Workstation Edition)" | ||
| 176 | ANSI_COLOR="0;38;2;60;110;180" | ||
| 177 | LOGO=fedora-logo-icon | ||
| 178 | CPE_NAME="cpe:/o:fedoraproject:fedora:36" | ||
| 179 | HOME_URL="https://fedoraproject.org/" | ||
| 180 | DOCUMENTATION_URL="https://docs.fedoraproject.org/en-US/fedora/f36/system-administrators-guide/" | ||
| 181 | SUPPORT_URL="https://ask.fedoraproject.org/" | ||
| 182 | BUG_REPORT_URL="https://bugzilla.redhat.com/" | ||
| 183 | REDHAT_BUGZILLA_PRODUCT="Fedora" | ||
| 184 | REDHAT_BUGZILLA_PRODUCT_VERSION=36 | ||
| 185 | REDHAT_SUPPORT_PRODUCT="Fedora" | ||
| 186 | REDHAT_SUPPORT_PRODUCT_VERSION=36 | ||
| 187 | PRIVACY_POLICY_URL="https://fedoraproject.org/wiki/Legal:PrivacyPolicy" | ||
| 188 | SUPPORT_END=2023-05-16 | ||
| 189 | VARIANT="Workstation Edition" | ||
| 190 | VARIANT_ID=workstation | ||
| 191 | ``` | ||
| 192 | |||
| 193 | ### Top 20 packages by size | ||
| 194 | |||
| 195 | ```sh | ||
| 196 | rpm -qa --queryformat '%{SIZE}\t%{NAME}\n' | sort -rn | head -n 20 | awk '{size=$1;unit="B"; if (size >= 1024) {size=size/1024; unit="KB"}; if (size >= 1024) {size=size/1024; unit="MB"}; if (size >= 1024) {size=size/1024; unit="GB"}; printf "%.2f %s\t%s\n", size, unit, $2}' | ||
| 197 | ``` | ||
| 198 | |||
| 199 | | Size | Package | | ||
| 200 | |-----------|------------------------------| | ||
| 201 | | 572.91 MB | google-cloud-sdk | | ||
| 202 | | 559.76 MB | wine-core | | ||
| 203 | | 530.12 MB | wine-core | | ||
| 204 | | 383.76 MB | code | | ||
| 205 | | 350.98 MB | golang-bin | | ||
| 206 | | 318.04 MB | brave-browser | | ||
| 207 | | 302.78 MB | google-chrome-stable | | ||
| 208 | | 282.24 MB | libreoffice-core | | ||
| 209 | | 273.43 MB | firefox | | ||
| 210 | | 253.00 MB | ocaml | | ||
| 211 | | 223.60 MB | proj-data-us | | ||
| 212 | | 219.46 MB | zoom | | ||
| 213 | | 217.81 MB | glibc-all-langpacks | | ||
| 214 | | 199.31 MB | qemu-user | | ||
| 215 | | 196.79 MB | edk2-aarch64 | | ||
| 216 | | 194.77 MB | fluid-soundfont-lite-patches | | ||
| 217 | | 194.25 MB | java-17-openjdk-headless | | ||
| 218 | | 176.75 MB | java-11-openjdk-headless | | ||
| 219 | | 156.80 MB | pandoc | | ||
| 220 | | 154.82 MB | qt5-qtwebengine | | ||
| 221 | |||
| 222 | What is interesting that the most of these packages are from a a system | ||
| 223 | that are daily in use. | ||
| 224 | |||
| 225 | ### Number of packages installed | ||
| 226 | |||
| 227 | ```sh | ||
| 228 | dnf list installed | tail -n +3 | wc -l | ||
| 229 | |||
| 230 | 3484 | ||
| 231 | ``` | ||
| 232 | |||
| 233 | ### Number of shared object libraries on system (*.so) | ||
| 234 | |||
| 235 | *Note: Some of them could be symlinks to each other so take this with | ||
| 236 | a grain of salt.* | ||
| 237 | |||
| 238 | ```sh | ||
| 239 | find /lib /lib64 /usr/lib /usr/lib64 -follow -type f -name "*.so.*" | wc -l | ||
| 240 | |||
| 241 | 8894 | ||
| 242 | ``` | ||
| 243 | |||
| 244 | ### Shared objects sorted by size | ||
| 245 | |||
| 246 | ```sh | ||
| 247 | find /lib /lib64 /usr/lib /usr/lib64 -type f -name "*.so.*" -exec du -h {} + | sort -rh | head -n 20 | ||
| 248 | ``` | ||
| 249 | |||
| 250 | | Size | Package | | ||
| 251 | |------|--------------------------------------------------------------------------------| | ||
| 252 | | 128M | /usr/lib64/libQt5WebEngineCore.so.5.15.10 | | ||
| 253 | | 55M | /usr/lib64/llvm13/lib/libclang-cpp.so.13 | | ||
| 254 | | 53M | /usr/lib64/libclang-cpp.so.14 | | ||
| 255 | | 50M | /usr/lib64/libwebkit2gtk-4.0.so.37.57.6 | | ||
| 256 | | 49M | /usr/lib64/libnode.so.93 | | ||
| 257 | | 45M | /usr/lib64/libOpenImageDenoise.so.1.4.3 | | ||
| 258 | | 33M | /usr/lib64/llvm13/lib/libclang.so.13.0.1 | | ||
| 259 | | 30M | /usr/lib64/libclang.so.14.0.5 | | ||
| 260 | | 29M | /usr/lib64/libopenvdb.so.9.0.0 | | ||
| 261 | | 28M | /usr/lib/libicudata.so.69.1 | | ||
| 262 | | 28M | /usr/lib64/libmozjs-78.so.0.0.0 | | ||
| 263 | | 28M | /usr/lib64/libicudata.so.69.1 | | ||
| 264 | | 26M | /usr/lib64/libusd_usd_ms.so.0 | | ||
| 265 | | 26M | /usr/lib64/libgdal.so.30.0.3 | | ||
| 266 | | 22M | /usr/lib64/libjavascriptcoregtk-4.0.so.18.21.6 | | ||
| 267 | | 22M | /usr/lib64/libgs.so.9.56 | | ||
| 268 | | 22M | /usr/lib64/google-cloud-sdk/platform/bundledpythonunix/lib/libpython3.9.so.1.0 | | ||
| 269 | | 17M | /usr/lib64/libgtkd-3.so.0.9.0 | | ||
| 270 | | 17M | /usr/lib64/libgeocoding.so.8.12 | | ||
| 271 | | 14M | /usr/lib64/libmfxhw64.so.1.35 | | ||
| 272 | |||
| 273 | ## Quick observation | ||
| 274 | |||
| 275 | ``` | ||
| 276 | /usr/lib/x86_64-linux-gnu/libjavascriptcoregtk-6.0.so.1.1.14 | ||
| 277 | /usr/lib/x86_64-linux-gnu/libjavascriptcoregtk-4.1.so.0.4.14 | ||
| 278 | /usr/lib/x86_64-linux-gnu/libjavascriptcoregtk-4.0.so.18.23.14 | ||
| 279 | ``` | ||
| 280 | |||
| 281 | These three packages are probably used by three different applications, | ||
| 282 | and nothing else needs them. I could be mistaken, but in any case they | ||
| 283 | should just be packages alongside the application that requires them | ||
| 284 | and be done with it. | ||
| 285 | |||
| 286 | ## So, now what? | ||
| 287 | |||
| 288 | The main point is that, yes these packages can be big, but if we are | ||
| 289 | honest, what would a couple of additional megabytes that would include | ||
| 290 | shared object libraries actually do? Probably nothing! And it would make | ||
| 291 | maintenance an entirely different game. | ||
| 292 | |||
| 293 | There is also this big elephant in the room, the users. They aren't | ||
| 294 | concerned about package dependencies. They don't care if an application | ||
| 295 | is 20 MB bigger. Nobody cares! But they certainly do care about borked | ||
| 296 | systems and non-working dependencies and hunting for solutions why | ||
| 297 | `libFlac` was not found even though they have it installed. | ||
| 298 | |||
| 299 | Operating systems should abstract these complexities away from the | ||
| 300 | user. And I am not saying that the Linux kernel is at fault. I mean the | ||
| 301 | operating system as a whole. | ||
| 302 | |||
| 303 | This is why I am a massive proponent of | ||
| 304 | [AppImages](https://appimage.org/). Flatpaks and Snaps are OK, but they | ||
| 305 | still have their own package management and the whole dependency problem | ||
| 306 | because they try to optimize for space, and they sacrifice the simplicity. | ||
| 307 | |||
| 64 | It would be an interesting exercise to make a prototype distribution | 308 | It would be an interesting exercise to make a prototype distribution |
| 65 | that does not rely on shared objects, but has everything packed in | 309 | that does not rely on shared objects, but has everything packed in |
| 66 | AppImages. Probably a foolish endeavor, but maybe worth looking into. I | 310 | AppImages. Probably a foolish endeavor, but maybe worth looking into. I |
| @@ -73,6 +317,17 @@ more options we have, the worse it gets. Wayland competing with X. So | |||
| 73 | many window managers, you just get lost. So many choices. I have no idea | 317 | many window managers, you just get lost. So many choices. I have no idea |
| 74 | if this is even salvageable, or something new must be invented. | 318 | if this is even salvageable, or something new must be invented. |
| 75 | 319 | ||
| 320 | Honorable mention goes to [AppImageHub](https://www.appimagehub.com/). If | ||
| 321 | possible, I continually try to find applications there and take care of | ||
| 322 | updating them myself. I don't need hand holding or a constant up-to date | ||
| 323 | system. I just want my system to be stable and when some application has | ||
| 324 | gotten some significant new features I can download that myself. It's | ||
| 325 | about the choice and not being forced into this churn that requires | ||
| 326 | constant updating and keeping up with things. At this point, using Linux | ||
| 327 | is more like a second job, and I was so stoked when this was not a case | ||
| 328 | anymore in the past. This is why I feel like the last 10 years were a | ||
| 329 | regression disguised as progress. | ||
| 330 | |||
| 76 | Some interesting talks and videos | 331 | Some interesting talks and videos |
| 77 | 332 | ||
| 78 | - [Jonathan Blow on how an operating system should work](https://www.youtube.com/watch?v=k0uE_chSnV8) | 333 | - [Jonathan Blow on how an operating system should work](https://www.youtube.com/watch?v=k0uE_chSnV8) |
diff --git a/templates/base.html b/templates/base.html index 45eb939..d7a8216 100755 --- a/templates/base.html +++ b/templates/base.html | |||
| @@ -9,7 +9,7 @@ | |||
| 9 | <link href="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL69vf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv76+/8LBwQkAAAAAAAAAAAAAAAC+vb3/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL+9vf/Bv78JAAAAAAAAAAAAAAAAu7q6/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC7ubr/vr29CAAAAAAAAAAAy8nJAZ6foP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnqGj/6GipAoAAAAAHLjU/xcXHf/BwsL/I8XY/yPK3v8XGiD/IbjL/yPF2f8XGiD/Fxkf/yLF2f8gnK3/Fxog/62ztv8fwNf/FRcd/x271v8mz93/GRsi/xkXHf8p097/GiIp/xobIv8p0t3/KdPe/xocIv8fYmr/KNPe/xoZH/8aHCL/J87c/xy81/8VFxz/IsPZ/8zS0/8XGiD/Ir/R/yPH2/8XGiD/Fxkf/yPH2/8dd4T/GBog/yPJ3f8jyNr/uru9/xcUGv8cudb/EhITDKi5vRKlvMP/RUpOERwcHRAdOj4QHTk8EBwdHRAdNTgQHTo/EBwcHRAcHB0QSGduEKW4vf+koqQfHzg+EBqz0ewSFRv7EyMr/xq51vsTERb7ExUb+xq41fsau9j7ExUb+xiPp/sZudb7ExUb+xMVG/sZuNX/GKvI/BIUGfMdvdn/IrfL/xcaIP8n1eb/J9Dh/xkcIf8ZGR7/J8/f/xxCSv8ZGyH/J9Dg/ybQ4P8ZHCL/FSQs/yPK3/8UExj/GE1b/ybS5P8ZGB7/Ghwj/ynW5P8p2Ob/Ghwi/yWrtv8p1eH/Ghwi/xocIv8p1uT/J8XT/xkcIv8m1un/Hb7d/xUYH/8hzOr/HtHu/xcaIf8XGB//I8vi/xgxOv8XGSD/I8rg/yPK4P8XGiD/GUFL/yPP6f8SERj/Fhkh/x3A4f8AAAAAJ2f9/ydr//8mZPH/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlYu38J2v//ydo/f8AAAAAAAAAAAd8/fkFqf//Iob8sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMY39awWr//8FfP3/AAAAAAAAAAAFm/7/SfD//wR+/f8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOB/f9B7v//BaX+/wAAAAAAAAAAQ878SAyZ/v9n1v4KAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADu9v8DDJb+/z3N/XgAAAAA3/sAAN/7AADf+wAA3/sAAAAAAAAAAAAAAAAAAN/7AAAAAAAAAAAAAAAAAAAAAAAAj/EAAI/5AACP8QAA3/sAAA==" rel="icon" type="image/x-icon" /> | 9 | <link href="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL69vf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv76+/8LBwQkAAAAAAAAAAAAAAAC+vb3/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL+9vf/Bv78JAAAAAAAAAAAAAAAAu7q6/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC7ubr/vr29CAAAAAAAAAAAy8nJAZ6foP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnqGj/6GipAoAAAAAHLjU/xcXHf/BwsL/I8XY/yPK3v8XGiD/IbjL/yPF2f8XGiD/Fxkf/yLF2f8gnK3/Fxog/62ztv8fwNf/FRcd/x271v8mz93/GRsi/xkXHf8p097/GiIp/xobIv8p0t3/KdPe/xocIv8fYmr/KNPe/xoZH/8aHCL/J87c/xy81/8VFxz/IsPZ/8zS0/8XGiD/Ir/R/yPH2/8XGiD/Fxkf/yPH2/8dd4T/GBog/yPJ3f8jyNr/uru9/xcUGv8cudb/EhITDKi5vRKlvMP/RUpOERwcHRAdOj4QHTk8EBwdHRAdNTgQHTo/EBwcHRAcHB0QSGduEKW4vf+koqQfHzg+EBqz0ewSFRv7EyMr/xq51vsTERb7ExUb+xq41fsau9j7ExUb+xiPp/sZudb7ExUb+xMVG/sZuNX/GKvI/BIUGfMdvdn/IrfL/xcaIP8n1eb/J9Dh/xkcIf8ZGR7/J8/f/xxCSv8ZGyH/J9Dg/ybQ4P8ZHCL/FSQs/yPK3/8UExj/GE1b/ybS5P8ZGB7/Ghwj/ynW5P8p2Ob/Ghwi/yWrtv8p1eH/Ghwi/xocIv8p1uT/J8XT/xkcIv8m1un/Hb7d/xUYH/8hzOr/HtHu/xcaIf8XGB//I8vi/xgxOv8XGSD/I8rg/yPK4P8XGiD/GUFL/yPP6f8SERj/Fhkh/x3A4f8AAAAAJ2f9/ydr//8mZPH/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlYu38J2v//ydo/f8AAAAAAAAAAAd8/fkFqf//Iob8sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMY39awWr//8FfP3/AAAAAAAAAAAFm/7/SfD//wR+/f8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOB/f9B7v//BaX+/wAAAAAAAAAAQ878SAyZ/v9n1v4KAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADu9v8DDJb+/z3N/XgAAAAA3/sAAN/7AADf+wAA3/sAAAAAAAAAAAAAAAAAAN/7AAAAAAAAAAAAAAAAAAAAAAAAj/EAAI/5AACP8QAA3/sAAA==" rel="icon" type="image/x-icon" /> |
| 10 | <style> | 10 | <style> |
| 11 | :root { | 11 | :root { |
| 12 | --body-max-width: 860px; | 12 | --body-max-width: 720px; |
| 13 | --link-color: blue; | 13 | --link-color: blue; |
| 14 | --code-background: #f8f8f8; | 14 | --code-background: #f8f8f8; |
| 15 | --inline-code-background: #f2f2f2; | 15 | --inline-code-background: #f2f2f2; |
| @@ -51,6 +51,10 @@ | |||
| 51 | line-height: initial; | 51 | line-height: initial; |
| 52 | } | 52 | } |
| 53 | 53 | ||
| 54 | h2, h3 { | ||
| 55 | margin-block-start: 1em; | ||
| 56 | } | ||
| 57 | |||
| 54 | h1 { | 58 | h1 { |
| 55 | font-size: xx-large; | 59 | font-size: xx-large; |
| 56 | } | 60 | } |
| @@ -115,9 +119,10 @@ | |||
| 115 | border-radius: 0; | 119 | border-radius: 0; |
| 116 | } | 120 | } |
| 117 | 121 | ||
| 118 | pre { margin-block-start: 2em; margin-block-end: 2em; } | 122 | pre { margin-block-start: 1em; margin-block-end: 1em; } |
| 119 | table { max-width: 100%; border: 1px solid black; } | 123 | table { width: 100%; border: 1px solid gainsboro; border-collapse: separate; border-spacing: 0; } |
| 120 | table td, table th { padding: 0.3em; } | 124 | table th { border-bottom: 1px solid gainsboro; background: #efefef; } |
| 125 | table td, table th { padding: 0.3em 0.8em; text-align: left; } | ||
| 121 | 126 | ||
| 122 | .promobox { | 127 | .promobox { |
| 123 | margin-top: 1em; | 128 | margin-top: 1em; |
