<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <title>Douglops - notes and banters</title>
    <subtitle>Tales from the neverending sea of diffs</subtitle>
    <link rel="self" type="application/atom+xml" href="/atom.xml"/>
    <link rel="alternate" type="text/html" href="/"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2026-09-27T00:00:00+00:00</updated>
    <id>/atom.xml</id>
    <entry xml:lang="en">
        <title>visitors from above? what the world&#39;s sacred texts actually say about non-human intelligences</title>
        <published>2026-09-27T00:00:00+00:00</published>
        <updated>2026-09-27T00:00:00+00:00</updated>
        
        <author>
          <name>
            Douglas
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="/visitors-from-above/"/>
        <id>/visitors-from-above/</id>
        
        <content type="html" xml:base="/visitors-from-above/">&lt;p&gt;💡 &lt;em&gt;This was an exercise in AI-assisted research: a team of AI research agents indexed &lt;a rel=&quot;external&quot; href=&quot;https://sacred-texts.com/&quot;&gt;sacred-texts.com&lt;/a&gt; and &lt;a rel=&quot;external&quot; href=&quot;https://www.bibliotecapleyades.net/&quot;&gt;Biblioteca Pleyades&lt;/a&gt;, close-read the relevant texts, verified every quotation by script against its source, and compiled the result into a 47-page paper. Take it with the usual caution, and open an issue on GitHub if you find any errors.&lt;/em&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;Do the world&#39;s religions and myths preserve memories of contact with beings from the sky, the stars, other planets or &quot;other dimensions&quot;? I tried to answer that by reading the sources instead of cherry-picking them.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&quot;where-this-started&quot;&gt;where this started&lt;/h2&gt;
&lt;p&gt;The question was simple and very old: do the world&#39;s religions and myths preserve memories of contact with beings from the sky, the stars, other planets or &quot;other dimensions&quot;? This is the claim behind a whole shelf of popular books, from &lt;em&gt;Chariots of the Gods?&lt;/em&gt; to &lt;em&gt;The 12th Planet&lt;/em&gt; and &lt;em&gt;The Sirius Mystery&lt;/em&gt;. It is usually argued by quoting a few striking passages: Ezekiel&#39;s wheels, the Watchers of Enoch, the flying &lt;em&gt;vimānas&lt;/em&gt; of the Indian epics, the Dogon star lore.&lt;/p&gt;
&lt;p&gt;We wanted to do the opposite of cherry-picking. We would read as much of the primary material as we could, code what it says, check every quotation against its source, and only then ask what explains the pattern.&lt;/p&gt;
&lt;p&gt;The starting point was the &lt;strong&gt;African section of the Internet Sacred Text Archive&lt;/strong&gt; (&lt;a rel=&quot;external&quot; href=&quot;https://sacred-texts.com/afr/index.htm&quot;&gt;sacred-texts.com/afr&lt;/a&gt;). It turned out to be a revealing place to begin. Its 29 books are not &quot;African scriptures&quot;. They are one medieval Ethiopian epic (the &lt;em&gt;Kebra Nagast&lt;/em&gt;), a set of colonial-era ethnographies and folklore collections made by missionaries and officials between 1868 and 1940, and some diaspora and Rastafarian writing. The famous Dogon &quot;Sirius&quot; material is not there at all. That discovery set the tone for the project: before asking what a tradition says, you have to ask who wrote it down, when, and why.&lt;/p&gt;
&lt;h2 id=&quot;how-the-research-was-organised&quot;&gt;how the research was organised&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;1. Indexing.&lt;/strong&gt; We first mapped the whole sacred-texts site. That meant 77 top-level categories and 261 entries, each rated for relevance and tagged with twelve motif codes: sky descent, culture-bringer, forbidden knowledge, hybrid offspring, celestial vehicles, star-people, time dilation, abduction or otherworld journey, plurality of worlds, hidden peoples or &quot;other dimensions&quot;, channelled contact, and war among sky beings. Twenty-two categories (among them Sikhism, the Confucian canon, alchemy and Tarot) had nothing relevant.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. Gap-filling from Biblioteca Pleyades.&lt;/strong&gt; Sacred-texts has big holes. It has no Dogon ethnography, no &lt;em&gt;Vaimānika Śāstra&lt;/em&gt;, no full &lt;em&gt;Popol Vuh&lt;/em&gt;, no Qumran Book of Giants, and nothing Korean. We filled what we could from the aggregator &lt;a rel=&quot;external&quot; href=&quot;https://www.bibliotecapleyades.net/&quot;&gt;bibliotecapleyades.net&lt;/a&gt;, which we indexed separately (166 items). It is overwhelmingly fringe (101 of the 166 items). We used it strictly as an access copy. Whenever a page reproduced a published work, we cite the original publication. We flagged the places where the aggregator&#39;s copies are unattributed, mislabelled (Korean myths filed under &quot;China&quot;), altered, or contain editorial insertions.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. Six regional workstreams.&lt;/strong&gt; Close reading was split into six areas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the ancient Near East and Abrahamic traditions;&lt;/li&gt;
&lt;li&gt;Africa;&lt;/li&gt;
&lt;li&gt;South and East Asia;&lt;/li&gt;
&lt;li&gt;Celtic and Northern Europe;&lt;/li&gt;
&lt;li&gt;the Americas and the Pacific;&lt;/li&gt;
&lt;li&gt;modern esoteric and UFO literature, read as &lt;em&gt;reception&lt;/em&gt; rather than as evidence about antiquity.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Each workstream produced a file of passages, an analytic essay, and a bibliography.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. Verification.&lt;/strong&gt; Every quotation, 314 in all, was checked by script against the fetched page text. Each passage records the translator and date, the URL and locator, the motif codes, a source type and a strength rating. The source types are primary text, ethnographic record, secondary scholarship, fringe/esoteric, and critical scholarship. Quotations in the paper were inserted mechanically from the verified corpus, so none of them can drift from its source.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5. Five hypotheses, none assumed.&lt;/strong&gt; For every motif we asked which of five explanations fits best:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;H1:&lt;/strong&gt; literal contact;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;H2:&lt;/strong&gt; cultural diffusion and literary borrowing;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;H3:&lt;/strong&gt; shared cognitive and structural myth-making;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;H4:&lt;/strong&gt; translation and editorial artefacts;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;H5:&lt;/strong&gt; modern reinterpretation.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We were explicit from the start that &lt;strong&gt;texts cannot prove or disprove literal contact&lt;/strong&gt;. What they can show is whether the motifs, as actually attested, &lt;em&gt;require&lt;/em&gt; it.&lt;/p&gt;
&lt;h2 id=&quot;what-we-found&quot;&gt;what we found&lt;/h2&gt;
&lt;h3 id=&quot;the-motifs-are-real-and-often-ancient&quot;&gt;the motifs are real and often ancient&lt;/h3&gt;
&lt;p&gt;This needs saying first, because debunking sometimes forgets it. The world&#39;s literatures really are full of non-human intelligences who come down from the sky and interact with people:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the Watchers of 1 Enoch, who descend on Mount Hermon, father giants and teach metallurgy and astrology;&lt;/li&gt;
&lt;li&gt;the Yoruba gods who climb down a chain from Heaven to make land at Ife;&lt;/li&gt;
&lt;li&gt;the tailed sky-race from which a Chaga clan claims descent;&lt;/li&gt;
&lt;li&gt;Indra&#39;s chariot and Rāvaṇa&#39;s Pushpaka;&lt;/li&gt;
&lt;li&gt;Ninigi descending from the High Plain of Heaven to found Japan&#39;s imperial line;&lt;/li&gt;
&lt;li&gt;the Irish &lt;em&gt;síd&lt;/em&gt;-folk who take new mothers to nurse their children;&lt;/li&gt;
&lt;li&gt;the Iroquoian &quot;man-beings&quot; who live beyond the visible sky.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sky descent, culture-bringers, divine–human unions, otherworld journeys and hidden peoples turn up in every region we studied.&lt;/p&gt;
&lt;h3 id=&quot;but-the-details-don-t-look-like-spacecraft&quot;&gt;but the details don&#39;t look like spacecraft&lt;/h3&gt;
&lt;p&gt;When you line the passages up, several patterns stand out.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;No traditional text names a planet of origin.&lt;/strong&gt; &quot;Heaven&quot; is a roof, a court or a layer of the cosmos, not a place in space. Stars are persons (Cherokee, /Xam, Ojibwa), angels (1 Enoch), or humans transformed (Pleiades myths on three continents). The one explicit &quot;from the stars&quot; teacher, the Acjachemen Chinigchinich, was recorded by a Franciscan friar in the 1820s and may belong to an early-contact revival movement. A 1909 Irish informant&#39;s idea that the fairies &quot;came from the planets&quot; was, in his own words, &quot;according to my idea&quot;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Every vehicle is divine, magical, visionary or human-made.&lt;/strong&gt; Examples:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;em&gt;Kebra Nagast&lt;/em&gt;&#39;s wagons are lifted &quot;a cubit&quot; by the Archangel Michael.&lt;/li&gt;
&lt;li&gt;Indian flying cities vanish &quot;like a cloud-constructed city&quot;.&lt;/li&gt;
&lt;li&gt;Ezekiel&#39;s wheels are explicitly a &quot;likeness&quot;.&lt;/li&gt;
&lt;li&gt;The only premodern technical flying machine, King Bhoja&#39;s 11th-century mercury-heated wooden bird, is a human automaton.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The celebrated &lt;em&gt;Vaimānika Śāstra&lt;/em&gt; was dictated in the 20th century (1918–23, or 1903–18 on a rival account). Engineers at the Indian Institute of Science found its craft unworkable in 1974.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Forbidden knowledge from heaven is one tradition, not a universal.&lt;/strong&gt; The Watchers&#39; illicit teaching is Mesopotamian sage lore inverted by Second Temple Jewish writers. From there it passed to Ethiopia, Manichaeism and Islam (Hārūt and Mārūt &quot;at Babylon&quot;). Outside that chain, the nearest case, in the &lt;em&gt;Popol Vuh&lt;/em&gt;, runs the other way: the gods &lt;em&gt;withdraw&lt;/em&gt; knowledge from the first humans.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Time dilation is strong but regional.&lt;/strong&gt; It is Celtic (Bran becomes &quot;a heap of ashes&quot;; Oisín ages the moment he touches the ground), Indian (King Raivata waits a &quot;moment&quot; in Brahmā&#39;s court while ages pass), and later Japanese (Urashima). 2 Enoch&#39;s sixty days in heaven equal sixty days on earth.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Channelled contact is modern.&lt;/strong&gt; The only traditional &quot;contactee&quot; we found is a Cherokee story about a man who fakes messages from star spirits and gets caught.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;the-ancient-astronaut-reading-has-a-birth-date&quot;&gt;the &quot;ancient astronaut&quot; reading has a birth date&lt;/h3&gt;
&lt;p&gt;The most striking result came from the modern workstream. Almost every popular &quot;ancient NHI&quot; reading has a &lt;strong&gt;datable first appearance in print&lt;/strong&gt;, and most of them have a documented chain of borrowing. The clearest chain is the &quot;Venus lineage&quot;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Blavatsky (1888):&lt;/strong&gt; spiritual &quot;Lords of the Flame&quot; incarnate in early humanity. There are no ships.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scott-Elliot (1904) and Leadbeater (1912):&lt;/strong&gt; these beings come from Venus.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bailey (1922):&lt;/strong&gt; she dates their descent to &quot;eighteen million years ago&quot;. She never actually names Venus.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A Lovecraft revision (written 1935):&lt;/strong&gt; &quot;the lords of Venus came through space in their ships&quot;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Desmond Leslie (1953), in &lt;em&gt;Flying Saucers Have Landed&lt;/em&gt;:&lt;/strong&gt; he turns the Theosophical descent into &quot;a huge, shining, radiant vessel&quot;, citing only Theosophists. The same book introduces Adamski&#39;s Venusian contact.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The same pattern holds elsewhere:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Atlantean air-ships&lt;/strong&gt; first appear in Scott-Elliot in 1896.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vimāna = aircraft:&lt;/strong&gt; Leslie, 1953.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ezekiel as a flying saucer:&lt;/strong&gt; Williamson, 1953.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The Mahābhārata &quot;nuclear war&quot; verse:&lt;/strong&gt; manufactured in a 1993 bulletin-board file. The real passage has a curse-born iron bolt.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The spacesuited Kayapó hero Bep Kororoti:&lt;/strong&gt; von Däniken, 1973. The 1960 field text is a storm myth.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Taken together, the &lt;strong&gt;technological reading of ancient beings enters the record between 1896 and 1953&lt;/strong&gt;. It comes through Theosophy, pulp fiction and the contactees, not through the traditions themselves (see the timeline below, Figure 5 in the paper).&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/visitors-from-above/timeline.png&quot; alt=&quot;Timeline of first appearances in print of &amp;quot;ancient NHI&amp;quot; readings&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Counting motifs makes this visible. In the traditional primary and ethnographic passages, the commonest motifs are sky descent, hidden peoples and otherworld journeys. In the fringe passages, vehicles and sky descent dominate, and time dilation disappears altogether. The modern reading doesn&#39;t just reinterpret the old motifs. It &lt;em&gt;reweights&lt;/em&gt; them.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/visitors-from-above/motif-heatmap.png&quot; alt=&quot;Motif by region for primary and ethnographic passages&quot; /&gt;&lt;/p&gt;
&lt;h3 id=&quot;surprising-findings-along-the-way&quot;&gt;surprising findings along the way&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;The Dogon &quot;Sirius B&quot; mystery dissolves under restudy.&lt;/strong&gt; The 1950 article describes the companion star &quot;twinkling&quot;, which would make it visible, and Sirius B is not. Walter van Beek&#39;s decade of fieldwork found that no Dogon outside Griaule&#39;s informant circle knew the doctrine. The article itself never claims contact. That idea is Robert Temple&#39;s (1976).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A /Xam control case.&lt;/strong&gt; Detailed 1870s Sirius lore from southern Africa, in which Sirius should &quot;twinkle like Canopus&quot;, has no companion star and no visitors.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Credo Mutwa&#39;s reptilian &quot;Chitauri&quot;.&lt;/strong&gt; They appear in no 19th-century Zulu source. Mutwa turned the &lt;em&gt;imbulu&lt;/em&gt; of a folktale, which Theal in 1886 described as a tailed shape-shifter &quot;believed in by little folks&quot;, into a reptilian alien in an interview arranged through David Icke.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Editors leave fingerprints.&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;A 1926 editor footnoted 2 Enoch&#39;s solar chariot &quot;Cf. &#39;Rapid Transit.&#39;&quot;&lt;/li&gt;
&lt;li&gt;The online text of the Kayapó &quot;space hero&quot; story contains an editor&#39;s interjection, &quot;(or the future? - Red.)&quot;, inside supposedly indigenous speech.&lt;/li&gt;
&lt;li&gt;Mary Kingsley noticed in 1898 that a Kongo spirit was credited with teaching crops that Roman Catholic missionaries had introduced in 1490. This is a perfect demonstration that culture-bringer myths update themselves.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vallée&#39;s quotation may not match his source.&lt;/strong&gt; Evans-Wentz (1911) wrote that a Barra tale &quot;suggests&quot; fairy women resemble succubi. The online text of &lt;em&gt;Passport to Magonia&lt;/em&gt; has &quot;proves conclusively&quot;. This needs checking against the 1969 print.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;so-what-s-left&quot;&gt;so what&#39;s left?&lt;/h2&gt;
&lt;p&gt;No passage we found &lt;em&gt;requires&lt;/em&gt; literal contact. The most &quot;visitor-like&quot; candidate is a white being who &quot;descended from above in a fog&quot; in Callaway&#39;s 1868–70 Zulu texts. It has simpler readings, including a mythologised memory of early European contact. But an honest summary shouldn&#39;t stop at &quot;debunked&quot;. Some things remain genuinely interesting:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The otherworld taking is everywhere:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the Rwandan Thunder&#39;s bride;&lt;/li&gt;
&lt;li&gt;Enoch&#39;s summons;&lt;/li&gt;
&lt;li&gt;Raivata&#39;s visit to Brahmā;&lt;/li&gt;
&lt;li&gt;Bran and Oisín;&lt;/li&gt;
&lt;li&gt;the fairy-taken nurse;&lt;/li&gt;
&lt;li&gt;the Star Husband&#39;s wives.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Diffusion explains local clusters, but not the whole map.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The supernatural lapse of time&lt;/strong&gt; appears early and far apart: Ireland by the 7th–8th century, India in the first millennium CE, Japan in the 8th century. Nobody has yet done a proper phylogenetic tale-type study of it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Bullard&#39;s puzzle.&lt;/strong&gt; The folklorist Thomas Bullard found modern abduction reports &lt;em&gt;more&lt;/em&gt; uniform than oral folklore ought to be. Whether hypnotic regression and investigator filtering explain that uniformity is an empirical question that could be tested.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;limitations&quot;&gt;limitations&lt;/h2&gt;
&lt;p&gt;The study is textual and English-language. It rests heavily on Victorian translations and on ethnographies collected under colonial conditions, and it did no fieldwork. Sacred-texts has an Anglo-Celtic and Theosophical skew and is thin on Africa, China and living oral traditions. The aggregator copies of Sitchin, Temple, Leslie and Vallée must be checked against print. Some bibliography entries are flagged &quot;verify&quot;, and we have not filled in missing details. The motif counts describe the &lt;em&gt;shape&lt;/em&gt; of our sample, not how often motifs occur in whole traditions.&lt;/p&gt;
&lt;h2 id=&quot;next-steps&quot;&gt;next steps&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Check the flagged quotations against print editions: Vallée 1969, Leslie 1953, Dalley, the Genesis Apocryphon, and the Korean texts.&lt;/li&gt;
&lt;li&gt;Re-read key passages in modern critical editions: Nickelsburg/VanderKam for 1 Enoch, ETCSL for Sumerian, Tedlock for the &lt;em&gt;Popol Vuh&lt;/em&gt;, and a Ge&#39;ez check of the &lt;em&gt;Kebra Nagast&lt;/em&gt;&#39;s &quot;air (or winds)&quot;.&lt;/li&gt;
&lt;li&gt;Close the gaps: Chinese primary texts (Shanhaijing, Chuci), Sahagún and the Anales de Cuauhtitlan for Quetzalcoatl, Griaule&#39;s &lt;em&gt;Dieu d&#39;eau&lt;/em&gt;, and Mutwa&#39;s 1964 &lt;em&gt;Indaba, My Children&lt;/em&gt; (to see whether &quot;Chitauri&quot; predates 1990).&lt;/li&gt;
&lt;li&gt;Run a phylogenetic tale-type analysis of the otherworld time-lapse motif.&lt;/li&gt;
&lt;li&gt;Quantitatively compare the variability of fairy legends with abduction reports, to test Bullard&#39;s uniformity argument.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;p&gt;You can access the rendered PDF file and the original LaTeX source below:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/visitors-from-above/visitors-from-above.pdf&quot;&gt;Read the PDF&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/douglops/blog/tree/main/content/visitors-from-above/visitors-from-above.tex&quot;&gt;Browse the LaTeX source&lt;/a&gt; and its &lt;a rel=&quot;external&quot; href=&quot;https://github.com/douglops/blog/tree/main/content/visitors-from-above/references.bib&quot;&gt;bibliography&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/visitors-from-above/visitors-from-above.zip&quot;&gt;Download the full research package&lt;/a&gt; (zip, 1.3 MB): the paper, LaTeX source, bibliography, figures and evidence corpus&lt;/li&gt;
&lt;/ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>learning industrial controls as an it person</title>
        <published>2026-09-26T00:00:00+00:00</published>
        <updated>2026-09-26T00:00:00+00:00</updated>
        
        <author>
          <name>
            Douglas
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="/learning-industrial-controls/"/>
        <id>/learning-industrial-controls/</id>
        
        <content type="html" xml:base="/learning-industrial-controls/">&lt;p&gt;&lt;strong&gt;Notes on crossing the fence from IT into OT — PLCs, SCADA, MES, and the Purdue model, written down as I learn them.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;This started as a plain study outline put together with Claude while figuring out where to even begin. I&#39;m sharing the compiled version because the on-ramp from software into industrial controls is oddly poorly mapped for people coming from where I&#39;m coming from — take the vendor picks as one reasonable path, not the only one, and open an issue if you spot something wrong.&lt;/em&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;why-cross-over&quot;&gt;why cross over&lt;/h2&gt;
&lt;p&gt;Everything I&#39;ve built professionally lives above an API boundary somewhere. Industrial controls live below one I&#39;d never touched: sensors, relays, motor starters, a PLC scanning inputs in a tight loop, none of it caring what a &lt;code&gt;git blame&lt;/code&gt; is. What pulled me in is that the integration problems are the same shape as the ones I already know — moving data correctly and safely between systems that don&#39;t trust each other — just wearing different clothes. A PLC talking OPC-UA to a SCADA gateway is not that far, conceptually, from a service talking gRPC to another service. The vocabulary is the barrier, not the concepts.&lt;/p&gt;
&lt;p&gt;So this is the guide I wished existed: how the layers fit together, which vendors actually make sense to learn first if you&#39;re targeting emerging markets rather than a US/EU plant, and a path that doesn&#39;t require owning a factory to get hands-on.&lt;/p&gt;
&lt;h2 id=&quot;the-map-the-purdue-model&quot;&gt;the map: the Purdue model&lt;/h2&gt;
&lt;p&gt;Before any vendor or protocol, get this hierarchy straight — it&#39;s the OSI model of this world, and everything else hangs off it. Low to high:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Level 0&lt;/strong&gt; — the physical process itself: sensors, actuators, motors.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Level 1&lt;/strong&gt; — basic control: PLCs and DCS controllers reading and writing Level 0 I/O.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Level 2&lt;/strong&gt; — supervisory control: local HMIs, area-level SCADA.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Level 3&lt;/strong&gt; — site operations: plant-wide SCADA, MES, historians.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Level 3.5 (the DMZ)&lt;/strong&gt; — the IT/OT security boundary. Most of what gets called &quot;systems integration&quot; happens at or across this line.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Level 4/5&lt;/strong&gt; — business systems: ERP, scheduling — the layer most IT people already live in.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Almost all integration work is about moving data safely across these levels, not writing application code the way IT usually means it.&lt;/p&gt;
&lt;h2 id=&quot;glossary-fast&quot;&gt;glossary, fast&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;PLC (Programmable Logic Controller)&lt;/strong&gt; — a ruggedized industrial computer that scans inputs, runs logic, and writes outputs in a continuous loop. Programmed per IEC 61131-3: Ladder Diagram, Function Block Diagram, Structured Text, others.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SCADA (Supervisory Control and Data Acquisition)&lt;/strong&gt; — the software layer that visualizes and supervises PLCs/DCS across a site: tag database, HMI screens, alarms, trends, historian.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MES (Manufacturing Execution System)&lt;/strong&gt; — sits between ERP and the control floor. Tracks work orders, production genealogy, real-time machine status. ISA-95 formally defines this boundary and the data that crosses it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OEE (Overall Equipment Effectiveness)&lt;/strong&gt; — &lt;code&gt;Availability × Performance × Quality&lt;/code&gt;. The one KPI manufacturing lives and dies by, usually computed from MES or historian data.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Systems Integration&lt;/strong&gt; — connecting the above. Mostly protocol work and data modeling, closer to writing an adapter than building an application.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;the-stack-and-why&quot;&gt;the stack, and why&lt;/h2&gt;
&lt;p&gt;I&#39;m building toward emerging markets — Brazil and South America specifically — which changes the calculus from what a US-centric course would recommend. Licensing cost, import lead time, and local support depth matter as much as feature lists.&lt;/p&gt;
&lt;h3 id=&quot;control-layer-siemens-with-a-shorter-word-on-weg&quot;&gt;control layer: siemens, with a shorter word on weg&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Siemens&lt;/strong&gt; (S7-1200/1500, TIA Portal) is the safe default here: the deepest installed base in the region — automotive plants, food and beverage, oil and gas — the largest integrator and technician pool to learn from or eventually hire, local manufacturing presence that softens import duty and lead-time pain, and a used-equipment market deep enough to make hardware cheap once you&#39;re past the learning stage.&lt;/p&gt;
&lt;p&gt;Worth a shorter passage: &lt;strong&gt;WEG&lt;/strong&gt;, a Brazilian manufacturer with a dominant domestic position in motors and drives, now building out its own CLP line. It matters when a plant already standardizes on WEG motors and drives — one vendor for the whole motor-to-control chain simplifies commissioning — or when local support and zero import friction outweigh Siemens&#39; bigger ecosystem. The trade-off is smaller name recognition outside Brazil if the skill needs to travel.&lt;/p&gt;
&lt;h3 id=&quot;scada-ignition&quot;&gt;SCADA: Ignition&lt;/h3&gt;
&lt;p&gt;Traditional SCADA licensing (Wonderware, WinCC) charges per tag, which gets expensive fast on a real plant and actively punishes learning by trying things. &lt;strong&gt;Ignition&lt;/strong&gt; (Inductive Automation) licenses per server instead — unlimited tags, unlimited clients — and ships a genuinely modern, web-based client (Perspective) alongside the older desktop-style one (Vision). Inductive University, their free training platform, is the best on-ramp I&#39;ve found for any of this: structured, free, certificate-backed.&lt;/p&gt;
&lt;h3 id=&quot;the-glue-modbus-opc-ua&quot;&gt;the glue: Modbus + OPC-UA&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Modbus TCP&lt;/strong&gt; is the simplest possible protocol here — a client polls a server for coils and registers, no security model, but nearly every PLC and field device speaks it. Good first protocol precisely because there&#39;s nothing to hide behind.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;OPC-UA&lt;/strong&gt; is the one that feels like home coming from IT: an object-oriented, structured address space instead of flat registers, with real certificate-based security built in. It&#39;s also the primary path from a Siemens S7-1500 into Ignition. (The S7-1200 needs a bit more care — OPC-UA server support depends on the CPU firmware version, check before assuming it&#39;s there.)&lt;/p&gt;
&lt;p&gt;Where each fits: Modbus for simple field devices and legacy gear, OPC-UA for structured PLC-to-SCADA/MES data exchange.&lt;/p&gt;
&lt;h2 id=&quot;how-i-m-actually-learning-this&quot;&gt;how i&#39;m actually learning this&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Electrical fundamentals&lt;/strong&gt; — digital vs. analog I/O, 4-20mA current loops, relays, motor starters, reading a basic circuit.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Siemens ladder logic&lt;/strong&gt; — TIA Portal plus PLCSIM, its bundled simulator, so no hardware is required to start.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ignition&lt;/strong&gt; — the Inductive University track, pointed at PLCSIM over a simulated OPC-UA connection.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A real integration project&lt;/strong&gt; — a PLC, real or simulated, talking both Modbus TCP and OPC-UA into Ignition, tags flowing end to end.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MES and OEE&lt;/strong&gt; — the ISA-95 data model, then a simple OEE calculation built on top of simulated machine-state tags inside Ignition.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;books-and-resources&quot;&gt;books and resources&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Books&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Industrial Automation: Hands On&lt;/em&gt; — Frank Lamb. Written for exactly this IT-to-OT switch, start here.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Programmable Logic Controllers&lt;/em&gt; — Frank Petruzella. The standard PLC textbook.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Electrical Motor Controls for Integrated Systems&lt;/em&gt; — Rockis and Mazur. Electrical fundamentals tied directly to PLC context.&lt;/li&gt;
&lt;li&gt;The ISA-95 standard itself (Enterprise-Control System Integration) — dense, but it&#39;s the canonical MES/ERP data model, worth owning rather than reading summaries of.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;SCADA: Supervisory Control and Data Acquisition&lt;/em&gt; — Stuart A. Boyer (ISA).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Free or cheap, online&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https://inductiveuniversity.com&quot;&gt;Inductive University&lt;/a&gt; — free Ignition and SCADA training with certificates, the best structured starting point I found.&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https://realpars.com&quot;&gt;RealPars&lt;/a&gt; — the best general explainer videos for PLCs, instrumentation, and SCADA, free on YouTube with paid tiers beyond that.&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https://plcfiddle.com&quot;&gt;PLC Fiddle&lt;/a&gt; — a browser-based ladder logic simulator, zero hardware required.&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https://www.automationdirect.com&quot;&gt;AutomationDirect&lt;/a&gt; — free PLC training paired with genuinely cheap hardware.&lt;/li&gt;
&lt;li&gt;r/PLC and r/automation — active, and the IT-to-OT switch is a recurring topic, not a novelty there.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Hardware, cheap first&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Click PLC (~$100, AutomationDirect) — the cheapest real first PLC worth owning.&lt;/li&gt;
&lt;li&gt;A Siemens S7-1200 starter kit — pricier, but matches this stack directly.&lt;/li&gt;
&lt;li&gt;A used Allen-Bradley MicroLogix off eBay — only if a Rockwell-standardized client or job actually needs it.&lt;/li&gt;
&lt;li&gt;Raspberry Pi running Ignition Edge — a cheap, always-on SCADA sandbox.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;project-ideas-roughly-in-order&quot;&gt;project ideas, roughly in order&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Simulate a Siemens PLC in PLCSIM, expose it over OPC-UA, connect Ignition to it, build one live HMI screen.&lt;/li&gt;
&lt;li&gt;A Click PLC over Modbus TCP, polled by Ignition — the simplest real-hardware integration available.&lt;/li&gt;
&lt;li&gt;A simulated machine with run/idle/fault states feeding Ignition tags, turned into a basic OEE dashboard: Availability × Performance × Quality, computed for real instead of quoted as a formula.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;still-missing-running-list&quot;&gt;still missing (running list)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;A step-by-step TIA Portal setup walkthrough.&lt;/li&gt;
&lt;li&gt;An Ignition Gateway install and first-project walkthrough.&lt;/li&gt;
&lt;li&gt;Common ladder logic patterns: start/stop/seal-in, motor interlocks, timers and counters.&lt;/li&gt;
&lt;li&gt;The ISA-95 data model, mapped concretely onto an Ignition or MES data structure.&lt;/li&gt;
&lt;li&gt;IT/OT security basics: the Level 3.5 DMZ, network segmentation, what the actual attack surface looks like.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This page will grow as each of those gets filled in.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>calisthenics 101</title>
        <published>2026-08-22T00:00:00+00:00</published>
        <updated>2026-08-22T00:00:00+00:00</updated>
        
        <author>
          <name>
            Douglas
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="/calisthenics/"/>
        <id>/calisthenics/</id>
        
        <content type="html" xml:base="/calisthenics/">&lt;h1 id=&quot;where-it-all-started&quot;&gt;where it all started&lt;/h1&gt;
&lt;p&gt;I&#39;ve always been curious about strength and body building, and a friend taught
me a thing or two about calisthenics in the past. Looking at the growing trend of
body building and aesthetics sold as well being in general, something always
seemed off to me. Years later I&#39;ve started to workout on my own just to rediscover
the world of calisthenics and strength development.&lt;/p&gt;
&lt;p&gt;This developed in me a urge to learn more about how we could leverage our bodies to
get healthier and stronger in any ways possible. This work is a living and growing
development towards that goal.&lt;/p&gt;
&lt;h1 id=&quot;building-a-living-calisthenics-workbook&quot;&gt;building a living calisthenics workbook&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;40 muscles, 40 skills, two editions, and a pipeline that lied to me four times.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Calisthenics has a measurement problem. A barbell athlete adds five kilos and knows
exactly where they are. A bodyweight athlete has one load — themselves — and changes
the movement instead. Which is elegant, until you try to answer &quot;can you do a front
lever?&quot; and discover the honest answer is a matter of opinion.&lt;/p&gt;
&lt;p&gt;So I built the reference I wanted: an anatomy section, forty skills across five levels,
programming that turns the catalogue into a week, and a log to write in. Every skill
carries a &lt;strong&gt;standard&lt;/strong&gt; — an objective, unambiguous description of what owning it means.
Twenty seconds. Chin over the bar. Hips level with the shoulders. Not &quot;getting there.&quot;&lt;/p&gt;
&lt;p&gt;The muscle figures rotate. That was the part I most wanted and least expected to get
for free.&lt;/p&gt;
&lt;h2 id=&quot;what-living-actually-means&quot;&gt;what &quot;living&quot; actually means&lt;/h2&gt;
&lt;p&gt;Two JSON files are the source of truth: &lt;code&gt;muscles.json&lt;/code&gt; and &lt;code&gt;skills.json&lt;/code&gt;. Forty muscle
entries with origin, insertion, action and a note on what the muscle does &lt;em&gt;in this
sport&lt;/em&gt;. Forty skills with level, prerequisites, standard, cues, common faults, and 175
ordered progression steps.&lt;/p&gt;
&lt;p&gt;Everything else is derived. The muscle reference chapter, the skill catalogue, the
coverage matrix showing which muscle groups each skill actually drives, the progression
tracker with a line per step, the benchmark sheet — all generated. Edit the JSON, run
&lt;code&gt;make&lt;/code&gt;, and both editions change together. They cannot drift apart, because there is
nowhere for them to drift &lt;em&gt;to&lt;/em&gt;.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;make&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-3&quot;&gt;            #&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-3&quot;&gt; -&amp;gt; build/workbook.pdf + build/workbook.epub&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The imagery is fetched by script too, not curated by hand into a folder. Anatomical
renders come from the BodyParts3D/Anatomography dataset via Wikimedia Commons, licensed
CC BY-SA. A clean checkout rebuilds the whole thing.&lt;/p&gt;
&lt;h2 id=&quot;why-there-are-two-editions&quot;&gt;why there are two editions&lt;/h2&gt;
&lt;p&gt;A PDF cannot contain a GIF. That is a hard format limit, not an oversight.&lt;/p&gt;
&lt;p&gt;The print edition embeds each animation as a 16-frame sequence played by LaTeX&#39;s
&lt;code&gt;animate&lt;/code&gt; package. It rotates in Adobe Acrobat and shows a clean still frame in
Preview, Chrome and everything else — a designed fallback that loses only the rotation.&lt;/p&gt;
&lt;p&gt;The EPUB has no such limit. There the figures are real animated GIFs, and they move in
Apple Books, Google Play Books, Calibre and Thorium. Kindle is the exception; its
converter flattens them.&lt;/p&gt;
&lt;p&gt;Both come from the same data and the same prose. The reference chapters generate
straight to XHTML; the hand-written chapters run through pandoc. Nothing is written
twice.&lt;/p&gt;
&lt;h2 id=&quot;the-part-worth-writing-down-the-bugs-all-lied&quot;&gt;the part worth writing down: the bugs all lied&lt;/h2&gt;
&lt;p&gt;I expected this project to fail loudly. Instead almost every real bug produced output
that looked &lt;em&gt;fine&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A seashell engraving labelled &quot;Planche.&quot;&lt;/strong&gt; Matching Commons filenames to skill names
seemed obviously correct. It gave me an 18th-century engraving of conches for &quot;Planche&quot;,
a bowl of bean dip for &quot;Dips&quot;, and a Cotswold village for &quot;Row&quot;. Scoping the search to
fitness categories fixed the homonyms and left subtler ones: an empty dip station, a man
leaning on a fence, an acrobat balanced on a partner&#39;s ankles for &quot;Handstand&quot;. There is
no clever fix. Every skill photograph in the book is now on an explicit allow-list,
added only after a human looked at it. In a technique manual a wrong photograph is worse
than none, so 35 of 40 skills simply show nothing in the shareable build.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A muscle of the foot, captioned &quot;Forearm extensors.&quot;&lt;/strong&gt; My alias for the forearm
extensor group was &quot;extensor digitorum&quot; — which matched &lt;em&gt;extensor digitorum brevis&lt;/em&gt;, in
the foot. The plate rendered beautifully. It showed a pair of feet, under a heading
about grip.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A chroma key that dissolved skeletons.&lt;/strong&gt; Some anatomical renders ship on chroma green.
Keying it out seemed trivial. But those particular renders draw a &lt;em&gt;translucent&lt;/em&gt;
skeleton over the backdrop, so the green is blended into the bone pixels themselves —
a tolerance high enough to clear the halo dissolves the skeleton with it. Keying is now
scoped to opaque renders only, where it is safe and fixes a plate that read as a black
hole in the page.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Photographs that looked badly shot and weren&#39;t.&lt;/strong&gt; Several images came out blown to
white and I nearly rejected them as poor sources. They were fine. I was compositing
full-range JPEG onto ffmpeg&#39;s limited-range white generator, which re-maps the levels
and crushes every shadow. The fix is one &lt;code&gt;format=rgba&lt;/code&gt; on each branch. The lesson is
that I almost deleted good material because my own pipeline defamed it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Forty empty directories and a book that rebuilt happily.&lt;/strong&gt; The worst one. Frame
extraction computed a canvas that landed on an odd pixel height. The mjpeg encoder
cannot 4:2:0-subsample an odd side, and it responds by writing &lt;em&gt;no packets at all&lt;/em&gt;
rather than by failing. Extraction &quot;succeeded&quot;, the book rebuilt without error, and the
only symptom was a page count that went to 49 when it should have been 54.&lt;/p&gt;
&lt;p&gt;None of these threw an exception. All of them produced a plausible artefact. The habit
that caught them was rendering pages and contact sheets and &lt;em&gt;looking&lt;/em&gt; — checking output
rather than exit codes.&lt;/p&gt;
&lt;p&gt;There was one loud failure, and it was the polite kind: Wikimedia returns a flat &lt;code&gt;429&lt;/code&gt;
to a generic user agent. Put a real contact URL in it and the same file downloads
instantly. Their policy says exactly this; I just hadn&#39;t read it.&lt;/p&gt;
&lt;h2 id=&quot;licensing-kept-honest-by-the-build&quot;&gt;licensing, kept honest by the build&lt;/h2&gt;
&lt;p&gt;The default build is redistributable. Every image is CC-licensed or public domain, with
per-file credits generated into an appendix from the same manifest the fetcher writes —
so the book cannot credit an image it does not contain.&lt;/p&gt;
&lt;p&gt;There is a second, opt-in path that pulls demonstration footage which is &lt;em&gt;not&lt;/em&gt; freely
licensed, for a personal copy only. It writes to a gitignored directory, and
&lt;code&gt;make shareable&lt;/code&gt; deletes every such asset and rebuilds. The size difference is the
tell: 11 MB and 8 MB for the pair you can share, 26 MB and 18 MB for the one you
cannot.&lt;/p&gt;
&lt;p&gt;I skipped one suggested source entirely because its licence carries a non-commercial
clause, which is incompatible with distributing the book under CC BY-SA. A public-domain
Gray&#39;s plate covered the same muscle.&lt;/p&gt;
&lt;h2 id=&quot;where-it-stands&quot;&gt;where it stands&lt;/h2&gt;
&lt;p&gt;49 pages shareable, 54 with demonstrations. 40 muscle entries, 37 with a plate and 26 of
those animated. 40 skills, 175 progression steps, a coverage matrix, a glossary, and
four printable sheets. About 1,500 lines of Python doing the fetching, the image work
and the generation; the rest is LaTeX and two JSON files.&lt;/p&gt;
&lt;p&gt;The thing I would tell anyone building something similar: put the content in data early,
and check what you produced rather than whether the command exited zero. Both of those
paid for themselves several times over — mostly by catching output that was confidently,
plausibly wrong.&lt;/p&gt;
&lt;h2 id=&quot;how-to-get-it&quot;&gt;how to get it&lt;/h2&gt;
&lt;p&gt;For not making it so easy to freely distribute and allow unintended sharing, the entire project
lives in a .zip file.&lt;/p&gt;
&lt;p&gt;For getting the workbook in the form of a private, non-shareable epub file for personal use only, click &lt;a rel=&quot;external&quot; href=&quot;https://www.16090000.xyz/calisthenics/workbook.epub&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The compressed project lives &lt;a rel=&quot;external&quot; href=&quot;https://sn2r7d3rdsiapabn.public.blob.vercel-storage.com/calisthenics-workbook-project.zip&quot;&gt;here&lt;/a&gt;
and for a convenient pdf file, click &lt;a rel=&quot;external&quot; href=&quot;https://sn2r7d3rdsiapabn.public.blob.vercel-storage.com/workbook.pdf&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The workbook provides a logbook, but for easy of use, consider giving &lt;a rel=&quot;external&quot; href=&quot;https://codeberg.org/Gonbei774/CalisthenicsMemory&quot;&gt;CalisthenicsMemory&lt;/a&gt; a go.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>amateur radio textbook for hackers</title>
        <published>2026-07-21T00:00:00+00:00</published>
        <updated>2026-07-21T00:00:00+00:00</updated>
        
        <author>
          <name>
            Douglas
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="/amateur-radio/"/>
        <id>/amateur-radio/</id>
        
        <content type="html" xml:base="/amateur-radio/">&lt;p&gt;&lt;strong&gt;A Free, Country-Agnostic Textbook for Every Radio Amateur&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Ham radio has a strange problem: the physics is universal, but almost every study guide isn&#39;t. Ohm&#39;s law doesn&#39;t care which country issued your callsign, yet most textbooks are written around one nation&#39;s exam syllabus, band plan, and licensing bureaucracy — which means the moment you cross a border (or just want to actually &lt;em&gt;understand&lt;/em&gt; the material instead of memorizing a question pool), you&#39;re stuck.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;The Complete Amateur Radio Operator&lt;/em&gt; is our attempt to fix that. It grew out of the study materials built for &lt;a rel=&quot;external&quot; href=&quot;https://radioescola.pt&quot;&gt;radioescola.pt&lt;/a&gt;, a resource originally created to help Portuguese candidates prepare for their national amateur radio exam — the diagrams, worked examples, and topic coverage built up there over time turned out to be too good a foundation to keep locked to one country&#39;s syllabus. So I rebuilt it: stripped out everything specific to Portugal&#39;s regulator, rewrote and substantially expanded the technical content in English, and turned it into a free, 175-page textbook covering everything underneath every national amateur radio exam in the world.&lt;/p&gt;
&lt;p&gt;It runs from electricity and circuit theory through AC and reactance, semiconductors and op-amps, receiver architectures, modulation, antennas, transmission lines, and ionospheric propagation — built up from first principles, with worked examples, exam tips, and end-of-chapter problems throughout. It&#39;s organized in five tiers that roughly track the entry-level → intermediate → full-privilege progression used almost everywhere, so you can stop wherever your target license requires, or keep going all the way to advanced RF engineering.&lt;/p&gt;
&lt;p&gt;What it deliberately &lt;em&gt;doesn&#39;t&lt;/em&gt; do is teach any single country&#39;s regulations. Instead, it covers the genuinely international layer — the ITU, IARU, CEPT, the Q-code, the NATO phonetic alphabet, standardized emission designators — the stuff that&#39;s the same whether you&#39;re studying in Lisbon or Lagos or Los Angeles. National band plans and paperwork change; a half-wave dipole doesn&#39;t.&lt;/p&gt;
&lt;p&gt;A few things we&#39;re especially glad made it in: a full appendix of every formula in the book, organized by chapter, for last-minute review, alongside SI prefixes, physical constants, and a resistor color code quick-reference. And a closing bonus chapter, outside the exam material entirely, on aviation, maritime, and military radio monitoring with SDR — ACARS, ADS-B, AIS, NAVTEX, and the rest of the signals now trivially receivable with a $20 USB dongle, framed with a clear-eyed note that monitoring legality varies by country and is worth checking before you start.&lt;/p&gt;
&lt;p&gt;It&#39;s built in LaTeX, with hand-drawn circuit diagrams and plots rather than screenshots, so it reads like an actual textbook rather than a printed webpage.&lt;/p&gt;
&lt;p&gt;Whether you&#39;re chasing your first license or just want to finally understand &lt;em&gt;why&lt;/em&gt; your antenna tuner does what it does, I hope this is useful to you. 73.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;The finished PDF file (check repo for the last updated files) and the tex files can be found below:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/amateur-radio/radio_textbook/main.pdf&quot;&gt;Read the PDF&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/douglops/blog/tree/main/content/amateur-radio/radio_textbook&quot;&gt;Browse the LaTeX source&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>llm seven layers stack model - or - why i&#39;m feeling numb?</title>
        <published>2026-07-19T00:00:00+00:00</published>
        <updated>2026-07-19T00:00:00+00:00</updated>
        
        <author>
          <name>
            Douglas
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="/llm-layers/"/>
        <id>/llm-layers/</id>
        
        <content type="html" xml:base="/llm-layers/">&lt;p&gt;💡 &lt;em&gt;This was an exercise on knowledge compression using inference via Claude to compile an up-to-date textbook, so take it with caution. You can open an issue in Github if you find any errors.&lt;/em&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; LLMs are a growing field, with tools changing as fast as the opening and closing of the Strait of Hormuz. For this reason, I began searching for a model similar to the &quot;OSI&quot; to tame the endless complexity of LLM ecosystems and found a layered taxonomy proposed by Rishav Hada, &lt;a rel=&quot;external&quot; href=&quot;https://futureagi.com/blog/llm-application-tech-stack-2025/&quot;&gt;&quot;LLM Application Tech
Stack in 2026&quot; published last year (2025) in Future AGI&lt;/a&gt;. Focused primarily on technologies, it addresses little of the relationship and technical considerations between each layer, which motivated me to compile a less fragmented and more engineering-oriented body of knowledge.&lt;/p&gt;
&lt;p&gt;Some caveats worth noting:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;the source is published by Future AGI&lt;/li&gt;
&lt;li&gt;which sells into two of the seven layers it describes and ranks itself #1 in one&lt;/li&gt;
&lt;li&gt;the taxonomy itself is sound and I kept it intact, but I put the rankings and the unsourced percentages (40–80% routing savings, 15–30% reranker lift) inside &quot;Source-critical note&quot; boxes with the conditions under which they could hold and the measurement procedure to check them on your own traffic&lt;/li&gt;
&lt;li&gt;presenting those as facts would have been the weaker choice&lt;/li&gt;
&lt;li&gt;the colophon and closing note make the provenance explicit&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I asked Claude to consolidate a textbook that would be useful weather or new tooling will appear or fade into oblivion.&lt;/p&gt;
&lt;p&gt;The result was a 78 pages, single self-contained .tex, and a companion pdfLaTeX file (no shell-escape, no missing packages, one harmless 0.3pt overfull box). You can take a look by yourself, the goal is to provide a clear foundation for understanding your interactions on each and every layer, and why and when sensible choices makes a difference.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Structure:&lt;/strong&gt; Part I builds the layer formalism (contract tuple, latency-adds/quality-multiplies algebra, cost decomposition) that later chapters reuse. Part II is one chapter per layer. Part III is the reference architecture, a maturity model, and a critical review of the pitfalls. Appendices hold a vendor-neutral scorecard, a benchmark harness, and notation/glossary.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Beyond:&lt;/strong&gt; Since the article&#39;s source is ~9 minutes of reading, to provide more depth, I added: KV-cache sizing and the bandwidth-bound decode argument (L1); Little&#39;s-law capacity formula, speculative-decoding speedup, build-vs-buy crossover (L2); the
𝑝
𝑛
p
n
reliability table and verifier-corrected
𝑝
eff
p
eff
(L3); index sizing, RRF, IR metrics (L4); LSH dedup, chunking economics, ACL pre-filtering (L5); routing as constrained optimisation with the pointwise Lagrangian solution and cascade break-even (L6); and a heavily statistical L7 — power analysis, paired bootstrap, the multiple-comparisons trap in prompt search, judge validation via 𝜅. Every chapter ends with exercises, also.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;References:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Huyen&#39;s two books covers the production LLM application stack end to end — evaluation frameworks, prompt design, agent architectures, deployment tradeoffs. It&#39;s the nearest published thing to the textbook&#39;s scope, and her earlier Designing Machine Learning Systems (2022) is the better book on drift, data pipelines and monitoring even though it predates the LLM era entirely — Chapter 8&#39;s PSI and staleness material is downstream of it:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Huyen, C. (2025). AI engineering: Building applications with foundation models. O’Reilly Media.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Huyen, C. (2022). Designing machine learning systems: An iterative process. O’Reilly Media.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A layer-by-layer recommendation:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;L1 — Foundation Models. Sebastian Raschka&#39;s Build a Large Language Model (From Scratch) if you want the arithmetic in Chapter 2 to become muscle memory; you implement attention, KV caching and sampling in PyTorch. Simon Prince&#39;s Understanding Deep Learning (free PDF from the author) is the better theory companion — modern, well-illustrated, and honest about what isn&#39;t understood.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;L2 — Inference &amp;amp; Serving. No good book exists. The closest useful substitutes are Kirk &amp;amp; Hwu&#39;s Programming Massively Parallel Processors for reasoning about memory bandwidth and occupancy, which is what the decode-phase argument actually reduces to, and Kleppmann&#39;s Designing Data-Intensive Applications for the queueing and tail-latency intuitions behind Little&#39;s law and goodput.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;L3 — Orchestration. Kleppmann again for exactly-once semantics and idempotency, plus Michael Nygard&#39;s Release It! — circuit breakers, bulkheads, timeouts and the stability antipatterns in it map one-to-one onto what goes wrong in agent loops. Google&#39;s Site Reliability Engineering (free online) for the error-budget framing.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;L4 — Retrieval. This is the layer where reading old books pays best. Manning, Raghavan &amp;amp; Schütze&#39;s Introduction to Information Retrieval (free online) is still the canonical grounding for BM25, index structures and the evaluation metrics in §5.8 — most RAG failures are IR failures that the field solved in 2005. Sebastian Bruch&#39;s Foundations of Vector Retrieval (Springer, 2024) is the rigorous treatment of ANN: HNSW, IVF, product quantisation, the theory behind the recall/latency curves. Lin, Nogueira &amp;amp; Yates, Pretrained Transformers for Text Ranking, covers rerankers and dense retrieval properly.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;L7 — Evaluation. Kohavi, Tang &amp;amp; Xu, Trustworthy Online Controlled Experiments. The multiple-comparisons trap, sample-size calculation, sequential testing and metric degeneracy in Chapter 8 are all treated at far greater depth there. If you take one book off this list beyond Huyen, take this one — the statistical failures in prompt optimisation are the same failures A/B testing spent twenty years learning to avoid.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;A note on security:&lt;/strong&gt;&lt;/em&gt; John Sotiropoulos&#39;s Adversarial AI: Attacks, Mitigations and Defense Strategies is the most useful book-length treatment of the prompt-injection and supply-chain material in §7.9, and it&#39;s structured against the OWASP LLM Top 10. Pair it with the NIST AI RMF and its Generative AI Profile&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;You can access the rendered PDF file and the original tex file below:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/llm-layers/llm-seven-layer-stack.pdf&quot;&gt;Read the PDF&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/douglops/blog/tree/main/content/llm-layers/llm-seven-layer-stack_v1.tex&quot;&gt;Browse the LaTeX source&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>spot nearby planes with acars when you&#39;re bored</title>
        <published>2026-05-03T00:00:00+00:00</published>
        <updated>2026-05-03T00:00:00+00:00</updated>
        
        <author>
          <name>
            Douglas
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="/founding-planes-acars/"/>
        <id>/founding-planes-acars/</id>
        
        <content type="html" xml:base="/founding-planes-acars/">&lt;p&gt;There was a time when I liked aircraft a lot. Like a really lot. But you know what is even more cool than flying a plane?
To me, it is the understanding of aircraft communication systems, avionics and embedded systems and the overall engineering
efforts applied to these amazing flying beasts!&lt;/p&gt;
&lt;h2 id=&quot;the-ads-b-detour&quot;&gt;The ADS-B detour&lt;/h2&gt;
&lt;p&gt;My RTL-SDR is an old v2 dongle, and it just doesn&#39;t do a good job at 1090 MHz, which is what you need for ADS-B. I didn&#39;t
feel like buying a v3/v4 just to get that one band, so instead I went down a small rabbit hole with
&lt;a rel=&quot;external&quot; href=&quot;https://github.com/rsadsb/adsb_deku&quot;&gt;adsb_deku&lt;/a&gt;, a Rust ADS-B decoder. The plan was to feed it from &lt;code&gt;dump1090_rs&lt;/code&gt;
pointed at a SoapySDR remote endpoint instead of the dongle directly:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;dump1090_rs --driver &amp;quot;remote, remote=tcp://127.0.0.1:55132, remote:driver=rtlsdr&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Honestly, I never confirmed whether the remote/SoapySDR hop was actually necessary for what I was doing, or just a
leftover from an earlier experiment — but I kept the command around, along with the
&lt;a rel=&quot;external&quot; href=&quot;https://osmocom.org/projects/rtl-sdr/wiki&quot;&gt;RTL-SDR wiki&lt;/a&gt;, in case I revisit it with better hardware.&lt;/p&gt;
&lt;h2 id=&quot;acars-works-with-basically-anything&quot;&gt;ACARS: works with (basically) anything&lt;/h2&gt;
&lt;p&gt;Where the dongle has no trouble at all is VHF, and that&#39;s exactly where ACARS lives (airlines still send a lot of
short operational messages — gate info, weather, position reports — over VHF datalinks in the 130-137 MHz range).
On my MacBook Air, I fed &lt;a rel=&quot;external&quot; href=&quot;https://github.com/TLeconte/acarsdec&quot;&gt;acarsdec&lt;/a&gt; live from SoapySDR across the usual set of
international ACARS channels, and it picked up traffic right away:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;acarsdec --output full:file --soapysdr driver=rtlsdr 131.450 131.525 131.550 131.725 131.825&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;No fiddling required — it just worked, which was a nice change of pace after the ADS-B detour above.&lt;/p&gt;
&lt;h2 id=&quot;acars-deku-someday&quot;&gt;acars_deku, someday&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;adsb_deku&lt;/code&gt; decodes and renders ADS-B frames so nicely that it left me wanting the same thing for ACARS — something
like &lt;code&gt;acars_deku&lt;/code&gt;, parsing and rendering the messages &lt;code&gt;acarsdec&lt;/code&gt; spits out instead of just logging them to a file.
Nothing built yet, just an idea sitting in my someday-maybe pile.&lt;/p&gt;
&lt;h2 id=&quot;further-reading&quot;&gt;Further reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https://osmocom.org/projects/rtl-sdr/wiki&quot;&gt;RTL-SDR project wiki&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/rsadsb/adsb_deku&quot;&gt;adsb_deku&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/wiedehopf/tar1090&quot;&gt;tar1090&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https://mode-s.org/1090mhz/&quot;&gt;mode-s.org: 1090 MHz&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https://www.rtl-sdr.com/rtl-sdr-radio-scanner-tutorial-receiving-airplane-data-with-acars/&quot;&gt;RTL-SDR.com: receiving ACARS airplane data&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https://www.gta.ufrj.br/ensino/eel878/redes1-2023-1/trabalhos/Grupo03/acars.html&quot;&gt;UFRJ GTA: ACARS overview&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>the practice of chinese learning dump</title>
        <published>2024-08-01T00:00:00+00:00</published>
        <updated>2024-08-01T00:00:00+00:00</updated>
        
        <author>
          <name>
            Douglas
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="/learning-mandarim/"/>
        <id>/learning-mandarim/</id>
        
        <content type="html" xml:base="/learning-mandarim/">&lt;p&gt;My interest in Chinese culture goes way back to my childhood. The symbols (ideograms), martial arts and overall cultural aspects instilled in me a fascination of it&#39;s own kind. Now, heading into this journey.&lt;/p&gt;
&lt;p&gt;Below some online resources to aid you, if you are interested in getting used to this language:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Dictionaries&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https://chrome.google.com/webstore/detail/zhongwen-chinese-english/kkmlkkjojmombglmlpbpapmhcaljjkde&quot;&gt;Zhongwen (Google Chrome)&lt;/a&gt;
One of my most used dictionaries. Definitely give it a try. Check the How-to&#39;s &lt;a rel=&quot;external&quot; href=&quot;https://zhongwen-chrome.blogspot.com/&quot;&gt;here&lt;/a&gt; and start leveraging its power today!&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https://dict.cn/&quot;&gt;Dict.cn&lt;/a&gt;
A very handy online dictionary to translate chinese words. I made a common use this way, for example: &lt;code&gt;http://dict.cn/老师&lt;/code&gt;
Cool if you are using a sheet for &quot;flashcarding&quot; new learning words. It gets easier to automate a link for lookups doing this.&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https://fanyi.baidu.com/&quot;&gt;Baidu Fanyi (翻译)&lt;/a&gt;
Complete translation tool from many dialects of mandarin into other languages. More trustworthy than Google Translation in this regard, made for natives of asian speaking languages. Also has a very useful mobile app, check it out!&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https://www.pleco.com/&quot;&gt;Pleco&lt;/a&gt;
One of the most famous world dictionaries for mobile devices. If you are investing into learning mandarin and don&#39;t know where to start, give Pleco a try. With its paid features on, makes it a one-stop-shop for mandarin students.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Grammar&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https://resources.allsetlearning.com/chinese/grammar/&quot;&gt;Chinese Grammar Wiki&lt;/a&gt;
Tired of being stuck when facing an uncommon phrase variation or symbol used in an unsettling way? Check this complete online grammar that ranges from HSK-1 to HSK-3. Complete references and a very thorough list of sentence patterns.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Vocabulary&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https://skritter.com/demo&quot;&gt;Skritter&lt;/a&gt;
Skritter is a powerful aid for learning character writing both for Chinese mandarin or Japanese kanji.&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https://mandarinbean.com/new-hsk-vocabulary/&quot;&gt;Mandarin Bean&lt;/a&gt;
Despite all the other resources who will aid you in gaining vocabulary, sometimes you need a compreehensible list. It&#39;s made for you! Very handy to print and put at your desk for offline reference. There&#39;s also a whole lot of resources like tests etc. Enjoy!&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https://docs.google.com/spreadsheets/d/1-BppwKJzK1swKgGw94jTB0GGB2vfr8tPdh0sTW7wi9Y/edit?usp=sharing&quot;&gt;Chinese HSK Consolidated&lt;/a&gt;
I&#39;ve found this in 2021 without even grasping how mandarin worked out or how to tackle its study. Turns out it&#39;s very handy for checking words and frequency order for all HSKs levels!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;General resources&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https://refold.link/mandarinNotion&quot;&gt;Refold Mandarin&lt;/a&gt; (also this &lt;a rel=&quot;external&quot; href=&quot;https://zenith-raincoat-5cf.notion.site/Refold-Mandarin-Resources-d54bfade358b4d0a88b5600acb99582b&quot;&gt;link&lt;/a&gt;)
This was a very famous online sheet for hosting cultural resources in chinese mandarin, now turned into a Notion database. Check &lt;a rel=&quot;external&quot; href=&quot;https://refold.la/&quot;&gt;Refold&lt;/a&gt;. You can also check the above mentioned old sheet &lt;a rel=&quot;external&quot; href=&quot;https://docs.google.com/spreadsheets/d/1mq3sfslUsC9WlPM7pJN5A7hOFdVqpEFBbiU8-fgmRUw/edit?usp=sharing&quot;&gt;here&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https://disk.yandex.com/d/YEg7gd2TcBOHbQ&quot;&gt;Chinese Cinema&lt;/a&gt; A fried of mine is addicted to Cinema and made this list of classical Chinese movies, from famous directors! Even if you&#39;re not that much in Chinese learning, check it out! Password is: &lt;code&gt;Ch3nKaiRulz&lt;/code&gt;. If you want to download it all, get &lt;a rel=&quot;external&quot; href=&quot;https://drive.google.com/file/d/1hfnpu2mGB5lgZFL30JJqwJSV063CE64y/view?usp=share_link&quot;&gt;this torrent&lt;/a&gt;. Movies included:&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Movies:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Yonggang Wu - 1934 - 神女 (Goddess) | The Goddess&lt;/li&gt;
&lt;li&gt;Weibang Ma-Xu - 1937 - 夜半歌声 (Song at Midnight)&lt;/li&gt;
&lt;li&gt;Fei Mu - 1948 - 小城之春 (Spring in a small town)&lt;/li&gt;
&lt;li&gt;Xie Jin - 1961 - 红色娘子军 (The Red Detachment of Women) -&amp;gt; also on &lt;a rel=&quot;external&quot; href=&quot;https://www.youtube.com/watch?v=EenkAGNXBBQ&amp;amp;ab_channel=F%C3%A1bioCardoso&quot;&gt;Youtube&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Chen Kaige - 1984 - 黄土地 (Yellow earth), 1993 - 霸王别姬 (Farewell My Concubine), 2021 - 长津湖 (The Battle at Lake Changjin)&lt;/li&gt;
&lt;li&gt;Tian Zhuangzhuang - 1986 - 盗马贼 (Horse thief), 1993 - 蓝风筝 (Blue kite)&lt;/li&gt;
&lt;li&gt;Zhang Yimou - 1988 - 红高粱 (Red Sorghum), 1991 - 大红灯笼高高挂 (Red lanterns hang high), 1994 - 活着 (Tempo de Viver), 1999 - 一个都不能少 (Not one less), 2002 - 英雄 (Hero)&lt;/li&gt;
&lt;li&gt;Jiang Wen - 1994 - 阳光灿烂的日子 (In the Heat of the Sun), 2000 - 鬼子来了 (Devils are coming)&lt;/li&gt;
&lt;li&gt;Jia Zhangke - 2000 - 站台 (Platform), 2006 - 三峡好人 (Em Busca da Vida), 2013 - 天注定 (Destiny), 2015 - 山河故人 (Old friend), 2018 - 江湖儿女 (Rivers and lakes)&lt;/li&gt;
&lt;li&gt;Bi Gan - 2018 - 地球最后的夜晚 (Last night on earth)&lt;/li&gt;
&lt;li&gt;Guan Hu - 2020 - 八佰 (The Eight Hundred)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Animations:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Wan Laiming - 1941 - 铁扇公主 (Iron Fan Princess), 1961 - 大闹天宫 (The Monkey King: Havoc in Heaven), 1979 - 哪吒闹海 (Nezha Naohai) | Nezha Conquers the Dragon King, 2016 - 大鱼海棠 (Big fish &amp;amp; Begônia) -&amp;gt; (Netflix Only), 2018 - 肆式青春 (Unrestrained youth) -&amp;gt; (Netflix only), 2019 - 罗小黑战记 (Heifei Legend) -&amp;gt; (HBO Max only)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Animated Series:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;2019 - 领风者 (O Líder) -&amp;gt; &lt;a rel=&quot;external&quot; href=&quot;https://www.youtube.com/playlist?list=PLvL3Puo5nv9smd8eeyOQaHBPCkTEYMJIr&quot;&gt;YouTube&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Series &amp;amp; Novels:&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;2021 - 觉醒年代 (Age of Awakening) -&amp;gt; &lt;a rel=&quot;external&quot; href=&quot;https://www.youtube.com/watch?v=cI8mKJmDUYs&amp;amp;list=PLGdeVB4h7_6SwFRrSukO4OU2dmYyOa7Gk&quot;&gt;YouTube&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;2010 - 三国 (Three Kingdoms) -&amp;gt; &lt;a rel=&quot;external&quot; href=&quot;https://www.youtube.com/playlist?list=PL33A390995E9A7F00&quot;&gt;Youtube&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Chinese Cinema History&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;https://en.wikipedia.org/wiki/Cinema_of_China&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/nullniverse/iptv-cn&quot;&gt;Chinese Television&lt;/a&gt; IPTV from China mainland. Lot&#39;s of channels for your delight. But it works only by means of a VPN, and after some research, the only feasible (not yet tested or endorsed by me) is &lt;a rel=&quot;external&quot; href=&quot;https://www.earthvpn.com&quot;&gt;earthVPN&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https://disk.yandex.com/d/p6kAhae4odR0Eg&quot;&gt;CN folder on Cloud&lt;/a&gt;
I hosted for many years a lot of resources for language learning on my cloud disk drive and you can still access it from the link above. It&#39;s a couple of Gigabytes in size (~20GB) for the mandarin resources (&lt;code&gt;lang/cn/&lt;/code&gt;) and they came from a publicly available torrent at that time (2018) as well as many other languages in there.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Community resources&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https://docs.google.com/spreadsheets/d/1RxdDINBg1PjCT-nC3T4OZ0am8AFxXnPgm3HnXbDOJjY/edit?usp=sharing&quot;&gt;My Study Sheet&lt;/a&gt;
It&#39;s my most used resource to study nowadays and I hope it&#39;s also beneficial for your study endeavours! There&#39;s also a lot of learning resources to master Bopomofo (Zhuyin Fuhao / 注音符號／ㄅㄆㄇㄈ)&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https://kaohongshu.blog/2022/01/13/learn-mandarin-chinese-resources-part-1/&quot;&gt;Kaohongshu guide for learning mandarin in 2022&lt;/a&gt;
I&#39;m not the most experienced mandarin learner to give advice for newcomers. Check this blog for advice and resources on how to make your mandarin learning journey more effective and joyful&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https://discord.gg/chineselanguage&quot;&gt;Discord Chinese Language&lt;/a&gt;
One of the best learning communities out there I&#39;ve ever seen. Not because of it&#39;s size, but because of its quality both from it&#39;s members and guidance in general. There you&#39;ll find broader knowledge channels and can practice and level up your mandarin skill set!&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https://discord.gg/PfzZqBUw&quot;&gt;Discord Xefjord&#39;s Complete Language&lt;/a&gt; (also &lt;a rel=&quot;external&quot; href=&quot;https://xefjord.wixsite.com/xefscompletelangs&quot;&gt;here&lt;/a&gt;)
Interested in other asian countries or indian native languages? Say no more! Check Xefjord&#39;s amazing resources and join the Discord channel for lots of resources like flashcards and advice!&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https://t.me/mandarim&quot;&gt;Telegram Xiao Mandarim Channel PT-BR&lt;/a&gt;
If you&#39;re coming from Portuguese-speaking countries, this is one of the most effervescent communities for mandarin learning in Brazil. 小老师 also holds a &lt;a rel=&quot;external&quot; href=&quot;https://www.youtube.com/playlist?list=PLSA_5IcZ3282g5B1luYSP6IxPaLigxErG&quot;&gt;public playlist&lt;/a&gt; with +250 videos from 0-to-hero for mastering the mandarin language.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>using multiple github accounts locally</title>
        <published>2022-11-10T00:00:00+00:00</published>
        <updated>2022-11-10T00:00:00+00:00</updated>
        
        <author>
          <name>
            Douglas
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="/using-multiaccount-github/"/>
        <id>/using-multiaccount-github/</id>
        
        <content type="html" xml:base="/using-multiaccount-github/">&lt;p&gt;&lt;em&gt;This guide is just a collection of steps and use case for implementing multi-account authentication on Github in your local machine.&lt;/em&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Of course, you can use &lt;a rel=&quot;external&quot; href=&quot;https://docs.github.com/en/account-and-profile/how-tos/account-management/managing-multiple-accounts&quot;&gt;this&lt;/a&gt;, but... why not!?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;context&quot;&gt;Context&lt;/h2&gt;
&lt;p&gt;There was a time when cryptic sysadmins and developers integrated their scripts and codes underneath a pile of skull and rocks (kindly called &lt;a rel=&quot;external&quot; href=&quot;https://en.wikipedia.org/wiki/Revision_Control_System&quot;&gt;&lt;em&gt;Revision Control Systems&lt;/em&gt;&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Evolved offspring of this so-called jurassic figure filled the earth after this apocalyptical era, and rapidly became popular and known by their own names, like Subversion and TurtoiseSVN, the later its GUI implementation.&lt;/p&gt;
&lt;p&gt;Things were gaining traction back then, and the fast-paced rhythm on which software was being developed, spawned a new set of demon capable of spread havoc and anxiety for generations to come. Well known as &lt;a rel=&quot;external&quot; href=&quot;https://tortoisesvn.net&quot;&gt;Git&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Loved and hated, different tastes contributed more or less to what is better known today as &lt;em&gt;SCM&lt;/em&gt; - &lt;em&gt;Source Control Management&lt;/em&gt;, creating a &lt;a rel=&quot;external&quot; href=&quot;https://en.wikipedia.org/wiki/Comparison_of_version-control_software&quot;&gt;rich and diverse ecosystem&lt;/a&gt; of tools for the occultist craft of software engineering.&lt;/p&gt;
&lt;p&gt;In my life I&#39;ve only used two systems for SCM, SVN and Git. I also have seen people scratching their heads to be more productive on their work machines and keep up with their contributions besides job-related ones.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;tip&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If you want to dig deeper into Git, there are &lt;a rel=&quot;external&quot; href=&quot;https://github.com/dictcp/awesome-git&quot;&gt;many resources&lt;/a&gt; and also an &lt;em&gt;de facto&lt;/em&gt; &lt;a rel=&quot;external&quot; href=&quot;https://git-scm.com/book/en/v2&quot;&gt;industry standard&lt;/a&gt; book written about what git is and how to better leverage its system&#39;s functionality. Check it out!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;My main drive for this post is because there&#39;s so much information out there about vanilla git configurations, but few ones aimed to configuration and operability for productivity - aside of installing new-shiny-tools.&lt;/p&gt;
&lt;h2 id=&quot;signing-commits&quot;&gt;Signing Commits&lt;/h2&gt;
&lt;p&gt;Signing posts is the most overlooked component when you are working for a closed doors org if they enforce self-domain usage for contributors in private repos, that is: only users with email &lt;em&gt;user@myorg.com&lt;/em&gt; are able to contribute on private repositories and no outside collaborators are allowed.&lt;/p&gt;
&lt;p&gt;That works... in parts! Let&#39;s suppose you have started small and gaining traction month by month, not only in revenue and corporate growth, but also in collaborators among your team who constantly push changes to production.&lt;/p&gt;
&lt;p&gt;Once you start adding complexity in your environment, and aren&#39;t inclined to spend large bucks with security software for everyone&#39;s laptops - a couple questions arise:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;em&gt;Are my devs skilled enough in security practices while using their machines for off-work related issues?&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;How can I be assured that the startling new shiny tools integrated in our pipelines, doesn&#39;t pose a security risk for the entire supply-chain of our product?&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;What if a disgruntled employee starts to pose a security risk and plans to act on behalf of other employees to compromise our chain and our users?&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;More &lt;strong&gt;what ifs&lt;/strong&gt;...&lt;/em&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;With these concerns at bay, a preliminary solution is to activate &lt;strong&gt;signed commits&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;As &lt;a rel=&quot;external&quot; href=&quot;https://stackoverflow.com/a/43623702&quot;&gt;this post&lt;/a&gt; from the old is explaining, it poses a question of authenticity and integrity, because:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;... the software [in question] is critical to some type of security, an attacker might compromise you by substituting broken software for the software you think you&#39;re getting, e.g. something with a backdoor you couldn&#39;t easily identify. After all, you want some code, you click &quot;download&quot;, and you trust.&lt;/em&gt; - Cris from Stackoverflow Apr 26 2017&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Sufficiently to say, it also puts another layer of trust in commits inside your org, validating contribution&#39;s origin for its members.&lt;/p&gt;
&lt;p&gt;So, how do you do that?&lt;/p&gt;
&lt;p&gt;I&#39;ll summarize the main steps below, but feel free to &lt;a rel=&quot;external&quot; href=&quot;https://docs.github.com/en/authentication/managing-commit-signature-verification/about-commit-signature-verification#gpg-commit-signature-verification&quot;&gt;check this&lt;/a&gt; doc from Github and follow it at your own pace.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Install your GPG suite of tools.
_ Windows: &lt;a rel=&quot;external&quot; href=&quot;https://www.gpg4win.org/&quot;&gt;Gpg4win&lt;/a&gt;
_ MacOS: &lt;a rel=&quot;external&quot; href=&quot;https://gpgtools.org/&quot;&gt;GPG Suite&lt;/a&gt; integrates automagically in the MacOs keychain. Check be above documentation for nitty-gritty details. * Unix/Linux: Chances are you already have it, but give &lt;a rel=&quot;external&quot; href=&quot;http://linux.die.net/man/1/gpg-agent&quot;&gt;gpg-agent&lt;/a&gt; a try&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https://docs.github.com/pt/enterprise-cloud@latest/get-started/signing-up-for-github/verifying-your-email-address&quot;&gt;Verify your main address&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Activate commit auto-sign after each commit, this will save time on each commit: &lt;code&gt;git config commit.gpgsign true&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Generate your key: &lt;code&gt;gpg --full-generate-key&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;important&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It &lt;em&gt;must&lt;/em&gt; be at least 4096 bits (default option)
Your email must be the main email address of your Github account&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;List and export your newly created GPG key: &lt;code&gt;gpg --list-secret-keys --keyid-format=long&lt;/code&gt;. Copy the e.g: &lt;em&gt;3AA5C34371567BD2&lt;/em&gt; part to be used in the next command.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot; data-jsx-title=&quot;&quot;List your secret key&quot;&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;$ gpg --list-secret-keys --keyid-format=long&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;/Users/hubot/.gnupg/secring.gpg&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;------------------------------------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;sec   4096R/3AA5C34371567BD2 2016-03-10 [expires: 2017-03-10]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;uid                          Hubot&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ssb   4096R/42B317FD4BA89E7A 2016-03-10&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now, run the below command and copy the exhibited key in your &lt;a rel=&quot;external&quot; href=&quot;https://docs.github.com/pt/github-ae@latest/authentication/managing-commit-signature-verification/adding-a-new-gpg-key-to-your-github-account&quot;&gt;GPG settings on Github&lt;/a&gt;:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot; data-jsx-title=&quot;&quot;Copy your GPG key&quot;&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;$ gpg --armor --export 3AA5C34371567BD2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# Prints the GPG key ID, in ASCII armor format&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Telling Github you&#39;re a winner. Inserting your keys in the config&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot; data-jsx-title=&quot;&quot;Configuring Git with your signing key&quot;&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;$ git config user.signingkey 3AA5C34371567BD2&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The process above can be used to generate as many keys as you want. It&#39;s useful if you plan to manage more than a single account on your machine/session, as we&#39;ll cover in the next part.&lt;/p&gt;
&lt;p&gt;From now on, you&#39;re able to effectively prove yourself and sign every commit you make. &lt;em&gt;Welcome to the age of surveillance capitalism!&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;configuring-multiple-accounts&quot;&gt;Configuring Multiple Accounts&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;/using-multiaccount-github/account-scheme.png&quot; alt=&quot;Possible interactions with git and Github in a single machine/account&quot; /&gt;&lt;/p&gt;
&lt;p&gt;I really appreciate your taste for the above image!&lt;/p&gt;
&lt;p&gt;There&#39;s a way to have a virtually unlimited number of git accounts configured if you observe some tricks, but often the most sought after feature is to maximize productivity, allowing you to commit to your professional and personal projects.&lt;/p&gt;
&lt;p&gt;The above image says that in some cases, you want to use your personal username to work for your org, but using the &lt;em&gt;org&lt;/em&gt; domain email, while, for your private projects, preserving the personal username + email address, also. But... is that possible? &lt;em&gt;Yes&lt;/em&gt;, my horseshoe crab!&lt;/p&gt;
&lt;p&gt;Let&#39;s do that now:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Head back to your Github&#39;s &lt;a rel=&quot;external&quot; href=&quot;https://github.com/settings/emails&quot;&gt;email&lt;/a&gt; settings. In this case, let&#39;s create the scenario where you&#39;re using your personal account and planning to use this account&#39;s username to commit to your org.&lt;/li&gt;
&lt;li&gt;Simply add your org&#39;s email address and then make it valid.&lt;/li&gt;
&lt;li&gt;Your primary address can be either your org or your personal one&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;After confirming your address, let&#39;s go to your &lt;code&gt;~/.gitconfig&lt;/code&gt; settings in your machine.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;tip&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In this step, you&#39;ll not need to configure your SSH keys for each account, as the username will not change. For possible counterpositive needs, you could &lt;a rel=&quot;external&quot; href=&quot;https://stackoverflow.com/questions/3860112/multiple-github-accounts-on-the-same-computer&quot;&gt;check this&lt;/a&gt; ancient scroll.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;We are going to generate and use two additional files for this case, despite the &lt;code&gt;.gitconfig&lt;/code&gt; file, and also will specify a static working path dir, to be used with one of the accounts.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;~/.git-personal.conf&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;~/.git-professional.conf&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In the &lt;code&gt;.gitconfig&lt;/code&gt; file you&#39;ll have your path choice set and additional commands:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;.gitconfig&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot; data-jsx-title=&quot;&quot;Configuring the path in .gitconfig file&quot; showLineNumbers&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;include]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        path = ~/.git-personal.conf&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[includeIf &amp;quot;gitdir:~/Documents/YourOrgFolder/&amp;quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        path = ~/.git-professional.conf&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[init]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        defaultBranch = main&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;.git-personal&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot; data-jsx-title=&quot;&quot;Configuring your personal .gitconfig file&quot; showLineNumbers&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[user]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        signingkey = 3AA5C34371567BD2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        email = your-personal@email.com&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        name = your-username&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        mergeTool = vimDiff&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[commit]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        gpgsign = true&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;.git-professional&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;markdown&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-2 z-l-u z-d-9 z-d-u&quot;&gt;user&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;signingkey = FD668DAFE840A89C&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;email = your-professional-email@organization.com&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;name = same-username-as-your-personal-one&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;mergeTool = vimDiff&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-2 z-l-u z-d-9 z-d-u&quot;&gt;commit&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;gpgsign = true&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;One thing to notice in the above configuration is that you can use more than one signing key, or use the same to signed-commit in both projects - make sure your boss don&#39;t work two part-time jobs, if you&#39;ll just one key btw.&lt;/p&gt;
&lt;p&gt;If you&#39;re taking advantage of this pandemic and working more than one all-remote job, you could negotiate to use your same username and enjoy a multi-org config. Just create more .git-professional-&lt;code&gt;&amp;lt;number&amp;gt;&lt;/code&gt; files and more &lt;code&gt;[includeIf]&lt;/code&gt; entries in your &lt;code&gt;.gitconfig&lt;/code&gt; file.&lt;/p&gt;
&lt;p&gt;Now, for cloning accordingly (Github example), for other configured accounts &lt;em&gt;not&lt;/em&gt; in your first &lt;code&gt;[Include]&lt;/code&gt;- which is applicable to any folder &lt;em&gt;besides&lt;/em&gt; the configured others - you need to run the clone command this way:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; git&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; clone&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; git@github.com-&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;account_usernam&lt;/span&gt;&lt;span&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;account_usernam&lt;/span&gt;&lt;span&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;repo_nam&lt;/span&gt;&lt;span&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.git&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;repo_nam&lt;/span&gt;&lt;span&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;account_usernam&lt;/span&gt;&lt;span&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; git&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; clone&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; git@github.com-nullniverse:nullniverse/my_repo.git&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; my_repo_nullniverse&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That&#39;s it.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>not so useful k8s tricks - maybe</title>
        <published>2022-11-04T00:00:00+00:00</published>
        <updated>2022-11-04T00:00:00+00:00</updated>
        
        <author>
          <name>
            Douglas
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="/not-useful-k8s-tricks/"/>
        <id>/not-useful-k8s-tricks/</id>
        
        <content type="html" xml:base="/not-useful-k8s-tricks/">&lt;p&gt;Nowadays, I barely touch in helm charts in my job. In the past, I was used to writing a little bit of helm charts performing migrations of deployments that were outdated, and migrating our CI/CD pipelines from drone.io to argo workflows.&lt;/p&gt;
&lt;p&gt;I tried my best to prioritize maintainability and code flexibility over complexity in helm chart code deployments.&lt;/p&gt;
&lt;p&gt;So below you&#39;ll find some examples of useful snippets that simplified my day to day tasks, and other k8s useful stuffs - maybe.&lt;/p&gt;
&lt;h2 id=&quot;simplified-multi-ingress&quot;&gt;⎈ Simplified multi-Ingress&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot; data-jsx-title=&quot;&quot;Multi-ingress file&quot; showLineNumbers&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{{- $svcPort := .Values.service.port -}}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{{- if .Values.ingresses.enabled -}}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{{- range .Values.ingresses.ingress }}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;apiVersion: networking.k8s.io/v1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;kind: Ingress&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;metadata:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  name: {{ .name }}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  namespace: {{ .namespace }}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  labels:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{{ include &amp;quot;app.labels&amp;quot; $ | indent 4 }}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  {{- with .annotations }}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  annotations:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    {{- toYaml . | nindent 4 }}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  {{- end }}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;spec:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{{- if .tls }}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  tls:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  {{- range .tls }}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    - hosts:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    {{- range .hosts }}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      - {{ . | quote }}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    {{- end }}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      secretName: {{ .secretName }}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  {{- end }}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{{- end }}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  rules:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{{- range .rules }}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    - host: {{ .hosts | quote }}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      http:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      {{- range .http.paths }}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        paths:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          - path: {{ .path | quote }}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            pathType: {{ .pathType | quote }}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            backend:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;              service:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                name: {{ .backend.service.name | quote }}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                port:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                  number: {{ .backend.service.port.number | default $svcPort }}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      {{- end }}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{{- end }}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{{- end }}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{{- end }}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It&#39;s modular enough so you can attach and remove ingresses as needed without much hurdle.&lt;/p&gt;
&lt;p&gt;Here follows the &lt;code&gt;value.yaml&lt;/code&gt; example.&lt;/p&gt;
&lt;p&gt;It can have a vast number of ingresses each one starting at &quot;name&quot;:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;yaml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-5&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-5&quot;&gt;ngresses&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-5&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-5&quot;&gt;nabled&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-5&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-5&quot;&gt;ngress&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    -&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-5&quot;&gt; n&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-5&quot;&gt;ame&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;ngress-1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-5&quot;&gt;    n&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-5&quot;&gt;amespace&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;amespace&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-5&quot;&gt;    a&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-5&quot;&gt;nnotations&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;    ...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-5&quot;&gt;    t&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-5&quot;&gt;ls&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        -&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-5&quot;&gt; h&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-5&quot;&gt;osts&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; m&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;y.host.com&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-5&quot;&gt;        s&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-5&quot;&gt;ecretName&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;ls-my-host.com&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-5&quot;&gt;    r&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-5&quot;&gt;ules&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        -&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-5&quot;&gt; h&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-5&quot;&gt;osts&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; m&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;y.host.com&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-5&quot;&gt;        h&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-5&quot;&gt;ttp&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-5&quot;&gt;            p&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-5&quot;&gt;aths&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            -&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-5&quot;&gt; p&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-5&quot;&gt;ath&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; /&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-5&quot;&gt;            p&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-5&quot;&gt;athType&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; P&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;refix&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-5&quot;&gt;            b&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-5&quot;&gt;ackend&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-5&quot;&gt;                s&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-5&quot;&gt;ervice&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-5&quot;&gt;                n&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-5&quot;&gt;ame&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;service-name&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-5&quot;&gt;                p&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-5&quot;&gt;ort&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-5&quot;&gt;                    n&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-5&quot;&gt;umber&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; 80&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    -&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-5&quot;&gt; n&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-5&quot;&gt;ame&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;ngress-2&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This works for any object as well - like Services, Secrets etc; -, and could save you face when you need to plan for a modularized model to be used for multiple apps with as single config.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;pod-recurrent-restarts&quot;&gt;⎈ Pod Recurrent Restarts&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Ever wondered how to cycle your deployment/pods the native way? Think no more!&lt;/em&gt;&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot; data-jsx-title=&quot;&quot;Roles and account creation&quot; showLineNumbers&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;kubectl apply -f - &amp;lt;&amp;lt;EOF&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;apiVersion: v1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;kind: ServiceAccount&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;metadata:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  name: deployment-restart&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  namespace: ns-name&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;apiVersion: rbac.authorization.k8s.io/v1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;kind: Role&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;metadata:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  name: deployment-restart&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  namespace: ns-name&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;rules:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  - apiGroups: [&amp;quot;apps&amp;quot;, &amp;quot;extensions&amp;quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    resources: [&amp;quot;deployments&amp;quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    resourceNames: [&amp;quot;deployment-name&amp;quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    verbs: [&amp;quot;get&amp;quot;, &amp;quot;patch&amp;quot;, &amp;quot;list&amp;quot;, &amp;quot;watch&amp;quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;apiVersion: rbac.authorization.k8s.io/v1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;kind: RoleBinding&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;metadata:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  name: deployment-restart&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  namespace: ns-name&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;roleRef:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  apiGroup: rbac.authorization.k8s.io&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  kind: Role&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  name: deployment-restart&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;subjects:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  - kind: ServiceAccount&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    name: deployment-restart&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    namespace: ns-name&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;EOF&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot; data-jsx-title=&quot;&quot;Cronjob creation&quot; showLineNumbers&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;kubectl apply -f - &amp;lt;&amp;lt;EOF&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;apiVersion: batch/v1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;kind: CronJob&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;metadata:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  name: deployment-restart&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  namespace: ns-name&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;spec:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  schedule: &amp;quot;* */5 * * *&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  jobTemplate:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    spec:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      backoffLimit: 2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      activeDeadlineSeconds: 600&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      template:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        spec:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          serviceAccountName: deployment-restart&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          containers:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            - command:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                - bash&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                - -c&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                - &amp;gt;-&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                  kubectl rollout restart deployment/deployment-name &amp;amp;&amp;amp; kubectl rollout status deployment/deployment-name&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;              image: bitnami/kubectl&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;              imagePullPolicy: IfNotPresent&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;              name: kubectl&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          restartPolicy: Never&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;EOF&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Adjust the values to meet your current needs.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;using-sealed-secrets-the-easy-way&quot;&gt;⎈ Using sealed-secrets the easy way&lt;/h2&gt;
&lt;p&gt;If your deployment implements the usage of &lt;a rel=&quot;external&quot; href=&quot;https://github.com/bitnami-labs/sealed-secrets&quot;&gt;sealed-secrets&lt;/a&gt;, chances high that someday you&#39;ll need to implement a secret by hand.It is the best way to keep your sensitive data safe in a GitOps workflow.&lt;/p&gt;
&lt;p&gt;Here is a breakdown that simplifies this process using &lt;code&gt;kubeseal&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;First, ensure you have the following installed and configured:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;kubectl&lt;/strong&gt;: Connected to your target cluster.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;kubeseal&lt;/strong&gt;: The CLI tool for Sealed Secrets.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;view-secret&lt;/strong&gt;: A kubectl kubecrew plugin (or use standard base64 decoding if you don&#39;t have it). To install, run &lt;code&gt;kubectl krew install view-secret&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;1-fetch-the-public-certificate&quot;&gt;1. Fetch the Public Certificate&lt;/h3&gt;
&lt;p&gt;To encrypt data without needing direct access to the Sealed Secrets controller, you first need to grab the public certificate from your cluster.&lt;/p&gt;
&lt;h4 id=&quot;find-the-latest-key-name&quot;&gt;Find the latest key name:&lt;/h4&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;kubectl&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; get&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; secret&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; kube-system&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt; grep&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; sealed-secrets-key&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h4 id=&quot;export-the-certificate&quot;&gt;Export the certificate:&lt;/h4&gt;
&lt;p&gt;Replace &lt;code&gt;{{latest-key-name}}&lt;/code&gt; with the name you found in the previous step.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;kubectl&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; view-secret&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; {{latest-key-name}}&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; kube-system&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; tls.crt&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; tls.crt&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; This &lt;code&gt;tls.crt&lt;/code&gt; file is public. You can safely share it with your team; it can only be used to &lt;strong&gt;encrypt&lt;/strong&gt; data, not decrypt it.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;2-encrypt-your-data&quot;&gt;2. Encrypt Your Data&lt;/h3&gt;
&lt;p&gt;You can now generate the encrypted string (the &quot;Sealed&quot; version) to put into your &lt;code&gt;values.yaml&lt;/code&gt; or Kubernetes manifests.&lt;/p&gt;
&lt;h4 id=&quot;for-simple-strings&quot;&gt;For simple strings:&lt;/h4&gt;
&lt;p&gt;Use this for passwords, API keys, or tokens.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;echo&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;your-sensitive-data&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt; kubeseal&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;-raw&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;--scope&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; cluster-wide&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;--cert&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; tls.crt&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;--controller-name&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; {{latest-key-name}}&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;--from-file=/dev/stdin&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h4 id=&quot;for-service-account-json-files&quot;&gt;For Service Account JSON files:&lt;/h4&gt;
&lt;p&gt;If you have a Google Cloud or Azure service account file (&lt;code&gt;SA.json&lt;/code&gt;), use this method:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;cat&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; SA.json&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt; kubeseal&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;-raw&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;--scope&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; cluster-wide&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;--cert&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; tls.crt&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;--controller-name&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; {{latest-key-name}}&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;--from-file=/dev/stdin&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;bulb-key-parameters-explained&quot;&gt;💡 Key Parameters Explained&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align: left&quot;&gt;Parameter&lt;/th&gt;&lt;th style=&quot;text-align: left&quot;&gt;Purpose&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;code&gt;--raw&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Outputs only the encrypted string instead of a full YAML object.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;code&gt;--scope cluster-wide&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Allows the secret to be unsealed in any namespace within the cluster.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;code&gt;--cert tls.crt&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Uses the certificate you just downloaded to perform the encryption.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;code&gt;--from-file=/dev/stdin&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Tells the tool to read the data you piped in via &lt;code&gt;echo&lt;/code&gt; or &lt;code&gt;cat&lt;/code&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;warning-a-quick-pro-tip&quot;&gt;⚠️ A Quick Pro-Tip&lt;/h3&gt;
&lt;p&gt;Once you have generated the encrypted string and pasted it into your &lt;code&gt;values.yaml&lt;/code&gt;, &lt;strong&gt;delete the local &lt;code&gt;tls.crt&lt;/code&gt; and any plain-text files&lt;/strong&gt; (like &lt;code&gt;SA.json&lt;/code&gt;) if they are no longer needed. Never commit the plain-text versions to your repository!&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;start-a-cronjob&quot;&gt;⎈ Start a cronjob&lt;/h2&gt;
&lt;p&gt;Learn how to start a previously deployed cronjob in your cluster:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;kubectl&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; create&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; job&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;-from=cronjob/&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;cronjob-name&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;job-nam&lt;/span&gt;&lt;span&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;namespace-nam&lt;/span&gt;&lt;span&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;list-api-versions&quot;&gt;⎈ List API versions&lt;/h2&gt;
&lt;p&gt;This is how to list all your cluster&#39;s API versions for any object:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;kubectl&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; get&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;anythin&lt;/span&gt;&lt;span&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;o=custom-columns=NAME:.metadata.name,API-Version:.apiVersion&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;multi-container-pods&quot;&gt;⎈ Multi-Container pods&lt;/h2&gt;
&lt;p&gt;Pods can run more than one container (like a main app and a &quot;sidecar&quot;). These commands help you target the right one.&lt;/p&gt;
&lt;h3 id=&quot;1-list-all-containers-in-a-pod&quot;&gt;1. List all containers in a Pod&lt;/h3&gt;
&lt;p&gt;If you aren&#39;t sure what the containers inside a Pod are named, use this command to list them:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;kubectl&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; get&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; pod&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;podNam&lt;/span&gt;&lt;span&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; jsonpath=&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;{.spec.containers[*].name}&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;2-view-logs-for-a-specific-container&quot;&gt;2. View logs for a specific container&lt;/h3&gt;
&lt;p&gt;By default, &lt;code&gt;kubectl logs&lt;/code&gt; might fail if there is more than one container. Use the &lt;code&gt;-c&lt;/code&gt; flag to specify which one you want to see:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;kubectl&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; logs&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; pod/&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;podNam&lt;/span&gt;&lt;span&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;containerNam&lt;/span&gt;&lt;span&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;3-access-the-container-s-terminal-shell&quot;&gt;3. Access the container&#39;s terminal (shell)&lt;/h3&gt;
&lt;p&gt;If you need to jump inside the container to check file paths, environment variables, or network connectivity:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;kubectl&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; exec&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;it&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;podNam&lt;/span&gt;&lt;span&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;containerNam&lt;/span&gt;&lt;span&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; /bin/bash&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;What it does:&lt;/strong&gt; * &lt;code&gt;-it&lt;/code&gt;: Interactive and TTY (keeps the session open so you can type).
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-c &amp;lt;containerName&amp;gt;&lt;/code&gt;: Ensures you enter the correct container.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-- /bin/bash&lt;/code&gt;: Executes the bash shell (if bash isn&#39;t available, try &lt;code&gt;/bin/sh&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;bulb-quick-summary-table&quot;&gt;💡 Quick Summary Table&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align: left&quot;&gt;Goal&lt;/th&gt;&lt;th style=&quot;text-align: left&quot;&gt;Command Flag&lt;/th&gt;&lt;th style=&quot;text-align: left&quot;&gt;Why use it?&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;strong&gt;Identify&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;code&gt;-o jsonpath=&#39;...&#39;&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;text-align: left&quot;&gt;When you don&#39;t know the container names.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;strong&gt;Debug&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;code&gt;logs&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;text-align: left&quot;&gt;To see error messages or application output.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;strong&gt;Inspect&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;code&gt;exec -it&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;text-align: left&quot;&gt;To run manual commands inside the running environment.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Warning:&lt;/strong&gt; Be careful with &lt;code&gt;exec&lt;/code&gt; in production environments! Changes made manually inside a container are &lt;strong&gt;temporary&lt;/strong&gt; and will disappear if the Pod restarts. Always update your configuration or Dockerfile for permanent changes.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;identify-which-images-are-running-in-a-kubernetes-cluster&quot;&gt;⎈ Identify which images are running in a Kubernetes cluster&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;kubectl&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; get&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; pods&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;-all-namespaces&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; jsonpath=&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;{..image}&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;tr&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;[[:space:]]&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;sort&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;uniq&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;c&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;list-all-container-images-in-all-namespaces&quot;&gt;⎈ List all Container images in all namespaces&lt;/h2&gt;
&lt;p&gt;Easy ti grab a full list of running container images in the cluster, without relying on any extra plugins.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;kubectl&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; get&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; pods&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;-all-namespaces&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; jsonpath=&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;{.items[*].spec.containers[*].image}&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;\&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;tr&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;[[:space:]]&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;\&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;sort&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;\&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;uniq&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;c&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you want to list all container images by pod, the command is:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;kubectl&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; get&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; pods&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;-all-namespaces&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; jsonpath=&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;{range .items[*]}{&amp;quot;\n&amp;quot;}{.metadata.name}{&amp;quot;:\t&amp;quot;}{range .spec.containers[*]}{.image}{&amp;quot;, &amp;quot;}{end}{end}&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;\&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;sort&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;list-all-pulled-images-in-worker-nodes&quot;&gt;⎈ List all pulled images in worker nodes&lt;/h2&gt;
&lt;p&gt;List all images pulled for all nodes:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;kubectl&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; get&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; node&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;  -&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; json&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt; jq&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.items[].status.images[].names&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For a single worker node:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;kubectl&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; get&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; node&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; worker-node&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; json&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt; jq&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.status.images[].names&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;get-and-sort-cluster-events&quot;&gt;⎈ Get and sort cluster events&lt;/h2&gt;
&lt;p&gt;List all cluster events sorted by the newest first:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;kubectl&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; get&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; events&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;-sort-by=&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.lastTimestamp&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;real-time-node-status-monitoring&quot;&gt;⎈ Real-time node status monitoring&lt;/h2&gt;
&lt;p&gt;Filter and monitor nodes in real-time:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;watch&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;n1&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;kubectl get nodes --sort-by=.metadata.creationTimestamp | grep &amp;lt;node_name_hint&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;bulb-key-parameters-explained-1&quot;&gt;💡 Key Parameters Explained&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align: left&quot;&gt;Parameter&lt;/th&gt;&lt;th style=&quot;text-align: left&quot;&gt;Purpose&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;code&gt;-n1&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Runs the following command every 1 second.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;code&gt;--sort-by=.metadata.creationTimestamp&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;text-align: left&quot;&gt;It sorts the nodes by their age.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;database-health-check-probes&quot;&gt;⎈ Database health-check probes&lt;/h2&gt;
&lt;p&gt;When running databases like MySQL in Kubernetes, you want to know if the database is actually responding to queries.&lt;/p&gt;
&lt;p&gt;These configurations use &lt;strong&gt;Probes&lt;/strong&gt; to automate health checks.&lt;/p&gt;
&lt;h3 id=&quot;database-health-probes-mysql&quot;&gt;Database Health Probes (MySQL)&lt;/h3&gt;
&lt;p&gt;Probes allow Kubernetes to automatically &quot;heal&quot; your application or stop traffic if the database becomes unresponsive.&lt;/p&gt;
&lt;h4 id=&quot;1-liveness-probe-is-the-process-alive&quot;&gt;1. Liveness Probe: &quot;Is the process alive?&quot;&lt;/h4&gt;
&lt;p&gt;This probe determines if the container needs a &lt;strong&gt;restart&lt;/strong&gt;.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;yaml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-5&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-5&quot;&gt;ivenessProbe&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-5&quot;&gt;  e&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-5&quot;&gt;xec&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-5&quot;&gt;    c&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-5&quot;&gt;ommand&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;        &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;bash&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;        &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;-c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;        &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;mysqladmin --user=$MYSQL_USER --password=$MYSQL_PASSWORD ping&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      ]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-5&quot;&gt;  i&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-5&quot;&gt;nitialDelaySeconds&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; 30&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-5&quot;&gt;  t&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-5&quot;&gt;imeoutSeconds&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; 5&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;The Check:&lt;/strong&gt; Uses &lt;code&gt;mysqladmin ping&lt;/code&gt; to see if the MySQL server process is alive.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Wait Time:&lt;/strong&gt; It waits &lt;strong&gt;30 seconds&lt;/strong&gt; (&lt;code&gt;initialDelaySeconds&lt;/code&gt;) after starting before checking. This gives the database enough time to finish its internal startup (buffer pools, log recovery, etc.).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Failure:&lt;/strong&gt; If the command fails or takes longer than &lt;strong&gt;5 seconds&lt;/strong&gt;, Kubernetes will kill the Pod and start a fresh one.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;2-readiness-probe-is-the-db-ready-for-traffic&quot;&gt;2. Readiness Probe: &quot;Is the DB ready for traffic?&quot;&lt;/h4&gt;
&lt;p&gt;This probe determines if the container is ready to &lt;strong&gt;accept connections&lt;/strong&gt;.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;yaml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-5&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-5&quot;&gt;eadinessProbe&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-5&quot;&gt;  e&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-5&quot;&gt;xec&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-5&quot;&gt;    c&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-5&quot;&gt;ommand&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;        &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;bash&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;        &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;-c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;        &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;mysql --host=127.0.0.1 --user=$MYSQL_USER --password=$MYSQL_PASSWORD -e &amp;#39;SELECT 1&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      ]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-5&quot;&gt;  i&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-5&quot;&gt;nitialDelaySeconds&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; 5&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-5&quot;&gt;  p&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-5&quot;&gt;eriodSeconds&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; 2&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;The Check:&lt;/strong&gt; Runs a real SQL query (&lt;code&gt;SELECT 1&lt;/code&gt;). This is more thorough than a &quot;ping&quot; because it confirms the database can actually execute commands.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Frequency:&lt;/strong&gt; It checks every &lt;strong&gt;2 seconds&lt;/strong&gt; (&lt;code&gt;periodSeconds&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Traffic Control:&lt;/strong&gt; If this fails, Kubernetes removes the Pod from the Service endpoint. Your app won&#39;t try to send data to a database that isn&#39;t ready.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;bulb-pro-tip&quot;&gt;💡 Pro-Tip&lt;/h3&gt;
&lt;p&gt;Always use a &lt;strong&gt;Readiness Probe&lt;/strong&gt; for databases. If your database is doing a heavy internal migration or recovery, you want the Pod to stay &quot;Running&quot; (so it doesn&#39;t get killed by a Liveness probe) but you don&#39;t want your application to try and connect to it until the migration is finished.&lt;/p&gt;
</content>
        
    </entry>
</feed>
