<?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>It&amp;rsquo;s the question I&amp;rsquo;ve been asked at least a hundred times in the past year. And in 2025, with both services more mature than ever, the answer isn&amp;rsquo;t as straightforward as some blog posts might suggest.&lt;/p>
&lt;p>After helping dozens of companies make this decision (and sometimes reverse it), I&amp;rsquo;ve developed a nuanced perspective that goes beyond the usual &amp;ldquo;ECS is simpler, EKS is more powerful&amp;rdquo; oversimplification.&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 question 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, this time with analogies she could relate to. Here&amp;rsquo;s how I explained LLMs to my mom, and how you can explain them to yours.&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-revolution">The Engineer-to-Resource Ratio Revolution&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-made-ridiculously-simple">Enter Ollama: Local LLMs Made Ridiculously Simple&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; This counterintuitive statement, known as Brooks&amp;rsquo; Law, comes from Fred Brooks&amp;rsquo; seminal book &amp;ldquo;The Mythical Man Month,&amp;rdquo; published in 1975. Despite being nearly 50 years old, this principle remains painfully relevant in today&amp;rsquo;s consulting projects.&lt;/p>
&lt;p>As a consultant, I&amp;rsquo;ve witnessed this scenario play out repeatedly: a project falls behind schedule, and the immediate reaction is to add more people to &amp;ldquo;catch up.&amp;rdquo; What follows is almost always a disaster.&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 is the tool that will make you fall in love with serverless development again. It&amp;rsquo;s like 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 that will change your debugging life forever:&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! Now you can inspect the filesystem, check environment variables, and see what&amp;rsquo;s really happening.&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="enter-the-magical-sshconfig-file">Enter the magical ~/.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 simply 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;h3 id="why-this-is-life-changing">Why this is life-changing:&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Human-readable aliases&lt;/strong> instead of IP addresses&lt;/li>
&lt;li>&lt;strong>Automatic key selection&lt;/strong> without the -i flag&lt;/li>
&lt;li>&lt;strong>Jump hosts&lt;/strong> configured once, used forever&lt;/li>
&lt;/ul>
&lt;p>Your future self will thank you for taking 5 minutes to set this up today!&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 found the solution that changed everything.&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 that &lt;strong>I can make your work 50% less painful?&lt;/strong> Would you pay me a coffee? ☕&lt;/p>
&lt;p>Please refer to the YAML below&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>You can simply copy the YAML above and use &lt;code>pbpaste&lt;/code> to pipe your clipboard through the &lt;code>kubectl apply&lt;/code> with the command below:&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&amp;hellip; Turning this frustrating experience into something useful, I decided to build a tool that helps me (and potentially you) set a profile or context, 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>