<?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: Tonko Mulder</title>
    <description>The latest articles on DEV Community by Tonko Mulder (@treggats).</description>
    <link>https://dev.to/treggats</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%2F91651%2F5fc1e7dd-1a3a-4ee9-ab58-a8257e5b08a1.jpeg</url>
      <title>DEV Community: Tonko Mulder</title>
      <link>https://dev.to/treggats</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/treggats"/>
    <language>en</language>
    <item>
      <title>Events, Listeners and Redis</title>
      <dc:creator>Tonko Mulder</dc:creator>
      <pubDate>Fri, 15 Jan 2021 22:38:00 +0000</pubDate>
      <link>https://dev.to/treggats/events-listeners-and-redis-1e4i</link>
      <guid>https://dev.to/treggats/events-listeners-and-redis-1e4i</guid>
      <description>&lt;p&gt;I have a project at work which uses Redis to handle the queues and the &lt;a href="https://github.com/beyondcode/laravel-websockets"&gt;Laravel websocket package&lt;/a&gt; by Freek van de Herten from &lt;a href="https://spatie.be/"&gt;Spatie&lt;/a&gt; and Marcel Pociot from &lt;a href="https://beyondco.de/"&gt;Beyond Code&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This all went fine for a long time, but hiccups started to come.&lt;/p&gt;

&lt;p&gt;The issue I was starting to see that sometimes events were not broadcasted, which was weird as it was working before. Eventually they stopped working altogether. I've been trying to debug this myself but at first I didn't got very far.&lt;/p&gt;

&lt;p&gt;After asking around on a course of action on how to handle this, I decided to try the power of open source. And so I created an &lt;a href="https://github.com/beyondcode/laravel-websockets/issues/219"&gt;issue&lt;/a&gt; on the Github issue tracker for the package.&lt;/p&gt;

&lt;p&gt;There were not a lot responses to it, mostly people trying to help me debug this issue.&lt;/p&gt;

&lt;h1&gt;
  
  
  Pairing
&lt;/h1&gt;

&lt;p&gt;I created the issue a bit before my holiday and upon returning I paired with a colleague to debug this ourselves. So at this point no broadcasting was being done and were thinking what would be causing this radical change.&lt;/p&gt;

&lt;h2&gt;
  
  
  Laravel patch updates
&lt;/h2&gt;

&lt;p&gt;I'm someone who tries to stay up to date with dependencies, so I figured there must be some version bump on which it all stopped working.&lt;/p&gt;

&lt;p&gt;Looking back in git history I saw that when it all worked the Laravel framework was on version &lt;code&gt;5.8.24&lt;/code&gt;. I figured that the issue probably originates in the Laravel framework, so I fixed composer to that version and ran composer update. And it all still worked, next step was to increment the patch version until it didn't work anymore.&lt;/p&gt;

&lt;p&gt;The patch version on which broadcasting stopped working was &lt;code&gt;5.8.25&lt;/code&gt; so I didn't have to look far. Looking at the release notes for that version one contribution stood out.&lt;/p&gt;

&lt;p&gt;PR &lt;a href="https://github.com/laravel/framework/pull/28904"&gt;#28904&lt;/a&gt; (Prevent event cache from firing multiple times the same event(s))&lt;/p&gt;

&lt;p&gt;To make sure this was the one that was causing problems, I copied the files from the previous patch release and voila everything worked!&lt;/p&gt;

&lt;h2&gt;
  
  
  Discover my Events
&lt;/h2&gt;

&lt;p&gt;After studying that PR I saw the &lt;code&gt;shouldDiscoverEvents()&lt;/code&gt; method and that got me thinking, I remembered seeing something about this when Taylor tweeted about being able to cache events and being able to discover them.&lt;/p&gt;

&lt;p&gt;To my dismay I discovered that I didn't have this method in my &lt;code&gt;EventServiceProvider&lt;/code&gt;. After adding this method and clearing my event cache I saw that my broadcasting was working again yay :D&lt;/p&gt;

&lt;h2&gt;
  
  
  Not so soon!
&lt;/h2&gt;

&lt;p&gt;Broadcasting was working again which was awesome, the thing I didn't mention that this was all using the sync queue connection driver. Which works, but is slower than when using Redis for example.&lt;/p&gt;

&lt;p&gt;With the Redis queue connection driver broadcasting wouldn't work. The day before I had a thought; Redis has multiple databases and I made sure that every Laravel application had it's own.&lt;/p&gt;

&lt;p&gt;Or so I thought...&lt;/p&gt;

&lt;p&gt;Turned out that I had the same Redis database for production and staging, which shouldn't be a problem since they all have prefixes right?&lt;/p&gt;

&lt;p&gt;Well.. only Horizon has these prefixes, the queue'd jobs which are stored in Redis do not.&lt;/p&gt;

&lt;h2&gt;
  
  
  Closing
&lt;/h2&gt;

&lt;p&gt;The problem that I faced with broadcasting was solved by doing the following things.&lt;/p&gt;

&lt;p&gt;add the &lt;code&gt;shouldDiscoverEvents()&lt;/code&gt; method to the &lt;code&gt;EventServiceProvider&lt;/code&gt; and let it return true&lt;br&gt;
made sure that the Redis database was only being used by the current application.&lt;br&gt;
The second point could also be fixed by using a prefix for the queue's. This has been proposed before, but it didn't gain any traction.&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>redis</category>
      <category>broadcasting</category>
      <category>websockets</category>
    </item>
    <item>
      <title>Combining Blade templates with Vue.js</title>
      <dc:creator>Tonko Mulder</dc:creator>
      <pubDate>Fri, 13 Oct 2017 20:14:42 +0000</pubDate>
      <link>https://dev.to/treggats/combining-blade-templates-with-vuejs-525d</link>
      <guid>https://dev.to/treggats/combining-blade-templates-with-vuejs-525d</guid>
      <description>&lt;p&gt;In a project that I am working on, there are currently two public facing parts.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Website&lt;/li&gt;
&lt;li&gt;Backoffice&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In a discussion about what (front-end) technique we should use. Vue.js being a big contender. But a big concern was &lt;em&gt;Search Engine Optimization&lt;/em&gt; for the website.&lt;/p&gt;

&lt;p&gt;Having no experience with prerender options (prerender.io, Nuxt.js) we chose to use the default template engine in Laravel projects (&lt;a href="https://laravel.com/docs/5.5/blade" rel="noopener noreferrer"&gt;Blade&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;I’d like to show how I went about and implemented this. Source code for an example project can be found on &lt;a href="https://github.com/Treggats/co-housing-blade-vuejs" rel="noopener noreferrer"&gt;Github&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Starting from scratch, I just created a fresh Laravel project with&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;composer create-project laravel/laravel co-housing-blade-vuejs&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The next step is to create some structure. Go to &lt;strong&gt;resources/views&lt;/strong&gt; and add a directory called backoffice. And in that directory create a view called index.blade.php&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%2Fpcxs7deqn8vnbf2mawyb.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%2Fpcxs7deqn8vnbf2mawyb.png" width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In that file reference the app.css and app.js, put the latter at the bottom of the body tag. Otherwise Vue won’t load. And put one div with an id of app in the body.&lt;/p&gt;

&lt;p&gt;Next add two controllers, &lt;strong&gt;PageController&lt;/strong&gt; &amp;amp; &lt;strong&gt;Backoffice\PageController&lt;/strong&gt; and update the current route to point to the main index method of the &lt;em&gt;PageController.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Also add the route for the index method for the backend &lt;em&gt;PageController&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Load the default welcome view in that method.&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%2F8hce7pykiqny5gxiquh8.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%2F8hce7pykiqny5gxiquh8.png" width="800" height="509"&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%2Faq76a22dwmri1huea1en.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%2Faq76a22dwmri1huea1en.png" width="800" height="527"&gt;&lt;/a&gt;Both controllers&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%2Fala8exga6xuzbmk0xmpn.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%2Fala8exga6xuzbmk0xmpn.png" width="800" height="563"&gt;&lt;/a&gt;Web routes&lt;/p&gt;

&lt;p&gt;By default a new Laravel project comes with an example Vue.js component, which is loaded in the &lt;em&gt;backoffice/index.blade.php&lt;/em&gt; template. So all that is needed to show the Vue.js template is to run&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;npm run dev || yarn run dev&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The result is that the ‘normal’ website is build using blade templates and that everything in the ‘backoffice’ route prefix is being rendered by Vue.js&lt;/p&gt;

&lt;p&gt;So in closing we have two different front-end techniques in use due to SEO concerns. In a next article I’ll be looking into alternatives to only use Vue.js in the front-end.&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>seo</category>
      <category>vue</category>
    </item>
    <item>
      <title>First steps with Elasticsearch &amp; Laravel</title>
      <dc:creator>Tonko Mulder</dc:creator>
      <pubDate>Tue, 04 Jul 2017 12:48:47 +0000</pubDate>
      <link>https://dev.to/treggats/first-steps-with-elasticsearch--laravel-3i3k</link>
      <guid>https://dev.to/treggats/first-steps-with-elasticsearch--laravel-3i3k</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F1%2AVXdzDpO_KNegDIdMdO1OkA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F1%2AVXdzDpO_KNegDIdMdO1OkA.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After working with Solr in past employment, I’ve alway been interested in indexing large amounts of data and processing that.&lt;/p&gt;

&lt;p&gt;So recently I was told to look into Elasticsearch and I’ve been following the &lt;a href="https://blog.madewithlove.be/post/how-to-integrate-your-laravel-app-with-elasticsearch" rel="noopener noreferrer"&gt;How to integrate your Laravel app with Elasticsearch&lt;/a&gt; post by &lt;a href="https://twitter.com/tony0x01" rel="noopener noreferrer"&gt;Tony Messias&lt;/a&gt; from &lt;a href="https://madewithlove.be" rel="noopener noreferrer"&gt;Made with love&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;As it turns out that it’s actually quite simple, the Eloquent model that needs to be indexed has a trait which contains a created and deleted event. These are actually Model observer events, which determine if a piece of data should be indexed by Elasticsearch.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;saved&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$model&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;elasticsearch&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;index&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
        &lt;span class="s1"&gt;'index'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$model&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getSearchIndex&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="s1"&gt;'type'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$model&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getSearchType&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="s1"&gt;'id'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$model&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'body'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$model&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;toSearchArray&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;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;deleted&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$model&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;elasticsearch&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nb"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
        &lt;span class="s1"&gt;'index'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$model&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getSearchIndex&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="s1"&gt;'type'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$model&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getSearchType&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="s1"&gt;'id'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$model&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;id&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;p&gt;The first part was about getting data into Elasticsearch, the second part is about getting that data from Elasticsearch and presenting it on the Laravel side. Tony’s article is using a repository to interact with Elasticsearch. In that repository the following method is present to do the searching part.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;searchOnElasticsearch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$query&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;array&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$instance&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Article&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="nv"&gt;$items&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;search&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
        &lt;span class="s1"&gt;'index'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$instance&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getSearchIndex&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="s1"&gt;'type'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$instance&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getSearchType&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="s1"&gt;'body'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
           &lt;span class="s1"&gt;'query'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
              &lt;span class="s1"&gt;'multi\_match'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
              &lt;span class="s1"&gt;'fields'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'title'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'body'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'tags'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
                    &lt;span class="s1"&gt;'query'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$query&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="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$items&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 returns an array with the data it retrieved from Elasticsearch, which in turn can be used by Laravel as a data source.&lt;/p&gt;

&lt;p&gt;So these were my first steps with Elasticsearch, I like how easy it actually was setting this up. Next is implementing this in a personal project, and trying to learn more about Elasticsearch in the meantime.&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>elasticsearch</category>
    </item>
  </channel>
</rss>
