4
.obsidian/appearance.json
vendored
@@ -1 +1,3 @@
|
|||||||
{}
|
{
|
||||||
|
"cssTheme": "Obsidian gruvbox"
|
||||||
|
}
|
||||||
7
.obsidian/themes/Obsidian gruvbox/manifest.json
vendored
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"name": "Obsidian gruvbox",
|
||||||
|
"version": "0.2.1",
|
||||||
|
"minAppVersion": "0.16.0",
|
||||||
|
"author": "insanum",
|
||||||
|
"authorUrl": "https://insanum.com"
|
||||||
|
}
|
||||||
579
.obsidian/themes/Obsidian gruvbox/theme.css
vendored
Normal file
@@ -0,0 +1,579 @@
|
|||||||
|
|
||||||
|
:root
|
||||||
|
{
|
||||||
|
--dark0-hard_x: 29,32,33; /* #1d2021 */
|
||||||
|
--dark0-hard: rgb(var(--dark0-hard_x));
|
||||||
|
--dark0_x: 40,40,40; /* #282828 */
|
||||||
|
--dark0: rgb(var(--dark0_x));
|
||||||
|
--dark0-soft_x: 50,48,47; /* #32302f */
|
||||||
|
--dark0-soft: rgb(var(--dark0-soft_x));
|
||||||
|
--dark1_x: 60,56,54; /* #3c3836 */
|
||||||
|
--dark1: rgb(var(--dark1_x));
|
||||||
|
--dark2_x: 80,73,69; /* #504945 */
|
||||||
|
--dark2: rgb(var(--dark2_x));
|
||||||
|
--dark3_x: 102,92,84; /* #665c54 */
|
||||||
|
--dark3: rgb(var(--dark3_x));
|
||||||
|
--dark4_x: 124,111,100; /* #7c6f64 */
|
||||||
|
--dark4: rgb(var(--dark4_x));
|
||||||
|
--gray_x: 146,131,116; /* #928374 */
|
||||||
|
--gray: rgb(var(--gray_x));
|
||||||
|
|
||||||
|
--light0-hard_x: 249,245,215; /* #f9f5d7 */
|
||||||
|
--light0-hard: rgb(var(--light0-hard_x));
|
||||||
|
--light0_x: 251,241,199; /* #fbf1c7 */
|
||||||
|
--light0: rgb(var(--light0_x));
|
||||||
|
--light0-soft_x: 242,229,188; /* #f2e5bc */
|
||||||
|
--light0-soft: rgb(var(--light0-soft_x));
|
||||||
|
--light1_x: 235,219,178; /* #ebdbb2 */
|
||||||
|
--light1: rgb(var(--light1_x));
|
||||||
|
--light2_x: 213,196,161; /* #d5c4a1 */
|
||||||
|
--light2: rgb(var(--light2_x));
|
||||||
|
--light3_x: 189,174,147; /* #bdae93 */
|
||||||
|
--light3: rgb(var(--light3_x));
|
||||||
|
--light4_x: 168,153,132; /* #a89984 */
|
||||||
|
--light4: rgb(var(--light4_x));
|
||||||
|
|
||||||
|
--bright-red_x: 251,73,52; /* #fb4934 */
|
||||||
|
--bright-red: rgb(var(--bright-red_x));
|
||||||
|
--bright-green_x: 184,187,38; /* #b8bb26 */
|
||||||
|
--bright-green: rgb(var(--bright-green_x));
|
||||||
|
--bright-yellow_x: 250,189,47; /* #fabd2f */
|
||||||
|
--bright-yellow: rgb(var(--bright-yellow_x));
|
||||||
|
--bright-blue_x: 131,165,152; /* #83a598 */
|
||||||
|
--bright-blue: rgb(var(--bright-blue_x));
|
||||||
|
--bright-purple_x: 211,134,155; /* #d3869b */
|
||||||
|
--bright-purple: rgb(var(--bright-purple_x));
|
||||||
|
--bright-aqua_x: 142,192,124; /* #8ec07c */
|
||||||
|
--bright-aqua: rgb(var(--bright-aqua_x));
|
||||||
|
--bright-orange_x: 254,128,25; /* #fe8019 */
|
||||||
|
--bright-orange: rgb(var(--bright-orange_x));
|
||||||
|
|
||||||
|
--neutral-red_x: 204,36,29; /* #cc241d */
|
||||||
|
--neutral-red: rgb(var(--neutral-red_x));
|
||||||
|
--neutral-green_x: 152,151,26; /* #98971a */
|
||||||
|
--neutral-green: rgb(var(--neutral-green_x));
|
||||||
|
--neutral-yellow_x: 215,153,33; /* #d79921 */
|
||||||
|
--neutral-yellow: rgb(var(--neutral-yellow_x));
|
||||||
|
--neutral-blue_x: 69,133,136; /* #458588 */
|
||||||
|
--neutral-blue: rgb(var(--neutral-blue_x));
|
||||||
|
--neutral-purple_x: 177,98,134; /* #b16286 */
|
||||||
|
--neutral-purple: rgb(var(--neutral-purple_x));
|
||||||
|
--neutral-aqua_x: 104,157,106; /* #689d6a */
|
||||||
|
--neutral-aqua: rgb(var(--neutral-aqua_x));
|
||||||
|
--neutral-orange_x: 214,93,14; /* #d65d0e */
|
||||||
|
--neutral-orange: rgb(var(--neutral-orange_x));
|
||||||
|
|
||||||
|
--faded-red_x: 157,0,6; /* #9d0006 */
|
||||||
|
--faded-red: rgb(var(--faded-red_x));
|
||||||
|
--faded-green_x: 121,116,14; /* #79740e */
|
||||||
|
--faded-green: rgb(var(--faded-green_x));
|
||||||
|
--faded-yellow_x: 181,118,20; /* #b57614 */
|
||||||
|
--faded-yellow: rgb(var(--faded-yellow_x));
|
||||||
|
--faded-blue_x: 7,102,120; /* #076678 */
|
||||||
|
--faded-blue: rgb(var(--faded-blue_x));
|
||||||
|
--faded-purple_x: 143,63,113; /* #8f3f71 */
|
||||||
|
--faded-purple: rgb(var(--faded-purple_x));
|
||||||
|
--faded-aqua_x: 66,123,88; /* #427b58 */
|
||||||
|
--faded-aqua: rgb(var(--faded-aqua_x));
|
||||||
|
--faded-orange_x: 175,58,3; /* #af3a03 */
|
||||||
|
--faded-orange: rgb(var(--faded-orange_x));
|
||||||
|
}
|
||||||
|
|
||||||
|
body
|
||||||
|
{
|
||||||
|
--accent-h: 12; /* --faded-red #9d0006 */
|
||||||
|
--accent-s: 107%;
|
||||||
|
--accent-l: 32%;
|
||||||
|
|
||||||
|
--link-decoration: none;
|
||||||
|
--link-decoration-hover: none;
|
||||||
|
--link-external-decoration: none;
|
||||||
|
--link-external-decoration-hover: none;
|
||||||
|
|
||||||
|
--tag-decoration: none;
|
||||||
|
--tag-decoration-hover: underline;
|
||||||
|
--tag-padding-x: .5em;
|
||||||
|
--tag-padding-y: .2em;
|
||||||
|
--tag-radius: .5em;
|
||||||
|
|
||||||
|
--tab-font-weight: 600;
|
||||||
|
--bold-weight: 600;
|
||||||
|
|
||||||
|
--checkbox-radius: 0;
|
||||||
|
|
||||||
|
/* --list-indent: 2em; */
|
||||||
|
|
||||||
|
--embed-border-left: 6px double var(--interactive-accent);
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-dark
|
||||||
|
{
|
||||||
|
--color-red-rgb: var(--neutral-red_x);
|
||||||
|
--color-red: var(--neutral-red);
|
||||||
|
--color-purple-rgb: var(--neutral-purple_x);
|
||||||
|
--color-purple: var(--neutral-purple);
|
||||||
|
--color-green-rgb: var(--neutral-green_x);
|
||||||
|
--color-green: var(--neutral-green);
|
||||||
|
--color-cyan-rgb: var(--neutral-blue_x);
|
||||||
|
--color-cyan: var(--neutral-blue);
|
||||||
|
--color-blue-rgb: var(--faded-blue_x);
|
||||||
|
--color-blue: var(--faded-blue);
|
||||||
|
--color-yellow-rgb: var(--neutral-yellow_x);
|
||||||
|
--color-yellow: var(--neutral-yellow);
|
||||||
|
--color-orange-rgb: var(--neutral-orange_x);
|
||||||
|
--color-orange: var(--neutral-orange);
|
||||||
|
--color-pink-rgb: var(--bright-purple_x);
|
||||||
|
--color-pink: var(--bright-purple);
|
||||||
|
|
||||||
|
--background-primary: var(--dark0);
|
||||||
|
--background-primary-alt: var(--dark0);
|
||||||
|
--background-secondary: var(--dark0-hard);
|
||||||
|
--background-secondary-alt: var(--dark1);
|
||||||
|
--background-modifier-border: var(--dark1);
|
||||||
|
|
||||||
|
--cursor-line-background: rgba(var(--dark1_x), 0.5);
|
||||||
|
|
||||||
|
--text-normal: var(--light0);
|
||||||
|
--text-faint: var(--light1);
|
||||||
|
--text-muted: var(--light2);
|
||||||
|
|
||||||
|
--link-url: var(--neutral-green);
|
||||||
|
|
||||||
|
--h1-color: var(--neutral-red);
|
||||||
|
--h2-color: var(--neutral-yellow);
|
||||||
|
--h3-color: var(--neutral-green);
|
||||||
|
--h4-color: var(--neutral-aqua);
|
||||||
|
--h5-color: var(--neutral-blue);
|
||||||
|
--h6-color: var(--neutral-purple);
|
||||||
|
|
||||||
|
--text-highlight-bg: var(--neutral-yellow);
|
||||||
|
--text-highlight-fg: var(--dark0-hard);
|
||||||
|
|
||||||
|
--text-accent: var(--neutral-orange);
|
||||||
|
--text-accent-hover: var(--bright-aqua);
|
||||||
|
|
||||||
|
--tag-color: var(--bright-aqua);
|
||||||
|
--tag-background: var(--dark2);
|
||||||
|
--tag-background-hover: var(--dark1);
|
||||||
|
|
||||||
|
--titlebar-text-color-focused: var(--bright-red);
|
||||||
|
|
||||||
|
--inline-title-color: var(--bright-yellow);
|
||||||
|
|
||||||
|
--bold-color: var(--neutral-yellow);
|
||||||
|
--italic-color: var(--neutral-yellow);
|
||||||
|
|
||||||
|
--checkbox-color: var(--light4);
|
||||||
|
--checkbox-color-hover: var(--light4);
|
||||||
|
--checkbox-border-color: var(--light4);
|
||||||
|
--checkbox-border-color-hover: var(--light4);
|
||||||
|
--checklist-done-color: rgba(var(--light2_x), 0.5);
|
||||||
|
|
||||||
|
--table-header-background: rgba(var(--dark0_x), 0.2);
|
||||||
|
--table-header-background-hover: var(--dark2);
|
||||||
|
--table-row-even-background: rgba(var(--dark2_x), 0.2);
|
||||||
|
--table-row-odd-background: rgba(var(--dark2_x), 0.4);
|
||||||
|
--table-row-background-hover: var(--dark2);
|
||||||
|
|
||||||
|
--text-selection: rgba(var(--neutral-red_x), 0.6);
|
||||||
|
--flashing-background: rgba(var(--neutral-red_x), 0.3);
|
||||||
|
|
||||||
|
--code-normal: var(--bright-blue);
|
||||||
|
--code-background: var(--dark1);
|
||||||
|
|
||||||
|
--mermaid-note: var(--neutral-blue);
|
||||||
|
--mermaid-actor: var(--dark2);
|
||||||
|
--mermaid-loopline: var(--neutral-blue);
|
||||||
|
--mermaid-exclude: var(--dark4);
|
||||||
|
--mermaid-seqnum: var(--dark0);
|
||||||
|
|
||||||
|
--icon-color-hover: var(--bright-red);
|
||||||
|
--icon-color-focused: var(--bright-blue);
|
||||||
|
|
||||||
|
--nav-item-color-hover: var(--bright-red);
|
||||||
|
--nav-item-color-active: var(--bright-aqua);
|
||||||
|
--nav-file-tag: rgba(var(--neutral-yellow_x), 0.9);
|
||||||
|
|
||||||
|
--graph-line: var(--dark2);
|
||||||
|
--graph-node: var(--light3);
|
||||||
|
--graph-node-tag: var(--neutral-red);
|
||||||
|
--graph-node-attachment: var(--neutral-green);
|
||||||
|
|
||||||
|
--calendar-hover: var(--bright-red);
|
||||||
|
--calendar-background-hover: var(--dark1);
|
||||||
|
--calendar-week: var(--neutral-orange);
|
||||||
|
--calendar-today: var(--neutral-orange);
|
||||||
|
|
||||||
|
--dataview-key: var(--text-faint);
|
||||||
|
--dataview-key-background: rgba(var(--faded-red_x), 0.5);
|
||||||
|
--dataview-value: var(--text-faint);
|
||||||
|
--dataview-value-background: rgba(var(--neutral-green_x), 0.3);
|
||||||
|
|
||||||
|
--tab-text-color-focused-active: var(--neutral-yellow);
|
||||||
|
--tab-text-color-focused-active-current: var(--bright-red);
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-light
|
||||||
|
{
|
||||||
|
--color-red-rgb: var(--neutral-red_x);
|
||||||
|
--color-red: var(--neutral-red);
|
||||||
|
--color-purple-rgb: var(--neutral-purple_x);
|
||||||
|
--color-purple: var(--neutral-purple);
|
||||||
|
--color-green-rgb: var(--neutral-green_x);
|
||||||
|
--color-green: var(--neutral-green);
|
||||||
|
--color-cyan-rgb: var(--neutral-blue_x);
|
||||||
|
--color-cyan: var(--neutral-blue);
|
||||||
|
--color-blue-rgb: var(--faded-blue_x);
|
||||||
|
--color-blue: var(--faded-blue);
|
||||||
|
--color-yellow-rgb: var(--neutral-yellow_x);
|
||||||
|
--color-yellow: var(--neutral-yellow);
|
||||||
|
--color-orange-rgb: var(--neutral-orange_x);
|
||||||
|
--color-orange: var(--neutral-orange);
|
||||||
|
--color-pink-rgb: var(--bright-purple_x);
|
||||||
|
--color-pink: var(--bright-purple);
|
||||||
|
|
||||||
|
--background-primary: var(--light0-hard);
|
||||||
|
--background-primary-alt: var(--light0-hard);
|
||||||
|
--background-secondary: var(--light1);
|
||||||
|
--background-secondary-alt: var(--light1);
|
||||||
|
--background-modifier-border: var(--light2);
|
||||||
|
|
||||||
|
--cursor-line-background: rgba(var(--light1_x), 0.5);
|
||||||
|
|
||||||
|
--text-normal: var(--dark0);
|
||||||
|
--text-faint: var(--dark3);
|
||||||
|
--text-muted: var(--dark2);
|
||||||
|
|
||||||
|
--link-url: var(--neutral-green);
|
||||||
|
|
||||||
|
--h1-color: var(--neutral-red);
|
||||||
|
--h2-color: var(--neutral-yellow);
|
||||||
|
--h3-color: var(--neutral-green);
|
||||||
|
--h4-color: var(--neutral-aqua);
|
||||||
|
--h5-color: var(--neutral-blue);
|
||||||
|
--h6-color: var(--neutral-purple);
|
||||||
|
|
||||||
|
--text-highlight-bg: var(--bright-yellow);
|
||||||
|
--text-highlight-fg: var(--dark0);
|
||||||
|
|
||||||
|
--text-accent: var(--neutral-orange);
|
||||||
|
--text-accent-hover: var(--bright-aqua);
|
||||||
|
|
||||||
|
--tag-color: var(--neutral-aqua);
|
||||||
|
--tag-background: var(--light1);
|
||||||
|
--tag-background-hover: rgba(var(--light1_x), 0.6);
|
||||||
|
|
||||||
|
--titlebar-text-color-focused: var(--bright-red);
|
||||||
|
|
||||||
|
--inline-title-color: var(--bright-yellow);
|
||||||
|
|
||||||
|
--bold-color: var(--neutral-yellow);
|
||||||
|
--italic-color: var(--neutral-yellow);
|
||||||
|
|
||||||
|
--checkbox-color: var(--light4);
|
||||||
|
--checkbox-color-hover: var(--light4);
|
||||||
|
--checkbox-border-color: var(--light4);
|
||||||
|
--checkbox-border-color-hover: var(--light4);
|
||||||
|
--checklist-done-color: rgba(var(--dark2_x), 0.4);
|
||||||
|
|
||||||
|
--table-header-background: rgba(var(--light3_x), 0.4);
|
||||||
|
--table-header-background-hover: var(--light2);
|
||||||
|
--table-row-even-background: rgba(var(--light1_x), 0.2);
|
||||||
|
--table-row-odd-background: rgba(var(--light1_x), 0.7);
|
||||||
|
--table-row-background-hover: var(--light2);
|
||||||
|
|
||||||
|
--text-selection: rgba(var(--neutral-red_x), 0.6);
|
||||||
|
--flashing-background: rgba(var(--neutral-red_x), 0.3);
|
||||||
|
|
||||||
|
--code-normal: var(--bright-blue);
|
||||||
|
--code-background: var(--light1);
|
||||||
|
|
||||||
|
--mermaid-note: var(--bright-blue);
|
||||||
|
--mermaid-actor: var(--light3);
|
||||||
|
--mermaid-loopline: var(--neutral-blue);
|
||||||
|
--mermaid-exclude: var(--light2);
|
||||||
|
--mermaid-seqnum: var(--light0);
|
||||||
|
|
||||||
|
--icon-color-hover: var(--bright-red);
|
||||||
|
--icon-color-focused: var(--bright-blue);
|
||||||
|
|
||||||
|
--nav-item-color-hover: var(--bright-red);
|
||||||
|
--nav-item-color-active: var(--neutral-blue);
|
||||||
|
--nav-file-tag: rgba(var(--neutral-blue_x), 0.9);
|
||||||
|
|
||||||
|
--graph-line: var(--light1);
|
||||||
|
--graph-node: var(--gray);
|
||||||
|
--graph-node-tag: var(--neutral-red);
|
||||||
|
--graph-node-attachment: var(--bright-green);
|
||||||
|
|
||||||
|
--calendar-hover: var(--bright-red);
|
||||||
|
--calendar-background-hover: var(--light1);
|
||||||
|
--calendar-week: var(--bright-red);
|
||||||
|
--calendar-today: var(--bright-red);
|
||||||
|
|
||||||
|
--dataview-key: var(--text-faint);
|
||||||
|
--dataview-key-background: rgba(var(--faded-red_x), 0.3);
|
||||||
|
--dataview-value: var(--text-faint);
|
||||||
|
--dataview-value-background: rgba(var(--neutral-green_x), 0.2);
|
||||||
|
|
||||||
|
--tab-text-color-focused-active: var(--neutral-yellow);
|
||||||
|
--tab-text-color-focused-active-current: var(--bright-red);
|
||||||
|
}
|
||||||
|
|
||||||
|
table
|
||||||
|
{
|
||||||
|
border: 1px solid var(--background-secondary) !important;
|
||||||
|
border-collapse: collapse;
|
||||||
|
}
|
||||||
|
|
||||||
|
thead
|
||||||
|
{
|
||||||
|
border-bottom: 2px solid var(--background-modifier-border) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
th
|
||||||
|
{
|
||||||
|
font-weight: 600 !important;
|
||||||
|
border: 1px solid var(--background-secondary) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
td
|
||||||
|
{
|
||||||
|
border-left: 1px solid var(--background-secondary) !important;
|
||||||
|
border-right: 1px solid var(--background-secondary) !important;
|
||||||
|
border-bottom: 1px solid var(--background-secondary) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-rendered tbody tr:nth-child(even)
|
||||||
|
{
|
||||||
|
background-color: var(--table-row-even-background) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-rendered tbody tr:nth-child(odd)
|
||||||
|
{
|
||||||
|
background-color: var(--table-row-odd-background) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-rendered tbody tr:nth-child(even):hover,
|
||||||
|
.markdown-rendered tbody tr:nth-child(odd):hover
|
||||||
|
{
|
||||||
|
background-color: var(--table-row-background-hover) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-rendered mark
|
||||||
|
{
|
||||||
|
background-color: var(--text-highlight-bg);
|
||||||
|
color: var(--text-highlight-fg);
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-rendered mark a
|
||||||
|
{
|
||||||
|
color: var(--red) !important;
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
|
||||||
|
.search-result-file-matched-text
|
||||||
|
{
|
||||||
|
color: var(--text-highlight-fg) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cm-hashtag-begin:hover, .cm-hashtag-end:hover
|
||||||
|
{
|
||||||
|
color: var(--text-accent);
|
||||||
|
/* background-color: var(--tag-background-hover); */
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
|
||||||
|
input[type=checkbox]
|
||||||
|
{
|
||||||
|
border: 1px solid var(--checkbox-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
input[type=checkbox]:checked
|
||||||
|
{
|
||||||
|
background-color: var(--checkbox-color);
|
||||||
|
box-shadow: inset 0 0 0 2px var(--background-primary);
|
||||||
|
}
|
||||||
|
|
||||||
|
input[type=checkbox]:checked:after
|
||||||
|
{
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
code[class*="language-"],
|
||||||
|
pre[class*="language-"]
|
||||||
|
{
|
||||||
|
line-height: var(--line-height-tight) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cm-url
|
||||||
|
{
|
||||||
|
color: var(--link-url) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cm-url:hover
|
||||||
|
{
|
||||||
|
color: var(--text-accent-color) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Keep highlight/marks the same between viewer and editor. */
|
||||||
|
.cm-highlight
|
||||||
|
{
|
||||||
|
color: var(--text-highlight-fg) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Keep inline code the same between viewer and editor. */
|
||||||
|
.cm-inline-code
|
||||||
|
{
|
||||||
|
border-radius: var(--radius-s);
|
||||||
|
font-size: var(--code-size);
|
||||||
|
padding: 0.1em 0.25em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cm-line .cm-strong
|
||||||
|
{
|
||||||
|
color: var(--bold-color) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Keep list bullet padding the same between viewer and editor.
|
||||||
|
* This is annoying with the cursor in the editor as there is a gap.
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
.cm-formatting-list
|
||||||
|
{
|
||||||
|
padding-right: 4px !important;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Keep sub-list indenting the same between viewer and editor.
|
||||||
|
* This assumes --list-indent is default at 2em.
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
.cm-indent
|
||||||
|
{
|
||||||
|
text-indent: 1em !important;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
.mermaid .note
|
||||||
|
{
|
||||||
|
fill: var(--mermaid-note) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mermaid .actor
|
||||||
|
{
|
||||||
|
fill: var(--mermaid-actor) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mermaid .loopLine
|
||||||
|
{
|
||||||
|
stroke: var(--mermaid-loopline) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mermaid .loopText>tspan,
|
||||||
|
.mermaid .entityLabel
|
||||||
|
{
|
||||||
|
fill: var(--neutral-red) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mermaid .exclude-range
|
||||||
|
{
|
||||||
|
fill: var(--mermaid-exclude) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mermaid .sequenceNumber
|
||||||
|
{
|
||||||
|
fill: var(--mermaid-seqnum) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.calendar .week-num
|
||||||
|
{
|
||||||
|
color: var(--calendar-week) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.calendar .today
|
||||||
|
{
|
||||||
|
color: var(--calendar-today) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.calendar .week-num:hover,
|
||||||
|
.calendar .day:hover
|
||||||
|
{
|
||||||
|
color: var(--calendar-hover) !important;
|
||||||
|
background-color: var(--calendar-background-hover) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-embed-title
|
||||||
|
{
|
||||||
|
color: var(--yellow);
|
||||||
|
font-weight: 600 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cm-active
|
||||||
|
{
|
||||||
|
background-color: var(--cursor-line-background) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-file-tag
|
||||||
|
{
|
||||||
|
color: var(--nav-file-tag) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.is-flashing
|
||||||
|
{
|
||||||
|
background-color: var(--flashing-background) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dataview.inline-field-key
|
||||||
|
{
|
||||||
|
border-top-left-radius: var(--radius-s);
|
||||||
|
border-bottom-left-radius: var(--radius-s);
|
||||||
|
padding-left: 4px;
|
||||||
|
font-family: var(--font-monospace);
|
||||||
|
font-size: var(--font-smaller);
|
||||||
|
color: var(--dataview-key) !important;
|
||||||
|
background-color: var(--dataview-key-background) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dataview.inline-field-value
|
||||||
|
{
|
||||||
|
border-top-right-radius: var(--radius-s);
|
||||||
|
border-bottom-right-radius: var(--radius-s);
|
||||||
|
padding-right: 4px;
|
||||||
|
font-family: var(--font-monospace);
|
||||||
|
font-size: var(--font-smaller);
|
||||||
|
color: var(--dataview-value) !important;
|
||||||
|
background-color: var(--dataview-value-background) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.suggestion-highlight
|
||||||
|
{
|
||||||
|
color: var(--bright-red);
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
--callout-border-width: 1px;
|
||||||
|
--callout-border-opacity: 0.4;
|
||||||
|
/* Order as defined in app.css */
|
||||||
|
--callout-default: var(--neutral-blue_x);
|
||||||
|
--callout-note: var(--neutral-blue_x);
|
||||||
|
--callout-summary: var(--neutral-aqua_x);
|
||||||
|
--callout-info: var(--neutral-blue_x);
|
||||||
|
--callout-todo: var(--neutral-blue_x);
|
||||||
|
--callout-important: var(--neutral-aqua_x);
|
||||||
|
--callout-tip: var(--neutral-aqua_x);
|
||||||
|
--callout-success: var(--neutral-green_x);
|
||||||
|
--callout-question: var(--neutral-yellow_x);
|
||||||
|
--callout-warning: var(--neutral-orange_x);
|
||||||
|
--callout-fail: var(--neutral-red_x);
|
||||||
|
--callout-error: var(--neutral-red_x);
|
||||||
|
--callout-bug: var(--neutral-red_x);
|
||||||
|
--callout-example: var(--neutral-purple_x);
|
||||||
|
--callout-quote: var(--gray_x);
|
||||||
|
}
|
||||||
|
|
||||||
|
.callout {
|
||||||
|
background-color: rgba(var(--callout-color), 0.2);
|
||||||
|
}
|
||||||
7
.obsidian/themes/Wasp/manifest.json
vendored
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"name": "Wasp",
|
||||||
|
"version": "1.0.7",
|
||||||
|
"minAppVersion": "1.0.0",
|
||||||
|
"author": "Santi Younger",
|
||||||
|
"authorUrl": "https://santiyounger.com/"
|
||||||
|
}
|
||||||
414
.obsidian/themes/Wasp/theme.css
vendored
Normal file
@@ -0,0 +1,414 @@
|
|||||||
|
/* Wasp — Obsidian theme by Santi Younger */
|
||||||
|
|
||||||
|
/* Shared (both color schemes) — per Obsidian "Build a theme" guidance */
|
||||||
|
body {
|
||||||
|
--font-monospace: "Source Code Pro", monospace;
|
||||||
|
/* Heading scale (reading + live preview) — matches Obsidian defaults */
|
||||||
|
--h1-size: 1.802em;
|
||||||
|
--h2-size: 1.556em;
|
||||||
|
--h3-size: 1.344em;
|
||||||
|
--h4-size: 1.167em;
|
||||||
|
--h5-size: 1.067em;
|
||||||
|
--h6-size: 1em;
|
||||||
|
--h1-weight: 700;
|
||||||
|
--h2-weight: 600;
|
||||||
|
--h3-weight: 600;
|
||||||
|
--h4-weight: 600;
|
||||||
|
--h5-weight: 600;
|
||||||
|
--h6-weight: 600;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Dark palette ─────────────────────────────────────────────────────────── */
|
||||||
|
.theme-dark {
|
||||||
|
/* Base scale — required for community palette contrast checks (WCAG 4.5:1 on base-10) */
|
||||||
|
--color-base-00: #191919;
|
||||||
|
--color-base-05: #1f1f1f;
|
||||||
|
--color-base-10: #242424;
|
||||||
|
--color-base-20: #2a2a2a;
|
||||||
|
--color-base-25: #323232;
|
||||||
|
--color-base-30: #3d3d3d;
|
||||||
|
--color-base-35: #4a4a44;
|
||||||
|
--color-base-40: #5c5c54;
|
||||||
|
--color-base-50: #9a9284;
|
||||||
|
--color-base-60: #bdae93;
|
||||||
|
--color-base-70: #d4c9a8;
|
||||||
|
--color-base-100: #faf2d6;
|
||||||
|
|
||||||
|
--background-primary: var(--color-base-10);
|
||||||
|
--background-primary-alt: var(--color-base-10);
|
||||||
|
--background-secondary: var(--color-base-00);
|
||||||
|
--background-secondary-alt: var(--color-base-30);
|
||||||
|
--background-modifier-border: #f8c537;
|
||||||
|
--background-modifier-hover: rgba(255, 255, 255, 0.06);
|
||||||
|
|
||||||
|
--text-normal: #faf2d6;
|
||||||
|
--text-faint: #bdae93;
|
||||||
|
--text-muted: #bdae93;
|
||||||
|
--h1-color: #f8c537;
|
||||||
|
--h2-color: #E8D49A;
|
||||||
|
--h3-color: #D49335;
|
||||||
|
--h4-color: #E0E0E0;
|
||||||
|
--h5-color: #C9BEA8;
|
||||||
|
--h6-color: #bdae93;
|
||||||
|
--text-title-h1: var(--h1-color);
|
||||||
|
--text-title-h2: var(--h2-color);
|
||||||
|
--text-title-h3: var(--h3-color);
|
||||||
|
--text-title-h4: var(--h4-color);
|
||||||
|
--text-title-h5: var(--h5-color);
|
||||||
|
--text-title-h6: var(--h6-color);
|
||||||
|
--text-highlight-bg: #640211;
|
||||||
|
--text-link: #83a598;
|
||||||
|
--text-a: #f8c537;
|
||||||
|
--text-a-hover: #83a598;
|
||||||
|
--text-accent: #f8c537;
|
||||||
|
--text-accent-hover: #D49335;
|
||||||
|
--text-on-accent: #1A2023;
|
||||||
|
--text-selection: #f8c537;
|
||||||
|
|
||||||
|
--inline-code: #83a598;
|
||||||
|
--code-block: #83a598;
|
||||||
|
--pre-code: #3D3D3D;
|
||||||
|
--interactive-accent: #f8c537;
|
||||||
|
--interactive-accent-rgb: 248, 197, 55;
|
||||||
|
--interactive-before: #9a9284;
|
||||||
|
--vim-cursor: #f8c537;
|
||||||
|
|
||||||
|
/* Graph view */
|
||||||
|
--graph-node: rgb(var(--interactive-accent-rgb));
|
||||||
|
--graph-line: rgb(var(--interactive-accent-rgb));
|
||||||
|
--graph-node-focused: rgb(var(--interactive-accent-rgb));
|
||||||
|
--graph-text: var(--text-normal);
|
||||||
|
|
||||||
|
--callout-title-color: var(--text-normal);
|
||||||
|
|
||||||
|
/* File tree — hover subtle; active = darker amber + white text (not bright gold) */
|
||||||
|
--wasp-nav-active-background: #7A5C14;
|
||||||
|
--nav-item-background-hover: var(--background-modifier-hover);
|
||||||
|
--nav-item-background-active: var(--wasp-nav-active-background);
|
||||||
|
--nav-item-color-hover: var(--text-normal);
|
||||||
|
--nav-item-color-active: #ffffff;
|
||||||
|
--nav-collapse-icon-color: var(--text-faint);
|
||||||
|
--nav-collapse-icon-color-collapsed: var(--text-faint);
|
||||||
|
|
||||||
|
/* Wasp-specific UI (settings buttons, etc.) */
|
||||||
|
--button-bg-color: #D49335;
|
||||||
|
--button-text-color: #242424;
|
||||||
|
--button-hover-bg-color: #DAA520;
|
||||||
|
--button-hover-text-color: #1A2023;
|
||||||
|
|
||||||
|
--text-sub-accent: var(--text-accent);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Light palette ────────────────────────────────────────────────────────── */
|
||||||
|
.theme-light {
|
||||||
|
/* Base scale — required for community palette contrast checks (WCAG 4.5:1 on base-10) */
|
||||||
|
--color-base-00: #faf6f0;
|
||||||
|
--color-base-05: #fffcf7;
|
||||||
|
--color-base-10: #faf6f0;
|
||||||
|
--color-base-20: #e8dfd0;
|
||||||
|
--color-base-25: #ddd4c4;
|
||||||
|
--color-base-30: #c9b8a8;
|
||||||
|
--color-base-35: #b0a090;
|
||||||
|
--color-base-40: #968878;
|
||||||
|
--color-base-50: #7a6f5f;
|
||||||
|
--color-base-60: #6b5e4f;
|
||||||
|
--color-base-70: #5c5044;
|
||||||
|
--color-base-100: #2c2419;
|
||||||
|
|
||||||
|
--background-primary: var(--color-base-10);
|
||||||
|
--background-primary-alt: var(--color-base-05);
|
||||||
|
--background-secondary: var(--color-base-20);
|
||||||
|
--background-secondary-alt: var(--color-base-30);
|
||||||
|
--background-modifier-border: #C87628;
|
||||||
|
--background-modifier-hover: rgba(120, 72, 24, 0.08);
|
||||||
|
|
||||||
|
--text-normal: #2C2419;
|
||||||
|
--text-faint: #6B5E4F;
|
||||||
|
--text-muted: #5C5044;
|
||||||
|
--h1-color: #9A4E12;
|
||||||
|
--h2-color: #924e14;
|
||||||
|
--h3-color: #8f5514;
|
||||||
|
--h4-color: #8F4F14;
|
||||||
|
--h5-color: #7A4310;
|
||||||
|
--h6-color: #6B3A0E;
|
||||||
|
--text-title-h1: var(--h1-color);
|
||||||
|
--text-title-h2: var(--h2-color);
|
||||||
|
--text-title-h3: var(--h3-color);
|
||||||
|
--text-title-h4: var(--h4-color);
|
||||||
|
--text-title-h5: var(--h5-color);
|
||||||
|
--text-title-h6: var(--h6-color);
|
||||||
|
--text-link: #9b4218;
|
||||||
|
--text-a: #9B3A1A;
|
||||||
|
--text-a-hover: #9b4218;
|
||||||
|
--text-accent: #9B3A1A;
|
||||||
|
--text-accent-hover: #9b4218;
|
||||||
|
--text-on-accent: #1F1A14;
|
||||||
|
--text-selection: #E4C07A;
|
||||||
|
--text-highlight-bg: #F0E0B8;
|
||||||
|
--text-white: #FFFCF7;
|
||||||
|
|
||||||
|
--inline-code: #3D6B5C;
|
||||||
|
--pre-code: #EDE6DA;
|
||||||
|
--interactive-accent: #D4922A;
|
||||||
|
--interactive-accent-rgb: 212, 146, 42;
|
||||||
|
--interactive-before: #6b5e4f;
|
||||||
|
--vim-cursor: #9B3A1A;
|
||||||
|
|
||||||
|
--graph-node: rgb(var(--interactive-accent-rgb));
|
||||||
|
--graph-line: rgb(var(--interactive-accent-rgb));
|
||||||
|
--graph-node-focused: rgb(var(--interactive-accent-rgb));
|
||||||
|
--graph-text: var(--text-normal);
|
||||||
|
|
||||||
|
--callout-title-color: var(--text-normal);
|
||||||
|
|
||||||
|
--nav-item-background-hover: var(--background-modifier-hover);
|
||||||
|
--nav-item-background-active: var(--background-modifier-border);
|
||||||
|
--nav-item-color-hover: var(--text-normal);
|
||||||
|
--nav-item-color-active: var(--text-on-accent);
|
||||||
|
|
||||||
|
/* Workspace tabs — clear bar vs active pane */
|
||||||
|
--tab-container-background: #E8DFD0;
|
||||||
|
--tab-background-active: var(--background-primary);
|
||||||
|
--tab-text-color: #5C5044;
|
||||||
|
--tab-text-color-active: #1F1A14;
|
||||||
|
--tab-text-color-focused: #5C5044;
|
||||||
|
--tab-text-color-focused-active: #1F1A14;
|
||||||
|
--tab-text-color-focused-highlighted: #1F1A14;
|
||||||
|
--tab-text-color-focused-active-current: #1F1A14;
|
||||||
|
--tab-divider-color: #C9B8A8;
|
||||||
|
--tab-outline-color: #C87628;
|
||||||
|
--tab-font-weight: 500;
|
||||||
|
--tab-font-weight-active: 600;
|
||||||
|
|
||||||
|
--list-marker-color: var(--text-muted);
|
||||||
|
--indentation-guide-color: #6b5e4f;
|
||||||
|
|
||||||
|
--button-bg-color: #C87628;
|
||||||
|
--button-text-color: #1F1A14;
|
||||||
|
--button-hover-bg-color: #A85C18;
|
||||||
|
--button-hover-text-color: #FFFCF7;
|
||||||
|
|
||||||
|
--text-sub-accent: var(--text-accent);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Dark: active file row — ensure white label/icons on darker amber bar */
|
||||||
|
.theme-dark .tree-item-self.nav-file-title.is-active,
|
||||||
|
.theme-dark .tree-item-self.nav-folder-title.is-active {
|
||||||
|
--icon-color: var(--nav-item-color-active);
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-dark .tree-item-self.nav-file-title.is-active .tree-item-inner,
|
||||||
|
.theme-dark .tree-item-self.nav-folder-title.is-active .tree-item-inner,
|
||||||
|
.theme-dark .tree-item-self.nav-file-title.is-active .nav-file-title-content,
|
||||||
|
.theme-dark .tree-item-self.nav-folder-title.is-active .nav-folder-title-content,
|
||||||
|
.theme-dark .tree-item-self.nav-file-title.is-active .svg-icon,
|
||||||
|
.theme-dark .tree-item-self.nav-folder-title.is-active .svg-icon,
|
||||||
|
.theme-dark .tree-item-self.nav-file-title.is-active svg,
|
||||||
|
.theme-dark .tree-item-self.nav-folder-title.is-active svg {
|
||||||
|
color: var(--nav-item-color-active);
|
||||||
|
stroke: var(--nav-item-color-active);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Dark: selection & search (gold highlight needs dark foreground) ───── */
|
||||||
|
.theme-dark .cm-s-obsidian span.obsidian-search-match-highlight {
|
||||||
|
color: var(--text-normal);
|
||||||
|
background-color: #483699;
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-dark ::selection,
|
||||||
|
.theme-dark .markdown-preview-view ::selection,
|
||||||
|
.theme-dark .markdown-rendered ::selection,
|
||||||
|
.theme-dark .markdown-source-view.mod-cm6 .cm-editor .cm-line ::selection,
|
||||||
|
.theme-dark .cm-editor .cm-line ::selection {
|
||||||
|
background-color: var(--text-selection);
|
||||||
|
color: var(--text-on-accent);
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-dark .markdown-source-view.mod-cm6 .cm-editor .cm-selectionBackground,
|
||||||
|
.theme-dark .markdown-source-view.mod-cm6 .cm-editor .cm-selectionMatchBackground,
|
||||||
|
.theme-dark .cm-editor .cm-selectionBackground,
|
||||||
|
.theme-dark .cm-editor .cm-selectionMatchBackground {
|
||||||
|
background-color: var(--text-selection);
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-dark .cm-editor .cm-selection {
|
||||||
|
color: var(--text-on-accent);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Light: selection, tabs, editor syntax ──────────────────────────────── */
|
||||||
|
.theme-light ::selection,
|
||||||
|
.theme-light .markdown-preview-view ::selection,
|
||||||
|
.theme-light .markdown-rendered ::selection,
|
||||||
|
.theme-light .markdown-source-view.mod-cm6 .cm-editor .cm-line ::selection,
|
||||||
|
.theme-light .cm-editor .cm-line ::selection {
|
||||||
|
background-color: var(--text-selection);
|
||||||
|
color: var(--text-on-accent);
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-light .markdown-source-view.mod-cm6 .cm-editor .cm-selectionBackground,
|
||||||
|
.theme-light .markdown-source-view.mod-cm6 .cm-editor .cm-selectionMatchBackground,
|
||||||
|
.theme-light .cm-editor .cm-selectionBackground,
|
||||||
|
.theme-light .cm-editor .cm-selectionMatchBackground {
|
||||||
|
background-color: var(--text-selection);
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-light .cm-editor .cm-selection {
|
||||||
|
color: var(--text-on-accent);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Light: workspace tab chrome (icons + titles follow tab variables) */
|
||||||
|
.theme-light .workspace-tab-header:not(.is-active) .workspace-tab-header-inner-title,
|
||||||
|
.theme-light .workspace-tab-header:not(.is-active) .workspace-tab-header-inner-icon {
|
||||||
|
color: var(--tab-text-color);
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-light .workspace-tab-header.is-active .workspace-tab-header-inner-title,
|
||||||
|
.theme-light .workspace-tab-header.is-active .workspace-tab-header-inner-icon,
|
||||||
|
.theme-light .workspace-tab-header.is-active .workspace-tab-header-status-icon {
|
||||||
|
color: var(--tab-text-color-focused-active);
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-light .workspace-tab-header.is-active .svg-icon,
|
||||||
|
.theme-light .workspace-tab-header.is-active svg {
|
||||||
|
color: var(--tab-text-color-focused-active);
|
||||||
|
stroke: var(--tab-text-color-focused-active);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Light: faint editor markers — quotes/callouts only (not bold/italic) */
|
||||||
|
.theme-light .cm-s-obsidian span.cm-formatting-quote,
|
||||||
|
.theme-light .cm-s-obsidian span.cm-hmd-callout,
|
||||||
|
.theme-light .cm-s-obsidian span.cm-quote,
|
||||||
|
.theme-light .cm-s-obsidian .cm-line:not(.cm-active) span.cm-formatting-quote,
|
||||||
|
.theme-light .cm-s-obsidian .cm-line:not(.cm-active) span.cm-hmd-callout,
|
||||||
|
.theme-light .cm-s-obsidian .cm-line:not(.cm-active) span.cm-quote {
|
||||||
|
color: var(--text-muted);
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Headings: sizes/weights on body, colors on .theme-* — Obsidian applies them in reading + edit (#10) */
|
||||||
|
|
||||||
|
/* Graph view highlights (WebGL bridge) */
|
||||||
|
.theme-dark .graph-view.color-circle,
|
||||||
|
.theme-dark .graph-view.color-fill-highlight,
|
||||||
|
.theme-dark .graph-view.color-line-highlight,
|
||||||
|
.theme-light .graph-view.color-circle,
|
||||||
|
.theme-light .graph-view.color-fill-highlight,
|
||||||
|
.theme-light .graph-view.color-line-highlight {
|
||||||
|
color: rgb(var(--interactive-accent-rgb));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Misc editor / UI ───────────────────────────────────────────────────── */
|
||||||
|
.cm-s-obsidian span.cm-formatting-link {
|
||||||
|
color: var(--text-normal);
|
||||||
|
}
|
||||||
|
|
||||||
|
body .markdown-source-view .CodeMirror-guttermarker-subtle {
|
||||||
|
color: var(--text-normal);
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-light .vertical-tab-header-group-title {
|
||||||
|
color: var(--text-white);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*-----------------------------------------*/
|
||||||
|
/* End of main theme, extra functionality can be added below */
|
||||||
|
|
||||||
|
.markdown-source-view {
|
||||||
|
font-family: var(--font-monospace);
|
||||||
|
}
|
||||||
|
|
||||||
|
body .cm-fat-cursor .CodeMirror-cursor {
|
||||||
|
background-color: var(--vim-cursor);
|
||||||
|
opacity: 0.8;
|
||||||
|
width: 9px;
|
||||||
|
visibility: visible;
|
||||||
|
}
|
||||||
|
|
||||||
|
button.mod-cta {
|
||||||
|
background-color: var(--button-bg-color);
|
||||||
|
color: var(--button-text-color);
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
|
||||||
|
button.mod-cta:hover,
|
||||||
|
button.mod-cta:focus {
|
||||||
|
background-color: var(--button-hover-bg-color);
|
||||||
|
color: var(--button-text-color);
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
|
||||||
|
.vertical-tab-nav-item.is-active {
|
||||||
|
background-color: var(--button-bg-color);
|
||||||
|
color: var(--button-text-color);
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
|
||||||
|
.vertical-tab-nav-item.is-active:hover,
|
||||||
|
.vertical-tab-nav-item.is-active:focus {
|
||||||
|
background-color: var(--button-hover-bg-color);
|
||||||
|
color: var(--button-text-color);
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
|
||||||
|
body:not(.is-phone) .vertical-tab-nav-item.is-active {
|
||||||
|
--background-modifier-hover: var(--button-hover-bg-color);
|
||||||
|
--icon-color: var(--button-text-color);
|
||||||
|
background-color: var(--button-bg-color);
|
||||||
|
color: var(--button-text-color);
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
|
||||||
|
body:not(.is-phone) .vertical-tab-nav-item.is-active:hover,
|
||||||
|
body:not(.is-phone) .vertical-tab-nav-item.is-active:focus {
|
||||||
|
background-color: var(--button-hover-bg-color);
|
||||||
|
color: var(--button-text-color);
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
|
||||||
|
.checkbox-container.is-enabled {
|
||||||
|
background-color: var(--button-bg-color);
|
||||||
|
color: var(--button-text-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.checkbox-container.is-enabled:hover,
|
||||||
|
.checkbox-container.is-enabled:focus {
|
||||||
|
background-color: var(--button-hover-bg-color);
|
||||||
|
color: var(--button-text-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.flair.mod-pop {
|
||||||
|
background-color: var(--button-bg-color);
|
||||||
|
color: var(--button-text-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.flair.mod-pop:hover,
|
||||||
|
.flair.mod-pop:focus {
|
||||||
|
background-color: var(--button-hover-bg-color);
|
||||||
|
color: var(--button-text-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** hr styles — PREVIEW MODE */
|
||||||
|
.cm-line hr,
|
||||||
|
.markdown-preview-view hr {
|
||||||
|
margin-block-start: 4em;
|
||||||
|
margin-block-end: 4em;
|
||||||
|
border: none;
|
||||||
|
height: 0;
|
||||||
|
border-bottom: 1px solid;
|
||||||
|
border-image-slice: 1;
|
||||||
|
border-width: 1px;
|
||||||
|
border-image-source: linear-gradient(to right, transparent, var(--text-accent), transparent);
|
||||||
|
}
|
||||||
|
|
||||||
|
.cm-line hr::after,
|
||||||
|
.markdown-preview-view hr::after {
|
||||||
|
display: inline-block;
|
||||||
|
position: absolute;
|
||||||
|
left: 50%;
|
||||||
|
transform: translate(-50%, -50%);
|
||||||
|
transform-origin: 50% 50%;
|
||||||
|
padding: 0.5rem;
|
||||||
|
color: var(--text-sub-accent);
|
||||||
|
background-color: var(--background-primary);
|
||||||
|
}
|
||||||
72
.obsidian/workspace.json
vendored
@@ -13,12 +13,12 @@
|
|||||||
"state": {
|
"state": {
|
||||||
"type": "markdown",
|
"type": "markdown",
|
||||||
"state": {
|
"state": {
|
||||||
"file": "Career/Career MOC.md",
|
"file": "Career/Concepts.md",
|
||||||
"mode": "source",
|
"mode": "source",
|
||||||
"source": false
|
"source": false
|
||||||
},
|
},
|
||||||
"icon": "lucide-file",
|
"icon": "lucide-file",
|
||||||
"title": "Career MOC"
|
"title": "Concepts"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@@ -182,44 +182,52 @@
|
|||||||
},
|
},
|
||||||
"active": "0aa065275eb81420",
|
"active": "0aa065275eb81420",
|
||||||
"lastOpenFiles": [
|
"lastOpenFiles": [
|
||||||
"Career/Microlise MOC.md",
|
"Career/Big (O) - Time and Space Complexity.md",
|
||||||
|
"Career/Microlise/Microlise MOC.md",
|
||||||
|
"Career/Microlise/Microlise Assessment.md",
|
||||||
|
"Career/Microlise/Session Stored XSS PENTEST.md",
|
||||||
"Career/Concepts.md",
|
"Career/Concepts.md",
|
||||||
"Career/Java Portswrigger Test.md",
|
"Index.md",
|
||||||
"Career/Career MOC.md",
|
"Career/Career MOC.md",
|
||||||
|
"Daily Notes.md",
|
||||||
|
"Career/Test Driven Development.md",
|
||||||
|
"Career/Windows Services.md",
|
||||||
|
"Career/Solid Principles.md",
|
||||||
|
"Career/Software Development Methodologies.md",
|
||||||
|
"Career/Restful API.md",
|
||||||
|
"Career/Powershell MOC.md",
|
||||||
|
"Career/MVP + MVT.md",
|
||||||
"Career/Job applications.md",
|
"Career/Job applications.md",
|
||||||
"home/zaine/master-folder/CV's/Cover Letter/Santec/Santec.pdf.md",
|
"Career/Java Portswrigger Test.md",
|
||||||
|
"Career/DLL's.md",
|
||||||
|
"Career/Design Patterns.md",
|
||||||
|
"Career/Data camp AI training.md",
|
||||||
|
"Career/Cross Site Scripting (XSS).md",
|
||||||
|
"Career/CI-CD Summary.md",
|
||||||
|
"Career/CI-CD Example (site visits).md",
|
||||||
|
"Career/Bowling Kata.md",
|
||||||
|
"Career/ASP.NET Core Web API Fundamental Notes.md",
|
||||||
|
"Career/API Architecture.md",
|
||||||
|
"Career/Database - SQL",
|
||||||
|
"Career/20260305130457-database_perms_roles_accounts.org",
|
||||||
|
"Career/Attachments/APIOps.png",
|
||||||
|
"Career/Attachments/Screenshot 2026-01-14 154800.png",
|
||||||
|
"Career/Attachments/proxy-pattern.png",
|
||||||
|
"Career/Attachments/state-pattern.png",
|
||||||
|
"Career/Attachments/composite-pattern.png",
|
||||||
|
"Career/Attachments/iterator-pattern.png",
|
||||||
|
"Career/Attachments/template-method-pattern.png",
|
||||||
|
"Career/Attachments/facade-pattern.png",
|
||||||
|
"Career/Attachments/adapter-pattern-2.png",
|
||||||
|
"Career/Attachments/adapter-pattern.png",
|
||||||
|
"Career/Microlise",
|
||||||
|
"Career/Microlise/ESS ESP",
|
||||||
|
"Career/Attachments",
|
||||||
"home/zaine/master-folder/CV's/Cover Letter/Santec",
|
"home/zaine/master-folder/CV's/Cover Letter/Santec",
|
||||||
"home/zaine/master-folder/CV's/Cover Letter",
|
"home/zaine/master-folder/CV's/Cover Letter",
|
||||||
"home/zaine/master-folder/CV's",
|
"home/zaine/master-folder/CV's",
|
||||||
"home/zaine/master-folder",
|
"home/zaine/master-folder",
|
||||||
"home/zaine",
|
"home/zaine",
|
||||||
"home",
|
|
||||||
"Index.md",
|
|
||||||
"Career/20260527152602-microlise_xss_rom_pentest.md",
|
|
||||||
"Career/20260513142352-aritificial_intelligence.md",
|
|
||||||
"Career/20260513115140-powershell_moc.md",
|
|
||||||
"Career/20260512121806-data_camp_ai_training.md",
|
|
||||||
"Career/20260505121135-seb_search_improvements.md",
|
|
||||||
"Career/20260413154901-dll.md",
|
|
||||||
"Career/20260413120825-windows_services.md",
|
|
||||||
"Career/20260410123131-esp_glossary.md",
|
|
||||||
"Career/20260410122935-esp_open_questions.md",
|
|
||||||
"Career/20260410122754-esp_known_issues.md",
|
|
||||||
"Career/20260410122604-ess_deploy_stages.md",
|
|
||||||
"Career/20260410122425-ess_database.md",
|
|
||||||
"Career/20260410122303-ess_manifest.md",
|
|
||||||
"Career/20260410122116-ess_scripts.md",
|
|
||||||
"Career/20260410121927-esp_pipeline.md",
|
|
||||||
"Career/20260410121719-esp_applications.md",
|
|
||||||
"Career/20260410121527-ess_esp_index.md",
|
|
||||||
"Career/20260410115348-microlise_ess.md",
|
|
||||||
"Career/20260407102129-mvp_mvt.md",
|
|
||||||
"Career",
|
|
||||||
"Attachments/anime-kuroko-no-basket-tetsuya-basketball-play-17f4blaudede9nw2.gif",
|
|
||||||
"Attachments",
|
|
||||||
"anime-kuroko-no-basket-tetsuya-basketball-play-17f4blaudede9nw2.gif",
|
|
||||||
"systemd/quartz-notes.service",
|
|
||||||
"systemd",
|
|
||||||
"Untitled.canvas"
|
"Untitled.canvas"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
- [Postgres](id:939e301b-6463-46a8-b57e-0af606e7e7ef)
|
|
||||||
|
|
||||||
- [Airflow](id:c6cf8f7a-778f-4e83-b607-753ef8dbb3f1)
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
|
|
||||||
@@ -1,58 +0,0 @@
|
|||||||
# Overview
|
|
||||||
|
|
||||||
The ESP Deployment Pipeline project is an effort to automate the deployment of the ESP application suite (built by ESS) into customer environments using Azure DevOps (AzDO) YAML pipelines and PowerShell scripts.
|
|
||||||
|
|
||||||
We are the third team to inherit this work. Team Ludo started it, got the build working in AzDO, and began deployment work before being reassigned. We pick up from there.
|
|
||||||
|
|
||||||
# Quick Reference — Key Concepts
|
|
||||||
|
|
||||||
| Concept | What it is | Notes File |
|
|
||||||
| --------------- | ---------------------------------------------------- | ------------------------------------------------------------------------------- |
|
|
||||||
| ESP | Suite of apps deployed per-customer | [ESP Applications](id:091e9bbc-0c9f-43da-81f9-464882c2a15b) |
|
|
||||||
| AzDO Pipeline | YAML-based CI/CD pipeline in Azure DevOps | [ESP — AzDO Pipeline](id:d66e946f-6785-4e8e-ba00-bb25a52237d1) |
|
|
||||||
| PowerShell Arch | Three-tier script architecture (T1/T2/T3) | [ESP — PowerShell Script Architecture](id:bf63b6c5-f32f-462e-82ad-8d4a15f7ba48) |
|
|
||||||
| Manifest | Config file defining a customer environment | [ESP — The Manifest](id:9bf19a8b-5581-4be8-9892-913c51df0128) |
|
|
||||||
| Dacpac | Packaged SQL Server DB schema deployment | [ESP — Database & Dacpac](id:46add22d-e562-4e3a-a301-d4aea2552952) |
|
|
||||||
| Stages | Validate / Prerequisites / Predeploy / Deploy / Post | [ESP — Deployment Stages](id:cd3cd02f-c9b3-4455-8ce5-b2a5aa458fed) |
|
|
||||||
| Known Issues | Pain points, risks, and gaps | [ESP — Known Issues & Risks](id:53d803aa-7e6f-44ed-8d99-a243a5ed5aab) |
|
|
||||||
| Open Questions | Things still TBC or not yet designed | [ESP — Open Questions & TBC Items](id:82c3d447-d6d3-498e-9f66-aee60c752462) |
|
|
||||||
| Glossary | Terminology reference | [ESP — Glossary](id:2c950d25-6f86-4f83-a7b4-69e2ca2f7023) |
|
|
||||||
|
|
||||||
# Context — Why This Project Exists
|
|
||||||
|
|
||||||
- Few original ESS engineers remain; those left are on paid customer work
|
|
||||||
- Manual deployments are slow, risky, and rely on tribal knowledge
|
|
||||||
- Business goal: *all deployments are consistently repeatable with no manual VM work*
|
|
||||||
- Initial scope: ROMAC DEV environment only
|
|
||||||
- Future scope: all environments including PROD and ESS's own data centre
|
|
||||||
|
|
||||||
# Team History
|
|
||||||
|
|
||||||
| Team | Contribution | Current Status |
|
|
||||||
| --------- | ------------------------------------------------------- | --------------------------- |
|
|
||||||
| ESS | Built ESP; wrote original deployment docs | Mostly departed |
|
|
||||||
| Team Ludo | Full ESP build in AzDO; started deploy pipeline; dacpac | Reassigned to customer work |
|
|
||||||
| Our Team | Inheriting deploy pipeline work | Active |
|
|
||||||
|
|
||||||
# Existing Resources to Review
|
|
||||||
|
|
||||||
- Handover from Team Ludo: `ESP_Pipeline_Handover.docx`
|
|
||||||
- Ludo deployment docs: `DEPLOY.md` (in Repos)
|
|
||||||
- Ludo deploy scripts: `deploy` folder (in Repos)
|
|
||||||
- ESP Main Build pipeline: AzDO → Pipelines → `ESS.esp Main Build`
|
|
||||||
- ESP Deploy Pipeline: AzDO → Pipelines → `ESS.esp Deploy`
|
|
||||||
|
|
||||||
# File Index
|
|
||||||
|
|
||||||
| File | Contents |
|
|
||||||
| ------------------------------------------------------------------------------- | --------------------------------------- |
|
|
||||||
| [ESP Deployment Pipeline — Index](id:a6c345df-8db9-4538-b87e-0e72e2414905) | This file — master index |
|
|
||||||
| [ESP Applications](id:091e9bbc-0c9f-43da-81f9-464882c2a15b) | ESP app suite breakdown |
|
|
||||||
| [ESP — AzDO Pipeline](id:d66e946f-6785-4e8e-ba00-bb25a52237d1) | AzDO pipeline structure and concepts |
|
|
||||||
| [ESP — PowerShell Script Architecture](id:bf63b6c5-f32f-462e-82ad-8d4a15f7ba48) | Three-tier PowerShell architecture |
|
|
||||||
| [ESP — The Manifest](id:9bf19a8b-5581-4be8-9892-913c51df0128) | Manifest design and purpose |
|
|
||||||
| [ESP — Database & Dacpac](id:46add22d-e562-4e3a-a301-d4aea2552952) | Database, dacpac, and SQL concerns |
|
|
||||||
| [ESP — Deployment Stages](id:cd3cd02f-c9b3-4455-8ce5-b2a5aa458fed) | Stages of deployment — detail per stage |
|
|
||||||
| [ESP — Known Issues & Risks](id:53d803aa-7e6f-44ed-8d99-a243a5ed5aab) | Known issues and risks |
|
|
||||||
| [ESP — Known Issues & Risks](id:53d803aa-7e6f-44ed-8d99-a243a5ed5aab) | TBC items and open design questions |
|
|
||||||
| [ESP — Glossary](id:2c950d25-6f86-4f83-a7b4-69e2ca2f7023) | Glossary of all technical terms |
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
**Z notes on API architecture - companion to [APIM notes](id:56fabaf6-e8aa-45d0-a1c1-89f247f0a93f)**
|
**Z notes on API architecture - companion to [[APIM]]
|
||||||
|
|
||||||
# 1\. What is API Architecture?
|
# 1\. What is API Architecture?
|
||||||
|
|
||||||
BIN
Career/Attachments/APIOps.png
Normal file
|
After Width: | Height: | Size: 154 KiB |
BIN
Career/Attachments/Big-O-Notation-3130482830.png
Normal file
|
After Width: | Height: | Size: 232 KiB |
BIN
Career/Attachments/Screenshot 2026-01-14 154800.png
Normal file
|
After Width: | Height: | Size: 171 KiB |
BIN
Career/Attachments/adapter-pattern-2.png
Normal file
|
After Width: | Height: | Size: 56 KiB |
BIN
Career/Attachments/adapter-pattern.png
Normal file
|
After Width: | Height: | Size: 113 KiB |
BIN
Career/Attachments/command-pattern.png
Normal file
|
After Width: | Height: | Size: 134 KiB |
BIN
Career/Attachments/composite-pattern.png
Normal file
|
After Width: | Height: | Size: 90 KiB |
BIN
Career/Attachments/decorator-pattern.png
Normal file
|
After Width: | Height: | Size: 43 KiB |
BIN
Career/Attachments/decorator-problem.png
Normal file
|
After Width: | Height: | Size: 41 KiB |
BIN
Career/Attachments/facade-pattern.png
Normal file
|
After Width: | Height: | Size: 110 KiB |
BIN
Career/Attachments/factory-pattern.png
Normal file
|
After Width: | Height: | Size: 108 KiB |
BIN
Career/Attachments/iterator-pattern.png
Normal file
|
After Width: | Height: | Size: 126 KiB |
BIN
Career/Attachments/observer-pattern.png
Normal file
|
After Width: | Height: | Size: 118 KiB |
BIN
Career/Attachments/proxy-pattern.png
Normal file
|
After Width: | Height: | Size: 66 KiB |
BIN
Career/Attachments/singleton-pattern.png
Normal file
|
After Width: | Height: | Size: 49 KiB |
BIN
Career/Attachments/state-pattern.png
Normal file
|
After Width: | Height: | Size: 143 KiB |
BIN
Career/Attachments/structure-pattern.png
Normal file
|
After Width: | Height: | Size: 9.8 KiB |
BIN
Career/Attachments/template-method-pattern.png
Normal file
|
After Width: | Height: | Size: 50 KiB |
@@ -45,7 +45,7 @@ return False
|
|||||||
|
|
||||||
This would take N time, we need to check every number in the list once, making this solution O(N) - linear time. This looks at the worst case scenarion, if 2 was at the start of the list we know it would take a constant time, however if it's at the end then it would take N time.
|
This would take N time, we need to check every number in the list once, making this solution O(N) - linear time. This looks at the worst case scenarion, if 2 was at the start of the list we know it would take a constant time, however if it's at the end then it would take N time.
|
||||||
|
|
||||||

|
![[Big-O-Notation-3130482830.png]]
|
||||||
|
|
||||||
In the graph above focus on the tail end of the graphs because Big O is concerned with "as the input size grows what happens to the speed of the operations".
|
In the graph above focus on the tail end of the graphs because Big O is concerned with "as the input size grows what happens to the speed of the operations".
|
||||||
|
|
||||||
@@ -73,7 +73,7 @@ Here's how it works:
|
|||||||
• And perhaps another loop doing the same,
|
• And perhaps another loop doing the same,
|
||||||
each operation has a complexity of O(n). If you sum these, the resulting complexity for these sequential operations is O(n) + O(n) + O(n), and so on.
|
each operation has a complexity of O(n). If you sum these, the resulting complexity for these sequential operations is O(n) + O(n) + O(n), and so on.
|
||||||
|
|
||||||
1. Simplification: According to Big O notation rules, when you add complexities of the same order, the overall complexity is dominated by the term that grows fastest as n increases. For linear operations, O(n) + O(n) + O(n) simplifies to O(n) because the growth rate in terms of the largest input size n doesn't change-it remains linear.
|
2. Simplification: According to Big O notation rules, when you add complexities of the same order, the overall complexity is dominated by the term that grows fastest as n increases. For linear operations, O(n) + O(n) + O(n) simplifies to O(n) because the growth rate in terms of the largest input size n doesn't change-it remains linear.
|
||||||
|
|
||||||
Linear time complexity, denoted as O(n), means that the time required to complete the execution of an algorithm increases linearly with the increase in the size of the input data. In essence, if you double the size of the input, you double the time it takes to process it.
|
Linear time complexity, denoted as O(n), means that the time required to complete the execution of an algorithm increases linearly with the increase in the size of the input data. In essence, if you double the size of the input, you double the time it takes to process it.
|
||||||
|
|
||||||
7
Career/Bowling Kata.md
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
- <https://www.codurance.com/katas/bowling>
|
||||||
|
|
||||||
|
- <http://www.butunclebob.com/ArticleS.UncleBob.TheBowlingGameKata>
|
||||||
|
|
||||||
|
- <https://codingdojo.org/kata/Bowling/>
|
||||||
|
|
||||||
|
- <https://www.bowlinggenius.com/>
|
||||||
@@ -1,69 +1,71 @@
|
|||||||
In this node lies notes relating to theoretical concepts tying with maths and/or computer science. I will need to find a way to categorise different notes, but it's a wip.
|
In this node lies notes relating to theoretical concepts tying with maths and/or computer science. I will need to find a way to categorise different notes, but it's a wip.
|
||||||
|
|
||||||
|
## MOC's
|
||||||
|
|
||||||
|
- [[Database MOC]]
|
||||||
|
- [[Microlise MOC]]
|
||||||
# Microlise:
|
# Microlise:
|
||||||
|
|
||||||
## ESS
|
## ESS
|
||||||
|
|
||||||
- [ESS](id:abe43fdc-e90d-4c2c-9320-cc7929f0c99a)
|
- [[Microlise - ESS]]
|
||||||
- [SEB Search Improvement — Couchbase Caching](id:0b6e7dc0-1171-4dc4-982e-a5d95765e09c)
|
- [[Seb Search Improvements]]
|
||||||
|
|
||||||
## AI Training:
|
## AI Training:
|
||||||
|
|
||||||
- [Data Camp AI Training](id:ceeb2ad1-b091-49d8-8cd6-752f28a6fd86)
|
- [[Data camp AI training]]
|
||||||
|
|
||||||
# Mathematical Concepts
|
# Mathematical Concepts
|
||||||
|
|
||||||
Part of being a software engineer is having a good grasp of mathematical concepts. Here are some notes on various mathematical concepts that I find useful.
|
Part of being a software engineer is having a good grasp of mathematical concepts. Here are some notes on various mathematical concepts that I find useful.
|
||||||
|
|
||||||
- [XOR](id:F32F8F09-3DEC-4FD1-8CFA-401A316E906B)
|
- [[XOR]]
|
||||||
|
|
||||||
# Core Programming Concepts
|
# Core Programming Concepts
|
||||||
|
|
||||||
- [Powershell MOC](id:360df04d-ea24-4f04-b8e1-3595f34aac4d)
|
- [[Powershell MOC]]
|
||||||
|
|
||||||
- [Solid Principles](id:6820973F-613E-441A-BC1D-8FE5CD9BD6F7)
|
- [[Solid Principles]]
|
||||||
|
|
||||||
- [Big O Notation, Time and Space Complexity](id:275988a8-59d8-40c8-a8b4-47118d6eb834)
|
- [[Big (O) - Time and Space Complexity]]
|
||||||
|
|
||||||
- [Design patterns](id:631b2086-4b8f-4fe3-829d-be1dc014e293) WIP
|
- [[Design Patterns]] WIP
|
||||||
|
|
||||||
- [CI/CD Example - Sitevisits](id:2767b5ac-f2c9-4b1e-ab87-82c43cdec4c1)
|
- [[CI-CD Example (site visits)]]
|
||||||
|
|
||||||
- [CI/CD Summary](id:5b714c6c-7eaf-4f3f-b4f6-2166ff3a9963)
|
- [[CI-CD Summary]]
|
||||||
|
|
||||||
- [Software Development Methodologies](id:67ad330b-cc11-4e8e-b054-12b9da45ea60)
|
- [[Software Development Methodologies]]
|
||||||
|
|
||||||
- [MVP and MVT](id:fdb8fa52-0c9d-4332-9f32-53bc6fee24b9)
|
- [[MVP + MVT]]
|
||||||
|
|
||||||
- [Test Driven Development](id:2729599d-ae2b-4f22-b73d-bf22d81e0767)
|
- [[Test Driven Development]]
|
||||||
|
|
||||||
Some core programming concepts that are essential for software development. The things I need to add here are:
|
Some core programming concepts that are essential for software development. The things I need to add here are:
|
||||||
|
|
||||||
# APIs
|
# APIs
|
||||||
|
|
||||||
- [RESTful API](id:6a5bf6dd-d0ec-43e4-8e07-9956f4715f10)
|
- [[Restful API]]
|
||||||
|
|
||||||
- [API Architecture](id:49b195c8-e116-40ca-86e8-62c65dbb5a4f) (Just needs spell checks and re read)
|
- [[API Architecture]] (Just needs spell checks and re read)
|
||||||
|
|
||||||
- [API Intro Notes](id:e7f082e4-1b9f-4ebe-96d6-94d92e80a07e)
|
- [[ASP.NET Core Web API Fundamental Notes]] (todo)
|
||||||
|
|
||||||
- [ASP.NET Core Web API Fundamental Notes](id:b2fd7038-42a8-4cbe-882b-92fbe2c12a11) (todo)
|
|
||||||
|
|
||||||
# Database Related
|
# Database Related
|
||||||
|
|
||||||
- [Database Permissions, Roles, and Accounts](id:b4858f6a-b05c-47f2-972e-905e0bb2c352)
|
- [[Database Permissions, Roles, and Accounts]]
|
||||||
|
|
||||||
- [SQL Joins](id:de3bef27-81c9-49d1-85bb-edceb9a80e65)
|
- [[SQL Joins]]
|
||||||
|
|
||||||
# Misc
|
# Misc
|
||||||
|
|
||||||
- [Windows Services](id:faa7f193-5af6-4a2f-a73e-540f833a7fd0)
|
- [[Windows Services]]
|
||||||
|
|
||||||
- [Dynamic Link Library (DLL)](id:e717c252-0e15-4403-898f-93163dd1b147)
|
- [[DLL's]]
|
||||||
|
|
||||||
# Security:
|
# Security:
|
||||||
|
|
||||||
- [Cross Site Scripting (XSS)](id:01c89142-7e14-42b2-bd01-743656908fd2)
|
- [[Cross Site Scripting (XSS)]]
|
||||||
|
|
||||||
# Concepts to learn and talk about (cs and maths)
|
# Concepts to learn and talk about (cs and maths)
|
||||||
|
|
||||||
|
|||||||
33
Career/Cross Site Scripting (XSS).md
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
# Definition:
|
||||||
|
|
||||||
|
- Cross Site Scripting (XSS) is a type of security vulnerability typically found in web applications. It allows attackers to inject malicious scripts into content from otherwise trusted websites.
|
||||||
|
|
||||||
|
# Types of XSS:
|
||||||
|
|
||||||
|
## 1\. Stored XSS / Persistent XSS / Type 2 XSS:
|
||||||
|
|
||||||
|
The malicious script is permanently stored on the target server, such as in a database, message forum, visitor log, comment field, etc. When a user requests the stored information, the malicious script is served as part of the web page.
|
||||||
|
|
||||||
|
Example: An attacker posts a comment containing a malicious script on a blog. When other users view the comment, the script executes in their browsers, potentially stealing their cookies or performing other malicious actions.
|
||||||
|
|
||||||
|
## 2\. Reflected XSS / Non-Persistent XSS / Type 1 XSS:
|
||||||
|
|
||||||
|
The malicious script is reflected off a web server, such as in an error message, search result, or any other response that includes some or all of the input sent to the server as part of the request. Reflected XSS is delivered to victims via another route, such as in an email or a third-party web site.
|
||||||
|
|
||||||
|
Example: An attacker crafts a URL that includes a malicious script. When a user clicks on the link, the script is reflected off the server and executed in the user's browser.
|
||||||
|
|
||||||
|
## 3\. DOM-based XSS:
|
||||||
|
|
||||||
|
The vulnerability exists in the client-side code rather than the server-side code. The malicious script is executed as a result of modifying the DOM (Document Object Model) environment in the victim's browser, which causes the client-side code to execute in an unintended manner.
|
||||||
|
|
||||||
|
Example: An attacker manipulates the URL of a web page to include a malicious script. When the page processes the URL, it executes the script in the user's browser.
|
||||||
|
|
||||||
|
# Prevention:
|
||||||
|
|
||||||
|
- Input Validation: Ensure that all user input is properly validated and sanitized before being processed or stored. This includes using whitelisting techniques to allow only expected input.
|
||||||
|
|
||||||
|
- Output Encoding: Encode output to ensure that any potentially malicious scripts are rendered harmless when displayed in the browser. This can be done using functions that convert special characters to their corresponding HTML entities.
|
||||||
|
|
||||||
|
- Content Security Policy (CSP): Implement a Content Security Policy to restrict the sources from which scripts can be loaded and executed. This can help mitigate the impact of XSS attacks.
|
||||||
|
|
||||||
|
- Use Security Libraries: Utilize security libraries and frameworks that provide built-in protection against XSS vulnerabilities.
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
A task in the context of airflow is the basic unit of execution. They are arranged into [Dags](id:3b16e19a-62f0-4705-a451-a8790181941f) and then have upstream and downstream dependencies set between them in order to express the order in which they should be run.
|
A task in the context of airflow is the basic unit of execution. They are arranged into [[Airflow Dags]] and then have upstream and downstream dependencies set between them in order to express the order in which they should be run.
|
||||||
|
|
||||||
There are three kinds of tasks:
|
There are three kinds of tasks:
|
||||||
|
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
# xcom
|
# xcom
|
||||||
|
|
||||||
XComs stands for cross-communications, and as the name suggests, it allows [Airflow Tasks](id:1ea42d73-3cd1-4cac-a6ee-028de21d08d5) to talk to each other (because by default, tasks are entirely isolated and can run on seperate machines).
|
XComs stands for cross-communications, and as the name suggests, it allows [[Airflow Tasks]] to talk to each other (because by default, tasks are entirely isolated and can run on seperate machines).
|
||||||
|
|
||||||
See [this](https://airflow.apache.org/docs/apache-airflow/stable/core-concepts/xcoms.html)
|
See [this](https://airflow.apache.org/docs/apache-airflow/stable/core-concepts/xcoms.html)
|
||||||
|
|
||||||
2
Career/Database - SQL/Database MOC.md
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
- [[Postgres]]
|
||||||
|
- [[Airflow]]
|
||||||
10
Career/Database - SQL/SQL Joins.md
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
# The SQL JOIN Clause
|
||||||
|
|
||||||
|
The JOIN clause is used to combine rows from two or more tables, based on a related column between them.
|
||||||
|
|
||||||
|
Here are the different types of JOINs in SQL:
|
||||||
|
|
||||||
|
****(INNER) JOIN****: Returns only rows that have matching values in both tables
|
||||||
|
****LEFT (OUTER) JOIN****: Returns all rows from the left table, and only the matched rows from the right table
|
||||||
|
****RIGHT (OUTER) JOIN****: Returns all rows from the right table, and only the matched rows from the left table
|
||||||
|
****FULL (OUTER) JOIN****: Returns all rows when there is a match in either the left or right table
|
||||||
@@ -6,85 +6,78 @@
|
|||||||
|
|
||||||
Strategy is a behavioral design pattern that lets you define a family of algorithms, put each of them into a separate class, and make their objects interchangeable.
|
Strategy is a behavioral design pattern that lets you define a family of algorithms, put each of them into a separate class, and make their objects interchangeable.
|
||||||
|
|
||||||

|
![[structure-pattern.png]]
|
||||||
|
|
||||||
## Observer pattern
|
## Observer pattern
|
||||||
|
|
||||||
Observer is a behavioral design pattern that lets you define a subscription mechanism to notify multiple objects about any events that happen to the object they’re observing.
|
Observer is a behavioral design pattern that lets you define a subscription mechanism to notify multiple objects about any events that happen to the object they’re observing.
|
||||||
|
|
||||||

|
![[observer-pattern.png]]
|
||||||
|
|
||||||
## Decorator pattern
|
## Decorator pattern
|
||||||
|
|
||||||
Decorator is a structural design pattern that lets you attach new behaviors to objects by placing these objects inside special wrapper objects that contain the behaviors.
|
Decorator is a structural design pattern that lets you attach new behaviors to objects by placing these objects inside special wrapper objects that contain the behaviors.
|
||||||
|
|
||||||
The problem:
|
The problem:
|
||||||
|
|
||||||

|
![[decorator-problem.png]]
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
|
![[decorator-pattern.png]]
|
||||||
## Factory Pattern
|
## Factory Pattern
|
||||||
|
|
||||||
Factory Method is a creational design pattern that provides an interface for creating objects in a superclass, but allows subclasses to alter the type of objects that will be created.
|
Factory Method is a creational design pattern that provides an interface for creating objects in a superclass, but allows subclasses to alter the type of objects that will be created.
|
||||||
|
|
||||||

|
![[factory-pattern.png]]
|
||||||
|
|
||||||
## Singleton Pattern
|
## Singleton Pattern
|
||||||
|
|
||||||
Singleton is a creational design pattern that lets you ensure that a class has only one instance, while providing a global access point to this instance.
|
Singleton is a creational design pattern that lets you ensure that a class has only one instance, while providing a global access point to this instance.
|
||||||
|
|
||||||

|
![[singleton-pattern.png]]
|
||||||
|
|
||||||
## Command Pattern
|
## Command Pattern
|
||||||
|
|
||||||
Command is a behavioral design pattern that turns a request into a stand-alone object that contains all information about the request. This transformation lets you pass requests as a method arguments, delay or queue a request’s execution, and support undoable operations.
|
Command is a behavioral design pattern that turns a request into a stand-alone object that contains all information about the request. This transformation lets you pass requests as a method arguments, delay or queue a request’s execution, and support undoable operations.
|
||||||
|
|
||||||

|
![[command-pattern.png]]
|
||||||
|
|
||||||
## Adapter Pattern
|
## Adapter Pattern
|
||||||
|
|
||||||
Adapter is a structural design pattern that allows objects with incompatible interfaces to collaborate.
|
Adapter is a structural design pattern that allows objects with incompatible interfaces to collaborate.
|
||||||
|
|
||||||

|
![[adapter-pattern.png]]
|
||||||
|
|
||||||
Another approach:
|
Another approach:
|
||||||
|
|
||||||

|
![[adapter-pattern-2.png]]
|
||||||
|
|
||||||
## Facade Pattern
|
## Facade Pattern
|
||||||
|
|
||||||
Facade is a structural design pattern that provides a simplified interface to a library, a framework, or any other complex set of classes.
|
Facade is a structural design pattern that provides a simplified interface to a library, a framework, or any other complex set of classes.
|
||||||
|
|
||||||

|
![[facade-pattern.png]]
|
||||||
|
|
||||||
## Template Method Pattern
|
## Template Method Pattern
|
||||||
|
|
||||||
Template Method is a behavioral design pattern that defines the skeleton of an algorithm in the superclass but lets subclasses override specific steps of the algorithm without changing its structure.
|
Template Method is a behavioral design pattern that defines the skeleton of an algorithm in the superclass but lets subclasses override specific steps of the algorithm without changing its structure.
|
||||||
|
|
||||||

|
![[template-method-pattern.png]]
|
||||||
|
|
||||||
## Iterator and Composite Pattern
|
## Iterator and Composite Pattern
|
||||||
|
|
||||||
Iterator is a behavioral design pattern that lets you traverse elements of a collection without exposing its underlying representation (list, stack, tree, etc.).
|
Iterator is a behavioral design pattern that lets you traverse elements of a collection without exposing its underlying representation (list, stack, tree, etc.).
|
||||||
|
|
||||||

|
![[iterator-pattern.png]]
|
||||||
|
|
||||||
Composite is a structural design pattern that lets you compose objects into tree structures and then work with these structures as if they were individual objects.
|
Composite is a structural design pattern that lets you compose objects into tree structures and then work with these structures as if they were individual objects.
|
||||||
|
|
||||||

|
![[composite-pattern.png]]
|
||||||
|
|
||||||
## State Pattern
|
## State Pattern
|
||||||
|
|
||||||
State is a behavioral design pattern that lets an object alter its behavior when its internal state changes. It appears as if the object changed its class.
|
State is a behavioral design pattern that lets an object alter its behavior when its internal state changes. It appears as if the object changed its class.
|
||||||
|
|
||||||

|
![[state-pattern.png]]
|
||||||
|
|
||||||
## Proxy Pattern
|
## Proxy Pattern
|
||||||
|
|
||||||
Proxy is a structural design pattern that lets you provide a substitute or placeholder for another object. A proxy controls access to the original object, allowing you to perform something either before or after the request gets through to the original object.
|
Proxy is a structural design pattern that lets you provide a substitute or placeholder for another object. A proxy controls access to the original object, allowing you to perform something either before or after the request gets through to the original object.
|
||||||
|
|
||||||

|
![[proxy-pattern.png]]
|
||||||
|
|
||||||
# Design patterns. What are they?
|
# Design patterns. What are they?
|
||||||
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
# \<2026-05-27 Wed\>: XSS ROM Work
|
|
||||||
|
|
||||||
## [XSS Pentesting Report Fix](id:b2ac09aa-e888-48d3-8357-2292f9b2526c)
|
|
||||||
|
|
||||||
# Misc
|
|
||||||
|
|
||||||
- [pre<sub>workprepmicrolise</sub>](id:2BFB84B2-2129-4AE3-8E69-290CA5BF9747)
|
|
||||||
|
|
||||||
- [microlise-assessment](id:f877240e-c2c8-4087-84e5-4b1ca3fcd4ed)
|
|
||||||
@@ -5,11 +5,12 @@
|
|||||||
|
|
||||||
The core pillars:
|
The core pillars:
|
||||||
|
|
||||||

|
![[Screenshot 2026-01-14 154800.png]]
|
||||||
|
|
||||||
|
|
||||||
The workflow of publishing API’s:
|
The workflow of publishing API’s:
|
||||||
|
|
||||||

|
![[APIOps.png]]
|
||||||
|
|
||||||
This is summarised below:
|
This is summarised below:
|
||||||
|
|
||||||
@@ -18,11 +18,11 @@ ESP applications fall into three categories:
|
|||||||
| ----------- | ---------- | ------------------------------------------- |
|
| ----------- | ---------- | ------------------------------------------- |
|
||||||
| EspBroker | SQL Server | The core ESP database. Deployed via dacpac. |
|
| EspBroker | SQL Server | The core ESP database. Deployed via dacpac. |
|
||||||
|
|
||||||
See [ESP — Database & Dacpac](id:46add22d-e562-4e3a-a301-d4aea2552952) for dacpac detail.
|
See [[ESP Database]] for Dacpac detail.
|
||||||
|
|
||||||
## 2\. Windows Services
|
## 2\. Windows Services
|
||||||
|
|
||||||
[Windows Services](id:faa7f193-5af6-4a2f-a73e-540f833a7fd0) are background processes that run on a Windows server. They have no UI — they start, run, and are managed via the Windows Service Manager (or PowerShell commands like `Stop-Service`, `Start-Service`).
|
[[Windows Services]] are background processes that run on a Windows server. They have no UI — they start, run, and are managed via the Windows Service Manager (or PowerShell commands like `Stop-Service`, `Start-Service`).
|
||||||
|
|
||||||
| Service Name | Notes |
|
| Service Name | Notes |
|
||||||
| --------------- | --------------------------------- |
|
| --------------- | --------------------------------- |
|
||||||
@@ -51,7 +51,7 @@ Get-Service -Name "DLService"
|
|||||||
|
|
||||||
### Why Services Must Be Stopped Before Deployment
|
### Why Services Must Be Stopped Before Deployment
|
||||||
|
|
||||||
When deploying a new version, the old service process holds file locks on its [DLLs](id:e717c252-0e15-4403-898f-93163dd1b147). You cannot overwrite a locked file on Windows. Therefore the sequence is:
|
When deploying a new version, the old service process holds file locks on its [[DLL's]]. You cannot overwrite a locked file on Windows. Therefore the sequence is:
|
||||||
|
|
||||||
1. Stop the service
|
1. Stop the service
|
||||||
2. Swap the files (old → new)
|
2. Swap the files (old → new)
|
||||||
@@ -81,7 +81,7 @@ Citrix apps are more complex to deploy than Windows Services because:
|
|||||||
|
|
||||||
Unlike TMC (where presumably all customers get everything), ESP is a subset deployment. This means:
|
Unlike TMC (where presumably all customers get everything), ESP is a subset deployment. This means:
|
||||||
|
|
||||||
- The manifest (see [ESP — The Manifest](id:9bf19a8b-5581-4be8-9892-913c51df0128)) must define **which apps each customer has**
|
- The manifest (see [[ESP Manifest]]) must define **which apps each customer has**
|
||||||
- The deployment scripts must skip apps not applicable to a given customer
|
- The deployment scripts must skip apps not applicable to a given customer
|
||||||
- There is no universal "deploy everything" - each customer's list must be explicitly defined and maintained
|
- There is no universal "deploy everything" - each customer's list must be explicitly defined and maintained
|
||||||
|
|
||||||
@@ -94,7 +94,7 @@ function Invoke-DatabaseDeployment {
|
|||||||
|
|
||||||
# Database Deployment in the Deployment Stage
|
# Database Deployment in the Deployment Stage
|
||||||
|
|
||||||
Database deployment sits inside the **DEPLOY stage**. See [ESP — Deployment Stages](id:cd3cd02f-c9b3-4455-8ce5-b2a5aa458fed) for full stage detail. The database is typically deployed before services are started up to ensure the schema is ready for the new application code.
|
Database deployment sits inside the **DEPLOY stage**. See [[ESP Deploy Stages]] for full stage detail. The database is typically deployed before services are started up to ensure the schema is ready for the new application code.
|
||||||
|
|
||||||
Suggested order within the DEPLOY stage:
|
Suggested order within the DEPLOY stage:
|
||||||
|
|
||||||
@@ -111,7 +111,7 @@ If the dacpac deploys successfully but a subsequent step fails, rolling back the
|
|||||||
- Restore from backup (requires a backup to have been taken immediately before)
|
- Restore from backup (requires a backup to have been taken immediately before)
|
||||||
- Write a counter-dacpac that reverts the schema (complex, error-prone)
|
- Write a counter-dacpac that reverts the schema (complex, error-prone)
|
||||||
|
|
||||||
This is one of the reasons the **rollback plan is still TBC**. See [ESP — Open Questions & TBC Items](id:82c3d447-d6d3-498e-9f66-aee60c752462).
|
This is one of the reasons the **rollback plan is still TBC**. See [[ESP OQ]].
|
||||||
|
|
||||||
A **database backup must be taken before any deployment** — this should be a mandatory step in the PREDEPLOY stage.
|
A **database backup must be taken before any deployment** — this should be a mandatory step in the PREDEPLOY stage.
|
||||||
|
|
||||||
@@ -55,7 +55,7 @@ Verify that the target environment meets all requirements before deployment begi
|
|||||||
- Network connectivity between agent and target servers
|
- Network connectivity between agent and target servers
|
||||||
- Sufficient disk space on target servers
|
- Sufficient disk space on target servers
|
||||||
- Database is accessible
|
- Database is accessible
|
||||||
- If DEPLOY will include DB: check `dacpacReady` flag (see [ESP — Database & Dacpac](id:46add22d-e562-4e3a-a301-d4aea2552952))
|
- If DEPLOY will include DB: check `dacpacReady` flag (see [[ESP Database]])
|
||||||
|
|
||||||
## Outcome
|
## Outcome
|
||||||
|
|
||||||
@@ -81,7 +81,7 @@ Pre-staging minimises the time during which the application is down. When DEPLOY
|
|||||||
|
|
||||||
## Artifact Staging Note
|
## Artifact Staging Note
|
||||||
|
|
||||||
The ESP build artifact is currently a **flat folder of DLLs** — not separated per application. Predeploy will need to handle the mapping of DLLs to their correct applications. See [ESP — Known Issues & Risks](id:53d803aa-7e6f-44ed-8d99-a243a5ed5aab).
|
The ESP build artifact is currently a **flat folder of DLLs** — not separated per application. Predeploy will need to handle the mapping of DLLs to their correct applications. See [[ESP Known Issues and Risks]].
|
||||||
|
|
||||||
# Stage 4 — DEPLOY
|
# Stage 4 — DEPLOY
|
||||||
|
|
||||||
@@ -94,7 +94,7 @@ The actual upgrade — swap the old version for the new version.
|
|||||||
### 4a. Database
|
### 4a. Database
|
||||||
|
|
||||||
1. Check `dacpacReady` flag — fail if false
|
1. Check `dacpacReady` flag — fail if false
|
||||||
2. Deploy the dacpac to EspBroker (see [ESP — Database & Dacpac](id:46add22d-e562-4e3a-a301-d4aea2552952))
|
2. Deploy the dacpac to EspBroker (see [[ESP Database]])
|
||||||
|
|
||||||
### 4b. Windows Services
|
### 4b. Windows Services
|
||||||
|
|
||||||
@@ -122,7 +122,7 @@ The database schema must be deployed **before** starting the new application cod
|
|||||||
|
|
||||||
## Risk
|
## Risk
|
||||||
|
|
||||||
This is the most **destructive** stage. If something goes wrong mid-deploy, the system may be in a partially upgraded state. This is why rollback planning (currently TBC) is critical. See [ESP — Open Questions & TBC Items](id:82c3d447-d6d3-498e-9f66-aee60c752462).
|
This is the most **destructive** stage. If something goes wrong mid-deploy, the system may be in a partially upgraded state. This is why rollback planning (currently TBC) is critical. See [[ESP Known Issues and Risks]].
|
||||||
|
|
||||||
# Stage 5 — POSTDEPLOY
|
# Stage 5 — POSTDEPLOY
|
||||||
|
|
||||||
@@ -12,7 +12,7 @@ For deploying to customer servers, a self-hosted agent is required to have netwo
|
|||||||
## Artifact (Build)
|
## Artifact (Build)
|
||||||
|
|
||||||
The output of a build pipeline — typically compiled binaries, DLLs, config files, etc. packaged and stored so a deployment pipeline can consume them.
|
The output of a build pipeline — typically compiled binaries, DLLs, config files, etc. packaged and stored so a deployment pipeline can consume them.
|
||||||
The ESP build artifact is currently a flat folder of DLLs. See [ESP — Known Issues & Risks](id:53d803aa-7e6f-44ed-8d99-a243a5ed5aab)
|
The ESP build artifact is currently a flat folder of DLLs. See [[ESP Known Issues and Risks]]
|
||||||
|
|
||||||
## AzDO / Azure DevOps
|
## AzDO / Azure DevOps
|
||||||
|
|
||||||
@@ -40,17 +40,17 @@ A technology platform that delivers desktop applications to users remotely. The
|
|||||||
|
|
||||||
## Cycle Checks
|
## Cycle Checks
|
||||||
|
|
||||||
Post-deployment validation checks for ESP that involve navigating through the Citrix application UI to verify the system is functioning correctly. These are extensive and difficult to automate. See [ESP — Deployment Stages](id:cd3cd02f-c9b3-4455-8ce5-b2a5aa458fed).
|
Post-deployment validation checks for ESP that involve navigating through the Citrix application UI to verify the system is functioning correctly. These are extensive and difficult to automate. See [[ESP Deploy Stages]].
|
||||||
|
|
||||||
# D
|
# D
|
||||||
|
|
||||||
## Dacpac
|
## Dacpac
|
||||||
|
|
||||||
**Data-tier Application Package**. A `.dacpac` file that represents the desired schema of a SQL Server database. Deployed using `sqlpackage.exe`, which calculates the difference between desired and actual schema and applies it. See [ESP — Database & Dacpac](id:46add22d-e562-4e3a-a301-d4aea2552952).
|
**Data-tier Application Package**. A `.dacpac` file that represents the desired schema of a SQL Server database. Deployed using `sqlpackage.exe`, which calculates the difference between desired and actual schema and applies it. See [[ESP Database]].
|
||||||
|
|
||||||
## `dacpacReady`
|
## `dacpacReady`
|
||||||
|
|
||||||
A flag in the manifest (see [ESP — The Manifest](id:9bf19a8b-5581-4be8-9892-913c51df0128)) that indicates whether a customer's database has been manually aligned to be compatible with the dacpac. Must be `true` before the pipeline will attempt database deployment.
|
A flag in the manifest (see [[ESP Manifest]]) that indicates whether a customer's database has been manually aligned to be compatible with the dacpac. Must be `true` before the pipeline will attempt database deployment.
|
||||||
|
|
||||||
## Deploy Pipeline
|
## Deploy Pipeline
|
||||||
|
|
||||||
@@ -68,7 +68,7 @@ In the context of ESP, an environment is a specific deployment target for a cust
|
|||||||
|
|
||||||
## ESP
|
## ESP
|
||||||
|
|
||||||
The application suite built by ESS. Delivered to customers on a per-customer basis. Contains databases, Windows Services, and Citrix applications. See [ESP Applications](id:091e9bbc-0c9f-43da-81f9-464882c2a15b).
|
The application suite built by ESS. Delivered to customers on a per-customer basis. Contains databases, Windows Services, and Citrix applications. See [[ESP Applications]].
|
||||||
|
|
||||||
## ESS
|
## ESS
|
||||||
|
|
||||||
@@ -94,14 +94,14 @@ A unit of work within an AzDO pipeline stage. Each job runs on a single agent. A
|
|||||||
|
|
||||||
## Layer / Tier
|
## Layer / Tier
|
||||||
|
|
||||||
The architectural layers in the PowerShell script design. Tier 1 = entry point; Tier 2 = orchestration; Tier 3 = isolated worker functions. See [ESP — PowerShell Script Architecture](id:bf63b6c5-f32f-462e-82ad-8d4a15f7ba48).
|
The architectural layers in the PowerShell script design. Tier 1 = entry point; Tier 2 = orchestration; Tier 3 = isolated worker functions. See [[ESP Scripts]].
|
||||||
|
|
||||||
# M
|
# M
|
||||||
|
|
||||||
## Manifest
|
## Manifest
|
||||||
|
|
||||||
A configuration file defining a specific customer environment. Used by the deployment scripts to know what to deploy, where, and how.
|
A configuration file defining a specific customer environment. Used by the deployment scripts to know what to deploy, where, and how.
|
||||||
See [ESP — The Manifest](id:9bf19a8b-5581-4be8-9892-913c51df0128).
|
See [[ESP Manifest]].
|
||||||
|
|
||||||
## Microlise
|
## Microlise
|
||||||
|
|
||||||
@@ -164,7 +164,7 @@ Microsoft's command-line tool for deploying dacpac files to SQL Server.
|
|||||||
|
|
||||||
## Stage (Deployment)
|
## Stage (Deployment)
|
||||||
|
|
||||||
One of the five phases of the ESP deployment: VALIDATE, PREREQUISITES, PREDEPLOY, DEPLOY, POSTDEPLOY. Each can be run independently. See [ESP — Deployment Stages](id:cd3cd02f-c9b3-4455-8ce5-b2a5aa458fed).
|
One of the five phases of the ESP deployment: VALIDATE, PREREQUISITES, PREDEPLOY, DEPLOY, POSTDEPLOY. Each can be run independently. See [[ESP Deploy Stages]].
|
||||||
|
|
||||||
## Stage (AzDO Pipeline)
|
## Stage (AzDO Pipeline)
|
||||||
|
|
||||||
@@ -178,7 +178,7 @@ The Microlise team that preceded your team on this project. They built the ESP s
|
|||||||
|
|
||||||
## Tier 1 / 2 / 3
|
## Tier 1 / 2 / 3
|
||||||
|
|
||||||
See **Layer / Tier** above and [ESP — PowerShell Script Architecture](id:bf63b6c5-f32f-462e-82ad-8d4a15f7ba48).
|
See **Layer / Tier** above and [[ESP Scripts]].
|
||||||
|
|
||||||
## TMC
|
## TMC
|
||||||
|
|
||||||
@@ -27,7 +27,7 @@ For each customer database:
|
|||||||
|
|
||||||
- The pipeline **must** check the `dacpacReady` flag before touching the database
|
- The pipeline **must** check the `dacpacReady` flag before touching the database
|
||||||
- If `false`, fail immediately with a clear error message
|
- If `false`, fail immediately with a clear error message
|
||||||
- See [ESP — Database & Dacpac](id:46add22d-e562-4e3a-a301-d4aea2552952) for implementation detail
|
- See [[ESP Database]] for implementation detail
|
||||||
|
|
||||||
# Issue 2 — Build Artifact Is a Flat DLL Dump
|
# Issue 2 — Build Artifact Is a Flat DLL Dump
|
||||||
|
|
||||||
@@ -22,7 +22,7 @@ It is the **single source of truth** for a deployment. Tier 1 loads it, validate
|
|||||||
|
|
||||||
# Design Status
|
# Design Status
|
||||||
|
|
||||||
The manifest **structure has not yet been fully designed**. This is an open work item. See [ESP — Open Questions & TBC Items](id:82c3d447-d6d3-498e-9f66-aee60c752462) for a list of design questions to resolve.
|
The manifest **structure has not yet been fully designed**. This is an open work item. See [[ESP OQ]] for a list of design questions to resolve.
|
||||||
|
|
||||||
What follows is a **proposed structure** based on what the scripts will need.
|
What follows is a **proposed structure** based on what the scripts will need.
|
||||||
|
|
||||||
@@ -82,7 +82,7 @@ What follows is a **proposed structure** based on what the scripts will need.
|
|||||||
|
|
||||||
# Manifest Validation (VALIDATE Stage)
|
# Manifest Validation (VALIDATE Stage)
|
||||||
|
|
||||||
The VALIDATE stage (see [ESP — Deployment Stages](id:cd3cd02f-c9b3-4455-8ce5-b2a5aa458fed)) loads the manifest and checks it is well-formed before any deployment activity. Things to validate:
|
The VALIDATE stage (see [[ESP Deploy Stages]]) loads the manifest and checks it is well-formed before any deployment activity. Things to validate:
|
||||||
|
|
||||||
- All required fields are present
|
- All required fields are present
|
||||||
- Server names are resolvable/pingable
|
- Server names are resolvable/pingable
|
||||||
@@ -89,7 +89,7 @@ What does the manifest config file look like? What format, what fields, where is
|
|||||||
|
|
||||||
## See Also
|
## See Also
|
||||||
|
|
||||||
[ESP — The Manifest](id:9bf19a8b-5581-4be8-9892-913c51df0128) contains a proposed structure. This needs to be validated against actual deployment requirements and agreed by the team.
|
[[ESP Manifest]] contains a proposed structure. This needs to be validated against actual deployment requirements and agreed by the team.
|
||||||
|
|
||||||
## Answer (Fill In When Known)
|
## Answer (Fill In When Known)
|
||||||
|
|
||||||
@@ -55,7 +55,7 @@ There are two existing pipelines to be aware of:
|
|||||||
|
|
||||||
- **Purpose:** Builds the ESP applications from source code
|
- **Purpose:** Builds the ESP applications from source code
|
||||||
- **Output:** Build artifacts (DLLs, binaries)
|
- **Output:** Build artifacts (DLLs, binaries)
|
||||||
- **Known Issue:** The artifact does not separate applications cleanly - it produces a large flat folder of DLLs. See [ESP — Known Issues & Risks](id:53d803aa-7e6f-44ed-8d99-a243a5ed5aab)
|
- **Known Issue:** The artifact does not separate applications cleanly - it produces a large flat folder of DLLs. See [[ESP Known Issues and Risks]]
|
||||||
- **Location:** AzDO → Pipelines → Runs for `ESS.esp Main Build`
|
- **Location:** AzDO → Pipelines → Runs for `ESS.esp Main Build`
|
||||||
|
|
||||||
## ESS.esp Deploy
|
## ESS.esp Deploy
|
||||||
@@ -75,7 +75,7 @@ The pipeline's job is relatively thin - it is an **orchestrator** that calls our
|
|||||||
└── Calls Tier 2 scripts (PreDeployment.ps1, Deployment.ps1, etc.)
|
└── Calls Tier 2 scripts (PreDeployment.ps1, Deployment.ps1, etc.)
|
||||||
└── Calls Tier 3 functions (Stop-WindowsService, Invoke-Sql, etc.)
|
└── Calls Tier 3 functions (Stop-WindowsService, Invoke-Sql, etc.)
|
||||||
|
|
||||||
See [ESP — PowerShell Script Architecture](id:bf63b6c5-f32f-462e-82ad-8d4a15f7ba48) for full detail on the script architecture.
|
See [[ESP Scripts]] for full detail on the script architecture.
|
||||||
|
|
||||||
# Pipeline Agents
|
# Pipeline Agents
|
||||||
|
|
||||||
@@ -24,7 +24,7 @@ Invoke-Deployment.ps1 -Customer ROMAC -Environment DEV -Stages VALIDATE
|
|||||||
## Responsibility
|
## Responsibility
|
||||||
|
|
||||||
- The **single entry point** to the whole deployment system
|
- The **single entry point** to the whole deployment system
|
||||||
- Loads and validates the manifest (see [ESP — The Manifest](id:9bf19a8b-5581-4be8-9892-913c51df0128))
|
- Loads and validates the manifest (see [[ESP Manifest]])
|
||||||
- Loads all required PowerShell modules (Tier 2, Tier 3, helpers)
|
- Loads all required PowerShell modules (Tier 2, Tier 3, helpers)
|
||||||
- Calls the appropriate Tier 2 functions for the requested stages
|
- Calls the appropriate Tier 2 functions for the requested stages
|
||||||
- Passes the manifest object through to Tier 2
|
- Passes the manifest object through to Tier 2
|
||||||
58
Career/Microlise/ESS ESP/ESS ESP Index.md
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
# Overview
|
||||||
|
|
||||||
|
The ESP Deployment Pipeline project is an effort to automate the deployment of the ESP application suite (built by ESS) into customer environments using Azure DevOps (AzDO) YAML pipelines and PowerShell scripts.
|
||||||
|
|
||||||
|
We are the third team to inherit this work. Team Ludo started it, got the build working in AzDO, and began deployment work before being reassigned. We pick up from there.
|
||||||
|
|
||||||
|
# Quick Reference - Key Concepts
|
||||||
|
|
||||||
|
| Concept | What it is | Notes File |
|
||||||
|
| --------------- | ---------------------------------------------------- | ------------------------------ |
|
||||||
|
| ESP | Suite of apps deployed per-customer | [[ESP Applications]] |
|
||||||
|
| AzDO Pipeline | YAML-based CI/CD pipeline in Azure DevOps | [[ESP Pipeline]] |
|
||||||
|
| PowerShell Arch | Three-tier script architecture (T1/T2/T3) | [[ESP Scripts]] |
|
||||||
|
| Manifest | Config file defining a customer environment | [[ESP Manifest]] |
|
||||||
|
| Dacpac | Packaged SQL Server DB schema deployment | [[ESP Database]] |
|
||||||
|
| Stages | Validate / Prerequisites / Predeploy / Deploy / Post | [[ESP Deploy Stages]] |
|
||||||
|
| Known Issues | Pain points, risks, and gaps | [[ESP Known Issues and Risks]] |
|
||||||
|
| Open Questions | Things still TBC or not yet designed | [[ESP OQ]] |
|
||||||
|
| Glossary | Terminology reference | [[ESP Glossary]] |
|
||||||
|
|
||||||
|
# Context — Why This Project Exists
|
||||||
|
|
||||||
|
- Few original ESS engineers remain; those left are on paid customer work
|
||||||
|
- Manual deployments are slow, risky, and rely on tribal knowledge
|
||||||
|
- Business goal: *all deployments are consistently repeatable with no manual VM work*
|
||||||
|
- Initial scope: ROMAC DEV environment only
|
||||||
|
- Future scope: all environments including PROD and ESS's own data centre
|
||||||
|
|
||||||
|
# Team History
|
||||||
|
|
||||||
|
| Team | Contribution | Current Status |
|
||||||
|
| --------- | ------------------------------------------------------- | --------------------------- |
|
||||||
|
| ESS | Built ESP; wrote original deployment docs | Mostly departed |
|
||||||
|
| Team Ludo | Full ESP build in AzDO; started deploy pipeline; dacpac | Reassigned to customer work |
|
||||||
|
| Our Team | Inheriting deploy pipeline work | Active |
|
||||||
|
|
||||||
|
# Existing Resources to Review
|
||||||
|
|
||||||
|
- Handover from Team Ludo: `ESP_Pipeline_Handover.docx`
|
||||||
|
- Ludo deployment docs: `DEPLOY.md` (in Repos)
|
||||||
|
- Ludo deploy scripts: `deploy` folder (in Repos)
|
||||||
|
- ESP Main Build pipeline: AzDO → Pipelines → `ESS.esp Main Build`
|
||||||
|
- ESP Deploy Pipeline: AzDO → Pipelines → `ESS.esp Deploy`
|
||||||
|
|
||||||
|
# File Index
|
||||||
|
|
||||||
|
| File | Contents |
|
||||||
|
| ------------------------------ | --------------------------------------- |
|
||||||
|
| [[ESS ESP Index]] | This file — master index |
|
||||||
|
| [[ESP Applications]] | ESP app suite breakdown |
|
||||||
|
| [[ESP Pipeline]] | AzDO pipeline structure and concepts |
|
||||||
|
| [[ESP Scripts]] | Three-tier PowerShell architecture |
|
||||||
|
| [[ESP Manifest]] | Manifest design and purpose |
|
||||||
|
| [[ESP Database]] | Database, dacpac, and SQL concerns |
|
||||||
|
| [[ESP Deploy Stages]] | Stages of deployment — detail per stage |
|
||||||
|
| [[ESP Known Issues and Risks]] | Known issues and risks |
|
||||||
|
| [[ESP OQ]] | TBC items and open design questions |
|
||||||
|
| [[ESP Glossary]] | Glossary of all technical terms |
|
||||||
@@ -1,7 +1,6 @@
|
|||||||
Joined team Shackleton on \<2026-04-07 Tue\>, who are now overseeing the deployment process for ESS applications.
|
Joined team Shackleton on \<2026-04-07 Tue\>, who are now overseeing the deployment process for ESS applications.
|
||||||
|
|
||||||
[ESP Deployment Pipeline — Index](id:a6c345df-8db9-4538-b87e-0e72e2414905)
|
[[ESS ESP Index]]
|
||||||
|
|
||||||
# AI generated overview of ESP
|
# AI generated overview of ESP
|
||||||
|
|
||||||
## What's the Big Picture?
|
## What's the Big Picture?
|
||||||
53
Career/Microlise/Microlise Assessment.md
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
1. What are you most proud of doing in the last 2 years?
|
||||||
|
|
||||||
|
2. What do you think you could have done better in the last two years?
|
||||||
|
|
||||||
|
3. What is the most important thing you have done in the last two years?
|
||||||
|
|
||||||
|
4. What books have you read recently?
|
||||||
|
|
||||||
|
Recently, I have been reading The C Programming Language by Brian Kernighan and Dennis Ritchie to better understand low-level programming. I have been reading this book since my second year at university and have learnt many concepts that translate well into higher-level programming languages like Java. I also decided to create a GitHub repository where I store the practical applications of what was learnt from this book in an educational format so that I can share what I learnt as well test my knowledge.
|
||||||
|
|
||||||
|
Another book I have been reading is The Science of Self-Discipline by Peter Hollins. What I took from this book is that despite perpetual distractions we are enveloped with, there are ways we can still remain disciplined. The structuring of the book is quite clever in the sense that it allows the reader to seamlessly flow from the relevant topics that surround the subject of 'self-discipline'. From this book, I got more into the GTD (getting things done) principle and has really helped with managing my to-dos.
|
||||||
|
|
||||||
|
5. What are the things you like about your role?
|
||||||
|
|
||||||
|
The thing I like most about my current role is the fact that no two days are the same. As my current role is a part-time tutor, I meet students that really challenge me to explain complex concepts in simpler ways. There are many soft skills that I've picked up, such as: communication, time-management, organisation and teamworking skills.
|
||||||
|
|
||||||
|
6. What annoys you?
|
||||||
|
|
||||||
|
Poor communication from peers and soiled working environments can at times be frustrating. I believe that good and innovative ideas come from open discussions, therefore I value settings where conversations flow in a respectful manner, where people can speak their thoughts and ideas regardless of their seniority.
|
||||||
|
|
||||||
|
7. What would you like to be able to do better?
|
||||||
|
|
||||||
|
I would like to improve my skills in DevOps, specifically the CI/CD and containerisation aspect of this. As I've worked on full-stack applications, my focus was mainly on getting the features deployed, however I want to understand more about deployment, scalability, and infrastructure. To bridge this gap, I began setting up my own homelab that hosts different services through docker-compose. I'm also looking at GitHub actions as I regularly upload to GitHub.
|
||||||
|
|
||||||
|
**add something non-technical**
|
||||||
|
|
||||||
|
8. If we were to ask your manager, how would they describe you?
|
||||||
|
They’d describe me as: dependable, empathetic, and always ready to help. Someone who
|
||||||
|
takes initiative in stressful situations, supports others without hesitation, and makes others smile.
|
||||||
|
|
||||||
|
9. What would your manager say was the best way to manage you?
|
||||||
|
|
||||||
|
Giving me the trust and space to work independently. Being given regular feedback along with constructive performance reviews with what needs to be worked on really helps.
|
||||||
|
|
||||||
|
10. What would your manager say you need to improve on?
|
||||||
|
They might say I sometimes take on too much at once. I tend to get enthusiastic about new challenges, however I need to be able to set realistic expectations with both myself and the team through assessing the workload better.
|
||||||
|
|
||||||
|
11. If we asked some of the people that worked with you, to describe you, what would they say?
|
||||||
|
They'd likely say that I'm approachable, passionate about learning and well-organised. Someone who is easy to get along with and overall jolly.
|
||||||
|
|
||||||
|
12. If you could change something about your current role, what would it be?
|
||||||
|
|
||||||
|
13. Why do you want to move on from your current role?
|
||||||
|
|
||||||
|
14. What do you think you will like about this role?
|
||||||
|
|
||||||
|
15. What do you think will be difficult about this role?
|
||||||
|
|
||||||
|
16. Can you provide an example of where you have gone above and beyond the role to achieve a goal?
|
||||||
|
|
||||||
|
17. Can you provide an example of where you have provided exceptional internal or external customer care?
|
||||||
|
|
||||||
|
18. Have you done any charity work, or voluntary work to help others? If not, have you examples of where you have helped someone at work?
|
||||||
9
Career/Microlise/Microlise MOC.md
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
# \<2026-05-27 Wed\>: XSS ROM Work
|
||||||
|
|
||||||
|
## [[Session Stored XSS PENTEST]]
|
||||||
|
|
||||||
|
# Misc
|
||||||
|
|
||||||
|
- [[Pre work prep]]
|
||||||
|
|
||||||
|
- [[Microlise Assessment]]
|
||||||
22
Career/Microlise/Pre work prep.md
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
# Clothing
|
||||||
|
|
||||||
|
# Bag(s)
|
||||||
|
|
||||||
|
## If going directly from work to mosque:
|
||||||
|
|
||||||
|
## If going back home:
|
||||||
|
|
||||||
|
# Timings
|
||||||
|
|
||||||
|
\<2025-10-06 Mon\>: 9:15pm arrival
|
||||||
|
|
||||||
|
# Petrol/Transport
|
||||||
|
|
||||||
|
Taking two cars:
|
||||||
|
|
||||||
|
- mine 2 days a week (friday and wednesday)
|
||||||
|
- Bajis car on the rest of the week
|
||||||
|
|
||||||
|
# Documents
|
||||||
|
|
||||||
|
#
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
# Links:
|
# Links:
|
||||||
|
|
||||||
- [Cross Site Scripting (XSS)](id:01c89142-7e14-42b2-bd01-743656908fd2)
|
- [[Cross Site Scripting (XSS)]]
|
||||||
|
|
||||||
# Metadata
|
# Metadata
|
||||||
|
|
||||||
@@ -12,4 +12,3 @@ The SOLID principles are:
|
|||||||
|
|
||||||
5. ****Dependency Inversion Principle (DIP)****: High-level modules should not depend on low-level modules; both should depend on abstractions. Additionally, abstractions should not depend on details; details should depend on abstractions. This principle encourages the use of interfaces and abstract classes to decouple high-level and low-level components.
|
5. ****Dependency Inversion Principle (DIP)****: High-level modules should not depend on low-level modules; both should depend on abstractions. Additionally, abstractions should not depend on details; details should depend on abstractions. This principle encourages the use of interfaces and abstract classes to decouple high-level and low-level components.
|
||||||
|
|
||||||
[solid<sub>principlesexamples</sub>](id:F3875F0F-5C9E-4BB1-A79C-6000B9558115)
|
|
||||||
3
Career/Test Driven Development.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
Test-driven development is a way of writing code that involves writing an automated unit-level test case that fails, then writing just enough code to make the test pass, then refactoring both the test code and the production code, then repeating with another new test case. Alternative approaches to writing automated tests is to write all of the production code before starting on the test code or to write all of the test code before starting on the production code.
|
||||||
|
|
||||||
|
One example is [[Bowling Kata]]
|
||||||
4
Index.md
@@ -3,4 +3,8 @@ This is the homepage
|
|||||||
|
|
||||||
[[Daily Notes]]
|
[[Daily Notes]]
|
||||||
|
|
||||||
|
[[Career MOC]]
|
||||||
|
|
||||||
|
[[Concepts]]
|
||||||
|
|
||||||
![[anime-kuroko-no-basket-tetsuya-basketball-play-17f4blaudede9nw2.gif]]
|
![[anime-kuroko-no-basket-tetsuya-basketball-play-17f4blaudede9nw2.gif]]
|
||||||