<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>yahyaoncloud</title>
  <subtitle>yahyaoncloud is a cloud engineer specializing in cloud infrastructure, DevOps, and distributed systems.</subtitle>
  <link href="https://yahyaoncloud.com/feed.xml" rel="self"/>
  <link href="https://yahyaoncloud.com/"/>
  <updated>2024-04-18T00:00:00Z</updated>
  <id>https://yahyaoncloud.com/</id>
  <author>
    <name>Yahya</name>
    <email>yahyaoncloud@gmail.com</email>
  </author>
  
  
  <entry>
    <title>Why Does Docker Run in Layers?</title>
    <link href="https://yahyaoncloud.com/blog/why-does-docker-run-in-layers/"/>
    <updated>2024-04-18T00:00:00Z</updated>
    <id>https://yahyaoncloud.com/blog/why-does-docker-run-in-layers/</id>
    <content type="html">&lt;p&gt;If you have ever spun up a container on a fresh machine, you have probably stared at a terminal output that looks something like this:&lt;/p&gt;
&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ docker run -d -p 80:80 nginx
Unable to find image &#39;nginx:latest&#39; locally
latest: Pulling from library/nginx
7a5d12f3b9e4: Pull complete
9b3a721c5d80: Pull complete
5f410298a12e: Pull complete
d29a50e1837b: Pull complete
Digest: sha256:4d6423984534a742876...
Status: Downloaded newer image for nginx:latest&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Instead of downloading a single neat installer like &lt;code&gt;nginx.iso&lt;/code&gt; or &lt;code&gt;nginx.zip&lt;/code&gt;, Docker pulls a cascade of distinct cryptographic hashes, each extracting its own slice of files in parallel.&lt;/p&gt;
&lt;p&gt;Why does &lt;a href=&quot;https://docs.docker.com/&quot;&gt;Docker&lt;/a&gt; do this? Why not just hand you one monolithic virtual disk and call it a day?&lt;/p&gt;
&lt;p&gt;The answer lies in &lt;strong&gt;layered filesystems&lt;/strong&gt; and how the container lifecycle manages changes from build time to runtime.&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;What Actually Is a Docker Layer?&lt;/h3&gt;
&lt;p&gt;Think of a Docker image not as a heavy virtual hard drive, but as a stack of semi-transparent tracing paper sheets.&lt;/p&gt;
&lt;p&gt;Each layer represents an immutable snapshot of changes (added files, modified configs, or deleted binaries) introduced by a specific instruction in your &lt;code&gt;Dockerfile&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;language-dockerfile&quot;&gt;&lt;code class=&quot;language-dockerfile&quot;&gt;&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; python:3.11-slim           # Layer 1: Base Debian rootfs + Python binary&lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;WORKDIR&lt;/span&gt; /app                   # Layer 2: Working directory metadata&lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;COPY&lt;/span&gt; requirements.txt .        # Layer 3: Dependency manifest&lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;RUN&lt;/span&gt; pip install -r requirements.txt  # Layer 4: Installed packages&lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;COPY&lt;/span&gt; . .                       # Layer 5: Your actual application code&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;When Docker builds this image:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;It executes &lt;code&gt;FROM python:3.11-slim&lt;/code&gt;, pulling the pre-built base OS layer.&lt;/li&gt;
&lt;li&gt;It executes &lt;code&gt;WORKDIR /app&lt;/code&gt;, noting that directory state as an incremental layer.&lt;/li&gt;
&lt;li&gt;It copies &lt;code&gt;requirements.txt&lt;/code&gt; as another layer.&lt;/li&gt;
&lt;li&gt;It runs &lt;code&gt;pip install&lt;/code&gt;, creating a layer containing just the downloaded libraries.&lt;/li&gt;
&lt;li&gt;It copies your source code as the final layer.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Every layer is stored as a compressed tarball identified by its SHA-256 hash. Once created, an image layer is &lt;strong&gt;100% read-only and immutable&lt;/strong&gt;. It never mutates.&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;The Glue: Union Filesystems and OverlayFS&lt;/h3&gt;
&lt;p&gt;How does Linux turn four or five stacked folders into what looks like a standard unified Linux root filesystem (&lt;code&gt;/&lt;/code&gt;) inside your container?&lt;/p&gt;
&lt;p&gt;Docker uses a storage driver mechanism known as a &lt;strong&gt;Union File System&lt;/strong&gt; (most commonly &lt;a href=&quot;https://docs.docker.com/storage/storagedriver/overlayfs-driver/&quot;&gt;OverlayFS&lt;/a&gt;):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Lower Directories (&lt;code&gt;lowerdir&lt;/code&gt;)&lt;/strong&gt;: The stack of read-only image layers.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Merged Directory (&lt;code&gt;mergeddir&lt;/code&gt;)&lt;/strong&gt;: The unified virtual view presented to your running processes.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If Layer 1 contains &lt;code&gt;/etc/nginx/nginx.conf&lt;/code&gt; and Layer 4 replaces &lt;code&gt;/etc/nginx/nginx.conf&lt;/code&gt; with a custom configuration, OverlayFS merges them such that the file in the higher layer hides the file in the lower layer. To your process running inside the container, there is only one &lt;code&gt;/etc/nginx/nginx.conf&lt;/code&gt;.&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;The Container Lifecycle: Where Does My Data Go?&lt;/h3&gt;
&lt;p&gt;When you type &lt;code&gt;docker run&lt;/code&gt;, Docker does not make a full copy of the 500 MB image. If it did, spinning up ten containers would take minutes and consume gigabytes of disk space.&lt;/p&gt;
&lt;p&gt;Instead, Docker goes through a four-stage filesystem lifecycle:&lt;/p&gt;
&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;[ Container Process View: /mergeddir ]
                 ▲
                 │
┌────────────────┴────────────────┐
│  Thin Read-Write Container Layer │  ◄── Added on &quot;docker run&quot; (ephemeral)
├─────────────────────────────────┤
│  Layer 5: Application Source    │  (read-only)
├─────────────────────────────────┤
│  Layer 4: Installed Packages    │  (read-only)
├─────────────────────────────────┤
│  Layer 3: Dependency Manifest   │  (read-only)
├─────────────────────────────────┤
│  Layer 1: Base Linux OS         │  (read-only)
└─────────────────────────────────┘&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;1. Ignition: Slapping on the Writable Layer&lt;/h4&gt;
&lt;p&gt;When the container starts, Docker mounts the entire stack of image layers as read-only, and attaches one very thin &lt;strong&gt;read-write layer&lt;/strong&gt; (often called the &lt;em&gt;container layer&lt;/em&gt; or &lt;code&gt;upperdir&lt;/code&gt;) directly on top.&lt;/p&gt;
&lt;h4&gt;2. Copy-on-Write (CoW) in Action&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Reading files&lt;/strong&gt;: If your web server reads static assets, it reads directly down through the read-only image layers with zero overhead.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Modifying existing files&lt;/strong&gt;: If a process writes to an existing file that belongs to an image layer, the storage driver intercepts the write, makes a duplicate of that file up into the writable container layer, and modifies the copy there. The original file in the lower image layer remains untouched.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deleting files&lt;/strong&gt;: If you run &lt;code&gt;rm /app/config.json&lt;/code&gt;, Docker does not touch the read-only layer below. It creates a special &lt;em&gt;whiteout&lt;/em&gt; character device in the writable layer that masks the lower file from view.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;3. Container Stop (&lt;code&gt;docker stop&lt;/code&gt;)&lt;/h4&gt;
&lt;p&gt;When the container stops, its read-write layer stays frozen on disk. You can inspect logs, check modified files, or start it back up (&lt;code&gt;docker start&lt;/code&gt;) and pick up exactly where you left off.&lt;/p&gt;
&lt;h4&gt;4. Container Destruction (&lt;code&gt;docker rm&lt;/code&gt;)&lt;/h4&gt;
&lt;p&gt;The moment you delete the container with &lt;code&gt;docker rm&lt;/code&gt;, Docker simply unlinks and deletes that single, thin read-write layer. The underlying image layers stay untouched in the local cache, ready to power twenty other containers instantly.&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;Why This Architecture is a Game-Changer&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Storage Deduplication&lt;/strong&gt;: If you run ten instances of an API container based on &lt;code&gt;python:3.11-slim&lt;/code&gt;, that 150 MB base layer exists on your host disk &lt;strong&gt;exactly once&lt;/strong&gt;. Ten running containers consume 150 MB total, plus a few megabytes of writable scratch space.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lightning-Fast Builds via Layer Caching&lt;/strong&gt;: If you edit one line of code in &lt;code&gt;app.py&lt;/code&gt;, Docker realizes that layers 1 through 4 have not changed. It fetches them from cache in milliseconds and only rebuilds layer 5.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Network Bandwidth Savings&lt;/strong&gt;: When you push version &lt;code&gt;1.2.0&lt;/code&gt; of your microservice to an AWS ECR or Docker Hub registry, your CI/CD runner only uploads the 3 MB layer containing your new code, completely skipping the unchanged 300 MB operating system and library layers.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h3&gt;Key Takeaways for Production Dockerfiles&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Order from least-frequent to most-frequent changes&lt;/strong&gt;: Place OS package installs (&lt;code&gt;apt-get&lt;/code&gt;) and dependency resolutions (&lt;code&gt;npm install&lt;/code&gt;, &lt;code&gt;pip install&lt;/code&gt;) above your application source code (&lt;code&gt;COPY . .&lt;/code&gt;). That way, editing application code never invalidates your dependency cache.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Chain commands to keep layers lean&lt;/strong&gt;: Each &lt;code&gt;RUN&lt;/code&gt; creates a layer. Cleaning up package caches in a subsequent &lt;code&gt;RUN&lt;/code&gt; step does not reduce the image size because the previous layer is already committed. Always run cleanup in the same step: &lt;code&gt;apt-get update &amp;amp;&amp;amp; apt-get install -y nginx &amp;amp;&amp;amp; rm -rf /var/lib/apt/lists/*&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use Multi-Stage Builds&lt;/strong&gt;: Compile your binaries in a bloated build-stage layer, and &lt;code&gt;COPY&lt;/code&gt; only the final stripped executable into a clean, minimal scratch or distroless runtime layer.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;Further Reading&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.docker.com/storage/storagedriver/&quot;&gt;Docker Storage Drivers Overview&lt;/a&gt; — Official deep-dive into how OverlayFS and VFS handle layered storage.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.docker.com/develop/develop-images/dockerfile_best-practices/&quot;&gt;Best Practices for Writing Dockerfiles&lt;/a&gt; — Guide on structuring layers for minimal footprint and maximum cache reuse.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  
  
  <entry>
    <title>Starting with Go Programming</title>
    <link href="https://yahyaoncloud.com/blog/starting-with-go-programming/"/>
    <updated>2024-03-05T00:00:00Z</updated>
    <id>https://yahyaoncloud.com/blog/starting-with-go-programming/</id>
    <content type="html">&lt;p&gt;&lt;a href=&quot;https://go.dev/&quot;&gt;Go&lt;/a&gt; (often called Golang) is Google&#39;s open-source programming language designed for scalable, concurrent network servers and distributed cloud systems. It is statically typed, natively compiled, and deliberately minimalist.&lt;/p&gt;
&lt;h3&gt;Why Go is the Language of the Cloud&lt;/h3&gt;
&lt;p&gt;Most modern infrastructure software—including &lt;a href=&quot;https://kubernetes.io/&quot;&gt;Kubernetes&lt;/a&gt;, Docker, &lt;a href=&quot;https://developer.hashicorp.com/terraform&quot;&gt;Terraform&lt;/a&gt;, and &lt;a href=&quot;https://prometheus.io/&quot;&gt;Prometheus&lt;/a&gt;—is written in Go. The reasons are practical:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Lightweight Concurrency&lt;/strong&gt;: Goroutines and channels make concurrent programming lightweight and efficient, consuming only kilobytes of stack memory per goroutine.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fast Compilation &amp;amp; Single Binaries&lt;/strong&gt;: Compiles directly to native machine code without virtual machine overhead or external runtime dependencies.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Orthogonal Simplicity&lt;/strong&gt;: Minimalist syntax that eliminates unnecessary object-oriented bloat, favoring composition and explicit error handling.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Hello World&lt;/h3&gt;
&lt;pre class=&quot;language-go&quot;&gt;&lt;code class=&quot;language-go&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;package&lt;/span&gt; main

&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;fmt&quot;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    fmt&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Hello, World!&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Essential Learning Resources&lt;/h3&gt;
&lt;p&gt;To get started building production-grade services:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/tour/&quot;&gt;A Tour of Go&lt;/a&gt; — Interactive browser-based walkthrough of language fundamentals.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/doc/effective_go&quot;&gt;Effective Go&lt;/a&gt; — The definitive style and architectural guide from the Go core team.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pkg.go.dev/&quot;&gt;Go Packages (pkg.go.dev)&lt;/a&gt; — Central documentation index for the standard library and open-source packages.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  
  
  <entry>
    <title>What the heck is Ansible anyways?</title>
    <link href="https://yahyaoncloud.com/blog/what-the-heck-is-ansible-anyways/"/>
    <updated>2024-02-10T00:00:00Z</updated>
    <id>https://yahyaoncloud.com/blog/what-the-heck-is-ansible-anyways/</id>
    <content type="html">&lt;p&gt;&lt;a href=&quot;https://www.ansible.com/&quot;&gt;Ansible&lt;/a&gt; is an open-source IT automation engine, or as I like to call it, &lt;em&gt;&amp;quot;the thing that saves you from typing the same commands across 50 servers.&amp;quot;&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;Why Use Ansible?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Agentless&lt;/strong&gt;: No background daemons or custom agents required on target nodes. It orchestrates over standard SSH on Linux and WinRM on Windows.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Declarative &amp;amp; Idempotent&lt;/strong&gt;: Playbooks describe desired system state rather than sequential commands; re-running tasks does not mutate already-configured resources.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Human-Readable YAML&lt;/strong&gt;: Tasks and roles are organized using clear YAML syntax that acts as living infrastructure documentation.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Code Example: Deploying &lt;a href=&quot;https://nginx.org/&quot;&gt;Nginx&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Here is a standard idempotent task to install and configure an &lt;a href=&quot;https://nginx.org/&quot;&gt;Nginx&lt;/a&gt; web server:&lt;/p&gt;
&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Install Nginx web server
  &lt;span class=&quot;token key atrule&quot;&gt;apt&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; nginx
    &lt;span class=&quot;token key atrule&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; present
    &lt;span class=&quot;token key atrule&quot;&gt;update_cache&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; yes

&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Ensure Nginx is running and enabled
  &lt;span class=&quot;token key atrule&quot;&gt;service&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; nginx
    &lt;span class=&quot;token key atrule&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; started
    &lt;span class=&quot;token key atrule&quot;&gt;enabled&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; yes&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Documentation &amp;amp; Community Ecosystem&lt;/h3&gt;
&lt;p&gt;To learn more about automating your infrastructure:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.ansible.com/ansible/latest/getting_started/index.html&quot;&gt;Ansible Getting Started Guide&lt;/a&gt; — Official documentation and core concepts.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://galaxy.ansible.com/&quot;&gt;Ansible Galaxy&lt;/a&gt; — Public hub for discovering and sharing community-maintained roles and collections.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  
  
  <entry>
    <title>Welcome to YahyaOnCloud</title>
    <link href="https://yahyaoncloud.com/blog/welcome-to-yahyaoncloud/"/>
    <updated>2024-01-15T00:00:00Z</updated>
    <id>https://yahyaoncloud.com/blog/welcome-to-yahyaoncloud/</id>
    <content type="html">&lt;p&gt;Welcome to the official launch post for &lt;strong&gt;YahyaOnCloud&lt;/strong&gt;! This site serves as my technical notebook, engineering portfolio, and space for publishing deep dives on distributed systems, perimeter networking, and cloud architecture.&lt;/p&gt;
&lt;h3&gt;What to Expect&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Cloud Architecture&lt;/strong&gt;: Practical teardowns of production AWS, Azure, and hybrid infrastructure topologies.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Systems Engineering &amp;amp; Security&lt;/strong&gt;: Real-world security operations, intrusion detection engineering, and perimeter defense as explored in projects like the &lt;a href=&quot;https://yahyaoncloud.com/projects/eve-soc-homelab/&quot;&gt;SOC Homelab&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tooling &amp;amp; Cryptography&lt;/strong&gt;: Implementation guides spanning Go, Ansible, and zero-knowledge storage like &lt;a href=&quot;https://yahyaoncloud.com/projects/firewood/&quot;&gt;Firewood&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Operational Runbooks&lt;/strong&gt;: Hard-won lessons operating high-traffic platforms, optimizing cloud economics, and reducing MTTR.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Explore the Site&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Browse featured engineering case studies in &lt;a href=&quot;https://yahyaoncloud.com/projects/&quot;&gt;Projects&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Review my career timeline in &lt;a href=&quot;https://yahyaoncloud.com/experience/&quot;&gt;Experience&lt;/a&gt; and grab a copy of my &lt;a href=&quot;https://yahyaoncloud.com/resume/&quot;&gt;Resume&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Follow open-source developments directly on &lt;a href=&quot;https://github.com/yahyaoncloud&quot;&gt;GitHub&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  
</feed>
