<?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>Forem: Mihail Marian</title>
    <description>The latest articles on Forem by Mihail Marian (@mihailthebuilder).</description>
    <link>https://forem.com/mihailthebuilder</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%2F553293%2Faaa579e6-1df0-4dd3-a8ed-bd45aab60f09.png</url>
      <title>Forem: Mihail Marian</title>
      <link>https://forem.com/mihailthebuilder</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/mihailthebuilder"/>
    <language>en</language>
    <item>
      <title>My case against running containers in tests</title>
      <dc:creator>Mihail Marian</dc:creator>
      <pubDate>Thu, 20 Mar 2025 19:27:36 +0000</pubDate>
      <link>https://forem.com/mihailthebuilder/my-case-against-running-containers-in-tests-49m1</link>
      <guid>https://forem.com/mihailthebuilder/my-case-against-running-containers-in-tests-49m1</guid>
      <description>&lt;p&gt;I've been working with &lt;a href="https://testcontainers.com/?language=go" rel="noopener noreferrer"&gt;Testcontainers&lt;/a&gt; for over 3 years in my day job. &lt;br&gt;
Initially I bought into the idea - being able to run service tests locally, with realistic mocks for your external dependencies. But I've changed my opinion.&lt;/p&gt;

&lt;p&gt;The main problem is that they &lt;strong&gt;require a fair amount of setup and maintenance&lt;/strong&gt;. Plenty of code will be written, so you need to figure out the right pattern for scaling it. You'll encounter issues with image downloads (there are some beefy images out there), or container instantiation. Especially if you have machines with multiple OSes, or if you run these tests in your CI/CD. And troubleshooting is a pain - often your only recourse is going through the logs of those containers, which is not straightforward.&lt;/p&gt;

&lt;p&gt;Because of the effort involved, we ended up with service tests that only covered the same happy path that our end-to-end test did. WTF testing pyramid, I know, but the reality is that we needed to deliver features - it's hard to justify spending a whole day on the service tests (which happened anyway).&lt;/p&gt;

&lt;p&gt;Speaking of reality, &lt;strong&gt;I didn't feel like these tests gave me that much reassurance on what would happen in a deployed environment&lt;/strong&gt;. I doubt the containers for our dependencies could replicate how cloud-native services &lt;br&gt;
actually perform - a DynamoDB image wouldn't have the eventual consistency of the actual service, for example. Then there's the configuration that we added to those cloud resources via Terraform; you can't reflect that in &lt;br&gt;
the service tests either.&lt;/p&gt;

&lt;p&gt;Okay, rant over. But &lt;strong&gt;what is the alternative?&lt;/strong&gt; I propose a combination of two things. &lt;/p&gt;

&lt;p&gt;Numero uno - in your unit test suite, make sure you have tests that run through your entire application, as your service test would've done, with only the external dependency touchpoints being mocked.&lt;/p&gt;

&lt;p&gt;Numero dos - create one/multiple playground environment where developers can quickly deploy their branches.&lt;/p&gt;

&lt;p&gt;I probably missed out some edge cases where this wouldn't work. But I hope my ramblings managed to convince you, my dear reader, to think carefully before deciding to add container-based service tests.&lt;/p&gt;

</description>
      <category>docker</category>
      <category>testing</category>
      <category>aws</category>
      <category>cloud</category>
    </item>
    <item>
      <title>The filesystem - a quick &amp; dirty way to store temp data in your API</title>
      <dc:creator>Mihail Marian</dc:creator>
      <pubDate>Fri, 14 Mar 2025 19:20:18 +0000</pubDate>
      <link>https://forem.com/mihailthebuilder/the-filesystem-a-quick-dirty-way-to-store-temp-data-in-your-api-30jc</link>
      <guid>https://forem.com/mihailthebuilder/the-filesystem-a-quick-dirty-way-to-store-temp-data-in-your-api-30jc</guid>
      <description>&lt;p&gt;I have an API service for a &lt;a href="https://forecastsheets.com/" rel="noopener noreferrer"&gt;Google Sheets add-on&lt;/a&gt; that I built, and I wanted&lt;br&gt;
to temporarily store some request metadata that I started collecting in the client.&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%2Fphocphlkqdtzv4farvpa.gif" 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%2Fphocphlkqdtzv4farvpa.gif" alt="Generating forecasts on time series data in Google Sheets" width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;How the add-on works. The API generates the forecast data.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The service was built with &lt;a href="https://django-ninja.dev/" rel="noopener noreferrer"&gt;Django Ninja&lt;/a&gt;, and it's not connected to a database. I thought about setting one up for this feature. But I couldn't be bothered dealing with the configuration and the migrations. I wasn't sure how long I'd be collecting this data for.&lt;/p&gt;

&lt;p&gt;I then considered dumping the metadata in the logs. The problem with that approach is that it's a hassle to aggregate all the relevant messages. I was planning to move the information to another place to do some analysis.&lt;/p&gt;

&lt;p&gt;I briefly reflected on a global variable as well, but I was worried about the memory management.&lt;/p&gt;

&lt;p&gt;And then, at last, I got to the most robust solution in the galaxy - the filesystem. I would store each piece of request metadata in a separate file, so as to avoid issues with concurrent writes. And, I would expose&lt;br&gt;
an endpoint in the API that combines all those files to show me all of the data.&lt;/p&gt;

&lt;p&gt;Voilà the code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;request&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
  &lt;span class="c1"&gt;# at the end, before I return the response
&lt;/span&gt;  &lt;span class="n"&gt;entry&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;timestamp&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;isoformat&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
          &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;request_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;request_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;metadata&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;REQUESTS_DIR&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;request_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;.json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;w&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dump&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;

&lt;span class="c1"&gt;# decorator to authenticate with API key header
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_logs&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
  &lt;span class="n"&gt;requests&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;filename&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;glob&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;glob&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;REQUESTS_DIR&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/*.json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="c1"&gt;# Add filename as id for reference
&lt;/span&gt;                &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;basename&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;.json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;JSONDecodeError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="k"&gt;pass&lt;/span&gt;

    &lt;span class="c1"&gt;# Sort by timestamp
&lt;/span&gt;    &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;timestamp&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With that deployed, I can now fetch all of the data in my API's OpenAPI docs. Django Ninja generates this page automatically for me. Lovely jubbly!&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%2Fstevxrlb1r40xvyexlkh.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%2Fstevxrlb1r40xvyexlkh.png" alt="OpenAPI endpoints" width="800" height="428"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The OpenAPI endpoints&lt;/em&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%2F488t8zbwf5ulaw2sh9r4.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%2F488t8zbwf5ulaw2sh9r4.png" alt="Swagger response for fetching all the requests metadata" width="800" height="447"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The OpenAPI response for the endpoint I just created&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;I started this blog because I wanted to have conversations on topics that I find interesting. So, feel welcome to reach out to me, even if to challenge my perspective. &lt;a href="https://linkedin.com/in/mihailmarian" rel="noopener noreferrer"&gt;I'm on LinkedIn&lt;/a&gt;; please add a message when you connect. &lt;/p&gt;

</description>
      <category>django</category>
      <category>database</category>
      <category>datastructures</category>
      <category>api</category>
    </item>
    <item>
      <title>How I switched to a software engineering career, for free</title>
      <dc:creator>Mihail Marian</dc:creator>
      <pubDate>Fri, 21 Feb 2025 13:28:48 +0000</pubDate>
      <link>https://forem.com/mihailthebuilder/how-i-switched-to-a-software-engineering-career-for-free-59j6</link>
      <guid>https://forem.com/mihailthebuilder/how-i-switched-to-a-software-engineering-career-for-free-59j6</guid>
      <description>&lt;p&gt;5 years ago, I made the decision to become a software engineer. It wasn't an obvious choice. I had been flailing around until that point,&lt;br&gt;
exploring different careers - sales, financial analyst, financial advisor, bookkeeper, and quantity surveyor.&lt;/p&gt;

&lt;p&gt;Odd bunch, eh? Well, I couldn't stick to any of them.&lt;/p&gt;

&lt;p&gt;What I did consistently do, throughout all that time, was write code. I created little scripts in Python to automate personal tasks. I built websites in Django to test out startup ideas. I read the &lt;a href="https://nostarch.com/python-crash-course-3rd-edition" rel="noopener noreferrer"&gt;Python Crash Course&lt;/a&gt; and &lt;a href="https://nostarch.com/automatestuff2" rel="noopener noreferrer"&gt;Automating the Boring Stuff with Python&lt;/a&gt;. It felt fun!&lt;/p&gt;

&lt;p&gt;The media was hyping up the software engineering career path at the time, too. It was the start of the &lt;a href="https://fred.stlouisfed.org/series/IHLIDXUSTPSOFTDEVE" rel="noopener noreferrer"&gt;unprecedented spike in hiring&lt;/a&gt;. So, I figured I should give it a go.&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%2Fu68dr5u1korazuivwaw7.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%2Fu68dr5u1korazuivwaw7.png" alt="the unprecented spike in hiring" width="800" height="306"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Job postings in the US, 2020-2021. Will only go up, right? :)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I started off with &lt;a href="https://www.freecodecamp.org/" rel="noopener noreferrer"&gt;freeCodeCamp&lt;/a&gt;, which enabled me to grow more confident in my programming skills.&lt;br&gt;
But I soon realised that there were too many training wheels. I didn't want to solve JavaScript challenges inside their IDE; I wanted to launch a website that I can open from anywhere, ASAP!&lt;/p&gt;

&lt;p&gt;I reached out for help to a friend of mine, who was also re-training as a software developer. He recommended me &lt;a href="https://www.theodinproject.com/" rel="noopener noreferrer"&gt;The Odin Project&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I liked that website. It was less of a course; more of a rough guide on where to look for what in order to publish a React site. I got turned off when I reached the backend (phrasing!) though. They covered Express, which made perfect sense in the curriculum, but not for me. As you probably guessed, I wanted to use my good ol' pal, Django!&lt;/p&gt;

&lt;p&gt;So, after plenty of Googling, I managed to publish my &lt;a href="https://github.com/mihailthebuilder/bright-news-backend" rel="noopener noreferrer"&gt;first proper web app&lt;/a&gt; - a React/Django beauty that calculated the positivity of any news site it was given.&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%2F85iija8fr0wmyhknhi8c.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%2F85iija8fr0wmyhknhi8c.png" alt="my first web app" width="385" height="834"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Sorry for the small image size, this is the only demo of the app I still have&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In the meantime, I had also started networking for job opportunities. I reached out to a few people I knew who were hiring developers;&lt;br&gt;
none bit the bullet on me. Then, I posted in a local Facebook group asking if any developers are open to grabbing a drink. A couple replied. By luck, one of them was working at a tiny startup which was hiring. He introduced me to the CTO, who ran a very basic FizzBuzz test by me. I passed it, and got offered the job!&lt;/p&gt;

&lt;p&gt;The pay was very poor, even by UK standards. But experience is king, so I took it without any hesitation.&lt;/p&gt;

&lt;p&gt;Now that I wrote this post, I have to admit I feel proud of what I was able to accomplish. Within 4 months, I went from a hobbyist programmer to a software engineering professional, without paying a single dime. This means something to me, as someone who tends to put himself down too often.&lt;/p&gt;

</description>
      <category>career</category>
      <category>react</category>
      <category>beginners</category>
      <category>learning</category>
    </item>
  </channel>
</rss>
