<?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: Rachel</title>
    <description>The latest articles on DEV Community by Rachel (@rachelg).</description>
    <link>https://dev.to/rachelg</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%2F654359%2F8678a094-75f9-45a1-8107-ae6ce79151c2.jpeg</url>
      <title>DEV Community: Rachel</title>
      <link>https://dev.to/rachelg</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rachelg"/>
    <language>en</language>
    <item>
      <title>Advent of Code 2021 in Javascript: My beginner solutions (day 3)</title>
      <dc:creator>Rachel</dc:creator>
      <pubDate>Thu, 09 Dec 2021 05:39:24 +0000</pubDate>
      <link>https://dev.to/rachelg/advent-of-code-2021-in-javascript-my-beginner-solutions-day-3-h45</link>
      <guid>https://dev.to/rachelg/advent-of-code-2021-in-javascript-my-beginner-solutions-day-3-h45</guid>
      <description>&lt;p&gt;Hi dev.to!&lt;/p&gt;

&lt;p&gt;A couple of days ago I posted my &lt;a href="https://dev.to/rachelg/advent-of-code-in-javascript-my-beginner-solutions-days-1-2-3dgk"&gt;solutions to days 1 &amp;amp; 2&lt;/a&gt; of Advent of Code 2021, using sort of beginner-intermediate pure Javascript.&lt;/p&gt;

&lt;p&gt;Now I'm back to continue on with day 3! &lt;/p&gt;

&lt;p&gt;I found this one took me a bit longer, and I ended up with a fair amount of code. I'm sure there are much more elegant ways of doing this than nested loops... but again, I've tried to make it basic and easy to read. So here goes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Day Three: Binary Diagnostic
&lt;/h2&gt;

&lt;p&gt;(&lt;a href="https://adventofcode.com/2021/day/3"&gt;link&lt;/a&gt;)&lt;/p&gt;

&lt;h3&gt;
  
  
  Part One
&lt;/h3&gt;

&lt;p&gt;In this puzzle we are given a list of binary numbers that we need to process in various ways. This involves finding the most common ('gamma') and least common ('epsilon') bits at each position. What the heck does that mean??&lt;/p&gt;

&lt;p&gt;Well, a 'bit' is a single 0 or 1 within a binary number. So we can think of the list of numbers as having &lt;strong&gt;columns&lt;/strong&gt;, for example, like this (using the sample input from the instructions):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--q6CzcNIC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jsl5kp3lkdl4hj2177ug.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--q6CzcNIC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jsl5kp3lkdl4hj2177ug.png" alt="Table showing positions of each bit in each number" width="772" height="850"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Each row is one 5-bit binary number in the array, and the columns show the positions of each bit within their respective numbers. For example if we were to find the index of the last bit in the first number, you could notate it as array[0][4].&lt;/p&gt;

&lt;p&gt;To find the most common bit in each position, we need to count the zeroes and ones in every column. After recording the most common bit of each column in order, we have a new 5-bit binary number, which is the gamma value. Then we repeat with the least common bits to get the epsilon value. The puzzle doesn't specify what to do if there is an equal number of zeroes and ones in the column, but in part two the instructions say to record 1 as the most common bit in that case, so I implemented that for part one as well.&lt;/p&gt;

&lt;p&gt;The puzzle answer is the decimal value of your gamma and epsilon results multiplied together.&lt;/p&gt;

&lt;p&gt;On to the code. The input we're given will be read as a string, so we split it into an array of strings. It's easiest to keep the binary numbers as strings so we can index them.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const arr = binaryList.split("\n");

let x = 0;
let mostCommon = [];
let leastCommon = [];
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We also set up a counter and two arrays to record the most and least common bits. Next, nested loops!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;while (x &amp;lt; arr[0].length) {
    let zeroes = 0;
    let ones = 0;
    for (let i of arr) {
      if (parseInt(i[x]) === 0) {
        zeroes++;
      } else if (parseInt(i[x]) === 1) {
        ones++;
      }
    }
    if (zeroes &amp;gt; ones) {
      mostCommon.push(0);
      leastCommon.push(1);
    } else {
      mostCommon.push(1);
      leastCommon.push(0);
    }
    x++;
  }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I set the length of the 'while' loop to the length of the binary numbers, so that it works with both the sample and real inputs. The value x, which increases by one each loop, represents which column we are up to.&lt;/p&gt;

&lt;p&gt;We create counters for the zeroes and ones. These will reset to 0 at the start of each loop. Then, the inner 'for' loop iterates through the list, counting how many zeroes and ones there are in position x.&lt;/p&gt;

&lt;p&gt;Next, we push the most common bit into the mostCommon array, and the least common into the leastCommon array. As the 'while' loop continues, these two arrays will construct our gamma and epsilon values. Then, we just need to parse them.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const gamma = parseInt(mostCommon.join(""), 2);
const epsilon = parseInt(leastCommon.join(""), 2);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;parseInt() is a super useful function that can turn a string into an integer. What's more, if you give it the number system (radix) of the number you're converting as its second argument, it will take that into account too! Because we're converting from &lt;strong&gt;bi&lt;/strong&gt;nary to decimal, we need to supply the radix of 2. &lt;/p&gt;

&lt;p&gt;Now we can console.log(gamma * epsilon). How cool is that!&lt;/p&gt;

&lt;h3&gt;
  
  
  Part Two
&lt;/h3&gt;

&lt;p&gt;This one took a bit of thought to understand. In this part we are essentially doing the same thing - counting the most and least common bits - but now at the end of each loop we need to filter the array. &lt;/p&gt;

&lt;p&gt;The values we're looking for are 'oxygen' and 'CO2'. We'll set up a similar 'while' loop to part one, that loops through the columns. To get the oxygen value, for each loop, we determine the &lt;strong&gt;least&lt;/strong&gt; common bit and remove from the array every number that contains &lt;strong&gt;that bit at position x&lt;/strong&gt; (the column we are up to). To get the CO2 value, we do the same thing but removing every number that has the &lt;strong&gt;most&lt;/strong&gt; common bit at position x.&lt;/p&gt;

&lt;p&gt;Here's what that looks like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;let x = 0;
let arr = binaryList.split("\n");

while (arr.length &amp;gt; 1) {
  let zeroes = 0;
  let ones = 0;
  for (let i of arr) {
    if (parseInt(i[x]) === 0) {
      zeroes++;
    } else if (parseInt(i[x]) === 1) {
      ones++;
    }
  }
  if (zeroes &amp;gt; ones) {
    arr = arr.filter((i) =&amp;gt; parseInt(i[x]) === 0);
  } else {
    arr = arr.filter((i) =&amp;gt; parseInt(i[x]) === 1);
  }
  x++;
}

const oxygen = parseInt(arr[0], 2);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There are a few things here. My first thought was actually could we use the gamma and epsilon values from part one so we don't have to count the most and least common bits again? But then I realised that won't work, because the array will shorten for each loop, changing the number of bits! Instead we need to use the same inner 'for' loop as before, in order to count them each loop.&lt;/p&gt;

&lt;p&gt;So the code ends up looks pretty similar to part one. However, instead of using the most and least common bits to construct new numbers, we use them to filter the array using the array.filter() method.&lt;/p&gt;

&lt;p&gt;The filter method takes two arguments, an array and a callback function that needs to return true or false. It outputs a new array containing only the items for which the function returned true. Because it outputs a new array, I'm reassigning the original array's variable to the new array each time filter is run. Thus, we need to use 'let' instead of 'const' when initialising the array's variable.&lt;/p&gt;

&lt;p&gt;We run the while loop until there is only one item left in the list (arr.length is no longer greater than 1). This is the oxygen value! We can now parse this using parseInt().&lt;/p&gt;

&lt;p&gt;To get the CO2 value, it's essentially the same code, just with the numbers in the final if/else statements switched!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;x = 0;
arr = binaryList.split("\n");

while (arr.length &amp;gt; 1) {
  let zeroes = 0;
  let ones = 0;
  for (let i of arr) {
    if (parseInt(i[x]) === 0) {
      zeroes++;
    } else if (parseInt(i[x]) === 1) {
      ones++;
    }
  }
  if (zeroes &amp;gt; ones) {
    arr = arr.filter((i) =&amp;gt; parseInt(i[x]) === 1);
  } else {
    arr = arr.filter((i) =&amp;gt; parseInt(i[x]) === 0);
  }
  x++;
}

const co2 = parseInt(arr[0], 2);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now we can multiply oxygen and co2 to get the final answer. :)&lt;/p&gt;

&lt;p&gt;If you were struggling with understanding this puzzle, I hope that made sense! Let me know if it doesn't or if I got anything wrong.&lt;/p&gt;

&lt;p&gt;Thanks for reading! 👋&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>codenewbie</category>
      <category>adventofcode</category>
    </item>
    <item>
      <title>Advent of Code 2021 in Javascript: My beginner solutions (days 1-2)</title>
      <dc:creator>Rachel</dc:creator>
      <pubDate>Mon, 06 Dec 2021 07:34:12 +0000</pubDate>
      <link>https://dev.to/rachelg/advent-of-code-in-javascript-my-beginner-solutions-days-1-2-3dgk</link>
      <guid>https://dev.to/rachelg/advent-of-code-in-javascript-my-beginner-solutions-days-1-2-3dgk</guid>
      <description>&lt;p&gt;Hi dev.to!&lt;/p&gt;

&lt;p&gt;Since this is my first time doing Advent of Code, I thought it would be fun to document the experience as I go. So far it's been super fun solving the problems, especially since I have no classes to keep my brain busy over the summer... I'd been missing that feeling of satisfaction when your code works, and Advent of Code gives me just that, but in bite-sized pieces! 😁&lt;/p&gt;

&lt;p&gt;So, here are my solutions to the first two days of Advent of Code 2021. Just to note, I haven't looked at anyone else's solutions yet, so here you have my raw unfiltered thought process!! ✌️ Since I have limited maths and data manipulation skills (and I'm still learning Javascript), these solutions may be a bit simple/beginner level, but they do work and I think they're quite easy to read at least. Here we go!&lt;/p&gt;

&lt;h2&gt;
  
  
  Day One: Sonar Sweep
&lt;/h2&gt;

&lt;p&gt;(&lt;a href="https://adventofcode.com/2021/day/1"&gt;link&lt;/a&gt;)&lt;/p&gt;

&lt;h3&gt;
  
  
  Part One
&lt;/h3&gt;

&lt;p&gt;In this problem, we are given a whole heap of numbers separated by new lines, that represent the depth of a submarine. We need to count &lt;strong&gt;the number of times the depth measurement increases from the previous measurement.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The first thing to do is to convert the input we're given into a manageable format. First I copied the text from the input page into my Javascript file as a string literal and assigned it to a variable "input".&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const input = `159 ...
// etc!
6568`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then I collapsed the first 2000 lines in VS Code since that's how long it was. XD&lt;br&gt;
Next:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const arr = input.split("\n").map(Number);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This converts the input into an array of strings using the separator "\n" (new line), then converts each string into a number. Now we just need to initialise a counter and iterate through the array, checking whether each value is larger than the previous one.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;let count = 0;

for (let i = 1; i &amp;lt; arr.length; i++) {
  if (arr[i] &amp;gt; arr[i - 1]) count++;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We start with index 1 because index 0 doesn't have any previous value to measure against.&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(count);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now we can check the answer, which should be the value of 'count' :)&lt;/p&gt;

&lt;h3&gt;
  
  
  Part Two
&lt;/h3&gt;

&lt;p&gt;In this problem, we need to add each value to its previous and next values in a sliding window. Then we again need to give the number of times the resulting values increase.&lt;/p&gt;

&lt;p&gt;We already have the array ready to go, so now we just need to iterate through the list again starting with index 1.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;let count = 0;

for (let i = 1; i &amp;lt; arr.length - 2; i++) {
  let a = arr[i] + arr[i + 1] + arr[i + 2];
  let b = arr[i - 1] + arr[i] + arr[i + 1];
  if (a &amp;gt; b) count++;
}

console.log(count);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here we need to stop two indexes before the last index (i &amp;lt; arr.length - 2) because after that there won't be enough measurements to create a three-measurement sum. &lt;/p&gt;

&lt;p&gt;Ok, on to the next day :)&lt;/p&gt;

&lt;h2&gt;
  
  
  Day Two: Dive!
&lt;/h2&gt;

&lt;p&gt;(&lt;a href="https://adventofcode.com/2021/day/2"&gt;link&lt;/a&gt;)&lt;/p&gt;

&lt;h3&gt;
  
  
  Part One
&lt;/h3&gt;

&lt;p&gt;We're still in a submarine! But this time we need to learn how to steer it?? In this puzzle, we're again given input separated by new lines, but with added complexity. I won't get into detail as the puzzle instructions explain it very well.&lt;/p&gt;

&lt;p&gt;Basically, we need two counters: depth and horizontal position. These will be increased (or increased or decreased in the case of depth) as we iterate through the input. First off, we get organised by initialising our array and counters:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const arr = input.split("\n");

let depth = 0;
let horizontal = 0;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now we have an array of strings looking like ["forward 5", "down 5", "up 3"] etc.. We need to split up the word and the number, so that we can work with each separately. I put each instruction into its own nested array like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const newArr = arr.map((instruction) =&amp;gt; {
  return instruction.split(" ");
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now newArr will look something like: [["forward", "5"], ["down", "5"], ["up", "3"]]. All we have to do next is iterate through the array, checking the instruction and adjusting the associated counter accordingly. We can parse the number part of the instruction (which is currently a string at position [1] in each sub array) with parseInt(i[1]).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;for (let i of newArr) {
  const num = parseInt(i[1]);

  if (i[0] === "forward") {
    horizontal += num;
  }
  if (i[0] === "up") {
    depth -= num;
  }
  if (i[0] === "down") {
    depth += num;
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now all that remains is to provide the depth multiplied by horizontal position.&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(horizontal * depth);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Onwards!&lt;/p&gt;

&lt;h3&gt;
  
  
  Part Two
&lt;/h3&gt;

&lt;p&gt;Part two is pretty straightforward; we just need to adjust the for loop a tiny bit. First we reset the depth and horizontal values and add in a new value: aim.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;depth = 0;
horizontal = 0;
let aim = 0;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now "down" and "up" will modify aim rather than depth, and "forward" will both increase the horizontal position and increase depth by the given value multiplied by the current value of aim. Luckily our array is already set up :) So:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;for (let i of newArr) {
  const num = parseInt(i[1]);

  if (i[0] == "forward") {
    horizontal += num;
    depth += aim * num;
  }
  if (i[0] == "up") {
    aim -= num;
  }
  if (i[0] == "down") {
    aim += num;
  }
}

console.log(horizontal * depth);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And done!&lt;/p&gt;

&lt;p&gt;That was fun to write up, now I'm going to have a look at other people's cool answers and feel like a noob!&lt;/p&gt;

&lt;p&gt;Let me know if I should continue into days 3 &amp;amp; 4 👋&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>adventofcode</category>
      <category>codenewbie</category>
    </item>
    <item>
      <title>A Javascript fix for the 100vh problem on mobile screens</title>
      <dc:creator>Rachel</dc:creator>
      <pubDate>Fri, 19 Nov 2021 07:50:29 +0000</pubDate>
      <link>https://dev.to/rachelg/a-javascript-fix-for-the-100vh-problem-on-mobile-screens-9im</link>
      <guid>https://dev.to/rachelg/a-javascript-fix-for-the-100vh-problem-on-mobile-screens-9im</guid>
      <description>&lt;p&gt;Hi dev.to! &lt;/p&gt;

&lt;p&gt;I'm a software development student at Developers Institute NZ, and this is my first public post. 🎉&lt;/p&gt;

&lt;p&gt;I figured this would be the perfect place to share a slightly obscure fix that has helped me recently. A few weeks ago, my boss at the lovely cafe I work at on the weekends asked me if I'd be willing to take on some extra hours at work to help with their new landing page. I agreed, however, the brief turned out to be a little trickier than I'd first anticipated! My boss (who is also a graphic designer) had created a gorgeous, eye-catching full-page design. However, it only really works if the entire page is displayed on load, with no scroll bars.&lt;/p&gt;

&lt;p&gt;My first thought was to just make everything 100vh. However, of course it's never that simple - as I'm sure many people would have come across, 100vh is not always... 100vh. On some mobile browsers, most commonly Chrome and Safari on iOS, 100vh actually refers to outerHeight. This means the lower toolbar on the browser will not be taken into account, cutting off the last couple of rems of your design. While you can account for the difference using CSS, the view height will subsequently change as soon as the user starts scrolling down and the lower browser toolbar disappears.&lt;/p&gt;

&lt;p&gt;(An interesting fact I found while researching this is that this behaviour is completely intentional! Have a look at &lt;a href="https://nicolas-hoizey.com/articles/2015/02/18/viewport-height-is-taller-than-the-visible-part-of-the-document-in-some-mobile-browsers/#february-23rd-update"&gt;this blog&lt;/a&gt; from 2015 if you're interested.)&lt;/p&gt;

&lt;p&gt;While this isn't really an issue for most websites, there are a few different threads on the topic floating around. Unfortunately, CSS &lt;code&gt;fill-available&lt;/code&gt; wasn't working for me. The most interesting solution I found was &lt;a href="https://github.com/elementor/elementor/issues/630#issuecomment-578145331"&gt;this comment&lt;/a&gt; buried in a thread in Elementor's Github repo. It uses Javascript to get innerHeight and assign it to the min-height CSS property for the outer container of the design. In order to change the innerHeight when the user starts scrolling and the browser toolbars shrink, we use an event listener. This worked perfectly for the design of the cafe's landing page.&lt;/p&gt;

&lt;p&gt;Here is the solution I used, adapted from that comment:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// define a function that sets min-height of my-element to window.innerHeight:

const setHeight = () =&amp;gt; {
    document.getElementById("my-element").style.minHeight = window.innerHeight + "px"
};

// define mobile screen size:

let deviceWidth = window.matchMedia("(max-width: 1024px)");

if (deviceWidth.matches) {
// set an event listener that detects when innerHeight changes:

    window.addEventListener("resize", setHeight);

// call the function once to set initial height:

    setHeight();
}


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

&lt;/div&gt;



&lt;p&gt;If you're using Wordpress (which I was), the easiest way to insert this is to wrap it in a script tag and add it into an HTML component underneath ALL other content, and then remove all padding from it so no white space is visible. Depending on your design, theme, and plugins, you may also need to add more lines to the function to include any containers for which you'd usually need to re-state the 100vh rule, for example perhaps .elementor-container and .elementor-widget-wrap if you're using Elementor.&lt;/p&gt;

&lt;p&gt;While this is not the cheapest solution due to the event listener, it was exactly what I needed for this particular project. Hope someone else finds it useful or interesting! 👋&lt;/p&gt;

</description>
      <category>mobile</category>
      <category>javascript</category>
      <category>wordpress</category>
      <category>css</category>
    </item>
  </channel>
</rss>
