<?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>Forem: Batuhan Ipci</title>
    <description>The latest articles on Forem by Batuhan Ipci (@batunpc).</description>
    <link>https://forem.com/batunpc</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F921481%2Febaab3da-0f9a-41e2-b2fc-52b6a2b1a093.jpg</url>
      <title>Forem: Batuhan Ipci</title>
      <link>https://forem.com/batunpc</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/batunpc"/>
    <language>en</language>
    <item>
      <title>[Boost]</title>
      <dc:creator>Batuhan Ipci</dc:creator>
      <pubDate>Tue, 21 Oct 2025 03:28:46 +0000</pubDate>
      <link>https://forem.com/batunpc/-5d1o</link>
      <guid>https://forem.com/batunpc/-5d1o</guid>
      <description>&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/saminarp/building-disco-week-2-making-event-networking-less-random-88h" class="crayons-story__hidden-navigation-link"&gt;Building Disco Week 2: Making Event Networking Less Random 🪩&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="/saminarp" 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%2F921482%2F984d8bfb-b086-4ab6-b8f2-69ae9f7325cc.png" alt="saminarp profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/saminarp" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Samina Rahman Purba
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Samina Rahman Purba
                
              
              &lt;div id="story-author-preview-content-2945415" 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="/saminarp" 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%2F921482%2F984d8bfb-b086-4ab6-b8f2-69ae9f7325cc.png" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Samina Rahman Purba&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/saminarp/building-disco-week-2-making-event-networking-less-random-88h" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Oct 21 '25&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/saminarp/building-disco-week-2-making-event-networking-less-random-88h" id="article-link-2945415"&gt;
          Building Disco Week 2: Making Event Networking Less Random 🪩
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag crayons-tag--filled  " href="/t/showdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;showdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/buildinpublic"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;buildinpublic&lt;/a&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/programming"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;programming&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/saminarp/building-disco-week-2-making-event-networking-less-random-88h" 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;23&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/saminarp/building-disco-week-2-making-event-networking-less-random-88h#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              6&lt;span class="hidden s:inline"&gt; 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;
            2 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

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

&lt;/div&gt;




</description>
      <category>buildinpublic</category>
      <category>showdev</category>
      <category>ai</category>
      <category>programming</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Batuhan Ipci</dc:creator>
      <pubDate>Mon, 22 Sep 2025 20:53:58 +0000</pubDate>
      <link>https://forem.com/batunpc/-21j4</link>
      <guid>https://forem.com/batunpc/-21j4</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/saminarp/from-10-week-project-to-long-term-partnership-551p" class="crayons-story__hidden-navigation-link"&gt;From 10-Week Project to Long-Term Partnership&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="/saminarp" 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%2F921482%2F984d8bfb-b086-4ab6-b8f2-69ae9f7325cc.png" alt="saminarp profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/saminarp" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Samina Rahman Purba
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Samina Rahman Purba
                
              
              &lt;div id="story-author-preview-content-2861898" 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="/saminarp" 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%2F921482%2F984d8bfb-b086-4ab6-b8f2-69ae9f7325cc.png" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Samina Rahman Purba&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/saminarp/from-10-week-project-to-long-term-partnership-551p" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Sep 22 '25&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/saminarp/from-10-week-project-to-long-term-partnership-551p" id="article-link-2861898"&gt;
          From 10-Week Project to Long-Term Partnership
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag crayons-tag--filled  " href="/t/showdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;showdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/startup"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;startup&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;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/saminarp/from-10-week-project-to-long-term-partnership-551p" 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/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/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/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;21&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/saminarp/from-10-week-project-to-long-term-partnership-551p#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              4&lt;span class="hidden s:inline"&gt; 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;
            3 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

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

&lt;/div&gt;


</description>
      <category>startup</category>
      <category>programming</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Give this read, it is inspiring, raw and honest!</title>
      <dc:creator>Batuhan Ipci</dc:creator>
      <pubDate>Tue, 12 Aug 2025 18:16:07 +0000</pubDate>
      <link>https://forem.com/batunpc/give-this-read-it-is-inspiring-raw-and-honest-1ac9</link>
      <guid>https://forem.com/batunpc/give-this-read-it-is-inspiring-raw-and-honest-1ac9</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/saminarp/from-devto-posts-to-running-a-startup-2np0" class="crayons-story__hidden-navigation-link"&gt;From Dev.to Posts to Running a Startup&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="/saminarp" 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%2F921482%2F984d8bfb-b086-4ab6-b8f2-69ae9f7325cc.png" alt="saminarp profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/saminarp" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Samina Rahman Purba
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Samina Rahman Purba
                
              
              &lt;div id="story-author-preview-content-2760555" 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="/saminarp" 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%2F921482%2F984d8bfb-b086-4ab6-b8f2-69ae9f7325cc.png" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Samina Rahman Purba&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/saminarp/from-devto-posts-to-running-a-startup-2np0" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Aug 8 '25&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/saminarp/from-devto-posts-to-running-a-startup-2np0" id="article-link-2760555"&gt;
          From Dev.to Posts to Running a Startup
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/startup"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;startup&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/productivity"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;productivity&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;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/saminarp/from-devto-posts-to-running-a-startup-2np0" 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/fire-f60e7a582391810302117f987b22a8ef04a2fe0df7e3258a5f49332df1cec71e.svg" width="18" height="18"&gt;
                  &lt;/span&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/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;84&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/saminarp/from-devto-posts-to-running-a-startup-2np0#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              37&lt;span class="hidden s:inline"&gt; 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;
            5 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

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

&lt;/div&gt;


</description>
      <category>startup</category>
      <category>productivity</category>
      <category>programming</category>
    </item>
    <item>
      <title>2022 in Review</title>
      <dc:creator>Batuhan Ipci</dc:creator>
      <pubDate>Thu, 15 Dec 2022 07:14:52 +0000</pubDate>
      <link>https://forem.com/batunpc/2022-in-review-4mgm</link>
      <guid>https://forem.com/batunpc/2022-in-review-4mgm</guid>
      <description>&lt;p&gt;Today I sat for my last final exam, which also means I am now done with all my courses at Seneca College. It feels strange to suddenly come to a stop from the crazy busy schedule I was pursuing for the last many semesters. Suddenly, I have all the time in the world to do whatever I like, but first, I must pay back my sleep debt. &lt;/p&gt;

&lt;p&gt;2022 has been great in terms of personal growth. I learned to navigate the strange world of remote learning which at times got difficult. I also learned to work under pressure from my many programming courses and work in the open through my open-source development class. Working collaboratively on open-source projects with people I don't know made me more confident in my programming skills. Just a year ago, my GitHub profile had barely any projects uploaded, but now I have developed the muscle memory to intuitively upload all my projects in GitHub, make frequent commits, and have gotten good at navigating my way around it. &lt;/p&gt;

&lt;h2&gt;
  
  
  Some 2022 Accomplishments 🎉
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsmjqfpaa2o9a7egbd8j8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsmjqfpaa2o9a7egbd8j8.png" alt="2022_accomplishments" width="800" height="444"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  December open-source contributions 🚀
&lt;/h3&gt;

&lt;p&gt;This month I challenged myself to work on many small issues within just 10 days. I enjoyed working for Seneca College's internal project repos, therefore, picked two of them to work on. &lt;/p&gt;

&lt;p&gt;My two most recent open-source contributions were made for a Seneca College Internal Project. I decided to go ahead and make 2 different pull requests to this repo to challenge myself to learn new skills. &lt;/p&gt;

&lt;h4&gt;
  
  
  1) &lt;a href="https://github.com/humphd/my-photohub"&gt;My Photohub&lt;/a&gt; 📸
&lt;/h4&gt;


&lt;div class="ltag_github-liquid-tag"&gt;
  &lt;h1&gt;
    &lt;a href="https://github.com/Seneca-CDOT/my-photohub/issues/33"&gt;
      &lt;img class="github-logo" alt="GitHub logo" src="https://res.cloudinary.com/practicaldev/image/fetch/s--A9-wwsHG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg"&gt;
      &lt;span class="issue-title"&gt;
        Integrate `github-upload` with the rest of the working code
      &lt;/span&gt;
      &lt;span class="issue-number"&gt;#33&lt;/span&gt;
    &lt;/a&gt;
  &lt;/h1&gt;
  &lt;div class="github-thread"&gt;
    &lt;div class="timeline-comment-header"&gt;
      &lt;a href="https://github.com/SerpentBytes"&gt;
        &lt;img class="github-liquid-tag-img" src="https://res.cloudinary.com/practicaldev/image/fetch/s--MD9vCDkv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://avatars.githubusercontent.com/u/50856799%3Fv%3D4" alt="SerpentBytes avatar"&gt;
      &lt;/a&gt;
      &lt;div class="timeline-comment-header-text"&gt;
        &lt;strong&gt;
          &lt;a href="https://github.com/SerpentBytes"&gt;SerpentBytes&lt;/a&gt;
        &lt;/strong&gt; posted on &lt;a href="https://github.com/Seneca-CDOT/my-photohub/issues/33"&gt;&lt;time&gt;Dec 07, 2022&lt;/time&gt;&lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag-github-body"&gt;
      &lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Description&lt;/h2&gt;
&lt;span class="octicon octicon-link"&gt;&lt;/span&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;github-upload.js&lt;/code&gt; file is currently in the &lt;code&gt;root&lt;/code&gt; directory and is disconnected from the service.&lt;/p&gt;
&lt;p&gt;Move the code to &lt;code&gt;./worker/functions&lt;/code&gt; and ensure it works when we run the &lt;code&gt;scripts&lt;/code&gt; to boot up the backend.&lt;/p&gt;

    &lt;/div&gt;
    &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Seneca-CDOT/my-photohub/issues/33"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;h4&gt;
  
  
  &lt;em&gt;The solution&lt;/em&gt;
&lt;/h4&gt;

&lt;p&gt;This issue required me to understand how two of my other peers before me were writing the code. Through this, I was able to practice my skill in reading and understanding other people's codes and then integrating them. &lt;/p&gt;


&lt;div class="ltag_github-liquid-tag"&gt;
  &lt;h1&gt;
    &lt;a href="https://github.com/Seneca-CDOT/my-photohub/pull/35"&gt;
      &lt;img class="github-logo" alt="GitHub logo" src="https://res.cloudinary.com/practicaldev/image/fetch/s--A9-wwsHG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg"&gt;
      &lt;span class="issue-title"&gt;
        Integration `github-upload` with the rest of the app
      &lt;/span&gt;
      &lt;span class="issue-number"&gt;#35&lt;/span&gt;
    &lt;/a&gt;
  &lt;/h1&gt;
  &lt;div class="github-thread"&gt;
    &lt;div class="timeline-comment-header"&gt;
      &lt;a href="https://github.com/batunpc"&gt;
        &lt;img class="github-liquid-tag-img" src="https://res.cloudinary.com/practicaldev/image/fetch/s--2BWFmcwW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://avatars.githubusercontent.com/u/71259399%3Fv%3D4" alt="batunpc avatar"&gt;
      &lt;/a&gt;
      &lt;div class="timeline-comment-header-text"&gt;
        &lt;strong&gt;
          &lt;a href="https://github.com/batunpc"&gt;batunpc&lt;/a&gt;
        &lt;/strong&gt; posted on &lt;a href="https://github.com/Seneca-CDOT/my-photohub/pull/35"&gt;&lt;time&gt;Dec 09, 2022&lt;/time&gt;&lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag-github-body"&gt;
      &lt;p&gt;Fixes &lt;a href="https://github.com/humphd/my-photohub/issues/33"&gt;https://github.com/humphd/my-photohub/issues/33&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;As discussed in the issue, current behavior of the app is completely isolated from &lt;code&gt;github-upload&lt;/code&gt; function using &lt;code&gt;Octokit&lt;/code&gt;. Which was implemented at &lt;a href="https://github.com/humphd/my-photohub/pull/11"&gt;https://github.com/humphd/my-photohub/pull/11&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This PR integrates the "upload images to authenticated repo using &lt;code&gt;github-upload&lt;/code&gt;" functionality into the front-end, as it was programmatically written for client side.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Steps to reproduce&lt;/h3&gt;
&lt;span class="octicon octicon-link"&gt;&lt;/span&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;First create an public repository with the desired name.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Next, navigate to &lt;a href="https://github.com/settings/tokens"&gt;Settings &amp;gt; Developer settings &amp;gt; PAT &amp;gt; Tokens(Classic)&lt;/a&gt; to create a &lt;code&gt;brand-new token&lt;/code&gt;.
Ensure you have provided &lt;a href="https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token"&gt;PAT&lt;/a&gt; permission to the created repository from step 1.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;After token is created you can start the app with &lt;code&gt;npm run start&lt;/code&gt; and follow the rest of the steps. After you have uploaded an supported type image and click on &lt;code&gt;upload&lt;/code&gt;, you will see &lt;code&gt;raw&lt;/code&gt; directory within the repo you have created.
It will look &lt;a href="https://github.com/batunpc/boba-fett"&gt;something like this&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

    &lt;/div&gt;
    &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Seneca-CDOT/my-photohub/pull/35"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;h4&gt;
  
  
  2) &lt;a href="https://github.com/Seneca-CDOT/vscode-seneca-college"&gt;vscode Extension for Seneca&lt;/a&gt; 🧩
&lt;/h4&gt;

&lt;p&gt;I had no prior experience working with VS Code extensions, so I had to study some VS Code documentation before making this pull request. Making a VS code extension can get difficult if the features needed are big. &lt;/p&gt;


&lt;div class="ltag_github-liquid-tag"&gt;
  &lt;h1&gt;
    &lt;a href="https://github.com/Seneca-CDOT/vscode-seneca-college/issues/11"&gt;
      &lt;img class="github-logo" alt="GitHub logo" src="https://res.cloudinary.com/practicaldev/image/fetch/s--A9-wwsHG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg"&gt;
      &lt;span class="issue-title"&gt;
        Feat: provide screen stats
      &lt;/span&gt;
      &lt;span class="issue-number"&gt;#11&lt;/span&gt;
    &lt;/a&gt;
  &lt;/h1&gt;
  &lt;div class="github-thread"&gt;
    &lt;div class="timeline-comment-header"&gt;
      &lt;a href="https://github.com/gulyapulya"&gt;
        &lt;img class="github-liquid-tag-img" src="https://res.cloudinary.com/practicaldev/image/fetch/s--K_KQr7qK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://avatars.githubusercontent.com/u/52351598%3Fv%3D4" alt="gulyapulya avatar"&gt;
      &lt;/a&gt;
      &lt;div class="timeline-comment-header-text"&gt;
        &lt;strong&gt;
          &lt;a href="https://github.com/gulyapulya"&gt;gulyapulya&lt;/a&gt;
        &lt;/strong&gt; posted on &lt;a href="https://github.com/Seneca-CDOT/vscode-seneca-college/issues/11"&gt;&lt;time&gt;Nov 07, 2022&lt;/time&gt;&lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag-github-body"&gt;
      &lt;p&gt;Would be great to collect such information such as screen time per user for every course work which mainly requires working in vscode (many programming courses) to get an idea of average hours per week per course and maybe personal screen hours stats. Can check if the user is actively working and disable timer if the person has not been typing anything for more than 20 mins (tbd).&lt;/p&gt;

    &lt;/div&gt;
    &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Seneca-CDOT/vscode-seneca-college/issues/11"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;h4&gt;
  
  
  &lt;em&gt;The solution&lt;/em&gt;
&lt;/h4&gt;


&lt;div class="ltag_github-liquid-tag"&gt;
  &lt;h1&gt;
    &lt;a href="https://github.com/Seneca-CDOT/vscode-seneca-college/pull/16"&gt;
      &lt;img class="github-logo" alt="GitHub logo" src="https://res.cloudinary.com/practicaldev/image/fetch/s--A9-wwsHG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg"&gt;
      &lt;span class="issue-title"&gt;
        feat: initial implementation of session time counter extension
      &lt;/span&gt;
      &lt;span class="issue-number"&gt;#16&lt;/span&gt;
    &lt;/a&gt;
  &lt;/h1&gt;
  &lt;div class="github-thread"&gt;
    &lt;div class="timeline-comment-header"&gt;
      &lt;a href="https://github.com/batunpc"&gt;
        &lt;img class="github-liquid-tag-img" src="https://res.cloudinary.com/practicaldev/image/fetch/s--2BWFmcwW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://avatars.githubusercontent.com/u/71259399%3Fv%3D4" alt="batunpc avatar"&gt;
      &lt;/a&gt;
      &lt;div class="timeline-comment-header-text"&gt;
        &lt;strong&gt;
          &lt;a href="https://github.com/batunpc"&gt;batunpc&lt;/a&gt;
        &lt;/strong&gt; posted on &lt;a href="https://github.com/Seneca-CDOT/vscode-seneca-college/pull/16"&gt;&lt;time&gt;Dec 10, 2022&lt;/time&gt;&lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag-github-body"&gt;
      &lt;p&gt;Resolves &lt;a href="https://github.com/Seneca-CDOT/vscode-seneca-college/issues/11"&gt;https://github.com/Seneca-CDOT/vscode-seneca-college/issues/11&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I have added the initial implementation to measure active window time for current session for the user. You can investigate &lt;code&gt;extensions/session-time-counter/src/extension.ts&lt;/code&gt; to see my implementation.&lt;/p&gt;
&lt;p&gt;During the process I had such questions like;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What could be the conditions to measure active window time?&lt;/li&gt;
&lt;li&gt;If the number of characters deleted should also be counted as written? (can be an follow up issue)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As we build this extension maybe we need to clarify these crucial questions and file corresponding issues to help with the development process.&lt;/p&gt;
&lt;p&gt;Let me know what you think 🤩&lt;/p&gt;

    &lt;/div&gt;
    &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Seneca-CDOT/vscode-seneca-college/pull/16"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;h4&gt;
  
  
  3) &lt;a href="https://github.com/bcgov/cas-cif"&gt;Climate Action Secretariat - CleanBC Industry Fund&lt;/a&gt; 🏢
&lt;/h4&gt;

&lt;p&gt;As I was browsing for some issues to contribute to, I came across this repo by the government of British Columbia. I liked the project and decided to make a small contribution here. &lt;/p&gt;


&lt;div class="ltag_github-liquid-tag"&gt;
  &lt;h1&gt;
    &lt;a href="https://github.com/bcgov/cas-cif/issues/1221"&gt;
      &lt;img class="github-logo" alt="GitHub logo" src="https://res.cloudinary.com/practicaldev/image/fetch/s--A9-wwsHG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg"&gt;
      &lt;span class="issue-title"&gt;
        Tech Debt: Regexes for phone numbers and emails live in multiple places
      &lt;/span&gt;
      &lt;span class="issue-number"&gt;#1221&lt;/span&gt;
    &lt;/a&gt;
  &lt;/h1&gt;
  &lt;div class="github-thread"&gt;
    &lt;div class="timeline-comment-header"&gt;
      &lt;a href="https://github.com/pbastia"&gt;
        &lt;img class="github-liquid-tag-img" src="https://res.cloudinary.com/practicaldev/image/fetch/s--HBYDt4Rt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://avatars.githubusercontent.com/u/11507754%3Fv%3D4" alt="pbastia avatar"&gt;
      &lt;/a&gt;
      &lt;div class="timeline-comment-header-text"&gt;
        &lt;strong&gt;
          &lt;a href="https://github.com/pbastia"&gt;pbastia&lt;/a&gt;
        &lt;/strong&gt; posted on &lt;a href="https://github.com/bcgov/cas-cif/issues/1221"&gt;&lt;time&gt;Nov 30, 2022&lt;/time&gt;&lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag-github-body"&gt;
      &lt;p&gt;We have regex patterns that are duplicated across multiple files:&lt;/p&gt;
&lt;p&gt;app/server/middleware/graphql/validateRecord.ts
app/data/jsonSchemaForm/customFormats.ts&lt;/p&gt;
&lt;p&gt;It would be nice to keep them in a single file.&lt;/p&gt;

    &lt;/div&gt;
    &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/bcgov/cas-cif/issues/1221"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;h4&gt;
  
  
  &lt;em&gt;The solution&lt;/em&gt;
&lt;/h4&gt;


&lt;div class="ltag_github-liquid-tag"&gt;
  &lt;h1&gt;
    &lt;a href="https://github.com/bcgov/cas-cif/pull/1251"&gt;
      &lt;img class="github-logo" alt="GitHub logo" src="https://res.cloudinary.com/practicaldev/image/fetch/s--A9-wwsHG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg"&gt;
      &lt;span class="issue-title"&gt;
        Refactor and optimize regexes for phone numbers and emails
      &lt;/span&gt;
      &lt;span class="issue-number"&gt;#1251&lt;/span&gt;
    &lt;/a&gt;
  &lt;/h1&gt;
  &lt;div class="github-thread"&gt;
    &lt;div class="timeline-comment-header"&gt;
      &lt;a href="https://github.com/batunpc"&gt;
        &lt;img class="github-liquid-tag-img" src="https://res.cloudinary.com/practicaldev/image/fetch/s--2BWFmcwW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://avatars.githubusercontent.com/u/71259399%3Fv%3D4" alt="batunpc avatar"&gt;
      &lt;/a&gt;
      &lt;div class="timeline-comment-header-text"&gt;
        &lt;strong&gt;
          &lt;a href="https://github.com/batunpc"&gt;batunpc&lt;/a&gt;
        &lt;/strong&gt; posted on &lt;a href="https://github.com/bcgov/cas-cif/pull/1251"&gt;&lt;time&gt;Dec 08, 2022&lt;/time&gt;&lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag-github-body"&gt;
      &lt;p&gt;Fixes &lt;a href="https://github.com/bcgov/cas-cif/issues/1221"&gt;https://github.com/bcgov/cas-cif/issues/1221&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;As mentioned in the issue, this PR resolves the existing duplicated regex and optimizes them into one single file.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Currently, I am turning this into draft PR and will be updating soon.&lt;/p&gt;
&lt;/blockquote&gt;

    &lt;/div&gt;
    &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/bcgov/cas-cif/pull/1251"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;h3&gt;
  
  
  Reflection
&lt;/h3&gt;

&lt;p&gt;I am really happy with the contributions I have done over the last 3 months. I have big goals planned for 2023 to develop both personally and professionally. &lt;/p&gt;

</description>
      <category>programming</category>
      <category>productivity</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Master any CLI tool with this one weird trick</title>
      <dc:creator>Batuhan Ipci</dc:creator>
      <pubDate>Thu, 15 Dec 2022 06:56:25 +0000</pubDate>
      <link>https://forem.com/batunpc/master-any-cli-tool-with-this-one-weird-trick-4gn2</link>
      <guid>https://forem.com/batunpc/master-any-cli-tool-with-this-one-weird-trick-4gn2</guid>
      <description>&lt;p&gt;Just like most developers, I live in the terminal, I savor the ability of automation and the boundless things I can do with it. &lt;/p&gt;

&lt;p&gt;Before I start, I want to briefly remark on my setup;&lt;/p&gt;

&lt;h3&gt;
  
  
  My setup 👽
&lt;/h3&gt;

&lt;p&gt;I used to use &lt;code&gt;bash&lt;/code&gt; and know the best as my default shell, but I solely switched to &lt;code&gt;zsh&lt;/code&gt; because it become the default in macOS, likewise I use &lt;a href="https://github.com/ohmyzsh/ohmyzsh" rel="noopener noreferrer"&gt;ohmyzsh&lt;/a&gt; as my framework. It is a pleasant experience and easy to manage the prompt and plugins. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I recently heard about &lt;a href="https://github.com/sorin-ionescu/prezto" rel="noopener noreferrer"&gt;prezto&lt;/a&gt; which is a fork of ohmyzsh but haven't tried it yet (most of the &lt;a href="https://github.com/ohmyzsh/ohmyzsh/wiki/Plugins" rel="noopener noreferrer"&gt;plugins&lt;/a&gt; I use are in ohmyzsh) it is more customizable and less bloated than ohmyzsh. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I use &lt;a href="https://iterm2.com" rel="noopener noreferrer"&gt;iTerm2&lt;/a&gt; as my terminal, it is a great alternative to the default macOS terminal and has a lot of &lt;a href="https://iterm2.com/features.html" rel="noopener noreferrer"&gt;features - customization&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Writing completion spec 📝
&lt;/h3&gt;

&lt;p&gt;Recently I have contributed to &lt;a href="https://fig.io/?ref=github_autocomplete" rel="noopener noreferrer"&gt;Fig&lt;/a&gt;&lt;br&gt;
Specifically to their autocomplete feature &lt;a href="https://github.com/withfig/autocomplete" rel="noopener noreferrer"&gt;withfig/autocomplete&lt;/a&gt; which is an open-source project that aims to provide auto-completion for CLI tools. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This is a preview of the autocomplete feature in Fig, the tool &lt;a href="https://taplo.tamasfe.dev/" rel="noopener noreferrer"&gt;taplo&lt;/a&gt; is what I wrote the completion spec for.&lt;/p&gt;
&lt;/blockquote&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%2Fyccckfzbu46d9xwaatco.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%2Fyccckfzbu46d9xwaatco.png" alt="picture-from-terminal" width="800" height="268"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  How it works ❓
&lt;/h3&gt;

&lt;p&gt;While it required some brainstorming and a bit of research, it was a smooth experience to contribute to this project, and I learned a lot. First, I followed their documentation on writing a &lt;a href="https://fig.io/docs/getting-started/first-completion-spec" rel="noopener noreferrer"&gt;completion spec&lt;/a&gt;, which is well written, and learned a lot about the basic CLI terminology (i.e. &lt;code&gt;command&lt;/code&gt;, &lt;code&gt;subcommand&lt;/code&gt;, &lt;code&gt;option&lt;/code&gt;, &lt;code&gt;argument&lt;/code&gt;). Corresponding to what tool you choose to write the completion spec for, you need to learn a bit about the tool itself, which is cool because you get to know the tool better.&lt;/p&gt;

&lt;p&gt;I tackled the issue &lt;a href="https://github.com/withfig/autocomplete/issues/1532" rel="noopener noreferrer"&gt;missing spec for taplo #1532&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%2F2puk5kz5y2y5s6phqhrj.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%2F2puk5kz5y2y5s6phqhrj.png" alt="picture-from-issue" width="800" height="517"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Taplo is a CLI tool for working with &lt;a href="https://toml.io/en/" rel="noopener noreferrer"&gt;TOML&lt;/a&gt; files, and it includes features like linting, formatting, and validation. I honestly didn't know much about TOML before I started working on this, but I learned a lot about both the tool and TOML itself.&lt;/p&gt;

&lt;p&gt;Some CLI tools have &lt;code&gt;man pages&lt;/code&gt; and in such situations like writing completion spec, people usually use them as a source to learn about the tool and its subcommands options, etc. (Usually they have the best reputation for being the most accurate source of information). Though, the tool I chose to write the completion spec, &lt;code&gt;taplo&lt;/code&gt;, did not have any manual entry pages. Even better! I found their &lt;a href="https://taplo.tamasfe.dev/" rel="noopener noreferrer"&gt;website and documentation&lt;/a&gt; which was really helpful. &lt;/p&gt;

&lt;h3&gt;
  
  
  Takeaways 💯
&lt;/h3&gt;

&lt;p&gt;Maintainers of &lt;a href="https://github.com/withfig/autocomplete" rel="noopener noreferrer"&gt;withfig/autocomplete&lt;/a&gt; are super active and helpful. They constantly add more issues related to writing brand-new completion specs and improving existing ones. Writing completion specs, I think, is one of the best gateways to learning about CLI tools in depth and contributing to open-source. Also, if you are using &lt;a href="https://fig.io/?ref=github_autocomplete" rel="noopener noreferrer"&gt;Fig&lt;/a&gt; you can actually use the completion specs you wrote in your terminal!&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>The storm before the calm: finals week</title>
      <dc:creator>Batuhan Ipci</dc:creator>
      <pubDate>Sun, 11 Dec 2022 06:35:57 +0000</pubDate>
      <link>https://forem.com/batunpc/the-storm-before-the-calm-1o5p</link>
      <guid>https://forem.com/batunpc/the-storm-before-the-calm-1o5p</guid>
      <description>&lt;p&gt;I am sure all students can relate to how stressful finals week is! &lt;br&gt;
Going to sleep at 6 am,  and waking up at noon is now the new norm and has been for the last 2 weeks. I have been through many finals weeks by now, but this one is the most uniquely brutal. I underestimated the amount of work before signing up for all the difficult courses that I did in September. &lt;/p&gt;

&lt;h2&gt;
  
  
  The good stuff
&lt;/h2&gt;

&lt;p&gt;Before starting release 0.4, I was stressed out! I was worried about finding a big enough issue that I could comfortably work on and make it before the deadline. But then I thought why not work on many small issues and challenge myself to do multiple pull requests. &lt;/p&gt;

&lt;p&gt;I picked my favorite Seneca College project &lt;a href="https://github.com/humphd/my-photohub" rel="noopener noreferrer"&gt;my-photohub&lt;/a&gt; and successfully created two pull requests there. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/humphd/my-photohub/pull/35" rel="noopener noreferrer"&gt;PR1&lt;/a&gt;: For the first pull request I had to integrate a previously implemented functionality &lt;code&gt;github-upload&lt;/code&gt; into the rest of the application. &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%2Fnncet1qhrfeeqzitx1sp.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%2Fnncet1qhrfeeqzitx1sp.png" alt=" " width="800" height="536"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next, I found another very interesting project&lt;a href="https://github.com/bcgov/cas-cif/pull/1251" rel="noopener noreferrer"&gt; bcgov/cas-cif&lt;/a&gt; This was a project by the government of British Columbia and I thought it would be nice to contribute to this project. &lt;/p&gt;

&lt;p&gt;All I had to do as described below, was refactor and optimize the regex for emails and phone numbers across multiple files. &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%2Fjutfwsu95mpfimfvdl46.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%2Fjutfwsu95mpfimfvdl46.png" alt=" " width="800" height="330"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I also ended up doing a last-minute contribution to &lt;a href="https://github.com/Seneca-CDOT/vscode-seneca-college/pull/16" rel="noopener noreferrer"&gt;vscode-seneca-college &lt;/a&gt;extension repo for the issue regarding displaying user stats such as screen time and edits made per hour. &lt;/p&gt;

&lt;p&gt;This issue required me to do some research and learn about vscode APIs. Since I had never done any vscode extensions before I had to study the documentation and look through some examples before diving into the code. &lt;/p&gt;

&lt;h2&gt;
  
  
  Endless learning 📖
&lt;/h2&gt;

&lt;p&gt;All of the issues I picked taught me something new. So far, my progress has been smooth without any major bugs or hurdles. &lt;/p&gt;

&lt;h2&gt;
  
  
  The struggle 😪
&lt;/h2&gt;

&lt;p&gt;Fitting in multiple assignments in a short time span is hard! This week has been about four things: open-source development, cloud computing, mobile app development, and robotics. I had very little time to dedicate to other courses. However, despite the hurdles and bottlenecks, I feel pretty good about my accomplishments so far. &lt;/p&gt;

</description>
      <category>agentaichallenge</category>
      <category>gratitude</category>
      <category>deepseek</category>
    </item>
    <item>
      <title>December goals</title>
      <dc:creator>Batuhan Ipci</dc:creator>
      <pubDate>Sun, 04 Dec 2022 08:08:09 +0000</pubDate>
      <link>https://forem.com/batunpc/december-goals-1cpa</link>
      <guid>https://forem.com/batunpc/december-goals-1cpa</guid>
      <description>&lt;p&gt;Attaining mastery of any skill means we need to learn, practice, fail, and iterate in the learning process many times. I can say the same for my open-source development journey. Being able to contribute to open-source projects has been a highlight of this year and in the last month of 2022, I plan on continuing my open-source development to keep up the momentum I built over the last two months. I have a few goals outlined for this month that I would like to accomplish by the end of the year. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Improve on code reviews: &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Earlier I wrote a blog about my code-reviewing process and how it did not go too well.  I want to practice doing some more code reviews throughout this month and get better at giving constructive and effective feedback. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;More open-source project contributions: &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Honestly, I should have started this task a couple of days ago, however, life happened and I got into a late start. I found a couple of potential repositories I would like to contribute to over the next week: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/humphd/my-photohub" rel="noopener noreferrer"&gt;My Photohub&lt;/a&gt;: I have already contributed to this project a few weeks ago where I created the UI of the progressive web app (PWA) using React. I plan on working on the other issues filed for this project and try to get closer to the finished product of this project. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/intel/cve-bin-tool/blob/main/cve_bin_tool/checkers/README.md" rel="noopener noreferrer"&gt;Intel/cve-bin-tool&lt;/a&gt;: There are several issues in this repository that are interesting to me, particularly the ones about creating checkers. I would say it is not very coding-heavy, but it needs a lot of research before doing it. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Some other interesting repositories I came across while looking for some projects were: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/d3/d3" rel="noopener noreferrer"&gt;d3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/freeCodeCamp/freeCodeCamp" rel="noopener noreferrer"&gt;FreeCodeCamp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/vuejs/vue" rel="noopener noreferrer"&gt;Vue&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/facebook/react" rel="noopener noreferrer"&gt;React&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/bokeh/bokeh" rel="noopener noreferrer"&gt;Bokeh&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Refactor, improve and package &lt;a href="https://github.com/batunpc/palpatine" rel="noopener noreferrer"&gt;palpatine&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I have been working on building my static site generator &lt;a href="https://github.com/batunpc/palpatine" rel="noopener noreferrer"&gt;palpatine&lt;/a&gt; for the last two months. However, I have not had the chance yet to package it up to create my first release yet. When I attempted to package it up a few days ago, I ended up with a lot of errors and bugs that would require lots of time to debug. I plan on sitting with it next week again. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Solve Advent of Code problems &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This year, I am also challenging myself to keep up with solving the Advent of Code challenges! &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Try out Advent of Cyber &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I also found out about this amazing challenge from a classmate and would love to give it a try! &lt;/p&gt;

&lt;p&gt;Fun fact: This year my classmates and I started building a browser based cybersecurity game with three.js &lt;br&gt;
When I found out about Advent of Cyber, I knew I had to give the challenges a try to learn different cybersecurity concepts in a fun and engaging way.&lt;br&gt;
This year, I am also challenging myself to keep up with solving the Advent of Code challenges! &lt;/p&gt;

</description>
      <category>productivity</category>
      <category>beginners</category>
      <category>programming</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Building the Frontend of a Progressive Web App Using React</title>
      <dc:creator>Batuhan Ipci</dc:creator>
      <pubDate>Fri, 02 Dec 2022 05:16:12 +0000</pubDate>
      <link>https://forem.com/batunpc/building-the-frontend-of-a-progressive-web-app-using-react-34nh</link>
      <guid>https://forem.com/batunpc/building-the-frontend-of-a-progressive-web-app-using-react-34nh</guid>
      <description>&lt;p&gt;Keeping up the pace of continuous progression and development, I sought out for more challenging issues to fix after Hacktoberfest.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/Seneca-CDOT" rel="noopener noreferrer"&gt;Seneca-CDOT&lt;/a&gt; has many amazing open-source projects to which students are actively contributing - &lt;a href="https://github.com/Seneca-CDOT/telescope" rel="noopener noreferrer"&gt;telescope&lt;/a&gt;, &lt;a href="https://github.com/humphd/my-photohub" rel="noopener noreferrer"&gt;my-photohub&lt;/a&gt;, &lt;a href="https://github.com/Seneca-CDOT/vscode-seneca-college" rel="noopener noreferrer"&gt;vscode-extension&lt;/a&gt;, and so on - and from those options, I chose to work on My Photohub as I found the idea of storing a picture on a GitHub repo very innovative. It was also a new project and I wanted to be among the first time contributors. &lt;/p&gt;

&lt;p&gt;Here is a small description of the project taken from the README.md&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;My Photohub&lt;/strong&gt; is a web app that makes it easy to share your photos on the web. &lt;strong&gt;My Photohub&lt;/strong&gt; takes your images and optimizes them for the web, creates a beautiful HTML page to show them, and hosts everything in a new &lt;a href="https://docs.github.com/en/repositories" rel="noopener noreferrer"&gt;GitHub Repository&lt;/a&gt; owned by you! Your photo web page is made available to the world via &lt;a href="https://pages.github.com/" rel="noopener noreferrer"&gt;GitHub Pages&lt;/a&gt;. Best of all, everything is free, and &lt;strong&gt;you&lt;/strong&gt; are in control of the end product.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The Issue
&lt;/h2&gt;

&lt;p&gt;I tackled the issue -  &lt;a href="https://github.com/humphd/my-photohub/issues/4" rel="noopener noreferrer"&gt;Create a PWA UI for accessing the service&lt;/a&gt; and raised &lt;a href="https://github.com/humphd/my-photohub/pull/10" rel="noopener noreferrer"&gt;PR here&lt;/a&gt;. To get started, I first had to understand what is a Progressive Web App. &lt;/p&gt;

&lt;h2&gt;
  
  
  What is a Progressive Web App (PWA)?
&lt;/h2&gt;

&lt;p&gt;As stated in the&lt;a href="https://developer.mozilla.org/en-US/docs/Web/Progressive_web_apps" rel="noopener noreferrer"&gt; mdn web docs&lt;/a&gt;: &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Progressive Web Apps&lt;/strong&gt; (PWAs) are web apps that use &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API" rel="noopener noreferrer"&gt;service workers&lt;/a&gt;, &lt;a href="https://developer.mozilla.org/en-US/docs/Web/Manifest" rel="noopener noreferrer"&gt;manifests&lt;/a&gt;, and other web-platform features in combination with &lt;a href="https://developer.mozilla.org/en-US/docs/Glossary/Progressive_Enhancement" rel="noopener noreferrer"&gt;progressive enhancement&lt;/a&gt; to give users an experience on par with native apps.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Some examples of PWAs are Spotify, Uber, AliExpress, Starbucks, and many more! &lt;br&gt;
PWAs have faster load times, are more cost-effective to develop, and with the aid of service workers can even be used offline. &lt;/p&gt;
&lt;h2&gt;
  
  
  Offline First 🤔
&lt;/h2&gt;

&lt;p&gt;As stated in the &lt;a href="https://developer.mozilla.org/en-US/docs/Web/Progressive_web_apps" rel="noopener noreferrer"&gt;mdn web docs&lt;/a&gt;: &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The "offline first" — or "cache first" — pattern is the most popular strategy for serving content to the user. If a resource is cached and available offline, return it first before trying to download it from the server. If it isn't in the cache already, download it and cache it for future usage.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This was an interesting concept to me as I had never thought of or built anything keeping offline first in mind. So, I dug a little deeper and researched more about it.&lt;/p&gt;

&lt;p&gt;Here is an &lt;a href="https://rxdb.info/offline-first.html" rel="noopener noreferrer"&gt;awesome resource &lt;/a&gt; to learn about offline-first. &lt;/p&gt;
&lt;h2&gt;
  
  
  The PWA React App
&lt;/h2&gt;

&lt;p&gt;To get started I first did:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx create-react-app my-app &lt;span class="nt"&gt;--template&lt;/span&gt; cra-template-pwa
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After running the command, this is what gets generated. &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%2Fpiinfl9ytqdr1o5s5nim.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%2Fpiinfl9ytqdr1o5s5nim.png" alt="a" width="800" height="1161"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Notice, how we have something called service workers here. This was pretty foreign to me.&lt;/p&gt;

&lt;h2&gt;
  
  
  What are Service Workers?
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Service workers essentially act as proxy servers that sit between web applications, the browser, and the network (when available). ( source: &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API" rel="noopener noreferrer"&gt;mozilla&lt;/a&gt;)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Service workers are scripts that a browser executes, without any direct connection with the DOM. The entire offline experience is possible because of service workers, allowing features such as background synchronizations and push notifications. It provides content and the ability to cache assets in a web browser. Due to this caching mechanism, the app can work offline. &lt;/p&gt;

&lt;h2&gt;
  
  
  The Process in Brief
&lt;/h2&gt;

&lt;p&gt;To create a PWA we need: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;HTTPS&lt;/strong&gt; — The app should be served over a secure network&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Service Worker&lt;/strong&gt; — A script handling network calls and asset caching&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;A manifest.json file&lt;/strong&gt; — A JSON file containing design details&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then, I had to start working on the core frontend components of the site. &lt;/p&gt;

&lt;p&gt;1) Navigation bar &lt;br&gt;
2) A photo-uploading interface &lt;br&gt;
3) An authentication dialog box &lt;/p&gt;

&lt;h2&gt;
  
  
  Reflection
&lt;/h2&gt;

&lt;p&gt;I learned a lot of new things through working on this project. The concept of PWAs, Service Workers, and GitHub APIs was a lot to work on within one project. &lt;/p&gt;

</description>
      <category>programming</category>
      <category>computerscience</category>
    </item>
    <item>
      <title>Makefiles can be helpful in your CI Workflow</title>
      <dc:creator>Batuhan Ipci</dc:creator>
      <pubDate>Wed, 30 Nov 2022 22:47:44 +0000</pubDate>
      <link>https://forem.com/batunpc/makefiles-can-be-helpful-in-your-ci-workflow-36cl</link>
      <guid>https://forem.com/batunpc/makefiles-can-be-helpful-in-your-ci-workflow-36cl</guid>
      <description>&lt;p&gt;While developing &lt;a href="https://github.com/batunpc/palpatine" rel="noopener noreferrer"&gt;palpatine&lt;/a&gt;, I used Makefile to automate the process of building and running the project.&lt;/p&gt;

&lt;p&gt;Currently, it looks something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight make"&gt;&lt;code&gt;&lt;span class="nl"&gt;setup&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; 
    &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;$(&lt;/span&gt;&lt;span class="s2"&gt;shell uname&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Darwin"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
        brew &lt;span class="nb"&gt;install &lt;/span&gt;gcovr&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
        brew &lt;span class="nb"&gt;install &lt;/span&gt;lcov&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="k"&gt;fi&lt;/span&gt;
    &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;$(&lt;/span&gt;&lt;span class="s2"&gt;shell uname&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Linux"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
        pip &lt;span class="nb"&gt;install &lt;/span&gt;gcovr&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="k"&gt;fi&lt;/span&gt;

&lt;span class="nl"&gt;dependency&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
    &lt;span class="nb"&gt;cd &lt;/span&gt;build &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; cmake .. &lt;span class="nt"&gt;--graphviz&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;dependency.dot &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; dot &lt;span class="nt"&gt;-Tpng&lt;/span&gt; dependency.dot &lt;span class="nt"&gt;-o&lt;/span&gt; dependency.png

&lt;span class="nl"&gt;prepare&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
    &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&amp;gt;&amp;gt;&amp;gt; Building palpatine ..."&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; ./build &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then &lt;/span&gt;&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; ./build&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;fi&lt;/span&gt;
    &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;build&lt;span class="p"&gt;;&lt;/span&gt; 
    &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;build&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    cmake &lt;span class="nt"&gt;-S&lt;/span&gt; .. &lt;span class="nt"&gt;-B&lt;/span&gt; .&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    make&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;

    &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&amp;gt;&amp;gt;&amp;gt; Done"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&amp;gt;&amp;gt;&amp;gt; Run ./palpatine [options] to start the application"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;


&lt;span class="nl"&gt;test&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
    &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&amp;gt;&amp;gt;&amp;gt; Running tests ..."&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;build&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    cmake &lt;span class="nt"&gt;--build&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;--target&lt;/span&gt; unit_tests &lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;build/tests&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    ./unit_tests&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nl"&gt;codecov&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
    &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&amp;gt;&amp;gt;&amp;gt; Running tests ..."&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;build&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    cmake &lt;span class="nt"&gt;--build&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;--target&lt;/span&gt; unit_tests &lt;span class="p"&gt;;&lt;/span&gt;
    gcovr &lt;span class="nt"&gt;--html&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; build/index.html &lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Most of the set of rules of this Makefile are self-explanatory, also the &lt;code&gt;echo&lt;/code&gt; logs I've set makes it easier to understand. I’m going to explain the ones that are not that obvious.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;dependency&lt;/code&gt; rule is a interesting one. It initially changes the directory to &lt;code&gt;build&lt;/code&gt; and then runs &lt;code&gt;cmake&lt;/code&gt; with &lt;code&gt;--graphviz=dependency.dot&lt;/code&gt; flag. This flag generates a &lt;code&gt;dependency.dot&lt;/code&gt; file which is a &lt;a href="https://graphviz.readthedocs.io/en/stable/manual.html" rel="noopener noreferrer"&gt;graphviz file&lt;/a&gt;. Then, it runs &lt;code&gt;dot&lt;/code&gt; command with &lt;code&gt;-Tpng&lt;/code&gt; flag to generate a &lt;code&gt;dependency.png&lt;/code&gt; file in build directory. This png file is a &lt;a href="https://github.com/batunpc/palpatine/blob/main/CONTRIBUTING.md#dependencies" rel="noopener noreferrer"&gt;dependency graph of palpatine&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;codecov&lt;/code&gt; rule builds unit_tests target just like &lt;code&gt;test&lt;/code&gt; rule. Then, it runs &lt;a href="https://gcovr.com/en/stable/" rel="noopener noreferrer"&gt;gcovr command&lt;/a&gt; with &lt;code&gt;--html&lt;/code&gt; flag to generate a &lt;code&gt;index.html&lt;/code&gt; file in build directory. It helps to visualize the code coverage of the project.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Few weeks ago, I have added &lt;a href="https://github.com/batunpc/palpatine/blob/main/.github/workflows/macos.yml" rel="noopener noreferrer"&gt;CI workflow to palpatine&lt;/a&gt;.&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;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;macos-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v2&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;setup&lt;/span&gt;
      &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
        &lt;span class="s"&gt;make setup&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;configure&lt;/span&gt;
      &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
        &lt;span class="s"&gt;cmake -H. -Bbuild -G "Unix Makefiles" -DCMAKE_BUILD_TYPE="Debug"&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;building&lt;/span&gt;
      &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
        &lt;span class="s"&gt;cmake --build build --config Debug --target unit_tests -j4&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;testing&lt;/span&gt;
      &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
        &lt;span class="s"&gt;cd build/tests &amp;amp;&amp;amp; ./unit_tests&lt;/span&gt;
        &lt;span class="s"&gt;bash &amp;lt;(curl -s https://codecov.io/bash)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This workflow runs on macOS and it does the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It checks out the code from the repository.&lt;/li&gt;
&lt;li&gt;It runs &lt;code&gt;make setup&lt;/code&gt; to install gcovr and lcov.&lt;/li&gt;
&lt;li&gt;It runs &lt;code&gt;cmake&lt;/code&gt; to configure the project.&lt;/li&gt;
&lt;li&gt;It builds the project.&lt;/li&gt;
&lt;li&gt;It runs the tests.&lt;/li&gt;
&lt;li&gt;It uploads the code coverage report to codecov.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the next releases, I am planning to automate the CI workflow with Makefile commands. I will update this post when I do that.&lt;/p&gt;

</description>
      <category>cpp</category>
      <category>tutorial</category>
      <category>beginners</category>
      <category>programming</category>
    </item>
    <item>
      <title>The perfect open-sourcer does not exist</title>
      <dc:creator>Batuhan Ipci</dc:creator>
      <pubDate>Fri, 25 Nov 2022 00:00:36 +0000</pubDate>
      <link>https://forem.com/batunpc/the-perfect-open-sourcer-does-not-exist-26pb</link>
      <guid>https://forem.com/batunpc/the-perfect-open-sourcer-does-not-exist-26pb</guid>
      <description>&lt;h3&gt;
  
  
  Breakthrough
&lt;/h3&gt;

&lt;p&gt;Over the last four months, I have set some goals to become a better open-sourcer.&lt;br&gt;
They looked something like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[x] Contribute to an open-source project and build influence in the  community&lt;/li&gt;
&lt;li&gt;[x] Make a commitment to a project and build up credibility as a maintainer&lt;/li&gt;
&lt;li&gt;[x] Do a meaningful code review and answer issues&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Being young and having less experience in open source community, made all of these seem out of reach. Nevertheless, I carried them out. Regardless of what goals you might have, I want you to go through your version of a breakthrough.  &lt;/p&gt;

&lt;p&gt;During the process, what became clear to me was to put my commitment to the goals I wanted to achieve. I have this desire to be perfect in things I do, but ironically this leaves my work overdue and ultimately I end up not doing them. Though, once I achieve them, I wonder why I haven't done them earlier. &lt;/p&gt;

&lt;p&gt;It's easier to achieve your goals than you think, but being perfect about them is not. &lt;/p&gt;

&lt;h3&gt;
  
  
  Contribute small to big 🐛🗻
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Contribute to an open-source project and build influence in the community&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Whether you contribute small or big chunks of code, being consistent about them carries vital importance. Small contributions to a particular project help you to get familiar with it at first and leads to something bigger.&lt;br&gt;
Take a look at some pull requests I have raised to the following projects; &lt;a href="https://github.com/withfig/autocomplete/pull/1713" rel="noopener noreferrer"&gt;withfig&lt;/a&gt;, &lt;a href="https://github.com/intel/cve-bin-tool/pull/2122" rel="noopener noreferrer"&gt;cve-bin-tool&lt;/a&gt;, &lt;a href="https://github.com/humphd/my-photohub/pull/10" rel="noopener noreferrer"&gt;my-photohub&lt;/a&gt;, &lt;a href="https://github.com/pavelkeyzik/pr-approve-generator/pull/5" rel="noopener noreferrer"&gt;pr-approve-generator&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  palpatine static site generator with unlimited power!⚡
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Make a commitment to a project and build up credibility as a maintainer &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;One of the personal projects I &lt;strong&gt;love&lt;/strong&gt; developing is &lt;a href="https://github.com/batunpc/palpatine" rel="noopener noreferrer"&gt;palpatine&lt;/a&gt;. I blogged about it &lt;a href="https://dev.to/batunpc/palpatine-release10-350g"&gt;here&lt;/a&gt; and I am constantly adding new features to it! So far it has reached &lt;a href="https://github.com/batunpc/palpatine/stargazers" rel="noopener noreferrer"&gt;5 starts&lt;/a&gt; and keeps growing with the help of the open-source community.&lt;/p&gt;

&lt;p&gt;Keeping good maintenance on and marketing your projects is, I believe, a very significant part of open source. There are so many developers all around the world on GitHub potentially finding your project worthwhile.&lt;/p&gt;

&lt;h3&gt;
  
  
  Read Code Like A Book 📖 🧙
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Do a meaningful code review and answer issues&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Almost everyone seems to have had a hard time reviewing other people's codes. My experience was not very different, I too found it utterly challenging. So much so that, I was putting off writing this blog for the longest time. I understand, however, that being able to review other people's code is an important trait to have and a difficult skill to attain. It takes time and practice to be able to look at code and give constructive feedback about them so that it helps the project and the developer. &lt;/p&gt;

&lt;p&gt;I reviewed the codes of two of my classmates from;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/3763#pullrequestreview-1183982057" rel="noopener noreferrer"&gt;Review 2️⃣&lt;/a&gt;
&lt;/h3&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%2Ffovmmz52060ry5c4qnha.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%2Ffovmmz52060ry5c4qnha.png" alt="review1" width="800" height="659"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://github.com/humphd/my-photohub/pull/11#pullrequestreview-1180281168" rel="noopener noreferrer"&gt;Review 2️⃣&lt;/a&gt;
&lt;/h3&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%2Ftaxgalty0xc52i2syki9.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%2Ftaxgalty0xc52i2syki9.png" alt="review" width="800" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I am no expert at code reviews yet, without writing much I want to click on the &lt;code&gt;Submit review&lt;/code&gt;  button as soon as I can. You as a developer may relate, there might have been times you found other developers more experienced than you are, and not wanting to review their code. However, in such a situation, reviewing good or poor-quality code can improve you as a developer drastically. Along the way, I found myself searching and learning a lot about things I didn't know. &lt;br&gt;
&lt;a href="https://google.github.io/eng-practices/review/reviewer/looking-for.html" rel="noopener noreferrer"&gt;This resource was the most important piece&lt;/a&gt; that helped me to make an impactful review.&lt;/p&gt;

&lt;h3&gt;
  
  
  Better open-source player 👾
&lt;/h3&gt;

&lt;p&gt;After accomplishing all the goals I counted above, ironically it feels easier to do them again. Before I attempted any of those, it was very overwhelming, they all seemed like it was out of my capability. Do not wait for your work to be perfect and get started with what you truly love.&lt;br&gt;
The feeling of accomplishment is so rewarding that you will be able to say; "you could do it once again."&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>beginners</category>
      <category>github</category>
      <category>productivity</category>
    </item>
    <item>
      <title>C++ unit testing with Catch2 🧪👨‍🔬</title>
      <dc:creator>Batuhan Ipci</dc:creator>
      <pubDate>Tue, 15 Nov 2022 20:17:35 +0000</pubDate>
      <link>https://forem.com/batunpc/c-unit-testing-with-catch2-20af</link>
      <guid>https://forem.com/batunpc/c-unit-testing-with-catch2-20af</guid>
      <description>&lt;p&gt;Writing unit tests for my static site generator - &lt;a href="https://github.com/batunpc/palpatine" rel="noopener noreferrer"&gt;palpatine&lt;/a&gt;, taught me an entirely new testing framework called &lt;a href="https://github.com/catchorg/Catch2" rel="noopener noreferrer"&gt;Catch2&lt;/a&gt;. For my Hacktoberfest pull request this year I had done a unit testing contribution for a repository and I am currently working on building a microservice for my cloud computing class which requires us to use &lt;code&gt;Jest&lt;/code&gt; for JavaScript unit testing. So, I can say that I have some experience with unit testing and continuing to develop my skills in it.&lt;/p&gt;

&lt;p&gt;Building good unit testing skills takes time as it requires us to think about our code more deeply. What should the input look like? What is the expected output and what are some of the edge cases? In my normal, day-to-day, personal projects, I did not pay much attention to testing. But I know that it is important for real-world development. &lt;/p&gt;

&lt;h2&gt;
  
  
  Trust the code 🌱
&lt;/h2&gt;

&lt;p&gt;As the name suggests, unit testing is about testing small units of code or components of an application or system to ensure that it is behaving the intended way. An application has building blocks that work in harmony with one another. By testing out these building blocks or units and checking that it is behaving the right way - we can trust the code! &lt;/p&gt;

&lt;p&gt;What if some codes are hard to test? Well, that means that it probably needs to be broken down. This also means that unit testing encourages modularity. &lt;/p&gt;

&lt;p&gt;If a unit of code uses another unit as a dependency we also need to ensure that the dependent unit is being used the right way. &lt;/p&gt;

&lt;h2&gt;
  
  
  Why choose Catch2? 
&lt;/h2&gt;

&lt;p&gt;There are many established testing frameworks for C++ such as Google Test, Boost.Test, Cute, CppUnit, and many more. However, what sets Catch2 apart from the others is its ease of use and simpler learning curve. Not just that. Catch2 also has great documentation and tutorials that I could read and follow.  Also, over the summer, I completed a Udemy course on CMake and there I found a template for testing with Catch2. That template was really useful for me in setting up the configurations to get started. &lt;/p&gt;

&lt;p&gt;As a beginner in writing tests, I would say Catch2 was not as simple for me to learn as more experienced programmers suggest. I had to spend a few days reading through the documentation, going over YouTube videos, and looking through many many examples online before I could write my first test. But once I started writing, it felt easier to go on. &lt;/p&gt;

&lt;p&gt;As stated in Catch2's documentation: &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Catch2's main advantage is that using it is both simple and natural. Test names do not have to be valid identifiers, assertions look like normal C++ boolean expressions, and sections provide a nice and local way to share set-up and tear-down code in tests.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Setting it up 🛸
&lt;/h2&gt;

&lt;p&gt;I first had to start by downloading the &lt;code&gt;catch2.hpp&lt;/code&gt; file and then #include it&lt;br&gt;
&lt;br&gt;
 &lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;catch2/catch_test_macros.hpp&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;And then I had to define this on top.&lt;br&gt;
&lt;br&gt;
 &lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;
&lt;span class="cp"&gt;#define CATCH_CONFIG_MAIN // This tells Catch to provide a main() - only do
&lt;/span&gt;

&lt;span class="c1"&gt;// this in one cpp file&lt;/span&gt;

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

&lt;/div&gt;


&lt;p&gt;The &lt;code&gt;TEST_CASE&lt;/code&gt; macro is used for introducing test conditions. It is used to group the test cases for a particular unit of code.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;SECTION&lt;/code&gt; is defined beautifully in their &lt;a href="https://github.com/catchorg/Catch2/blob/devel/docs/tutorial.md#test-cases-and-sections" rel="noopener noreferrer"&gt;documentation&lt;/a&gt;: &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Another way to look at sections is that they are a way to define a tree of paths through the test. Each section represents a node, and the final tree is walked in depth-first manner, with each path only visiting only one leaf node.&lt;br&gt;
&lt;/p&gt;


&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;
&lt;span class="n"&gt;TEST_CASE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"CLI Parser works perfectly"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"[parser]"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;vct&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"./palpatine"&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="n"&gt;SECTION&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Without any args"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

&lt;span class="n"&gt;REQUIRE_THROWS_AS&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;get_options&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vct&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;runtime_error&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;As mentioned earlier, my CMake course provided me a template to work with that I could modify and use for my testing purposes. If you check my &lt;code&gt;CMakeLists.txt&lt;/code&gt; file you will see:&lt;br&gt;
&lt;br&gt;
 &lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;
&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ENABLE_TESTING&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TEST_MAIN&lt;/span&gt;

&lt;span class="s"&gt;"unit_tests"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TEST_SOURCES&lt;/span&gt;

&lt;span class="s"&gt;"main.cpp"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;SET&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;GCC_COVERAGE_COMPILE_FLAGS&lt;/span&gt; &lt;span class="s"&gt;"-fprofile-arcs -ftest-coverage"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;SET&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;GCC_COVERAGE_LINK_FLAGS&lt;/span&gt; &lt;span class="s"&gt;"--coverage"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;SET&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;CMAKE_CXX_FLAGS&lt;/span&gt; &lt;span class="s"&gt;"${CMAKE_CXX_FLAGS} ${GCC_COVERAGE_COMPILE_FLAGS}"&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;SET&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;CMAKE_EXE_LINKER_FLAGS&lt;/span&gt; &lt;span class="s"&gt;"${CMAKE_EXE_LINKER_FLAGS} ${GCC_COVERAGE_LINK_FLAGS}"&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;add_executable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;TEST_MAIN&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;TEST_SOURCES&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="n"&gt;target_link_libraries&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;TEST_MAIN&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="n"&gt;PUBLIC&lt;/span&gt;

&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;PALPATINE_LIB&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;argparse&lt;/span&gt;

&lt;span class="n"&gt;Catch2&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Catch2WithMain&lt;/span&gt; 
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;add_test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;NAME&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;TEST_MAIN&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="n"&gt;COMMAND&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;TEST_MAIN&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="n"&gt;endif&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ENABLE_TESTING&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

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

&lt;/div&gt;

&lt;h2&gt;
  
  
  Test coverage 💯
&lt;/h2&gt;

&lt;p&gt;My project also has a test coverage provider that shows the lines that are covered by the test and the percentage of coverage. For my test coverage provider, I chose to use &lt;a href="https://gcovr.com/en/stable/" rel="noopener noreferrer"&gt;gcovr&lt;/a&gt;. It had clear documentation on setting it up and I could do it without facing any trouble. &lt;/p&gt;

&lt;p&gt;From their documentation. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Gcovr provides a utility for managing the use of the GNU &lt;a href="https://gcc.gnu.org/onlinedocs/gcc/Gcov.html" rel="noopener noreferrer"&gt;gcov&lt;/a&gt; utility and generating summarized code coverage results.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The command for running the test coverage is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gcovr 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As you can see in the image below, I am able to see the lines covered by my tests! &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%2Fge5enlh4vp63ai3c0q0o.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%2Fge5enlh4vp63ai3c0q0o.png" alt=" " width="800" height="380"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you want your coverage to look colorful, just pip it with &lt;code&gt;lolcat&lt;/code&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%2F4slulo1ehu2zalshy2pc.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%2F4slulo1ehu2zalshy2pc.png" alt=" " width="800" height="346"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Final thoughts ☕︎
&lt;/h2&gt;

&lt;p&gt;Writing tests for C++ was harder compared to the other projects I have worked on. As the codebase evolves, I need to also make sure that the tests get updated over time. &lt;/p&gt;

</description>
      <category>github</category>
      <category>opensource</category>
      <category>cpp</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Static analysis tooling with CMake</title>
      <dc:creator>Batuhan Ipci</dc:creator>
      <pubDate>Sat, 05 Nov 2022 07:19:51 +0000</pubDate>
      <link>https://forem.com/batunpc/static-analysis-tooling-with-cmake-6m7</link>
      <guid>https://forem.com/batunpc/static-analysis-tooling-with-cmake-6m7</guid>
      <description>&lt;p&gt;Regardless of whether I am an experienced programmer or not, it is tough to write the &lt;code&gt;perfect code&lt;/code&gt;. Ideally, I would like to detect every potential flaw, and bug and debug them to the appropriate standard in no time! But this is a tough concept, and relying only upon your &lt;code&gt;developer instincts&lt;/code&gt; for analyzing code is insufficient, especially if you are writing in C++. &lt;/p&gt;

&lt;p&gt;While analyzing code yourself and self-proofing is a vital skill that every developer needs to practice, having a professional tool like &lt;a href="https://clang.llvm.org/extra/clang-tidy/" rel="noopener noreferrer"&gt;clang-tidy&lt;/a&gt;  gives me more confidence that my code adheres to C++ standards.&lt;/p&gt;

&lt;h3&gt;
  
  
  Setup clang-tidy ⚙️
&lt;/h3&gt;

&lt;p&gt;I recently integrated &lt;code&gt;clang-tidy&lt;/code&gt;  in &lt;a href="https://github.com/batunpc/palpatine" rel="noopener noreferrer"&gt;palpatine&lt;/a&gt; using CMake modules, &lt;a href="https://github.com/batunpc/palpatine/tree/main/cmake/modules" rel="noopener noreferrer"&gt;you could browse the cmake directory&lt;/a&gt; of palpatine where I kept the &lt;code&gt;StaticAnalyzers.cmake&lt;/code&gt; module. &lt;/p&gt;

&lt;p&gt;To set this up from scratch, first install &lt;code&gt;clang-tidy&lt;/code&gt; with &lt;code&gt;brew install clang-tidy&lt;/code&gt; on macOS, or if you are on Linux install it with &lt;code&gt;sudo apt-get install clang-tidy&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;After successfully installing, I have added the most commonly used &lt;code&gt;clang-tidy checks&lt;/code&gt; into the &lt;a href="https://github.com/batunpc/palpatine/blob/main/.clang-tidy" rel="noopener noreferrer"&gt;&lt;code&gt;.clang-tidy&lt;/code&gt; dotfile&lt;/a&gt;. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Note:&lt;/em&gt;&lt;/strong&gt; Notice the  &lt;code&gt;WarningsAsErrors: ''&lt;/code&gt;  field in this file, it is responsible for labeling the warnings as errors. Although, currently it is not active as I haven't provided any value. But if you would like to activate it, you could replace the empty value with &lt;code&gt;"*"&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Power of CMake  🧰
&lt;/h3&gt;

&lt;p&gt;See the directory called &lt;code&gt;cmake&lt;/code&gt; in the root directory of &lt;a href="https://github.com/batunpc/palpatine" rel="noopener noreferrer"&gt;palpatine&lt;/a&gt;. &lt;br&gt;
Having &lt;code&gt;cmake modules&lt;/code&gt; within the directory &lt;code&gt;cmake&lt;/code&gt; is commonly used, the purpose of doing is to &lt;a href="https://cmake.org/cmake/help/v3.0/command/include.html" rel="noopener noreferrer"&gt;include()&lt;/a&gt; custom CMake functions to be used later in the project.&lt;/p&gt;

&lt;p&gt;Mine looks like this - &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%2Fnnqx7a7tkwit6dtz56g8.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%2Fnnqx7a7tkwit6dtz56g8.png" alt="cmake-modules-hierarchy" width="800" height="329"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There are 2 files (&lt;code&gt;AddGitSubmodule.cmake&lt;/code&gt;,  &lt;code&gt;StaticAnalyzers.cmake&lt;/code&gt;) and 2 corresponding functions palpatine uses. Our attention will be on &lt;a href="https://github.com/batunpc/palpatine/blob/main/cmake/modules/StaticAnalyzers.cmake" rel="noopener noreferrer"&gt;StaticAnalyzers.cmake&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;After adding the module &lt;code&gt;StaticAnalyzers.cmake&lt;/code&gt; we need to configure it in a way that &lt;code&gt;clang-tidy&lt;/code&gt; will always run whenever we build the project using CMake (i.e. &lt;code&gt;cd build &amp;amp;&amp;amp; cmake .. &amp;amp;&amp;amp; make&lt;/code&gt;).  However this might not be the "intended behavior" in every project, maybe you prefer running it at the end after you are satisfied with your implementation for reducing each CMake build time. That said, there is a &lt;em&gt;neat&lt;/em&gt; way of setting this as an option in the file CMakeLists.txt.&lt;/p&gt;

&lt;p&gt;Navigate to the root CMakeLists.txt file of palpatine and see in &lt;a href="https://github.com/batunpc/palpatine/blob/c7dd5ac68e2e69ac41f9731e04e88fa448eed10d/CMakeLists.txt#L19" rel="noopener noreferrer"&gt;this line &lt;/a&gt; , I have defined a &lt;code&gt;CMake option&lt;/code&gt; that lets me switch between weather I decide to use &lt;code&gt;clang-tidy&lt;/code&gt; or not.&lt;/p&gt;

&lt;p&gt;Now go back to the module &lt;code&gt;StaticAnalyzers.cmake&lt;/code&gt; and notice the first line we are checking is if the option is turned ON or OFF (i.e. &lt;code&gt;if(ENABLE_CLANG_TIDY)&lt;/code&gt;) If &lt;a href="https://github.com/batunpc/palpatine/blob/c7dd5ac68e2e69ac41f9731e04e88fa448eed10d/CMakeLists.txt#L19" rel="noopener noreferrer"&gt;this option&lt;/a&gt; was set to OFF, CMake would ignore this module.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ENABLE_CLANG_TIDY&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;find_program&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CLANG_TIDY_COMMAND&lt;/span&gt; &lt;span class="n"&gt;NAMES&lt;/span&gt; &lt;span class="n"&gt;clang&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;tidy&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;NOT&lt;/span&gt; &lt;span class="n"&gt;CLANG_TIDY_COMMAND&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;WARNING&lt;/span&gt; &lt;span class="s"&gt;"🔴 CMake_RUN_CLANG_TIDY is ON but clang-tidy is not found!"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CMAKE_CXX_CLANG_TIDY&lt;/span&gt; &lt;span class="s"&gt;""&lt;/span&gt; &lt;span class="n"&gt;CACHE&lt;/span&gt; &lt;span class="n"&gt;STRING&lt;/span&gt; &lt;span class="s"&gt;""&lt;/span&gt; &lt;span class="n"&gt;FORCE&lt;/span&gt;&lt;span class="p"&gt;)&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;message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;STATUS&lt;/span&gt; &lt;span class="s"&gt;"🟢 CMake_RUN_CLANG_TIDY is ON"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CLANGTIDY_EXTRA_ARGS&lt;/span&gt;
            &lt;span class="s"&gt;"-extra-arg=-Wno-unknown-warning-option"&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;endif&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;endif&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;find_program()&lt;/code&gt;  CMake command, will search for the clang-tidy that is already installed in your system. If it is unsuccessful in finding it, it will complain with big, fat, and red warning 🔴 in the terminal. Check if you indeed installed it in your system with; &lt;code&gt;clang-tidy --version&lt;/code&gt;.  If it is successful, 🟢 will indicate your CMake configured &lt;code&gt;clang-tidy&lt;/code&gt; with no trouble.&lt;/p&gt;

&lt;h3&gt;
  
  
  clang-tidy in action 🚧
&lt;/h3&gt;

&lt;p&gt;Run the traditional set of CMake build commands in your terminal in the root directory of palpatine.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;build &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd &lt;/span&gt;build &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; cmake .. &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; make
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A combination of these commands is one way of creating a build folder and configuring it with CMake; &lt;/p&gt;

&lt;p&gt;After CMake can see the command &lt;code&gt;clang-tidy&lt;/code&gt; , finally configure it with the project.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="n"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CMAKE_CXX_CLANG_TIDY&lt;/span&gt; &lt;span class="s"&gt;"${CLANG_TIDY_COMMAND};-p=${CMAKE_BINARY_DIR};${CLANGTIDY_EXTRA_ARGS}"&lt;/span&gt; &lt;span class="n"&gt;CACHE&lt;/span&gt; &lt;span class="n"&gt;STRING&lt;/span&gt; &lt;span class="s"&gt;""&lt;/span&gt; &lt;span class="n"&gt;FORCE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;add_custom_target&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;clang&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;tidy&lt;/span&gt;
    &lt;span class="n"&gt;COMMAND&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;CMAKE_COMMAND&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;build&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;CMAKE_BINARY_DIR&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;CMAKE_PROJECT_NAME&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;COMMAND&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;CMAKE_COMMAND&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;build&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;CMAKE_BINARY_DIR&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt; &lt;span class="n"&gt;clang&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;tidy&lt;/span&gt;
    &lt;span class="n"&gt;COMMENT&lt;/span&gt; &lt;span class="s"&gt;"Running clang-tidy..."&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Delete the existing build folder and re-run this set of commands &lt;code&gt;mkdir build &amp;amp;&amp;amp; cd build &amp;amp;&amp;amp; cmake .. &amp;amp;&amp;amp; make&lt;/code&gt;  to test if clang-tidy produces any warnings in the terminal.&lt;/p&gt;

&lt;p&gt;In project &lt;a href="https://github.com/batunpc/palpatine" rel="noopener noreferrer"&gt;palpatine&lt;/a&gt;, the output looks like the following -&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%2Fo4i6km4bh27eop6lbxnl.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%2Fo4i6km4bh27eop6lbxnl.png" alt="command-line-execution" width="800" height="686"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There is also a vscode extension called &lt;a href="https://marketplace.visualstudio.com/items?itemName=ms-vscode.cmake-tools" rel="noopener noreferrer"&gt;CMake Tools&lt;/a&gt; from Microsoft. It provides this set of buttons that automates the CMake build progress;&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%2F8cwq0fv0x8obp8c9op54.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%2F8cwq0fv0x8obp8c9op54.png" alt="status-bar-buttons" width="800" height="36"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is beneficial in a way if you want to integrate CMake and visualize the warnings in vscode before running it on CLI. &lt;/p&gt;

&lt;p&gt;If I build &lt;a href="https://github.com/batunpc/palpatine" rel="noopener noreferrer"&gt;palpatine&lt;/a&gt; using &lt;a href="https://marketplace.visualstudio.com/items?itemName=ms-vscode.cmake-tools" rel="noopener noreferrer"&gt;CMake Tools&lt;/a&gt; vscode displays the warning within the file.&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%2F7dvrm04nk9tzjyo4hu4h.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%2F7dvrm04nk9tzjyo4hu4h.png" alt="example-of-editor-warning" width="800" height="65"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;C++ is developing rapidly and reviewing code is not enough to keep up with the latest standards. Using static analyzers like &lt;code&gt;clang-tidy&lt;/code&gt; inevitably helps us to write defect-free code. You might as well learn from the warnings produced by &lt;code&gt;clang-tidy&lt;/code&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%2Femynmaze9kjhns6fmzrl.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%2Femynmaze9kjhns6fmzrl.png" alt="code-style-meme" width="740" height="258"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>cpp</category>
      <category>tutorial</category>
      <category>showdev</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
