<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Petrus Theron</title><description>Essays by Petrus Theron.</description><link>https://petrustheron.com</link><item><title>Grug&apos;s Guide to Solar</title><link>https://petrustheron.com/posts/grug-guide-to-solar</link><guid isPermaLink="true">https://petrustheron.com/posts/grug-guide-to-solar</guid><description>caveman grug explains solar for young grug learns how trap sun-spirit to keep cave lit and hi-fi pumping</description><pubDate>Sun, 22 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Work-in-progress. H/T: &lt;a href=&quot;https://grugbrain.dev/&quot; class=&quot;ext&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Grug Brain&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;caveman grug explains solar for young grug learns how trap sun-spirit to keep cave lit and hi-fi pumping during loadshedding&lt;/p&gt;
&lt;p&gt;&lt;em&gt;by Petrus Theron&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;introduction&quot;&gt;Introduction&lt;/h2&gt;
&lt;p&gt;grug see many caves go dark when sky-fire hide behind clouds&lt;br&gt;
grug tired of paying wolf skins to evil chief for sun-spirit while grug wait for sky-fire to return&lt;br&gt;
so young grug learns how build sun trap to capture sun-spirit and keep cave lit&lt;/p&gt;
&lt;p&gt;sun magic deep like cave. old grug spend many long winter study electron magic&lt;/p&gt;
&lt;p&gt;but young grug no fear – old grug teach sun magic simple for young grug&lt;br&gt;
if young grug learn only 3 equation, young grug know pretty much all of electron magic&lt;/p&gt;
&lt;p&gt;old grug used to earn wolf skins by building remote scrying and over-air firmware update for LiFePO4 crystal rock battery to store sun-juice&lt;/p&gt;
&lt;p&gt;but grug not sun shaman, so if grug make mistake, wise grug please correct grug. grug very sleepy after writing long post on stone tablet 😴&lt;/p&gt;
&lt;h2 id=&quot;table-of-contents&quot;&gt;Table of Contents&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;#introduction&quot;&gt;Introduction&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#solar-components&quot;&gt;Solar Components&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#how-much-sun-juice&quot;&gt;Loads: How Much Sun-Juice Grug Need?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#explain-sun-juice&quot;&gt;Energy &amp;amp; Power: Grug Explain Sun-Juice&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#electron-magic&quot;&gt;Voltage &amp;amp; Current: Electron Magic&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#ohm-law&quot;&gt;Ohm&apos;s Law: Resistance / Impedance&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#electron-magic-equations&quot;&gt;Electron Magic Equations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#joules-vs-watt-hours&quot;&gt;Grug Explain Joules vs. Watt-hours&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#peak-power&quot;&gt;Peak Power vs. Continuous Power&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#cold-crank&quot;&gt;Cold &amp;amp; Cranky&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#typical-load&quot;&gt;Typical Load&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#battery-chemistry&quot;&gt;Battery Chemistry&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;solar-components&quot;&gt;&lt;strong&gt;Solar Components&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;(grug make cave drawing later)&lt;/p&gt;
&lt;p&gt;grug learn to appease sun goddess with 7 things:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Battery&lt;/strong&gt; – stores sun-juice for later
&lt;ul&gt;
&lt;li&gt;traps electron magic in crystal rock, give DC power, e.g. 12V, 24V or 48V&lt;/li&gt;
&lt;li&gt;battery have chemistry like lead-acid, or lithium&lt;/li&gt;
&lt;li&gt;grug dinorider use 12V lead-acid battery&lt;/li&gt;
&lt;li&gt;modern cave battery mostly 24V or 48V lithium (LiFePO4)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Battery charger&lt;/strong&gt; &lt;em&gt;–&lt;/em&gt; keeps crystal battery full by turning AC power into DC power, also called AC-to-DC converter
&lt;ul&gt;
&lt;li&gt;battery charger output same voltage as battery for safe charging&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Solar panel&lt;/strong&gt; – obsidian tablet traps sun-spirit as DC electron magic, also called PV panel
&lt;ul&gt;
&lt;li&gt;PV short for photovoltaic. special silicon in PV crystal turn photon into electron&lt;/li&gt;
&lt;li&gt;solar panel voltage change depend on time of day, or cloud&lt;/li&gt;
&lt;li&gt;grug can think of solar panel as DC current source, either give DC power or get hot&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Solar charger&lt;/strong&gt; – safely guides sun-spirit into battery, also called DC-to-DC converter
&lt;ul&gt;
&lt;li&gt;solar charger match battery voltage for safe charging&lt;/li&gt;
&lt;li&gt;solar charger match impedance of solar panel to trap sun-spirit faster&lt;/li&gt;
&lt;li&gt;solar charger can be cheap pulse-width modulated controller (PWM) or Maximum Power-Point Tracker (MPPT) – MPPT cost more wolf skins, but work better than PWM&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Inverter&lt;/strong&gt; – magic electron box turn DC electron magic into AC electron magic to power grug bar fridge, also called DC-to-AC converter&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cables&lt;/strong&gt; – metal vines connect all parts. cables rated for current based on thickness, e.g. 15A for most cave extension lead&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Circuit breaker&lt;/strong&gt; – click rocks break circuit, open when too much sun-juice flow
&lt;ul&gt;
&lt;li&gt;too much sun-juice power melts metal vines like lava, burn down cave – grug wife not happy&lt;/li&gt;
&lt;li&gt;once big current start to flow, it want keep going like bison&lt;/li&gt;
&lt;li&gt;so breaker have electromagnet + wide metal contactor to stop current without plasma arc&lt;/li&gt;
&lt;li&gt;plasma chew on metal vines like baby t-rex, so breaker also save cables&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;sometimes many smart rocks combine in one big electron box called “inverter.” grug explain each part&lt;/p&gt;
&lt;h2 id=&quot;loads-how-much-sun-juice-grug-need&quot;&gt;&lt;strong&gt;Loads: How Much Sun-juice Grug Need?&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;first thing sun shaman ask grug: “what cave appliance grug wife want to power and how long?”&lt;br&gt;
grug must know:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;which magic rock drink sun-juice,e.g. cold box, hot rock or light rock&lt;/li&gt;
&lt;li&gt;how fast magic rock drink sun juice, in &lt;em&gt;Watts&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;how long magic rock drink sun-juice, in &lt;em&gt;hours&lt;/em&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;but first grug explain scary numbers like Watts&lt;br&gt;
young grug no run away – old grug make simple for young grug&lt;/p&gt;
&lt;h2 id=&quot;energy--power-grug-explain-sun-juice&quot;&gt;&lt;strong&gt;Energy &amp;amp; Power: Grug Explain Sun-Juice&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;sun-juice &lt;em&gt;Energy&lt;/em&gt; measured in &lt;em&gt;Joules [J], or Watt-hours [Wh]&lt;/em&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;speed of sun-juice flow is called &lt;em&gt;Power&lt;/em&gt;, measured in &lt;em&gt;Watts&lt;/em&gt; [W] or &lt;em&gt;Joules per second&lt;/em&gt; [J.s-1]
&lt;ul&gt;
&lt;li&gt;when sun-juice flow fast, more power flow in &lt;em&gt;Watts&lt;/em&gt; [W]&lt;/li&gt;
&lt;li&gt;100W just mean 100 &lt;em&gt;Joules per second&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;when sun-juice Power flow in &lt;em&gt;Watts&lt;/em&gt; over many hours, grug know sun-juice Energy in &lt;em&gt;Watt-hours&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;big-brain young grug can think in &lt;em&gt;Joules&lt;/em&gt;, but old grug drink too much icewine, so better think in Watt-hours [Wh]&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;grug wife buy many cave appliance that drink sun Power in &lt;em&gt;Watts&lt;/em&gt;; how fast they drink sun-juice?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;💡 light rock drink 10 Watts, mean 10 Joules every second&lt;/li&gt;
&lt;li&gt;❄️ cold box drink 200 Watts, or 200 Joules every second&lt;/li&gt;
&lt;li&gt;🔥 hot rock drink 2,000 Watts to boil river water (very powerful rock)&lt;/li&gt;
&lt;li&gt;💻 fruit company scrying tablet drink 100 Watts while charging so wife can watch bison cooking video on CaveTube&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;now grug learn most important equation for sun magic:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Energy = Power * Time&lt;/em&gt;&lt;br&gt;
= &lt;em&gt;Power&lt;/em&gt; [Watts] * Time [hours]&lt;br&gt;
= &lt;em&gt;Energy&lt;/em&gt; in &lt;em&gt;Watt-hours&lt;/em&gt;, or &lt;em&gt;Wh&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;grug give example:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;if grug wife run cold box cool for 10 hours @ 200W, how much sun-juice it drink?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;young grug remember:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Energy = Power * Time&lt;/em&gt;&lt;br&gt;
= 200W * 10 hours&lt;br&gt;
= 2,000 Watt-hours&lt;br&gt;
= 2kWh (&lt;em&gt;k&lt;/em&gt; just mean times 1,000)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;so if grug want know sun-juice Energy in &lt;em&gt;Watt-hours&lt;/em&gt;,&lt;br&gt;
grug simply multiply Power &amp;amp; Time, get &lt;em&gt;Energy&lt;/em&gt; in &lt;em&gt;Watt-hours&lt;/em&gt; [&lt;em&gt;Wh&lt;/em&gt;]&lt;/p&gt;
&lt;p&gt;most important discovery of sun magic. remember well, young grug use every day. from this sun magic equation, young grug also see that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Time = Energy / Power&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;now old grug test young grug brain:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;grug exchange wolf skins for 2,000Wh battery&lt;/li&gt;
&lt;li&gt;grug wife christmas lights drink sun-juice Power @ 200W&lt;/li&gt;
&lt;li&gt;how long will crystal battery power cave?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;young grug recall &lt;em&gt;Time = Energy / Power&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;battery store 2,000Wh energy&lt;/li&gt;
&lt;li&gt;cave appliance drink 200W&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;grug divide sun-juice trapped in battery called &lt;em&gt;Energy&lt;/em&gt;, by speed of sun-juice called &lt;em&gt;Power&lt;/em&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Time = Energy / Power&lt;br&gt;
= 2000Wh / 200W&lt;br&gt;
= 10 hours of sun-juice&lt;/li&gt;
&lt;li&gt;big-brain young grug will notice &lt;em&gt;Watts&lt;/em&gt; [W] cancel out; only hours remain. this good to know when grug check math&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;hmm, 20 hours not that long; grug might need bigger battery keep wife happy&lt;/p&gt;
&lt;p&gt;now young grug learn electron magic&lt;/p&gt;
&lt;h2 id=&quot;electron-magic-voltage--current&quot;&gt;&lt;strong&gt;Electron Magic (Voltage &amp;amp; Current)&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;electron magic flow like water in river, fast or slow&lt;br&gt;
grug elders no like water analogy, but good for young grug learn electron magic:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Voltage&lt;/em&gt; [V] is like pressure of water, e.g. 12V or 24V, or 220V&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Current&lt;/em&gt; [I] is like speed of water flow, measured in Amperes [A], or “amps” for short, e.g. 5A or 10A
&lt;ul&gt;
&lt;li&gt;these amps not same as hi-fi amps (which mean amplifier, different thing)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;grug multiply Voltage and Current to get electron magic Power in &lt;em&gt;volt-amperes&lt;/em&gt; [VA]:
&lt;ul&gt;
&lt;li&gt;Power [VA] = Voltage [V] * Current [I]&lt;/li&gt;
&lt;li&gt;or &lt;strong&gt;P = VI&lt;/strong&gt; for short
&lt;ol&gt;
&lt;li&gt;grug recall symbol &lt;em&gt;I&lt;/em&gt; stand for Current, can confuse&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;way to remember is high pressure * high current = high power. can have high pressure like gas bottle, but without flow, no power&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Power in &lt;em&gt;volt-ampere&lt;/em&gt; mean same as Power in &lt;em&gt;Watts&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;grug ask why &lt;em&gt;volt-ampere&lt;/em&gt; [VA] same as Watts? this go deep into electron magic. involve capacitors &amp;amp; inductors. but for now, young grug brain relax, only think in Watts [W], not volt-ampere [VA]&lt;/p&gt;
&lt;p&gt;young grug remember: Power in &lt;em&gt;Watts&lt;/em&gt; mean rate of flow of sun-juice Energy&lt;/p&gt;
&lt;h2 id=&quot;ohms-law-resistance--impedance&quot;&gt;&lt;strong&gt;Ohm&apos;s Law: Resistance / Impedance&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;grug watch over prairie many summer night and ponder why skyfire rain down on savanna, called lightning. grug know from water analogy:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;when river wide, strong current flow&lt;/li&gt;
&lt;li&gt;when river narrow like stream, weak current flow&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;grug learn same is true of electron magic, called &lt;em&gt;Resistance&lt;/em&gt;, measured in ohms (Ω) like buddha:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;when electron valley wide, Resistance low – more current will flow&lt;/li&gt;
&lt;li&gt;when electron valley narrow, Resistance high – less current will flow&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;grug elders think long and hard on this, but one day big-brained grug named Georg Ohm discover why river current flow strong during storm, even though valley narrow&lt;/p&gt;
&lt;p&gt;young grug now learn most ancient equation that tell grug how much Current [I] will flow based on Voltage [V] (“electron pressure”) and Resistance [R] (“width of valley”)&lt;/p&gt;
&lt;p&gt;this equation called Ohm’s Law:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Voltage [V] = Current [I] * Resistance [R]&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;V = IR&lt;/strong&gt;, for short&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;from Ohm’s Law, young grug can compute third value even if only know two:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;if grug know Current &amp;amp; Resistance, grug can compute Voltage, &lt;strong&gt;V = I*R&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;if grug know Voltage &amp;amp; Resistance, grug can compute Current [I], &lt;strong&gt;I = V/R&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;if grug know Voltage &amp;amp; Current, grug can compute Resistance, &lt;strong&gt;R = V/I&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;best way for grug to think of Ohm’s Law is that Current [I] will flow to satisfy V/R, until current stop&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;current only stop when battery burn, cable melt, breaker trip or grug let go of kettle&lt;/li&gt;
&lt;li&gt;this why breaker so important, protect barefoot grug in kitchen when washing machine leak&lt;/li&gt;
&lt;li&gt;when Resistance low, I = V/R, so as R -&amp;gt; 0, I -&amp;gt; ♾️ for any Voltage [V] until kaboom&lt;/li&gt;
&lt;li&gt;this especially happen during short-circuit&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;young grug see that as long Resistance high, smol current flow&lt;/p&gt;
&lt;p&gt;but if voltage very high, can overcome high resistance (like high water pressure during storm) and big current will still flow&lt;/p&gt;
&lt;p&gt;indeed, this why skyfire lightning travel through air despite high resistance (2×1016Ω⋅m): because electron skyfire very high voltage (100kV)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;metal vines like copper cable have very low resistance, so electricity flow easy even at low voltage&lt;/li&gt;
&lt;li&gt;low voltage safer than high voltage – high voltage jump between metal vine&lt;/li&gt;
&lt;li&gt;opposite of Resistance is called Conductance, but grug only think in Resistance&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;because I = V/R, given a fixed resistance R:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;when voltage high, more current flow&lt;/li&gt;
&lt;li&gt;when voltage low, current flow slow&lt;/li&gt;
&lt;li&gt;when current high, voltage must be high&lt;/li&gt;
&lt;li&gt;when current low, voltage must be low&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;in reality, resistance not fixed because depend on frequency of voltage &amp;amp; current, but grug only think about simple loads today&lt;/p&gt;
&lt;p&gt;now grug give example using Ohm’s Law:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;if grug inverter output AC voltage 220V,&lt;/li&gt;
&lt;li&gt;and grug wife cave kettle have resistance of 20-ohm&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;how much current flow through metal vine in kettle?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;young grug recall V = IR&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;V = I*R&lt;/strong&gt;&lt;br&gt;
Voltage = Current * Resistance&lt;br&gt;
220V = I*20-ohm&lt;/li&gt;
&lt;li&gt;now grug solve for I = V/R&lt;br&gt;
I = 220V/20-ohm&lt;br&gt;
= 11A of Current, measured in amps&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;grug know metal vine will melt when current too high, so is this safe?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;kettle cable rated @ 15A, so safe for 11A&lt;/li&gt;
&lt;li&gt;big-brain young grug notice when voltage high, current low&lt;/li&gt;
&lt;li&gt;when voltage low, current high – need thick metal vine, cost many wolf skins&lt;/li&gt;
&lt;li&gt;this why elders of tribe transmit electron magic over long distance at low current and high voltage (22kV), to use thin cables that cost fewer wolf skins&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;grug test young grug brain&lt;br&gt;
young grug recall that &lt;strong&gt;P = VI&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;how much power in Watts will cave kettle drink?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;P = VI&lt;/strong&gt;&lt;br&gt;
= 220V * 11A&lt;br&gt;
= 2,420W&lt;br&gt;
= 2.42kW&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;that is lot of power. hot rock very expensive to run on battery, this why grug prefer gas&lt;br&gt;
better save sun magic for cold box and light box&lt;/p&gt;
&lt;h3 id=&quot;impedance-vs-resistance&quot;&gt;&lt;strong&gt;Impedance vs. Resistance&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;impedance mean same as resistance, but more complex. related to deep electron magic that involve capacitor and inductor. grug ignore this for now; young grug only care about Resistance, measured in ohms&lt;/p&gt;
&lt;h2 id=&quot;electron-magic-equations&quot;&gt;&lt;strong&gt;Electron Magic Equations&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;young grug now learns 3 most important equations in all of electron magic:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Energy [E] = Power [P] * Time [hours], &lt;strong&gt;E = Pt&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Power [P] = Voltage [V] * Current [I], &lt;strong&gt;P = VI&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Voltage [V] = Current [I] * Resistance [R], or &lt;strong&gt;V = IR&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;using these 3 equation, young grug can design all components of sun trap and appease sun goddess&lt;/p&gt;
&lt;p&gt;grug do one last example to test young grug brain:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;grug have 12V battery&lt;/li&gt;
&lt;li&gt;10A current flow to hot rock&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;how fast energy flow out of battery called Power, measured in &lt;em&gt;Watts&lt;/em&gt;?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;young grug recall &lt;strong&gt;P = V*I&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;P = Voltage [V] * Current [I]&lt;br&gt;
= 12V * 10A&lt;br&gt;
= 120VA&lt;br&gt;
= 120W&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;lastly, if battery trap 2,000Wh sun-juice Energy, how long until battery empty?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Energy = Power * Time, so&lt;/li&gt;
&lt;li&gt;Time = Energy / Power&lt;br&gt;
= 2000Wh / 120W&lt;br&gt;
= 16.67 hours&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;grug-explain-joules-vs-watt-hours&quot;&gt;&lt;strong&gt;Grug Explain Joules vs. Watt-hours&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;(keep this part? move to appendix probably)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;10W Power mean 10 Joules per second [J/s, or J.s-1],&lt;/li&gt;
&lt;li&gt;if 10W flow for 10 seconds, young grug recall &lt;em&gt;Energy = Power * Time&lt;/em&gt;,
&lt;ul&gt;
&lt;li&gt;10W*10s = 100 Joules = 100J&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;if cave appliance drink sun-juice @ 10W for 1 hour, then,
&lt;ul&gt;
&lt;li&gt;sun-juice Energy = 10W * 1 hour = 10 Watt-hours = 10Wh&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;if cave appliance drink sun-juice @ 100W for 5 hours, then
&lt;ul&gt;
&lt;li&gt;sun-juice Energy = 5 hours * 100W = 500 Watt-hours = 500Wh&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;grug can also count sun-juice in Joules, but more hard:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;grug know there are 3,600 seconds in one hour = 60 minutes * 60 seconds,&lt;/li&gt;
&lt;li&gt;if 10W sun-juice flow, it mean 10 Joule-per-second, so&lt;/li&gt;
&lt;li&gt;10 J/s * 3600s= 36,000 Joules [J], or 36kJ (k just mean times 1,000)
&lt;ul&gt;
&lt;li&gt;young grug notice how seconds cancel out again&lt;/li&gt;
&lt;li&gt;but old grug too dumb for Joules&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;grug think better in Watt-hours&lt;/li&gt;
&lt;li&gt;grug only care how long sun-juice run bar fridge&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;now grug test young grug brain with big number:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;if grug wife boil 2,000W cave kettle for 1 hour,&lt;/li&gt;
&lt;li&gt;how much sun-juice Energy young grug need?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;grug recall &lt;em&gt;Energy = Power * Time&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;so young grug multiply Power with Time to get sun-juice energy in Joules:
&lt;ul&gt;
&lt;li&gt;Energy [Wh] = Power [W] * Time [s]&lt;/li&gt;
&lt;li&gt;Energy = 2000W * 1 hour = 2000Wh = 2kW (&lt;em&gt;k&lt;/em&gt; just mean times 1,000)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;peak-power-vs-continuous-power&quot;&gt;&lt;strong&gt;Peak Power vs Continuous Power&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;electron magic appliances have &lt;em&gt;average&lt;/em&gt; power rating, but electron magic appliances drink more sun-juice when turning on, called &lt;em&gt;peak power&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;peak power can be 2-10 times more than average&lt;br&gt;
even if peak very short – just few seconds – breakers will trip if too much current flow&lt;/p&gt;
&lt;p&gt;so grug must plan sun trap to handle peak loads, not just average loads&lt;/p&gt;
&lt;p&gt;good example is cold box: cold box have compressor, drinks ~7 times more current when turn on, magnetise coil in compressor that make gas cold&lt;/p&gt;
&lt;p&gt;this why grug battery struggle to run fridge&lt;/p&gt;
&lt;p&gt;=== rest is todo&lt;/p&gt;
&lt;p&gt;(grug is still writing this part, very tired)&lt;/p&gt;
&lt;p&gt;Electrical loads are typically rated in terms of their &lt;em&gt;average&lt;/em&gt; voltage [V] and &lt;em&gt;average&lt;/em&gt; current [A] demands. We can calculate a load’s average electrical power demand by multiplying its rated voltage [V] and current [A] to arrive at volt-amperes [VA] or Watts [W], e.g.:&lt;/p&gt;
&lt;p&gt;Power Demand [in Watts]&lt;br&gt;
= Voltage [V] * Current [A]&lt;br&gt;
= 12V * 5A&lt;br&gt;
= 60W, or 60J.s-1.&lt;/p&gt;
&lt;p&gt;…however, average power consumption (in Watts) only tells half the story: dynamical systems frequently exhibit nonlinear behaviour during transients like startup and shut down (that’s where the excitement is in life). For example:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AC refrigerators require high inrush currents to magnetise the coils in their compressors. These inrush currents can be 2 to 10 times the average current draw. If your power plant cannot supply these peaks, your beer will remain warm. The rule of thumb for AC fridges is that your inverter needs to supply ~7 times the average power draw at peak, when turning on.&lt;/li&gt;
&lt;li&gt;Real-world batteries act like spring systems, so voltage tends to dip during high current draw and voltage gradually declines as most batteries discharge. Certain electronic loads require a minimum voltage to bias semiconductor components, or the load won’t turn on at all. This can become a problem during surges when voltage dips, especially as batteries approach end-of-life.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;OK, that’s enough theory for now - let’s design a system for a light electronic load.&lt;/p&gt;
&lt;h2 id=&quot;cold--cranky-cold--cranky&quot;&gt;&lt;strong&gt;Cold &amp;amp; Cranky&lt;/strong&gt; {#cold-&amp;amp;-cranky}&lt;/h2&gt;
&lt;p&gt;To kickstart a petrol car engine with a 12V lead-acid battery costs 400A for ~4 seconds. This is called “cold-cranking amps.” Let’s calculate how much power that is:&lt;/p&gt;
&lt;p&gt;P = V * I&lt;br&gt;
= 12V * 400A&lt;br&gt;
= 4,800W&lt;br&gt;
= 4.8kW&lt;/p&gt;
&lt;p&gt;How much energy is that in Joules? Recall, &lt;em&gt;Energy = Power * Time&lt;/em&gt;:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;E = Power * Time&lt;/em&gt;&lt;br&gt;
&lt;em&gt;= 4,800W * 4 seconds&lt;/em&gt;&lt;br&gt;
&lt;em&gt;= 4,800&lt;/em&gt;J.s-1 &lt;em&gt;* 4s&lt;/em&gt;&lt;br&gt;
&lt;em&gt;= 19,200&lt;/em&gt;J.s.s-1&lt;br&gt;
&lt;em&gt;= 19,200&lt;/em&gt;J.s0&lt;br&gt;
&lt;em&gt;= 19,200&lt;/em&gt;J&lt;br&gt;
&lt;em&gt;= 19.2kJ.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;How many times can you start a car before the battery runs flat?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A 12V lead-acid car battery is typically rated at ~100Ah [amp-hours]. This is called the battery’s &lt;em&gt;C-rating&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;A C1-rating of 100Ah means the battery should be able to deliver &lt;em&gt;100A for 1 hour&lt;/em&gt; at its rated voltage, e.g. 12V. How much energy is that in Watt-hours? Recall,
&lt;ul&gt;
&lt;li&gt;E = Power * Time&lt;br&gt;
= V * I * Time&lt;br&gt;
= 12V * 100A * 1 hour&lt;br&gt;
= 1200Wh&lt;br&gt;
= 4,320kJ.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Theoretically, 4,320kJ/19.2kJ = ~225 times, but in practice the battery will run flat before this. Why? Because 400A is &lt;strong&gt;4 times&lt;/strong&gt; more than the C1-rating and losses scale &lt;em&gt;exponentially&lt;/em&gt; with current, and fully discharging the battery will damage it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Not all loads are made equal; we need to understand peak demands to design our plant.&lt;/p&gt;
&lt;h2 id=&quot;typical-load&quot;&gt;&lt;strong&gt;Typical Load&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;What kind of battery and inverter setup do we need to power a laptop, a lamp and two hand-held radios for 12 hours a day? Our loads:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Laptop @ 96W (charging)&lt;/li&gt;
&lt;li&gt;2x Lamps @ 8W = 16W&lt;/li&gt;
&lt;li&gt;2x Radios @ 4W = 8W (0.5A x 8.4V ~ 4.2W)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Total Average Power Demand:&lt;/strong&gt; 120W.&lt;br&gt;
&lt;strong&gt;Daily Demand:&lt;/strong&gt; 120W * 12 hours = 1,440Wh [Watt-hours].&lt;/p&gt;
&lt;p&gt;Hmm, sounds like all we need is a 120W solar panel and a 1440Wh battery, right?&lt;/p&gt;
&lt;p&gt;Unfortunately, no system is 100% efficient - especially low-voltage systems. Lower voltage means higher currents and thermal losses grow exponentially as current rises. We need to compensate for losses:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Low-voltage (12V) inverters are 93% efficient &lt;em&gt;at-best&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;We will lose another ~1-2% in cable losses, so our total DA-to-AC conversion is ~90% efficient under optimal conditions.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Can’t we just add 10% to our spec? Not so fast! Draining our batteries down to 0% State of Charge (SoC) every day damages them and will cause them to fail in just a few short months. So we need to add a buffer so we do not exceed the optimal Depth of Discharge (DoD) for our battery. Optimal DoD depends on battery chemistry.&lt;/p&gt;
&lt;h2 id=&quot;battery-chemistry&quot;&gt;&lt;strong&gt;Battery Chemistry&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;There are two common battery technologies in 2024 used in home setups:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Lead-acid, and&lt;/li&gt;
&lt;li&gt;Lithium, specifically lithium-ferrous phosphorus (LiFePO4).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Battery life is measured in cycles and Depth of Discharge (DoD) - not years. Deeper discharge = shorter life, depending on chemistry, so DoD is your main consideration for capacity planning. Batteries do not fail suddenly: their capacity erodes over time until voltage dips below a usable level.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The average lead-acid battery yields 1,000 cycles at 50% DoD. Assuming one cycle per day, 1000/365 = ~2.7 years.&lt;/li&gt;
&lt;li&gt;Lithium yields 3,600 cycles at 70% DoD = 3600/365 = 9.86 years.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you can afford it, get LiFePO4. Here are the key differences:&lt;/p&gt;
&lt;div class=&quot;table-wrap&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Lead-acid&lt;/th&gt;
&lt;th&gt;Lithium&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Chemistry&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;PbSO4 &amp;amp; H2SO4&lt;/td&gt;
&lt;td&gt;LiFePO4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Mass&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~18kg/kWh (Heavy)&lt;/td&gt;
&lt;td&gt;10kg/kWh (Light)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cost&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~R3,000/kWh&lt;/td&gt;
&lt;td&gt;~R10,000/kWh&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Lifetime (cycles)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;6,000 cycles at 10% DoD 2,200 cycles 25% DoD 1,000 cycles @ 50% DoD 250-500 cycles @ 90% DoD460 cycles @ 100% DoD&lt;/td&gt;
&lt;td&gt;5000 cycles @ 50% DoD 3000 cycles @ 80% DoD 2000 cycles @ 100% DoD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Depth of Discharge (without losing significant capacity)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;50%&lt;/td&gt;
&lt;td&gt;70%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Battery Management&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Simple&lt;/td&gt;
&lt;td&gt;Complex&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ideal Storage Level (State of Charge or SoC)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;~70%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Self-Discharge Rate&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;3-8% per month&lt;/td&gt;
&lt;td&gt;&amp;lt;3% per month&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;To maximise the lifetime of our batteries, we need to store more energy than we’re going to use.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Lead-acid should not exceed 50% DoD, so we’ll need twice as much storage: 2 * 1440Wh = 2880Wh.&lt;/li&gt;
&lt;li&gt;Lithium can go down to 70% DoD, so we only need 1440/70% = 2,057Wh of storage.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Lithium costs more, but it will last longer. Lead-acid is used in cars for their cold-cranking ability to provide high surge currents without deteriorating. They’re heavy and well-understood.&lt;/p&gt;
&lt;p&gt;(here go into more detail on options with real-world choices)&lt;/p&gt;
&lt;h2 id=&quot;viva-la-resistance-viva-la-resistance&quot;&gt;&lt;strong&gt;Viva la Resistance&lt;/strong&gt; {#viva-la-resistance}&lt;/h2&gt;
&lt;p&gt;Eskom transmits electricity over long distances at high voltages (20kV, 220kV or 400kV) because the same power can be transmitted at lower currents. Lower currents mean thinner, cheaper cables with fewer losses. Recall that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Power [W] = Voltage [V] * Current [A].&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As voltage goes up, current can come down proportionately without losing power. But why do losses scale exponentially with current flow?&lt;/p&gt;
&lt;p&gt;Various materials conduct electricity and exhibit unique phenomena when they do. E.g.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Resistors dissipate electricity as &lt;em&gt;heat&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Light-emitting diodes (LEDs) convert electricity into &lt;em&gt;light&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Batteries store energy as chemical energy.&lt;/li&gt;
&lt;li&gt;Capacitors store electricity as electrostatic energy.&lt;/li&gt;
&lt;li&gt;Inductors store electricity as magnetic energy.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Whenever an electrical component converts or stores electrical power, we will see a voltage drop over that component. This voltage drop will depend on the current that flows through the component. Now let us learn about the concept of &lt;em&gt;Resistance&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Resistance is measured in Ohms and denoted by the Greek letter Ω (omega), so 10Ω means 10 ohms. There are plenty of water analogies floating around to explain electricity like “pressure vs. flow” for “voltage vs. current,” but liquid flow and electron flow are not the same. Better to focus on measurable behaviour like voltage, current and power transfer.&lt;/p&gt;
&lt;p&gt;(todo work here)&lt;/p&gt;
&lt;p&gt;Resistance is defined as…. The best-known electrical component is the resistor.&lt;/p&gt;
&lt;p&gt;Remember, that since P = V*I, then if either V or I is zero, no power is dissipated by that component. Current can flow, but unless there is a voltage drop, P=0.&lt;/p&gt;
&lt;p&gt;If power is being transferred, there must be a voltage drop over the component, or power was not being absorbed.&lt;/p&gt;
&lt;p&gt;Therefore, if a wire heats up when we apply a voltage to it, that wire is converting electrical energy into heat. Heat, or kinetic energy, is dissipated at a certain rate, or power.&lt;/p&gt;
&lt;p&gt;We can measure the rate heat is dissipated at using a super-sensitive temperature probe. Resistance as a concept is defined in terms of this rate of dissipation. Typically, resistance scales linearly with voltage and current, but not always. If you apply 1 Volt over the ends of a wire and the wire heats up to dissipate exactly 1W of power, then we say that wire has a resistance of exactly 1Ω (1 ohm).&lt;/p&gt;
&lt;p&gt;(This section is unfinished)&lt;/p&gt;
&lt;p&gt;This is evident from P = VI (todo diagram)&lt;/p&gt;
&lt;p&gt;e apply a voltage to a component, you can be sure current is flowing because P must equal V * I. If either V or I are&lt;/p&gt;
&lt;p&gt;= V*I, so if a wire heats up when we apply voltage, P = V*I. current&lt;/p&gt;
&lt;p&gt;there will be a voltage drop over We can measure this with a multimeter like so (show diagram of voltage drop over LED when on).&lt;/p&gt;
&lt;p&gt;Current can pass through a conductor without flows but there Electrical energy can pass through a component (like a wire) without transferred power&lt;/p&gt;
&lt;p&gt;If current flows, but no&lt;/p&gt;
&lt;p&gt;As long as current flows and there’s a voltage drop, we can calculate the power lost / transferred / converted in that component based on P(loss)= V * I. As long as current flows current flows&lt;/p&gt;
&lt;p&gt;…&lt;/p&gt;
&lt;h2 id=&quot;battery-c-ratings&quot;&gt;&lt;strong&gt;Battery C-Ratings&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;![][image1]&lt;/p&gt;
&lt;h3 id=&quot;ideal-battery-c-ratings&quot;&gt;&lt;strong&gt;Ideal Battery C-ratings&lt;/strong&gt;&lt;/h3&gt;
&lt;div class=&quot;table-wrap&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;C-Rate&lt;/th&gt;
&lt;th&gt;Rated Capacity (Ah)&lt;/th&gt;
&lt;th&gt;Average Current (A)&lt;/th&gt;
&lt;th&gt;Charge (or discharge) Time&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;5C&lt;/td&gt;
&lt;td&gt;50 Ah&lt;/td&gt;
&lt;td&gt;250 A&lt;/td&gt;
&lt;td&gt;12 min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2C&lt;/td&gt;
&lt;td&gt;50 Ah&lt;/td&gt;
&lt;td&gt;100 A&lt;/td&gt;
&lt;td&gt;30 min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;1C&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;50 Ah&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;50 A&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1 hour&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;.5C (aka C/2)&lt;/td&gt;
&lt;td&gt;50 Ah&lt;/td&gt;
&lt;td&gt;25 A&lt;/td&gt;
&lt;td&gt;2 hours&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;.25C (aka C/4)&lt;/td&gt;
&lt;td&gt;50 Ah&lt;/td&gt;
&lt;td&gt;12.5 A&lt;/td&gt;
&lt;td&gt;4 hours&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;.1C (aka C/10)&lt;/td&gt;
&lt;td&gt;50 Ah&lt;/td&gt;
&lt;td&gt;5 A&lt;/td&gt;
&lt;td&gt;10 hours&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;(detail nonlinear discharge rates at various currents &amp;amp; temperatures)&lt;/p&gt;
&lt;h2 id=&quot;series-vs-parallel-series-vs-parallel&quot;&gt;&lt;strong&gt;Series vs Parallel&lt;/strong&gt; {#series-vs-parallel}&lt;/h2&gt;
&lt;h2 id=&quot;kirchoffs-current-law-kirchoffs-current-law&quot;&gt;&lt;strong&gt;Kirchoff’s Current Law?&lt;/strong&gt; {#kirchoff’s-current-law?}&lt;/h2&gt;
&lt;h2 id=&quot;detailed-components&quot;&gt;&lt;strong&gt;Detailed Components&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Todo.&lt;/p&gt;
&lt;h2 id=&quot;battery-battery&quot;&gt;&lt;strong&gt;Battery&lt;/strong&gt; {#battery}&lt;/h2&gt;
&lt;p&gt;Either lead acid or lithium (LiFePO4 means lithium ferrous phosphorus).&lt;/p&gt;
&lt;p&gt;May contain a battery management system (BMS).&lt;/p&gt;
&lt;h2 id=&quot;solar-charger-solar-charger&quot;&gt;&lt;strong&gt;Solar Charger&lt;/strong&gt; {#solar-charger}&lt;/h2&gt;
&lt;p&gt;This is essentially a DC-to-DC converter…&lt;/p&gt;
&lt;p&gt;This will be either a PWM controller or MPPT (Maximum Power-Point Tracker)&lt;/p&gt;
&lt;h2 id=&quot;battery-charger-battery-charger&quot;&gt;&lt;strong&gt;Battery Charger&lt;/strong&gt; {#battery-charger}&lt;/h2&gt;
&lt;p&gt;Overcharging or undercharging a battery is fatal. The main job of a battery charger is to limit charging current and stop charging when the battery is full so it doesn’t catch fire.&lt;/p&gt;
&lt;p&gt;How do you know when a battery is fully charged? It’s complicated, but we’ll get into it. Consider that if you connect a fully charged battery to a discharged battery without a, maximum&lt;/p&gt;
&lt;h2 id=&quot;circuit-breakers-circuit-breakers&quot;&gt;&lt;strong&gt;Circuit Breakers&lt;/strong&gt; {#circuit-breakers}&lt;/h2&gt;
&lt;p&gt;How do you stop a truck? Big brakes. And big brakes get hot when you dump energy on them. Electricity doesn’t like to stop flowing, so circuit breakers are kind of like brakes for your circuits. They are idealised switches that consist of a lever and a metal contactor that can be flipped with enough mechanical force to break the current flowing “all-at-once” without electrons arcing across the gap (“look ma, I’m welding!”).&lt;/p&gt;
&lt;p&gt;Breakers are important to disconnect your battery from loads when more current starts flowing than your battery or cables can handle without starting a braai in your garage.&lt;/p&gt;
&lt;p&gt;(to be continued…)&lt;/p&gt;
</content:encoded></item><item><title>Grug&apos;s Guide to Sound</title><link>https://petrustheron.com/posts/2024-12-12-grug-guide-to-sound</link><guid isPermaLink="true">https://petrustheron.com/posts/2024-12-12-grug-guide-to-sound</guid><description>caveman&apos;s guide to sound</description><pubDate>Thu, 12 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;H/T: &lt;a href=&quot;https://grugbrain.dev/&quot; class=&quot;ext&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Grug Brain&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;this collection of thoughts on sound gathered by grug sound engineer&lt;/p&gt;
&lt;p&gt;grug sound engineer not so smart, but grug sound engineer listen country and techno many long year and learn some things although mostly still confused&lt;/p&gt;
&lt;p&gt;grug sound engineer try collect learns into small, easily digestible and funny page, not only for you, the young grug, but also for him because as grug sound engineer get older he forget important things, like which cable red or white and which way speaker vibrate&lt;/p&gt;
&lt;p&gt;sound is deep like bear cave and will consume young grug if he lets it. it too late for old grug, but young grug can save himself. learns from mistake of old grug after many moons listen music and dance around fire&lt;/p&gt;
&lt;h2 id=&quot;the-eternal-enemy-noise&quot;&gt;The Eternal Enemy: Noise&lt;/h2&gt;
&lt;p&gt;apex predator of grug sound engineer is noise and distortion&lt;/p&gt;
&lt;p&gt;noise bad&lt;br&gt;
distortion bad&lt;/p&gt;
&lt;p&gt;distortion &lt;em&gt;very&lt;/em&gt; bad, hurt speaker and grug ears&lt;/p&gt;
&lt;p&gt;given choice between distortion and t-rex, grug take t-rex, except when dancing around fire – then grug no care about noise if sound loud, but loud sound bad for young grug ears&lt;/p&gt;
&lt;p&gt;noise is enemy worse than bear&lt;/p&gt;
&lt;p&gt;once bear inside cave, hard make bear leave&lt;br&gt;
so better to avoid noise with good signal chain&lt;/p&gt;
&lt;p&gt;grug study signal processing learn to hunt and kill noise &amp;amp; distortion&lt;/p&gt;
&lt;p&gt;high-fidelity mean faithful reproduction, low noise, low distortion&lt;br&gt;
old grug like faithful sound so much, grug even name company &lt;a href=&quot;https://web.archive.org/web/20241214000503/https://faithacoustics.com/&quot; class=&quot;ext&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;faith acoustics&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;signal-chain&quot;&gt;Signal Chain&lt;/h2&gt;
&lt;p&gt;young grug signal chain look like streamer -&amp;gt; DAC -&amp;gt; amplifier -&amp;gt; speakers -&amp;gt; room. room &amp;amp; speaker last in signal chain. sometimes grug think better in reverse&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;room&lt;/strong&gt; is like cave
&lt;ul&gt;
&lt;li&gt;flat cave wall echo like valley. echo bad. young grug call this reverb&lt;/li&gt;
&lt;li&gt;sound treatment like carpet &amp;amp; curtains in grug cave, less reverb&lt;/li&gt;
&lt;li&gt;wise grug always face speakers down length of cave, less reverb&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;speaker&lt;/strong&gt; turn electrical energy into acoustic energy
&lt;ul&gt;
&lt;li&gt;speakers have drivers – driver is just magnet attached to cone&lt;/li&gt;
&lt;li&gt;magnet move when electricity go up &amp;amp; down, push cone back &amp;amp; forth&lt;/li&gt;
&lt;li&gt;moving cone make sound, hit grug ear. make grug feel good, especially when dance by fire in moonlight&lt;/li&gt;
&lt;li&gt;grug mount driver in speaker box to make sound louder – young grug call this resonating chamber&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;amplifier&lt;/strong&gt; or “amp” adds strength of bison to input signal to make speaker roar like king of jungle
&lt;ul&gt;
&lt;li&gt;sometimes amp inside speaker. grug call this speaker &lt;em&gt;active&lt;/em&gt;, because amp built-in&lt;/li&gt;
&lt;li&gt;most speaker &lt;em&gt;passive&lt;/em&gt; – need amp&lt;/li&gt;
&lt;li&gt;most high-fidelity speakers passive – need amp&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DAC&lt;/strong&gt; or &lt;em&gt;digital-to-analog converter&lt;/em&gt; decodes digital signal of ones &amp;amp; zeros to analog signal smooth like balding grug hairline, so amp can make smooth signal loud
&lt;ul&gt;
&lt;li&gt;young grug already has DAC inside TV, phone, laptop and bluetooth speaker, but not very good&lt;/li&gt;
&lt;li&gt;good external DAC cost few wolf skins, but make grug close eyes when dance around fire&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;streamer&lt;/strong&gt; download digital music from young grug internet like Spotify, TIDAL or YouTube
&lt;ul&gt;
&lt;li&gt;streamer send digital signal to DAC to turn ones &amp;amp; zeros into smooth analog signal&lt;/li&gt;
&lt;li&gt;sometimes streamer have internal DAC, usually not good&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;grug no like vinyl because vinyl noisy. other grugs want religious war over grug say this heresy&lt;/p&gt;
&lt;h1 id=&quot;components&quot;&gt;Components&lt;/h1&gt;
&lt;p&gt;now grug discuss each component so young grug can purchase good sound for cave. young grug neighbour will love grug for bringing good sound to quiet valley!&lt;/p&gt;
&lt;h2 id=&quot;speakers&quot;&gt;Speakers&lt;/h2&gt;
&lt;p&gt;easy for grug to make speaker sound good in one place, at low volume&lt;br&gt;
hard for grug to make speaker sound good everywhere, at high volume&lt;/p&gt;
&lt;p&gt;loud speaker usually not very good&lt;br&gt;
good speaker usually not very loud&lt;/p&gt;
&lt;p&gt;good loud speaker cost many wolf skins – grug wife not happy&lt;/p&gt;
&lt;p&gt;rule of thumb: young grug spend twice as many wolf skins on speakers as amp, but amp so cheap now, grug can spend 10 times more wolf skins on speakers than amp&lt;/p&gt;
&lt;p&gt;listen close young grug, speaker have important characteristics:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;power rating&lt;/strong&gt; measured in Watts
&lt;ul&gt;
&lt;li&gt;determine how big amp grug buy&lt;/li&gt;
&lt;li&gt;most amp specifications from manufacturer very misleading for grug&lt;/li&gt;
&lt;li&gt;grug only trust objective measurement from big brain old grugs on &lt;a href=&quot;https://www.audiosciencereview.com/forum/index.php?threads/fosi-audio-v3-amplifier-review.45757/&quot; class=&quot;ext&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;AudioScienceReview&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;nominal impedance&lt;/strong&gt; grug measure in ohms like buddha
&lt;ul&gt;
&lt;li&gt;usually 8-ohm, 6-ohm or 4-ohm.&lt;/li&gt;
&lt;li&gt;impedance matter because safe for amplifier&lt;/li&gt;
&lt;li&gt;most speaker 8-ohm; car speaker 4-ohm&lt;/li&gt;
&lt;li&gt;nominal mean average, like grug iq, but in reality impedance change by frequency:
&lt;ul&gt;
&lt;li&gt;low frequency whale noise draw more current (low impedance)&lt;/li&gt;
&lt;li&gt;high frequency bird noise draw less current (high impedance)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;current is limit. power supply of amp always run out of current eventually, just like grug want rest after chase wife on savanna&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;sensitivity&lt;/strong&gt; just mean &lt;em&gt;efficiency&lt;/em&gt;, measured in decibel (dB)
&lt;ul&gt;
&lt;li&gt;sensitivity mean how much loudness hit grug ear for 1 Watt of electrical power&lt;/li&gt;
&lt;li&gt;more sensitivity better, so amp not work as hard as grug to sell amps for cave&lt;/li&gt;
&lt;li&gt;low-sensitivity speakers (inefficient ) need bigger amp for make loud roar&lt;/li&gt;
&lt;li&gt;average speaker 83dB sensitivity&lt;/li&gt;
&lt;li&gt;bookshelf speaker usually 89dB sensitivity&lt;/li&gt;
&lt;li&gt;for every 6dB lower speaker sensitivity, amp work twice as hard make same loudness, i.e. 83dB speaker need twice as much power as 89dB speaker for same loudness&lt;/li&gt;
&lt;li&gt;professional cave club speaker very efficient @ 100dB sensitivity&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;frequency response&lt;/strong&gt; depend on drivers
&lt;ul&gt;
&lt;li&gt;big driver make low frequency like bison. called woofer&lt;/li&gt;
&lt;li&gt;small driver make high frequency like bird. called tweeter&lt;/li&gt;
&lt;li&gt;together, many drivers cover all frequency – this why grug speaker have 2 or 3 drivers&lt;/li&gt;
&lt;li&gt;very hard make drivers not overlap so one frequency band too loud. grug spend many moons study cross-over circuit&lt;/li&gt;
&lt;li&gt;young grug hear up to 20kHz&lt;/li&gt;
&lt;li&gt;old grug only hear up to 16kHz&lt;/li&gt;
&lt;li&gt;most speakers have ~50Hz–18kHz response&lt;/li&gt;
&lt;li&gt;if speaker only go down to 70Hz, young grug need subwoofer to make cave thunder like herd of bison&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dispersion angle&lt;/strong&gt; mean how wide speaker throw sound in cave so grug buy big or small couch&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;amplifier&quot;&gt;Amplifier&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;power rating&lt;/strong&gt; mean how much power amp send to speaker
&lt;ul&gt;
&lt;li&gt;rule of thumb: grug want amp twice as strong as speaker so amp can relax like sloth, not work hard like grug father in mines&lt;/li&gt;
&lt;li&gt;power output depend on speaker impedance&lt;/li&gt;
&lt;li&gt;amp make peak power for short burst&lt;/li&gt;
&lt;li&gt;amp make less power continuous&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;number of channels&lt;/strong&gt; mean how many speaker young grug buy
&lt;ul&gt;
&lt;li&gt;stereo mean two channels, so two speakers&lt;/li&gt;
&lt;li&gt;5.1 surround sound mean 5 speakers, 1 subwoofer&lt;/li&gt;
&lt;li&gt;surround sound only good when grug wife watch movie. more speakers make more echo in cave&lt;/li&gt;
&lt;li&gt;grug think better spend wolf skins on fewer, better speaker&lt;/li&gt;
&lt;li&gt;2x40W means amp has two channels and send 40W power to each speaker&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SINAD&lt;/strong&gt; mean signal-to-noise and distortion ratio, measured in dB
&lt;ul&gt;
&lt;li&gt;high SINAD means less noise, grug like high SINAD&lt;/li&gt;
&lt;li&gt;good budget amp like &lt;a href=&quot;https://web.archive.org/web/20241125143538/https://faithacoustics.com/products/fosi-audio-v3-amplifier-48v&quot; class=&quot;ext&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Fosi Audio V3&lt;/a&gt; has 88dB SINAD&lt;/li&gt;
&lt;li&gt;very good amp has ~100dB SINAD, but more expensive than grug wife&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;THD&lt;/strong&gt; mean total harmonic distortion. it measure distortion
&lt;ul&gt;
&lt;li&gt;more distortion bad. grug hate distortion&lt;/li&gt;
&lt;li&gt;0.003% THD good&lt;/li&gt;
&lt;li&gt;0.0001% THD very good&lt;/li&gt;
&lt;li&gt;1% THD bad&lt;/li&gt;
&lt;li&gt;5% THD unbearable&lt;/li&gt;
&lt;li&gt;distortion always go up with loudness&lt;/li&gt;
&lt;li&gt;max amp power rating usually reported at 1% THD&lt;/li&gt;
&lt;li&gt;when amp work hard, more distortion – this why grug want amp to relax like brontosaurus&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;THD+N&lt;/strong&gt; mean &lt;em&gt;total harmonic distortion + noise&lt;/em&gt;, same as THD but include noise in measurement&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;dac&quot;&gt;DAC&lt;/h2&gt;
&lt;p&gt;young grug stream digital music from internet. DAC convert digital signal to analog signal so amp can make loud. DAC stand for &lt;em&gt;digital-to-analog converter&lt;/em&gt;. also known as sound interface&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;SINAD&lt;/strong&gt; mean &lt;em&gt;signal-to-noise and distortion ratio&lt;/em&gt;, measured in dB
&lt;ul&gt;
&lt;li&gt;good DAC has 116dB SINAD&lt;/li&gt;
&lt;li&gt;bad DAC has ~88dB SINAD&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;THD+N&lt;/strong&gt; mean total harmonic distortion + noise, same as THD but include noise in measurement
&lt;ul&gt;
&lt;li&gt;0.000146% THD+N good for DAC&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dynamic range&lt;/strong&gt; too complicated for old grug to explain after drink many icewine over years on plains
&lt;ul&gt;
&lt;li&gt;19-22 bits dynamic range good&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;streamer&quot;&gt;Streamer&lt;/h2&gt;
&lt;p&gt;many young grug use bluetooth on phone for send sound to amp. this drain young grug phone battery and when grug walk outside to turn t-rex burger, sound stop. bluetooth has noise. better use WiFi streamer like old grug&lt;/p&gt;
&lt;p&gt;streamer download music from young grug WiFi and send digital signal to DAC. streamer have remote and apply EQ&lt;/p&gt;
&lt;p&gt;best streamer for grug made by &lt;a href=&quot;https://www.wiimhome.com/&quot; class=&quot;ext&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;WiiM&lt;/a&gt;, but big brain grug short on wolf skin can try Raspberry Pi + VolumeIO if grug like hunting without eating for week&lt;/p&gt;
&lt;p&gt;young grug consider aspects in streamer:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;supported streaming services&lt;/strong&gt; for young grug:
&lt;ul&gt;
&lt;li&gt;Spotify&lt;/li&gt;
&lt;li&gt;TIDAL&lt;/li&gt;
&lt;li&gt;Apple Music&lt;/li&gt;
&lt;li&gt;Roon&lt;/li&gt;
&lt;li&gt;etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;built-in DAC in streamer&lt;/strong&gt; usually not very good:
&lt;ul&gt;
&lt;li&gt;WiiM Mini cheap but need good external DAC, no include remote&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://web.archive.org/web/20250714021200/https://faithacoustics.com/products/wiim-pro-streamer&quot; class=&quot;ext&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;WiiM Pro&lt;/a&gt; streamer good, but need external DAC like &lt;a href=&quot;https://web.archive.org/web/20241213072220/https://faithacoustics.com/products/smsl-su1-ak4493s-digital-to-analog-converter-dac&quot; class=&quot;ext&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;S.M.S.L SU-1&lt;/a&gt;, no include remote&lt;/li&gt;
&lt;li&gt;WiiM Pro Plus good, DAC good – almost as good as SU-1, come with remote&lt;/li&gt;
&lt;li&gt;WiiM Ultra has good DAC and screen, but cost many wolf skin so only for rich old grug, come with remote&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;gain control w/remote&lt;/strong&gt; so grug can sit on couch reduce volume when grug neighbour complain&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;equalizer (EQ)&lt;/strong&gt; make frequency flat like grug forehead
&lt;ul&gt;
&lt;li&gt;grug wife happy when cave not boomy&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;room modelling&lt;/strong&gt; sense echoes in cave with phone, apply auto-EQ
&lt;ul&gt;
&lt;li&gt;room modelling aggressive like badger, but useful for find resonant frequency&lt;/li&gt;
&lt;li&gt;WiiM Pro, WiiM Pro Plus &amp;amp; WiiM Ultra have room modelling&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AirPlay&lt;/strong&gt; useful for magic fruit shaman – many device one ecosystem&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bluetooth&lt;/strong&gt; convenient but never good, old grug avoid&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;old grug recommend &lt;a href=&quot;https://web.archive.org/web/20250714021200/https://faithacoustics.com/products/wiim-pro-streamer&quot; class=&quot;ext&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;WiiM Pro streamer&lt;/a&gt; with &lt;a href=&quot;https://web.archive.org/web/20241213072220/https://faithacoustics.com/products/smsl-su1-ak4493s-digital-to-analog-converter-dac&quot; class=&quot;ext&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;S.M.S.L SU-1 DAC&lt;/a&gt;&lt;br&gt;
but if young grug only buy one device for small cave, get WiiM Pro Plus with good built-in DAC&lt;/p&gt;
&lt;h2 id=&quot;system-recommendation&quot;&gt;System Recommendation&lt;/h2&gt;
&lt;p&gt;old grug recommend best budget audiophile system in December 2024:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://web.archive.org/web/20250714021200/https://faithacoustics.com/products/wiim-pro-streamer&quot; class=&quot;ext&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;WiiM Pro streamer&lt;/a&gt; @ R3,600&lt;/li&gt;
&lt;li&gt;WiiM Remote @ R500&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://web.archive.org/web/20241213072220/https://faithacoustics.com/products/smsl-su1-ak4493s-digital-to-analog-converter-dac&quot; class=&quot;ext&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;S.M.S.L SU-1 DAC&lt;/a&gt; @ R2,195&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://web.archive.org/web/20241125143538/https://faithacoustics.com/products/fosi-audio-v3-amplifier-48v&quot; class=&quot;ext&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Fosi Audio V3 (48V)&lt;/a&gt; @ R3,195&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Total cost: R9,490.00 wolf skins.&lt;/p&gt;
&lt;p&gt;grug even give discount for broke young grug if spend many wolf skins&lt;/p&gt;
&lt;p&gt;old grug recommend young grug buy used luxury speaker. speaker market like lemons market, good value used.&lt;/p&gt;
&lt;p&gt;if young grug good hunter, old grug like KEF LS50 Meta speakers cost many wolf skins&lt;br&gt;
old grug also like B&amp;amp;W 606 and 607 speakers&lt;/p&gt;
&lt;h2 id=&quot;amplify-early&quot;&gt;Amplify Early&lt;/h2&gt;
&lt;p&gt;grug know one thing true: every part of signal chain add noise&lt;br&gt;
every part that amplify, also amplify noise&lt;/p&gt;
&lt;p&gt;now grug remember: which part amplify?&lt;br&gt;
amp and preamp in DAC both amplify&lt;/p&gt;
&lt;p&gt;grug now test young grug brain:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;should young grug set volume low on streamer and volume high on amp?&lt;/li&gt;
&lt;li&gt;or should young grug set volume high on streamer, low on amp?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;old grug learn to amplify early: set streamer high, amp low&lt;br&gt;
why? when grug amplify late, grug amplify noise most&lt;/p&gt;
&lt;p&gt;consider: when signal quiet, amp loud, amplify hiss – many noise&lt;/p&gt;
&lt;p&gt;this why better amplify early, add less noise so amp not work hard, amp relax like sloth on warm day&lt;/p&gt;
&lt;p&gt;this learn also apply bluetooth speaker: young grug better off set phone volume high, speaker volume low, so amp relax&lt;/p&gt;
&lt;p&gt;young grug wise now. if young grug smile, grug &lt;a href=&quot;https://web.archive.org/web/20241214000503/https://faithacoustics.com/&quot; title=&quot;Faith Acoustics (greg business)&quot; class=&quot;ext&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;trade wolf skins&lt;/a&gt; for hi-fi cave. may make grug wife sad, but make grug very happy&lt;/p&gt;
</content:encoded></item><item><title>Budget</title><link>https://petrustheron.com/posts/budget</link><guid isPermaLink="true">https://petrustheron.com/posts/budget</guid><pubDate>Sat, 19 Mar 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Imagine an entrepreneur who is blind to their income and expenses and rapidly spending money that isn&apos;t theirs. Sounds familiar? Welcome to BigCo. BigCo is run like a government and ships with all the inefficiencies[1] you expect from a government.&lt;/p&gt;
&lt;p&gt;What did AWS get right that BigCo is getting so wrong? It&apos;s not agile, microservices, APIs, JIRA or bald guys. What let AWS win as a platform is &lt;strong&gt;closed-loop budgeting&lt;/strong&gt;. By pricing API calls, cost centers turn into profit centers.&lt;/p&gt;
&lt;p&gt;The way to solve out-of-control spending is by doing &lt;strong&gt;bottom-up cost accounting&lt;/strong&gt;. When you create a free, transparent (cost-wise) internal market, every Team &lt;em&gt;becomes&lt;/em&gt; The Merchant and is forced to Care.&lt;/p&gt;
&lt;h2 id=&quot;how-to-fix-problems-in-a-free-internal-market&quot;&gt;How to Fix Problems in a Free Internal Market:&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Give a team (or multiple teams) a budget based on the goal and size of the opportunity.
&lt;ol&gt;
&lt;li&gt;We can call this budget &apos;the capital&apos;, funding or investment, but I like budget because it forces us to think about costs.&lt;/li&gt;
&lt;li&gt;A good budget is an accurate budget.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Let the team spend their budget however they want to build The Amazing Service™️ that will &lt;strong&gt;charge for API calls&lt;/strong&gt;, billed to internal &lt;em&gt;and/or&lt;/em&gt; external consumers. Here&apos;s the trick:
&lt;ol&gt;
&lt;li&gt;Every SaaS expense counts toward the team&apos;s budget. This must appear in project P&amp;amp;L statement.&lt;/li&gt;
&lt;li&gt;Every cost-to-company salary of every hire on the team counts toward the team&apos;s budget. Uncomfortable talking about costs? You are either overpaid or not an entrepreneur.&lt;/li&gt;
&lt;li&gt;When the budget runs out, the project is objectively cancelled (not on a whim).&lt;/li&gt;
&lt;li&gt;Engineers from failed projects go back on the bench where they can join other projects. If people stay on the bench for too long, they are in trouble because it means no team wants them - overhiring problem solved.&lt;/li&gt;
&lt;li&gt;The company may choose to subsidise limited time on the bench during orientation / team-project search.&lt;/li&gt;
&lt;li&gt;Don&apos;t bail out failed projects; projects are free to raise more capital.&lt;/li&gt;
&lt;li&gt;This has the nice side-effect of making all hires responsible for cost control, burn-rate and understanding the runway of the project. It forces them to &lt;em&gt;Care&lt;/em&gt;. Bottom-up cost control emerges!&lt;/li&gt;
&lt;li&gt;Reward leaders handsomely by tying their bonus to API profits.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Let internal teams and companies choose the best services to solve their long-term problems &lt;em&gt;within budget&lt;/em&gt;, one of which may be The Amazing Service™️.&lt;/li&gt;
&lt;li&gt;If it is cheaper in the long-run for a team to to roll-their-own or use an external service, it means that The Amazing Service™️ has failed and will run out of money; disaster averted.&lt;/li&gt;
&lt;li&gt;Whatever you do, DO NOT mandate the use of the internal or external products because it obliterates the market system and immediately inflates costs. When this happens, expect to see lobbying, lots of project restarts, hidden costs, overhiring and people frequently moving between teams. Basically, government.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;So start with a budget. Account for all costs[2]. Costs flow up, not down. Charge for API calls (internal &amp;amp; external). Publish project-level P&amp;amp;L. Do not mandate products, services or technology.&lt;/p&gt;
&lt;p&gt;[1]: : runaway spending, countless surveys, hidden costs, a stream of failed projects, unfettered hiring, internal lobbying and meetings about meetings, architecture astronauts, long lists of values that nobody voted for, OKRs, etc. [2]: Beware of strong incentives to hide costs, especially past failures.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://petrustheron.com/admin&quot;&gt;Sign in&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;© 2012-2020 by Petrus Theron&lt;/p&gt;
</content:encoded></item><item><title>Making Incisions in Clojure</title><link>https://petrustheron.com/posts/2017-06-04-making-incisions-in-clojure</link><guid isPermaLink="true">https://petrustheron.com/posts/2017-06-04-making-incisions-in-clojure</guid><pubDate>Sun, 04 Jun 2017 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;It&apos;s common to make deep incisions in a collection of nested data while retaining the shape of the data,
often to service a longer data transformation pipeline.&lt;/p&gt;
&lt;p&gt;Let&apos;s say we want to adjust every employee&apos;s salary to compensate for inflation by 5%:&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code class=&quot;language-clojure&quot;&gt;&lt;span class=&quot;c-p0&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c-sp&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;c-sym&quot;&gt;employees&lt;/span&gt; &lt;span class=&quot;c-p1&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;c-p2&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;c-kw&quot;&gt;:name&lt;/span&gt; &lt;span class=&quot;c-str&quot;&gt;&amp;quot;Alice&amp;quot;&lt;/span&gt; &lt;span class=&quot;c-kw&quot;&gt;:salary&lt;/span&gt; &lt;span class=&quot;c-num&quot;&gt;5000&lt;/span&gt; &lt;span class=&quot;c-kw&quot;&gt;:bonus&lt;/span&gt; &lt;span class=&quot;c-num&quot;&gt;500&lt;/span&gt;&lt;span class=&quot;c-p2&quot;&gt;}&lt;/span&gt;
                &lt;span class=&quot;c-p2&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;c-kw&quot;&gt;:name&lt;/span&gt; &lt;span class=&quot;c-str&quot;&gt;&amp;quot;Bob&amp;quot;&lt;/span&gt;   &lt;span class=&quot;c-kw&quot;&gt;:salary&lt;/span&gt; &lt;span class=&quot;c-num&quot;&gt;4000&lt;/span&gt; &lt;span class=&quot;c-kw&quot;&gt;:bonus&lt;/span&gt; &lt;span class=&quot;c-num&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;c-p2&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;c-p1&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;c-p0&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We can write a simple function, &lt;code&gt;give-raise&lt;/code&gt; that adds inflation:&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code class=&quot;language-clojure&quot;&gt;&lt;span class=&quot;c-p0&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c-sp&quot;&gt;defn&lt;/span&gt; &lt;span class=&quot;c-sym&quot;&gt;give-raise&lt;/span&gt; &lt;span class=&quot;c-p1&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;c-sym&quot;&gt;salary&lt;/span&gt; &lt;span class=&quot;c-sym&quot;&gt;inflation&lt;/span&gt;&lt;span class=&quot;c-p1&quot;&gt;]&lt;/span&gt;
  &lt;span class=&quot;c-p1&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c-sym&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;c-sym&quot;&gt;salary&lt;/span&gt; &lt;span class=&quot;c-p2&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c-sym&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;c-num&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;c-sym&quot;&gt;inflation&lt;/span&gt;&lt;span class=&quot;c-p2&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;c-p1&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;c-p0&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;c-p0&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c-sym&quot;&gt;give-raise&lt;/span&gt; &lt;span class=&quot;c-num&quot;&gt;1500&lt;/span&gt; &lt;span class=&quot;c-num&quot;&gt;0.05M&lt;/span&gt;&lt;span class=&quot;c-p0&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;c-sym&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;c-num&quot;&gt;1575.0M&lt;/span&gt;

&lt;span class=&quot;c-p0&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c-sym&quot;&gt;map&lt;/span&gt; &lt;span class=&quot;c-sym&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;c-p1&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c-sym&quot;&gt;give-raise&lt;/span&gt; &lt;span class=&quot;c-sym&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;c-num&quot;&gt;0.05M&lt;/span&gt;&lt;span class=&quot;c-p1&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;c-p1&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c-sym&quot;&gt;map&lt;/span&gt; &lt;span class=&quot;c-kw&quot;&gt;:salary&lt;/span&gt; &lt;span class=&quot;c-sym&quot;&gt;employees&lt;/span&gt;&lt;span class=&quot;c-p1&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;c-p0&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;c-sym&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;c-p0&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c-num&quot;&gt;5250.00M&lt;/span&gt; &lt;span class=&quot;c-num&quot;&gt;4200.00M&lt;/span&gt;&lt;span class=&quot;c-p0&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;How do we apply this function inside the nested structure under the &lt;code&gt;:salary&lt;/code&gt; key? We can use &lt;code&gt;update-in&lt;/code&gt; for this:&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code class=&quot;language-clojure&quot;&gt;&lt;span class=&quot;c-p0&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c-sym&quot;&gt;map&lt;/span&gt; &lt;span class=&quot;c-sym&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;c-p1&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c-sym&quot;&gt;update&lt;/span&gt; &lt;span class=&quot;c-sym&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;c-kw&quot;&gt;:salary&lt;/span&gt; &lt;span class=&quot;c-sym&quot;&gt;give-raise&lt;/span&gt; &lt;span class=&quot;c-num&quot;&gt;0.05M&lt;/span&gt;&lt;span class=&quot;c-p1&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;c-sym&quot;&gt;employees&lt;/span&gt;&lt;span class=&quot;c-p0&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;c-sym&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;c-p0&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c-p1&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;c-kw&quot;&gt;:name&lt;/span&gt; &lt;span class=&quot;c-str&quot;&gt;&amp;quot;Alice&amp;quot;&lt;/span&gt;, &lt;span class=&quot;c-kw&quot;&gt;:salary&lt;/span&gt; &lt;span class=&quot;c-num&quot;&gt;5250.00M&lt;/span&gt;, &lt;span class=&quot;c-kw&quot;&gt;:bonus&lt;/span&gt; &lt;span class=&quot;c-num&quot;&gt;500&lt;/span&gt;&lt;span class=&quot;c-p1&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;c-p1&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;c-kw&quot;&gt;:name&lt;/span&gt; &lt;span class=&quot;c-str&quot;&gt;&amp;quot;Bob&amp;quot;&lt;/span&gt;, &lt;span class=&quot;c-kw&quot;&gt;:salary&lt;/span&gt; &lt;span class=&quot;c-num&quot;&gt;4200.00M&lt;/span&gt;, &lt;span class=&quot;c-kw&quot;&gt;:bonus&lt;/span&gt; &lt;span class=&quot;c-num&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;c-p1&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;c-p0&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That works, but let&apos;s add some sugar to make it more readable:&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code class=&quot;language-clojure&quot;&gt;&lt;span class=&quot;c-p0&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c-sp&quot;&gt;defn&lt;/span&gt; &lt;span class=&quot;c-sym&quot;&gt;focus&lt;/span&gt; &lt;span class=&quot;c-p1&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;c-sym&quot;&gt;f&lt;/span&gt; &lt;span class=&quot;c-sym&quot;&gt;ks&lt;/span&gt; &lt;span class=&quot;c-sym&quot;&gt;&amp;amp;&lt;/span&gt; &lt;span class=&quot;c-sym&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;c-p1&quot;&gt;]&lt;/span&gt;
  &lt;span class=&quot;c-p1&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c-sp&quot;&gt;fn&lt;/span&gt; &lt;span class=&quot;c-p2&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;c-sym&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;c-p2&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;c-p2&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c-sym&quot;&gt;apply&lt;/span&gt; &lt;span class=&quot;c-sym&quot;&gt;update-in&lt;/span&gt; &lt;span class=&quot;c-sym&quot;&gt;m&lt;/span&gt; &lt;span class=&quot;c-sym&quot;&gt;ks&lt;/span&gt; &lt;span class=&quot;c-sym&quot;&gt;f&lt;/span&gt; &lt;span class=&quot;c-sym&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;c-p2&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;c-p1&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;c-p0&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now we can transform the &lt;code&gt;give-raise&lt;/code&gt; function to act like a &quot;lens&quot; into our map:&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code class=&quot;language-clojure&quot;&gt;&lt;span class=&quot;c-p0&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c-sp&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;c-sym&quot;&gt;focused-raise&lt;/span&gt; &lt;span class=&quot;c-p1&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c-sym&quot;&gt;focus&lt;/span&gt; &lt;span class=&quot;c-sym&quot;&gt;give-raise&lt;/span&gt; &lt;span class=&quot;c-p2&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;c-kw&quot;&gt;:salary&lt;/span&gt;&lt;span class=&quot;c-p2&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;c-num&quot;&gt;0.05M&lt;/span&gt;&lt;span class=&quot;c-p1&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;c-p0&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;c-p0&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c-sym&quot;&gt;map&lt;/span&gt; &lt;span class=&quot;c-sym&quot;&gt;focused-raise&lt;/span&gt; &lt;span class=&quot;c-sym&quot;&gt;employees&lt;/span&gt;&lt;span class=&quot;c-p0&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;c-sym&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;c-p0&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c-p1&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;c-kw&quot;&gt;:name&lt;/span&gt; &lt;span class=&quot;c-str&quot;&gt;&amp;quot;Alice&amp;quot;&lt;/span&gt;, &lt;span class=&quot;c-kw&quot;&gt;:salary&lt;/span&gt; &lt;span class=&quot;c-num&quot;&gt;5250.00M&lt;/span&gt;, &lt;span class=&quot;c-kw&quot;&gt;:bonus&lt;/span&gt; &lt;span class=&quot;c-num&quot;&gt;500&lt;/span&gt;&lt;span class=&quot;c-p1&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;c-p1&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;c-kw&quot;&gt;:name&lt;/span&gt; &lt;span class=&quot;c-str&quot;&gt;&amp;quot;Bob&amp;quot;&lt;/span&gt;, &lt;span class=&quot;c-kw&quot;&gt;:salary&lt;/span&gt; &lt;span class=&quot;c-num&quot;&gt;4200.00M&lt;/span&gt;, &lt;span class=&quot;c-kw&quot;&gt;:bonus&lt;/span&gt; &lt;span class=&quot;c-num&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;c-p1&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;c-p0&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Neat. This is functionally equivalent to the call above to &lt;code&gt;update&lt;/code&gt;.
But it has a major advantage: focused functions are composable.&lt;/p&gt;
&lt;p&gt;While we&apos;re doling out money, let&apos;s increase everyone&apos;s bonus by $100:&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code class=&quot;language-clojure&quot;&gt;&lt;span class=&quot;c-p0&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c-sym&quot;&gt;map&lt;/span&gt; &lt;span class=&quot;c-p1&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c-sym&quot;&gt;focus&lt;/span&gt; &lt;span class=&quot;c-sym&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;c-p2&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;c-kw&quot;&gt;:bonus&lt;/span&gt;&lt;span class=&quot;c-p2&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;c-num&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;c-p1&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;c-sym&quot;&gt;employees&lt;/span&gt;&lt;span class=&quot;c-p0&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;c-sym&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;c-p0&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c-p1&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;c-kw&quot;&gt;:name&lt;/span&gt; &lt;span class=&quot;c-str&quot;&gt;&amp;quot;Alice&amp;quot;&lt;/span&gt;, &lt;span class=&quot;c-kw&quot;&gt;:salary&lt;/span&gt; &lt;span class=&quot;c-num&quot;&gt;5000&lt;/span&gt;, &lt;span class=&quot;c-kw&quot;&gt;:bonus&lt;/span&gt; &lt;span class=&quot;c-num&quot;&gt;600&lt;/span&gt;&lt;span class=&quot;c-p1&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;c-p1&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;c-kw&quot;&gt;:name&lt;/span&gt; &lt;span class=&quot;c-str&quot;&gt;&amp;quot;Bob&amp;quot;&lt;/span&gt;, &lt;span class=&quot;c-kw&quot;&gt;:salary&lt;/span&gt; &lt;span class=&quot;c-num&quot;&gt;4000&lt;/span&gt;, &lt;span class=&quot;c-kw&quot;&gt;:bonus&lt;/span&gt; &lt;span class=&quot;c-num&quot;&gt;200&lt;/span&gt;&lt;span class=&quot;c-p1&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;c-p0&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Don&apos;t forget about the salaries! How do we combine these changes?&lt;/p&gt;
&lt;p&gt;We can use &lt;code&gt;assoc&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code class=&quot;language-clojure&quot;&gt;&lt;span class=&quot;c-p0&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c-sp&quot;&gt;defn&lt;/span&gt; &lt;span class=&quot;c-sym&quot;&gt;review-&lt;/span&gt;

  &lt;span class=&quot;c-p1&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c-sym&quot;&gt;map&lt;/span&gt; &lt;span class=&quot;c-p2&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c-sp&quot;&gt;fn&lt;/span&gt; &lt;span class=&quot;c-p0&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;c-sym&quot;&gt;employee&lt;/span&gt;&lt;span class=&quot;c-p0&quot;&gt;]&lt;/span&gt;
         &lt;span class=&quot;c-p0&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c-sym&quot;&gt;assoc&lt;/span&gt; &lt;span class=&quot;c-sym&quot;&gt;employee&lt;/span&gt;
           &lt;span class=&quot;c-kw&quot;&gt;:salary&lt;/span&gt; &lt;span class=&quot;c-p1&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c-sym&quot;&gt;give-raise&lt;/span&gt; &lt;span class=&quot;c-p2&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c-kw&quot;&gt;:salary&lt;/span&gt; &lt;span class=&quot;c-sym&quot;&gt;employee&lt;/span&gt;&lt;span class=&quot;c-p2&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;c-num&quot;&gt;0.05M&lt;/span&gt;&lt;span class=&quot;c-p1&quot;&gt;)&lt;/span&gt;
           &lt;span class=&quot;c-kw&quot;&gt;:bonus&lt;/span&gt;  &lt;span class=&quot;c-p1&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c-sym&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;c-p2&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c-kw&quot;&gt;:bonus&lt;/span&gt; &lt;span class=&quot;c-sym&quot;&gt;employee&lt;/span&gt;&lt;span class=&quot;c-p2&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;c-num&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;c-p1&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;c-p0&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;c-p2&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;c-sym&quot;&gt;employees&lt;/span&gt;&lt;span class=&quot;c-p1&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Or use two &lt;code&gt;update-in&lt;/code&gt; calls:&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code class=&quot;language-clojure&quot;&gt;&lt;span class=&quot;c-p0&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c-sym&quot;&gt;map&lt;/span&gt; &lt;span class=&quot;c-p1&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c-sp&quot;&gt;fn&lt;/span&gt; &lt;span class=&quot;c-p2&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;c-sym&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;c-p2&quot;&gt;]&lt;/span&gt;
       &lt;span class=&quot;c-p2&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c-sp&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;c-sym&quot;&gt;m&lt;/span&gt;
           &lt;span class=&quot;c-p0&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c-sym&quot;&gt;update-in&lt;/span&gt; &lt;span class=&quot;c-p1&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;c-kw&quot;&gt;:salary&lt;/span&gt;&lt;span class=&quot;c-p1&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;c-sym&quot;&gt;give-raise&lt;/span&gt; &lt;span class=&quot;c-num&quot;&gt;0.05M&lt;/span&gt;&lt;span class=&quot;c-p0&quot;&gt;)&lt;/span&gt;
           &lt;span class=&quot;c-p0&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c-sym&quot;&gt;update-in&lt;/span&gt; &lt;span class=&quot;c-p1&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;c-kw&quot;&gt;:bonus&lt;/span&gt;&lt;span class=&quot;c-p1&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;c-sym&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;c-num&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;c-p0&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;c-p2&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;c-p1&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;c-sym&quot;&gt;employees&lt;/span&gt;&lt;span class=&quot;c-p0&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Hmm. We seem to spend a lot of time packing and repacking our data to make simple changes. At least it&apos;s all in one place.&lt;/p&gt;
&lt;p&gt;Is there a better way? Why, yes. We can compose &lt;code&gt;give-raise&lt;/code&gt; and &lt;code&gt;+&lt;/code&gt; into a single transformation:&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code class=&quot;language-clojure&quot;&gt;&lt;span class=&quot;c-p0&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c-sp&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;c-sym&quot;&gt;transform&lt;/span&gt; &lt;span class=&quot;c-p1&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c-sym&quot;&gt;comp&lt;/span&gt; &lt;span class=&quot;c-p2&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c-sym&quot;&gt;focus&lt;/span&gt; &lt;span class=&quot;c-sym&quot;&gt;give-raise&lt;/span&gt; &lt;span class=&quot;c-p0&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;c-kw&quot;&gt;:salary&lt;/span&gt;&lt;span class=&quot;c-p0&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;c-num&quot;&gt;0.05M&lt;/span&gt;&lt;span class=&quot;c-p2&quot;&gt;)&lt;/span&gt;
                     &lt;span class=&quot;c-p2&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c-sym&quot;&gt;focus&lt;/span&gt; &lt;span class=&quot;c-sym&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;c-p0&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;c-kw&quot;&gt;:bonus&lt;/span&gt;&lt;span class=&quot;c-p0&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;c-num&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;c-p2&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;c-p1&quot;&gt;)&lt;/span&gt;

  &lt;span class=&quot;c-p1&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c-sym&quot;&gt;map&lt;/span&gt; &lt;span class=&quot;c-sym&quot;&gt;transform&lt;/span&gt; &lt;span class=&quot;c-sym&quot;&gt;employees&lt;/span&gt;&lt;span class=&quot;c-p1&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;c-sym&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;c-p1&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c-p2&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;c-kw&quot;&gt;:name&lt;/span&gt; &lt;span class=&quot;c-str&quot;&gt;&amp;quot;Alice&amp;quot;&lt;/span&gt;, &lt;span class=&quot;c-kw&quot;&gt;:salary&lt;/span&gt; &lt;span class=&quot;c-num&quot;&gt;5250.00M&lt;/span&gt;, &lt;span class=&quot;c-kw&quot;&gt;:bonus&lt;/span&gt; &lt;span class=&quot;c-num&quot;&gt;600&lt;/span&gt;&lt;span class=&quot;c-p2&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;c-p2&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;c-kw&quot;&gt;:name&lt;/span&gt; &lt;span class=&quot;c-str&quot;&gt;&amp;quot;Bob&amp;quot;&lt;/span&gt;, &lt;span class=&quot;c-kw&quot;&gt;:salary&lt;/span&gt; &lt;span class=&quot;c-num&quot;&gt;4200.00M&lt;/span&gt;, &lt;span class=&quot;c-kw&quot;&gt;:bonus&lt;/span&gt; &lt;span class=&quot;c-num&quot;&gt;200&lt;/span&gt;&lt;span class=&quot;c-p2&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;c-p1&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The advantage here is that no one piece of our composition has any knowledge of the shape of the data.
This may not seem like a big advantage, but what if every employee record is wrapped in some other key like &lt;code&gt;:deep&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code class=&quot;language-clojure&quot;&gt;&lt;span class=&quot;c-p0&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c-sp&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;c-sym&quot;&gt;deep-employees&lt;/span&gt;
  &lt;span class=&quot;c-p1&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;c-p2&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;c-kw&quot;&gt;:deep&lt;/span&gt; &lt;span class=&quot;c-p0&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;c-kw&quot;&gt;:name&lt;/span&gt; &lt;span class=&quot;c-str&quot;&gt;&amp;quot;Alice&amp;quot;&lt;/span&gt; &lt;span class=&quot;c-kw&quot;&gt;:salary&lt;/span&gt; &lt;span class=&quot;c-num&quot;&gt;5000&lt;/span&gt; &lt;span class=&quot;c-kw&quot;&gt;:bonus&lt;/span&gt; &lt;span class=&quot;c-num&quot;&gt;500&lt;/span&gt;&lt;span class=&quot;c-p0&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;c-p2&quot;&gt;}&lt;/span&gt;
   &lt;span class=&quot;c-p2&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;c-kw&quot;&gt;:deep&lt;/span&gt; &lt;span class=&quot;c-p0&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;c-kw&quot;&gt;:name&lt;/span&gt; &lt;span class=&quot;c-str&quot;&gt;&amp;quot;Bob&amp;quot;&lt;/span&gt; &lt;span class=&quot;c-kw&quot;&gt;:salary&lt;/span&gt; &lt;span class=&quot;c-num&quot;&gt;4000&lt;/span&gt; &lt;span class=&quot;c-kw&quot;&gt;:bonus&lt;/span&gt; &lt;span class=&quot;c-num&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;c-p0&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;c-p2&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;c-p1&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;c-p0&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We could easily pull out these records with &lt;code&gt;(map :deep deep-employees)&lt;/code&gt;, but then we have to repackage them later.
Is it possible to apply the same transformation to the nested structure without changing our code?&lt;/p&gt;
&lt;p&gt;Lets refocus our focus. We add another focus to our initial transformation:&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code class=&quot;language-clojure&quot;&gt;&lt;span class=&quot;c-p0&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c-sym&quot;&gt;map&lt;/span&gt; &lt;span class=&quot;c-p1&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c-sym&quot;&gt;focus&lt;/span&gt; &lt;span class=&quot;c-sym&quot;&gt;transform&lt;/span&gt; &lt;span class=&quot;c-p2&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;c-kw&quot;&gt;:deep&lt;/span&gt;&lt;span class=&quot;c-p2&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;c-p1&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;c-sym&quot;&gt;deep-employees&lt;/span&gt;&lt;span class=&quot;c-p0&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;c-sym&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;c-p0&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c-p1&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;c-kw&quot;&gt;:deep&lt;/span&gt; &lt;span class=&quot;c-p2&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;c-kw&quot;&gt;:name&lt;/span&gt; &lt;span class=&quot;c-str&quot;&gt;&amp;quot;Alice&amp;quot;&lt;/span&gt;, &lt;span class=&quot;c-kw&quot;&gt;:salary&lt;/span&gt; &lt;span class=&quot;c-num&quot;&gt;5250.00M&lt;/span&gt;, &lt;span class=&quot;c-kw&quot;&gt;:bonus&lt;/span&gt; &lt;span class=&quot;c-num&quot;&gt;600&lt;/span&gt;&lt;span class=&quot;c-p2&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;c-p1&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;c-p1&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;c-kw&quot;&gt;:deep&lt;/span&gt; &lt;span class=&quot;c-p2&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;c-kw&quot;&gt;:name&lt;/span&gt; &lt;span class=&quot;c-str&quot;&gt;&amp;quot;Bob&amp;quot;&lt;/span&gt;, &lt;span class=&quot;c-kw&quot;&gt;:salary&lt;/span&gt; &lt;span class=&quot;c-num&quot;&gt;4200.00M&lt;/span&gt;, &lt;span class=&quot;c-kw&quot;&gt;:bonus&lt;/span&gt; &lt;span class=&quot;c-num&quot;&gt;200&lt;/span&gt;&lt;span class=&quot;c-p2&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;c-p1&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;c-p0&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;By composing focuses, we have sucessfully decoupled the shape of our data from the mechaism of transformation. As a result, our code is more terse and reusable.&lt;/p&gt;
&lt;p&gt;In Haskell, focuses are first-class concepts that subsume getters and setters in object-oriented programming languages.&lt;/p&gt;
&lt;p&gt;This is the power of functional programming.&lt;/p&gt;
</content:encoded></item><item><title>Quicksort in Clojure</title><link>https://petrustheron.com/posts/clojure-quicksort</link><guid isPermaLink="true">https://petrustheron.com/posts/clojure-quicksort</guid><pubDate>Tue, 14 Feb 2017 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;em&gt;(This was a Valentine&apos;s Day post.)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Who can understand the Order of Love? Let&apos;s find out with a Quicksort implementation in Clojure:&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code class=&quot;language-clojure&quot;&gt;&lt;span class=&quot;c-p0&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c-sp&quot;&gt;defn&lt;/span&gt; &lt;span class=&quot;c-sym&quot;&gt;quicksort&lt;/span&gt; &lt;span class=&quot;c-p1&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;c-sym&quot;&gt;coll&lt;/span&gt;&lt;span class=&quot;c-p1&quot;&gt;]&lt;/span&gt;
  &lt;span class=&quot;c-p1&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c-sp&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;c-p2&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c-sym&quot;&gt;seq&lt;/span&gt; &lt;span class=&quot;c-sym&quot;&gt;coll&lt;/span&gt;&lt;span class=&quot;c-p2&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;c-p2&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c-sp&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;c-p0&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;c-sym&quot;&gt;pivot&lt;/span&gt;   &lt;span class=&quot;c-p1&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c-sym&quot;&gt;rand-nth&lt;/span&gt; &lt;span class=&quot;c-sym&quot;&gt;coll&lt;/span&gt;&lt;span class=&quot;c-p1&quot;&gt;)&lt;/span&gt;
          &lt;span class=&quot;c-sym&quot;&gt;pivots&lt;/span&gt;  &lt;span class=&quot;c-p1&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c-sym&quot;&gt;filter&lt;/span&gt; &lt;span class=&quot;c-sym&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;c-p2&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c-sym&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;c-sym&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;c-sym&quot;&gt;pivot&lt;/span&gt;&lt;span class=&quot;c-p2&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;c-sym&quot;&gt;coll&lt;/span&gt;&lt;span class=&quot;c-p1&quot;&gt;)&lt;/span&gt;
          &lt;span class=&quot;c-sym&quot;&gt;less&lt;/span&gt;    &lt;span class=&quot;c-p1&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c-sym&quot;&gt;filter&lt;/span&gt; &lt;span class=&quot;c-sym&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;c-p2&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c-sym&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;c-sym&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;c-sym&quot;&gt;pivot&lt;/span&gt;&lt;span class=&quot;c-p2&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;c-sym&quot;&gt;coll&lt;/span&gt;&lt;span class=&quot;c-p1&quot;&gt;)&lt;/span&gt;
          &lt;span class=&quot;c-sym&quot;&gt;greater&lt;/span&gt; &lt;span class=&quot;c-p1&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c-sym&quot;&gt;filter&lt;/span&gt; &lt;span class=&quot;c-sym&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;c-p2&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c-sym&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;c-sym&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;c-sym&quot;&gt;pivot&lt;/span&gt;&lt;span class=&quot;c-p2&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;c-sym&quot;&gt;coll&lt;/span&gt;&lt;span class=&quot;c-p1&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;c-p0&quot;&gt;]&lt;/span&gt;
      &lt;span class=&quot;c-p0&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c-sym&quot;&gt;concat&lt;/span&gt; &lt;span class=&quot;c-p1&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c-sym&quot;&gt;quicksort&lt;/span&gt; &lt;span class=&quot;c-sym&quot;&gt;less&lt;/span&gt;&lt;span class=&quot;c-p1&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;c-sym&quot;&gt;pivots&lt;/span&gt; &lt;span class=&quot;c-p1&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c-sym&quot;&gt;quicksort&lt;/span&gt; &lt;span class=&quot;c-sym&quot;&gt;greater&lt;/span&gt;&lt;span class=&quot;c-p1&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;c-p0&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;c-p2&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;c-sym&quot;&gt;coll&lt;/span&gt;&lt;span class=&quot;c-p1&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;c-p0&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;example-1&quot;&gt;Example 1&lt;/h3&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code class=&quot;language-clojure&quot;&gt;&lt;span class=&quot;c-p0&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c-sym&quot;&gt;quicksort&lt;/span&gt; &lt;span class=&quot;c-p1&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;c-num&quot;&gt;49&lt;/span&gt; &lt;span class=&quot;c-num&quot;&gt;11&lt;/span&gt; &lt;span class=&quot;c-num&quot;&gt;37&lt;/span&gt; &lt;span class=&quot;c-num&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;c-num&quot;&gt;18&lt;/span&gt;&lt;span class=&quot;c-p1&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;c-p0&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;c-sym&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;c-p0&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c-num&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;c-num&quot;&gt;11&lt;/span&gt; &lt;span class=&quot;c-num&quot;&gt;18&lt;/span&gt; &lt;span class=&quot;c-num&quot;&gt;37&lt;/span&gt; &lt;span class=&quot;c-num&quot;&gt;49&lt;/span&gt;&lt;span class=&quot;c-p0&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;example-2&quot;&gt;Example 2&lt;/h3&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code class=&quot;language-clojure&quot;&gt;&lt;span class=&quot;c-p0&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c-sp&quot;&gt;-&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;c-p1&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;c-num&quot;&gt;4326&lt;/span&gt; &lt;span class=&quot;c-num&quot;&gt;55357&lt;/span&gt; &lt;span class=&quot;c-num&quot;&gt;10086&lt;/span&gt; &lt;span class=&quot;c-num&quot;&gt;10087&lt;/span&gt; &lt;span class=&quot;c-num&quot;&gt;56460&lt;/span&gt; &lt;span class=&quot;c-num&quot;&gt;10084&lt;/span&gt; &lt;span class=&quot;c-num&quot;&gt;9753&lt;/span&gt; &lt;span class=&quot;c-num&quot;&gt;10163&lt;/span&gt; &lt;span class=&quot;c-num&quot;&gt;63&lt;/span&gt; &lt;span class=&quot;c-num&quot;&gt;10083&lt;/span&gt; &lt;span class=&quot;c-num&quot;&gt;10085&lt;/span&gt; &lt;span class=&quot;c-num&quot;&gt;9825&lt;/span&gt; &lt;span class=&quot;c-num&quot;&gt;9829&lt;/span&gt;&lt;span class=&quot;c-p1&quot;&gt;]&lt;/span&gt;
  &lt;span class=&quot;c-p1&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c-sym&quot;&gt;quicksort&lt;/span&gt;&lt;span class=&quot;c-p1&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;c-p1&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c-sym&quot;&gt;map&lt;/span&gt; &lt;span class=&quot;c-sym&quot;&gt;char&lt;/span&gt;&lt;span class=&quot;c-p1&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;c-p1&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c-sym&quot;&gt;apply&lt;/span&gt; &lt;span class=&quot;c-sym&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;c-p1&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;c-p0&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;result&quot;&gt;Result&lt;/h3&gt;
&lt;h2 id=&quot;ღ&quot;&gt;?ღ☙♡♥❣❤❥❦❧➳💌&lt;/h2&gt;
</content:encoded></item><item><title>Group Momentum</title><link>https://petrustheron.com/posts/group-momentum</link><guid isPermaLink="true">https://petrustheron.com/posts/group-momentum</guid><pubDate>Wed, 19 Oct 2016 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;When organising events via chat groups, get opt-in before adding invitees to a shared group. By adding all invitees to a shared group, initial decliners are forced to create negative momentum that affects all attendees.&lt;/p&gt;
&lt;p&gt;Instead, get confirmation in private and add the positive RSVPs to a group - now you have positive momentum. This is similar to the &lt;a href=&quot;http://avc.com/2009/11/the-double-optin-introduction/&quot; class=&quot;ext&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;double opt-in introduction&lt;/a&gt;.&lt;/p&gt;
</content:encoded></item><item><title>Maintaining Large Software</title><link>https://petrustheron.com/posts/coupling-abstraction-naming</link><guid isPermaLink="true">https://petrustheron.com/posts/coupling-abstraction-naming</guid><pubDate>Fri, 14 Oct 2016 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The biggest impediment to maintaining large software is how amenable it is to change. In coaching junior developers, the three biggest issues I encounter daily are:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;coupling,&lt;/li&gt;
&lt;li&gt;bad abstractions (leaky or concrete), and&lt;/li&gt;
&lt;li&gt;mixed concerns&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;coupling&quot;&gt;Coupling&lt;/h2&gt;
&lt;p&gt;&apos;Coupled&apos; or &apos;complected&apos; means two things are &lt;a href=&quot;https://www.infoq.com/presentations/Simple-Made-Easy&quot; class=&quot;ext&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;braided together&lt;/a&gt;, like a hairball. If you pull on something over &lt;em&gt;here&lt;/em&gt;, it also pulls on something over &lt;em&gt;there&lt;/em&gt;. The more things it tugs on, the more complected it is, and the harder it is to change.&lt;/p&gt;
&lt;p&gt;For example, every time you write &lt;code&gt;this&lt;/code&gt; or &lt;code&gt;self&lt;/code&gt; in a function, you are tying it to an instance of that class. Consider adding a function argument instead and let the caller decide how it would like to regurgitate its hairballs. Better yet, make it static. Do you really need another class?&lt;/p&gt;
&lt;h2 id=&quot;abstraction&quot;&gt;Abstraction&lt;/h2&gt;
&lt;p&gt;Concrete means the opposite of abstract. Just because you moved a function does not mean it is now magically abstract and reusable. You have simply stretched the hairball out and now I will knock over more lamps when I trip over it. Keep coupled things together, so I can see how big the hairball is. Good abstractions hide implementation details and &lt;a href=&quot;http://www.joelonsoftware.com/articles/LeakyAbstractions.html&quot; class=&quot;ext&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;do not leak&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;mixing-of-concerns&quot;&gt;Mixing of Concerns&lt;/h2&gt;
&lt;p&gt;Separate concerns. A unit of code should do as little as possible. The more things it does, the more concrete, coupled and leaky it tends to be. You can usually tell by overloading or the duality of its arguments.&lt;/p&gt;
&lt;h2 id=&quot;naming-honourable-mention&quot;&gt;Naming &lt;small&gt;(honourable mention)&lt;/small&gt;&lt;/h2&gt;
&lt;p&gt;If I have to read your code to see what it actually does, rename it.&lt;/p&gt;
</content:encoded></item><item><title>Serialise Your Mind</title><link>https://petrustheron.com/posts/explain</link><guid isPermaLink="true">https://petrustheron.com/posts/explain</guid><pubDate>Mon, 25 Jul 2016 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;This is a draft. Critical feedback is welcomed in the comments at the bottom of the page.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Most people suck at explaining. I think it&apos;s because it is hard to serialise your mind. To convey an idea, you have to encode a tree-like&lt;sup&gt;&lt;a href=&quot;#user-content-fn-1&quot; id=&quot;user-content-fnref-1&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; neural network as a sequence of words that will construct the same shape in the mind of another.&lt;/p&gt;
&lt;p&gt;When building a pyramid, you don&apos;t place the capstone&lt;sup&gt;&lt;a href=&quot;#user-content-fn-2&quot; id=&quot;user-content-fnref-2&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;2&lt;/a&gt;&lt;/sup&gt; first. And ideas, like real-world structures, build on prior foundations. By analogy, you can convey ideas faster by leveraging prior knowledge.&lt;/p&gt;
&lt;p&gt;One of Clojure&apos;s strengths is that its core data structures&lt;sup&gt;&lt;a href=&quot;#user-content-fn-data-structures&quot; id=&quot;user-content-fnref-data-structures&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;3&lt;/a&gt;&lt;/sup&gt; are easily serialised. Consider the mathematical expression &lt;code&gt;(3 × 4) + 5&lt;/code&gt;. We can represent the order of operations as a tree:&lt;/p&gt;
&lt;figure class=&quot;figure&quot;&gt;&lt;button type=&quot;button&quot; class=&quot;duo-btn&quot; aria-label=&quot;View full size in true colour: Serialise an Expression Tree to Lisp code&quot;&gt;&lt;img src=&quot;https://petrustheron.com/assets/serialise-tree.svg&quot; alt=&quot;Serialise an Expression Tree to Lisp code&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/button&gt;&lt;figcaption&gt;Serialise an Expression Tree to Lisp code · click for true colour&lt;/figcaption&gt;&lt;/figure&gt;
&lt;blockquote&gt;
&lt;p&gt;The Lisp expression &lt;code&gt;(+ (* 3 4) 5)&lt;/code&gt; evaluates to 17 and is written in parenthesised &lt;a href=&quot;https://en.wikipedia.org/wikoi/Polish_notation&quot; class=&quot;ext&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;prefix notation&lt;/a&gt;. When the source code of a computer program is &lt;em&gt;deserialised&lt;/em&gt;, it is stored in memory as an expression tree&lt;sup&gt;&lt;a href=&quot;#user-content-fn-3&quot; id=&quot;user-content-fnref-3&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;4&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Ideas are harder to serialise because they are stored as connections between neurons, which are connected via multiple routes. Idea &lt;em&gt;A&lt;/em&gt; refers to &lt;em&gt;B&lt;/em&gt; and &lt;em&gt;B&lt;/em&gt; refers to &lt;em&gt;A&lt;/em&gt;. What should their order be? This makes them tricky to encode sequentially without a good syntax for referencing undefined concepts.&lt;/p&gt;
&lt;p&gt;English makes provision for unnamed things and how they relate spatially, but I am curious if prepositions in other languages like German make explaining easier by mapping more closely to how memories are stored&lt;sup&gt;&lt;a href=&quot;#user-content-fn-4&quot; id=&quot;user-content-fnref-4&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;5&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;The problem of serially ordering ideas suggests that a good notation for conveying ideas will have native support for declaring undefined references, like &lt;span style=&quot;font-family:Georgia;&quot;&gt;&lt;em&gt;x&lt;/em&gt;&lt;/span&gt; in math, and late-binding of definitions. Or, you should explain related concepts in parallel.&lt;/p&gt;
&lt;h3 id=&quot;how-to-win-at-30-seconds&quot;&gt;How to Win at 30 Seconds&lt;/h3&gt;
&lt;p&gt;In the board game &lt;em&gt;30 Seconds&lt;/em&gt; you design clues that will prompt your teammates to say a term. I love this game because it trains you to serialise your thoughts and transmit them without error or distortion.&lt;/p&gt;
&lt;p&gt;One strategy that rarely distorts for me is a top-down definition followed by bottom-up clues to trigger episodic memory:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;Famous formula 1 driver,&quot; &lt;em&gt;(top-down category)&lt;/em&gt;&lt;br&gt;
&quot;who drove for Ferrari and had a ski accident.&quot; &lt;em&gt;(bottom-up events)&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Answer:&lt;/strong&gt; Michael Schumacher.&lt;/p&gt;
&lt;p&gt;That works well for recalling old knowledge, but what about teaching new concepts? A good protocol is the &lt;a href=&quot;https://betterexplained.com/articles/adept-method/&quot; class=&quot;ext&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;ADEPT method&lt;/a&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Use an &lt;u&gt;A&lt;/u&gt;nalogy,&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;&lt;u&gt;D&lt;/u&gt;iagram,&lt;/li&gt;
&lt;li&gt;&lt;u&gt;E&lt;/u&gt;xample,&lt;/li&gt;
&lt;li&gt;&lt;u&gt;P&lt;/u&gt;lain English, and&lt;/li&gt;
&lt;li&gt;a &lt;u&gt;T&lt;/u&gt;echnical description.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Did it work for this essay?&lt;/p&gt;
&lt;p&gt;Explaining is a skill. It takes empathy to place yourself in the mind of another and build on their foundation. With the right strategy and practice, you should beat me at 30 Seconds.&lt;/p&gt;
&lt;section data-footnotes class=&quot;footnotes&quot;&gt;&lt;h2 class=&quot;sr-only&quot; id=&quot;footnote-label&quot;&gt;Footnotes&lt;/h2&gt;
&lt;ol&gt;
&lt;li id=&quot;user-content-fn-1&quot;&gt;
&lt;p&gt;Assuming ideas are stored as connections between neurons, which can be modelled as recurrent neural networks and cycles are hard to serialise, hard to serialise, hard to serialise. &lt;a href=&quot;#user-content-fnref-1&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 1&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;user-content-fn-2&quot;&gt;
&lt;p&gt;The tip, or final piece of a pyramid. &lt;a href=&quot;#user-content-fnref-2&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 2&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;user-content-fn-data-structures&quot;&gt;
&lt;p&gt;Lists, vectors, hash-maps and sets. &lt;a href=&quot;#user-content-fnref-data-structures&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 3&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;user-content-fn-3&quot;&gt;
&lt;p&gt;Computer programs are represented as &lt;a href=&quot;https://en.wikipedia.org/wiki/Abstract_syntax_tree&quot; class=&quot;ext&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;abstract syntax trees&lt;/a&gt;, or ASTs. &lt;a href=&quot;#user-content-fnref-3&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 4&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;user-content-fn-4&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Linguistic_relativity&quot; class=&quot;ext&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Linguistic relativity&lt;/a&gt;. &lt;a href=&quot;#user-content-fnref-4&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 5&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
</content:encoded></item><item><title>So You Want to Learn to Code</title><link>https://petrustheron.com/posts/learn-to-code</link><guid isPermaLink="true">https://petrustheron.com/posts/learn-to-code</guid><pubDate>Wed, 18 May 2016 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;A few students have emailed me asking which languages to learn if they want to master web development.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;To master development, you will have to learn several different languages paradigms: functional, imperative, declarative and object-oriented. But if you had to start with one:&lt;/p&gt;
&lt;h2 id=&quot;learn-javascript&quot;&gt;Learn JavaScript&lt;/h2&gt;
&lt;p&gt;The web is a shifting landscape with new things coming out every 3-6 months, but JavaScript is here to stay.&lt;/p&gt;
&lt;p&gt;JavaScript (hereafter &quot;JS&quot;) is pretty much the worst language ever designed (in two weeks), but it is the language of the Web because it runs in every browser. If you want your code to run everywhere, you need to learn JS.&lt;/p&gt;
&lt;p&gt;It will take you a year to get productive and ten years to become good, but you will be able to make something cool in a few days or even hours if you follow the right tutorials.&lt;/p&gt;
&lt;p&gt;Start with this &lt;a title=&quot;(opens in new tab)&quot; href=&quot;https://www.firebase.com/tutorial/&quot; style=&quot;padding:0.8em; background-color: #faab3b; border-radius: 5px; color:white; background-image: linear-gradient(#fbb44d,#fbb147 4%,#faaa39 29%,#f89912 83%,#f8950a); box-shadow: 1px 1px 1px #fcbf69 inset; border-color: #d7902b;text-shadow: 1px 1px 1px #222;&quot; target=&quot;_blank&quot;&gt;Firebase Tutorial &amp;gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Firebase is a real-time document store with a native JavaScript driver that lets you store data on the Internet without setting up servers. It has downsides, but it will get you going the quickest. Firebase is great for prototyping new products.&lt;/p&gt;
&lt;p&gt;Myself, I spend most of my time writing Clojure and ClojureScript (which compiles down to JS), but I would not recommend Clojure as a first language because of the awful stack traces and the immature tooling.&lt;/p&gt;
&lt;p&gt;If you are more interested in the business side of things, refer to &lt;a href=&quot;https://petrustheron.com/posts/startups&quot;&gt;my post on startups&lt;/a&gt;.&lt;/p&gt;
</content:encoded></item><item><title>Curation</title><link>https://petrustheron.com/posts/curation</link><guid isPermaLink="true">https://petrustheron.com/posts/curation</guid><pubDate>Wed, 23 Sep 2015 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The marginal value of new art&lt;sup&gt;&lt;a href=&quot;#user-content-fn-1&quot; id=&quot;user-content-fnref-1&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; decreases as content accumulates over time because new works compete&lt;sup&gt;&lt;a href=&quot;#user-content-fn-2&quot; id=&quot;user-content-fnref-2&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;2&lt;/a&gt;&lt;/sup&gt; with all prior art. Conversely, the value of curation increases exponentially. This predicts the wealth of several discovery startups:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Products:&lt;/strong&gt; Product Hunt, Gdgt (now Engadget)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Startups:&lt;/strong&gt; AngelList, MatterMark&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Places:&lt;/strong&gt; Yelp, TripAdvisor, NomadList&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Answers:&lt;/strong&gt; StackOverflow&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Music:&lt;/strong&gt; Rdio, Spotify, Soundcloud and Shazam&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Video:&lt;/strong&gt; YouTube, Netflix, Vimeo&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cat Pictures:&lt;/strong&gt; Reddit, Imgur &amp;amp; 9Gag&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;People:&lt;/strong&gt; Tinder, LinkedIn&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Activities:&lt;/strong&gt; Meetup.com, etc.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;News:&lt;/strong&gt; Twitter, Facebook Signal (verdict still out)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These companies are built on network effects, but each has a mechanism for filtering signal from noise, such as liking, sharing, voting or swiping.  The ubiquity of a curation mechanism seems undervalued and suggests a higher abstraction for thinking about search as on-demand topic curation.&lt;/p&gt;
&lt;p&gt;Both the curation pivot and the interface seem important. Any service that can effectively distinguish between good or bad options in a vertical representing a human need should do well.&lt;/p&gt;
&lt;p&gt;Which new startups will generate wealth by curating new or existing kinds of data? I suspect you could pick winners by investing in new sources of data like genomics and its supporting databases without applying any complex algorithms.&lt;/p&gt;
&lt;h3 id=&quot;a-recipe&quot;&gt;A Recipe&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Identify a human need with a growing set of options&lt;/li&gt;
&lt;li&gt;Collect and classify new or existing data&lt;/li&gt;
&lt;li&gt;Pivot that data on an under-serviced metric that people care about, like &quot;agony&quot; for air travel&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;some-spins-on-existing-data&quot;&gt;Some Spins On Existing Data&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Jobs by culture, perks or co-worker personalities, instead of by role or brand.&lt;/li&gt;
&lt;li&gt;Real estate by cost of surrounding areas instead of by rent, or a combination of the two.&lt;/li&gt;
&lt;li&gt;Mind-altering drugs by subjective effects - marijuana being the obvious choice.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Viewed through this lens, a successful team is a curated group of the right people. Whoever can predict fruitful cooperation, will prosper.&lt;/p&gt;
&lt;section data-footnotes class=&quot;footnotes&quot;&gt;&lt;h2 class=&quot;sr-only&quot; id=&quot;footnote-label&quot;&gt;Footnotes&lt;/h2&gt;
&lt;ol&gt;
&lt;li id=&quot;user-content-fn-1&quot;&gt;
&lt;p&gt;Art meant to please, not transform, like music, videos, games and other forms of entertainment. I think the same is true of transformative art, but I&apos;m not as sure. &lt;a href=&quot;#user-content-fnref-1&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 1&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;user-content-fn-2&quot;&gt;
&lt;p&gt;Should I watch Chris Rock, Interstellar or The Beatles? Like restaurants, all entertainment competes with all other entertainment. &lt;a href=&quot;#user-content-fnref-2&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 2&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
</content:encoded></item><item><title>The High Test</title><link>https://petrustheron.com/posts/the-high-usability-test</link><guid isPermaLink="true">https://petrustheron.com/posts/the-high-usability-test</guid><pubDate>Mon, 07 Sep 2015 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Back in December 2009, Alex and I were pursuing our craziest idea to-date: a now-defunct traffic fine reduction service called &lt;em&gt;F*MyFine&lt;/em&gt;, which was short for F*ck My Fine. The service produced tailored PDF excuses from a library of templates designed to discount your pricey traffic fine.&lt;/p&gt;
&lt;figure class=&quot;figure&quot;&gt;&lt;button type=&quot;button&quot; class=&quot;duo-btn&quot; aria-label=&quot;View full size in true colour: F*MyFine logo&quot;&gt;&lt;img src=&quot;https://petrustheron.com/assets/fmyfine-logo.png&quot; alt=&quot;F*MyFine logo&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; class=&quot;matte&quot; style=&quot;--matte:#000&quot;&gt;&lt;/button&gt;&lt;figcaption&gt;F*MyFine logo · click for true colour&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Ridiculous? Absolutely. Customers had to fill in a long form, so the user experience had to be amazing. To ensure our service was user-friendly, we invented a variation of &lt;a href=&quot;https://en.wikipedia.org/wiki/Usability_testing#Hallway_testing&quot; class=&quot;ext&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;hallway testing&lt;/a&gt; called &lt;em&gt;The High Test™&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id=&quot;what-is-the-high-test&quot;&gt;What is The High Test?&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Find a stoner buddy who is high and drunk.&lt;/li&gt;
&lt;li&gt;Instruct them to use your service.&lt;/li&gt;
&lt;li&gt;Shut up and listen to them shouting questions at you.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Eliminate your inebriated testers&apos; questions and your service will be a dream to use for sober users. Others have since built &lt;a href=&quot;http://theuserisdrunk.com/&quot; class=&quot;ext&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;paid usability services&lt;/a&gt; around this idea, but to my knowledge, we were the first to implement it. Incidentally, eliminating question marks is the secret to good UX.&lt;/p&gt;
&lt;p&gt;We proceeded to market this crazy service by sticking fake, pink traffic tickets on car windows in Cape Town using easy-off glue. This gave us excellent publicity on a few &lt;a href=&quot;http://www.2oceansvibe.com/2010/04/19/local-website-will-reduce-your-traffic-fines/&quot; class=&quot;ext&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;high-profile blogs&lt;/a&gt; that resulted in exactly two sales.&lt;/p&gt;
&lt;h2 id=&quot;why-did-it-fail&quot;&gt;Why did it fail?&lt;/h2&gt;
&lt;p&gt;Don&apos;t you hate it when tech companies build large call centres instead of solving the underlying cause of support calls, like buggy software?&lt;/p&gt;
&lt;p&gt;Traffic fines are a stupid tax vested in bad public transport and lack of automation. F*MyFine treated the symptom of traffic fines instead of solving the underlying problem of public transport and limited parking. Essentially, we were solving the wrong problem.&lt;/p&gt;
&lt;p&gt;In retrospect, we should have made the service free and used the user base as a launchpad for our next idea, but it took me a few years and Peter Thiel&apos;s wisdom to understand why: your startup should aim to &lt;a href=&quot;http://startupclass.samaltman.com/courses/lec05/&quot; class=&quot;ext&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;capture as much of the value it creates as possible&lt;/a&gt;. We charged users for something they could barely afford, when we would have captured more value (and good-will) as a free service.&lt;/p&gt;
&lt;p&gt;Hopefully &lt;a href=&quot;http://whereismytransport.com/&quot; class=&quot;ext&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;someone&lt;/a&gt; will solve the underlying public transport problem, or at least help users find legal parking spaces.&lt;/p&gt;
</content:encoded></item><item><title>Grieving is Growing</title><link>https://petrustheron.com/posts/grieving-is-growing</link><guid isPermaLink="true">https://petrustheron.com/posts/grieving-is-growing</guid><pubDate>Mon, 24 Aug 2015 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Grief is a natural response to loss. When we grow, we grieve over the amputated identity that harboured our vestigial thoughts — we grieve for the person we no longer are.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“The curious paradox is that when I accept myself just as I am, then I can change.” — Carl R. Rogers&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Grieving persons may need to tell their story over and over again to come to terms with the pain. With each retelling, the pain lessens.&lt;/p&gt;
&lt;p&gt;It is the same with new ideas. A diary compresses growth into edible morsels. Like a parent flipping through a yearbook, re-reading our thoughts helps us come to terms with our lost selves. And when you turn the last page, a new person holds the pen.&lt;/p&gt;
&lt;p&gt;Now cauterise.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Painting: &lt;a href=&quot;https://en.wikipedia.org/wiki/At_Eternity%27s_Gate&quot; class=&quot;ext&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;At Eternity&apos;s Gate&lt;/a&gt; by Vincent van Gogh.&lt;/p&gt;
</content:encoded></item><item><title>Talk at UCT: State of the Art in Front End Development</title><link>https://petrustheron.com/posts/sota-front-end-development-clojurescript</link><guid isPermaLink="true">https://petrustheron.com/posts/sota-front-end-development-clojurescript</guid><pubDate>Thu, 13 Aug 2015 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;snake-in-100-lines-of-code&quot;&gt;Snake in &amp;lt;100 lines of code&lt;/h2&gt;
&lt;p&gt;On 12 August 2015 I presented a talk at UCT entitled &quot;The State of the Art in Front End Development: A Foray Into ClojureScript&quot; during which we built a snake game in the browser using &lt;a href=&quot;https://github.com/clojure/clojurescript&quot; class=&quot;ext&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;ClojureScript&lt;/a&gt; and &lt;a href=&quot;http://reagent-project.github.io/&quot; class=&quot;ext&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Reagent&lt;/a&gt;. The audience consisted primarily of Computer Science majors.&lt;/p&gt;
&lt;figure class=&quot;figure&quot;&gt;&lt;button type=&quot;button&quot; class=&quot;duo-btn&quot; aria-label=&quot;View full size in true colour: snake gameplay&quot;&gt;&lt;img src=&quot;https://petrustheron.com/assets/snake-gameplay-3.gif&quot; data-orig=&quot;https://petrustheron.com/assets/snake-gameplay-3.gif&quot; alt=&quot;snake gameplay&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; data-anim=&quot;true&quot;&gt;&lt;/button&gt;&lt;figcaption&gt;snake gameplay · click for true colour&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/theronic/cljs-snake&quot; class=&quot;ext&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Read The Code on GitHub&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;slides--video&quot;&gt;Slides + Video&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://s3-eu-west-1.amazonaws.com/petrus-blog/SotA-Frontend-UCT-Tech-Talk_2015-08-12.key&quot; class=&quot;ext&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Download Keynote Presentation + Coding Videos (82MB)&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;audio&quot;&gt;Audio&lt;/h3&gt;
&lt;p&gt;The unedited, unsynchronised and unmastered audio accompanies the slides. Listen here:&lt;/p&gt;
&lt;audio controls preload=&quot;none&quot;&gt;
  &lt;source src=&quot;https://s3-eu-west-1.amazonaws.com/petrus-blog/SotA-Frontend-UCT-Tech-Talk_2015-08-12+Audio.m4a&quot; type=&quot;audio/mp4&quot;&gt;
Your browser does not support the audio element.
&lt;/audio&gt;
&lt;p&gt;&lt;a href=&quot;https://s3-eu-west-1.amazonaws.com/petrus-blog/SotA-Frontend-UCT-Tech-Talk_2015-08-12+Audio.m4a&quot; class=&quot;ext&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Download Unedited Audio (25MB)&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>Undesign Your Retail Website</title><link>https://petrustheron.com/posts/retail-landing-page-design</link><guid isPermaLink="true">https://petrustheron.com/posts/retail-landing-page-design</guid><pubDate>Mon, 13 Jul 2015 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;What is the purpose of your retail landing page? Is it to:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Download a 5MB PDF food menu?&lt;/li&gt;
&lt;li&gt;Watch a Flash intro before proceeding to your real site?&lt;/li&gt;
&lt;li&gt;Hear auto-playing music?&lt;/li&gt;
&lt;li&gt;Get customers &lt;em&gt;off your site&lt;/em&gt; and into your physical store so you can make a sale? (&lt;strong&gt;Hint:&lt;/strong&gt; it&apos;s this one.)&lt;/li&gt;
&lt;li&gt;Keep customers on your site to achieve a secondary purpose, like build trust to make a sale?&lt;/li&gt;
&lt;li&gt;Send customers elsewhere to make a sale?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you run a retail store with decent brand equity, the answer is probably (4): to get people off the web and into your store ASAP — everything else derives from this. In select few cases you may want to keep customers on your site to build trust before attempting a sale.&lt;/p&gt;
&lt;p&gt;Retail establishments like restaurants and shops have traditionally suffered from over-designed websites filled with distractions, when the customer really just wants a map with driving directions so they can give you their hard-earned money.&lt;/p&gt;
&lt;h2 id=&quot;what-to-convey&quot;&gt;What to Convey&lt;/h2&gt;
&lt;p&gt;Content before style. Here are the bare necessities:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Minimal branding to establish identity, e.g. “ACME Inc.”&lt;/li&gt;
&lt;li&gt;Big obvious phone number and email address, above the fold.&lt;/li&gt;
&lt;li&gt;Physical address with map and clear driving directions.&lt;/li&gt;
&lt;li&gt;Obvious pricing. Most phone calls are to ask, “How much is X?”&lt;/li&gt;
&lt;li&gt;Minimal social proof to establish trust like “150,000 happy customers” with a few selected testimonials.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Instead of hiding contact details on a different page, put a phone number prominently on your home page, &lt;a href=&quot;https://en.wikipedia.org/wiki/Above_the_fold&quot; class=&quot;ext&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;above the fold&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Don&apos;t like answering the phone as a retail owner? Invest in phone support first.&lt;/p&gt;
&lt;h2 id=&quot;how-to-convey-it&quot;&gt;How to Convey It&lt;/h2&gt;
&lt;p&gt;Focus on what you can measure: content and usability. Avoid &quot;pretty&quot; or flashy design.&lt;/p&gt;
&lt;h3 id=&quot;eliminate-question-marks&quot;&gt;Eliminate Question Marks&lt;/h3&gt;
&lt;p&gt;Baseline usability is about avoiding unnecessary questions like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;“Is that a button?”&lt;/li&gt;
&lt;li&gt;“Can I click on that?”&lt;/li&gt;
&lt;li&gt;“Why is that there?”&lt;/li&gt;
&lt;li&gt;“Is 6:00 in the evening or the morning?”&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Whilst efficiently answering necessary questions like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;“What does it cost?”&lt;/li&gt;
&lt;li&gt;“When are they open?”&lt;/li&gt;
&lt;li&gt;“Who do I call?”&lt;/li&gt;
&lt;li&gt;“How do I get there?”&lt;/li&gt;
&lt;li&gt;“How do I buy?”&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Omit elements which introduce unnecessary questions while answering sales-driven questions.&lt;/p&gt;
&lt;p&gt;Required reading on usability is &lt;a href=&quot;http://www.sensible.com/dmmt.html&quot; class=&quot;ext&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Don’t Make Me Think&lt;/a&gt; by Steve Krug.&lt;/p&gt;
&lt;h3 id=&quot;hallway-testing&quot;&gt;Hallway Testing&lt;/h3&gt;
&lt;p&gt;Test your assumptions with a simple hallway test:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Pull a customer off the street for a 60-second usability test. Offer free bacon or coffee.&lt;/li&gt;
&lt;li&gt;Tell them the action you want them to achieve, e.g. “What does an iPhone 5 Screen repair cost?” Encourage them to think aloud.&lt;/li&gt;
&lt;li&gt;Shut up and watch what they do. Give no guidance. Pay particular attention when they get stuck: those are your question marks.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Five hallway tests will identify &lt;a href=&quot;http://www.nngroup.com/articles/why-you-only-need-to-test-with-5-users/&quot; class=&quot;ext&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;90% of all usability problems&lt;/a&gt; on your site.&lt;/p&gt;
&lt;h2 id=&quot;dos-and-donts&quot;&gt;Do’s And Don’ts&lt;/h2&gt;
&lt;p&gt;“Users spend most of their time on other sites.” - &lt;a href=&quot;http://www.nngroup.com/articles/end-of-web-design/&quot; class=&quot;ext&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Jakob&apos;s Law of the Internet User Experience&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;dos&quot;&gt;Do’s:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Use minimal design. Good design is as little design as possible. Remember Windows Vista? Yuck.&lt;/li&gt;
&lt;li&gt;Minimum font-size: 16px.&lt;/li&gt;
&lt;li&gt;Line-spacing: 1.6 (&lt;code&gt;line-height: 1.62em&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Two or fewer fonts: one for headlines and one for copy.&lt;/li&gt;
&lt;li&gt;Good contrast between text and background.&lt;/li&gt;
&lt;li&gt;Limit line length to 12 words per line, or &lt;code&gt;max-width: 30em&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Use a different color for visited links.&lt;/li&gt;
&lt;li&gt;Support mobile.&lt;/li&gt;
&lt;li&gt;Balance heavy or busy space with whitespace. Better yet, avoid busy space.&lt;/li&gt;
&lt;li&gt;Keep vital information above the fold. If you need a “scroll down” button, you have failed.&lt;/li&gt;
&lt;li&gt;Have a single clear primary call-to-action like a phone number, “buy” button or link to pricing. Even better, show pricing on the homepage if you can.&lt;/li&gt;
&lt;li&gt;Use &lt;a href=&quot;http://moonstruckmarketinggroup.com/blog/rich-black-vs-pure-black-what-you-need-to-know&quot; class=&quot;ext&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;rich black&lt;/a&gt; for headlines or large blocks of black.
Write scannable content. &lt;a href=&quot;http://www.nngroup.com/articles/how-users-read-on-the-web/&quot; class=&quot;ext&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;People Don’t Read on the Web&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;donts&quot;&gt;Don’ts&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Don’t use more than two fonts.&lt;/li&gt;
&lt;li&gt;Don’t reinvent native user interfaces like scrollbars or - mouse pointers.&lt;/li&gt;
&lt;li&gt;Don’t use rotating elements like carousels.&lt;/li&gt;
&lt;li&gt;Don’t hijack scrolling with any kind of “smoothing behaviour.”&lt;/li&gt;
&lt;li&gt;Don’t let JavaScript break navigation. Can you link to a particular page? Test your site with JavaScript disabled. - Don’t depend on hover for navigation or showing vital information (esp. tooltips), because it breaks on touch pads.&lt;/li&gt;
&lt;li&gt;Don’t use non-standard link colors.&lt;/li&gt;
&lt;li&gt;Don’t design for the sake of design.&lt;/li&gt;
&lt;li&gt;Don’t use animations, unless you want to draw attention to that element. If you need to draw attention, your page may be too busy.&lt;/li&gt;
&lt;li&gt;Don’t use pure black for large dark areas.&lt;/li&gt;
&lt;li&gt;Don’t overwhelm the user with a wall of text.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now go undesign your retail site! Let me know if this helps.&lt;/p&gt;
</content:encoded></item><item><title>Bad Startup Ideas</title><link>https://petrustheron.com/posts/bad-ideas</link><guid isPermaLink="true">https://petrustheron.com/posts/bad-ideas</guid><pubDate>Sun, 12 Jul 2015 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Every budding entrepreneur has to get some bad ideas out of their system before they move on to real-world problem-solving. Three ideas I considered as a student and am pitched on most often are:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;A local events listing site&lt;/li&gt;
&lt;li&gt;A reservation system for hotels, restaurants, barbers or taxis&lt;/li&gt;
&lt;li&gt;A classifieds/auction platform, often for text books&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;These are all different types of local services marketplaces with various chicken/egg barriers to entry. It&apos;s not that they are inherently bad concepts, but trying to out-compete OpenTable, Craigslist, Gumtree or Uber on your first try probably is.&lt;/p&gt;
&lt;p&gt;You are not your startup. The faster you can disentangle your idea from your ego, the faster you will be able to iterate on better ideas to build a painkiller instead of a vitamin.&lt;/p&gt;
&lt;h3 id=&quot;should-you-share-your-ideas&quot;&gt;Should you share your ideas?&lt;/h3&gt;
&lt;p&gt;Kind of. Tell people what you&apos;re doing, but do it first. The main reason for not talking about your startup is because sharing goals makes you &lt;a href=&quot;http://sivers.org/zipit&quot; class=&quot;ext&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;less likely to accomplish them&lt;/a&gt;. And if your idea is any good, it is likely to seem bad.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“Don&apos;t worry about people stealing your ideas. If your ideas are any good, you&apos;ll have to ram them down people&apos;s throats.”
— Howard Aiken&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Some ways to test good ideas:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Talk to customers instead of friends or family&lt;/li&gt;
&lt;li&gt;Design a hypothesis to prove or disprove your idea as cheaply as possible&lt;/li&gt;
&lt;li&gt;Put something out there and measure the response&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Others have written about &lt;a href=&quot;http://paulgraham.com/startupideas.html&quot; class=&quot;ext&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;good ideas&lt;/a&gt;, but I will say something about excellence in product design:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Thinking hurts. Great products start where others stop thinking.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Product visionaries seem that way because they have thought harder about a problem than anyone before them.&lt;/p&gt;
&lt;p&gt;Don&apos;t worry if your first idea sucks. It&apos;s a stepping stone to more and better ideas.&lt;/p&gt;
</content:encoded></item><item><title>Trips</title><link>https://petrustheron.com/posts/trips</link><guid isPermaLink="true">https://petrustheron.com/posts/trips</guid><pubDate>Wed, 01 Apr 2015 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;People are constantly offering us trips: a beer after work, a coffee, a cigarette on the balcony, a business opportunity or a cross-country road trip&lt;sup&gt;&lt;a href=&quot;#user-content-fn-1&quot; id=&quot;user-content-fnref-1&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;. Good or bad, relationships develop on trips.&lt;/p&gt;
&lt;p&gt;You can get on any roller coaster, but you can&apos;t know on which part of the ride you&apos;ll scream. Arduous trips result in deeper connections...or spectacular implosions, and the strongest relationships are built on many, mighty trips:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“If you think you found the one, take that person and travel around the world. Travel places that are hard to go to and hard to get out of. And…when you land at JFK, and you&apos;re still in love with that person, get married at the airport.” — Bill Murray&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The &apos;trips&apos; metaphor is shaky because anything that means all things to all people means nothing at all. So what isn&apos;t a trip? Is being born? Is getting cancer? No, those are not choices, but the experience can still be shared. A more accurate term might be &lt;em&gt;shared experience with agency&lt;/em&gt;, or &lt;em&gt;chosen path&lt;/em&gt;, but I prefer &apos;trips&apos;.&lt;/p&gt;
&lt;p&gt;Any trip can be meaningful and fun when shared with the right people, even a flat tire in the middle of the desert! It&apos;s all part of the journey.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“Being in a relationship, that&apos;s something you choose. Being friends, that&apos;s just something you are. [But] I do pick you. We&apos;ve been friends too long to pick, but if we could pick, I&apos;d pick you.” ― John Green, Will Grayson&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;When you start seeing shared experiences as opportunities for building relationships, your perception changes. And besides, bad trips make the best stories. So if you want to have more rewarding relationships, say yes to more hard trips.&lt;/p&gt;
&lt;section data-footnotes class=&quot;footnotes&quot;&gt;&lt;h2 class=&quot;sr-only&quot; id=&quot;footnote-label&quot;&gt;Footnotes&lt;/h2&gt;
&lt;ol&gt;
&lt;li id=&quot;user-content-fn-1&quot;&gt;
&lt;p&gt;Isn&apos;t it interesting how often psychotropic drugs like caffeine, alcohol and tobacco are involved? &lt;a href=&quot;#user-content-fnref-1&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 1&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
</content:encoded></item><item><title>Defensive Programming</title><link>https://petrustheron.com/posts/defensive-programming</link><guid isPermaLink="true">https://petrustheron.com/posts/defensive-programming</guid><pubDate>Fri, 20 Mar 2015 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;For every few lines of code I write, I will introduce a certain number of bugs. The rate at which I introduce bugs will vary by project, complexity and sleep deprivation, but one thing is certain: there will be bugs.&lt;/p&gt;
&lt;p&gt;Over time, I have adopted a principle to minimise bugs and compensate for my own stupidity and ignorance. I call this principle &lt;em&gt;defensive programming&lt;/em&gt;&lt;sup&gt;&lt;a href=&quot;#user-content-fn-1&quot; id=&quot;user-content-fnref-1&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;I started writing this essay two years ago, but it was not finished without a concrete example. That is, until I read &lt;a href=&quot;http://www.jwz.org/xscreensaver/toolkits.html&quot; class=&quot;ext&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;On Toolkit Dialogs&lt;/a&gt; by legendary &lt;a href=&quot;http://www.jwz.org/&quot; class=&quot;ext&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Jamie Zawinski&lt;/a&gt;, in which he describes how a crashing GUI bug in a screensaver daemon could bypass security:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[As] a critical piece of security software ... any bug in the screen locker that causes it to crash will cause the screen to unlock.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Let&apos;s suppose that down in the bowels of some particular version of some particular toolkit library, there lurks a bug. Let&apos;s suppose that the nature of this bug is something relatively obscure: say that it&apos;s something like, if you hold down 5 keys on the keyboard for 10 seconds then drag the middle mouse button, the text entry widget gets a SEGV. (In fact, I&apos;m not making this up: I saw this very bug once, years ago.)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Hm. I&apos;ve written bugs like that. He continues,&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Bugs like that will exist in GUI libraries; &lt;strong&gt;it&apos;s inevitable&lt;/strong&gt;. The libraries are big, and do many different things.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;One way to protect against that problem is to &lt;strong&gt;keep the number of libraries&lt;/strong&gt; used by the xscreensaver daemon &lt;strong&gt;to an absolute minimum&lt;/strong&gt;. That&apos;s why I implemented the unlock dialog using only Xlib.
The amount of code in Xlib is very small, and has been extensively security audited.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;To me, this practice exemplifies defensive programming. After working with many younger and more talented programmers than myself, the key difference underscoring my experience has been their unconscious incompetence compared to my &lt;a href=&quot;http://en.wikipedia.org/wiki/Four_stages_of_competence&quot; class=&quot;ext&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;conscious incompetence&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;What else can we take from this?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Explicit code is better than implicit code&lt;/li&gt;
&lt;li&gt;Less code means fewer bugs&lt;/li&gt;
&lt;li&gt;Minimise dependencies&lt;/li&gt;
&lt;li&gt;Minimise coupling&lt;/li&gt;
&lt;li&gt;Avoid toolkits for crucial infrastructure&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You see, I know how bad of a programmer I am, and I &lt;em&gt;think&lt;/em&gt; that makes me a better software engineer.&lt;/p&gt;
&lt;section data-footnotes class=&quot;footnotes&quot;&gt;&lt;h2 class=&quot;sr-only&quot; id=&quot;footnote-label&quot;&gt;Footnotes&lt;/h2&gt;
&lt;ol&gt;
&lt;li id=&quot;user-content-fn-1&quot;&gt;
&lt;p&gt;There is a &lt;a href=&quot;http://en.wikipedia.org/wiki/Defensive_programming&quot; class=&quot;ext&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;related article&lt;/a&gt; on Wikipedia with the same title, but it describes a different practice. &lt;a href=&quot;#user-content-fnref-1&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 1&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
</content:encoded></item><item><title>Language as a Lever</title><link>https://petrustheron.com/posts/language</link><guid isPermaLink="true">https://petrustheron.com/posts/language</guid><pubDate>Wed, 28 Jan 2015 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;By one definition, to understand means to perceive the meaning of words. Words form the foundation of language and language is a lever for conveying ideas. This is why it is important to have a large vocabulary: you cannot &lt;a href=&quot;http://en.wikipedia.org/wiki/Linguistic_relativity&quot; class=&quot;ext&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;reason about ideas you cannot describe&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“Give me a lever long enough and a fulcrum on which to place it, and I shall move the world.” — Archimedes&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Learning new words feels like work, but they extend your language lever. A bigger lever can move bigger ideas that let you forget a thousand little ones. Like gravity, for example. You can either remember that teapots fall, freshly-poured beer falls, Macbooks falls, and so on. Or you can learn Newton&apos;s definition of gravity:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Gravity is an invisible force that attracts all objects with mass toward each other with a magnitude that is directly proportional to the product of their masses, and inversely proportional to the square of the distance between their centers.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That&apos;s a lengthy definition, but if you can parse it, you can forget a thousand little ideas and begin to understand the universe. Sometimes a heuristic is good enough, such as &quot;things with mass accelerate toward the earth&quot;, but not if you want to conquer space flight.&lt;/p&gt;
&lt;p&gt;So by knowing more words, we can afford to remember less and reason more keenly about fewer, but bigger ideas.&lt;/p&gt;
</content:encoded></item><item><title>Visionary Domain Expertise</title><link>https://petrustheron.com/posts/vision</link><guid isPermaLink="true">https://petrustheron.com/posts/vision</guid><pubDate>Sun, 04 Jan 2015 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In 1817, David Ricardo developed the classical &lt;a href=&quot;http://en.wikipedia.org/wiki/Comparative_advantage&quot; class=&quot;ext&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;theory of comparative advantage&lt;/a&gt; to explain why countries engage in international trade despite producing all traded goods more efficiently than other countries. The same principle applies to individual skills - specifically, skills which confer a comparative advantage by leveraging aptitude.&lt;/p&gt;
&lt;p&gt;The best Formula 1 racing drivers have innately fast reaction times; when combined with thousands of hours of deliberate practice, their amplified advantage yields consistent wins. Hence, talent amplifies skill.&lt;/p&gt;
&lt;p&gt;The trick is choosing skills which can leverage aptitude to maximise your comparative advantage. For a strong maths major this might be learning to code, or for a hardy entrepreneur, mastering public speaking. This type of deliberate skill development feels like a form of &lt;a href=&quot;http://en.wikipedia.org/wiki/Value_investing&quot; class=&quot;ext&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;value investing&lt;/a&gt; because well-aimed domain expertise telescopically extends prescient vision,&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“One guaranteed way...to have good startup ideas is to...be on the leading edge of some technology...or as Paul Buchheit put it, to &quot;&lt;strong&gt;live in the future&lt;/strong&gt;.&quot; When you reach that point, ideas that will seem to other people uncannily prescient will seem obvious to you. You may not realize they&apos;re startup ideas, but you&apos;ll know they&apos;re something that ought to exist.” — Paul Graham, &lt;a href=&quot;http://www.paulgraham.com/before.html&quot; class=&quot;ext&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Before The Startup&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If true, the combined premise of prescient domain expertise and comparative skill advantage suggests a powerful recipe: by becoming a domain expert in a field that amplifies your aptitude, you can invent the future.&lt;/p&gt;
</content:encoded></item><item><title>So You Want to Start a Startup</title><link>https://petrustheron.com/posts/startups</link><guid isPermaLink="true">https://petrustheron.com/posts/startups</guid><pubDate>Fri, 29 Aug 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Thinking of starting a business? This list is for you. It was last updated on &lt;em&gt;27 December 2014&lt;/em&gt;. First, some definitions:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“A startup is an organization formed to search for a repeatable and scalable business model.” — Steve Blank&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;“A startup is a company designed to grow fast.” — Paul Graham&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;“A startup is a human institution designed to deliver a new product or service under conditions of extreme uncertainty.” — Eric Ries&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I found that in meeting with more founders, the same answers tended to come up surrounding product, pricing, equity, hiring, strategy and marketing.&lt;/p&gt;
&lt;p&gt;What follows is a curated collection of startup resources that I found indispensable on my startup journey.&lt;/p&gt;
&lt;h2 id=&quot;basics&quot;&gt;Basics&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Start with Paul Graham&apos;s pie fallacy: wealth is not finite. You can &lt;a href=&quot;http://paulgraham.com/wealth.html&quot; class=&quot;ext&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;create wealth&lt;/a&gt; by making something people want.&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;Know about &lt;a href=&quot;http://www.paulgraham.com/startupmistakes.html&quot; class=&quot;ext&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;The 18 Mistakes That Kill Startups&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Apply the scientific method to product development. The lean startup offers a path toward a minimum viable product:
&lt;ul&gt;
&lt;li&gt;[pdf] &lt;a href=&quot;http://web.stanford.edu/group/e145/cgi-bin/winter/drupal/upload/handouts/Four_Steps.pdf&quot; class=&quot;ext&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;The Four Steps to the Epiphany&lt;/a&gt; by Steve Blank. Or &lt;a href=&quot;http://www.amazon.com/gp/product/0989200507/ref=as_li_tf_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0989200507&amp;amp;linkCode=as2&amp;amp;tag=wwwsteveblank-20&quot; class=&quot;ext&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;buy the book&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;[book] &lt;a href=&quot;http://theleanstartup.com/&quot; class=&quot;ext&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;The Lean Startup&lt;/a&gt; by Eric Ries&lt;/li&gt;
&lt;li&gt;[video] &lt;a href=&quot;http://youtu.be/EMysvIXmbl0&quot; class=&quot;ext&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;This Week In Venture Capital with Eric Ries&lt;/a&gt;, author of &quot;The Lean Startup&quot;.&lt;/li&gt;
&lt;li&gt;[video] &lt;a href=&quot;http://youtu.be/2mLrNHSn-yc&quot; class=&quot;ext&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Episode #199 of This Week in Startups with Eric Ries&lt;/a&gt;, hosted by Jason Calacanis.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[book] Read &lt;a href=&quot;http://www.amazon.com/The-E-Myth-Revisited-Small-Businesses/dp/0887307280&quot; class=&quot;ext&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;The E-Myth Revisited&lt;/a&gt; by Michael E. Gerber and avoid the common pitfalls of small businesses.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;usability--product-design&quot;&gt;Usability &amp;amp; Product Design&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[book] Read &lt;a href=&quot;http://www.sensible.com/dmmt.html&quot; class=&quot;ext&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Don&apos;t Make Me Think&lt;/a&gt; by Steve Krug to understand how to design simple user interfaces.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;equity&quot;&gt;Equity&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://paulgraham.com/equity.html&quot; class=&quot;ext&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;The Equity Equation&lt;/a&gt; by Paul Graham&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://gist.github.com/isaacsanders/1653078&quot; class=&quot;ext&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Joel&apos;s Totally Fair Method to Divide Up The Ownership of Any Startup&lt;/a&gt; by Joel Spolsky&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.bothsidesofthetable.com/2011/05/09/the-co-founder-mythology/&quot; class=&quot;ext&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;The Co-Founder Mythology&lt;/a&gt; by Mark Suster&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Dole out equity with vesting according to risk taken. Have a pre-nup.&lt;/p&gt;
&lt;h2 id=&quot;strategy&quot;&gt;Strategy&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Should you grow fast, or organically? Read &lt;a href=&quot;http://www.joelonsoftware.com/articles/fog0000000056.html&quot; class=&quot;ext&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Strategy Letter I: Ben and Jerry&apos;s vs. Amazon&lt;/a&gt; by Joel Spolsky&lt;/li&gt;
&lt;li&gt;Are you building a product or a platform? &lt;a href=&quot;http://www.joelonsoftware.com/articles/fog0000000054.html&quot; class=&quot;ext&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Strategy Letter II: Chicken and Egg Problems&lt;/a&gt; by Joel Spolsky&lt;/li&gt;
&lt;li&gt;Barriers to entry are explained in &lt;a href=&quot;http://www.joelonsoftware.com/articles/fog0000000052.html&quot; class=&quot;ext&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Strategy Letter III: Let Me Go Back!&lt;/a&gt; by Joel Spolsky&lt;/li&gt;
&lt;li&gt;The 80/20 rule doesn&apos;t apply to features, so read &lt;a href=&quot;http://www.joelonsoftware.com/articles/fog0000000020.html&quot; class=&quot;ext&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Strategy Letter IV: Bloatware and the 80/20 Myth&lt;/a&gt; by Joel Spolsky&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.amazon.com/The-Hard-Thing-About-Things/dp/0062273205&quot; class=&quot;ext&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;The Hard Thing About Hard Things&lt;/a&gt; by Ben Horowitz.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;pricing&quot;&gt;Pricing&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.joelonsoftware.com/articles/CamelsandRubberDuckies.html&quot; class=&quot;ext&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Camels and Rubber Duckies&lt;/a&gt; by Joel Spolsky&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://neildavidson.com/download/dont-just-roll-the-dice/&quot; class=&quot;ext&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Don&apos;t Just Roll The Dice&lt;/a&gt; by Neil Davidson&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;profit-advanced&quot;&gt;Profit (Advanced)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[book] Understand the various types of profit by reading &lt;a href=&quot;http://www.amazon.com/The-Art-Profitability-Adrian-Slywotzky/dp/0446692271&quot; class=&quot;ext&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;The Art of Profitability&lt;/a&gt; by Adrian Slywotzky.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;read-the-greats&quot;&gt;Read the Greats&lt;/h1&gt;
&lt;p&gt;You would do well by reading everything ever written by these great entrepreneurs:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://paulgraham.com/articles.html&quot; class=&quot;ext&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Paul Graham&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.joelonsoftware.com/&quot; class=&quot;ext&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Joel Spolsky&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://steveblank.com/&quot; class=&quot;ext&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Steve Blank&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.startuplessonslearned.com/&quot; class=&quot;ext&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Eric Ries&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://sethgodin.typepad.com/&quot; class=&quot;ext&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Seth Godin&lt;/a&gt; on Marketing&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://sivers.org/&quot; class=&quot;ext&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Derek Sivers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://danieltenner.com/&quot; class=&quot;ext&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Daniel Tenner&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://calacanis.com/&quot; class=&quot;ext&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Jason Calacanis&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There&apos;s a lot more, so I&apos;ll keep updating this post over time with more curated content.&lt;/p&gt;
</content:encoded></item></channel></rss>