<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Posts on ayyzenn</title><link>https://ayyzenn.github.io/posts/</link><description>Recent content in Posts on ayyzenn</description><generator>Hugo -- 0.163.3</generator><language>en-us</language><lastBuildDate>Sat, 07 Mar 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://ayyzenn.github.io/posts/index.xml" rel="self" type="application/rss+xml"/><item><title>RESTful API with Web Scraping: My FastAPI + Flask Project</title><link>https://ayyzenn.github.io/posts/restful-api-web-scraping-pipelines/</link><pubDate>Sat, 07 Mar 2026 00:00:00 +0000</pubDate><guid>https://ayyzenn.github.io/posts/restful-api-web-scraping-pipelines/</guid><description>&lt;h2 id="what-this-project-is"&gt;What This Project Is&lt;/h2&gt;
&lt;p&gt;I built a backend that scrapes websites, stores data in PostgreSQL and MongoDB, and exposes REST APIs through FastAPI and Flask. I made it as a portfolio piece — something I could demo and actually run on my machine.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="1-what-does-this-project-do-simple-explanation"&gt;1. What Does This Project Do? (Simple Explanation)&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;This project is a data aggregator backend.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Scrape&lt;/strong&gt; product or article data from websites&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Store&lt;/strong&gt; that data in two databases (PostgreSQL for structured data, MongoDB for flexible logs)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Expose REST APIs&lt;/strong&gt; so other apps can create, read, update, and delete data&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Call external APIs&lt;/strong&gt; and return the results&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can think of it as:&lt;/p&gt;</description></item><item><title>Jenkins + Docker Pipeline from GitHub</title><link>https://ayyzenn.github.io/posts/docker-pipeline-from-github/</link><pubDate>Tue, 10 Feb 2026 00:00:00 +0000</pubDate><guid>https://ayyzenn.github.io/posts/docker-pipeline-from-github/</guid><description>&lt;h2 id="what-i-built"&gt;What I Built&lt;/h2&gt;
&lt;p&gt;I wanted Jenkins to pull code from GitHub, build a Docker image, and run a container automatically. This post is the pipeline I put together for that.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="goal-from-manual-to-automatic"&gt;Goal: From Manual to Automatic&lt;/h2&gt;
&lt;p&gt;Manually, we usually do this:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Clone a GitHub repository&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;docker build&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;docker run&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Check the output&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;With Jenkins, all of this happens &lt;strong&gt;automatically&lt;/strong&gt; when the pipeline runs.&lt;/p&gt;
&lt;p&gt;You click &lt;strong&gt;Build Now&lt;/strong&gt; (or trigger from GitHub), and Jenkins does the rest.&lt;/p&gt;</description></item><item><title>Jenkins on Arch Linux: How I Set It Up on i3</title><link>https://ayyzenn.github.io/posts/jenkins-on-arch-linux/</link><pubDate>Mon, 09 Feb 2026 00:00:00 +0000</pubDate><guid>https://ayyzenn.github.io/posts/jenkins-on-arch-linux/</guid><description>&lt;h2 id="why-i-wrote-this"&gt;Why I Wrote This&lt;/h2&gt;
&lt;p&gt;I run Arch Linux with i3 and wanted Jenkins locally for CI/CD experiments. This covers Java 21, the Jenkins install, a test job, and a GitHub pipeline — exactly what I ran on my machine.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="1-what-is-jenkins-simple-explanation"&gt;1. What is Jenkins? (Simple Explanation)&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Jenkins is an automation server.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You can tell Jenkins to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Get your code (for example from GitHub)&lt;/li&gt;
&lt;li&gt;Run commands (build, test, scripts)&lt;/li&gt;
&lt;li&gt;Show you if things passed or failed&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Instead of you running commands manually every time, Jenkins does it &lt;strong&gt;automatically&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Ansible: Docker and Kubernetes Node Setup</title><link>https://ayyzenn.github.io/posts/ansible_adv/</link><pubDate>Sat, 17 Jan 2026 00:00:00 +0000</pubDate><guid>https://ayyzenn.github.io/posts/ansible_adv/</guid><description>&lt;h2 id="why-this-post-exists"&gt;Why This Post Exists&lt;/h2&gt;
&lt;p&gt;After writing my &lt;strong&gt;first real Ansible playbook&lt;/strong&gt;, I realized something:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Installing software manually once is easy.
Installing it &lt;strong&gt;correctly, repeatedly, and safely&lt;/strong&gt; is not.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So I decided to automate something &lt;strong&gt;real&lt;/strong&gt; and &lt;strong&gt;useful&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Install &lt;strong&gt;Docker Engine (official way)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Prepare an Ubuntu server to become a &lt;strong&gt;Kubernetes node&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Do everything using &lt;strong&gt;Ansible&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;No SSH-ing into the server again and again&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This post documents that journey.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="real-setup-same-as-before"&gt;Real Setup (Same as Before)&lt;/h2&gt;
&lt;p&gt;Nothing fancy. Just real machines.&lt;/p&gt;</description></item><item><title>Ansible for Beginners: My First Real Automation</title><link>https://ayyzenn.github.io/posts/ansible/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><guid>https://ayyzenn.github.io/posts/ansible/</guid><description>&lt;h2 id="what-is-ansible-in-simple-words"&gt;What is Ansible? (In Simple Words)&lt;/h2&gt;
&lt;p&gt;Think of &lt;strong&gt;Ansible as a remote control for your servers&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Instead of:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SSH into server&lt;/li&gt;
&lt;li&gt;Run commands manually&lt;/li&gt;
&lt;li&gt;Forget what you changed&lt;/li&gt;
&lt;li&gt;Repeat the same steps again and again&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You tell Ansible:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“Hey, I want this server to look &lt;em&gt;like this&lt;/em&gt;.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And Ansible makes it happen — &lt;strong&gt;again and again&lt;/strong&gt;, without breaking things.&lt;/p&gt;
&lt;p&gt;The best part?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;No agent needed&lt;/li&gt;
&lt;li&gt;Just SSH&lt;/li&gt;
&lt;li&gt;Simple YAML files&lt;/li&gt;
&lt;li&gt;Very human-readable&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="my-setup-real-world"&gt;My Setup (Real World)&lt;/h2&gt;
&lt;p&gt;This is exactly what I used:&lt;/p&gt;</description></item><item><title>Terraform: How I Stopped Clicking Around in AWS</title><link>https://ayyzenn.github.io/posts/terraform/</link><pubDate>Sun, 14 Dec 2025 00:00:00 +0000</pubDate><guid>https://ayyzenn.github.io/posts/terraform/</guid><description>&lt;h2 id="what-terraform-is-for-me"&gt;What Terraform Is (For Me)&lt;/h2&gt;
&lt;p&gt;Terraform is how I describe cloud stuff in code instead of clicking through the AWS console. I write what I want in &lt;code&gt;.tf&lt;/code&gt; files, run &lt;code&gt;terraform apply&lt;/code&gt;, and it gets created. Same result every time.&lt;/p&gt;
&lt;h2 id="why-use-terraform"&gt;Why Use Terraform?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No More Manual Clicking&lt;/strong&gt;: Automate infrastructure setup instead of clicking through AWS&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Easy Updates&lt;/strong&gt;: Change your code and run &lt;code&gt;terraform apply&lt;/code&gt; to update everything&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Backup Your Infrastructure&lt;/strong&gt;: Keep your setup in version control (like Git)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reuse Everywhere&lt;/strong&gt;: Run the same setup in dev, staging, and production without changes&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cost Preview&lt;/strong&gt;: See what resources cost before you create them&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Work with Multiple Clouds&lt;/strong&gt;: Manage AWS, Azure, and Google Cloud from one tool&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="basic-concepts-made-simple"&gt;Basic Concepts (Made Simple)&lt;/h2&gt;
&lt;h3 id="providers"&gt;Providers&lt;/h3&gt;
&lt;p&gt;A &lt;strong&gt;provider&lt;/strong&gt; tells Terraform which cloud service to use. Think of it as picking AWS, Google Cloud, or Azure before you start building.&lt;/p&gt;</description></item><item><title>Agentic RAG: My Multi-Agent Setup with Gemini and ChromaDB</title><link>https://ayyzenn.github.io/posts/agentic_rag/</link><pubDate>Wed, 29 Oct 2025 00:00:00 +0000</pubDate><guid>https://ayyzenn.github.io/posts/agentic_rag/</guid><description>&lt;h2 id="what-i-built"&gt;What I Built&lt;/h2&gt;
&lt;p&gt;Basic RAG retrieves docs and generates an answer. I wanted something smarter — a system that picks the right strategy and retries with heavier techniques when the first answer isn&amp;rsquo;t good enough.&lt;/p&gt;
&lt;p&gt;This project uses &lt;strong&gt;three agents&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Router Agent&lt;/strong&gt; — reads the question and checks answer quality&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Basic Generator Agent&lt;/strong&gt; — fast retrieval for simple questions&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Advanced Generator Agent&lt;/strong&gt; — uses heavier techniques for hard questions&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The system tries the fast path first. If the answer is weak, it automatically switches to advanced methods like query decomposition, HyDE, and multi-query retrieval.&lt;/p&gt;</description></item><item><title>LlamaIndex + Text-to-SQL: What I Learned</title><link>https://ayyzenn.github.io/posts/llamaindex/</link><pubDate>Mon, 27 Oct 2025 00:00:00 +0000</pubDate><guid>https://ayyzenn.github.io/posts/llamaindex/</guid><description>&lt;h2 id="what-i-was-trying-to-do"&gt;What I Was Trying to Do&lt;/h2&gt;
&lt;p&gt;I had structured data in SQLite and didn&amp;rsquo;t want to write SQL for every question. &lt;strong&gt;LlamaIndex&lt;/strong&gt; let me ask things like &amp;ldquo;which city has the most people?&amp;rdquo; in plain English — it figures out the query, runs it, and returns the answer.&lt;/p&gt;
&lt;p&gt;Key capabilities include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Translating &lt;strong&gt;natural language&lt;/strong&gt; into &lt;strong&gt;SQL queries&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Converting &lt;strong&gt;unstructured context&lt;/strong&gt; into structured insights.&lt;/li&gt;
&lt;li&gt;Dynamically retrieving &lt;strong&gt;relevant schemas or tables&lt;/strong&gt; for complex databases.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Never expose full write-access databases to LLMs. Always use &lt;strong&gt;read-only credentials&lt;/strong&gt; or &lt;strong&gt;sandboxed environments&lt;/strong&gt; for safety.&lt;/p&gt;</description></item><item><title>RAG Text-to-SQL: Asking My Database Questions in Plain English</title><link>https://ayyzenn.github.io/posts/rag-text-to-sql-post/</link><pubDate>Sat, 25 Oct 2025 00:00:00 +0000</pubDate><guid>https://ayyzenn.github.io/posts/rag-text-to-sql-post/</guid><description>&lt;h2 id="what-i-built"&gt;What I Built&lt;/h2&gt;
&lt;p&gt;I hate writing SQL for simple questions. This project lets me ask things like &amp;ldquo;how many customers are from Brazil?&amp;rdquo; in plain English — it generates the SQL, runs it, and gives me a readable answer. All local, using &lt;strong&gt;Ollama&lt;/strong&gt; and &lt;strong&gt;ChromaDB&lt;/strong&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Easy to use&lt;/strong&gt; — ask questions in everyday language&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Private&lt;/strong&gt; — everything runs locally on your machine&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fast feedback&lt;/strong&gt; — generates and runs SQL in seconds&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Schema-aware&lt;/strong&gt; — understands table names and relationships&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Interactive&lt;/strong&gt; — ask follow-up questions in a chat-style flow&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Error handling&lt;/strong&gt; — catches common issues like wrong table name casing&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="system-architecture"&gt;System Architecture&lt;/h2&gt;
&lt;p&gt;My RAG Text-to-SQL system consists of five core components:&lt;/p&gt;</description></item><item><title>Local RAG with Ollama and ChromaDB: Running AI Offline</title><link>https://ayyzenn.github.io/posts/local-rag-system/</link><pubDate>Sun, 29 Jun 2025 00:00:00 +0000</pubDate><guid>https://ayyzenn.github.io/posts/local-rag-system/</guid><description>&lt;h2 id="why-i-built-this"&gt;Why I Built This&lt;/h2&gt;
&lt;p&gt;I wanted a chatbot that answers questions from &lt;strong&gt;my own documents&lt;/strong&gt; — without sending data to a cloud API. This RAG setup runs fully offline with &lt;strong&gt;Ollama&lt;/strong&gt; and &lt;strong&gt;ChromaDB&lt;/strong&gt; on my machine.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Privacy&lt;/strong&gt; — your data stays on your machine&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No API costs&lt;/strong&gt; — no usage fees or rate limits&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Speed&lt;/strong&gt; — no network delay for each query&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Control&lt;/strong&gt; — you choose what goes into the knowledge base&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Offline use&lt;/strong&gt; — works without internet after setup&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="architecture-overview"&gt;Architecture Overview&lt;/h2&gt;
&lt;p&gt;My local RAG system consists of four main components:&lt;/p&gt;</description></item><item><title>YouTube Summarizer: What I Built with LangGraph and Gemini</title><link>https://ayyzenn.github.io/posts/agent/</link><pubDate>Fri, 06 Jun 2025 00:00:00 +0000</pubDate><guid>https://ayyzenn.github.io/posts/agent/</guid><description>&lt;h2 id="what-i-built"&gt;What I Built&lt;/h2&gt;
&lt;p&gt;I wanted to paste a YouTube URL and get a summary — or ask questions about the video — without watching the whole thing. This project uses &lt;strong&gt;LangGraph&lt;/strong&gt; for the workflow and &lt;strong&gt;Gemini&lt;/strong&gt; for the actual summarizing and Q&amp;amp;A.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="key-features-of-agentic-workflows"&gt;Key Features of Agentic Workflows&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Modularity&lt;/strong&gt; — each step can be built and tested on its own&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;State&lt;/strong&gt; — data flows from step to step in a structured way&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reusability&lt;/strong&gt; — the same steps can be reused in other projects&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Autonomy&lt;/strong&gt; — each step can decide what to do based on the input it receives&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="popular-tools-for-agentic-workflows"&gt;Popular Tools for Agentic Workflows&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Language&lt;/th&gt;
&lt;th&gt;Best For&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;LangGraph&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Graph-based AI workflow framework with state management.&lt;/td&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;td&gt;Custom step-by-step pipelines&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CrewAI&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Agent orchestration tool inspired by human teams and role delegation.&lt;/td&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;td&gt;Role-based agent collaboration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Autogen&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Microsoft&amp;rsquo;s multi-agent framework for goal-oriented dialogue and tasks.&lt;/td&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;td&gt;Conversational multi-agent systems&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;LangChain&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;General framework for chaining LLMs with tools, memory, and logic.&lt;/td&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;td&gt;Broader LLM apps beyond just agents&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AgentOps&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Infra layer for deploying and monitoring agentic systems.&lt;/td&gt;
&lt;td&gt;Platform&lt;/td&gt;
&lt;td&gt;Scaling, testing, and managing agents&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="why-i-chose-langgraph"&gt;Why I Chose LangGraph&lt;/h2&gt;
&lt;p&gt;For this project, I chose &lt;strong&gt;LangGraph&lt;/strong&gt; because:&lt;/p&gt;</description></item><item><title>Ollama + DeepSeek: How I Run LLMs Locally</title><link>https://ayyzenn.github.io/posts/ollama/</link><pubDate>Mon, 03 Feb 2025 00:00:00 +0000</pubDate><guid>https://ayyzenn.github.io/posts/ollama/</guid><description>&lt;h2 id="why-i-use-ollama"&gt;Why I Use Ollama&lt;/h2&gt;
&lt;p&gt;I wanted to run LLMs on my own hardware without paying for API calls or sending data to the cloud. &lt;strong&gt;Ollama&lt;/strong&gt; made that straightforward — install, pull a model, start chatting.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="install-ollama"&gt;Install Ollama&lt;/h2&gt;
&lt;h3 id="arch-linux"&gt;Arch Linux&lt;/h3&gt;
&lt;p&gt;Update your system, then install Ollama:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo pacman -Syu
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo pacman -S ollama
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Enable and start the service:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl enable ollama
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl start ollama
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl status ollama
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You should see &lt;code&gt;active (running)&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Gentoo Install: What I Did on My Laptop</title><link>https://ayyzenn.github.io/posts/gentoo/</link><pubDate>Sat, 03 Dec 2022 00:00:00 +0000</pubDate><guid>https://ayyzenn.github.io/posts/gentoo/</guid><description>&lt;h2 id="why-i-installed-gentoo"&gt;Why I Installed Gentoo&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Processor:&lt;/strong&gt; Intel Core i5 4th Gen (4 cores)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RAM:&lt;/strong&gt; 8GB&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Storage:&lt;/strong&gt; 256GB SSD&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I’ll be using the &lt;strong&gt;Minimal ISO&lt;/strong&gt; because I like full control over my system, but if you prefer a GUI installer, that’s totally fine too!&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="step-1-grab-the-gentoo-iso"&gt;Step 1: Grab the Gentoo ISO&lt;/h2&gt;
&lt;p&gt;Head over to &lt;a href="https://www.gentoo.org/"&gt;Gentoo’s official website&lt;/a&gt; and download the ISO. You’ll see two options:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GUI Installer&lt;/strong&gt; (if you want an easier time)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Minimal (CLI) Installer&lt;/strong&gt; (if you want to go full pro mode)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For this guide, we’re going &lt;strong&gt;Minimal&lt;/strong&gt;. Let’s get our hands dirty!&lt;/p&gt;</description></item><item><title>Odoo on Ubuntu: How I Installed It</title><link>https://ayyzenn.github.io/posts/odoo/</link><pubDate>Thu, 11 Aug 2022 00:00:00 +0000</pubDate><guid>https://ayyzenn.github.io/posts/odoo/</guid><description>&lt;h2 id="what-i-did"&gt;What I Did&lt;/h2&gt;
&lt;p&gt;I installed &lt;strong&gt;Odoo&lt;/strong&gt; (open-source ERP) on Ubuntu for a project. These are the exact steps I ran — all &lt;code&gt;apt&lt;/code&gt; commands on Ubuntu.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt update &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo apt upgrade
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="create-an-odoo-user"&gt;Create an Odoo User&lt;/h2&gt;
&lt;p&gt;Run this command to create a system user for Odoo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo adduser -system -home&lt;span style="color:#f92672"&gt;=&lt;/span&gt;/opt/odoo -group odoo
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="install-postgresql"&gt;Install PostgreSQL&lt;/h2&gt;
&lt;p&gt;Odoo needs PostgreSQL as its database, so install it with:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt-get install postgresql -y
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="create-a-postgresql-user-for-odoo"&gt;Create a PostgreSQL User for Odoo&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo su - postgres -c &lt;span style="color:#e6db74"&gt;&amp;#34;createuser -s odoo&amp;#34;&lt;/span&gt; 2&amp;gt; /dev/null &lt;span style="color:#f92672"&gt;||&lt;/span&gt; true
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="install-python-dependencies"&gt;Install Python Dependencies&lt;/h2&gt;
&lt;p&gt;Odoo requires some Python packages. Install them with:&lt;/p&gt;</description></item><item><title>ProFTPD on Ubuntu: Setting Up FTP</title><link>https://ayyzenn.github.io/posts/proftpd/</link><pubDate>Sun, 07 Aug 2022 00:00:00 +0000</pubDate><guid>https://ayyzenn.github.io/posts/proftpd/</guid><description>&lt;h2 id="what-i-set-up"&gt;What I Set Up&lt;/h2&gt;
&lt;p&gt;I needed a simple FTP server on Ubuntu for file transfers. &lt;strong&gt;ProFTPD&lt;/strong&gt; did the job. This is my setup — on Arch you&amp;rsquo;d install with &lt;code&gt;sudo pacman -S proftpd&lt;/code&gt; and edit the same config path.&lt;/p&gt;
&lt;p&gt;Plain FTP is &lt;strong&gt;not encrypted&lt;/strong&gt;. For anything serious, use SFTP over SSH instead.&lt;/p&gt;
&lt;h2 id="installing-proftpd"&gt;Installing ProFTPD&lt;/h2&gt;
&lt;p&gt;Getting ProFTPD set up is pretty simple. Just run:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt-get install proftpd
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="configuring-proftpd"&gt;Configuring ProFTPD&lt;/h2&gt;
&lt;p&gt;Once it&amp;rsquo;s installed, you&amp;rsquo;ll need to tweak the config file. Open it up with:&lt;/p&gt;</description></item><item><title>Chef Server Setup: What I Did on Ubuntu</title><link>https://ayyzenn.github.io/posts/chef/</link><pubDate>Tue, 02 Aug 2022 00:00:00 +0000</pubDate><guid>https://ayyzenn.github.io/posts/chef/</guid><description>&lt;h2 id="why-i-looked-into-chef"&gt;Why I Looked Into Chef&lt;/h2&gt;
&lt;p&gt;Managing servers one by one doesn&amp;rsquo;t scale. I set up &lt;strong&gt;Chef&lt;/strong&gt; to store server configs as code — a Chef server, a workstation where I write recipes, and a node that pulls its config automatically.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; I did this on &lt;strong&gt;Ubuntu 18.04&lt;/strong&gt; using &lt;code&gt;.deb&lt;/code&gt; packages and &lt;code&gt;apt&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="chef-server"&gt;Chef Server&lt;/h2&gt;
&lt;p&gt;The Chef server acts as the central hub for all workstations and nodes under Chef management. Configuration changes made on workstations are pushed to the Chef server, where they are pulled by nodes using &lt;code&gt;chef-client&lt;/code&gt; to apply the configurations.&lt;/p&gt;</description></item><item><title>VoIP with Asterisk: My Home Phone Setup on Ubuntu</title><link>https://ayyzenn.github.io/posts/voip/</link><pubDate>Tue, 02 Aug 2022 00:00:00 +0000</pubDate><guid>https://ayyzenn.github.io/posts/voip/</guid><description>&lt;h2 id="what-i-built"&gt;What I Built&lt;/h2&gt;
&lt;p&gt;I set up a home VoIP system using &lt;strong&gt;Asterisk&lt;/strong&gt; as the server and &lt;strong&gt;Twinkle&lt;/strong&gt; as the softphone client. Everything here runs on &lt;strong&gt;Ubuntu&lt;/strong&gt; — same network, two extensions, calls between machines.&lt;/p&gt;
&lt;h2 id="how-voip-works"&gt;How VoIP Works&lt;/h2&gt;
&lt;p&gt;VoIP sends your voice as data over the internet instead of through a phone line. Cheaper than landlines, especially for long-distance — that&amp;rsquo;s why I tried it.&lt;/p&gt;
&lt;h2 id="asterisk-as-the-server"&gt;Asterisk as the Server&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Asterisk&lt;/strong&gt; is the PBX — it handles call routing between extensions. I compiled it from source on Ubuntu.&lt;/p&gt;</description></item><item><title>Puppet with Docker: How I Tested Master and Agent</title><link>https://ayyzenn.github.io/posts/puppet/</link><pubDate>Thu, 28 Jul 2022 00:00:00 +0000</pubDate><guid>https://ayyzenn.github.io/posts/puppet/</guid><description>&lt;h2 id="what-i-did"&gt;What I Did&lt;/h2&gt;
&lt;p&gt;I wanted to try &lt;strong&gt;Puppet&lt;/strong&gt; without dedicating two full VMs. I ran a Puppet master and agent in separate &lt;strong&gt;Ubuntu Docker containers&lt;/strong&gt; on my machine. Docker host commands work the same on Ubuntu and Arch.&lt;/p&gt;
&lt;h2 id="installing-puppet-master"&gt;Installing Puppet Master&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Download the Ubuntu image:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo docker pull ubuntu
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create a container for Puppet master:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo docker run --name puppet-master -it ubuntu
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;exit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Start the container:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo docker start puppet-master
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Open the bash shell of the Puppet master container:&lt;/p&gt;</description></item><item><title>Creating My First Docker Container</title><link>https://ayyzenn.github.io/posts/container_docker/</link><pubDate>Wed, 27 Jul 2022 00:00:00 +0000</pubDate><guid>https://ayyzenn.github.io/posts/container_docker/</guid><description>&lt;h2 id="what-i-did-here"&gt;What I Did Here&lt;/h2&gt;
&lt;p&gt;After installing Docker, I wanted to run an actual Ubuntu container — not just &lt;code&gt;hello-world&lt;/code&gt;. The steps inside this post are the same on &lt;strong&gt;Arch Linux&lt;/strong&gt; and &lt;strong&gt;Ubuntu&lt;/strong&gt; hosts. Only the Docker &lt;em&gt;installation&lt;/em&gt; differs — see &lt;a href="https://ayyzenn.github.io/posts/dockers/"&gt;Docker on Arch Linux and Ubuntu&lt;/a&gt; for that part.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="arch-linux-host"&gt;Arch Linux (host)&lt;/h2&gt;
&lt;p&gt;Make sure Docker is installed and running on your Arch machine first:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo pacman -S docker
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl enable --now docker
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;systemctl status docker
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="pull-the-ubuntu-image"&gt;Pull the Ubuntu image&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo docker pull ubuntu
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="create-and-enter-a-container"&gt;Create and enter a container&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo docker run --name my-container -it ubuntu
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;What those flags mean:&lt;/p&gt;</description></item><item><title>Docker on Arch Linux and Ubuntu: How I Got It Running</title><link>https://ayyzenn.github.io/posts/dockers/</link><pubDate>Tue, 26 Jul 2022 00:00:00 +0000</pubDate><guid>https://ayyzenn.github.io/posts/dockers/</guid><description>&lt;h2 id="why-i-started-using-docker"&gt;Why I Started Using Docker&lt;/h2&gt;
&lt;p&gt;I wanted a way to run apps without messing up my main system. Docker packs an app with everything it needs into a &lt;strong&gt;container&lt;/strong&gt; — a small, isolated environment that shares my kernel but stays separate from everything else.&lt;/p&gt;
&lt;p&gt;If something breaks inside a container, I delete it and start over. No reinstalling the whole OS.&lt;/p&gt;
&lt;h2 id="containers-vs-images-quick-version"&gt;Containers vs Images (Quick Version)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Image&lt;/strong&gt; — a read-only template (like a recipe)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Container&lt;/strong&gt; — a running instance of that image (like the actual dish you cooked)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You build or pull an image once. You can spin up as many containers from it as you want.&lt;/p&gt;</description></item><item><title>GitHub CLI and Personal Access Tokens: What I Use Daily</title><link>https://ayyzenn.github.io/posts/git_tools/</link><pubDate>Sat, 04 Sep 2021 00:00:00 +0000</pubDate><guid>https://ayyzenn.github.io/posts/git_tools/</guid><description>&lt;h2 id="why-i-bother-with-this"&gt;Why I Bother With This&lt;/h2&gt;
&lt;p&gt;I got tired of opening the browser every time I wanted to create a repo, check a PR, or trigger a workflow. &lt;strong&gt;GitHub CLI&lt;/strong&gt; (&lt;code&gt;gh&lt;/code&gt;) lets me do most of that from the terminal. &lt;strong&gt;Personal Access Tokens (PATs)&lt;/strong&gt; are how Git authenticates when you push over HTTPS.&lt;/p&gt;
&lt;p&gt;This post covers both — how I generate a PAT and how I use &lt;code&gt;gh&lt;/code&gt; day to day.&lt;/p&gt;</description></item><item><title>GitHub from the Command Line: How I Push My Code</title><link>https://ayyzenn.github.io/posts/git_cli/</link><pubDate>Fri, 03 Sep 2021 00:00:00 +0000</pubDate><guid>https://ayyzenn.github.io/posts/git_cli/</guid><description>&lt;h2 id="why-i-use-github"&gt;Why I Use GitHub&lt;/h2&gt;
&lt;p&gt;I use &lt;strong&gt;Git&lt;/strong&gt; to track changes in my code and &lt;strong&gt;GitHub&lt;/strong&gt; to host it online. Git runs on my machine. GitHub is the website that stores my repos and lets me share them.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re new: Git is the tool, GitHub is where the repos live.&lt;/p&gt;
&lt;h2 id="install-git"&gt;Install Git&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Ubuntu:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install git
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Arch Linux:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo pacman -S git
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Check it worked:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git --version
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="set-your-name-and-email"&gt;Set Your Name and Email&lt;/h2&gt;
&lt;p&gt;Git attaches this info to every commit:&lt;/p&gt;</description></item><item><title>Creating a VM on Microsoft Azure</title><link>https://ayyzenn.github.io/posts/azure/</link><pubDate>Mon, 16 Aug 2021 00:00:00 +0000</pubDate><guid>https://ayyzenn.github.io/posts/azure/</guid><description>&lt;h2 id="what-i-did"&gt;What I Did&lt;/h2&gt;
&lt;p&gt;I needed a cloud server to test things without using my local machine. I spun up an &lt;strong&gt;Ubuntu 20.04 VM&lt;/strong&gt; on Azure and connected via SSH. Here&amp;rsquo;s the exact process I followed.&lt;/p&gt;
&lt;h2 id="create-the-vm"&gt;Create the VM&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Log in to &lt;a href="https://portal.azure.com"&gt;Azure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Create a Resource&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Pick &lt;strong&gt;Ubuntu 20.04 LTS&lt;/strong&gt; → &lt;strong&gt;Create&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Name the VM&lt;/li&gt;
&lt;li&gt;Under &lt;strong&gt;Administration Account&lt;/strong&gt;, choose &lt;strong&gt;SSH Public Key&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Set a username and key pair name&lt;/li&gt;
&lt;li&gt;Under &lt;strong&gt;Inbound Port Rules&lt;/strong&gt;, open &lt;strong&gt;SSH (22)&lt;/strong&gt; and &lt;strong&gt;HTTP (80)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Review and Create&lt;/strong&gt; → &lt;strong&gt;Create&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Download the &lt;strong&gt;key pair&lt;/strong&gt; file when prompted&lt;/li&gt;
&lt;li&gt;Wait for deployment, then click &lt;strong&gt;Go to Resource&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="connect-via-ssh"&gt;Connect via SSH&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd ~/Downloads
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;chmod &lt;span style="color:#ae81ff"&gt;400&lt;/span&gt; pair_key_name.pem
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ssh -i pair_key_name.pem username@your_ip
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Type &lt;code&gt;yes&lt;/code&gt; when SSH asks about the fingerprint.&lt;/p&gt;</description></item><item><title>SSH: How I Connect to Remote Servers</title><link>https://ayyzenn.github.io/posts/ssh/</link><pubDate>Sat, 14 Aug 2021 00:00:00 +0000</pubDate><guid>https://ayyzenn.github.io/posts/ssh/</guid><description>&lt;h2 id="why-i-use-ssh"&gt;Why I Use SSH&lt;/h2&gt;
&lt;p&gt;SSH is how I control another machine from my terminal. I use it to manage servers, copy files, and run commands on remote systems without sitting in front of them.&lt;/p&gt;
&lt;p&gt;For Windows remote desktop you use RDP. For Linux, SSH is the standard.&lt;/p&gt;
&lt;h2 id="how-ssh-works-short-version"&gt;How SSH Works (Short Version)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Client&lt;/strong&gt; — on your laptop (where you type)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Server&lt;/strong&gt; — on the remote machine (what you connect to)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You run &lt;code&gt;ssh user@ip&lt;/code&gt;, enter your password (or use a key), and you get a shell on the remote box.&lt;/p&gt;</description></item><item><title>Dual Boot Ubuntu and Windows: What I Did</title><link>https://ayyzenn.github.io/posts/dual_boot/</link><pubDate>Fri, 13 Aug 2021 00:00:00 +0000</pubDate><guid>https://ayyzenn.github.io/posts/dual_boot/</guid><description>&lt;h2 id="why-i-dual-booted"&gt;Why I Dual-Booted&lt;/h2&gt;
&lt;p&gt;I needed Windows for some things and Linux for everything else. Instead of picking one, I installed &lt;strong&gt;Ubuntu alongside Windows&lt;/strong&gt; on the same machine. This is the process I followed.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="steps-to-dual-boot-ubuntu-with-windows"&gt;Steps to Dual Boot Ubuntu with Windows&lt;/h2&gt;
&lt;h3 id="step-1-prepare-a-bootable-usb-drive"&gt;&lt;strong&gt;Step 1: Prepare a Bootable USB Drive&lt;/strong&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Download the latest Ubuntu ISO from the &lt;a href="https://ubuntu.com/download"&gt;official Ubuntu website&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Download and install &lt;a href="https://rufus.ie"&gt;Rufus&lt;/a&gt; or &lt;a href="https://www.balena.io/etcher/"&gt;balenaEtcher&lt;/a&gt; to create a bootable USB.&lt;/li&gt;
&lt;li&gt;Insert a USB drive (at least 8GB) into your computer.&lt;/li&gt;
&lt;li&gt;Open Rufus or balenaEtcher:
&lt;ul&gt;
&lt;li&gt;Select the Ubuntu ISO file.&lt;/li&gt;
&lt;li&gt;Choose the USB drive.&lt;/li&gt;
&lt;li&gt;Click &amp;ldquo;Start&amp;rdquo; to create the bootable drive.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h3 id="step-2-configure-biosuefi-settings"&gt;&lt;strong&gt;Step 2: Configure BIOS/UEFI Settings&lt;/strong&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Restart your computer and enter BIOS/UEFI by pressing a specific key (usually &lt;strong&gt;F2, F12, Del, or Esc&lt;/strong&gt;) during startup.&lt;/li&gt;
&lt;li&gt;Look for &lt;strong&gt;Boot Order/Boot Priority&lt;/strong&gt; and set the USB drive as the first boot device.&lt;/li&gt;
&lt;li&gt;Disable &lt;strong&gt;Secure Boot&lt;/strong&gt; (if enabled) under the Security tab.&lt;/li&gt;
&lt;li&gt;Enable &lt;strong&gt;UEFI mode&lt;/strong&gt; (recommended) instead of Legacy mode.&lt;/li&gt;
&lt;li&gt;Save changes and exit BIOS.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h3 id="step-3-boot-from-the-usb-drive"&gt;&lt;strong&gt;Step 3: Boot from the USB Drive&lt;/strong&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Insert the bootable USB drive into your computer.&lt;/li&gt;
&lt;li&gt;Restart the system and press the &lt;strong&gt;Boot Menu key&lt;/strong&gt; (F12, F9, Esc, or as per your motherboard).&lt;/li&gt;
&lt;li&gt;Select the bootable USB drive from the list.&lt;/li&gt;
&lt;li&gt;Press &lt;strong&gt;Enter&lt;/strong&gt; to boot into Ubuntu Live.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h3 id="step-4-try-or-install-ubuntu"&gt;&lt;strong&gt;Step 4: Try or Install Ubuntu&lt;/strong&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Once the Ubuntu installer loads, you will see two options:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Try Ubuntu&lt;/strong&gt; – Runs Ubuntu without installing it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Install Ubuntu&lt;/strong&gt; – Proceeds with the installation.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Click on &lt;strong&gt;Install Ubuntu&lt;/strong&gt; to continue.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h3 id="step-5-select-keyboard-layout"&gt;&lt;strong&gt;Step 5: Select Keyboard Layout&lt;/strong&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Choose your preferred &lt;strong&gt;keyboard layout&lt;/strong&gt; and language.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Continue&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h3 id="step-6-connect-to-wi-fi-optional"&gt;&lt;strong&gt;Step 6: Connect to Wi-Fi (Optional)&lt;/strong&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Select your Wi-Fi network.&lt;/li&gt;
&lt;li&gt;Enter the password and click &lt;strong&gt;Continue&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h3 id="step-7-choose-installation-type"&gt;&lt;strong&gt;Step 7: Choose Installation Type&lt;/strong&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Select &lt;strong&gt;Normal Installation&lt;/strong&gt; (recommended).&lt;/li&gt;
&lt;li&gt;Check the box &lt;strong&gt;Install third-party software for graphics and Wi-Fi hardware, Flash, MP3, and other media&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Continue&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h3 id="step-8-choose-installation-method"&gt;&lt;strong&gt;Step 8: Choose Installation Method&lt;/strong&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Select &lt;strong&gt;Something else&lt;/strong&gt; (for manual partitioning).&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Continue&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h3 id="step-9-create-partitions-for-ubuntu"&gt;&lt;strong&gt;Step 9: Create Partitions for Ubuntu&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Ubuntu requires three main partitions:&lt;/p&gt;</description></item><item><title>Hugo: The Static Site Generator I Use for This Blog</title><link>https://ayyzenn.github.io/posts/hugo/</link><pubDate>Thu, 03 Dec 2020 00:00:00 +0000</pubDate><guid>https://ayyzenn.github.io/posts/hugo/</guid><description>&lt;h2 id="why-i-picked-hugo"&gt;Why I Picked Hugo&lt;/h2&gt;
&lt;p&gt;I wanted a blog that loads fast, doesn&amp;rsquo;t need a database, and lets me write posts in Markdown. &lt;strong&gt;Hugo&lt;/strong&gt; does exactly that — it builds plain HTML files from my content, and I host them on GitHub Pages.&lt;/p&gt;
&lt;p&gt;No WordPress, no PHP, no MySQL. Just markdown files and a &lt;code&gt;hugo&lt;/code&gt; command.&lt;/p&gt;
&lt;h2 id="what-i-like-about-it"&gt;What I Like About It&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Fast builds&lt;/strong&gt; — my whole site compiles in under a second&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Markdown posts&lt;/strong&gt; — write in any editor, commit to Git&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Themes&lt;/strong&gt; — I&amp;rsquo;m using PaperMod&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GitHub Pages&lt;/strong&gt; — free hosting, deploys on push&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="how-i-set-up-hugo"&gt;How I Set Up Hugo&lt;/h2&gt;
&lt;h3 id="1-install-hugo"&gt;1. Install Hugo&lt;/h3&gt;
&lt;h4 id="on-arch-linux"&gt;On Arch Linux&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo pacman -S hugo
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="on-ubuntu"&gt;On Ubuntu&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install hugo
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Or install the extended edition from the official release page (recommended for themes that use Sass):&lt;/p&gt;</description></item><item><title>My First Post</title><link>https://ayyzenn.github.io/posts/first_post/</link><pubDate>Tue, 15 Sep 2020 00:00:00 +0000</pubDate><guid>https://ayyzenn.github.io/posts/first_post/</guid><description>&lt;p&gt;Hello — this is my first blog post on Hugo. I set this site up to document what I&amp;rsquo;m learning as I go. More posts coming soon.&lt;/p&gt;</description></item></channel></rss>