<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Tech Pills</title><link>https://txt.felipe.cloud/</link><description>Recent content on Tech Pills</description><generator>Hugo</generator><language>en</language><lastBuildDate>Wed, 23 Apr 2025 00:00:00 +0000</lastBuildDate><atom:link href="https://txt.felipe.cloud/index.xml" rel="self" type="application/rss+xml"/><item><title>AWS Container Orchestration in 2025: ECS vs EKS - Beyond the Basics</title><link>https://txt.felipe.cloud/posts/16-eks-vs-ecs-2025/</link><pubDate>Wed, 23 Apr 2025 00:00:00 +0000</pubDate><guid>https://txt.felipe.cloud/posts/16-eks-vs-ecs-2025/</guid><description>&lt;h3 id="were-moving-to-containers-but-should-we-use-ecs-or-eks">&amp;ldquo;We&amp;rsquo;re moving to containers, but should we use ECS or EKS?&amp;rdquo;&lt;/h3>
&lt;p>I&amp;rsquo;ve been asked this at least a hundred times in the past year. And in 2025, with both services more mature than ever, there still isn&amp;rsquo;t a clean universal answer.&lt;/p>
&lt;p>After helping dozens of companies make this call (and sometimes reverse it), I&amp;rsquo;ve stopped giving the &amp;ldquo;ECS is simpler, EKS is more powerful&amp;rdquo; shortcut. It&amp;rsquo;s not wrong. It&amp;rsquo;s just not enough.&lt;/p></description></item><item><title>Multimodal AI: When Text-Only LLMs Aren't Enough</title><link>https://txt.felipe.cloud/posts/14-multimodal-ai/</link><pubDate>Tue, 15 Apr 2025 00:00:00 +0000</pubDate><guid>https://txt.felipe.cloud/posts/14-multimodal-ai/</guid><description>&lt;h3 id="can-you-tell-me-whats-wrong-with-this-circuit-diagram">&amp;ldquo;Can you tell me what&amp;rsquo;s wrong with this circuit diagram?&amp;rdquo;&lt;/h3>
&lt;img src="https://txt.felipe.cloud/images/circuit.gif" alt="circuit diagram">&lt;p>I sent this message to ChatGPT along with a photo of a circuit board I was troubleshooting. The response? &amp;ldquo;I&amp;rsquo;m sorry, but I can&amp;rsquo;t see any images you&amp;rsquo;ve shared.&amp;rdquo;&lt;/p>
&lt;p>Right. Text-only AI has its limits.&lt;/p>
&lt;p>But the latest generation of AI models, multimodal models, can see images, hear sounds, and even understand video. They&amp;rsquo;re changing what&amp;rsquo;s possible with AI, and they&amp;rsquo;re already more accessible than you might think.&lt;/p></description></item><item><title>How LLMs Actually Work: Explaining AI to My Mom Over Video Call</title><link>https://txt.felipe.cloud/posts/12-how-llms-work/</link><pubDate>Sun, 30 Mar 2025 00:00:00 +0000</pubDate><guid>https://txt.felipe.cloud/posts/12-how-llms-work/</guid><description>&lt;h3 id="so-how-does-this-chatgpt-thing-actually-work">&amp;ldquo;So how does this ChatGPT thing actually work?&amp;rdquo;&lt;/h3>
&lt;p>My mom asked me this during our weekly video call. Living thousands of kilometers apart means these calls are our main connection, and they often turn into impromptu tech support sessions. She&amp;rsquo;d been using ChatGPT to help write emails and was genuinely curious about what was happening behind the scenes.&lt;/p>
&lt;p>As I started explaining neural networks and transformers, I could see her eyes glazing over through the pixelated FaceTime screen. So I tried again with analogies she could actually follow.&lt;/p></description></item><item><title>Container Efficiency: Why One Engineer Can Manage 1000x More Containers than VMs</title><link>https://txt.felipe.cloud/posts/11-container-efficiency/</link><pubDate>Sat, 22 Mar 2025 00:00:00 +0000</pubDate><guid>https://txt.felipe.cloud/posts/11-container-efficiency/</guid><description>&lt;h3 id="still-managing-vms-like-its-2010">Still managing VMs like it&amp;rsquo;s 2010?&lt;/h3>
&lt;p>We&amp;rsquo;ve all been there: provisioning a new VM for each application, waiting 10+ minutes for it to boot, then spending hours configuring the OS, installing dependencies, and troubleshooting conflicts. And don&amp;rsquo;t get me started on patching and maintenance.&lt;/p>
&lt;h3 id="the-engineer-to-resource-ratio">The engineer-to-resource ratio&lt;/h3>
&lt;p>Here&amp;rsquo;s a stat that should make you rethink your infrastructure: while a typical operations engineer can manage around 100-200 virtual machines, that same engineer can handle 10,000+ containers.&lt;/p></description></item><item><title>Local LLMs: Run AI Models on Your Laptop Without Internet</title><link>https://txt.felipe.cloud/posts/10-local-llms-ollama/</link><pubDate>Fri, 14 Mar 2025 00:00:00 +0000</pubDate><guid>https://txt.felipe.cloud/posts/10-local-llms-ollama/</guid><description>&lt;h3 id="tired-of-paying-for-api-calls-and-sharing-your-code-with-the-cloud">Tired of paying for API calls and sharing your code with the cloud?&lt;/h3>
&lt;img src="https://txt.felipe.cloud/images/local-ai.gif" alt="local ai">&lt;p>We&amp;rsquo;ve all been there: hitting rate limits on OpenAI&amp;rsquo;s API, worrying about sensitive code being uploaded to some distant server, or trying to code on a plane with spotty Wi-Fi. What if you could run powerful AI models right on your laptop, completely offline?&lt;/p>
&lt;h3 id="enter-ollama-local-llms-no-cloud-required">Enter Ollama: local LLMs, no cloud required&lt;/h3>
&lt;p>Ollama lets you run large language models locally with minimal setup. No cloud accounts, no API keys, no usage limits.&lt;/p></description></item><item><title>The Mythical Man Month in Consulting</title><link>https://txt.felipe.cloud/posts/09-mythical-man-month/</link><pubDate>Thu, 06 Mar 2025 00:00:00 +0000</pubDate><guid>https://txt.felipe.cloud/posts/09-mythical-man-month/</guid><description>&lt;h3 id="why-adding-more-people-to-a-late-project-makes-it-later">Why adding more people to a late project makes it later&lt;/h3>
&lt;img src="https://txt.felipe.cloud/images/jake.gif" alt="mythical man month">&lt;p>&amp;ldquo;Adding manpower to a late software project makes it later.&amp;rdquo; Brooks&amp;rsquo; Law, from Fred Brooks&amp;rsquo; 1975 book &amp;ldquo;The Mythical Man Month.&amp;rdquo; The book is nearly 50 years old and still describes exactly what I watch happen on consulting projects.&lt;/p>
&lt;p>As a consultant, I&amp;rsquo;ve seen this play out more times than I can count. A project falls behind, the client panics, and someone decides the solution is more people. What follows is almost always a mess.&lt;/p></description></item><item><title>SAM CLI: Serverless Made Simple (or million lines terraform?)</title><link>https://txt.felipe.cloud/posts/08-sam-cli/</link><pubDate>Wed, 26 Feb 2025 00:00:00 +0000</pubDate><guid>https://txt.felipe.cloud/posts/08-sam-cli/</guid><description>&lt;h3 id="still-deploying-lambda-functions-by-hand">Still deploying Lambda functions by hand?&lt;/h3>
&lt;img src="https://txt.felipe.cloud/images/bbq-sim.gif" alt="meme">&lt;p>We&amp;rsquo;ve all been there: manually zipping code, uploading to S3, configuring triggers, setting up API Gateway&amp;hellip; it&amp;rsquo;s enough to make you question if serverless is actually worth it. Or worse, writing hundreds of lines of Terraform just to deploy a simple function.&lt;/p>
&lt;h3 id="enter-aws-sam-cli">Enter AWS SAM CLI&lt;/h3>
&lt;p>AWS Serverless Application Model (SAM) CLI cuts through all of that. Think of it as Docker Compose for Lambda functions.&lt;/p></description></item><item><title>Kubernetes: Debug Pods Like a Pro</title><link>https://txt.felipe.cloud/posts/07-k8s-debug/</link><pubDate>Tue, 18 Feb 2025 00:00:00 +0000</pubDate><guid>https://txt.felipe.cloud/posts/07-k8s-debug/</guid><description>&lt;h3 id="ever-stared-at-a-crashloopbackoff-wondering-what-went-wrong">Ever stared at a CrashLoopBackOff wondering what went wrong?&lt;/h3>
&lt;img src="https://txt.felipe.cloud/images/evergreen.gif" alt="meme">&lt;p>We&amp;rsquo;ve all been there: looking at a failing pod with no idea why it&amp;rsquo;s not starting. The logs are empty, and you&amp;rsquo;re about to lose your mind.&lt;/p>
&lt;h3 id="enter-the-ephemeral-debug-container">Enter the ephemeral debug container&lt;/h3>
&lt;p>Kubernetes 1.23+ has a feature worth knowing about:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:2;-o-tab-size:2;tab-size:2;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>kubectl debug -it failing-pod-xyz --image=busybox --target=failing-container
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>This attaches a debug container to your existing pod without restarting it. You can inspect the filesystem, check environment variables, and see what&amp;rsquo;s actually happening inside.&lt;/p></description></item><item><title>SSH Config: The file you've been ignoring</title><link>https://txt.felipe.cloud/posts/06-ssh-config/</link><pubDate>Mon, 10 Feb 2025 00:00:00 +0000</pubDate><guid>https://txt.felipe.cloud/posts/06-ssh-config/</guid><description>&lt;h3 id="are-you-still-typing-full-ssh-commands-like-its-2005">Are you still typing full SSH commands like it&amp;rsquo;s 2005?&lt;/h3>
&lt;img src="https://txt.felipe.cloud/images/typing-furiously.gif" alt="meme">&lt;p>We&amp;rsquo;ve all been there: typing out the same SSH commands over and over:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:2;-o-tab-size:2;tab-size:2;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>ssh -i ~/.ssh/special_key.pem user@ec2-54-234-56-78.compute-1.amazonaws.com
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="the-sshconfig-file">The ~/.ssh/config file&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:2;-o-tab-size:2;tab-size:2;">&lt;code class="language-fallback" data-lang="fallback">&lt;span style="display:flex;">&lt;span># ~/.ssh/config
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Host bastion
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> HostName ec2-54-234-56-78.compute-1.amazonaws.com
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> User ec2-user
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> IdentityFile ~/.ssh/special_key.pem
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Host prod-db
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> HostName 10.0.5.12
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> User admin
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ProxyJump bastion
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Now you can type:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:2;-o-tab-size:2;tab-size:2;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>ssh bastion
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="font-style:italic"># or&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ssh prod-db
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>You get readable aliases instead of raw IPs, key selection without the &lt;code>-i&lt;/code> flag, and jump hosts that stay configured. Five minutes to set up, and you never type that garbage again.&lt;/p></description></item><item><title>The git alias that changed my life</title><link>https://txt.felipe.cloud/posts/05-gitlog/</link><pubDate>Sun, 02 Feb 2025 00:00:00 +0000</pubDate><guid>https://txt.felipe.cloud/posts/05-gitlog/</guid><description>&lt;h3 id="ever-get-lost-in-your-git-log">Ever get lost in your git log?&lt;/h3>
&lt;img src="https://txt.felipe.cloud/images/lost-in-code.png" alt="meme">&lt;p>We&amp;rsquo;ve all been there: trying to figure out what happened in a project by staring at the default &lt;code>git log&lt;/code> output. It&amp;rsquo;s like trying to read a novel written on receipt paper.&lt;/p>
&lt;p>After years of squinting at commit hashes and timestamps, I finally stopped suffering.&lt;/p>
&lt;h3 id="the-one-git-alias-you-actually-need">The one git alias you actually need&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:2;-o-tab-size:2;tab-size:2;">&lt;code class="language-fallback" data-lang="fallback">&lt;span style="display:flex;">&lt;span>git config --global alias.lg &amp;#39;log --graph --pretty=format:&amp;#34;%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)&amp;lt;%an&amp;gt;%Creset&amp;#34; --abbrev-commit&amp;#39;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Now just type &lt;code>git lg&lt;/code> and behold:&lt;/p></description></item><item><title>How to ctrl+v straight to your k8s cluster on mac</title><link>https://txt.felipe.cloud/posts/04-pbpaste/</link><pubDate>Sat, 25 Jan 2025 00:00:00 +0000</pubDate><guid>https://txt.felipe.cloud/posts/04-pbpaste/</guid><description>&lt;h3 id="so-you-are-following-a-long-tutorial">So you are following a long tutorial&amp;hellip;&lt;/h3>
&lt;p>And you are getting bloody tired of copying and pasting all the YAMLs&amp;hellip; urgh.&lt;br>
What if I told you I can make your work 50% less painful? Would you pay me a coffee? ☕&lt;/p>
&lt;p>Here&amp;rsquo;s the YAML:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:2;-o-tab-size:2;tab-size:2;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="font-weight:bold">apiVersion&lt;/span>: v1
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="font-weight:bold">kind&lt;/span>: Pod
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="font-weight:bold">metadata&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="font-weight:bold">name&lt;/span>: definitely-not-prod
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="font-weight:bold">labels&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="font-weight:bold">owner&lt;/span>: &lt;span style="font-style:italic">&amp;#34;friday-5pm-dev&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="font-weight:bold">spec&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="font-weight:bold">containers&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="font-weight:bold">name&lt;/span>: chaos-container
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="font-weight:bold">image&lt;/span>: busybox
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="font-weight:bold">command&lt;/span>: [&lt;span style="font-style:italic">&amp;#34;sh&amp;#34;&lt;/span>, &lt;span style="font-style:italic">&amp;#34;-c&amp;#34;&lt;/span>, &lt;span style="font-style:italic">&amp;#34;echo &amp;#39;Deploying... just kidding!&amp;#39; &amp;amp;&amp;amp; sleep 3600&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="font-weight:bold">lifecycle&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="font-weight:bold">postStart&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="font-weight:bold">exec&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="font-weight:bold">command&lt;/span>: [&lt;span style="font-style:italic">&amp;#34;/bin/sh&amp;#34;&lt;/span>, &lt;span style="font-style:italic">&amp;#34;-c&amp;#34;&lt;/span>, &lt;span style="font-style:italic">&amp;#34;echo &amp;#39;Context set correctly?&amp;#39;&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="font-weight:bold">preStop&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="font-weight:bold">exec&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="font-weight:bold">command&lt;/span>: [&lt;span style="font-style:italic">&amp;#34;/bin/sh&amp;#34;&lt;/span>, &lt;span style="font-style:italic">&amp;#34;-c&amp;#34;&lt;/span>, &lt;span style="font-style:italic">&amp;#34;echo &amp;#39;Goodbye, cruel cluster!&amp;#39;&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="font-weight:bold">restartPolicy&lt;/span>: Never
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="font-weight:bold">nodeSelector&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="font-weight:bold">coffee-supply&lt;/span>: &lt;span style="font-style:italic">&amp;#34;critical&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Copy it, then pipe your clipboard straight into kubectl:&lt;/p></description></item><item><title> Easy way to handle aws cli multi profile</title><link>https://txt.felipe.cloud/posts/03-awsctx/</link><pubDate>Fri, 17 Jan 2025 00:00:00 +0000</pubDate><guid>https://txt.felipe.cloud/posts/03-awsctx/</guid><description>&lt;h3 id="have-you-ever-run-a-command-on-the-wrong-account">Have you ever run a command on the wrong account?&lt;/h3>
&lt;img src="https://txt.felipe.cloud/images/this-is-fine.gif" alt="meme">&lt;p>It happened once: I deployed a production stack into the sandbox account and had no idea why it wasn&amp;rsquo;t working. So I built a tool to handle AWS profile switching, similar to &lt;a href="https://github.com/ahmetb/kubectx">kubectx&lt;/a>.&lt;/p>
&lt;p>It&amp;rsquo;s a simple shell function that you add to your &lt;code>.bashrc&lt;/code> or &lt;code>.zshrc&lt;/code>, and it loads whenever you start a new shell session. It&amp;rsquo;s called &lt;code>awsctx&lt;/code> (yes, very creative).&lt;/p></description></item><item><title>How to expose your localhost</title><link>https://txt.felipe.cloud/posts/02-localhosting/</link><pubDate>Thu, 09 Jan 2025 00:00:00 +0000</pubDate><guid>https://txt.felipe.cloud/posts/02-localhosting/</guid><description>&lt;h3 id="hey-take-a-look-at-my-website">Hey, take a look at my website..&lt;/h3>
&lt;img src="https://txt.felipe.cloud/images/localhost01.png" alt="meme">&lt;p>Recently I was deploying something to my kind kubernetes cluster and wondered how I could show the work to my colleague. In the past I played with &lt;a href="https://ngrok.com">ngrok&lt;/a> to expose my localhost to the interwebs, but on kubernetes I would need to do some portforwarding kung-fu that was not an option.&lt;/p>
&lt;p>Then I saw that &lt;a href="https://github.com/ngrok/ngrok-operator">Ngrok launched an operator&lt;/a> that can easily expose your dodgy containers to the web with a simple creation of a Ingress.&lt;/p></description></item><item><title>First post?</title><link>https://txt.felipe.cloud/posts/01-first-post/</link><pubDate>Wed, 01 Jan 2025 00:00:00 +0000</pubDate><guid>https://txt.felipe.cloud/posts/01-first-post/</guid><description>&lt;h3 id="how-to-be-successful">&lt;a href="https://blog.samaltman.com/how-to-be-successful">How To Be Successful&lt;/a>&lt;/h3>
&lt;ol>
&lt;li>Compound yourself&lt;/li>
&lt;li>Have almost too much self-belief&lt;/li>
&lt;li>Learn to think independently&lt;/li>
&lt;li>Get good at &amp;ldquo;sales&amp;rdquo;&lt;/li>
&lt;li>Make it easy to take risks&lt;/li>
&lt;li>Focus&lt;/li>
&lt;li>Work hard&lt;/li>
&lt;li>Be bold&lt;/li>
&lt;li>Be willful&lt;/li>
&lt;li>Be hard to compete with&lt;/li>
&lt;li>Build a network&lt;/li>
&lt;li>You get rich by owning things&lt;/li>
&lt;li>Be internally driven&lt;/li>
&lt;/ol>
&lt;p>By Sam Altman&lt;/p></description></item></channel></rss>