<?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: Garrick Ng</title>
    <description>The latest articles on Forem by Garrick Ng (@garrickng).</description>
    <link>https://forem.com/garrickng</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%2F823882%2Ff5a50cfb-aaef-40c7-a8a0-ee40b47ee415.jpeg</url>
      <title>Forem: Garrick Ng</title>
      <link>https://forem.com/garrickng</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/garrickng"/>
    <language>en</language>
    <item>
      <title>5 Tips for Writing Clean and Maintainable Code</title>
      <dc:creator>Garrick Ng</dc:creator>
      <pubDate>Sun, 07 May 2023 08:44:27 +0000</pubDate>
      <link>https://forem.com/garrickng/5-tips-for-writing-clean-and-maintainable-code-18l2</link>
      <guid>https://forem.com/garrickng/5-tips-for-writing-clean-and-maintainable-code-18l2</guid>
      <description>&lt;p&gt;As developers, writing clean and maintainable code is essential to ensuring the long-term success of our projects. Code that is well-structured, easy to read, and easy to modify can save us hours of frustration and make it easier to collaborate with other developers. In this article, we'll cover five tips for writing clean and maintainable code.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ZPjWAuDO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2wo5ftua7mtb2z168gl3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZPjWAuDO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2wo5ftua7mtb2z168gl3.png" alt="write-code-that-is-easy-to-read" width="250" height="328"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Write code that is easy to read
&lt;/h2&gt;

&lt;p&gt;One of the most important aspects of writing clean code is making it easy to read. This means using descriptive variable names, writing comments where necessary, and avoiding unnecessary complexity. When you write code that is easy to read, you'll spend less time trying to decipher what it does, and more time making meaningful changes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9yU6NIqn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/v5ltqc803xs6tlpxkd3m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9yU6NIqn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/v5ltqc803xs6tlpxkd3m.png" alt="dream-clean-code" width="500" height="666"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Follow a consistent style
&lt;/h2&gt;

&lt;p&gt;Consistency is key when it comes to writing clean and maintainable code. Choose a style guide or coding standard and stick to it. This includes things like indentation, variable naming conventions, and the use of white space. When all developers on a team follow the same style guide, it's easier to understand and modify each other's code.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--e9pXZu_s--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/q1i1mq3wrb39qofdmtcd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--e9pXZu_s--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/q1i1mq3wrb39qofdmtcd.png" alt="variable-is-global-variable" width="700" height="700"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Use functions and classes effectively
&lt;/h2&gt;

&lt;p&gt;Functions and classes can help make your code more modular and easier to understand. Use functions to break down complex logic into smaller, more manageable pieces. Use classes to encapsulate related functionality and data. When you write functions and classes that are focused and easy to understand, your code will be more maintainable and easier to test.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--AKJmlske--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qenhgtfaw49exy31ws1i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--AKJmlske--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qenhgtfaw49exy31ws1i.png" alt="unit-test-infitie-loop" width="279" height="181"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Write unit tests
&lt;/h2&gt;

&lt;p&gt;Unit tests are an essential part of writing clean and maintainable code. They allow you to catch bugs early, ensure that your code works as intended, and provide a safety net for future changes. When you write unit tests, you'll have more confidence in your code, and you'll be able to make changes with less fear of breaking things.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nr3fniPz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sl8w1lbfgpafwsqz3s57.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nr3fniPz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sl8w1lbfgpafwsqz3s57.png" alt="refactor-code" width="225" height="225"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Refactor frequently
&lt;/h2&gt;

&lt;p&gt;Refactoring is the process of improving the design of existing code without changing its external behavior. When you refactor code, you improve its structure, readability, and maintainability. Refactoring can be time-consuming, but it's an investment that pays off in the long run. When you refactor code frequently, you'll be able to make changes more quickly and with less risk of introducing bugs.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--VF9-4yx4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/t2aqp8wf8f1r0dhhio7z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VF9-4yx4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/t2aqp8wf8f1r0dhhio7z.png" alt="Image description" width="260" height="194"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In conclusion, writing clean and maintainable code is a critical skill for developers. By following these five tips - writing code that is easy to read, following a consistent style, using functions and classes effectively, writing unit tests, and refactoring frequently - you'll be well on your way to writing code that is easy to maintain and modify over time.&lt;/p&gt;

&lt;p&gt;Follow Me On &lt;br&gt;
Website - &lt;a href="https://garrick.monster/"&gt;https://garrick.monster/&lt;/a&gt;&lt;br&gt;
Linkedin - &lt;a href="https://www.linkedin.com/in/garrickng724/"&gt;https://www.linkedin.com/in/garrickng724/&lt;/a&gt;&lt;br&gt;
Github - &lt;a href="https://github.com/GarrickBee"&gt;https://github.com/GarrickBee&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How to Deploy React Application On GitLab Page With Router For Free</title>
      <dc:creator>Garrick Ng</dc:creator>
      <pubDate>Sun, 04 Dec 2022 06:00:00 +0000</pubDate>
      <link>https://forem.com/garrickng/how-to-deploy-react-application-on-gitlab-page-with-router-for-free-1mkd</link>
      <guid>https://forem.com/garrickng/how-to-deploy-react-application-on-gitlab-page-with-router-for-free-1mkd</guid>
      <description>&lt;p&gt;Checkout this site — Garrick.monster. It is completely free to deploy and navigation ready. Want to know how it is done? Here is how.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Setting Up GitLab
&lt;/h2&gt;

&lt;p&gt;I assume you are familiar with setting up a GitLab account and creating a GitLab repo, but if you don’t here is the link&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/users/sign_in" rel="noopener noreferrer"&gt;GitLab User Sign In&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.gitlab.com/ee/user/project/repository/" rel="noopener noreferrer"&gt;Create GitLab Repository&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Make sure you have your gitlab repo ready, if you are shy to share your code to the public, you may choose to private your repo.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Init React Project
&lt;/h2&gt;

&lt;p&gt;Run this command, I am using typescript here, why not.&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;


&lt;p&gt;If you have your repo create ready, you may run this to create react in your current repo&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yarn create react-app &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;--template&lt;/span&gt; typescript
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Change the display text to your desire text and commit it.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&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%2Fmiro.medium.com%2Fmax%2F828%2F1%2AU3-wlK61VBtaqqd5yMR4-g.webp" 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%2Fmiro.medium.com%2Fmax%2F828%2F1%2AU3-wlK61VBtaqqd5yMR4-g.webp" alt="How to Deploy React Application On GitLab Page With Router For Free Starter Page" width="800" height="548"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Create GitLab Pipeline
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Building The React Page
&lt;/h3&gt;

&lt;p&gt;To build the react pages, we need to ask GitLab to pull the latest or desired NodeJS image and compile the react project into a single page application which can be run by GitLab pages.&lt;/p&gt;

&lt;p&gt;Create a yaml file name .gitlab-ci.yml in your project root directory.&lt;/p&gt;

&lt;p&gt;The first stage that we need to ask GitLab CI to do is build stage where GitLab will compile the application and store it at build folder.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;h3&gt;
  
  
  Setting Up The Page According to Gitlab Requirement
&lt;/h3&gt;

&lt;p&gt;The second stage that we need to ask GitLab CI to do is move all the build folder files to public as GitLab will take public path folder as the root directory to serve to the outside world.&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;mv &lt;/span&gt;build public &lt;span class="c"&gt;# Move whole build folder to public&lt;/span&gt;
- &lt;span class="nb"&gt;cp &lt;/span&gt;public/index.html public/404.html &lt;span class="c"&gt;# copy index.html to 404.html so that if there is a page not found error, we can still display our desire custom 404 page.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The default domain rules for GitLab pages is listed here — GitLab Pages Default Domain&lt;/p&gt;

&lt;p&gt;In this case, GitLab pages will be using this format&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;http(s)://groupname.example.io/projectname&lt;/li&gt;
&lt;li&gt;&lt;a href="https://garrick-open-source.gitlab.io/gitlab-pages-with-react-router/" rel="noopener noreferrer"&gt;https://garrick-open-source.gitlab.io/gitlab-pages-with-react-router/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At package.json, you will need to add homepage:gitlab-pages-with-react-router as this path will serve as the react root directory for the react application — &lt;a href="https://garrick-open-source.gitlab.io/gitlab-pages-with-react-router/" rel="noopener noreferrer"&gt;https://garrick-open-source.gitlab.io/gitlab-pages-with-react-router/&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"gitlab-pages-with-react-router"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"homepage"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"gitlab-pages-with-react-router"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;In order for the assets to work perfectly, PUBLIC_URL has to be set to the GitLab page url which is &lt;a href="https://garrick-open-source.gitlab.io/gitlab-pages-with-react-router" rel="noopener noreferrer"&gt;https://garrick-open-source.gitlab.io/gitlab-pages-with-react-router&lt;/a&gt; so that your public assets can point correctly.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;



&lt;h2&gt;
  
  
  Final Yaml File
&lt;/h2&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;After committing your .gitlab-ci.yml file to the repo, GitLab will start to run the pipeline accordingly to build and release your 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%2Fmiro.medium.com%2Fmax%2F828%2F1%2Ag8_oQQKyrq6GR1Fxkrf0cQ.webp" 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%2Fmiro.medium.com%2Fmax%2F828%2F1%2Ag8_oQQKyrq6GR1Fxkrf0cQ.webp" alt="How to Deploy React Application On GitLab Page With Router For Free- GitLab Pipeline In Progress" width="800" height="93"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After all stages is passed and completed, you should be able to browse your website at &lt;a href="https://garrick-open-source.gitlab.io/gitlab-pages-with-react-router" rel="noopener noreferrer"&gt;https://garrick-open-source.gitlab.io/gitlab-pages-with-react-router&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%2Fmiro.medium.com%2Fmax%2F828%2F1%2ALjbUFbU0pJ2axJZDoYvBNA.webp" 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%2Fmiro.medium.com%2Fmax%2F828%2F1%2ALjbUFbU0pJ2axJZDoYvBNA.webp" alt="React Page Deployed to https://garrick-open-source.gitlab.io/gitlab-pages-with-react-router" width="800" height="428"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Tips: Sometimes you might be facing some issue where the page has been&lt;br&gt;
rebuild but there is no changes in the website, press CRTL+F5 to clear&lt;br&gt;
the cached.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  4. Setting Up Custom Domain
&lt;/h2&gt;

&lt;p&gt;To setup custom domain what you need to do is make sure you have a custom domain or subdomain and DNS point is point to GitLab. Gitlab Custom Domain&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%2Fjfh3m4ew4t5kmdlo2ntf.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%2Fjfh3m4ew4t5kmdlo2ntf.png" alt="Custom Domain DNS Setting" width="800" height="58"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Go to gitlab Setting -&amp;gt; Pages -&amp;gt; New Domain , follow the instruction and update your DNS record. After setting up the DNS record, click verify to verify if the domain has been attached to the pages successfully.&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%2F1dysnqqwo2anuy9b0xyo.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%2F1dysnqqwo2anuy9b0xyo.png" alt="GitLab Pages Setting Bar" width="218" height="328"&gt;&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%2Ft0vqrfxx7bc1i3mwhual.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%2Ft0vqrfxx7bc1i3mwhual.png" alt="GitLab Pages Custom Domain Setting" width="800" height="179"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then we need to have some tweaks at our GitLab CI&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Remove the homepage value in package.json as now we are pointing to the root domain.&lt;/li&gt;
&lt;li&gt;Change the PUBLIC_URL path to your domain, in this case &lt;a href="https://gitlab-react-page.garrick.monster" rel="noopener noreferrer"&gt;https://gitlab-react-page.garrick.monster&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When GitLab CI finished buidling your repo, your page should be accessible by the custom domain. Take note that the old GitLab Default pages url will not be able to access anymore due to the change of PUBLIC_URL setting and homepage value.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Adding Router
&lt;/h2&gt;

&lt;p&gt;We are going to use react-router-dom as our router module.&lt;/p&gt;

&lt;p&gt;Take note that GitLab Pages is not a server, it only serve static html file. Hence you cant expect the routing work exactly like a traditional server.&lt;/p&gt;

&lt;p&gt;When you are trying to access &lt;a href="https://gitlab-react-page.garrick.monster/hello-world" rel="noopener noreferrer"&gt;https://gitlab-react-page.garrick.monster/hello-world&lt;/a&gt; , GitLab pages will serve you &lt;a href="https://gitlab-react-page.garrick.monster/hello-world/index.html" rel="noopener noreferrer"&gt;https://gitlab-react-page.garrick.monster/hello-world/index.html&lt;/a&gt; instead which cause error 404 and you will stuck in a loop thinking what goes wrong.&lt;/p&gt;

&lt;p&gt;To avoid this issue , instead of using BrowserRouter, we are going to use HashRouter instead. By adding a #/ between the domain and the path, we are not going to trigger the browser to reload the page which brings to error 404.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&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%2Fhd7fui6bn9elq346679f.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%2Fhd7fui6bn9elq346679f.png" alt="React Page with Router Deployed to Custom Domain https://gitlab-react-page.garrick.monster/hello-world" width="800" height="669"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And there you go. This is how you setup a GitLab Pages with router for free — &lt;a href="https://gitlab-react-page.garrick.monster/hello-world" rel="noopener noreferrer"&gt;https://gitlab-react-page.garrick.monster/hello-world&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here is the full repo:&lt;br&gt;
&lt;a href="https://gitlab.com/garrick-open-source/gitlab-pages-with-react-router" rel="noopener noreferrer"&gt;https://gitlab.com/garrick-open-source/gitlab-pages-with-react-router&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Feel free to drop me a message if you have any questions or feedback.&lt;/p&gt;

&lt;h2&gt;
  
  
  Follow me on:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Website - &lt;a href="https://garrick.monster/" rel="noopener noreferrer"&gt;https://garrick.monster/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Linkedin - &lt;a href="https://www.linkedin.com/in/garrickng724/" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/garrickng724/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Github - &lt;a href="https://github.com/GarrickBee" rel="noopener noreferrer"&gt;https://github.com/GarrickBee&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>discuss</category>
    </item>
    <item>
      <title>How to Automate Bank Statement to Personal Accounting Software (Wave) - Part 1</title>
      <dc:creator>Garrick Ng</dc:creator>
      <pubDate>Wed, 23 Nov 2022 16:33:47 +0000</pubDate>
      <link>https://forem.com/garrickng/how-to-automate-bank-statement-to-personal-accounting-software-wave-part-1-55pl</link>
      <guid>https://forem.com/garrickng/how-to-automate-bank-statement-to-personal-accounting-software-wave-part-1-55pl</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--o33rQQbr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mx5fmn7cr45pfyqdh6o2.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--o33rQQbr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mx5fmn7cr45pfyqdh6o2.jpg" alt="Image description" width="640" height="400"&gt;&lt;/a&gt;&lt;br&gt;
Recently with the rise of digital wallet, transactions your-text-here  are really hard to track as we use different accounts for different transaction purposes. Personally I have several bank savings accounts, credit cards and a couple of e-wallet services but all of them aren't connected.&lt;/p&gt;


&lt;h2&gt;
  
  
  Problem Statements
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Most of the Malaysian bank or e-wallet doesnt support public API service.&lt;/li&gt;
&lt;li&gt;Service doesn't come with recurring monthly statement eg. email&lt;/li&gt;
&lt;li&gt;Service provide recurring monthly statement but with different format or delivery methods&lt;/li&gt;
&lt;li&gt;Records of transaction only available for 90 days&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Hence, I came across wave accounting software which provides &lt;strong&gt;free&lt;/strong&gt; personal accounting management with GraphQl Api support. Hence, the idea is straightforward: whenever the bank sends you an email statement, we are going to build an event trigger script to help us update all the statements to wave through the provided api.&lt;/p&gt;
&lt;h2&gt;
  
  
  Design and Plan
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--kcjaC-cg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cn2zxsh7rv47j0u6jjnw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kcjaC-cg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cn2zxsh7rv47j0u6jjnw.png" alt="How to Automate Bank Statement to Personal Accounting Software Architecture Diagram" width="880" height="328"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The whole idea of this project will be create a event listener that will trigger a bot to process the file when:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;We receive an email from the bank to the bot email&lt;/li&gt;
&lt;li&gt;We send it manually to the bot email&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;But we will cover only the worker to wave accounting part in this post only.&lt;/p&gt;
&lt;h2&gt;
  
  
  1. Create a Wave Account and a API Token
&lt;/h2&gt;

&lt;p&gt;Go to website &lt;a href="https://www.waveapps.com/#page-wrapper"&gt;Wave official website&lt;/a&gt; and register an account. After registring an account, go to the dashboard and familiarize the tools, accounting terms which I am not going to discuss much here. If you are a business owner, is a great tool for you to record down your statement by creating a business account, but for personal use , a personal account will be sufficient.&lt;/p&gt;

&lt;p&gt;Then go to &lt;a href="https://developer.waveapps.com/hc/en-us/articles/360019762711-Manage-Applications"&gt;Wave Developer&lt;/a&gt; to create an application&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--M1j775zV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/psvi28lyu96hwg4bmizj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--M1j775zV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/psvi28lyu96hwg4bmizj.png" alt="Automate Bank Statement Wave Check Agreement" width="880" height="525"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Insert your desire application name and description (optional)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--oZd9hS6w--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/t678ze03rzddrk64td7k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--oZd9hS6w--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/t678ze03rzddrk64td7k.png" alt="Create Token Cover" width="880" height="626"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click agree and create.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zBAr1Q-d--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/99uxoaixyqn6zrvumkht.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zBAr1Q-d--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/99uxoaixyqn6zrvumkht.png" alt="Click agree and create." width="880" height="626"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once redirected back to the application page. click the application name that you just created.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--p6p2B3-B--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hz8lxez0t9htlfqx8uyh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--p6p2B3-B--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hz8lxez0t9htlfqx8uyh.png" alt="Automate Bank Statement Wave Create Token" width="880" height="626"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click the create token and you should be able to generate a token, save the token somewhere secretly and we will use it during our API integration.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bzy5gWSs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kcrkz1ogz3z9bbh0ts0r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bzy5gWSs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kcrkz1ogz3z9bbh0ts0r.png" alt="Wave Accounting Create Full Access Token" width="880" height="158"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  2. Create Your API Module
&lt;/h2&gt;

&lt;p&gt;Wave is using graphql and kindly go through &lt;a href="https://developer.waveapps.com/hc/en-us/articles/360019968212-API-Reference"&gt;Wave API Documentation&lt;/a&gt; for more info. You may test your api using postman.&lt;/p&gt;
&lt;h3&gt;
  
  
  Test Your API
&lt;/h3&gt;

&lt;p&gt;Eg&lt;br&gt;
POST &lt;a href="https://gql.waveapps.com/graphql/public"&gt;https://gql.waveapps.com/graphql/public&lt;/a&gt;  &lt;/p&gt;

&lt;p&gt;Set your header with Authorization = Bearer YOUR_AUTH_TOKEN&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight graphql"&gt;&lt;code&gt;&lt;span class="k"&gt;query&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;businesses&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;edges&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;And you should be getting a response like below&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"data"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"businesses"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"edges"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"node"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"XXXXXXXXXXXX"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"YOUR ACCOUNT NAME"&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Making a call to Wave API
&lt;/h3&gt;

&lt;p&gt;Here are a simple script that I wrote to communicate with the wave module using axios&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;



&lt;h3&gt;
  
  
  Creating Transaction function
&lt;/h3&gt;

&lt;p&gt;Next is create a function to read from your desire file such as PDF, excel, csv. I will discuss further for statement reader in the next post to guide you through how to read the pdf statement. &lt;/p&gt;

&lt;h4&gt;
  
  
  Extract info from your bank statement
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Get pdf file&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt;  &lt;span class="nx"&gt;mbbPdfBuffer&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt;  &lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;readFileSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;data/april-jun-2022.pdf&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Get transaction list&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt;  &lt;span class="nx"&gt;mbbTransactionList&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;MBBPdfModule&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;convertMbbPdfBufferToTransactionList&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;mbbPdfBuffer&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  Pass Information To Wave Module
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;transactionPromises&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;
&lt;span class="c1"&gt;// Loop transaction list&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;mbbTransactionList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;transaction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;mbbTransactionList&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
  &lt;span class="c1"&gt;// * Create Transaction&lt;/span&gt;
  &lt;span class="nx"&gt;transactionPromises&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;createTransaction&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;externalId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;transaction&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;externalRefId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;date&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;transaction&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;transaction&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;description&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;anchor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;accountId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;WAVE_ACCOUNT_ID&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;MAYBANK_SAVING&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;transaction&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;direction&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
          &lt;span class="nx"&gt;transaction&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;transactionDirection&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nx"&gt;TRANSACTION_DIRECTION&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;INCOME&lt;/span&gt;
            &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;WAVE_TRANSACTION_DIRECTION&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;DEPOSIT&lt;/span&gt;
            &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;WAVE_TRANSACTION_DIRECTION&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;WITHDRAWAL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="na"&gt;lineItems&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;accountId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;transaction&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;transaction&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;balance&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;WAVE_BALANCE_TYPE&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;INCREASE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;transactionId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;transaction&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;externalRefId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
      &lt;span class="p"&gt;})&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;transactionId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;transaction&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;externalRefId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;};&lt;/span&gt;
      &lt;span class="p"&gt;})&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;h4&gt;
  
  
  Post the result
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;allSettled&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;transactionPromises&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;results&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;results&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="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;rejected&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;report&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;errors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;reason&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="k"&gt;continue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nx"&gt;report&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;success&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&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;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;



&lt;h2&gt;
  
  
  Final Outcome
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RrjXUP3q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6q2b8m1iye3sjvnmse7i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RrjXUP3q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6q2b8m1iye3sjvnmse7i.png" alt="Wave Transaction Cover" width="880" height="250"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The transaction is well grouped by your own custom category with the date and time of the transaction. &lt;/p&gt;

&lt;p&gt;What comes after is the juicy report graph which helps you under stand your transaction better.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--foo-k9eD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0nz27dwuii6ldinnurca.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--foo-k9eD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0nz27dwuii6ldinnurca.png" alt="Automate Bank Statement Transaction Graph" width="880" height="363"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;We have cover how we can use wave to act as the data storage for all of your transaction but it this blog post doesnt show you how to read the data from your pdf, the details of the module etc.&lt;/p&gt;

&lt;p&gt;Things to cover in the upcoming post:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Statement Reader code walk through &lt;/li&gt;
&lt;li&gt;Automate Bot base on event&lt;/li&gt;
&lt;li&gt;Deploy application to AWS&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Follow me on:&lt;br&gt;
Website - &lt;a href="https://garrick.monster/"&gt;https://garrick.monster/&lt;/a&gt; &lt;br&gt;
Linkedin - &lt;a href="https://www.linkedin.com/in/garrickng724/"&gt;https://www.linkedin.com/in/garrickng724/&lt;/a&gt; &lt;br&gt;
Github - &lt;a href="https://github.com/GarrickBee"&gt;https://github.com/GarrickBee&lt;/a&gt;&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>tutorial</category>
      <category>bot</category>
      <category>tooling</category>
    </item>
    <item>
      <title>Top 5 Mindset to Become a Self -Taught Freelance Web Developer ( As a Mechanical Engineer Graduate)</title>
      <dc:creator>Garrick Ng</dc:creator>
      <pubDate>Sun, 20 Nov 2022 15:30:24 +0000</pubDate>
      <link>https://forem.com/garrickng/top-5-mindset-to-become-a-self-taught-freelance-web-developer-as-a-mechanical-engineer-graduate-4jkm</link>
      <guid>https://forem.com/garrickng/top-5-mindset-to-become-a-self-taught-freelance-web-developer-as-a-mechanical-engineer-graduate-4jkm</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jlPzj5D_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/700/0%2ACHIJXPt3FgVS00-8" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jlPzj5D_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/700/0%2ACHIJXPt3FgVS00-8" alt="Top 5 Mindset To Become a Self-Taught Freelance Web Developer Cover" width="700" height="467"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As Mechanical Engineer graduate from University of Malaya, I always find my self have deep interest on projects, classes , works or things that are related to programming. Switching career after graduating is more so like a change of wife or your life partner — catastrophic and stress. I am a complete self-taught programmer (No Coding Boot Camp or etc. but purely Stack Overflow and YouTube videos).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Pm5oY3MZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/700/0%2AKSTbhVYUXMfJAY1I" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Pm5oY3MZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/700/0%2AKSTbhVYUXMfJAY1I" alt="Know Your Goal and Stay On Course Cover" width="700" height="466"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Know Your Goal And Stay On Course
&lt;/h2&gt;

&lt;p&gt;Before starting out this journey, you have to ask yourself why you want to choose this journey as your future career? This will determine how you achieve the goal and what characteristic of programmer you will become.&lt;/p&gt;

&lt;p&gt;Professional career for 2 years and I am still learning. What determine a best programmer? For me , not by how good is he in solving LeetCode problems but giving output consistently such as contribute in open source project development, create a repo that have at least 1k of likes on GitHub , able to share his knowledge to the community, able to solve daily problems using your skills, able help others grow, answer Stack Overflow questions , be humble etc.&lt;/p&gt;

&lt;p&gt;If you don't set your course right, your gas soon will be drained out fast as this journey isn't easy at all. Roller coaster your life will become — sometimes up, sometimes down. What keep the coaster moving is your passion or else thats the end of the journey.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QVO9Mt_x--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/700/0%2A43wWcv0MvfiIskZM" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QVO9Mt_x--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/700/0%2A43wWcv0MvfiIskZM" alt="Avoid Tutorial Loop Hole" width="700" height="466"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Avoid Yourself From Stuck In A Tutorial Loop Hole
&lt;/h2&gt;

&lt;p&gt;Pick any language ( But not Html CSS as it don't teach you much on the fundamentals) to start with and go through some tutorials — I recommend &lt;a href="https://www.freecodecamp.org/"&gt;freecodingbootcamp&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The things you should always avoid — Stuck in a Tutorial Loop Hole. After watching a series of tutorial and you feel like not learning anything which cause you to watch another tutorial again and again. Sometime event start to buy courses from Udemy , switch language without reason and change to another tutorial video. This month works on React , next month works on Angular. Tutorial loop hole it is.&lt;/p&gt;

&lt;p&gt;Try to find video that teach you how to build a projects rather than teaching you how to play with all the functions , data structure etc. For example, you can search for how to build WhatsApp using python which will bring more interest, goal and fun in your starting journey. After finishing the projects, start build another projects without watching the tutorial video but browsing through stack Overflow whenever you have any questions. You will soon know how to tackle problems and learn deeply about what that language can do. When you are confidence enough, switching language is much more easier sometimes you don't even have to go through tutorial series again as the concept is the same.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--FBtz9gF8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/700/0%2ARtiIBgLy1qPUIcte" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FBtz9gF8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/700/0%2ARtiIBgLy1qPUIcte" alt="Be Confidence, Brace and Bumble Cover" width="700" height="466"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Be Confidence , Brave and Bumble
&lt;/h2&gt;

&lt;p&gt;I came across with a Medium size company. I have an interview with a group of young engineers and soon they find out I am a self thought engineer , they try to criticize me on my fundamental of CS knowledge in a not so humble way but no questions on my practical projects. What is the point for a tons of theory or passing your exam 100% but couldn't even setup a server , or complete a full stack projects that works?&lt;/p&gt;

&lt;p&gt;Soon, I met a Ex google engineer that’s so humble in giving guidance and sharing his knowledge in a good way. Will share more if there is any chances.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--83nAMb1r--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/700/0%2AM4kVAikzCAdv16ef" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--83nAMb1r--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/700/0%2AM4kVAikzCAdv16ef" alt="Striking Your Goal Cover" width="700" height="466"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Striking Your Goal
&lt;/h2&gt;

&lt;p&gt;If you get up in the morning and think the future is going to be better, it is a bright day. Otherwise, it’s not. — Elon Musk&lt;/p&gt;

&lt;p&gt;So do your future. Sometimes goal is what keep you going to improve your self for your better future or dream, soon the world’s future little by little.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--VBVWsbkN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/700/0%2AoEBQgRyef9PfOSpl" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VBVWsbkN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/700/0%2AoEBQgRyef9PfOSpl" alt="Start Doing It Now" width="700" height="525"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Start Doing It Now
&lt;/h2&gt;

&lt;p&gt;I believe most of the readers that came across this article are similar as me from few years back that curious about how the pros become a software engineer through self-taught process. Start working on it is the only way to become the pros. Like right now.&lt;/p&gt;

&lt;p&gt;So coder , prepare your keyboard and start coding. Have fun with your Hello World program.&lt;/p&gt;

&lt;p&gt;Follow me on:&lt;br&gt;
Website - &lt;a href="https://garrick.monster/"&gt;https://garrick.monster/&lt;/a&gt; &lt;br&gt;
Linkedin - &lt;a href="https://www.linkedin.com/in/garrickng724/"&gt;https://www.linkedin.com/in/garrickng724/&lt;/a&gt; &lt;br&gt;
Github - &lt;a href="https://github.com/GarrickBee"&gt;https://github.com/GarrickBee&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devjournal</category>
      <category>programming</category>
      <category>beginners</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How To Start A Technical Blog In 10 Minutes</title>
      <dc:creator>Garrick Ng</dc:creator>
      <pubDate>Sun, 20 Nov 2022 14:46:58 +0000</pubDate>
      <link>https://forem.com/garrickng/how-to-start-a-technical-blog-in-10-minutes-4dn6</link>
      <guid>https://forem.com/garrickng/how-to-start-a-technical-blog-in-10-minutes-4dn6</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6rJOWUOq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rhtq30588189d3gwuchw.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6rJOWUOq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rhtq30588189d3gwuchw.jpg" alt="How To Start A Technical Blog In 10 Minutes Cover" width="880" height="587"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Stop Thinking and Start writing
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--i8DixsAW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/400/0%2Afm3qYpsxJlF3znKp.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--i8DixsAW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/400/0%2Afm3qYpsxJlF3znKp.jpg" alt="Stop Thinking and Start Writing Cover" width="400" height="268"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Many people stuck in starting a blog post is mostly due to thinking to start a blog post. We tends to plan the journey of writing the blog post but in fact a journey is created by walking through not planning. Yes, you might said hey, a project has to be well planned before executing it right?&lt;/p&gt;

&lt;p&gt;Indeed, but how to define a well plan project? Is it guarantee that there will be no risk or troubles happened in between a well-planned project? No, so why we bothered? Writing blog is no a big project and is easier than you think . Take your initiative , open up your note book and start writing anything that is in your mind. That’s your first blog post. If I am telling you this is my first blog post, will you believe it? Actually I don’t care and you might not care as well. The worse is that you skip the entire blog or even shut down your computer. No big deal. Every experts start with a poor writing skills. First baby step is the important key.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Commit to one type of blog
&lt;/h2&gt;

&lt;p&gt;Find a good topic and commit to it. The most simplest way to start a blog topic is writing what you know or learn. Never start to research for topic to write for your very first blog post as this will stop you from writing it. Spending days in researching your topics only will lead to procrastinating and in the end, no progress is actually done. Research along the way, learn a long the way.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Be Confidence
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--tGeUQVFQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1080/0%2APLpnh5IKq2pX4h2X" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tGeUQVFQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1080/0%2APLpnh5IKq2pX4h2X" alt="Be Confidence Cover" width="880" height="587"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Confidence does not mean you have to be the Expert. An expert is created not by years of experience but the confidence in sharing his knowledge. Be confidence in sharing your knowledge or even your learning journey.&lt;/p&gt;

&lt;p&gt;There are no experts saying “ Well, I am the professional, lets stop learning today and flex among others.”. The day you stop learning from others is the time where you lose the title as experts. Documents your learning journey and after years of doing it, you will be able to compare the results, mistakes and journey along this blogging experience. You will be able to influence others with your own way.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Structure your blog post
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7X3QJ_ef--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1080/0%2AmUuyEPqkNKeZNsIk" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7X3QJ_ef--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1080/0%2AmUuyEPqkNKeZNsIk" alt="Be Confidence Cover" width="880" height="660"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It will be painful to let your reader to read in non structural way. Structure you blog with beginning, middle, and end which will ease your reader in consuming your idea.&lt;/p&gt;

&lt;h3&gt;
  
  
  Introduction
&lt;/h3&gt;

&lt;p&gt;Start with a little bit of context to help others understand where your post fits into the big picture. Give a summary on what reader will get from your blog content.&lt;/p&gt;

&lt;h3&gt;
  
  
  Middle
&lt;/h3&gt;

&lt;p&gt;Feed what ever information that you have promised to your reader. Use headings, numbered lists and structure formatting to help people understand where they are and enable them to skip around to the content they are most interested in.&lt;/p&gt;

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

&lt;p&gt;If your reader made till this section, congratulations your reader really care about the content of this blog post. Give a round up of what you written in this blog , let them refresh on what they have learned though out this blog post in a quick way.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Get feedback and collect leads
&lt;/h2&gt;

&lt;p&gt;You wont know what people are going to get from your writing until they read it. Ask for feedback so that you can know the pros and cons of your blog post. How they feel, what should be improve. Turn your cons to pros and keep your pros in a consistent way. Quality is important but consistency is the king of everything. Consistence in generating good content that the reader needs, the tittle of experts blogger is not far away from you.&lt;/p&gt;

&lt;p&gt;Collect reader emails or ask for a click of share or like from your reader will be nice. I will talk more on collecting leads in the next articles.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--sWtznrNx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1080/0%2A14iaU64rIvL7dK6-" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--sWtznrNx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1080/0%2A14iaU64rIvL7dK6-" alt="Get feedback and collect leads Cover" width="880" height="583"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Lets give it a wrap on what I have discussed today. Stop thinking on what you should write for your first blog post, write something that you have learn or know currently and commit to it. Be confidence on your writing and never afraid of criticism. Structure your blog post nicely. Get feedback and collect leads from you readers.&lt;/p&gt;

&lt;p&gt;This marked as my first post for my technical blog post journey. I am Garrick Ng a self learn software engineer base in Malaysia who start of with PHP programming language. Looking forward to learn more stacks able to join Google in future or working with Elon Musk, I am a big fan of him.&lt;/p&gt;

&lt;p&gt;Thanks for reading this post and have a nice day.&lt;/p&gt;

&lt;p&gt;Follow me on:&lt;br&gt;
Website - &lt;a href="https://garrick.monster/"&gt;https://garrick.monster/&lt;/a&gt; &lt;br&gt;
Linkedin - &lt;a href="https://www.linkedin.com/in/garrickng724/"&gt;https://www.linkedin.com/in/garrickng724/&lt;/a&gt; &lt;br&gt;
Github - &lt;a href="https://github.com/GarrickBee"&gt;https://github.com/GarrickBee&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>beginners</category>
      <category>programming</category>
      <category>devjournal</category>
    </item>
  </channel>
</rss>
