summaryrefslogtreecommitdiff
path: root/zettelkast
diff options
context:
space:
mode:
authorJasper Ras <jras@hostnet.nl>2024-11-23 11:30:28 +0100
committerJasper Ras <jras@hostnet.nl>2024-11-23 11:30:28 +0100
commit1f1423fdb8d4e2928768ffa33a6ad2b59c75e82e (patch)
tree67d94f0d821a053aca0e7c8a7ffb6c369047aa14 /zettelkast
parent93d36010a9d54bca1fdcaf1f4c99e6981aaf41bc (diff)
lowercase dirs
Diffstat (limited to 'zettelkast')
-rw-r--r--zettelkast/Index/Computer Networking.md3
-rw-r--r--zettelkast/Index/Domain Driven Design.md2
-rw-r--r--zettelkast/Index/Golang.md3
-rw-r--r--zettelkast/Index/Nix.md1
-rw-r--r--zettelkast/Index/Python3.md3
-rw-r--r--zettelkast/Index/Software Architecture.md2
-rw-r--r--zettelkast/Index/_Index.md7
-rw-r--r--zettelkast/Notes/010420240957 - spf13 cobra.md13
-rw-r--r--zettelkast/Notes/010720231037 - With function.md18
-rw-r--r--zettelkast/Notes/010920231133 - OpenFlow.md2
-rw-r--r--zettelkast/Notes/010920231434 - (UNIX) Watch.md1
-rw-r--r--zettelkast/Notes/022920240849 - Layered Architecture.md7
-rw-r--r--zettelkast/Notes/022920240901 - Repository Pattern.md1
-rw-r--r--zettelkast/Notes/032220240826 - Python3 Escape Sequences.md21
-rw-r--r--zettelkast/Notes/060620241559 - Adjacency Lists.md3
-rw-r--r--zettelkast/Notes/20240613112 - Aggregates should protect invariants.md5
-rw-r--r--zettelkast/Notes/202406131159 - Invariant.md5
-rw-r--r--zettelkast/Notes/280620231200 - Direct Attach Cable -DAC.md9
-rw-r--r--zettelkast/Notes/280620231201 - Transceiver.md5
-rw-r--r--zettelkast/Notes/280620231556 - Svelte.md9
-rw-r--r--zettelkast/Notes/280620231557 - SvelteKit.md7
-rw-r--r--zettelkast/Notes/280620231621 - Knowledge vs Information.md8
-rw-r--r--zettelkast/Notes/280620231634 - Using Zettelkasten as a thinking tool.md11
-rw-r--r--zettelkast/Notes/290220240839 - Domain Modeling.md5
-rw-r--r--zettelkast/Notes/290220240842 - Entity.md1
-rw-r--r--zettelkast/Notes/290220240843 - Value Object.md15
-rw-r--r--zettelkast/Notes/290220241409 - TDD High and Low Gear.md3
-rw-r--r--zettelkast/Notes/290220241412 - Service Layer.md3
-rw-r--r--zettelkast/Notes/290220241458 - Unit of Work pattern.md40
-rw-r--r--zettelkast/Notes/290220241543 - Aggregates.md5
-rw-r--r--zettelkast/Notes/300620231000 - Running programs in the background with tmux.md8
-rw-r--r--zettelkast/Notes/300820231007 - OVN.md32
-rw-r--r--zettelkast/Notes/310820231448 - Neutron OVN.md1
-rw-r--r--zettelkast/Notes/310820231618 - Open VSwitch (OVS).md3
-rw-r--r--zettelkast/Notes/310820231706 - Networking One Giant Compute.md3
35 files changed, 265 insertions, 0 deletions
diff --git a/zettelkast/Index/Computer Networking.md b/zettelkast/Index/Computer Networking.md
new file mode 100644
index 0000000..0993b44
--- /dev/null
+++ b/zettelkast/Index/Computer Networking.md
@@ -0,0 +1,3 @@
+[[300820231007 - OVN]]
+[[310820231706 - Networking One Giant Compute]]
+[[310820231618 - Open VSwitch (OVS)]]
diff --git a/zettelkast/Index/Domain Driven Design.md b/zettelkast/Index/Domain Driven Design.md
new file mode 100644
index 0000000..f926e78
--- /dev/null
+++ b/zettelkast/Index/Domain Driven Design.md
@@ -0,0 +1,2 @@
+[[290220240839 - Domain Modeling]]
+[[290220241543 - Aggregates]]
diff --git a/zettelkast/Index/Golang.md b/zettelkast/Index/Golang.md
new file mode 100644
index 0000000..2da2043
--- /dev/null
+++ b/zettelkast/Index/Golang.md
@@ -0,0 +1,3 @@
+The Go programming language
+
+[[010420240957 - spf13 cobra]] \ No newline at end of file
diff --git a/zettelkast/Index/Nix.md b/zettelkast/Index/Nix.md
new file mode 100644
index 0000000..f107402
--- /dev/null
+++ b/zettelkast/Index/Nix.md
@@ -0,0 +1 @@
+[[010720231037 - With function]] \ No newline at end of file
diff --git a/zettelkast/Index/Python3.md b/zettelkast/Index/Python3.md
new file mode 100644
index 0000000..6a8c99a
--- /dev/null
+++ b/zettelkast/Index/Python3.md
@@ -0,0 +1,3 @@
+The python3 programming language notes.'
+
+[[032220240826 - Python3 Escape Sequences]] \ No newline at end of file
diff --git a/zettelkast/Index/Software Architecture.md b/zettelkast/Index/Software Architecture.md
new file mode 100644
index 0000000..590757e
--- /dev/null
+++ b/zettelkast/Index/Software Architecture.md
@@ -0,0 +1,2 @@
+[[Domain Driven Design]]
+[[022920240849 - Layered Architecture]] \ No newline at end of file
diff --git a/zettelkast/Index/_Index.md b/zettelkast/Index/_Index.md
new file mode 100644
index 0000000..05d5d74
--- /dev/null
+++ b/zettelkast/Index/_Index.md
@@ -0,0 +1,7 @@
+[[Software Architecture]]
+[[Python3]]
+[[Golang]]
+[[Zettelkast/Index/Nix]]
+
+[[300820231007 - OVN]]
+[[280620231634 - Using Zettelkasten as a thinking tool]] \ No newline at end of file
diff --git a/zettelkast/Notes/010420240957 - spf13 cobra.md b/zettelkast/Notes/010420240957 - spf13 cobra.md
new file mode 100644
index 0000000..e867fe6
--- /dev/null
+++ b/zettelkast/Notes/010420240957 - spf13 cobra.md
@@ -0,0 +1,13 @@
+Cobra is a [[Golang]] library for creating command-line interfaces.
+
+CLI for generating stuff:
+```
+go install github.com/spf13/cobra-cli@latest
+```
+
+The library itself:
+```
+go get -u github.com/spf13/cobra@latest
+
+import "github.com/spf13/cobra"
+```
diff --git a/zettelkast/Notes/010720231037 - With function.md b/zettelkast/Notes/010720231037 - With function.md
new file mode 100644
index 0000000..d646a8f
--- /dev/null
+++ b/zettelkast/Notes/010720231037 - With function.md
@@ -0,0 +1,18 @@
+#nix-lang
+
+The `with` function brings all attributes from a given set, e.g nixpkgs, into the local scope. Making them accessible as if they were declared in the same file.
+
+An example, bringing everything from nixpkgs into scope:
+```
+with import <nixpkgs>;
+with python310Packages; <-- declared in nixpkgs
+
+buildPythonPackage <-- declared in python310Packages
+```
+
+The import statement is required here because imports a nix expression from another source, in this case nixpkgs.
+It is not required at line two, because python310Packages itself is already in the local scope.
+
+
+---
+[Nix Manual](https://nixos.org/manual/nix/stable/language/index.html)
diff --git a/zettelkast/Notes/010920231133 - OpenFlow.md b/zettelkast/Notes/010920231133 - OpenFlow.md
new file mode 100644
index 0000000..4e0bd08
--- /dev/null
+++ b/zettelkast/Notes/010920231133 - OpenFlow.md
@@ -0,0 +1,2 @@
+`man ovs-fields (7)` explains more about OpenFlow matches.
+`man ovs-ofctl (8)` explains more about OpenFlow actions.
diff --git a/zettelkast/Notes/010920231434 - (UNIX) Watch.md b/zettelkast/Notes/010920231434 - (UNIX) Watch.md
new file mode 100644
index 0000000..dafeb80
--- /dev/null
+++ b/zettelkast/Notes/010920231434 - (UNIX) Watch.md
@@ -0,0 +1 @@
+`watch (1)` periodically executes the executable on argv. It can be used to reload the output of a command, like `sudo watch ovs-dpctl dump-flows` . \ No newline at end of file
diff --git a/zettelkast/Notes/022920240849 - Layered Architecture.md b/zettelkast/Notes/022920240849 - Layered Architecture.md
new file mode 100644
index 0000000..d551132
--- /dev/null
+++ b/zettelkast/Notes/022920240849 - Layered Architecture.md
@@ -0,0 +1,7 @@
+Layered architecture is the art of dividing an application into different layers and applying rules to decide which code goes to which layer.
+Examples of layered architecture are MVC.
+
+Another example is:
+- Business layer ([[290220240839 - Domain Modeling]]): Encapsulates all business logic
+- [[290220241412 - Service Layer]]: Encapsulate all application use-cases and manages orchestration before handing over to the domain layer.
+- Interface layer: E.g Flask controllers, CLI, etc. They depend on the service layer. \ No newline at end of file
diff --git a/zettelkast/Notes/022920240901 - Repository Pattern.md b/zettelkast/Notes/022920240901 - Repository Pattern.md
new file mode 100644
index 0000000..ef6a879
--- /dev/null
+++ b/zettelkast/Notes/022920240901 - Repository Pattern.md
@@ -0,0 +1 @@
+A simplifying abstraction over data storage allowing to decouple the business layer from the data layer in a [[022920240849 - Layered Architecture]] and making it easier to test as well. \ No newline at end of file
diff --git a/zettelkast/Notes/032220240826 - Python3 Escape Sequences.md b/zettelkast/Notes/032220240826 - Python3 Escape Sequences.md
new file mode 100644
index 0000000..f63c208
--- /dev/null
+++ b/zettelkast/Notes/032220240826 - Python3 Escape Sequences.md
@@ -0,0 +1,21 @@
+Escape sequences encode hard to type characters, e.g a tab \\t.
+
+Table of escape sequences:
+
+| Escape | What it does |
+| ---------- | ----------------------------------------------------------- |
+| \\\ | Backslash (\\) |
+| \\' | Single-quote (') |
+| \\" | Double-quote (") |
+| \a | ASCII bell (BEL) |
+| \b | ASCII backspace (BS) |
+| \f | ASCII formfeed (FF) |
+| \n | ASCII linefeed (LF) |
+| \N{name} | Character named name in the Unicode database (Unicode only) |
+| \r | Carriage return (CR) |
+| \t | Horizontal tab (TAB) |
+| \uxxxx | Character with 16-bit hex value xxxx |
+| \Uxxxxxxxx | Character with 32-bit hex value xxxxxxxx |
+| \v | ASCII vertical tab (VT) |
+| \ooo | Character with octal value ooo |
+| \xhh | Character with hex value hh |
diff --git a/zettelkast/Notes/060620241559 - Adjacency Lists.md b/zettelkast/Notes/060620241559 - Adjacency Lists.md
new file mode 100644
index 0000000..c2e9003
--- /dev/null
+++ b/zettelkast/Notes/060620241559 - Adjacency Lists.md
@@ -0,0 +1,3 @@
+Adjacency list is a self-referential relationship. In SQLAlchemy we can achieve this by creating a ForeignKey on the table to itself. In the mapper we can add a relationship property and specify remote_side=[table.c.id].
+
+This is what I used to give backups a "base" reference. \ No newline at end of file
diff --git a/zettelkast/Notes/20240613112 - Aggregates should protect invariants.md b/zettelkast/Notes/20240613112 - Aggregates should protect invariants.md
new file mode 100644
index 0000000..7e4d67c
--- /dev/null
+++ b/zettelkast/Notes/20240613112 - Aggregates should protect invariants.md
@@ -0,0 +1,5 @@
+An invariant should be designed in such a way that it can enforce an invariant. This means even if they require another aggregate to do so, therefore it's allowed to reference other aggregates.
+
+---
+Related:
+- [[290220241543 - Aggregates]] \ No newline at end of file
diff --git a/zettelkast/Notes/202406131159 - Invariant.md b/zettelkast/Notes/202406131159 - Invariant.md
new file mode 100644
index 0000000..0109c04
--- /dev/null
+++ b/zettelkast/Notes/202406131159 - Invariant.md
@@ -0,0 +1,5 @@
+An invariant is a condition that simply must always be true.
+
+---
+Related:
+- [[20240613112 - Aggregates should protect invariants]] \ No newline at end of file
diff --git a/zettelkast/Notes/280620231200 - Direct Attach Cable -DAC.md b/zettelkast/Notes/280620231200 - Direct Attach Cable -DAC.md
new file mode 100644
index 0000000..fb1bf77
--- /dev/null
+++ b/zettelkast/Notes/280620231200 - Direct Attach Cable -DAC.md
@@ -0,0 +1,9 @@
+#datacenter
+
+A direct attach cable is used in data center environments to connect hardware such as servers, routers and switches.
+Has a [[280620231201 - Transceiver]] on both ends.
+Used most commonly to connect hardware in a rack to a switch in the top of a rack.
+Can be up to 7 meter.
+They are a lot cheaper than fiber.
+
+---
diff --git a/zettelkast/Notes/280620231201 - Transceiver.md b/zettelkast/Notes/280620231201 - Transceiver.md
new file mode 100644
index 0000000..7bba020
--- /dev/null
+++ b/zettelkast/Notes/280620231201 - Transceiver.md
@@ -0,0 +1,5 @@
+#datacenter
+
+A transceiver is an electronic device which can both transmit and receive signals.
+
+---
diff --git a/zettelkast/Notes/280620231556 - Svelte.md b/zettelkast/Notes/280620231556 - Svelte.md
new file mode 100644
index 0000000..0e9d077
--- /dev/null
+++ b/zettelkast/Notes/280620231556 - Svelte.md
@@ -0,0 +1,9 @@
+#web-development #svelte
+
+Svelte is a way to write UI components. It is a compiled language and compiles into JavaScript that can be run to render HTML for the page and CSS to style it.
+It's not a full framework and thus would require additional components to build a complete application.
+Therefore it can be used as a nice way to quickly build a simple web page using reusable components but with additional tools like [[280620231557 - SvelteKit]] it can be used to build an entire application.
+
+---
+[SvelteKit Documentation](https://kit.svelte.dev/docs/introduction#what-is-svelte)
+
diff --git a/zettelkast/Notes/280620231557 - SvelteKit.md b/zettelkast/Notes/280620231557 - SvelteKit.md
new file mode 100644
index 0000000..fd2f36a
--- /dev/null
+++ b/zettelkast/Notes/280620231557 - SvelteKit.md
@@ -0,0 +1,7 @@
+#web-development #svelte
+
+SvelteKit is a framework for developing applications using [[280620231556 - Svelte]].
+It provides features like routing, server-side rendering and enables us to conform to best practices, like specific build optimizations, offline support, preloading pages,
+
+---
+[SvelteKit Documentation](https://kit.svelte.dev/docs/introduction) \ No newline at end of file
diff --git a/zettelkast/Notes/280620231621 - Knowledge vs Information.md b/zettelkast/Notes/280620231621 - Knowledge vs Information.md
new file mode 100644
index 0000000..183eb35
--- /dev/null
+++ b/zettelkast/Notes/280620231621 - Knowledge vs Information.md
@@ -0,0 +1,8 @@
+#zettelkasten #note-taking
+
+The body of a Zettel [[280620231634 - Using Zettelkasten as a thinking tool]] should contain knowledge.
+Information is just static lifeless data ready to be interpreted. Knowledge is information with added context and relevance.
+It should still be relevant in the same context 10 years from now as it was when writing it. If we just capture some information. Without the context our later selves will probably look at it and wonder WTF it was for.
+
+---
+[Zettelkasten Introduction](https://zettelkasten.de/introduction/#the-body-of-the-zettel) \ No newline at end of file
diff --git a/zettelkast/Notes/280620231634 - Using Zettelkasten as a thinking tool.md b/zettelkast/Notes/280620231634 - Using Zettelkasten as a thinking tool.md
new file mode 100644
index 0000000..ec7454d
--- /dev/null
+++ b/zettelkast/Notes/280620231634 - Using Zettelkasten as a thinking tool.md
@@ -0,0 +1,11 @@
+#zettelkasten #note-taking
+
+Zettelkasten is a method of note taking that can be seen as a thinking tool. The idea is that thoughts are captured in atomic notes (Zettel) and reference other such notes creating a graph. The graph may later reveal connections between topics that weren't visible before.
+
+The main important things are that:
+- A zettel has a unique identifier
+- A piece of knowledge
+- Some references to whatever this knowledge came from ( or none if it's just a thought of our own )
+
+---
+[Zettelkasten introduction](https://zettelkasten.de/introduction/) \ No newline at end of file
diff --git a/zettelkast/Notes/290220240839 - Domain Modeling.md b/zettelkast/Notes/290220240839 - Domain Modeling.md
new file mode 100644
index 0000000..9fe7f7f
--- /dev/null
+++ b/zettelkast/Notes/290220240839 - Domain Modeling.md
@@ -0,0 +1,5 @@
+Domain modeling can be used to define the business layer in a [[022920240849 - Layered Architecture]]. This is all the business logic. It should be easy to understand and easy to change as this is the code that changes the most frequently.
+
+A domain model can be comprised out of [[290220240843 - Value Object]], [[290220240842 - Entity]], Aggregates and functions that encompass domain procedures that do not necessarily fit in an object.
+It is also fine to include Exceptions in the domain, e.g stock can go out of stock and thus when we would allocate an order it would raise an OutOfStock exception.
+
diff --git a/zettelkast/Notes/290220240842 - Entity.md b/zettelkast/Notes/290220240842 - Entity.md
new file mode 100644
index 0000000..41879da
--- /dev/null
+++ b/zettelkast/Notes/290220240842 - Entity.md
@@ -0,0 +1 @@
+An Entity is an object with a unique identity. E.g a Person has a unique identity (for example his name). \ No newline at end of file
diff --git a/zettelkast/Notes/290220240843 - Value Object.md b/zettelkast/Notes/290220240843 - Value Object.md
new file mode 100644
index 0000000..10a9afa
--- /dev/null
+++ b/zettelkast/Notes/290220240843 - Value Object.md
@@ -0,0 +1,15 @@
+A Value Object is a domain object that has no unique identity but if any of its properties change it is no longer the same. An example can be made with money.
+
+```py
+from dataclasses import dataclass
+
+@dataclass(frozen=True)
+class Money:
+ type: str
+ value: int
+
+Money("Euro", 10) != Money("Euro", 9)
+Money("GBP", 10) != Money("Euro", 10)
+```
+
+Thus such an object is a perfect candidate for immutability. With python we can add @dataclass(frozen=True). Frozen=true makes it immutable. \ No newline at end of file
diff --git a/zettelkast/Notes/290220241409 - TDD High and Low Gear.md b/zettelkast/Notes/290220241409 - TDD High and Low Gear.md
new file mode 100644
index 0000000..218ad00
--- /dev/null
+++ b/zettelkast/Notes/290220241409 - TDD High and Low Gear.md
@@ -0,0 +1,3 @@
+A nice idea of TDD is that of High and Low Gear. What they mean is that when you're just starting out you will write a lot of fine grained unit tests to get going, e.g against the domain layer.
+Once you're at the point that you have encapsulated all use cases in a nice service layer, you can move all the specific domain tests to the service layer. This makes it easier to make modifications to the domain model.
+If then you really need to make big changes, you write fine grained unit tests for those again, until you've encapsulated them in the service layer. \ No newline at end of file
diff --git a/zettelkast/Notes/290220241412 - Service Layer.md b/zettelkast/Notes/290220241412 - Service Layer.md
new file mode 100644
index 0000000..08e9782
--- /dev/null
+++ b/zettelkast/Notes/290220241412 - Service Layer.md
@@ -0,0 +1,3 @@
+The idea of the service layer is that it handles most orchestration concerns for a use case of the application such as wiring together repositories and fetching required domain models. Basically it sets everything up so that we have everything needed to have the domain do its work properly and then persist the changes.
+
+This takes away this kind of logic from the entrypoints like API controllers making those easier to test as they only be concerned with doing web stuff, e.g fetching the data from the request and making sure we form a correct response. That allows us to just run an end to end test for the happy an all unhappy paths on the controller, the rest of the application functionality is covered by the service layer. \ No newline at end of file
diff --git a/zettelkast/Notes/290220241458 - Unit of Work pattern.md b/zettelkast/Notes/290220241458 - Unit of Work pattern.md
new file mode 100644
index 0000000..3ba00cb
--- /dev/null
+++ b/zettelkast/Notes/290220241458 - Unit of Work pattern.md
@@ -0,0 +1,40 @@
+#needs-clarification
+
+The Unit of Work is an abstraction of the concept of atomic operations. We can have a clear boundary on what work is grouped together and should be committed only if everything succeeded.
+
+We can use the UoW to remove dependency on storage layer from entrypoints by having the UoW manage the set-up. This makes tests easier.
+
+For example an SqlAlchemyUoW can wrap an SqlAlchemy Session object and expose only its most thin API: commit and rollback. It can work together as well with a [[022920240901 - Repository Pattern|Repository]]. Using a ContextManager we can make the operations safe by only explicitly having the user of the UoW commit and otherwise when exiting do a rollback:
+```py
+import abc
+
+class AbstractUnitOfWork(abc.ABC):
+ products: AbstractRepository
+
+ def __init__(self, products: AbstractRepository):
+ self.products = products
+
+ def __exit__(self):
+ self.rollback()
+
+ @abc.abstractmethod
+ def commit(self):
+ pass
+
+ @abc.abstractmethod
+ def rollback(self):
+ pass
+
+
+class SqlAlchemyUnitOfWork(AbstractUnitOfWork):
+ def __init__(self, products: AbstractRepository, sessionmaker):
+ self._session = sessionmaker()
+ super().__init__(some_repo)
+
+ def commit(self):
+ self._session.commit()
+
+ def rollback(self):
+ self._session.rollback()
+```
+
diff --git a/zettelkast/Notes/290220241543 - Aggregates.md b/zettelkast/Notes/290220241543 - Aggregates.md
new file mode 100644
index 0000000..2001826
--- /dev/null
+++ b/zettelkast/Notes/290220241543 - Aggregates.md
@@ -0,0 +1,5 @@
+An Aggregate is a single cohesive collection of domain objects. An aggregate must be consistent within a single transaction.
+
+---
+Related:
+- [[20240613112 - Aggregates should protect invariants]] \ No newline at end of file
diff --git a/zettelkast/Notes/300620231000 - Running programs in the background with tmux.md b/zettelkast/Notes/300620231000 - Running programs in the background with tmux.md
new file mode 100644
index 0000000..b338da5
--- /dev/null
+++ b/zettelkast/Notes/300620231000 - Running programs in the background with tmux.md
@@ -0,0 +1,8 @@
+#tmux
+
+Tmux can be used to run programs in the background by opening a tmux session and starting the program. It is then possible to detach from that session while the program keeps running.
+
+It's also possible to directly start a program in its own session:
+ tmux new-session obsidian or leader+A $ and then new-session obsidian.
+
+---
diff --git a/zettelkast/Notes/300820231007 - OVN.md b/zettelkast/Notes/300820231007 - OVN.md
new file mode 100644
index 0000000..b0ca07a
--- /dev/null
+++ b/zettelkast/Notes/300820231007 - OVN.md
@@ -0,0 +1,32 @@
+#network #networking #ovn #virtual #cloud #dc #engineering #software #emulation #gateway #tunnel #tunneling #router #routing #switch #switching #ovs
+
+---
+
+OVN is a software that enables the creation of virtual networks. Under the hood it uses OVS (virtual switch) and a tunneling protocol to emulate networking devices. These virtual networks run on top of the normal physical infrastructure. It is useful in a cloud environment with virtual machines because it is easy to scale because we can use the singular physical infrastructure and create many seperate virtual networks with string of simple commands or managed by a configuration management system.
+
+OVN complements features provided by [[OVS]] to enable defining networks entirely in software on top of and unaware of the underlaying physical network.
+This is achieved by using tunnels or other encapsulations. Therefore IP addresses and other addresses can overlap with the physical network as they are unaware of each other.
+
+A software defined network as described above is called an [[OVN Logical Network]].
+
+A [[OVN Gateway]] extends a tunnel-based [[OVN Logical Network]] into the physical network by forwarding packets bi-directionally. This allows non-virtualized devices to participate in the logical network as well.
+
+---
+
+OVN has two databases which act as interfaces for components. The NorthBound DB handles translation from higher level CMS concepts into intermediary OVN concepts with similar naming that are used to be translated to lower level flows stored in the SouthBound DB. Those flows
+
+**Why the NorthBound DB?**
+Probably it exists to make it easy to integrate OVN into cloud management systems such as OpenStack because the tables and structures match those of higher level cloud components. OVN is then responsible for doing the complicated work of translating those into the lower level flows.
+
+**There is more than one table in each of the databases, how can we show which ones are there and what they contain?**
+E.g the logical_switch_port table in nb db (nbctl list logical_switch_port)
+From `man ovn-nbctl` : "For a list of tables and their columns, see ovn-nb(5) or see the table listing from the --help option."
+
+**What are dhcpv4_options on a logical switch port?**
+
+A Logical Datapath is the lower level concept in the SB DB, which matches the higher level Logical Switch. It is implemented by flows dictacting how packets should flow. We can see the given datapaths via `ovn-sbctl list datapath_binding`.
+
+`ovs-dpctl` is the interface to OVS datapaths. With `ovs-dpctl dump-flows` we can get a glimpse of the in-kernel flow cache, e.g see what's going on.
+
+**What is the TTL (Time To Live) on an IP packet? Why is it decreased by a router?**
+
diff --git a/zettelkast/Notes/310820231448 - Neutron OVN.md b/zettelkast/Notes/310820231448 - Neutron OVN.md
new file mode 100644
index 0000000..7df0888
--- /dev/null
+++ b/zettelkast/Notes/310820231448 - Neutron OVN.md
@@ -0,0 +1 @@
+An OpenStack Network is a logical switch, it corresponds to an [[OVN Logical Switch]] \ No newline at end of file
diff --git a/zettelkast/Notes/310820231618 - Open VSwitch (OVS).md b/zettelkast/Notes/310820231618 - Open VSwitch (OVS).md
new file mode 100644
index 0000000..d4664d4
--- /dev/null
+++ b/zettelkast/Notes/310820231618 - Open VSwitch (OVS).md
@@ -0,0 +1,3 @@
+OVS is a direct replacement for [[LinuxBridge]] an L2 switch. Linux bridge was not designed with a fast changing landscape of many VMs that need to communicate with each other from many different hosts. OVS is designed with that in mind..
+
+OVS makes it possible to migrate configuration and live network state between two hypervisors by tracking current network state in OVSDB. The OVSDB supports triggers which make it possible to respond to changes of various aspects of the network. \ No newline at end of file
diff --git a/zettelkast/Notes/310820231706 - Networking One Giant Compute.md b/zettelkast/Notes/310820231706 - Networking One Giant Compute.md
new file mode 100644
index 0000000..31fd127
--- /dev/null
+++ b/zettelkast/Notes/310820231706 - Networking One Giant Compute.md
@@ -0,0 +1,3 @@
+Using a [[TCP/IP]] network makes it almost as if two connected computers are working as one.
+Like a giant botnet, all hosts working together as a single giant machine trying to bring down a company or network.
+Or all our smartphones running hypervisor software creating the biggest cloud ever. \ No newline at end of file