<?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: Eyal Gilstron, Senior Manager</title>
    <description>The latest articles on DEV Community by Eyal Gilstron, Senior Manager (@eyalgilstron).</description>
    <link>https://dev.to/eyalgilstron</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%2F304079%2F6018d82f-14a3-4978-91db-0dac4fa12e17.png</url>
      <title>DEV Community: Eyal Gilstron, Senior Manager</title>
      <link>https://dev.to/eyalgilstron</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/eyalgilstron"/>
    <language>en</language>
    <item>
      <title>Caching Approaches</title>
      <dc:creator>Eyal Gilstron, Senior Manager</dc:creator>
      <pubDate>Tue, 07 Jan 2020 09:05:25 +0000</pubDate>
      <link>https://dev.to/eyalgilstron/caching-approaches-3amh</link>
      <guid>https://dev.to/eyalgilstron/caching-approaches-3amh</guid>
      <description>&lt;h2&gt;
  
  
  Intro
&lt;/h2&gt;

&lt;p&gt;Caching is storing the result of an operation so that future requests are served faster. Anything that might be slow to retrieve, can benefit if you store your data in advance, for future reuse of the time computed data.&lt;br&gt;
&lt;strong&gt;In this article I will talk a bit on the major types of caching, but I will focus more on Server-Side Caching.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  When do we need to cache?
&lt;/h2&gt;

&lt;p&gt;• When computation runs multiple times.&lt;br&gt;
• When computation is slow.&lt;br&gt;
• When your hosted provider charges per database access – to save money.&lt;br&gt;
• When we can predict and reuse the same output of the computation for a specific input, to reduce the need to recompute every time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Major types of caching (in a nutshell)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Server Cache&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Store queries, content, code on one or more servers. It's controlled by the server (not by the client).&lt;/p&gt;

&lt;p&gt;CDN Caching - CDN is a Content Delivery Network, actually it's a cluster of servers that caches content that’s loaded using the server that’s closest to the end user for faster loading times.&lt;/p&gt;

&lt;p&gt;Object Caching: Storing database queries in the back-end for a quick retrieval on page loads.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Client Cache&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I want to focus here on Web Caching: Site, Browser, Proxy and Gateway.&lt;/p&gt;

&lt;p&gt;A site cache, or also known as a page cache, is a mechanism that temporarily stores data such as web pages or media content when a web page is loaded for the first time.&lt;/p&gt;

&lt;p&gt;A browser cache is also a type of site caching. It works in the same way and it’s a cache mechanism that’s built into a browser such as Local Storage, Session Storage and cookies.&lt;/p&gt;

&lt;p&gt;Browser caching is controlled at the individual user level. Proxy and gateway is on a much larger scale.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Distributed Cache&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Used by the big web sites like YouTube, Google web apps, Facebook and more.&lt;/p&gt;

&lt;p&gt;Allow synchronization of distributed cache memory.&lt;/p&gt;

&lt;p&gt;Allows the web servers to pull and store from distributed server’s memory.&lt;/p&gt;

&lt;p&gt;Allow the web server to simply serve pages and avoid cases such 'out of memory' issues. Made up of a cluster of cheaper machines only serving up memory.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common in-memory data stores
&lt;/h2&gt;

&lt;p&gt;Redis and Memcached are the most common open-source in-memory data stores.&lt;br&gt;
Memcached has high-performance distributed memory cache service, and Redis is an open-source key value store. Similar to Memcached, Redis stores most of the data in the memory.&lt;/p&gt;

&lt;p&gt;You should read this &lt;a href="https://medium.com/@Alibaba_Cloud/redis-vs-memcached-in-memory-data-storage-systems-3395279b0941"&gt;blog&lt;/a&gt; before you pick one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Let's now focus on the Server-side Caching
&lt;/h2&gt;




&lt;h2&gt;
  
  
  Very naive and simple example of caching to understand cache hit/miss
&lt;/h2&gt;

&lt;p&gt;// Using Hashtable&lt;br&gt;
var request = "someRequest";&lt;br&gt;
var result; // Init it with default value...&lt;br&gt;
if (myCache.ContainsKey(request)) &lt;br&gt;
   result = myCache[request]; // Cache Hit - Faster&lt;br&gt;
else&lt;br&gt;
{&lt;br&gt;
 newVal = dbRead(); // Cache Miss - Slower&lt;br&gt;
 myCache.Add(request, newVal);&lt;br&gt;
 result = newVal;&lt;br&gt;
}&lt;br&gt;
return result;&lt;/p&gt;

&lt;h2&gt;
  
  
  Caching Approaches
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;No Caching – perform a database read every time we need to do query.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Naive caching - performs a database read just on cache misses. be careful folks as this method can trigger a bug, for example: when the front page becomes out of date.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Clear Cache - just on cache misses we need to do a database read. No potential bugs expected. (If its' done right)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Refresh cache - rarely performs database reads on page views, only on the initialization of the application. Hence the cache is empty and that first page view, and the following pages are cached. This generates one database read per submission.&lt;br&gt;
Using this approach reduces the hits so that a page view does not hit the database hardly ever, and that's a nice thing to have.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update cache - The fastest option, does zero database reads ever. This is slightly better than the forth one.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  I created a snip to emphasis the fifth approach
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--BuVT-PNc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/26qxl53a9tdg380bkjqd.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--BuVT-PNc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/26qxl53a9tdg380bkjqd.JPG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hence, the trade off will be then the faster but has complexity of inserts vs. slower database reads.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Caching Models:&lt;/strong&gt;
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Cache Aside
&lt;/h2&gt;

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

&lt;p&gt;Pros: cache only what we need.&lt;br&gt;
Cons: cache misses are expensive and implementation is complex.&lt;/p&gt;

&lt;h2&gt;
  
  
  Read Through
&lt;/h2&gt;

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

&lt;p&gt;Pros: cache only what we need, transparent to the application.&lt;br&gt;
Cons: cache misses are expensive, reliability.&lt;/p&gt;

&lt;h2&gt;
  
  
  Write Through
&lt;/h2&gt;

&lt;p&gt;Data is written to the cache and the real DB at the same time. The good thing here is that I/O completion is only confirmed once the data has been written to both places.&lt;/p&gt;

&lt;p&gt;Advantage: fast retrieval while making sure the data is in the real DB and is not lost in case the cache is disrupted.&lt;/p&gt;

&lt;p&gt;Disadvantage: Writing data will experience latency as you have to write to two places every time.&lt;/p&gt;

&lt;p&gt;When should I use it?&lt;/p&gt;

&lt;p&gt;Good for apps that write and then reread data frequently. This will result in slightly higher write latency but low read latency. Spend a bit longer writing once, but then benefit from reading frequently with low latency.&lt;/p&gt;

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

&lt;p&gt;Pros: data is always up to date.&lt;br&gt;
Cons: write are expensive, redundant data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Write Behind
&lt;/h2&gt;

&lt;p&gt;Data is written to the cache and Then I/O completion is confirmed. The data is then typically also written to the real DB in the background, but the completion confirmation is not blocked on that.&lt;/p&gt;

&lt;p&gt;Advantage: Low latency and high throughput for write-intensive applications.&lt;/p&gt;

&lt;p&gt;Disadvantage: A risk to data availability because the cache could fail (and result in  data loss) before the data is persisted to the real DB. This results in the data being lost.&lt;/p&gt;

&lt;p&gt;When should I use it?&lt;/p&gt;

&lt;p&gt;To achieve best performance for mixed workloads as both read and write I/O have similar response time levels. Down to earth, you can add resiliency by duplicating writes to reduce the likelihood of data loss.&lt;/p&gt;

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

&lt;p&gt;Pros: no write penalty, reduce load on storage.&lt;br&gt;
Cons: reliability, lack of consistency.&lt;/p&gt;

&lt;h2&gt;
  
  
  Write Around
&lt;/h2&gt;

&lt;p&gt;Data is written only to the real DB without writing to the cache.&lt;br&gt;
I/O completion is confirmed as soon as the data is written to the real DB.&lt;/p&gt;

&lt;p&gt;Advantage: Good for not flooding the cache with data that may not subsequently be reread.&lt;/p&gt;

&lt;p&gt;Disadvantage: Reading recently written data will result in a cache miss (hence a higher latency) because the data can only be read from the slower real DB.&lt;/p&gt;

&lt;p&gt;When should I use it?&lt;/p&gt;

&lt;p&gt;When accessing applications that don’t frequently re-read recently written data. This will result in lower write latency but higher read latency which is an acceptable trade-off for these scenarios.&lt;/p&gt;

&lt;p&gt;I hope these help you folks (:&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Speed up the development process without having a degradation in code quality</title>
      <dc:creator>Eyal Gilstron, Senior Manager</dc:creator>
      <pubDate>Mon, 30 Dec 2019 11:22:00 +0000</pubDate>
      <link>https://dev.to/eyalgilstron/speed-up-the-development-process-without-having-a-degradation-in-code-quality-358g</link>
      <guid>https://dev.to/eyalgilstron/speed-up-the-development-process-without-having-a-degradation-in-code-quality-358g</guid>
      <description>&lt;h2&gt;
  
  
  Intro
&lt;/h2&gt;

&lt;p&gt;Almost every development team is facing questions, like: How to enhance the quality of our code? How can I speed up the development process without having a degradation in the code quality?&lt;/p&gt;

&lt;h2&gt;
  
  
  "Before you implement, write the test" (Microsoft Research)
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Why should I test?
&lt;/h2&gt;

&lt;p&gt;It's important to understand: tests don't Improve quality, developers do.&lt;br&gt;
JavaScript development could easily go to hell if the right conventions are not followed. This makes it necessary to utilize the right development and unit testing tools.&lt;/p&gt;

&lt;p&gt;Pre-work - Writing tests first give you a clearer view on your API design.&lt;br&gt;
It makes you think of the special cases in your algorithm.&lt;/p&gt;

&lt;p&gt;Do you as a developer understand the problem enough to articulate in code all critical component requirements ?&lt;/p&gt;

&lt;p&gt;You cannot remember all features that need testing. After making a change to refactor as an example: add new features, remove features and so on...&lt;br&gt;
Automatically prevent broken builds from being deployed to production by testing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Testing the Client vs. Testing the Back-end
&lt;/h2&gt;

&lt;p&gt;Client tests focus on testing the usability and responsiveness of an application, whereas the back-end unit testing frameworks, focus on testing business logic and other micro-services.  You should test them both !&lt;/p&gt;

&lt;h2&gt;
  
  
  Do I need the browser for these tests?
&lt;/h2&gt;

&lt;p&gt;Not really, JavaScript unit tests for front-end mainly run on actual or headless browsers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understand the levels of testing (Microsoft Test Taxonomy)
&lt;/h2&gt;

&lt;h2&gt;
  
  
  L0/L1 - Unit tests
&lt;/h2&gt;

&lt;p&gt;L0 - Broad class of fast in-memory unit tests. A L0 test is a unit test to most people. That is a test that depends on code in the assembly under test and nothing else.&lt;br&gt;
L1 - A L1 test might require the assembly plus SQL or the file system.&lt;/p&gt;

&lt;h2&gt;
  
  
  L2/L3 - Functional tests
&lt;/h2&gt;

&lt;p&gt;L2 - Functional tests run against "testable" service deployment. It is a functional test category that requires a service deployment but may have key service dependencies stubbed out in some way.&lt;br&gt;
L3 - This is a restricted class of integration tests that run against production. They require a full product deployment.&lt;/p&gt;

&lt;p&gt;Other Types of Testing that I will not talk about it in this article are:&lt;/p&gt;

&lt;p&gt;Beta Tests&lt;br&gt;
Alpha Tests&lt;br&gt;
Regression Tests&lt;br&gt;
Buddy Tests&lt;/p&gt;

&lt;h2&gt;
  
  
  Shift-Left
&lt;/h2&gt;

&lt;p&gt;This terminology means that we want more L0/L1 tests compare to the L2/3 tests. We want more unit tests, easy to write, easy to maintain and less overhead.&lt;/p&gt;

&lt;h2&gt;
  
  
  Determining the code coverage types
&lt;/h2&gt;

&lt;p&gt;Function coverage - Has each one of your functions in your program been called?&lt;/p&gt;

&lt;p&gt;Statement coverage - Has each statement in the program been executed?&lt;/p&gt;

&lt;p&gt;Branch coverage - Has each branch of each control structure, such as in 'if' and 'case' statements been executed? For example, given an 'if' statement, have both the true and false branches been executed?&lt;/p&gt;

&lt;p&gt;Condition coverage - Has each Boolean sub-expression evaluated both to true and false?&lt;/p&gt;

&lt;h2&gt;
  
  
  Review the Most common Frameworks and testing environments (There are many more, focus on the common ones)
&lt;/h2&gt;

&lt;p&gt;First you must distinguish between the Test Framework to the Runner environment itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  Jest
&lt;/h2&gt;

&lt;p&gt;is a test runner, assertion and mocking library - basically, a JavaScript unit testing framework. Single framework fit for NodeJS, VueJS, React, Angular and other Babel based projects. Well documented. Jest provides also Snapshot testing an ability to create a snapshot of a component during run-time and compare it with a previously created 'snapshot'. With live snapshots, it allows managing tests with larger objects.&lt;/p&gt;

&lt;h2&gt;
  
  
  Enzyme
&lt;/h2&gt;

&lt;p&gt;is a JavaScript test utility for React applications that enables swift testing and interacting with elements. Enzyme is created by Airbnb. Both Jest and Enzyme are designed to test React applications. However, Jest works with any JavaScript applications like Angular and others, Enzyme is created for React. Jest, on its own, without Enzyme can render components and perform Snapshot testing as well. It is just that, Enzyme adds additional functionality to the testing. Jest and Enzyme are complementary tools that integrate well to provide effective test results.&lt;/p&gt;

&lt;h2&gt;
  
  
  Karma
&lt;/h2&gt;

&lt;p&gt;is the default test runner for Angular applications. Karma includes the option to test the code on several browsers and even devices to ensure smooth operation of the code on the supported platforms.&lt;/p&gt;

&lt;h2&gt;
  
  
  Jasmine
&lt;/h2&gt;

&lt;p&gt;is a Behavior-Driven Development (BDD) framework which enables clean and understandable Syntax for writing test cases making the process easy. It does not depend upon any other JavaScript frameworks. Alongside Karma, Jasmine is the recommended testing framework for Angular, and it actually doesn't require a DOM.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mocha
&lt;/h2&gt;

&lt;p&gt;is a JavaScript based automated test framework meant for testing applications that run using Node.js. Mocha is very common today.&lt;/p&gt;

&lt;h2&gt;
  
  
  Selenium
&lt;/h2&gt;

&lt;p&gt;WebDriver is the most widely accepted automation testing framework for web-applications, mainly for UI tests and for end to end tests.&lt;/p&gt;

&lt;h2&gt;
  
  
  Protractor
&lt;/h2&gt;

&lt;p&gt;framework dedicated to testing Angular applications. It is an end to end automation testing framework dedicated for testing your angular application on a real browser. It means that it is making automated interaction just like the real user.&lt;/p&gt;

&lt;h2&gt;
  
  
  React Testing Library
&lt;/h2&gt;

&lt;p&gt;builds on top of DOM Testing Library by adding APIs for working with React components. Comes to solve the problem while you want your tests to avoid including implementation details of your components and rather focus on making your tests give you the confidence for which they are intended. As part of this, you want your test base to be maintainable in the long run so refactors of your components (changes to implementation but not functionality) don't break your tests and slow you and your team down!&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion, How to pick the right one for my Teams?
&lt;/h2&gt;

&lt;p&gt;It's really depends on your needs and your JavaScript framework/Library that you picked for your project. Let me share with you my opinion from the years that I managed development teams, for Angular I will vote Karma &amp;amp; Jasmine, whereas for React I will vote Jest and Enzyme and of course to enhance the power of your tests I will add React Testing Library as well.&lt;/p&gt;

&lt;p&gt;References &amp;amp; Links:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.microsoft.com/en-us/azure/devops/learn/devops-at-microsoft/shift-left-make-testing-fast-reliable"&gt;https://docs.microsoft.com/en-us/azure/devops/learn/devops-at-microsoft/shift-left-make-testing-fast-reliable&lt;/a&gt;&lt;br&gt;
&lt;a href="https://jestjs.io/"&gt;https://jestjs.io/&lt;/a&gt;&lt;br&gt;
&lt;a href="https://karma-runner.github.io/latest/index.html"&gt;https://karma-runner.github.io/latest/index.html&lt;/a&gt;&lt;br&gt;
&lt;a href="https://jasmine.github.io/"&gt;https://jasmine.github.io/&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/airbnb/enzyme"&gt;https://github.com/airbnb/enzyme&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.robinwieruch.de/react-testing-jest-enzyme"&gt;https://www.robinwieruch.de/react-testing-jest-enzyme&lt;/a&gt;&lt;br&gt;
&lt;a href="https://testing-library.com/docs/react-testing-library/intro"&gt;https://testing-library.com/docs/react-testing-library/intro&lt;/a&gt;&lt;br&gt;
&lt;a href="http://definitiontech.co/top-4-unit-testing-tools-for-angular-and-react-applications/"&gt;http://definitiontech.co/top-4-unit-testing-tools-for-angular-and-react-applications/&lt;/a&gt;&lt;br&gt;
&lt;a href="https://mochajs.org/"&gt;https://mochajs.org/&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.protractortest.org/#/"&gt;https://www.protractortest.org/#/&lt;/a&gt;&lt;br&gt;
&lt;a href="https://applitools.com/tutorials/selenium-javascript.html"&gt;https://applitools.com/tutorials/selenium-javascript.html&lt;/a&gt;&lt;br&gt;
&lt;a href="https://medium.com/@richbray/why-should-you-write-tests-910a3175d33c"&gt;https://medium.com/@richbray/why-should-you-write-tests-910a3175d33c&lt;/a&gt;&lt;br&gt;
&lt;a href="https://en.wikipedia.org/wiki/Code_coverage"&gt;https://en.wikipedia.org/wiki/Code_coverage&lt;/a&gt;&lt;br&gt;
&lt;a href="https://help.crossbrowsertesting.com/selenium-testing/getting-started/javascript/"&gt;https://help.crossbrowsertesting.com/selenium-testing/getting-started/javascript/&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.guru99.com/code-coverage.html"&gt;https://www.guru99.com/code-coverage.html&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
