<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Michellebuchiokonicha</title>
    <description>The latest articles on DEV Community by Michellebuchiokonicha (@michellebuchiokonicha).</description>
    <link>https://dev.to/michellebuchiokonicha</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F727233%2F83ae7c91-08b5-46a5-8c7f-743e7a449ed6.jpg</url>
      <title>DEV Community: Michellebuchiokonicha</title>
      <link>https://dev.to/michellebuchiokonicha</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/michellebuchiokonicha"/>
    <language>en</language>
    <item>
      <title>Machine Learning</title>
      <dc:creator>Michellebuchiokonicha</dc:creator>
      <pubDate>Thu, 08 Oct 2026 07:15:54 +0000</pubDate>
      <link>https://dev.to/michellebuchiokonicha/-5ap5</link>
      <guid>https://dev.to/michellebuchiokonicha/-5ap5</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/michellebuchiokonicha/i-turned-149k-messy-images-into-an-offline-recognition-system-3cp3" class="crayons-story__hidden-navigation-link"&gt;I Turned 149k Messy Images into an Offline Recognition System&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/michellebuchiokonicha" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F727233%2F83ae7c91-08b5-46a5-8c7f-743e7a449ed6.jpg" alt="michellebuchiokonicha profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/michellebuchiokonicha" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Michellebuchiokonicha
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Michellebuchiokonicha
                
                
              
              &lt;div id="story-author-preview-content-4812044" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/michellebuchiokonicha" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F727233%2F83ae7c91-08b5-46a5-8c7f-743e7a449ed6.jpg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Michellebuchiokonicha&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/michellebuchiokonicha/i-turned-149k-messy-images-into-an-offline-recognition-system-3cp3" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Oct 8&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/michellebuchiokonicha/i-turned-149k-messy-images-into-an-offline-recognition-system-3cp3" id="article-link-4812044"&gt;
          I Turned 149k Messy Images into an Offline Recognition System
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/machinelearning"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;machinelearning&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/programming"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;programming&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/data"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;data&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/michellebuchiokonicha/i-turned-149k-messy-images-into-an-offline-recognition-system-3cp3" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/raised-hands-74b2099fd66a39f2d7eed9305ee0f4553df0eb7b4f11b01b6b1b499973048fe5.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;10&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/michellebuchiokonicha/i-turned-149k-messy-images-into-an-offline-recognition-system-3cp3#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              2&lt;span class="hidden s:inline"&gt;&amp;nbsp;comments&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            13 min read
          &lt;/small&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>ai</category>
      <category>deeplearning</category>
      <category>machinelearning</category>
      <category>python</category>
    </item>
    <item>
      <title>I Turned 149k Messy Images into an Offline Recognition System</title>
      <dc:creator>Michellebuchiokonicha</dc:creator>
      <pubDate>Thu, 08 Oct 2026 06:31:39 +0000</pubDate>
      <link>https://dev.to/michellebuchiokonicha/i-turned-149k-messy-images-into-an-offline-recognition-system-3cp3</link>
      <guid>https://dev.to/michellebuchiokonicha/i-turned-149k-messy-images-into-an-offline-recognition-system-3cp3</guid>
      <description>&lt;p&gt;&lt;em&gt;Training an on-device YOLO26n food detection model from scratch across multi-source datasets&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I set out to build a food recognition system that could look at a photo, tell you what each item is, count how many there are, flag anything that looks spoiled or rotten, and pick out the things that are not food at all. The twist is that it had to do all of that on a phone or an iPad with no internet connection, which meant there was no cloud to lean on and no API to call when the model got confused.&lt;/p&gt;

&lt;p&gt;You would think the hard part of a project like this is the model, but for me it was the data.&lt;/p&gt;

&lt;p&gt;I had about 149k images collected from different sources, and once I set aside one large dataset that had no bounding boxes, I was left with 49,158 images from 11 datasets to work with. Every one of them had its own way of naming things, its own idea of what a good photo looks like, and plenty of the same pictures turning up again and again. So before I trained anything, my first real job was deciding what to throw away.&lt;/p&gt;

&lt;p&gt;I wrote this as I went, following the pipeline in the order I ran it in Google Colab, so you will see the problems I ran into and how I fixed them. Some of the mistakes were mine, and I have left them in on purpose, because that is where most of what I learned came from.&lt;/p&gt;

&lt;p&gt;If you are about to train a model on data from more than one place, I hope this saves you a few of the wrong turns I took.&lt;/p&gt;

&lt;h2&gt;
  
  
  How fast the data shrank
&lt;/h2&gt;

&lt;p&gt;The part that surprised me most was how much smaller the dataset got at every single stage, so I have laid it out in a table before we get into the details.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Stage&lt;/th&gt;
&lt;th&gt;Images&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Original collection&lt;/td&gt;
&lt;td&gt;about 149k&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;After removing a large dataset with no bounding boxes&lt;/td&gt;
&lt;td&gt;49,158&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;After blur, brightness and duplicate cleaning&lt;/td&gt;
&lt;td&gt;31,589&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Clean images that actually had usable labels&lt;/td&gt;
&lt;td&gt;24,306&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Final split&lt;/td&gt;
&lt;td&gt;20,660 train and 3,646 validation&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That means I did not train on 49k images at all, I trained on about 20k, and every one of those drops had a reason that I will walk through as we go.&lt;/p&gt;

&lt;h2&gt;
  
  
  Checking the GPU first
&lt;/h2&gt;

&lt;p&gt;This job needs a GPU, because a full run means a lot of epochs over a big dataset after several rounds of cleaning, and on a CPU that would take days where a Colab T4 gets it done in hours, so the first thing I do in any session is check what I have been given.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;GPU available:&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cuda&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;is_available&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cuda&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;is_available&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;GPU name:&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cuda&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_device_name&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;VRAM:&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cuda&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_device_properties&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;total_memory&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mf"&gt;1e9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;GB&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mine came back as a Tesla T4 with 15.6 GB of VRAM, and if yours says no GPU is available you will need to either pay for one or find a free platform that offers it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Configuring the run
&lt;/h2&gt;

&lt;p&gt;A handful of variables control the whole run, and I like setting them all in one place at the top so I never have to hunt for them later.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;RUN_MODE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;train&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;          &lt;span class="c1"&gt;# 'baseline_only' or 'train'
&lt;/span&gt;&lt;span class="n"&gt;SAMPLE_SIZE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;          &lt;span class="c1"&gt;# None uses everything, 5000 gives a quick test run
&lt;/span&gt;&lt;span class="n"&gt;BLUR_THRESHOLD&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;
&lt;span class="n"&gt;HASH_DISTANCE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I planned the work in three stages, starting with a baseline run to see what the off-the-shelf model knows, then a small 5k training run to prove the whole pipeline works, and finally the full run once the pilot looked sensible. &lt;code&gt;RUN_MODE&lt;/code&gt; decides whether the work stops at the baseline or training goes ahead, and the later cells simply check that one variable with an if/else.&lt;/p&gt;

&lt;p&gt;The pilot saved me a lot of pain, because the bugs I found on the small run would have cost me hours if I had only discovered them on the big one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting the data into Colab
&lt;/h2&gt;

&lt;p&gt;I compressed the annotated data into a zip and stored it on Google Drive, and since reading straight from Drive is slow, I copy the zip onto Colab's local disk and extract it there, which is where two things went wrong for me.&lt;/p&gt;

&lt;p&gt;The first was a partial extraction, where after a disconnect I ended up with a half-unzipped folder that looked perfectly fine but was missing files, and I only caught it because I counted the images and compared the total with the zip, so now I delete the folder, unzip again and check that the count is 49,158 before moving on.&lt;/p&gt;

&lt;p&gt;The second was an extra nesting level, because the zip extracted to &lt;code&gt;data/data/datasets&lt;/code&gt; and a hardcoded path simply fails, so I use a glob to find the &lt;code&gt;datasets&lt;/code&gt; folder wherever it happens to land.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;matches&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;glob&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;glob&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;EXTRACT_DIR&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;**/datasets&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;recursive&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;datasets_dir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;matches&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Installing and importing
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="err"&gt;!&lt;/span&gt;&lt;span class="n"&gt;pip&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;q&lt;/span&gt; &lt;span class="n"&gt;ultralytics&lt;/span&gt; &lt;span class="n"&gt;imagehash&lt;/span&gt; &lt;span class="n"&gt;tqdm&lt;/span&gt; &lt;span class="n"&gt;pyyaml&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;glob&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;shutil&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;collections&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Counter&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;cv2&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;imagehash&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;numpy&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;yaml&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;PIL&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Image&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;tqdm&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;tqdm&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;ultralytics&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;YOLO&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;google.colab&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;drive&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ultralytics handles training, inference and evaluation, imagehash finds near duplicates, tqdm gives you progress bars, and PyYAML reads and writes the dataset config files. Ultralytics runs on PyTorch, which is why &lt;code&gt;torch&lt;/code&gt; is imported for the GPU check, while OpenCV and PIL do the image work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Discovering the classes
&lt;/h2&gt;

&lt;p&gt;Next I read every &lt;code&gt;data.yaml&lt;/code&gt; and printed the classes from each dataset, which looks like a boring step but is the one that shows you just how messy your data really is.&lt;/p&gt;

&lt;p&gt;What I found is probably what you will find too, which is that the same thing gets named in many different ways. One dataset called something &lt;code&gt;tomato&lt;/code&gt;, another &lt;code&gt;vine-tomato&lt;/code&gt; and a third &lt;code&gt;beef-tomato&lt;/code&gt;, apples came as granny-smith, pink-lady and royal-gala, and bell peppers showed up by colour and sometimes as &lt;code&gt;bell-pepper&lt;/code&gt; and sometimes as &lt;code&gt;bell_pepper&lt;/code&gt;. On top of that there was a long tail of overly specific labels for packaged products with brand names and sizes baked in, and if you leave all of that alone, every variant becomes its own class and the total balloons far past the number of distinct things you actually care about.&lt;/p&gt;

&lt;p&gt;The bigger problem was the numbering, because in one dataset egg was class 6 and in another it was class 5, and if you train on both without fixing that, the model is told that one object is two different things and that two different things are the same.&lt;/p&gt;

&lt;p&gt;Then there was one more thing that caught me out, because when I globbed for label files I also picked up the README files, and a "label" I opened turned out to contain the text of an export note instead of box coordinates, so I started filtering out anything with &lt;code&gt;README&lt;/code&gt; in the name and checked my counts by tallying annotations per class in a dataset I knew well.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building the unified class list and remapping labels
&lt;/h2&gt;

&lt;p&gt;This is the step that decides whether your model ends up good or bad, so it deserves the most care, and I broke it into three parts.&lt;/p&gt;

&lt;p&gt;First I merge the aliases, using a dictionary that maps every variant to one canonical name. I only merged things that are really the same object at the level of detail the task needs, and I kept spoiled and fresh versions as separate classes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;MERGE_ALIASES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;granny-smith&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;apple&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;pink-lady&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;apple&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;royal-gala&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;apple&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;vine-tomato&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;tomato&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;beef-tomato&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;tomato&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;bell-pepper&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;bell_pepper&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;capsicum&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;bell_pepper&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="c1"&gt;# ...many more
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;How hard you merge depends on what your model is for, so if you need to tell two varieties apart, keep them separate.&lt;/p&gt;

&lt;p&gt;Then I build the global list by resolving every name through the aliases and sorting the result alphabetically, so the order stays stable between runs.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;GLOBAL_CLASSES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;all_class_names&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That gave me 94 classes, numbered 0 through 93.&lt;/p&gt;

&lt;p&gt;Finally I rewrite every label file, because the first number on each line of a YOLO label file is the class ID and I needed every class to have the same ID in every dataset. In total 48,763 label files were remapped, and only 139 annotations were dropped because they mapped to nothing useful.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cleaning the images
&lt;/h2&gt;

&lt;p&gt;Blurry, badly lit and duplicated images teach a model bad habits and waste GPU time, so I filtered on four things, starting with blur.&lt;/p&gt;

&lt;h3&gt;
  
  
  Blur
&lt;/h3&gt;

&lt;p&gt;The blur check converts the image to grayscale and runs a Laplacian filter, which responds to edges, so sharp images have strong edges and a high variance, while blurry ones have a low variance and get rejected if they fall below the threshold.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;is_blurry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;img&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;gray&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cv2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cvtColor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;img&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cv2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;COLOR_BGR2GRAY&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;cv2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Laplacian&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gray&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cv2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CV_64F&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;var&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;BLUR_THRESHOLD&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The usual starting threshold is 100, but my pilot run is the reason I changed it, because at 100 the filter threw away 14,732 images, about 30% of everything, and only 44.3% of the data survived cleaning. Food photos are often close-ups with soft textures and shallow depth of field, which score low even when they are perfectly good, so I dropped the threshold to 50, which cut the blurry rejections to 6,326 and lifted overall retention to 64.3%.&lt;/p&gt;

&lt;h3&gt;
  
  
  Brightness
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;is_bad_brightness&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;img&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cv2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cvtColor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;img&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cv2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;COLOR_BGR2GRAY&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;225&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;An average below 30 means the picture is too dark to see anything and above 225 means it is washed out, and that check removed 929 images.&lt;/p&gt;

&lt;h3&gt;
  
  
  Duplicates
&lt;/h3&gt;

&lt;p&gt;The same images appear across several scraped datasets, so duplicates were a big deal, and a perceptual hash is a good way to catch them because it fingerprints what an image looks like and near-identical images get near-identical hashes, so if a new image is within a hash distance of 5 of anything already seen, I skip it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;h&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;imagehash&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;phash&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fromarray&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cv2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cvtColor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;img&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cv2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;COLOR_BGR2RGB&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;any&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;sh&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;HASH_DISTANCE&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;sh&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;seen_hashes&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;dupes&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="k"&gt;continue&lt;/span&gt;
&lt;span class="n"&gt;seen_hashes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This dropped 10,314 images, and it is also the slow part, since every new image is compared against every hash kept so far, which means the loop gets slower as it goes and the whole cleaning pass took about 42 minutes for 49,158 images.&lt;/p&gt;

&lt;h3&gt;
  
  
  Letterboxing
&lt;/h3&gt;

&lt;p&gt;YOLO expects square input and squashing a photo into a square distorts the shapes of the objects, so letterboxing scales the image to fit inside 640 by 640 and pads the rest with grey (pixel value 114), and the label coordinates have to be recalculated to match, which is very easy to forget.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;scale&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;TARGET_SIZE&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;nw&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nh&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;scale&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;scale&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;canvas&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;full&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;TARGET_SIZE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TARGET_SIZE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;114&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dtype&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;uint8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I letterboxed the images to 640 by 640 myself and saved them to disk, even though Ultralytics can do it on the fly with &lt;code&gt;imgsz=640&lt;/code&gt;, and the reason was speed. Many of my source images were large camera captures, and decoding big JPEGs again on every epoch was keeping the Colab CPUs busy while the T4 waited for data, so resizing once up front made the files smaller and the extraction quicker, and it left me with the exact offset and scaling logic I needed later to prepare camera frames for the ONNX model on the device.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the labels went missing
&lt;/h2&gt;

&lt;p&gt;This one surprised me, because of the 31,589 clean images only 24,306 had a usable label file, and in the pilot it was much worse, with just 7,758 of 21,780. Some images never had annotations in their original dataset and some lost all of theirs during class remapping, but either way an image without labels is no use for detection training, so they were dropped.&lt;/p&gt;

&lt;h2&gt;
  
  
  Splitting into train and validation
&lt;/h2&gt;

&lt;p&gt;I split the data 85 to 15, which gave 20,660 training images and 3,646 validation images, and I kept a test set aside for later, for when I want to check the model on data it has truly never touched.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;seed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;SAMPLE_SIZE&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;SAMPLE_SIZE&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;labeled&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;sample&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;labeled&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;shuffle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;labeled&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;sample&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;labeled&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="n"&gt;SAMPLE_SIZE&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;split&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sample&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.85&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;train_imgs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sample&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;val_imgs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sample&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;:]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If slicing is new to you, &lt;code&gt;sample[:split]&lt;/code&gt; means everything from the start up to the split point, so the first 85 percent, and &lt;code&gt;sample[split:]&lt;/code&gt; is the rest.&lt;/p&gt;

&lt;p&gt;There is something in this code that I only noticed while writing this post, which is that the seed only matters if something random happens after it. In the 5k pilot the shuffle ran, so the seed made the sample reproducible, but in the full run I used every labelled image, so the code took the first branch, the shuffle never ran, and the split was simply the first 85 percent of a sorted file list against the last 15 percent. If your images are saved in dataset order, your validation set may come mostly from the last dataset or two instead of being a fair mix, so I would shuffle before splitting, ideally stratified by source dataset, and compare class counts in train against validation before trusting any score.&lt;/p&gt;

&lt;p&gt;The YAML file then tells YOLO where everything is.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/content/data&lt;/span&gt;
&lt;span class="na"&gt;train&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;train/images&lt;/span&gt;
&lt;span class="na"&gt;val&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;val/images&lt;/span&gt;
&lt;span class="na"&gt;nc&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;94&lt;/span&gt;
&lt;span class="na"&gt;names&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;apple&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;asparagus&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;avocado&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;...&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Saving a checkpoint to Drive
&lt;/h2&gt;

&lt;p&gt;Once the clean split was ready, I zipped it up and saved it to Drive as a checkpoint.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;zip&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;-q&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;-r&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;CLEAN_ZIP_OUT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;train&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;val&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;dataset.yaml&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
               &lt;span class="n"&gt;cwd&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;/content/data&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I also made a Fast Resume cell that mounts Drive, unzips this file and restores the variables, so after a disconnect I can skip everything above and go straight to evaluation or training, and if you have ever lost a Colab session in the middle of a long job, you will know exactly why that cell exists.&lt;/p&gt;

&lt;h2&gt;
  
  
  The baseline
&lt;/h2&gt;

&lt;p&gt;With the data ready, I ran a baseline, which is simply the off-the-shelf model evaluated on my validation set.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;baseline_model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;YOLO&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;yolo26n.pt&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;baseline_results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;baseline_model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;val&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;YAML_PATH&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;imgsz&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;640&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;batch&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;device&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;YOLO26n is the nano variant, with 122 layers, about 2.4 million parameters and 5.4 GFLOPs, and it comes pretrained on COCO, which has 80 general classes like person, car and laptop.&lt;/p&gt;

&lt;p&gt;On my pilot validation set the baseline scored almost nothing, with mAP@50 around 0.0004, and I should be honest about what that tells you, which is not that the pretrained model is bad at your objects. COCO's class IDs and my class IDs do not line up, so the model gets marked wrong for predicting labels from a completely different list, and what the baseline really confirms is that the two label systems do not match. A fairer baseline would map the handful of overlapping classes, like apple, banana, orange, broccoli and carrot, and score only those, and since I did not do that, I treat my baseline as a sanity check and not as a competitor.&lt;/p&gt;

&lt;h2&gt;
  
  
  The training run
&lt;/h2&gt;

&lt;p&gt;Then came the training run itself.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;train_model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;train&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;YAML_PATH&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;epochs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;epochs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;imgsz&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;640&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;batch&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;workers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;patience&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;patience&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;device&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;pretrained&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;optimizer&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;AdamW&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;lr0&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.001&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;cos_lr&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;augment&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;mixup&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;copy_paste&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I scaled the schedule to the data, so the 5k pilot used 20 epochs with a patience of 10 and anything larger used 100 epochs with a patience of 25, and here is what each of the main settings is doing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;epochs.&lt;/strong&gt; One epoch is one full pass through the training set, so 100 epochs means the model gets to see every training image 100 times.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;batch=16.&lt;/strong&gt; Instead of looking at one image at a time, the model sees 16 together and averages the learning signal, which is steadier and makes better use of the GPU, and if you hit a CUDA out of memory error you can drop it to 8.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;optimizer='AdamW'.&lt;/strong&gt; The optimizer decides how the weights change after each batch, and AdamW adapts per weight, making bigger moves for weights that have barely changed and smaller moves for the ones that are already well tuned.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;lr0=0.001.&lt;/strong&gt; The learning rate sets the size of each adjustment, and if it is too high the model overshoots and never settles, while if it is too low it learns painfully slowly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;cos_lr=True.&lt;/strong&gt; Rather than staying fixed, the learning rate follows a cosine curve from 0.001 down towards zero, so the early epochs make big moves and the later ones make small refinements.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;augment, mixup and copy_paste.&lt;/strong&gt; Ultralytics flips, crops, recolours and distorts images as it trains, mixup blends two images together, and copy-paste lifts objects out of one image and drops them into another, so the model is pushed to learn features that hold up instead of memorising specific photos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;patience.&lt;/strong&gt; If validation does not improve for that many epochs in a row, training stops on its own.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;pretrained=True.&lt;/strong&gt; The model starts from the COCO weights, so it already knows edges, textures and shapes, and training teaches it to apply that knowledge to your own classes.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the runs showed
&lt;/h2&gt;

&lt;p&gt;The 5k pilot took about half an hour and ended with mAP@50 of roughly 0.25, and it was still improving when it stopped, which told me 20 epochs was too few. The full run on about 20k images took around eight minutes per epoch on the T4, climbed quickly at first and then slowed down, and after 35 epochs it had reached about two thirds on mAP@50, while a full 100 epochs would take well over twelve hours, which is more than a Colab session likes to give you, so checkpointing to Drive really matters.&lt;/p&gt;

&lt;p&gt;I would not read too much into the gap between those two numbers, because the runs differ in validation set, number of classes, blur threshold and amount of data all at once, so I cannot say how much of the jump came from more data and how much from the cleaner setup, and the pilot was only ever built to prove the pipeline, which it did.&lt;/p&gt;

&lt;p&gt;The per-class results from the pilot were uneven, with orange, meat, mango, apple and peach doing well at roughly 0.75 to 0.82 on mAP@50, while pizza, hamburger and cooking spray did badly, all below 0.1, and several rare classes had only one to three validation images, which is too few to score honestly.&lt;/p&gt;

&lt;p&gt;It is also worth being clear about what this system can and cannot do, because it flags what it sees, so it can say an item looks spoiled or that something is not food, but it cannot read a use-by date or tell you an item is safe, and with recall in the region of two thirds it will miss some objects, which means counts will tend to run low, so I treat it as a helper and never as a final check.&lt;/p&gt;

&lt;h2&gt;
  
  
  Making it work without internet
&lt;/h2&gt;

&lt;p&gt;Running on a phone or an iPad is the reason I went with the nano variant, since YOLO26n has few enough parameters to run on mobile hardware, and exporting at 640 by 640 gives the model a fixed and predictable input shape.&lt;/p&gt;

&lt;p&gt;Once training is done, I export the best weights to ONNX, a portable format that runs locally with no server and no connection.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;YOLO&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;runs/best.pt&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;export&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;onnx&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;imgsz&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;640&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dynamic&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;simplify&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Setting &lt;code&gt;dynamic=False&lt;/code&gt; fixes the input size and &lt;code&gt;simplify=True&lt;/code&gt; trims the graph, and both help on small devices, so after the export the app only needs the ONNX file and a runtime, and all of the inference happens on the phone or iPad itself. The app also has to prepare each camera frame the same way I prepared the training images, with the same letterboxing to 640 by 640 and the same grey padding, otherwise the boxes will not line up with what the camera sees.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I would do differently
&lt;/h2&gt;

&lt;p&gt;Looking back, there are a few things I would change. I would shuffle before splitting and split by source dataset so that every dataset shows up in both sets, I would build a fairer baseline using the classes COCO and my labels share, and I would replace the duplicate check with something faster than comparing against every earlier hash. I would also hold out a proper test set, because right now the validation set is doing two jobs, and I would change one thing at a time between runs so I can tell what actually helped.&lt;/p&gt;

&lt;p&gt;The biggest lesson for me is that the cleaning and the class unification took far longer than the training and changed the result far more, so if you are about to train on data from several places, that is where your time is best spent.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>machinelearning</category>
      <category>programming</category>
      <category>data</category>
    </item>
    <item>
      <title>I just published Part 1 of "The Machine Learning Engineering Series", where I break down the full lifecycle: how raw data becomes a trained model, gets containerised, and ships as a live API that other engineers can actually build on.</title>
      <dc:creator>Michellebuchiokonicha</dc:creator>
      <pubDate>Tue, 26 May 2026 07:38:04 +0000</pubDate>
      <link>https://dev.to/michellebuchiokonicha/i-just-published-part-1-of-the-machine-learning-engineering-series-where-i-break-down-the-full-3g6</link>
      <guid>https://dev.to/michellebuchiokonicha/i-just-published-part-1-of-the-machine-learning-engineering-series-where-i-break-down-the-full-3g6</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/michellebuchiokonicha/the-machine-learning-engineering-series-3anj" class="crayons-story__hidden-navigation-link"&gt;The Machine Learning Engineering Series&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/michellebuchiokonicha" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F727233%2F83ae7c91-08b5-46a5-8c7f-743e7a449ed6.jpg" alt="michellebuchiokonicha profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/michellebuchiokonicha" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Michellebuchiokonicha
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Michellebuchiokonicha
                
              
              &lt;div id="story-author-preview-content-3754939" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/michellebuchiokonicha" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F727233%2F83ae7c91-08b5-46a5-8c7f-743e7a449ed6.jpg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Michellebuchiokonicha&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/michellebuchiokonicha/the-machine-learning-engineering-series-3anj" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;May 26&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/michellebuchiokonicha/the-machine-learning-engineering-series-3anj" id="article-link-3754939"&gt;
          The Machine Learning Engineering Series
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/machinelearning"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;machinelearning&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/deeplearning"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;deeplearning&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/software"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;software&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/michellebuchiokonicha/the-machine-learning-engineering-series-3anj" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;12&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/michellebuchiokonicha/the-machine-learning-engineering-series-3anj#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            5 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>api</category>
      <category>docker</category>
      <category>machinelearning</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>The Machine Learning Engineering Series</title>
      <dc:creator>Michellebuchiokonicha</dc:creator>
      <pubDate>Tue, 26 May 2026 07:33:01 +0000</pubDate>
      <link>https://dev.to/michellebuchiokonicha/the-machine-learning-engineering-series-3anj</link>
      <guid>https://dev.to/michellebuchiokonicha/the-machine-learning-engineering-series-3anj</guid>
      <description>&lt;h2&gt;
  
  
  &lt;strong&gt;Part 1: From Scratch to Systems&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;.&lt;br&gt;
This machine learning series will be a real ride. It’s an interactive journey where I’ll be sharing and raising lots of questions while building real-world AI systems. My goal is to make this deeply engaging, drive home the right questions, and bridge the gap between AI theory and engineering reality.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note: There will be follow-up videos complementing this series, so keep an eye out for video links as they are released!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Let’s start at the very beginning.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Differentiating the Field: Who Does What?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;There is massive confusion in the tech industry right now regarding job titles. To understand what a Machine Learning Engineer (MLE) actually does, we have to look at how they fit alongside Data Scientists and AI Software Engineers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. The Machine Learning Engineer (MLE)&lt;/strong&gt;&lt;br&gt;
An MLE is a specialised software engineer responsible for researching, building, scaling, and deploying machine learning models. They sit firmly at the intersection of software engineering, data science, and infrastructure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Their core responsibilities include:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Model Development: designing and training algorithms and deep neural networks.&lt;/p&gt;

&lt;p&gt;Data Preparation: cleaning, organising, and transforming large datasets.&lt;/p&gt;

&lt;p&gt;Production Deployment &amp;amp; MLOps: deploying models to the cloud and continuously monitoring their performance.&lt;/p&gt;

&lt;p&gt;System Architecture: building the core application infrastructure so these models can be used reliably at scale.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. The Data Scientist (DS)&lt;/strong&gt;&lt;br&gt;
A Data Scientist is primarily focused on research, statistics, and business analysis. While an MLE is focused on specialised software engineering and scalability, a Data Scientist spends their time exploring raw data, testing hypotheses, and building prototype models to prove a business concept works.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. The AI Software Engineer&lt;/strong&gt;&lt;br&gt;
An AI Software Engineer focuses on integration and utility. They treat machine learning models as powerful building blocks. Their primary job is to build the application frontends, backends, and user experiences that consume AI capabilities (often via external APIs), rather than training the core models from scratch.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;The Core Blueprint: What You Need to Know&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Most successful ML Engineers start as traditional software engineers who specialise, or are builders who learn the entire technical stack from the ground up. If you want to excel as an MLE, these are the core requirements:&lt;/p&gt;

&lt;p&gt;Programming Languages: Python is the non-negotiable standard of the discipline. However, depending on the organisation and performance needs, some MLEs are also highly skilled in Java or C++.&lt;/p&gt;

&lt;p&gt;ML Frameworks: you must be comfortable navigating production-grade libraries like PyTorch, TensorFlow, Keras, and scikit-learn.&lt;br&gt;
Mathematics &amp;amp; Statistics: This is the area where many engineers fall short. While you might not be quizzed on complex proofs in every interview, understanding linear algebra, calculus, and probability is vital for debugging model behaviour.&lt;/p&gt;

&lt;p&gt;Infrastructure &amp;amp; Tooling: You need to be comfortable with cloud computing platforms (GCP, AWS, etc.). Version control (Git/GitHub) is essential for managing your work, and Docker is effectively mandatory for containerising applications.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Understanding the Data&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Before a system can learn, we have to understand the raw material. Data is broadly classified into two categories:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Structured Data&lt;/strong&gt;: highly organised data that easily fits into rows and columns (e.g., CSV files, SQL databases).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Unstructured Data&lt;/strong&gt;: complex data that does not have a pre-defined structure (e.g., images, audio, and natural language text).&lt;/p&gt;

&lt;p&gt;The mechanics, architectures, and training pipelines required for unstructured data are entirely different from those used for structured data.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;The Machine Learning Engineering Pipeline&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Here is the bird’s eye view of how a model evolves from raw data into a living system:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data  ➔  Clean &amp;amp; Transform  ➔  Analyse  ➔  Baseline vs. Custom Model  ➔  Train &amp;amp; Test  ➔  Containerise &amp;amp; Deploy  ➔  Expose as API&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Ingestion &amp;amp; Analysis&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Gathering Data: highly dependent on your organisation’s size. Sometimes this is handled by Data Engineers, but an MLE must know how to pull and ingest data independently.&lt;/p&gt;

&lt;p&gt;Cleaning and Organising: raw data is messy. Here, data is cleaned, structured, and transformed into features. We will dive incredibly deep into this layer later in this series.&lt;/p&gt;

&lt;p&gt;Exploratory Data Analysis (EDA): an MLE must thoroughly analyse data distributions and shapes before moving to the modelling phase.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. The Modelling Strategy (Baseline vs. Custom)&lt;/strong&gt;&lt;br&gt;
When designing a system, you never just train a model blindly. You start with a baseline model.&lt;br&gt;
A baseline can be an existing state-of-the-art architecture or a previously developed model. The ultimate goal of training a custom model is to prove it can outperform your baseline. If your complex custom model performs worse than a simple baseline, it shouldn’t go into production.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Training, Testing, and the “Skew” Bug&lt;/strong&gt;&lt;br&gt;
Training is heavily dependent on the data type and requires a deep understanding of concepts like epochs, loss functions, and regularisation techniques such as dropout (which help prevent overfitting).&lt;/p&gt;

&lt;p&gt;Once trained, we must rigorously evaluate the model. Beyond traditional software bugs, MLEs face unique production challenges like training-serving skew.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is training-serving skew?&lt;/strong&gt; &lt;br&gt;
This occurs when the data a model encounters in production (real life) is significantly different from the data it was trained on. This causes performance to plummet and can lead to the model producing unreliable or low-quality predictions. An MLE’s job is to ensure the training data is adequate and representative to minimise this skew.&lt;/p&gt;

&lt;p&gt;You must also master evaluation metrics to track success, including the confusion matrix (precision, recall, accuracy, F1-score) and mAP (mean average precision) for spatial / object-detection systems.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Conversion to APIs &amp;amp; Building Systems&lt;/strong&gt;&lt;br&gt;
A model sitting on your local machine is useless. An MLE transforms a trained model into a lightweight, usable form by converting it into an API (using frameworks like FastAPI).&lt;/p&gt;

&lt;p&gt;This makes the model highly accessible, allowing other software engineers or IoT infrastructures to seamlessly integrate its AI capabilities into a broader system.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Production Testing (Ensuring Utility)&lt;/strong&gt;&lt;br&gt;
Our job isn’t done just because the system runs. It must be reliable, secure, and useful. A system builder must implement a strict testing hierarchy to protect against vulnerabilities and low-standard features:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Unit Testing:&lt;/strong&gt; testing individual components and functions in isolation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Integration Testing:&lt;/strong&gt; ensuring the data pipeline, API, and model interact perfectly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Smoke Testing:&lt;/strong&gt; rapidly verifying that the core infrastructure doesn’t crash upon deployment.&lt;/p&gt;

&lt;p&gt;Testing isn’t just the icing on the cake; it is the foundational requirement for safety, reliability, and engineering confidence.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. The Core Paradigms&lt;/strong&gt;: From Linear Regression to Clustering&lt;br&gt;
As we dive deeper into modelling throughout this series, we will break down the core learning paradigms that power these systems. You can’t build advanced architectures without mastering the fundamentals:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Supervised Learning:&lt;/strong&gt; training models on labelled data (where the system knows the correct answers during training). This includes foundational algorithms like linear regression for predicting continuous values, all the way up to complex neural networks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Unsupervised Learning:&lt;/strong&gt; giving the model raw, unlabelled data and letting it discover hidden structures on its own. A prime example of this is clustering, where the system automatically groups similar data points without human intervention.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;What’s Next?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Throughout this series, we are going to cover all of these concepts in depth. We will write the code, sketch the architectures, look at how these systems impact modern workplaces, and discuss how to position these skills to land an elite MLE role.&lt;br&gt;
Buckle up, this is going to be an incredible build.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>machinelearning</category>
      <category>deeplearning</category>
      <category>software</category>
    </item>
    <item>
      <title>Google I/O 2026: From Consumer to Builder</title>
      <dc:creator>Michellebuchiokonicha</dc:creator>
      <pubDate>Wed, 20 May 2026 19:41:08 +0000</pubDate>
      <link>https://dev.to/michellebuchiokonicha/google-io-2026-from-consumer-to-builder-dom</link>
      <guid>https://dev.to/michellebuchiokonicha/google-io-2026-from-consumer-to-builder-dom</guid>
      <description>&lt;p&gt;I often tune in to Google I/O. But this year felt different.&lt;/p&gt;

&lt;p&gt;In the past, I watched as a consumer. I needed the updates, first to keep up, then to pass them on to my audience. I was a distributor of news, a passive relay between Google's stage and other people's feeds.&lt;/p&gt;

&lt;p&gt;This year, my pen hit the paper differently.&lt;/p&gt;

&lt;p&gt;I watched as a builder. I wasn't tracking announcements to repeat them; I was scanning each one for where I fit, where I could come in, and how. I took pages of hurried notes, not to summarize later, but to return to and &lt;em&gt;explore&lt;/em&gt;. Somewhere between the keynote's opening and its close, a quiet shift happened: I stopped feeling like an observer of the future and started feeling like a participant in it.&lt;/p&gt;

&lt;p&gt;Here's what I saw, and why it mattered to me.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Foundations Got Heavier
&lt;/h2&gt;

&lt;p&gt;The keynote leaned hard on raw capability, the infrastructure underneath everything else. When the talk turned to the computing powering this new generation of models, I didn't just hear "faster." I heard the heavy-lifting engine for the deep, custom architectures I've been turning over in my head. The horsepower is finally scaling to match the complexity of what's coming.&lt;/p&gt;

&lt;p&gt;Then came the models. Seeing &lt;strong&gt;Gemini 3.5 Flash&lt;/strong&gt; and &lt;strong&gt;Gemini Omni Flash&lt;/strong&gt; stream across the screen made me lean forward. Gemini 3.5 Flash pairs frontier intelligence with the ability to actually &lt;em&gt;act&lt;/em&gt; , Google says it outperforms the previous Pro generation on coding and agentic benchmarks while running several times faster. Gemini Omni, meanwhile, takes image, audio, video, and text as input and generates editable video grounded in real-world knowledge.&lt;/p&gt;

&lt;p&gt;For anyone building fast, reactive systems, that combination, native multimodality plus low latency, is the holy grail. We are moving past models that guess at the next word toward models that understand and generate across every modality at once.&lt;/p&gt;

&lt;h2&gt;
  
  
  From Assistants to Autonomous Digital Lives
&lt;/h2&gt;

&lt;p&gt;The real turn in the keynote was the move from &lt;em&gt;conversational assistants&lt;/em&gt; to &lt;em&gt;agentic workflows&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;This is where &lt;strong&gt;Gemini Spark&lt;/strong&gt; came in, Google's pitch for a 24/7 personal agent that manages your digital life in the background. The framing that stuck with me: you can close your laptop, and the work keeps going. It feels less like a tool you pick up and put down, and more like an environment that runs on your behalf.&lt;/p&gt;

&lt;p&gt;To make that practical, it leans on the &lt;strong&gt;Model Context Protocol (MCP)&lt;/strong&gt; to integrate with third-party tools. I scribbled a question in my margin: &lt;em&gt;Is this just an advanced Siri?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;My conclusion: no. This is a genuine paradigm shift. But — and I underlined this, as a builder, I still believe keeping a &lt;strong&gt;human in the loop&lt;/strong&gt; is non-negotiable for high-stakes decisions. An agent that acts while you sleep is powerful. It's also exactly the kind of system where the cost of a silent mistake is highest.&lt;/p&gt;

&lt;h2&gt;
  
  
  Agentic Commerce Gets Real
&lt;/h2&gt;

&lt;p&gt;The commerce announcements immediately tested that belief.&lt;/p&gt;

&lt;p&gt;Google introduced &lt;strong&gt;Universal Cart&lt;/strong&gt;, an intelligent shopping cart that follows you across Search, Gemini, YouTube, and Gmail, tracking price drops and restocks in the background. Underneath it sit two protocols: the &lt;strong&gt;Universal Commerce Protocol (UCP)&lt;/strong&gt;, a common language for agent-driven checkout, and the &lt;strong&gt;Agent Payments Protocol (AP2)&lt;/strong&gt;, which lets agents complete purchases on your behalf within guardrails you set, specific brands, specific products, a spending cap.&lt;/p&gt;

&lt;p&gt;AP2 builds a tamper-proof, verifiable record linking shopper, merchant, and payment processor. As an engineer, that's the part I find genuinely interesting: it's the bridge between a model that &lt;em&gt;thinks&lt;/em&gt; and a model that &lt;em&gt;securely transacts&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;But it's worth being clear-eyed. Reporters covering I/O framed Universal Cart as Google's bid to become the default middleman in online commerce, a market some analysts project in the trillions by the end of the decade. Some retailers are already reporting traffic shifts as shoppers move from search to agents. The engineering opportunity here is enormous: end-to-end transaction systems where the agent owns the whole procurement and verification lifecycle. The responsibility that comes with it is just as large.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sensory Interfaces and Immersive Wearables
&lt;/h2&gt;

&lt;p&gt;A few updates pointed at where the &lt;em&gt;interface&lt;/em&gt; itself is going.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Neural Expressive&lt;/strong&gt;, Gemini's new design language brings adaptive emotional pacing to voices, fluid animation, and haptic feedback, making real-time audio dialogue feel noticeably more lifelike. And the &lt;strong&gt;Intelligent Eyewear&lt;/strong&gt; running on Android XR moves the assistant off the screen entirely and into your physical space, directions, texts, and photos, all from a pair of glasses.&lt;/p&gt;

&lt;p&gt;On the creative side, &lt;strong&gt;Flow Music&lt;/strong&gt; stood out: a sandbox for composing original, high-fidelity songs through prompt-based collaboration. The audio modality is becoming completely fluid.&lt;/p&gt;

&lt;h2&gt;
  
  
  Trust, Verification, and the Hard Engineering Track
&lt;/h2&gt;

&lt;p&gt;What reassured me was that the keynote didn't only sell capability, it addressed guardrails.&lt;/p&gt;

&lt;p&gt;The expansion of &lt;strong&gt;C2PA Content Credentials&lt;/strong&gt; means you can verify whether a piece of content is an unaltered original or has been modified, a check that extends all the way down to validating research and academic material. In a year defined by generative everything, provenance isn't a footnote. It's infrastructure.&lt;/p&gt;

&lt;p&gt;Tooling for developers got attention too, including the agent-first work on Google's &lt;strong&gt;Antigravity&lt;/strong&gt; platform, a sign that "anyone can be a builder" wasn't just a tagline but a thing Google is actively engineering toward.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Final Reflection
&lt;/h2&gt;

&lt;p&gt;I closed my notebook with pages of short, hurried notes. But I walked away with something more useful than notes: a map.&lt;/p&gt;

&lt;p&gt;For the first time, I wasn't just watching Google build the future. I was figuring out exactly where I'm going to build &lt;em&gt;in&lt;/em&gt; it, which protocols to learn, which models to prototype against, which problems are now finally tractable.&lt;/p&gt;

&lt;p&gt;The shift from consumer to contributor doesn't happen with a single announcement. It happens the moment you stop asking "what did they release?" and start asking "what can I make with this?"&lt;/p&gt;

&lt;p&gt;This year, I started asking the second question.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Were you watching I/O 2026? I'd love to hear which announcement made&lt;/em&gt; you &lt;em&gt;lean forward, drop it in the comments.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>buildinpublic</category>
      <category>google</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>I have been struggling to write…</title>
      <dc:creator>Michellebuchiokonicha</dc:creator>
      <pubDate>Sat, 28 Feb 2026 08:22:51 +0000</pubDate>
      <link>https://dev.to/michellebuchiokonicha/i-have-been-struggling-to-write-15j8</link>
      <guid>https://dev.to/michellebuchiokonicha/i-have-been-struggling-to-write-15j8</guid>
      <description>&lt;p&gt;I have been writing technical articles since 2022. My passion for technology has been built on writing. I have loved it even before I realized I wanted to go into software development. I used to write poems that got published while in school, so writing technical articles when I started coding was not a big deal for me. I have always written.&lt;/p&gt;

&lt;p&gt;In fact, my parents used to say I would be like Chimamanda Adichie. Because not only did I know how to coin words, I knew how to express them in speech, and I also loved to read, which helped me greatly in writing with ease. At some point, while in secondary school, I considered becoming a writer and studying Literature just so I could write and speak. It always gave me joy.&lt;/p&gt;

&lt;p&gt;But recently, I find myself struggling to do one of the things I would normally term ‘easiest’ to do.&lt;/p&gt;

&lt;p&gt;This struggle started creeping in gradually in 2024. When ChatGPT came on board.&lt;br&gt;
I still continued writing, and I had my articles featured on Dev. to amongst the 7 most read articles.&lt;/p&gt;

&lt;p&gt;Some of my articles climbed to 40,000 reads, numerous comments, and likes. And in 2025, my new article also got featured on hasnode but in the heat of AI and arguments on AI being able to do everything, I wrote only two articles, and I paused.&lt;/p&gt;

&lt;p&gt;I was confused, I was in doubt, I had questions: “Will people need to read articles on asynchronous functions, supervised learning, JavaScript, Python, and more, if AI can simply provide all the information?”&lt;/p&gt;

&lt;p&gt;Secondly, I was confused because I have been a web developer all this time. Mostly writing and building frontend applications, hence most of my articles covered the web and JavaScript. But with this new excitement, I didn’t just want to stick only to the web; I wanted to branch into machine learning. This also made me pause to reflect. What started as a short-term pause in February 2025 turned into a full year of not writing any technical articles. I feel like crying as I type this. It hurts me more than I ever thought it would.&lt;/p&gt;

&lt;p&gt;I have many excuses. Another would definitely be that I want to start a YouTube channel and be active on social media instead of writing. But I have asked so many questions. Can I edit videos? Do I really want to keep talking and explaining technology concepts instead of simply penning them down as articles? And right now, it has dawned on me. I don’t know how consistent I can be with explaining concepts via speech as opposed to writing them down, which is easier and smoother for me.&lt;br&gt;
I have been stalling, waiting, postponing this, telling myself I am too busy, telling myself AI can explain everything, telling myself YouTube is better now, as people don’t read anymore. But it feels like something is missing. Like, I am not doing one of the things I am meant to be doing, and it hurts, it breaks my heart so much.&lt;/p&gt;

&lt;p&gt;This is my first piece in one year, and truly, this morning, 7:50 am, 22nd February, 2026, thinking deeply about what could have been if I had not stopped writing, I decided to just write.&lt;/p&gt;

&lt;p&gt;I have no will for any aspire to perspire, but I guess we will all figure it out. The questions, the doubts. If you are like me, then write.&lt;/p&gt;

&lt;p&gt;JUST WRITE.&lt;/p&gt;

</description>
      <category>writing</category>
      <category>programming</category>
      <category>software</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>Infrastructure as Code: Getting Started with Terraform for Cloud Deployment</title>
      <dc:creator>Michellebuchiokonicha</dc:creator>
      <pubDate>Fri, 14 Feb 2025 06:55:29 +0000</pubDate>
      <link>https://dev.to/michellebuchiokonicha/getting-started-with-terraform-for-cloud-deployment-9f0</link>
      <guid>https://dev.to/michellebuchiokonicha/getting-started-with-terraform-for-cloud-deployment-9f0</guid>
      <description>&lt;h2&gt;
  
  
  Introduction to Cloud Services
&lt;/h2&gt;

&lt;p&gt;Cloud computing has changed the way we deploy and manage applications. It offers various service models to meet different needs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Infrastructure as a Service (IaaS):&lt;/strong&gt; Provides on-demand access to computing resources like servers, storage, and networking.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Platform as a Service (PaaS):&lt;/strong&gt; Offers hardware and software resources for cloud application development, eliminating the need to manage the underlying infrastructure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Software as a Service (SaaS):&lt;/strong&gt; Delivers full application stacks as a cloud service, including maintenance and management of both infrastructure and software.&lt;/p&gt;

&lt;h2&gt;
  
  
  Benefits of Cloud Deployment
&lt;/h2&gt;

&lt;p&gt;Using the cloud for computing and deployment comes with several advantages:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Faster Time to Market:&lt;/strong&gt; Servers can be deployed with just a few clicks, significantly accelerating the development process.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cost Savings:&lt;/strong&gt; By choosing the right set of services, infrastructure costs can be drastically reduced.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data Loss Prevention:&lt;/strong&gt; Data is stored across multiple data centers in different availability zones, ensuring redundancy and reliability.&lt;/p&gt;

&lt;h2&gt;
  
  
  Challenges of Cloud Deployment
&lt;/h2&gt;

&lt;p&gt;While the cloud offers many benefits, there are some challenges to consider:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Vendor Lock-In:&lt;/strong&gt; Switching cloud providers can be costly and complex, often leaving customers tied to their original vendor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lack of Expertise:&lt;/strong&gt; Finding skilled cloud professionals can be difficult, as the demand for cloud expertise often outstrips supply.&lt;/p&gt;

&lt;h2&gt;
  
  
  Major Cloud Providers
&lt;/h2&gt;

&lt;p&gt;The three largest cloud providers dominate the market:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AWS (Amazon Web Services):&lt;/strong&gt; Holds the largest market share in the US and offers a wide range of services.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Azure:&lt;/strong&gt; Known for its seamless integration with Microsoft products and a strong presence in Germany.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GCP (Google Cloud Platform):&lt;/strong&gt; This has seen rapid growth over the past three years and integrates well with Google products like Google Analytics.&lt;/p&gt;

&lt;h2&gt;
  
  
  Deploying to the Cloud
&lt;/h2&gt;

&lt;p&gt;Deploying applications in the cloud involves using a variety of services. While you can manage these services manually through the cloud console, this approach has limitations:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Complexity:&lt;/strong&gt; Dropping or modifying services can be tedious, requiring you to navigate through multiple menus.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lack of Replicability:&lt;/strong&gt; Manual configurations are hard to replicate, making it difficult for others to understand or reproduce your setup.&lt;/p&gt;

&lt;p&gt;This is where &lt;strong&gt;Infrastructure as Code (IaC)&lt;/strong&gt; comes in. IaC allows you to define and manage your infrastructure using code, making it replicable, understandable, and easier to maintain.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Infrastructure as Code (IaC)?
&lt;/h2&gt;

&lt;p&gt;Infrastructure as Code (IaC) is the practice of managing and provisioning infrastructure through code instead of manual processes. This approach has become increasingly popular, with IaC skills now appearing in job postings for roles like Data Analysts.&lt;br&gt;
Popular IaC tools include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Terraform&lt;/li&gt;
&lt;li&gt;AWS CloudFormation&lt;/li&gt;
&lt;li&gt;Azure Resource Manager&lt;/li&gt;
&lt;li&gt;Google Cloud Deployment Manager&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Among these, &lt;strong&gt;Terraform&lt;/strong&gt; stands out due to its ability to work across multiple cloud providers, making it a versatile choice for organizations that may migrate between clouds.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why Terraform?
&lt;/h2&gt;

&lt;p&gt;Terraform is an open-source IaC tool that allows you to build, change, and version infrastructure safely and efficiently. Here’s why it’s a great choice:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Multi-Cloud Support:&lt;/strong&gt; Terraform supports multiple cloud providers, including AWS, Azure, and GCP.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rollback Capabilities:&lt;/strong&gt; Infrastructure changes can be easily rolled back, minimizing downtime and risks.&lt;br&gt;
Ease of Use: Terraform uses a declarative language, making it easy to learn and use. You only need a few commands to get started.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cost Efficiency:&lt;/strong&gt; You can stop and resume your infrastructure as needed, saving on cloud credits and usage.&lt;/p&gt;
&lt;h2&gt;
  
  
  Setting Up Terraform
&lt;/h2&gt;

&lt;p&gt;To get started with Terraform, you’ll need:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A Cloud Provider Account:&lt;/strong&gt; For this guide, we’ll use AWS.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Terraform Installed:&lt;/strong&gt; Download and install Terraform from the website: &lt;a href="https://www.terraform.io/" rel="noopener noreferrer"&gt;https://www.terraform.io/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Example: Setting Up an S3 Bucket in AWS&lt;/p&gt;

&lt;p&gt;Here’s an example of how to set up an S3 bucket using Terraform:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;provider "aws" {
  region = "us-east-1"
}

resource "aws_s3_bucket" "example_bucket" {
  bucket = "my-unique-bucket-name"
  acl    = "private"

  versioning {
    enabled = true
  }

  tags = {
    Name        = "Example Bucket"
    Environment = "Dev"
  }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This code defines an S3 bucket with versioning enabled and tags for identification. You can customize it further based on your needs.&lt;br&gt;
Conclusion&lt;/p&gt;

&lt;p&gt;you need to further set up:&lt;/p&gt;

&lt;p&gt;provider&lt;br&gt;
aws_s3_bucket&lt;br&gt;
aw3_s3_bucket_public_access_block&lt;br&gt;
aws_s3_bucket_ownership_controls&lt;br&gt;
aws_s3_bucket_acl&lt;br&gt;
aws_s3_object&lt;br&gt;
aws_s3_bucket_website_configuration&lt;/p&gt;

&lt;p&gt;Here is a simple setup&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;provider "aws" {
    region = "us-east-1"
}

resource "aws_s3_bucket" "s3" {
    bucket = "your-bucket"
}

resource "aws_s3_bucket_public_access_block" "s3-public-block" {
    bucket = aws_s3_bucket.s3.id

    block_public_acls       = false
    block_public_policy     = false
    ignore_public_acls      = true
    restrict_public_buckets = false
}

resource "aws_s3_bucket_ownership_controls" "s3-ownership" {
    bucket = aws_s3_bucket.s3.id

    rule {
        object_ownership = "BucketOwnerPreferred"
    }
}

resource "aws_s3_bucket_acl" "s3-acl" {
    bucket = aws_s3_bucket.s3.id
    acl    = "public-read"
}

resource "aws_s3_object" "s3-object" {
    bucket       = aws_s3_bucket.s3.id
    key          = "index.html"
    source       = "index.html"
    content_type = "text/html"
    acl          = "public-read"
}

resource "aws_s3_bucket_website_configuration" "s3-website-configuration" {
    bucket = aws_s3_bucket.s3.id

    index_document {
        suffix = "index.html"
    }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;with this simple setup, you can deploy your first web application.&lt;br&gt;
I have further included a sample index.html file&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang="en"&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset="UTF-8"&amp;gt;
    &amp;lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&amp;gt;
    &amp;lt;title&amp;gt;Welcome to My Website&amp;lt;/title&amp;gt;
    &amp;lt;style&amp;gt;
        body {
            font-family: Arial, sans-serif;
            margin: 0;
            padding: 0;
            background-color: #f4f4f4;
            color: #333;
            text-align: center;
        }
        header {
            background-color: #007bff;
            color: white;
            padding: 20px 0;
        }
        h1 {
            margin: 0;
        }
        main {
            padding: 20px;
        }
        footer {
            background-color: #333;
            color: white;
            padding: 10px 0;
            position: fixed;
            bottom: 0;
            width: 100%;
        }
    &amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;header&amp;gt;
        &amp;lt;h1&amp;gt;Welcome to My Website&amp;lt;/h1&amp;gt;
    &amp;lt;/header&amp;gt;
    &amp;lt;main&amp;gt;
        &amp;lt;p&amp;gt;Hello, world! This is a simple webpage hosted on AWS S3.&amp;lt;/p&amp;gt;
        &amp;lt;p&amp;gt;Enjoy browsing!&amp;lt;/p&amp;gt;
    &amp;lt;/main&amp;gt;
    &amp;lt;footer&amp;gt;
        &amp;lt;p&amp;gt;&amp;amp;copy; 2025 My Website&amp;lt;/p&amp;gt;
    &amp;lt;/footer&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To install terraform, use:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;terraform -v&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;then open your IDE and run &lt;code&gt;terraform init&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;To format and validate your terraform code, run &lt;code&gt;terraform fmt&lt;/code&gt; and &lt;br&gt;
&lt;code&gt;terraform validate&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Next, you would need to plan and make changes with&lt;br&gt;
&lt;code&gt;terraform plan&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;To apply the changes made, run &lt;code&gt;terraform apply -auto-approve&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Lastly, in order to save bandwidth and when you are not using the infrastructure at a certain time, you can destroy it with&lt;/p&gt;

&lt;p&gt;&lt;code&gt;terraform destroy -auto-approve&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;You can further rerun/rebuild by running &lt;br&gt;
&lt;code&gt;terraform apply&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The process is quite seamless and easy to use and understand. it saves you time, provides flexibility, and also allows other developers to see what you have done.&lt;/p&gt;

&lt;p&gt;Infrastructure as Code, particularly with tools like Terraform, simplifies cloud deployment and management. It ensures that your infrastructure is replicable, understandable, and easy to maintain. Whether you’re working with AWS, Azure, or GCP, Terraform provides a consistent and efficient way to manage your cloud resources.&lt;br&gt;
Start your IaC journey today and experience the benefits of deploying infrastructure as code!&lt;/p&gt;

</description>
      <category>terraform</category>
      <category>cloud</category>
      <category>aws</category>
      <category>googlecloud</category>
    </item>
    <item>
      <title>Python OOP Made Easy: Master Object-Oriented Programming with Ease</title>
      <dc:creator>Michellebuchiokonicha</dc:creator>
      <pubDate>Tue, 04 Feb 2025 07:38:22 +0000</pubDate>
      <link>https://dev.to/michellebuchiokonicha/python-oop-made-easy-master-object-oriented-programming-with-ease-4h9e</link>
      <guid>https://dev.to/michellebuchiokonicha/python-oop-made-easy-master-object-oriented-programming-with-ease-4h9e</guid>
      <description>&lt;p&gt;Object-Oriented Programming (OOP) is a programming paradigm that uses objects and classes to structure software. Unlike procedural programming, which focuses on functions and procedures, OOP emphasizes using objects that encapsulate data and behavior. Python, a versatile language, fully supports OOP, making it a powerful tool for building modular, reusable, and maintainable code.&lt;/p&gt;

&lt;p&gt;In this article, we’ll explore the basics of OOP in Python, including classes, objects, attributes, methods, inheritance, polymorphism, encapsulation, and abstraction. We’ll also dive into functional programming concepts and how they complement OOP in Python.&lt;/p&gt;

&lt;h2&gt;
  
  
  Python OOP Basics
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What is OOP?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;OOP is a programming paradigm that organizes code into classes and objects. A class is a blueprint for creating objects, while an object is an instance of a class. OOP promotes concepts like modularity, reusability, and abstraction, making it easier to manage complex systems.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros of Object-Oriented Programming&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Modularity: Code is organized into reusable components.&lt;/p&gt;

&lt;p&gt;Abstraction: Hide complex implementation details.&lt;/p&gt;

&lt;p&gt;Maintenance: Easier to update and debug.&lt;/p&gt;

&lt;p&gt;Reusability: Classes can be reused across projects.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cons of Object-Oriented Programming&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Complexity: This can be overkill for simple programs.&lt;/p&gt;

&lt;p&gt;Performance: Slightly slower due to overhead.&lt;/p&gt;

&lt;p&gt;Overuse: Not every problem requires an OOP solution.&lt;/p&gt;

&lt;h2&gt;
  
  
  Classes and Objects in Python
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What are Classes and Objects?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A class is a blueprint for creating objects. It defines the attributes (data) and methods (functions) that the objects will have. An object is an instance of a class.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def say_hi(self):
        print(f"Hi, my name is {self.name} and I’m {self.age} years old.")

# Creating objects
person1 = Person("Alice", 25)
person2 = Person("Bob", 35)

person1.say_hi()  # Output: Hi, my name is Alice and I’m 25 years old.
person2.say_hi()  # Output: Hi, my name is Bob and I’m 35 years old.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What Can Go Wrong?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Python is flexible, but this can lead to mistakes. For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;person3 = Person(name="Charlie", age=person1)
person3.say_hi()  # Output: Hi, my name is Charlie and I’m &amp;lt;__main__.Person object at 0x109f301c0&amp;gt; years old.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here, &lt;strong&gt;age&lt;/strong&gt; is mistakenly assigned an object instead of a number. Always validate inputs!&lt;/p&gt;

&lt;h2&gt;
  
  
  Attributes and Methods
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Attributes&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Attributes define the state of an object. They store data associated with the object.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Methods&lt;/strong&gt;&lt;br&gt;
Methods define the behavior of an object. They are functions attached to a class.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class Car:
    wheels = 4  # Class attribute

    def __init__(self, make, model, year=None):
        self.make = make  # Instance attribute
        self.model = model
        self.year = year

    def get_make_model(self):  # Instance method
        return f"{self.make} {self.model}"

car1 = Car("Toyota", "Camry", 2021)
print(car1.get_make_model())  # Output: Toyota Camry
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Inheritance in Python
&lt;/h2&gt;

&lt;p&gt;Inheritance allows a class (child) to inherit attributes and methods from another class (parent). This promotes code reuse and hierarchy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class Animal:
    def __init__(self, name):
        self.name = name

    def speak(self):
        print("This animal speaks.")

class Dog(Animal):
    def speak(self):
        print("Woof!")

dog = Dog("Pelle")
dog.speak()  # Output: Woof!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Polymorphism, Encapsulation, and Abstraction
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Polymorphism
&lt;/h2&gt;

&lt;p&gt;Polymorphism allows objects of different classes to be treated as objects of a common superclass. For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;def make_animal_speak(animal):
    animal.speak()

dog = Dog("Fido")
cat = Cat("Whiskers")

make_animal_speak(dog)  # Output: Woof!
make_animal_speak(cat)  # Output: Meow!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Encapsulation
&lt;/h2&gt;

&lt;p&gt;Encapsulation hides the internal state of an object and restricts direct access. Use private attributes (__) to enforce this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class BankAccount:
    def __init__(self, account_number, balance):
        self.__account_number = account_number
        self.__balance = balance

    def deposit(self, amount):
        self.__balance += amount

    def get_balance(self):
        return self.__balance
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Abstraction
&lt;/h2&gt;

&lt;p&gt;Abstraction focuses on hiding non-essential details and exposing only the necessary features. Use abstract classes to define interfaces:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from abc import ABC, abstractmethod

class Shape(ABC):
    @abstractmethod
    def area(self):
        pass

class Rectangle(Shape):
    def __init__(self, length, width):
        self.length = length
        self.width = width

    def area(self):
        return self.length * self.width
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Functional Programming in Python
&lt;/h2&gt;

&lt;p&gt;Python also supports functional programming (FP), which emphasizes immutability and pure functions. Key concepts include:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pure Functions&lt;/strong&gt;: No side effects, deterministic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Higher-order functions&lt;/strong&gt;: Functions that take other functions as arguments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Immutability&lt;/strong&gt;: Data cannot be changed after creation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Higher-order functions
numbers = [1, 2, 3, 4, 5]
squared_numbers = list(map(lambda x: x**2, numbers))  # Output: [1, 4, 9, 16, 25]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;OOP and FP are powerful paradigms that can be used together to write clean, modular, and maintainable code in Python. By understanding classes, objects, inheritance, polymorphism, encapsulation, and abstraction, you can build robust applications. Additionally, functional programming concepts like immutability and higher-order functions can complement OOP to make your code even more expressive.&lt;/p&gt;

&lt;p&gt;Whether you’re building a small script or a large-scale application, mastering these concepts will help you write better Python code. &lt;/p&gt;

</description>
      <category>oop</category>
      <category>classes</category>
      <category>programming</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>Are Web APIs the same as REST APIs? How to Improve your Web Apps with Web APIs</title>
      <dc:creator>Michellebuchiokonicha</dc:creator>
      <pubDate>Tue, 14 Jan 2025 08:36:11 +0000</pubDate>
      <link>https://dev.to/michellebuchiokonicha/are-web-apis-the-same-as-rest-apis-how-web-apis-improve-the-web-57jm</link>
      <guid>https://dev.to/michellebuchiokonicha/are-web-apis-the-same-as-rest-apis-how-web-apis-improve-the-web-57jm</guid>
      <description>&lt;p&gt;To answer the question simply: &lt;strong&gt;No&lt;/strong&gt;, Web APIs are not the same as REST APIs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Web APIs&lt;/strong&gt; refer to interfaces that allow applications to interact with the web or devices. This term is broad and can refer to Browser APIs (like WebRTC or Geolocation) or Server APIs (like REST or GraphQL).&lt;/p&gt;

&lt;p&gt;On the other hand, &lt;strong&gt;REST APIs&lt;/strong&gt; are a specific type of Server API that adhere to REST principles, focusing on statelessness, resource-based communication, and using HTTP methods like GET, POST, and DELETE.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Evolution of the Web
&lt;/h2&gt;

&lt;p&gt;Originally, the web was designed as a static site for providing information and connecting individuals to relevant resources, regardless of location. However, it has evolved to become interactive and progressive, with certain aspects also turning decentralized.&lt;br&gt;
This article focuses on the web being progressive and more user-friendly.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhuv0g6zma3hcbcays5oc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhuv0g6zma3hcbcays5oc.png" alt="Image description" width="800" height="652"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Role of Web APIs in Modern Development
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Web APIs&lt;/strong&gt; serve as the backbone of modern web development. With APIs like WebRTC, Web Bluetooth, and Service Workers, developers can create highly interactive, native-like web applications without requiring external plugins. These capabilities make &lt;strong&gt;Progressive Web&lt;/strong&gt; Apps (PWAs) possible, bridging the gap between web and native apps.&lt;br&gt;
Check out my extensive article on progressive web apps. &lt;br&gt;
&lt;a href="https://dev.to/michellebuchiokonicha/how-to-get-started-with-progressive-web-apps-3f44"&gt;https://dev.to/michellebuchiokonicha/how-to-get-started-with-progressive-web-apps-3f44&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Some Benefits of Progressive Web Apps&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Works on any browser (cross-platform)&lt;/li&gt;
&lt;li&gt;Responsive to any device&lt;/li&gt;
&lt;li&gt;Functions without network connectivity&lt;/li&gt;
&lt;li&gt;Performs like a mobile app&lt;/li&gt;
&lt;li&gt;Highly secure&lt;/li&gt;
&lt;li&gt;Discoverable via search engines&lt;/li&gt;
&lt;li&gt;Boosts app engagement&lt;/li&gt;
&lt;li&gt;No installation required&lt;/li&gt;
&lt;li&gt;Can be shared through a link&lt;/li&gt;
&lt;li&gt;Optionally available on app stores (e.g., Google Play, Apple Store)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Web APIs and Project Fugu
&lt;/h2&gt;

&lt;p&gt;Web APIs here, referring to browser APIs, act as connectors, improvers, and builders for the browser's capabilities. These APIs are inherent to the web and are not third-party APIs purchased from libraries or sites. Instead, they are broadly available and designed to improve the web and enhance products created by developers, reducing boilerplate code and simplifying web interactions.&lt;br&gt;
The significance of web APIs is underscored by the fact that over 70% of activities conducted online occur through the web, highlighting the need for improvements and scalability.&lt;/p&gt;

&lt;p&gt;In summary, web APIs are crucial for the success of Progressive Web Apps and the future of web development. They act as enablers of advanced functionalities.&lt;/p&gt;

&lt;h2&gt;
  
  
  Project Fugu
&lt;/h2&gt;

&lt;p&gt;Project Fugu derives its name from the Japanese word for &lt;strong&gt;pufferfish,&lt;/strong&gt; "fugu." &lt;br&gt;
Initially, I was curious about why this project was named after a fish until I learned more about it. The fugu is a dangerous fish that can be delicious when prepared correctly; however, if not handled properly, it can be harmful. This metaphor aptly reflects the project's goal of enhancing the web platform's capabilities to match those of native applications.&lt;br&gt;
The correlation here is that the Project Fugu APIs aim to enrich the web (the ‘delicious’ aspect), and if they are not built correctly (the ‘preparation’), they can introduce significant security vulnerabilities. Imagine creating an API accessible to billions without adequate security measures; it would expose individuals to various security risks.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3v01mjl4clolpmdg4i72.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3v01mjl4clolpmdg4i72.png" alt="Image description" width="800" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can find more about Project Fugu and its APIs at &lt;a href="https://developer.chrome.com/docs/capabilities/fugu-showcase" rel="noopener noreferrer"&gt;https://developer.chrome.com/docs/capabilities/fugu-showcase&lt;/a&gt;. Here, you will discover interesting and exciting projects built with web APIs, as well as a comprehensive list of available APIs. Many native app features that were previously unavailable on the web are now accessible, thanks to web APIs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Web APIs?
&lt;/h2&gt;

&lt;p&gt;Web APIs are crucial for several reasons, and their importance should not be overlooked. They empower the browser, transforming the web from a simple content viewer into a powerful application platform. With APIs like WebRTC, WebSockets, Service Workers, Web Bluetooth, and Web XR, you can now accomplish tasks on the web that were once limited to native applications.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Should You Start Using Web APIs?
&lt;/h2&gt;

&lt;p&gt;Web APIs offer numerous benefits, including:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Access to Native Device Features:&lt;/strong&gt; They allow you to access device hardware such as cameras, microphones, sensors, and Bluetooth devices. This means you can make video calls, control robots, and experience augmented reality directly in your browser, without needing to download any apps.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Offline and Background Functionality:&lt;/strong&gt; Service Workers enable features like push notifications and caching, enhancing the user experience even when offline.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Simplified App Development for Cross-Platforms:&lt;/strong&gt; Web APIs facilitate easier development across different platforms.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How Web APIs Improve the Web&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Web APIs bring the capabilities of native apps to the web, granting access to powerful features without requiring installations or downloads. They also help future-proof the web; as browsers evolve, more APIs will be developed for seamless integration. Additionally, web APIs are accessible across platforms.&lt;/p&gt;

&lt;h2&gt;
  
  
  Is it Easy to Get Started with Web APIs?
&lt;/h2&gt;

&lt;p&gt;Yes, it is straightforward. Most web APIs are already integrated into browsers, and supported by robust documentation. Since many are native to the browser, there's no need for third-party libraries or installations. This makes getting started seamless, consistent, and accessible across platforms.&lt;/p&gt;

&lt;h2&gt;
  
  
  Some Web APIs
&lt;/h2&gt;

&lt;p&gt;Web APIs are the cornerstone of the Progressive Web App (PWA) revolution. They form the backbone of improved web functionality and represent the future of web development. Numerous Web APIs are available, and you can find a comprehensive list in the MDN documentation or on web.dev. Below are about 10 Web APIs to help you understand how they work. You can find many more in the MDN docs,web.dev, or via the project fugu documentation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;WebRTC API&lt;/strong&gt;: Enables real-time audio, video, and data communication directly between browsers without the need for external plugins. It is commonly used for video conferencing and peer-to-peer file sharing.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1g56swgaakxmionqg625.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1g56swgaakxmionqg625.png" alt="Image description" width="800" height="413"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Web Bluetooth API&lt;/strong&gt;: Allows websites to communicate with Bluetooth-enabled devices, such as fitness trackers, medical devices, and IoT gadgets.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;WebXR API&lt;/strong&gt;: Provides support for immersive technologies like Virtual Reality (VR) and Augmented Reality (AR), allowing developers to create engaging 3D experiences directly in the browser.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;WebSocket API&lt;/strong&gt;: Facilitates full-duplex communication between the client and server, making it ideal for real-time applications like chat systems, live streaming, and collaborative editing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Push Notification API&lt;/strong&gt;: Enables websites to send timely and relevant notifications to users even when the website is not open in the browser, enhancing user engagement.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Web Share API&lt;/strong&gt;: Provides a standardized way for web apps to share content using native sharing mechanisms, making it easier to share links, files, or text with other applications.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fetch API&lt;/strong&gt;: Replaces the older XMLHttpRequest and simplifies asynchronous data fetching.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Web Payment API&lt;/strong&gt;: Simplifies the online payment process by offering a consistent interface for users to make payments using various methods, such as credit cards or digital wallets.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Geolocation API&lt;/strong&gt;: Provides access to the geographical location of the user, enabling location-aware functionality like maps, location-based recommendations, or geofencing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;File System Access API&lt;/strong&gt;: Enables web applications to read from and write to the user’s local file system, creating a native-like experience for file manipulation.&lt;/p&gt;

&lt;h2&gt;
  
  
  WebRTC Demo
&lt;/h2&gt;

&lt;p&gt;WebRTC enables real-time communication, including audio, video, and data-sharing capabilities. For a simple WebRTC demo, you will need:&lt;/p&gt;

&lt;p&gt;index.html&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcznslh245qaglxxpp0lu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcznslh245qaglxxpp0lu.png" alt="Image description" width="800" height="445"&gt;&lt;/a&gt;&lt;br&gt;
app.js&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpf9k0or5aqfa0d717s3m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpf9k0or5aqfa0d717s3m.png" alt="Image description" width="800" height="448"&gt;&lt;/a&gt;&lt;br&gt;
server.js&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0v8uvpe0sneny0knpc3w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0v8uvpe0sneny0knpc3w.png" alt="Image description" width="800" height="449"&gt;&lt;/a&gt;&lt;br&gt;
WebSocket or HTTP REST API&lt;br&gt;
Inbuilt WebRTC API&lt;br&gt;
Local and remote video elements&lt;br&gt;
Buttons to manage peer connections&lt;br&gt;
WebRTC configurations&lt;/p&gt;

&lt;h2&gt;
  
  
  How It Works
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Access User's Camera and Microphone&lt;/strong&gt;: Create a function to access the user's camera and microphone, displaying the local stream on the local video element.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Peer Connection&lt;/strong&gt;: Implement a function to handle media exchange.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Signaling&lt;/strong&gt;: Simulate sending and receiving data through the signaling server.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Remote Stream Handling&lt;/strong&gt;: Display the remote track in the remote video element.&lt;br&gt;
&lt;strong&gt;ICE Candidates&lt;/strong&gt;: Exchange these candidates with peers to establish a connection.&lt;/p&gt;

&lt;p&gt;Web APIs are the cornerstone of modern web development, enabling developers to build powerful, scalable, and engaging applications. Whether you're exploring &lt;strong&gt;WebRTC&lt;/strong&gt; for real-time communication or leveraging the File System Access API for native-like experiences, the possibilities are vast. Start experimenting today and contribute to the web's progression.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>web</category>
      <category>programming</category>
      <category>webapi</category>
    </item>
    <item>
      <title>How to Automate Excel Files from APIs with Python and Openpyxl.</title>
      <dc:creator>Michellebuchiokonicha</dc:creator>
      <pubDate>Fri, 16 Aug 2024 06:30:41 +0000</pubDate>
      <link>https://dev.to/michellebuchiokonicha/how-to-automatecreate-update-excel-files-from-apis-with-python-and-openpyxl-2148</link>
      <guid>https://dev.to/michellebuchiokonicha/how-to-automatecreate-update-excel-files-from-apis-with-python-and-openpyxl-2148</guid>
      <description>&lt;p&gt;Automation in programming is the use of programming languages like Python, VBA, and other technology tools to create programs, scripts, or various tools that perform automatic tasks with no manual intervention.&lt;br&gt;
The sole purpose of automating tasks is to avoid manual input and to ensure various systems run by themselves.&lt;/p&gt;

&lt;p&gt;For this article, I will provide a step-by-step guide on how I automated an Excel file, and different sheets on a MacBook, without visual basic for applications, using Python in this case.&lt;/p&gt;

&lt;p&gt;First of all, to get started, you don't need to be a Python dev as I will paste a code snippet here.&lt;/p&gt;
&lt;h2&gt;
  
  
  Tools Required
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;VScode of course&lt;/li&gt;
&lt;li&gt;Python installed/updated&lt;/li&gt;
&lt;li&gt;A virtual environment to run any new installation or updates for your Python code.&lt;/li&gt;
&lt;li&gt;The virtual environment is the .venv. You will see it in your vscode.&lt;/li&gt;
&lt;li&gt;Install openpyxyl&lt;/li&gt;
&lt;li&gt;Install any other necessary dependency.&lt;/li&gt;
&lt;li&gt;Get started.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Different Aspects we will be considering:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Creating a new Excel file with python&lt;/li&gt;
&lt;li&gt;Updating an existing Excel file with python
Updating a specific Excel file sheet only with Python&lt;/li&gt;
&lt;li&gt;Using APIs to update Excel files and Excel file sheets.&lt;/li&gt;
&lt;li&gt;Creating a button that allows users to update on click.&lt;/li&gt;
&lt;li&gt;Adding dynamic dates and time in your code&lt;/li&gt;
&lt;li&gt;An alternative to the Excel button is cron or Windows shell&lt;/li&gt;
&lt;li&gt;Instead of VBA, what else is possible?&lt;/li&gt;
&lt;li&gt;Issues faced with writing VBA in a MacBook&lt;/li&gt;
&lt;li&gt;Issues I faced while creating the button&lt;/li&gt;
&lt;li&gt;Why I opted for cron&lt;/li&gt;
&lt;li&gt;Creating this for both Windows and Mac users&lt;/li&gt;
&lt;li&gt;Other tools that can be used for the automation of Excel&lt;/li&gt;
&lt;li&gt;Power query from web feature&lt;/li&gt;
&lt;li&gt;Power automate&lt;/li&gt;
&lt;li&gt;Visual Basic in Excel&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Creating a new Excel file with python
&lt;/h2&gt;

&lt;p&gt;Creating an Excel sheet in Python with openpyxl is easy.&lt;br&gt;
All you need to do is install openpyxl, pandas, and requests if you are getting data from an API.&lt;br&gt;
Go to the openpyxl documentation to learn how to import it into your application and the packages you want to use.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import pandas
import requests
from openpyxl import Workbook, load_workbook
from openpyxl.utils import get_column_letter
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next up,&lt;br&gt;
you create a new workbook&lt;br&gt;
Set it as the active workbook&lt;br&gt;
Add your title and header and populate the data&lt;br&gt;
Save the new workbook with your preferred Excel name and tada! &lt;br&gt;
you have created your first Excel file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# create a new workbook
wb = Workbook()
ws = wb.active
ws.title = "Data"

ws.append(['Tim', 'Is', 'Great', '!'])
ws.append(['Sam', 'Is', 'Great', '!'])
ws.append(['John', 'Is', 'Great', '!'])
ws.append(['Mimi', 'Is', 'Great', '!'])
wb.save('mimi.xlsx')
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Creating a new sheet in an Excel file.
&lt;/h2&gt;

&lt;p&gt;Creating a specific sheet in your Excel file is a similar process. however, you need to specify the sheet to be created with a sheetname.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# create sheet
wb.create_sheet('Test')
print(wb.sheetnames)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Modifying an Excel sheet.
&lt;/h2&gt;

&lt;p&gt;To modify an Excel sheet and not the full file, &lt;/p&gt;

&lt;p&gt;Load the workbook you want to modify&lt;br&gt;
They specify the particular sheet to modify using its name or index. It is safer to use the index in case the name eventually changes.&lt;br&gt;
In the code snippet below, I used the Sheet label&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# wb = load_workbook('mimi.xlsx')

# modify sheet
ws = wb.active
ws['A1'].value = "Test"
print(ws['A1'].value)
wb.save('mimi.xlsx')
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Accessing multiple cells
&lt;/h2&gt;

&lt;p&gt;To access multiple cells, &lt;br&gt;
Load the workbook&lt;br&gt;
Make it the active workbook&lt;br&gt;
loop through its rows and columns&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Accessing multiple cells
 wb = load_workbook('mimi.xlsx')
 ws = wb.active

 for row in range(1, 11):
     for col in range(1, 5):
         char = get_column_letter(col)
         ws[char + str(row)] = char + str(row)
         print(ws[char + str(row)].value)

 wb.save('mimi.xlsx')
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Merging Excel cells
&lt;/h2&gt;

&lt;p&gt;To merge different cells in Excel using Python,&lt;br&gt;
Load the workbook&lt;br&gt;
Indicate the active workbook&lt;br&gt;
indicate the cells you want to merge&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Merging excel cells
wb = load_workbook('mimi.xlsx')
ws = wb.active

ws.merge_cells("A1:D2")
wb.save("mimi.xlsx")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Unmerging cells
&lt;/h2&gt;

&lt;p&gt;To unmerge different cells in Excel using python,&lt;br&gt;
Load the workbook&lt;br&gt;
Indicate the active workbook&lt;br&gt;
indicate the cells you want to unmerge&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# merging excel cells
wb = load_workbook('mimi.xlsx')
ws = wb.active

ws.unmerge_cells("A1:D1")
wb.save("mimi.xlsx")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Inserting new excel cells
&lt;/h2&gt;

&lt;p&gt;To insert new cells&lt;/p&gt;

&lt;p&gt;Load the workbook&lt;br&gt;
Indicate the active workbook&lt;br&gt;
use the insert_rows and insert_columns to insert new rows or new columns based on preference.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# inserting cells
wb = load_workbook('mimi.xlsx')
ws = wb. is active

ws.insert_rows(7)
ws.insert_rows(7)

ws.move_range("C1:D11", rows=2, cols=2)
wb.save("mimi.xlsx")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Updating an existing Excel file with internal Data&lt;br&gt;
Add your arrays and objects and take in the information needed&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from openpyxl import Workbook, load_workbook
from openpyxl.utils import get_column_letter
from openpyxl.styles import Font

data = {
    "Pam" : {
        "math":65,
        "science": 78,
        "english": 98,
        "gym": 89
    },
    "Mimi" : {
        "math":55,
        "science": 72,
        "english": 88,
        "gym": 77
    },
    "Sid" : {
        "math":100,
        "science": 66,
        "english": 93,
        "gym": 74
    },
    "Love" : {
        "math":77,
        "science": 83,
        "english": 59,
        "gym": 91
    },
}

wb = Workbook()
ws = wb.active
ws.title = "Mock"
headings = ['Name'] + list(data['Joe'].keys())
ws.append(headings)

for a person in data:
    grades = list(data[person].values())
    ws.append([person] + grades)

for col in range(2, len(data['Pam']) + 2):
    char = get_column_letter(col)
    ws[char + '7'] = f"=SUM({char + '2'}:{char + '6'})/{len(data)}"

for col in range(1, 6):
    ws[get_column_letter(col) + '1'].font = Font(bold=True, color="0099CCFF")


wb.save("NewMock.xlsx")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Updating an existing Excel file with Python and APIs&lt;/p&gt;

&lt;p&gt;To update an Excel file using Python and APIs, you need to call the APIs into your file using a Get request. &lt;br&gt;
Set the active Excel file as described above and then you run your script.&lt;br&gt;
Here is an example of this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from openpyxl import Workbook, load_workbook
import requests
from datetime import datetime, timedelta

import schedule
import time

api_url = "https://yourapi"
excel_file = "yourfilename.xlsx"

def fetch_energy_data(offset=0):
    response = requests.get(api_url + f"&amp;amp;offset={offset}")
    data = response.json()

    if response.status_code == 200:
        data = response.json()
        return data["results"], data["total_count"] 
    else:
        print(f"Error fetching data: {response.status_code}")
        return [], 0

def update_excel_data(data):
    try:
        wb = load_workbook(excel_file)
        ws = wb.worksheets[0]  

        for row in range(5, ws.max_row + 1):  
            for col in range(1, 9):  
                ws.cell(row=row, column=col).value = None  

                now = datetime.now()
                current_year = now.year
                current_month = now.month

        start_date = datetime(current_year,current_month, 1) 
        end_date = datetime(current_year, current_month, 24) 

        filtered_data = [
            result
            for result in data
            if start_date &amp;lt;= datetime.fromisoformat(result["datetime"]).replace(tzinfo=None) &amp;lt;= end_date]


        for i, result in enumerate(filtered_data):  
            row = i + 5  
            ws[f"A{row}"] = result["datetime"]
            ws[f"B{row}"] = result["yourinfo"]
            ws[f"C{row}"] = result["yourinfo"]
            ws[f"D{row}"] = result["yourinfo"]
            ws[f"E{row}"] = result["yourinfo"]
            ws[f"F{row}"] = result["yourinfo"]  
            ws[f"G{row}"] = result["yourinfo"]
            ws[f"H{row}"] = result["yourinfo"]

        for row in range(5, ws.max_row + 1):
            ws[f"I{row}"] = ws[f"I{row}"].value  
            ws[f"J{row}"] = ws[f"J{row}"].value  
            ws[f"K{row}"] = ws[f"K{row}"].value  
            ws[f"L{row}"] = ws[f"L{row}"].value  

        wb.save(excel_file)
        print(f"Excel file updated: {excel_file}")
    except FileNotFoundError:
        print(f"Excel file not found: {excel_file}")
    except KeyError:
        print(f"Sheet 'Forecast PV' not found in the Excel file.")
    schedule.every().hour.do(update_excel_data)

    while True:
             schedule.run_pending()

if __name__ == "__main__":
    all_data = []
    offset = 0
    total_count = 0
    while True:
        data, total_count = fetch_energy_data(offset)  
        if not data:
            break
        all_data.extend(data)
        offset += 100  
        if offset &amp;gt;= total_count:  
            break


    update_excel_data(all_data)


To update a particular sheet, use the method mentioned above. best practices are done with the excel sheets index number from 0 till n-1.
as sheet names can change but sheet positions can not change.

 wb = load_workbook(excel_file)
        ws = wb.worksheets[0]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Creating a button that allows users to update on click.
To achieve a button to automatically run your Python script, you need to create a button in your Excel file and write a program using the inbuilt programming language, Visual Basic for applications.
Next, you write a program similar to this. An example of a VBA script is below.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Sub RunPythonScript()
    Dim shell As Object
    Dim pythonExe As String
    Dim scriptPath As String
    Dim command As String

     Path to your Python executable
    pythonExe = "C:\Path\To\Python\python.exe"

     Path to your Python script
    scriptPath = "C:\Path\To\Your\Script\script.py"

     Command to run the Python script
    command = pythonExe &amp;amp; " " &amp;amp; scriptPath

     Create a Shell object and run the command
    Set shell = CreateObject("WScript.Shell")
    shell.Run command, 1, True

     Clean up
    Set shell = Nothing
End Sub
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;the issue with this is some functions do not run in non-windows applications seeing that Excel and VBA are built and managed by Microsoft, there are inbuilt Windows functions for this that can only work on Windows.&lt;/p&gt;

&lt;p&gt;However, if you are not writing a very complicated program, it will run properly.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Adding dynamic dates and time in your code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To achieve dynamic dates and times, you can use the date.now function built into Python.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;now = datetime.now()
 current_year = now.year
current_month = now.month
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;An alternative to the Excel button is cron or Windows shell&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For MacBook users, an alternative to the VBA and button feature, you can use a corn for MacBook and a Windows shell for Windows. to automate your task.&lt;/p&gt;

&lt;p&gt;You can also make use of Google Clouds's scheduler. that allows you to automate tasks.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Instead of VBA, what else is possible?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of VBA, direct Python codes can suffice. you can also use the script and run it as required.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Issues faced while writing VBA in a MacBook&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The major issue lies in the fact that VBA is a Windows language and hence, has limited functions in a non-windows device.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Issues I faced while creating the button&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The same issues are related to the VBA code.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Why I opted for cron&lt;br&gt;
I opted for corn because it is available and easy to use to achieve the goals.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Other tools that can be used for the automation of Excel&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Other tools include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Power query from web feature&lt;/li&gt;
&lt;li&gt;Power automate&lt;/li&gt;
&lt;li&gt;Visual Basic in Excel&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Follow me on Twitter Handle: &lt;a href="https://twitter.com/mchelleOkonicha" rel="noopener noreferrer"&gt;https://twitter.com/mchelleOkonicha&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Follow me on LinkedIn Handle: &lt;a href="https://www.linkedin.com/in/buchi-michelle-okonicha-0a3b2b194/" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/buchi-michelle-okonicha-0a3b2b194/&lt;/a&gt;&lt;br&gt;
Follow me on Instagram: &lt;a href="https://www.instagram.com/michelle_okonicha/" rel="noopener noreferrer"&gt;https://www.instagram.com/michelle_okonicha/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>softwaredevelopment</category>
      <category>automation</category>
      <category>excel</category>
    </item>
    <item>
      <title>Tips for Fixing Bugs and Resolving Code Issues.</title>
      <dc:creator>Michellebuchiokonicha</dc:creator>
      <pubDate>Tue, 30 Jul 2024 01:53:52 +0000</pubDate>
      <link>https://dev.to/michellebuchiokonicha/tips-for-fixing-bugs-and-resolving-code-issues-2kcc</link>
      <guid>https://dev.to/michellebuchiokonicha/tips-for-fixing-bugs-and-resolving-code-issues-2kcc</guid>
      <description>&lt;p&gt;Hey there!&lt;/p&gt;

&lt;p&gt;These tips I have listed have worked for me and helped me resolve issues in my code. I also learn a lot while on it.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Understand the issue.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Write down the issue.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Go through the code given twice or more times.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Understand the code and its logic.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Analyze the issue based on the current code.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Device two or more ways to fix it on paper.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Write pseudocode.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement pseudocode in your file.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use Debugging tools&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use Browser tools for developers like inspect, developer tools, console, etc.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Include error handling at every point&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If still difficult, discuss this problem with another developer &lt;br&gt;
regardless of the language used.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Sleep on the issue.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Think about the issue deeply.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Go back and fix the issue.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Sidenotes:
&lt;/h2&gt;

&lt;p&gt;Research as much as you can. Someone might have fixed this issue previously. So search the internet to help you work seamlessly.&lt;/p&gt;

</description>
      <category>debugg</category>
      <category>softwaredevelopment</category>
      <category>softwareengineering</category>
      <category>testing</category>
    </item>
    <item>
      <title>How to Improve Your Development Workflow with Gemini Code Assist</title>
      <dc:creator>Michellebuchiokonicha</dc:creator>
      <pubDate>Sat, 20 Jul 2024 08:27:05 +0000</pubDate>
      <link>https://dev.to/michellebuchiokonicha/how-to-improve-your-development-workflow-with-gemini-code-assist-10lm</link>
      <guid>https://dev.to/michellebuchiokonicha/how-to-improve-your-development-workflow-with-gemini-code-assist-10lm</guid>
      <description>&lt;p&gt;Have you ever dreamt of building and deploying applications three times faster? Look no further than Gemini Code Assist, an AI assistant from Google that empowers developers and cloud specialists throughout the development lifecycle.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Gemini Code&amp;nbsp;Assist?
&lt;/h2&gt;

&lt;p&gt;Gemini Code Assist is an AI-powered tool that streamlines the development process for software developers and cloud engineers. It integrates seamlessly with the Google Cloud platform and popular IDEs like Visual Studio Code.&lt;/p&gt;

&lt;p&gt;Gemini Code Assist boasts a variety of features to enhance your coding experience, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Code Completion: It Generates code snippets and functions tailored &lt;br&gt;
to your specific needs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Code Explanation: You can Gain a deeper understanding of existing &lt;br&gt;
code with clear explanations.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Code Refactoring: It Improves code readability, maintainability, &lt;br&gt;
and performance with suggested optimizations.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Test Case Generation: It Automatically creates unit tests to &lt;br&gt;
ensure code quality.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Get Started with Gemini Code&amp;nbsp;Assist
&lt;/h2&gt;

&lt;p&gt;A codelab session is available to guide you through the intricacies of using Gemini Code Assist. Here's a glimpse into what you can achieve:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://codelabs.developers.google.com/codelabs/cloud-code-assist-sdlc#0" rel="noopener noreferrer"&gt;https://codelabs.developers.google.com/codelabs/cloud-code-assist-sdlc#0&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa21s6pi0k5x54mb1z9d4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa21s6pi0k5x54mb1z9d4.png" alt="Image description" width="800" height="165"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; API Design: Describe your application's requirements, and Gemini - 
Code Assist will generate an appropriate architecture, complete 
with API routes, ports, and data types. You can even test the 
generated API to verify its functionality.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbdxqeipp8opfxl4frzga.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbdxqeipp8opfxl4frzga.png" alt="Image description" width="800" height="348"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; Full-Stack Development: Craft full-fledged applications in any 
programming language using natural language prompts. Gemini Code 
Assist can replace existing code, create new files, and cite 
sources for the generated code.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyh6vgp0j2vj643mrhkeq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyh6vgp0j2vj643mrhkeq.png" alt="Image description" width="800" height="628"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; Automated Testing: Generate unit tests tailored to your specific 
needs and leverage Gemini Code Assist to help refactor code for 
passing tests.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0ruwsw73o90f8qaktlf7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0ruwsw73o90f8qaktlf7.png" alt="Image description" width="800" height="536"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; Streamlined Deployment: Gemini Code Assist integrates with Google 
Cloud Platform for effortless application deployment, eliminating 
the need for manual configuration.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkpbqwnodewbiu1pymafm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkpbqwnodewbiu1pymafm.png" alt="Image description" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Benefits of Using Gemini Code&amp;nbsp;Assist
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Increased Development Speed: Build applications significantly &lt;br&gt;
faster with code generation and completion features.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Improved Code Quality: Write cleaner, more maintainable code with &lt;br&gt;
refactoring suggestions and automated testing.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Reduced Costs: Save time and resources by streamlining &lt;br&gt;
development tasks.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enhanced Developer Productivity: Focus on core development &lt;br&gt;
activities while Gemini Code Assist handles repetitive tasks.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Using Gemini Code&amp;nbsp;Assist
&lt;/h2&gt;

&lt;p&gt;There are two primary ways to leverage Gemini Code Assist:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Google Cloud Platform: Access Gemini Code Assist directly within &lt;br&gt;
the Google Cloud console for a seamless cloud-based development &lt;br&gt;
experience.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Local IDE Integration: Install the Gemini Code Assist extension &lt;br&gt;
for your IDE (like Visual Studio Code) to enjoy its features &lt;br&gt;
within your familiar development environment.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Unique Features of Gemini Code Assist
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Replace feature: Allows you to replace your existing code without copying and pasting&lt;/li&gt;
&lt;li&gt;The update feature allows you to update and rewrite existing code&lt;/li&gt;
&lt;li&gt;The citation feature: it cites code sources for further use and also allows the developer to know more about the code.&lt;/li&gt;
&lt;li&gt;Explain feature: Explains highlighted code. You need to highlight it and it explains that aspect of code.&lt;/li&gt;
&lt;li&gt;Specific use case: It creates specific use cases unique to the written code.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How To Use Gemin Code Assist In your IDE like&amp;nbsp;VSCode
&lt;/h2&gt;

&lt;p&gt;It is very easy and straightforward.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; Go to your Visual Studio or the IDE you use&lt;/li&gt;
&lt;li&gt; Go to Extensions&lt;/li&gt;
&lt;li&gt; Search for Gemini Code Assist + Google Cloud Code.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwg6vshvoz2n6uvysnuv1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwg6vshvoz2n6uvysnuv1.png" alt="Image description" width="800" height="206"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; Install and enable it&lt;/li&gt;
&lt;li&gt; Click on the icon by the side&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7j6nrkuz3an5arhqtqg7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7j6nrkuz3an5arhqtqg7.png" alt="Image description" width="428" height="108"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; Log in or Sign up with your Chrome browser. If Chrome is not your 
default browser, copy it and paste it into your Chrome browser.&lt;/li&gt;
&lt;li&gt; After which you can get started.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All the features and capabilities Listed above are fully applicable here.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftklywg73gdao0qp00aqc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftklywg73gdao0qp00aqc.png" alt="Image description" width="675" height="524"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Gemini Code Assist is a powerful and versatile tool that empowers developers and cloud specialists of all levels. It simplifies coding tasks, improves code quality, and accelerates the development process, allowing you to focus on creating innovative applications.&lt;/p&gt;

&lt;p&gt;Follow me on Twitter Handle: &lt;a href="https://twitter.com/mchelleOkonicha" rel="noopener noreferrer"&gt;https://twitter.com/mchelleOkonicha&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Follow me on LinkedIn Handle: &lt;a href="https://www.linkedin.com/in/buchi-michelle-okonicha-0a3b2b194/" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/buchi-michelle-okonicha-0a3b2b194/&lt;/a&gt;&lt;br&gt;
Follow me on Instagram: &lt;a href="https://www.instagram.com/michelle_okonicha/" rel="noopener noreferrer"&gt;https://www.instagram.com/michelle_okonicha/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>google</category>
      <category>githubcopilot</category>
      <category>softwaredevelopment</category>
      <category>architecture</category>
    </item>
  </channel>
</rss>
