<?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: Marcel Krčah</title>
    <description>The latest articles on DEV Community by Marcel Krčah (@mkrcah).</description>
    <link>https://dev.to/mkrcah</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%2F535748%2Fa6eac6ec-07de-49c6-be44-9a70f945aa53.jpg</url>
      <title>DEV Community: Marcel Krčah</title>
      <link>https://dev.to/mkrcah</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mkrcah"/>
    <language>en</language>
    <item>
      <title>Adding domain knowledge to code comments</title>
      <dc:creator>Marcel Krčah</dc:creator>
      <pubDate>Wed, 16 Dec 2020 20:16:10 +0000</pubDate>
      <link>https://dev.to/mkrcah/adding-domain-knowledge-to-code-comments-2pmf</link>
      <guid>https://dev.to/mkrcah/adding-domain-knowledge-to-code-comments-2pmf</guid>
      <description>&lt;p&gt;I started experimenting with adding domain knowledge to code comments. It turned out that such comments were super helpful to others. They even inspired others to write such comments themselves.  So if they are so useful, why is it that we don't write them more often?&lt;/p&gt;

&lt;h2&gt;
  
  
  A bit of context: Say hello to hybrid inverters
&lt;/h2&gt;

&lt;p&gt;To give a bit of context, I've been working on an application that calculates investment costs for photovoltaic (PV) systems. Specifically, I've been adding new investment logic for hybrid inverters. I knew what an inverter was: a device changing DC current to AC. However, I didn't know a thing about &lt;em&gt;hybrid&lt;/em&gt; inverters &amp;amp; how they relate to investments.&lt;/p&gt;

&lt;p&gt;So first, I needed to figure out what a hybrid inverter even was. I learned that if you install a PV system with a battery, you need a hybrid inverter. It turns out a hybrid inverter is a device that combines a solar power inverter &amp;amp; a battery power inverter into one. For the investment costs, a hybrid inverter relates to both the PV system &amp;amp; the battery system.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--kl8vN8si--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/3jjrm42az558qppu0c0x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kl8vN8si--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/3jjrm42az558qppu0c0x.png" alt="hybrid-inverter"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Updating the code &amp;amp; adding the comment
&lt;/h2&gt;

&lt;p&gt;Once I had hybrid inverters figured out, I noticed it was easier to understand the functional requirement at hand. Also, I could better understand the existing code &amp;amp; I was quick to update it. I ended up with this Typescript code:&lt;br&gt;
&lt;/p&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;GetInvestmentCost&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;forHybridInverter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="cm"&gt;/*...args...*/&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="cm"&gt;/*...body...*/&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="nx"&gt;forBatterySystem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="cm"&gt;/*...args...*/&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="cm"&gt;/*...body...*/&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="nx"&gt;forPVSystem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="cm"&gt;/*...args...*/&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="cm"&gt;/*...body...*/&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Out of the total time I spent on this update, most of the time went to understanding the domain background: the hybrid inverters &amp;amp; their relation to investment. This knowledge, specific for this particular feature, hadn't been captured anywhere. I also noticed that the domain knowledge was loaded in my mind, readily available for usage. So I added what I knew to the code as a comment. As brief &amp;amp; to the point as possible. It took a few minutes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="cm"&gt;/*
 * If you install a PV system with a battery, 
 * you need a hybrid inverter. A hybrid inverter 
 * combines a solar inverter &amp;amp; battery inverter 
 * into one device.
 * 
 * Now, for investment cost, we put the hybrid 
 * inverter separately, as it doesn't exclusively 
 * belong to neither the PV system costs nor 
 * the battery system cost. The investment cost
 * for the battery &amp;amp; PV system excludes
 * the cost of the hybrid inverter.
 * */&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;GetInvestmentCost&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;forHybridInverter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="cm"&gt;/*...args...*/&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="cm"&gt;/*...body...*/&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="nx"&gt;forBatterySystem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="cm"&gt;/*...args...*/&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="cm"&gt;/*...body...*/&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="nx"&gt;forPVSystem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="cm"&gt;/*...args...*/&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="cm"&gt;/*...body...*/&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It's not perfect, but it'll do. I aimed to bridge the gap between  the code &amp;amp; the domain. I assumed the next person looking at the code will understand the logic faster &amp;amp; thus make their change faster.&lt;/p&gt;

&lt;p&gt;There's another thing I aimed for: the explanation &amp;amp; the code now sit right next to each other. As &lt;a href="https://www.infoq.com/presentations/Simple-Made-Easy/"&gt;Rich Hickey explains&lt;/a&gt;, when we put related things together, we understand the system more easily. And so we add features and fix bugs quicker. But if we put related things apart, such as the code and the domain knowledge driving the code, the system is harder for us to understand. This scatteredness of things, these &lt;em&gt;inconsistent&lt;/em&gt; locations, is a form of complexity. It slows down our understanding of systems &amp;amp; speed of change.&lt;/p&gt;

&lt;h2&gt;
  
  
  More examples
&lt;/h2&gt;

&lt;p&gt;Encouraged, I added a bunch of other domain comments to the code I worked with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="cm"&gt;/*
 * With net metering, also called reverse-count metering, 
 * the meter rolls back when you inject energy back 
 * to the grid. The grid serves as a free &amp;amp; fully 
 * efficient virtual battery. 
 */&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;NetMeteringCashFlow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="cm"&gt;/*...args...*/&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
  &lt;span class="cm"&gt;/*...body...*/&lt;/span&gt; 
&lt;span class="p"&gt;}&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="cm"&gt;/*  
 * With market valorization policy, you are reimbursed 
 * for the energy injected into the grid, according 
 * to the injection tariff. For the energy consumed 
 * off the grid, you pay the regular off-take tariff. 
 * Both the injection tariff &amp;amp; the off-take are specific 
 * to your grid operator.
 */&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;MarketValorizationCashFlow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="cm"&gt;/*...args...*/&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
  &lt;span class="cm"&gt;/*...body...*/&lt;/span&gt; 
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Feedback from fellow developers
&lt;/h2&gt;

&lt;p&gt;I was curious what other devs thought about this, so I sent them a few snippets and asked about their opinion. Their answers were so interesting that I asked them if it's ok to include them here. They agreed, so here they are:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;There are so many concepts and business rules to be changed relatively often, adding more context to the right place is incredibly helpful. However, I also think doing this is difficult and I'm very interested to see how well will the comments age with coming time.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When asked more about the difficulty, he replied:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;My personal hypothesis for why I haven't been able to write such comments more is that for me (and I suspect many other developers), writing is a different skill from coding. I'm much less experienced at it and it's difficult for me to switch back and forth between. Because of the "free form". It also feels much less forgiving and more permanent than code. &lt;br&gt;&lt;br&gt;The remote work environment, like we have, with more asynchronous and written communication, may be very helpful in promoting this. In my previous jobs we preferred talking over writing, attempting to make all knowledge shared by implicit osmosis (extreme being pair/mob programming) rather than explicit knowledge base (extreme being almost complete asynchronicity like Gitlab culture).&lt;br&gt;
Like with anything interesting, there are constraints and trade-offs for both approaches, but the more I think about it, the more comments like these seem to worth pursuing and I'm excited to try it as well.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Another developer answered:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I am all for it. The downsides are hardly there. There is a maintenance burden for the comments, but that is usually removing/editing here or there. It also has the upside of assisting code review.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And another one:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I'm extremely in favor. I was looking for a value yesterday and was unsure of what it was from the ticket, and if it had a comment like the above, it may have been easier to decipher what that value actually did.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So it seems others find such comments also super helpful, but they see two possible issues: writing &amp;amp; maintenance.&lt;/p&gt;

&lt;h2&gt;
  
  
  The difficulty of writing
&lt;/h2&gt;

&lt;p&gt;The difficulty of writing resonates. I feel it too, especially since English is not my native language.  What has helped me is redirecting  attention to learning. It turns out that non-fiction writing is a skill I can try to improve. The best resource on non-fiction writing I have found so far has been &lt;a href="https://www.goodreads.com/book/show/20821371-the-sense-of-style"&gt;Steven Pinker's The Sense of Style&lt;/a&gt; (thanks to Gergely &lt;a href="https://blog.pragmaticengineer.com/on-writing-well/"&gt;for this tip&lt;/a&gt;).  The book is an eye-opener. It's an entertaining, practical &amp;amp; easy read that introduces basic concepts behind nonfictional writing. It puts logic &amp;amp; process &amp;amp; rules into the writing process. I like that.&lt;/p&gt;

&lt;h2&gt;
  
  
  Comments maintenance
&lt;/h2&gt;

&lt;p&gt;Now for the maintenance. Imagine I need to make a change to a complex code. So first, I need to understand the code. I try to get all the help I can get, such as looking into the code, the comments, reading docs &amp;amp; discussing with the team. Once I understand the code &amp;amp; the domain context, I can proceed and make the change. As I finish, I am about to move on to another problem. Now shall I invest a few minutes in writing (or updating) the comment or not?&lt;/p&gt;

&lt;p&gt;No matter how I decide now, the cost of gathering  knowledge has already been paid. To assess if to comment or not, I need to consider only the cost of writing the comment, not the cost of obtaining the knowledge for the comment.&lt;/p&gt;

&lt;p&gt;So let's say I decide to invest my time and write the comment as part of the change A.  With the comment, the next person updating the code with the change B will have most of the explanation they need already at hand. They wouldn't need to pay as much time as I did to understand the code. So for the two of us, the total return on my investment would be positive &amp;amp; high.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--IZBWBvY5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/r5f008vw60ew7noau5jn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--IZBWBvY5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/r5f008vw60ew7noau5jn.png" alt="time-saved-investment-yes"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What if I decide to save time &amp;amp; not write the comment? The upside is that I will deliver the change A faster since I am not writing the comment. The downside is that the next person would need to start from scratch for their change B. They would need to figure out all the heavy stuff again. So for the two of us, the total return on my investment would be negative.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--aT8AG2g1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ro29i26fxzuq58nxvfiu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--aT8AG2g1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ro29i26fxzuq58nxvfiu.png" alt="time-saved-investment-no"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now you may wonder: it's one change, does it matter? Perhaps not much for one change. But imagine more changes, more functions &amp;amp; more developers. The savings start to compound.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--g9oVUQZF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/j7gpt8xthi8qu13kbr1w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--g9oVUQZF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/j7gpt8xthi8qu13kbr1w.png" alt="investment-change-more"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A friend remarked:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Taking the time to explain something for the next dev is usually even more of a good idea because the next dev to read the code will probably be yourself, so even when you feel selfish, you can think of it as a gift to your future self.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Conclusion to this experiment
&lt;/h2&gt;

&lt;p&gt;All in all, it seems to me that if we adopt domain comments throughout the codebase, we accelerate the engineering pace. Perhaps even significantly. So for now, I'll try to write more of them and see how it goes.&lt;/p&gt;




&lt;h2&gt;
  
  
  Won't comments get out of sync?
&lt;/h2&gt;

&lt;p&gt;It seems that domain comments don't change that often. A hybrid inverter's relation to a PV/battery system stays the same if we refactor imperative code into functional code or extract some code into a reusable component. Also, we can always try to encourage consistency, for example, via code reviews.&lt;/p&gt;

&lt;h2&gt;
  
  
  Shouldn't good code document itself?
&lt;/h2&gt;

&lt;p&gt;When discussing the domain comments with a friend of mine, he made this remark. I find it spot on:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Yeah, if code is so clear that it needs no further comments, that is great. But honestly, if you look at code, how often does that encapsulate everything you've learned about the domain. If it doesn't, why not add your knowledge in the comments?&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;em&gt;Thanks a lot to Reinier, Peter, and Julien for reading a draft of the article &amp;amp; giving feedback.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Follow me on &lt;a href="https://twitter.com/mkrcah"&gt;Twitter&lt;/a&gt; or subscribe to the &lt;a href="http://eepurl.com/c-Pl6r"&gt;newsletter&lt;/a&gt;&lt;/p&gt;

</description>
      <category>codequality</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Drawings for technical explanations: my first steps</title>
      <dc:creator>Marcel Krčah</dc:creator>
      <pubDate>Tue, 08 Dec 2020 21:28:55 +0000</pubDate>
      <link>https://dev.to/mkrcah/drawings-for-technical-explanations-my-first-steps-3bg2</link>
      <guid>https://dev.to/mkrcah/drawings-for-technical-explanations-my-first-steps-3bg2</guid>
      <description>&lt;p&gt;For longer, I felt that something was missing in my communication, something between writing and talking. There's a whiteboard, but that's not an option for me since I work remotely. Then there are online diagramming tools, but they felt cumbersome to use: it took me long to draw &amp;amp; I often couldn't find the shape I was looking for.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--JNY-iZ5P--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/9aqtlsc2jciakg0g7fac.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--JNY-iZ5P--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/9aqtlsc2jciakg0g7fac.png" alt="First steps"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Two years ago, I stumbled upon Doug's &lt;a href="https://www.verbaltovisual.com/our-courses/"&gt;course on sketch noting&lt;/a&gt;. I learned the basics of technical drawings, but it didn't occur to me I could use drawings for software-related concepts. Then a few weeks ago, I stumbled upon &lt;a href="https://jvns.ca/"&gt;Julia's blog&lt;/a&gt; and her technical drawings. It turns out she wrote &lt;a href="https://jvns.ca/#on-writing-comics---zines"&gt;a bunch of articles&lt;/a&gt; where she explains her drawing process. Inspired, I read them all. And then, the final drop: &lt;a href="https://m.signalvnoise.com/how-i-wrote-shape-up/"&gt;Ryan's article on how he wrote ShapeUp&lt;/a&gt;. I was hooked &amp;amp; determined to give drawings a try.&lt;/p&gt;

&lt;p&gt;So I bought a used iPad 7 and an Apple Pencil 1st generation. I installed Notability: a simple note-taking app that both Julia and Ryan used in their beginnings. And I started experimenting.&lt;/p&gt;

&lt;p&gt;A few days ago we finished a large refactoring project. I thought that would be a good time to experiment. So I decided to use drawings to explain the thinking process behind the big refactoring we did. Here are a few drawings from the talk:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Bx_HPdl9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/4i4gg05lxsbuz9rciw99.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Bx_HPdl9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/4i4gg05lxsbuz9rciw99.png" alt="Something missing"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I didn't know what to expect. I was surprised to find out that my coworkers enjoyed the talk &amp;amp; they were quick to understand the driving principles behind the project. So it seems the drawings worked well. I also noticed I liked the process of making the talk: I could express myself better &amp;amp; it was fun.&lt;/p&gt;

&lt;p&gt;It's hard to image now going back to the world without the drawings. Something clicked. I think I'm going to experiment with them more.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This post was originally posted at &lt;a href="https://www.marcel.is/drawings-first-steps/"&gt;marcel.is&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>writing</category>
      <category>productivity</category>
      <category>ipad</category>
    </item>
  </channel>
</rss>
