<?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: Spiros Vatikiotis</title>
    <description>The latest articles on DEV Community by Spiros Vatikiotis (@spirosendgr).</description>
    <link>https://dev.to/spirosendgr</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%2F2516090%2Fd495d792-60f2-434d-81aa-1f31fea8000c.jpg</url>
      <title>DEV Community: Spiros Vatikiotis</title>
      <link>https://dev.to/spirosendgr</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/spirosendgr"/>
    <language>en</language>
    <item>
      <title>XML Tag Counter: A PowerShell Script That Saved Me Hours (And Can Save You Too!)</title>
      <dc:creator>Spiros Vatikiotis</dc:creator>
      <pubDate>Wed, 28 Jan 2026 12:06:52 +0000</pubDate>
      <link>https://dev.to/spirosendgr/xml-tag-counter-a-powershell-script-that-saved-me-hours-and-can-save-you-too-119k</link>
      <guid>https://dev.to/spirosendgr/xml-tag-counter-a-powershell-script-that-saved-me-hours-and-can-save-you-too-119k</guid>
      <description>&lt;p&gt;I needed to count  tags across 200+ XML files containing thousands and thousands of rows. Opening each file and searching manually would take hours. So I built a PowerShell script to do it.&lt;br&gt;
XML Tag Counter scans a directory, counts occurrences of a specific XML tag across all XML files, and gives you totals plus a per-file breakdown.&lt;/p&gt;

&lt;p&gt;It handles namespaces, supports multiple file extensions, and shows progress for large batches.&lt;/p&gt;

&lt;p&gt;I use it for data migrations, compliance checks, and debugging. It’s saved me a lot of time.&lt;/p&gt;

&lt;p&gt;It scans recursively, handles namespaces, and shows progress. No configuration needed.&lt;/p&gt;

&lt;p&gt;This is a starting point, and I’d love your help. Found a bug? Have an idea? Want to improve docs or performance? Every contribution helps, whether it’s a small fix or a new feature.&lt;/p&gt;

&lt;p&gt;If this script saves you time, consider contributing. Don't forget to tell me what you think after you try it!&lt;/p&gt;

&lt;p&gt;Check it out: &lt;a href="https://github.com/spirosEND/xmltag-counter" rel="noopener noreferrer"&gt;GitHub Repository&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Happy coding ya all!&lt;/p&gt;

&lt;p&gt;S.V&lt;/p&gt;

</description>
      <category>powershell</category>
      <category>xml</category>
      <category>scripting</category>
      <category>automation</category>
    </item>
    <item>
      <title>Streamline Your Multi-Service Docker applications with wait-for-service.sh</title>
      <dc:creator>Spiros Vatikiotis</dc:creator>
      <pubDate>Wed, 14 May 2025 22:12:53 +0000</pubDate>
      <link>https://dev.to/spirosendgr/streamline-your-multi-service-docker-applications-with-wait-for-servicesh-3kdd</link>
      <guid>https://dev.to/spirosendgr/streamline-your-multi-service-docker-applications-with-wait-for-servicesh-3kdd</guid>
      <description>&lt;p&gt;When dealing with microservices and containerized applications, it's common to face the issue where one service depends on another to be fully operational before it can start. This often leads to timing issues and can disrupt your application’s startup process.&lt;/p&gt;

&lt;p&gt;In this post, we will explore how to streamline this problem using a simple but powerful tool called wait-for-service.sh. This script helps ensure that dependent services are fully up and ready before launching your own service.&lt;/p&gt;

&lt;p&gt;We'll walk through setting up wait-for-service.sh in a Docker Compose environment, providing a seamless way to wait for your services to be ready.&lt;/p&gt;

&lt;p&gt;The Problem&lt;br&gt;
Imagine you have a set of services, with one or more depending on others to function properly. For example, you might have a service that needs to connect to a database, an authentication service, or any other backend service that takes a while to start. Without a tool like wait-for-service.sh, you'd be left with either time-based delays (where the service attempts to connect before the other service is ready) or failures on startup due to missing dependencies.&lt;/p&gt;

&lt;p&gt;The goal here is to ensure that your service doesn’t try to connect to another service until that service is fully ready to handle requests.&lt;/p&gt;

&lt;p&gt;What is wait-for-service.sh?&lt;br&gt;
wait-for-service.sh is a script designed to block the startup of your service until a dependent service becomes available. It checks if the service is reachable at a given port and waits until it is ready, helping to avoid race conditions during container startup.&lt;/p&gt;

&lt;p&gt;You can find the original wait-for-service.sh script in this &lt;a href="https://github.com/spirosEND/wait-for-service" rel="noopener noreferrer"&gt;GitHub repository&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;How to Use wait-for-service.sh in Docker Compose&lt;br&gt;
Let’s walk through a practical example using Docker Compose.&lt;/p&gt;

&lt;p&gt;Step 1: Create the docker-compose.yml File&lt;br&gt;
Here’s a simple example of a docker-compose.yml file with multiple services where one service (analytics-service) depends on another (keycloack-service).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;version: '3.8'

services:
nginx:
container_name: nginx
image: nginx:alpine
ports:
- "8081:80"
- "443:443"
volumes:
- ./nginx:/etc/nginx
networks:
- example-network

analytics-service:
container_name: analytics-service
image: analytics-service:latest
build:
context: ./analytics-service
ports:
- "3001:8080"
depends_on:
- keycloak-service
command: &amp;gt;
sh -c "./scripts/wait-for-service.sh keycloak-service:8080 -- java -jar /app/analytics-service.jar"
networks:
- example-network

keycloak-service:
container_name: keycloak-service
image: keycloak:latest
ports:
- "7000:8080"
environment:
- KEYCLOAK_ADMIN=admin
- KEYCLOAK_ADMIN_PASSWORD=admin
networks:
- example-network

networks:
example-network:
driver: bridge
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step 2: Add the wait-for-service.sh Script&lt;br&gt;
Download the wait-for-service.sh script from the &lt;a href="https://github.com/spirosEND/wait-for-service" rel="noopener noreferrer"&gt;official repository&lt;/a&gt; and place it in a scripts/ directory in your project:&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%2F632imzpn9qa00kcbrizw.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%2F632imzpn9qa00kcbrizw.png" alt=" " width="209" height="158"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 3: Run the Services&lt;br&gt;
Once you have everything set up, you can simply run the following command to start your services:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;docker-compose up -d&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Step 4: Check the Logs&lt;br&gt;
To verify that everything is working as expected, you can check the logs of the analytics-service:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;docker logs -f analytics-service&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Why is This Useful?&lt;br&gt;
Prevents race conditions: Ensures that dependent services are fully ready before another service tries to connect to them.&lt;/p&gt;

&lt;p&gt;Improves startup reliability: Reduces the chances of services failing due to unavailable dependencies at startup.&lt;/p&gt;

&lt;p&gt;Simple to implement: You can integrate wait-for-service.sh in your existing Docker Compose setup with minimal configuration changes.&lt;/p&gt;

&lt;p&gt;Conclusion&lt;br&gt;
In this post, we demonstrated how to use wait-for-service.sh to manage service dependencies in Docker Compose environments. By using this script, you can easily control the order of service startup and prevent errors that arise from services attempting to connect before their dependencies are ready.&lt;/p&gt;

&lt;p&gt;If you're interested in learning more about Docker Compose and microservices architectures, feel free to check out other tutorials or follow along with this &lt;a href="https://github.com/spirosEND/wait-for-service" rel="noopener noreferrer"&gt;GitHub repository&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Feel free to adapt this post as needed. Happy coding! 🚀&lt;/p&gt;

&lt;p&gt;S.V&lt;/p&gt;

</description>
      <category>docker</category>
      <category>devops</category>
      <category>microservices</category>
      <category>cicd</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Spiros Vatikiotis</dc:creator>
      <pubDate>Wed, 29 Jan 2025 13:39:43 +0000</pubDate>
      <link>https://dev.to/spirosendgr/-2785</link>
      <guid>https://dev.to/spirosendgr/-2785</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/arindam_1729" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&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%2Fuser%2Fprofile_image%2F965723%2Fe0982512-4de1-4154-b3c3-1869d19e9ecc.png" alt="arindam_1729"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/arindam_1729/8-apis-to-make-your-next-project-10x-better-33i1" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;🤯 8 APIs to Make your Next Project 10x better ⚡️&lt;/h2&gt;
      &lt;h3&gt;Arindam Majumder  ・ Jan 28&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#webdev&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#javascript&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#backend&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#beginners&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>backend</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
