<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <title>Blog</title>
    <subtitle>Paul Kawalkowski writes about automation, infrastructure, AI systems, projects, and pragmatic software work.</subtitle>
    <link rel="self" type="application/atom+xml" href="https://kawalkowski.com/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://kawalkowski.com"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2026-01-22T00:00:00+00:00</updated>
    <id>https://kawalkowski.com/atom.xml</id>
    <entry xml:lang="en">
        <title>New Year Powered by NVIDIA</title>
        <published>2026-01-22T00:00:00+00:00</published>
        <updated>2026-01-22T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://kawalkowski.com/posts/new-year/"/>
        <id>https://kawalkowski.com/posts/new-year/</id>
        
        <content type="html" xml:base="https://kawalkowski.com/posts/new-year/">&lt;p&gt;Spending most of my time this year getting into AI, GPU optimization, and figuring out how to build scalable machine learning clusters with Kubernetes (or whatever is the new kid on the block).
I’ve been wanting to understand what’s actually happening at the hardware level when you’re running these workloads, not just throwing YAML at a cluster and hoping for the best.
There’s a lot of interesting stuff around scheduling GPU workloads, memory management, and making sure you’re not leaving performance on the table.
Lots to learn.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;some-of-the-literature-i-ve-been-reading&quot;&gt;Some of the literature I’ve been reading:&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Artificial Intelligence: A Modern Approach by Stuart Russell and Peter Norvig (4th Edition)&lt;&#x2F;li&gt;
&lt;li&gt;Deep Learning by Ian Goodfellow, Yoshua Bengio, and Aaron Courville&lt;&#x2F;li&gt;
&lt;li&gt;Hands-On Machine Learning with Scikit-Learn, Keras and TensorFlow by Aurélien Géron&lt;&#x2F;li&gt;
&lt;li&gt;Pattern Recognition and Machine Learning by Christopher M. Bishop&lt;&#x2F;li&gt;
&lt;li&gt;AI Systems Performance Engineering - Optimizing Model Training and Inference Workloads with GPUs, CUDA, and PyTorch by Chris Fregly&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>zug</title>
        <published>2026-01-22T00:00:00+00:00</published>
        <updated>2026-01-22T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://kawalkowski.com/posts/zug/"/>
        <id>https://kawalkowski.com/posts/zug/</id>
        
        <content type="html" xml:base="https://kawalkowski.com/posts/zug/">&lt;p&gt;I created a cloudflare project to able to track basic work around applying to jobs.
You apply to a job -&amp;gt; you get an email on successful application -&amp;gt; you forward the email to the special email address for intake -&amp;gt; cloudflare email worker will add it to a queue -&amp;gt; an AI worker will process the email and extrac the information from it and add it to a database -&amp;gt; you view the application statuses via a TUI -&amp;gt; repeat&lt;&#x2F;p&gt;
&lt;h2 id=&quot;architecture&quot;&gt;Architecture&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;kawalkowski.com&#x2F;posts&#x2F;zug&#x2F;.&#x2F;architecture.png&quot; alt=&quot;architecture&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;features&quot;&gt;Features&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Email tracking&lt;&#x2F;li&gt;
&lt;li&gt;Email parsing&lt;&#x2F;li&gt;
&lt;li&gt;Database integration&lt;&#x2F;li&gt;
&lt;li&gt;TUI interface&lt;&#x2F;li&gt;
&lt;li&gt;Google has automatic email forwarding&lt;&#x2F;li&gt;
&lt;li&gt;AI integration&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Gemini Was Not Wrong</title>
        <published>2026-01-04T00:00:00+00:00</published>
        <updated>2026-01-04T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://kawalkowski.com/posts/wrong/"/>
        <id>https://kawalkowski.com/posts/wrong/</id>
        
        <content type="html" xml:base="https://kawalkowski.com/posts/wrong/">&lt;h2 id=&quot;gemini-3-0-pro-solved-the-jane-street-puzzle&quot;&gt;Gemini 3.0 Pro Solved the Jane Street Puzzle&lt;&#x2F;h2&gt;
&lt;p&gt;Three weeks ago I was trying out the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.janestreet.com&#x2F;puzzles&#x2F;robot-javelin-index&#x2F;&quot;&gt;December Jane Street Puzzle&lt;&#x2F;a&gt; and I was unable to solve it.
Naturally, let’s ask AI to solve it.
Copied the puzzle and conversed with Gemini and it gave me a suboptimal solution and asked it to check its work.
Its answer didn’t make any sense to me.
I wrote it off.
I checked on the morning of the first and lo and behold, GEMINI WAS RIGHT.&lt;&#x2F;p&gt;
&lt;p&gt;Gemini came up with the correct solution, accurately answering the puzzle that knowing the Java-lin thrower was actually a losing strategy.
I let my ego and cognitive dissonance get the best of me and I didn’t trust it.
AI is really starting to get good and we’re living in an amazing era in history.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>bored</title>
        <published>2025-12-20T00:00:00+00:00</published>
        <updated>2025-12-20T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://kawalkowski.com/posts/bored/"/>
        <id>https://kawalkowski.com/posts/bored/</id>
        
        <content type="html" xml:base="https://kawalkowski.com/posts/bored/">&lt;p&gt;I created a Go TUI to able to do basic navigation and work on your ADO boards.&lt;&#x2F;p&gt;
&lt;p&gt;I currently use it at my day job and will continue supporting its development until feature complete - which it mostly is.&lt;&#x2F;p&gt;
&lt;p&gt;View the project here: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;laupski&#x2F;bored&quot;&gt;bored&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Week of Efficiency</title>
        <published>2025-12-14T00:00:00+00:00</published>
        <updated>2025-12-14T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://kawalkowski.com/posts/efficiency/"/>
        <id>https://kawalkowski.com/posts/efficiency/</id>
        
        <content type="html" xml:base="https://kawalkowski.com/posts/efficiency/">&lt;p&gt;I’ve been on a tear at programming this week while on vacation.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Began reading AI literature (&lt;em&gt;Artificial Intelligence - A Modern Approach&lt;&#x2F;em&gt; Fourth Edition)&lt;&#x2F;li&gt;
&lt;li&gt;Began reading &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;learncpp.com&quot;&gt;learncpp&lt;&#x2F;a&gt; - fantastic work on there&lt;&#x2F;li&gt;
&lt;li&gt;Began reading into agents and how they work - I bought Claude Max Pro and have never pushed more code in my life&lt;&#x2F;li&gt;
&lt;li&gt;Early MVP for my new react native app&lt;&#x2F;li&gt;
&lt;li&gt;Finished AoC (with Claude’s help)&lt;&#x2F;li&gt;
&lt;li&gt;Migrated my resume automation from LaTeX to &lt;code&gt;typst&lt;&#x2F;code&gt; with Claude’s help&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;claude-opus-4-5-is-seriously-good&quot;&gt;Claude Opus 4.5 is Seriously Good&lt;&#x2F;h2&gt;
&lt;p&gt;Ever since I’ve tested Sonnet and Gemini 6 months ago, I was not impressed from what I was seeing.
To test what they could do, I gave it a few simple tasks a junior and a mid level engineer would be able to do.&lt;&#x2F;p&gt;
&lt;p&gt;The first one being adding Loki logs to a Go application (it could literally be anything) and sending it to a docker container.
A few months ago it was unable to do this; last week it was.&lt;&#x2F;p&gt;
&lt;p&gt;The second one was asking it to create a Warcraft 3 Replay parser.
This is a much more complicated problem because it’s given an unknown file type and it has to dissect the file byte by byte.
There is an &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;PBug90&#x2F;w3gjs&quot;&gt;open source implementation&lt;&#x2F;a&gt; but I forbade it from looking at it and translating it (LLMs should be able to do this without too much difficulty).
I gave this problem to two people who were more knowledgeable about agents than me and they were both able to create a Go rendition and a Rust rendition.
Seriously impressive results today compared to where we were a few months ago.&lt;&#x2F;p&gt;
&lt;p&gt;I was doing AoC this year and got stuck on a problem and it was able to help, and now I’m sitting on 24&#x2F;24 ⭐ on my account.
Seriously impressive.&lt;&#x2F;p&gt;
&lt;p&gt;On my backlog I also wanted to create a vacationing app for myself to finally go somewhere and do research on when to go, and asked Claude to help with creating an app for it.
Currently a work in progress, but I’ve had decent results creating PoC workflows, working with specialized “agents”, and working with the Apple Developer suite.
I think I’m still far off from releasing to the Apple App Store but it’s much better than having a prototype on the screen vs. an idea in my head.
Here’s some further reading I received from some colleagues on agents:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;blog.sshh.io&#x2F;p&#x2F;how-i-use-every-claude-code-feature&quot;&gt;how-i-use-every-claude-code-feature&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;taoofmac.com&#x2F;space&#x2F;blog&#x2F;2025&#x2F;05&#x2F;13&#x2F;2230&quot;&gt;The Vibes&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;mitchellh.com&#x2F;writing&#x2F;non-trivial-vibing&quot;&gt;non-trivial-vibing&lt;&#x2F;a&gt; from mitchell-sama&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;The other thing on my backlog was moving from LaTeX to &lt;code&gt;typst&lt;&#x2F;code&gt; for my resume automation.
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;typst&#x2F;typst&quot;&gt;typst&lt;&#x2F;a&gt; promises a lot of what LaTeX offers but without the LaTeX.
I asked Claude to translate my &lt;code&gt;.tex&lt;&#x2F;code&gt; and &lt;code&gt;.cls&lt;&#x2F;code&gt; code to &lt;code&gt;.typ&lt;&#x2F;code&gt; and it was fairly successful.
Squashed a few bugs and some ATS min&#x2F;maxing and it ended up being quite decent.&lt;&#x2F;p&gt;
&lt;p&gt;All in all this may sound like I have a problem taking time off (I do and am creating an app for this problem) and this is an advertisement for Claude Max (honestly it may be).
Do I add &lt;code&gt;vibe coding&lt;&#x2F;code&gt; as one of my skills now on my resume and my home page?&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>ladi.club</title>
        <published>2025-12-14T00:00:00+00:00</published>
        <updated>2025-12-14T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://kawalkowski.com/posts/ladi-club/"/>
        <id>https://kawalkowski.com/posts/ladi-club/</id>
        
        <content type="html" xml:base="https://kawalkowski.com/posts/ladi-club/">&lt;p&gt;Currently working on a vacationing app for people who have difficulty vacationing - don’t have time to go or don’t know where to go.
I’ll be revealing a bit more in the future once I have a good MVP.
I have spoken to a few people about the idea and have received positive feedback.
The most important thing for me personally about this application is for me to love it and use it.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;current-stack&quot;&gt;Current Stack&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;React Native with Expo handling most things frontend&lt;&#x2F;li&gt;
&lt;li&gt;Cloudflare handling the middleware&#x2F;backend&#x2F;storage&lt;&#x2F;li&gt;
&lt;li&gt;Clerk handling the authentication &#x2F; users &#x2F; SSO&lt;&#x2F;li&gt;
&lt;li&gt;Claude doing a lot of the heavy lifting for the frontend work and PoC work&lt;&#x2F;li&gt;
&lt;li&gt;Gemini (nano banana) doing a lot of the UI &#x2F; branding &#x2F; image generation&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Stock Market Anomaly Detector</title>
        <published>2025-11-08T00:00:00+00:00</published>
        <updated>2025-11-08T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://kawalkowski.com/posts/stocks/"/>
        <id>https://kawalkowski.com/posts/stocks/</id>
        
        <content type="html" xml:base="https://kawalkowski.com/posts/stocks/">&lt;p&gt;This is a writeup of my not too successful stock market anomaly detector.
I was inspired by &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;unusualwhales.com&#x2F;&quot;&gt;unusualwhales.com&lt;&#x2F;a&gt; and how they created a service on options flow data with filtering.
Another inspiration was from &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;massive.com&#x2F;blog&#x2F;hunting-anomalies-in-the-stock-market&quot;&gt;massive.com’s blog post&lt;&#x2F;a&gt; on anomalies in the stock market.
A simple explanation would be that if a big hedge fund &#x2F; big account was very confident on a certain company within a certain timeframe (ignoring legalities) they would either buy shares of the company OR buy a leveraged position in the company in the form of options contracts.&lt;&#x2F;p&gt;
&lt;p&gt;This post is not meant to dive into the intricacies of options contracts but rather the software architecture, problems and difficulties I ran into in building a similar service.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;plan&quot;&gt;Plan&lt;&#x2F;h2&gt;
&lt;p&gt;The basic plan was as follows:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Find data provider with options trade data - historical and live&lt;&#x2F;li&gt;
&lt;li&gt;Insert data into a database&lt;&#x2F;li&gt;
&lt;li&gt;Transform data into something I can use along with some sort of maintainable filtering rules&lt;&#x2F;li&gt;
&lt;li&gt;Create a visualization so I can see big moves in the market&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h2 id=&quot;data-provider&quot;&gt;Data Provider&lt;&#x2F;h2&gt;
&lt;p&gt;I chose &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;massive.com&#x2F;options&quot;&gt;massive.com&lt;&#x2F;a&gt; as my data provider because it had the easiest documentation, has flat files for historical analysis, and an easy to use API for live injection of trades via websockets and a RESTful API for quotes.
They also have a great support team!&lt;&#x2F;p&gt;
&lt;h2 id=&quot;architecture&quot;&gt;Architecture&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Postgres as my database with timescaledb enabled, along with pgAdmin as my administration layer&lt;&#x2F;li&gt;
&lt;li&gt;Go as my websocket server&lt;&#x2F;li&gt;
&lt;li&gt;Python and Bash as my database seeding&lt;&#x2F;li&gt;
&lt;li&gt;Docker compose as my organization&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;I chose the above because I was &lt;em&gt;mostly&lt;&#x2F;em&gt; comfortable with each above.
I also experimented with several software projects when I was testing implementations and optimizing workloads.&lt;&#x2F;p&gt;
&lt;p&gt;I would intake the new historical analysis flat files every morning by injecting the options trade data, do calculations based on 30 day windows to start off with and would calculate baseline thresholds of every contract on the market.
If let’s say the volume of contracts in a day is considered 1000 traded per day, divided by 5 minute increments and my last 5 minutes of live trades broke that threshold, the application would alert me that something’s up.
This was a very simple calculation as a PoC.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;deployment&quot;&gt;Deployment&lt;&#x2F;h2&gt;
&lt;p&gt;Docker compose file that managed postgres with timescaledb enabled and pgadmin.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;go run .&lt;&#x2F;code&gt; for the web socket server.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;results&quot;&gt;Results&lt;&#x2F;h2&gt;
&lt;p&gt;I was able to view live trades on my terminal, compared live trades against my calculated thresholds and was able to make an &lt;em&gt;educated guess&lt;&#x2F;em&gt; if the big trades were &lt;strong&gt;bullish&lt;&#x2F;strong&gt;, &lt;strong&gt;bearish&lt;&#x2F;strong&gt; or &lt;strong&gt;neutral&lt;&#x2F;strong&gt; depending on if the executed trade was near the ask or bid.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;difficulties&quot;&gt;Difficulties&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;database&quot;&gt;Database&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;I created a docker compose file that managed most things well, however the project rapidly became very storage intensive and my 2 TB drive became very full eventually.
My docker volume for the postgres database went up to a terabyte in size.&lt;&#x2F;li&gt;
&lt;li&gt;Timescaledb did things fine. After I indexed the tables within a 1 day time frame window, performance drastically improved from a 30 minute query to under 2 minutes for historical viewing of trades.&lt;&#x2F;li&gt;
&lt;li&gt;Initial seeding of 2 year of trades took an entire night and had to be inserted in batches.&lt;&#x2F;li&gt;
&lt;li&gt;Managing the database was easy with pgAdmin however seeding the database after some time because unmanageable.
I had several tables, triggers and functions created to work with the data and I did not have these in code.
It would have been nice to find a solution to sync the database’s schema, functions, triggers etc. into code on demand.
I was doing this manually for a period of time but eventually stopped as it became too cumbersome.&lt;&#x2F;li&gt;
&lt;li&gt;Date conversions and comparisons.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;web-socket-server-intake&quot;&gt;Web Socket Server (Intake)&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;Live quotes of the options contracts were the major issue here.
I created a 5&#x2F;10 minute smoothing window of the most recent quotes of a options contract that may or may not have had live data.&lt;&#x2F;li&gt;
&lt;li&gt;Pooling of connections and batching inserts into the database.&lt;&#x2F;li&gt;
&lt;li&gt;Goroutines and debugging multiple channels.&lt;&#x2F;li&gt;
&lt;li&gt;Floating point number calculations.&lt;&#x2F;li&gt;
&lt;li&gt;LLMs are still not good enough in Go and integrating between services in simple docker-compose setups.
&lt;strong&gt;INSERT BIG LLM&lt;&#x2F;strong&gt; was unable to create a simple docker-compose setup with Go and inserting into a bare bones loki setup.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;filtering-calculations-and-maintainability-of-them&quot;&gt;Filtering &#x2F; Calculations and Maintainability of them&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;I initially tried the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;grafana.com&#x2F;grafana&#x2F;&quot;&gt;Grafana&lt;&#x2F;a&gt; approach and got some decent historical data visualization, however it was slow and unmaintainable for 10,000+ stocks.&lt;&#x2F;li&gt;
&lt;li&gt;I then tried &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;grafana.com&#x2F;oss&#x2F;loki&#x2F;&quot;&gt;Loki&lt;&#x2F;a&gt; for tagging each trade in the database by underlying ticker. Performance was putrid and yelled at me for having that many tags.&lt;&#x2F;li&gt;
&lt;li&gt;I then tried using &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;flink.apache.org&#x2F;&quot;&gt;Apache Flink&lt;&#x2F;a&gt;, and I was unable to get this working due to several reasons with starting the service and complexities getting Kafka and ZooKeeper in a docker-compose project.
This was a project on the market, &lt;em&gt;not&lt;&#x2F;em&gt; over burdening myself with Apache products I was unfamiliar with.
The original idea was to replicate something like this: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=ARBK_nT2XHk&quot;&gt;Real-time anomaly detection on streaming data using Random Cut Forest on Apache Flink&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Data provider was unable to give me live quotes per trade after speaking with the support team.&lt;&#x2F;li&gt;
&lt;li&gt;Data provided to me was rarely inaccurate, wasn’t a big deal for me because support was great with working with me and my questions.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;visualizations&quot;&gt;Visualizations&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;I tried &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.metabase.com&#x2F;&quot;&gt;metabase&lt;&#x2F;a&gt; and it looked fine.
This was before I did database optimization so I was running into major problems with date comparisons and expensive queries.
This was also before I was confident on what the project should’ve been visually and I ultimately settled on a simple live terminal based approach.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;future-work-recommendations-for-reader&quot;&gt;Future Work &#x2F; Recommendations for Reader&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Try &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;questdb.com&#x2F;&quot;&gt;QuestDB&lt;&#x2F;a&gt; instead of timescaledb.&lt;&#x2F;li&gt;
&lt;li&gt;Try &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;clickhouse.com&#x2F;&quot;&gt;Clickhouse&lt;&#x2F;a&gt; it may or may not be appropriate for something like this as its more applicable to metrics rather than trades.&lt;&#x2F;li&gt;
&lt;li&gt;Try &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.metabase.com&#x2F;&quot;&gt;metabase&lt;&#x2F;a&gt; again.&lt;&#x2F;li&gt;
&lt;li&gt;Try &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.pgbouncer.org&#x2F;&quot;&gt;pgbouncer&lt;&#x2F;a&gt; for pooling postgres database connections.&lt;&#x2F;li&gt;
&lt;li&gt;Try a columnar based approach instead of a row based project.
I don’t have enough experience on data lakes and it may be more appropriate for historical based queries.&lt;&#x2F;li&gt;
&lt;li&gt;Implement a dumb caching method to intercept RESTful API requests so we don’t bog down the website with crazy amount of requests.
I’m currently working on a simple open source solution for this called &lt;code&gt;dumb-cache&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;mise.jdx.dev&#x2F;&quot;&gt;mise&lt;&#x2F;a&gt; worked well for managing tool dependencies - I used it to install &lt;code&gt;mc&lt;&#x2F;code&gt;, &lt;code&gt;just&lt;&#x2F;code&gt; and &lt;code&gt;jq&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.astral.sh&#x2F;uv&#x2F;&quot;&gt;uv&lt;&#x2F;a&gt; is always nice.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;whichjdk.com&#x2F;&quot;&gt;Guide on jdk&lt;&#x2F;a&gt; is a very good read when I was exploring using Flink.&lt;&#x2F;li&gt;
&lt;li&gt;Time series theory and mathematical theory behind if certain events in the market are actually causing movements in the market.
Some follow up reading:
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Student%27s_t-test&quot;&gt;Student’s t-test&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Random_forest&quot;&gt;Random forest&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.amazon.com&#x2F;dp&#x2F;0470414359&quot;&gt;Analysis of Financial Time Series&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.amazon.com&#x2F;dp&#x2F;1119800064&quot;&gt;Quantitative Trading: How to Build Your Own Algorithmic Trading Business&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Use decimal packages for floating point number calculations &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;shopspring&#x2F;decimal&quot;&gt;shopspring&#x2F;decimal&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;charmbracelet&#x2F;bubbletea&quot;&gt;bubbletea&lt;&#x2F;a&gt; was going to be my tui and it looked very cool.&lt;&#x2F;li&gt;
&lt;li&gt;Log everything&lt;&#x2F;li&gt;
&lt;li&gt;For serious &lt;code&gt;sql&lt;&#x2F;code&gt; projects I recommend &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;sqlfluff&#x2F;sqlfluff&quot;&gt;sqlfluff&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;Batch your &lt;code&gt;sql&lt;&#x2F;code&gt; inserts and pool your connections.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>New Website</title>
        <published>2025-08-31T00:00:00+00:00</published>
        <updated>2025-08-31T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://kawalkowski.com/posts/new-site/"/>
        <id>https://kawalkowski.com/posts/new-site/</id>
        
        <content type="html" xml:base="https://kawalkowski.com/posts/new-site/">&lt;p&gt;Doing some spring cleaning and made a new website via cloudflare and zola to limit the work on website upkeep which hopefully gives me more time to write.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Dev Box</title>
        <published>2023-02-11T00:00:00+00:00</published>
        <updated>2023-02-11T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://kawalkowski.com/posts/dev-box/"/>
        <id>https://kawalkowski.com/posts/dev-box/</id>
        
        <content type="html" xml:base="https://kawalkowski.com/posts/dev-box/">&lt;p&gt;I had an old LG Gram laptop with a ton of memory on it gathering dust.
I’ve been meaning to create a development environment for my future endeavors, 2 birds, 1 stone.
My goals were as follows:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Open source OS that doesn’t require too much upkeep&lt;&#x2F;li&gt;
&lt;li&gt;Auto healing environment&lt;&#x2F;li&gt;
&lt;li&gt;Easy to deploy&lt;&#x2F;li&gt;
&lt;li&gt;Learn something&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h2 id=&quot;installing-ubuntu-on-an-old-laptop&quot;&gt;Installing Ubuntu on an Old Laptop&lt;&#x2F;h2&gt;
&lt;p&gt;To get started, you’ll need to install Ubuntu on your old laptop. You can download the latest version of Ubuntu from the official Ubuntu website and follow the installation instructions to install it on your laptop.&lt;&#x2F;p&gt;
&lt;p&gt;Once you have Ubuntu installed, you’ll need to update your system and install some necessary packages. Run the following commands in a terminal to update your system and install the necessary packages:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt-get update
sudo apt-get upgrade
sudo apt-get install -y curl wget
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;setting-up-local-ssh-access&quot;&gt;Setting Up Local SSH Access&lt;&#x2F;h2&gt;
&lt;p&gt;It’s important to set up local SSH access for easy access to your server. To set up local SSH access, you’ll need to install the OpenSSH server on your Ubuntu laptop. Run the following command to install it:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt-get install openssh-server
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Then to enable it on startup and to run it run the following:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;systemctl enable sshd &amp;amp;&amp;amp; systemctl start sshd
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Once the OpenSSH server is installed, you can log in to your server locally by opening a terminal and typing:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;ssh user@laptop-ip-address
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Where “user” is your username on the server. You can find your laptop’s external IP address by looking at your eth0 broadcast IP or looking at your router’s network.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;setting-up-ssh-access-through-tailscale&quot;&gt;Setting Up SSH Access Through Tailscale&lt;&#x2F;h2&gt;
&lt;p&gt;Next, we’ll set up remote SSH access through Tailscale. Tailscale is a VPN service that allows you to securely access your remote servers from anywhere in the world. To set up Tailscale, you’ll need to sign up for an account and install the Tailscale client on your laptop. You’ll follow the instructions from the website.&lt;&#x2F;p&gt;
&lt;p&gt;Once you have Tailscale set up, you can log in to your remote server using SSH by running the following command in a terminal:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;ssh user@your-server-ip-address
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;setting-up-docker-and-watchtower&quot;&gt;Setting up Docker and Watchtower&lt;&#x2F;h2&gt;
&lt;p&gt;Next, we will install Docker on our server. Docker is a platform that allows you to easily create, deploy, and run applications in containers. To install Docker on Ubuntu, run the following commands in a terminal:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt-get install docker.io
sudo systemctl start docker
sudo systemctl enable docker
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Now that we have Docker installed, let’s set up the Watchtower repository. Watchtower is a simple application that automatically updates your running Docker containers. To install Watchtower, run the following command:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;docker run --restart always -d --name watchtower -v &#x2F;var&#x2F;run&#x2F;docker.sock:&#x2F;var&#x2F;run&#x2F;docker.sock containrrr&#x2F;watchtower
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;setting-up-a-development-environment-with-docker-compose&quot;&gt;Setting Up a Development Environment with Docker Compose&lt;&#x2F;h2&gt;
&lt;p&gt;Now that we have both local and remote SSH access set up, let’s talk about setting up a development environment using Docker and Docker Compose. Docker Compose is a tool for defining and running multi-container Docker applications. By using Docker Compose, you can easily manage the different components of your application and ensure that they are always running in a consistent state.&lt;&#x2F;p&gt;
&lt;p&gt;One of the key benefits of using Docker Compose is the ability to create an autohealing environment. This means that if one of your containers fails, Docker Compose will automatically restart it, ensuring that your application stays up and running. To create an autohealing environment, you can specify the restart property in your Docker Compose file, like this:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;version: &amp;#39;3&amp;#39;
services:
  my_service:
    image: my_image
    restart: always
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;To set up a development environment, you’ll need to create a Docker Compose file that specifies the different components of your application, including any dependencies and environment variables. Once you have your Docker Compose file set up, you can run your application using the following command:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;docker-compose up
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This will start all of the containers specified in your Docker Compose file and run your application in a development environment.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;github-setup&quot;&gt;Github Setup&lt;&#x2F;h2&gt;
&lt;p&gt;Finally, let’s set up our containers on GitHub. GitHub is a platform that allows you to store and share your code with others. To create a repository, log in to your GitHub account and follow the instructions to create a new repository. Once you have created your repository, you can use it to store your Docker containers and automatically update them using Watchtower.&lt;&#x2F;p&gt;
&lt;p&gt;In conclusion, setting up a server using Docker, Linux, Watchtower, and GitHub is a great way to turn an old laptop into a powerful and flexible development platform. By setting up local SSH access, using Docker Compose to create an autohealing environment, and using GitHub to store your containers, you can easily manage and update your applications, ensuring that they always run smoothly.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>How I Got Here</title>
        <published>2022-05-17T00:00:00+00:00</published>
        <updated>2022-05-17T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://kawalkowski.com/posts/how-i-got-here/"/>
        <id>https://kawalkowski.com/posts/how-i-got-here/</id>
        
        <content type="html" xml:base="https://kawalkowski.com/posts/how-i-got-here/">&lt;h2 id=&quot;how-did-i-break-into-devops-without-any-prior-experience&quot;&gt;How did I break into DevOps without any prior experience?&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;em&gt;How do I become better at my craft?&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;em&gt;What can make me marketable?&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;em&gt;How do I do this in the shortest amount of time?&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;I first started studying by aiming to get all AWS exams. AWS &#x2F; cloud knowledge is asked in almost all modern job postings.
My goal was to pass all of the associate and professional exams.&lt;&#x2F;p&gt;
&lt;p&gt;The holy trinity of prep is Stephane Maarek on 1.5x speed (getting to know AWS), Jon Bonso practice tests and the Jon Bonso cheat sheets.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.udemy.com&#x2F;user&#x2F;stephane-maarek&#x2F;&quot;&gt;Stephane Maarek on Udemy&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.udemy.com&#x2F;user&#x2F;jonjonbonso&#x2F;&quot;&gt;Jon Bonso on Udemy&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;tutorialsdojo.com&#x2F;aws-cheat-sheets&#x2F;&quot;&gt;Jon Bonso cheat sheet&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;The order in which I completed the exams were:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Associate Solutions Architect&lt;&#x2F;li&gt;
&lt;li&gt;Associate Developer&lt;&#x2F;li&gt;
&lt;li&gt;Associate SysOps Administrator&lt;&#x2F;li&gt;
&lt;li&gt;Professional DevOps Engineer&lt;&#x2F;li&gt;
&lt;li&gt;Professional Solutions Architect&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;You can read about them &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;aws.amazon.com&#x2F;certification&#x2F;&quot;&gt;here&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;You can buy the appropriate courses on Udemy, go through the material from Stephane Maarek, do the practice tests from Jon Bonso and then cap off the night before with his cheat sheet.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Do not book the exams from AWS all at once because they give you a coupon code for half off after every exam you pass which will save you a LOT of money.&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Do not buy any course for full price because they have sales running at the beginning of every month (right now I think it’s $15 for each course, which is great).&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;The AWS SA Pro is definitely &lt;strong&gt;two&lt;&#x2F;strong&gt; tiers above in difficulty, while the other four are generally pretty fair and well paced.&lt;&#x2F;p&gt;
&lt;p&gt;Terraform made my life much easier and took the exam for it. I also took the Vault exam. I used this material:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.udemy.com&#x2F;course&#x2F;terraform-beginner-to-advanced&#x2F;&quot;&gt;Terraform Beginner to Advanced&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.udemy.com&#x2F;course&#x2F;hashicorp-certified-vault-associate-practice-exam&#x2F;&quot;&gt;HashiCorp Certified Vault Associate Practice Exam&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;HashiCorp has a bunch of material on their site to learn and play around with the products locally.
The tests are very easy and shouldn’t take you more than a week or two each to run through them.&lt;&#x2F;p&gt;
&lt;p&gt;When Docker was shown to me for the first time, I was blown away. This was the single coolest thing I’ve ever seen.
Run a one line command, and you can stand up a web server instantly. To learn about it, I took this course:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.udemy.com&#x2F;course&#x2F;docker-mastery&#x2F;&quot;&gt;Docker Mastery: with Kubernetes +Swarm from a Docker Captain&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;After studying and going back to Docker numerous times, I decided my specialty was going to be DevOps. I passed the Linux Foundation CKA exam using this material:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;training.linuxfoundation.org&#x2F;training&#x2F;linux-system-administration-essentials-lfs207&#x2F;&quot;&gt;Linux System Administration Essentials&lt;&#x2F;a&gt; (a bit pricey but 100% worth if you have no fundamental knowledge in linux)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.udemy.com&#x2F;course&#x2F;certified-kubernetes-administrator-with-practice-tests&#x2F;&quot;&gt;Certified Kubernetes Administrator with Practice Tests&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;The CKA exam is performance based, meaning you will literally be scripting and working in the command line during the exam.
The Kubernetes course has practice exams and quizzes, which is the best course I’ve ever bought.
The LFCS course doesn’t have useful quizzes but has a lot of good material, better than any other Linux course in my opinion.&lt;&#x2F;p&gt;
&lt;p&gt;Learn vim. There’s a fun little game that helps out with learning it: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;vim-adventures.com&#x2F;&quot;&gt;vim-adventures&lt;&#x2F;a&gt; (I haven’t paid for it yet but everyone recommends it)&lt;&#x2F;p&gt;
&lt;p&gt;I started preparing for my interviews using these two sites:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.algoexpert.io&#x2F;product&quot;&gt;AlgoExpert&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.algoexpert.io&#x2F;systems&#x2F;product&quot;&gt;SystemsExpert&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;I highly recommend both because there’s no real architecture course that is this complete I’ve seen, and the coding site is linear and provides great video explanations.&lt;&#x2F;p&gt;
&lt;p&gt;I looked at pay scales at &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.levels.fyi&#x2F;&quot;&gt;levels.fyi&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;I interviewed at several companies and eventually got a position as a DevOps engineer!&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>First Post</title>
        <published>2022-05-01T00:00:00+00:00</published>
        <updated>2022-05-01T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://kawalkowski.com/posts/first-post/"/>
        <id>https://kawalkowski.com/posts/first-post/</id>
        
        <content type="html" xml:base="https://kawalkowski.com/posts/first-post/">&lt;p&gt;I created a new site for my portfolio and a place for me to start writing about my career, personal thoughts, and ideas. To give a brief background on me, I’ve been in the software industry for more than five years now with an emphasis on DevOps. I read a lot of &lt;a href=&quot;https:&#x2F;&#x2F;news.ycombinator.com&#x2F;&quot;&gt;Hacker News&lt;&#x2F;a&gt; and have a continuous improvement mindset on software and my personal being.&lt;&#x2F;p&gt;
&lt;p&gt;The DevOps mentality can be described to a tee below:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;I choose a lazy person to do a hard job. Because a lazy person will find an easy way to do it.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;cite&gt;Bill Gates&lt;&#x2F;cite&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Why spend all of your precious time doing the hard stuff when you can automate it? There are so many tools out there now (and still being released!) that can save you so much time.&lt;&#x2F;p&gt;
&lt;p&gt;My website is built on &lt;a href=&quot;https:&#x2F;&#x2F;www.ruby-lang.org&#x2F;en&#x2F;&quot;&gt;Ruby&lt;&#x2F;a&gt; and &lt;a href=&quot;https:&#x2F;&#x2F;jekyllrb.com&#x2F;&quot;&gt;Jekyll&lt;&#x2F;a&gt;. Let’s say I clone my repo, have Ruby installed on my local machine, my deployment is successful and everything is working great. Now how would I track &lt;strong&gt;WHICH&lt;&#x2F;strong&gt; version of Ruby I’m using? What if I clone on a different machine with a different Ruby version? Will it still work? &lt;em&gt;Probably&lt;&#x2F;em&gt;, but why take the chance? This is where language version managers come in handy.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;rbenv&#x2F;rbenv&quot;&gt;rbenv&lt;&#x2F;a&gt; is a language version manager for Ruby. Simply put, it checks to see which Ruby version has been committed to the repository and uses that in the workflow. For example, I’m using Ruby version 3.1.2 on my machine, I commit a new file at the root directory named &lt;code&gt;.ruby-version&lt;&#x2F;code&gt; with &lt;code&gt;3.1.2&lt;&#x2F;code&gt; inside. Now all workflows, &lt;em&gt;assuming that it has&lt;&#x2F;em&gt; &lt;code&gt;rbenv&lt;&#x2F;code&gt; &lt;em&gt;installed&lt;&#x2F;em&gt;, can use the command &lt;code&gt;rbenv local&lt;&#x2F;code&gt; with a conditional &lt;code&gt;rbenv install&lt;&#x2F;code&gt; before starting the main workflow, and it will switch the Ruby version to what is defined in &lt;code&gt;.ruby-version&lt;&#x2F;code&gt; !&lt;&#x2F;p&gt;
&lt;p&gt;Similar tools are &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;nvm-sh&#x2F;nvm&quot;&gt;nvm&lt;&#x2F;a&gt; for node projects and &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;pyenv&#x2F;pyenv&quot;&gt;pyenv&lt;&#x2F;a&gt; for python projects.&lt;&#x2F;p&gt;
&lt;p&gt;I hope that my future posts can bring more insight on similar automation tasks or at least food for thought.&lt;&#x2F;p&gt;
</content>
        
    </entry>
</feed>
