<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Night Shift Dev]]></title><description><![CDATA[Night Shift Dev]]></description><link>https://blog.rickmwasofficial.me</link><generator>RSS for Node</generator><lastBuildDate>Sun, 10 May 2026 22:52:18 GMT</lastBuildDate><atom:link href="https://blog.rickmwasofficial.me/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Making Deep Learning Accessible - Fast AI]]></title><description><![CDATA[For so long we have heard that for you to build deep learning models for any task, you need to be good at Mathematics - Linear Algebra, Calculus, Probability etc, but this has come to change.
Introduc]]></description><link>https://blog.rickmwasofficial.me/making-deep-learning-accessible</link><guid isPermaLink="true">https://blog.rickmwasofficial.me/making-deep-learning-accessible</guid><category><![CDATA[AI]]></category><category><![CDATA[ML]]></category><category><![CDATA[Deep Learning]]></category><dc:creator><![CDATA[Erick Mwangi]]></dc:creator><pubDate>Fri, 24 Apr 2026 15:51:43 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/68877216809a9a143bea255d/4481a237-60c7-4134-ab2c-b20a47be7705.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>For so long we have heard that for you to build deep learning models for any task, you need to be good at Mathematics - Linear Algebra, Calculus, Probability etc, but this has come to change.</p>
<h3><strong>Introducing -</strong> <a href="https://fast.ai/"><strong>Fast AI</strong></a></h3>
<p>With Fast AI we move away from the notion that you first have to study the mathematical parts of deep learning before you can get to building actual models. Basically we use a Top-Down approach, as <a href="https://jeremy.fast.ai/">Jeremy Howard</a> put it, where we start by building models first and then later get to learning the beautiful maths that powers these models.</p>
<p>Unlike trying to learn the maths first before getting to build models, this is a much better approach because it becomes easier and exciting to learn the Maths behind it once you have gotten practice with building actual models. Your own curiosity will push you to try and understand why this works or why something is not working as expected.</p>
<p>In my own experience it has been frustrating to learn the maths and not knowing where I am actually going to apply this. Long weeks of doing calculations without writing any code was a huge demotivator.</p>
<h3><strong>What is Fast AI</strong></h3>
<p>Fast AI is a library built on top of <a href="https://pytorch.org">Pytorch</a> that simplifies the task of training fast and accurate <a href="https://en.wikipedia.org/wiki/Neural_network_(machine_learning)">Neural Nets</a>.</p>
<p>This is possible because of Fast AI's extensive API for many deep learning tasks, from data loading, data cleaning, training models and evaluating them, Fast AI offers a high level abstraction to these tasks. This makes training neural nets easier by also reducing the risks of getting errors since we write very minimal code as you will see.</p>
<h2>Demo</h2>
<p>To show the power of Fast AI, we will build a simple Computer Vision model to classify animal breeds. We will break down these tasks into four:</p>
<ol>
<li><p>Data Loading</p>
</li>
<li><p>Data Cleaning</p>
</li>
<li><p>Model Training</p>
</li>
<li><p>Evaluation</p>
</li>
</ol>
<h2>1. Data Loading</h2>
<p>We will first install fastai</p>
<pre><code class="language-python">!pip install fastai
</code></pre>
<p>With Fast AI installed, we will now download our training data - <a href="https://www.robots.ox.ac.uk/~vgg/data/pets/">OXFORD-IIIT Pet Dataset</a>. This is already built in to Fast AI</p>
<pre><code class="language-python"># Import everything for vision
from fastai.vision.all import *
</code></pre>
<pre><code class="language-python">path = untar_data(
    URLs.PETS
) # `untar_data` is a helper function that downloads data and unzips it.
</code></pre>
<p>100.00% [811712512/811706944 00:16&lt;00:00]</p>
<pre><code class="language-python"># untar_data also returns the location of the decompressed archive
path, path.ls()
</code></pre>
<pre><code class="language-plaintext">(Path('/root/.fastai/data/oxford-iiit-pet'),
 [Path('/root/.fastai/data/oxford-iiit-pet/images'), Path('/root/.fastai/data/oxford-iiit-pet/annotations')])
</code></pre>
<pre><code class="language-python"># get_image_files is a function that return all images in a folder
files = get_image_files(
    path/'images'
)
print(f"Found {len(files)} images")
</code></pre>
<pre><code class="language-plaintext">Found 7390 images
</code></pre>
<h3>Labelling data</h3>
<p>To label our data, we will extract the name of the animal from the filename using regular expressions</p>
<pre><code class="language-python">files[0].name
</code></pre>
<pre><code class="language-plaintext">'beagle_115.jpg'
</code></pre>
<pre><code class="language-python">regex = r'^(.*)_\d+.jpg'
</code></pre>
<p>To load our data we will need to use a <a href="https://docs.fast.ai/data.core.html#dataloaders">DataLoaders</a> object. Specifically <code>ImageDataLoaders.from_name_re()</code> - (From Regular Expressions). Fast AI provides different data loaders for different types of data you are working with, but for now since we are working with images, we will use <a href="https://docs.fast.ai/vision.data.html#imagedataloaders">ImageDataLoaders</a>.</p>
<pre><code class="language-python">dls = ImageDataLoaders.from_name_re(
    path=path,
    fnames=files,
    pat=regex,
    item_tfms=Resize(460),
    batch_tfms=aug_transforms(size=224) # Resize images to 224 X 224, for deep learning all images must be of the same size
)
</code></pre>
<pre><code class="language-python"># Show the loaded data
dls.show_batch()
</code></pre>
<img src="https://raw.githubusercontent.com/Rickmwasofficial/test/refs/heads/main/output_12_0.png" alt="" style="display:block;margin:0 auto" />

<p>We have successfully loaded our data!! You can rerun <code>dls.show_batch()</code> to check is there are any incorrect labels</p>
<ol>
<li>Cleaning Data</li>
</ol>
<p>The next step should be cleaing data right? Well actually not really, for Fast AI we actually train a model first and then we will use Fast AI's cool feature for data cleaning.</p>
<h2>3. Model Training</h2>
<p>In Fast AI, we train a <code>Leaner</code>. A Learner combines, a model and the data for training and uses <a href="https://www.ibm.com/think/topics/transfer-learning">transfer learning</a> to fine tune a pretrained model. For this example we will fine tune a <code>resnet34</code> model.</p>
<pre><code class="language-python">learn = vision_learner(
    arch=resnet34, # pretrained model
    dls=dls, # data
    metrics=error_rate # measure how worse the model is doing
)
</code></pre>
<pre><code class="language-plaintext">Downloading: "https://download.pytorch.org/models/resnet34-b627a593.pth" to /root/.cache/torch/hub/checkpoints/resnet34-b627a593.pth


100%|██████████| 83.3M/83.3M [00:00&lt;00:00, 165MB/s] 
</code></pre>
<p>The above downloaded the resnet34 model which we will fine tune</p>
<pre><code class="language-python">learn.fine_tune(
    1, # how many times the model will see the data
    3e-3 # rate at which the model adjusts to reduce the error (Learning)
)
</code></pre>
<table>
<thead>
<tr>
<th>epoch</th>
<th>train_loss</th>
<th>valid_loss</th>
<th>error_rate</th>
<th>time</th>
</tr>
</thead>
<tbody><tr>
<td>0</td>
<td>1.288479</td>
<td>0.342344</td>
<td>0.122463</td>
<td>00:36</td>
</tr>
</tbody></table>
<table>
<thead>
<tr>
<th>epoch</th>
<th>train_loss</th>
<th>valid_loss</th>
<th>error_rate</th>
<th>time</th>
</tr>
</thead>
<tbody><tr>
<td>0</td>
<td>0.487694</td>
<td>0.281343</td>
<td>0.086604</td>
<td>00:39</td>
</tr>
</tbody></table>
<p>We now have a trained model that can classify the animal breeds. Lets get to testing</p>
<h3>4. Model Evaluation</h3>
<p>Let's see how the model predicts</p>
<pre><code class="language-python">learn.show_results() # show predictions on images (green if the model was correct, red if it was wrong)
</code></pre>
<img src="https://raw.githubusercontent.com/Rickmwasofficial/test/refs/heads/main/output_21_1.png" alt="" style="display:block;margin:0 auto" />

<p>We can also use the <code>interpretation</code> object to see the model's worst responses:</p>
<pre><code class="language-python">interp = Interpretation.from_learner(learn)
</code></pre>
<pre><code class="language-python">interp.plot_top_losses(9, figsize=(15,10)) # plot the worst predictions
</code></pre>
<img src="https://raw.githubusercontent.com/Rickmwasofficial/test/refs/heads/main/output_24_1.png" alt="" style="display:block;margin:0 auto" />

<p>We can finally save the model and use it elsewhere in our applications</p>
<pre><code class="language-python">learn.export('my_model.pkl')
</code></pre>
<h2>Further Actions</h2>
<p>And we're done training the model, you can use the exported model in your applications or deploy it to <a href="https://huggingface.co/">Huggingface</a>. Fast AI offers a book and a course <a href="https://course.fast.ai">Practical Deep Learning for coders</a>. It goes deep into the Fast AI library and also deep learning, giving you all the knowledge you need to train deep learning models. It also introduces Maths concepts when needed. Enjoy!!</p>
<p>This blog was written by a human ♥</p>
]]></content:encoded></item><item><title><![CDATA[The DeepMind Quest]]></title><description><![CDATA[There is a seductive path in modern AI learning: jump straight into Python, import Scikit-learn or PyTorch, run a tutorial script, and watch the accuracy numbers go up. I took that path. It felt productive. I was "doing AI."
But there was always a na...]]></description><link>https://blog.rickmwasofficial.me/the-deepmind-quest</link><guid isPermaLink="true">https://blog.rickmwasofficial.me/the-deepmind-quest</guid><category><![CDATA[AI]]></category><category><![CDATA[research]]></category><category><![CDATA[Google DeepMind]]></category><category><![CDATA[Google]]></category><category><![CDATA[Machine Learning]]></category><category><![CDATA[Math]]></category><category><![CDATA[linear algebra ]]></category><dc:creator><![CDATA[Erick Mwangi]]></dc:creator><pubDate>Sun, 14 Dec 2025 09:43:01 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1765703845734/89ac42c9-4b82-4aab-aae2-ef7b3d7caa97.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>There is a seductive path in modern AI learning: jump straight into Python, import Scikit-learn or PyTorch, run a tutorial script, and watch the accuracy numbers go up. I took that path. It felt productive. I was "doing AI."</p>
<p>But there was always a nagging feeling, an imposter syndrome hovering in the background. I knew <em>how</em> to call the functions, but I didn’t truly understand <em>why</em> they worked. I was building a mental skyscraper on a foundation of sand. When things broke, or when I wanted to move beyond canned tutorials, I hit a wall. I realized something crucial was missing: the deep, intuitive understanding of the mathematics underneath the code.</p>
<p>My ultimate ambition is high: I want to work on cutting-edge AI at a place like Google DeepMind. To get there, "good enough" isn't good enough. I needed to stop, rewind, and build the foundation properly.</p>
<h3 id="heading-the-map-mathematics-for-machine-learning">The Map: <em>Mathematics for Machine Learning</em></h3>
<p><img src="https://mml-book.github.io/static/images/mml-book-cover.jpg" alt class="image--center mx-auto" /></p>
<p>I decided to tackle the definitive textbook: <a target="_blank" href="https://mml-book.github.io/"><em>Mathematics for Machine Learning</em></a> by Deisenroth, Faisal, and Ong. My goal is to internalize the "grammar" of ML before writing more "paragraphs" of code.</p>
<p>Today, I’m celebrating a significant milestone: <strong>I have completed Chapter 2: Linear Algebra.</strong> (The book starts counting content at Ch. 2).</p>
<p>This wasn't just about memorizing formulas. It was a journey from computation to intuition:</p>
<ol>
<li><p><strong>The Mechanics:</strong> It started with the nuts and bolts, what is a matrix, how does multiplication work, and solving systems of linear equations using Gaussian elimination.</p>
</li>
<li><p><strong>The Structure:</strong> Then, we moved into the abstract, vector spaces, subspaces, and bases. Understanding <em>where</em> these mathematical objects live.</p>
</li>
<li><p><strong>The Breakthrough (Linear Mappings):</strong> This was the most critical shift. I stopped seeing matrices as just static grids of numbers and started seeing them as active <em>transformations</em>, machines that stretch, rotate, and squash vectors from one coordinate system to another.</p>
</li>
</ol>
<p>Understanding that matrix multiplication is essentially a transformation of space is a game-changer for visualizing what neural networks are actually doing.</p>
<p>$$\begin{bmatrix} a &amp; b \\ c &amp; d \end{bmatrix} \begin{bmatrix} x \\ y \end{bmatrix} = x \begin{bmatrix} a \\ c \end{bmatrix} + y \begin{bmatrix} b \\ d \end{bmatrix} = \begin{bmatrix} ax + by \\ cx + dy \end{bmatrix}$$</p><h3 id="heading-the-strategy-how-i-stay-consistent">The Strategy: How I Stay Consistent</h3>
<p>Math is hard. Self-studying math is even harder. Relying solely on willpower doesn't work for long-term goals like this. I needed a system.</p>
<p>My routine relies on a few key pillars to keep the momentum going:</p>
<ul>
<li><p><strong>The Pomodoro Technique:</strong> I break my study sessions into focused intervals. It prevents burnout and keeps my brain fresh for dense topics like null spaces and affine subspaces.</p>
</li>
<li><p><strong>Virtual Accountability (</strong><a target="_blank" href="https://www.youtube.com/@JamesScholz"><strong>James Scholz</strong></a><strong>):</strong> Studying alone can be isolating. I sync my sessions with James Scholz’s "Study With Me" streams on YouTube. There is a powerful, unspoken motivation in working alongside thousands of others, even virtually.</p>
</li>
<li><p><strong>Daily Inspiration (</strong><a target="_blank" href="https://www.instagram.com/5amoljen/"><strong>5amoljen</strong></a><strong>):</strong> Following accounts like 5amoljen on Instagram provides that necessary jolt of daily discipline. Seeing others wake up early and grind reminds me that the work needs to be done, regardless of how I feel.</p>
</li>
</ul>
<h3 id="heading-whats-next">What’s Next</h3>
<p>Clearing the Linear Algebra chapter feels great, but I’m not rushing to the next topic yet. Knowledge without application fades quickly.</p>
<p>My next step is to dive into the practice problems in the book. I need to prove to myself that I can apply these concepts, calculating ranks, finding kernels, and performing changes of basis, before moving on.</p>
<p>Once I’m confident, I will begin <strong>Chapter 3: Analytic Geometry</strong>, where we will add lengths, angles, and distances to the vector spaces I just learned about.</p>
<p>The journey to DeepMind is long, and I'm still near the starting line. But for the first time, I feel like I’m running on solid ground.</p>
]]></content:encoded></item><item><title><![CDATA[Building an Image Upload API in Go]]></title><description><![CDATA[I recently started learning Go (a.k.a. Golang) with the specific goal of writing backend APIs.Go is a lightweight, compiled, and blazing-fast language.
For this project-based learning session, I decided to build something practical: a backend API to ...]]></description><link>https://blog.rickmwasofficial.me/building-an-image-upload-api-in-go</link><guid isPermaLink="true">https://blog.rickmwasofficial.me/building-an-image-upload-api-in-go</guid><category><![CDATA[Go Language]]></category><category><![CDATA[Programming Blogs]]></category><category><![CDATA[APIs]]></category><dc:creator><![CDATA[Erick Mwangi]]></dc:creator><pubDate>Wed, 13 Aug 2025 17:51:57 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1755107435392/d8f7f6ab-a990-442c-a099-f0c48f868352.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I recently started learning <strong>Go</strong> (a.k.a. Golang) with the specific goal of writing backend APIs.<br />Go is a lightweight, compiled, and blazing-fast language.</p>
<p>For this project-based learning session, I decided to build something practical: <strong>a backend API to handle image uploads and store them locally</strong>.</p>
<p>Here’s the high-level process:</p>
<ol>
<li><p><strong>User uploads</strong> an image and metadata (like title and description) from the frontend via <code>multipart/form-data</code>.</p>
</li>
<li><p>The data is sent to an <strong>exposed API endpoint</strong>.</p>
</li>
<li><p>The server <strong>parses the request, validates the file, and stores it</strong>.</p>
</li>
</ol>
<hr />
<h2 id="heading-project-structure">Project Structure</h2>
<p>I wanted the codebase to be simple but easy to scale, so I split it into <code>cmd</code> and <code>internal</code> folders:</p>
<pre><code class="lang-markdown">image-api/
<span class="hljs-code">    cmd/
        server/
            server.go
    internal/
        handlers/
            handlers.go
        utils/
            utils.go</span>
</code></pre>
<ul>
<li><p><code>cmd/server/server.go</code> – Entry point. Sets up the HTTP server, defines API endpoints, and handles CORS.</p>
</li>
<li><p><code>internal/handlers/handlers.go</code> – Contains handler functions for each API route.</p>
</li>
<li><p><code>internal/utils/utils.go</code> – Utility functions (like file type validation).</p>
</li>
</ul>
<hr />
<h2 id="heading-setting-up-the-server-servergo">Setting Up the Server (<code>server.go</code>)</h2>
<pre><code class="lang-go"><span class="hljs-keyword">package</span> main

<span class="hljs-keyword">import</span> (
    <span class="hljs-string">"image_api/internal/handlers"</span>
    <span class="hljs-string">"log"</span>
    <span class="hljs-string">"net/http"</span>
)

<span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">main</span><span class="hljs-params">()</span></span> {
    http.HandleFunc(<span class="hljs-string">"/image-upload"</span>, withCORS(handlers.HandleImageUpload))
    http.HandleFunc(<span class="hljs-string">"/delete"</span>, withCORS(handlers.HandleImageDelete))
    http.HandleFunc(<span class="hljs-string">"/update"</span>, withCORS(handlers.HandleImageUpdate))
    http.HandleFunc(<span class="hljs-string">"/image"</span>, withCORS(handlers.HandleImageUpdate))

    log.Println(<span class="hljs-string">"Listening on port: 8282"</span>)
    err := http.ListenAndServe(<span class="hljs-string">"localhost:8282"</span>, <span class="hljs-literal">nil</span>)
    <span class="hljs-keyword">if</span> err != <span class="hljs-literal">nil</span> {
        log.Fatal(err)
    }
}

<span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">withCORS</span><span class="hljs-params">(h http.HandlerFunc)</span> <span class="hljs-title">http</span>.<span class="hljs-title">HandlerFunc</span></span> {
    <span class="hljs-keyword">return</span> <span class="hljs-function"><span class="hljs-keyword">func</span><span class="hljs-params">(w http.ResponseWriter, r *http.Request)</span></span> {
        w.Header().Set(<span class="hljs-string">"Access-Control-Allow-Origin"</span>, <span class="hljs-string">"*"</span>)
        w.Header().Set(<span class="hljs-string">"Access-Control-Allow-Methods"</span>, <span class="hljs-string">"GET, POST, PUT, DELETE, OPTIONS"</span>)
        w.Header().Set(<span class="hljs-string">"Access-Control-Allow-Headers"</span>, <span class="hljs-string">"Content-Type"</span>)
        h(w, r)
    }
}
</code></pre>
<p>The <code>withCORS</code> wrapper ensures requests from different origins don’t fail with <strong>CORS</strong> errors — essential when connecting your API to a frontend.</p>
<hr />
<h2 id="heading-handling-image-uploads-handlersgo">Handling Image Uploads (<code>handlers.go</code>)</h2>
<p>The heart of the project is the <strong>image upload handler</strong>:</p>
<pre><code class="lang-go"><span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">HandleImageUpload</span><span class="hljs-params">(w http.ResponseWriter, r *http.Request)</span></span> {
    <span class="hljs-comment">// Limit upload size to 10MB</span>
    err := r.ParseMultipartForm(<span class="hljs-number">10</span> &lt;&lt; <span class="hljs-number">20</span>)
    <span class="hljs-keyword">if</span> err != <span class="hljs-literal">nil</span> {
        http.Error(w, <span class="hljs-string">"File is too big or invalid format"</span>, http.StatusBadRequest)
        <span class="hljs-keyword">return</span>
    }

    <span class="hljs-comment">// Retrieve the file from form data</span>
    file, handler, err := r.FormFile(<span class="hljs-string">"file"</span>)
    <span class="hljs-keyword">if</span> err != <span class="hljs-literal">nil</span> {
        http.Error(w, <span class="hljs-string">"Could not read file"</span>, http.StatusBadRequest)
        <span class="hljs-keyword">return</span>
    }
    <span class="hljs-keyword">defer</span> file.Close()

    <span class="hljs-comment">// Validate file type</span>
    fileBytes, err := io.ReadAll(file)
    <span class="hljs-keyword">if</span> err != <span class="hljs-literal">nil</span> {
        http.Error(w, <span class="hljs-string">"Invalid file"</span>, http.StatusBadRequest)
        <span class="hljs-keyword">return</span>
    }
    <span class="hljs-keyword">if</span> !utils.IsValidFileType(fileBytes) {
        http.Error(w, <span class="hljs-string">"Invalid file type"</span>, http.StatusUnsupportedMediaType)
        <span class="hljs-keyword">return</span>
    }

    <span class="hljs-comment">// Get additional form fields</span>
    title := r.FormValue(<span class="hljs-string">"title"</span>)
    description := r.FormValue(<span class="hljs-string">"description"</span>)

    uploadDir := <span class="hljs-string">`C:\Users\USER\GolandProjects\image_api\uploads`</span>
    <span class="hljs-keyword">if</span> err := os.MkdirAll(uploadDir, <span class="hljs-number">0755</span>); err != <span class="hljs-literal">nil</span> {
        http.Error(w, <span class="hljs-string">"Could not create upload directory"</span>, http.StatusInternalServerError)
        <span class="hljs-keyword">return</span>
    }

    <span class="hljs-comment">// Save file to disk</span>
    filePath := filepath.Join(uploadDir, handler.Filename)
    dst, err := os.Create(filePath)
    <span class="hljs-keyword">if</span> err != <span class="hljs-literal">nil</span> {
        http.Error(w, <span class="hljs-string">"Could not save file"</span>, http.StatusInternalServerError)
        <span class="hljs-keyword">return</span>
    }
    <span class="hljs-keyword">defer</span> dst.Close()
    io.Copy(dst, bytes.NewReader(fileBytes))

    w.WriteHeader(http.StatusOK)
    fmt.Fprintf(w, <span class="hljs-string">"Uploaded: %s\nTitle: %s\nDescription: %s"</span>, handler.Filename, title, description)
}
</code></pre>
<p>Key points:</p>
<ul>
<li><p><strong>Size limit</strong> prevents huge uploads from consuming memory.</p>
</li>
<li><p><strong>File type validation</strong> ensures only images are accepted.</p>
</li>
<li><p><code>os.MkdirAll</code> guarantees the upload directory exists.</p>
</li>
<li><p><strong>Metadata capture</strong> allows storing more than just the image.</p>
</li>
</ul>
<hr />
<h2 id="heading-utility-functions-utilsgo">Utility Functions (<code>utils.go</code>)</h2>
<pre><code class="lang-go"><span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">IsValidFileType</span><span class="hljs-params">(file []<span class="hljs-keyword">byte</span>)</span> <span class="hljs-title">bool</span></span> {
    fileType := http.DetectContentType(file)
    <span class="hljs-keyword">return</span> strings.HasPrefix(fileType, <span class="hljs-string">"image/"</span>)
}
</code></pre>
<p>This small function makes sure the uploaded file really is an image — no disguised <code>.exe</code> files slipping in.</p>
<hr />
<h2 id="heading-running-the-api">Running the API</h2>
<ol>
<li><p>Clone or create the project.</p>
</li>
<li><p>Run:</p>
<pre><code class="lang-bash"> go run ./cmd/server
</code></pre>
</li>
<li><p>Send a request via <strong>Postman</strong> or a frontend form with:</p>
<ul>
<li><p>File field: <code>file</code></p>
</li>
<li><p>Metadata fields: <code>title</code>, <code>description</code></p>
</li>
</ul>
</li>
</ol>
<hr />
<p>With this small project, I not only learned about Go’s <code>net/http</code> package but also got comfortable with handling <strong>multipart/form-data</strong>, file validation, and CORS.<br />It’s a solid first step toward building more complex APIs in Go.</p>
]]></content:encoded></item><item><title><![CDATA[From Observer to Participant: My First Tech Event Experience 🌟]]></title><description><![CDATA[Yesterday marked a significant milestone in my tech journey as I attended DevFest Mt.Kenya 2024. As a first-timer in the tech conference scene, I wasn't quite sure what to expect - but what unfolded was nothing short of inspiring.
Key takeaways that ...]]></description><link>https://blog.rickmwasofficial.me/from-observer-to-participant-my-first-tech-event-experience</link><guid isPermaLink="true">https://blog.rickmwasofficial.me/from-observer-to-participant-my-first-tech-event-experience</guid><category><![CDATA[technology]]></category><category><![CDATA[devfest]]></category><dc:creator><![CDATA[Erick Mwangi]]></dc:creator><pubDate>Sat, 02 Aug 2025 07:31:24 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1754119783211/dfc92e0e-8c59-4d51-9ceb-e58884c3fa30.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Yesterday marked a significant milestone in my tech journey as I attended DevFest Mt.Kenya 2024. As a first-timer in the tech conference scene, I wasn't quite sure what to expect - but what unfolded was nothing short of inspiring.</p>
<p>Key takeaways that resonated with me:</p>
<p>💡 Community &amp; Collaboration</p>
<p>One of the standout moments was connecting with incredible minds in tech, including several professionals I've long admired. A powerful reminder came from a keynote speaker: "If you want to go fast, work alone; but if you want to go far, work with a team." This perfectly captures the essence of what I learned about the tech community's collaborative spirit.</p>
<p>🔍 Building Developer Relations</p>
<p>We delved into strategic approaches for fostering developer relationships, focusing on three critical pillars:</p>
<ul>
<li><p>Identifying clear goals</p>
</li>
<li><p>Understanding your target audience</p>
</li>
<li><p>Measuring impact and iterating based on successes and failures</p>
</li>
</ul>
<p>🤖 AI Beyond Chatbots</p>
<p>The AI breakout sessions were particularly enlightening. It was refreshing to explore AI applications beyond the typical chatbot use cases, discovering innovative solutions to real-world challenges. This session expanded my perspective on AI's potential impact across various sectors.</p>
<p>🎯 Moving Forward</p>
<p>This experience has ignited a dual mission: developing my technical skills while contributing to our campus tech community's growth. While I feel challenged by the road ahead, I'm incredibly motivated by the possibilities.</p>
<p>As I look toward DevFest 2025, I'm excited to measure my growth and continue this journey in tech. A huge thank you to the organizers and everyone who made this event unforgettable!</p>
]]></content:encoded></item></channel></rss>