Are you in the wrong place?

In a bustling city, an extraordinarily talented violinist named Elena graced the grand stages of concert halls, mesmerizing audiences with her impeccable performances. Her music was renowned for its precision, emotional depth, and the unique ability to transport listeners to another world. Elena’s skills were undeniable, honed through years of rigorous practice and a deep, abiding passion for her craft.

One chilly morning, as part of a social experiment, Elena took her priceless Stradivarius to a busy subway station. Dressed in casual clothes, she stood by a wall, opened her violin case, and began to play. The notes she produced were just as beautiful, filled with the same passion and precision that captivated concert-goers. However, in the noisy, hurried environment of the subway, her music was almost entirely overlooked.

Commuters rushed past, preoccupied with their morning routines, appointments, and digital devices. Only a handful of people paused briefly, and fewer still dropped a coin or two into her violin case. Despite playing some of the most beautiful and complex pieces of music ever composed, her presence in the subway rendered her almost invisible. The same talent that commanded high ticket prices in a concert hall was rendered practically worthless in the wrong setting.

This stark contrast illustrates a crucial truth: no matter how exceptional one’s skills or talents, being in the wrong place can significantly diminish their value. Context is everything. The world’s best surgeon, if stranded on a desert island with no medical supplies, would be unable to save lives. A brilliant software engineer in an environment without technology or infrastructure to support their work would find their skills rendered irrelevant.

Elena’s subway performance is a poignant reminder that our environment and the recognition of our abilities by others play a pivotal role in our success. It highlights the importance of finding the right context where our talents can be appreciated and utilized to their fullest potential. Being in the wrong place can make even the most extraordinary talents appear ordinary or insignificant.

In life, it is not enough to be good at what we do; we must also seek out the right platforms and opportunities where our skills are valued and can shine. Recognizing and aligning ourselves with environments that appreciate and need our specific talents is crucial for achieving true worth and making a meaningful impact.

Embracing Failure: A Key to Growth and Resilience


As young people navigating an increasingly complex world, we are often reminded of the inevitability of failure. However, our perspective on failures versus lessons is shaped by the understanding that each setback is a unique opportunity for growth, resilience, and self-improvement.

Embracing Failure as a Learning Experience

Failures are part of life, and right from a young age, we encounter them in various forms—be it academic setbacks, personal challenges, or professional hurdles. Rather than seeing these moments as defeats, we can view them as integral to our development. Each failure teaches us something valuable about our capabilities, our limitations, and the paths we need to take to achieve our goals.

Learning from Mistakes

The stories of successful individuals who overcame failures inspire us. For instance, Thomas Edison’s numerous unsuccessful attempts before inventing the light bulb remind us that perseverance is key. Edison’s famous quote, “I have not failed. I’ve just found 10,000 ways that won’t work,” encapsulates the spirit of learning from mistakes. This mindset encourages us to analyze our failures, understand what went wrong, and apply those lessons to future endeavors.

Thomas Edison

Building Resilience

Experiencing failure helps us build resilience—a crucial trait in today’s fast-paced, ever-changing world. Resilience allows us to bounce back stronger, adapt to new challenges, and maintain a positive outlook despite setbacks. This adaptability is essential not only in personal growth but also in professional environments, where the ability to handle failure constructively can lead to innovative solutions and breakthroughs.

The Role of Mentorship and Community

As youngsters, we benefit greatly from mentorship and community support. Sharing our experiences with peers, seeking advice from mentors, and learning from others’ failures provide us with different perspectives and coping strategies. This collective wisdom reinforces the idea that failure is a common experience and that overcoming it is a shared journey.

Cultivating a Growth Mindset

Adopting a growth mindset, as advocated by psychologist Carol Dweck, is fundamental to our perspective on failures. This mindset emphasizes the belief that our abilities can be developed through dedication and hard work. By viewing challenges as opportunities to improve rather than insurmountable obstacles, we transform our approach to failure. We become more willing to take risks, embrace new experiences, and push our boundaries.


Our perspective on failures versus lessons is rooted in the understanding that failure is not an end but a beginning—a starting point for growth, learning, and resilience. By embracing our failures, learning from them, and supporting each other, we pave the way for a future where we are not afraid to take risks and innovate. In this journey, every failure is a stepping stone towards success, making us stronger, wiser, and more capable of achieving our dreams.

Pagination in API and Frontend Development

It’s been a great experience interacting with our freshers while assessing their projects at the end of their fullstack training. One of the key things that I observed was the concept of pagination wasn’t implemented. Pagination is a crucial concept in both API and frontend development. It allows developers to manage and present large datasets efficiently, enhancing user experience and performance. So I thought I’d put this article together. 

Why Pagination is Important

When dealing with large datasets, loading all data at once can be impractical and inefficient. Pagination addresses this by breaking the data into manageable chunks, or pages, that can be loaded as needed. This approach benefits both performance and usability:

  • Performance: Reduces the load on servers and clients by limiting the amount of data processed and transferred.
  • Usability: Enhances user experience by presenting data in digestible pieces, preventing overwhelming the user with too much information at once.

Pagination in APIs

Implementing pagination in APIs involves structuring the API endpoints to return a subset of data rather than the entire dataset. Here are common methods to achieve this:

Offset-Based Pagination:

  • How it works: Uses an offset and a limit parameter to define the starting point and the number of records to retrieve.
  • Pros: Simple to implement and understand.
  • Cons: Can be inefficient for large datasets as the offset increases.
  • Example:
GET /items?offset=20&limit=10

Cursor-Based Pagination:

  • How it works: Uses a cursor, which is a reference to a specific record, to retrieve the next set of records.
  • Pros: More efficient for large datasets and changes in data.
  • Cons: Slightly more complex to implement and manage.
  • Example:
GET /items?cursor=abc123&limit=10

Keyset Pagination:

  • How it works: Uses a unique identifier (like a timestamp or ID) to fetch records greater or less than a given key.
  • Pros: Highly efficient for ordered datasets.
  • Cons: Requires indexed fields for performance.
  • Example:
GET /items?after_id=100&limit=10

Hybrid Pagination

  • How it works: This technique combines multiple pagination techniques to leverage their strengths. For example, combining cursor and time-based pagination for efficient scrolling through time-ordered records
  • Pros: Can offer the best performance and flexibility for complex datasets
  • Cons: More complex to implement and requires careful design
  • Example:
GET /items?cursor=abc&start_time=xxx&end_time=yyy

Best Practices for Pagination in APIs

  • Consistent Response Structure: Ensure the API response includes metadata like total count, current page, and next/previous links.
  • Limit Parameters: Implement sensible default limits and allow clients to specify custom limits up to a maximum value.
  • Error Handling: Handle edge cases such as out-of-range pages gracefully and return appropriate error messages.

Pagination in Frontend Development

On the frontend, pagination is about presenting data pages to users and navigating between them smoothly. 

Here are key considerations and techniques:

  1. UI Components:
    • Pagination Controls: Implement buttons or links to navigate to the next, previous, first, and last pages.
    • Page Indicators: Display current page number and total pages to inform users about their position in the dataset.
  2. Fetching Data:
    • Asynchronous Requests: Use asynchronous calls (e.g., AJAX, Fetch API) to load data for the requested page without reloading the entire page.
    • State Management: Maintain the state of current page and data using state management libraries (e.g., Redux) or React’s useState and useEffect hooks.
  3. Loading Indicators:
    • Spinner or Skeleton Loader: Show a loading indicator while fetching data to improve user experience.
  4. Infinite Scrolling:
    • Alternative to Traditional Pagination: Load more data as the user scrolls down, providing a seamless experience. Use Intersection Observer API to detect when to fetch more data.

Here’s a simple example using React, the limit is left hardcoded as 10 just for this example, ideally it would come from a config file.

import React, { useState, useEffect } from 'react';
​
const PaginatedList = () => {
  const [items, setItems] = useState([]);
  const [page, setPage] = useState(1);
  const [totalPages, setTotalPages] = useState(0);
​
  useEffect(() => {
    fetch(`/api/items?page=${page}&limit=10`)
      .then(response => response.json())
      .then(data => {
        setItems(data.items);
        setTotalPages(data.totalPages);
      });
  }, [page]);
​
  const handleNext = () => setPage(page + 1);
  const handlePrevious = () => setPage(page - 1);
​
  return (
    <div>
      <ul>
        {items.map(item => (
          <li key={item.id}>{item.name}</li>
        ))}
      </ul>
      <div>
        <button onClick={handlePrevious} disabled={page === 1}>Previous</button>
        <span>Page {page} of {totalPages}</span>
        <button onClick={handleNext} disabled={page === totalPages}>Next</button>
      </div>
    </div>
  );
};
​
export default PaginatedList;

Pagination is a vital feature for managing large datasets in both API and frontend development. By implementing effective pagination strategies and following best practices, developers can ensure better performance, scalability, and user experience. Whether through traditional page controls or modern infinite scrolling, pagination helps users interact with data efficiently and enjoyably.

Embrace Your Fears

Fear is a natural and universal emotion that everyone experiences. It can serve as a protective mechanism, keeping us safe from danger. However, fear can also become a barrier, preventing us from reaching our full potential and achieving our dreams. The key is to recognize fear for what it is and to not let it stop you from moving forward.

Fear often stems from the unknown, uncertainty, or the potential for failure. When faced with a new challenge or opportunity, it’s normal to feel apprehensive. However, letting fear dictate your actions can lead to missed opportunities and regret. Understanding that fear is a normal response can help you put it into perspective.

Do the thing you fear most and the death of fear is certain.

Mark Twain

Confronting Fear

The first step to overcoming fear is to confront it. Acknowledge what you are afraid of and why. Break down the fear into manageable parts. For example, if you are afraid of public speaking, identify specific aspects that scare you, such as forgetting your speech or being judged by the audience. By pinpointing the exact source of your fear, you can start to address it directly.

Taking Small Steps

Overcoming fear doesn’t mean taking giant leaps into the unknown. Start with small steps that gradually build your confidence. If you’re afraid of public speaking, begin by speaking in front of a small group of friends or colleagues. Gradually increase the size of your audience as you become more comfortable. Each small victory will help diminish your fear and build your confidence.

Reframing Your Mindset

Changing how you perceive fear can also be powerful. Instead of viewing fear as a hindrance, see it as an opportunity for growth. Embrace the challenge and understand that overcoming fear can lead to personal development and new opportunities. By reframing your mindset, you can transform fear from an obstacle into a motivator.

Everything you want is on the other side of fear.

Jack Canfield

Seeking Support

You don’t have to face your fears alone. Seek support from friends, family, or mentors who can provide encouragement and advice. Sometimes, talking about your fears with others can help you see them from a different perspective and reduce their power over you.

Learning from Failure

Accept that failure is a part of life and a critical component of success. Each failure is a learning experience that brings you one step closer to your goals. Don’t let the fear of failure paralyze you. Embrace it, learn from it, and keep moving forward.


Fear is a powerful emotion, but it doesn’t have to control your life. By confronting your fears, taking small steps, reframing your mindset, seeking support, and learning from failure, you can overcome the barriers that fear creates. Don’t let fear stop you from achieving your dreams and reaching your full potential. Embrace the challenge, and you’ll discover a stronger, more resilient version of yourself.

Why Fit In When You’re Born To Stand Out

In a world that often celebrates conformity, standing out can feel daunting. Yet, as Dr. Seuss famously said, “Why fit in when you’re born to stand out?” This powerful question encourages us to embrace our individuality and leverage our unique strengths and perspectives.

The Pressure to Conform

From a young age, societal norms and expectations shape our behavior. We’re taught to follow rules, adhere to standards, and blend into our environments. While these norms can provide structure, they can also stifle creativity and individuality. The pressure to conform can be intense, leading many to suppress their true selves in favor of fitting in.


The Power of Uniqueness

Standing out means recognizing and celebrating what makes you different. It’s about understanding that your unique traits and experiences are valuable. Every individual has a distinct combination of talents, insights, and ideas that can contribute to the world in ways that others cannot. By embracing your uniqueness, you unlock your full potential and open doors to innovation and progress.


Overcoming Fear

One of the biggest obstacles to standing out is fear—fear of judgment, failure, or rejection. However, history shows that those who dare to be different often make the most significant impact. Think of innovators like Steve Jobs, artists like Frida Kahlo, or leaders like Martin Luther King Jr. They all faced criticism and resistance but persevered because they believed in their vision and embraced their uniqueness.


Authenticity Leads to Fulfillment

Living authentically leads to greater fulfillment and happiness. When you’re true to yourself, you attract opportunities and relationships that resonate with your core values and passions. This alignment creates a sense of purpose and contentment that’s impossible to achieve by merely fitting in.


Encouraging Others to Stand Out

When you embrace your uniqueness, you inspire others to do the same. By standing out, you become a role model, showing that it’s okay to be different and that diversity is a strength. Your courage to be yourself can empower others to break free from conformity and pursue their own paths.


“Why fit in when you’re born to stand out?” is more than just a motivational quote—it’s a call to action. It’s an invitation to embrace your individuality, overcome fear, and live authentically. By standing out, you not only unlock your own potential but also contribute to a more diverse, innovative, and vibrant world. So, dare to be different, celebrate what makes you unique, and inspire others to do the same. After all, true greatness lies not in fitting in but in standing out.

TerraCognita: Reverse Terraform

While we were checking out competitors for an opportunity with one of our clients, we came across this feature at cycloid.io to generate Terraform state files for existing infra on public cloud infrastructure (Azure, AWS, GCP) or VMWare. Was surprised to see that they had open-sourced the core of this functionality with TerraCognita!

Since I have worked with Terraform before, I was keen to see how this product would reverse engineer the state files for existing infra. 

Using TerraCognita is straightforward. First, you need to install TerraCognita.

curl -L https://github.com/cycloidio/terracognita/releases/latest/download/terracognita-linux-amd64.tar.gz -o terracognita-linux-amd64.tar.gz
tar -xf terracognita-linux-amd64.tar.gz
chmod u+x terracognita-linux-amd64
sudo mv terracognita-linux-amd64 /usr/local/bin/terracognita

If you’re macOS user and using Homebrew, you can install via brew command:

brew install terracognita

Once you have done the installation, you can use the terracognita command-line interface to generate Terraform configuration files for your infrastructure

terracognita [TERRAFORM_PROVIDER] [--flags]

The documentation isn’t too great online. Since our client was primarily using Azure, I went ahead with exploring for Azure. 

Below is a synopsis of the flags that are supported:

–client-id string              Client ID (required)

–client-secret string       Client Secret (required)

–environment string            Environment (default “public”)

–resource-group-name strings   Resource Group Names (required)

–subscription-id string        Subscription ID (required)
 -t, –tags strings                  List of tags to filter with format ‘NAME:VALUE’

–tenant-id string              Tenant ID (required)

Global Flags:
 -d, –debug                     Activate the debug mode which includes TF logs via TF_LOG=TRACE|DEBUG|INFO|WARN|ERROR configuration https://www.terraform.io/docs/internals/debugging.html
 -e, –exclude strings           List of resources to not import, this names are the ones on TF (ex: aws_instance). If not set then means that none the resources will be excluded
     –hcl string                HCL output file or directory. If it’s a directory it’ll be emptied before importing
     –hcl-provider-block        Generate or not the ‘provider {}’ block for the imported provider (default true)
 -i, –include strings           List of resources to import, this names are the ones on TF (ex: aws_instance). If not set then means that all the resources will be imported
     –interpolate               Activate the interpolation for the HCL and the dependencies building for the State file (default true)
     –log-file string           Write the logs with -v to this destination (default “/Users/kenrickvaz/Library/Caches/terracognita/terracognita.log”)
     –module string             Generates the output in module format into the directory specified. With this flag (–module) the –hcl is ignored and will be generated inside of the module
     –module-variables string   Path to a file containing the list of attributes to use as variables when building the module. The format is a JSON/YAML, more information on https://github.com/cycloidio/terracognita#modules
     –target strings            List of resources to import via ID, those IDs are the ones documented on Terraform that are needed to Import. The format is ‘aws_instance.ID’
     –tfstate string            TFState output file
 -v, –verbose                   Activate the verbose mode


Terracognita has a powerful feature that allows it to directly generate Terraform modules during the import process. To utilize this feature, you can use the –module {module/path/name} flag, where you specify the desired path for the module to be generated. This path can either be an existing directory or a non-existent path that will be created.

It’s important to note that when generating a module, the existing content of the specified path will be deleted (after user confirmation) to ensure a clean import and organization of the generated resources.

Our client had everything on the cloud mapped to app codes and environment. So my query below took that into consideration, you may tweak it based on your need

terracognita azurerm \
--client-id <client_id> \
--client-secret <client_secret> \
--resource-group-name <resource_group> \
--subscription-id <subscription_id> \
--tenant-id <tenant_id> \
--hcl ./azure \
--module ./output/<env>/<appcode> \
--tags appcode:<appcode> \
--include azurerm_key_vault,azurerm_mssql_database,azurerm_mssql_server,azurerm_mssql_virtual_machine,azurerm_public_ip,azurerm_storage_account,azurerm_kubernetes_cluster,azurerm_container_registry,azurerm_resource_group,azurerm_monitor_action_group

Your output will be something like this


Validation

To confirm the accuracy of the infrastructure snapshot, navigate to the “terracognita” directory and execute terraform init followed by terraform plan. If the auto-generated code accurately represent your existing Azure resources, Terraform should not detect any changes. Depending on your specific setup and requirements, some manual code adjustments may still be necessary.

Limitations

  • The tool lacks comprehensive documentation, making it challenging for users to understand its functionalities thoroughly
  • The exporting process can be time-consuming, especially when dealing with policies
  • The auto-generated Terraform code may lack accuracy, requiring additional manual adjustments

Conclusion

Using Infrastructure as Code (IaC) is now a widely recognized best practice. It’s a great idea to translate your infrastructure into Terraform, and there are tools to help with that. But remember, these tools have limitations. No tool is perfect; they all have constraints and challenges. While these tools can be useful, it’s up to the software engineers to make sure the move to Infrastructure as Code is successful and accurate.

Why is the Feast of the Annunciation moved to April 8 this year?

The Feast of the Annunciation of The Lord is normally celebrated on 25 March. This day is exactly nine months before the celebration of Christmas, which occurs on December 25. In the past, most feasts that had the rank of solemnity were considered a holy day of obligation, requiring all Catholics to attend Mass on that day. The Annunciation still remains a solemnity, but is no longer a holy day of obligation.

March 25 will occasionally fall during Holy Week, which means, in the Western Church, that the liturgical celebration is suppressed. Whenever this occurs, the liturgical observance is moved to the next available week day that is not a solemnity.

Since the week following Easter is considered “a week of solemnities,” the Annunciation gets pushed back even further.

This year, 2024, the Annunciation is moved from March 25 all the way to Monday, April 8. This means that all the liturgical readings and prayers for the solemnity of the Annunciation are used on April 8, even though it is not March 25.

Nonetheless, despite this change of dates, it does not diminish the importance of the event that we commemorate, as linking to what we are celebrating this Easter, it was all made possible by the acceptance of Mary of her crucial role in being the Mother of our God and Saviour, Jesus Christ.


Some of you may ask what is the difference between a solemnity, a feast and a memorial.

A solemnity in the liturgical year is a feast day of the highest rank celebrating a mystery of faith such as the Trinity, an event in the life of Jesus, the Blessed Virgin Mary, or important saints. The observance begins with the vigil on the evening before the actual date of the feast. On these days, both the Gloria and the Creed are recited. Along with the Annunciation, other examples of solemnities include the Solemnity of St. Joseph (March 19), the Solemnity of the Sacred Heart of Jesus (Friday after the Feast of Corpus Christi), and the Solemnity of St. Peter and St. Paul (June 29).

Feast days in the liturgical year are second importance and assigned one date out of the year for each and every canonized saint. The saints are remembered on their individual feast days with special mention, prayers, and possibly a scripture reading. On these days, the Gloria is recited but not the Creed.

Next in line are memorials, which are classified as either obligatory or optional.  Memorials commemorate a saint or saints.  Obligatory memorials must be observed whereas optional memorials do not have to be observed. Only the memorials of those saints who are of “universal significance” are observed by the whole Church and marked in the general liturgical calendar.

Like we’ve seen with the feast of the Annunciation this year, at times we may have more than one celebration and hence we have the order of precedence. The basic rule of thumb is this: 

  • Sundays, other Solemnities, Holy Week, and the Octave of Easter always take precedence. 
  • These are followed by Feasts, weekdays of Advent (December 17-24), days within the Octave of Christmas, weekdays of Lent, obligatory memorials, optional memorials, weekdays of Advent (through December 16), other weekdays of the Christmas Season, other weekdays of the Easter Season, and weekdays in Ordinary Time.

This sequence is definitely a bit confusing, and that is why the Bishop’s Committee on the Liturgy of the National Conference of Catholic Bishops publishes an annual Ordo which outlines the proper celebrations and their particulars throughout the liturgical year.

Wishing you all a Happy Feast!

How to Navigate Tough Times

One of my all time favourite quotes is “When the going gets tough, the tough get going!” We have two options when we are in the midst of challenging situations, one is to play a victim, cry and complain about our situation and the other is to figure out what’s the best way to move ahead, how to grow, how to be a student – learn on the best path forward.

Whether it’s personal struggles, academic pressure, or external circumstances like economic downturns or global crises, maintaining resilience and staying proactive are key to navigating these difficult periods without succumbing to a victim mentality.

Here are some strategies to help you be a student and not a victim during hard times:

Maintain a Positive Mindset: Your mindset plays a crucial role in how you perceive and respond to challenges. Cultivate a positive outlook by focusing on what you can control rather than dwelling on what you can’t. Embrace a growth mindset, understanding that setbacks are opportunities for learning and growth.

Set Realistic Goals: Break down your academic and personal goals into smaller, manageable tasks. By setting realistic goals, you can maintain a sense of accomplishment and progress even during tough times. Celebrate your achievements, no matter how small they may seem.

Stay Organized: Create a schedule or to-do list to prioritize your tasks and manage your time effectively. Organizing your workload can alleviate feelings of overwhelm and help you stay on track with your responsibilities. Remember to include time for self-care and relaxation to prevent burnout.

Seek Support: Don’t hesitate to reach out for help when you need it. Whether it’s academic support from teachers or counselors, emotional support from friends and family, or seeking out resources in your community, know that you’re not alone. Asking for help is a sign of strength, not weakness.

Practice Self-Care: Take care of your physical, emotional, and mental well-being. Get enough sleep, eat healthily, exercise regularly, and engage in activities that bring you joy and relaxation. Practicing self-care is essential for maintaining resilience and managing stress during challenging times.

Adapt and Be Flexible: Hard times often require us to adapt to new circumstances and be flexible in our approach. Be open to change and willing to adjust your plans as needed. Embrace innovation and creativity in finding solutions to problems that arise.

Focus on Solutions: Instead of dwelling on the problems you encounter, focus on finding solutions. Adopt a problem-solving mindset and approach challenges with a sense of determination and resourcefulness. Remember that setbacks are temporary, and you have the ability to overcome them.

Practice Gratitude: Cultivate an attitude of gratitude by reflecting on the things you’re thankful for, even in difficult times. Focusing on the positive aspects of your life can help shift your perspective and foster resilience in the face of adversity.

Stay Informed but Limit Exposure: While it’s important to stay informed about current events and developments, be mindful of how much negative news and information you consume. Limit your exposure to sources of stress and anxiety, and prioritize activities that promote positivity and well-being.

Believe in Yourself: Above all, believe in your abilities and strengths. Trust that you have the resilience and determination to overcome challenges and succeed in your academic endeavors. By maintaining faith in yourself and your potential, you can rise above adversity and thrive as a student, even during the hardest of times.


Remember that you have the strength and determination to weather any storm, and by embodying these principles, you can transform adversity into opportunities for learning and personal growth. So, embrace the journey, believe in yourself, and know that you have the power to be a student who thrives, not just survives, during hard times.


Just recently I came across this video which is apt for this reflection where Robin Van Persie shares his experience with his son.

My Unforgettable Experience at Ed Sheeran’s Concert

Attending an Ed Sheeran concert live is an experience unlike any other. From the moment you step into the venue, there’s an electrifying energy in the air, buzzing with anticipation and excitement. As fans gather from all walks of life, united by their love for Sheeran’s music, you can feel a sense of camaraderie and connection that transcends boundaries.

Calum Scott performed before Ed came on stage :)

The stage is set, lights dimmed, as the 8 minute countdown begins. The crowd erupts into cheers as Ed Sheeran steps onto the stage, armed with just his guitar and loop pedal. There’s something incredibly intimate about witnessing him perform live, stripped down to the essence of his artistry. With nothing but his voice and his guitar, Sheeran captivates the audience from the first chord, drawing them into his world with each heartfelt lyric and soulful melody.

One of the most striking aspects of an Ed Sheeran concert is his sheer talent as a performer. Watching him effortlessly loop and layer intricate guitar riffs, beatboxing, and harmonies to create a rich tapestry of sound is nothing short of mesmerizing. His raw talent and genuine passion for music shine through in every note, leaving the audience in awe of his musical prowess.

But beyond his technical skill, what truly sets an Ed Sheeran concert apart is the emotional depth and authenticity of his performance. Each song feels like a personal confession, a glimpse into Sheeran’s own experiences and emotions. Whether he’s singing about love, heartbreak, or the trials of life, there’s a raw honesty to his music that resonates deeply with listeners, creating an emotional connection that transcends the boundaries of the concert hall.

As the night unfolds, the crowd becomes a chorus of voices, singing along to every word, their voices blending with Sheeran’s in perfect harmony. There’s a sense of unity and shared experience that permeates the air, as strangers become friends, bonded by their mutual love for Sheeran’s music.

And then, just like that, the concert draws to a close, leaving the audience craving more. But as they spill out into the night, hearts full and spirits lifted, they carry with them the memories of an unforgettable experience. For those fortunate enough to have attended an Ed Sheeran concert live, it’s not just a night of music—it’s a moment frozen in time, a reminder of the power of music to inspire, uplift, and unite us all.


Here are some of the clips I managed to capture, it definitely doesn’t do justice to the experience, but I hope you enjoy it! :)

GitOps Workflow – Simplified Visual Guide

GitOps brought a shift in how software and infrastructure are managed with Git as the central hub for managing and automating the entire lifecycle of applications and infrastructure.

Here’s a simplified visual guide (from my favourite blog, bytebytego)

It’s built on the principles of version control, collaboration, and continuous integration and deployment (CI/CD). 

Key features include: 

  1. Version Control and Collaboration: 
    Centralizing code, configurations, and infrastructure in Git for control and collaboration. 
  2. Declarative System: 
    Describing the system’s desired state for easier version control. 
  3. Automated Delivery: 
    Automating deployment through Git-triggered processes, closely integrated with CI/CD pipelines. 
  4. Immutable Infrastructure: 
    Making changes via Git instead of directly in the live environment to prevent inconsistencies. 
  5. Observability and Feedback: 
    Monitoring systems in real-time to align the actual state with Git’s declared state. 
  6. Security and Compliance: 
    Tracking changes in Git for security and compliance, with role-based access for added control.

Over to you: Do you see GitOps’ declarative approach speeding up your deployments?