--- /dev/null
-.author = "Sample Author",
+ ---
+ .title = "One of the best Skills I've learned as a Programmer",
+ .date = @date("2026-04-19T00:00:00"),
++.author = "Alexander Goussas",
+ .layout = "post.shtml",
+ .draft = false,
+ ---
+
+ There are many different skills one might invest it when getting into programming.
+ There is a plethora of programming languages, each with their unique appeal.
+ And within each language ecosystem, a plethora of web frameworks and stuff to learn.
+
+ But for me, one of the greatest investments came from something else altogether:
+ learning how to touch type.
+
+ For those of you that don't know, touch typing basically means typing without
+ looking at your keyboard. But I include in the definition typing with all your
+ fingers.
+
+ Before learning to touch type, I only used both my index fingers. I literally did
+ not use any other finger. One day, I decided to change that and started dedicating
+ a lot of time to acquiring the ability to touch type.
+
+ There was a free website I used for this, whose name I have since forgotten.
+ Something like typingrace of something like that.
+
+ Anywho, today, I can write at ~120 WPM, which is not a crazy speed, but pretty
+ respectable, if I may say so myself. Sometimes I just like typing whatever to feel
+ the vertigo as my fingers speed through my keyboard.
+
+ Also, this is a transferable skill, so if you can't touch type yet, I encourage you
+ to.
--- /dev/null
-.author = "Sample Author",
+ ---
+ .title = "How I Manage my Blog",
+ .date = @date("2026-04-30T00:00:00"),
++.author = "Alexander Goussas",
+ .layout = "post.shtml",
+ .draft = false,
+ ---
+
+ There is an accompanying video devlog available on YouTube, where I go more in
+ depth about how this stuff is actually implemented: <a
+ href="https://www.youtube.com/watch?v=c6z5A_PRodg">https://www.youtube.com/watch?v=c6z5A_PRodg</a>.
+
+ Recently I went down the Kubernetes rabbit-hole and automated my whole blog's
+ pipeline. From build to deployment. No GitHub actions or any other 3rd party CI
+ provider. All self-hosted, literally. Well, with the sole exception of
+ CloudFlare Tunnels, of course.
+
+ How did I do it?
+
+ For starters, my blog repository is deployed as static files in a NGINX Docker
+ container. As part of the build process, I execute a little CLI tool I built in
+ Zig to transform my posts from markdown to html.
+
+ So, I process the posts, build the image, tag it appropriately and push it to
+ Docker Hub. This is all automated in my git server, as we'll see in a minute.
+
+ Next, my stuff is hosted in a git server that I own. This server is exposed via
+ SSH and cloudflare tunnels. I have it configured to only allow public key
+ authentication and no root login, for example. Also, the SSH port is not
+ publicly exposed and is only accessible via cloudflared.
+
+ Now, Git has hooks for both server and client. In this case, we are interested
+ in the post-receive server hook. This hook runs after the changes have been
+ accepted by the server, so we have access to the latest code.
+
+ In my case, what the hook does is clone the repository from the bare repo in
+ the server, execute the build script (that is located in the cloned
+ repository), and finally executes a rollout in my Kubernetes cluster to pull
+ the latest image.
+
+ So, that's it. A pretty damn simple configuration, if I may say.
+
+ Next steps for me would be to configure redundancy for the disk where my git
+ stuff is. Right now I have the stuff in my local dev machine and on that
+ server, but ideally I'd want to make backups to an external drive periodically.
+
+ If you, dear reader, have any tips or tricks for me, please feel free to
+ contact me in whichever way you might deem appropriate.
--- /dev/null
-.author = "Sample Author",
+ ---
+ .title = "How I cut my expenses by a freaking lot",
+ .date = @date("2026-05-02T00:00:00"),
++.author = "Alexander Goussas",
+ .layout = "post.shtml",
+ .draft = false,
+ ---
+
+ Let's start with the why.
+
+ I have no family, and, as of the time of writing, no university degree either.
+ This means that were I to be fired from my current job, I'd have a hard time
+ (probably, I don't really know) finding a new one, and that I'd have no where
+ to go but the street. I <i>could</i> go to a friend's, but I would not want to
+ bother them like that.
+
+ Then, a few months ago I started seriously thinking about the role of AI in my
+ area of work. I do not think AI can replace developers (I've seen it try and
+ fail magnificently) but I am also aware of the fact that employers do think so,
+ and, at least in my environment, have already started putting into action plans
+ to cut personnel and replace humans with AI tools.
+
+ This led me to have a little crisis. I thought about switching careers and more
+ extreme things as well. As of today, I no longer have these feelings. I love
+ programming and I will continue doing it in whichever way I can. At the same
+ time, I was thinking: what is it that I really need to have a "happy" life? For
+ me, the answer is books, coffee and someplace I can walk in peace while
+ listening to podcasts and stuff.
+
+ As you can see, I need barely any money for these things. And right now I am
+ living in a city where I can do the latter. So, this realization led me to make
+ a budget. Write down how much money I actually need in order to live. This
+ resulted in a grand total of about 250 US dollars per month. Let's break it down.
+
+ I spend around 120 USD a month in groceries, 20 USD in laundry, 8 for YouTube
+ premium and ... well, that's it. I am excluding rent because I am in the
+ process of moving, but I am aiming to go somewhere under 200 USD. Right now I
+ am in a 500 USD apartment, but only because I took the first thing I found,
+ since I came fleeing Guayaquil after being almost murdered in the street.
+
+ What did I do in order to achieve this?
+
+ First, groceries. I started <i>really</i> looking at the prices of stuff I was
+ buying. I did not sacrifice quality for price. I found alternative products,
+ and bought at cheaper replaces. I also set a hard rule of absolutely no eating
+ out. Only in <i>very</i> special ocassions. You might try and gaslight yourself
+ into believing that you <i>need</i> to eat out in order to socialize or
+ whatever, but if you learned to cook well you could have friends at your house
+ for dinner, for example. I say from the bottom of my heart that I like my food
+ way more than a great deal of restaurants I've been to.
+
+ Next, I stopped smoking. This one is self-explanatory. Cigarrettes are freaking
+ expensive.
+
+ The other thing is I started doing as much as I can online. So for example,
+ books and classes for whatever are usually cheaper online. You don't have to
+ pay for delivery or transportation this way either.
+
+ Then, I started using the least amount of clothes possible. A week, I use 12
+ pieces of underwear, 6 shirts, 2 short and 1 sweater. Also, the cloth needs to
+ be as lightweight as possible. So, no jeans. This way, I took my laundry cost
+ from ~8USD a week to ~3USD. I live in a pretty cold city, but surprisingly I've
+ found that my body has adapted pretty well. I barely feel any cold anymore.
+
+ That's basically it. Pretty simple, but effective. I honestly think we've
+ gotten too lazy and used to the comforts of modernity, which is exactly what
+ our capitalistic society wants. They want us to cOnSOom.
+
+ I hope you got something useful from this, and I really encourage you to try
+ and get out of the trap of consumerism. If you can afford it. And if you have a
+ different perspective, please don't hesitate to share it.
--- /dev/null
--- /dev/null
++---
++.title = "On LinkedIn Connections",
++.date = @date("2026-05-05T00:00:00"),
++.author = "Alexander Goussas",
++.layout = "post.shtml",
++.draft = false,
++---
++
++A little while ago I sent a connnection request to Mr. Simon Peyton Jones. In
++case you don't know who he is, he's <a
++href="https://en.wikipedia.org/wiki/Simon_Peyton_Jones"> one of the major
++contributors to the creation of Haskell</a>.
++
++He replied asking me what the connection was about, which surprised me since it
++was the first time someone asked that. I said that I only wanted to follow him
++because I'm a long time Haskell fan. He then told me that that's ok, but that a
++note with the connection to make it more personal would have been better. And I
++agree.
++
++I often rant about how dehumanized human connection in social media is. Trolls
++everywhere saying shit they would not dare utter in person. It's as if when
++online, people really think they're the main character in an RPG and everyone
++else is an NPC.
++
++And yet, for a long time I've spammed connections on LinkedIn, precisely
++thinking I am a main character in an RPG, and connections items to be collected.
++But not anymore.
++
++My goal is henceforth to build a genuine network of people sharing cool stuff
++and caring at a personal level. People that actually interact with each other.
++
++So, if you want to connect, I'll be more than happy to. Just make sure you send
++your personal note on the request ;).
--- /dev/null
--- /dev/null
++---
++.title = "How to Intercept and Modify HTTP Requests",
++.date = @date("2026-05-13T00:00:00"),
++.author = "Alexander Goussas",
++.layout = "post.shtml",
++.draft = true,
++---
++
++This blog post comes with an accompanying YouTube video where I showcase a demo
++application and intercept its requests. Watch it here: TODO.
++
++You have a flashy HTTP API and everybody wants to talk to it. Great! But with
++great power comes great risk. All these fuckers could be sending bullshitty
++strings to your carefully (or rather, <i>not carefully</i>) crafted service.
++What's more, some shady hackers could be waiting, licking their lips and
++drooling all over, to do nasty stuff, such as modifying in-flight requests!
++
++Granted, my understanding is that tampering like this is not possible with
++encrypted protocols such as HTTPS. But alas, my security team knows better (I
++guess).
++
++So, in this post and from painful experience, I am going to show you a very
++cool tool you can use to intercept and modify requests to your APIs, so that
++you know what insidious vulnerabilities are hiding before the security guys.
++
++The tool in question is <a href="https://www.charlesproxy.com/">Charles</a>.
++
++## Installation and setup
++
++It's pretty freaking easy to set up. First, install it following the
++instructions here: https://www.charlesproxy.com/documentation/installation/.
++Then just run it!
++
++Capturing web traffic should work out of the box, but you have to configure the
++tool to allow for SSL capturing (HTTP<i>S</i>). For that, you can follow these
++instructions:
++https://www.charlesproxy.com/documentation/proxying/ssl-proxying/.
++
++You should add each hostname for which you want to enable SSL proxying in the
++configuration.
++
++## Configuring you mobile device for capturing
++
++Now, I was more interested in capturing mobile traffic from the emulator
++running on my machine. The steps are equally easy, if a little bit more
++involved.
++
++Actually no, it's dead simple. Basically, it should work out of the box. The <a
++href="https://www.charlesproxy.com/documentation/configuration/browser-and-system-configuration/">
++documentation</a> says that if you are not seeing your mobile traffic in
++Charles, you should make sure that Charles is <i>already running</i> before
++launching your simulator.
++
++Once that's done, you should be able to start intercepting requests coming from
++you emulator.
++
++## Intercepting requests (AKA Breakpoints)
++
++You can either set breakpoints at the host level or at the request level. For
++my use case, I wanted to intercept all requests going to my backend, so I
++activated breakpoints on the host.
++
++To do this, go to the TODO view, right click on your host and toggle the
++"Breakpoints" option. Then make a request and you should see execution pause a
++new window open in Charles where you can do things like aborting or canceling
++the request, allowing it through, or, in our case, modify it before sending it.
++
++You can select the option to modify the request and then alter the JSON
++payload.
++
++So that's it. I hope you found these instructions clear enough and sorry for
++not using images. I haven't gotten to decide where I would host such images
++yet.
<!DOCTYPE html>
<html>
+ <head id="head">
+ <meta charset="utf-8">
+ <meta name="viewport" content="initial-scale=1">
+ <meta name="author" content="Alexander Goussas">
+ <meta name="description" content="Blog about programming">
+ <script defer src="https://analytics.frustrated-labs.net/script.js" data-website-id="07e8f3db-bd2d-4186-a202-e4fda5684b35"></script>
+ <script defer src="https://analytics.frustrated-labs.net/recorder.js" data-website-id="07e8f3db-bd2d-4186-a202-e4fda5684b35" data-sample-rate="0.15" data-mask-level="moderate" data-max-duration="300000"></script>
+ <title>Alexander Goussas</title>
+ <link type="text/css" rel="stylesheet" href="/styles.css">
+ <link type="text/css" rel="stylesheet" href="/highlight.css">
+ <!-- mathtex -->
+ <link type="text/css" rel="stylesheet" href="/Temml-Local.css">
+ <script defer src="/temml.min.js"></script>
+ <script defer src="/render-mathtex.js"></script>
+ <!-- /mathtex -->
+
++<<<<<<< HEAD
+<head>
+ <meta charset="utf-8">
+ <title>Alexander Goussas | Programming & Friends</title>
+ <meta name="author" content="Alexander Goussas">
+ <meta name="description" content="Blog about programming">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <link href="./styles.css" rel="stylesheet">
+ <script defer src="https://analytics.frustrated-labs.net/script.js" data-website-id="07e8f3db-bd2d-4186-a202-e4fda5684b35"></script>
+ <script defer src="https://analytics.frustrated-labs.net/recorder.js" data-website-id="07e8f3db-bd2d-4186-a202-e4fda5684b35" data-sample-rate="0.15" data-mask-level="moderate" data-max-duration="300000"></script>
+</head>
+
+<body>
+ <header>
+ <nav>
+ <ul>
+ <li class="nav-item" style="background-color: yellow; color: black;">
+ <a href="/">home</a>
+ </li>
+ <li class="nav-item">
+ <a href="https://youtube.com/@aloussase" target="_blank">youtube</a>
+ </li>
+ <li class="nav-item" style="background-color: purple;">
+ <a href="https://github.com/aloussase" target="_blank">github</a>
+ </li>
+ <li class="nav-item" style="background-color: blue;">
+ <a href="https://linkedin.com/in/alexander-goussas" target="_blank">linkedin</a>
+ </li>
+ </ul>
+ </nav>
+ </header>
+
+ <h1 style="color: yellow;">Alexander Goussas</h1>
+ <h2 style="color: green; text-align: center;">Blog about programming & friends</h2>
+
+ <img id="logo" src="./logo.png" />
+ <img id="hornet" src="./hornet.png" />
+
+ <section id="posts">
+ <h2 style="color: yellow;">Posts</h2>
+ <ul>
+ <li><a href="./2026-05-05-on-linkedin-connections.md.html">On LinkedIn Connections</a></li>
+ <li><a href="./2026-05-01-how-i-cut-my-expenses-by-a-freaking-lot.md.html">How I cut my expenses by a freaking lot</a></li>
+ <li><a href="./2026-04-30-how-i-manage-my-blog.md.html">How I manage my blog with my own Git server and Kubernetes</a></li>
+ <li><a href="./2026-04-19-one-of-the-best-skills-ive-learned-as-a-programmer.md.html">One of the best skills I've learned as a programmer</a></li>
+ </ul>
+ </section>
+ <script src="js/script.js"></script>
+</body>
++=======
+ </head>
+ <body id="body">
+ <img id="logo" src="/logo.png">
+ <img id="hornet" src="/hornet.png">
+ <header>
+ <nav>
+ <ul>
+ <li class="nav-item" style="background-color: yellow; color: black;">
+ <a href="/">home</a>
+ </li>
+ <li class="nav-item">
+ <a href="https://youtube.com/@aloussase" target="_blank">youtube</a>
+ </li>
+ <li class="nav-item" style="background-color: purple;">
+ <a href="https://github.com/aloussase" target="_blank">github</a>
+ </li>
+ <li class="nav-item" style="background-color: blue;">
+ <a href="https://linkedin.com/in/alexander-goussas" target="_blank">linkedin</a>
+ </li>
+ <li class="nav-item" style="background-color: red;">
+ <a href="/rss.xml" target="_blank">rss</a>
+ </li>
+ </ul>
+ </nav>
+ </header>
+
+ <h1>Programming and Friends</h1>
+ <div></div>
+ <div>
+ <h2>Posts</h2>
+ <div>
+ <div class="post-preview">
+ <span class="date">May 02, 2026</span>
+ <a href="/2026-05-01-how-i-cut-my-expenses-by-a-freaking-lot/">
+ <h3>How I cut my expenses by a freaking lot</h3>
+ </a>
+ </div>
+
+ <div class="post-preview">
+ <span class="date">April 30, 2026</span>
+ <a href="/2026-04-30-how-i-manage-my-blog/">
+ <h3>How I Manage my Blog</h3>
+ </a>
+ </div>
+
+ <div class="post-preview">
+ <span class="date">April 19, 2026</span>
+ <a href="/2026-04-19-one-of-the-best-skills-ive-learned-as-a-programmer/">
+ <h3>One of the best Skills I've learned as a Programmer</h3>
+ </a>
+ </div>
+ </div>
+ </div>
++>>>>>>> rss-feed
+ <footer>
+ <hr>
+ </footer>
+ </body>
</html>