<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
 xmlns:content="http://purl.org/rss/1.0/modules/content/"
 xmlns:wfw="http://wellformedweb.org/CommentAPI/"
 xmlns:dc="http://purl.org/dc/elements/1.1/"
 xmlns:atom="http://www.w3.org/2005/Atom"
 xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
 xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
 xmlns:georss="http://www.georss.org/georss"
 xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#"
 xmlns:media="http://search.yahoo.com/mrss/">
<channel>
<atom:link href="https://kyleperik.com/rss.xml" rel="self" type="application/rss+xml" />
<title>Kyle's Blog</title>
<link>https://kyleperik.com</link>
<description><![CDATA[]]></description>
<language>en</language>
<lastBuildDate>Mon, 27 Apr 2026 22:15:54 -0500</lastBuildDate>
<generator>Emacs 29.1 org-publish-rss.el 0.8</generator>
<item>
<title>Understanding is Underrated</title>
<link>https://kyleperik.com/understanding_is_underrated.html</link>
<pubDate>Thu, 07 Dec 2023 18:45:58 -0600</pubDate>
<guid>https://kyleperik.com/understanding_is_underrated.html</guid>
<description>
<![CDATA[<p>
<a href="https://kyleperik.com">kyleperik.com</a>
</p>

<p>
Of all the requirements needed to accomplish a given task, "understanding" never
gets the attention it deserves.
</p>

<p>
What do I mean by understanding exactly?
</p>

<p>
I mean to develop an understanding of the problem at hand.
Develop an understanding of the technical details of what might
constitute a solution.
Develop an understanding of any tangential issues at play.
</p>

<p>
But instead, we like to take shortcuts. Maybe if we just use this cool
tool, then we
can just fix this problem and move on? Or maybe we can just copy what
these other people
are doing, I'm pretty sure they understand the problem. Or maybe I'll even try
something random and hope it works.
</p>

<p>
So maybe using a tool or copying someone else is the best option, but
how could you
possibly know that if you haven't fully understood your own problem?
While I guess you
could stumble the right answer with dumb luck, repeating this pattern
just isn't a viable long term strategy.
</p>

<p>
The result of this, chaos and complexity builds up until it hits a
breaking point,
and someone must now understand the problem AND the previous attempts
at a solution.
</p>

<p>
That's why I find it really helpful to first just ask "what is the problem" when
faced with symptoms of a potential issue.
</p>

<p>
So please, for your sake and everyone who comes after you, just think
it through,
and once you've done that, document it!
</p>
]]>
</description></item>
<item>
<title>Reading List</title>
<link>https://kyleperik.com/reading.html</link>
<pubDate>Mon, 20 Apr 2026 21:59:23 -0500</pubDate>
<guid>https://kyleperik.com/reading.html</guid>
<description>
<![CDATA[<p>
<a href="./index.html">kyleperik.com</a>
</p>

<p>
&#x2014;
</p>


<p>
Just a list of things I've found interesting by date.
</p>

<p>
Maybe I've read them already, maybe I hope to read them. Maybe I read
them a while ago and then found them again. Might include videos too.
</p>

<div id="outline-container-org9c0b58f" class="outline-2">
<h2 id="org9c0b58f">2026</h2>
<div class="outline-text-2" id="text-org9c0b58f">
</div>
<div id="outline-container-org0e777ad" class="outline-3">
<h3 id="org0e777ad">April</h3>
<div class="outline-text-3" id="text-org0e777ad">
<p>
🌐 <a href="https://wiki.xxiivv.com/site/malleable_computing">https://wiki.xxiivv.com/site/malleable_computing</a>
</p>

<p>
🌐 <a href="https://www.inkandswitch.com/malleable-software/">https://www.inkandswitch.com/malleable-software/</a>
</p>
</div>
</div>

<div id="outline-container-orgf6bf653" class="outline-3">
<h3 id="orgf6bf653">January</h3>
<div class="outline-text-3" id="text-orgf6bf653">
<p>
🌐 <a href="https://www.redblobgames.com/pathfinding/a-star/introduction.html">https://www.redblobgames.com/pathfinding/a-star/introduction.html</a>
</p>
</div>
</div>
</div>

<div id="outline-container-orgc311bec" class="outline-2">
<h2 id="orgc311bec">2025</h2>
<div class="outline-text-2" id="text-orgc311bec">
</div>
<div id="outline-container-org3695ca4" class="outline-3">
<h3 id="org3695ca4">November</h3>
<div class="outline-text-3" id="text-org3695ca4">
<p>
🌐 <a href="https://jyn.dev/the-terminal-of-the-future/">https://jyn.dev/the-terminal-of-the-future/</a>
</p>
</div>
</div>

<div id="outline-container-org35fb2cf" class="outline-3">
<h3 id="org35fb2cf">August</h3>
<div class="outline-text-3" id="text-org35fb2cf">
<p>
🌐 <a href="https://beautifulracket.com/appendix/why-lop-why-racket.html">https://beautifulracket.com/appendix/why-lop-why-racket.html</a>
</p>

<p>
🌐 <a href="https://beautifulracket.com/">https://beautifulracket.com/</a>
</p>
</div>
</div>

<div id="outline-container-orge6c4194" class="outline-3">
<h3 id="orge6c4194">April</h3>
<div class="outline-text-3" id="text-orge6c4194">
<p>
"Turning the database inside out with Apache Samza" by Martin Kleppmann
</p>

<p>
🌐 <a href="https://youtu.be/fU9hR3kiOK0">https://youtu.be/fU9hR3kiOK0</a>
</p>
</div>
</div>

<div id="outline-container-org1129cdf" class="outline-3">
<h3 id="org1129cdf">March</h3>
<div class="outline-text-3" id="text-org1129cdf">
<p>
🌐 <a href="https://www.buildyourownlisp.com/">https://www.buildyourownlisp.com/</a>
</p>
</div>
</div>

<div id="outline-container-org0aa9cab" class="outline-3">
<h3 id="org0aa9cab">February</h3>
<div class="outline-text-3" id="text-org0aa9cab">
<p>
🌐 <a href="https://www.scottsmitelli.com/articles/ideal-candidate/">https://www.scottsmitelli.com/articles/ideal-candidate/</a>
</p>
</div>
</div>
</div>

<div id="outline-container-orgb3c2c16" class="outline-2">
<h2 id="orgb3c2c16">2024</h2>
<div class="outline-text-2" id="text-orgb3c2c16">
</div>
<div id="outline-container-org52d3fcc" class="outline-3">
<h3 id="org52d3fcc">December</h3>
<div class="outline-text-3" id="text-org52d3fcc">
<p>
🌐 <a href="https://htmx.org/essays/locality-of-behaviour/">https://htmx.org/essays/locality-of-behaviour/</a>
</p>
</div>
</div>

<div id="outline-container-org0d9b221" class="outline-3">
<h3 id="org0d9b221">November</h3>
<div class="outline-text-3" id="text-org0d9b221">
<p>
🌐 <a href="https://blog.jse.li/posts/torrent/">https://blog.jse.li/posts/torrent/</a>
</p>
</div>
</div>

<div id="outline-container-org386461c" class="outline-3">
<h3 id="org386461c">October</h3>
<div class="outline-text-3" id="text-org386461c">
<p>
Rich Hickey - Simple made Easy
</p>

<p>
🌐 <a href="https://www.youtube.com/watch?v=SxdOUGdseq4">https://www.youtube.com/watch?v=SxdOUGdseq4</a>
</p>

<p>
🌐 <a href="https://wiki.xxiivv.com/site/discourse.html">https://wiki.xxiivv.com/site/discourse.html</a>
</p>

<p>
🌐 <a href="https://jakelazaroff.com/words/a-local-first-case-study/">https://jakelazaroff.com/words/a-local-first-case-study/</a>
</p>
</div>
</div>

<div id="outline-container-org63fc08e" class="outline-3">
<h3 id="org63fc08e">August</h3>
<div class="outline-text-3" id="text-org63fc08e">
<p>
🌐 <a href="https://woodgears.ca/links.html">https://woodgears.ca/links.html</a>
</p>
</div>
</div>

<div id="outline-container-org80adf42" class="outline-3">
<h3 id="org80adf42">June</h3>
<div class="outline-text-3" id="text-org80adf42">
<p>
🌐 <a href="https://arendjr.nl/blog/2024/07/post-architecture-premature-abstraction-is-the-root-of-all-evil/">https://arendjr.nl/blog/2024/07/post-architecture-premature-abstraction-is-the-root-of-all-evil/</a>
</p>

<p>
🌐 <a href="https://basecamp.com/shapeup">https://basecamp.com/shapeup</a>
</p>

<p>
Bret Victor - Inventing on Principle
</p>

<p>
🌐 <a href="https://www.youtube.com/watch?v=PUv66718DII">https://www.youtube.com/watch?v=PUv66718DII</a>
</p>
</div>
</div>

<div id="outline-container-org2174d06" class="outline-3">
<h3 id="org2174d06">March</h3>
<div class="outline-text-3" id="text-org2174d06">
<p>
🌐 <a href="https://bitbashing.io/gc-for-systems-programmers.html">https://bitbashing.io/gc-for-systems-programmers.html</a>
</p>

<p>
🌐 <a href="https://gamebalanceconcepts.wordpress.com/2010/07/07/level-1-intro-to-game-balance/">https://gamebalanceconcepts.wordpress.com/2010/07/07/level-1-intro-to-game-balance/</a>
</p>

<p>
🌐 <a href="https://tylr.fun/tyde22.pdf">https://tylr.fun/tyde22.pdf</a>
</p>

<p>
🌐 <a href="https://hazel.org/">https://hazel.org/</a>
</p>

<p>
🌐 <a href="http://lampwww.epfl.ch/papers/idealhashtrees.pdf">http://lampwww.epfl.ch/papers/idealhashtrees.pdf</a>
</p>

<p>
🌐 <a href="https://hypirion.com/musings/understanding-persistent-vector-pt-1">https://hypirion.com/musings/understanding-persistent-vector-pt-1</a>
</p>

<p>
🌐 <a href="https://www.inkandswitch.com/peritext/">https://www.inkandswitch.com/peritext/</a>
</p>

<p>
🌐 <a href="https://www.inkandswitch.com/local-first/">https://www.inkandswitch.com/local-first/</a>
</p>
</div>
</div>

<div id="outline-container-org697dd9f" class="outline-3">
<h3 id="org697dd9f">Feburary</h3>
<div class="outline-text-3" id="text-org697dd9f">
<p>
🌐 <a href="https://courses.cs.washington.edu/courses/cse503/08wi/parnas-1979.pdf">https://courses.cs.washington.edu/courses/cse503/08wi/parnas-1979.pdf</a>
</p>

<p>
🌐 <a href="https://larrysanger.org/2024/02/the-return-of-the-coders/">https://larrysanger.org/2024/02/the-return-of-the-coders/</a>
</p>

<p>
🌐 <a href="https://theconvivialsociety.substack.com/p/the-convivial-society-no-17">https://theconvivialsociety.substack.com/p/the-convivial-society-no-17</a>
</p>

<p>
🌐 <a href="https://www.roguebasin.com/index.php?title=Grid_Based_Dungeon_Generator">https://www.roguebasin.com/index.php?title=Grid_Based_Dungeon_Generator</a>
</p>

<p>
🌐 <a href="https://wiki.xxiivv.com/site/permacomputing.html">https://wiki.xxiivv.com/site/permacomputing.html</a>
</p>
</div>
</div>

<div id="outline-container-org5bb30f9" class="outline-3">
<h3 id="org5bb30f9">January</h3>
<div class="outline-text-3" id="text-org5bb30f9">
<p>
🌐 <a href="https://martinfowler.com/bliki/CQRS.html">https://martinfowler.com/bliki/CQRS.html</a>
</p>
</div>
</div>
</div>

<div id="outline-container-orge7d5b8a" class="outline-2">
<h2 id="orge7d5b8a">2023</h2>
<div class="outline-text-2" id="text-orge7d5b8a">
</div>
<div id="outline-container-org37b2617" class="outline-3">
<h3 id="org37b2617">December</h3>
<div class="outline-text-3" id="text-org37b2617">
<p>
🌐 <a href="https://internet-janitor.itch.io/decker">https://internet-janitor.itch.io/decker</a>
</p>

<p>
Jack Rusher - Stop Writing Dead Programs
</p>

<p>
🌐 <a href="https://www.youtube.com/watch?v=8Ab3ArE8W3s">https://www.youtube.com/watch?v=8Ab3ArE8W3s</a>
</p>

<p>
🌐 <a href="https://www.maria.cloud/intro">https://www.maria.cloud/intro</a>
</p>

<p>
🌐 <a href="https://github.com/SerenityOS/serenity">https://github.com/SerenityOS/serenity</a>
</p>

<p>
🌐 <a href="https://olano.dev/2023-11-30-code-is-run-more-than-read/">https://olano.dev/2023-11-30-code-is-run-more-than-read/</a>
</p>

<p>
🌐 <a href="http://kmdouglass.github.io/posts/summary-out-of-the-tar-pit/">http://kmdouglass.github.io/posts/summary-out-of-the-tar-pit/</a>
</p>

<p>
🌐 <a href="http://blog.fogus.me/2022/11/10/the-one-about-lisp-interactivity/">http://blog.fogus.me/2022/11/10/the-one-about-lisp-interactivity/</a>
</p>

<p>
🌐 <a href="https://erlang.org/download/armstrong_thesis_2003.pdf">https://erlang.org/download/armstrong_thesis_2003.pdf</a>
</p>

<p>
🌐 <a href="https://diataxis.fr/">https://diataxis.fr/</a>
</p>

<p>
🌐 <a href="http://www.call-with-current-continuation.org/strand/MANUAL">http://www.call-with-current-continuation.org/strand/MANUAL</a>
</p>
</div>
</div>
</div>
]]>
</description></item>
<item>
<title>Opinionated Guidelines for Any Codebase</title>
<link>https://kyleperik.com/code_guidelines.html</link>
<pubDate>Thu, 07 Dec 2023 18:06:21 -0600</pubDate>
<guid>https://kyleperik.com/code_guidelines.html</guid>
<description>
<![CDATA[<p>
<a href="https://kyleperik.com">kyleperik.com</a>
</p>

<p>
Credit for these ideas goes to Domain Driven Design, Martin Fowler's work and <a href="https://github.com/soniccyclone/ARF">ARF</a>, a pattern developed (but not super well documented) by my colleague.
</p>

<p>
First, a quick note. These principles do make several assumtions about the domain, and are written in a way that targets primarily backend web software. I don't expect these principles to always work well for code running very close to the hardware, or in new or obsure domains. I would encourage anyone reading this to "chew the meat and spit out the bones."
</p>

<div id="outline-container-org2485d46" class="outline-2">
<h2 id="org2485d46">An Uncompromising Paradigm</h2>
<div class="outline-text-2" id="text-org2485d46">
<p>
These guidelines describes a simple way to structure your codebase, that is both uncompromising in it's rules, yet flexible enough for most domains.
</p>

<p>
It can be simplified into 3 points:
</p>

<ul class="org-ul">
<li>Code relating to business logic should be comprised of pure functions</li>
<li>All IO (data) logic and models should be isolated from other IO logic or business logic</li>
<li>Top level orchestration logic is flat and unobscured</li>
</ul>
</div>
</div>

<div id="outline-container-org645a500" class="outline-2">
<h2 id="org645a500">But why?</h2>
<div class="outline-text-2" id="text-org645a500">
<p>
Writing code is hard. Designing codebases that both accomplish the task, and are easy to understand is hard.
</p>

<p>
But what's the reason for this instability? When you think of the real world trades, they seem to have already figured out the best ways to build a wheel. Not many people have become frustrated with the design and set out to invent a new one.
</p>

<p>
So why is it then that every day, software engineers must deal with all of these iterations of reinventions of the wheel?
</p>
</div>

<div id="outline-container-org5d3637b" class="outline-3">
<h3 id="org5d3637b">Why choose a set of principles to abide by?</h3>
<div class="outline-text-3" id="text-org5d3637b">
<p>
New code must both accomplish the desired outcome, and be easy to comprehend and work with as a team of humans.
</p>

<p>
It takes enough cognitive load to consider everything that must be done to create a new service by itself, let alone decide on what principles to follow when it comes to architecture. A simple set of guidelines can help immensely off load this in the same way the python formatter <code>black</code> makes all the formatting decisions for us.
</p>
</div>
</div>

<div id="outline-container-orgf570f8f" class="outline-3">
<h3 id="orgf570f8f">Benefits to the recommended principles</h3>
<div class="outline-text-3" id="text-orgf570f8f">
<p>
"Good fences make good neighbors"
</p>

<p>
These principles dictate most importantly that that good abstractions are built around the core domain. Giving your business logic a little love in the beginning will allow the business logic to love you back in the end.
</p>

<p>
The benefits of the proposed guidelines can be summed up into 3 things: Readability, Testing and Conducive to change
</p>
</div>

<div id="outline-container-org077b5f8" class="outline-4">
<h4 id="org077b5f8">Readability</h4>
<div class="outline-text-4" id="text-org077b5f8">
<p>
The orchestration layer reads like a script or recipe, and business logic is boiled down to the core logic, making it easier to digest.
</p>
</div>
</div>

<div id="outline-container-orga4d3782" class="outline-4">
<h4 id="orga4d3782">Testing</h4>
<div class="outline-text-4" id="text-orga4d3782">
<p>
The primary benefit we achieve with the proposed principles is ease of unit testing and integration testing for different but similar reasons.
</p>

<p>
When the business logic is written as a set of pure functions, there are no side effects, that means mocking is not strictly necessary. Use cases can be succinct and run without reliance on any database. Small and easy unit tests means they're easier to write, that means use cases will tend to be tested more thoroughly resulting in a more comprehensive testing suite.
</p>

<p>
When the top level "orchestration logic" is mainly flat (meaning minimal control flow), and all of the important use cases are tested with unit tests, this unlocks potential for solid integration testing. Integration tests must only verify that the data layer is being evoked in an appropriate way, and that the data is making it through the business logic and returned. This means less integration tests are needed, and this results in a quick test suite.
</p>
</div>
</div>

<div id="outline-container-org7624761" class="outline-4">
<h4 id="org7624761">Conducive to change</h4>
<div class="outline-text-4" id="text-org7624761">
<p>
Any code which cannot be scrapped and rewritten again with confidence should be scrapped and rewritten again. (I'm being melodramatic)
</p>

<p>
My point is, with good enough testing, anything can be changed with confidence. This also means iterative adjustment and addition is simple as well as long as the guidelines continue to be adhered to.
</p>

<p>
Data logic when well abstracted can also be swapped out with new implementations.
</p>
</div>
</div>
</div>

<div id="outline-container-org7b560d4" class="outline-3">
<h3 id="org7b560d4">Style Preference</h3>
<div class="outline-text-3" id="text-org7b560d4">
<p>
There's a lot of flame wars, and ways programmers tend to divide themselves. What editors to use, what distro you're repping, "Functional vs Object Oriented", cloud services, reactive frameworks, web frameworks, databases, the list goes on and on.
</p>

<p>
In order to mature as an industry, one big thing we're all going to have to do is to drop these hot debates. Ego is the biggest contributer to code stink I have seen in my experience.
</p>

<p>
You see this especially prevalent when someone has been "burned" by a particular poorly implemented pattern. What often happens is they become disallusioned and forget any positive aspects of the system, and start using the complete opposite of that pattern.
</p>

<p>
As it turns out, some patterns are better than others at addressing certain problems. Functional programming is great for writing logic and handling streams of data. Do you know what it's not good at? Functional programming sucks at interfacing with external systems, like caling APIs or working with the database. And there's a reason for this, becasue Functional programming specifically strives to <i>elliminate</i> side effects, when in essence that is literally what a database is. The database is like one big side effect.
</p>

<p>
So how are these guidelines helping? Well, this holistic approach does not prescribe any sort of framework or style. In fact it encouranges the mixing of styles depending on the context your code is in. If you find that your orchestration logic is really well suited to a procedural style, then forget about your declarative ideals for a minute and write some subroutine calls.
</p>
</div>
</div>
</div>

<div id="outline-container-orgf535ae5" class="outline-2">
<h2 id="orgf535ae5">Guidelines</h2>
<div class="outline-text-2" id="text-orgf535ae5">
</div>
<div id="outline-container-org9c973d6" class="outline-3">
<h3 id="org9c973d6">Categorizations of Logic</h3>
<div class="outline-text-3" id="text-org9c973d6">
<p>
There are 4 types of logic/layers to define: Data, Business, Orchestration and Presentation, each with different concerns and responsibilities.
</p>
</div>

<div id="outline-container-orgd1c0053" class="outline-4">
<h4 id="orgd1c0053">Data</h4>
<div class="outline-text-4" id="text-orgd1c0053">
<p>
Data logic is logic concerned with external systems. These purely logistical concerns include pretty much any form of IO: SQL, ORM, external apis, file IO, etc.
</p>

<p>
Data logic serves the needs of the business, but does not execute any business logic on its own. This relationship is purely transactional, with a strong or loose interface depending on the desired coupling. This coupling or lack thereof should be optional given some IO may be more inherent to the problem space. Others may specifically require less commitment.
</p>

<p>
Depending on the use case, using methods on objects can work pretty well to encapsulate the external logic to tell a better story for the orchestration layer. (you see this with ORMs or API clients).
</p>

<p>
Note: Data logic of one kind must be isolated from data logic from another. i.e. no mixing ORM logic (or models!) with api logic. If coordination is needed between this data logic, it can be done in the Orchestration layer, and any pure business logic can be separated into the business logic layer.
</p>
</div>
</div>

<div id="outline-container-org6e13102" class="outline-4">
<h4 id="org6e13102">Business</h4>
<div class="outline-text-4" id="text-org6e13102">
<p>
<i>AKA the Domain layer</i>
</p>

<p>
Business logic represents code concerned with the needs and the intrinsic complexity that comes with the business. This is the core logic that must work according to the business specifications. Because of the inherent coupling to the business, this code should be isolated from any external systems and concerns not inherent to the business. This should materialize as a set of pure functions which are in charge of the transition of data from one form into another. It is expected that the business logic scales linearly along with the complexity and scope of the features and value shipped.
</p>

<p>
Under no circumstances should Data logic enter the realm of Business logic. This inherently creates side effects within the business logic or at least anything relying on that logic will no longer be considered a pure function. Note that this includes working with objects tightly coupled to the external systems, or especially interacting with objects that with methods which interact with external systems. One good exception would be logging.
</p>

<p>
Business logic works best when the code is purely functional, being simple to unit test without mocks. Many use cases can be run without any load on the DB or other external systems. OOP works very poorly here in my experience (let me know if you find a case where OOP works well here). Although there is no need to specifically forbid OOP within business logic, as long as this does not result in side effects outside of the course of operation.
</p>
</div>
</div>

<div id="outline-container-org1fbd3d9" class="outline-4">
<h4 id="org1fbd3d9">Orchestration</h4>
<div class="outline-text-4" id="text-org1fbd3d9">
<p>
<i>AKA the Service layer</i>
</p>

<p>
Orchestration logic should be the smallest layer of them all, concerned only with working with each part to orchestrate a process. Think of it like snapping together legos, or writing a script. Orchestration logic controls the major moving parts working together to produce a result or perform a task.
</p>

<p>
Orchestration can include data or business logic, as it's inherently coupled with both. In fact, leaving simple in data logic can help with readability. In essence, this function should tell the story of the data from beginning to end. If either business or data logic grows too large within the Orchestration layer, it must be abstracted out into the respective layers.
</p>
</div>
</div>

<div id="outline-container-org2e344c0" class="outline-4">
<h4 id="org2e344c0">Presentation</h4>
<div class="outline-text-4" id="text-org2e344c0">
<p>
Presentation logic is represented in an additional layer of any system, also known as view logic. This logic can be treated similarly to the data layer. It is concerned with external systems, but the dependency is opposite. Presentation logic should avoid dealing with data/business logic directly and pass down to the orchestration layer as soon as possible. Although this is not strictly forbidden.
</p>
</div>
</div>
</div>


<div id="outline-container-org2391896" class="outline-3">
<h3 id="org2391896">Categorizations of Data</h3>
<div class="outline-text-3" id="text-org2391896">
<p>
Similar to logic, data can take various forms which couple to concerns more or less than others. Arguably how we define data is more important than the structure of logic or layers of code. It can be more difficult to do this though, since data is the bloodstream of any codebase, and tends to be shared more than we intend. I’d like to define just 2 types of data here.
</p>
</div>

<div id="outline-container-org03024eb" class="outline-4">
<h4 id="org03024eb">Data models</h4>
<div class="outline-text-4" id="text-org03024eb">
<p>
Data models are the unique data logic specific models for each respective data logic module. These models are strongly coupled to the data logic, and therefore should never be used directly in Business logic. Similarly, data models of one kind should not be used directly with data logic of a different kind. Data models tend to be conducive to OOP, so methods can be a good way used to operate on the data.
</p>
</div>
</div>

<div id="outline-container-orgd259537" class="outline-4">
<h4 id="orgd259537">Domain models</h4>
<div class="outline-text-4" id="text-orgd259537">
<p>
Domain models provide a domain-specific protocol for working with data within the business logic. If any data must be worked with business logic or other kinds of data logic, corresponding domain models should be used. These models allow the code to work with and transform data without being tied to any specific external system. Domain models should preferably be made up of immutable data structures only. Mutation can often times increase complexity and cause implicit side effects. Like mentioned earlier, OOP is not forbidden and can be used as long as it doesn't result in side effects outside of the operation.
</p>

<p>
Domain models can and should be named intentionally to be assist with building the use case or story (See <a href="https://en.wikipedia.org/wiki/Domain_model">domain models on wikipedia</a>)
</p>

<p>
Domain models can feel excessive if always used. It’s recommended to use them only when the data cannot be extracted from the data models cleanly. For example, there’s not much need for a “company” domain model unless the domain is directly concerned with companies, because we can extract all we need (the company id, name etc) directly off of the model in the orchestration layer. Domain models only really become a need when the data is more than just a single record with basic field types.
</p>
</div>
</div>
</div>
</div>

<div id="outline-container-orgd9eea53" class="outline-2">
<h2 id="orgd9eea53">An Example</h2>
<div class="outline-text-2" id="text-orgd9eea53">
<p>
Django doesn't always make it easy to separate ORM, templating and business logic. For this reason, these guidelines aren't conducive to django templates, and would prefer a reactive frontend framework.
</p>

<p>
An example of a django app structure is something like this
</p>

<pre class="example">
app
├── urls       - Presentation layer
├── views      - Presentation layer
├── service    - Orchestration layer
├── types      - Domain models
├── logic      - Domain layer
├── db         - Data layer
├── models     - Data models
├── api        - Data layer
└── api_types  - Data models
</pre>
</div>
<div id="outline-container-orga9fa7b9" class="outline-4">
<h4 id="orga9fa7b9">Example Details</h4>
<div class="outline-text-4" id="text-orga9fa7b9">
<p>
It's encouraged to split out into other django apps if "vertical slices" appear
</p>

<p>
<code>app.types</code> would contain the classes to contain your logic for the domain layer. Dataclasses work well, but <code>nametuple</code>, <code>TypedDict</code> or just regular python classes work well too.
</p>

<p>
Similarly <code>app.api_types</code> is for types which will be sent to or from api calls. This isn't necessary, but It's nice to define what these are, rather than guessing at whatever point in code the data is extracted, running a higher risk of ~KeyError~s. An added bonus is you could link to documentation in the code as a reference. To reiterate, this may be completely unnecessary if you're only calling a couple trivial apis, so do what makes sense for your project here.
</p>

<p>
<code>app.api</code> defines methods to make api calls. Most of the time these methods should accept either basic values or domain models, and be responsible for mapping to <code>app.api_types</code>. The reason being that if <code>app.api</code> or <code>app.api_types</code> isn't responsible for controlling the protocol, some other module is, which means they're coupled.
</p>

<p>
<code>app.db</code> is similar to <code>app.api</code> in that it should usually accept simple values or domain models, then return domain models. There's nothing wrong with returning ORM models from these methods, as long as they're only used in the orchestration layer and don't make their way into other data or business logic.
</p>

<p>
<code>app.logic</code> can really be named anything depending on the logic, and if there is any substantial logic there, it should be split into multiple modules and maybe apps. This represents the business logic, and it's a bit more strictly defined. It's similar to the last two data modules, except it must not incur any side effects.
</p>

<p>
<code>app.service</code> is the orchestration layer which ties everything together. This layer should be very small. It consumes methods in <code>app.api</code>, <code>app.db</code> and <code>app.logic</code> to perform tasks or generate results.
</p>

<p>
Then <code>app.views</code> and <code>app.urls</code> is what's left, they're just the presentation layer which ties into <code>app.service</code> (it can tie in directly to <code>app.db~/~app.models.</code> for simple views, or DRF views, since DRF is handling the logic).
</p>

<p>
A quick note on Django Rest Framework. DRF works well for simple CRUD applications, but most of the time we're not building simple CRUD apps, and there's some nuance there. This should be identified early, and we should try to avoid turning our Serializers into mega classes that run all of the api/db and logic.
</p>
</div>
</div>
</div>
]]>
</description></item>
<item>
<title>Garden 2022</title>
<link>https://kyleperik.com/garden_2022.html</link>
<pubDate>Thu, 07 Dec 2023 21:06:44 -0600</pubDate>
<guid>https://kyleperik.com/garden_2022.html</guid>
<description>
<![CDATA[<p>
<a href="https://kyleperik.com">kyleperik.com</a>
</p>

<div id="outline-container-orgd884c77" class="outline-2">
<h2 id="orgd884c77">New home</h2>
<div class="outline-text-2" id="text-orgd884c77">
<p>
Since 2020, I've been creating a write up on how my garden went over the course of each year.
</p>

<p>
This year things were a bit different, because we moved!
</p>


<div id="orgff910d5" class="figure">
<p><img src="garden_2022/2022-11-07_19-38-20_IMG_20220720_110212_DRO.jpg" alt="2022-11-07_19-38-20_IMG_20220720_110212_DRO.jpg" />
</p>
</div>

<p>
Here we have almost 3 acres, where the previous owners had planted &gt;100 fruit trees and perennials.
</p>

<p>
It's the end of the year here now in November 2022, just 1 year and a month since we moved in.
Over this past year I've been dedicated to observing, identifying and learning.
</p>

<p>
For the sake of the previous owners, and for myself I don't feel right forcing my vision on what everything
should look like right away. For that reason, I've made minimal changes to the landscape and the trees.
</p>
</div>
</div>

<div id="outline-container-org9526f71" class="outline-2">
<h2 id="org9526f71">The Garden</h2>
<div class="outline-text-2" id="text-org9526f71">
<p>
We did try our best to grow some veggies/annuals in a small garden.
Honestly though, this went way worse than we were expecting.
Thinking back about all the things that went wrong, it's kind of demoralizing, so I'll spare you 😅
</p>

<p>
We ended up with some squash
</p>


<div id="org809bb5e" class="figure">
<p><img src="garden_2022/2022-11-07_19-37-01_IMG_20221008_161824_DRO.jpg" alt="2022-11-07_19-37-01_IMG_20221008_161824_DRO.jpg" />
</p>
</div>

<p>
Zinnias
</p>


<div id="org9b18ab7" class="figure">
<p><img src="garden_2022/2022-11-07_19-37-38_IMG_20220803_101037_DRO.jpg" alt="2022-11-07_19-37-38_IMG_20220803_101037_DRO.jpg" />
</p>
</div>

<p>
There were also snapdragons, kale and bok choy which did well.
</p>

<p>
70% of what we seeded ended up dead whether from bad potting mix, to planting directly into mulch, lack of watering etc.
</p>

<p>
I'm grateful for what did succeed which leaves me with some pride to hold onto as a gardener.
</p>
</div>
</div>

<div id="outline-container-org98d74ae" class="outline-2">
<h2 id="org98d74ae">The Orchard</h2>
<div class="outline-text-2" id="text-org98d74ae">
<p>
What really blew us away was the sheer amount of fruit we were able to get from the trees which were already there.
It's humbling contrasting how much we worked to try to create the small annual garden, with the abundance
which was just built into the property, waiting to ripen and be picked.
Brady and Brandon, you have our sincere thanks for planting the trees 🌳
</p>

<p>
Our first fruit from the fruit trees, Early August
</p>


<div id="org16f2dda" class="figure">
<p><img src="garden_2022/2022-11-07_19-44-23_IMG_20220807_124009_DRO.jpg" alt="2022-11-07_19-44-23_IMG_20220807_124009_DRO.jpg" />
</p>
</div>


<p>
The white peaches were delicious! Many were preserved by dehydrating, or freezing.
</p>


<div id="org0422d32" class="figure">
<p><img src="garden_2022/2022-11-07_19-52-05_IMG_20220909_100743_DRO.jpg" alt="2022-11-07_19-52-05_IMG_20220909_100743_DRO.jpg" />
</p>
</div>


<p>
About a dozen pears harvested total from 2 trees. We savored them given the limited quantity for eating out of hand.
</p>


<div id="orge9e2f99" class="figure">
<p><img src="garden_2022/2022-11-07_19-57-00_IMG_20220803_101642_DRO.jpg" alt="2022-11-07_19-57-00_IMG_20220803_101642_DRO.jpg" />
</p>
</div>


<p>
2 Wheelbarrows full of apples all through October. Many were frozen and dehydrated, and a good portion were juiced for cider making.
</p>


<div id="org255db9d" class="figure">
<p><img src="garden_2022/2022-11-07_19-53-54_IMG_20221008_161905_DRO.jpg" alt="2022-11-07_19-53-54_IMG_20221008_161905_DRO.jpg" />
</p>
</div>
</div>
</div>


<div id="outline-container-org50085e0" class="outline-2">
<h2 id="org50085e0">Flowers</h2>
<div class="outline-text-2" id="text-org50085e0">
<p>
The naturalistic beauty of the landscape is one of my favorite parts of the land.
I tried my best to capture any moment and season of bloom throughout the year.
</p>

<p>
Lupine, absolutely photobombed by thistles
</p>


<div id="orgb42f198" class="figure">
<p><img src="garden_2022/2022-11-07_20-03-28_IMG_20220610_104357_DRO.jpg" alt="2022-11-07_20-03-28_IMG_20220610_104357_DRO.jpg" />
</p>
</div>


<p>
Crown vetch
</p>


<div id="org88b774e" class="figure">
<p><img src="garden_2022/2022-11-07_20-03-58_IMG_20220616_164223_DRO.jpg" alt="2022-11-07_20-03-58_IMG_20220616_164223_DRO.jpg" />
</p>
</div>


<p>
Milkweed
</p>


<div id="org6185377" class="figure">
<p><img src="garden_2022/2022-11-07_20-04-42_IMG_20220625_140818_DRO.jpg" alt="2022-11-07_20-04-42_IMG_20220625_140818_DRO.jpg" />
</p>
</div>

<p>
The front garden with lily, mint and several other things I haven't identified yet 🙂
</p>


<div id="orge990056" class="figure">
<p><img src="garden_2022/2022-11-07_20-05-02_IMG_20220628_114240_DRO.jpg" alt="2022-11-07_20-05-02_IMG_20220628_114240_DRO.jpg" />
</p>
</div>

<p>
Soap wort I believe, with queen anne's lace in the forefront
</p>


<div id="org2f1fcbb" class="figure">
<p><img src="garden_2022/2022-11-07_20-07-13_IMG_20220708_111039_DRO.jpg" alt="2022-11-07_20-07-13_IMG_20220708_111039_DRO.jpg" />
</p>
</div>

<p>
These are two of my favorite pictures. There are so many layers represented, composed of wildflowers and trees.
It's a wild look, but there is a lot of character here.
</p>


<div id="org9b1bc7c" class="figure">
<p><img src="garden_2022/2022-11-07_20-08-54_IMG_20220919_165909_DRO.jpg" alt="2022-11-07_20-08-54_IMG_20220919_165909_DRO.jpg" />
</p>
</div>


<div id="org2b30866" class="figure">
<p><img src="garden_2022/2022-11-07_20-10-47_IMG_20220920_183246_DRO.jpg" alt="2022-11-07_20-10-47_IMG_20220920_183246_DRO.jpg" />
</p>
</div>
</div>
</div>
]]>
</description></item>
<item>
<title>Garden 2023</title>
<link>https://kyleperik.com/garden_2023.html</link>
<pubDate>Fri, 22 Dec 2023 10:08:42 -0600</pubDate>
<guid>https://kyleperik.com/garden_2023.html</guid>
<description>
<![CDATA[<p>
<a href="https://kyleperik.com">kyleperik.com</a>
</p>

<div id="outline-container-orgdc5877f" class="outline-2">
<h2 id="orgdc5877f">Spring</h2>
<div class="outline-text-2" id="text-orgdc5877f">

<div id="orga3da490" class="figure">
<p><img src="garden_2023/crabapple.jpg" alt="crabapple.jpg" />
</p>
</div>
</div>

<div id="outline-container-org188c00e" class="outline-3">
<h3 id="org188c00e">Garden</h3>
<div class="outline-text-3" id="text-org188c00e">

<div id="org95ce165" class="figure">
<p><img src="garden_2023/trellis.jpg" alt="trellis.jpg" class="float" />
</p>
</div>

<p>
We've scaled back quite a bit this year with the garden, focusing on cultivating only a small
area right out front. In addition, we've hauled a couple of loads of horse manure from a
nearby small horse farm.
</p>

<p>
Most of the manure was applied right on top of cardboard which was laid in a single 5ft wide bed
spanning about 20 feet.
</p>

<p>
In it we planted some tomato, tomatillo, hot and bell peppers, beets, kale, potatoes and peas.
Later we planted beans, cucumbers and squash.
</p>

<p>
Next to this bed we've been weeding (there's lots of wild lettuce, burdock, thistle
and maple saplings in the area)
and replacing with some flowers: sunflower, hollyhock and chamomile. In the area we planted some
clearance perennials from the hardware store in along with the other perennial flowers planted there.
</p>

<p>
We hope to continue to transform the area into self seeding flowers intermixed with fruiting shrubs
and other perennials with a stable ground cover.
</p>

<p>
On the other side of our direct front, we've been transplanting various berry varieties in hopes to
establish a more cultivated berry area. Including: strawberries, pineberries, black raspberries
red raspberries, tayberries, currants and goji berries. Also we planted a asparagus plants
from the farmers market last year. Most did well, the area required more fertility, but thankfully
the plants are pretty low maintenance.
</p>

<p>
We bought way too many potatoes for seeding this year, I couldn't stand to throw away the excess,
so I planted some in the food forest further out and some in the rotted chicken manure pile.
They all came up and are doing well, especially in the manure pile.
</p>
</div>
</div>

<div id="outline-container-org51649d7" class="outline-3">
<h3 id="org51649d7">Harvests</h3>
<div class="outline-text-3" id="text-org51649d7">

<div id="orgbea920c" class="figure">
<p><img src="garden_2023/goji-bloom.jpg" alt="goji-bloom.jpg" class="float" />
</p>
</div>

<p>
There's not much available this time of year, besides sunchokes (which are pretty quite abundant by
now, but we're continuing to let them spread). Berries just really started rolling at the end of
June, our strawberries have suffered from lack of fertility and care (hopefully this will improve).
</p>

<p>
So far here's what's fruited: naking cherry, goumi berry, black raspberry, some strawberry,
goji berry.
In late June, still waiting on: currant, gooseberry, red raspberry, tayberry
</p>
</div>
</div>


<div id="outline-container-org04c2d51" class="outline-3">
<h3 id="org04c2d51">Food Forest</h3>
<div class="outline-text-3" id="text-org04c2d51">
<p>
This winter was rough for our apple trees, I think I made the mistake of removing some nets
too early, so rabbits ate the bark many of the young apple trees. To compensate, I pruned these
trees pretty hard. They're leafing out, but not nearly as vigorous as previous years. I just hope
they don't rot out, and are able to grow again from the stump! I will definitely replace the netting
so the rabbits can't get to them next winter.
</p>

<p>
I have tried starting some Asian pear seedlings (from last years harvest). I had a decent success
rate cold stratifying in the fridge in a bag of dirt, and planting into tall soil modules.
I ended up with about 6 in the end (from ~12 successful seedlings) as some failed upon transplant.
They're doing alright so far.
</p>

<p>
I also cold stratified quite a number of peach and apricot seedlings, which didn't sprout as
readily as the pears (also I forgot about them). In late June I've put them out on the counter
to sprout.
</p>

<p>
Many of the stone fruit trees around the property I pruned pretty hard. This caused an explosion
of growth, that I will likely prune again in summer. I'd prefer if the trees stayed smaller
for picking, and ease of future pruning. Some trees seem to be getting leaf curl, a fungal
infection. It's not too bad for the most part. I hope the pruning will help let in sunshine and
wind to help counteract the infection.
</p>

<p>
Our old apple tree that is supposed to only fruit every other year is fruiting for it's second
year in a row! From my research this habit is likely due to being unpruned, resulting in over fruiting
in one year causing the swing in the other direction the following. I think my pruning helped!
</p>


<div id="org60f4627" class="figure">
<p><img src="garden_2023/honey-locust-pollard.jpg" alt="honey-locust-pollard.jpg" class="float" />
</p>
</div>

<p>
Additionally this year I have been cutting back comfery which has been very prolific to mulch
surrounding trees. In addition I've pollarded several of the honey locusts around the property
to also much the fruit trees. This has helped keep the soil really moist with minimal weeds.
</p>

<p>
This year to make things more comfortable I've been pretty diligent with cutting back thistles
and other annoying plants with my machete and sickle.
In addition I've been mowing more trails through, making it easier to access the groups of
fruit trees.
</p>

<p>
This year is the first year that quince has fruited substantially, I'm looking forward to
seeing what it turns out to be like! Also sea buckthorn is fruiting for the first time on
a couple of trees.
</p>

<p>
I pruned the pears back pretty hard as well, and they're responding by putting out lots of
new leaves and fruit. This succulent growth is attracting some aphids, but the ladybugs
can be seen prolifically cleaning up well enough, I'm not concerned.
</p>


<div id="org43d9093" class="figure">
<p><img src="garden_2023/wild-plums-bloom.jpg" alt="wild-plums-bloom.jpg" />
</p>
</div>
</div>
</div>
</div>

<div id="outline-container-org59f075b" class="outline-2">
<h2 id="org59f075b">Summer</h2>
<div class="outline-text-2" id="text-org59f075b">

<div id="orgd799b95" class="figure">
<p><img src="garden_2023/wild-plum-grape.jpg" alt="wild-plum-grape.jpg" />
</p>
</div>

<p>
Just some musings from this summer
</p>
</div>

<div id="outline-container-orgc2db575" class="outline-3">
<h3 id="orgc2db575">Intentionally</h3>
<div class="outline-text-3" id="text-orgc2db575">
<p>
The theme I set out for this year was intentionally. When we
bought this 2.8 acre property in fall 2022, it was wild, and it
still is. Like a Midwestern jungle, I love it.
</p>

<p>
But in the chaos, there is always room for intentionally. It's
tricky though, to bring order in the midst of chaos while retaining
the character of the landscape. It's actually pretty easy to wipe
out all character, just mow everything, apply herbicide &amp; pesticide
to anything that looks like it "doesn't belong" and seed turf
grass, but that's not my intention.
</p>

<p>
So what was my intention? To cultivate a comfortable, fruitful,
lush place that myself and others would want to spend time in. I
also want to accomplish this without becoming reliant on external
inputs.
</p>
</div>
</div>

<div id="outline-container-org0dbe087" class="outline-3">
<h3 id="org0dbe087">Inspect and Adapt</h3>
<div class="outline-text-3" id="text-org0dbe087">
<p>
turns out, coming to this place is a very iterative process, as
first of all, I don't know exactly what kind of place I want to
spend time in. This is where biodiversity and chaos helps. The
landscape is constantly giving feedback, in every season and
proving it's value in the ecosystem. Black raspberries show us
every spring why I love wandering out back.
</p>


<div id="org1b8c0fc" class="figure">
<p><img src="garden_2023/dragonfly.jpg" alt="dragonfly.jpg" />
</p>
</div>

<p>
But it's not always so obvious how each plant, fungus, insect,
bacteria or animal provides value, but it's well known that every
one plays an important role. Even noxious weeds, they all
proliferate for a reason. Burdock is hated by many, growing in
neglected patches behind garages and in lawns, then attaching their
velcro seeds onto pets, shoes and clothing. But without burdock
opportunistically hitching rides and filling in spots of earth and
sunshine, it's not obvious whether those slices would have been
filled at all. Bare earth and wasted sunshine is more costly than
any noxious weed to an ecosystem.
</p>


<div id="orgce3985a" class="figure">
<p><img src="garden_2023/harmless-thistle.jpg" alt="harmless-thistle.jpg" class="float" />
</p>
</div>

<p>
But on the other hand, there are species that establish and steal
resources from others, or unnecessarily worsen the environment more
quickly than it can be reestablished. Being able to grade species
in this way requires a lot of perception and research, and even
then, it's not obvious how to proceed.
</p>
</div>
</div>

<div id="outline-container-org398a891" class="outline-3">
<h3 id="org398a891">What I've learned in improving the landscape</h3>
<div class="outline-text-3" id="text-org398a891">
<p>
The first rule: Be perceptive, actively observing in all seasons,
and research!
</p>

<p>
The easy answer again is total annihilation of unwanted species,
but I can hardly see a case where that is best. What I've found to
be most helpful is to look in each area and consider the following:
</p>

<ol class="org-ol">
<li>Is there anything suffering that can use help?</li>
<li>Are there any resource hogs?</li>
<li>Any noxious weeds?</li>
</ol>

<p>
Then, remove any resource hogs and noxious weeds for the plants
that need help. But remember, if removing those plants would result in bare
earth, it might be worth reconsidering, or finding a plant better
suited to fill that niche in that area first, otherwise you'll be
fighting an uphill battle.
</p>

<p>
It's important to keep in mind, you should feel still feel
comfortable in your jungle. Mowing paths between areas has been
helpful to provide easier access to otherwise hidden areas,
allowing myself and others to enjoy walking through. Again, you
need to first be able to perceive your landscape.
</p>


<div id="org63c3f04" class="figure">
<p><img src="garden_2023/aster.jpg" alt="aster.jpg" class="float" />
</p>
</div>

<p>
Observing season after season, year after year gives nature a
chance to surprise me, like every fall when a flood of asters
bloom, (what for the rest of the year otherwise might have been
deemed a weed)
</p>
</div>
</div>
</div>

<div id="outline-container-org2da2d1f" class="outline-2">
<h2 id="org2da2d1f">Fall</h2>
<div class="outline-text-2" id="text-org2da2d1f">
<p>
We had a disappointing fall. The few apples that had grown on
the old apple tree were no good to eat, and many of the stone fruits
didn't end up fruiting. Those that did turned out to be just root stock,
and not good to eat. Odd weather in spring could be the culprit
there, or maybe last year we were especially blessed with a big
harvest. Either way, I'm hopeful for the future, many of our trees
are growing strong.
</p>

<p>
We did get a pretty big harvest from our two small quince trees. I
have never had quince before, but I processed into quince butter,
and it's pretty dang good.
</p>


<div id="orgb116dfd" class="figure">
<p><img src="garden_2023/quince-bloom.jpg" alt="quince-bloom.jpg" />
</p>
</div>

<p>
From the garden, we neglected to properly protect it from the
chickens, so while they helped prepping it for next year, our harvest
wasn't so good. Most of our plants did well despite this, but the
chickens got first dibs on the tomatoes. In preparation for next
year I laid down a layer of rotted wood chips and surrounded a
row with 2 feet of chicken wire.
</p>
</div>
</div>

<div id="outline-container-org0c4ceec" class="outline-2">
<h2 id="org0c4ceec">Gallery</h2>
<div class="outline-text-2" id="text-org0c4ceec">
<p>
<img src="garden_2023/mimosa.jpg" alt="mimosa.jpg" />
<i>mimosa (who knew they grew in zone 5?), nitrogen fixer</i>
</p>

<p>
<img src="garden_2023/rudbeckia.jpg" alt="rudbeckia.jpg" />
<i>some rudbeckia?</i>
</p>

<p>
<img src="garden_2023/wild-plum-bloom-close.jpg" alt="wild-plum-bloom-close.jpg" />
<i>wild plum in bloom</i>
</p>

<p>
<img src="garden_2023/violet.jpg" alt="violet.jpg" />
<i>violets - very pretty yet humble ground cover</i>
</p>

<p>
<img src="garden_2023/comfrey.jpg" alt="comfrey.jpg" />
<i>comfrey - permaculturists best friend - great noxious weed replacement</i>
</p>

<p>
<img src="garden_2023/moss.jpg" alt="moss.jpg" />
<i>moss in early spring</i>
</p>

<p>
<img src="garden_2023/sea-buckthorn.jpg" alt="sea-buckthorn.jpg" />
<i>sea buckthorn - medicinal berry and nitrogen fixer - we got a few
this year!</i>
</p>

<p>
<img src="garden_2023/caterpillar.jpg" alt="caterpillar.jpg" />
<i>What kind of caterpillar is this?</i>
</p>
</div>
</div>
]]>
</description></item>
<item>
<title>Rethinking Control Flow</title>
<link>https://kyleperik.com/rethinking_control_flow.html</link>
<pubDate>Sat, 16 Mar 2024 10:07:35 -0500</pubDate>
<guid>https://kyleperik.com/rethinking_control_flow.html</guid>
<description>
<![CDATA[<p>
<a href="https://kyleperik.com">kyleperik.com</a>
</p>

<div id="outline-container-org42d290e" class="outline-2">
<h2 id="org42d290e">Assumptions about Program Structure and Execution</h2>
<div class="outline-text-2" id="text-org42d290e">
<p>
Programs have long been defined by their execution rather than their
purpose or problem domain. In recent years, thinking has shifted
towards more declarative syntax that is more suited to the specific
domain of problems at hand.
</p>

<p>
Even still, I believe there are other techniques of thinking and
programming for different problem spaces that have been left
largely unexplored.
</p>
</div>

<div id="outline-container-orgc8432cf" class="outline-3">
<h3 id="orgc8432cf">Mapping out Control Flow</h3>
<div class="outline-text-3" id="text-orgc8432cf">
<p>
Control Flow is a term used when describing the path of program
execution. While it is necessary, by definition, control flow
should be de-emphasized in declarative
programming. Yet, I believe micromanaging control flow
still plays an active role in even the most functional programs
today.
</p>

<p>
Consider the following pseudo code
</p>

<pre class="example">
function count (text) {
        words = split(text)
        return length(words)
}

result = count('foo bar baz')
log(result)
</pre>

<p>
Now consider the flow of execution.
</p>

<p>
Simple enough, we just read from top to bottom (jumping as
needed). First count is called, which calls split, then length, returning
the result, which is given to log to print.
</p>

<p>
Now slightly a different question, what does the dataflow look like?
</p>

<p>
'foo bar baz' -&gt; count ( split -&gt; length ) -&gt; log
</p>

<p>
Looking at this one liner, this feels like a nice way to understand
the execution and flow of data, but it doesn't match up exactly with
the top-to-bottom layout.
So even despite the lack of control flow operations like loops,
conditionals or lambdas, it can take effort to extract and understand
the data flow.
</p>

<p>
To further contrast, the simple arrows show the execution pointer
moving down, yet the data is jumping all over the place:
</p>


<div id="org4d008ee" class="figure">
<p><img src="control_vs_dataflow.png" alt="control_vs_dataflow.png" style="width: 40rem" />
</p>
</div>

<p>
For me, when I'm trying to debug some code, the first thing I try to
do is to understand where the data is coming from and where is it
going. This allows a divide and conquer approach, that ensures
O(log(n)) dev time to find the discrepancy.
</p>
</div>
</div>
</div>

<div id="outline-container-org4382824" class="outline-2">
<h2 id="org4382824">Flow</h2>
<div class="outline-text-2" id="text-org4382824">
<p>
There are several ways of avoiding this problem in practice, but today I
will recommend checking out a rare paradigm.
</p>

<p>
The technique is replicated in several domains, but has yet to be
unified under a paradigm besides generically "declarative". Some
include Functional Reactive Programming, Reactive frontend
frameworks, spreadsheets, message passing
systems such as Erlang, and service oriented architectures
on a more meta level. I'd recommend these systems be unified as
sub classes under
<a href="https://jpaulm.github.io/fbp/index.html">Flow Based Programming</a>,
which has existed since the 1970's (as most ideas in programming
have).
</p>

<p>
What makes this paradigm distinct from most, even other declarative
programming paradigms, is it promotes the flow of data to become a
first class citizen.
</p>
</div>


<div id="outline-container-org2e1e4d9" class="outline-3">
<h3 id="org2e1e4d9">Mapping out Data Flow</h3>
<div class="outline-text-3" id="text-org2e1e4d9">
<p>
Let's consider a more complex example using FBP instead.
</p>

<pre class="example">
mouse/click -&gt; button/check
button/click -&gt; counter/increment
counter/result -&gt; console/log
</pre>

<p>
In this fictional example, we have an interactive environment, where a
mouse device provides data about clicks, which are sent to a button to
check for a click. Any resulting clicks are sent to a counter to
increment. The resulting count over time is sent to the console to log.
</p>

<p>
Notice now that both control flow and data flow is very clear, moving from left to
right, top to bottom. In more complex cases, it can be
represented well as a directed graph, like a flow chart. Either way,
data flow is explicit, and in doing so, control flow is actually
removed. In other words, the program has no control over the flow of
the program counter, in fact, it's not obvious that any program
counter is necessary in a program like this. All nodes can be
operating in parallel.
</p>

<p>
So what other benefits can this paradigm provide? Spreadsheets provide a
glance into what's possible by simply allowing arbitrary references
with functions for math and aggregation, which update reactively to
arbitrary updates to cells upstream. Propagators and truth
resolution systems are another concept along the same lines.
</p>

<p>
In a generic system where data flow is our key means of abstraction,
we can build more flexible and modular systems that are easier to
analyze and experiment than much of what's out there today, so give it
a try!
</p>
</div>
</div>
</div>
]]>
</description></item>
<item>
<title>Garden 2021</title>
<link>https://kyleperik.com/garden_2021.html</link>
<pubDate>Thu, 07 Dec 2023 17:37:56 -0600</pubDate>
<guid>https://kyleperik.com/garden_2021.html</guid>
<description>
<![CDATA[<p>
<a href="https://kyleperik.com">kyleperik.com</a>
</p>

<p>
<b>Several seeds were direct sown into the garden early May, or were growing in modules - Logging how they do</b>
</p>

<p>
Fennel - Sprinkled into the lower mulch, not sure how well this will work.
I'm hoping that they will germinate in the mulch and find their way down to the soil
I'm thinking instead they will germinate, but won't have a stable footing and will just grow aimlessly until they rot
</p>

<p>
Carrots, Beets, Spinach - Moved away the mulch, then used a spade to make a shallow drill through the dirt, and sprinkled the seed along, covered over with a bit of mulch
</p>

<p>
Potatoes, Onions, Shallots - Using seed potatoes, onions and shallots, moved away the mulch, dug shallow holes in the dirt, placed in the seed and covered back up with mulch
</p>

<p>
Squash - Lots of trials going on here:
</p>
<ul class="org-ul">
<li>Summer squash seedlings received from the Maupens in small modules, planted these in the ground mid-may to allow the roots to continue growing</li>
<li>Zucs, Cucs, Pumpkins, Squash started indoors in small modules</li>
<li>Some pumpkin seeds were preserved in the compost pile over the winter, planted these around the garden</li>
</ul>

<p>
Sunflower - Dug up soil and sprinkled in the seeds then covered up with mulch, also started in modules
</p>

<p>
Peas, Beans, Peanuts - Dug up soil and sprinkled in the seeds, then covered up with mulch
Peas started several weeks earlier than the others
Peanuts were planted with their shells on
</p>

<p>
These seeds were sown indoors in modules, which have not yet been planted out
Lettuce
Bok Choy, Cabbage
Calendula
Onions, Leeks
Salvia
Bee balm lemon
</p>


<p>
<b>Late May</b>
</p>

<p>
No sign of Fennel or dill yet
</p>

<p>
I have not found any Carrots, Beets or Spinach pop up yet, it's making me a bit worried that I didn't do something properly and that they have rotted.
I'm continuing to water to give them the proper conditions for germination
</p>

<p>
Carrots did not germinate, but the beets and spinach did
</p>

<p>
Carrots were re-sown after removing as much mulch as I could, then ripping up the top layer of soil and sowing the seeds broadcast
</p>

<p>
Potatoes are just now poking up and getting green, and I spotted a few onions or shallots
</p>

<p>
Squash Seedlings from the Maupens are suffering a bit, but are still alive. I'm not exactly sure why, it could be stress on the roots, or lack of water
Zucs, Cucs, Pumpkins, and Squash have all germinated in the modules, these were planted out into the garden
A few of the Pumpkin seeds from the compost pile are coming up and doing okay
</p>

<p>
It took a while, but a few of the direct sown sunflower seeds have come up. Module sunflowers germinated in a matter of days
</p>

<p>
Peas have come up and are doing very well
</p>

<p>
Beans are germinating, but have not yet poked up. Peanuts have not yet germinated, maybe because of the shell?
</p>

<p>
<b>Early June</b>
</p>

<p>
Fennel and dill have germinated and are now getting their true leaves
</p>

<p>
Carrots, Beets and Spinach have all germinated and are growing their true leaves
Generally they are doing well, it's a bit spotty but this method worked much better than before
</p>

<p>
Potatoes onions and shallots are all up and doing great
</p>

<p>
Zucs, Cucs, Pumpkins, and Winter Squash are mostly doing pretty good.
Some yellowing on the leaves for some, but others, particularly the pumpkins in the shade where the compost was are very big and healthy
I'm keeping them watered, just hoping they can root down a bit further
Not sure whether it's a lack of nutrients or just too much sun for their age
</p>

<p>
All the sunflowers are coming up and growing quickly
</p>

<p>
Peas are continuing to grow quickly, they have started climbing up the fence. No sign of flowers yet
</p>

<p>
After finding the germinating beans and taking the germinating peanuts out of their shells I placed them back into the soil evenly
Now they are up and doing just fine. The true leaves came quickly and a second wave of new leaves are here
</p>

<p>
Bought some herbs and a tomato plant at the farmers market. They are all doing relatively well.
</p>

<p>
Brussel sprouts were sown in modules and I'm keeping them fertilized - true leaves are coming in
</p>

<p>
Cabbage, kale and cauliflower were all planted out.
Lesson learned with brassicas - Keep them well fertilized as seedlings
They can grow fast and big in the small modules, but they need to always have access to nutrients
The Cabbage and kale did not do as well, most likely because I neglected them for the first part of their development
Some cabbage and kale have begun to grow larger since being planted out
Some did not, which I discovered was probably because they were not planted very far in the soil,
 and had too many wood chips blocking root growth
Cauliflower on the other hand did fantastically, I waited extra long before putting them in the ground, mostly because they was no need
</p>

<p>
Strawberries are very prolific, producing 1000+ strawberry buds
No ripe strawberries yet, but the biggest fruit so far are as big as a small store bought strawberry
I transplanted some smaller runners around the house, we'll see how they do
</p>

<p>
Blackberries are producing buds for flowers now
</p>

<p>
Blueberry has come alive and is growing fast, although it is still small
</p>

<p>
No sign of Raspberry flowers now, although the plants are looking healthy
</p>

<p>
Various flower seedlings direct sown in the front, some are coming up and are growing fine.
</p>

<p>
Mulberry trees in front are struggling, one is growing well now, but the other has died off, I'm trying to keep the soil moist for them
</p>

<p>
Asparagus was sown in modules, they are growing fine. Some of last year's asparagus is coming up, although it's small, and struggling a bit
</p>

<p>
The last of last year's watermelon was sown in modules, each one germinated and is growing fine
They were transferred into pots and are ready to go in the ground now
I'm being extra cautious with them to giving them a good chance to grow and maybe make some melons this year
</p>

<p>
Lettuce and bok choy are in the ground now and they are doing great
</p>

<p>
Calendula is doing fine, planted some around the house
</p>

<p>
Elder trees are doing really well, the left one is very prolific, it is making flowers and shooting up quickly
</p>


<p>
<b>Mid August</b>
</p>

<p>
Fennel is growing well, some are bolting, others are forming nice little bulbs
</p>

<p>
One dill plant is doing very well and flowering, it's enough for what we need
</p>

<p>
Potatoes started dying, we decided to pull them all. We got quite a harvest &gt;20lbs
onions and shallots aren't doing very well, but at least they formed some bulbs, so I pulled them
</p>

<p>
We have more Zucs then we can eat. They have become a bush, as high as the fence, I only kept 3 plants.
</p>

<p>
Cucs are also doing great, we have plenty for snacks.
</p>

<p>
We have 3 Pumpkins already, I misplaced our little pumpkins and our butternut squash, so we're actually getting lots of little pumpkins, and not so many butternut squash
</p>

<p>
I harvested the biggest sunflower and used them, they turned out okay, I think I needed to cook them at a lower temperature
</p>

<p>
Peas flowered and did great. Pulled them late July after getting powdery mildew and just drying up and falling over
</p>

<p>
Beans got bit by some pest, and so they are a bit more like a small bush now&#x2026;
They are flowering and we have some tiny beans
</p>

<p>
Peanuts are growing nicely, and flowering. There are beans in the ground but I don't know how big they are yet.
</p>

<p>
Herbs are doing okay, they are enough for what we need.
</p>

<p>
Tomatoes are producing enough for some snacking here and there
</p>

<p>
Brussel sprout modules got eaten by Finn, damaging their roots quite a bit. They never fully recovered, so I decided to put them in the ground. They aren't wilting like they were, but the growth is slow. I amended some compost, and even with watering frequently, they are taking their time
</p>

<p>
Cabbage and kale are doing great! They had a slow start, but now the cabbage is forming nice heads, and the kale is producing big leaves
</p>

<p>
Cauliflower is doing pretty good, no flowers yet, but they are continuing to grow larger. They were planted way too close together
</p>

<p>
Strawberries were a hit, we had a ton over the month of June into July
</p>

<p>
Blackberries are ripe now, although there aren't too many.
</p>

<p>
Blueberry remains pretty small
</p>

<p>
Raspberry is really large now, but no flowers.
</p>

<p>
Flowers in the front mostly died, due to scorching sun day after day. Some survived and are now flowering.
</p>

<p>
Mulberry trees are both alive, after amending some wood chips, they are getting more consistent moisture
</p>

<p>
Asparagus is huge!
</p>

<p>
All the lettuce bolted while we were on vacation. I pulled them and put them in the compost pile.
</p>

<p>
Finn liked sitting on the bok choy, but they were resilient and continued to grow, just in a sort of deformed way.
I ended up just pulling them and using them in a stir fry
</p>

<p>
Harvested a watermelon, it was small, and not quite ripe, but it tasted good
</p>

<p>
Calenduala is flowering
</p>

<p>
The one elder tree has berries that are still green
</p>

<p>
<b>November</b>
</p>

<p>
Most crops have been pulled
</p>

<p>
Beans were left to dry, and collected
</p>

<p>
Kale is doing fantastic and even continuing to grow despite the frosts
</p>

<p>
Cabbage is generating more heads now
</p>

<p>
Mums and caledula are doing great, although caledula is struggling from frost a bit
</p>

<p>
All house plants were re-potted with fresh compost, and moved inside and are doing really well
</p>
]]>
</description></item>
<item>
<title>Blog</title>
<link>https://kyleperik.com/blog.html</link>
<pubDate>Sat, 31 Jan 2026 22:00:11 -0600</pubDate>
<guid>https://kyleperik.com/blog.html</guid>
<description>
<![CDATA[<p>
<a href="https://kyleperik.com">kyleperik.com</a>
</p>

<p>
&#x2014;
</p>

<div id="outline-container-org0a40483" class="outline-2">
<h2 id="org0a40483">2026</h2>
<div class="outline-text-2" id="text-org0a40483">
<p>
⇒ <a href="./idea_dump.html">Idea Dump</a>
</p>
</div>
</div>

<div id="outline-container-orgac447da" class="outline-2">
<h2 id="orgac447da">2025</h2>
<div class="outline-text-2" id="text-orgac447da">
<p>
⇒ <a href="./garden_2025.html">Garden 2025</a>
</p>
</div>
</div>


<div id="outline-container-orgff6f4a1" class="outline-2">
<h2 id="orgff6f4a1">2024</h2>
<div class="outline-text-2" id="text-orgff6f4a1">
<p>
⇒ <a href="./garden_2024.html">Garden 2024</a>
</p>

<p>
⇒ <a href="./7drl_retro_2024.html">7DRL Retro 2024</a>
</p>
</div>
</div>

<div id="outline-container-orgf2a3154" class="outline-2">
<h2 id="orgf2a3154">2023</h2>
<div class="outline-text-2" id="text-orgf2a3154">
<p>
⇒ <a href="./garden_2023.html">Garden 2023</a>
</p>

<p>
⇒ <a href="./rethinking_control_flow.html">Rethinking Control Flow</a>
</p>

<p>
⇒ <a href="./understanding_is_underrated.html">Understanding is Underrated</a>
</p>

<p>
⇒ <a href="./innovation_vs_revolution.html">Innovation vs Revolution</a>
</p>

<p>
⇒ <a href="./code_guidelines.html">Opinionated Codebase Guidelines</a>
</p>

<p>
⇒ <a href="./beans/index.html">Beans Lang</a>
</p>
</div>
</div>

<div id="outline-container-org5766d01" class="outline-2">
<h2 id="org5766d01">Previous</h2>
<div class="outline-text-2" id="text-org5766d01">
<p>
⇒ <a href="./garden_2022.html">Garden 2022</a>
</p>

<p>
⇒ <a href="./garden_2021.html">Garden 2021</a>
</p>
</div>
</div>
]]>
</description></item>
<item>
<title>Garden 2024</title>
<link>https://kyleperik.com/garden_2024.html</link>
<pubDate>Fri, 20 Jun 2025 15:49:39 -0500</pubDate>
<guid>https://kyleperik.com/garden_2024.html</guid>
<description>
<![CDATA[<p>
<a href="https://kyleperik.com">kyleperik.com</a>
</p>

<div id="outline-container-orgf57efca" class="outline-2">
<h2 id="orgf57efca">Spring</h2>
<div class="outline-text-2" id="text-orgf57efca">
<p>
It's looking like it'll be a really good year!
</p>
</div>

<div id="outline-container-org29ea299" class="outline-3">
<h3 id="org29ea299">Rabbit problems, resolved</h3>
<div class="outline-text-3" id="text-org29ea299">
<p>
Winter last year, I had removed a lot of wire nets around established fruit trees, in order to clean up
the weeds rising around them. This turned out to be a bad idea, as rabbits eat
the bark especially on apples, which can stunt or even kill trees pretty quickly, even
those that are fairly established.
</p>

<p>
So this past winter, I added a many nets back around damaged trees, which has helped to
protect them.
</p>


<div id="org896b0dd" class="figure">
<p><img src="garden_2024/2024-06-22_14-14-19_IMG_20240117_075826395.jpg" alt="2024-06-22_14-14-19_IMG_20240117_075826395.jpg" />
</p>
</div>
</div>
</div>

<div id="outline-container-orgbe2e54c" class="outline-3">
<h3 id="orgbe2e54c">Pruning</h3>
<div class="outline-text-3" id="text-orgbe2e54c">
<p>
This year I didn't have much pruning to do. I mainly have focused efforts on cleaning up
our tayberry bushes, continuing to remove rotting wood from our apple tree.
</p>

<p>
Next year I hope to focus more on honing in the structure of many of our pears, apples and peach
trees to promote health, and a smaller size.
</p>


<div id="org6c1cf06" class="figure">
<p><img src="garden_2024/2024-06-22_14-17-11_IMG_20240415_193011936_HDR.jpg" alt="2024-06-22_14-17-11_IMG_20240415_193011936_HDR.jpg" />
</p>
</div>
</div>
</div>

<div id="outline-container-orge60164d" class="outline-3">
<h3 id="orge60164d">New Plantings</h3>
<div class="outline-text-3" id="text-orge60164d">
<p>
We ordered 25 hazelnut bushes from <a href="https://www.forestag.com">https://www.forestag.com</a>.
They're establishing well, planted along a shallow swale on a mound.
</p>


<div id="orga017050" class="figure">
<p><img src="garden_2024/2024-06-22_14-19-17_IMG_20240430_064337956.jpg" alt="2024-06-22_14-19-17_IMG_20240430_064337956.jpg" />
</p>
</div>



<div id="org9eaeb22" class="figure">
<p><img src="garden_2024/2024-06-22_14-30-43_IMG_20240522_115656144.jpg" alt="2024-06-22_14-30-43_IMG_20240522_115656144.jpg" />
</p>
</div>


<p>
Additionally, we're planted a couple magnolia trees, which are also
establishing well.
</p>
</div>
</div>

<div id="outline-container-org301cfa3" class="outline-3">
<h3 id="org301cfa3">Disease</h3>
<div class="outline-text-3" id="text-org301cfa3">
<p>
We're seeing a number of trees affected by peach leaf curl,
as we've had an especially wet early spring.
</p>

<p>
Thankfully the pruning we've done in past years has opened
the structure of much of these trees, letting in more air
and sunshine. As the season progresses, the disease naturally
becomes less prevalent, depending on severity.
</p>
</div>
</div>

<div id="outline-container-orgd72bb52" class="outline-3">
<h3 id="orgd72bb52">Anticipated harvests</h3>
<div class="outline-text-3" id="text-orgd72bb52">
<p>
We're looking forward to some great harvests this year!
</p>

<p>
Our old apple tree has lots of fruit on it for it's bi-annual
fruiting habit. (last year we didn't get much)
</p>

<p>
Many of our peaches, nectarines and apricots flowered prolifically,
and are putting on fruit now. We're looking forward to good harvests in
August through October.
</p>
</div>
</div>

<div id="outline-container-orga4b6d25" class="outline-3">
<h3 id="orga4b6d25">Gallery</h3>
<div class="outline-text-3" id="text-orga4b6d25">
<p>
Bamboo, in Wisconsin!
</p>


<div id="org8606191" class="figure">
<p><img src="garden_2024/2024-06-22_14-31-56_IMG_20240611_105753914.jpg" alt="2024-06-22_14-31-56_IMG_20240611_105753914.jpg" />
</p>
</div>


<p>
Tayberries, our first ever harvest
</p>

<div id="org80fb7bc" class="figure">
<p><img src="garden_2024/2024-06-22_14-32-49_IMG_20240618_144039008.jpg" alt="2024-06-22_14-32-49_IMG_20240618_144039008.jpg" />
</p>
</div>

<p>
Nanking cherries, really tasty and abundant!
</p>


<div id="orgc3d5fc3" class="figure">
<p><img src="garden_2024/2024-06-22_14-34-01_IMG_20240620_103556964.jpg" alt="2024-06-22_14-34-01_IMG_20240620_103556964.jpg" />
</p>
</div>


<p>
Unsure what this is, but the leaves smell like winter green when crushed.
</p>


<div id="org567e94c" class="figure">
<p><img src="garden_2024/2024-06-22_14-34-53_IMG_20240620_155820852.jpg" alt="2024-06-22_14-34-53_IMG_20240620_155820852.jpg" />
</p>
</div>

<p>
Another picture prior to blooming
</p>

<div id="orga8a38f3" class="figure">
<p><img src="garden_2024/2024-06-22_14-35-22_IMG_20240620_104448594.jpg" alt="2024-06-22_14-35-22_IMG_20240620_104448594.jpg" />
</p>
</div>
</div>
</div>


<div id="outline-container-org9d9b52b" class="outline-3">
<h3 id="org9d9b52b">Harvest log</h3>
<div class="outline-text-3" id="text-org9d9b52b">
<p>
June 7: 3 lbs of cherries
</p>

<p>
June 22: Early berry season
I'm not weighing as they're more for a snack
</p>
<ul class="org-ul">
<li>Nanking cherries: A good 40 handfuls</li>
<li>Black raspberries: 40 handfuls, ripening over time</li>
<li>Goji berries: 20 handfuls, ripening over time</li>
<li>Tayberries: 1 handful, still ripening</li>
<li>Silver berries: 2 handfuls</li>
</ul>
</div>
</div>
</div>

<div id="outline-container-org74c9a12" class="outline-2">
<h2 id="org74c9a12">Summer</h2>
<div class="outline-text-2" id="text-org74c9a12">
</div>
<div id="outline-container-org65d2b17" class="outline-3">
<h3 id="org65d2b17">Harvest log</h3>
<div class="outline-text-3" id="text-org65d2b17">
<p>
July 23
</p>
<ul class="org-ul">
<li>2 handfuls of blackberries</li>
<li>4.5 lbs of potatoes harvested from the garden</li>
</ul>


<p>
August-October
</p>
<ul class="org-ul">
<li>About a couple pounds of peaches</li>
<li>A few pears</li>
</ul>
</div>
</div>
</div>

<div id="outline-container-org23ff0a1" class="outline-2">
<h2 id="org23ff0a1">Fall</h2>
<div class="outline-text-2" id="text-org23ff0a1">
<p>
This year I finally conjured enough cardboard to lay down a sizable area,
and piled horse manure and well rotted wood chips on top to prepare for a bigger,
more fertile garden next year.
</p>


<div id="org1163e69" class="figure">
<p><img src="garden_2024/IMG_20241020_162124173.jpg" alt="IMG_20241020_162124173.jpg" />
</p>
</div>
</div>
</div>
]]>
</description></item>
<item>
<title>Garden 2025</title>
<link>https://kyleperik.com/garden_2025.html</link>
<pubDate>Sat, 31 Jan 2026 21:40:02 -0600</pubDate>
<guid>https://kyleperik.com/garden_2025.html</guid>
<description>
<![CDATA[<p>
<a href="https://kyleperik.com">kyleperik.com</a>
</p>


<div id="outline-container-org217e9c6" class="outline-2">
<h2 id="org217e9c6">Early Garden Success</h2>
<div class="outline-text-2" id="text-org217e9c6">
<p>
This year we built a short lattice fence around the garden, after having put cardboard,
manure and wood chips on top of the soil. It sure did the job of making it feel more
intentional, like a real garden.
</p>


<div id="orgde97c54" class="figure">
<p><img src="garden_2025/IMG_20250609_155755497.jpg" alt="IMG_20250609_155755497.jpg" />
</p>
</div>

<p>
I've kept up with weeding for the most part, that with the extra fertility provided
last year is paying off in promising plant vigor.
</p>

<p>
Peas are doing the best they've done, by the beginning of summer we're getting handfuls
every day.
</p>

<p>
We trained them up a trellis I built out of some tall grass stems from last year.
The stuff almost feels like bamboo, it's strong and lengthy.
</p>

<p>
In addition, we've crammed in the following plants in our slightly larger garden area:
</p>
<ul class="org-ul">
<li>Tomatoes</li>
<li>Potatoes</li>
<li>Sweet Potatoes</li>
<li>Carrots</li>
<li>Beets</li>
<li>Strawberries</li>
<li>Garlic</li>
<li>Beans</li>
<li>Summer Squash</li>
<li>Butternut Squash (outside the fence)</li>
<li>Peanuts</li>
<li>Cabbage</li>
</ul>

<p>
And we're trying to beautify the surrounding area by planting some flowers too
</p>
<ul class="org-ul">
<li>Bells of Ireland</li>
<li>Peonies</li>
<li>Daylilies</li>
<li>Zinnias</li>
<li>Borage</li>
</ul>

<p>
So far everything we've planted it at least surviving, if not doing quite well.
</p>
</div>
</div>

<div id="outline-container-org7ccf529" class="outline-2">
<h2 id="org7ccf529">Signs of Heavy Fruiting</h2>
<div class="outline-text-2" id="text-org7ccf529">
<p>
This tree made one pear last year.
</p>


<div id="org8ca88af" class="figure">
<p><img src="garden_2025/IMG_20250609_155453963.jpg" alt="IMG_20250609_155453963.jpg" />
</p>
</div>

<p>
We're seeing some signs that it's going to be a really heavy fruit year.
Maybe it's something in the air.
</p>

<p>
In 2021 we pruned many trees heavily, which may be the cause of some slowdown
the past couple years. By now it may be finally paying off.
</p>

<p>
Regardless of the cause, we're grateful to see it and hopeful to stock our freezer
and pantry and have more than enough to share.
</p>
</div>
</div>

<div id="outline-container-org220d859" class="outline-2">
<h2 id="org220d859">Fall Harvests</h2>
<div class="outline-text-2" id="text-org220d859">
<p>
By around mid-August we started getting a lot of white peaches, in large bunches.
</p>


<div id="org4aa492d" class="figure">
<p><img src="garden_2025/2025-12-19_16-27-49_IMG_20250825_180237843.jpg" alt="2025-12-19_16-27-49_IMG_20250825_180237843.jpg" />
</p>
</div>

<p>
As the season progressed we also got to taste some oblong peaches
which were large sweet and flavorful. We treasured the season.
</p>

<p>
All in all, we harvested around 300 lbs of peaches. We tried tracking it but fell behind.
</p>

<p>
In addition, we had a good harvest of Asian pears. Maybe around 50 pounds.
</p>


<div id="orgaa624fc" class="figure">
<p><img src="garden_2025/2025-12-19_16-30-24_IMG_20250825_195127603.jpg" alt="2025-12-19_16-30-24_IMG_20250825_195127603.jpg" />
</p>
</div>

<p>
We ate quite a number, as well as sharing with friends and family.
We canned and froze anything we couldn't eat or give away so we can enjoy it
in the months to come.
</p>
</div>
</div>

<div id="outline-container-orgc519064" class="outline-2">
<h2 id="orgc519064">Canning</h2>
<div class="outline-text-2" id="text-orgc519064">
<p>
We learned recently about the risks of botulism, which are extremely rare,
but is particularly scary due to the lack of scent and taste,
and how damaging or life threatening the consequences.
</p>

<p>
The risk is primarily due to the resilience of botulism spores, which can
persist even in boiling temperatures.
(though live botulism and the botulism toxin are elliminated within 10 minutes of boiling temperatures)
</p>

<p>
This is why pressure canning is the only catch-all solution to avoiding risks,
because it can raise the temperature beyond boiling temperatures that way.
</p>

<p>
Water bath on the other hand is effective, as long as the contents contain a high enough sugar and acid content.
</p>

<p>
Unfortunately we learned after having canned that both asian pears and white peaches contain a lower acid content
than their equivalents. Therefore to elliminate risks, you must add acidity (lemon juice works perfectly well).
</p>
</div>
</div>

<div id="outline-container-org1fea797" class="outline-2">
<h2 id="org1fea797">Paw paws</h2>
<div class="outline-text-2" id="text-org1fea797">
<p>
We got our first harvests from our paw paw trees this year.
Around 18 fruits ripened, though we ate and froze maybe half, some being eaten by critters.
</p>


<div id="orgfafc983" class="figure">
<p><img src="garden_2025/2025-12-19_16-39-49_IMG_20250929_114109629.jpg" alt="2025-12-19_16-39-49_IMG_20250929_114109629.jpg" />
</p>
</div>

<p>
The taste is tropical, very fragrant, almost like a strong perfume. When perfectly ripe they are very sweet.
</p>

<p>
It was a treat, while maybe not my favorite. (the oblong peaches were my favorite this year)
</p>
</div>
</div>

<div id="outline-container-org123d9df" class="outline-2">
<h2 id="org123d9df">Garden retro</h2>
<div class="outline-text-2" id="text-org123d9df">

<div id="orgcd8c95f" class="figure">
<p><img src="garden_2025/2026-01-31_21-28-46_IMG_20250610_153709182.jpg" alt="2026-01-31_21-28-46_IMG_20250610_153709182.jpg" />
</p>
</div>



<p>
We got a good number of peas, tomatoes, and kale, but otherwise I crammed way to much into my little fenced in area,
depite having scaled down. We simply crowded out most things.
</p>

<p>
At least with our mesh fence, they were untouched by our chicken and other critters this year.
</p>

<p>
Next year we'll start a cut flower garden, we'll update the progress here.
</p>


<div id="org17ab496" class="figure">
<p><img src="garden_2025/2026-01-31_21-30-22_IMG_20250825_141131900.jpg" alt="2026-01-31_21-30-22_IMG_20250825_141131900.jpg" />
</p>
</div>

<p>
Garden in late summer- it got a little out of hand
</p>
</div>
</div>


<div id="outline-container-orgeb81c51" class="outline-2">
<h2 id="orgeb81c51">Gallery</h2>
<div class="outline-text-2" id="text-orgeb81c51">

<div id="org8a0de30" class="figure">
<p><img src="garden_2025/2026-01-31_21-25-37_IMG_20250808_170344248.jpg" alt="2026-01-31_21-25-37_IMG_20250808_170344248.jpg" />
</p>
</div>




<div id="orgd3260c9" class="figure">
<p><img src="garden_2025/2026-01-31_21-26-11_IMG_20250625_145030195.jpg" alt="2026-01-31_21-26-11_IMG_20250625_145030195.jpg" />
</p>
</div>




<div id="org9cec236" class="figure">
<p><img src="garden_2025/2026-01-31_21-26-28_IMG_20250624_132658228.jpg" alt="2026-01-31_21-26-28_IMG_20250624_132658228.jpg" />
</p>
</div>

<p>
Milkweed blooms
</p>



<div id="org2b92e0a" class="figure">
<p><img src="garden_2025/2026-01-31_21-27-26_IMG_20250613_130024046.jpg" alt="2026-01-31_21-27-26_IMG_20250613_130024046.jpg" />
</p>
</div>

<p>
Wild rose
</p>




<div id="org33279db" class="figure">
<p><img src="garden_2025/2026-01-31_21-29-22_IMG_20250624_132913016.jpg" alt="2026-01-31_21-29-22_IMG_20250624_132913016.jpg" />
</p>
</div>

<p>
Elder flower
</p>
</div>
</div>
]]>
</description></item>
<item>
<title>7DRL Retro 2024</title>
<link>https://kyleperik.com/7drl_retro_2024.html</link>
<pubDate>Tue, 12 Mar 2024 20:37:42 -0500</pubDate>
<guid>https://kyleperik.com/7drl_retro_2024.html</guid>
<description>
<![CDATA[<p>
<a href="https://kyleperik.com">kyleperik.com</a>
</p>

<p>
&#x2014;
</p>

<p>
I submitted a game to <a href="https://7drl.com/">7DRL</a> this year, and it was a slog.
</p>

<p>
I've enrolled a couple times previously,
<a href="https://youtu.be/F1slW-aiv7Q?si=t1Me7S4Y-puXhgYG&amp;t=8999">Nookrium played through</a>
my 2022 submission, <a href="https://kylep.itch.io/blunder-crawl">Blunder Crawl</a>,
a Chess inspired Roguelike game.
</p>

<p>
Before that, I ventured to create a traditional Roguelike
with octopus tentacle mechanics:
<a href="https://kylep.itch.io/octorogue">Octorogue</a>, my personal favorite.
</p>

<p>
This year, I submitted a quick and challenging alchemy and identification
themed roguelike: <a href="https://kylep.itch.io/flask-cannon">Flask Cannon</a>.
</p>

<p>
Rather than utilizing an existing js framework built for
making games in the browser, like rot.js and pixi js, I decided to use
this as an opportunity to test out my new borderline esoteric language
<a href="https://git.sr.ht/~kylep/beans/">Beans</a>.
</p>

<p>
This language relies mostly on it's <a href="https://100r.co/site/uxn.html">host virtual machine, uxn</a>
for it's lower level semantics. On the higher level is an explicit
declarative graph of dataflow throughout the system.
</p>

<p>
I took the liberty of graphing the dataflow of Flask Cannon:
</p>


<div id="org810fe7c" class="figure">
<p><img src="2024-03-12_20-00-29_7drl2024-graph.png" alt="2024-03-12_20-00-29_7drl2024-graph.png" />
</p>
</div>

<p>
I generated this by processing the main "beanpod" file
here: <a href="https://git.sr.ht/~kylep/7drl24/tree/master/item/src/game.bpod">https://git.sr.ht/~kylep/7drl24/tree/master/item/src/game.bpod</a>
</p>

<p>
Some things of note: console feeds controls/keyboard, which is the one
source of user input to the system. From here, messages are sent to
station/caldron, field/entities and system. From there, it becomes a bit
of a mess to parse through. Eventually, many of the beans feed data to
screen, which is what manages drawing things (mostly sprites and rectangles).
The point is, you at least <i>can</i> reason about how data flows from module to module.
</p>

<p>
A debugging technique that was often was useful was to pipe the output
of one bean into console.x, which effectively printed out every message
sent through that port.
</p>

<p>
I just like the feeling of knowing that no data is left unaccounted for, but maybe
that's just me.
</p>

<p>
On the other hand, the biggest challenge, perhaps unsurprisingly, was race conditions.
</p>

<p>
It was something that snuck up on me, it's not that it created bugs which rendered
the game unplayable, they materialized as just oddities about attack and effect timing.
It crushed my spirit when I realized there was no easy workaround.
I'd expect the enemies to take a turn <i>after</i> you've made your move, instead, you'll notice
enemies attack before you make your next move, which can just be
annoying. Worse, I was seeing status effects being applied after an
enemy dies, in some cases resulting in a second death, and extra
damage notifications in the corner of the screen.
</p>

<p>
Now these problems are not unsolvable, they just are not made straightforward with to address with beans.
While the dataflow is strictly well defined, this doesn't mean the propagation of these messages
apply in a way that can be relied on. This is something I'll have to
give more thought to, clearly this kind of problem has been solved
in thousands of other domains, it can be at least made easier to work
with in beans.
</p>

<p>
Beyond that, I found I was continually envying higher level graphics
functions that I've grown accustomed to with other frameworks. Writing
my own circle function or others would have taken up too much
time. Instead, I compensated by using sprites for most things, and
developed some mechanisms for drawing larger sprites along the way,
the player character and the caldron for example.
</p>

<p>
The idea of persistent data structures were on my mind as well. While
beans ensures no shared mutable data by simply not allowing any shared
data at all, this can be limiting and inefficient.
</p>

<p>
Essentially each byte of data must be copied onto the queue to be
processed by a bean, and copied into "local" memory again if it's to
be stored. Persistent data structures could alleviate this issue,
while maintaining the constraint of no shared mutable data, by
allowing shared immutable data. This would incur a decent amount of
complexity and logic into the now lightweight beans framework, but I'm
thinking it might pay off in the end.
</p>

<p>
Lastly, I was hoping I'd be able to make some better abstractions, as
beans supports nested "beanpods", which can be really conceptually
helpful to break down the pieces of a game. Instead, I kept it as a
single flat beanpod, which many connections between them. After all,
it's better to have to rewrite than to prematurely abstract, and I
only had 7 days to make something.
</p>

<p>
I'm glad I was able to complete 7DRL this year despite the challenges,
I'm proud of what I made, hopefully you can have a bit of fun playing
it.
</p>
]]>
</description></item>
<item>
<title>Innovation vs Revolution</title>
<link>https://kyleperik.com/innovation_vs_revolution.html</link>
<pubDate>Thu, 07 Dec 2023 18:07:34 -0600</pubDate>
<guid>https://kyleperik.com/innovation_vs_revolution.html</guid>
<description>
<![CDATA[<p>
<a href="https://kyleperik.com">kyleperik.com</a>
</p>

<p>
Technology has a revolutionary force on our lives. But how to tell what parts are truly revolutionary
isn't easy to sort out. Technology has become a vague classification for new gadgets and services
that are available at this time.
</p>

<p>
Identifying which creations are truly revolutionary, and those that are simply innovations is
important for anyone who's in it for the long haul. Praising whole for the individual is just
as easy as throwing away the baby with the bathwater, and just as damaging too.
</p>

<div id="outline-container-org198f8f6" class="outline-2">
<h2 id="org198f8f6">Destructive nature of the hype</h2>
<div class="outline-text-2" id="text-org198f8f6">
<p>
A DDoS attack is different from other attacks like viruses. Viruses require a vulnerability
in order to infiltrate and cause damage. DDoS works by simply overusing a public service
in a way that the service cannot sort out which requests are legitimate, so the service
must stop servicing requests entirely.
</p>

<p>
Similarly, when a certain technology is elevated and worshiped, the sheer magnitude of individuals
and corporations trying to get on board creates a space so diluted, it invalidates the
technology in a shroud of misdirection.
</p>
</div>
</div>

<div id="outline-container-org2ebfb47" class="outline-2">
<h2 id="org2ebfb47">True revolutions</h2>
<div class="outline-text-2" id="text-org2ebfb47">
<p>
Innovation is an art. Combining existing components together to create something new.
Anyone can innovate, and the right innovations change how we think about technology.
</p>

<p>
Confusing innovations for revolutions is where we run into trouble. Revolutions
don't just change the way we think, they change the way we act and behave in society.
Revolutions are inevitable, triggered and fueled by the newfound greater local
maximum. It's like the spreading of a invasive species, it can't be stopped.
Revolutions aren't manufactured, they're discovered. No one company can sell it,
no individual can patent it. Anyone can either choose to try to fight it or
just flow with it.
</p>
</div>
</div>

<div id="outline-container-org5ac61bf" class="outline-2">
<h2 id="org5ac61bf">Tools</h2>
<div class="outline-text-2" id="text-org5ac61bf">
<p>
So if revolutions aren't owned, how can one flow with it? It's all about tools.
Never has a revolution occurred with some product at the forefront, it has always
been cheaply accessible resources that anyone can take advantage of.
</p>

<p>
Cheap coal for the industrial revolution fueled the laying of railways, and eventually
personal cars and the highway.
Cheap microchips for the technological revolution fueled the creation of personal
computers and the internet.
</p>

<p>
Revolutions have always played out with individuals at the forefront. I find this
comforting to keep in mind, if the innovation feels intangible, it's probably
not all that important.
</p>

<p>
Real ideas come in the day to day, in the slow drip of inspiration and
in the quiet moments of pondering. Revolutions happen when an idea is to strong to
be contained and bursts into the public scene <i>despite</i> general consensus.
</p>

<p>
Fake revolutions feed on fear of missing out and impostor syndrome. Don't
follow the craze.
</p>

<blockquote>
<p>
<i>The best way to predict the future is to invent it</i>
</p>
</blockquote>

<p>
&#x2013; Alan Kay
</p>
</div>
</div>
]]>
</description></item>
<item>
<title>Idea Dump</title>
<link>https://kyleperik.com/idea_dump.html</link>
<pubDate>Sat, 31 Jan 2026 22:02:57 -0600</pubDate>
<guid>https://kyleperik.com/idea_dump.html</guid>
<description>
<![CDATA[<p>
<a href="https://kyleperik.com">kyleperik.com</a>
</p>

<p>
&#x2014;
</p>

<p>
Over the past 3 years or so I've been researching and applying programming language ideas
that have interested me. Not with any particular goal in mind, just for my own enjoyment,
and as an opportunity to learn and to carve out a small space to write software for myself
without getting as caught up with the hype cycles and churn in the industry.
</p>

<p>
Over this time I've documented my ideas and thought processes. I like to revisit these notes
from time to time, and while they are rough and informal, I think they're interesting
and can be actually better quality than what I end up when I attempt to write a "real" post.
</p>

<p>
So below I've picked a few to share. Might make some more posts like this in the future.
</p>

<div id="outline-container-orgc597cd2" class="outline-2">
<h2 id="orgc597cd2">Things the best languages should do elegantly</h2>
<div class="outline-text-2" id="text-orgc597cd2">
<p>
Not a list of things I think every language should have,
just things I would look for when considering the efficacy of a language.
</p>
</div>

<div id="outline-container-orge058bca" class="outline-3">
<h3 id="orge058bca">Explicit data flow</h3>
<div class="outline-text-3" id="text-orge058bca">
<p>
js + html fails by using event hooks setup imperatively
react/vue are a bandade
</p>

<p>
A good language makes it impossible to bury triggers or transfers of data
</p>
</div>
</div>
<div id="outline-container-org51a59fc" class="outline-3">
<h3 id="org51a59fc">State over time</h3>
<div class="outline-text-3" id="text-org51a59fc">
<p>
mutable variable and reassignment are not good enough,
this defies explicit data flow
</p>

<p>
A good language provides careful semantics for handling state over time
</p>
</div>
</div>
<div id="outline-container-org6433f66" class="outline-3">
<h3 id="org6433f66">Lists of stateful entities</h3>
<div class="outline-text-3" id="text-org6433f66">
<p>
A good lanugage implements a particle system elegantly
</p>
</div>
</div>
<div id="outline-container-org8357b38" class="outline-3">
<h3 id="org8357b38">Modular stateful entities with logic</h3>
<div class="outline-text-3" id="text-org8357b38">
<p>
locality of behavior is an imporant principle as well as modularity.
</p>

<p>
React/vue have good solutions for this, but are isolated views on to the web
they enable creation of components which can be declaratively included
within other components, embedding state and logic.
Components handle input events from the top down, bubbling events up
and delegating statefulness to the parent
and propagation of state through children.
</p>

<p>
A good language provides a general solution to modular stateful code
</p>
</div>
</div>
<div id="outline-container-orgbbe32c5" class="outline-3">
<h3 id="orgbbe32c5">UI</h3>
<div class="outline-text-3" id="text-orgbbe32c5">
<p>
A good lanuage enables elegant creation and management of UI
</p>
</div>
</div>
</div>


<div id="outline-container-org802334a" class="outline-2">
<h2 id="org802334a">Idea - program log + hashes</h2>
<div class="outline-text-2" id="text-org802334a">
</div>
<div id="outline-container-org21e83f3" class="outline-3">
<h3 id="org21e83f3">Idea: Real Easy TDD</h3>
<div class="outline-text-3" id="text-org21e83f3">
<p>
TDD is "test driven development"
a simple priciple, to write a test first, see it fail,
then make the change.
</p>

<p>
But there's a big problem. Test failures are not guaranteed
Even if you check in the failing test to version control,
the previous test failure will not necessarily be ensured
with something like continuous integration.
</p>

<p>
And more likely, you will just make the change and
write the test in one commit.
</p>

<p>
Solution? Keep all your old code to run new tests against.
version control keeps your old code, but it doesn't really
make sense to use this to run multiple versions in CI.
</p>

<p>
What if instead, every function is referenced to by it's hash.
The program is simply a hash itself, a function to be run
grouping together all your other hashes.
</p>

<p>
Tests run against these hashes. New versions of your program
are simply new functions made up of different functions,
although this doesn't exclude the possibility of retaining old
functions for testing purposes.
</p>

<p>
So when adding a test, you indicate at what hash the test should fail at
(before your change) and then after you change it, you register
that this hash should pass the test.
</p>

<p>
Then the test runs twice, once with the old hash and one with the new.
Then the test results are cached forever, since they ran against a hash,
which is guarenteed to run the same forever.
</p>
</div>
</div>
<div id="outline-container-org9b03b9d" class="outline-3">
<h3 id="org9b03b9d">Idea: Event Sourcing Event Aggregation Programs</h3>
<div class="outline-text-3" id="text-org9b03b9d">
<p>
Event sourcing is nice. Except when your event protocol changes,
and you need to either run a migration, or do some crazy defaulting
to ensure old event versions still work fine
</p>

<p>
What if instead, the event interpreter was an event itself?
</p>

<p>
So when the interpreter changes, an event is emitted to indicate this,
This means in order to determine the current state of anything managed
by the event sourcing system, all you must do is push that entitiy's
events through the most recent program event at the time it was emitted.
</p>
</div>
</div>
<div id="outline-container-org84d3087" class="outline-3">
<h3 id="org84d3087">Benefit: No need for namespaces</h3>
<div class="outline-text-3" id="text-org84d3087">
<p>
Namespaces are for separating names that might collide.
</p>

<p>
Namespaces do not however enable coexisting copies of the same code at
different versions.
</p>

<p>
Using hashes however elliminates the need for namespaces.
You may have aliases for your code for reference, but importantly:
they are not required internally for your code to run.
</p>

<p>
This means your system may operate fine with multiple versions of the same
program installed simultaneously without any issues, even running at the
same time.
</p>
</div>
</div>
<div id="outline-container-orgf912b9a" class="outline-3">
<h3 id="orgf912b9a">How?</h3>
<div class="outline-text-3" id="text-orgf912b9a">
<p>
Need some kind of program which allows you to "check in"
data which can be hashed and held onto.
</p>

<p>
This repository can hosted so it can be pulled down by others
</p>

<p>
Then apart from this, you can have your version control, which simply
holds links to versions in the repository.
</p>

<p>
The way programs are hashed is first by breaking it down to a symbolic representation,
then by looking at the internal references, and breaking it apart.
</p>

<p>
Every chunk of code is hashed separately, and a dependency tree is made.
</p>

<p>
for instance, if your code looks like this:
</p>

<p>
def foo():
  print('foo')
</p>

<p>
def bar():
  print('bar')
</p>

<p>
def foobar():
  foo()
  bar()
</p>

<p>
Then foo, bar and foobar will be hashed separately
Then foobar, rather than holding onto the named references,
will hold the hashes of foo and bar.
</p>

<p>
So when foobar is pulled down, all it's dependencies are packaged
with it.
</p>
</div>
</div>
</div>
<div id="outline-container-org0f7f020" class="outline-2">
<h2 id="org0f7f020">Web alternative</h2>
<div class="outline-text-2" id="text-org0f7f020">
<p>
Someone creates something.
They publish to a given network.
Could be a number of personal computers, or family computers, or anyone.
</p>

<p>
As soon as you publish a work, it can be pulled in by someone else in that network.
Others can be notified too, but ultimately once released, it can be asked for and
provided by anyone on that network.
</p>

<p>
Each computer on the network is able to access this data, and may cache it or discard
as needed.
</p>

<p>
Programs can also be published. Programs, when run, can take in data you have access to,
plus user provided data, including clicks and keypresses on your computer,
and create new piece of data that you can publish on a network.
</p>

<p>
Programs have zero access controls by default, and may be granted access via whitelisting.
Think how websites can allow or block push notifications, geolocation, etc.
But instead, these programs don't even have access to push or pull resources from the web.
</p>

<p>
Programs are the replacement for website applications. They are desktop applications,
where you have full control of your data, and can plug it in whatever way you wish.
</p>
</div>
</div>
]]>
</description></item>
<item>
<title>kyleperik.com</title>
<link>https://kyleperik.com/index.html</link>
<pubDate>Fri, 20 Jun 2025 15:38:30 -0500</pubDate>
<guid>https://kyleperik.com/index.html</guid>
<description>
<![CDATA[<p>
You've found Kyle Perik's personal site.
</p>

<p>
Kyle is a Software Engineer working at IMT Insurance.
</p>

<p>
Kyle maintains an orchard and a small garden using permaculture
methods, and he enjoys living a simple life with his wife, dogs and chickens.
</p>

<p>
When he isn't working or spending time with his family, he hacks on
whatever seems interesting to him at the time.
</p>

<p>
⇒ <a href="./blog.html">blog</a>
</p>

<p>
⇒ <a href="./reading.html">reading list</a>
</p>

<p>
🌐 <a href="https://git.sr.ht/~kylep">https://git.sr.ht/~kylep</a>
</p>

<p>
📡 <a href="./rss.xml">RSS Feed</a>
</p>

<p>
&#x2014;
</p>

<p>
<i>&gt; Non-magic users: collect crystals, call their pet a familiar, draw pentagrams</i>
</p>

<p>
<i>&gt; Magic users: the most magical things I keep in my house are rocks, and I keep a hammer next to them in case they act up</i>
</p>

<p>
Source:
</p>

<p>
🌐 <a href="https://twitter.com/TooMany_Monkeys/status/1120561634412584960">https://twitter.com/TooMany_Monkeys/status/1120561634412584960</a>
</p>

<div id="outline-container-orgff3941c" class="outline-2">
<h2 id="orgff3941c">Contact</h2>
<div class="outline-text-2" id="text-orgff3941c">
<p>
kyle [at] periks [dot] net
</p>

<p>
🌐 <a href="https://www.linkedin.com/in/kyle-perik-95a032227/">https://www.linkedin.com/in/kyle-perik-95a032227/</a>
</p>
</div>
</div>
]]>
</description></item>
</channel>
</rss>
