Skip to content

Commit 942c9ee

Browse files
committed
chore: publish
And add missing files (css and ico)
1 parent d04a5cc commit 942c9ee

9 files changed

Lines changed: 535 additions & 0 deletions
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
+++
2+
title = "Kubernetes"
3+
date = 2026-06-02
4+
updated= 2026-06-02
5+
+++
6+
7+
## History {#history}
8+
9+
The history of Kubernetes is apparently pretty long. It all started with `borg`, which was too monolithic and complex. It was later rewritten into `Omega` (Omega? really?) with a much more consistent and constrained architecture, which was unfortunately not good for a public cloud. `Kubernetes` (K8) is the climax of all these rewrites and focuses on individual components
10+
11+
1. a shared data store
12+
2. components watching for changes to said store
13+
3. domain-specific REST API
14+
15+
The third point is key because it allowed for flexibility. You can already examples of this extensibility through operators or in the form of CRDs (Custom Resource Definitions). Anyways, we should be good with the history now.
16+
17+
18+
## Declare Your Will {#declare-your-will}
19+
20+
The big idea of Kubernetes is **declarative automation**, you describe what you want and the system tries its best to reach that state. This differs from **imperative automation** where you instead list the steps. Anyways kubernetes was the result of incorporating declarative automation from the get go instead of hacking imperative automation into a declarative one.
21+
22+
This is kind of big, because it is much easier to overlay declarative layers than imperative layers since there is much less information leaked through declarative automation. You are essentially just saying, "I want this, I don't care how you get there but just get me there", while with imperative you greatly constrain the system to the point where adding layers becomes difficult.
23+
24+
25+
## Automate Everything {#automate-everything}
26+
27+
Now that you can describe state, you should be able to store it somewhere too right? In K8, states can be dynamic configuration like a ConfigMap or a Secret or even configuration for components themselves like a LoadBalancer, a Service, a Route, or even a HorizontalPodAutoscaling Policy. Or if an application is stateful, a StatefulSet is required.
28+
29+
These "components" and "configurations" are standardized but of course you can define your own, so long as you provide a means of interpreting your state. And since they are so easily described, they can be easily modified too. Which leads us to
30+
[GitOps](@/notes/20260523033331-gitops.md)! You store your configs (manifest files) somewhere, and then since they are soooo easy to modify (they are just text after all), you can trigger modifications from another repository, see [GitOps Pipelines Example](@/notes/20260529032917-gitops_pipelines_example.md).
31+
32+
Then you can ArgoCD or flux to monitor changes to your manifest repo and automatically roll out deployments. And after some time, you might realize that you can have your manifest repo generate manifest files by itself which it feeds to K8. I believe this step is optional, but the big plus of this is that you can see past the abstractions of kustomize and see what your "manifests" actually look like.
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
+++
2+
title = "GitLab Pipelines Basics"
3+
date = 2026-06-02
4+
updated= 2026-06-03
5+
+++
6+
7+
## Introduction {#introduction}
8+
9+
Quick rundown of basics for GitLab pipelines. Pretty simple, you organize jobs into stages. The stages are ran consecutively, suppose you have the following stages
10+
11+
```yaml
12+
stages:
13+
- A
14+
- B
15+
- C
16+
17+
job1:
18+
stage: A
19+
20+
job2:
21+
stage: A
22+
23+
job3:
24+
stage: B
25+
26+
job4:
27+
stage: C
28+
```
29+
30+
All jobs in `stage A` must be successful before any jobs in `stage B` can be ran. And a similar process applies for `stage C`. Now if you want to specify order within a stage you can use either `needs: [job1, job2, ...]` or `dependencies: [job1, job2, ...]`. The major difference between the two is use `needs` if you want to **control the order of execution** but use `dependencies` to control the **order the artifacts of jobs are downloaded**. I seem to use `needs` more often, but ymmv.
31+
32+
33+
## Workflows {#workflows}
34+
35+
**Workflows** control when a pipeline runs while **rules** control when a job runs.
36+
37+
```yaml
38+
workflow:
39+
rules:
40+
# Run pipeline for merge requests
41+
- if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
42+
when: always
43+
# Run pipeline for for tags
44+
- if: '$CI_COMMIT_TAG' # I think you can use branch name t\infty
45+
when: always
46+
# If you want, but it is common to have pipelines run for merges to the default branch
47+
- if: '$CI_COMMIT_BRANCH == main' # can also use regex or $CI_DEFAULT_BRANCH
48+
when: always
49+
# This is generally recommended, but note that this denies run for
50+
# everything other than the stuff you specified above
51+
- when: never
52+
53+
# ... Rest of file is ommited for conciseness ...
54+
55+
# Make this job have stricter requirements
56+
make-commit:
57+
stage: last
58+
scripts: # make commit to manifest repo or whatever
59+
rules:
60+
# Only run on pushes to dev branch
61+
- if: '$CI_COMMIT_BRANCH == "dev" && $CI_PIPLINE_SOURCE == push'
62+
when: on_success
63+
- when: never
64+
```
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
+++
2+
title = "Rocket Parts"
3+
date = 2026-06-03
4+
updated= 2026-06-03
5+
+++
6+
7+
## Main Definitions {#main-definitions}
8+
9+
This is just going to be a garble of information
10+
11+
nose cone
12+
: self explanatory, the pointy thing in front of the rocket
13+
14+
payload bay
15+
: this stores what you want to carry and is generally made up of a shorter body tube, tube coupler, a bulkhead which closes the bottom of the coupler, and an eyebolt for the parachute
16+
17+
airframe
18+
: another name for the main body tube (this is the longer tube)
19+
20+
motor mount tube
21+
: these are smaller diameter tubes which sits in the center of your body tubes and holds your motor
22+
23+
24+
## Payload {#payload}
25+
26+
The payload bay was kind of confusing, but it generally is like this, from top top to bottom
27+
28+
1. nose cone: you know this
29+
2. payload body tube: just a shorter tube, same diameter as airframe
30+
3. payload: can be anything, like an electronics bay or an egg even
31+
4. tube coupler: a short tube with a diameter slightly smaller than the airframe
32+
5. bulkhead: closes the bottom of the coupler
33+
34+
The purpose of the tube coupler is to connect the payload tube to the airframe tube.
35+
36+
37+
## More Definitions {#more-definitions}
38+
39+
Now we get to auxillary smaller parts of the rockets
40+
41+
motor retainer
42+
: anything which keeps the motor from falling out, search online or take a look at LOC's Aero Pack
43+
44+
centering rings
45+
: these are circular wood (or any material) donut-shaped which center the motor mount tube within the body tube
46+
47+
fins
48+
: you probably don't need a definition for this
49+
50+
launch lug
51+
: basically a rod like attachment to your rocket to allow it to be launched from a launch rod
52+
53+
rail buttons
54+
: similar to launch lug, these are small buttons which allows your rocket to be launched from a rail
55+
56+
parachute
57+
: the thing that saves your rocket from a gruesome fate of falling to its demise
58+
59+
nylon shock cord
60+
: attaches between the eyebolt of the bulkhead to the eyebolt on the topmost centering ring of your rocket, the parachute is also attached to this
61+
62+
recovery blanket
63+
: a small sheet of fabric to protect the parachute and shock cord from the ejection charge
64+
65+
shock cord sleeve
66+
: protects the shock cord from the ejection charge (optional but recommended)
67+
68+
quick links
69+
: connects the shock cord to the eyebolts
70+
71+
The **ejection charge** is a force directly towards the nose cone emitted by the motor for the purpose of popping the nose cone portions off and deploying the parachute.
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
+++
2+
title = "Dual Deployment"
3+
date = 2026-06-03
4+
updated= 2026-06-03
5+
+++
6+
7+
## Introduction {#introduction}
8+
9+
Rockets which fly high spend more time in the air, especially with a parachute. While the parachute does prevent the rocket from being destroyed in its fall, it also gives the wind and sky more time to blow the rocket to another state or country. This is more of a problem for the high apogee rockets of course.
10+
11+
12+
## Single Deploy {#single-deploy}
13+
14+
The main way of solving this is through **dual deployment**. For single deploy, the parachute is triggered by an ejection charge, see [Rocket Parts](@/notes/20260603015639-rocket_parts.md) for what that is and how it works. However ejection charges are at the end of the day, a primitive timing method which is rather inaccurate.
15+
16+
What is often used instead is an \*altimeter. The altimeter measures the altitude and at apogee triggers some black power to deploy the parachute. This is usually done via voltage to an igniter which is stuffed into black powder.
17+
18+
As a side note, apogee is the highest point traveled by the rocket, so there is no vertical motion and it is moving very slowly. This is generally a good time to deploy the parachute. Buuuuuuuuut... if you remember from the introduction, the rocket is going to be very far from you.
19+
20+
21+
## Dual Deployment {#dual-deployment}
22+
23+
So we can't deploy at apogee since it is very high up. What if we deploy lower down? Unfortunately, the high speed when the parachute is deployed will tear the parachute into pieces. And the body tube (if wood) might also be shredded (called **zippering**) by the shock cord.
24+
25+
Instead you can use a smaller parachute or a streamer at apogee. This deployment is called **apogee event** or **drogue event** hence the parachute is also called a **drogue parachute**. For medium-size rockets, you can get away with deploying nothing at apogee and letting the nose cone portion spin around is sufficient for speed reduction.
26+
27+
Then at a lower altitude another parachute is deployed. This time it is the **main parachute** deployed at the **main event**. The two most common methods of doing a dual deploy are
28+
29+
1. [Cable Cutter Dual Deploy](@/notes/20260603030110-cable_cutter_dual_deploy.md)
30+
2. [Two Parachute Dual Deploy](@/notes/20260603030122-two_parachute_dual_deploy.md)
31+
32+
Either way works, but it seems like cable cutter is pretty nice because it is easily applied to any rocket.
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
+++
2+
title = "Cable Cutter Dual Deploy"
3+
date = 2026-06-03
4+
updated= 2026-06-03
5+
+++
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
+++
2+
title = "Two Parachute Dual Deploy"
3+
date = 2026-06-03
4+
updated= 2026-06-03
5+
+++

static/favicon.ico

15 KB
Binary file not shown.

static/giallo-dark.css

Lines changed: 163 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,163 @@
1+
/*
2+
* theme "kanagawa-dragon" generated by giallo
3+
*/
4+
5+
.z-code {
6+
color: #C5C9C5;
7+
background-color: #181616;
8+
}
9+
10+
.z-hl {
11+
background-color: #393836;
12+
}
13+
14+
.giallo-ln {
15+
color: #625E5A;
16+
}
17+
18+
.z-comment { color: #737C73; }
19+
.z-variable { color: #C5C9C5; }
20+
.z-invalid { color: #E82424; }
21+
.z-punctuation { color: #9E9B93; }
22+
.z-string { color: #8A9A7B; }
23+
.z-\2a url\2a { text-decoration: underline; }
24+
.z-\2a link\2a { text-decoration: underline; }
25+
.z-\2a uri\2a { text-decoration: underline; }
26+
.z-JSXNested { color: #C5C9C5; }
27+
.z-string { font-weight: bold; }
28+
.z-string { color: #C4746E; font-weight: bold; }
29+
.z-string { color: #C4746E; font-weight: bold; }
30+
.z-string { color: #C4746E; font-weight: bold; }
31+
.z-invalid.z-illegal { color: #E82424; }
32+
.z-storage.z-type { color: #8992A7; }
33+
.z-storage.z-modifier { color: #8992A7; }
34+
.z-keyword.z-control { color: #8992A7; }
35+
.z-meta.z-tag { color: #8992A7; }
36+
.z-keyword.z-other { color: #8992A7; }
37+
.z-keyword.z-operator { color: #C4B28A; }
38+
.z-meta.z-brace { color: #9E9B93; }
39+
.z-meta.z-function-call { color: #8BA4B0; }
40+
.z-variable.z-function { color: #8BA4B0; }
41+
.z-support.z-function { color: #8BA4B0; }
42+
.z-constant.z-numeric { color: #B6927B; }
43+
.z-constant.z-language { color: #B6927B; }
44+
.z-support.z-constant { color: #B6927B; }
45+
.z-constant.z-character { color: #B6927B; }
46+
.z-constant.z-escape { color: #B6927B; }
47+
.z-constant.z-numeric { color: #A292A3; }
48+
.z-markup.z-heading { color: #8A9A7B; }
49+
.z-entity.z-name { color: #8EA4A2; }
50+
.z-support.z-type { color: #8EA4A2; }
51+
.z-support.z-class { color: #8EA4A2; }
52+
.z-keyword.z-blade { color: #8992A7; }
53+
.z-keyword.z-import { color: #B6927B; }
54+
.z-meta.z-import { color: #B6927B; }
55+
.z-variable.z-language { color: #C4746E; }
56+
.z-markup.z-inserted { color: #76946A; }
57+
.z-markup.z-deleted { color: #C34043; }
58+
.z-markup.z-changed { color: #DCA561; }
59+
.z-string.z-regexp { color: #B98D7B; }
60+
.z-text.z-html { color: #C5C9C5; }
61+
.z-text.z-log { color: #C5C9C5; }
62+
.z-markdown.z-heading { color: #8BA4B0; }
63+
.z-markup.z-italic { color: #C4746E; font-style: italic; }
64+
.z-markup.z-bold { font-weight: bold; }
65+
.z-markup.z-underline { color: #949FB5; text-decoration: underline; }
66+
.z-markup.z-quote { font-style: italic; }
67+
.z-meta.z-separator { color: #9E9B93; font-weight: bold; }
68+
.z-markup.z-table { color: #C5C9C5; }
69+
.z-variable.z-other { color: #C5C9C5; }
70+
.z-keyword.z-control { color: #949FB5; }
71+
.z-markup.z-italic { color: #C4746E; font-weight: bold; }
72+
.z-markup.z-bold { color: #C4746E; font-weight: bold; }
73+
.z-markup.z-bold { color: #C4746E; font-weight: bold; }
74+
.z-punctuation.z-definition.z-comment { color: #737C73; }
75+
.z-constant.z-other.z-color { color: #B6927B; }
76+
.z-keyword.z-control.z-flow { color: #8992A7; font-weight: bold; }
77+
.z-keyword.z-control.z-conditional { color: #8992A7; font-weight: bold; }
78+
.z-keyword.z-control.z-loop { color: #8992A7; font-weight: bold; }
79+
.z-constant.z-other.z-color { color: #8992A7; }
80+
.z-keyword.z-other.z-template { color: #8992A7; }
81+
.z-keyword.z-other.z-substitution { color: #8992A7; }
82+
.z-keyword.z-control.z-trycatch { color: #C4746E; font-weight: bold; }
83+
.z-keyword.z-other.z-unit { color: #C4B28A; }
84+
.z-punctuation.z-definition.z-tag { color: #9E9B93; }
85+
.z-punctuation.z-section.z-embedded { color: #9E9B93; }
86+
.z-keyword.z-operator.z-namespace { color: #9E9B93; }
87+
.z-entity.z-name.z-tag { color: #C4B28A; }
88+
.z-meta.z-tag.z-sgml { color: #C4B28A; }
89+
.z-entity.z-name.z-function { color: #8BA4B0; }
90+
.z-keyword.z-other.z-special-method { color: #949FB5; }
91+
.z-variable.z-other.z-enummember { color: #B6927B; }
92+
.z-support.z-other.z-variable { color: #C5C9C5; }
93+
.z-string.z-other.z-link { color: #949FB5; }
94+
.z-constant.z-language.z-boolean { color: #B6927B; }
95+
.z-punctuation.z-definition.z-string { color: #8A9A7B; }
96+
.z-constant.z-other.z-symbol { color: #8A9A7B; }
97+
.z-constant.z-other.z-key { color: #8A9A7B; }
98+
.z-entity.z-other.z-inherited-class { color: #8A9A7B; }
99+
.z-markup.z-inserted.z-git_gutter { color: #8A9A7B; }
100+
.z-meta.z-use.z-php { color: #8EA4A2; }
101+
.z-support.z-type.z-sys-types { color: #8EA4A2; }
102+
.z-entity.z-name.z-namespace { color: #C4B28A; }
103+
.z-variable.z-other.z-property { color: #C4B28A; }
104+
.z-keyword.z-control.z-import { color: #B6927B; }
105+
.z-variable.z-function.z-constructor { color: #949FB5; }
106+
.z-entity.z-other.z-attribute-name { color: #8992A7; }
107+
.z-constant.z-character.z-escape { color: #949FB5; }
108+
.z-meta.z-jsx.z-children { color: #C5C9C5; }
109+
.z-text.z-html.z-markdown { color: #C5C9C5; }
110+
.z-markup.z-heading.z-markdown { color: #8BA4B0; }
111+
.z-markup.z-raw.z-block { color: #8992A7; }
112+
.z-constant.z-other.z-placeholder { color: #C5C9C5; }
113+
.z-support.z-type.z-property-name { color: #8EA4A2; }
114+
.z-support.z-type.z-property-name { color: #8EA4A2; }
115+
.z-support.z-type.z-property-name { color: #8EA4A2; }
116+
.z-support.z-type.z-property-name { color: #8EA4A2; }
117+
.z-support.z-type.z-property-name { color: #8EA4A2; }
118+
.z-support.z-type.z-property-name { color: #8EA4A2; }
119+
.z-keyword.z-other.z-definition.z-ini { color: #B6927B; }
120+
.z-punctuation.z-separator.z-inheritance.z-php { color: #9E9B93; }
121+
.z-punctuation.z-definition.z-tag.z-html { color: #9E9B93; }
122+
.z-keyword.z-operator.z-type.z-annotation { color: #9E9B93; }
123+
.z-entity.z-name.z-function.z-macro { color: #C4746E; }
124+
.z-markup.z-inline.z-raw.z-string { color: #8A9A7B; }
125+
.z-support.z-other.z-namespace.z-php { color: #8EA4A2; }
126+
.z-entity.z-name.z-type.z-module { color: #C4B28A; }
127+
.z-entity.z-name.z-import.z-go { color: #8A9A7B; }
128+
.z-entity.z-name.z-module.z-js { color: #C4746E; }
129+
.z-variable.z-import.z-parameter.z-js { color: #C4746E; }
130+
.z-variable.z-other.z-class.z-js { color: #C4746E; }
131+
.z-entity.z-name.z-method.z-js { color: #949FB5; }
132+
.z-entity.z-other.z-attribute-name.z-class { color: #C4B28A; }
133+
.z-punctuation.z-definition.z-list_item.z-markdown { color: #C5C9C5; }
134+
.z-entity.z-name.z-section.z-markdown { color: #8BA4B0; }
135+
.z-punctuation.z-definition.z-fenced.z-markdown { color: #737C73; }
136+
.z-variable.z-language.z-fenced.z-markdown { color: #C5C9C5; }
137+
.z-punctuation.z-section.z-class.z-end { color: #C5C9C5; }
138+
.z-variable.z-language.z-fenced.z-markdown { color: #737C73; }
139+
.z-entity.z-name.z-function.z-js { color: #949FB5; }
140+
.z-entity.z-name.z-tag.z-js { color: #8992A7; }
141+
.z-punctuation.z-definition.z-tag.z-js { color: #8992A7; }
142+
.z-markup.z-inline.z-raw.z-markdown { color: #8992A7; }
143+
.z-punctuation.z-definition.z-blockquote.z-markdown { color: #737C73; }
144+
.z-string.z-unquoted.z-label.z-js { color: #8A9A7B; }
145+
.z-string.z-unquoted.z-label.z-js { color: #C4746E; }
146+
.z-support.z-type.z-property-name.z-json { color: #A292A3; }
147+
.z-punctuation.z-definition.z-raw.z-markdown { color: #8992A7; }
148+
.z-support.z-type.z-property-name.z-json { color: #C4B28A; }
149+
.z-support.z-type.z-property-name.z-json { color: #B6927B; }
150+
.z-support.z-type.z-property-name.z-json { color: #C4746E; }
151+
.z-support.z-type.z-property-name.z-json { color: #B6927B; }
152+
.z-support.z-type.z-property-name.z-json { color: #8BA4B0; }
153+
.z-support.z-type.z-property-name.z-json { color: #A292A3; }
154+
.z-support.z-type.z-property-name.z-json { color: #8992A7; }
155+
.z-support.z-type.z-property-name.z-json { color: #8A9A7B; }
156+
.z-punctuation.z-definition.z-tag.z-begin.z-html { color: #9E9B93; }
157+
.z-punctuation.z-definition.z-tag.z-end.z-html { color: #9E9B93; }
158+
.z-support.z-other.z-namespace.z-use.z-php { color: #8EA4A2; }
159+
.z-string.z-other.z-link.z-title.z-markdown { color: #B6927B; }
160+
.z-constant.z-other.z-reference.z-link.z-markdown { color: #C4B28A; }
161+
.z-markup.z-raw.z-block.z-fenced.z-markdown { color: #737C73; }
162+
.z-markup.z-raw.z-block.z-fenced.z-markdown { color: #C5C9C5; }
163+
.z-string.z-other.z-link.z-description.z-title.z-markdown { color: #8992A7; }

0 commit comments

Comments
 (0)