Jekyll2023-06-18T13:00:29+00:00https://www.alexrs.me/feed.xml:alejandroIdeas and thoughts about software, computers and scalability.A simple MessagePack decoder for TheThingsNetwork2023-04-14T12:00:00+00:002023-04-14T12:00:00+00:00https://www.alexrs.me/2023/messagepack-decoder-ttn<p>I’ve been working on a project for university that involves Arduino, LoRaWAN, and <a href="https://www.thethingsnetwork.org/">TheThingsNewtork</a>. To transmit data efficiently, we decided to use <a href="https://msgpack.org/">MessagePack</a>, which is supposed to be efficient and fast (disclaimer: I haven’t done much research to confirm if this is the best option).</p>
<p>However, I wasn’t able to find a JavaScript function with no external dependencies to decode the MessagePack message. So, with the help of Github Copilot, my debugging skills, and ChatGPT, I arrived at this solution:</p>
<script src="https://gist.github.com/alexrs/3a00dd680578cb7f3a1f7eb70846ff7b.js"></script>
<p>It’s not a complete solution, but it seems to work for my use case. Hopefully, it can be useful for you too.</p>I’ve been working on a project for university that involves Arduino, LoRaWAN, and TheThingsNewtork. To transmit data efficiently, we decided to use MessagePack, which is supposed to be efficient and fast (disclaimer: I haven’t done much research to confirm if this is the best option).Technology That Works2023-02-09T12:00:00+00:002023-02-09T12:00:00+00:00https://www.alexrs.me/2023/technology-that-works<p>I have the feeling that in the last few years, technology has become overly complex. I used to be excited about new software releases, and new devices.
Now, I mostly wait until my laptop tells me that I have to upgrade the OS or I won’t get any more security patches.</p>
<p>However, there are two devices I have been using recently that reminded me how exciting technology can be: <a href="https://remarkable.com/">Remarkable</a>
and <a href="https://beeline.co/pages/beeline-cycling">Beeline Velo 2</a>.</p>
<p>They do one thing, but well. I don’t need to charge them every day. I can’t use them to procrastinate. They have a net positive impact on my life.</p>
<p>I guess that when a business model doesn’t rely on hijhacking people’s attention to show them ads, technology can feel exciting again.</p>I have the feeling that in the last few years, technology has become overly complex. I used to be excited about new software releases, and new devices. Now, I mostly wait until my laptop tells me that I have to upgrade the OS or I won’t get any more security patches.Interesting Stuff April Week22021-04-11T00:00:00+00:002021-04-11T00:00:00+00:00https://www.alexrs.me/2021/interesting-stuff-april-week2<h1 id="table-of-contents">Table of Contents</h1>
<ol>
<li><a href="#orgb6611a7">Read</a></li>
<li><a href="#orgdf539a6">Watch</a></li>
</ol>
<p>It’s been a busy week, so I didn’t have much time to consume content.</p>
<p><a id="orgb6611a7"></a></p>
<h1 id="read">Read</h1>
<ul>
<li><strong><a href="https://jvns.ca/blog/learn-how-things-work/">Get better at programming by learning how things work</a>:</strong> Learning how things work makes us better at programming, as we can reason new problems from first principles.</li>
</ul>
<p><a id="orgdf539a6"></a></p>
<h1 id="watch">Watch</h1>
<ul>
<li><strong><a href="https://www.imdb.com/title/tt9415632/">Merlí. Sapere Aude (ESP)</a>:</strong> Started watching the second season of this show. Worth watching.</li>
</ul>Table of ContentsIntroduction to Kubernetes2021-04-05T14:00:00+00:002021-04-05T14:00:00+00:00https://www.alexrs.me/2021/intro-to-kubernetes<h1 id="resources">Resources</h1>
<ul>
<li><a href="https://www.youtube.com/watch?v=X48VuDVv0do">Kubernetes Tutorial for Beginners Video</a></li>
</ul>
<h1 id="what-is-kubernetes">What is Kubernetes?</h1>
<p>Kubernetes is an open source container orchestration tool. It helps you manage containerized applications in different deployment environments. Kubernetes guarantees high availability, scalability, and disaster-recovery.</p>
<h1 id="kubernetes-components">Kubernetes components</h1>
<p>Kubernetes has a lot of components, but most of the time we only need a handful of them.</p>
<h5 id="node">Node</h5>
<p>It’s a simple server. Can be a physical or virtual machine.</p>
<h5 id="pod">Pod</h5>
<p>It’s the smallest unit in Kubernetes. It’s an abstraction over a container. Usually a Pod runs one container, although it’s possible to run multiple containers on the same pod. To communicate pods, Kubernetes offers a virtual network. Each pod (NOT container) gets its own IP address. Pods are ephemeral, they can also die easily.</p>
<p>When that happens a new pod is created to replace the old one, and it gets assigned a new IP address. This is why a Service component is used</p>
<p><img src="../../assets/images/intro-to-kubernetes-image11.png" alt="" /></p>
<h5 id="service">Service</h5>
<p>A Service is a static (or permanent) IP address that can be attached to each pod. The lifecycle of a Pod and a Service are independent.</p>
<p>We might want our application to be accessible through a web browser. For that, we need an external service, but we would need to access our own application as <code class="language-plaintext highlighter-rouge">http://ip:port</code>, which is not very user friendly. To solve this problem we can use another component: Ingress</p>
<h5 id="ingress">Ingress</h5>
<p>A request goes first to Ingress and it does the forwarding to the Service.</p>
<p><img src="../../assets/images/intro-to-kubernetes-image1.png" alt="" /></p>
<h5 id="configmap">ConfigMap</h5>
<p>A ConfigMap is the external configuration of your application. Pods can read the configuration from ConfigMaps.</p>
<p>Some parts of the configuration can be usernames, or passwords, but putting credentials into ConfigMaps is not recommended. For this, we can use another component called Secret.</p>
<h5 id="secret">Secret</h5>
<p>A secret is a ConfigMap used to store secret data in Base64</p>
<p><img src="../../assets/images/intro-to-kubernetes-image12.png" alt="" /></p>
<h5 id="volumes">Volumes</h5>
<p>With the previously described setup, if the database pod is restarted, we will lose data. Volumes attach a physical storage to the pod. That storage can be local or remote.</p>
<h5 id="deployment">Deployment</h5>
<p>If our application pod crashes our application will experience some downtime. To avoid that, we can replicate our setup across different servers.</p>
<p><img src="../../assets/images/intro-to-kubernetes-image9.png" alt="" /></p>
<p>In this case, the Service will act as a load balancer, sending the request to the pod that is less busy. To define this setup we will use the Deployment component, in which we can specify the number of replicas. In practice, we will mostly work with deployments and not with Pods.</p>
<h5 id="statefulset">StatefulSet</h5>
<p>It’s important to note that we can’t replicate a database using a Deployment. This is because a database has a state. If we have database replicas, all of them should access the same, shared data storage.</p>
<p>We will need some mechanism to manage writes and reads to avoid data inconsistencies.</p>
<p>This mechanism is offered by the StatefulSet component. THis component is meant specifically for applications like databases</p>
<p><img src="../../assets/images/intro-to-kubernetes-image7.png" alt="" /></p>
<h1 id="kubernetes-architecture">Kubernetes Architecture</h1>
<p>Let’s start with a setup of one node with two application pods running on it. Each node has multiple pods on it. There are 3 processes that must be installed on every node:</p>
<ol>
<li>Container Runtime</li>
<li>Kubelet: interacts with both the container and the node</li>
<li>Kubeproxy: responsible for forwarding requests from services to pods</li>
</ol>
<p><img src="../../assets/images/intro-to-kubernetes-image6.png" alt="" /></p>
<h3 id="master-nodes">Master nodes</h3>
<p>How do we interact with the cluster?</p>
<p>How to:</p>
<ul>
<li>Schedule a pod?</li>
<li>Monitor?</li>
<li>reschedule/restart pod?</li>
<li>Join a new node?</li>
</ul>
<p>All of this is done by master nodes. Master nodes have completely different processes running inside:</p>
<ul>
<li>API Server: it’s the cluster gateway. It also acts as a gatekeeper for authentication.</li>
</ul>
<p><img src="../../assets/images/intro-to-kubernetes-image8.png" alt="" /></p>
<ul>
<li>Scheduler: Schedules new pods. It schedules pods in a smart way depending on the available resources. THe scheduler only decides where to schedule the new pod. The kubelet is in charge of starting this new pod.</li>
<li>Controller manager: detects state changes, such as pods crashing</li>
<li>etcd: key-value store of the cluster state. It’s the “cluster brain”</li>
</ul>
<h4 id="add-a-new-masternode-server">Add a new master/node server</h4>
<ol>
<li>Get a new server</li>
<li>Install all the master/worker node processes</li>
<li>Add it to the cluster</li>
</ol>
<h3 id="minikube-and-kubectl">Minikube and kubectl</h3>
<p>Minikube allows us to create a kubernetes cluster in our local machine.</p>
<p>Kubectl is a command line tool that allows us to interact with the cluster</p>
<h4 id="commands">Commands</h4>
<h5 id="create-deployment">Create deployment</h5>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>kubectl create deployment [name]
</code></pre></div></div>
<h5 id="edit-deployment">Edit deployment</h5>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>kubectl edit deployment [name]
</code></pre></div></div>
<h5 id="delete-deployment">Delete deployment</h5>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>kubectl delete deployment [name]
</code></pre></div></div>
<h5 id="status-of-kubernetes-components">Status of kubernetes components</h5>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>kubectl get nodes|pods|services|replicaset|deployment
</code></pre></div></div>
<h5 id="debugging-pods">Debugging pods</h5>
<p><strong>Logs</strong></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>kubectl logs [pod name]
</code></pre></div></div>
<p><strong>Terminal</strong></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>kubectl exec -it [pod name] -- /bin/bash
</code></pre></div></div>
<h5 id="use-config-file">Use config file</h5>
<p><strong>Apply a config</strong></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>kubectl apply -f [file]
</code></pre></div></div>
<p><strong>Delete a config:</strong></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>kubectl delete -f [file]
</code></pre></div></div>
<h1 id="yaml-configuration-file">YAML configuration file</h1>
<p>Every configuration file in kubernetes has 3 parts:</p>
<ol>
<li>Metadata: This part contains information such as the name</li>
<li>Specification: Each component config file will have a specification to declare the configuration that we want to apply to the component. The attributes in the specification are specific to the <code class="language-plaintext highlighter-rouge">kind</code> of the component</li>
<li>Status: This part is automatically created by Kubernetes. If the actual state and the desired state don’t match, kubernetes will try to fix it. The status data comes from etcd</li>
</ol>
<h3 id="layers-of-abstraction">Layers of Abstraction</h3>
<p>Deployment manages a …</p>
<p>ReplicaSet manages a …</p>
<p>Pod is an abstraction of …</p>
<p>Container</p>
<p>Inside the specification there’s a template field that contains its own metadata and spec section. This is a blueprint for a pod where the name and the image are specified, among other things.</p>
<h3 id="connecting-components">Connecting Components</h3>
<p>The way the connection is established is using labels and selectors. The metadata part contains labels and the spec contains selectors. In the metadata we give components a key-value pair. Pods get the label through the template blueprint. This label is matched by the selector.</p>
<p>Deployments have their own label. In the specification of a service we define a selector that makes a connection between the service and the deployment or its pods.</p>
<p>Ports are also needed to be configured in the service and pod</p>
<h3 id="ports-in-services-and-pods">Ports in Services and Pods</h3>
<p>A service has a port where it is accessible.</p>
<p><img src="../../assets/images/intro-to-kubernetes-image5.png" alt="" /></p>
<p>targetPort should match containerPort</p>
<h1 id="kubernetes-namespaces">Kubernetes Namespaces</h1>
<p><img src="../../assets/images/intro-to-kubernetes-image2.png" alt="" /></p>
<p>Resources can be organized in namespaces. We can think of a namespace as a virtual cluster inside a cluster. Kubernetes creates 4 namespaces by default. kubectl get namespaces returns the list of namespaces:</p>
<ul>
<li>kubernetes-dashboard: only with minikube</li>
<li>kube-system: not designed for our use, therefore we should not modify it.</li>
<li>kube-public: contains publicly accessible data</li>
<li>kube-node-lease: information about heartbeats of nodes. It determines availability of nodes.</li>
<li>default: resources we create are located here</li>
</ul>
<p>We can create our own namespaces: kubectl create namespace NAME</p>
<p>We can also create namespaces with a namespace config file. But when should we use namespaces? Imagine you only have the default namespace, where we create all the resources. If we have a complex application with multiple deployments, replicasets, services, etc. Our default namespace is going to be filled with different components. This will make it difficult to have an overview of what’s in there.</p>
<p>Namespaces can be used to group resources that are related.</p>
<p><img src="../../assets/images/intro-to-kubernetes-image15.png" alt="" /></p>
<p>Namespaces can also be used to limit access or resources. There are several characteristics of namespaces:</p>
<ul>
<li>You can’t access most resources from another namespace: For instance, each namespace must define its own ConfigMap</li>
<li>A Service can be shared across namespaces</li>
<li>Some components can’t be created within a namespace: they live globally in the cluster. Some examples are volumes. To list them we can use kubectl api-resources –namespaced=false</li>
</ul>
<p>To create components in a namespace we can use the kubectl apply command with the --namespace flag.</p>
<p>Another way is to add the information inside the configuration file, in the metadata section</p>
<h1 id="kubernetes-ingress">Kubernetes Ingress</h1>
<p>Let’s imagine a simple kubernetes cluster with an app and a service</p>
<p><img src="../../assets/images/intro-to-kubernetes-image10.png" alt="" /></p>
<p>We want to be able to access the application from a web browser. One way to do this is through a externa; service using an IP address and the port. With Ingress we can access our app using a domain name.</p>
<p>The request will now first reach the Ingress, and Ingress will redirect it to the internal service.</p>
<p><img src="../../assets/images/intro-to-kubernetes-image4.png" alt="" /></p>
<p>Ingress components are defined on a YAML file using the <code class="language-plaintext highlighter-rouge">kind: ingress</code> attribute. In the <code class="language-plaintext highlighter-rouge">spec</code> we have routing rules, where we define the service to route the request.</p>
<p>In the Ingress configuration, <code class="language-plaintext highlighter-rouge">backend</code> is the target where the incoming request will be redirected. <code class="language-plaintext highlighter-rouge">serviceName</code> should correspond to the internal service name defined in the Service configuration. <code class="language-plaintext highlighter-rouge">servicePort</code> and <code class="language-plaintext highlighter-rouge">port</code> should also match. The only difference between this internal service and an external one is that for the internal service we don’t need to define the <code class="language-plaintext highlighter-rouge">nodePort</code> attribute.</p>
<h3 id="configure-ingress">Configure Ingress</h3>
<p>Creating the Ingress component alone won’t be enough for ingress’ routing rules to work. We need an implementation for ingress, called Ingress Controller.</p>
<p><img src="../../assets/images/intro-to-kubernetes-image16.png" alt="" /></p>
<p>The Ingress controlled pod does evaluation and processing of ingress rules, and also manages redirections. This is the entry point to the cluster. There are several implementations available.</p>
<p>If we use a cloud provider (Google Cloud, AWS, etc), they usually provide a cloud load balancer solution. On the other hand if we are deploying our own kubernetes cluster on a bare metal environment, we would have to do that part.</p>
<h1 id="kubernetes-volumes">Kubernetes Volumes</h1>
<p>Volumes are used to persist data in kubernetes, as kubernetes doesn’t give us data persistence out of the box, and therefore by default, storage depends on the pod lifecycle.</p>
<p>The storage must be independent of the pod lifecycle, and also available on all nodes, as we don’t know in which node our pod will be restarted. Storage also needs to survive even if the cluster crashes.</p>
<h3 id="persistent-volume">Persistent Volume</h3>
<p>A persistent volume is a cluster resource (like RAM or CPU) that is used to store data. It is created via a YAML file, with the <code class="language-plaintext highlighter-rouge">PersistentVolume</code> kind.</p>
<p>A persistent volume acts as an interface but we still need to create and manage the type of storage. Persistent values are NOT namespaced. This means that they are accessible to the whole cluster.</p>
<p><img src="../../assets/images/intro-to-kubernetes-image13.png" alt="" /></p>
<h3 id="local-vs-remote-volume-types">Local vs remote volume types</h3>
<p>Local volume types are tied to a specific node, and don’t survive to cluster crashes. For DB persistence, we should use remote volumes.</p>
<h3 id="persistent-volume-claim-component">Persistent Volume Claim Component</h3>
<p>Applications have to claim the Persistent Volume. We do that using the Persistent Volume Claim (PVC). The PVC claims a volume with certain characteristics. The Persistent Volume that satisfies the claim will be used. In the app Pod specification we need to reference the PVC.</p>
<p><img src="../../assets/images/intro-to-kubernetes-image14.png" alt="" /></p>
<p>Note here that claims must exist in the same namespace as the Pod using the claim.</p>
<h3 id="configmap-and-secret">ConfigMap and Secret</h3>
<p>ConfigMaps and Secrets are local volumes that are not created using Persistent Volumes and PVCs.</p>
<h3 id="storage-class">Storage Class</h3>
<p>Storage Class provisions Persistent Volumes dynamically when PVC claims it. It can be created with a YAML config file using the <code class="language-plaintext highlighter-rouge">StorageClass</code> kind.</p>
<ol>
<li>Pod claims storage via PVC</li>
<li>PVC request storage from Storage Class (SC)</li>
<li>SC creates Persistent Volume that meets the needs of the Claim</li>
</ol>
<h3 id="kubernetes-statefulset">Kubernetes StatefulSet</h3>
<p>A StatefulSet is a kubernetes component used to stateful applications, this is, applications that store data to keep track of their state.</p>
<p>StateLESS applications are deployed using Deployment</p>
<p>StateFUL applications are deployed using StatefulSet</p>
<h3 id="deployment-vs-statefulset">Deployment vs. StatefulSet</h3>
<p>Replicating stateful applications is difficult and has some requirements that stateless applications don’t have. A Stateful Set maintains a “sticky” identity for each of its posd. These pods are created from the same specification but are not interchangeable. Each one has a persistent ID that is maintained across re-scheduling.</p>
<p>The pods are not interchangeable because one of them will act as the main writer and the rest as the read replicas. In addition, each pod in a statefulset gets its own DNS endpoint from a Service. When a Pod in a StatefulSet restarts, its IP address will change but its name and endpoint stays the same.</p>
<p>There are some tasks that we need to do:</p>
<ul>
<li>Configuring the cloning and data synchronization</li>
<li>Make remote storage available</li>
<li>Managing and backup</li>
</ul>
<h1 id="kubernetes-services">Kubernetes Services</h1>
<p>As we explained before, Pods are ephemeral and when one dies and is rescheduled, it gets assigned a new IP address. Therefore, it doesn’t make sense to use Pod’s IP addresses directly. A Service solves this problem by representing a stable IP address. It also acts as a load balancer. There are several types of services in kubernetes.</p>
<p>ClusterIP Service (AKA Internal Service)</p>
<p>Probably the most common one. It’s the default type of a Service.</p>
<p><img src="../../assets/images/intro-to-kubernetes-image3.png" alt="" /></p>
<p>But how does a Service know which Pods to forward the request to? And which port?</p>
<p>A service identifies its member pods using selectors. In the YAML file from which we create the service we specify the selector attributes that pods should have to match that selector. To know the right port, we need to specify it in the <code class="language-plaintext highlighter-rouge">targetPort</code> attribute in the Service YAML file</p>
<h3 id="headless-service">Headless Service</h3>
<p>Imagine if a client wants to communicate with a specific Pod directly, or a Pod wants to talk to another pod directly. It won’t make sense to talk to the Service endpoint because it will randomly select one of the pods. This happens when we deploy stateful applications, because the Pod replicas are not identical.</p>
<p>If we set <code class="language-plaintext highlighter-rouge">clusterIP</code> to none in the Service specification, kubernetes will return the Pod IP instead.</p>
<h3 id="service-types">Service Types</h3>
<p>When we define a Service we can specify a type. This attribute accepts three different values:</p>
<ul>
<li>ClusterIP</li>
<li>NodePort</li>
<li>LoadBalancer</li>
</ul>
<h5 id="nodeport">NodePort</h5>
<p>Creates a Service that is accessible on a static port on each worker node in the cluster. To compare that to <code class="language-plaintext highlighter-rouge">clusterIP</code>, <code class="language-plaintext highlighter-rouge">clusterIP</code> services are only accessible within the cluster itself, so no external traffic can directly address the <code class="language-plaintext highlighter-rouge">clusterIP</code> service.</p>
<p><code class="language-plaintext highlighter-rouge">NodePort</code>, however, makes external traffic accessible on a static port on each worker node.</p>
<h5 id="loadbalancer">LoadBalancer</h5>
<p>A service becomes accessible externally through a cloud provider’s load balancing functionality.</p>ResourcesInteresting Stuff: April Week 12021-04-04T14:00:00+00:002021-04-04T14:00:00+00:00https://www.alexrs.me/2021/interesting-stuff-april-week1<h1 id="table-of-contents">Table of Contents</h1>
<ol>
<li><a href="#org7b72e28">Read</a></li>
<li><a href="#orga04b83a">Watch</a></li>
</ol>
<p><a id="org7b72e28"></a></p>
<h1 id="read">Read</h1>
<ul>
<li><strong><a href="https://www.hillelwayne.com/post/linked-lists/">Why Do Interviewers Ask Linked List Questions?</a>:</strong> Tech interviews are broken. We all know that. But why do we ask certain questions? Is the interview process another form of cargo cult?</li>
</ul>
<p><a id="orga04b83a"></a></p>
<h1 id="watch">Watch</h1>
<ul>
<li><strong><a href="https://youtube.com/watch?v=K3odScka55A&feature=share">Why you can’t compare Covid-19 vaccines</a>:</strong> Science is difficult. We never have ideal conditions to test our hypothesis. This video explains why we can’t really compare different COVID-19 vaccines, and also that 100% efficacy is not the goal.</li>
<li><strong><a href="https://www.imdb.com/title/tt2024544/">12 Years a Slave</a>:</strong> It took me a few years to watch this movie, but wow, if you are reading this and haven’t watched it yet, do it!</li>
<li><strong><a href="https://www.imdb.com/title/tt13087512/">Last Chance U: Basketball</a>:</strong> It’s interesting to see how sports (basketball in this case) can serve as a motor to achieve a better life.</li>
</ul>Table of ContentsInteresting Stuff: March Week 42021-03-28T14:00:00+00:002021-03-28T14:00:00+00:00https://www.alexrs.me/2021/interesting-stuff-march-week4<h1 id="table-of-contents">Table of Contents</h1>
<ol>
<li><a href="#orgc177cf4">Listen</a></li>
<li><a href="#orgb4caf27">Read</a></li>
<li><a href="#org450388d">Watch</a></li>
</ol>
<p><a id="orgc177cf4"></a></p>
<h1 id="listen">Listen</h1>
<ul>
<li><strong><a href="https://open.spotify.com/episode/71D3da3NxGyoIl9WHKilkY?si=mo7i2YK2T9SyIHTeYTlctw">The Joy of x - Sharon Glotzer’s Deep Curiosity About Order From Chaos</a>:</strong> Great podcast about (computational) physics, research, and science in general.</li>
</ul>
<p><a id="orgb4caf27"></a></p>
<h1 id="read">Read</h1>
<ul>
<li>
<p><strong><a href="https://github.com/rails/rails/pull/41760">Give precedence to the DatabaseTasks registered last</a>:</strong> If you are creating a custom adapter for ActiveRecord, the Database tasks couldn’t be overriden by your adapter if it contained an existing adapter’s name in its name. We fixed that!</p>
</li>
<li>
<p><strong><a href="https://www.goodreads.com/book/show/16128880-take-back-the-economy">Take Back the Economy: An Ethical Guide for Transforming Our Communities</a>:</strong> We all live in, and belong to a community. What can we do to help our community’s economy? How can we live a more sustainable life? This book provides answers and tools to approach this questions.</p>
</li>
</ul>
<p><a id="org450388d"></a></p>
<h1 id="watch">Watch</h1>
<ul>
<li><strong><a href="https://www.imdb.com/title/tt3661210/">The Dig</a>:</strong> Now that I’m living in the UK, I guess I need to learn more about this country. This movie tells the discovery of <a href="https://www.nationaltrust.org.uk/sutton-hoo">Sutton Hoo</a>. Very interesting, and entertaining.</li>
</ul>Table of ContentsInteresting Stuff: March Week 32021-03-21T14:00:00+00:002021-03-21T14:00:00+00:00https://www.alexrs.me/2021/interesting-stuff-march-week3<h1 id="table-of-contents">Table of Contents</h1>
<ol>
<li><a href="#org20c63a0">Watch</a></li>
<li><a href="#org6310cd5">Listen</a></li>
<li><a href="#org1fb4b71">Read</a></li>
</ol>
<p><a id="org20c63a0"></a></p>
<h1 id="watch">Watch</h1>
<ul>
<li><strong><a href="https://www.imdb.com/title/tt6571548/">The White Tiger</a>:</strong> There are several ways to escape poverty. I guess this is one of them.</li>
<li><strong><a href="https://www.imdb.com/title/tt8266310/">Blinded by the Light</a>:</strong> Some people really like Bruce Springsteen. This is also a story of finding your own identity, and the stuggles that first generation immigrants experience.</li>
<li><strong><a href="https://www.imdb.com/title/tt11989890/">David Attenborough: A Life on Our Planet</a>:</strong> David Attenborough narrates how our plantet has changed during his lifetime, and discussed some of the challenges that we are facing: climate change, wildlife extiction, etc.</li>
</ul>
<p><a id="org6310cd5"></a></p>
<h1 id="listen">Listen</h1>
<ul>
<li><strong><a href="https://open.spotify.com/episode/7tfv5sg65t12ZaQQp8H1Sl?si=HgFgATYoQviFOQD_w1K1wg">La Canica Azul - E03 - Renovables (ESP)</a>:</strong> In this episode, renewable energies are discussed, with a focus on what needs to be done to reduce carbon emissions.</li>
<li><strong><a href="https://open.spotify.com/episode/1kN6V9OwAVqgUJfhoLpLbB?si=RsFr90yFRRqj3PPVSe9HUg">TIL about climate impacts</a>:</strong> Is still unclear how climate change will affect different parts of the world. Some might even benefit! In this episode, it is discussed how climate change will impact different countries and communities.</li>
</ul>
<p><a id="org1fb4b71"></a></p>
<h1 id="read">Read</h1>
<ul>
<li><strong><a href="https://www.profgalloway.com/the-algebra-of-wealth/">The Algebra of Wealth</a>:</strong> What makes someone wealthy? How can we achieve financial security?</li>
</ul>Table of ContentsInteresting Stuff: March Week 22021-03-14T14:00:00+00:002021-03-14T14:00:00+00:00https://www.alexrs.me/2021/interesting-stuff-march-week2<h1 id="table-of-contents">Table of Contents</h1>
<ol>
<li><a href="#orgd7df41a">Read</a></li>
<li><a href="#orgaeec20e">Listen</a></li>
</ol>
<p><a id="orgd7df41a"></a></p>
<h1 id="read">Read</h1>
<ul>
<li><strong><a href="https://lethain.com/migrations/">Migrations: the sole scalable fix to tech debt</a>:</strong> Software migrations are a powerful tool to reduce tech debt, but they are also difficul to get right. This post shares some tips on how to effectively migrate large systems.</li>
<li><strong><a href="https://lars.hupel.info/articles/routing-the-interview/">Routing the technical interview</a>:</strong> Tech intervewiews as its best. Some fun read to end your week!</li>
</ul>
<p><a id="orgaeec20e"></a></p>
<h1 id="listen">Listen</h1>
<ul>
<li><strong><a href="https://open.spotify.com/show/3n9rdUxp4307MuFJJIP8eE?si=Jg5FMBuVR2mSQtTHDAgzHA">TILClimate</a>:</strong> Last week I shared an episode of this podcast. During the last few days, I’ve been listening to more of them, and it’s so good! Go listen to it!</li>
</ul>Table of ContentsInteresting Stuff: March Week 12021-03-07T14:00:00+00:002021-03-07T14:00:00+00:00https://www.alexrs.me/2021/interesting-stuff-march-week-1<h1 id="table-of-contents">Table of Contents</h1>
<ol>
<li><a href="#org0d7875a">Watch</a></li>
<li><a href="#org3e6a94a">Read</a></li>
<li><a href="#orgff9edb1">Listen</a></li>
</ol>
<p><a id="org0d7875a"></a></p>
<h1 id="watch">Watch</h1>
<ul>
<li><strong><a href="https://www.imdb.com/title/tt1950186/">Ford v Ferrari</a>:</strong> Cars, engineering, and a good story. Pretty nice movie to watch if you are into those things.</li>
<li><strong><a href="https://youtube.com/watch?v=WGKIjojADmg&feature=share">The Physics of Windmill Design</a>:</strong> Clean energy generation is a thrilling topic. Why are windmills designed the way they are? What are the principles behind them?</li>
<li><strong><a href="https://youtube.com/watch?v=BOHG-TGip3Q&feature=share">Behind Costco’s Treasure-Hunt Shopping Strategy - WSJ</a>:</strong> Costco was one of my favorite places when I was living in Canada. Why Costco stores are designed the way they are? How do they profit? Why can they survive during a pandemic with barely any presence online?</li>
<li><strong><a href="https://youtube.com/watch?v=eAdanPfQdCA&feature=share">The Astounding Physics of N95 Masks</a>:</strong> We all wear masks now, but how do they work? This video explains the design of N95, and it’s pretty interesting.</li>
</ul>
<p><a id="org3e6a94a"></a></p>
<h1 id="read">Read</h1>
<ul>
<li><strong><a href="https://siderea.dreamwidth.org/1477942.html">The Vimes Boots Theory: Further Reflections</a>:</strong> Interesting reflection about why rich (or wealthy) people stay rich. The tl;dr is that people with money usually know how to get the most out of an investment, and they can afford it in the first place. That gives them an advantage with respect to people that don’t have that knowledge, or can’t afford the initial investment.</li>
</ul>
<p><a id="orgff9edb1"></a></p>
<h1 id="listen">Listen</h1>
<ul>
<li><strong><a href="https://open.spotify.com/episode/46d6PdSZ4zue9JJiNLAiJL?si=BU2IvC4SRa64i6EYmUhC0w">TIL about planes</a>:</strong> How do planes contribute to global warming? Why do people say that we should stop flying? The whole TILclimate is a good introduction to some of the climate change topics.</li>
</ul>Table of ContentsInteresting Stuff: Feb. Week 42021-02-28T14:00:00+00:002021-02-28T14:00:00+00:00https://www.alexrs.me/2021/interesting-stuff-feb-week-4<h1 id="table-of-contents">Table of Contents</h1>
<ol>
<li><a href="#org38b9132">Watch</a></li>
<li><a href="#orgf35c3a9">Listen</a></li>
<li><a href="#org3cb0909">Read</a></li>
</ol>
<p><a id="org38b9132"></a></p>
<h1 id="watch">Watch</h1>
<ul>
<li><strong><a href="https://www.youtube.com/watch?v=WZ81-McOgdM">Noam Chomsky – Neoliberalism, Democracy and the Climate Crisis</a>:</strong> Noam Chomsky is one of the most interesting persons in the world. He’s considered the father of modern linguistics. Here, he discuss politics, and the climate crisis. His ability to disect complexity and break it into little gems of wisdom is ashtonishing.</li>
<li><strong><a href="https://www.netflix.com/title/81183727">Crime Scene: The Vanishing at the Cecil Hotel</a>:</strong> I have to admit that these kind of shows are my guilty pleasure. I consider myself to be skeptical of everything, so I find very interesting to hear people that believe in conspiracy theories, and the reasons they give to support their ideas.</li>
<li><strong><a href="https://www.youtube.com/watch?v=2z7o3sRxA5g">How highways make traffic worse</a>:</strong> This video explains how induced demand can create more congestion, and some alternatives to make traffic better.</li>
<li><strong><a href="https://www.youtube.com/watch?v=x-DgL49CFlM">Space-Filling Curves - Numberphile</a>:</strong> Is it possible to fill space with a cuve? Yes! Maths can be beautiful and surprising. And space-filing curves can be used to map multi-dimensional data to one dimension.</li>
</ul>
<p><a id="orgf35c3a9"></a></p>
<h1 id="listen">Listen</h1>
<ul>
<li><strong><a href="https://open.spotify.com/episode/53wiaIu3aOg1UCZyzTn6GF?si=rdPRRqPqSIi-zfsuLPnaow&nd=1">Exit-stage plight: Brexit’s costs come due</a>:</strong> Consequences of Brexit and how UK and Europe need to adapt to the new trading barriers.</li>
</ul>
<p><a id="org3cb0909"></a></p>
<h1 id="read">Read</h1>
<ul>
<li><strong><a href="https://rootsofprogress.org/exponential-growth-is-the-baseline">Exponential growth is the baseline</a>:</strong> Should we expect exponential growth in research and innovation? Is it sustainable over time?</li>
</ul>Table of Contents