Compare commits

..

57 Commits

Author SHA1 Message Date
00e8e7d116 vault backup: 2025-06-07 19:56:31 2025-06-07 19:56:31 +02:00
cd5e3ec089 vault backup: 2025-06-07 19:46:16 2025-06-07 19:46:16 +02:00
befa559bbb vault backup: 2025-06-07 18:54:39 2025-06-07 18:54:40 +02:00
7b8245d7b5 vault backup: 2025-06-07 18:30:45 2025-06-07 18:30:45 +02:00
d1ef02be6e vault backup: 2025-05-09 18:08:05 2025-05-09 18:08:05 +02:00
a5771a6e1d vault backup: 2025-05-06 13:00:52 2025-05-06 13:00:52 +02:00
d4dd7b142d vault backup: 2025-05-05 20:59:28 2025-05-05 20:59:28 +02:00
1b4bee229f vault backup: 2025-05-05 20:41:16 2025-05-05 20:41:16 +02:00
0dcf0496d7 vault backup: 2025-05-05 19:59:16 2025-05-05 19:59:16 +02:00
bf04a00d10 vault backup: 2025-05-05 16:48:06 2025-05-05 16:48:06 +02:00
464477c358 vault backup: 2025-05-05 16:12:23 2025-05-05 16:12:23 +02:00
a598cca70d vault backup: 2025-05-05 15:05:48 2025-05-05 15:05:48 +02:00
b15c18b00e vault backup: 2025-05-05 13:55:38 2025-05-05 13:55:38 +02:00
9910c7737f vault backup: 2025-05-05 05:01:17 2025-05-05 05:01:17 +02:00
aa6547aa28 vault backup: 2025-05-05 04:53:58 2025-05-05 04:53:58 +02:00
df6a389528 vault backup: 2025-05-05 04:21:09 2025-05-05 04:21:09 +02:00
660fc61bcf vault backup: 2025-05-02 18:58:09 2025-05-02 18:58:09 +02:00
0553b398fc vault backup: 2025-05-02 18:57:49 2025-05-02 18:57:49 +02:00
73a62f4edd vault backup: 2025-05-02 18:51:24 2025-05-02 18:51:24 +02:00
40a3d4e103 vault backup: 2025-04-25 16:16:13 2025-04-25 16:16:13 +02:00
3685aee1bd vault backup: 2025-04-23 15:41:23 2025-04-23 15:41:23 +02:00
a4a5486252 vault backup: 2025-04-21 22:49:53 2025-04-21 22:49:53 +02:00
e87d3b26a1 vault backup: 2025-04-21 22:13:39 2025-04-21 22:13:39 +02:00
ba1366cb79 vault backup: 2025-04-21 21:20:06 2025-04-21 21:20:06 +02:00
29f7c07e4c os 2025-04-19 13:36:03 +02:00
ffeccca723 vault backup: 2025-04-19 13:35:29 2025-04-19 13:35:29 +02:00
dcecfda4fc vault backup: 2025-04-14 20:58:47 2025-04-14 20:58:47 +02:00
4caa0e4c24 vault backup: 2025-04-14 19:58:43 2025-04-14 19:58:43 +02:00
6d08e555c2 vault backup: 2025-04-14 19:38:20 2025-04-14 19:38:20 +02:00
3c6cafc8ff vault backup: 2025-04-14 18:57:30 2025-04-14 18:57:30 +02:00
d7a17f5c9b vault backup: 2025-03-17 20:11:53 2025-03-17 20:11:53 +01:00
8bf5195059 vault backup: 2025-02-27 16:29:47 2025-02-27 16:29:47 +01:00
f5bf5e4f3e vault backup: 2025-02-20 16:21:47 2025-02-20 16:21:47 +01:00
88c988e284 vault backup: 2025-02-20 16:00:23 2025-02-20 16:00:23 +01:00
7ed288dd9c vault backup: 2025-02-20 15:48:21 2025-02-20 15:48:21 +01:00
680fb334ac vault backup: 2025-02-20 15:08:09 2025-02-20 15:08:09 +01:00
d62b2f8867 vault backup: 2025-02-20 14:57:00 2025-02-20 14:57:00 +01:00
7332fea8bf vault backup: 2025-02-14 15:29:55 2025-02-14 15:29:55 +01:00
fb35dd1020 vault backup: 2025-02-13 16:10:19 2025-02-13 16:10:19 +01:00
20b172d455 vault backup: 2025-02-12 15:04:15 2025-02-12 15:04:15 +01:00
672268d6e7 vault backup: 2025-02-10 16:39:29 2025-02-10 16:39:29 +01:00
22c70ee735 vault backup: 2025-02-09 13:48:28 2025-02-09 13:48:28 +01:00
275a3cbaaf vault backup: 2025-02-04 14:31:08 2025-02-04 14:31:09 +01:00
d42935aa65 vault backup: 2025-02-04 13:03:51 2025-02-04 13:03:51 +01:00
14b3afb020 vault backup: 2025-02-04 12:36:44 2025-02-04 12:36:44 +01:00
03342ea07a vault backup: 2025-02-04 12:03:53 2025-02-04 12:03:53 +01:00
f728914cdb vault backup: 2025-02-04 11:07:38 2025-02-04 11:07:38 +01:00
e768b3c766 Finished lecture 1 2025-02-04 10:46:13 +01:00
d0b7c1fd65 vault backup: 2025-02-04 10:18:25 2025-02-04 10:18:25 +01:00
a33da99c30 vault backup: 2025-02-04 10:17:22 2025-02-04 10:17:22 +01:00
9af3edbfd9 vault backup: 2025-02-04 10:17:06 2025-02-04 10:17:07 +01:00
a7b9eb69ef vault backup: 2025-01-23 19:58:25 2025-01-23 19:58:25 +01:00
cd74b226dd vault backup: 2025-01-23 19:16:08 2025-01-23 19:16:08 +01:00
3b791491a0 vault backup: 2025-01-15 21:52:02 2025-01-15 21:52:02 +01:00
ec0baf3ef5 vault backup: 2025-01-15 21:34:22 2025-01-15 21:34:22 +01:00
f46582f252 vault backup: 2025-01-15 20:31:27 2025-01-15 20:31:27 +01:00
3f404b4529 vault backup: 2025-01-15 17:04:19 2025-01-15 17:04:19 +01:00
100 changed files with 62340 additions and 7848 deletions

3
.obsidian/app.json vendored
View File

@ -8,5 +8,6 @@
}, },
"alwaysUpdateLinks": true, "alwaysUpdateLinks": true,
"useMarkdownLinks": true, "useMarkdownLinks": true,
"promptDelete": false "promptDelete": false,
"readableLineLength": false
} }

View File

@ -3,6 +3,7 @@
"accentColor": "#efb9fd", "accentColor": "#efb9fd",
"theme": "obsidian", "theme": "obsidian",
"enabledCssSnippets": [ "enabledCssSnippets": [
"dark_pdf" "dark_pdf",
"images"
] ]
} }

10
.obsidian/bookmarks.json vendored Normal file
View File

@ -0,0 +1,10 @@
{
"items": [
{
"type": "file",
"ctime": 1738664322117,
"path": "Extracurricular/Misc/Ideas.md",
"title": "Ideas"
}
]
}

View File

@ -5,7 +5,6 @@
"obsidian-icon-folder", "obsidian-icon-folder",
"obsidian-advanced-slides", "obsidian-advanced-slides",
"obsidian-annotator", "obsidian-annotator",
"obsidian-markmind",
"obsidian-wakatime", "obsidian-wakatime",
"omnisearch", "omnisearch",
"obsidian-enhancing-export", "obsidian-enhancing-export",
@ -14,5 +13,7 @@
"obsidian-plugin-toc", "obsidian-plugin-toc",
"emoji-shortcodes", "emoji-shortcodes",
"advanced-canvas", "advanced-canvas",
"obsidian-tracker" "obsidian-tracker",
"better-export-pdf",
"obsidian-mind-map"
] ]

View File

@ -26,5 +26,6 @@
"workspaces": false, "workspaces": false,
"file-recovery": true, "file-recovery": true,
"publish": false, "publish": false,
"sync": false "sync": false,
"webviewer": false
} }

16
.obsidian/graph.json vendored
View File

@ -5,7 +5,7 @@
"showAttachments": false, "showAttachments": false,
"hideUnresolved": false, "hideUnresolved": false,
"showOrphans": false, "showOrphans": false,
"collapse-color-groups": true, "collapse-color-groups": false,
"colorGroups": [ "colorGroups": [
{ {
"query": "[\"type\":theoretical]", "query": "[\"type\":theoretical]",
@ -38,14 +38,14 @@
], ],
"collapse-display": false, "collapse-display": false,
"showArrow": false, "showArrow": false,
"textFadeMultiplier": 0.2, "textFadeMultiplier": -0.4,
"nodeSizeMultiplier": 1.22291666666667, "nodeSizeMultiplier": 1.60572916666667,
"lineSizeMultiplier": 1.60572916666667, "lineSizeMultiplier": 2.80520833333333,
"collapse-forces": true, "collapse-forces": false,
"centerStrength": 0.518713248970312, "centerStrength": 0.442708333333333,
"repelStrength": 10, "repelStrength": 17.9166666666667,
"linkStrength": 1, "linkStrength": 1,
"linkDistance": 250, "linkDistance": 250,
"scale": 0.9999999999999991, "scale": 0.44649054406822863,
"close": true "close": true
} }

View File

@ -0,0 +1,29 @@
{
"showTitle": true,
"maxLevel": "6",
"displayHeader": true,
"displayFooter": true,
"headerTemplate": "<div style=\"width: 100vw;font-size:10px;text-align:center;\"><span class=\"title\"></span></div>",
"footerTemplate": "<div style=\"width: 100vw;font-size:10px;text-align:center;\"><span class=\"pageNumber\"></span> / <span class=\"totalPages\"></span></div>",
"printBackground": false,
"generateTaggedPDF": false,
"displayMetadata": false,
"debug": false,
"isTimestamp": false,
"enabledCss": false,
"prevConfig": {
"pageSize": "A4",
"marginType": "1",
"showTitle": true,
"open": true,
"scale": 100,
"landscape": false,
"marginTop": "10",
"marginBottom": "10",
"marginLeft": "10",
"marginRight": "10",
"displayHeader": true,
"displayFooter": true,
"cssSnippet": "0"
}
}

21276
.obsidian/plugins/better-export-pdf/main.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,11 @@
{
"id": "better-export-pdf",
"name": "Better Export PDF",
"version": "1.10.2",
"minAppVersion": "0.15.0",
"description": "Export your notes to PDF, support export preview, add bookmarks outline and header/footer.",
"author": "l1xnan",
"authorUrl": "https://github.com/l1xnan",
"fundingUrl": "https://www.buymeacoffee.com/l1xnan",
"isDesktopOnly": true
}

View File

@ -0,0 +1,61 @@
#better-export-pdf {
display: flex;
flex-direction: row;
height: 75vh;
}
#better-export-pdf .pdf-preview {
flex: auto;
position: relative;
display: flex;
flex-direction: column;
overflow-x: hidden;
overflow-y: scroll;
align-content: flex-start;
}
#better-export-pdf .pdf-preview .webview-wrapper {
position: relative;
height: 100%;
width: 100%;
}
#better-export-pdf .pdf-preview .print-size {
position: absolute;
right: 8px;
top: 8px;
z-index: 99;
font-size: 0.6rem;
white-space: pre-wrap;
text-align: right;
visibility: hidden;
}
#better-export-pdf .pdf-preview > div {
flex: 1;
height: 100%;
width: 100%;
}
#better-export-pdf .pdf-preview .filename {
font-size: 0.75rem;
color: var(--color-base-60);
}
#better-export-pdf .pdf-preview .filename:not(:first-child) {
padding-top: calc(var(--p-spacing));
}
#better-export-pdf webview {
flex: 1;
height: 100%;
width: 100%;
}
#better-export-pdf .setting-wrapper {
width: 320px;
margin-left: 16px;
}
#better-export-pdf .setting-wrapper .setting-item[hidden] {
display: none;
}

View File

@ -0,0 +1,21 @@
{
"port": "3000",
"autoReload": true,
"exportDirectory": "/export",
"enableChalkboard": false,
"enableOverview": false,
"enableMenu": false,
"enablePointer": false,
"enableTimeBar": false,
"theme": "black",
"highlightTheme": "zenburn",
"transition": "slide",
"transitionSpeed": "default",
"controls": true,
"progress": true,
"slideNumber": false,
"showGrid": false,
"autoComplete": "inPreview",
"paneMode": "split",
"motm": "2025-04-21T19:43:27.198Z"
}

View File

@ -0,0 +1,60 @@
{
"items": [
{
"name": "Markdown"
},
{
"name": "Markdown (Hugo)"
},
{
"name": "Html"
},
{
"name": "TextBundle"
},
{
"name": "Typst"
},
{
"name": "PDF"
},
{
"name": "Word (.docx)"
},
{
"name": "OpenOffice"
},
{
"name": "RTF"
},
{
"name": "Epub"
},
{
"name": "Latex"
},
{
"name": "Media Wiki"
},
{
"name": "reStructuredText"
},
{
"name": "Textile"
},
{
"name": "OPML"
},
{
"name": "Bibliography"
}
],
"defaultExportDirectoryMode": "Auto",
"openExportedFile": true,
"env": {},
"showExportProgressBar": true,
"lastExportDirectory": {
"linux": "/home/boyan/Documents"
},
"lastExportType": "PDF"
}

View File

@ -6,11 +6,11 @@
"emojiStyle": "native", "emojiStyle": "native",
"iconColor": null, "iconColor": null,
"recentlyUsedIcons": [ "recentlyUsedIcons": [
"LiSatellite", "LiInfo",
"LiBookOpenCheck", "🤖",
"📖", "🖥",
"📊", "LiComputer",
"LiCodeSquare" "LiSatellite"
], ],
"recentlyUsedIconsSize": 5, "recentlyUsedIconsSize": 5,
"rules": [], "rules": [],
@ -84,5 +84,12 @@
"iconName": "LiBookOpenCheck", "iconName": "LiBookOpenCheck",
"iconColor": "#ffbb00" "iconColor": "#ffbb00"
}, },
"Extracurricular/satQuest": "LiSatellite" "Extracurricular/satQuest": "LiSatellite",
"Software Engineering": {
"iconName": "LiComputer",
"iconColor": "#3df2ff"
},
"Operating Systems": "🖥",
"Introduction to Machine Learning": "🤖",
"Introduction to Machine Learning/Introductory lecture.md": "LiInfo"
} }

View File

@ -1,18 +0,0 @@
{
"canvasSize": 8000,
"headLevel": 2,
"fontSize": 16,
"background": "transparent",
"layout": "mindmap",
"layoutDirect": "mindmap",
"protocol": "jump-to-pdf",
"registerPdfEvent": true,
"viewerTheme": 2,
"mindmapmode": "basic",
"parseMindMap": true,
"annotateTop": 0,
"annotateBottom": 0,
"useCustomShortcut": false,
"highlightFormat": "\nPage:{{page}}\n<span style=\"color:rgb({{color}})\">■</span>:{{highlightText}}\nComment:{{comment}}\n[📌]({{link}})\n^{{id}}\n",
"uid": "00p01100q00t01300o01300r01300t01200o013"
}

File diff suppressed because one or more lines are too long

View File

@ -1,10 +0,0 @@
{
"id": "obsidian-markmind",
"name": "Markmind",
"version": "3.0.2",
"minAppVersion": "0.9.12",
"description": "This is a mindmap , outline tool for obsidian.",
"author": "Mark",
"authorUrl": "https://github.com/MarkMindCkm/obsidian-markmind",
"isDesktopOnly": false
}

File diff suppressed because one or more lines are too long

32631
.obsidian/plugins/obsidian-mind-map/main.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,8 @@
{
"id": "obsidian-mind-map",
"name": "Mind Map",
"version": "1.1.0",
"description": "A plugin to preview notes as Markmap mind maps",
"isDesktopOnly": false,
"js": "main.js"
}

9
.obsidian/snippets/images.css vendored Normal file
View File

@ -0,0 +1,9 @@
img {
display: block;
margin-left: auto;
margin-right: auto;
max-width:500px;
}
div.mermaid {
text-align: center;
}

View File

@ -22,6 +22,8 @@
"excalidraw-css": "text", "excalidraw-css": "text",
"excalidraw-autoexport": "text", "excalidraw-autoexport": "text",
"excalidraw-embeddable-theme": "text", "excalidraw-embeddable-theme": "text",
"excalidraw-open-md": "checkbox" "excalidraw-open-md": "checkbox",
"backlinks": "multitext",
"mermaid": "multitext"
} }
} }

View File

@ -4,35 +4,38 @@
"type": "split", "type": "split",
"children": [ "children": [
{ {
"id": "91b1494cd808f86c", "id": "31174fbd9a68be49",
"type": "tabs", "type": "tabs",
"children": [ "children": [
{ {
"id": "cd8e3009ae40c051", "id": "f9fe04cad473d20c",
"type": "leaf", "type": "leaf",
"state": { "state": {
"type": "markdown", "type": "markdown",
"state": { "state": {
"file": "Extracurricular/satQuest/Meeting Dec 18.md", "file": "Operating Systems/Mass Storage.md",
"mode": "source", "mode": "source",
"source": false "source": false
}, },
"icon": "lucide-file", "icon": "lucide-file",
"title": "Meeting Dec 18" "title": "Mass Storage"
} }
}, },
{ {
"id": "3dbe2cc922c4bee2", "id": "5e5f715713d29cb8",
"type": "leaf", "type": "leaf",
"state": { "state": {
"type": "markdown", "type": "canvas",
"state": { "state": {
"file": "Statistics and Probability/Support Lecture.md", "file": "Extracurricular/Plag/Untitled.canvas",
"mode": "source", "viewState": {
"source": false "x": -354.95061823931576,
"y": 2689.4480955935114,
"zoom": 0.7529071380352278
}
}, },
"icon": "lucide-file", "icon": "lucide-layout-dashboard",
"title": "Support Lecture" "title": "Untitled"
} }
} }
], ],
@ -55,7 +58,8 @@
"state": { "state": {
"type": "file-explorer", "type": "file-explorer",
"state": { "state": {
"sortOrder": "alphabetical" "sortOrder": "alphabetical",
"autoReveal": false
}, },
"icon": "lucide-folder-closed", "icon": "lucide-folder-closed",
"title": "Files" "title": "Files"
@ -92,8 +96,7 @@
} }
], ],
"direction": "horizontal", "direction": "horizontal",
"width": 234.5, "width": 234.5
"collapsed": true
}, },
"right": { "right": {
"id": "fd4347e6b5300816", "id": "fd4347e6b5300816",
@ -196,8 +199,7 @@
} }
], ],
"direction": "horizontal", "direction": "horizontal",
"width": 200, "width": 200
"collapsed": true
}, },
"left-ribbon": { "left-ribbon": {
"hiddenItems": { "hiddenItems": {
@ -214,61 +216,61 @@
"omnisearch:Omnisearch": false "omnisearch:Omnisearch": false
} }
}, },
"active": "3dbe2cc922c4bee2", "active": "5e5f715713d29cb8",
"lastOpenFiles": [ "lastOpenFiles": [
"Pasted image 20250113151159.png", "Operating Systems/Mass Storage.md",
"Extracurricular/Misc/Ideas.md", "Extracurricular/Plag/Untitled.canvas",
"Statistics and Probability/Support Lecture.md", "Extracurricular/Plag/AI Checker.md",
"Functional Programming/Drawing 2024-12-24 17.52.22.excalidraw.md", "Extracurricular/Plag",
"Extracurricular/satQuest/Meeting Dec 18.md", "Extracurricular/AI Checker.md",
"Extracurricular/satQuest/img/Pasted image 20241218122110.png", "Operating Systems/Memory Management.md",
"Excalidraw/Drawing 2024-12-11 23.27.51.excalidraw.md", "Operating Systems/File Systems Management.md",
"Discrete Structures/Midterm/attempt 2.md", "Operating Systems/Virtual Memory.md",
"Discrete Structures/Recurrence relations.md", "Operating Systems/Virtualization.md",
"Discrete Structures/Midterm/attempt 1.md", "Operating Systems/assets/Pasted image 20250505205120.png",
"Discrete Structures/Counting.md", "Operating Systems/assets/Pasted image 20250505203114.png",
"Discrete Structures/Midterm/Untitled.md", "Operating Systems/assets/Pasted image 20250505202532.png",
"Discrete Structures/Midterm/Midterm prep.md", "Operating Systems/assets/Pasted image 20250505201950.png",
"Discrete Structures/Midterm", "Operating Systems/assets/Pasted image 20250505201859.png",
"Extracurricular/satQuest/img/Pasted image 20241206134156.png", "Operating Systems/Input Output.md",
"Extracurricular/satQuest/Parts Proposal.md", "Operating Systems/Inter-Process Communication.md",
"Untitled.md", "README.md",
"Operating Systems/assets/Pasted image 20250505195901.png",
"Operating Systems/assets/Pasted image 20250505201102.png",
"Operating Systems/assets/Pasted image 20250505200548.png",
"Operating Systems/assets/Pasted image 20250505200028.png",
"Operating Systems/assets/Pasted image 20250505194426.png",
"Operating Systems/Processes and Threads.md",
"Operating Systems/Scheduling.md",
"Operating Systems/Overview.md",
"Untitled.canvas", "Untitled.canvas",
"Discrete Structures/Midterm/attempt 2.md",
"Discrete Structures/Mathematical Data Structures.md", "Discrete Structures/Mathematical Data Structures.md",
"Discrete Structures/Relations and Digraphs.md", "unicef.org.md",
"Discrete Structures/Mathematical Proofs (Induction).md",
"Advanced Algorithms/Graphs.md",
"Advanced Algorithms/P vs. NP.md",
"Advanced Algorithms/Pasted image 20241203234600.png",
"Excalidraw",
"Extracurricular/satQuest/Initial Meeting.md",
"Extracurricular/satQuest/img/Pasted image 20241206134213.png",
"Extracurricular/satQuest/img/Pasted image 20241206134207.png",
"Extracurricular/satQuest/img/Pasted image 20241206133007.png",
"Extracurricular/satQuest/img",
"Advanced Algorithms/Recurrence relations.md",
"Advanced Algorithms/Graph Algorithms.md",
"Linear Algebra/Matrices.md", "Linear Algebra/Matrices.md",
"Advanced Programming/Intro.md", "Languages & Machines/Regular languages.md",
"Advanced Programming/Annotation Repository.md", "Extracurricular/Circuitree/Shitter Zero/Timeline.md",
"Advanced Programming/projects/API Design Research.md", "Extracurricular/Circuitree/Shitter Zero",
"Advanced Algorithms/assets/pnp/Pasted image 20241203234013.png", "Discrete Structures/Mathematical Proofs (Induction).md",
"Advanced Algorithms/assets/pnp/Pasted image 20241203234032.png", "Discrete Structures/Recurrence relations.md",
"Advanced Algorithms/assets/graph/1_WR4AtjT_nhwSOtAW99Yd5g.gif", "Discrete Structures/Relations and Digraphs.md",
"Advanced Algorithms/assets/pnp/Pasted image 20241203233926.png", "Discrete Structures/Counting.md",
"Advanced Algorithms/assets/pnp", "Software Engineering/Meeting.md",
"Advanced Algorithms/assets/graph", "Software Engineering/Reqirements.md",
"Advanced Algorithms/practicals", "Languages & Machines/assets",
"Statistics and Probability/R", "Languages & Machines",
"Discrete Structures/img", "Extracurricular/Misc/Proposed Routine Plan.canvas",
"Algorithmic Programming Contests", "Extracurricular/Circuitree/Antenna Building/Untitled",
"Functional Programming/assets", "Extracurricular/Circuitree/Antenna Building",
"Software Engineering",
"Operating Systems/assets",
"Operating Systems",
"Introduction to Machine Learning/assets",
"Web Engineering/canvae/server_client.canvas", "Web Engineering/canvae/server_client.canvas",
"Advanced Programming/projects/second/Refactoring.canvas", "Advanced Programming/projects/second/Refactoring.canvas",
"Advanced Programming/assets/assignment/assignment_organization.canvas", "Advanced Programming/assets/assignment/assignment_organization.canvas",
"Advanced Programming/assets/spring/Beans.canvas", "Advanced Programming/assets/spring/Beans.canvas",
"Advanced Programming/assets/assignment/assignment_app.canvas", "Advanced Programming/assets/assignment/assignment_app.canvas",
"Extracurricular/Misc/Proposed Routine Plan.canvas",
"Extracurricular/Circuitree/Committee Market/discussion/Proposed showcase infra.canvas" "Extracurricular/Circuitree/Committee Market/discussion/Proposed showcase infra.canvas"
] ]
} }

View File

@ -89,6 +89,8 @@ To prove $P$:
## Mathematical Induction ## Mathematical Induction
[^2] [^2]
Generalized in [Proofs (FP)](Proofs.md)
![induction](induction.png) ![induction](induction.png)

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,18 @@
```mermaid
sequenceDiagram
Prototype ->> Order: Meeting with everyone
Order ->> Prepare: Not everyone has to be present
```
## Next week
- Early, need to organize a meeting to build the antenna
- Purchase the materials right after
- Schedule the event
## All times
- Create slides

View File

@ -0,0 +1,94 @@
---
theme: beige
highlightTheme: css/vs2015.css
---
<div style="width:100%; transform:scale(1.1)">
```mermaid
sequenceDiagram
Prototyping ->> Order: We need to come up with a working prototype by next week
Order ->> Code: ITM - decide the scope (more or less)
Order ->> Design: Case? No case?
Design ->> Presentation: Slides
```
</div>
---
## Heads up!
we got two fucking weeks
---
## Features
| Part | Function |
| ------------------------------------------ | -------------- |
| NFC/RFID transceiver | Copying cards |
| 433 MHz transceiver | Replay attacks |
| HID (RP2040 and **ESP32-C3** support this) | Rubber ducky |
==NOTE THAT ESP32 BASIC DOESN'T==
---
### Anything else come to mind?<sup>*</sup>
<sub>* Keep in mind that we have 2 fucking weeks</sub>
---
### RP2040
- We can reuse the macro pad schematic!
- Seems like a little bit of an advanced project for it, might be slow
### ESP32
- We can do network stuff!
- Doesn't seem much more difficult than the RP2040.
---
## Design
- Screen (we got 50)
- MCU
- Antenna (used by both the NFC and 433Mhz tranceivers)
- The transceivers
Terminated by a male USB-A
### Should we include a case?
This question is mostly for Mihai as it involves him designing it.
---
<div style="width:100%;">
<img src="shitter.png" />
</div>
---
## Code
Let's discuss a potential scope for the project!
- Do we **only** provide bindings for the sensors?
- Will the attendees be building anything? If yes, **what**?
- C? Micropython?
---
## Let's distribute!
If we want to achieve *anything* given the short timeframe[^1], we're gonna need to copy the GAPC model.
**GitHub issues!**
<small> 1 (CircuitRee trademarked statement) </small>
---
# We got this!

Binary file not shown.

After

Width:  |  Height:  |  Size: 246 KiB

View File

@ -1,7 +0,0 @@
## Prelims
No fancy shit
## BAPC

View File

@ -1,3 +0,0 @@
### Tasks

View File

@ -1,2 +1,5 @@
1. Anti-AI extension -> Data -> Bachelor's thesis 1. Anti-AI extension -> Data -> Bachelor's thesis
2. Temmies calendar integration (background ical service) 2. Writing (come on dude, start already)
3. Temmies calendar integration (background ical service)
4. o.pm bangle.js reboot: Backend in Rust, frontend grafana?
5. Markdown parser in Haskell

View File

@ -1,38 +1,283 @@
{ {
"nodes": [ "nodes": [
{"id":"163ca037f71a0b6f","type":"group","x":-320,"y":115,"width":838,"height":865,"color":"4","label":"Health"}, {
{"id":"07a053d6dd1d68a0","type":"group","x":640,"y":334,"width":596,"height":427,"color":"6","label":"Productivity"}, "id": "163ca037f71a0b6f",
{"id":"5159e3993f95efcb","type":"text","text":"Avoid bad habits (3)","x":-138,"y":135,"width":183,"height":60}, "type": "group",
{"id":"3b1083b1e372d498","type":"text","text":"Reading (4, 7)","x":42,"y":417,"width":170,"height":60}, "styleAttributes": {},
{"id":"f897f4ba690283db","type":"text","text":"Sleep Schedule Improvement (1)","x":-189,"y":600,"width":295,"height":50}, "x": -320,
{"id":"3aa369dab5e52be1","type":"text","text":"Better Social (9)","x":-215,"y":900,"width":186,"height":60}, "y": 115,
{"id":"8dbfb266e9ae4898","type":"text","text":"Physical health routine (2) becomes manageable ","x":-7,"y":900,"width":263,"height":60}, "width": 838,
{"id":"1a3aafd43063deaf","type":"text","text":"Schedule better","x":-129,"y":740,"width":176,"height":60}, "height": 865,
{"id":"c53e69212bf4751a","type":"text","text":"Eating better (8)","x":287,"y":800,"width":181,"height":60}, "color": "4",
{"id":"2db72cbff0c7ee4d","type":"text","text":"Better communication and reliability","x":101,"y":711,"width":222,"height":60}, "label": "Health"
{"id":"a07ffd84eb97e076","type":"text","text":"Good habits","x":106,"y":264,"width":150,"height":60}, },
{"id":"6dc127fe4098cce8","type":"text","text":"Enjoy hobbies during day (5)","x":256,"y":417,"width":242,"height":60}, {
{"id":"0bc6527818df845c","type":"text","text":"Sticking to schedule (6)","x":660,"y":500,"width":250,"height":60}, "id": "07a053d6dd1d68a0",
{"id":"2b76b4366e7d7447","type":"text","text":"Consistency in terms of Uni","x":713,"y":354,"width":280,"height":60}, "type": "group",
{"id":"7b69dd32a9ff908b","type":"text","text":"Using the same [[Plan#Proven studying tactics | Study tactics]]","x":933,"y":500,"width":283,"height":60}, "styleAttributes": {},
{"id":"37abaca3fa89fb9b","type":"text","text":"Better mental and productivity","x":799,"y":681,"width":294,"height":60} "x": 640,
"y": 334,
"width": 596,
"height": 427,
"color": "6",
"label": "Productivity"
},
{
"id": "37abaca3fa89fb9b",
"type": "text",
"text": "Better mental and productivity",
"styleAttributes": {},
"x": 799,
"y": 681,
"width": 294,
"height": 60
},
{
"id": "6dc127fe4098cce8",
"type": "text",
"text": "Enjoy hobbies during day (5)",
"styleAttributes": {},
"x": 256,
"y": 417,
"width": 242,
"height": 60
},
{
"id": "0bc6527818df845c",
"type": "text",
"text": "Sticking to schedule (6)",
"styleAttributes": {},
"x": 660,
"y": 500,
"width": 250,
"height": 60
},
{
"id": "5159e3993f95efcb",
"type": "text",
"text": "Avoid bad habits (3)",
"styleAttributes": {},
"x": -138,
"y": 135,
"width": 183,
"height": 60
},
{
"id": "3b1083b1e372d498",
"type": "text",
"text": "Reading (4, 7)",
"styleAttributes": {},
"x": 42,
"y": 417,
"width": 170,
"height": 60
},
{
"id": "f897f4ba690283db",
"type": "text",
"text": "Sleep Schedule Improvement (1)",
"styleAttributes": {},
"x": -189,
"y": 600,
"width": 295,
"height": 50
},
{
"id": "2db72cbff0c7ee4d",
"type": "text",
"text": "Better communication and reliability",
"styleAttributes": {},
"x": 101,
"y": 711,
"width": 222,
"height": 60
},
{
"id": "a07ffd84eb97e076",
"type": "text",
"text": "Good habits",
"styleAttributes": {},
"x": 106,
"y": 264,
"width": 150,
"height": 60
},
{
"id": "7b69dd32a9ff908b",
"type": "text",
"text": "Using the same [[Plan#Proven studying tactics | Study tactics]]",
"styleAttributes": {},
"x": 933,
"y": 500,
"width": 283,
"height": 60
},
{
"id": "3aa369dab5e52be1",
"type": "text",
"text": "Better Social (9)",
"styleAttributes": {},
"x": -215,
"y": 900,
"width": 186,
"height": 60
},
{
"id": "8dbfb266e9ae4898",
"type": "text",
"text": "Physical health routine (2) becomes manageable ",
"styleAttributes": {},
"x": -7,
"y": 900,
"width": 263,
"height": 60
},
{
"id": "1a3aafd43063deaf",
"type": "text",
"text": "Schedule better",
"styleAttributes": {},
"x": -129,
"y": 740,
"width": 176,
"height": 60
},
{
"id": "c53e69212bf4751a",
"type": "text",
"text": "Eating better (8)",
"styleAttributes": {},
"x": 287,
"y": 800,
"width": 181,
"height": 60
},
{
"id": "2b76b4366e7d7447",
"type": "text",
"text": "Consistency in terms of Uni",
"styleAttributes": {},
"x": 713,
"y": 354,
"width": 280,
"height": 60
}
], ],
"edges": [ "edges": [
{"id":"e7314215770b1b5a","fromNode":"5159e3993f95efcb","fromSide":"bottom","toNode":"a07ffd84eb97e076","toSide":"top","label":"Replace with"}, {
{"id":"ea778f6b684828c5","fromNode":"a07ffd84eb97e076","fromSide":"bottom","toNode":"3b1083b1e372d498","toSide":"top"}, "id": "e7314215770b1b5a",
{"id":"3d552b06f8e838d2","fromNode":"a07ffd84eb97e076","fromSide":"bottom","toNode":"6dc127fe4098cce8","toSide":"top"}, "fromNode": "5159e3993f95efcb",
{"id":"ab96f7d33eb891ce","fromNode":"3b1083b1e372d498","fromSide":"bottom","toNode":"f897f4ba690283db","toSide":"right"}, "fromSide": "bottom",
{"id":"c0ad3200c4953eec","fromNode":"6dc127fe4098cce8","fromSide":"bottom","toNode":"f897f4ba690283db","toSide":"right"}, "toNode": "a07ffd84eb97e076",
{"id":"e5b241cb68304667","fromNode":"f897f4ba690283db","fromSide":"bottom","toNode":"1a3aafd43063deaf","toSide":"top"}, "toSide": "top",
{"id":"b9c17ff043c9c20c","fromNode":"1a3aafd43063deaf","fromSide":"bottom","toNode":"3aa369dab5e52be1","toSide":"top"}, "label": "Replace with"
{"id":"bb5bfaec52770979","fromNode":"1a3aafd43063deaf","fromSide":"bottom","toNode":"8dbfb266e9ae4898","toSide":"top"}, },
{"id":"abbd6f42e11801dd","fromNode":"f897f4ba690283db","fromSide":"left","toNode":"5159e3993f95efcb","toSide":"left","label":"Feeds into"}, {
{"id":"a54109b27e452e8c","fromNode":"c53e69212bf4751a","fromSide":"bottom","toNode":"8dbfb266e9ae4898","toSide":"right"}, "id": "ea778f6b684828c5",
{"id":"14046f7578cefaf8","fromNode":"2b76b4366e7d7447","fromSide":"bottom","toNode":"0bc6527818df845c","toSide":"top"}, "fromNode": "a07ffd84eb97e076",
{"id":"f3acc398f229e47b","fromNode":"2b76b4366e7d7447","fromSide":"bottom","toNode":"7b69dd32a9ff908b","toSide":"top"}, "fromSide": "bottom",
{"id":"cf8880dfe4e23cf4","fromNode":"0bc6527818df845c","fromSide":"bottom","toNode":"37abaca3fa89fb9b","toSide":"top"}, "toNode": "3b1083b1e372d498",
{"id":"74f1bc2742e8f761","fromNode":"7b69dd32a9ff908b","fromSide":"bottom","toNode":"37abaca3fa89fb9b","toSide":"top"}, "toSide": "top"
{"id":"73a16c85641dc4ff","fromNode":"163ca037f71a0b6f","fromSide":"right","toNode":"07a053d6dd1d68a0","toSide":"left"}, },
{"id":"a5d14c192499b2f9","fromNode":"1a3aafd43063deaf","fromSide":"right","toNode":"2db72cbff0c7ee4d","toSide":"left"} {
] "id": "3d552b06f8e838d2",
"fromNode": "a07ffd84eb97e076",
"fromSide": "bottom",
"toNode": "6dc127fe4098cce8",
"toSide": "top"
},
{
"id": "ab96f7d33eb891ce",
"fromNode": "3b1083b1e372d498",
"fromSide": "bottom",
"toNode": "f897f4ba690283db",
"toSide": "right"
},
{
"id": "c0ad3200c4953eec",
"fromNode": "6dc127fe4098cce8",
"fromSide": "bottom",
"toNode": "f897f4ba690283db",
"toSide": "right"
},
{
"id": "e5b241cb68304667",
"fromNode": "f897f4ba690283db",
"fromSide": "bottom",
"toNode": "1a3aafd43063deaf",
"toSide": "top"
},
{
"id": "b9c17ff043c9c20c",
"fromNode": "1a3aafd43063deaf",
"fromSide": "bottom",
"toNode": "3aa369dab5e52be1",
"toSide": "top"
},
{
"id": "bb5bfaec52770979",
"fromNode": "1a3aafd43063deaf",
"fromSide": "bottom",
"toNode": "8dbfb266e9ae4898",
"toSide": "top"
},
{
"id": "abbd6f42e11801dd",
"fromNode": "f897f4ba690283db",
"fromSide": "left",
"toNode": "5159e3993f95efcb",
"toSide": "left",
"label": "Feeds into"
},
{
"id": "a54109b27e452e8c",
"fromNode": "c53e69212bf4751a",
"fromSide": "bottom",
"toNode": "8dbfb266e9ae4898",
"toSide": "right"
},
{
"id": "14046f7578cefaf8",
"fromNode": "2b76b4366e7d7447",
"fromSide": "bottom",
"toNode": "0bc6527818df845c",
"toSide": "top"
},
{
"id": "f3acc398f229e47b",
"fromNode": "2b76b4366e7d7447",
"fromSide": "bottom",
"toNode": "7b69dd32a9ff908b",
"toSide": "top"
},
{
"id": "cf8880dfe4e23cf4",
"fromNode": "0bc6527818df845c",
"fromSide": "bottom",
"toNode": "37abaca3fa89fb9b",
"toSide": "top"
},
{
"id": "74f1bc2742e8f761",
"fromNode": "7b69dd32a9ff908b",
"fromSide": "bottom",
"toNode": "37abaca3fa89fb9b",
"toSide": "top"
},
{
"id": "73a16c85641dc4ff",
"fromNode": "163ca037f71a0b6f",
"fromSide": "right",
"toNode": "07a053d6dd1d68a0",
"toSide": "left"
},
{
"id": "a5d14c192499b2f9",
"fromNode": "1a3aafd43063deaf",
"fromSide": "right",
"toNode": "2db72cbff0c7ee4d",
"toSide": "left"
}
],
"metadata": {}
} }

View File

File diff suppressed because it is too large Load Diff

View File

@ -1,595 +0,0 @@
---
excalidraw-plugin: parsed
tags: [excalidraw]
---
==⚠ Switch to EXCALIDRAW VIEW in the MORE OPTIONS menu of this document. ⚠== You can decompress Drawing data with the command palette: 'Decompress current Excalidraw file'. For more info check in plugin settings under 'Saving'
# Excalidraw Data
## Text Elements
%%
## Drawing
```compressed-json
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
```
%%

View File

@ -0,0 +1,50 @@
```haskell
add :: (Int -> Int) -> Int
add x y = x+y
instance Eq Bool where
True == True = True
False == False = True
_ == _ = False
instance (Eq a, Eq b) => Eq (a, b) where
(x1, y1) == (x2, y2) = x1 == x2 && y1 == y2
-- A value that exists
myValue :: Maybe Int
myValue = Just 42
-- A value that doesn't exist
noValue :: Maybe Int
noValue = Nothing
```
```python
class Number:
# Some implementation
class Float(Number):
# Some implentation
class Integer(Number):
# Some implementation
def add(numA:Number, numB:Number) -> Number:
```
```python
class MyClass:
def __eq__(self):
# MyClass :: Eq
def __str__(self)
# MyClass :: Show
def __
```

View File

@ -0,0 +1,81 @@
---
title: Understanding Induction
abstract: I am fucking stupid and I can't understand this
author:
type: theoretical
---
## Understanding Induction
There are a few assumptions to be made when performing induction proofs (in general):
- There is *some* non-decreasing property about the category we're observing (i.e. difference between elements in a sequence, length of a list, height of a tree)
- The structure needs to be *well-defined*[^1]
And then we move on to the mechanism for proofs itself:
1. Induction Base Case: The base case(s) must be **sufficient** to cover all minimal or simplest cases of the structure.
For instance, when proving properties of lists, we often start by showing the property holds for the empty list.
2. Inductive Hypothesis: We assume that the property we're trying to prove holds for an arbitrary case. It must explicitly account for all necessary assumptions about the intermediate state of the structure.
3. Inductive Step: To establish the general inductive step, we should demonstrate that if the property holds for a given category (the induction hypothesis), it also holds for the next element (based on the non-decreasing property mentioned earlier).
We should be able to guarantee termination and avoid ambiguity in the process.
## Induction in Haskell
Given Haskell's [purity](Introduction%20to%20Functional%20Programming.md), we can perform induction proofs on most of its structure.
The non-decreasing property is defined by the data structure (`data` keyword) and/or the logic we have implemented (i.e. natural numbers - n > n-1 > 0, lists -> length, tree -> height).
We then proceed with the process mentioned above, although slightly altered as to fit the data structure category:
- **BC**: We must first establish a base case, which is a minimal instance of the structure that satisfies the property being proven. For example, this could be an empty list, a single element, or a tree with only one node. The base case must be simple enough to verify directly.
- **IH**: Assume that the property holds for some arbitrary but fixed instance of the structure. This is often referred to as the **induction step assumption**, where you posit[^2] that the property is valid for a smaller or simpler instance of the structure.
- **IS**: Using the inductive hypothesis, prove that the property holds for a larger or more complex instance of the structure.
For example, if the property holds for a list of length $n$, you need to show it holds for a list of length $n+1$. Similarly, for a tree of height $h$, show it holds for a tree of height $h+1$. This step bridges the smaller case to the larger one.
For example, when proving that reversing twice returns the original list, we can use mathematical induction:
1. **Base Case**: We need to show the property holds for the empty list (`[]`). Here, it's clear that `reverseList [] = []` and `reverseList (reverseList [])` is also `[]` since `reverseList` appends elements to the left `(++)`, and an empty list cannot be appended to anything.
2. **Inductive Step**: Suppose the property holds for a given non-empty list `x:xs` (induction hypothesis). To prove it holds for the longer list xs (`x:xs`), we apply `reverseList` and use the defined function properties as follows:
```haskell
-- Induction Hypothesis (property holds for xs)
prop_reverseTwice xs =>
-- Show that property also holds for x:xs (inductive step)
prop_reverseTwice (reverseList x:xs) =
-- Break down the list using reverseList and pattern matching
prop_reverseTwice ((reverseList xs) ++ [x]) =
-- Use the definition of concatenation, reverse, and the induction hypothesis
prop_reverseTwice (xs ++ reverseList [] ++ [x]) =
-- Use the fact that concatenating an empty list with any other list returns the original list.
prop_reverseTwice (xs ++ [x]) =
-- The property holds for xs by our induction hypothesis
True
```
By showing the base case and inductive step, we have successfully proven that `reverseList` reverses lists twice, returning the original list.
### TL;DR
1. Base case - empty list or tree
2. Inductive hypothesis - assume it works for an arbitrary list `xs` or tree (i.e.)
```haskell
data Tree a = Empty -- A tree can be empty
| Node a (Tree a) (Tree a) -- Or a node with a value and two
deriving (Show, Eq)
-- when a Tree a is Empty
```
3. Inductive Step - show that it works for a larger list `x:xs` or a non-empty tree
This process involves knowing *some* implementation details of higher-order functions (or at least a vague idea as to how they work).
[^1]: Clear rules as to how it's constructed
[^2]: to propose as an explanation **:** [suggest](https://www.merriam-webster.com/dictionary/suggest)

View File

@ -0,0 +1,220 @@
---
type: theoretical
---
## We're gonna be doing
- General intro
- Unsupervised learning
- Supervised learning
### Philosophical Introduction
- What is intelligence?
- Can machines **ever** be intelligent?
### Intelligent systems
a system that can:
- Perceive
Interaction with the environment. e.g. computer vision, speech recognition
- Make decisions
process incoming information, analyze it, and make decisions based on it.
e.g. self-driving cars, game playing
- Learn
improve performance over time, i.e. data driven adaptation based on observations *only* (for unsupervised learning) or based on observations and feedback (for supervised learning)
## Relevant Mathematical Notation
Models are noted as $m = \gamma (D)$, where $D$ is the data and $\gamma$ is the model.
Example - a model that predicts the price of a house based on its size and location:
$m = \gamma ( \beta_0 + \beta_1 x_1 + \beta_2 x_2)$
where $x_1$ is the size of the house and $x_2$ is the location of the house.
## Unsupervised learning
- Compression
Represent all the data in a more compact form (few features)
- Clustering
Identify groups of similar data points
- Reduction
Reduce the dimensionality of the data, i.e. represent large amount of data by few prototypes[^1]
The above aims define a **cost function** or optimization strategy, which is used to teach the machine to learn, but thee is no feedback from the environment. (hence **un**supervised learning).
Example:
Consider a dataset of images of cats and dogs. We can use unsupervised learning to identify the features that are common to all cats and all dogs. This can be used to classify new images of cats and dogs.
## Supervised learning
*Classification/Regression*
Data: observations, e.g. images, text, etc. and labels, e.g. cat/dog, spam/not spam, etc.
Regression problems:
- Predict quantitative values, e.g. house prices, stock prices, etc.
e.g. predict the weight of a cow based on its size:
$m = \gamma ( \beta_0 + \beta_1 x_1)$
where $x_1$ is the size of the cow.
Classification problems:
- Predict qualitative values, e.g. cat/dog, spam/not spam, etc.
- Binary classification: two classes
- Multi-class classification: more than two classes
> [!IMPORTANT]
> It is crucial to find the right features to represent the data. The model is only as good as the features used to represent the data.
### Some issues
- Complexity of the model
- Parametrization[^2] of a hypothesis
- Noise in the dataset
## Other forms of learning
- Semi-supervised learning, self-supervised learning
Partially labeled data, e.g. some images are labeled, some are not. Extend by making predictions on the unlabeled data and using the predictions to improve the model.
- Reinforcement learning
Delayed reward (feedback) from the environment. e.g. game playing, robotics, etc.
- Transfer learning, few-shot learning, single-shot learning
Use knowledge from one task to improve performance on another task. e.g. use knowledge from a large dataset to improve performance on a smaller dataset.
## Deeper look of reinforcement learning
There's a reward signal evaluating the outcome of past actions.
Problems involving an agent[^3], an environment, and a reward signal.
The goal is to learn a policy that maximizes the reward signal.
```mermaid
graph TD
A[Agent] --> B[Environment]
B --> C[Reward signal]
C --> A
```
### Mathematical Formulation
[Markov Decision Process](https://en.wikipedia.org/wiki/Markov_decision_process)[^5] (MDP) is a mathematical framework for modeling decision-making in situations where outcomes are partly random and partly under the control of a decision maker.
An MDP consists of:
- A set of states $S$
- A set of actions $A$
- A reward function $R$
- A transition function $P$
- A discount factor $\gamma$
It can be represented as a tuple $(S, A, R, P, \gamma)$.
Or a graph:
```mermaid
graph TD
A[States] --> B[Actions]
B --> C[Reward function]
C --> D[Transition function]
D --> E[Discount factor]
```
The process itself can be represented as a sequence of states, actions, and rewards:
$(s_0, a_0, r_0, s_1, a_1, r_1, s_2, a_2, r_2, \ldots)$
The goal is to learn a policy $\pi$ that maps states to actions, i.e. $\pi(s) = a$.
The policy can be deterministic or stochastic[^4].
1. At time step $t=0$, the agent observes the current state $s_0$.
2. For $t=0$ until end:
- The agent selects an action $a_t$ based on the policy $\pi$.
- Environment grants reward $r_t$ and transitions to the next state $s_{t+1}$.
- Agent updates its policy based on the reward and the next state.
To summarize:
$$
G_t = \Sigma_{t\geq 0}y^t r_t = r_t + \gamma r_{t+1} + \gamma^2 r_{t+2} + \ldots
$$
where $G_t$ is the return at time step $t$, $r_t$ is the reward at time step $t$, and $\gamma$ is the discount factor.
## The value function
The value function $V(s)$ is the expected return starting from state $s$ and following policy $\pi$.
$$
V_\pi(s) = \mathbb{E}_\pi(G_t | s_t = s)
$$
Similarly, the action-value function $Q(s, a)$ is the expected return starting from state $s$, taking action $a$, and following policy $\pi$.
$$
Q_\pi(s, a) = \mathbb{E}_\pi(G_t | s_t = s, a_t = a)
$$
### Bellman equation
Like Richard Bellman from the [Graph Algorithms](Graph%20Algorithms.md).
States that the value of a state is the reward for that state plus the value of the next state.
$$
V_\pi(s) = \mathbb{E}_\pi(r_{t+1} + \gamma V_\pi(s_{t+1}) | s_t = s)
$$
## Q-learning
Something makes me feel like this will be in the exam.
The goal of Q-learning is to find the optimal policy by learning the optimal Q-values for each state-action pair.
What's a Q-value? It's the expected return starting from state $s$, taking action $a$, and following policy $\pi$.
$$
Q^*(s, a) = \max_\pi Q_\pi(s, a)
$$
The optimal Q-value $Q^*(s, a)$ is the maximum Q-value for state $s$ and action $a$. The algorithm iteratively updates the Q-values based on the Bellman equation. This is called **value iteration**.
## Conclusion
As with every other fucking course that deals with graphs in any way shape or form, we have to deal with A FUCK TON of hard-to-read notation <3.
![Comparison](assets/image.png)
[^1]: Prototypes in this context means a representative sample of the data. For example, if we have a dataset of images of cats and dogs, we can represent the dataset by a few images of cats and dogs that are representative of the whole dataset.
[^2]: Parametrization is the process of defining a model in terms of its parameters. For example, in the model $m = \gamma ( \beta_0 + \beta_1 x_1)$, $\beta_0$ and $\beta_1$ are the parameters of the model.
[^3]: An agent is an entity that interacts with the environment. For example, a self-driving car is an agent that interacts with the environment (the road, other cars, etc.) to achieve a goal (e.g. reach a destination).
[^4]: A deterministic policy maps each state to a single action, while a stochastic policy maps each state to a probability distribution over actions. For example, a deterministic policy might map state $s$ to action $a$, while a stochastic policy might map state $s$ to a probability distribution over actions.
[^5]:https://en.wikipedia.org/wiki/Markov_chain

Binary file not shown.

After

Width:  |  Height:  |  Size: 205 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

View File

@ -0,0 +1,55 @@
---
type: theoretical
ty:
---
## The foundations of computation
Looking for answers for basic questions like:
- Computability?
- Power $\leftrightarrow$ Programming constructs?
Which leads us to fundamental concepts like:
- State
- Transitions
- Non-determinism
- Undecideability
## Models
### Finite memory
Finite automata, regexp
![](Pasted%20image%2020250414190100.png)
### Finite memory with stack
Push down automata
![](Pasted%20image%2020250414190119.png)
### Unrestricted
Turing machines
![](Pasted%20image%2020250414190144.png)
## Grammars
![](Pasted%20image%2020250414190229.png)
On a higher level, it seems like grammars and machines are very different, but parsing a language (a set of strings) is quite similar to computation.
## State-based systems and glossary
An FSM can be a specification for OOP.
- States ($q_0,\ldots, q_n$)
- Transitions ($a,b,c,\ldots,z$)
- We can interpret the transitions as class methods and specify the sequences of allowed invocations - **typestate**
## Notation
- $x \in X, X\subseteq Y$
- $\forall x \in X: P(x), \exists x \in X: P(x)$
- $R \subseteq X \times Y$ is a relation between $X$ and $Y$
- $xRy \equiv (x,y) \in R$
- $G = (V, E)$, where $E \subseteq V\times V$ is a directed graph
Part of [Relations and Digraphs](Relations%20and%20Digraphs.md)

View File

@ -0,0 +1,61 @@
---
type: math
---
## Induction
Similar (if not the same) to:
- [Mathematical Proofs (Induction)](Mathematical%20Proofs%20(Induction).md)
- [Structural Proofs](Proofs.md)
- Base case $0\in \mathbb{N}$
- Inductive step - if $n\in \mathbb{N} \implies n+1\in \mathbb{N}$
- We allow a finite number of steps
I.e.
Given $f (n) = n(n + 1)$ for all $n\in N$, then $f (n)$ is even.
**Base case:** $f(0) = 0\times 1 = 0$, which is even
**I.S.:**
$$
f(n+1) = (n+1)(n+2)= n(n+1)+2(n+1) = f(n) + 2(n+1) \blacksquare
$$
## Strings and Languages
Literally the same as [Mathematical Data Structures](Mathematical%20Data%20Structures.md), but on strings
How to define the reversal of a string, inductively?
Let $w$ be a finite string. We define $w^R$ by induction on $|w|$:
**B.C.:**
$|w| = 0$, then, trivially, $w = \epsilon \therefore w^R = \epsilon$
**I.S.:**
$|w| = n \geq 1$, so $w = u a$ with $|u| = n-1$,
## Operations on strings
- Concatenation (associative)
- Substring, prefix, suffix
- Replication (exponentiation): a string concatenated with itself
- Reversal ($u^R$)
## Operations on languages
- Lifting operations on strings to languages
- Concatenation of languages
- Kleene star - $V^*$ -> smallest superset[^1] of V that contains the empty string and is closed under concatenation, i.e. one or more repetitions
- Reversal
## Regular sets / languages
This used to be in DS, but I don't have it in this repo.
Recursively defined over an alphabet $\Sigma$ from
- $\emptyset$
- $\{\epsilon\}$
- $\{a\} | \forall a \in \Sigma$
Regex is a notatio nto denote regular languages, i.e.:
[^1]: The opposite of a subset - a set which contains all elements of another (and possibly more)

View File

Before

Width:  |  Height:  |  Size: 7.5 KiB

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 225 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 95 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 894 KiB

View File

@ -0,0 +1,341 @@
---
type: theoretical
backlinks:
- "[[Memory Management]]"
---
A file system consists of two parts
- Collection of files
- A directory structure -> provides information about all files in the system
## File
- Logical view -> the unit of storing data
Files are mapped by the OS onto physical nonvolatile devices
**Types:**
- Data
- Numeric
- Character
- Binary
- Program
**Attributes**:
- Name
- Identifier (unique number)
- Type[^2]
- Location -> pointer
- Size
- Protection (permissions)
- Datetime and user id
All of these are stored in **i-nodes**.
### INodes
- Size in biytes
- Access permissions
- Type
- Creation and last access datetime
- Owner ID
- Group ID
- Hard link count
### Logical Definition
- Named collection of related information
- Files may have free form (text files) or can be rigidly formatted[^1]
### Operations
- Create
- Write
- Read
- Seek (reposition within file)
- Delete
- Truncate - shorten or cut off by removing data from the end
- Open (load to memory)
- Close (unload)
### Open files
Tracked by an **open-file table**, counted by **file-open count**.
In order to [avoid race conditions](Inter-Process%20Communication.md#Avoiding%20race%20conditions), we need to lock the files somehow.
- **Shared lock** -> several processes can acquire concurrently, used for reads
- **Exclusive lock** -> writer lock
- Mandatory vs. advisory -> access is denied depending on locks held and requested vs. processes can find status of locks and decide what to do
### Structure
Could be many:
- None
- Simple record
- Lines
- Fixed length
- Variable length
- Complex
- Formatted document
- Relocatable load file [^3]
## Directories
Collection of nodes containing information about all files. Also resides on disk.
**Operations**:
- Search for a file
- Create a file
- Delete a file
- List a directory
- Rename a file
- Traverse file system
### Single level directory
A single directory for all users.
Clearly, we need unique names, which can become a problem real fast. That shit is gonna grow super big.
### Two-level directory
Users have different directories. In Linux -> `/home/user` is separate, allowing for the same file names. Linux, however, uses a multi-level:
### Tree-Structured Directories
- Efficient searching
- Grouping
- Absolute v. relative path
### Acyclic-Graph
Have shared subdirectories and files. Symlinks achieve this.
### Structure
In Linux, it is a table (a file) which stores:
- File name
- Inode
## Symlinks
**Hard** vs **Soft**. Hard is a literal copy of the file but keep the same inode info, while soft is just a pointer.
>[!IMPORTANT]
>We only allow links to files to avoid cycles Every time a new link is added we also use a cycle detection algorithm to determine whether it is OK
## Disk
Can be subdivided into **partitions**.
Disk/partition can be used **raw** (no file system) or can be **formatted**. The entity containing the file system is known as a volume.
> [!NOTE]- Typical fs organization
> ![](Pasted%20image%2020250505144352.png)
### Layout
![](Pasted%20image%2020250505155546.png)
- **Boot block**
- Contains initial bootstrap program to load the OS
- Typically the first sector reads another program from the next few sectors
- **Super block** - state of the file system
- Type -> ext3,ext4,FAT, etc.
- Size -> Number of blocks
- Block size
- Block group information -> number of block groups in file system
- Free block count
- Free inode count
- Inode size
- FS mount info
- Journal info
### Free space management
Unix uses a bitmap to show free disk blocks. Zero=free, one=in use
## Access lists and groups
Read, write and execute.
Three classes of users on Linux
1. Owner -> 7 (Read Write Execute)
2. Group -> 6 (RW)
3. Public -> 1 (X)
## Blocks
The IDs of data blocks are stored in [INodes](File%20Systems%20Management.md#INodes), the IDs of the first 12 blocks are stored in direct reference fields.
![](Pasted%20image%2020250505154746.png)
### Allocation
- Contiguous -> Stored in a single block
- Linked Allocation -> blocks contain a pointer to the next one (slower access)
- Indexed -> Each file has an index block that stores pointers to all its data blocks
### Groups
Subdivision of the entire disk or partition
Has:
- A block bitmap
- An inode bitmap
- An inode table holding the actual inodes
> [!INFO]
> Default block group size in ext4 is 128MB
## Journaling
Ensure the integrity of the file system by keeping track of changes before they are actually applied to the main file system
Phases:
- Write-ahead logging -> before any changes are made to the file system
- Commit -> shit actually happens
- Crash recovery -> we can replay the journal to apply any uncommitted changes
Types:
- Write-Ahead Logging (WAL) -> logs changes before they are applied to the file system
- Metadata journaling -> only metadata is logged. Metadata is restored to a consistent state if crash.
- Full journaling -> both
## Example: EXT4
- Journaling
- Larger file and volume sizes
- Extents -> range of contiguous blocks, reduces fragmentation
- Multiblock allocator -> multiple blocks at once
- `fsck`, optimized file system check
- Pre-allocation
- Checksums -> ensure integrity
## Example: Windows FS
### FAT(32)
File allocation table.
No hard links :C. Directory contains:
- File name -> can be up to 8 characters and extension up to 3
- Attributes (one byte)
![](Pasted%20image%2020250505160518.png)
- File size -> four byte field for filesize in bytes. Max. 4GB
- ID of first block (4 byte)
- File size
Obviously this is trash since it cannot be used with disk of very large capacities. Windows introduced clustering 4,8,16 blocks together.
The table itself is a list of blocks where many links are created and stored. Each entry is 4 bytes. List of empty blocks is also stored.
![](Pasted%20image%2020250505161031.png)
Note the reserved blocks. They contain:
- Boot sector (VBR)
- Bios parameter block
- Bootloader code
- Sector, cluster size, FAT count, root directory location
- FS information Sector (only for FAT32)
- Last allocated cluster for speed
- Backup boot sector
- In case of corruption
#### Free blocks list
Stores a value for each cluster which can indicate:
- `0x00000000` -> Free cluster
- Next cluster number -> Cluster is allocated and points to the next one
- `0xFFFFFFF8` - `0xFFFFFFFF` -> EOF
- `0xFFFFFFF7` -> bad cluster
To find a free block we just need to search for the first available cluster. We keep the last allocated cluster, optimizing search time.
### NTFS
New Technologies File System.
- Everything is a cluster
- Size is a multiple of disk block size
- Journaling
- File data compression
![](Pasted%20image%2020250505161542.png)
- Boot sector (VBR)
- NTFS signature and other boot info
- Location of Master File Table (MFT)
- Sector 0 of partition
- MFT
- Stores metadata for every file and directory
- MFT entry that stores attributes
- name
- size
- timestamps
- security
- MFT itself is described in the MFT lmfao
- File system metadata
- $MFT, $Bitmap , $LogFile, $Secure, etc. store metadata
- System files are treated like regular files
- Data
- Actual file content, either stored in MFT for small entries or in separate clusters (large files)
- Uses extents[^4] and B+ trees[^5]
- Supports encryption
#### MFT entry
Each file or directory is represented by a 1KB entry:
- File name
- Info (timestamps, perms)
- Data location (resident[^6] or not)
- Index
- Attributes
![](Pasted%20image%2020250505162331.png)
##### `$DATA`
- Mft Entry
- If the file contains regular data, the `$DATA` attribute stores the file content or the location
- For files that fit in a single MFT record (1KB usually)
- In-place storage of data (resident)
- For larger files, the `$DATA` attribute contains data runs, which are pointers that tell NTFS where the file's data is located on the disk. Typically a sequence of three values
- offset/ length byte
- Cluster count
- Cluster offset
##### Bitmaps
- Map of logical clusters in use and not. Same as FAT.
##### Compression
Compresses data in 16-cluster chunks.
Size of a compression unit (chunk) depends on cluster size:
- 4 KB cluster size -> 64 KB compression unit (most common on modern volumes)
- 8 KB cluster size -> 128 KB compression unit
If a chunk is not compressible to at least 50%, NTFS stores it uncompressed.
Uses LZNT1, a variation of (LZ77)
##### Journaling
Logs all file system changes in the `$LOGFILE` before applying them.
- It can detect bad sectors and mark them in `$BadClus`
- NTFS can recover a corrupted MFT using `$MFTMirr`
- NTFS uses ACLs to manage permissions
- Each file stores a `$SECURITY_DESCRIPTOR`
### Security descriptors
```
Owner: S-1-5-21-3623811015-3361044348-30300820-1001 (User: Alice)
Group: S-1-5-32-544 (Administrators)
DACL:
Allow: S-1-5-21-3623811015-3361044348-30300820-1001 (Alice) - Full Control
Deny: S-1-5-21-3623811015-3361044348-30300820-1002 (Bob) - Read Access
Allow: S-1-5-18 (Local System) - Full Control
SACL:
Audit: S-1-5-21-3623811015-3361044348-30300820-1003 (Eve) - Log Failed
Access
```
Where DACL = **Discretionary Access Control List** and SACL = **System Access Control List**
---
[^1]: **Columnar**, fixed-format ASCII Files have fixed field lengths, as opposed to **delimited**, i.e. fields can be as large as we want them to
[^2]: Extension (.pdf, .txt) as opposed to format, which specifies the [grammar](Regular%20languages.md) of the file
[^3]: contains information about where to place different parts of the program in memory.
[^4]: contiguous area of storage reserved for a file in a file system, represented as a range of block numbers, or tracks on count key data devices
[^5]: Balanced based on height tree. Nodes can contain multiple keys and pointers. Leaf nodes are the data records, upper nodes only store ketys. Ordered (BST).
[^6]: In the MFT entry straight up.

View File

@ -0,0 +1,125 @@
---
type: theoretical
---
I/O devices can be divided into two categories:
- Block devices -> store information in fixed-size blocks, each one with its own address
- Character devices -> deliver or accepts a stream of characters (no regard to any structure)
- Obviously, it is not addressable
They have components:
- Mechanical -> the thing (sensor blah blah)
- Electronic -> the controller
- Converts serial bit stream to block of bytes
- Perform error detection
- Make available to main memory
## Memory-Mapped I/O
Controllers have a few registers that are used for communcation with the CPU. Writing in these registers, the OS can command the device to perform an action. By reading the registers, it can tell its state.
> [!IMPORTANT]
> In memory-mapped I/O each control register is assigned a unique memory address to which no memory is assigned.
In most systems, the assigned addresses are at or near the top of the address space.
![](Pasted%20image%2020250505192629.png)
### Advantages
- Special I/O instructions are needed to read and write the control registers
- Simple device driver
- With memory-mapped I/O, no special protection mechanism is needed to keep user processes from performing I/O.
- If each device has its control registers on a different page of the address space, the operating system can give a user control over specific devices but not others by simply including the desired pages in its page table.
### Disadvantages
- Caching the page of a device control register would be a problem
- The DCRs are cached => references would just take value from cache (stale data)
- Infinite loop is possible, since the software would never know whether the device is ready
- Single bus -> everyone looks at every address
- One address space, then all memory modules *and* all I/O devices must examine all memory references to see which ones to respond to
![](Pasted%20image%2020250505193602.png)
## DMA
Requesting one byte at a time from an I/O controller wastes the CPUs time. Instead, DMA (Direct Memory Access) is often used
DMA controllers has access to the system bus **independently** of the CPU
Includes registers that can be written and read by the CPU:
- Memory address register
- Byte count register
- One or more control registers to specify the I/O port to use, direction of transfer, transfer unit, number of bytes in one burst
![](Pasted%20image%2020250505194426.png)
### Accessing BUS
- Word-at-a-time -> request the transfer of one word and gets bus, CPU waits (cycle stealing)
- block mode -> acquire the bus, issue a series of transfers and releast. burst mode.
### Accessing memory
We can do main memory -> fly-by mode.
An alternative mode is to have the device controller send the word to DMA controller, which the issues a bus request to write the word.
### Device Internal Buffer
- Read the data into its internal buffer first
- Verify the checksum (error checking) before starting a transfer
- The bits keep arriving at a constant rate, whether the controller is ready for them or not
- DMA transfer to memory is not time critical
> [!IMPORTANT] No DMA
> Not all computers use DMA, CPU is often far faster than the DMA controller and can do the job muuuch faster.
## Interrupts
1. I/O device requests a service, it causes an interrupt, asserting a signal on a bus line assigned to it
2. Signal is detected by the interrupt controller chip
3. If no other interrupts are pending, interrupt controller handles interrupt
- Otherwise, we do priority, with the device sending interrupt signal until its serviced
4. Controller puts a number on the address lines specifying which device wants attention
5. Interrupt causes CPU to stop what it is doing
6. Number on address lines is used as an indexed into a table called the interrupt vector
![](Pasted%20image%2020250505195901.png)
![](Pasted%20image%2020250505200028.png)
### Handling interrupts
- Microprogram or hardware checked to see if there was an interrupt pending.
- Instruction cycle:
- Fethc
- Decode
- Read operands
- Execute
- Store
- Check for interrupts
This can be pipelined
### Precise interrupts
1. PC is saved in a known place
2. All instructions before the one pointed to by the PC have completed
3. No instruction beyond the current one has vfinished
4. Execution state is known
An interrupt that doesn't meet the above requirements is called **imprecise**
![](Pasted%20image%2020250505200548.png)
## Clocks
![](Pasted%20image%2020250505201102.png)
> [!IMPORTANT]
> Watchdog timers **ARE clocks**
## Mass Storage
Secondary storage for modern computers and shit.

View File

@ -0,0 +1,143 @@
---
type: theoretical
backlinks:
- "[[Overview#Multiprogramming]]"
---
## Intro
Processes frequently need to communicate with other
processes.
### Independent
Cannot affect or be affected by other processes.
### Dependent
The opposite
### Why?
- Information sharing
- Computation speedup
- Modularity
- Convenience
## Methods
### Shared memory
```mermaid
block-beta
columns 1
a["Process A"] Shared b["Process B"] ... Kernel
```
Processes/threads exchange information by writing in shared memory variables. This is where [Concurrency](Inter-Process%20Communication.md#Concurrency) becomes an issue.
#### Synchronization
To remedy the race condition issue, we should synchronize shared memory access. In other words, **when a process writes to shared memory, others mustn't be able to**. Multiple read access is allowed though.
### Message passing (queueing)
```mermaid
block-beta
columns 1
a["Process A"] b["Process B"] ... ... Kernel
```
Processes communicate with each other by exchanging messages. A process may send information to a port, from which another process may receive information.
We need to at least be able to `send()` and `receive()`.
## Concurrency
Accessing the same shared memory might at the same time will cause issues. This occurrence is called a **Race Condition**.
> [!IMPORTANT]- When does it occur?
> A race condition occurs when some processes or threads can access (read or write) a shared data variable concurrently and at least one of the accesses is a write access (data manipulation).
The result depends on when context switching[^1] happens.
The part of the program where shared memory is accessed is called the **Critical Section (CS)**.
### Critical Regions/Sections
![|600](Pasted%20image%2020250502174340.png)
### Avoiding race conditions
> [!IMPORTANT]- Conditions
>1. No two processes may be simultaneously inside their critical regions. (Mutual Exclusion)
>2. No assumptions may be made about speeds or the number of CPUs.
>3. No process running outside its critical region may block other processes.
>4. No process should have to wait forever to enter its critical region. (Starvation)
### Locks
A flag which tells us whether the shared memory is currently being written into.
### Mutexes
Mutual exclusion - a type of **lock**, specifically to enforce point 1 in [Avoiding race conditions](Inter-Process%20Communication.md#Avoiding%20race%20conditions) (i.e. enforcing mutual exclusion).
### Semaphores
Can alllow more than one thread to access a resource. Based on amount of permits. Could be a binary one, which is essentially just a lock, otherwise is called a counting semaphore, only allowing as much writes as implemented.
Use a `wait()`
```c
void wait(int *S){
while((*S)<=0); // busy waiting
(*S)--;
}
```
and a `signal()`:
```c
void signal(int *S){
(*S)++;
}
```
Just keep a fucking list of processes currently semaphoring.
#### Producer-Consumer Problem
- The producer produces items and places them in the buffer.
- The consumer removes items from the buffer for processing
We need to ensure that when a producer is placing an item in the buffer, then at the same time consumer should not consume any item. In this problem, the buffer is the **critical section**.
> [!example]- How do we solve this?
> To solve this problem, we need two counting semaphores Full and Empty. “Full” keeps track of some items in the buffer at any given time and “Empty” keeps track of many unoccupied slots.
#### Readers-Writers Problem
* Multiple readers can access the shared data simultaneously without causing any issues because they are only reading and not modifying the data.
* Only one writer can access the shared data at a time to ensure data integrity
We already mentioned this in[Synchronization](Inter-Process%20Communication.md#Synchronization)
> [!example]- How do we solve this?
> Two solutions. We either give priority to readers or writers, but we have to do so consistently. This means that we let read/write happen first until exhaustion.
### Peterson's Algorithm
Where `i` and `j` are separate processes.
1. Two Boolean flags: one for each process (e.g.,`flag[0]` and `flag[1]`). Each flag indicates whether the corresponding process wants to enter the critical section.
2.
```c
flag[i] = true;
turn = j;
while (flag[j] && turn == j) {
// busy wait[^2]
}
```
3. Once the while loop condition fails, process i enters its critical section.
4. After finishing its critical section, process i sets flag[i] to false.
5. Repeat!
## Monitors
A high-level abstraction that provides a convenient and effective mechanism for process synchronization.
It defines procedures (i.e. methods).
> [!WARNING]
> Only one process may be executing any of the monitor's procedures at a time within the monitor at a time
It uses **condition variables** (often with wait and signal[^3]operations) to allow threads to wait for certain conditions to be met before proceeding.
![|600](Pasted%20image%2020250502180811.png)
## Endianness
![](Pasted%20image%2020250505163335.png)
---
[^1]: [Context switching](Processes%20and%20Threads.md#Context%20switching)
[^2]: Process repeatedly checks a condition (usually in a loop) until a desired event or state is reached. Not too different from polling.
[^3]: to the other threads

View File

@ -0,0 +1,38 @@
## Hard disks (HDDs)
Spin platters of magnetically-coated material under moving RW heads
- Rotate at 60 to 250 times/s
- Transfer rate is rate at which data flows between drive and pc
- Positioning time (Random access time) to move disk arm to desired cylinder (seek time) and time for desired sector to rotate under the disk head (rotational latency)
![](Pasted%20image%2020250505201859.png)
### Controller
Receives data/ command from the OS, controls I/O operation and sends back results to OS
![](Pasted%20image%2020250505201950.png)
### I/O steps
- Move head to track -> Seek Time (S)
- Find sector -> Rotational Latency Time (r)
- Transfer data to/from controller -> Block Transfer Time (btt)
- Error checking and report to OS
### Disk Formatting
Each platter must receive a low-level format done by software, i.e. marking the cylinders and tracks, each containing a few sectors, with short gaps in between
Each sector includes:
- Preamble: starts with start of the sector bit pattern, the cylinder and sector numbers
- Data: size of the data portion is determined by the formatting program -> 512 bytes usually
- ECC: error correction, typically 16 bytes
Numbering the sectors
- Position of sector 0 on each track is offset from the previous track when the low-level format is laid down (cylinder skew)
![](Pasted%20image%2020250505202532.png)
![](Pasted%20image%2020250505203114.png)

View File

@ -0,0 +1,158 @@
---
type: theoretical
backlinks:
- "[[Inter-Process Communication]]"
- "[[Overview#Multiprogramming]]"
- "[[Overview#Multitasking/Timesharing]]"
---
![|300](Pasted%20image%2020250502181012.png)
(C.U. - Control Unit, does FDE and communicates with everything like ALU, registers, etc.)
## Single-Programing Operating Systems
Can only run one program lmao. MS-DOS is like that.
## Address Binding
- Depends on availability of memory space
- Addresses of instructions and variables change with memory location (where the program is loaded)
- Source code addresses are usually **symbolic**, while compiled code addresses bind to **relocatable** addresses
- Linker[^1] or loader[^2] will bind relocatable addresses to **absolute** addresses.
This last step is what's called **address binding**
## Binding to memory
Can happen at different "times":
- Compile time
- Load time
- Execution time
## Multi-Programming Operating systems
Introduce some decisions that the OS needs to make:
- Where to load each program
- Protecting the programs
- Optimization
### Protection
Operating system should be protected against unauthorized accesses by user process to its memory space.
We could do this via hardware, where the CPU must check every memory access generated in user mode to be sure it is between base and limit for that user.
## Contiguous memory -> Segmentation :)
The first solution for memory management is segmentation.
- Allocates memory space to each process
- As big as the process
### Fragmentation
- Each process requires a contiguous block
> [!caution] But fragmentation bad!
> It happens when the free space of the main memory is divided up into multiple parts **between** processes. It's pretty clear why that's bad.
![|600](Pasted%20image%2020250502182934.png)
![|600](Pasted%20image%2020250502183002.png)
### Memory Allocation Algorithms
Define which free segment should be allocated to a new process.
#### Best Fit
![|600](Pasted%20image%2020250502183152.png)
#### Worst fit
![|600](Pasted%20image%2020250502183221.png)
#### First fit
![|600](Pasted%20image%2020250502183242.png)
#### Compaction
![|600](Pasted%20image%2020250502183310.png)
>[!warning]- Issues with this
>1. If main memory is large, it can take a long time
>2. Complex
>3. Moving a block while it is being used will cause data loss
## Direct Memory Access (DMA)
In order to let CPU execute process instructions while data is being transferred from disk to memory, direct memory access (DMA) is used.
![|600](Pasted%20image%2020250502183523.png)
## Fix-sized memory blocks
In this scheme, memory is partitioned into blocks of the same size. Every block has the same number of bytes, which makes it easier for the system to keep track of which portions of memory are allocated or available.
>[!IMPORTANT]- What's a block?
> A block refers to one of these fixed-size segments. When a process requests memory, the operating system can allocate one or more blocks to satisfy that request. The fixed size means that each block is predictable in terms of its starting address and size.
We can circumvent the problem using fixed and equal-sized memory blocks.
This, however, introduces another problem - If multiple blocks are allocated to a process, addressing will be a challenge. Which blocks do we address???
>[!example]-
>If an element of an array is at address 2000, the next element may be at another block at a very different address
### Attributes of a block
Each block belongs to one of the memory segments of the program:
- Code
- Data
- Stack
- Heap
For each block, the access permissions can be defined.
>[!question]- What permissions?
> - A block is defined as execute only if it is part of the code segment
> - A block from stack segment has read and write permissions but no execute permission
### Storing block information
For each process, a list of allocated blocks is created. This list shows where each block of the program has been loaded in memory. Also, the permissions are set.
## Paging
Ahaha!
This is a logical follow-up of blocks. What if we have a lot of blocks? Well, we put them in a **page or frame = page frame**.
- The memory is divided into equal-size blocks named page frames
- A page frame has the same size as a page
### Loading
Each page is loaded onto the first available page frame of the main memory.
A page can belong to one segment of the program only ([Attributes of a block](Memory%20Management.md#Attributes%20of%20a%20block)).
### Logical v. Physical addresses
Each page is **numbered**.
- An instruction or a variable is located by its page number and offset inside the page. This is called a **logical address**.
- The actual address (i.e. `20010`) is referred to as a **physical address**.
### Page tables
Yet another box for a box for a box of boxes. This is just a data structure which holds pages.
- Each process has its own page table.
- Threads **share** the page table of the process
- [The process control block - PCB](Processes%20and%20Threads.md#The%20process%20control%20block%20-%20PCB) includes a pointer to the page table.
#### Implementation
Page table is kept in main memory.
Every data/instruction access requires two memory accesses - one for page table and one for the data. This can significantly slow down execution time.
So:
>[!question]- How do we solve this?
>We use Translation Look-Aside Buffers (TLB) - also called memory, which is *another* fucking data structure to hold the boxes of boxes of boxes of boxes.
#### TLBs
- Typically small
- Parallel and fast
- On a miss, value is loaded into the TLB for faster access next time
>[!IMPORTANT] **Effective access time** -- Super-duper important for exam
> - Hit ratio = % hits
> $$ EAT = (\text{hit ratio} \times T_{hit} + ((1 - \text{hit ratio}) \times T_{miss}) $$
> When solving these exercises, first identify the times for TLB hit (including TLB access and memory access) and for a TLB miss (which involves an extra memory access), then calculate the Effective Access Time (EAT) using the weighted average with the hit ratio. Finally, plug in the hit ratio and respective access times into the EAT formula and compute the result.
---
[^1]: That shit makes your program executable. Officially: The linker takes one or more object modules that contain relocatable addresses and combines them into a single executable.
[^2]: The loader is takes the executable and loads it into memory when the program is run.

View File

@ -0,0 +1,198 @@
---
type: theoretical
backlinks:
---
## Operating System
- Manages hardware and software
- Resource allocator
- Manages and routes resources and requests
- Control program
- Prevents errors and improper use
## User v. System
### User
```mermaid
graph TD;
A["user"] <--> B["application programs"]
B <--> C["operating system"]
C <--> D["computer hardware"]
```
### System
An operating system is a control program
## Major OS Components
| Name | Description |
| ------------------------ | -------------------------------------------------- |
| Kernel | Core part of the OS; manages CPU, memory, I/O |
| Process manager | Handles multitasking, scheduling, and execution |
| Memory Manager | Allocates/deallocates RAM, manages virtual memory. |
| File System | Organizes, stores, and secures files. |
| Device Manager | Interfaces with hardware peripherals |
| User Interface (CLI/GUI) | Allows users to interact with the OS |
## Management of resources
### CPU
- A program can do nothing unless its instructions are executed by a CPU
- An executing program becomes a **process**
- The process needs resources
- All processes can potentially be executed concurrently by multiplexing on one CPU core or in parallel across multiple
### Memory
- For a program to be executed, it must be loaded into memory.
- To improve the CPU utilization, several programs are kept in memory.
OS should:
- Know which parts of memory are currently being used and which process is using htem
- Allocate and deallocate memory accordingly
- Decide which processes and data moves in and out of memory
### Cache
- Cache operates at different levels (L1, L2, L3) and is managed primarily by hardware (CPU cache controllers), not the operating system.
- **HOWEVER**, the OS can influence this by
- Managing process scheduling which affects cache locality[^1]
- Optimizing memory access patterns
- Supporting cache-aware algorithms[^2]
### File System
- The operating system abstracts from the physical properties of its storage devices to define a logical storage unit, the file
### Mass Storage
The operating system is responsible for:
- Mounting and unmounting
- Free-space management
- Storage allocation
- Disk scheduling
- Partitioning
- Protection
### I/O
The I/O subsystem consists of several components:
- A memory-management component that includes buffering, caching, and spooling
- A general device-driver interface
- Drivers for specific hardware devices
## User and Operating System Interface
![](Pasted%20image%2020250204103541.png)
## Command Interpreters
Special programs that run when a user first logs on. They read and interpret user commands and execute programs.
On Linux, the command interpreter is called a **shell**. The most common shell is the **Bourne Again Shell (bash)**
## System calls
- System calls are the interface between the user and the operating system
- They are the only way a user program can request a service from the operating system
- They are typically written in a high-level language (C) and are accessed via a library
E.g.
```c
#include <stdio.h>
#include <unistd.h>
int main() {
write(1, "Hello, World!\n", 14); // 1 is the file descriptor for stdout, 14 is the number of bytes to write
return 0;
}
```
![example syscall](assets/image.png)
## APIs in the OS
- APIs are a set of functions that allow the programmer to interact with the OS
- They are typically written in a high-level language (C) and are accessed via a library
- They are used to interact with the OS and its services
i.e. Under the hood, widely used libraries like `stdlib.h` and `stdio.h` are just APIs that interact with the OS
## Performance Optimization
A computer system executes a program by:
- Loading the program into memory
- FDE cycle (Fetch, Decode, Execute)
- Repeat until the program is done
- The OS must manage resources to ensure that the program runs efficiently
### Instruction Types
- CPU-bound: spends most of its time executing instructions
- I/O-bound: spends most of its time waiting for I/O operations to complete
Keyword - **waiting**, hence I/O operations are very slow.
### How do we sped it up?
- Replace slow I/O devices
- Perform I/O operations independently of the CPU
- Multiprogramming/multitasking
#### Spooling
- Simultaneous Peripheral Operations On-Line
- A technique that uses a buffer to hold data for devices that are not currently in use
```mermaid
graph TD;
A["User"] --> B["Spooling"]
B --> C["Printer"]
B --> D["Disk"]
```
#### Multiprogramming
- The OS keeps several jobs in memory simultaneously
- Needed for efficiency
- Single users cannot keep the CPU and I/O devices busy at all times
- Scheduling is key
-
```mermaid
graph TD;
A["User"] --> B["Multiprogramming"]
B --> C["Job 1"]
B --> D["Job 2"]
```
#### Multitasking/Timesharing
- The OS switches between jobs so quickly that it appears as if they are running simultaneously
- If several jobs are ready to run at the same time, the OS must decide which one to run
```mermaid
graph TD;
A["User"] --> B["Multitasking"]
B --> C["Job 1"]
B --> D["Job 2"]
```
---
[^1]: is the tendency of a processor to access the same set of memory locations repetitively over a short period of time
[^2]: https://stackoverflow.com/questions/473137/a-simple-example-of-a-cache-aware-algorithm

View File

@ -0,0 +1,245 @@
---
type: theoretical
backlinks:
- "[[Overview#Multiprogramming]]"
- "[[Overview#Multitasking/Timesharing]]"
---
## Process
A program in execution.
Consists of:
* The program code - **text section**
* Current activity - **PC**, registers
* **Stack** -> Function parameters, return addresses, local variables
* Data section
* **Heap** -> dynamically allocated (at run time) memory
The difference between a process and a program is that the program is the executable file stored on disk, while the process **is running** (shocker).
### Creation
Four events could cause processes to be created
1. System init - Daemons
2. Executing a process by "running a program"
3. A user process request to create a new process
4. Initiation of a batch[^1] job
### `fork()`
A Linux [system call](Overview.md#System%20calls).
```mermaid
graph LR;
A["`fork()`"] --> |parent| B["wait"]
A --> |child|C["`exec()`"]
C --> D["`exit()`"]
D --> B
B --> E["Resumes"]
```
### Hierarchy
Linux creates a parent-child relationship between processes, Windows doesn't.
Linux:
```mermaid
graph TD;
init["init
pid = 1"]
login["login
pid = 8415"]
kthreadd["kthreadd
pid = 2"]
sshd["sshd
pid=3028"]
bash["bash
pid=8416"]
ps["ps
pid=9298"]
emacs["emacs
pid=9204"]
khelper["khelper
pid=6"]
pdflush["pdflush
pid=200"]
init --> login
init --> kthreadd
init --> sshd
login --> bash
bash --> ps
bash --> emacs
kthreadd --> khelper
kthreadd --> pdflush
```
### Termination
1. Normal
Process should return a code to its parent. Child processes should wait until they know that the parent received it, becoming **zombie processes**. If the parent dies before the child, the child is called an orphan. Absolutely fucking crazy naming. Every linux process should have a parent process [source: unicef](https://unicef.org).
2. Error - just a special return code
3. Fatal error, involuntary - division by zero, invalid opcode; process is immediately terminated by the system
4. Killed
### States
As a state machine
1. Running
2. Ready
3. Blocked (blocking == waiting)
```mermaid
graph TD;
A["Running"]
B["Ready"]
C["Blocked"]
A --> |1| C
A --> |2| B
B --> |3| A
C --> |4| B
```
#### Ready State
- In this state the process is not waiting for a resoucrce
- Can be executed
- Put in a queue (ready queue)
#### I/O queue
- I/O device has its own
- Multiple queues are created by OS
## Timesharing: In-depth
from [Multitasking/Timesharing](Overview.md#Multitasking/Timesharing)
The output of running programs should not change when we stop and switch back to the same program later on.
### Context switching
Switching implies that we have to store the values of registers, flags, PC, etc. of the current process and load them into the next one. Then we continue.
### The process control block - PCB
The OS needs a place to store the status of each process. This is that data structure.
### Process table
A list of PCBs (one per process)
![Figure: PS](Pasted%20image%2020250419141856.png)
* Timer (`ISR`[^2]) generates multiple interrupts per second
* Store the status of the process in PCB
## Threads
A thread is a basic unit of CPU utilization, consisting of a program counter, a stack, and a set of registers, ( and a thread ID. )
A light-weight process.
![](Pasted%20image%2020250419143713.png)
### Processes vs threads
| Processes | Thread |
| ----------------------------------------- | ------------------------------------------------ |
| Heavyweight | Lighter |
| Each process has its own memory | Threads use memory of the process they belong to |
| Inter-Process Communication (IPC) is slow | Way faster inter-thread communication |
| Context switching is more expensive | Less expensive |
| Do not share memory | do share memory |
### Multithreading
- Traditional processes have a single thread of control[^3]
* If a process has multiple threads of control, it can perform more than one task
### Ways to Implement Threads
* Kernel-Level Threads (KLT)
* Managed by the OS kernel
* Each thread is a separate scheduling entity
* `pthread`, `thread`
* User-Level Threads (ULT)
* Managed by user-space libraries, OS is unaware
* Faster context switching
* Green threads
### User Threads and Kernel Threads
- **User threads**
- Implemented by a thread library at the user level
- thread creation and scheduling are done in user space
- **Kernel Threads**
- Managed by OS
### Relationship models
#### Many-to-one
* User-level threads to one kernel treads
* Management done by thread library in user space
* The entire process blocks whenever a thread makes a blocking sycalls
* Only **one** thread can access the kernel at a time (you can't run multiple threads in parallel on multiprocessors)
#### One-to-one
Each user thread is mapped to a kernel thread
- Provides more concurrency
Unfortunately:
- Creating a user thread requires creating the corresponding kernel thread
- Overhead of creating kernel threads retricts the number of threads
#### Many-to-many
Multiplexes many user threads to a $\leq$ number of kernel threads.
- Allows creation of however many threads the user wants
- The kernel can schedule another thread for execution whenever a thread performs a blocking system call
#### Fork-join
Parent creates forks (children threads) and then waits for the children to terminate, joining with them, at which point it can retrieve and combine results.
This is also called **synchronous threading**. Parent **cannot** continue until the work has been completed.
[^1]: A batch job is a scheduled task or a set of commands that are executed without manual intervention - **cron**
[^2]: interrupt service routine - like in LC3
[^3]: sequence of programmed instructions that can be managed independently by a scheduler within a computer program
##### Parallelism
![](Pasted%20image%2020250421222538.png)
## Thread pool
Issue wih threads:
- Overhead when creating
- Exhausting system resources
Solution: thread pools - creating a number of threads at startup and place them into a pool where they sit and wait for work.
This optimizes everything because:
Sharing threads:
- If a thread is blocked (e.g., waiting for I/O), it doesn't remain idle; it can be reassigned to another task
- Each thread has its own task queue
- Whenever a thread finishes its tasks it looks through the other threads' queues and "steals" tasks.

View File

@ -0,0 +1,125 @@
---
type: theoretical
backlinks:
- "[[Overview#Multitasking/Timesharing]]"
- "[[Processes and Threads#Timesharing In-depth]]"
---
Processes take turns to use the CPU.
## Long Term Scheduling
Processes that are waiting are put in a *ready* queue.
## Short Term Scheduling
Which process in the ready queue should be assigned the CPU next
## Criteria
We want to:
- Maximize CPU utilization
- Minimize Average Turnaround time
- Maximize throughput
- Minimize waiting and response time
### CPU utilization
Each process spends $p$ fraction of its time wating for I/O, having $n$ processes in memory. The probability that all processes are waiting for I/O is $p^n$
Hence, CPU utilization is:
$$
1- p^n
$$
### Average Turnaround Time
The time since the process enters the ready queue until it terminates.
Average is literally the mean of the aforementioned but for many processes.
### Throughput
Number of processes executed completely in a unit of time.
## Non-Preemptive scheduling
If the process executes to complete, the algorithm is non-preemptive.
- Long average turnaround time
- Whenever a long process starts, short ones have to wait
### FCFS
Read title
## SJF
Shortest job first. Choose the next process to execute from the processes currently in the ready queue, based on their execution time
> [!IMPORTANT]
> Starvation happens when a process waits for a resource for a long time
This could happen with SJF.
### Attacking starvation by introducing compound priority[^1]
So, SJF uses `1/Execution time` priority. We just add `0.1*waiting time` to it.
## Preemptive scheduling
Scheduler stops a process and reclaims the CPU after assigning it
### SRTF
Shortest remaining time first (as opposed to shortest job first which just takes the initial times, this one is dynamic)
We keep track of when the processes start and how much time they've taken, calculating how much time they have left. We pick the minimum based on that.
### RR
Round robing. Just give everyone a small time window for them to do their jobs.
We need to find a "time quantum"[^2] by balancing minimizing overhead of context switching and maximizing response time
**no priority**
## Process categorization
| Category | Description | Example |
| ----------- | ------------------------------------------------------------ | ----------------------- |
| Batch | No interaction with users, input/output read/written to file | Cron job |
| Interactive | Requires input from user. Needs short response times. | Chat |
| Real-time | Expects response from user | Industrial applications |
## Multi-queue scheduling
Multiple priority levels and uses RR for each.
Choses processes from highest level and recurses downwards whenever a level is exhausted.
### + feedback
Processes can be moved from one queue to another based on the type of operations executed (i.e. I/O is high priority).
## Lottery
Random number. Set boundaries. e.g.:
$$
\begin{align*}
p_a \leftarrow 20\% \\
p_b \leftarrow 50\% \\
p_c \leftarrow 30\%
\end{align*}
$$
So:
$$
rand() \rightarrow 0.4 \implies S(\{p_i\}) = p_b
$$
## Real-time scheduling
Dividing the program into a number of short-lived processes.
---
[^1]: I made that shit the fuck up just now
[^2]: Terrible fucking name, why why why, this should be called a window or some shit.

View File

@ -0,0 +1,104 @@
---
type: theoretical
backlinks:
- "[[Memory Management]]"
---
Separating logical memory from physical memory.
- Allows **very large** virtual memory, when only a smaller physical memory is available
The **virtual address space** of a process refers to the logical view of how a process is stored
## Implementation
Maintain a copy of the process (including code,data heap and stack segments) in a special area of the HDD named **virtual memory**
> [!IMPORTANT]- Refresher - code, data, heap and stack segments
> ![](Pasted%20image%2020250505042419.png)
>[!NOTE]- Another refresher - stack vs. heap allocation
> ![](Pasted%20image%2020250505042548.png)
- Process is divided into pages
- If a page is referred to, it is brought into main memory (**DEMAND PAGING**)
## Page faults
When a page is referenced but not present in memory - a main memory access is required.
## Page replacement
The act of replacing a frame in memory with another one (which we need) from the main memory.
### Basic Page Replacement
Linear search for free frame, if none -> select victim page via **a page replacement algorithm** and do your thing!
## Typical pages
Contain:
- A P (or V for valid) bit -> page is in RAM (else page fault)
- M (dirty) bit - page in RAM modified
- R bit - referenced since last time R was cleared
## Beladys Anomaly
Increasing the number of page frames (or memory pages) allocated to a process can lead to an increase in the number of page faults, rather than a decrease.
## Frame-allocation algorithms
How many frames to give to each process
### Fixed
Each process receives the same number of frames -> **Equal Allocation**
### Proportional
Allocate according to size of process.
## Page-replacement algorithms
Which page to replace, optimizing for lowest page fault rate.
### FIFO
Read title.
### Least Recently Used (LRU)
Replace page that has not been used recently.
**Counter**:
- Every page entry has a counter; every time page is referenced through this entry, copy the clock into the counter.
- When a page is to be changed, find smallest value in counters.
**Stack**:
- Keep a stack of page numbers in a double link form[^1]
- On page reference - move to top
### LRU Approximation
Since LRU is slow as shit, we need an approximation.
We introduce a **Reference bit**:
- Each page has `R = 0` at first
- Whenever referenced `R = 1`
- Replace any page with `R = 0`
#### Second-chance (Clock)
Do the above. It's called a clock cuz it's like a `itertools.cycle()`. It holds the state of last accessed page (clock hand) and moves on from there on next iteration.
## The Working Set Model
We want to have the set of pages "in use" in RAM!
- Working set changes over time
- Usually approximated by the set of pages used by some amount of most recent references
## Thrashing
When a process is busy swapping pages.
Multiprogramming[^2] is high, CPU utilization[^3] is low.
### Solving it
Give the process(es) more memory by:
- Taking it from another process
- Swap out shit until demand is lower (scheduler)
## Inverted page table
Inverted page tables are a memory management method that uses a single table for the entire system to map physical memory addresses to virtual addresses. Instead of each process having its own page table, the inverted page table has entries for each physical page.
## I/O Interlock
Pages must sometimes be locked into memory (i.e. I/O). This is what this is called.
---
[^1]: Doubly-linked list where we can go `prev` and `next`
[^2]: Many processes wanting resources
[^3]: Shit actually happening

View File

@ -0,0 +1,24 @@
---
type: theoretical
---
- Hypervisor-Based Virtualization
- Utilizing hypervisor-based virtualization solutions like VMWare ESXi or Proxmox to create and manage multiple VMs on a single server.
- Cloud computing
## Requirements
1. Safety: hypervisor should have **full control** of virtualized resources
2. Fidelity: behaviour of a program on a virtual machine should be the same as if it were running bare metal
3. Efficiency: Much of code should run without intervention by hypervisor
## Popek and Goldberg
Sensitive instructions behave differently in user vs. kernel mode. IO as an example.
Privileged instructions cause a trap if executed in user mode.
$$
\text{Sensitive INS. } \subseteq \text{ Privileged Ins.}
$$
## Types
![](Pasted%20image%2020250505205120.png)

Binary file not shown.

After

Width:  |  Height:  |  Size: 214 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 765 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 181 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 156 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 279 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 148 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 95 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 138 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 109 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 123 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 108 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 408 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 603 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 275 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

View File

@ -0,0 +1,24 @@
### Logistics
- Will we have access to an overview of the project roadmap, including deliverables?\
> **No. It is a research project, hence no deliverables and such.**
- Do you need us to use specific project management tools (e.g. GitHub, Jira, etc.)?
- How often are you available? Is it possible to have weekly progress reports?
> Every week is good.
### Formal Verification
- What is the expected level of background in Coq or formal methods?
> It's possible to catch up to speed in a couple of months
- Can you explain the process by which a smart contract's safety properties will be validated formally?
- Are there any existing case studies or example proofs we might refer to for a better understanding of the expected output?
> You will be linked to existing projects
- Define the contract verification criteria
### Project scope clarifications
- Among the seven smart contracts being verified, which ones do you expect us to work on, and why those?
- Which technologies are we going to be introduced to, if any? Will we have access to guides for Coq and Solidity?
- How do you envision the high-level Coq framework integrating with existing Solidity projects?
### Optional
- How much of the formal verification process will be based on axioms versus fully constructive proofs?
- Could you elaborate on the notion of “high-level primitives” (e.g., identity, item, property) and how flexible they need to be for different types of contracts?
- Could you specify what you mean by "real numbers and integer approximations"? Is it related to precision with math? How does that impact the security of a smart contract? Practical example?

View File

@ -0,0 +1,33 @@
## Intro
- Formalland 2 years old
- Formal verification for code, proofs
- Find a way to fully specify smart contracts
- Formal verification as means of security (no bugs -> no stealing)
- Alternatives include:
- Testing (Unit, Value)
- Human expertise
- Quite niche in the field of computer science
- We can be sure that the program follows intended behavior after verification
## Smart contracts
- Notion of users
- Admin - owner
- We need to look through some examples [here](https://formal.land/docs/tools/coq-of-solidity/specification-project) to get a feel for them.
- Motivated by bugs [listed here](https://github.com/kadenzipfel/smart-contract-vulnerabilities)
### Example of Smart Contract
- Stablecoins (USDC)
- Possible specification(?) is to state that the amount of coins is fixed
## Work
- Solidity
- VSC online
### Questions during the meeting
- What is the difference between a user and an admin in the context of smart contracts?
- You mentioned that one possible specification is to state that the amount of coins is fixed. How does that relate to formal verification? To our project?
- Is the idea to design a DSL? Could you elaborate on the specifics? Do you have a write-up about it or do we need to come up with it?
> Yes. We want to simplify formal verification of smart contracts by creating a DSL.

View File

@ -0,0 +1,2 @@
End goal: Represent all 7 smart contracts in our DSL

View File

@ -0,0 +1,18 @@
### General Notes
- 7 smart contracts -> gives us a vague idea as to what we're going to do
- No specfics available
- Prepare some questions to have a better shot at understanding what the project's about
- > What are we going to do exactly?
- Swap around roles in order for all of us to learn as much as possible
- Think about the approach
- Start exploring -> have more meetings
### Communication tips
- Need to contact the company, book a meeting and include in CC
- Try to compress as much information as possible in one cycle of email communication, since companies usually take a while to answer.
- Make them define a concrete timeline
- Ask them what their availability is? How many meetings are possible?
### What we need to do
- We need to translate the smart contract to their existing system if they have one (they probably do?)
### Next week
- Queries have to be ready

View File

@ -0,0 +1,21 @@
### Null hyposthesis
### Confidence interval
Interval which is expected to contain the parameter
$$
CI = \bar{x} \pm z \frac{s}{\sqrt{n}}
$$
Where $z\frac{s}{\sqrt{n}}$ is the variation in our estimate.
### T-Test
Used to determine if there is a significant difference between the means of two groups.
We have to assume:
- Data follows a normal distribution
- each observation is independent
$$
t = \frac{\text{mean} - \text{theoretical value}}{s\sqrt{n}}
$$