nixcon2022

This commit is contained in:
Jade Lovelace 2022-10-23 23:11:00 +02:00 committed by Jade Lovelace
parent d7bab9d001
commit dceda9c790
28 changed files with 26804 additions and 52 deletions

View file

@ -1 +1 @@
node_modules
*.mp4

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,652 @@
{
"title": "Initial actual budget graph",
"nodes": {
"/nix/store/073qf3vf5sq7yaxspbhbl5njy5p458if-gcc-9.3.0-lib": {
"label": "p458if-gcc-9.3.0-lib",
"props": {
"path": "/nix/store/073qf3vf5sq7yaxspbhbl5njy5p458if-gcc-9.3.0-lib",
"narSize": "5.5 MiB",
"closureSize": "35.1 MiB",
"registered": "2022-06-21 19:41:37 UTC",
"deriver": null
},
"weight": 2.4194162869038793
},
"/nix/store/27s76aizysg70j74fvxcmw26qb1a75hg-tzdata-2022a": {
"label": "1a75hg-tzdata-2022a",
"props": {
"path": "/nix/store/27s76aizysg70j74fvxcmw26qb1a75hg-tzdata-2022a",
"narSize": "2 MiB",
"closureSize": "2 MiB",
"registered": "2022-06-21 19:41:37 UTC",
"deriver": null
},
"weight": 1.416603791763608
},
"/nix/store/5m75p4p6iwqc1kxsp27v21cxmf8l8smb-bzip2-1.0.6.0.2": {
"label": "8l8smb-bzip2-1.0.6.0.2",
"props": {
"path": "/nix/store/5m75p4p6iwqc1kxsp27v21cxmf8l8smb-bzip2-1.0.6.0.2",
"narSize": "75.9 KiB",
"closureSize": "29.7 MiB",
"registered": "2022-06-21 19:41:37 UTC",
"deriver": null
},
"weight": 0
},
"/nix/store/5rn0s6gja3v2kg1n9rdsqvl4fwncx4ph-libidn2-2.3.2": {
"label": "ncx4ph-libidn2-2.3.2",
"props": {
"path": "/nix/store/5rn0s6gja3v2kg1n9rdsqvl4fwncx4ph-libidn2-2.3.2",
"narSize": "252.2 KiB",
"closureSize": "2 MiB",
"registered": "2022-06-21 19:41:37 UTC",
"deriver": null
},
"weight": 0
},
"/nix/store/9cks58i6jn1hlggxa406121asgn6nyra-readline-6.3p08": {
"label": "n6nyra-readline-6.3p08",
"props": {
"path": "/nix/store/9cks58i6jn1hlggxa406121asgn6nyra-readline-6.3p08",
"narSize": "395.5 KiB",
"closureSize": "33.5 MiB",
"registered": "2022-06-21 19:41:37 UTC",
"deriver": null
},
"weight": 0
},
"/nix/store/a3zvjvbipm7brkxiq601kys1ql9rk2i0-xz-5.2.5": {
"label": "9rk2i0-xz-5.2.5",
"props": {
"path": "/nix/store/a3zvjvbipm7brkxiq601kys1ql9rk2i0-xz-5.2.5",
"narSize": "466.1 KiB",
"closureSize": "30.1 MiB",
"registered": "2022-06-21 19:41:37 UTC",
"deriver": null
},
"weight": 0
},
"/nix/store/aiglvl958l2c2cd7dipf22ibxip95fhq-icu4c-71.1-dev": {
"label": "p95fhq-icu4c-71.1-dev",
"props": {
"path": "/nix/store/aiglvl958l2c2cd7dipf22ibxip95fhq-icu4c-71.1-dev",
"narSize": "5.3 MiB",
"closureSize": "79.3 MiB",
"registered": "2022-06-21 19:41:37 UTC",
"deriver": null
},
"weight": 2.385025884503138
},
"/nix/store/b24qnq024bv5yxr679gswckivg7042gb-gdbm-1.23": {
"label": "7042gb-gdbm-1.23",
"props": {
"path": "/nix/store/b24qnq024bv5yxr679gswckivg7042gb-gdbm-1.23",
"narSize": "796.5 KiB",
"closureSize": "30.4 MiB",
"registered": "2022-06-21 19:41:37 UTC",
"deriver": null
},
"weight": 0.46561903092791146
},
"/nix/store/cc6lbnrx5imqj1cbbpybws50b2002r8p-openssl-1.1.1o": {
"label": "002r8p-openssl-1.1.1o",
"props": {
"path": "/nix/store/cc6lbnrx5imqj1cbbpybws50b2002r8p-openssl-1.1.1o",
"narSize": "3.7 MiB",
"closureSize": "33.3 MiB",
"registered": "2022-06-21 19:41:37 UTC",
"deriver": null
},
"weight": 2.0201786631684238
},
"/nix/store/ccj83yygy31ir1wscwrapxljdfpjcbjb-acl-2.3.1": {
"label": "pjcbjb-acl-2.3.1",
"props": {
"path": "/nix/store/ccj83yygy31ir1wscwrapxljdfpjcbjb-acl-2.3.1",
"narSize": "108.1 KiB",
"closureSize": "29.8 MiB",
"registered": "2022-06-21 19:41:37 UTC",
"deriver": null
},
"weight": 0
},
"/nix/store/d4fv57g9cq82zgysim42g5hqp1c4mba5-zlib-1.2.12": {
"label": "c4mba5-zlib-1.2.12",
"props": {
"path": "/nix/store/d4fv57g9cq82zgysim42g5hqp1c4mba5-zlib-1.2.12",
"narSize": "119.1 KiB",
"closureSize": "29.8 MiB",
"registered": "2022-06-21 19:41:37 UTC",
"deriver": null
},
"weight": 0
},
"/nix/store/hj3i68avd4dq3m4h21fn00a04pb1fm4a-coreutils-9.0": {
"label": "b1fm4a-coreutils-9.0",
"props": {
"path": "/nix/store/hj3i68avd4dq3m4h21fn00a04pb1fm4a-coreutils-9.0",
"narSize": "1.6 MiB",
"closureSize": "31.4 MiB",
"registered": "2022-06-21 19:41:37 UTC",
"deriver": null
},
"weight": 1.1863369528745844
},
"/nix/store/hj5cjjxxg9dlg4f66ic3x9xqsmscqfmy-attr-2.5.1": {
"label": "scqfmy-attr-2.5.1",
"props": {
"path": "/nix/store/hj5cjjxxg9dlg4f66ic3x9xqsmscqfmy-attr-2.5.1",
"narSize": "75.4 KiB",
"closureSize": "29.7 MiB",
"registered": "2022-06-21 19:41:37 UTC",
"deriver": null
},
"weight": 0
},
"/nix/store/i778ag8s7jf8bxy9ihv0gsba3h9m8hzl-actual-sync-modules-1.0.1": {
"label": "9m8hzl-actual-sync-modules-1.0.1",
"props": {
"path": "/nix/store/i778ag8s7jf8bxy9ihv0gsba3h9m8hzl-actual-sync-modules-1.0.1",
"narSize": "143.1 MiB",
"closureSize": "425 MiB",
"registered": "2022-10-17 19:29:19 UTC",
"deriver": "/nix/store/8q8bv2a11523avq50bp91sw8g5pbirhn-actual-sync-modules-1.0.1.drv"
},
"weight": 5.680189727044614
},
"/nix/store/jbq46aqlwcwb51f17gi97az59js3mj2q-perl-5.34.1": {
"label": "s3mj2q-perl-5.34.1",
"props": {
"path": "/nix/store/jbq46aqlwcwb51f17gi97az59js3mj2q-perl-5.34.1",
"narSize": "52.7 MiB",
"closureSize": "84.2 MiB",
"registered": "2022-06-21 19:41:37 UTC",
"deriver": null
},
"weight": 4.680812070382395
},
"/nix/store/l0mwmzjk0a14a72441alshj8k23i5n2p-libunistring-1.0": {
"label": "3i5n2p-libunistring-1.0",
"props": {
"path": "/nix/store/l0mwmzjk0a14a72441alshj8k23i5n2p-libunistring-1.0",
"narSize": "1.7 MiB",
"closureSize": "1.7 MiB",
"registered": "2022-06-21 19:41:37 UTC",
"deriver": null
},
"weight": 1.265661565627411
},
"/nix/store/l71cy8azqms8m4b97qpszjbywkyaf7qh-python3-3.9.12": {
"label": "yaf7qh-python3-3.9.12",
"props": {
"path": "/nix/store/l71cy8azqms8m4b97qpszjbywkyaf7qh-python3-3.9.12",
"narSize": "84.6 MiB",
"closureSize": "128.2 MiB",
"registered": "2022-06-21 19:41:37 UTC",
"deriver": null
},
"weight": 5.154659877624505
},
"/nix/store/lyirwifzfwjxsqal7dzcx6dbn1i4v50a-glibc-2.34-115": {
"label": "i4v50a-glibc-2.34-115",
"props": {
"path": "/nix/store/lyirwifzfwjxsqal7dzcx6dbn1i4v50a-glibc-2.34-115",
"narSize": "27.7 MiB",
"closureSize": "29.7 MiB",
"registered": "2022-06-21 19:41:37 UTC",
"deriver": null
},
"weight": 4.037506317710718
},
"/nix/store/nc4krnv23q5c69n43gmdbsffgd2i797m-zlib-1.2.12-dev": {
"label": "2i797m-zlib-1.2.12-dev",
"props": {
"path": "/nix/store/nc4krnv23q5c69n43gmdbsffgd2i797m-zlib-1.2.12-dev",
"narSize": "112.8 KiB",
"closureSize": "29.9 MiB",
"registered": "2022-06-21 19:41:37 UTC",
"deriver": null
},
"weight": 0
},
"/nix/store/qd3g8rk5hx5zkb70idjh6fa12sh6bipg-mailcap-2.1.53": {
"label": "h6bipg-mailcap-2.1.53",
"props": {
"path": "/nix/store/qd3g8rk5hx5zkb70idjh6fa12sh6bipg-mailcap-2.1.53",
"narSize": "109.4 KiB",
"closureSize": "109.4 KiB",
"registered": "2022-06-21 19:41:37 UTC",
"deriver": null
},
"weight": 0
},
"/nix/store/qh1yf30niykshpc5dfi7m668ch2p7x6c-ncurses-6.3": {
"label": "2p7x6c-ncurses-6.3",
"props": {
"path": "/nix/store/qh1yf30niykshpc5dfi7m668ch2p7x6c-ncurses-6.3",
"narSize": "3.5 MiB",
"closureSize": "33.1 MiB",
"registered": "2022-06-21 19:41:37 UTC",
"deriver": null
},
"weight": 1.9575695913880296
},
"/nix/store/qhx1x8lwnx5i0r7gc1k6qqn23l4y8y6y-openssl-1.1.1o-bin": {
"label": "4y8y6y-openssl-1.1.1o-bin",
"props": {
"path": "/nix/store/qhx1x8lwnx5i0r7gc1k6qqn23l4y8y6y-openssl-1.1.1o-bin",
"narSize": "739.9 KiB",
"closureSize": "88.6 MiB",
"registered": "2022-06-21 19:41:37 UTC",
"deriver": null
},
"weight": 0.3918625953168647
},
"/nix/store/qq1zblyp6ysx96vd8havhw0wcsihcidf-actual-server": {
"label": "ihcidf-actual-server",
"props": {
"path": "/nix/store/qq1zblyp6ysx96vd8havhw0wcsihcidf-actual-server",
"narSize": "143.2 MiB",
"closureSize": "568.2 MiB",
"registered": "2022-10-17 22:45:15 UTC",
"deriver": "/nix/store/47ynggi13xy7lnyqyy66izs0bbj4i1kj-actual-server.drv"
},
"weight": 5.681352373571962
},
"/nix/store/qrw4ldkpsgbk1gzwf45qz40l43ld79z4-bash-5.1-p16": {
"label": "ld79z4-bash-5.1-p16",
"props": {
"path": "/nix/store/qrw4ldkpsgbk1gzwf45qz40l43ld79z4-bash-5.1-p16",
"narSize": "1.3 MiB",
"closureSize": "31 MiB",
"registered": "2022-06-21 19:41:37 UTC",
"deriver": null
},
"weight": 1.0129012022977377
},
"/nix/store/r1jhzslypr1pmjls2mh22i1d3h04a1rk-icu4c-71.1": {
"label": "04a1rk-icu4c-71.1",
"props": {
"path": "/nix/store/r1jhzslypr1pmjls2mh22i1d3h04a1rk-icu4c-71.1",
"narSize": "35.7 MiB",
"closureSize": "72.2 MiB",
"registered": "2022-06-21 19:41:37 UTC",
"deriver": null
},
"weight": 4.292424119492384
},
"/nix/store/s355yx68hzb0fy55pc417kq8hy744fbc-libuv-1.44.1": {
"label": "744fbc-libuv-1.44.1",
"props": {
"path": "/nix/store/s355yx68hzb0fy55pc417kq8hy744fbc-libuv-1.44.1",
"narSize": "331.7 KiB",
"closureSize": "30 MiB",
"registered": "2022-06-21 19:41:37 UTC",
"deriver": null
},
"weight": 0
},
"/nix/store/sscxlfcpd2cjwb9jm1v3y54q40j46v6x-expat-2.4.8": {
"label": "j46v6x-expat-2.4.8",
"props": {
"path": "/nix/store/sscxlfcpd2cjwb9jm1v3y54q40j46v6x-expat-2.4.8",
"narSize": "247.2 KiB",
"closureSize": "29.9 MiB",
"registered": "2022-06-21 19:41:37 UTC",
"deriver": null
},
"weight": 0
},
"/nix/store/vmf9jqsb9zx9nlqlwpvy4gwcs5zq7y1v-sqlite-3.38.3": {
"label": "zq7y1v-sqlite-3.38.3",
"props": {
"path": "/nix/store/vmf9jqsb9zx9nlqlwpvy4gwcs5zq7y1v-sqlite-3.38.3",
"narSize": "1.3 MiB",
"closureSize": "31.1 MiB",
"registered": "2022-06-21 19:41:37 UTC",
"deriver": null
},
"weight": 0.9667580602456716
},
"/nix/store/vvapsd09jq70w3hmpdd5rlrd8iv3fi2f-libffi-3.4.2": {
"label": "v3fi2f-libffi-3.4.2",
"props": {
"path": "/nix/store/vvapsd09jq70w3hmpdd5rlrd8iv3fi2f-libffi-3.4.2",
"narSize": "48.2 KiB",
"closureSize": "29.7 MiB",
"registered": "2022-06-21 19:41:37 UTC",
"deriver": null
},
"weight": 0
},
"/nix/store/wl64yp8q7m2s9dc3awdj4yfkviw52fpi-openssl-1.1.1o-dev": {
"label": "w52fpi-openssl-1.1.1o-dev",
"props": {
"path": "/nix/store/wl64yp8q7m2s9dc3awdj4yfkviw52fpi-openssl-1.1.1o-dev",
"narSize": "1.3 MiB",
"closureSize": "89.9 MiB",
"registered": "2022-06-21 19:41:37 UTC",
"deriver": null
},
"weight": 1.0021185962889871
},
"/nix/store/ykvg94hiqihi5hh7jb8bi4vk354xf821-nodejs-16.15.0": {
"label": "4xf821-nodejs-16.15.0",
"props": {
"path": "/nix/store/ykvg94hiqihi5hh7jb8bi4vk354xf821-nodejs-16.15.0",
"narSize": "50.2 MiB",
"closureSize": "281.9 MiB",
"registered": "2022-06-21 19:41:37 UTC",
"deriver": null
},
"weight": 4.6336771609814065
}
},
"edges": [
{
"from": "/nix/store/073qf3vf5sq7yaxspbhbl5njy5p458if-gcc-9.3.0-lib",
"to": "/nix/store/lyirwifzfwjxsqal7dzcx6dbn1i4v50a-glibc-2.34-115"
},
{
"from": "/nix/store/5m75p4p6iwqc1kxsp27v21cxmf8l8smb-bzip2-1.0.6.0.2",
"to": "/nix/store/lyirwifzfwjxsqal7dzcx6dbn1i4v50a-glibc-2.34-115"
},
{
"from": "/nix/store/5rn0s6gja3v2kg1n9rdsqvl4fwncx4ph-libidn2-2.3.2",
"to": "/nix/store/l0mwmzjk0a14a72441alshj8k23i5n2p-libunistring-1.0"
},
{
"from": "/nix/store/9cks58i6jn1hlggxa406121asgn6nyra-readline-6.3p08",
"to": "/nix/store/lyirwifzfwjxsqal7dzcx6dbn1i4v50a-glibc-2.34-115"
},
{
"from": "/nix/store/9cks58i6jn1hlggxa406121asgn6nyra-readline-6.3p08",
"to": "/nix/store/qh1yf30niykshpc5dfi7m668ch2p7x6c-ncurses-6.3"
},
{
"from": "/nix/store/a3zvjvbipm7brkxiq601kys1ql9rk2i0-xz-5.2.5",
"to": "/nix/store/lyirwifzfwjxsqal7dzcx6dbn1i4v50a-glibc-2.34-115"
},
{
"from": "/nix/store/aiglvl958l2c2cd7dipf22ibxip95fhq-icu4c-71.1-dev",
"to": "/nix/store/073qf3vf5sq7yaxspbhbl5njy5p458if-gcc-9.3.0-lib"
},
{
"from": "/nix/store/aiglvl958l2c2cd7dipf22ibxip95fhq-icu4c-71.1-dev",
"to": "/nix/store/hj3i68avd4dq3m4h21fn00a04pb1fm4a-coreutils-9.0"
},
{
"from": "/nix/store/aiglvl958l2c2cd7dipf22ibxip95fhq-icu4c-71.1-dev",
"to": "/nix/store/lyirwifzfwjxsqal7dzcx6dbn1i4v50a-glibc-2.34-115"
},
{
"from": "/nix/store/aiglvl958l2c2cd7dipf22ibxip95fhq-icu4c-71.1-dev",
"to": "/nix/store/qrw4ldkpsgbk1gzwf45qz40l43ld79z4-bash-5.1-p16"
},
{
"from": "/nix/store/aiglvl958l2c2cd7dipf22ibxip95fhq-icu4c-71.1-dev",
"to": "/nix/store/r1jhzslypr1pmjls2mh22i1d3h04a1rk-icu4c-71.1"
},
{
"from": "/nix/store/b24qnq024bv5yxr679gswckivg7042gb-gdbm-1.23",
"to": "/nix/store/lyirwifzfwjxsqal7dzcx6dbn1i4v50a-glibc-2.34-115"
},
{
"from": "/nix/store/cc6lbnrx5imqj1cbbpybws50b2002r8p-openssl-1.1.1o",
"to": "/nix/store/lyirwifzfwjxsqal7dzcx6dbn1i4v50a-glibc-2.34-115"
},
{
"from": "/nix/store/ccj83yygy31ir1wscwrapxljdfpjcbjb-acl-2.3.1",
"to": "/nix/store/hj5cjjxxg9dlg4f66ic3x9xqsmscqfmy-attr-2.5.1"
},
{
"from": "/nix/store/ccj83yygy31ir1wscwrapxljdfpjcbjb-acl-2.3.1",
"to": "/nix/store/lyirwifzfwjxsqal7dzcx6dbn1i4v50a-glibc-2.34-115"
},
{
"from": "/nix/store/d4fv57g9cq82zgysim42g5hqp1c4mba5-zlib-1.2.12",
"to": "/nix/store/lyirwifzfwjxsqal7dzcx6dbn1i4v50a-glibc-2.34-115"
},
{
"from": "/nix/store/hj3i68avd4dq3m4h21fn00a04pb1fm4a-coreutils-9.0",
"to": "/nix/store/ccj83yygy31ir1wscwrapxljdfpjcbjb-acl-2.3.1"
},
{
"from": "/nix/store/hj3i68avd4dq3m4h21fn00a04pb1fm4a-coreutils-9.0",
"to": "/nix/store/hj5cjjxxg9dlg4f66ic3x9xqsmscqfmy-attr-2.5.1"
},
{
"from": "/nix/store/hj3i68avd4dq3m4h21fn00a04pb1fm4a-coreutils-9.0",
"to": "/nix/store/lyirwifzfwjxsqal7dzcx6dbn1i4v50a-glibc-2.34-115"
},
{
"from": "/nix/store/hj5cjjxxg9dlg4f66ic3x9xqsmscqfmy-attr-2.5.1",
"to": "/nix/store/lyirwifzfwjxsqal7dzcx6dbn1i4v50a-glibc-2.34-115"
},
{
"from": "/nix/store/i778ag8s7jf8bxy9ihv0gsba3h9m8hzl-actual-sync-modules-1.0.1",
"to": "/nix/store/073qf3vf5sq7yaxspbhbl5njy5p458if-gcc-9.3.0-lib"
},
{
"from": "/nix/store/i778ag8s7jf8bxy9ihv0gsba3h9m8hzl-actual-sync-modules-1.0.1",
"to": "/nix/store/lyirwifzfwjxsqal7dzcx6dbn1i4v50a-glibc-2.34-115"
},
{
"from": "/nix/store/i778ag8s7jf8bxy9ihv0gsba3h9m8hzl-actual-sync-modules-1.0.1",
"to": "/nix/store/qrw4ldkpsgbk1gzwf45qz40l43ld79z4-bash-5.1-p16"
},
{
"from": "/nix/store/i778ag8s7jf8bxy9ihv0gsba3h9m8hzl-actual-sync-modules-1.0.1",
"to": "/nix/store/vmf9jqsb9zx9nlqlwpvy4gwcs5zq7y1v-sqlite-3.38.3"
},
{
"from": "/nix/store/i778ag8s7jf8bxy9ihv0gsba3h9m8hzl-actual-sync-modules-1.0.1",
"to": "/nix/store/ykvg94hiqihi5hh7jb8bi4vk354xf821-nodejs-16.15.0"
},
{
"from": "/nix/store/jbq46aqlwcwb51f17gi97az59js3mj2q-perl-5.34.1",
"to": "/nix/store/d4fv57g9cq82zgysim42g5hqp1c4mba5-zlib-1.2.12"
},
{
"from": "/nix/store/jbq46aqlwcwb51f17gi97az59js3mj2q-perl-5.34.1",
"to": "/nix/store/hj3i68avd4dq3m4h21fn00a04pb1fm4a-coreutils-9.0"
},
{
"from": "/nix/store/jbq46aqlwcwb51f17gi97az59js3mj2q-perl-5.34.1",
"to": "/nix/store/lyirwifzfwjxsqal7dzcx6dbn1i4v50a-glibc-2.34-115"
},
{
"from": "/nix/store/l71cy8azqms8m4b97qpszjbywkyaf7qh-python3-3.9.12",
"to": "/nix/store/27s76aizysg70j74fvxcmw26qb1a75hg-tzdata-2022a"
},
{
"from": "/nix/store/l71cy8azqms8m4b97qpszjbywkyaf7qh-python3-3.9.12",
"to": "/nix/store/5m75p4p6iwqc1kxsp27v21cxmf8l8smb-bzip2-1.0.6.0.2"
},
{
"from": "/nix/store/l71cy8azqms8m4b97qpszjbywkyaf7qh-python3-3.9.12",
"to": "/nix/store/9cks58i6jn1hlggxa406121asgn6nyra-readline-6.3p08"
},
{
"from": "/nix/store/l71cy8azqms8m4b97qpszjbywkyaf7qh-python3-3.9.12",
"to": "/nix/store/a3zvjvbipm7brkxiq601kys1ql9rk2i0-xz-5.2.5"
},
{
"from": "/nix/store/l71cy8azqms8m4b97qpszjbywkyaf7qh-python3-3.9.12",
"to": "/nix/store/b24qnq024bv5yxr679gswckivg7042gb-gdbm-1.23"
},
{
"from": "/nix/store/l71cy8azqms8m4b97qpszjbywkyaf7qh-python3-3.9.12",
"to": "/nix/store/cc6lbnrx5imqj1cbbpybws50b2002r8p-openssl-1.1.1o"
},
{
"from": "/nix/store/l71cy8azqms8m4b97qpszjbywkyaf7qh-python3-3.9.12",
"to": "/nix/store/d4fv57g9cq82zgysim42g5hqp1c4mba5-zlib-1.2.12"
},
{
"from": "/nix/store/l71cy8azqms8m4b97qpszjbywkyaf7qh-python3-3.9.12",
"to": "/nix/store/lyirwifzfwjxsqal7dzcx6dbn1i4v50a-glibc-2.34-115"
},
{
"from": "/nix/store/l71cy8azqms8m4b97qpszjbywkyaf7qh-python3-3.9.12",
"to": "/nix/store/qd3g8rk5hx5zkb70idjh6fa12sh6bipg-mailcap-2.1.53"
},
{
"from": "/nix/store/l71cy8azqms8m4b97qpszjbywkyaf7qh-python3-3.9.12",
"to": "/nix/store/qh1yf30niykshpc5dfi7m668ch2p7x6c-ncurses-6.3"
},
{
"from": "/nix/store/l71cy8azqms8m4b97qpszjbywkyaf7qh-python3-3.9.12",
"to": "/nix/store/qrw4ldkpsgbk1gzwf45qz40l43ld79z4-bash-5.1-p16"
},
{
"from": "/nix/store/l71cy8azqms8m4b97qpszjbywkyaf7qh-python3-3.9.12",
"to": "/nix/store/sscxlfcpd2cjwb9jm1v3y54q40j46v6x-expat-2.4.8"
},
{
"from": "/nix/store/l71cy8azqms8m4b97qpszjbywkyaf7qh-python3-3.9.12",
"to": "/nix/store/vmf9jqsb9zx9nlqlwpvy4gwcs5zq7y1v-sqlite-3.38.3"
},
{
"from": "/nix/store/l71cy8azqms8m4b97qpszjbywkyaf7qh-python3-3.9.12",
"to": "/nix/store/vvapsd09jq70w3hmpdd5rlrd8iv3fi2f-libffi-3.4.2"
},
{
"from": "/nix/store/lyirwifzfwjxsqal7dzcx6dbn1i4v50a-glibc-2.34-115",
"to": "/nix/store/5rn0s6gja3v2kg1n9rdsqvl4fwncx4ph-libidn2-2.3.2"
},
{
"from": "/nix/store/nc4krnv23q5c69n43gmdbsffgd2i797m-zlib-1.2.12-dev",
"to": "/nix/store/d4fv57g9cq82zgysim42g5hqp1c4mba5-zlib-1.2.12"
},
{
"from": "/nix/store/qh1yf30niykshpc5dfi7m668ch2p7x6c-ncurses-6.3",
"to": "/nix/store/lyirwifzfwjxsqal7dzcx6dbn1i4v50a-glibc-2.34-115"
},
{
"from": "/nix/store/qhx1x8lwnx5i0r7gc1k6qqn23l4y8y6y-openssl-1.1.1o-bin",
"to": "/nix/store/cc6lbnrx5imqj1cbbpybws50b2002r8p-openssl-1.1.1o"
},
{
"from": "/nix/store/qhx1x8lwnx5i0r7gc1k6qqn23l4y8y6y-openssl-1.1.1o-bin",
"to": "/nix/store/jbq46aqlwcwb51f17gi97az59js3mj2q-perl-5.34.1"
},
{
"from": "/nix/store/qhx1x8lwnx5i0r7gc1k6qqn23l4y8y6y-openssl-1.1.1o-bin",
"to": "/nix/store/lyirwifzfwjxsqal7dzcx6dbn1i4v50a-glibc-2.34-115"
},
{
"from": "/nix/store/qq1zblyp6ysx96vd8havhw0wcsihcidf-actual-server",
"to": "/nix/store/073qf3vf5sq7yaxspbhbl5njy5p458if-gcc-9.3.0-lib"
},
{
"from": "/nix/store/qq1zblyp6ysx96vd8havhw0wcsihcidf-actual-server",
"to": "/nix/store/i778ag8s7jf8bxy9ihv0gsba3h9m8hzl-actual-sync-modules-1.0.1"
},
{
"from": "/nix/store/qq1zblyp6ysx96vd8havhw0wcsihcidf-actual-server",
"to": "/nix/store/lyirwifzfwjxsqal7dzcx6dbn1i4v50a-glibc-2.34-115"
},
{
"from": "/nix/store/qq1zblyp6ysx96vd8havhw0wcsihcidf-actual-server",
"to": "/nix/store/qrw4ldkpsgbk1gzwf45qz40l43ld79z4-bash-5.1-p16"
},
{
"from": "/nix/store/qq1zblyp6ysx96vd8havhw0wcsihcidf-actual-server",
"to": "/nix/store/vmf9jqsb9zx9nlqlwpvy4gwcs5zq7y1v-sqlite-3.38.3"
},
{
"from": "/nix/store/qq1zblyp6ysx96vd8havhw0wcsihcidf-actual-server",
"to": "/nix/store/ykvg94hiqihi5hh7jb8bi4vk354xf821-nodejs-16.15.0"
},
{
"from": "/nix/store/qrw4ldkpsgbk1gzwf45qz40l43ld79z4-bash-5.1-p16",
"to": "/nix/store/lyirwifzfwjxsqal7dzcx6dbn1i4v50a-glibc-2.34-115"
},
{
"from": "/nix/store/r1jhzslypr1pmjls2mh22i1d3h04a1rk-icu4c-71.1",
"to": "/nix/store/073qf3vf5sq7yaxspbhbl5njy5p458if-gcc-9.3.0-lib"
},
{
"from": "/nix/store/r1jhzslypr1pmjls2mh22i1d3h04a1rk-icu4c-71.1",
"to": "/nix/store/lyirwifzfwjxsqal7dzcx6dbn1i4v50a-glibc-2.34-115"
},
{
"from": "/nix/store/r1jhzslypr1pmjls2mh22i1d3h04a1rk-icu4c-71.1",
"to": "/nix/store/qrw4ldkpsgbk1gzwf45qz40l43ld79z4-bash-5.1-p16"
},
{
"from": "/nix/store/s355yx68hzb0fy55pc417kq8hy744fbc-libuv-1.44.1",
"to": "/nix/store/lyirwifzfwjxsqal7dzcx6dbn1i4v50a-glibc-2.34-115"
},
{
"from": "/nix/store/sscxlfcpd2cjwb9jm1v3y54q40j46v6x-expat-2.4.8",
"to": "/nix/store/lyirwifzfwjxsqal7dzcx6dbn1i4v50a-glibc-2.34-115"
},
{
"from": "/nix/store/vmf9jqsb9zx9nlqlwpvy4gwcs5zq7y1v-sqlite-3.38.3",
"to": "/nix/store/d4fv57g9cq82zgysim42g5hqp1c4mba5-zlib-1.2.12"
},
{
"from": "/nix/store/vmf9jqsb9zx9nlqlwpvy4gwcs5zq7y1v-sqlite-3.38.3",
"to": "/nix/store/lyirwifzfwjxsqal7dzcx6dbn1i4v50a-glibc-2.34-115"
},
{
"from": "/nix/store/vvapsd09jq70w3hmpdd5rlrd8iv3fi2f-libffi-3.4.2",
"to": "/nix/store/lyirwifzfwjxsqal7dzcx6dbn1i4v50a-glibc-2.34-115"
},
{
"from": "/nix/store/wl64yp8q7m2s9dc3awdj4yfkviw52fpi-openssl-1.1.1o-dev",
"to": "/nix/store/cc6lbnrx5imqj1cbbpybws50b2002r8p-openssl-1.1.1o"
},
{
"from": "/nix/store/wl64yp8q7m2s9dc3awdj4yfkviw52fpi-openssl-1.1.1o-dev",
"to": "/nix/store/qhx1x8lwnx5i0r7gc1k6qqn23l4y8y6y-openssl-1.1.1o-bin"
},
{
"from": "/nix/store/ykvg94hiqihi5hh7jb8bi4vk354xf821-nodejs-16.15.0",
"to": "/nix/store/073qf3vf5sq7yaxspbhbl5njy5p458if-gcc-9.3.0-lib"
},
{
"from": "/nix/store/ykvg94hiqihi5hh7jb8bi4vk354xf821-nodejs-16.15.0",
"to": "/nix/store/aiglvl958l2c2cd7dipf22ibxip95fhq-icu4c-71.1-dev"
},
{
"from": "/nix/store/ykvg94hiqihi5hh7jb8bi4vk354xf821-nodejs-16.15.0",
"to": "/nix/store/cc6lbnrx5imqj1cbbpybws50b2002r8p-openssl-1.1.1o"
},
{
"from": "/nix/store/ykvg94hiqihi5hh7jb8bi4vk354xf821-nodejs-16.15.0",
"to": "/nix/store/d4fv57g9cq82zgysim42g5hqp1c4mba5-zlib-1.2.12"
},
{
"from": "/nix/store/ykvg94hiqihi5hh7jb8bi4vk354xf821-nodejs-16.15.0",
"to": "/nix/store/l71cy8azqms8m4b97qpszjbywkyaf7qh-python3-3.9.12"
},
{
"from": "/nix/store/ykvg94hiqihi5hh7jb8bi4vk354xf821-nodejs-16.15.0",
"to": "/nix/store/lyirwifzfwjxsqal7dzcx6dbn1i4v50a-glibc-2.34-115"
},
{
"from": "/nix/store/ykvg94hiqihi5hh7jb8bi4vk354xf821-nodejs-16.15.0",
"to": "/nix/store/nc4krnv23q5c69n43gmdbsffgd2i797m-zlib-1.2.12-dev"
},
{
"from": "/nix/store/ykvg94hiqihi5hh7jb8bi4vk354xf821-nodejs-16.15.0",
"to": "/nix/store/qrw4ldkpsgbk1gzwf45qz40l43ld79z4-bash-5.1-p16"
},
{
"from": "/nix/store/ykvg94hiqihi5hh7jb8bi4vk354xf821-nodejs-16.15.0",
"to": "/nix/store/r1jhzslypr1pmjls2mh22i1d3h04a1rk-icu4c-71.1"
},
{
"from": "/nix/store/ykvg94hiqihi5hh7jb8bi4vk354xf821-nodejs-16.15.0",
"to": "/nix/store/s355yx68hzb0fy55pc417kq8hy744fbc-libuv-1.44.1"
},
{
"from": "/nix/store/ykvg94hiqihi5hh7jb8bi4vk354xf821-nodejs-16.15.0",
"to": "/nix/store/wl64yp8q7m2s9dc3awdj4yfkviw52fpi-openssl-1.1.1o-dev"
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 227 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 228 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 26 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 40 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 37 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 493 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 390 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 909 KiB

View file

@ -28,6 +28,9 @@ NixCon 2022<br>
October 20, 2022<br>
https://jade.fyi
</p>
<p>
Slides here: <a href="https://jade.fyi/nixcon2022/slides">https://jade.fyi/nixcon2022/slides</a>
</p>
</div>
</section>
@ -35,7 +38,7 @@ https://jade.fyi
# who am I?
* Computer Engineering student at UBC in Vancouver, BC, Canada
* Presently interning in backend dev for Mercury, a company offering banking<fnref>1</fnref> designed for the unique needs of startups
* Haskell + TypeScript + Nix stack
* Haskell + PostgreSQL + TypeScript + Nix stack
* Working on internal tools for risk management
<div class="footnotes">
@ -45,42 +48,49 @@ https://jade.fyi
</div>
</textarea></section>
<section data-markdown><textarea data-template>
# disclaimer
Views represented in this talk are my own and do not necessarily represent the views of Mercury.
</textarea></section>
<section data-markdown><textarea data-template>
# what's closure size?
* Size of some derivation and everything it depends on
* Accidental dependencies are the major contributor
* Other systems don't have this problem: forgetting about runtime dependencies may silently fail (or work if you have them installed!) at runtime
* "Closure" &rightarrow; like a function referencing values outside it
</textarea></section>
<section data-markdown><textarea data-template>
# how do I create a dependency?
* Only what goes in may go out: inputs may become runtime dependencies if they appear in the output
* Follows from Nix's hermetic design: outputs are a strict subset of inputs
* It's easy to cause accidental dependencies
</textarea></section>
<section data-markdown><textarea data-template>
# ok, but what does "appear" mean?
```
grep -r '[0-9abcdfghijklmnpqrsvwxyz]{32}' $out
```
Seriously.
Nix looks for 32 character strings forming the hash part of any of the store paths of the closure of the inputs to the derivation
See Figure 5.12 in the Nix thesis
<img src="./img/fsm-drv-1.svg" alt="silly drawing of mkDerivation with a build input of a drawing of a spaghetti monster">
</textarea></section>
<section data-markdown><textarea data-template>
<img src="./img/fsm-drv-2.svg" alt="continuation of the previous slide, with a buildPhase echoing spaghetti monster into $out">
</textarea></section>
<section data-markdown><textarea data-template>
<img src="./img/fsm-runtime-dep.svg" alt="little graph showing myapp-0.0.0 depending on spaghetti monster">
</textarea></section>
<section data-markdown><textarea data-template>
# issues with excess closure size
<img src="./img/fsm-docker.svg" alt="little container ship with a container mostly containing spaghetti monster and insignificantly containing myapp">
</textarea></section>
<!--
<section data-markdown><textarea data-template>
# digression: "what went in?"
Nix strings are magic: they keep track of the derivations that they've referenced as "string context", and propagate that information into any derivations they land in.
</textarea></section>
-->
<section data-markdown><textarea data-template>
# what does my stuff depend on?
@ -96,7 +106,8 @@ Nix strings are magic: they keep track of the derivations that they've reference
# that's a graph though
Yeah. I can't tell what the relationship is between these.
No tree or graph mode for nix path-info unlike nix-store --query (the latter is not stellar anyway)
No tree or graph mode for `nix path-info` unlike `nix-store --query`
</textarea></section>
<section data-markdown><textarea data-template>
@ -104,9 +115,9 @@ No tree or graph mode for nix path-info unlike nix-store --query (the latter is
There is a JSON output mode, what if we just used that? and then did some stuff to it
Some purely functional programming in jq later:
So I wrote a program in jq:
`nix-closure-graph nixpkgs#python3 &gt; python3Closure.svg`
<pre><code class="text">nix-closure-graph nixpkgs#python3 &gt; python3Closure.svg</code></pre>
</textarea></section>
<section data-markdown><textarea data-template>
@ -121,10 +132,10 @@ Some purely functional programming in jq later:
<section data-markdown><textarea data-template>
# what about a nixos image
whoops
maybe not
<div class="img-container">
<img src="./img/nixosClosure.svg" style="object-fit: cover; object-position: center;" width="100%" height="100%" alt="incomprehensible graphviz graph absolutely covered in lines for a nixos image">
<img src="./img/nixosClosure.png" style="object-fit: cover; object-position: center;" width="700px" height="400px" alt="incomprehensible graphviz graph absolutely covered in lines for a nixos image">
</div>
</textarea></section>
@ -134,26 +145,206 @@ whoops
I built this graph viewer prototype at work, I wonder if I could stick a NixOS closure into it
FIXME!!!
https://mercurytechnologies.github.io/looking-glass-viewer/
<pre><code class="text"><script type="text/template"> » nix-closure-graph --lg .#nixosConfigurations.micro.config.system.build.toplevel | goo copy
</script></code></pre>
</textarea></section>
<section data-markdown><textarea data-template>
# other projects from me
# it doesn't fall over?
https://docs.jade.fyi - Single page HTML docs for GNU, postgres, and zsh
The rendering has some room for improvement but it is usable!
https://github.com/LF-/nix-doc - Interactive function documentation for Nix
<img class="r-stretch" src="img/nixos-closure.png" alt="Looking glass showing an extremely busy, perhaps unusable view on a NixOS closure">
https://github.com/LF-/nix-otel - Trace Nix builds with OpenTelemetry
</textarea></section>
<section data-markdown><textarea data-template>
# incidentally, why is half of hackage on there?
GHC puts dependency paths into executables for fun sometimes.<fnref>1</fnref>
<pre><code class="text"><script type="text/template"> » nix why-depends --precise /nix/store/abcde-hsutils-0.0.0 /nix/store/defgh-semigroupoids-5.3.7
/nix/store/abcde-hsutils-0.0.0
└───lib/ghc-9.2.4/x86_64-linux-ghc-9.2.4/libHShsutils-0.0.0-aaaa-ghc9.2.4.so: …6_64-linux-ghc-9.2.4:/nix/store/defgh-semigroupoids-5.3.7/lib/ghc-9.2…
→ /nix/store/defgh-semigroupoids-5.3.7
</script></code></pre>
<div class="footnotes">
<ol>
<li>I've <a href="https://github.com/Carnap/Carnap/blob/5e82366fd7d8804566558de189d59f40a704b1a8/server.nix#L86-L98">fixed this before</a></li>
</ol>
</div>
</textarea></section>
<section data-markdown><textarea data-template>
# why would haskell put that path in there?!
Unfortunately a known issue; help wanted.
<img src="img/github-issues.png" alt="screenshot of the github issues page for nixpkgs, showing a bug about large closures">
</textarea></section>
<section data-markdown><textarea data-template>
# practical closure size problems
I was packaging [actual-budget], a budgeting program, to run it on fly.io. So I
figured out how to build a docker image for it with Nix.
[actual-budget]: https://actualbudget.com/
</textarea></section>
<section data-markdown><textarea data-template>
# and then it's way too big
<pre><code class="text"><script type="text/template"> » nix build .#dockerImage.aarch64-linux
» ls -lah $(readlink result)
-r--r--r-- 1 root root 219M Dec 31 1969 /nix/store/6r0nslg23w2sa6a2zril3g0fvd6mnp1q-actual-server.tar.gz
</script></code></pre>
200MB compressed is not good. It's just some JavaScript, what happened there?
</textarea></section>
<section data-markdown><textarea data-template>
# let's bring out the big guns
```text
nix-closure-graph --lg .# | goo copy
```
</textarea></section>
<section data-markdown><textarea data-template>
# what went wrong here?
<img class="r-stretch" src="./img/actual-stage0.png" alt="screenshot of the graph viewer showing that actual-server depends on actual-server-modules, a derivation of suspiciously similar size">
<!-- FIXME: embed the graph viewer -->
</textarea></section>
<section data-markdown><textarea data-template>
# python?
<img class="r-stretch" src="./img/actual-stage0-python.png" alt="screenshot of the graph viewer showing that nodejs depends on python">
<!-- FIXME: embed the graph viewer -->
</textarea></section>
<section data-markdown><textarea data-template>
# what went wrong here?
* Python
* Mysteriously includes the app twice
</textarea></section>
<section data-markdown><textarea data-template>
# python?!
* Node has an obsolescent build system "Generate Your Projects" for
C++ extensions that generates makefiles
* Originally inherited from Chromium
</textarea></section>
<section data-markdown><textarea data-template>
# Generaten't My Projects
nodejs-slim to the rescue!
</textarea></section>
<section data-markdown><textarea data-template>
# why is the app there twice?
<pre><code class="text"><script type="text/template">» nix why-depends -a --precise \
/nix/store/qq1zblyp6ysx-actual-server \
/nix/store/i778ag8s7jf8-actual-sync-modules-1.0.1
/nix/store/qq1zblyp6ysx96vd8havhw0wcsihcidf-actual-server
└───libexec/actual-sync/deps/actual-sync/node_modules
-> /nix/store/i778ag8s7jf8b-actual-sync-mo>
→ /nix/store/i778ag8s7jf8-actual-sync-modules-1.0.1
</script>
</code></pre>
</textarea></section>
<section data-markdown><textarea data-template>
# what's in there anyway?
<pre><code class="text"><script type="text/template"> » ls -a result/libexec/actual-sync/deps/actual-sync/node_modules
. .. .bin
» ls -a result/libexec/actual-sync/deps/actual-sync/node_modules/.bin
. .. eslint prettier tsc tsserver uuid
</script>
</code></pre>
</textarea></section>
<section data-markdown><textarea data-template>
# yeah I don't know why the builder did that
<img class="r-stretch" src="img/lets-see-who-this-really-is.png" alt="Scooby Doo 'let's see who this is anyway' meme, unmasking 'closure size' to be 'totally pointless stuff'">
</textarea></section>
<section data-markdown><textarea data-template>
# actually fixing it
To recap, our goals are:
1. Getting rid of Python via nodejs-slim
2. Fixing the app being included twice
</textarea></section>
<section data-markdown><textarea data-template>
<video class="r-stretch" src="img/livedemo.mp4" controls>
</textarea></section>
<section data-markdown><textarea data-template>
# summary
* Accidental dependencies cause closure size bloat
* Shipping suspiciously sentient spaghetti slurps time and bandwidth
* Fix closure size issues by deleting references
</textarea></section>
<section data-markdown><textarea data-template>
# Mercury is hiring!
Front-end, back-end, management, design, data
* Frontend
* Backend<fnref>1</fnref>
* Full stack
* Design
* Data engineering
* Data science
* Engineering management
https://mercury.com/jobs
See open positions at https://mercury.com/jobs
<div class="footnotes">
<ol><li>No Haskell experience required or expected; training is provided!</li></ol>
</div>
</textarea></section>
<section data-markdown><textarea data-template>
# fin
Tools:
- nix-closure-graph: https://github.com/lf-/dotfiles/tree/main/programs/nix-closure-graph
- Graph viewer: https://mercurytechnologies.github.io/looking-glass-viewer/
[@leftpaddotpy on Twitter](https://twitter.com/leftpaddotpy)
<https://jade.fyi>
my name [at] jade [dot] fyi
</textarea></section>
</div>
@ -174,6 +365,7 @@ https://mercury.com/jobs
plugins: [ RevealMarkdown, RevealHighlight, RevealNotes ],
transitionSpeed: 'fast',
transition: 'none',
slideNumber: true,
});
</script>
</body>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -3,4 +3,4 @@ const t=()=>{let t,e={messageStyle:"none",tex2jax:{inlineMath:[["$","$"],["\\(",
* This plugin is a wrapper for the MathJax2,
* MathJax3 and KaTeX typesetter plugins.
*/
var a=Plugin=Object.assign(e(),{KaTeX:()=>{let t,e={version:"latest",delimiters:[{left:"$$",right:"$$",display:!0},{left:"$",right:"$",display:!1},{left:"\\(",right:"\\)",display:!1},{left:"\\[",right:"\\]",display:!0}],ignoredTags:["script","noscript","style","textarea","pre"]};const a=t=>new Promise(((e,a)=>{const n=document.createElement("script");n.type="text/javascript",n.onload=e,n.onerror=a,n.src=t,document.head.append(n)}));return{id:"katex",init:function(n){t=n;let i=t.getConfig().katex||{},s={...e,...i};const{local:l,version:o,extensions:r,...c}=s;let d=s.local||"https://cdn.jsdelivr.net/npm/katex",p=s.local?"":"@"+s.version,u=d+p+"/dist/katex.min.css",h=d+p+"/dist/contrib/mhchem.min.js",x=d+p+"/dist/contrib/auto-render.min.js",m=[d+p+"/dist/katex.min.js"];s.extensions&&s.extensions.includes("mhchem")&&m.push(h),m.push(x);const f=()=>{renderMathInElement(n.getSlidesElement(),c),t.layout()};(t=>{let e=document.createElement("link");e.rel="stylesheet",e.href=t,document.head.appendChild(e)})(u),async function(t){for(const e of t)await a(e)}(m).then((()=>{t.isReady()?f():t.on("ready",f.bind(this))}))}}},MathJax2:t,MathJax3:()=>{let t,e={tex:{inlineMath:[["$","$"],["\\(","\\)"]]},options:{skipHtmlTags:["script","noscript","style","textarea","pre"]},startup:{ready:()=>{MathJax.startup.defaultReady(),MathJax.startup.promise.then((()=>{Reveal.layout()}))}}};return{id:"mathjax3",init:function(a){t=a;let n=t.getConfig().mathjax3||{},i={...e,...n};i.tex={...e.tex,...n.tex},i.options={...e.options,...n.options},i.startup={...e.startup,...n.startup};let s=i.mathjax||"https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js";i.mathjax=null,window.MathJax=i,function(t,e){let a=document.createElement("script");a.type="text/javascript",a.id="MathJax-script",a.src=t,a.async=!0,a.onload=()=>{"function"==typeof e&&(e.call(),e=null)},document.head.appendChild(a)}(s,(function(){Reveal.addEventListener("slidechanged",(function(t){MathJax.typeset()}))}))}}}});export{a as default};
var a=Plugin=Object.assign(e(),{KaTeX:()=>{let t,e={version:"latest",delimiters:[{left:"$$",right:"$$",display:!0},{left:"$",right:"$",display:!1},{left:"\\(",right:"\\)",display:!1},{left:"\\[",right:"\\]",display:!0}],ignoredTags:["script","noscript","style","textarea","pre"]};const a=t=>new Promise(((e,a)=>{const n=document.createElement("script");n.type="text/javascript",n.onload=e,n.onerror=a,n.src=t,document.head.append(n)}));return{id:"katex",init:function(n){t=n;let i=t.getConfig().katex||{},s={...e,...i};const{local:l,version:o,extensions:r,...c}=s;let d=s.local||"https://cdn.jsdelivr.net/npm/katex",p=s.local?"":"@"+s.version,u=d+p+"/dist/katex.min.css",h=d+p+"/dist/contrib/mhchem.min.js",x=d+p+"/dist/contrib/auto-render.min.js",m=[d+p+"/dist/katex.min.js"];s.extensions&&s.extensions.includes("mhchem")&&m.push(h),m.push(x);const f=()=>{renderMathInElement(n.getSlidesElement(),c),t.layout()};(t=>{let e=document.createElement("link");e.rel="stylesheet",e.href=t,document.head.appendChild(e)})(u),async function(t){for(const e of t)await a(e)}(m).then((()=>{t.isReady()?f():t.on("ready",f.bind(this))}))}}},MathJax2:t,MathJax3:()=>{let t,e={tex:{inlineMath:[["$","$"],["\\(","\\)"]]},options:{skipHtmlTags:["script","noscript","style","textarea","pre"]},startup:{ready:()=>{MathJax.startup.defaultReady(),MathJax.startup.promise.then((()=>{Reveal.layout()}))}}};return{id:"mathjax3",init:function(a){t=a;let n=t.getConfig().mathjax3||{},i={...e,...n};i.tex={...e.tex,...n.tex},i.options={...e.options,...n.options},i.startup={...e.startup,...n.startup};let s=i.mathjax||"https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js";i.mathjax=null,window.MathJax=i,function(t,e){let a=document.createElement("script");a.type="text/javascript",a.id="MathJax-script",a.src=t,a.async=!0,a.onload=()=>{"function"==typeof e&&(e.call(),e=null)},document.head.appendChild(a)}(s,(function(){Reveal.addEventListener("slidechanged",(function(t){MathJax.typeset()}))}))}}}});export default a;

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -4,4 +4,4 @@
*
* @author Jon Snyder <snyder.jon@gmail.com>, February 2013
*/
const e=()=>{let e,t,n,l,o,i,r;function s(){t=document.createElement("div"),t.classList.add("searchbox"),t.style.position="absolute",t.style.top="10px",t.style.right="10px",t.style.zIndex=10,t.innerHTML='<input type="search" class="searchinput" placeholder="Search..." style="vertical-align: top;"/>\n\t\t</span>',n=t.querySelector(".searchinput"),n.style.width="240px",n.style.fontSize="14px",n.style.padding="4px 6px",n.style.color="#000",n.style.background="#fff",n.style.borderRadius="2px",n.style.border="0",n.style.outline="0",n.style.boxShadow="0 2px 18px rgba(0, 0, 0, 0.2)",n.style["-webkit-appearance"]="none",e.getRevealElement().appendChild(t),n.addEventListener("keyup",(function(t){if(13===t.keyCode)t.preventDefault(),function(){if(i){var t=n.value;""===t?(r&&r.remove(),l=null):(r=new c("slidecontent"),l=r.apply(t),o=0)}l&&(l.length&&l.length<=o&&(o=0),l.length>o&&(e.slide(l[o].h,l[o].v),o++))}(),i=!1;else i=!0}),!1),d()}function a(){t||s(),t.style.display="inline",n.focus(),n.select()}function d(){t||s(),t.style.display="none",r&&r.remove()}function c(t,n){var l=document.getElementById(t)||document.body,o=n||"EM",i=new RegExp("^(?:"+o+"|SCRIPT|FORM)$"),r=["#ff6","#a0ffff","#9f9","#f99","#f6f"],s=[],a=0,d="",c=[];this.setRegex=function(e){e=e.replace(/^[^\w]+|[^\w]+$/g,"").replace(/[^\w'-]+/g,"|"),d=new RegExp("("+e+")","i")},this.getRegex=function(){return d.toString().replace(/^\/\\b\(|\)\\b\/i$/g,"").replace(/\|/g," ")},this.hiliteWords=function(t){if(null!=t&&t&&d&&!i.test(t.nodeName)){if(t.hasChildNodes())for(var n=0;n<t.childNodes.length;n++)this.hiliteWords(t.childNodes[n]);var l,p;if(3==t.nodeType)if((l=t.nodeValue)&&(p=d.exec(l))){for(var u=t;null!=u&&"SECTION"!=u.nodeName;)u=u.parentNode;var h=e.getIndices(u),f=c.length,y=!1;for(n=0;n<f;n++)c[n].h===h.h&&c[n].v===h.v&&(y=!0);y||c.push(h),s[p[0].toLowerCase()]||(s[p[0].toLowerCase()]=r[a++%r.length]);var g=document.createElement(o);g.appendChild(document.createTextNode(p[0])),g.style.backgroundColor=s[p[0].toLowerCase()],g.style.fontStyle="inherit",g.style.color="#000";var v=t.splitText(p.index);v.nodeValue=v.nodeValue.substring(p[0].length),t.parentNode.insertBefore(g,v)}}},this.remove=function(){for(var e,t=document.getElementsByTagName(o);t.length&&(e=t[0]);)e.parentNode.replaceChild(e.firstChild,e)},this.apply=function(e){if(null!=e&&e)return this.remove(),this.setRegex(e),this.hiliteWords(l),c}}return{id:"search",init:n=>{e=n,e.registerKeyboardShortcut("CTRL + Shift + F","Search"),document.addEventListener("keydown",(function(e){"F"==e.key&&(e.ctrlKey||e.metaKey)&&(e.preventDefault(),t||s(),"inline"!==t.style.display?a():d())}),!1)},open:a}};export{e as default};
export default()=>{let e,t,n,l,i,o,r;function s(){t=document.createElement("div"),t.classList.add("searchbox"),t.style.position="absolute",t.style.top="10px",t.style.right="10px",t.style.zIndex=10,t.innerHTML='<input type="search" class="searchinput" placeholder="Search..." style="vertical-align: top;"/>\n\t\t</span>',n=t.querySelector(".searchinput"),n.style.width="240px",n.style.fontSize="14px",n.style.padding="4px 6px",n.style.color="#000",n.style.background="#fff",n.style.borderRadius="2px",n.style.border="0",n.style.outline="0",n.style.boxShadow="0 2px 18px rgba(0, 0, 0, 0.2)",n.style["-webkit-appearance"]="none",e.getRevealElement().appendChild(t),n.addEventListener("keyup",(function(t){switch(t.keyCode){case 13:t.preventDefault(),function(){if(o){var t=n.value;""===t?(r&&r.remove(),l=null):(r=new c("slidecontent"),l=r.apply(t),i=0)}l&&(l.length&&l.length<=i&&(i=0),l.length>i&&(e.slide(l[i].h,l[i].v),i++))}(),o=!1;break;default:o=!0}}),!1),d()}function a(){t||s(),t.style.display="inline",n.focus(),n.select()}function d(){t||s(),t.style.display="none",r&&r.remove()}function c(t,n){var l=document.getElementById(t)||document.body,i=n||"EM",o=new RegExp("^(?:"+i+"|SCRIPT|FORM)$"),r=["#ff6","#a0ffff","#9f9","#f99","#f6f"],s=[],a=0,d="",c=[];this.setRegex=function(e){e=e.replace(/^[^\w]+|[^\w]+$/g,"").replace(/[^\w'-]+/g,"|"),d=new RegExp("("+e+")","i")},this.getRegex=function(){return d.toString().replace(/^\/\\b\(|\)\\b\/i$/g,"").replace(/\|/g," ")},this.hiliteWords=function(t){if(null!=t&&t&&d&&!o.test(t.nodeName)){if(t.hasChildNodes())for(var n=0;n<t.childNodes.length;n++)this.hiliteWords(t.childNodes[n]);var l,p;if(3==t.nodeType)if((l=t.nodeValue)&&(p=d.exec(l))){for(var u=t;null!=u&&"SECTION"!=u.nodeName;)u=u.parentNode;var h=e.getIndices(u),f=c.length,y=!1;for(n=0;n<f;n++)c[n].h===h.h&&c[n].v===h.v&&(y=!0);y||c.push(h),s[p[0].toLowerCase()]||(s[p[0].toLowerCase()]=r[a++%r.length]);var g=document.createElement(i);g.appendChild(document.createTextNode(p[0])),g.style.backgroundColor=s[p[0].toLowerCase()],g.style.fontStyle="inherit",g.style.color="#000";var v=t.splitText(p.index);v.nodeValue=v.nodeValue.substring(p[0].length),t.parentNode.insertBefore(g,v)}}},this.remove=function(){for(var e,t=document.getElementsByTagName(i);t.length&&(e=t[0]);)e.parentNode.replaceChild(e.firstChild,e)},this.apply=function(e){if(null!=e&&e)return this.remove(),this.setRegex(e),this.hiliteWords(l),c}}return{id:"search",init:n=>{e=n,e.registerKeyboardShortcut("CTRL + Shift + F","Search"),document.addEventListener("keydown",(function(e){"F"==e.key&&(e.ctrlKey||e.metaKey)&&(e.preventDefault(),t||s(),"inline"!==t.style.display?a():d())}),!1)},open:a}};

View file

@ -4,4 +4,4 @@
* by navigatating to that slide and highlighting it.
*
* @author Jon Snyder <snyder.jon@gmail.com>, February 2013
*/return()=>{let e,t,n,l,o,i,r;function s(){t=document.createElement("div"),t.classList.add("searchbox"),t.style.position="absolute",t.style.top="10px",t.style.right="10px",t.style.zIndex=10,t.innerHTML='<input type="search" class="searchinput" placeholder="Search..." style="vertical-align: top;"/>\n\t\t</span>',n=t.querySelector(".searchinput"),n.style.width="240px",n.style.fontSize="14px",n.style.padding="4px 6px",n.style.color="#000",n.style.background="#fff",n.style.borderRadius="2px",n.style.border="0",n.style.outline="0",n.style.boxShadow="0 2px 18px rgba(0, 0, 0, 0.2)",n.style["-webkit-appearance"]="none",e.getRevealElement().appendChild(t),n.addEventListener("keyup",(function(t){if(13===t.keyCode)t.preventDefault(),function(){if(i){var t=n.value;""===t?(r&&r.remove(),l=null):(r=new c("slidecontent"),l=r.apply(t),o=0)}l&&(l.length&&l.length<=o&&(o=0),l.length>o&&(e.slide(l[o].h,l[o].v),o++))}(),i=!1;else i=!0}),!1),d()}function a(){t||s(),t.style.display="inline",n.focus(),n.select()}function d(){t||s(),t.style.display="none",r&&r.remove()}function c(t,n){var l=document.getElementById(t)||document.body,o=n||"EM",i=new RegExp("^(?:"+o+"|SCRIPT|FORM)$"),r=["#ff6","#a0ffff","#9f9","#f99","#f6f"],s=[],a=0,d="",c=[];this.setRegex=function(e){e=e.replace(/^[^\w]+|[^\w]+$/g,"").replace(/[^\w'-]+/g,"|"),d=new RegExp("("+e+")","i")},this.getRegex=function(){return d.toString().replace(/^\/\\b\(|\)\\b\/i$/g,"").replace(/\|/g," ")},this.hiliteWords=function(t){if(null!=t&&t&&d&&!i.test(t.nodeName)){if(t.hasChildNodes())for(var n=0;n<t.childNodes.length;n++)this.hiliteWords(t.childNodes[n]);var l,f;if(3==t.nodeType)if((l=t.nodeValue)&&(f=d.exec(l))){for(var p=t;null!=p&&"SECTION"!=p.nodeName;)p=p.parentNode;var u=e.getIndices(p),h=c.length,y=!1;for(n=0;n<h;n++)c[n].h===u.h&&c[n].v===u.v&&(y=!0);y||c.push(u),s[f[0].toLowerCase()]||(s[f[0].toLowerCase()]=r[a++%r.length]);var g=document.createElement(o);g.appendChild(document.createTextNode(f[0])),g.style.backgroundColor=s[f[0].toLowerCase()],g.style.fontStyle="inherit",g.style.color="#000";var v=t.splitText(f.index);v.nodeValue=v.nodeValue.substring(f[0].length),t.parentNode.insertBefore(g,v)}}},this.remove=function(){for(var e,t=document.getElementsByTagName(o);t.length&&(e=t[0]);)e.parentNode.replaceChild(e.firstChild,e)},this.apply=function(e){if(null!=e&&e)return this.remove(),this.setRegex(e),this.hiliteWords(l),c}}return{id:"search",init:n=>{e=n,e.registerKeyboardShortcut("CTRL + Shift + F","Search"),document.addEventListener("keydown",(function(e){"F"==e.key&&(e.ctrlKey||e.metaKey)&&(e.preventDefault(),t||s(),"inline"!==t.style.display?a():d())}),!1)},open:a}}}));
*/return()=>{let e,t,n,l,o,i,r;function s(){t=document.createElement("div"),t.classList.add("searchbox"),t.style.position="absolute",t.style.top="10px",t.style.right="10px",t.style.zIndex=10,t.innerHTML='<input type="search" class="searchinput" placeholder="Search..." style="vertical-align: top;"/>\n\t\t</span>',n=t.querySelector(".searchinput"),n.style.width="240px",n.style.fontSize="14px",n.style.padding="4px 6px",n.style.color="#000",n.style.background="#fff",n.style.borderRadius="2px",n.style.border="0",n.style.outline="0",n.style.boxShadow="0 2px 18px rgba(0, 0, 0, 0.2)",n.style["-webkit-appearance"]="none",e.getRevealElement().appendChild(t),n.addEventListener("keyup",(function(t){switch(t.keyCode){case 13:t.preventDefault(),function(){if(i){var t=n.value;""===t?(r&&r.remove(),l=null):(r=new c("slidecontent"),l=r.apply(t),o=0)}l&&(l.length&&l.length<=o&&(o=0),l.length>o&&(e.slide(l[o].h,l[o].v),o++))}(),i=!1;break;default:i=!0}}),!1),d()}function a(){t||s(),t.style.display="inline",n.focus(),n.select()}function d(){t||s(),t.style.display="none",r&&r.remove()}function c(t,n){var l=document.getElementById(t)||document.body,o=n||"EM",i=new RegExp("^(?:"+o+"|SCRIPT|FORM)$"),r=["#ff6","#a0ffff","#9f9","#f99","#f6f"],s=[],a=0,d="",c=[];this.setRegex=function(e){e=e.replace(/^[^\w]+|[^\w]+$/g,"").replace(/[^\w'-]+/g,"|"),d=new RegExp("("+e+")","i")},this.getRegex=function(){return d.toString().replace(/^\/\\b\(|\)\\b\/i$/g,"").replace(/\|/g," ")},this.hiliteWords=function(t){if(null!=t&&t&&d&&!i.test(t.nodeName)){if(t.hasChildNodes())for(var n=0;n<t.childNodes.length;n++)this.hiliteWords(t.childNodes[n]);var l,f;if(3==t.nodeType)if((l=t.nodeValue)&&(f=d.exec(l))){for(var u=t;null!=u&&"SECTION"!=u.nodeName;)u=u.parentNode;var p=e.getIndices(u),h=c.length,y=!1;for(n=0;n<h;n++)c[n].h===p.h&&c[n].v===p.v&&(y=!0);y||c.push(p),s[f[0].toLowerCase()]||(s[f[0].toLowerCase()]=r[a++%r.length]);var g=document.createElement(o);g.appendChild(document.createTextNode(f[0])),g.style.backgroundColor=s[f[0].toLowerCase()],g.style.fontStyle="inherit",g.style.color="#000";var v=t.splitText(f.index);v.nodeValue=v.nodeValue.substring(f[0].length),t.parentNode.insertBefore(g,v)}}},this.remove=function(){for(var e,t=document.getElementsByTagName(o);t.length&&(e=t[0]);)e.parentNode.replaceChild(e.firstChild,e)},this.apply=function(e){if(null!=e&&e)return this.remove(),this.setRegex(e),this.hiliteWords(l),c}}return{id:"search",init:n=>{e=n,e.registerKeyboardShortcut("CTRL + Shift + F","Search"),document.addEventListener("keydown",(function(e){"F"==e.key&&(e.ctrlKey||e.metaKey)&&(e.preventDefault(),t||s(),"inline"!==t.style.display?a():d())}),!1)},open:a}}}));

View file

@ -1,11 +1,11 @@
/*!
* reveal.js Zoom plugin
*/
const e={id:"zoom",init:function(e){e.getRevealElement().addEventListener("mousedown",(function(t){var n=/Linux/.test(window.navigator.platform)?"ctrl":"alt",i=(e.getConfig().zoomKey?e.getConfig().zoomKey:n)+"Key",d=e.getConfig().zoomLevel?e.getConfig().zoomLevel:2;t[i]&&!e.isOverview()&&(t.preventDefault(),o.to({x:t.clientX,y:t.clientY,scale:d,pan:!1}))}))},destroy:()=>{o.reset()}};var t=()=>e,o=function(){var e=1,t=0,n=0,i=-1,d=-1,l="transform"in document.body.style;function s(t,o){var n=r();if(t.width=t.width||1,t.height=t.height||1,t.x-=(window.innerWidth-t.width*o)/2,t.y-=(window.innerHeight-t.height*o)/2,l)if(1===o)document.body.style.transform="";else{var i=n.x+"px "+n.y+"px",d="translate("+-t.x+"px,"+-t.y+"px) scale("+o+")";document.body.style.transformOrigin=i,document.body.style.transform=d}else 1===o?(document.body.style.position="",document.body.style.left="",document.body.style.top="",document.body.style.width="",document.body.style.height="",document.body.style.zoom=""):(document.body.style.position="relative",document.body.style.left=-(n.x+t.x)/o+"px",document.body.style.top=-(n.y+t.y)/o+"px",document.body.style.width=100*o+"%",document.body.style.height=100*o+"%",document.body.style.zoom=o);e=o,document.documentElement.classList&&(1!==e?document.documentElement.classList.add("zoomed"):document.documentElement.classList.remove("zoomed"))}function c(){var o=.12*window.innerWidth,i=.12*window.innerHeight,d=r();n<i?window.scroll(d.x,d.y-14/e*(1-n/i)):n>window.innerHeight-i&&window.scroll(d.x,d.y+(1-(window.innerHeight-n)/i)*(14/e)),t<o?window.scroll(d.x-14/e*(1-t/o),d.y):t>window.innerWidth-o&&window.scroll(d.x+(1-(window.innerWidth-t)/o)*(14/e),d.y)}function r(){return{x:void 0!==window.scrollX?window.scrollX:window.pageXOffset,y:void 0!==window.scrollY?window.scrollY:window.pageYOffset}}return l&&(document.body.style.transition="transform 0.8s ease"),document.addEventListener("keyup",(function(t){1!==e&&27===t.keyCode&&o.out()})),document.addEventListener("mousemove",(function(o){1!==e&&(t=o.clientX,n=o.clientY)})),{to:function(t){if(1!==e)o.out();else{if(t.x=t.x||0,t.y=t.y||0,t.element){var n=t.element.getBoundingClientRect();t.x=n.left-20,t.y=n.top-20,t.width=n.width+40,t.height=n.height+40}void 0!==t.width&&void 0!==t.height&&(t.scale=Math.max(Math.min(window.innerWidth/t.width,window.innerHeight/t.height),1)),t.scale>1&&(t.x*=t.scale,t.y*=t.scale,s(t,t.scale),!1!==t.pan&&(i=setTimeout((function(){d=setInterval(c,1e3/60)}),800)))}},out:function(){clearTimeout(i),clearInterval(d),s({x:0,y:0},1),e=1},magnify:function(e){this.to(e)},reset:function(){this.out()},zoomLevel:function(){return e}}}();
const e={id:"zoom",init:function(e){e.getRevealElement().addEventListener("mousedown",(function(o){var n=/Linux/.test(window.navigator.platform)?"ctrl":"alt",i=(e.getConfig().zoomKey?e.getConfig().zoomKey:n)+"Key",d=e.getConfig().zoomLevel?e.getConfig().zoomLevel:2;o[i]&&!e.isOverview()&&(o.preventDefault(),t.to({x:o.clientX,y:o.clientY,scale:d,pan:!1}))}))},destroy:()=>{t.reset()}};var t=function(){var e=1,o=0,n=0,i=-1,d=-1,l="transform"in document.body.style;function s(t,o){var n=r();if(t.width=t.width||1,t.height=t.height||1,t.x-=(window.innerWidth-t.width*o)/2,t.y-=(window.innerHeight-t.height*o)/2,l)if(1===o)document.body.style.transform="";else{var i=n.x+"px "+n.y+"px",d="translate("+-t.x+"px,"+-t.y+"px) scale("+o+")";document.body.style.transformOrigin=i,document.body.style.transform=d}else 1===o?(document.body.style.position="",document.body.style.left="",document.body.style.top="",document.body.style.width="",document.body.style.height="",document.body.style.zoom=""):(document.body.style.position="relative",document.body.style.left=-(n.x+t.x)/o+"px",document.body.style.top=-(n.y+t.y)/o+"px",document.body.style.width=100*o+"%",document.body.style.height=100*o+"%",document.body.style.zoom=o);e=o,document.documentElement.classList&&(1!==e?document.documentElement.classList.add("zoomed"):document.documentElement.classList.remove("zoomed"))}function c(){var t=.12*window.innerWidth,i=.12*window.innerHeight,d=r();n<i?window.scroll(d.x,d.y-14/e*(1-n/i)):n>window.innerHeight-i&&window.scroll(d.x,d.y+(1-(window.innerHeight-n)/i)*(14/e)),o<t?window.scroll(d.x-14/e*(1-o/t),d.y):o>window.innerWidth-t&&window.scroll(d.x+(1-(window.innerWidth-o)/t)*(14/e),d.y)}function r(){return{x:void 0!==window.scrollX?window.scrollX:window.pageXOffset,y:void 0!==window.scrollY?window.scrollY:window.pageYOffset}}return l&&(document.body.style.transition="transform 0.8s ease"),document.addEventListener("keyup",(function(o){1!==e&&27===o.keyCode&&t.out()})),document.addEventListener("mousemove",(function(t){1!==e&&(o=t.clientX,n=t.clientY)})),{to:function(o){if(1!==e)t.out();else{if(o.x=o.x||0,o.y=o.y||0,o.element){var n=o.element.getBoundingClientRect();o.x=n.left-20,o.y=n.top-20,o.width=n.width+40,o.height=n.height+40}void 0!==o.width&&void 0!==o.height&&(o.scale=Math.max(Math.min(window.innerWidth/o.width,window.innerHeight/o.height),1)),o.scale>1&&(o.x*=o.scale,o.y*=o.scale,s(o,o.scale),!1!==o.pan&&(i=setTimeout((function(){d=setInterval(c,1e3/60)}),800)))}},out:function(){clearTimeout(i),clearInterval(d),s({x:0,y:0},1),e=1},magnify:function(e){this.to(e)},reset:function(){this.out()},zoomLevel:function(){return e}}}();
/*!
* zoom.js 0.3 (modified for use with reveal.js)
* http://lab.hakim.se/zoom-js
* MIT licensed
*
* Copyright (C) 2011-2014 Hakim El Hattab, http://hakim.se
*/export{t as default};
*/export default()=>e;

View file

@ -4,10 +4,11 @@
--r-heading1-size: 1.5em;
}
.footnotes {
font-size: 0.8rem;
margin-top: 1em;
font-size: 0.6em;
}
fnref {
font-size: 0.9rem;
font-size: 0.7em;
vertical-align: super;
}
.footnotes li {
@ -29,9 +30,15 @@ fnref {
height: 400px;
}
.meta {
padding: 0.1em 0.5em;
background-color: #3c004d;
.reveal .slide-number {
font-size: 20px !important;
}
@media screen {
.meta {
padding: 0.1em 0.5em;
background-color: #3c004d;
}
}
.reveal pre {