Initial commit
This commit is contained in:
commit
720fa4a18b
17 changed files with 882 additions and 0 deletions
4
.gitignore
vendored
Normal file
4
.gitignore
vendored
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
archetypes/
|
||||||
|
public/
|
||||||
|
resources/
|
||||||
|
result
|
9
.gitmodules
vendored
Normal file
9
.gitmodules
vendored
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
[submodule "themes/blank"]
|
||||||
|
path = themes/blank
|
||||||
|
url = https://github.com/vimux/blank
|
||||||
|
[submodule "smol"]
|
||||||
|
path = smol
|
||||||
|
url = https://github.com/colorchestra/smol
|
||||||
|
[submodule "themes/smol"]
|
||||||
|
path = themes/smol
|
||||||
|
url = https://github.com/colorchestra/smol
|
31
config.yaml
Normal file
31
config.yaml
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
baseURL: "https://dadada.li/"
|
||||||
|
title: "dadada"
|
||||||
|
defaultContentLanguage: "en"
|
||||||
|
paginate: 5
|
||||||
|
theme: "smol"
|
||||||
|
enableRobotsTXT: true
|
||||||
|
|
||||||
|
params:
|
||||||
|
author: "dadada"
|
||||||
|
rss:
|
||||||
|
includeContent: true
|
||||||
|
|
||||||
|
taxonomies:
|
||||||
|
tag: "tags"
|
||||||
|
|
||||||
|
author:
|
||||||
|
name: "dadada"
|
||||||
|
|
||||||
|
|
||||||
|
menu:
|
||||||
|
main:
|
||||||
|
- identifier: blog
|
||||||
|
name: Blog
|
||||||
|
title: Blog
|
||||||
|
url: /blog/
|
||||||
|
weight: 0
|
||||||
|
- identifier: talks
|
||||||
|
name: Talks
|
||||||
|
title: Talks
|
||||||
|
url: /talks/
|
||||||
|
weight: 0
|
9
content/_index.md
Normal file
9
content/_index.md
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
+++
|
||||||
|
title = "dadada"
|
||||||
|
date = 2020-07-05
|
||||||
|
|
||||||
|
[taxonomies]
|
||||||
|
tags = []
|
||||||
|
+++
|
||||||
|
|
||||||
|
Hello, world!
|
41
content/blog/gpg.md
Normal file
41
content/blog/gpg.md
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
+++
|
||||||
|
title = "Managing stripped GPG keys"
|
||||||
|
date = 2017-12-03
|
||||||
|
|
||||||
|
[taxonomies]
|
||||||
|
tags = ["gpg", "security"]
|
||||||
|
+++
|
||||||
|
|
||||||
|
```
|
||||||
|
+--(master pass) +----(user pass)--+
|
||||||
|
| | | |
|
||||||
|
| decrypts decrypts decrypts
|
||||||
|
| | | |
|
||||||
|
| v v v
|
||||||
|
decrypts +----------------+ +----------+ +-----------+
|
||||||
|
| | TRUSTED | | ANDROID | | KEYCHAIN |
|
||||||
|
| | SCA (master) | | SE (ssb) | | SEA (ssb) |
|
||||||
|
| | offline + HSM | | Sandbox | | HSM |
|
||||||
|
| +----------------+ +----------+ +-----------+
|
||||||
|
| | ^ ^
|
||||||
|
| | | |
|
||||||
|
| +----creates-------------|-----------------+
|
||||||
|
|
|
||||||
|
| +-----------------+
|
||||||
|
| | PAPER |
|
||||||
|
+->| SEA (master) |
|
||||||
|
| remote on paper |
|
||||||
|
+-----------------+
|
||||||
|
```
|
||||||
|
|
||||||
|
See [here](https://www.void.gr/kargig/blog/2013/12/02/creating-a-new-gpg-key-with-subkeys/) on how to strip the master key (sec) from your keyring and create secret subkeys (ssb) for daily active use.
|
||||||
|
The master key can sign (S) new subkeys, create certificates (C) and provide authentication (A).
|
||||||
|
The master key lives forever, while the ssb that is used for signing is created with an expiration date.
|
||||||
|
All encryption keys may remain valid indefinitely until revoked.
|
||||||
|
The master key can be used to revoke the subkeys.
|
||||||
|
|
||||||
|
A few considerations
|
||||||
|
|
||||||
|
- use a separate PIN on the trusted system / for the master key (sec) in case a key-logger reads the PIN on a semi-trusted machine (e.g. laptop or android) when decrypting a secret subkey (ssb)
|
||||||
|
- use subkey (A) for authenticating ssh
|
||||||
|
- keep master key offline / air-gapped
|
9
content/blog/hello-world.md
Normal file
9
content/blog/hello-world.md
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
+++
|
||||||
|
title = "Hello, World!"
|
||||||
|
date = 2017-10-28
|
||||||
|
|
||||||
|
[taxonomies]
|
||||||
|
tags = ["hello world", "security"]
|
||||||
|
+++
|
||||||
|
|
||||||
|
Hello, World!
|
524
content/blog/home-layout/home.svg
Normal file
524
content/blog/home-layout/home.svg
Normal file
|
@ -0,0 +1,524 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
width="79.808044mm"
|
||||||
|
height="84.910774mm"
|
||||||
|
viewBox="0 0 79.808044 84.910774"
|
||||||
|
version="1.1"
|
||||||
|
id="svg8"
|
||||||
|
inkscape:version="0.92.2 5c3e80d, 2017-08-06"
|
||||||
|
sodipodi:docname="home.svg">
|
||||||
|
<defs
|
||||||
|
id="defs2">
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow1Mend"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="marker12286"
|
||||||
|
style="overflow:visible"
|
||||||
|
inkscape:isstock="true">
|
||||||
|
<path
|
||||||
|
id="path12284"
|
||||||
|
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||||
|
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
|
||||||
|
transform="matrix(-0.4,0,0,-0.4,-4,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow1Mstart"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="marker12126"
|
||||||
|
style="overflow:visible"
|
||||||
|
inkscape:isstock="true">
|
||||||
|
<path
|
||||||
|
id="path12124"
|
||||||
|
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||||
|
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
|
||||||
|
transform="matrix(0.4,0,0,0.4,4,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<inkscape:path-effect
|
||||||
|
effect="bspline"
|
||||||
|
id="path-effect11540"
|
||||||
|
is_visible="true"
|
||||||
|
weight="33.333333"
|
||||||
|
steps="2"
|
||||||
|
helper_size="0"
|
||||||
|
apply_no_weight="true"
|
||||||
|
apply_with_weight="true"
|
||||||
|
only_selected="false" />
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow1Mend"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="marker11246"
|
||||||
|
style="overflow:visible"
|
||||||
|
inkscape:isstock="true">
|
||||||
|
<path
|
||||||
|
id="path11244"
|
||||||
|
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||||
|
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
|
||||||
|
transform="matrix(-0.4,0,0,-0.4,-4,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<inkscape:path-effect
|
||||||
|
effect="bspline"
|
||||||
|
id="path-effect11100"
|
||||||
|
is_visible="true"
|
||||||
|
weight="33.333333"
|
||||||
|
steps="2"
|
||||||
|
helper_size="0"
|
||||||
|
apply_no_weight="true"
|
||||||
|
apply_with_weight="true"
|
||||||
|
only_selected="false" />
|
||||||
|
<inkscape:path-effect
|
||||||
|
effect="bspline"
|
||||||
|
id="path-effect11096"
|
||||||
|
is_visible="true"
|
||||||
|
weight="33.333333"
|
||||||
|
steps="2"
|
||||||
|
helper_size="0"
|
||||||
|
apply_no_weight="true"
|
||||||
|
apply_with_weight="true"
|
||||||
|
only_selected="false" />
|
||||||
|
<inkscape:path-effect
|
||||||
|
effect="bspline"
|
||||||
|
id="path-effect11092"
|
||||||
|
is_visible="true"
|
||||||
|
weight="33.333333"
|
||||||
|
steps="2"
|
||||||
|
helper_size="0"
|
||||||
|
apply_no_weight="true"
|
||||||
|
apply_with_weight="true"
|
||||||
|
only_selected="false" />
|
||||||
|
<marker
|
||||||
|
inkscape:isstock="true"
|
||||||
|
style="overflow:visible"
|
||||||
|
id="marker10964"
|
||||||
|
refX="0"
|
||||||
|
refY="0"
|
||||||
|
orient="auto"
|
||||||
|
inkscape:stockid="Arrow1Mend"
|
||||||
|
inkscape:collect="always">
|
||||||
|
<path
|
||||||
|
transform="matrix(-0.4,0,0,-0.4,-4,0)"
|
||||||
|
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
|
||||||
|
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||||
|
id="path10962"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow1Mend"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="marker10824"
|
||||||
|
style="overflow:visible"
|
||||||
|
inkscape:isstock="true"
|
||||||
|
inkscape:collect="always">
|
||||||
|
<path
|
||||||
|
id="path10822"
|
||||||
|
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||||
|
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
|
||||||
|
transform="matrix(-0.4,0,0,-0.4,-4,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:isstock="true"
|
||||||
|
style="overflow:visible"
|
||||||
|
id="marker10396"
|
||||||
|
refX="0"
|
||||||
|
refY="0"
|
||||||
|
orient="auto"
|
||||||
|
inkscape:stockid="Arrow1Mend"
|
||||||
|
inkscape:collect="always">
|
||||||
|
<path
|
||||||
|
transform="matrix(-0.4,0,0,-0.4,-4,0)"
|
||||||
|
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
|
||||||
|
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||||
|
id="path10394"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow2Lend"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="marker10278"
|
||||||
|
style="overflow:visible"
|
||||||
|
inkscape:isstock="true">
|
||||||
|
<path
|
||||||
|
id="path10276"
|
||||||
|
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
|
||||||
|
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||||
|
transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow1Mend"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow1Mend"
|
||||||
|
style="overflow:visible"
|
||||||
|
inkscape:isstock="true"
|
||||||
|
inkscape:collect="always">
|
||||||
|
<path
|
||||||
|
id="path8629"
|
||||||
|
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||||
|
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
|
||||||
|
transform="matrix(-0.4,0,0,-0.4,-4,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="TriangleOutM"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="TriangleOutM"
|
||||||
|
style="overflow:visible"
|
||||||
|
inkscape:isstock="true">
|
||||||
|
<path
|
||||||
|
id="path8765"
|
||||||
|
d="M 5.77,0 -2.88,5 V -5 Z"
|
||||||
|
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
|
||||||
|
transform="scale(0.4)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow2Send"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow2Send"
|
||||||
|
style="overflow:visible"
|
||||||
|
inkscape:isstock="true">
|
||||||
|
<path
|
||||||
|
id="path8653"
|
||||||
|
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
|
||||||
|
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||||
|
transform="matrix(-0.3,0,0,-0.3,0.69,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow2Lend"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow2Lend"
|
||||||
|
style="overflow:visible"
|
||||||
|
inkscape:isstock="true">
|
||||||
|
<path
|
||||||
|
id="path8641"
|
||||||
|
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
|
||||||
|
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||||
|
transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="TriangleInL"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="TriangleInL"
|
||||||
|
style="overflow:visible"
|
||||||
|
inkscape:isstock="true">
|
||||||
|
<path
|
||||||
|
id="path8753"
|
||||||
|
d="M 5.77,0 -2.88,5 V -5 Z"
|
||||||
|
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
|
||||||
|
transform="scale(-0.8)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Tail"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Tail"
|
||||||
|
style="overflow:visible"
|
||||||
|
inkscape:isstock="true">
|
||||||
|
<g
|
||||||
|
id="g8668"
|
||||||
|
transform="scale(-1.2)"
|
||||||
|
style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-opacity:1">
|
||||||
|
<path
|
||||||
|
id="path8656"
|
||||||
|
d="M -3.8048674,-3.9585227 0.54352094,0"
|
||||||
|
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-opacity:1"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
<path
|
||||||
|
id="path8658"
|
||||||
|
d="M -1.2866832,-3.9585227 3.0617053,0"
|
||||||
|
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-opacity:1"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
<path
|
||||||
|
id="path8660"
|
||||||
|
d="M 1.3053582,-3.9585227 5.6537466,0"
|
||||||
|
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-opacity:1"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
<path
|
||||||
|
id="path8662"
|
||||||
|
d="M -3.8048674,4.1775838 0.54352094,0.21974226"
|
||||||
|
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-opacity:1"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
<path
|
||||||
|
id="path8664"
|
||||||
|
d="M -1.2866832,4.1775838 3.0617053,0.21974226"
|
||||||
|
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-opacity:1"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
<path
|
||||||
|
id="path8666"
|
||||||
|
d="M 1.3053582,4.1775838 5.6537466,0.21974226"
|
||||||
|
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-opacity:1"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</g>
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow1Lstart"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="marker9168"
|
||||||
|
style="overflow:visible"
|
||||||
|
inkscape:isstock="true">
|
||||||
|
<path
|
||||||
|
id="path9166"
|
||||||
|
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||||
|
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
|
||||||
|
transform="matrix(0.8,0,0,0.8,10,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow1Lend"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="marker9080"
|
||||||
|
style="overflow:visible"
|
||||||
|
inkscape:isstock="true">
|
||||||
|
<path
|
||||||
|
id="path9078"
|
||||||
|
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||||
|
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
|
||||||
|
transform="matrix(-0.8,0,0,-0.8,-10,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow1Lstart"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow1Lstart"
|
||||||
|
style="overflow:visible"
|
||||||
|
inkscape:isstock="true">
|
||||||
|
<path
|
||||||
|
id="path8620"
|
||||||
|
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||||
|
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
|
||||||
|
transform="matrix(0.8,0,0,0.8,10,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow1Lend"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="marker8972"
|
||||||
|
style="overflow:visible"
|
||||||
|
inkscape:isstock="true">
|
||||||
|
<path
|
||||||
|
id="path8970"
|
||||||
|
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||||
|
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
|
||||||
|
transform="matrix(-0.8,0,0,-0.8,-10,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow1Lend"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow1Lend"
|
||||||
|
style="overflow:visible"
|
||||||
|
inkscape:isstock="true">
|
||||||
|
<path
|
||||||
|
id="path8623"
|
||||||
|
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||||
|
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
|
||||||
|
transform="matrix(-0.8,0,0,-0.8,-10,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
</defs>
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="base"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:zoom="0.7"
|
||||||
|
inkscape:cx="514.97142"
|
||||||
|
inkscape:cy="6.5823723"
|
||||||
|
inkscape:document-units="mm"
|
||||||
|
inkscape:current-layer="layer1"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:window-width="1600"
|
||||||
|
inkscape:window-height="836"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-y="27"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
fit-margin-top="0"
|
||||||
|
fit-margin-left="0"
|
||||||
|
fit-margin-right="0"
|
||||||
|
fit-margin-bottom="0" />
|
||||||
|
<metadata
|
||||||
|
id="metadata5">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
<dc:title></dc:title>
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<g
|
||||||
|
inkscape:label="Layer 1"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer1"
|
||||||
|
transform="translate(-11.973212,-102.22025)">
|
||||||
|
<g
|
||||||
|
id="g12794"
|
||||||
|
transform="translate(0,0.75595093)">
|
||||||
|
<rect
|
||||||
|
y="137.64555"
|
||||||
|
x="12.473212"
|
||||||
|
height="15.119047"
|
||||||
|
width="31.372023"
|
||||||
|
id="rect7631"
|
||||||
|
style="opacity:1;fill:#eeeeee;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||||
|
<text
|
||||||
|
id="text8459"
|
||||||
|
y="147.8354"
|
||||||
|
x="23.823561"
|
||||||
|
style="font-style:normal;font-weight:normal;font-size:7.05555534px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
xml:space="preserve"><tspan
|
||||||
|
style="stroke-width:0.26458332px"
|
||||||
|
y="147.8354"
|
||||||
|
x="23.823561"
|
||||||
|
id="tspan8457"
|
||||||
|
sodipodi:role="line">lib</tspan></text>
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
id="g12799"
|
||||||
|
transform="translate(0.75598145)">
|
||||||
|
<rect
|
||||||
|
y="171.51198"
|
||||||
|
x="59.153252"
|
||||||
|
height="15.119047"
|
||||||
|
width="31.372023"
|
||||||
|
id="rect7631-3-5"
|
||||||
|
style="opacity:1;fill:#eeeeee;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||||
|
<text
|
||||||
|
id="text8459-6-3"
|
||||||
|
y="180.81471"
|
||||||
|
x="69.277153"
|
||||||
|
style="font-style:normal;font-weight:normal;font-size:7.05555534px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
xml:space="preserve"><tspan
|
||||||
|
style="stroke-width:0.26458332px"
|
||||||
|
y="180.81471"
|
||||||
|
x="69.277153"
|
||||||
|
id="tspan8457-7-5"
|
||||||
|
sodipodi:role="line">tag</tspan></text>
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
id="g12789">
|
||||||
|
<rect
|
||||||
|
y="138.4015"
|
||||||
|
x="59.909233"
|
||||||
|
height="15.119047"
|
||||||
|
width="31.372023"
|
||||||
|
id="rect7631-3-6"
|
||||||
|
style="opacity:1;fill:#eeeeee;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||||
|
<text
|
||||||
|
id="text8459-6-2"
|
||||||
|
y="147.88684"
|
||||||
|
x="70.4655"
|
||||||
|
style="font-style:normal;font-weight:normal;font-size:7.05555534px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
xml:space="preserve"><tspan
|
||||||
|
style="stroke-width:0.26458332px"
|
||||||
|
y="147.88684"
|
||||||
|
x="70.4655"
|
||||||
|
id="tspan8457-7-9"
|
||||||
|
sodipodi:role="line">src</tspan></text>
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
id="g12804"
|
||||||
|
transform="translate(-1.305687,2.1367264)">
|
||||||
|
<rect
|
||||||
|
y="100.58353"
|
||||||
|
x="13.778899"
|
||||||
|
height="15.119047"
|
||||||
|
width="31.372023"
|
||||||
|
id="rect7631-8"
|
||||||
|
style="opacity:1;fill:#ddffdd;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||||
|
<text
|
||||||
|
id="text8459-7"
|
||||||
|
y="109.88628"
|
||||||
|
x="22.500647"
|
||||||
|
style="font-style:normal;font-weight:normal;font-size:7.05555534px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
xml:space="preserve"><tspan
|
||||||
|
style="stroke-width:0.26458332px"
|
||||||
|
y="109.88628"
|
||||||
|
x="22.500647"
|
||||||
|
id="tspan8457-9"
|
||||||
|
sodipodi:role="line">tmp</tspan></text>
|
||||||
|
</g>
|
||||||
|
<path
|
||||||
|
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Mend)"
|
||||||
|
d="m 28.159224,117.8393 0,20.5622"
|
||||||
|
id="path10174"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
inkscape:connector-type="polyline"
|
||||||
|
inkscape:connection-start="#rect7631-8"
|
||||||
|
inkscape:connection-end="#rect7631" />
|
||||||
|
<path
|
||||||
|
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker10396)"
|
||||||
|
d="m 38.209143,117.8393 27.336182,20.5622"
|
||||||
|
id="path10274"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
inkscape:connector-type="polyline"
|
||||||
|
inkscape:connection-start="#rect7631-8"
|
||||||
|
inkscape:connection-end="#rect7631-3-6" />
|
||||||
|
<path
|
||||||
|
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1, 1;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker10824)"
|
||||||
|
d="m 75.595244,153.52055 0,17.99143"
|
||||||
|
id="path10814"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
inkscape:connector-type="polyline"
|
||||||
|
inkscape:connection-start="#rect7631-3-6"
|
||||||
|
inkscape:connection-end="#rect7631-3-5" />
|
||||||
|
<path
|
||||||
|
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.00000003, 1.00000003;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker10964)"
|
||||||
|
d="m 38.989444,153.52055 25.77558,17.99143"
|
||||||
|
id="path10954"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
inkscape:connector-type="polyline"
|
||||||
|
inkscape:connection-start="#rect7631"
|
||||||
|
inkscape:connection-end="#rect7631-3-5" />
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 19 KiB |
63
content/blog/home-layout/index.md
Normal file
63
content/blog/home-layout/index.md
Normal file
|
@ -0,0 +1,63 @@
|
||||||
|
+++
|
||||||
|
title = "My $HOME"
|
||||||
|
date = 2018-09-03
|
||||||
|
|
||||||
|
[taxonomies]
|
||||||
|
tags = ["organisation", "linux"]
|
||||||
|
+++
|
||||||
|
|
||||||
|
Recently, I came across a blog posting titled "[$HOME, sweet $HOME](https://morr.cc/home-sweet-home/)", where [@blinry](https://morr.cc/) advocates for structuring your `$HOME` directory based on projects and their activity.
|
||||||
|
After reading this I felt inspired to finally have a look at the mess I made of my `$HOME` in the last years.
|
||||||
|
|
||||||
|
A few things about my old `$HOME`:
|
||||||
|
- ``Documents`` contained basically everything I had accumulated during the last years besides music, videos, pictures and source code.
|
||||||
|
- ``projects`` just contained one gigantic folder of all projects that I ever worked on.
|
||||||
|
- the rest was based on the default [xdg-user-dirs](https://freedesktop.org/wiki/Software/xdg-user-dirs/)
|
||||||
|
|
||||||
|
If you sorted the files by file type like the default XDG directories suggest, files from one project may be scattered across many different directories.
|
||||||
|
|
||||||
|
So my goal for the new `$HOME` was to have a clean directory structure where:
|
||||||
|
- it is obvious where to place new files
|
||||||
|
- paths do not become too long to type out
|
||||||
|
- the directory structure relates to how I work
|
||||||
|
|
||||||
|
A quick tour of my new `$HOME`:
|
||||||
|
|
||||||
|
- `lib` for immutable files
|
||||||
|
- `src` for mutable files
|
||||||
|
- `tag` stores links to projects
|
||||||
|
- `tmp` for unsorted files and downloads
|
||||||
|
|
||||||
|
## The project directory
|
||||||
|
|
||||||
|
All of my projects are stored in `src`.
|
||||||
|
I use a flat directory structure, where every project has its own subdirectory based on its name.
|
||||||
|
Projects can become part of one or more larger contexts through the use of tags.
|
||||||
|
|
||||||
|
## Tags
|
||||||
|
|
||||||
|
Tag directories are stored in `tag`.
|
||||||
|
Each directory stores symbolic links to parts of a project that can be distributed around `lib` and `src`.
|
||||||
|
One possible use for the tag directories is creating workbenches.
|
||||||
|
If I use some directories in `lib` or `src` in different contexts, `tag` can be used to include them in multiple workbenches.
|
||||||
|
|
||||||
|
An example workflow
|
||||||
|
```sh
|
||||||
|
$ cd tag
|
||||||
|
$ mkdir -p course1/examples
|
||||||
|
$ ln -s ~/src/example1 course1/examples/
|
||||||
|
$ ln -s ~/lib/courses/course1 course1/material
|
||||||
|
$ rm -r course1
|
||||||
|
```
|
||||||
|
|
||||||
|
I create new tags for various reasons, but mostly one for each larger context (e.g. work, hobbies, admin foo, thesis, courseXY) and some more for tracking project activity.
|
||||||
|
There are four different tags in `tag` directory right now for tracking project activity:
|
||||||
|
|
||||||
|
- permanent
|
||||||
|
- active
|
||||||
|
- hold
|
||||||
|
- dead
|
||||||
|
|
||||||
|
## Workflow
|
||||||
|
|
||||||
|

|
16
content/blog/learning-rust.md
Normal file
16
content/blog/learning-rust.md
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
+++
|
||||||
|
title = "Learning Rust"
|
||||||
|
draft = true
|
||||||
|
date = 1980-01-01
|
||||||
|
|
||||||
|
[taxonomies]
|
||||||
|
tags = ["rust", "programming", "language"]
|
||||||
|
+++
|
||||||
|
|
||||||
|
## Blog!
|
||||||
|
|
||||||
|
{% for post in collections.posts.pages %}
|
||||||
|
#### {{post.title}}
|
||||||
|
|
||||||
|
[{{ post.title }}]({{ post.permalink }})
|
||||||
|
{% endfor %}
|
87
content/talks/systemd.generator.md
Normal file
87
content/talks/systemd.generator.md
Normal file
|
@ -0,0 +1,87 @@
|
||||||
|
---
|
||||||
|
title: systemd.generator(7)
|
||||||
|
author: dadada
|
||||||
|
width: 1920
|
||||||
|
height: 1080
|
||||||
|
date: 2019-03-14
|
||||||
|
---
|
||||||
|
|
||||||
|
[Recording](https://www.youtube.com/watch?v=X88zHJjodFw)
|
||||||
|
|
||||||
|
# Dynamische Systeme sind schwierig
|
||||||
|
|
||||||
|
- ➤ Devices, Mountpoints, Services, Timer möglichst als Unit
|
||||||
|
- Transitionstechnologie für `/etc/fstab` und SysV init-Skripte
|
||||||
|
- Hooks für den Bootprozess (System-Update, Resume, Debug ...)
|
||||||
|
- Umgebungsvariablen setzen
|
||||||
|
- ➤ Generatoren generieren beim Boot dynamisch Units
|
||||||
|
|
||||||
|
# Calling convention
|
||||||
|
|
||||||
|
`# /path/to/generator normal-dir early-dir late-dir`
|
||||||
|
|
||||||
|
- Generatoren sind in
|
||||||
|
- `/run/systemd/{system,user}-generators/*`
|
||||||
|
- `/etc/systemd/{system,user}-generators/*`
|
||||||
|
- `/usr/lib/systemd/{system,user}-generators/*`
|
||||||
|
- `/usr/local/lib/systemd/{system,user}-generators/*`
|
||||||
|
|
||||||
|
|
||||||
|
# Generierte Units
|
||||||
|
|
||||||
|
- neu generieren mit `systemctl daemon-reload`
|
||||||
|
- generierte Units landen in
|
||||||
|
- `normal-dir` ➤ `/run/systemd/generator`
|
||||||
|
- `early-dir` ➤ `/run/systemd/generator.early`
|
||||||
|
- `late-dir` ➤ `/run/systemd/generator.late`
|
||||||
|
|
||||||
|
# Templating
|
||||||
|
|
||||||
|
- generierte Units dürfen auch sein
|
||||||
|
- Templates
|
||||||
|
- Instanzen von Templates (`getty@tty1.service`)
|
||||||
|
- Generatoren können auch Symlinks in `.wants/`, `.target` und `.requires/` erstellen
|
||||||
|
|
||||||
|
# Abhängigkeiten vermeiden
|
||||||
|
- kein syslog oder journal benutzen
|
||||||
|
- keine Units starten
|
||||||
|
- keine nicht essentiellen Dateisysteme verwenden (aber /proc, /usr, /sys und /dev)
|
||||||
|
- Generatoren werden parallel ausgeführt
|
||||||
|
|
||||||
|
# Performance
|
||||||
|
|
||||||
|
kann Boot verlangsamen ➤ Nicht mit bash implementieren, lieber C
|
||||||
|
|
||||||
|
# Debugging
|
||||||
|
|
||||||
|
```
|
||||||
|
dir=$(mktemp -d)
|
||||||
|
SYSTEMD_LOG_LEVEL=debug /usr/lib/systemd/system-generators/systemd-fstab-generator "$dir" "$dir" "$dir"
|
||||||
|
find $dir
|
||||||
|
```
|
||||||
|
|
||||||
|
- syslog(3) ist nicht vefügbar
|
||||||
|
- keine Magie versuchen
|
||||||
|
|
||||||
|
# Nicht geeignet für
|
||||||
|
|
||||||
|
- Ersatz von init-Skripten
|
||||||
|
➤ systemd-sysv-generator(8)
|
||||||
|
- dynamische Konfigurationsdateien
|
||||||
|
➤ `ExecStartPre=` oder Service mit `Before=`
|
||||||
|
|
||||||
|
# Beispiele
|
||||||
|
|
||||||
|
- systemd-fstab-generator(8)
|
||||||
|
|
||||||
|
- systemd-debug-generator(8)
|
||||||
|
|
||||||
|
- systemd-getty-generator(8)
|
||||||
|
|
||||||
|
- systemd-sysv-generator(8)
|
||||||
|
|
||||||
|
- systemd.environment-generator(7)
|
||||||
|
|
||||||
|
# Source
|
||||||
|
|
||||||
|
- `man 7 systemd.generator`
|
19
default.nix
Normal file
19
default.nix
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
with import <nixpkgs> {};
|
||||||
|
stdenv.mkDerivation {
|
||||||
|
name = "dadada.li";
|
||||||
|
builtInputs = [ pkgs.hugo ];
|
||||||
|
src = ./.;
|
||||||
|
buildPhase = "${pkgs.hugo}/bin/hugo";
|
||||||
|
installPhase = ''
|
||||||
|
mkdir -p $out
|
||||||
|
cp -r public/* $out
|
||||||
|
'';
|
||||||
|
dontFixup = true;
|
||||||
|
dontStrip = true;
|
||||||
|
|
||||||
|
meta = with lib; {
|
||||||
|
description = "dadada.li web-site";
|
||||||
|
license = licenses.cc-by-sa-40;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
17
i18n/de.toml
Normal file
17
i18n/de.toml
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
[talks]
|
||||||
|
other = "Talks"
|
||||||
|
|
||||||
|
[blog]
|
||||||
|
other = "Blogs"
|
||||||
|
|
||||||
|
[writtenBy]
|
||||||
|
other = "Von"
|
||||||
|
|
||||||
|
[on]
|
||||||
|
other = "am"
|
||||||
|
|
||||||
|
[generator]
|
||||||
|
other = "Made with <a href='https://gohugo.io'>Hugo</a> using the <a href='https://github.com/EmielH/tale-hugo/'>Tale</a> theme."
|
||||||
|
|
||||||
|
[publishdate]
|
||||||
|
other = "{{ .PublishDate.Day }}. {{ index $.Site.Data.months_de (printf \"%d\" .PublishDate.Month) }} {{ .PublishDate.Year }}"
|
17
i18n/en.toml
Normal file
17
i18n/en.toml
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
[talks]
|
||||||
|
other = "Talks"
|
||||||
|
|
||||||
|
[blog]
|
||||||
|
other = "Blog"
|
||||||
|
|
||||||
|
[writtenBy]
|
||||||
|
other = "Written by"
|
||||||
|
|
||||||
|
[on]
|
||||||
|
other = "on"
|
||||||
|
|
||||||
|
[generator]
|
||||||
|
other = "Made with <a href='https://gohugo.io'>Hugo</a> using the <a href='https://github.com/EmielH/tale-hugo/'>Tale</a> theme."
|
||||||
|
|
||||||
|
[publishdate]
|
||||||
|
other = "{{ .PublishDate.Format \"January 2, 2006\" }}"
|
17
i18n/es.toml
Normal file
17
i18n/es.toml
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
[blog]
|
||||||
|
other = "Artículos"
|
||||||
|
|
||||||
|
[talks]
|
||||||
|
other = "Talks"
|
||||||
|
|
||||||
|
[writtenBy]
|
||||||
|
other = "Escrito por"
|
||||||
|
|
||||||
|
[on]
|
||||||
|
other = "el"
|
||||||
|
|
||||||
|
[generator]
|
||||||
|
other = "Hecho con <a href='https://gohugo.io'>Hugo</a> usando el tema <a href='https://github.com/EmielH/tale-hugo/'>Tale</a>."
|
||||||
|
|
||||||
|
[publishdate]
|
||||||
|
other = "{{ .PublishDate.Day }} de {{ index $.Site.Data.months_es (printf \"%d\" .PublishDate.Month) }} de {{ .PublishDate.Year }}"
|
17
i18n/nl.toml
Normal file
17
i18n/nl.toml
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
[posts]
|
||||||
|
other = "Artikelen"
|
||||||
|
|
||||||
|
[Talks]
|
||||||
|
other = "Talks"
|
||||||
|
|
||||||
|
[writtenBy]
|
||||||
|
other = "Geschreven door"
|
||||||
|
|
||||||
|
[on]
|
||||||
|
other = "op"
|
||||||
|
|
||||||
|
[generator]
|
||||||
|
other = "Gemaakt met <a href='https://gohugo.io'>Hugo</a> en thema <a href='https://github.com/EmielH/tale-hugo/'>Tale</a>."
|
||||||
|
|
||||||
|
[publishdate]
|
||||||
|
other = "{{ .PublishDate.Day }} {{ index $.Site.Data.months_nl (printf \"%d\" .PublishDate.Month) }} {{ .PublishDate.Year }}"
|
1
smol
Submodule
1
smol
Submodule
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit 2bb4ff73056f6b9ec4d5e43d9abe883bb62c9f9d
|
1
themes/smol
Submodule
1
themes/smol
Submodule
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit 2bb4ff73056f6b9ec4d5e43d9abe883bb62c9f9d
|
Loading…
Add table
Add a link
Reference in a new issue