<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: King Isaac Nsengiyunva</title>
    <description>The latest articles on DEV Community by King Isaac Nsengiyunva (@nsengiyunva).</description>
    <link>https://dev.to/nsengiyunva</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%2F283762%2F80089b3d-a391-4b6b-8dc3-658caa8b0fb5.jpeg</url>
      <title>DEV Community: King Isaac Nsengiyunva</title>
      <link>https://dev.to/nsengiyunva</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nsengiyunva"/>
    <language>en</language>
    <item>
      <title>Deploy a NodeJS Restful application with Docker using Nginx as the proxy-server( Ubuntu )</title>
      <dc:creator>King Isaac Nsengiyunva</dc:creator>
      <pubDate>Sun, 07 Aug 2022 21:30:00 +0000</pubDate>
      <link>https://dev.to/nsengiyunva/deploy-a-nodejs-restful-application-with-docker-using-nginx-as-the-proxy-server-ubuntu--m8j</link>
      <guid>https://dev.to/nsengiyunva/deploy-a-nodejs-restful-application-with-docker-using-nginx-as-the-proxy-server-ubuntu--m8j</guid>
      <description>&lt;p&gt;Lately, as a move towards efficient continuous integration and continuous development( CI/CD ), I have been dockerizing all my applications and running these applications inside containers using &lt;code&gt;Docker&lt;/code&gt;. NodeJS turned out to be a hard nut to crack...but alas it's finally cracked. This is how i managed to dockerize and run a NodeJS RESTFUL app at long last.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Navigate to your preferred file system and create a directory and then change into the created directory.&lt;br&gt;
&lt;code&gt;$ mkdir &amp;lt;foldername&amp;gt; &amp;amp;&amp;amp; cd &amp;lt;foldername&amp;gt;&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create a new nodejs app using &lt;code&gt;npm&lt;/code&gt; or &lt;code&gt;yarn&lt;/code&gt; by running: &lt;br&gt;
&lt;code&gt;$ npm init &amp;lt;application name&amp;gt;&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add your app dependencies such as Express:&lt;br&gt;
&lt;code&gt;$ npm install express --save&lt;/code&gt; &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You should now have a &lt;code&gt;package.json&lt;/code&gt; file, the &lt;code&gt;node_modules&lt;/code&gt; folders and maybe some lock files. Create the main file this command under your app directory terminal window / shell by running: &lt;code&gt;$ touch &amp;lt;filename&amp;gt;.js&lt;/code&gt;&lt;br&gt;
5.Edit the &lt;code&gt;package.json&lt;/code&gt; file. Add this if not existent under the scripts defintion and save the file.&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"scripts": {
"start": "node &amp;lt;mainfile&amp;gt;"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;To dockerize the app; add the following files from the terminal under the app directory file system.
&lt;code&gt;$ touch Dockerfile&lt;/code&gt;
&lt;code&gt;$ touch docker-compose.yml&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Open and Edit the Dockerfile with the following contents.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# obtain the node image
FROM node
# change to the working directory
WORKDIR &amp;lt;directory_name&amp;gt;
#move the package file to the current working directory
COPY package*.json ./
# install the depedencies
RUN npm install
COPY . .
# run the app
CMD [ "node", &amp;lt;mainfile&amp;gt; ]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Make a new directory inside the app folder to handle the nginx configuration, cd into the folder and create a new nginx conf file.
&lt;code&gt;mkdir nginx &amp;amp;&amp;amp; cd nginx &amp;amp;&amp;amp; touch default.conf&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Edit the default conf file with these contents; &lt;code&gt;environment name&lt;/code&gt; and &lt;code&gt;port&lt;/code&gt; should be obtained and defined in the &lt;code&gt;docker-compose.yml&lt;/code&gt; file.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http {
 upstream backend {
   server &amp;lt;environment_name: port&amp;gt;
 }
 server {
  location / {
    proxy_pass http://backend;
  } 
 }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Edit the &lt;code&gt;docker-compose.yml&lt;/code&gt; with these contents.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;versions: '3',
services:
  nginx_server:
    image: nginx #image of the nginx
    volumes: 
     - './nginx/default.conf:/etc/nginx/nginx.conf'
    ports:
     - '8000:80'
  #define the node app container
  app:
   container_name: &amp;lt;container name&amp;gt;
   build:
    context: .
    dockerfile: Dockerfile #name of the dockerfile we created
  ports:
   - '3000:80' #docker container port = 3000, host port= 80
  environment:
   - APPID=3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>docker</category>
      <category>node</category>
      <category>nginx</category>
      <category>ubuntu</category>
    </item>
    <item>
      <title>Deploy a python django and reactJS restful app with gunicorn, supervisor and nginx on a linux ubuntu server.</title>
      <dc:creator>King Isaac Nsengiyunva</dc:creator>
      <pubDate>Tue, 05 Jul 2022 13:11:25 +0000</pubDate>
      <link>https://dev.to/nsengiyunva/deploy-a-python-django-and-reactjs-restful-app-with-gunicorn-supervisor-and-nginx-on-a-linux-ubuntu-server-3b3n</link>
      <guid>https://dev.to/nsengiyunva/deploy-a-python-django-and-reactjs-restful-app-with-gunicorn-supervisor-and-nginx-on-a-linux-ubuntu-server-3b3n</guid>
      <description>&lt;p&gt;The task is to deploy a decoupled Application with 2 seperate services that communicate with each other using API. The frontend app written with ReactJS - a popular Javascript library - and a backend app that handles the database written in Python using the Django restframework library.  The 2 apps are also hosted on the github server repository.&lt;br&gt;
The React app communicates with the Django/ Server over REST HTTP methods such as POST, GET, PUT, PATCH, DELETE etc.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: staging the apps on the server&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Git clone your django app on the Ubuntu server e.g. &lt;code&gt;$ git clone https://github.com/&amp;lt;your username&amp;gt;/&amp;lt;your git repo&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Git clone your reactJS app too.
You should have 2 folders listed on the server with all the files.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Manual compile and prepare the reactJS frontend.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;$ cd&lt;/code&gt; into your reactJS frontend folder by typing. &lt;code&gt;cd &amp;lt;frontend folder name&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;$ yarn install&lt;/code&gt; or &lt;code&gt;$ npm install&lt;/code&gt; to add dependencies and packages to your app. if &lt;code&gt;yarn&lt;/code&gt; or &lt;code&gt;node&lt;/code&gt; is not installed on the ubuntu server, make sure you install these libraries first. &lt;/li&gt;
&lt;li&gt;
&lt;code&gt;$ yarn run build&lt;/code&gt; to transpile the final static and bundled files.&lt;/li&gt;
&lt;li&gt;Your frontend app will now include a &lt;code&gt;build&lt;/code&gt; folder with the static and bundled files.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Step 3:  Staging and Preparing the Django a&lt;/strong&gt;pp&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create a new virtual environment for the django app by running &lt;code&gt;python3 m venv &amp;lt;virtual env name&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Activate the virtual environment by running: &lt;code&gt;source &amp;lt;virtual env name&amp;gt;/bin/activate&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Install all dependencies for the django app by running: &lt;code&gt;pip install -r requirements.txt&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Install Gunicorn if not already installed by running: &lt;code&gt;pip install gunicorn&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Step 4: Create a Gunicorn shell script to execute the django app&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Change user to root by logging as root user.&lt;/li&gt;
&lt;li&gt;Create a gunicorn shell script preferably in the same folder as the django app e.g. gunicorn.sh.&lt;/li&gt;
&lt;li&gt;An example draft template of this gunicorn script should look like this:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#!/bin/bash
NAME="&amp;lt;service name&amp;gt;" #name of the service to be run by supervisor
DJANGODIR=&amp;lt;path/to/django app&amp;gt;
USER=&amp;lt;user e.g. root&amp;gt; #you can see your user name by running command whoami
GROUP=&amp;lt;usergroup e.g. root&amp;gt;
NUM_WORKERS=&amp;lt;number of workers e.g. 2&amp;gt;
TIMEOUT=&amp;lt;e.g 500&amp;gt;
DJANGO_SETTINGS_MODULE=&amp;lt;app.settings&amp;lt;the django settings file&amp;gt;&amp;gt;
DJANGO_WSGI_MODULE=&amp;lt;app.wsgi&amp;lt; the wsgi file&amp;gt;&amp;gt;
PORT=&amp;lt;8500&amp;gt;
LOCAL_IP=&amp;lt;127.0.0.1&amp;gt;

echo "Starting $NAME as `whoami`"

cd $DJANGODIR
source &amp;lt;path/to/virtualenv/bin/activate&amp;gt; #run the virtual environment
export DJANGO_SETTINGS_MODULE=$DJANGO_SETTINGS_MODULE #set the global variable to the settings file
export PYTHONPATH=$DJANGODIR:$PYTHONPATH #set your django app directory as python path

exec &amp;lt;path/to/virtualenv/bin/gunicorn ${DJANGO_WSGI_MODULE} &amp;gt;
--name $NAME \
--workers $NUM_WORKERS \
--timeout $TIMEOUT \
--user=$USER --group=$GROUP \
--pythonpath=&amp;lt;path/to/virtualenv/bin \
--log-level=debug \
--bind=$LOCAL_IP:PORT \
--logo-file=-
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Run the gunicorn shell script by executing &lt;code&gt;./gunicorn.sh&lt;/code&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Step 5: Configure the Supervisor&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Supervisor in this case scenario is responsible for running the django service. Before you proceed, make sure the &lt;code&gt;supervisor&lt;/code&gt; library /package is correctly installed on the Ubuntu VPS.&lt;/li&gt;
&lt;li&gt;check the current service list by running &lt;code&gt;$ sudo supervisorctl status&lt;/code&gt; 
This will display a list of service names available.&lt;/li&gt;
&lt;li&gt;Add a New Service as set in the &lt;code&gt;gunicorn.sh&lt;/code&gt; script above by navigating to &lt;code&gt;$ cd /etc/supervisor/conf.d&lt;/code&gt;. Then create your service conf file e.g &lt;code&gt;sudo nano &amp;lt;name.conf&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;To update the supervisor list. Run &lt;code&gt;supervisorctl reread&lt;/code&gt;. This command will make your configuration changes available.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Step 6: Add Nginx to serve the applications&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nginx will serve both our applications on the default port 80. Make sure the nginx library or package is installed on the Ubuntu machine.&lt;/li&gt;
&lt;li&gt;Navigate to the nginx folders as: &lt;code&gt;$ cd /etc/nginx/sites-available&lt;/code&gt; and create a new conf file for your application configuration.&lt;/li&gt;
&lt;li&gt;Create a conf file as &lt;code&gt;&amp;lt;sudo nano name.conf&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Add a server block as shown below:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;server {

        server_name &amp;lt;name/your preferred domain name&amp;gt;;

        proxy_read_timeout 300;
        proxy_connect_timeout 300;
        proxy_send_timeout 300;


        location / {
            root /path/to/react/frontend/build;
        }
        location /api/v1 {
            proxy_pass http://&amp;lt;localhost&amp;gt;:&amp;lt;port name configured in gunicorn shell script &amp;gt;;
        }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;The server block above shows includes 2 location directives. &lt;/li&gt;
&lt;li&gt;The root folder  directive serves the reactjs build folder that includes the index.html file.&lt;/li&gt;
&lt;li&gt;The location directive &lt;code&gt;&amp;lt;server name/ap1/v1&amp;gt;&lt;/code&gt; will serve the django rest server using a proxy pass address.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Happy Coding!
&lt;/h3&gt;

</description>
      <category>django</category>
      <category>react</category>
      <category>restful</category>
      <category>ubuntu</category>
    </item>
    <item>
      <title>Working with JavaScript: Coding Challenge 1</title>
      <dc:creator>King Isaac Nsengiyunva</dc:creator>
      <pubDate>Thu, 20 Feb 2020 15:20:25 +0000</pubDate>
      <link>https://dev.to/nsengiyunva/working-with-javascript-coding-challenge-1-24nl</link>
      <guid>https://dev.to/nsengiyunva/working-with-javascript-coding-challenge-1-24nl</guid>
      <description>&lt;p&gt;Given a coding challenge; it can be done in any language of your choice. I chose to use Javascript and came up with a nice cool working algorithm.&lt;br&gt;
I wanted to share this with everyone so that we can learn, share, and improve the algorithm.&lt;br&gt;
Challenge: You have an array of random numbers; Create a function that will accept an input and output values for each of the following tasks.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;If an input is parsed to the function, check if the the input exists in the array and return that input value.&lt;br&gt;
&lt;code&gt;&lt;br&gt;
[ 5,9, 10, 12, 24 ]&lt;br&gt;
//if 5 is parsed to the function, return 5&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If an input parsed to the function exceeds the largest value in the array, return the current largest value in the array.&lt;br&gt;
&lt;code&gt;&lt;br&gt;
[ 12,53, 59, 250, 150 ]&lt;br&gt;
//if user parses a value of 500, return the largest value in array which is 250&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;if an input parsed is not present in the array but lies between any of the array element values, then return the minimum value in the array closest to the parsed input. e.g.&lt;br&gt;
Given an array as shown below:&lt;br&gt;
&lt;code&gt;&lt;br&gt;
[ 50, 23, 69, 75, 20, 150 , 34 ]&lt;br&gt;
//if the user parses the value of 70, 70 lies between 69 and 75, and so we return the closest minimum value = 69&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If the input parsed to the function is less than the smallest value among all the array element values, then return a message.&lt;br&gt;
&lt;code&gt;&lt;br&gt;
[ 4, 10, 8, 12, 24 ]&lt;br&gt;
//if the input parsed value = 2, then return a message "value is not available"&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These are the main tasks for the algorithm. I have created a sandbox for my JavaScript; you can follow and the link and view the code and console for the results &lt;a href="https://codesandbox.io/s/nsengiyunvajs-1-v3ey5%"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;However, here is my solution explained; The given array is initialized as follows. I create a function called &lt;code&gt;fnCheckValue&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
 var arr = [ 2, 8, 10, 12, 148, 24, 150, 74, 6, 45, 34, 850 ];
function fnCheckValue( input ) {

}


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

&lt;/div&gt;



&lt;p&gt;First, i check if the input is a number and is not an string/ or any other data type.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
  if(parseFloat(input) &amp;gt; 0) {
  //proceed with code
  }

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

&lt;/div&gt;



&lt;p&gt;I then sort the array numbers from lowest to largest, then i store the largest value in the array. I also have an empty array for the dynamic values.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
 var sortedArray = arr.sort( (a, b) =&amp;gt; a - b  );
 var largestValue = sortedArray[sortedArray.length - 1];
 var smallestValue = sortedArray[0];
 let newArray = [];

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

&lt;/div&gt;



&lt;p&gt;I then check if the parsed input exists in the array. for this, i use the javaScript function &lt;code&gt;indexOf(arrayElement)&lt;/code&gt; explained &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf"&gt;here&lt;/a&gt;&lt;br&gt;
This returns the first index at which the element is within an array. if the element does not exist in the array, the result is -1.&lt;br&gt;
if the value exists in the array, we return that value and stop execution.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
  var doesValueExists = sortedArray.indexOf(input);
  if(doesValueExists === -1 ){
   //value does not exist in the array
  } 

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

&lt;/div&gt;



&lt;p&gt;At the stage, we have fulfilled one condition. Next we check if the value exceeds the largest value in the array.&lt;br&gt;
Also if the input is less than the smallest value in the array, we return the message accordingly.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
   if(doesValueExists === -1 ){
     if(input &amp;gt; largestValue ){
       return largestValue;
     }
     if( input &amp;lt; smallestValue){
       return 'not available';
    }

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

&lt;/div&gt;



&lt;p&gt;if the input lies between a range of values between the array elements, we need to check the entire array and obtain the minimum value closest to the input value.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
 sortedArray.forEach( (value) =&amp;gt; {
  if( value &amp;gt; input ){
   newArray.push(value);
  }
 });

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

&lt;/div&gt;



&lt;p&gt;We then sort this new array from ascending to descending. The first element in the array will be the lowest and the minimum value.&lt;br&gt;
We then go and find the index of this value in the original sorted array.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
 //sort this new array and obtain the first element
 let minValue = newArray.sort( (a,b) =&amp;gt; a - b )[0];

 let minValueIndex = sortedArray.indexOf( minValue );

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

&lt;/div&gt;



&lt;p&gt;Now since we know the index of this minimum value, we can go ahead and get its neighbour and return this.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
  return sortedArray[minValueIndex-1];

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

&lt;/div&gt;



&lt;p&gt;And that's our little cool function that works, to run the application just by invoking the function with a parameter.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
 console.log('value is ',fnCheckValue(2));

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

&lt;/div&gt;



&lt;p&gt;That's it. Feel free to suggest improvements and workarounds, and maybe even tests. There is something cool i re-learned today, its called time complexity. The amount of time it takes for the algorithm to execute, we can also improve&lt;br&gt;
the time complexity of this little algorithm.&lt;/p&gt;

&lt;p&gt;Thanks alot devs.&lt;/p&gt;

&lt;p&gt;Lets learn, lets share, lets code.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>functional</category>
      <category>react</category>
    </item>
  </channel>
</rss>
